ZGlmZiAtLWdpdCBhL2hscnN5bmMvaGxyc3luYy5weSBiL2hscnN5bmMvaGxyc3luYy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lNGE0OTU1Ci0tLSAvZGV2L251bGwKKysrIGIvaGxyc3luYy9obHJzeW5jLnB5CkBAIC0wLDAgKzEsMTI1IEBACisjIS91c3IvYmluL3B5dGhvbjIuNQorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IHdpdGhfc3RhdGVtZW50CisKK2Zyb20gcHlzcWxpdGUyIGltcG9ydCBkYmFwaTIgYXMgc3FsaXRlMworaW1wb3J0IHN5cworCitobHIgPSBzcWxpdGUzLmNvbm5lY3Qoc3lzLmFyZ3ZbMV0pCit3ZWIgPSBzcWxpdGUzLmNvbm5lY3Qoc3lzLmFyZ3ZbMl0pCisKKyMgc3dpdGNoIHRvIGF1dG9jb21taXQKK2hsci5pc29sYXRpb25fbGV2ZWwgPSBOb25lCit3ZWIuaXNvbGF0aW9uX2xldmVsID0gTm9uZQorCitobHIucm93X2ZhY3RvcnkgPSBzcWxpdGUzLlJvdword2ViLnJvd19mYWN0b3J5ID0gc3FsaXRlMy5Sb3cKKword2l0aCBobHI6CisJaGxyX3N1YnNjcnMgPSBobHIuZXhlY3V0ZSgiIiIKKwkJU0VMRUNUICogRlJPTSBTdWJzY3JpYmVyCisJIiIiKS5mZXRjaGFsbCgpCisJaGxyX3Rva2VucyA9IGhsci5leGVjdXRlKCIiIgorCQlTRUxFQ1QgKiBGUk9NIEF1dGhUb2tlbgorCSIiIikuZmV0Y2hhbGwoKQorCit3aXRoIHdlYjoKKwl3ZWJfdG9rZW5zID0gd2ViLmV4ZWN1dGUoIiIiCisJCVNFTEVDVCAqIEZST00gcmVnX3Rva2VucworCSIiIikuZmV0Y2hhbGwoKQorCXdlYl9zbXMgPSB3ZWIuZXhlY3V0ZSgiIiIKKwkJU0VMRUNUICogRlJPTSBzbXNfcXVldWUKKwkiIiIpLmZldGNoYWxsKCkKKworIyBpbmRleCBieSBzdWJzY3IgaWQKK2hscl9zdWJzY3JzX2J5X2lkID0ge30KK2hscl9zdWJzY3JzX2J5X2V4dCA9IHt9CitobHJfdG9rZW5zX2J5X3N1YnNjcl9pZCA9IHt9Citmb3IgeCBpbiBobHJfc3Vic2NyczoKKwlobHJfc3Vic2Nyc19ieV9pZFt4WydpZCddXSA9IHgKKwlobHJfc3Vic2Nyc19ieV9leHRbeFsnZXh0ZW5zaW9uJ11dID0geAorZGVsIGhscl9zdWJzY3JzCitmb3IgeCBpbiBobHJfdG9rZW5zOgorCWhscl90b2tlbnNfYnlfc3Vic2NyX2lkW3hbJ3N1YnNjcmliZXJfaWQnXV0gPSB4CitkZWwgaGxyX3Rva2VucworCit3ZWJfdG9rZW5zX2J5X3N1YnNjcl9pZCA9IHt9Citmb3IgeCBpbiB3ZWJfdG9rZW5zOgorCXdlYl90b2tlbnNfYnlfc3Vic2NyX2lkW3hbJ3N1YnNjcmliZXJfaWQnXV0gPSB4CitkZWwgd2ViX3Rva2VucworCisjIHJlbW92ZSBsZWZ0b3ZlciB3ZWJfdG9rZW5zIGFuZCBjb3JyZWN0IGluY29uc2lzdGVudCBmaWVsZHMKK3dpdGggd2ViOgorCWZvciB4IGluIHdlYl90b2tlbnNfYnlfc3Vic2NyX2lkLnZhbHVlcygpOgorCQlzdWJzY3IgPSBobHJfc3Vic2Nyc19ieV9pZC5nZXQoeFsnc3Vic2NyaWJlcl9pZCddLCBOb25lKQorCQlpZiBzdWJzY3IgaXMgTm9uZToKKwkJCXdlYi5leGVjdXRlKCIiIgorCQkJCSAgICAgIERFTEVURSBGUk9NIHJlZ190b2tlbnMgV0hFUkUgc3Vic2NyaWJlcl9pZCA9ID8KKwkJCQkgICAiIiIsICh4WydzdWJzY3JpYmVyX2lkJ10sKSkKKwkJCWRlbCB3ZWJfdG9rZW5zX2J5X3N1YnNjcl9pZFt4WydzdWJzY3JpYmVyX2lkJ11dCisJCQljb250aW51ZQorCQlpZiBzdHIoeFsnaW1zaSddKSAhPSBzdHIoc3Vic2NyWydpbXNpJ10pIG9yIFwKKwkJICAgeFsnZXh0ZW5zaW9uJ10gIT0gc3Vic2NyWydleHRlbnNpb24nXSBvciBcCisJCSAgIHhbJ3Rtc2knXSAhPSBzdWJzY3JbJ3Rtc2knXSBvciBcCisJCSAgIHhbJ2xhYyddICE9IHN1YnNjclsnbGFjJ106CisJCQl3ZWIuZXhlY3V0ZSgiIiIKKwkJCQkgICAgICBVUERBVEUgcmVnX3Rva2VucworCQkJCSAgICAgIFNFVCBpbXNpID0gPywgZXh0ZW5zaW9uID0gPywgdG1zaSA9ID8sIGxhYyA9ID8KKwkJCQkgICAgICBXSEVSRSBzdWJzY3JpYmVyX2lkID0gPworCQkJCSAgICIiIiwgKHN0cihzdWJzY3JbJ2ltc2knXSksIHN1YnNjclsnZXh0ZW5zaW9uJ10sCisJCQkJICAgc3Vic2NyWyd0bXNpJ10sIHN1YnNjclsnbGFjJ10sIHhbJ3N1YnNjcmliZXJfaWQnXSkpCisKKyMgYWRkIG1pc3Npbmcgd2ViX3Rva2Vucword2l0aCB3ZWI6CisJZm9yIHggaW4gaGxyX3Rva2Vuc19ieV9zdWJzY3JfaWQudmFsdWVzKCk6CisJCXN1YnNjciA9IGhscl9zdWJzY3JzX2J5X2lkLmdldCh4WydzdWJzY3JpYmVyX2lkJ10sIE5vbmUpCisJCWlmIHN1YnNjciBpcyBOb25lOgorCQkJaGxyLmV4ZWN1dGUoIiIiCisJCQkJICAgICAgREVMRVRFIEZST00gQXV0aFRva2VuIFdIRVJFIHN1YnNjcmliZXJfaWQgPSA/CisJCQkJICAgIiIiLCAoeFsnc3Vic2NyaWJlcl9pZCddLCkpCisJCQlkZWwgaGxyX3Rva2Vuc19ieV9zdWJzY3JfaWRbeFsnc3Vic2NyaWJlcl9pZCddXQorCQkJY29udGludWUKKwkJd2VidG9rZW4gPSB3ZWJfdG9rZW5zX2J5X3N1YnNjcl9pZC5nZXQoeFsnc3Vic2NyaWJlcl9pZCddLCBOb25lKQorCQlpZiB3ZWJ0b2tlbiBpcyBOb25lOgorCQkJd2ViLmV4ZWN1dGUoIiIiCisJCQkJICAgICAgSU5TRVJUIElOVE8gcmVnX3Rva2VucworCQkJCSAgICAgIChzdWJzY3JpYmVyX2lkLCBleHRlbnNpb24sIHJlZ19jb21wbGV0ZWQsIG5hbWUsIGVtYWlsLCBsYWMsIGltc2ksIHRva2VuLCB0bXNpKQorCQkJCSAgICAgIFZBTFVFUworCQkJCSAgICAgICg/LCA/LCAwLCA/LCAnJywgPywgPywgPywgPykKKwkJCQkgICAiIiIsICh4WydzdWJzY3JpYmVyX2lkJ10sIHN1YnNjclsnZXh0ZW5zaW9uJ10sIHN1YnNjclsnbmFtZSddLAorCQkJCSAgIHN1YnNjclsnbGFjJ10sIHN0cihzdWJzY3JbJ2ltc2knXSksIHhbJ3Rva2VuJ10sIHN1YnNjclsndG1zaSddKSkKKworIyBhdXRob3JpemUgc3Vic2NyaWJlcnMKK3dpdGggaGxyOgorCWZvciB4IGluIHdlYl90b2tlbnNfYnlfc3Vic2NyX2lkLnZhbHVlcygpOgorCQlzdWJzY3IgPSBobHJfc3Vic2Nyc19ieV9pZC5nZXQoeFsnc3Vic2NyaWJlcl9pZCddLCBOb25lKQorCQlpZiB4WydyZWdfY29tcGxldGVkJ10gYW5kIG5vdCBzdWJzY3JbJ2F1dGhvcml6ZWQnXToKKwkJCWhsci5leGVjdXRlKCIiIgorCQkJCSAgICAgIFVQREFURSBTdWJzY3JpYmVyCisJCQkJICAgICAgU0VUIGF1dGhvcml6ZWQgPSAxCisJCQkJICAgICAgV0hFUkUgaWQgPSA/CisJCQkJICAgIiIiLCAoeFsnc3Vic2NyaWJlcl9pZCddLCkpCisKKyMgU3luYyBTTVMgZnJvbSB3ZWIgdG8gaGxyCit3aXRoIGhscjoKKwlmb3Igc21zIGluIHdlYl9zbXM6CisJCXN1YnNjciA9IGhscl9zdWJzY3JzX2J5X2V4dC5nZXQoc21zWydyZWNlaXZlcl9leHQnXSkKKwkJaWYgc3Vic2NyIGlzIE5vbmU6CisJCQlwcmludCAnJXMgbm90IGZvdW5kJyAlIHNtc1sncmVjZWl2ZXJfZXh0J10KKwkJCWNvbnRpbnVlCisJCWhsci5leGVjdXRlKCIiIgorCQkJCSAgICAgIElOU0VSVCBJTlRPIFNNUworCQkJCSAgICAgIChjcmVhdGVkLCBzZW5kZXJfaWQsIHJlY2VpdmVyX2lkLCByZXBseV9wYXRoX3JlcSwgc3RhdHVzX3JlcF9yZXEsIHByb3RvY29sX2lkLCBkYXRhX2NvZGluZ19zY2hlbWUsIHVkX2hkcl9pbmQsIHRleHQpCisJCQkJICAgICAgVkFMVUVTCisJCQkJICAgICAgKD8sIDEsID8sIDAsIDAsIDAsIDAsIDAsID8pCisJCQkJICAgIiIiLCAoc21zWydjcmVhdGVkJ10sIHN1YnNjclsnaWQnXSwgc21zWyd0ZXh0J10pKQord2l0aCB3ZWI6CisJZm9yIHNtcyBpbiB3ZWJfc21zOgorCQl3ZWIuZXhlY3V0ZSgiIiIKKwkJCQkgICAgICBERUxFVEUgRlJPTSBzbXNfcXVldWUgV0hFUkUgaWQgPSA/CisJCQkJICAgIiIiLCAoc21zWydpZCddLCkpCisKKworaGxyLmNsb3NlKCkKK3dlYi5jbG9zZSgpCisKZGlmZiAtLWdpdCBhLy5naXRpZ25vcmUgYi9saWJvc21vY29yZS8uZ2l0aWdub3JlCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSAuZ2l0aWdub3JlCnJlbmFtZSB0byBsaWJvc21vY29yZS8uZ2l0aWdub3JlCmRpZmYgLS1naXQgYS9DT1BZSU5HIGIvbGlib3Ntb2NvcmUvQ09QWUlORwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gQ09QWUlORwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvQ09QWUlORwpkaWZmIC0tZ2l0IGEvTWFrZWZpbGUuYW0gYi9saWJvc21vY29yZS9NYWtlZmlsZS5hbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gTWFrZWZpbGUuYW0KcmVuYW1lIHRvIGxpYm9zbW9jb3JlL01ha2VmaWxlLmFtCmRpZmYgLS1naXQgYS9jb25maWd1cmUuaW4gYi9saWJvc21vY29yZS9jb25maWd1cmUuaW4Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGNvbmZpZ3VyZS5pbgpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvY29uZmlndXJlLmluCmRpZmYgLS1naXQgYS9pbmNsdWRlL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9NYWtlZmlsZS5hbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9NYWtlZmlsZS5hbQpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9NYWtlZmlsZS5hbQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9NYWtlZmlsZS5hbSBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvTWFrZWZpbGUuYW0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvTWFrZWZpbGUuYW0KcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvTWFrZWZpbGUuYW0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvYml0dmVjLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2JpdHZlYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL2JpdHZlYy5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2JpdHZlYy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL2NvbXAxMjguaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvY29tcDEyOC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL2NvbXAxMjguaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9jb21wMTI4LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtNDguaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtNDguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9nc200OC5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbTQ4LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtNDhfaWUuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtNDhfaWUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9nc200OF9pZS5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbTQ4X2llLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvZ3NtX3V0aWxzLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbV91dGlscy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL2dzbV91dGlscy5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL2dzbV91dGlscy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL2dzbXRhcC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9nc210YXAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9nc210YXAuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9nc210YXAuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9saW51eGxpc3QuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbGludXhsaXN0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvbGludXhsaXN0LmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbGludXhsaXN0LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvbW5jYy5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9tbmNjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvbW5jYy5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL21uY2MuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9tc2diLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL21zZ2IuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9tc2diLmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvbXNnYi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9NYWtlZmlsZS5hbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9NYWtlZmlsZS5hbQpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9NYWtlZmlsZS5hbQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfMDguaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzA4LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzA4LmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzA4LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzExLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8xMS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8xMS5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF8xMS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF84MC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfODAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfODAuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDRfODAuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9wcm90b2NvbC9nc21fMDhfNTguaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA4XzU4LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA4XzU4LmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA4XzU4LmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzEyXzIxLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8xMl8yMS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8xMl8yMS5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Byb3RvY29sL2dzbV8xMl8yMS5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3JzbC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9yc2wuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9yc2wuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9yc2wuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9yeGxldl9zdGF0LmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3J4bGV2X3N0YXQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9yeGxldl9zdGF0LmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvcnhsZXZfc3RhdC5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3NlbGVjdC5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9zZWxlY3QuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS9zZWxlY3QuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9zZWxlY3QuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS9zaWduYWwuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvc2lnbmFsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvc2lnbmFsLmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvc2lnbmFsLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvc3RhdGlzdGljcy5oIGIvbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS9zdGF0aXN0aWNzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvc3RhdGlzdGljcy5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3N0YXRpc3RpY3MuaApkaWZmIC0tZ2l0IGEvaW5jbHVkZS9vc21vY29yZS90YWxsb2MuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdGFsbG9jLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvdGFsbG9jLmgKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdGFsbG9jLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvdGltZXIuaCBiL2xpYm9zbW9jb3JlL2luY2x1ZGUvb3Ntb2NvcmUvdGltZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gaW5jbHVkZS9vc21vY29yZS90aW1lci5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3RpbWVyLmgKZGlmZiAtLWdpdCBhL2luY2x1ZGUvb3Ntb2NvcmUvdGx2LmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Rsdi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBpbmNsdWRlL29zbW9jb3JlL3Rsdi5oCnJlbmFtZSB0byBsaWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3Rsdi5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3V0aWxzLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3V0aWxzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvdXRpbHMuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS91dGlscy5oCmRpZmYgLS1naXQgYS9pbmNsdWRlL29zbW9jb3JlL3dyaXRlX3F1ZXVlLmggYi9saWJvc21vY29yZS9pbmNsdWRlL29zbW9jb3JlL3dyaXRlX3F1ZXVlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIGluY2x1ZGUvb3Ntb2NvcmUvd3JpdGVfcXVldWUuaApyZW5hbWUgdG8gbGlib3Ntb2NvcmUvaW5jbHVkZS9vc21vY29yZS93cml0ZV9xdWV1ZS5oCmRpZmYgLS1naXQgYS9saWJvc21vY29yZS5wYy5pbiBiL2xpYm9zbW9jb3JlL2xpYm9zbW9jb3JlLnBjLmluCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBsaWJvc21vY29yZS5wYy5pbgpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvbGlib3Ntb2NvcmUucGMuaW4KZGlmZiAtLWdpdCBhL3NyYy9NYWtlZmlsZS5hbSBiL2xpYm9zbW9jb3JlL3NyYy9NYWtlZmlsZS5hbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL01ha2VmaWxlLmFtCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvTWFrZWZpbGUuYW0KZGlmZiAtLWdpdCBhL3NyYy9iaXR2ZWMuYyBiL2xpYm9zbW9jb3JlL3NyYy9iaXR2ZWMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2JpdHZlYy5jCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvYml0dmVjLmMKZGlmZiAtLWdpdCBhL3NyYy9jb21wMTI4LmMgYi9saWJvc21vY29yZS9zcmMvY29tcDEyOC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvY29tcDEyOC5jCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvY29tcDEyOC5jCmRpZmYgLS1naXQgYS9zcmMvZ3NtNDguYyBiL2xpYm9zbW9jb3JlL3NyYy9nc200OC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvZ3NtNDguYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL2dzbTQ4LmMKZGlmZiAtLWdpdCBhL3NyYy9nc200OF9pZS5jIGIvbGlib3Ntb2NvcmUvc3JjL2dzbTQ4X2llLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9nc200OF9pZS5jCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvZ3NtNDhfaWUuYwpkaWZmIC0tZ2l0IGEvc3JjL2dzbV91dGlscy5jIGIvbGlib3Ntb2NvcmUvc3JjL2dzbV91dGlscy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvZ3NtX3V0aWxzLmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy9nc21fdXRpbHMuYwpkaWZmIC0tZ2l0IGEvc3JjL21zZ2IuYyBiL2xpYm9zbW9jb3JlL3NyYy9tc2diLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9tc2diLmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy9tc2diLmMKZGlmZiAtLWdpdCBhL3NyYy9yc2wuYyBiL2xpYm9zbW9jb3JlL3NyYy9yc2wuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3JzbC5jCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvcnNsLmMKZGlmZiAtLWdpdCBhL3NyYy9yeGxldl9zdGF0LmMgYi9saWJvc21vY29yZS9zcmMvcnhsZXZfc3RhdC5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvcnhsZXZfc3RhdC5jCnJlbmFtZSB0byBsaWJvc21vY29yZS9zcmMvcnhsZXZfc3RhdC5jCmRpZmYgLS1naXQgYS9zcmMvc2VsZWN0LmMgYi9saWJvc21vY29yZS9zcmMvc2VsZWN0LmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9zZWxlY3QuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL3NlbGVjdC5jCmRpZmYgLS1naXQgYS9zcmMvc2lnbmFsLmMgYi9saWJvc21vY29yZS9zcmMvc2lnbmFsLmMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9zaWduYWwuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL3NpZ25hbC5jCmRpZmYgLS1naXQgYS9zcmMvc3RhdGlzdGljcy5jIGIvbGlib3Ntb2NvcmUvc3JjL3N0YXRpc3RpY3MuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3N0YXRpc3RpY3MuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL3N0YXRpc3RpY3MuYwpkaWZmIC0tZ2l0IGEvc3JjL3RhbGxvYy5jIGIvbGlib3Ntb2NvcmUvc3JjL3RhbGxvYy5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGFsbG9jLmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy90YWxsb2MuYwpkaWZmIC0tZ2l0IGEvc3JjL3RpbWVyLmMgYi9saWJvc21vY29yZS9zcmMvdGltZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RpbWVyLmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy90aW1lci5jCmRpZmYgLS1naXQgYS9zcmMvdGx2X3BhcnNlci5jIGIvbGlib3Ntb2NvcmUvc3JjL3Rsdl9wYXJzZXIuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3Rsdl9wYXJzZXIuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL3Rsdl9wYXJzZXIuYwpkaWZmIC0tZ2l0IGEvc3JjL3V0aWxzLmMgYi9saWJvc21vY29yZS9zcmMvdXRpbHMuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3V0aWxzLmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3NyYy91dGlscy5jCmRpZmYgLS1naXQgYS9zcmMvd3JpdGVfcXVldWUuYyBiL2xpYm9zbW9jb3JlL3NyYy93cml0ZV9xdWV1ZS5jCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvd3JpdGVfcXVldWUuYwpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvc3JjL3dyaXRlX3F1ZXVlLmMKZGlmZiAtLWdpdCBhL3Rlc3RzL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvdGVzdHMvTWFrZWZpbGUuYW0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHRlc3RzL01ha2VmaWxlLmFtCnJlbmFtZSB0byBsaWJvc21vY29yZS90ZXN0cy9NYWtlZmlsZS5hbQpkaWZmIC0tZ2l0IGEvdGVzdHMvc21zL01ha2VmaWxlLmFtIGIvbGlib3Ntb2NvcmUvdGVzdHMvc21zL01ha2VmaWxlLmFtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy9zbXMvTWFrZWZpbGUuYW0KcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3Rlc3RzL3Ntcy9NYWtlZmlsZS5hbQpkaWZmIC0tZ2l0IGEvdGVzdHMvc21zL3Ntc190ZXN0LmMgYi9saWJvc21vY29yZS90ZXN0cy9zbXMvc21zX3Rlc3QuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvc21zL3Ntc190ZXN0LmMKcmVuYW1lIHRvIGxpYm9zbW9jb3JlL3Rlc3RzL3Ntcy9zbXNfdGVzdC5jCmRpZmYgLS1naXQgYS90ZXN0cy90aW1lci9NYWtlZmlsZS5hbSBiL2xpYm9zbW9jb3JlL3Rlc3RzL3RpbWVyL01ha2VmaWxlLmFtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSB0ZXN0cy90aW1lci9NYWtlZmlsZS5hbQpyZW5hbWUgdG8gbGlib3Ntb2NvcmUvdGVzdHMvdGltZXIvTWFrZWZpbGUuYW0KZGlmZiAtLWdpdCBhL3Rlc3RzL3RpbWVyL3RpbWVyX3Rlc3QuYyBiL2xpYm9zbW9jb3JlL3Rlc3RzL3RpbWVyL3RpbWVyX3Rlc3QuYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gdGVzdHMvdGltZXIvdGltZXJfdGVzdC5jCnJlbmFtZSB0byBsaWJvc21vY29yZS90ZXN0cy90aW1lci90aW1lcl90ZXN0LmMKZGlmZiAtLWdpdCBhL2xpbnV4LWtlcm5lbC9saW51eC0yLjYuMjcuNC1taXNkbi1hYmlzLmRpZmYgYi9saW51eC1rZXJuZWwvbGludXgtMi42LjI3LjQtbWlzZG4tYWJpcy5kaWZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM2OTFlZGEKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC1rZXJuZWwvbGludXgtMi42LjI3LjQtbWlzZG4tYWJpcy5kaWZmCkBAIC0wLDAgKzEsMTQ0IEBACitkaWZmIC1OcnUgLS1leGNsdWRlLWZyb20gL3N1bmJlYW0vaG9tZS9sYWZvcmdlL3NjcmlwdHMvZG9udGRpZmYgbGludXgtMi42LjI3LjQtY2xlYW4vZHJpdmVycy9pc2RuL21JU0ROL2xheWVyMi5jIGxpbnV4LTIuNi4yNy40L2RyaXZlcnMvaXNkbi9tSVNETi9sYXllcjIuYworLS0tIGxpbnV4LTIuNi4yNy40LWNsZWFuL2RyaXZlcnMvaXNkbi9tSVNETi9sYXllcjIuYwkyMDA4LTEwLTI2IDAwOjA1OjA3LjAwMDAwMDAwMCArMDIwMAorKysrIGxpbnV4LTIuNi4yNy40L2RyaXZlcnMvaXNkbi9tSVNETi9sYXllcjIuYwkyMDA4LTEyLTIzIDE2OjE2OjI5LjAwMDAwMDAwMCArMDEwMAorQEAgLTk0LDggKzk0LDEwIEBACisgCXN0cnVjdCBsYXllcjIgKmwyID0gZmktPnVzZXJkYXRhOworIAl2YV9saXN0IHZhOworIAorKyNpZiAwCisgCWlmICghKCpkZWJ1ZyAmIERFQlVHX0wyX0ZTTSkpCisgCQlyZXR1cm47CisrI2VuZGlmCisgCXZhX3N0YXJ0KHZhLCBmbXQpOworIAlwcmludGsoS0VSTl9ERUJVRyAibDIgKHRlaSAlZCk6ICIsIGwyLT50ZWkpOworIAl2cHJpbnRrKGZtdCwgdmEpOworQEAgLTg4Miw2ICs4ODQsOCBAQAorIAlsMi0+dmEgPSAwOworIAlsMi0+dnIgPSAwOworIAlsMi0+c293ID0gMDsKKysJbDItPnNhcGkgPSBza2ItPmRhdGFbMF0gPj4gMjsKKysJc2V0X2NoYW5uZWxfYWRkcmVzcygmbDItPmNoLCBsMi0+c2FwaSwgbDItPnRlaSk7CisgCWNsZWFyX2V4Y2VwdGlvbihsMik7CisgCXNlbmRfdWZyYW1lKGwyLCBOVUxMLCBVQSB8IGdldF9Qb2xsRmxhZyhsMiwgc2tiKSwgUlNQKTsKKyAJbUlTRE5fRnNtQ2hhbmdlU3RhdGUoZmksIFNUX0wyXzcpOworQEAgLTg5OCw2ICs5MDIsNyBAQAorIAlzdHJ1Y3QgbGF5ZXIyICpsMiA9IGZpLT51c2VyZGF0YTsKKyAJc3RydWN0IHNrX2J1ZmYgKnNrYiA9IGFyZzsKKyAKKysJcHJpbnRrKEtFUk5fREVCVUcgImwyX3NlbmRfVUEoKVxuIik7CisgCXNlbmRfdWZyYW1lKGwyLCBza2IsIFVBIHwgZ2V0X1BvbGxGbGFnKGwyLCBza2IpLCBSU1ApOworIH0KKyAKK0BAIC05MzEsNiArOTM2LDggQEAKKyAJbDItPnZhID0gMDsKKyAJbDItPnZyID0gMDsKKyAJbDItPnNvdyA9IDA7CisrCWwyLT5zYXBpID0gc2tiLT5kYXRhWzBdID4+IDI7CisrCXNldF9jaGFubmVsX2FkZHJlc3MoJmwyLT5jaCwgbDItPnNhcGksIGwyLT50ZWkpOworIAltSVNETl9Gc21DaGFuZ2VTdGF0ZShmaSwgU1RfTDJfNyk7CisgCXN0b3BfdDIwMChsMiwgMyk7CisgCW1JU0ROX0ZzbVJlc3RhcnRUaW1lcigmbDItPnQyMDMsIGwyLT5UMjAzLCBFVl9MMl9UMjAzLCBOVUxMLCAzKTsKK0BAIC05ODIsNiArOTg5LDggQEAKKyAJfSBlbHNlIGlmIChsMi0+dnMgIT0gbDItPnZhKSB7CisgCQlza2JfcXVldWVfcHVyZ2UoJmwyLT5pX3F1ZXVlKTsKKyAJCXByID0gRExfRVNUQUJMSVNIX0lORDsKKysJCS8vbDItPnNhcGkgPSBza2ItPmRhdGFbMF0gPj4gMjsKKysJCS8vc2V0X2NoYW5uZWxfYWRkcmVzcygmbDItPmNoLCBsMi0+c2FwaSwgbDItPnRlaSk7CisgCX0KKyAJc3RvcF90MjAwKGwyLCA1KTsKKyAJbDItPnZyID0gMDsKK0BAIC0xODQxLDExICsxODUwLDE0IEBACisgCXVfaW50CWw7CisgCWludAljID0gMDsKKyAKKysJcHJpbnRrKEtFUk5fREVCVUcgInBoX2RhdGFfaW5kaWNhdGlvbiAweCV4IDB4JXggMHgleFxuIiwgZGF0YXBbMF0sIGRhdGFwWzFdLCBkYXRhcFsyXSk7CisrCisgCWwgPSBsMmFkZHJzaXplKGwyKTsKKyAJaWYgKHNrYi0+bGVuIDw9IGwpIHsKKyAJCW1JU0ROX0ZzbUV2ZW50KCZsMi0+bDJtLCBFVl9MMl9GUkFNRV9FUlJPUiwgKHZvaWQgKikgJ04nKTsKKyAJCXJldHVybiByZXQ7CisgCX0KKysjaWYgMAorIAlpZiAodGVzdF9iaXQoRkxHX0xBUEQsICZsMi0+ZmxhZykpIHsgLyogTWF5YmUgbm90IG5lZWRlZCAqLworIAkJcHNhcGkgPSAqZGF0YXArKzsKKyAJCXB0ZWkgPSAqZGF0YXArKzsKK0BAIC0xODc1LDYgKzE4ODcsNyBAQAorIAkJCXJldHVybiAwOworIAkJfQorIAl9IGVsc2UKKysjZW5kaWYKKyAJCWRhdGFwICs9IGw7CisgCWlmICghKCpkYXRhcCAmIDEpKSB7CS8qIEktRnJhbWUgKi8KKyAJCWMgPSBpZnJhbWVfZXJyb3IobDIsIHNrYik7CitAQCAtMTg5MCw2ICsxOTAzLDcgQEAKKyAJCQlyZXQgPSBtSVNETl9Gc21FdmVudCgmbDItPmwybSwgRVZfTDJfVUksIHNrYik7CisgCX0gZWxzZSBpZiAoSXNTQUJNRShkYXRhcCwgbDIpKSB7CisgCQljID0gdW5udW1fZXJyb3IobDIsIHNrYiwgQ01EKTsKKysJCXByaW50ayhLRVJOX0RFQlVHICJJc1NBQk1FKCkgcmV0dXJuZWQgdHJ1ZSwgdW5udW1fZXJyb3I9JWRcbiIsIGMpOworIAkJaWYgKCFjKQorIAkJCXJldCA9IG1JU0ROX0ZzbUV2ZW50KCZsMi0+bDJtLCBFVl9MMl9TQUJNRSwgc2tiKTsKKyAJfSBlbHNlIGlmIChJc1VBKGRhdGFwKSkgeworQEAgLTIwODcsNyArMjEwMSw3IEBACisgCQl0ZXN0X2FuZF9zZXRfYml0KEZMR19MQVBELCAmbDItPmZsYWcpOworIAkJdGVzdF9hbmRfc2V0X2JpdChGTEdfTEFQRF9ORVQsICZsMi0+ZmxhZyk7CisgCQl0ZXN0X2FuZF9zZXRfYml0KEZMR19NT0QxMjgsICZsMi0+ZmxhZyk7CistCQlsMi0+c2FwaSA9IDA7CisrCQlsMi0+c2FwaSA9IDYyOworIAkJbDItPm1heGxlbiA9IE1BWF9ERlJBTUVfTEVOOworIAkJaWYgKHRlc3RfYml0KE9QVElPTl9MMl9QTVgsICZvcHRpb25zKSkKKyAJCQlsMi0+d2luZG93ID0gNzsKK2RpZmYgLU5ydSAtLWV4Y2x1ZGUtZnJvbSAvc3VuYmVhbS9ob21lL2xhZm9yZ2Uvc2NyaXB0cy9kb250ZGlmZiBsaW51eC0yLjYuMjcuNC1jbGVhbi9kcml2ZXJzL2lzZG4vbUlTRE4vdGVpLmMgbGludXgtMi42LjI3LjQvZHJpdmVycy9pc2RuL21JU0ROL3RlaS5jCistLS0gbGludXgtMi42LjI3LjQtY2xlYW4vZHJpdmVycy9pc2RuL21JU0ROL3RlaS5jCTIwMDgtMTAtMjYgMDA6MDU6MDcuMDAwMDAwMDAwICswMjAwCisrKysgbGludXgtMi42LjI3LjQvZHJpdmVycy9pc2RuL21JU0ROL3RlaS5jCTIwMDgtMTItMjMgMTY6MzI6NTkuMDAwMDAwMDAwICswMTAwCitAQCAtODMwLDE4ICs4MzAsMjkgQEAKKyAJaW50CQl0ZWksIHJpOworIAlzdHJ1Y3QgbGF5ZXIyCSpsMjsKKyAKKysJcHJpbnRrKEtFUk5fREVCVUcgIm5ldyB0ZWkgcmVxdWVzdDogdGVpPSVkXG4iLCBkcFszXSA+PiAxKTsKKysKKyAJcmkgPSBkcFswXSA8PCA4OworIAlyaSArPSBkcFsxXTsKKy0JaWYgKCFtZ3ItPnVwKQorLQkJZ290byBkZW5pZWQ7CistCXRlaSA9IGdldF9mcmVlX3RlaShtZ3IpOworLQlpZiAodGVpIDwgMCkgeworLQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6Tm8gZnJlZSB0ZWlcbiIsIF9fZnVuY19fKTsKKysJaWYgKCFtZ3ItPnVwKSB7CisrCQlwcmludGsoS0VSTl9ERUJVRyAibWdyLT51cCA9PSBOVUxMXG4iKTsKKyAJCWdvdG8gZGVuaWVkOworIAl9CisrCWlmIChkcFszXSAhPSAweGZmKSB7CisrCQkvKiBUaGlzIGlzIGEgVEVJIHJlcXVlc3QgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMDguNTYgNi4xLjExLjIgKi8KKysJCXRlaSA9IGRwWzNdID4+IDE7CisrCX0gZWxzZSB7CisrCQl0ZWkgPSBnZXRfZnJlZV90ZWkobWdyKTsKKysJCWlmICh0ZWkgPCAwKSB7CisrCQkJcHJpbnRrKEtFUk5fV0FSTklORyAiJXM6Tm8gZnJlZSB0ZWlcbiIsIF9fZnVuY19fKTsKKysJCQlnb3RvIGRlbmllZDsKKysJCX0KKysJfQorIAlsMiA9IGNyZWF0ZV9uZXdfdGVpKG1nciwgdGVpKTsKKy0JaWYgKCFsMikKKysJaWYgKCFsMikgeworKwkJcHJpbnRrKEtFUk5fREVCVUcgImNyZWF0ZV9uZXdfdGVpID09IE5VTExcbiIpOworIAkJZ290byBkZW5pZWQ7CisrCX0KKyAJZWxzZQorIAkJbUlTRE5fRnNtRXZlbnQoJmwyLT50bS0+dGVpX20sIEVWX0FTU0lHTl9SRVEsIGRwKTsKKyAJcmV0dXJuOworQEAgLTExNTksMTIgKzExNzAsMTQgQEAKKyAJCXJldHVybiAtRU5PVENPTk47CisgCWlmIChza2ItPmxlbiAhPSAzKQorIAkJcmV0dXJuIC1FTk9UQ09OTjsKKysjaWYgMAorIAlpZiAoc2tiLT5kYXRhWzBdICE9IDApCisgCQkvKiBvbmx5IFNBUEkgMCBjb21tYW5kICovCisgCQlyZXR1cm4gLUVOT1RDT05OOworKyNlbmRpZgorIAlpZiAoIShza2ItPmRhdGFbMV0gJiAxKSkgLyogaW52YWxpZCBFQTEgKi8KKyAJCXJldHVybiAtRUlOVkFMOworLQl0ZWkgPSBza2ItPmRhdGFbMV0gPj4gMDsKKysJdGVpID0gc2tiLT5kYXRhWzFdID4+IDE7CisgCWlmICh0ZWkgPiA2MykgLyogbm90IGEgZml4ZWQgdGVpICovCisgCQlyZXR1cm4gLUVOT1RDT05OOworIAlpZiAoKHNrYi0+ZGF0YVsyXSAmIH4weDEwKSAhPSBTQUJNRSkKZGlmZiAtLWdpdCBhL2xpbnV4LWtlcm5lbC9saW51eC0yLjYuMzAtaGZjbXVsdGktbXVsdGlidHMucGF0Y2ggYi9saW51eC1rZXJuZWwvbGludXgtMi42LjMwLWhmY211bHRpLW11bHRpYnRzLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiOTRkMzQKLS0tIC9kZXYvbnVsbAorKysgYi9saW51eC1rZXJuZWwvbGludXgtMi42LjMwLWhmY211bHRpLW11bHRpYnRzLnBhdGNoCkBAIC0wLDAgKzEsNDg2IEBACitUaGlzIGV4cGVyaW1lbnRhbCBwYXRjaCBzcGxpdHMgb25lIEUxIGNhcmQgaW50byB0aHJlZSB2aXJ0dWFsIGNhcmRzLAorCitUUyAxLDIsMyw0LDUgaXMgY2FyZCAwCitUUyA2LDcsOCw5LDEwIGlzIGNhcmQgMQorVFMgMTEsMTIsMTMsMTQgaXMgY2FyZCAyCisKK1RoaXMgYWxsb3dzIHlvdSB0byBydW4gb25lIEwyIFRFSSBoYW5kbGVyIG9uIGVhY2ggb2YgdGhlIHZpcnR1YWwgY2FyZHMsCit3aGljaCBpcyByZXF1aXJlZCBpZiB5b3Ugd2FudCB0byBydW4gbXVsdGlwbGUgQlRTIG9uIGEgc2luZ2xlIEUxIGxpbmsuCisKK1RoYW5rcyB0byBBbmRyZWFzIEV2ZXJzYmVyZyBmb3IgdGhpcyBwYXRjaC4KKworZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNfbXVsdGkuaCBiL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNfbXVsdGkuaAoraW5kZXggMGM3NzM4Ni4uMDJkZDRhMSAxMDA2NDQKKy0tLSBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNfbXVsdGkuaAorKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY19tdWx0aS5oCitAQCAtMjA5LDE0ICsyMDksMTcgQEAgc3RydWN0IGhmY19tdWx0aSB7CisgCXVfbG9uZwkJbGVkc3RhdGU7IC8qIHNhdmUgbGFzdCBzdGF0ZSBvZiBsZWRzICovCisgCWludAkJb3B0aWNhbHN1cHBvcnQ7IC8qIGhhcyB0aGUgZTEgYm9hcmQgKi8KKyAJCQkJCS8qIGFuIG9wdGljYWwgSW50ZXJmYWNlICovCistCWludAkJZHNsb3Q7CS8qIGNoYW5uZWwgIyBvZiBkLWNoYW5uZWwgKEUxKSBkZWZhdWx0IDE2ICovCisrCisrCXVfaW50CQlibWFza1szMl07IC8qIGJpdG1hc2sgb2YgYmNoYW5uZWxzIGZvciBwb3J0ICovCisrCXVfY2hhcgkJZG51bVszMl07IC8qIGFycmF5IG9mIHVzZWQgZGNoYW5uZWwgbnVtYmVycyBmb3IgcG9ydCAqLworKwl1X2NoYXIJCWNyZWF0ZWRbMzJdOyAvKiB3aGF0IHBvcnQgaXMgY3JlYXRlZCAqLworKwl1X2ludAkJYWN0aXZpdHlbMzJdOyAJLyogaWYgdGhlcmUgaXMgYW55IGFjdGlvbiBvbiB0aGlzICovCisrCQkJCQkvKiBwb3J0ICh3aWxsIGJlIGNsZWFyZWQgYWZ0ZXIgKi8KKysJCQkJCS8qIHNob3dpbmcgbGVkLXN0YXRlcykgKi8KKyAKKyAJdV9sb25nCQl3ZGNvdW50OyAJLyogZXZlcnkgNTAwIG1zIHdlIG5lZWQgdG8gKi8KKyAJCQkJCS8qIHNlbmQgdGhlIHdhdGNoZG9nIGEgc2lnbmFsICovCisgCXVfY2hhcgkJd2RieXRlOyAvKiB3YXRjaGRvZyB0b2dnbGUgYnl0ZSAqLworLQl1X2ludAkJYWN0aXZpdHlbOF07IAkvKiBpZiB0aGVyZSBpcyBhbnkgYWN0aW9uIG9uIHRoaXMgKi8KKy0JCQkJCS8qIHBvcnQgKHdpbGwgYmUgY2xlYXJlZCBhZnRlciAqLworLQkJCQkJLyogc2hvd2luZyBsZWQtc3RhdGVzKSAqLworIAlpbnQJCWUxX3N0YXRlOyAvKiBrZWVwIHRyYWNrIG9mIGxhc3Qgc3RhdGUgKi8KKyAJaW50CQllMV9nZXRjbG9jazsgLyogaWYgc3luYyBpcyByZXRyaWV2ZWQgZnJvbSBpbnRlcmZhY2UgKi8KKyAJaW50CQlzeW5jcm9uaXplZDsgLyoga2VlcCB0cmFjayBvZiBleGlzdGluZyBzeW5jIGludGVyZmFjZSAqLworQEAgLTIzMyw3ICsyMzYsNiBAQCBzdHJ1Y3QgaGZjX211bHRpIHsKKyAJICogdGhlIGJjaC0+Y2hhbm5lbCBpcyBlcXV2YWxlbnQgdG8gdGhlIGhmYy1jaGFubmVsCisgCSAqLworIAlzdHJ1Y3QgaGZjX2NoYW4JY2hhblszMl07CistCXVfY2hhcgkJY3JlYXRlZFs4XTsgLyogd2hhdCBwb3J0IGlzIGNyZWF0ZWQgKi8KKyAJc2lnbmVkIGNoYXIJc2xvdF9vd25lclsyNTZdOyAvKiBvd25lciBjaGFubmVsIG9mIHNsb3QgKi8KKyB9OworIAorZGlmZiAtLWdpdCBhL2RyaXZlcnMvaXNkbi9oYXJkd2FyZS9tSVNETi9oZmNtdWx0aS5jIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY211bHRpLmMKK2luZGV4IGUxZGFiMzAuLjRmZTJkMjcgMTAwNjQ0CistLS0gYS9kcml2ZXJzL2lzZG4vaGFyZHdhcmUvbUlTRE4vaGZjbXVsdGkuYworKysrIGIvZHJpdmVycy9pc2RuL2hhcmR3YXJlL21JU0ROL2hmY211bHRpLmMKK0BAIC0xNjE5LDggKzE2MTksOCBAQCBoZmNtdWx0aV9sZWRzKHN0cnVjdCBoZmNfbXVsdGkgKmhjKQorIAkJICogbGVmdCByZWQ6ICAgICAgIGZyYW1lIHN5bmMsIGJ1dCBubyBMMQorIAkJICogcmlnaHQgZ3JlZW46ICAgIEwyIGFjdGl2ZQorIAkJICovCistCQlpZiAoaGMtPmNoYW5baGMtPmRzbG90XS5zeW5jICE9IDIpIHsgLyogbm8gZnJhbWUgc3luYyAqLworLQkJCWlmIChoYy0+Y2hhbltoYy0+ZHNsb3RdLmRjaC0+ZGV2LkQucHJvdG9jb2wKKysJCWlmIChoYy0+Y2hhbltoYy0+ZG51bVswXV0uc3luYyAhPSAyKSB7IC8qIG5vIGZyYW1lIHN5bmMgKi8KKysJCQlpZiAoaGMtPmNoYW5baGMtPmRudW1bMF1dLmRjaC0+ZGV2LkQucHJvdG9jb2wKKyAJCQkJIT0gSVNETl9QX05UX0UxKSB7CisgCQkJCWxlZFswXSA9IDE7CisgCQkJCWxlZFsxXSA9IDE7CitAQCAtMjQyOCw1NSArMjQyOCw1NiBAQCBoYW5kbGVfdGltZXJfaXJxKHN0cnVjdCBoZmNfbXVsdGkgKmhjKQorIAkJCX0KKyAJCX0KKyAJaWYgKGhjLT5jdHlwZSA9PSBIRkNfVFlQRV9FMSAmJiBoYy0+Y3JlYXRlZFswXSkgeworLQkJZGNoID0gaGMtPmNoYW5baGMtPmRzbG90XS5kY2g7CistCQlpZiAodGVzdF9iaXQoSEZDX0NGR19SRVBPUlRfTE9TLCAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpKSB7CisrI3dhcm5pbmcgdG9kbzogcHV0IGludGVyZmFjZSBwYXJhbWV0ZXJzIHRvIGhjCisrCQlkY2ggPSBoYy0+Y2hhbltoYy0+ZG51bVswXV0uZGNoOworKwkJaWYgKHRlc3RfYml0KEhGQ19DRkdfUkVQT1JUX0xPUywgJmhjLT5jaGFuW2hjLT5kbnVtWzBdXS5jZmcpKSB7CisgCQkJLyogTE9TICovCisgCQkJdGVtcCA9IEhGQ19pbmJfbm9kZWJ1ZyhoYywgUl9TWU5DX1NUQSkgJiBWX1NJR19MT1M7CistCQkJaWYgKCF0ZW1wICYmIGhjLT5jaGFuW2hjLT5kc2xvdF0ubG9zKQorKwkJCWlmICghdGVtcCAmJiBoYy0+Y2hhbltoYy0+ZG51bVswXV0ubG9zKQorIAkJCQlzaWduYWxfc3RhdGVfdXAoZGNoLCBMMV9TSUdOQUxfTE9TX09OLAorIAkJCQkgICAgIkxPUyBkZXRlY3RlZCIpOworLQkJCWlmICh0ZW1wICYmICFoYy0+Y2hhbltoYy0+ZHNsb3RdLmxvcykKKysJCQlpZiAodGVtcCAmJiAhaGMtPmNoYW5baGMtPmRudW1bMF1dLmxvcykKKyAJCQkJc2lnbmFsX3N0YXRlX3VwKGRjaCwgTDFfU0lHTkFMX0xPU19PRkYsCisgCQkJCSAgICAiTE9TIGdvbmUiKTsKKy0JCQloYy0+Y2hhbltoYy0+ZHNsb3RdLmxvcyA9IHRlbXA7CisrCQkJaGMtPmNoYW5baGMtPmRudW1bMF1dLmxvcyA9IHRlbXA7CisgCQl9CistCQlpZiAodGVzdF9iaXQoSEZDX0NGR19SRVBPUlRfQUlTLCAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpKSB7CisrCQlpZiAodGVzdF9iaXQoSEZDX0NGR19SRVBPUlRfQUlTLCAmaGMtPmNoYW5baGMtPmRudW1bMF1dLmNmZykpIHsKKyAJCQkvKiBBSVMgKi8KKyAJCQl0ZW1wID0gSEZDX2luYl9ub2RlYnVnKGhjLCBSX1NZTkNfU1RBKSAmIFZfQUlTOworLQkJCWlmICghdGVtcCAmJiBoYy0+Y2hhbltoYy0+ZHNsb3RdLmFpcykKKysJCQlpZiAoIXRlbXAgJiYgaGMtPmNoYW5baGMtPmRudW1bMF1dLmFpcykKKyAJCQkJc2lnbmFsX3N0YXRlX3VwKGRjaCwgTDFfU0lHTkFMX0FJU19PTiwKKyAJCQkJICAgICJBSVMgZGV0ZWN0ZWQiKTsKKy0JCQlpZiAodGVtcCAmJiAhaGMtPmNoYW5baGMtPmRzbG90XS5haXMpCisrCQkJaWYgKHRlbXAgJiYgIWhjLT5jaGFuW2hjLT5kbnVtWzBdXS5haXMpCisgCQkJCXNpZ25hbF9zdGF0ZV91cChkY2gsIEwxX1NJR05BTF9BSVNfT0ZGLAorIAkJCQkgICAgIkFJUyBnb25lIik7CistCQkJaGMtPmNoYW5baGMtPmRzbG90XS5haXMgPSB0ZW1wOworKwkJCWhjLT5jaGFuW2hjLT5kbnVtWzBdXS5haXMgPSB0ZW1wOworIAkJfQorLQkJaWYgKHRlc3RfYml0KEhGQ19DRkdfUkVQT1JUX1NMSVAsICZoYy0+Y2hhbltoYy0+ZHNsb3RdLmNmZykpIHsKKysJCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX1JFUE9SVF9TTElQLCAmaGMtPmNoYW5baGMtPmRudW1bMF1dLmNmZykpIHsKKyAJCQkvKiBTTElQICovCisgCQkJdGVtcCA9IEhGQ19pbmJfbm9kZWJ1ZyhoYywgUl9TTElQKSAmIFZfRk9TTElQX1JYOworLQkJCWlmICghdGVtcCAmJiBoYy0+Y2hhbltoYy0+ZHNsb3RdLnNsaXBfcngpCisrCQkJaWYgKCF0ZW1wICYmIGhjLT5jaGFuW2hjLT5kbnVtWzBdXS5zbGlwX3J4KQorIAkJCQlzaWduYWxfc3RhdGVfdXAoZGNoLCBMMV9TSUdOQUxfU0xJUF9SWCwKKyAJCQkJICAgICIgYml0IFNMSVAgZGV0ZWN0ZWQgUlgiKTsKKy0JCQloYy0+Y2hhbltoYy0+ZHNsb3RdLnNsaXBfcnggPSB0ZW1wOworKwkJCWhjLT5jaGFuW2hjLT5kbnVtWzBdXS5zbGlwX3J4ID0gdGVtcDsKKyAJCQl0ZW1wID0gSEZDX2luYl9ub2RlYnVnKGhjLCBSX1NMSVApICYgVl9GT1NMSVBfVFg7CistCQkJaWYgKCF0ZW1wICYmIGhjLT5jaGFuW2hjLT5kc2xvdF0uc2xpcF90eCkKKysJCQlpZiAoIXRlbXAgJiYgaGMtPmNoYW5baGMtPmRudW1bMF1dLnNsaXBfdHgpCisgCQkJCXNpZ25hbF9zdGF0ZV91cChkY2gsIEwxX1NJR05BTF9TTElQX1RYLAorIAkJCQkgICAgIiBiaXQgU0xJUCBkZXRlY3RlZCBUWCIpOworLQkJCWhjLT5jaGFuW2hjLT5kc2xvdF0uc2xpcF90eCA9IHRlbXA7CisrCQkJaGMtPmNoYW5baGMtPmRudW1bMF1dLnNsaXBfdHggPSB0ZW1wOworIAkJfQorLQkJaWYgKHRlc3RfYml0KEhGQ19DRkdfUkVQT1JUX1JESSwgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKSkgeworKwkJaWYgKHRlc3RfYml0KEhGQ19DRkdfUkVQT1JUX1JESSwgJmhjLT5jaGFuW2hjLT5kbnVtWzBdXS5jZmcpKSB7CisgCQkJLyogUkRJICovCisgCQkJdGVtcCA9IEhGQ19pbmJfbm9kZWJ1ZyhoYywgUl9SWF9TTDBfMCkgJiBWX0E7CistCQkJaWYgKCF0ZW1wICYmIGhjLT5jaGFuW2hjLT5kc2xvdF0ucmRpKQorKwkJCWlmICghdGVtcCAmJiBoYy0+Y2hhbltoYy0+ZG51bVswXV0ucmRpKQorIAkJCQlzaWduYWxfc3RhdGVfdXAoZGNoLCBMMV9TSUdOQUxfUkRJX09OLAorIAkJCQkgICAgIlJESSBkZXRlY3RlZCIpOworLQkJCWlmICh0ZW1wICYmICFoYy0+Y2hhbltoYy0+ZHNsb3RdLnJkaSkKKysJCQlpZiAodGVtcCAmJiAhaGMtPmNoYW5baGMtPmRudW1bMF1dLnJkaSkKKyAJCQkJc2lnbmFsX3N0YXRlX3VwKGRjaCwgTDFfU0lHTkFMX1JESV9PRkYsCisgCQkJCSAgICAiUkRJIGdvbmUiKTsKKy0JCQloYy0+Y2hhbltoYy0+ZHNsb3RdLnJkaSA9IHRlbXA7CisrCQkJaGMtPmNoYW5baGMtPmRudW1bMF1dLnJkaSA9IHRlbXA7CisgCQl9CisgCQl0ZW1wID0gSEZDX2luYl9ub2RlYnVnKGhjLCBSX0pBVFRfRElSKTsKKy0JCXN3aXRjaCAoaGMtPmNoYW5baGMtPmRzbG90XS5zeW5jKSB7CisrCQlzd2l0Y2ggKGhjLT5jaGFuW2hjLT5kbnVtWzBdXS5zeW5jKSB7CisgCQljYXNlIDA6CisgCQkJaWYgKCh0ZW1wICYgMHg2MCkgPT0gMHg2MCkgeworIAkJCQlpZiAoZGVidWcgJiBERUJVR19IRkNNVUxUSV9TWU5DKQorQEAgLTI0ODUsMTAgKzI0ODYsMTAgQEAgaGFuZGxlX3RpbWVyX2lycShzdHJ1Y3QgaGZjX211bHRpICpoYykKKyAJCQkJCSAgICAiaW4gY2xvY2sgc3luY1xuIiwKKyAJCQkJCSAgICBfX2Z1bmNfXywgaGMtPmlkKTsKKyAJCQkJSEZDX291dGIoaGMsIFJfUlhfT0ZGLAorLQkJCQkgICAgaGMtPmNoYW5baGMtPmRzbG90XS5qaXR0ZXIgfCBWX1JYX0lOSVQpOworKwkJCQkgICAgaGMtPmNoYW5baGMtPmRudW1bMF1dLmppdHRlciB8IFZfUlhfSU5JVCk7CisgCQkJCUhGQ19vdXRiKGhjLCBSX1RYX09GRiwKKy0JCQkJICAgIGhjLT5jaGFuW2hjLT5kc2xvdF0uaml0dGVyIHwgVl9SWF9JTklUKTsKKy0JCQkJaGMtPmNoYW5baGMtPmRzbG90XS5zeW5jID0gMTsKKysJCQkJICAgIGhjLT5jaGFuW2hjLT5kbnVtWzBdXS5qaXR0ZXIgfCBWX1JYX0lOSVQpOworKwkJCQloYy0+Y2hhbltoYy0+ZG51bVswXV0uc3luYyA9IDE7CisgCQkJCWdvdG8gY2hlY2tfZnJhbWVzeW5jOworIAkJCX0KKyAJCQlicmVhazsKK0BAIC0yNDk5LDcgKzI1MDAsNyBAQCBoYW5kbGVfdGltZXJfaXJxKHN0cnVjdCBoZmNfbXVsdGkgKmhjKQorIAkJCQkJICAgICIlczogKGlkPSVkKSBFMSAiCisgCQkJCQkgICAgImxvc3QgY2xvY2sgc3luY1xuIiwKKyAJCQkJCSAgICBfX2Z1bmNfXywgaGMtPmlkKTsKKy0JCQkJaGMtPmNoYW5baGMtPmRzbG90XS5zeW5jID0gMDsKKysJCQkJaGMtPmNoYW5baGMtPmRudW1bMF1dLnN5bmMgPSAwOworIAkJCQlicmVhazsKKyAJCQl9CisgY2hlY2tfZnJhbWVzeW5jOgorQEAgLTI1MTAsNyArMjUxMSw3IEBAIGNoZWNrX2ZyYW1lc3luYzoKKyAJCQkJCSAgICAiJXM6IChpZD0lZCkgRTEgIgorIAkJCQkJICAgICJub3cgaW4gZnJhbWUgc3luY1xuIiwKKyAJCQkJCSAgICBfX2Z1bmNfXywgaGMtPmlkKTsKKy0JCQkJaGMtPmNoYW5baGMtPmRzbG90XS5zeW5jID0gMjsKKysJCQkJaGMtPmNoYW5baGMtPmRudW1bMF1dLnN5bmMgPSAyOworIAkJCX0KKyAJCQlicmVhazsKKyAJCWNhc2UgMjoKK0BAIC0yNTIwLDcgKzI1MjEsNyBAQCBjaGVja19mcmFtZXN5bmM6CisgCQkJCQkgICAgIiVzOiAoaWQ9JWQpIEUxIGxvc3QgIgorIAkJCQkJICAgICJjbG9jayAmIGZyYW1lIHN5bmNcbiIsCisgCQkJCQkgICAgX19mdW5jX18sIGhjLT5pZCk7CistCQkJCWhjLT5jaGFuW2hjLT5kc2xvdF0uc3luYyA9IDA7CisrCQkJCWhjLT5jaGFuW2hjLT5kbnVtWzBdXS5zeW5jID0gMDsKKyAJCQkJYnJlYWs7CisgCQkJfQorIAkJCXRlbXAgPSBIRkNfaW5iX25vZGVidWcoaGMsIFJfU1lOQ19TVEEpOworQEAgLTI1MzAsNyArMjUzMSw3IEBAIGNoZWNrX2ZyYW1lc3luYzoKKyAJCQkJCSAgICAiJXM6IChpZD0lZCkgRTEgIgorIAkJCQkJICAgICJsb3N0IGZyYW1lIHN5bmNcbiIsCisgCQkJCQkgICAgX19mdW5jX18sIGhjLT5pZCk7CistCQkJCWhjLT5jaGFuW2hjLT5kc2xvdF0uc3luYyA9IDE7CisrCQkJCWhjLT5jaGFuW2hjLT5kbnVtWzBdXS5zeW5jID0gMTsKKyAJCQl9CisgCQkJYnJlYWs7CisgCQl9CitAQCAtMjc0Niw3ICsyNzQ3LDggQEAgaGZjbXVsdGlfaW50ZXJydXB0KGludCBpbnRubywgdm9pZCAqZGV2X2lkKQorIAkJaWYgKHJfaXJxX21pc2MgJiBWX1NUQV9JUlEpIHsKKyAJCQlpZiAoaGMtPmN0eXBlID09IEhGQ19UWVBFX0UxKSB7CisgCQkJCS8qIHN0YXRlIG1hY2hpbmUgKi8KKy0JCQkJZGNoID0gaGMtPmNoYW5baGMtPmRzbG90XS5kY2g7CisrI3dhcm5pbmcgdG9kbworKwkJCQlkY2ggPSBoYy0+Y2hhbltoYy0+ZG51bVswXV0uZGNoOworIAkJCQllMV9zeW5jc3RhID0gSEZDX2luYl9ub2RlYnVnKGhjLCBSX1NZTkNfU1RBKTsKKyAJCQkJaWYgKHRlc3RfYml0KEhGQ19DSElQX1BMWFNELCAmaGMtPmNoaXApCisgCQkJCSAmJiBoYy0+ZTFfZ2V0Y2xvY2spIHsKK0BAIC0yNzY4LDcgKzI3NzAsMTUgQEAgaGZjbXVsdGlfaW50ZXJydXB0KGludCBpbnRubywgdm9pZCAqZGV2X2lkKQorIAkJCQl9CisgCQkJCWRjaC0+c3RhdGUgPSBIRkNfaW5iX25vZGVidWcoaGMsIFJfRTFfUkRfU1RBKQorIAkJCQkJJiAweDc7CisrI3dhcm5pbmcgdG9kbyBoYWNrISEhIGJyb2FkY2FzdCBzdGF0ZSBjaGFuZ2UhISEKKysJCQkJZGNoID0gaGMtPmNoYW5baGMtPmRudW1bMF1dLmRjaDsKKyAJCQkJc2NoZWR1bGVfZXZlbnQoZGNoLCBGTEdfUEhDSEFOR0UpOworKwkJCQlkY2ggPSBoYy0+Y2hhbltoYy0+ZG51bVsxXV0uZGNoOworKwkJCQlkY2gtPnN0YXRlID0gSEZDX2luYl9ub2RlYnVnKGhjLCBSX0UxX1JEX1NUQSkKKysJCQkJCSYgMHg3OworKwkJCQlzY2hlZHVsZV9ldmVudChkY2gsIEZMR19QSENIQU5HRSk7CisrCisrCisgCQkJCWlmIChkZWJ1ZyAmIERFQlVHX0hGQ01VTFRJX1NUQVRFKQorIAkJCQkJcHJpbnRrKEtFUk5fREVCVUcKKyAJCQkJCSAgICAiJXM6IEUxIChpZD0lZCkgbmV3c3RhdGUgJXhcbiIsCitAQCAtMzg1MSwzMSArMzg2MSwzNSBAQCBoZmNtdWx0aV9pbml0bW9kZShzdHJ1Y3QgZGNoYW5uZWwgKmRjaCkKKyAJaWYgKGRlYnVnICYgREVCVUdfSEZDTVVMVElfSU5JVCkKKyAJCXByaW50ayhLRVJOX0RFQlVHICIlczogZW50ZXJlZFxuIiwgX19mdW5jX18pOworIAorKwlpID0gZGNoLT5zbG90OworKwlwdCA9IGhjLT5jaGFuW2ldLnBvcnQ7CisgCWlmIChoYy0+Y3R5cGUgPT0gSEZDX1RZUEVfRTEpIHsKKy0JCWhjLT5jaGFuW2hjLT5kc2xvdF0uc2xvdF90eCA9IC0xOworLQkJaGMtPmNoYW5baGMtPmRzbG90XS5zbG90X3J4ID0gLTE7CistCQloYy0+Y2hhbltoYy0+ZHNsb3RdLmNvbmYgPSAtMTsKKy0JCWlmIChoYy0+ZHNsb3QpIHsKKy0JCQltb2RlX2hmY211bHRpKGhjLCBoYy0+ZHNsb3QsIGRjaC0+ZGV2LkQucHJvdG9jb2wsCisrCQkvKiBFMSAqLworKyN3YXJuaW5nIHRvZG86IGRvbicndCBkbyBpdCBpZiBkbnVtID09IDAKKysJCWhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uc2xvdF90eCA9IC0xOworKwkJaGMtPmNoYW5baGMtPmRudW1bcHRdXS5zbG90X3J4ID0gLTE7CisrCQloYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNvbmYgPSAtMTsKKysJCWlmIChoYy0+ZG51bVtwdF0pIHsKKysJCQltb2RlX2hmY211bHRpKGhjLCBkY2gtPnNsb3QsIGRjaC0+ZGV2LkQucHJvdG9jb2wsCisgCQkJCS0xLCAwLCAtMSwgMCk7CisgCQkJZGNoLT50aW1lci5mdW5jdGlvbiA9ICh2b2lkICopIGhmY211bHRpX2RidXN5X3RpbWVyOworIAkJCWRjaC0+dGltZXIuZGF0YSA9IChsb25nKSBkY2g7CisgCQkJaW5pdF90aW1lcigmZGNoLT50aW1lcik7CisgCQl9CisgCQlmb3IgKGkgPSAxOyBpIDw9IDMxOyBpKyspIHsKKy0JCQlpZiAoaSA9PSBoYy0+ZHNsb3QpCisrCQkJaWYgKCEoKDEgPDwgaSkgJiBoYy0+Ym1hc2tbcHRdKSkgLyogc2tpcCB1bnVzZWQgY2hhbm5lbCAqLworIAkJCQljb250aW51ZTsKKyAJCQloYy0+Y2hhbltpXS5zbG90X3R4ID0gLTE7CisgCQkJaGMtPmNoYW5baV0uc2xvdF9yeCA9IC0xOworIAkJCWhjLT5jaGFuW2ldLmNvbmYgPSAtMTsKKyAJCQltb2RlX2hmY211bHRpKGhjLCBpLCBJU0ROX1BfTk9ORSwgLTEsIDAsIC0xLCAwKTsKKyAJCX0KKy0JCS8qIEUxICovCistCQlpZiAodGVzdF9iaXQoSEZDX0NGR19SRVBPUlRfTE9TLCAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpKSB7CisrI3dhcm5pbmcgdG9kbyAoZ2xvYmFsKQorKwkJaWYgKHRlc3RfYml0KEhGQ19DRkdfUkVQT1JUX0xPUywgJmhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uY2ZnKSkgeworIAkJCUhGQ19vdXRiKGhjLCBSX0xPUzAsIDI1NSk7IC8qIDIgbXMgKi8KKyAJCQlIRkNfb3V0YihoYywgUl9MT1MxLCAyNTUpOyAvKiA1MTIgbXMgKi8KKyAJCX0KKy0JCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX09QVElDQUwsICZoYy0+Y2hhbltoYy0+ZHNsb3RdLmNmZykpIHsKKysJCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX09QVElDQUwsICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZykpIHsKKyAJCQlIRkNfb3V0YihoYywgUl9SWDAsIDApOworIAkJCWhjLT5ody5yX3R4MCA9IDAgfCBWX09VVF9FTjsKKyAJCX0gZWxzZSB7CitAQCAtMzg4OCwxMiArMzkwMiwxMiBAQCBoZmNtdWx0aV9pbml0bW9kZShzdHJ1Y3QgZGNoYW5uZWwgKmRjaCkKKyAJCUhGQ19vdXRiKGhjLCBSX1RYX0ZSMCwgMHgwMCk7CisgCQlIRkNfb3V0YihoYywgUl9UWF9GUjEsIDB4ZjgpOworIAorLQkJaWYgKHRlc3RfYml0KEhGQ19DRkdfQ1JDNCwgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKSkKKysJCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX0NSQzQsICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZykpCisgCQkJSEZDX291dGIoaGMsIFJfVFhfRlIyLCBWX1RYX01GIHwgVl9UWF9FIHwgVl9ORUdfRSk7CisgCisgCQlIRkNfb3V0YihoYywgUl9SWF9GUjAsIFZfQVVUT19SRVNZTkMgfCBWX0FVVE9fUkVDTyB8IDApOworIAorLQkJaWYgKHRlc3RfYml0KEhGQ19DRkdfQ1JDNCwgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKSkKKysJCWlmICh0ZXN0X2JpdChIRkNfQ0ZHX0NSQzQsICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZykpCisgCQkJSEZDX291dGIoaGMsIFJfUlhfRlIxLCBWX1JYX01GIHwgVl9SWF9NRl9TWU5DKTsKKyAKKyAJCWlmIChkY2gtPmRldi5ELnByb3RvY29sID09IElTRE5fUF9OVF9FMSkgeworQEAgLTM5NTcsNyArMzk3MSw3IEBAIGhmY211bHRpX2luaXRtb2RlKHN0cnVjdCBkY2hhbm5lbCAqZGNoKQorIAkJCXBseHNkX2NoZWNrc3luYyhoYywgMCk7CisgCQl9CisgCX0gZWxzZSB7CistCQlpID0gZGNoLT5zbG90OworKwkJLyogU1QgKi8KKyAJCWhjLT5jaGFuW2ldLnNsb3RfdHggPSAtMTsKKyAJCWhjLT5jaGFuW2ldLnNsb3RfcnggPSAtMTsKKyAJCWhjLT5jaGFuW2ldLmNvbmYgPSAtMTsKK0BAIC0zOTczLDggKzM5ODcsNiBAQCBoZmNtdWx0aV9pbml0bW9kZShzdHJ1Y3QgZGNoYW5uZWwgKmRjaCkKKyAJCWhjLT5jaGFuW2kgLSAxXS5zbG90X3J4ID0gLTE7CisgCQloYy0+Y2hhbltpIC0gMV0uY29uZiA9IC0xOworIAkJbW9kZV9oZmNtdWx0aShoYywgaSAtIDEsIElTRE5fUF9OT05FLCAtMSwgMCwgLTEsIDApOworLQkJLyogU1QgKi8KKy0JCXB0ID0gaGMtPmNoYW5baV0ucG9ydDsKKyAJCS8qIHNlbGVjdCBpbnRlcmZhY2UgKi8KKyAJCUhGQ19vdXRiKGhjLCBSX1NUX1NFTCwgcHQpOworIAkJLyogdW5kb2N1bWVudGVkOiBkZWxheSBhZnRlciBSX1NUX1NFTCAqLworQEAgLTQ1NTcsNiArNDU2OSw4IEBAIHJlbGVhc2VfcG9ydChzdHJ1Y3QgaGZjX211bHRpICpoYywgc3RydWN0IGRjaGFubmVsICpkY2gpCisgCQl9CisgCQkvKiBmcmVlIGNoYW5uZWxzICovCisgCQlmb3IgKGkgPSAwOyBpIDw9IDMxOyBpKyspIHsKKysJCQlpZiAoISgoMSA8PCBpKSAmIGhjLT5ibWFza1twdF0pKSAvKiBza2lwIHVudXNlZCBjaGFubmVsICovCisrCQkJCWNvbnRpbnVlOworIAkJCWlmIChoYy0+Y2hhbltpXS5iY2gpIHsKKyAJCQkJaWYgKGRlYnVnICYgREVCVUdfSEZDTVVMVElfSU5JVCkKKyAJCQkJCXByaW50ayhLRVJOX0RFQlVHCitAQCAtNDY4MCwxMiArNDY5NCwxMyBAQCByZWxlYXNlX2NhcmQoc3RydWN0IGhmY19tdWx0aSAqaGMpCisgfQorIAorIHN0YXRpYyBpbnQKKy1pbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0pCisraW5pdF9lMV9wb3J0KHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBzdHJ1Y3QgaG1fbWFwICptLCBpbnQgcHQpCisgeworIAlzdHJ1Y3QgZGNoYW5uZWwJKmRjaDsKKyAJc3RydWN0IGJjaGFubmVsCSpiY2g7CisgCWludAkJY2gsIHJldCA9IDA7CisgCWNoYXIJCW5hbWVbTUlTRE5fTUFYX0lETEVOXTsKKysJaW50CQliY291bnQgPSAwOworIAorIAlkY2ggPSBremFsbG9jKHNpemVvZihzdHJ1Y3QgZGNoYW5uZWwpLCBHRlBfS0VSTkVMKTsKKyAJaWYgKCFkY2gpCitAQCAtNDY5OCwxMyArNDcxMywxMiBAQCBpbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0pCisgCSAgICAoMSA8PCAoSVNETl9QX0JfSERMQyAmIElTRE5fUF9CX01BU0spKTsKKyAJZGNoLT5kZXYuRC5zZW5kID0gaGFuZGxlX2Rtc2c7CisgCWRjaC0+ZGV2LkQuY3RybCA9IGhmY21fZGN0cmw7CistCWRjaC0+ZGV2Lm5yYmNoYW4gPSAoaGMtPmRzbG90KSA/IDMwIDogMzE7CistCWRjaC0+c2xvdCA9IGhjLT5kc2xvdDsKKy0JaGMtPmNoYW5baGMtPmRzbG90XS5kY2ggPSBkY2g7CistCWhjLT5jaGFuW2hjLT5kc2xvdF0ucG9ydCA9IDA7CistCWhjLT5jaGFuW2hjLT5kc2xvdF0ubnRfdGltZXIgPSAtMTsKKysJZGNoLT5zbG90ID0gaGMtPmRudW1bcHRdOworKwloYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmRjaCA9IGRjaDsKKysJaGMtPmNoYW5baGMtPmRudW1bcHRdXS5wb3J0ID0gcHQ7CisrCWhjLT5jaGFuW2hjLT5kbnVtW3B0XV0ubnRfdGltZXIgPSAtMTsKKyAJZm9yIChjaCA9IDE7IGNoIDw9IDMxOyBjaCsrKSB7CistCQlpZiAoY2ggPT0gaGMtPmRzbG90KSAvKiBza2lwIGRjaGFubmVsICovCisrCQlpZiAoISgoMSA8PCBjaCkgJiBoYy0+Ym1hc2tbcHRdKSkgLyogc2tpcCB1bnVzZWQgY2hhbm5lbCAqLworIAkJCWNvbnRpbnVlOworIAkJYmNoID0ga3phbGxvYyhzaXplb2Yoc3RydWN0IGJjaGFubmVsKSwgR0ZQX0tFUk5FTCk7CisgCQlpZiAoIWJjaCkgeworQEAgLTQ3MzMsNyArNDc0NywxMCBAQCBpbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0pCisgCQloYy0+Y2hhbltjaF0uYmNoID0gYmNoOworIAkJaGMtPmNoYW5bY2hdLnBvcnQgPSAwOworIAkJc2V0X2NoYW5uZWxtYXAoYmNoLT5uciwgZGNoLT5kZXYuY2hhbm5lbG1hcCk7CisrCQliY291bnQrKzsKKyAJfQorKwlkY2gtPmRldi5ucmJjaGFuID0gYmNvdW50OworKyN3YXJuaW5nIHRvZG86IG11c3QgYmUgc2V0IGdsb2JhbGx5LCBhbmQgbXVzdCBiZSBhIHNlcGVyYXRlIGZ1bmN0aW9uCisgCS8qIHNldCBvcHRpY2FsIGxpbmUgdHlwZSAqLworIAlpZiAocG9ydFtQb3J0X2NudF0gJiAweDAwMSkgeworIAkJaWYgKCFtLT5vcHRpY2Fsc3VwcG9ydCkgIHsKK0BAIC00NzQ5LDcgKzQ3NjYsNyBAQCBpbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0pCisgCQkJCSAgICBfX2Z1bmNfXywKKyAJCQkJICAgIEhGQ19jbnQgKyAxLCAxKTsKKyAJCQl0ZXN0X2FuZF9zZXRfYml0KEhGQ19DRkdfT1BUSUNBTCwKKy0JCQkgICAgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKTsKKysJCQkgICAgJmhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uY2ZnKTsKKyAJCX0KKyAJfQorIAkvKiBzZXQgTE9TIHJlcG9ydCAqLworQEAgLTQ3NTksNyArNDc3Niw3IEBAIGluaXRfZTFfcG9ydChzdHJ1Y3QgaGZjX211bHRpICpoYywgc3RydWN0IGhtX21hcCAqbSkKKyAJCQkgICAgIkxPUyByZXBvcnQ6IGNhcmQoJWQpIHBvcnQoJWQpXG4iLAorIAkJCSAgICBfX2Z1bmNfXywgSEZDX2NudCArIDEsIDEpOworIAkJdGVzdF9hbmRfc2V0X2JpdChIRkNfQ0ZHX1JFUE9SVF9MT1MsCistCQkgICAgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKTsKKysJCSAgICAmaGMtPmNoYW5baGMtPmRudW1bcHRdXS5jZmcpOworIAl9CisgCS8qIHNldCBBSVMgcmVwb3J0ICovCisgCWlmIChwb3J0W1BvcnRfY250XSAmIDB4MDA4KSB7CitAQCAtNDc2OCw3ICs0Nzg1LDcgQEAgaW5pdF9lMV9wb3J0KHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBzdHJ1Y3QgaG1fbWFwICptKQorIAkJCSAgICAiQUlTIHJlcG9ydDogY2FyZCglZCkgcG9ydCglZClcbiIsCisgCQkJICAgIF9fZnVuY19fLCBIRkNfY250ICsgMSwgMSk7CisgCQl0ZXN0X2FuZF9zZXRfYml0KEhGQ19DRkdfUkVQT1JUX0FJUywKKy0JCSAgICAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpOworKwkJICAgICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZyk7CisgCX0KKyAJLyogc2V0IFNMSVAgcmVwb3J0ICovCisgCWlmIChwb3J0W1BvcnRfY250XSAmIDB4MDEwKSB7CitAQCAtNDc3OCw3ICs0Nzk1LDcgQEAgaW5pdF9lMV9wb3J0KHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBzdHJ1Y3QgaG1fbWFwICptKQorIAkJCSAgICAiY2FyZCglZCkgcG9ydCglZClcbiIsCisgCQkJICAgIF9fZnVuY19fLCBIRkNfY250ICsgMSwgMSk7CisgCQl0ZXN0X2FuZF9zZXRfYml0KEhGQ19DRkdfUkVQT1JUX1NMSVAsCistCQkgICAgJmhjLT5jaGFuW2hjLT5kc2xvdF0uY2ZnKTsKKysJCSAgICAmaGMtPmNoYW5baGMtPmRudW1bcHRdXS5jZmcpOworIAl9CisgCS8qIHNldCBSREkgcmVwb3J0ICovCisgCWlmIChwb3J0W1BvcnRfY250XSAmIDB4MDIwKSB7CitAQCAtNDc4OCw3ICs0ODA1LDcgQEAgaW5pdF9lMV9wb3J0KHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBzdHJ1Y3QgaG1fbWFwICptKQorIAkJCSAgICAiY2FyZCglZCkgcG9ydCglZClcbiIsCisgCQkJICAgIF9fZnVuY19fLCBIRkNfY250ICsgMSwgMSk7CisgCQl0ZXN0X2FuZF9zZXRfYml0KEhGQ19DRkdfUkVQT1JUX1JESSwKKy0JCSAgICAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpOworKwkJICAgICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZyk7CisgCX0KKyAJLyogc2V0IENSQy00IE1vZGUgKi8KKyAJaWYgKCEocG9ydFtQb3J0X2NudF0gJiAweDEwMCkpIHsKK0BAIC00Nzk3LDcgKzQ4MTQsNyBAQCBpbml0X2UxX3BvcnQoc3RydWN0IGhmY19tdWx0aSAqaGMsIHN0cnVjdCBobV9tYXAgKm0pCisgCQkJCSIgY2FyZCglZCkgcG9ydCglZClcbiIsCisgCQkJCV9fZnVuY19fLCBIRkNfY250ICsgMSwgMSk7CisgCQl0ZXN0X2FuZF9zZXRfYml0KEhGQ19DRkdfQ1JDNCwKKy0JCSAgICAmaGMtPmNoYW5baGMtPmRzbG90XS5jZmcpOworKwkJICAgICZoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmNmZyk7CisgCX0gZWxzZSB7CisgCQlpZiAoZGVidWcgJiBERUJVR19IRkNNVUxUSV9JTklUKQorIAkJCXByaW50ayhLRVJOX0RFQlVHICIlczogUE9SVCB0dXJuIG9mZiBDUkM0IgorQEAgLTQ4MjksMjAgKzQ4NDYsMjMgQEAgaW5pdF9lMV9wb3J0KHN0cnVjdCBoZmNfbXVsdGkgKmhjLCBzdHJ1Y3QgaG1fbWFwICptKQorIAl9CisgCS8qIHNldCBlbGFzdGljIGppdHRlciBidWZmZXIgKi8KKyAJaWYgKHBvcnRbUG9ydF9jbnRdICYgMHgzMDAwKSB7CistCQloYy0+Y2hhbltoYy0+ZHNsb3RdLmppdHRlciA9IChwb3J0W1BvcnRfY250XT4+MTIpICYgMHgzOworKwkJaGMtPmNoYW5baGMtPmRudW1bcHRdXS5qaXR0ZXIgPSAocG9ydFtQb3J0X2NudF0+PjEyKSAmIDB4MzsKKyAJCWlmIChkZWJ1ZyAmIERFQlVHX0hGQ01VTFRJX0lOSVQpCisgCQkJcHJpbnRrKEtFUk5fREVCVUcKKyAJCQkgICAgIiVzOiBQT1JUIHNldCBlbGFzdGljICIKKyAJCQkgICAgImJ1ZmZlciB0byAlZDogY2FyZCglZCkgcG9ydCglZClcbiIsCistCQkJICAgIF9fZnVuY19fLCBoYy0+Y2hhbltoYy0+ZHNsb3RdLmppdHRlciwKKysJCQkgICAgX19mdW5jX18sIGhjLT5jaGFuW2hjLT5kbnVtW3B0XV0uaml0dGVyLAorIAkJCSAgICBIRkNfY250ICsgMSwgMSk7CisgCX0gZWxzZQorLQkJaGMtPmNoYW5baGMtPmRzbG90XS5qaXR0ZXIgPSAyOyAvKiBkZWZhdWx0ICovCistCXNucHJpbnRmKG5hbWUsIE1JU0ROX01BWF9JRExFTiAtIDEsICJoZmMtZTEuJWQiLCBIRkNfY250ICsgMSk7CisrCQloYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmppdHRlciA9IDI7IC8qIGRlZmF1bHQgKi8KKysJaWYgKGhjLT5wb3J0cyA+IDEpCisrCQlzbnByaW50ZihuYW1lLCBNSVNETl9NQVhfSURMRU4gLSAxLCAiaGZjLWUxLiVkLSVkIiwgSEZDX2NudCArIDEsIHB0KzEpOworKwllbHNlCisrCQlzbnByaW50ZihuYW1lLCBNSVNETl9NQVhfSURMRU4gLSAxLCAiaGZjLWUxLiVkIiwgSEZDX2NudCArIDEpOworIAlyZXQgPSBtSVNETl9yZWdpc3Rlcl9kZXZpY2UoJmRjaC0+ZGV2LCAmaGMtPnBjaV9kZXYtPmRldiwgbmFtZSk7CisgCWlmIChyZXQpCisgCQlnb3RvIGZyZWVfY2hhbjsKKy0JaGMtPmNyZWF0ZWRbMF0gPSAxOworKwloYy0+Y3JlYXRlZFtwdF0gPSAxOworIAlyZXR1cm4gcmV0OworIGZyZWVfY2hhbjoKKyAJcmVsZWFzZV9wb3J0KGhjLCBkY2gpOworQEAgLTUwMDksMTggKzUwMjksMzAgQEAgaGZjbXVsdGlfaW5pdChzdHJ1Y3QgaG1fbWFwICptLCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKyAJaGMtPmlkID0gSEZDX2NudDsKKyAJaGMtPnBjbSA9IHBjbVtIRkNfY250XTsKKyAJaGMtPmlvX21vZGUgPSBpb21vZGVbSEZDX2NudF07CisrI3dhcm5pbmcgdG9kbzogcmV3b3JrIG1vZHVsZSBwYXJhbWV0ZXJzIGZvciBjdXN0b21pemluZyBlMSBmcmFnbWVudHMuLi4uIHllYSwgbGV0JydzIGNhbGwgaXQ6IGZyYWdtZW50cworIAlpZiAoZHNsb3RbSEZDX2NudF0gPCAwICYmIGhjLT5jdHlwZSA9PSBIRkNfVFlQRV9FMSkgeworLQkJaGMtPmRzbG90ID0gMDsKKysJCWhjLT5kbnVtWzBdID0gMDsKKyAJCXByaW50ayhLRVJOX0lORk8gIkhGQy1FMSBjYXJkIGhhcyBkaXNhYmxlZCBELWNoYW5uZWwsIGJ1dCAiCisgCQkJIjMxIEItY2hhbm5lbHNcbiIpOworIAl9CisgCWlmIChkc2xvdFtIRkNfY250XSA+IDAgJiYgZHNsb3RbSEZDX2NudF0gPCAzMgorIAkgICAgJiYgaGMtPmN0eXBlID09IEhGQ19UWVBFX0UxKSB7CistCQloYy0+ZHNsb3QgPSBkc2xvdFtIRkNfY250XTsKKysJCWhjLT5kbnVtWzBdID0gZHNsb3RbSEZDX2NudF07CisgCQlwcmludGsoS0VSTl9JTkZPICJIRkMtRTEgY2FyZCBoYXMgYWx0ZXJuYXRpbmcgRC1jaGFubmVsIG9uICIKKyAJCQkidGltZSBzbG90ICVkXG4iLCBkc2xvdFtIRkNfY250XSk7CisgCX0gZWxzZQorLQkJaGMtPmRzbG90ID0gMTY7CisrCQloYy0+ZG51bVswXSA9IDE2OworKworKyN3YXJuaW5nIHRvZG8gSEFDSyEhISBqdXN0IGEgc21hbGwgbWFwIG9mIHR3byAiZnJhZ21lbnRzIgorKwlpZiAoaGMtPmN0eXBlID09IEhGQ19UWVBFX0UxKSB7CisrCQloYy0+ZG51bVswXSA9IDE7CisrCQloYy0+Ym1hc2tbMF0gPSAweDAwMDAwMDNjOworKwkJaGMtPmRudW1bMV0gPSA2OworKwkJaGMtPmJtYXNrWzFdID0gMHgwMDAwMDc4MDsKKysJCWhjLT5kbnVtWzJdID0gMTE7CisrCQloYy0+Ym1hc2tbMl0gPSAweDAwMDA3ODAwOworKwkJaGMtPnBvcnRzID0gMzsKKysJfQorIAorIAkvKiBzZXQgY2hpcCBzcGVjaWZpYyBmZWF0dXJlcyAqLworIAloYy0+bWFzdGVyY2xrID0gLTE7CitAQCAtNTEwMyw3ICs1MTM1LDcgQEAgaGZjbXVsdGlfaW5pdChzdHJ1Y3QgaG1fbWFwICptLCBzdHJ1Y3QgcGNpX2RldiAqcGRldiwKKyAJCQlnb3RvIGZyZWVfY2FyZDsKKyAJCX0KKyAJCWlmIChoYy0+Y3R5cGUgPT0gSEZDX1RZUEVfRTEpCistCQkJcmV0X2VyciA9IGluaXRfZTFfcG9ydChoYywgbSk7CisrCQkJcmV0X2VyciA9IGluaXRfZTFfcG9ydChoYywgbSwgcHQpOworIAkJZWxzZQorIAkJCXJldF9lcnIgPSBpbml0X211bHRpX3BvcnQoaGMsIHB0KTsKKyAJCWlmIChkZWJ1ZyAmIERFQlVHX0hGQ01VTFRJX0lOSVQpCitAQCAtNTExNSwxMCArNTE0NywxNCBAQCBoZmNtdWx0aV9pbml0KHN0cnVjdCBobV9tYXAgKm0sIHN0cnVjdCBwY2lfZGV2ICpwZGV2LAorIAkJaWYgKHJldF9lcnIpIHsKKyAJCQl3aGlsZSAocHQpIHsgLyogcmVsZWFzZSBhbHJlYWR5IHJlZ2lzdGVyZWQgcG9ydHMgKi8KKyAJCQkJcHQtLTsKKy0JCQkJcmVsZWFzZV9wb3J0KGhjLCBoYy0+Y2hhblsocHQgPDwgMikgKyAyXS5kY2gpOworKwkJCQlpZiAoaGMtPmN0eXBlID09IEhGQ19UWVBFX0UxKQorKwkJCQkJcmVsZWFzZV9wb3J0KGhjLCBoYy0+Y2hhbltoYy0+ZG51bVtwdF1dLmRjaCk7CisrCQkJCWVsc2UKKysJCQkJCXJlbGVhc2VfcG9ydChoYywgaGMtPmNoYW5bKHB0IDw8IDIpICsgMl0uZGNoKTsKKyAJCQl9CisgCQkJZ290byBmcmVlX2NhcmQ7CisgCQl9CisrI3dhcm5pbmcgdG9kbzogY291bnQgaXQgcmlnaHQsIGFkZCBhZGRpdGlvbmFsICJmcmFnbWVudCIgY291bnRlci4uLgorIAkJUG9ydF9jbnQrKzsKKyAJfQorIApkaWZmIC0tZ2l0IGEvb3BlbmJzYy8uZ2l0aWdub3JlIGIvb3BlbmJzYy8uZ2l0aWdub3JlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2N2M5MDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjLy5naXRpZ25vcmUKQEAgLTAsMCArMSw0NSBAQAorKi5vCisqLmEKKy5kZXBzCitNYWtlZmlsZQorTWFrZWZpbGUuaW4KK2JzY2NvbmZpZy5oCitic2Njb25maWcuaC5pbgorb3BlbmJzYy5wYworYnNjX2hhY2sKK2JzY19tc2NfaXAKK2JzY19tZ2NwCisqLip+CisqLnN3PworCisjY29uZmlndXJlCithY2xvY2FsLm00CithdXRvbTR0ZS5jYWNoZS8KK2NvbmZpZy5sb2cKK2NvbmZpZy5zdGF0dXMKK2NvbmZpZ3VyZQorZGVwY29tcAoraW5zdGFsbC1zaAorbWlzc2luZworc3RhbXAtaDEKKworCisKKyMgYXBwcyBhbmQgYXBwIGRhdGEKK2hsci5zcWxpdGUzCiticzExX2NvbmZpZworaXBhY2Nlc3MtY29uZmlnCitpcGFjY2Vzcy1maW5kCitpcGFjY2Vzcy1maXJtd2FyZQoraXBhY2Nlc3MtcHJveHkKK2lzZG5zeW5jCisKKyN0ZXN0cwordGVzdHMvY2hhbm5lbC9jaGFubmVsX3Rlc3QKK3Rlc3RzL2RiL2RiX3Rlc3QKK3Rlc3RzL2RlYnVnL2RlYnVnX3Rlc3QKK3Rlc3RzL2dzbTA0MDgvZ3NtMDQwOF90ZXN0Cit0ZXN0cy9zY2NwL3NjY3BfdGVzdAordGVzdHMvc21zL3Ntc190ZXN0Cit0ZXN0cy90aW1lci90aW1lcl90ZXN0CisKZGlmZiAtLWdpdCBhL29wZW5ic2MvQVVUSE9SUyBiL29wZW5ic2MvQVVUSE9SUwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWY2MGU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9BVVRIT1JTCkBAIC0wLDAgKzEsNyBAQAorSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KK0hvbGdlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CitKYW4gTHVlYmJlIDxqbHVlYmJlQGRlYmlhbi5vcmc+CitTdGVmYW4gU2NobWlkdCA8c3RlZmFuQGRhdGVuZnJlaWhhZmVuLm9yZz4KK0RhbmllbCBXaWxsbWFubiA8ZGFuaWVsQHRvdGFsdWViZXJ3YWNodW5nLmRlPgorQW5kcmVhcyBFdmVyc2JlcmcgPEFuZHJlYXMuRXZlcnNiZXJnQHZlcnNhdGVsLmRlPgorU3lsdmFpbiBNdW5hdXQgPDI0NnRudEBnbWFpbC5jb20+CmRpZmYgLS1naXQgYS9DT1BZSU5HIGIvb3BlbmJzYy9DT1BZSU5HCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gQ09QWUlORwpjb3B5IHRvIG9wZW5ic2MvQ09QWUlORwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9NYWtlZmlsZS5hbSBiL29wZW5ic2MvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FjYWU3NQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwxMCBAQAorQVVUT01BS0VfT1BUSU9OUyA9IGZvcmVpZ24gZGlzdC1iemlwMiAxLjYKKworSU5DTFVERVMgPSAkKGFsbF9pbmNsdWRlcykgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUKK1NVQkRJUlMgPSBpbmNsdWRlIHNyYyB0ZXN0cworCitwa2djb25maWdkaXIgPSAkKGxpYmRpcikvcGtnY29uZmlnCitwa2djb25maWdfREFUQSA9IG9wZW5ic2MucGMgbGlic2NjcC5wYworCisjZGlzdC1ob29rOgorIwlybSAtcmYgYGZpbmQgJChkaXN0ZGlyKSAtbmFtZSAuc3ZuYApkaWZmIC0tZ2l0IGEvb3BlbmJzYy9SRUFETUUgYi9vcGVuYnNjL1JFQURNRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTgwN2JiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9SRUFETUUKQEAgLTAsMCArMSwzMCBAQAorQWJvdXQgT3BlbkJTQworPT09PT09PT09PT09PQorCitPcGVuQlNDIGlzIGEgbWluaW1hbGlzdGljIGltcGxlbWVudGF0aW9uIG9mIHRoZSBHU00gTmV0d29yaywgd2l0aAorcGFydGljdWxhciBlbXBoYXNpcyBvbiB0aGUgZnVuY3Rpb25hbGl0eSB0eXBpY2FsbHkgcHJvdmlkZWQgYnkgdGhlIEJTQywKK01TQywgSExSLCBWTFIgYW5kIFNNU0MuCisKK0l0cyBjdXJyZW50bHkgc3VwcG9ydGVkIGludGVyZmFjZXMgdG93YXJkcyB0aGUgQlRTIGFyZToKKworICogQ2xhc3NpYyBBLWJpcyBvdmVyIEUxIHVzaW5nIGEgbUlTRE4gYmFzZWQgRTEgaW50ZXJmYWNlLiBJbiBvdGhlcgorICAgd29yZHMsIHlvdSBjYW4gY29ubmVjdCBleGlzdGluZyBHU00gQmFzZSBUcmFuc2NlaXZlciBTdGF0aW9uIChCVFMpCisgICB0aHJvdWdoIEUxIHRvIE9wZW5CU0MuICBTbyBmYXIsIHdlIGhhdmUgb25seSB0ZXN0ZWQgdGhlIFNpZW1lbnMgQlMtMTEKKyAgIFRlc3QgcmVwb3J0cyB3aXRoIG90aGVyIEJUUyBhcmUgbXVjaCBhcHByZWNpYXRlZCEKKworICogQS1iaXMgb3ZlciBJUCBhcyB1c2VkIGJ5IHRoZSBpcC5hY2Nlc3MgbmFub0JUUyBwcm9kdWN0IGZhbWlseQorCitUaGlzIHByb2plY3QgaXMgc3RpbGwgaW4gaXRzIGVhcmx5IGRheXMsIGFuZCB0aGVyZSBhcmUgbG90cyBvZiBhcmVhcyB3aGVyZSBpdAorZG9lc24ndCBiZWhhdmUgYXMgcGVyIEdTTSBzcGVjLgorCisJSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKworCitsaWJvc21vY29yZQorPT09PT09PT09PT0KKworUGxlYXNlIG5vdGUgdGhhdCBhcyBvZiBNYXJjaCAyMDEwLCBPcGVuQlNDIGhhcyBhIGRlcGVuZGVuY3kgdG8gYSBsaWJyYXJ5CitjYWxsZWQgImxpYm9zbW9jb3JlIi4gIFlvdSBjYW4gb2J0YWluIHRoYXQgbGlicmFyeSBmcm9tCisKKwlnaXQ6Ly9naXQub3Ntb2NvbS5vcmcvbGlib3Ntb2NvcmUuZ2l0CisKZGlmZiAtLWdpdCBhL29wZW5ic2MvY29uZmlndXJlLmluIGIvb3BlbmJzYy9jb25maWd1cmUuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzFlZDEwYgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvY29uZmlndXJlLmluCkBAIC0wLDAgKzEsNTUgQEAKK2RubCBQcm9jZXNzIHRoaXMgZmlsZSB3aXRoIGF1dG9jb25mIHRvIHByb2R1Y2UgYSBjb25maWd1cmUgc2NyaXB0CitBQ19JTklUCisKK0FNX0lOSVRfQVVUT01BS0Uob3BlbmJzYywgMC4wYWxwaGExKQorCitkbmwga2VybmVsIHN0eWxlIGNvbXBpbGUgbWVzc2FnZXMKK200X2lmZGVmKFtBTV9TSUxFTlRfUlVMRVNdLCBbQU1fU0lMRU5UX1JVTEVTKFt5ZXNdKV0pCisKK2RubCBjaGVja3MgZm9yIHByb2dyYW1zCitBQ19QUk9HX01BS0VfU0VUCitBQ19QUk9HX0NDCitBQ19QUk9HX0lOU1RBTEwKK0FDX1BST0dfUkFOTElCCisKK2RubCBjaGVja3MgZm9yIGxpYnJhcmllcworQUNfU0VBUkNIX0xJQlMoY3J5cHQsIGNyeXB0LAorICAgIFtMSUJDUllQVD0iLWxjcnlwdCI7IEFDX0RFRklORShbVlRZX0NSWVBUX1BXXSwgW10sIFtVc2UgY3J5cHQgZnVuY3Rpb25hbGl0eSBvZiB2dHkuXSldKQorCitQS0dfQ0hFQ0tfTU9EVUxFUyhMSUJPU01PQ09SRSwgbGlib3Ntb2NvcmUpCisKK2RubCBjaGVja3MgZm9yIGhlYWRlciBmaWxlcworQUNfSEVBREVSX1NUREMKKworZG5sIENoZWNrcyBmb3IgdHlwZWRlZnMsIHN0cnVjdHVyZXMgYW5kIGNvbXBpbGVyIGNoYXJhY3RlcmlzdGljcworCisjIFRoZSBmb2xsb3dpbmcgdGVzdCBpcyB0YWtlbiBmcm9tIFdlYktpdCdzIHdlYmtpdC5tNAorc2F2ZWRfQ0ZMQUdTPSIkQ0ZMQUdTIgorQ0ZMQUdTPSIkQ0ZMQUdTIC1mdmlzaWJpbGl0eT1oaWRkZW4gIgorQUNfTVNHX0NIRUNLSU5HKFtpZiAke0NDfSBzdXBwb3J0cyAtZnZpc2liaWxpdHk9aGlkZGVuXSkKK0FDX0NPTVBJTEVfSUZFTFNFKFtjaGFyIGZvbztdLAorICAgICAgWyBBQ19NU0dfUkVTVUxUKFt5ZXNdKQorICAgICAgICBTWU1CT0xfVklTSUJJTElUWT0iLWZ2aXNpYmlsaXR5PWhpZGRlbiJdLAorICAgICAgICBBQ19NU0dfUkVTVUxUKFtub10pKQorQ0ZMQUdTPSIkc2F2ZWRfQ0ZMQUdTIgorQUNfU1VCU1QoU1lNQk9MX1ZJU0lCSUxJVFkpCisKKworZG5sIEdlbmVyYXRlIHRoZSBvdXRwdXQKK0FNX0NPTkZJR19IRUFERVIoYnNjY29uZmlnLmgpCisKK0FDX09VVFBVVCgKKyAgICBvcGVuYnNjLnBjCisgICAgbGlic2NjcC5wYworICAgIGluY2x1ZGUvb3BlbmJzYy9NYWtlZmlsZQorICAgIGluY2x1ZGUvdnR5L01ha2VmaWxlCisgICAgaW5jbHVkZS9zY2NwL01ha2VmaWxlCisgICAgaW5jbHVkZS9NYWtlZmlsZQorICAgIHNyYy9NYWtlZmlsZQorICAgIHRlc3RzL01ha2VmaWxlCisgICAgdGVzdHMvZGVidWcvTWFrZWZpbGUKKyAgICB0ZXN0cy9nc20wNDA4L01ha2VmaWxlCisgICAgdGVzdHMvZGIvTWFrZWZpbGUKKyAgICB0ZXN0cy9jaGFubmVsL01ha2VmaWxlCisgICAgdGVzdHMvc2NjcC9NYWtlZmlsZQorICAgIE1ha2VmaWxlKQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9jb250cmliL2J0LnB5IGIvb3BlbmJzYy9jb250cmliL2J0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjFiMTExZWYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2NvbnRyaWIvYnQucHkKQEAgLTAsMCArMSwzMyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKK2ltcG9ydCBvcworCitmID0gb3BlbigidW5iYWxhbmNlZCIpCitsaW5lcyA9IFtdCitmb3IgbGluZSBpbiBmOgorICAgIGxpbmVzLmFwcGVuZChsaW5lKQorCitmaWxlbmFtZXMgPSB7fQorCitvdXRwdXQgPSBbXQorZm9yIGxpbmUgaW4gbGluZXM6CisgICAgaWYgIlsweCIgaW4gbGluZToKKyAgICAgICAgc3RhcnQgPSBsaW5lLmZpbmQoIlsiKQorICAgICAgICBlbmQgPSBsaW5lLmZpbmQoIl0iKQorICAgICAgICBhZGRyID0gbGluZVtzdGFydCsxOmVuZF0KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZmlsZSA9IGZpbGVuYW1lc1thZGRyXQorICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICByID0gb3MucG9wZW4oImFkZHIybGluZSAtZnMgLWUgLi9ic2NfaGFjayAlcyIgJSBhZGRyKQorICAgICAgICAgICAgYWxsID0gci5yZWFkKCkucmVwbGFjZSgiXG4iLCAiLCIpCisgICAgICAgICAgICBmaWxlID0gYWxsCisgICAgICAgICAgICBmaWxlbmFtZXNbYWRkcl0gPSBmaWxlCisKKyAgICAgICAgbGluZSA9IGxpbmUucmVwbGFjZShhZGRyLCBmaWxlKQorICAgIG91dHB1dC5hcHBlbmQobGluZSkKKworZyA9IG9wZW4oInVuYmFsYW5jZWQuMiIsICJ3IikKK2cud3JpdGUoIiIuam9pbihvdXRwdXQpKQorCisKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9jb250cmliL2NvbnZlcnRfdG9fZW51bS5weSBiL29wZW5ic2MvY29udHJpYi9jb252ZXJ0X3RvX2VudW0ucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYmNkNmYyYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvY29udHJpYi9jb252ZXJ0X3RvX2VudW0ucHkKQEAgLTAsMCArMSwzNyBAQAorIyEvdXNyL2Jpbi9lbnYgcHl0aG9uCisKKyMKKyMgQ29udmVydCBFVFNJIGRvY3VtZW50cyB0byBhbiBlbnVtCisjCisKK2ltcG9ydCByZSwgc3lzCisKK2RlZiBjb252ZXJ0KHN0cmluZyk6CisgICAgc3RyaW5nID0gc3RyaW5nLnN0cmlwKCkucmVwbGFjZSgiICIsICIiKS5yanVzdCg4LCAiMCIpCisgICAgdmFyID0gMAorICAgIG9mZnNldCA9IDcKKyAgICBmb3IgY2hhciBpbiBzdHJpbmc6CisgICAgICAgIGFzc2VydCBvZmZzZXQgPj0gMAorICAgICAgICB2YXIgPSB2YXIgfCAoaW50KGNoYXIpIDw8IG9mZnNldCkKKyAgICAgICAgb2Zmc2V0ID0gb2Zmc2V0IC0gMQorCisgICAgcmV0dXJuIHZhcgorCitkZWYgc3RyaW5nKG5hbWUpOgorICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoIiAiLCAiXyIpCisgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnIicsICIiKQorICAgIG5hbWUgPSBuYW1lLnJlcGxhY2UoJy8nLCAnXycpCisgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgnKCcsICdfJykKKyAgICBuYW1lID0gbmFtZS5yZXBsYWNlKCcpJywgJ18nKQorICAgIHJldHVybiAiJXNfJXMiICUgKHN5cy5hcmd2WzJdLCBuYW1lLnVwcGVyKCkpCisKK2ZpbGUgPSBvcGVuKHN5cy5hcmd2WzFdKQorCisKK2ZvciBsaW5lIGluIGZpbGU6CisgICAgbSA9IHJlLm1hdGNoKHIiWyBcdF0qKD9QPHZhbHVlPlswMSBdKylbIF0rKD9QPG5hbWU+W2EtekEtWiAvMC05KCldKykiLCBsaW5lWzotMV0pCisKKyAgICBpZiBtOgorICAgICAgICBwcmludCAiXHQlc1x0XHQ9ICVkLCIgJSAoc3RyaW5nKG0uZ3JvdXBkaWN0KClbIm5hbWUiXSksIGNvbnZlcnQobS5ncm91cGRpY3QoKVsidmFsdWUiXSkpCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQgbGluZVs6LTFdCmRpZmYgLS1naXQgYS9vcGVuYnNjL2NvbnRyaWIvbWdjcF9zZXJ2ZXIucHkgYi9vcGVuYnNjL2NvbnRyaWIvbWdjcF9zZXJ2ZXIucHkKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uY2YzZWYzOAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvY29udHJpYi9tZ2NwX3NlcnZlci5weQpAQCAtMCwwICsxLDU0IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgU2ltcGxlIHNlcnZlciBmb3IgbWdjcC4uLiBzZW5kIGF1ZGl0LCByZWNlaXZlIHJlc3BvbnNlLi4KKworaW1wb3J0IHNvY2tldCwgdGltZQorCitNR0NQX0dBVEVXQVlfUE9SVCA9IDI0MjcKK01HQ1BfQ0FMTEFHRU5UX1BPUlQgPSAyNzI3CisKK3JzaXBfcmVzcCA9ICIiIjIwMCAzMjEzMjEzMzJcclxuIiIiCithdWRpdF9wYWNrZXQgPSAiIiJBVUVQICVkIDEzQG1ndyBNR0NQIDEuMFxyXG4iIiIKK2NyY3hfcGFja2V0ID0gIiIiQ1JDWCAlZCAxNEBtZ3cgTUdDUCAxLjBcclxuQzogNGE4NGFkNWQyNWZcclxuTDogcDoyMCwgYTpHU00tRUZSLCBudDpJTlxyXG5NOiByZWN2b25seVxyXG4iIiIKK2RsY3hfcGFja2V0ID0gIiIiRExDWCAlZCAxNEBtZ3cgTUdDUCAxLjBcclxuQzogNGE4NGFkNWQyNWZcclxuSTogJWRcclxuIiIiCittZGN4X3BhY2tldCA9ICIiIk1EQ1ggJWQgMTRAbWd3IE1HQ1AgMS4wXHJcbkM6IDRhODRhZDVkMjVmXHJcbkk6ICVkXHJcbkw6IHA6MjAsIGE6R1NNLUVGUiwgbnQ6SU5cclxuTTogcmVjdm9ubHlcclxuXHJcbnY9MFxyXG5vPS0gMjU4Njk2NDc3IDAgSU4gSVA0IDE3Mi4xNi4xLjEwN1xyXG5zPS1cclxuYz1JTiBJUDQgMTcyLjE2LjEuMTA3XHJcbnQ9MCAwXHJcbm09YXVkaW8gNDQwMCBSVFAvQVZQIDEyN1xyXG5hPXJ0cG1hcDoxMjcgR1NNLUVGUi84MDAwLzFcclxuYT1wdGltZToyMFxyXG5hPXJlY3Zvbmx5XHJcbm09aW1hZ2UgNDQwMiB1ZHB0bCB0MzhcclxuYT1UMzhGYXhWZXJzaW9uOjBcclxuYT1UMzhNYXhCaXRSYXRlOjE0NDAwXHJcbiIiIgorCitkZWYgaGV4ZHVtcChzcmMsIGxlbmd0aD04KToKKyAgICAiIiJSZWNpcGUgaXMgZnJvbSBodHRwOi8vY29kZS5hY3RpdmVzdGF0ZS5jb20vcmVjaXBlcy8xNDI4MTIvIiIiCisgICAgcmVzdWx0ID0gW10KKyAgICBkaWdpdHMgPSA0IGlmIGlzaW5zdGFuY2Uoc3JjLCB1bmljb2RlKSBlbHNlIDIKKyAgICBmb3IgaSBpbiB4cmFuZ2UoMCwgbGVuKHNyYyksIGxlbmd0aCk6CisgICAgICAgcyA9IHNyY1tpOmkrbGVuZ3RoXQorICAgICAgIGhleGEgPSBiJyAnLmpvaW4oWyIlMCpYIiAlIChkaWdpdHMsIG9yZCh4KSkgIGZvciB4IGluIHNdKQorICAgICAgIHRleHQgPSBiJycuam9pbihbeCBpZiAweDIwIDw9IG9yZCh4KSA8IDB4N0YgZWxzZSBiJy4nICBmb3IgeCBpbiBzXSkKKyAgICAgICByZXN1bHQuYXBwZW5kKCBiIiUwNFggICAlLSpzICAgJXMiICUgKGksIGxlbmd0aCooZGlnaXRzICsgMSksIGhleGEsIHRleHQpICkKKyAgICByZXR1cm4gYidcbicuam9pbihyZXN1bHQpCisKK3NlcnZlcl9zb2NrZXQgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19ER1JBTSkKK3NlcnZlcl9zb2NrZXQuYmluZCgoIjEyNy4wLjAuMSIsIE1HQ1BfQ0FMTEFHRU5UX1BPUlQpKQorc2VydmVyX3NvY2tldC5zZXRibG9ja2luZygwKQorCisKK2RlZiBzZW5kX3JlY2VpdmUocGFja2V0KToKKyAgICBzZXJ2ZXJfc29ja2V0LnNlbmR0byhwYWNrZXQsICgiMTI3LjAuMC4xIiwgTUdDUF9HQVRFV0FZX1BPUlQpKQorICAgIHRyeToKKyAgICAgICAgZGF0YSwgYWRkciA9IHNlcnZlcl9zb2NrZXQucmVjdmZyb20oNDA5NikKKyAgICAgICAgcHJpbnQgaGV4ZHVtcChkYXRhKSwgYWRkcgorICAgIGV4Y2VwdCBzb2NrZXQuZXJyb3I6CisgICAgICAgIHBhc3MKKworZGVmIGdlbmVyYXRlX3RpZCgpOgorICAgIGltcG9ydCByYW5kb20KKyAgICByZXR1cm4gcmFuZG9tLnJhbmRpbnQoMCwgNjUxMjMpCisKKworCitpID0gMQord2hpbGUgVHJ1ZToKKyAgICBzZW5kX3JlY2VpdmUocnNpcF9yZXNwKQorICAgIHNlbmRfcmVjZWl2ZShhdWRpdF9wYWNrZXQpCisgICAgc2VuZF9yZWNlaXZlKGNyY3hfcGFja2V0ICUgZ2VuZXJhdGVfdGlkKCkgKQorICAgIHNlbmRfcmVjZWl2ZShtZGN4X3BhY2tldCAlIChnZW5lcmF0ZV90aWQoKSwgaSkpCisgICAgc2VuZF9yZWNlaXZlKGRsY3hfcGFja2V0ICUgKGdlbmVyYXRlX3RpZCgpLCBpKSkKKyAgICBpID0gaSArIDEKKworICAgIHRpbWUuc2xlZXAoMykKZGlmZiAtLWdpdCBhL29wZW5ic2MvZG9jL0JTMTEtT01MLnR4dCBiL29wZW5ic2MvZG9jL0JTMTEtT01MLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNWMzMjk5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9kb2MvQlMxMS1PTUwudHh0CkBAIC0wLDAgKzEsMzEgQEAKK1RoZSBTaWVtZW5zIEJTLTExIHN1cHBvcnRzIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBHU00gMTIuMjEgT01MIG9wZXJhdGlvbnM6CisKKworQ1JFQVRFIE9CSkVDVAorCithYmlzX29tX2ZvbV9oZHIub2JqX2NsYXNzIGNhbiBiZSAKK0EzOgorQTU6IEFMQ08sIEJCU0lHLCBDQ0xLLCBHUFNVLCBMSSwgUEEKK0E4OiBFbnZhQlRTRQorQTk6IEJQT1JUCisKK3RoZSBhYmlzX29tX29ial9pbnN0LnRyeF9uciBmaWVsZCBpbmRpY2F0ZXMgdGhlIGluZGV4IG9mIG9iamVjdCwgd2hlcmVhcyB0aGUKK2FiaXNfb21fZm9tX2hkci5idHNfbnIgaW5kaWNhdGVzIHRoZSB0eXBlIG9mIHRoZSBvYmplY3QuCisKK2VudW0gYWJpc19iczExX29ianR5cGUgeworCUJTMTFfT0JKX0FMQ08JCT0gMHgwMSwKKwlCUzExX09CSl9CQlNJRwkJPSAweDAyLAkvKiBvYmpfY2xhc3M6IDAsMSAqLworCUJTMTFfT0JKX1RSWDEJCT0gMHgwMywJLyogb25seSBERUFDVElWQVRFIFRSWDEgKi8KKwlCUzExX09CSl9DQ0xLCQk9IDB4MDQsCisJQlMxMV9PQkpfR1BTVQkJPSAweDA2LAorCUJTMTFfT0JKX0xJCQk9IDB4MDcsCisJQlMxMV9PQkpfUEEJCT0gMHgwOSwJLyogb2JqX2NsYXNzOiAwLCAxKi8KK307CisKK0luIGNhc2Ugb2YgQ1JFQVRFIEVOVkFCVFNFLCB0aGUgYWJpc19vbV9vYmpfaW5zdC50cnhfbnIgaW5kaWNhdGVzIHRoZSBFbnZhQlRTRXgKK251bWJlci4KKworSW4gY2FzZSBvZiBBOSAoQ1JFQUVURSBCUE9SVCksIHRoZSBhYmlzX29tX29ial9pbnN0LmJ0c19uciBpbmRpY2F0ZXMgd2hpY2ggQlBPUlQKK3NoYWxsIGJlIHVzZWQuCisKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9kb2MvY2FsbC1yb3V0aW5nLnR4dCBiL29wZW5ic2MvZG9jL2NhbGwtcm91dGluZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQwMmY5ZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvZG9jL2NhbGwtcm91dGluZy50eHQKQEAgLTAsMCArMSwyNSBAQAorQ2FsbCByb3V0aW5nIGluIE9wZW5CU0MKKworRmxvdyBvZiBldmVudHM6CisKKyAjIE1PIGNhbGwgaW5pdGlhdGVkIGJ5IE1TLCBDSEFOTkVMIFJRRCwgSU1NRURJQVRFIEFTU0lHTgorICMgTVMgc2VuZHMgQ0MgU0VUVVAgbWVzc2FnZSwgd2UgYXNzdW1lIGFscmVhZHkgb24gVENIL0ggRkFDQ0gKKyAjIE9wZW5CU0MgZG9lcyBhIHN1YnNjcmliZXIgbG9va3VwIGJhc2VkIG9uIHRoZSB0YXJnZXQgZXh0ZW5zaW9uCisgICogSWYgYSBzdWJzY3JpYmVyIGlzIGZvdW5kOgorICAgIyBzZW5kIENBTEwgUFJPQ0VFRElORyBtZXNzYWdlIHRvIE1PCisgICAjIHBhZ2UgdGhlIE1UIHN1YnNjcmliZXIgYW5kIGFzayBpdEkgdG8gYXNrIGZvciBUQ0gvSAorICAgIyBvbmNlIHBhZ2luZyBjb21wbGV0ZXMsIHdlIGhhdmUgdGhlIFRDSC9IIGZvciB0aGUgTVQgZW5kCisgICAjIHNlbmQgU0VUVVAgdG8gTVQKKyAgICMgcmVjZWl2ZSBDQUxMIENPTkZJUk1FRCBmcm9tIE1UCisgICAjIHNldC11cCB0aGUgVFJBVSBtdXggbWFwcGluZyBiZXR3ZWVuIHRoZSBFMSBzdWJzbG90cyBmb3IgYm90aCBUQ0gvSAorICAgIyByZWNlaXZlIEFMRVJUSU5HIGZyb20gTVQsIHJvdXRlIEFMRVJUSU5HIHRvIE1PCisgICAjIHJlY2VpdmUgQ09OTkVDVCBmcm9tIE1ULCBjb25maXJtIHRvIE1UIHdpdGggQ09OTkVDVF9BQ0sKKyAgICMgc2VuZCBhIENPTk5FQ1QgbWVzc2FnZSB0byBNTywgcmVjZWl2ZSBDT05ORUNUX0FDSyBmcm9tIE1PCisgKiBJZiBzdWJzY3JpYmVyIGlzIG5vdCBmb3VuZDoKKyAgIyBzZW5kIFJFTEVBU0UgQ09NUExFVEUgd2l0aCBhcHJvcHJpYXRlIGNhdXNlIHRvIE1PICgxOiB1bmFsbG9hY2F0ZWQgMzogbm8gcm91dGUpCisgIAorCisKK1Rob3VnaHRzIGFib3V0IFJSL01NOgorCisqIHdlIGFsbG9jYXRlIFJSL01NIGVudGl0aWVzIG9uIGRlbWFuZCwgd2hlbiB3ZSBuZWVkIHRoZW0KZGlmZiAtLWdpdCBhL29wZW5ic2MvZG9jL2NoYW5uZWxfcmVsZWFzZS50eHQgYi9vcGVuYnNjL2RvYy9jaGFubmVsX3JlbGVhc2UudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhY2YwOWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2RvYy9jaGFubmVsX3JlbGVhc2UudHh0CkBAIC0wLDAgKzEsNzQgQEAKKworR1NNIDA0LjA4IDcuMS43IC8gOS4xLjcJCVJSIENIQU5ORUwgUkVMRVNFCisKK1JTTCAwOC41OCAzLjQgLyA/CQlSTEwgTGluayBSZWxlYXNlIFJlcXVlc3QKKworUlNMIDA4LjU4IDQuNiAvIDguNC41CQlERUFDVGl2YXRlIFNBQ0NICisJKiBEZWFjdGl2YXRlIFNBQ0NIIGFjY29yZGluZyB0byBDaGFubmVsIFJlbGVhc2UgUHJvYyAwNC4wOAorCSogdG8gYmUgc2VudCBhZnRlciBSUiBDSEFOTkVMIFJFTEVBU0UgaXMgc2VudCB0byBNUworCitSU0wgMDguNTggNC43IC8gOC40LjE0CQlSRiBDSEFObmVsIFJFTGVhc2UKKwkqIHRlbGxzIHRoZSBCVFMgdG8gcmVsZWFzZSBhIHJhZGlvIGNoYW5uZWwKKwkqICJ3aGVuIGFuIGFjdGl2YXRlZCByYWRpbyBjaGFubmVsIGlzIG5vIGxvbmdlciBuZWVkZWQiCisJKiBCVFMgcmVzcG9uZHMgd2l0aCBSRiBDSEFObmVsIFJFTGVhc2UgQUNLbm93bGVkZ2UKKworCitHU00gMDQuMDggMy40LjEzOiBSUiBjb25uZWN0aW9uIHJlbGVhc2UgcHJvY2VkdXJlCisKKyogbmV0d29yayBzZW5kcyBSUiBDSEFOTkVMIFJFTEVBU0UgdG8gTVMgb24gdGhlIERDQ0gKKyAgKiBzdGFydCBUMzEwOQorICAqIGRlYWN0aXZhdGUgU0FDQ0gKKyogTVMgZGlzY29ubmVjdHMgbWFpbiBzaWduYWxsaW5nIGxpbmsgKGJ5IHNlbmRpbmcgRElTQykKKyAgKiBhbGwgb3RoZXIgZGF0YSBsaW5rcyBhcmUgZGlzY29ubmVjdGVkIGJ5IGxvY2FsIGVuZCBsaW5rIHJlbGVhc2UKKyogbmV0d29yayByZWNlaXZlcyBESVNDIChCVFMgc2VuZHMgUkxMIFJFTCBJTkQgdG8gQlNDKQorICAqIHN0b3AgVDMxMDkKKyAgKiBzdGFydCBUMzExMSAKKyogd2hlbiBUMzExMSB0aW1lcyBvdXQsIHRoZSBuZXR3b3JrIGNhbiByZXVzZSB0aGUgY2hhbm5scworKiBpZiBUMzEwOSB0aW1lcyBvdXQsIHRoZSBuZXR3b3JrIGRlYWN0aXZhdGVzIHRoZSBjaGFubmVscyAKKyAgYW5kIGNhbiByZXVzZSB0aGVtCisgICogdGhpcyBwcm9iYWJseSBtZWFucyBzaW1wbHkgUkYgQ0hBTm5lbCBSRUxlYXNlCisKKworPT0gSW1wbGVtZW50YXRpb24gaW4gT3BlbkJTQyA9PQorCitjaGFuX2FsbG9jLmM6bGNoYW5fYXV0b19yZWxlYXNlKCkKKwkqIGNoZWNrcyBpZiB1c2UgY291bnQgc3RpbGwgPiAwIChhYm9ydCkKKwkqIGNhbGxzIGdzbTQ4X3NlbmRfcnJfcmVsZWFzZSgpCisJCSogd2hpY2ggY2FsbHMgcnNsX2RlYWN0X3NhY2NoKCkKKwkqIGNhbGxzIHJzbF9yZWxlYXNlX3JlcXVlc3QoKQorCQkqIHdoaWNoIHNlbmRzIFJMTCBMaW5rIFJlbGVhc2UgcmVxdWVzdAorCQorUlggb2YgUkVMZWFzZSBJTkRpY2F0aW9uOgorCSogY2FsbCByc2xfcmZfY2hhbl9yZWxlYXNlKCkgKHNlbmQgUkZfQ0hBTl9SRUwpCisKK1JYIG9mIFJFTGVhc2UgQ09ORmltZW06CisJKiBjYWxsIHJzbF9yZl9jaGFuX3JlbGVhc2UoKSAoc2VuZCBSRl9DSEFOX1JFTCkKKworKiBSWCBvZiBSRl9DSEFOX1JFTF9BQ0sKKwkqIGNhbGwgbGNoYW5fZnJlZSgpCisJCSogc3Vic2NyX3B1dCgpCisJCSogZGVsZXRlIHJlbGVhc2VfdGltZXIKKworCis9PT0gSW50ZWdyYXRpb24gd2l0aCBTTVMgPT09CisKKyogUlggb2YgQ1BfRVJST1Igb3IgdW5pbXBsZW1lbnRlZCBNVAorCSogdHJpZ2dlciB0cmFuc19mcmVlKCkgd2hpY2ggd2lsbCBsY2hhbl9hdXRvX3JlbGVhc2UoKQorCisqIENQIFRDMSogZXhwaXJlZCB3aGlsZSB3YWl0aW5nIGZvciBDUC1BQ0sKKwkqIHRyaWdnZXIgdHJhbnNfZnJlZSgpIHdoaWNoIHdpbGwgbGNoYW5fYXV0b19yZWxlYXNlKCkKKworKiBSWCBvZiBSUF9FUlJPUgorCSogdHJpZ2dlciB0cmFuc19mcmVlKCkgd2hpY2ggd2lsbCBsY2hhbl9hdXRvX3JlbGVhc2UoKQorCQorKiBUWCBvZiBDUC1BQ0sgaW4gTVQgREVMSVZFUgorCSogdHJpZ2dlciB0cmFuc19mcmVlKCkgd2hpY2ggd2lsbCBsY2hhbl9hdXRvX3JlbGVhc2UoKQorCisqIFJYIG9mIENQLUFDSyBpbiBNTyBTVUJNSVQKKwkqIHRyaWdnZXIgdHJhbnNfZnJlZSgpIHdoaWNoIHdpbGwgbGNoYW5fYXV0b19yZWxlYXNlKCkKKwkKKyogUlggb2YgUlAtQUNLIGluIE1UIERFTElWRVIgKGFuZCBubyBtb3JlIG1lc3NhZ2VzKQorCSogdHJpZ2dlciByc2xfcmVsZWFzZV9yZXF1ZXN0KCkgZm9yIFNBUEkzCisKKyogUlggb2YgUlAtU01NQSBpbiBNVCBERUxJVkVSIChhbmQgbm8gbW9yZSBtZXNzYWdlcykKKwkqIHRyaWdnZXIgcnNsX3JlbGVhc2VfcmVxdWVzdCgpIGZvciBTQVBJMwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9kb2MvZTEtZGF0YS1tb2RlbC50eHQgYi9vcGVuYnNjL2RvYy9lMS1kYXRhLW1vZGVsLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NTk0ZmU0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9kb2MvZTEtZGF0YS1tb2RlbC50eHQKQEAgLTAsMCArMSwxNzIgQEAKK0UxIHJlbGF0ZWQgZGF0YSBtb2RlbAorCitUaGlzIGRhdGEgbW9kZWwgZGVzY3JpYmVzIHRoZSBwaHlzaWNhbCByZWxhdGlvbnNoaXAgb2YgdGhlIGluZGl2aWR1YWwKK3BhcnRzIGluIHRoZSBuZXR3b3JrLCBpdCBpcyBub3QgdGhlIGxvZ2ljYWwvcHJvdG9jb2wgc2lkZSBvZiB0aGUgR1NNCituZXR3b3JrLgorCitBIEJUUyBpcyBjb25uZWN0ZWQgdG8gdGhlIEJTQyBieSBzb21lIHBoeXNpY2FsIGxpbmsuICBJdCBjb3VsZCBiZSBhbiBhY3R1YWwKK0UxIGxpbmssIGJ1dCBpdCBjb3VsZCBhbHNvIGJlIGFiaXMtb3Zlci1JUCB3aXRoIGEgbWl4dHVyZSBvZiBUQ1AgYW5kIFJUUC9VRFAuCisKK1RvIGZ1cnRoZXIgY29tcGxpY2F0ZSB0aGUgZmFjdCwgbXVsdGlwbGUgQlRTIGNhbiBzaGFyZSBvbmUgc3VjaCBweXNpY2FsCitsaW5rLiAgT24gYSBzaW5nbGUgRTEgbGluZSwgd2UgY2FuIGVhc2lseSBhY2NvbW9kYXRlIHVwIHRvIHRocmVlIEJUUyB3aXRoCit0d28gVFJYIGVhY2guCisKK1RodXMsIGl0IGlzIGJlc3QgZm9yIE9wZW5CU0MgdG8gaGF2ZSBzb21lIGtpbmQgb2YgYWJzdHJhY3Rpb24gbGF5ZXIuICBUaGUgQlNDJ3MKK3ZpZXcgb2YgYSBCVFMgY29ubmVjdGVkIHRvIGl0LiAgV2UgY2FsbCB0aGlzICdidHNfbGluaycuICBBIGJ0c19saW5rIGNhbiBiZQorKiBhbGwgdGhlIFRDUCBhbmQgVURQIHN0cmVhbXMgb2YgYSBBYmlzLW92ZXItSVAgQlRTCisqIGEgc2V0IG9mIEUxIHRpbWVzbG90cyBmb3IgT01MLCBSU0wgYW5kIFRSQVUgY29ubmVjdGlvbnMgb24gYSBFMSBsaW5rCisqIGEgc2VyaWFsIGxpbmUgZXhjbHVzaXZlbHkgdXNlZCBmb3IgT01MIG1lc3NhZ2VzIChULUxpbmspCisKK0EgYnRzX2xpbmsgY2FuIGJlIHJlZ2lzdGVyZWQgd2l0aCB0aGUgT3BlbkJTQyBjb3JlIGF0IHJ1bnRpbWUuCisKK3N0cnVjdCB0cnhfbGluayB7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7Cit9OworCitzdHJ1Y3QgYnRzX2xpbmsgeworCXN0cnVjdCBnc21fYnRzICpidHM7CisJc3RydWN0IHRyeF9saW5rIHRyeF9saW5rc1tOVU1fVFJYXTsKK307CisKK0ludGVyZmFjZSBmcm9tIHN0YWNrIHRvIGlucHV0IGNvcmU6Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitpbnQgYWJpc19yc2xfc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKKwlzZW5kIGEgbWVzc2FnZSB0aHJvdWdoIGEgUlNMIGxpbmsgdG8gdGhlIFRSWCBzcGVjaWZpZWQgYnkgdGhlIGNhbGxlciBpbgorCW1zZy0+dHJ4LgorCitpbnQgYWJpc19yc2xfcmN2bXNnKHN0cnVjdCBtc2diICptc2cpOworCXJlY2VpdmUgYSBtZXNzYWdlIGZyb20gYSBSU0wgbGluayBmcm9tIHRoZSBUUlggc3BlY2lmaWVkIGJ5IHRoZQorCWNhbGxlciBpbiBtc2ctPnRyeC4KKworaW50IGFiaXNfbm1fc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKKwlzZW5kIGEgbWVzc2FnZSB0aHJvdWdoIGEgT01MIGxpbmsgdG8gdGhlIEJUUyBzcGVjaWZpZWQgYnkgdGhlIGNhbGxlciBpbgorCW1zZy0+dHJ4LT5idHMuICBUaGUgY2FsbGVyIGNhbiBqdXN0IHVzZSBidHMtPmMwIHRvIGdldCB0aGUgZmlyc3QgVFJYCisJaW4gYSBCVFMuIChPTUwgbWVzc2FnZXMgYXJlIG5vdCByZWFsbHkgc2VudCB0byBhIFRSWCBidXQgdG8gdGhlIEJUUykKKworaW50IGFiaXNfbm1fcmN2bXNnKHN0cnVjdCBtc2diICptc2cpOworCXJlY2VpdmUgYSBtZXNzYWdlIGZyb20gYSBPTUwgbGluayBmcm9tIHRoZSBCVFMgc3BlY2lmaWVkIGJ5IHRoZSBjYWxsZXIKKwlpbiBtc2ctPnRyeC0+YnRzLiAgVGhlIGNhbGxlciBjYW4ganVzdCB1c2UgYnRzLT5jMCB0byBnZXQgdGhlIGZpcnN0CisJVFJYIGluIGEgQlRTLgorCitpbnQgYWJpc19saW5rX2V2ZW50KGludCBldmVudCwgdm9pZCAqZGF0YSk7CisJc2lnbmFsIHNvbWUgZXZlbnQgKHN1Y2ggYXMgbGF5ZXIgMSBjb25uZWN0L2Rpc2Nvbm5lY3QpIGZyb20gdGhlCisJaW5wdXQgY29yZSB0byB0aGUgc3RhY2suCisKK2ludCBzdWJjaF9kZW11eF9pbihteCwgY29uc3QgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4pOworCXJlY2VpdmUgJ2xlbicgYnl0ZXMgZnJvbSBhIGdpdmVuIEUxIHRpbWVzbG90IChUUkFVIGZyYW1lcykKKworaW50IHN1YmNoYW5fbXV4X291dChteCwgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4pOworCW9idGFpbiAnbGVuJyBieXRlcyBvZiBvdXRwdXQgZGF0YSB0byBiZSBzZW50IG9uIEUxIHRpbWVzbG90CisKK0ludHJmYWNlIGJ5IElucHV0IENvcmUgZm9yIElucHV0IFBsdWdpbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworaW50IGJ0c2xpbmtfcmVnaXN0ZXJfcGx1Z2luKCk7CisKKworQ29uZmlndXJhdGlvbiBmb3IgdGhlIEUxIGlucHV0IG1vZHVsZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitCVFMKKwlCVFMgbnVtYmVyCisJbnVtYmVyIG9mIFRSWAorCU9NTCBsaW5rCisJCUUxIGxpbmUgbnVtYmVyCisJCXRpbWVzbG90IG51bWJlcgorCQlbc3Vic2xvdCBudW1iZXJdCisJCVNBUEkKKwkJVEVJCisJZm9yIGVhY2ggVFJYCisJCVJTTCBsaW5rCisJCQlFMSBsaW5lIG51bWJlcgorCQkJdGltZXNsb3QgbnVtYmVyCisJCQlbc3Vic2xvdCBudW1iZXJdCisJCQlTQVBJCisJCQlURUkKKwkJZm9yIGVhY2ggVFMKKwkJCUUxIGxpbmUgbnVtYmVyCisJCQl0aW1lc2xvdCBudW1iZXIKKwkJCXN1YnNsb3QgbnVtYmVyCisKKworRTEgaW5wdXQgbW9kdWxlIGRhdGEgbW9kZWwKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCitlbnVtIGUxaW5wX3NpZ25fdHlwZSB7CisJRTFJTlBfU0lHTl9OT05FLAorCUUxSU5QX1NJR05fT01MLAorCUUxSU5QX1NJR05fUlNMLAorfTsKKworc3RydWN0IGUxaW5wX3NpZ25fbGluayB7CisJLyogbGlzdCBvZiBzaWduYWxsaW5nIGxpbmtzICovCisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKworCWVudW0gZTFpbnBfc2lnbl90eXBlIHR5cGU7CisKKwkvKiB0cnggZm9yIG1zZy0+dHJ4IG9mIHJlY2VpdmVkIG1zZ3MgKi8JCisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisKKwkvKiBtc2diIHF1ZXVlIG9mIHRvLWJlLXRyYW5zbWl0dGVkIG1zZ3MgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCB0eF9saXN0OworCisJLyogU0FQSSBhbmQgVEVJIG9uIHRoZSBFMSBUUyAqLworCXVfaW50OF90IHNhcGk7CisJdV9pbnQ4X3QgdGVpOworfQorCitlbnVtIGUxaW5wX3RzX3R5cGUgeworCUUxSU5QX1RTX1RZUEVfTk9ORSwKKwlFMUlOUF9UU19UWVBFX1NJR04sCisJRTFJTlBfVFNfVFlQRV9UUkFVLAorfTsKKworLyogQSB0aW1lc2xvdCBpbiB0aGUgRTEgaW50ZXJmYWNlICovCitzdHJ1Y3QgZTFpbnBfdHMgeworCWVudW0gZTFpbnBfdHNfdHlwZSB0eXBlOworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCBsbGlzdF9oZWFkIHNpZ25fbGlua3M7CisJCX0gc2lnbjsKKwkJc3RydWN0IHsKKwkJCS8qIHN1YmNoYW5uZWwgZGVtdXhlciBmb3IgZnJhbWVzIGZyb20gRTEgKi8KKwkJCXN0cnVjdCBzdWJjaF9kZW11eCBkZW11eDsKKwkJCS8qIHN1YmNoYW5uZWwgbXV4ZXIgZm9yIGZyYW1lcyB0byBFMSAqLworCQkJc3RydWN0IHN1YmNoX211eCBtdXg7CisJCX0gdHJhdTsKKwl9OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCS8qIG1JU0ROIGRyaXZlciBoYXMgb25lIGZkIGZvciBlYWNoIHRzICovCisJCQlzdHJ1Y3QgYnNjX2ZkOworCQl9IG1pc2RuOworCX0gZHJpdmVyOworfTsKKworc3RydWN0IGUxaW5wX2xpbmUgeworCXVuc2lnbmVkIGludCBudW07CisJY2hhciAqbmFtZTsKKworCXN0cnVjdCBlMWlucF90cyB0c1tOUl9FMV9UU107CisKKwljaGFyICplMWlucF9kcml2ZXI7CisJdm9pZCAqZHJpdmVyX2RhdGE7Cit9OworCisvKiBDYWxsIGZyb20gdGhlIFN0YWNrOiBjb25maWd1cmF0aW9uIG9mIHRoaXMgVFMgaGFzIGNoYW5nZWQgKi8KK2ludCBlMWlucF91cGRhdGVfdHMoc3RydWN0IGUxaW5wX3RzICp0cyk7CisKKy8qIFJlY2VpdmUgYSBwYWNrZXQgZnJvbSB0aGUgRTEgZHJpdmVyICovCitpbnQgZTFpbnBfcnhfdHMoc3RydWN0IGUxaW5wX3RzICp0cywgc3RydWN0IG1zZ2IgKm1zZywKKwkJdV9pbnQ4X3QgdGVpLCB1X2ludDhfdCBzYXBpKTsKKworLyogU2VuZCBhIHBhY2tldCwgY2FsbGJhY2sgZnVuY3Rpb24gaW4gdGhlIGRyaXZlciAqLworaW50IGUxZHJpdmVyX3R4X3RzKHN0cnVjdCBlMWlucF90cyAqdHMsIHN0cnVjdCBtc2diICptc2cpCisKKworc3RydWN0IGUxaW5wX2RyaXZlciB7CisJY29uc3QgY2hhciAqbmFtZTsKKwlpbnQgKCp3YW50X3dyaXRlKShzdHJ1Y3QgZTFpbnBfdHMgKnRzKTsKK307CmRpZmYgLS1naXQgYS9vcGVuYnNjL2RvYy9nc20taG9wcGluZy50eHQgYi9vcGVuYnNjL2RvYy9nc20taG9wcGluZy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxMDkzOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvZG9jL2dzbS1ob3BwaW5nLnR4dApAQCAtMCwwICsxLDU0IEBACithY2NvcmRpbmcgdG8gR1NNIDA1LjAyOgorCitnZW5lcmFsIHBhcmFtZXRlcnMgZnJvbSBDQ0NIOgorKiBDQSBjZWxsIGFsbG9jYXRpb24gb2YgQVJGQ04ncyAoU3lzdGVtIEluZm9ybWF0aW9uIC8gQkNDSCkKKyogRk46IFRETUEgZnJhbWUgbnVtYmVyICh0MSx0Mix0MycpIGluIFNDSAorCitzcGVjaWZpYyBwYXJhbWV0ZXJzIGZyb20gY2hhbm5lbCBhc3NpZ25tZW50OgorKiBNQTogbW9iaWxlIGFsbG9jYXRpb24sIGRlZmluZXMgc2V0IG9mIEFSRkNOJ3MsIHVwIHRvIDY0CisqIE1BSU86IGluZGV4CisqIEhTTjogaG9wcGluZyBzZXF1ZW5jZSBnZW5lcmF0b3IgbnVtYmVyICgwLi42NCkKKworCitob3BwaW5nIHNlcXVlbmNlIGdlbmVyYXRpb24gKDYuMi4zKToKKwordV9pbnQ4X3Qgcm50YWJsZVsxMTRdID0geworCSA0OCwgIDk4LCAgNjMsICAgMSwgIDM2LCAgOTUsICA3OCwgMTAyLCAgOTQsICA3MywKKwkgIDAsICA2NCwgIDI1LCAgODEsICA3NiwgIDU5LCAxMjQsICAyMywgMTA0LCAxMDAsCisJMTAxLCAgNDcsIDExOCwgIDg1LCAgMTgsICA1NiwgIDk2LCAgODYsICA1NCwgICAyLAorCSA4MCwgIDM0LCAxMjcsICAxMywgICA2LCAgODksICA1NywgMTAzLCAgMTIsICA3NCwKKwkgNTUsIDExMSwgIDc1LCAgMzgsIDEwOSwgIDcxLCAxMTIsICAyOSwgIDExLCAgODgsCisJIDg3LCAgMTksICAgMywgIDY4LCAxMTAsICAyNiwgIDMzLCAgMzEsICAgOCwgIDQ1LAorCSA4MiwgIDU4LCAgNDAsIDEwNywgIDMyLCAgIDUsIDEwNiwgIDkyLCAgNjIsICA2NywKKwkgNzcsIDEwOCwgMTIyLCAgMzcsICA2MCwgIDY2LCAxMjEsICA0MiwgIDUxLCAxMjYsCisJMTE3LCAxMTQsICAgNCwgIDkwLCAgNDMsICA1MiwgIDUzLCAxMTMsIDEyMCwgIDcyLAorCSAxNiwgIDQ5LCAgIDcsICA3OSwgMTE5LCAgNjEsICAyMiwgIDg0LCAgIDksICA5NywKKwkxMjUsICA5OSwgIDE3LCAxMjMKK307CisKKy8qIG1haT0wIHJlcHJlc2VudHMgbG93ZXN0IEFSRkNOIGluIHRoZSBNQSAqLworCisKK3VfaW50OF90IGhvcHBpbmdfbWFpKHVfaW50OF90IGhzbiwgdV9pbnQzMl90IGZuLCB1X2ludDhfdCBtYWlvLAorCQkgICAgIHVfaW50OF90IHQxLCB1X2ludDhfdCB0MiwgdV9pbnQ4X3QgdDNfKQoreworCXVfaW50OF90IG1haTsKKworCWlmIChoc24gPT0gMCkgLyogY3ljbGljIGhvcHBpbmcgKi8KKwkJbWFpID0gKGZuICsgbWFpbykgJSBuOworCWVsc2UgeworCQl1X2ludDMyX3QgbSwgbV8sIHRfLCBzOworCisJCW0gPSB0MiArIHJudGFibGVbKGhzbiB4b3IgKHQxICUgNjQpKSArIHQzXTsKKwkJbV8gPSBtICUgKDJeTkJJTik7CisJCXRfID0gdDMgJSAoMl5OQklOKTsKKwkJaWYgKG1fIDwgbiB0aGVuKQorCQkJcyA9IG1fOworCQllbHNlCisJCQlzID0gKG1fICsgdF8pICUgbjsKKwkJbWFpID0gKHMgKyBtYWlvKSAlIG47CisJfQorCisJcmV0dXJuIG1haTsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9kb2MvaGFuZG92ZXIudHh0IGIvb3BlbmJzYy9kb2MvaGFuZG92ZXIudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjMTllODcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2RvYy9oYW5kb3Zlci50eHQKQEAgLTAsMCArMSw4OSBAQAorSWRlYXMgYWJvdXQgYSBoYW5kb3ZlciBhbGdvcml0aG0KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhpcyBpcyBtb3N0bHkgYmFzZWQgb24gdGhlIHJlc3VsdHMgcHJlc2VudGVkIGluIENoYXB0ZXIgOCBvZiAiUGVyZm9ybWFuY2UKK0VuaGFuY2VtZW50cyBpbiBhIEZyZXF1ZW5jeSBIb3BwaW5nIEdTTSBOZXR3b3JrIiBieSBUaG9tYXMgVG9mdGVnYWFyZCBOaWVsc2VuCithbmQgSm9lcm9lbiBXaWdhcmQuIAorCisKKz09PSBSZWFzb25zIGZvciBwZXJmb3JtaW5nIGhhbmRvdmVyID09PQorCitTZWN0aW9uIDIuMS4xOiBIYW5kb3ZlciB1c2VkIGluIHRoZWlyIENBUEFDSVRZIHNpbXVsYXRpb246CisKKzEpIEludGVyZmVyZW5jZSBIYW5kb3ZlcgorCitBdmVyYWdlIFJYTEVWIGlzIHNhdGlzZmFjdG9yeSBoaWdoLCBidXQgYXZlcmFnZSBSWFFVQUwgdG9vIGxvdyBpbmRpY2F0ZXMKK2ludGVyZmVyZW5jZSB0byB0aGUgY2hhbm5lbC4gIEhhbmRvdmVyIHNob3VsZCBiZSBtYWRlLgorCisyKSBCYWQgUXVhbGl0eQorCitBdmVyYWdlZCBSWFFVQUwgaXMgbG93ZXIgdGhhbiBhIHRocmVzaG9sZAorCiszKSBMb3cgTGV2ZWwgLyBTaWduYWwgU3RyZW5ndGgKKworQXZlcmFnZSBSWExFViBpcyBsb3dlciB0aGFuIGEgdGhyZXNob2xkCisKKzQpIERpc3RhbmNlIEhhbmRvdmVyCisKK01TIGlzIHRvbyBmYXIgYXdheSBmcm9tIGEgY2VsbCAobWVhc3VyZWQgYnkgVEEpCisKKzUpIFBvd2VyIGJ1ZGdldCAvIEJldHRlciBDZWxsCisKK1JYIExldmVsIG9mIG5laWdoYm9yIGNlbGwgaXMgYXQgbGVhc3QgIkhPIE1hcmdpbiBkQiIgZEIgYmV0dGVyIHRoYW4gdGhlCitjdXJyZW50IHNlcnZpbmcgY2VsbC4KKworPT09IElkZWFsIHBhcmFtZXRlcnMgZm9yIEhPIGFsZ29yaXRobSA9PT0KKworQ2hhcHRlciA4LCBTZWN0aW9uIDIuMiwgVGFibGUgMjQ6CisKK1dpbmRvdyBSWExFViBhdmVyYWdpbmc6CQkxMCBTQUNDSCBmcmFtZXMgKG5vIHdlaWdodGluZykKK1dpbmRvdyBSWFFVQUwgYXZlcmFnaW5nOgkxIFNBQ0NIIGZyYW1lIChubyBhdmVyYWdpbmcpCitMZXZlbCBUaHJlYXNob2xkOgkJMSBvZiB0aGUgbGFzdCAxIEFWLVJYTEVWIHZhbHVlcyA8IC0xMTBkQm0KK1F1YWxpdHkgVGhyZXNob2xkOgkJMyBvZiB0aGUgbGFzdCA0IEFWLVJYUVVBTCB2YWx1ZXMgPj0gNQorSW50ZXJmZXJlbmNlIFRocmVzaG9sZDoJCTEgb2YgdGhlIGxhc3QgQVYtUlhMRVYgPiAtODUgZEJtICYKKwkJCQkzIG9mIHRoZSBsYXN0IDQgQVYtUlhRVUFMIHZhbHVlcyA+PSA1CitQb3dlciBCdWRnZXQ6CQkJTGV2ZWwgb2YgbmVpZ2hib3IgY2VsbCA+IDMgZEIgYmV0dGVyCitQb3dlciBCdWRnZXQgSW50ZXJ2YWw6CQlFdmVyeSA2IFNBQ0NIIGZyYW1lcyAoNiBzZWNvbmRzID8hPykKK0Rpc3RhbmNlIEhhbmRvdmVyOgkJRGlzYWJsZWQKK0V2YWx1YXRpb24gcnVsZSAxOgkJUlhMRVYgb2YgdGhlIGNhbmRpZGF0ZSBjZWxsIGEgdGxlYXN0IC0xMDQgZEJtCitFdmFsdWF0aW9uIHJ1bGUgMjoJCUxldmVsIG9mIGNhbmRpZGF0ZSBjZWxsID4gM2RCIGJldHRlciBvd24gY2VsbAorVGltZXIgU3VjY2Vzc2Z1bCBITzoJCTUgU0FDQ0ggZnJhbWVzCitUaW1lciBVbnN1Y2Nlc3NmdWwgSE86CQkxIFNBQ0NIIGZyYW1lCisKK0luIGEgbm9uLWZyZXF1ZW5jeSBob3BwaW5nIGNhc2UsIFJYUVVBTCB0aHJlc2hvbGQgY2FuIGJlIGRlY3JlYXNlZCB0bworUlhMRVYgPj0gNAorCitXaGVuIGZyZXF1ZW5jeSBob3BwaW5nIGlzIGVuYWJsZWQsIHRoZSBmb2xsb3dpbmcgYWRkaXRpb25hbCBwYXJhbWV0ZXJzCitzaG91bGQgYmUgaW50cm9kdWNlZDoKKworKiBObyBpbnRyYS1jZWxsIGhhbmRvdmVyCisqIFVzZSBhIEhPIE1hcmdpbiBvZiAyZEIKKworPT09IEhhbmRvdmVyIENoYW5uZWwgUmVzZXJ2YXRpb24gPT09CisKK0luIGxvYWRlZCBuZXR3b3JrLCBlYWNoIGNlbGwgc2hvdWxkIHJlc2VydmUgc29tZSBjaGFubmVscyBmb3IgaGFuZG92ZXJzLAorcmF0aGVyIHRoYW4gdXNpbmcgYWxsIG9mIHRoZW0gZm9yIG5ldyBjYWxsIGVzdGFibGlzaG1lbnQuICBUaGlzIHJlZHVjZXMgdGhlCituZWVkIHRvIGRyb3AgY2FsbHMgZHVlIHRvIGZhaWxpbmcgaGFuZG92ZXJzLCBhdCB0aGUgZXhwZW5zZSBvZiBmYWlsaW5nIG5ldyBjYWxsCithdHRlbXB0cy4KKworPT09IER5bmFtaWMgSE8gTWFyZ2luID09PQorCitUaGUgaGFuZG92ZXIgbWFyZ2luIChoeXN0ZXJlc2lzKSBzaG91bGQgZGVwZW5kIG9uIHRoZSBSWFFVQUwuIE9wdGltYWwgcmVzdWx0cword2VyZSBhY2hpZXZlZCB3aXRoIHRoZSBmb2xsb3dpbmcgc2V0dGluZ3M6CisqIFJYUVVBTCA8PSA0OiA5IGRCCisqIFJYUVVBTCA9PSA1OiA2IGRCCisqIFJYUVVBTCA+PSA2OiAxIGRCCisKKworCis9PSBBY3R1YWwgSGFuZG92ZXIgb24gYSBwcm90b2NvbCBsZXZlbCA9PQorCitBZnRlciB0aGUgQlNDIGhhcyBkZWNpZGVkIGEgaGFuZG92ZXIgc2hhbGwgYmUgZG9uZSwgaXQgaGFzIHRvCisKKyMgYWxsb2NhdGUgYSBjaGFubmVsIGF0IHRoZSBuZXcgQlRTCisjIGFsbG9jYXRlIGEgaGFuZG92ZXIgcmVmZXJlbmNlCisjIGFjdGl2YXRlIHRoZSBjaGFubmVsIG9uIHRoZSBCVFMgc2lkZSB1c2luZyBSU0wgQ0hBTk5FTCBBQ1RJVkFUSU9OLAorICBpbmRpY2F0aW5nIHRoZSBITyByZWZlcmVuY2UKKyMgQlRTIHJlc3BvbmRzIHdpdGggQ0hBTiBBQ1QgQUNLLCBpbmNsdWRpbmcgR1NNIGZyYW1lIG51bWJlcgorIyBCU0Mgc2VuZHMgMDQuMDggSE8gQ01EIHRvIE1TIHVzaW5nIG9sZCBCVFMKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9kb2Mvb21sLWludGVyZmFjZS50eHQgYi9vcGVuYnNjL2RvYy9vbWwtaW50ZXJmYWNlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZGRjZmVhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9kb2Mvb21sLWludGVyZmFjZS50eHQKQEAgLTAsMCArMSwyMSBAQAorb21sIGludGVyZmFjZSBkZXNpZ24gbm90ZXMKKworcHJvYmxlbXM6CisKKyogdGhlcmUgaXMgbm8gd2F5IGhvdyB0byB0YWcgYSBjb21tYW5kIHNlbnQgdG8gdGhlIEJUUywgd2l0aCB0aGUgcmVzcG9uc2UKKyAgaGF2aW5nIHRoZSBzYW1lIHRhZyB0byBpZGVudGlmeSB0aGUgb3JpZ2luYXRvciBvZiB0aGUgY29tbWFuZAorKiB0aGVyZWZvcmUsIHdlIGNhbiBoYXZlIGUuZy4gYm90aCB0aGUgQlNDIGFuZCB0aGUgT01MIGludGVyZmFjZSBzZW5kIGEKKyAgU0VUIEFUVFJJQlVURSBtZXNzYWdlLCB3aGVyZSB0aGUgcmVzcG9uc2VzIHdvdWxkIGVuZCB1cCBhdCB0aGUgd3JvbmcKKyAgcXVlcnkuCisKK3RoZSBvbmx5IHBvc3NpYmxlIHNvbHV0aW9ucyBpIGNhbiBpbWFnaW5lOgorKiBoYXZlIHNvbWUga2luZCBvZiBleGNsdXNpdmUgbG9ja2luZywgd2hlcmUgdGhlIE9NTCBpbnRlcmZhY2UgZ2V0cyBibG9ja2VkCisgIGZyb20gdGhlIEJTQyBhbmQgaXMgZXhjbHVzaXZlbHkgYXNzaWduZWQgdG8gdGhlIE9NTCBjb25zb2xlIHVudGlsIGFsbCBjb21tYW5kcworICBvZiB0aGUgT01MIGNvbnNvbGUgaGF2ZSB0ZXJtaW5hdGVkLiAgVGhpcyBjYW4gZWl0aGVyIGJlIGRvbmUgZXhwbGljaXRseQorICBkeW5hbWljYWxseSBvciBvbiBkZW1hbmQKKworKiB1c2UgdGhlIE9NTCBpbnRlcmZhY2Ugc3luY2hyb25vdXNseSwgaS5lLiBhbHdheXMgd2FpdCBmb3IgdGhlIHJlc3BvbnNlIGZyb20KKyAgdGhlIEJUUyBiZWZvcmUKKworKiB1bmlsYXRlcmFsIC8gdW5zb2xpY2l0ZWQgbWVzc2FnZXMgbmVlZCB0byBiZSBicm9hZGNhc3RlZCB0byBib3RoIHRoZSBCU0MgYW5kCisgIHRoZSBPTUwgY29uc29sZQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL01ha2VmaWxlLmFtIGIvb3BlbmJzYy9pbmNsdWRlL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YjJhMzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSwzIEBACitTVUJESVJTID0gb3BlbmJzYyB2dHkgc2NjcAorCitub2luc3RfSEVBREVSUyA9IG1JU0ROaWYuaCBjb21wYXRfYWZfaXNkbi5oCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvY29tcGF0X2FmX2lzZG4uaCBiL29wZW5ic2MvaW5jbHVkZS9jb21wYXRfYWZfaXNkbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2Y2JmYjMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvY29tcGF0X2FmX2lzZG4uaApAQCAtMCwwICsxLDM5IEBACisjaWZkZWYgTUlTRE5fT0xEX0FGX0NPTVBBVElCSUxJVFkKKyN1bmRlZiBBRl9JU0ROCisjdW5kZWYgUEZfSVNETgorCitleHRlcm4JaW50CUFGX0lTRE47CisjZGVmaW5lIFBGX0lTRE4JQUZfSVNETgorCitpbnQJQUZfSVNETjsKKworI2VuZGlmCisKK2V4dGVybiB2b2lkIGluaXRfYWZfaXNkbih2b2lkKTsKKworI2lmZGVmIEFGX0NPTVBBVElCSUxJVFlfRlVOQworI2lmZGVmIE1JU0ROX09MRF9BRl9DT01QQVRJQklMSVRZCit2b2lkIGluaXRfYWZfaXNkbih2b2lkKQoreworCWludAlzOworCisJLyogdGVzdCBmb3IgbmV3IHZhbHVlICovCisJQUZfSVNETiA9IDM0OworCXMgPSBzb2NrZXQoQUZfSVNETiwgU09DS19SQVcsIElTRE5fUF9CQVNFKTsKKwlpZiAocyA+PSAwKSB7CisJCWNsb3NlKHMpOworCQlyZXR1cm47CisJfQorCUFGX0lTRE4gPSAyNzsKKwlzID0gc29ja2V0KEFGX0lTRE4sIFNPQ0tfUkFXLCBJU0ROX1BfQkFTRSk7CisJaWYgKHMgPj0gMCkgeworCQljbG9zZShzKTsKKwkJcmV0dXJuOworCX0KK30KKyNlbHNlCit2b2lkIGluaXRfYWZfaXNkbih2b2lkKQoreworfQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9tSVNETmlmLmggYi9vcGVuYnNjL2luY2x1ZGUvbUlTRE5pZi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhlMDY1ZDIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvbUlTRE5pZi5oCkBAIC0wLDAgKzEsMzg3IEBACisvKgorICoKKyAqIEF1dGhvcglLYXJzdGVuIEtlaWwgPGtrZWlsQG5vdmVsbC5jb20+CisgKgorICogQ29weXJpZ2h0IDIwMDggIGJ5IEthcnN0ZW4gS2VpbCA8a2tlaWxAbm92ZWxsLmNvbT4KKyAqCisgKiBUaGlzIGNvZGUgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTEVTU0VSIEdFTkVSQUwgUFVCTElDIExJQ0VOU0UKKyAqIHZlcnNpb24gMi4xIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgorICoKKyAqIFRoaXMgY29kZSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBMRVNTRVIgR0VORVJBTCBQVUJMSUMgTElDRU5TRSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqLworCisjaWZuZGVmIG1JU0ROSUZfSAorI2RlZmluZSBtSVNETklGX0gKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2lmZGVmIGxpbnV4CisjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9lcnJuby5oPgorI2luY2x1ZGUgPGxpbnV4L3NvY2tldC5oPgorI2Vsc2UKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjZW5kaWYKKworLyoKKyAqIEFCSSBWZXJzaW9uIDMyIGJpdAorICoKKyAqIDw4IGJpdD4gTWFqb3IgdmVyc2lvbgorICoJCS0gY2hhbmdlZCBpZiBhbnkgaW50ZXJmYWNlIGJlY29tZSBiYWNrd2FyZHMgaW5jb21wYXRpYmxlCisgKgorICogPDggYml0PiBNaW5vciB2ZXJzaW9uCisgKiAgICAgICAgICAgICAgLSBjaGFuZ2VkIGlmIGFueSBpbnRlcmZhY2UgaXMgZXh0ZW5kZWQgYnV0IGJhY2t3YXJkcyBjb21wYXRpYmxlCisgKgorICogPDE2IGJpdD4gUmVsZWFzZSBudW1iZXIKKyAqICAgICAgICAgICAgICAtIHNob3VsZCBiZSBpbmNyZW1lbnRlZCBvbiBldmVyeSBjaGVja2luCisgKi8KKyNkZWZpbmUJTUlTRE5fTUFKT1JfVkVSU0lPTgkxCisjZGVmaW5lCU1JU0ROX01JTk9SX1ZFUlNJT04JMQorI2RlZmluZSBNSVNETl9SRUxFQVNFCQkyMAorCisvKiBwcmltaXRpdmVzIGZvciBpbmZvcm1hdGlvbiBleGNoYW5nZQorICogZ2VuZXJlbGwgZm9ybWF0CisgKiA8MTYgIGJpdCAgMCA+CisgKiA8OCAgYml0IGNvbW1hbmQ+CisgKiAgICBCSVQgOCA9IDEgTEFZRVIgcHJpdmF0ZQorICogICAgQklUIDcgPSAxIGFuc3dlcgorICogICAgQklUIDYgPSAxIERBVEEKKyAqIDw4ICBiaXQgdGFyZ2V0IGxheWVyIG1hc2s+CisgKgorICogTGF5ZXIgPSAwMCBpcyByZXNlcnZlZCBmb3IgZ2VuZXJhbCBjb21tYW5kcworICAgTGF5ZXIgPSAwMSAgTDIgLT4gSFcKKyAgIExheWVyID0gMDIgIEhXIC0+IEwyCisgICBMYXllciA9IDA0ICBMMyAtPiBMMgorICAgTGF5ZXIgPSAwOCAgTDIgLT4gTDMKKyAqIExheWVyID0gRkYgaXMgcmVzZXJ2ZWQgZm9yIGJyb2FkY2FzdCBjb21tYW5kcworICovCisKKyNkZWZpbmUgTUlTRE5fQ01ETUFTSwkJMHhmZjAwCisjZGVmaW5lIE1JU0ROX0xBWUVSTUFTSwkJMHgwMGZmCisKKy8qIGdlbmVyZWxsIGNvbW1hbmRzICovCisjZGVmaW5lIE9QRU5fQ0hBTk5FTAkJMHgwMTAwCisjZGVmaW5lIENMT1NFX0NIQU5ORUwJCTB4MDIwMAorI2RlZmluZSBDT05UUk9MX0NIQU5ORUwJCTB4MDMwMAorI2RlZmluZSBDSEVDS19EQVRBCQkweDA0MDAKKworLyogbGF5ZXIgMiAtPiBsYXllciAxICovCisjZGVmaW5lIFBIX0FDVElWQVRFX1JFUQkJMHgwMTAxCisjZGVmaW5lIFBIX0RFQUNUSVZBVEVfUkVRCTB4MDIwMQorI2RlZmluZSBQSF9EQVRBX1JFUQkJMHgyMDAxCisjZGVmaW5lIE1QSF9BQ1RJVkFURV9SRVEJMHgwNTAxCisjZGVmaW5lIE1QSF9ERUFDVElWQVRFX1JFUQkweDA2MDEKKyNkZWZpbmUgTVBIX0lORk9STUFUSU9OX1JFUQkweDA3MDEKKyNkZWZpbmUgUEhfQ09OVFJPTF9SRVEJCTB4MDgwMQorCisvKiBsYXllciAxIC0+IGxheWVyIDIgKi8KKyNkZWZpbmUgUEhfQUNUSVZBVEVfSU5ECQkweDAxMDIKKyNkZWZpbmUgUEhfQUNUSVZBVEVfQ05GCQkweDQxMDIKKyNkZWZpbmUgUEhfREVBQ1RJVkFURV9JTkQJMHgwMjAyCisjZGVmaW5lIFBIX0RFQUNUSVZBVEVfQ05GCTB4NDIwMgorI2RlZmluZSBQSF9EQVRBX0lORAkJMHgyMDAyCisjZGVmaW5lIFBIX0RBVEFfRV9JTkQJCTB4MzAwMgorI2RlZmluZSBNUEhfQUNUSVZBVEVfSU5ECTB4MDUwMgorI2RlZmluZSBNUEhfREVBQ1RJVkFURV9JTkQJMHgwNjAyCisjZGVmaW5lIE1QSF9JTkZPUk1BVElPTl9JTkQJMHgwNzAyCisjZGVmaW5lIFBIX0RBVEFfQ05GCQkweDYwMDIKKyNkZWZpbmUgUEhfQ09OVFJPTF9JTkQJCTB4MDgwMgorI2RlZmluZSBQSF9DT05UUk9MX0NORgkJMHg0ODAyCisKKy8qIGxheWVyIDMgLT4gbGF5ZXIgMiAqLworI2RlZmluZSBETF9FU1RBQkxJU0hfUkVRCTB4MTAwNAorI2RlZmluZSBETF9SRUxFQVNFX1JFUQkJMHgxMTA0CisjZGVmaW5lIERMX0RBVEFfUkVRCQkweDMwMDQKKyNkZWZpbmUgRExfVU5JVERBVEFfUkVRCQkweDMxMDQKKyNkZWZpbmUgRExfSU5GT1JNQVRJT05fUkVRCTB4MDAwNAorCisvKiBsYXllciAyIC0+IGxheWVyIDMgKi8KKyNkZWZpbmUgRExfRVNUQUJMSVNIX0lORAkweDEwMDgKKyNkZWZpbmUgRExfRVNUQUJMSVNIX0NORgkweDUwMDgKKyNkZWZpbmUgRExfUkVMRUFTRV9JTkQJCTB4MTEwOAorI2RlZmluZSBETF9SRUxFQVNFX0NORgkJMHg1MTA4CisjZGVmaW5lIERMX0RBVEFfSU5ECQkweDMwMDgKKyNkZWZpbmUgRExfVU5JVERBVEFfSU5ECQkweDMxMDgKKyNkZWZpbmUgRExfSU5GT1JNQVRJT05fSU5ECTB4MDAwOAorCisvKiBpbnRlcm4gbGF5ZXIgMiBtYW5hZ21lbnQgKi8KKyNkZWZpbmUgTURMX0FTU0lHTl9SRVEJCTB4MTgwNAorI2RlZmluZSBNRExfQVNTSUdOX0lORAkJMHgxOTA0CisjZGVmaW5lIE1ETF9SRU1PVkVfUkVRCQkweDFBMDQKKyNkZWZpbmUgTURMX1JFTU9WRV9JTkQJCTB4MUIwNAorI2RlZmluZSBNRExfU1RBVFVTX1VQX0lORAkweDFDMDQKKyNkZWZpbmUgTURMX1NUQVRVU19ET1dOX0lORAkweDFEMDQKKyNkZWZpbmUgTURMX1NUQVRVU19VSV9JTkQJMHgxRTA0CisjZGVmaW5lIE1ETF9FUlJPUl9JTkQJCTB4MUYwNAorI2RlZmluZSBNRExfRVJST1JfUlNQCQkweDVGMDQKKworLyogRExfSU5GT1JNQVRJT05fSU5EIHR5cGVzICovCisjZGVmaW5lIERMX0lORk9fTDJfQ09OTkVDVAkweDAwMDEKKyNkZWZpbmUgRExfSU5GT19MMl9SRU1PVkVECTB4MDAwMgorCisvKiBQSF9DT05UUk9MIHR5cGVzICovCisvKiBUT1VDSCBUT05FIElTIDB4MjBYWCAgWFggIjAiLi4uIjkiLCAiQSIsIkIiLCJDIiwiRCIsIioiLCIjIiAqLworI2RlZmluZSBEVE1GX1RPTkVfVkFMCQkweDIwMDAKKyNkZWZpbmUgRFRNRl9UT05FX01BU0sJCTB4MDA3RgorI2RlZmluZSBEVE1GX1RPTkVfU1RBUlQJCTB4MjEwMAorI2RlZmluZSBEVE1GX1RPTkVfU1RPUAkJMHgyMjAwCisjZGVmaW5lIERUTUZfSEZDX0NPRUYJCTB4NDAwMAorI2RlZmluZSBEU1BfQ09ORl9KT0lOCQkweDI0MDMKKyNkZWZpbmUgRFNQX0NPTkZfU1BMSVQJCTB4MjQwNAorI2RlZmluZSBEU1BfUkVDRUlWRV9PRkYJCTB4MjQwNQorI2RlZmluZSBEU1BfUkVDRUlWRV9PTgkJMHgyNDA2CisjZGVmaW5lIERTUF9FQ0hPX09OCQkweDI0MDcKKyNkZWZpbmUgRFNQX0VDSE9fT0ZGCQkweDI0MDgKKyNkZWZpbmUgRFNQX01JWF9PTgkJMHgyNDA5CisjZGVmaW5lIERTUF9NSVhfT0ZGCQkweDI0MGEKKyNkZWZpbmUgRFNQX0RFTEFZCQkweDI0MGIKKyNkZWZpbmUgRFNQX0pJVFRFUgkJMHgyNDBjCisjZGVmaW5lIERTUF9UWERBVEFfT04JCTB4MjQwZAorI2RlZmluZSBEU1BfVFhEQVRBX09GRgkJMHgyNDBlCisjZGVmaW5lIERTUF9UWF9ERUpJVFRFUgkJMHgyNDBmCisjZGVmaW5lIERTUF9UWF9ERUpfT0ZGCQkweDI0MTAKKyNkZWZpbmUgRFNQX1RPTkVfUEFUVF9PTgkweDI0MTEKKyNkZWZpbmUgRFNQX1RPTkVfUEFUVF9PRkYJMHgyNDEyCisjZGVmaW5lIERTUF9WT0xfQ0hBTkdFX1RYCTB4MjQxMworI2RlZmluZSBEU1BfVk9MX0NIQU5HRV9SWAkweDI0MTQKKyNkZWZpbmUgRFNQX0JGX0VOQUJMRV9LRVkJMHgyNDE1CisjZGVmaW5lIERTUF9CRl9ESVNBQkxFCQkweDI0MTYKKyNkZWZpbmUgRFNQX0JGX0FDQ0VQVAkJMHgyNDE2CisjZGVmaW5lIERTUF9CRl9SRUpFQ1QJCTB4MjQxNworI2RlZmluZSBEU1BfUElQRUxJTkVfQ0ZHCTB4MjQxOAorI2RlZmluZSBIRkNfVk9MX0NIQU5HRV9UWAkweDI2MDEKKyNkZWZpbmUgSEZDX1ZPTF9DSEFOR0VfUlgJMHgyNjAyCisjZGVmaW5lIEhGQ19TUExfTE9PUF9PTgkJMHgyNjAzCisjZGVmaW5lIEhGQ19TUExfTE9PUF9PRkYJMHgyNjA0CisKKy8qIERTUF9UT05FX1BBVFRfT04gcGFyYW1ldGVyICovCisjZGVmaW5lIFRPTkVfT0ZGCQkJMHgwMDAwCisjZGVmaW5lIFRPTkVfR0VSTUFOX0RJQUxUT05FCQkweDAwMDEKKyNkZWZpbmUgVE9ORV9HRVJNQU5fT0xERElBTFRPTkUJCTB4MDAwMgorI2RlZmluZSBUT05FX0FNRVJJQ0FOX0RJQUxUT05FCQkweDAwMDMKKyNkZWZpbmUgVE9ORV9HRVJNQU5fRElBTFBCWAkJMHgwMDA0CisjZGVmaW5lIFRPTkVfR0VSTUFOX09MRERJQUxQQlgJCTB4MDAwNQorI2RlZmluZSBUT05FX0FNRVJJQ0FOX0RJQUxQQlgJCTB4MDAwNgorI2RlZmluZSBUT05FX0dFUk1BTl9SSU5HSU5HCQkweDAwMDcKKyNkZWZpbmUgVE9ORV9HRVJNQU5fT0xEUklOR0lORwkJMHgwMDA4CisjZGVmaW5lIFRPTkVfQU1FUklDQU5fUklOR1BCWAkJMHgwMDBiCisjZGVmaW5lIFRPTkVfR0VSTUFOX1JJTkdQQlgJCTB4MDAwYworI2RlZmluZSBUT05FX0dFUk1BTl9PTERSSU5HUEJYCQkweDAwMGQKKyNkZWZpbmUgVE9ORV9BTUVSSUNBTl9SSU5HSU5HCQkweDAwMGUKKyNkZWZpbmUgVE9ORV9HRVJNQU5fQlVTWQkJMHgwMDBmCisjZGVmaW5lIFRPTkVfR0VSTUFOX09MREJVU1kJCTB4MDAxMAorI2RlZmluZSBUT05FX0FNRVJJQ0FOX0JVU1kJCTB4MDAxMQorI2RlZmluZSBUT05FX0dFUk1BTl9IQU5HVVAJCTB4MDAxMgorI2RlZmluZSBUT05FX0dFUk1BTl9PTERIQU5HVVAJCTB4MDAxMworI2RlZmluZSBUT05FX0FNRVJJQ0FOX0hBTkdVUAkJMHgwMDE0CisjZGVmaW5lIFRPTkVfU1BFQ0lBTF9JTkZPCQkweDAwMTUKKyNkZWZpbmUgVE9ORV9HRVJNQU5fR0FTU0VOQkVTRVRaVAkweDAwMTYKKyNkZWZpbmUgVE9ORV9HRVJNQU5fQVVGU0NIQUxUVE9OCTB4MDAxNgorCisvKiBNUEhfSU5GT1JNQVRJT05fSU5EICovCisjZGVmaW5lIEwxX1NJR05BTF9MT1NfT0ZGCTB4MDAxMAorI2RlZmluZSBMMV9TSUdOQUxfTE9TX09OCTB4MDAxMQorI2RlZmluZSBMMV9TSUdOQUxfQUlTX09GRgkweDAwMTIKKyNkZWZpbmUgTDFfU0lHTkFMX0FJU19PTgkweDAwMTMKKyNkZWZpbmUgTDFfU0lHTkFMX1JESV9PRkYJMHgwMDE0CisjZGVmaW5lIEwxX1NJR05BTF9SRElfT04JMHgwMDE1CisjZGVmaW5lIEwxX1NJR05BTF9TTElQX1JYCTB4MDAyMAorI2RlZmluZSBMMV9TSUdOQUxfU0xJUF9UWAkweDAwMjEKKworLyoKKyAqIHByb3RvY29sIGlkcworICogRCBjaGFubmVsIDEtMzEKKyAqIEIgY2hhbm5lbCAzMyAtIDYzCisgKi8KKworI2RlZmluZSBJU0ROX1BfTk9ORQkJMAorI2RlZmluZSBJU0ROX1BfQkFTRQkJMAorI2RlZmluZSBJU0ROX1BfVEVfUzAJCTB4MDEKKyNkZWZpbmUgSVNETl9QX05UX1MwICAJCTB4MDIKKyNkZWZpbmUgSVNETl9QX1RFX0UxCQkweDAzCisjZGVmaW5lIElTRE5fUF9OVF9FMSAgCQkweDA0CisjZGVmaW5lIElTRE5fUF9URV9VUDAJCTB4MDUKKyNkZWZpbmUgSVNETl9QX05UX1VQMAkJMHgwNgorCisjZGVmaW5lIElTX0lTRE5fUF9URShwKSAoKHAgPT0gSVNETl9QX1RFX1MwKSB8fCAocCA9PSBJU0ROX1BfVEVfRTEpIHx8IFwKKwkJCQkocCA9PSBJU0ROX1BfVEVfVVAwKSB8fCAocCA9PSBJU0ROX1BfTEFQRF9URSkpCisjZGVmaW5lIElTX0lTRE5fUF9OVChwKSAoKHAgPT0gSVNETl9QX05UX1MwKSB8fCAocCA9PSBJU0ROX1BfTlRfRTEpIHx8IFwKKwkJCQkocCA9PSBJU0ROX1BfTlRfVVAwKSB8fCAocCA9PSBJU0ROX1BfTEFQRF9OVCkpCisjZGVmaW5lIElTX0lTRE5fUF9TMChwKSAoKHAgPT0gSVNETl9QX1RFX1MwKSB8fCAocCA9PSBJU0ROX1BfTlRfUzApKQorI2RlZmluZSBJU19JU0ROX1BfRTEocCkgKChwID09IElTRE5fUF9URV9FMSkgfHwgKHAgPT0gSVNETl9QX05UX0UxKSkKKyNkZWZpbmUgSVNfSVNETl9QX1VQMChwKSAoKHAgPT0gSVNETl9QX1RFX1VQMCkgfHwgKHAgPT0gSVNETl9QX05UX1VQMCkpCisKKworI2RlZmluZSBJU0ROX1BfTEFQRF9URQkJMHgxMAorI2RlZmluZQlJU0ROX1BfTEFQRF9OVAkJMHgxMQorCisjZGVmaW5lIElTRE5fUF9CX01BU0sJCTB4MWYKKyNkZWZpbmUgSVNETl9QX0JfU1RBUlQJCTB4MjAKKworI2RlZmluZSBJU0ROX1BfQl9SQVcJCTB4MjEKKyNkZWZpbmUgSVNETl9QX0JfSERMQwkJMHgyMgorI2RlZmluZSBJU0ROX1BfQl9YNzVTTFAJCTB4MjMKKyNkZWZpbmUgSVNETl9QX0JfTDJEVE1GCQkweDI0CisjZGVmaW5lIElTRE5fUF9CX0wyRFNQCQkweDI1CisjZGVmaW5lIElTRE5fUF9CX0wyRFNQSERMQwkweDI2CisKKyNkZWZpbmUgT1BUSU9OX0wyX1BNWAkJMQorI2RlZmluZSBPUFRJT05fTDJfUFRQCQkyCisjZGVmaW5lIE9QVElPTl9MMl9GSVhFRFRFSQkzCisjZGVmaW5lIE9QVElPTl9MMl9DTEVBTlVQCTQKKworLyogc2hvdWxkIGJlIGluIHN5bmMgd2l0aCBsaW51eC9rb2JqZWN0Lmg6S09CSl9OQU1FX0xFTiAqLworI2RlZmluZSBNSVNETl9NQVhfSURMRU4JCTIwCisKK3N0cnVjdCBtSVNETmhlYWQgeworCXVuc2lnbmVkIGludAlwcmltOworCXVuc2lnbmVkIGludAlpZDsKK30gIF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIE1JU0ROX0hFQURFUl9MRU4Jc2l6ZW9mKHN0cnVjdCBtSVNETmhlYWQpCisjZGVmaW5lIE1BWF9EQVRBX1NJWkUJCTIwNDgKKyNkZWZpbmUgTUFYX0RBVEFfTUVNCQkoTUFYX0RBVEFfU0laRSArIE1JU0ROX0hFQURFUl9MRU4pCisjZGVmaW5lIE1BWF9ERlJBTUVfTEVOCQkyNjAKKworI2RlZmluZSBNSVNETl9JRF9BRERSX01BU0sJMHhGRkZGCisjZGVmaW5lIE1JU0ROX0lEX1RFSV9NQVNLCTB4RkYwMAorI2RlZmluZSBNSVNETl9JRF9TQVBJX01BU0sJMHgwMEZGCisjZGVmaW5lIE1JU0ROX0lEX1RFSV9BTlkJMHg3RjAwCisKKyNkZWZpbmUgTUlTRE5fSURfQU5ZCQkweEZGRkYKKyNkZWZpbmUgTUlTRE5fSURfTk9ORQkJMHhGRkZFCisKKyNkZWZpbmUgR1JPVVBfVEVJCQkxMjcKKyNkZWZpbmUgVEVJX1NBUEkJCTYzCisjZGVmaW5lIENUUkxfU0FQSQkJMAorCisjZGVmaW5lIE1JU0ROX01BWF9DSEFOTkVMCTEyNworI2RlZmluZSBNSVNETl9DSE1BUF9TSVpFCSgoTUlTRE5fTUFYX0NIQU5ORUwgKyAxKSA+PiAzKQorCisjZGVmaW5lIFNPTF9NSVNETgkwCisKK3N0cnVjdCBzb2NrYWRkcl9tSVNETiB7CisJc2FfZmFtaWx5X3QgICAgZmFtaWx5OworCXVuc2lnbmVkIGNoYXIJZGV2OworCXVuc2lnbmVkIGNoYXIJY2hhbm5lbDsKKwl1bnNpZ25lZCBjaGFyCXNhcGk7CisJdW5zaWduZWQgY2hhcgl0ZWk7Cit9OworCitzdHJ1Y3QgbUlTRE52ZXJzaW9uIHsKKwl1bnNpZ25lZCBjaGFyCW1ham9yOworCXVuc2lnbmVkIGNoYXIJbWlub3I7CisJdW5zaWduZWQgc2hvcnQJcmVsZWFzZTsKK307CisKKyNkZWZpbmUgTUFYX0RFVklDRV9JRCA2MworCitzdHJ1Y3QgbUlTRE5fZGV2aW5mbyB7CisJdV9pbnQJCQlpZDsKKwl1X2ludAkJCURwcm90b2NvbHM7CisJdV9pbnQJCQlCcHJvdG9jb2xzOworCXVfaW50CQkJcHJvdG9jb2w7CisJdV9jaGFyCQkJY2hhbm5lbG1hcFtNSVNETl9DSE1BUF9TSVpFXTsKKwl1X2ludAkJCW5yYmNoYW47CisJY2hhcgkJCW5hbWVbTUlTRE5fTUFYX0lETEVOXTsKK307CisKK3N0cnVjdCBtSVNETl9kZXZyZW5hbWUgeworCXVfaW50CQkJaWQ7CisJY2hhcgkJCW5hbWVbTUlTRE5fTUFYX0lETEVOXTsKK307CisKK3N0cnVjdCBwaF9pbmZvX2NoIHsKKwlpbnQzMl90IAkJcHJvdG9jb2w7CisJaW50NjRfdAkJCUZsYWdzOworfTsKKworc3RydWN0IHBoX2luZm9fZGNoIHsKKwlzdHJ1Y3QgcGhfaW5mb19jaAljaDsKKwlpbnQxNl90CQkJc3RhdGU7CisJaW50MTZfdAkJCW51bV9iY2g7Cit9OworCitzdHJ1Y3QgcGhfaW5mbyB7CisJc3RydWN0IHBoX2luZm9fZGNoCWRjaDsKKwlzdHJ1Y3QgcGhfaW5mb19jaCAJYmNoW107Cit9OworCisvKiB0aW1lciBkZXZpY2UgaW9jdGwgKi8KKyNkZWZpbmUgSU1BRERUSU1FUglfSU9SKCdJJywgNjQsIGludCkKKyNkZWZpbmUgSU1ERUxUSU1FUglfSU9SKCdJJywgNjUsIGludCkKKy8qIHNvY2tldCBpb2N0bHMgKi8KKyNkZWZpbmUJSU1HRVRWRVJTSU9OCV9JT1IoJ0knLCA2NiwgaW50KQorI2RlZmluZQlJTUdFVENPVU5UCV9JT1IoJ0knLCA2NywgaW50KQorI2RlZmluZSBJTUdFVERFVklORk8JX0lPUignSScsIDY4LCBpbnQpCisjZGVmaW5lIElNQ1RSTFJFUQlfSU9SKCdJJywgNjksIGludCkKKyNkZWZpbmUgSU1DTEVBUl9MMglfSU9SKCdJJywgNzAsIGludCkKKyNkZWZpbmUgSU1TRVRERVZOQU1FCV9JT1IoJ0knLCA3MSwgc3RydWN0IG1JU0ROX2RldnJlbmFtZSkKKworc3RhdGljIGlubGluZSBpbnQKK3Rlc3RfY2hhbm5lbG1hcCh1X2ludCBuciwgdV9jaGFyICptYXApCit7CisJaWYgKG5yIDw9IE1JU0ROX01BWF9DSEFOTkVMKQorCQlyZXR1cm4gbWFwW25yID4+IDNdICYgKDEgPDwgKG5yICYgNykpOworCWVsc2UKKwkJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorc2V0X2NoYW5uZWxtYXAodV9pbnQgbnIsIHVfY2hhciAqbWFwKQoreworCW1hcFtuciA+PiAzXSB8PSAoMSA8PCAobnIgJiA3KSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorY2xlYXJfY2hhbm5lbG1hcCh1X2ludCBuciwgdV9jaGFyICptYXApCit7CisJbWFwW25yID4+IDNdICY9IH4oMSA8PCAobnIgJiA3KSk7Cit9CisKKy8qIENPTlRST0xfQ0hBTk5FTCBwYXJhbWV0ZXJzICovCisjZGVmaW5lIE1JU0ROX0NUUkxfR0VUT1AJCTB4MDAwMAorI2RlZmluZSBNSVNETl9DVFJMX0xPT1AJCQkweDAwMDEKKyNkZWZpbmUgTUlTRE5fQ1RSTF9DT05ORUNUCQkweDAwMDIKKyNkZWZpbmUgTUlTRE5fQ1RSTF9ESVNDT05ORUNUCQkweDAwMDQKKyNkZWZpbmUgTUlTRE5fQ1RSTF9QQ01DT05ORUNUCQkweDAwMTAKKyNkZWZpbmUgTUlTRE5fQ1RSTF9QQ01ESVNDT05ORUNUCTB4MDAyMAorI2RlZmluZSBNSVNETl9DVFJMX1NFVFBFRVIJCTB4MDA0MAorI2RlZmluZSBNSVNETl9DVFJMX1VOU0VUUEVFUgkJMHgwMDgwCisjZGVmaW5lIE1JU0ROX0NUUkxfUlhfT0ZGCQkweDAxMDAKKyNkZWZpbmUgTUlTRE5fQ1RSTF9GSUxMX0VNUFRZCQkweDAyMDAKKyNkZWZpbmUgTUlTRE5fQ1RSTF9HRVRQRUVSCQkweDA0MDAKKyNkZWZpbmUgTUlTRE5fQ1RSTF9IV19GRUFUVVJFU19PUAkweDIwMDAKKyNkZWZpbmUgTUlTRE5fQ1RSTF9IV19GRUFUVVJFUwkJMHgyMDAxCisjZGVmaW5lIE1JU0ROX0NUUkxfSEZDX09QCQkweDQwMDAKKyNkZWZpbmUgTUlTRE5fQ1RSTF9IRkNfUENNX0NPTk4JCTB4NDAwMQorI2RlZmluZSBNSVNETl9DVFJMX0hGQ19QQ01fRElTQwkJMHg0MDAyCisjZGVmaW5lIE1JU0ROX0NUUkxfSEZDX0NPTkZfSk9JTgkweDQwMDMKKyNkZWZpbmUgTUlTRE5fQ1RSTF9IRkNfQ09ORl9TUExJVAkweDQwMDQKKyNkZWZpbmUgTUlTRE5fQ1RSTF9IRkNfUkVDRUlWRV9PRkYJMHg0MDA1CisjZGVmaW5lIE1JU0ROX0NUUkxfSEZDX1JFQ0VJVkVfT04JMHg0MDA2CisjZGVmaW5lIE1JU0ROX0NUUkxfSEZDX0VDSE9DQU5fT04gCTB4NDAwNworI2RlZmluZSBNSVNETl9DVFJMX0hGQ19FQ0hPQ0FOX09GRiAJMHg0MDA4CisKKworLyogc29ja2V0IG9wdGlvbnMgKi8KKyNkZWZpbmUgTUlTRE5fVElNRV9TVEFNUAkJMHgwMDAxCisKK3N0cnVjdCBtSVNETl9jdHJsX3JlcSB7CisJaW50CQlvcDsKKwlpbnQJCWNoYW5uZWw7CisJaW50CQlwMTsKKwlpbnQJCXAyOworfTsKKworLyogbXV4ZXIgb3B0aW9ucyAqLworI2RlZmluZSBNSVNETl9PUFRfQUxMCQkxCisjZGVmaW5lIE1JU0ROX09QVF9URUlNR1IJMgorCisjZW5kaWYgLyogbUlTRE5JRl9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9NYWtlZmlsZS5hbSBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ4Mzk5N2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDExIEBACitub2luc3RfSEVBREVSUyA9IGFiaXNfbm0uaCBhYmlzX3JzbC5oIGRiLmggZ3NtXzA0XzA4LmggZ3NtX2RhdGEuaCBcCisJCSBnc21fc3Vic2NyaWJlci5oIGdzbV8wNF8xMS5oIGRlYnVnLmggc2lnbmFsLmggXAorCQkgbWlzZG4uaCBjaGFuX2FsbG9jLmggdGVsbmV0X2ludGVyZmFjZS5oIHBhZ2luZy5oIFwKKwkJIHN1YmNoYW5fZGVtdXguaCB0cmF1X2ZyYW1lLmggZTFfaW5wdXQuaCB0cmF1X211eC5oIFwKKwkJIGlwYWNjZXNzLmggcnMyMzIuaCBvcGVuYnNjZGVmaW5lcy5oIHJ0cF9wcm94eS5oIFwKKwkJIGJzY19ybGwuaCBtbmNjLmggdHJhbnNhY3Rpb24uaCB1c3NkLmggZ3NtXzA0XzgwLmggXAorCQkgc2lsZW50X2NhbGwuaCBtZ2NwLmggbWVhc19yZXAuaCByZXN0X29jdGV0cy5oIFwKKwkJIHN5c3RlbV9pbmZvcm1hdGlvbi5oIGhhbmRvdmVyLmggbWdjcF9pbnRlcm5hbC5oCisKK29wZW5ic2NfSEVBREVSUyA9IGdzbV8wNF8wOC5oIG1lYXNfcmVwLmgKK29wZW5ic2NkaXIgPSAkKGluY2x1ZGVkaXIpL29wZW5ic2MKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2FiaXNfbm0uaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2FiaXNfbm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTMwN2UzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYWJpc19ubS5oCkBAIC0wLDAgKzEsMTcyIEBACisvKiBHU00gTmV0d29yayBNYW5hZ2VtZW50IG1lc3NhZ2VzIG9uIHRoZSBBLWJpcyBpbnRlcmZhY2UgCisgKiAzR1BQIFRTIDEyLjIxIHZlcnNpb24gOC4wLjAgUmVsZWFzZSAxOTk5IC8gRVRTSSBUUyAxMDAgNjIzIFY4LjAuMCAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBfTk1fSAorI2RlZmluZSBfTk1fSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzEyXzIxLmg+CisKK3N0cnVjdCBjZWxsX2dsb2JhbF9pZCB7CisJdV9pbnQxNl90IG1jYzsKKwl1X2ludDE2X3QgbW5jOworCXVfaW50MTZfdCBsYWM7CisJdV9pbnQxNl90IGNpOworfTsKKworLyogVGhlIEJDQ0ggaW5mbyBmcm9tIGFuIGlwLmFjY2VzcyB0ZXN0LCBpbiBob3N0IGJ5dGUgb3JkZXIKKyAqIGFuZCBhbHJlYWR5IHBhcnNlZC4uLiAqLworc3RydWN0IGlwYWNfYmNjaF9pbmZvIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCisJdV9pbnQxNl90IGluZm9fdHlwZTsKKwl1X2ludDhfdCBmcmVxX3F1YWw7CisJdV9pbnQxNl90IGFyZmNuOworCXVfaW50OF90IHJ4X2xldjsKKwl1X2ludDhfdCByeF9xdWFsOworCWludDE2X3QgZnJlcV9lcnI7CisJdV9pbnQxNl90IGZyYW1lX29mZnNldDsKKwl1X2ludDMyX3QgZnJhbWVfbnJfb2Zmc2V0OworCXVfaW50OF90IGJzaWM7CisJc3RydWN0IGNlbGxfZ2xvYmFsX2lkIGNnaTsKKwl1X2ludDhfdCBiYV9saXN0X3NpMlsxNl07CisJdV9pbnQ4X3QgYmFfbGlzdF9zaTJiaXNbMTZdOworCXVfaW50OF90IGJhX2xpc3Rfc2kydGVyWzE2XTsKKwl1X2ludDhfdCBjYV9saXN0X3NpMVsxNl07Cit9OworCitleHRlcm4gY29uc3Qgc3RydWN0IHRsdl9kZWZpbml0aW9uIG5tX2F0dF90bHZkZWY7CisKKy8qIFBVQkxJQyAqLworCitzdHJ1Y3QgbXNnYjsKKworc3RydWN0IGFiaXNfbm1fY2ZnIHsKKwkvKiBjYWxsYmFjayBmb3IgdW5pZGlyZWN0aW9uYWwgcmVwb3J0cyAqLworCWludCAoKnJlcG9ydF9jYikoc3RydWN0IG1zZ2IgKiwKKwkJCSBzdHJ1Y3QgYWJpc19vbV9mb21faGRyICopOworCS8qIGNhbGxiYWNrIGZvciBzb2Z0d2FyZSBhY3RpdmF0ZSByZXF1ZXN0cyBmcm9tIEJUUyAqLworCWludCAoKnN3X2FjdF9yZXEpKHN0cnVjdCBtc2diICopOworfTsKKworZXh0ZXJuIGludCBhYmlzX25tX3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKKworaW50IGFiaXNfbm1fdGx2X3BhcnNlKHN0cnVjdCB0bHZfcGFyc2VkICp0cCwgc3RydWN0IGdzbV9idHMgKmJ0cywgY29uc3QgdV9pbnQ4X3QgKmJ1ZiwgaW50IGxlbik7CitpbnQgYWJpc19ubV9yeChzdHJ1Y3QgbXNnYiAqbXNnKTsKK2ludCBhYmlzX25tX29wc3RhcnQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB1X2ludDhfdCBpMCwgdV9pbnQ4X3QgaTEsIHVfaW50OF90IGkyKTsKK2ludCBhYmlzX25tX2NoZ19hZG1fc3RhdGUoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB1X2ludDhfdCBpMCwKKwkJCSAgdV9pbnQ4X3QgaTEsIHVfaW50OF90IGkyLCBlbnVtIGFiaXNfbm1fYWRtX3N0YXRlIGFkbV9zdGF0ZSk7CitpbnQgYWJpc19ubV9lc3RhYmxpc2hfdGVpKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IHRyeF9uciwKKwkJCSAgdV9pbnQ4X3QgZTFfcG9ydCwgdV9pbnQ4X3QgZTFfdGltZXNsb3QsIHVfaW50OF90IGUxX3N1YnNsb3QsCisJCQkgIHVfaW50OF90IHRlaSk7CitpbnQgYWJpc19ubV9jb25uX3RlcnJfc2lnbihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwKKwkJCSAgIHVfaW50OF90IGUxX3BvcnQsIHVfaW50OF90IGUxX3RpbWVzbG90LCB1X2ludDhfdCBlMV9zdWJzbG90KTsKK2ludCBhYmlzX25tX2Nvbm5fdGVycl90cmFmKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMsCisJCQkgICB1X2ludDhfdCBlMV9wb3J0LCB1X2ludDhfdCBlMV90aW1lc2xvdCwKKwkJCSAgIHVfaW50OF90IGUxX3N1YnNsb3QpOworaW50IGFiaXNfbm1fc2V0X2J0c19hdHRyKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90ICphdHRyLCBpbnQgYXR0cl9sZW4pOworaW50IGFiaXNfbm1fc2V0X3JhZGlvX2F0dHIoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90ICphdHRyLCBpbnQgYXR0cl9sZW4pOworaW50IGFiaXNfbm1fc2V0X2NoYW5uZWxfYXR0cihzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzLCB1X2ludDhfdCBjaGFuX2NvbWIpOworaW50IGFiaXNfbm1fc3dfYWN0X3JlcV9hY2soc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLCB1X2ludDhfdCBpMSwKKwkJCXVfaW50OF90IGkyLCB1X2ludDhfdCBpMywgaW50IG5hY2ssIHVfaW50OF90ICphdHRyLCBpbnQgYXR0X2xlbik7CitpbnQgYWJpc19ubV9yYXdfbXNnKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBsZW4sIHVfaW50OF90ICptc2cpOworaW50IGFiaXNfbm1fZXZlbnRfcmVwb3J0cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgb24pOworaW50IGFiaXNfbm1fcmVzZXRfcmVzb3VyY2Uoc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgYWJpc19ubV9zb2Z0d2FyZV9sb2FkKHN0cnVjdCBnc21fYnRzICpidHMsIGNvbnN0IGNoYXIgKmZuYW1lLAorCQkJICB1X2ludDhfdCB3aW5fc2l6ZSwgaW50IGZvcmNlZCwKKwkJCSAgZ3NtX2NiZm4gKmNiZm4sIHZvaWQgKmNiX2RhdGEpOworaW50IGFiaXNfbm1fc29mdHdhcmVfbG9hZF9zdGF0dXMoc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgYWJpc19ubV9zb2Z0d2FyZV9hY3RpdmF0ZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBjb25zdCBjaGFyICpmbmFtZSwKKwkJCSAgICAgIGdzbV9jYmZuICpjYmZuLCB2b2lkICpjYl9kYXRhKTsKKworaW50IGFiaXNfbm1fY29ubl9tZHJvcF9saW5rKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGUxX3BvcnQwLCB1X2ludDhfdCB0czAsCisJCQkgICAgdV9pbnQ4X3QgZTFfcG9ydDEsIHVfaW50OF90IHRzMSk7CisKK2ludCBhYmlzX25tX3BlcmZvcm1fdGVzdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsCisJCQkgdV9pbnQ4X3QgYnRzX25yLCB1X2ludDhfdCB0cnhfbnIsIHVfaW50OF90IHRzX25yLAorCQkJIHVfaW50OF90IHRlc3RfbnIsIHVfaW50OF90IGF1dG9uX3JlcG9ydCwKKwkJCSB1X2ludDhfdCAqcGh5c19jb25maWcsIHVfaW50MTZfdCBwaHlzX2NvbmZpZ19sZW4pOworCitpbnQgYWJpc19ubV9jaGNvbWI0cGNoYW4oZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBwY2hhbik7CisKKy8qIFNpZW1lbnMgLyBCUy0xMSBzcGVjaWZpYyAqLworaW50IGFiaXNfbm1fYnMxMV9yZXNldF9yZXNvdXJjZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX2JzMTFfZGJfdHJhbnNtaXNzaW9uKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBiZWdpbik7CitpbnQgYWJpc19ubV9iczExX2NyZWF0ZV9vYmplY3Qoc3RydWN0IGdzbV9idHMgKmJ0cywgZW51bSBhYmlzX2JzMTFfb2JqdHlwZSB0eXBlLAorCQkJICB1X2ludDhfdCBpZHgsIHVfaW50OF90IGF0dHJfbGVuLCBjb25zdCB1X2ludDhfdCAqYXR0cik7CitpbnQgYWJpc19ubV9iczExX2NyZWF0ZV9lbnZhQlRTRShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBpZHgpOworaW50IGFiaXNfbm1fYnMxMV9jcmVhdGVfYnBvcnQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgaWR4KTsKK2ludCBhYmlzX25tX2JzMTFfZGVsZXRlX29iamVjdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLAorCQkJCWVudW0gYWJpc19iczExX29ianR5cGUgdHlwZSwgdV9pbnQ4X3QgaWR4KTsKK2ludCBhYmlzX25tX2JzMTFfZGVsZXRlX2Jwb3J0KHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGlkeCk7CitpbnQgYWJpc19ubV9iczExX2Nvbm5fb21sX3RlaShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBlMV9wb3J0LAorCQkJICB1X2ludDhfdCBlMV90aW1lc2xvdCwgdV9pbnQ4X3QgZTFfc3Vic2xvdCwgdV9pbnQ4X3QgdGVpKTsKK2ludCBhYmlzX25tX2JzMTFfZ2V0X29tbF90ZWlfdHMoc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgYWJpc19ubV9iczExX2dldF9zZXJubyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX2JzMTFfc2V0X3RyeF9wb3dlcihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgbGV2ZWwpOworaW50IGFiaXNfbm1fYnMxMV9nZXRfdHJ4X3Bvd2VyKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KTsKK2ludCBhYmlzX25tX2JzMTFfbG9nb24oc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgbGV2ZWwsIGNvbnN0IGNoYXIgKm5hbWUsIGludCBvbik7CitpbnQgYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IG9uKTsKK2ludCBhYmlzX25tX2JzMTFfaW5maWVsZF9sb2dvbihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgb24pOworaW50IGFiaXNfbm1fYnMxMV9zZXRfdHJ4MV9wdyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBjb25zdCBjaGFyICpwYXNzd29yZCk7CitpbnQgYWJpc19ubV9iczExX3NldF9wbGxfbG9ja2VkKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBsb2NrZWQpOworaW50IGFiaXNfbm1fYnMxMV9nZXRfcGxsX21vZGUoc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgYWJpc19ubV9iczExX3NldF9wbGwoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IHZhbHVlKTsKK2ludCBhYmlzX25tX2JzMTFfZ2V0X2NjbGsoc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgYWJpc19ubV9iczExX2dldF9zdGF0ZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX2JzMTFfbG9hZF9zd2woc3RydWN0IGdzbV9idHMgKmJ0cywgY29uc3QgY2hhciAqZm5hbWUsCisJCQkgIHVfaW50OF90IHdpbl9zaXplLCBpbnQgZm9yY2VkLCBnc21fY2JmbiAqY2Jmbik7CitpbnQgYWJpc19ubV9iczExX3NldF9leHRfdGltZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX2JzMTFfc2V0X2Jwb3J0X2xpbmVfY2ZnKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGJwb3J0LCBlbnVtIGFiaXNfYnMxMV9saW5lX2NmZyBsaW5lX2NmZyk7CitpbnQgYWJpc19ubV9iczExX2JzY19kaXNjb25uZWN0KHN0cnVjdCBnc21fYnRzICpidHMsIGludCByZWNvbm5lY3QpOworaW50IGFiaXNfbm1fYnMxMV9yZXN0YXJ0KHN0cnVjdCBnc21fYnRzICpidHMpOworCisvKiBpcC5hY2Nlc3MgbmFub0JUUyBzcGVjaWZpYyBjb21tYW5kcyAqLworaW50IGFiaXNfbm1faXBhY2Nlc3NfbXNnKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG1zZ190eXBlLAorCQkJIHVfaW50OF90IG9ial9jbGFzcywgdV9pbnQ4X3QgYnRzX25yLAorCQkJIHVfaW50OF90IHRyeF9uciwgdV9pbnQ4X3QgdHNfbnIsCisJCQkgdV9pbnQ4X3QgKmF0dHIsIGludCBhdHRyX2xlbik7CitpbnQgYWJpc19ubV9pcGFjY2Vzc19zZXRfbnZhdHRyKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCAqYXR0ciwKKwkJCQlpbnQgYXR0cl9sZW4pOworaW50IGFiaXNfbm1faXBhY2Nlc3NfcmVzdGFydChzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBhYmlzX25tX2lwYWNjZXNzX3NldF9hdHRyKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywKKwkJCQl1X2ludDhfdCBidHNfbnIsIHVfaW50OF90IHRyeF9uciwgdV9pbnQ4X3QgdHNfbnIsCisJCQkJdV9pbnQ4X3QgKmF0dHIsIHVfaW50OF90IGF0dHJfbGVuKTsKK2ludCBhYmlzX25tX2lwYWNjZXNzX3JzbF9jb25uZWN0KHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCAKKwkJCQkgdV9pbnQzMl90IGlwLCB1X2ludDE2X3QgcG9ydCwgdV9pbnQ4X3Qgc3RyZWFtKTsKK3ZvaWQgYWJpc19ubV9pcGFjY2Vzc19jZ2kodV9pbnQ4X3QgKmJ1Ziwgc3RydWN0IGdzbV9idHMgKmJ0cyk7CitpbnQgaXBhY19wYXJzZV9iY2NoX2luZm8oc3RydWN0IGlwYWNfYmNjaF9pbmZvICpiaW5mLCB1X2ludDhfdCAqYnVmKTsKK2NvbnN0IGNoYXIgKmlwYWNjX3Rlc3RyZXNfbmFtZSh1X2ludDhfdCByZXMpOworCisvKiBGdW5jdGlvbnMgY2FsbGluZyBpbnRvIG90aGVyIGNvZGUgcGFydHMgKi8KK2VudW0gbm1fZXZ0IHsKKwlFVlRfU1RBVEVDSEdfT1BFUiwKKwlFVlRfU1RBVEVDSEdfQURNLAorfTsKK2ludCBubV9zdGF0ZV9ldmVudChlbnVtIG5tX2V2dCBldnQsIHVfaW50OF90IG9ial9jbGFzcywgdm9pZCAqb2JqLAorCQkgICBzdHJ1Y3QgZ3NtX25tX3N0YXRlICpvbGRfc3RhdGUsIHN0cnVjdCBnc21fbm1fc3RhdGUgKm5ld19zdGF0ZSk7IAorCitjb25zdCBjaGFyICpubV9vcHN0YXRlX25hbWUodV9pbnQ4X3Qgb3MpOworY29uc3QgY2hhciAqbm1fYXZhaWxfbmFtZSh1X2ludDhfdCBhdmFpbCk7CitpbnQgbm1faXNfcnVubmluZyhzdHJ1Y3QgZ3NtX25tX3N0YXRlICpzKTsKKyNlbmRpZiAvKiBfTk1fSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYWJpc19yc2wuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2FiaXNfcnNsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjI4MDE4NAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2FiaXNfcnNsLmgKQEAgLTAsMCArMSw4NyBAQAorLyogR1NNIFJhZGlvIFNpZ25hbGxpbmcgTGluayBtZXNzYWdlcyBvbiB0aGUgQS1iaXMgaW50ZXJmYWNlIAorICogM0dQUCBUUyAwOC41OCB2ZXJzaW9uIDguNi4wIFJlbGVhc2UgMTk5OSAvIEVUU0kgVFMgMTAwIDU5NiBWOC42LjAgKi8KKworLyogKEMpIDIwMDggYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9SU0xfSAorI2RlZmluZSBfUlNMX0gKKworI2luY2x1ZGUgPG9zbW9jb3JlL3Byb3RvY29sL2dzbV8wOF81OC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorCitpbnQgcnNsX2JjY2hfaW5mbyhzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgdHlwZSwKKwkJICBjb25zdCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbik7CitpbnQgcnNsX3NhY2NoX2ZpbGxpbmcoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90IHR5cGUsIAorCQkgICAgICBjb25zdCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbik7CitpbnQgcnNsX2NoYW5fYWN0aXZhdGUoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90IGNoYW5fbnIsCisJCSAgICAgIHVfaW50OF90IGFjdF90eXBlLAorCQkgICAgICBzdHJ1Y3QgcnNsX2llX2NoYW5fbW9kZSAqY2hhbl9tb2RlLAorCQkgICAgICBzdHJ1Y3QgcnNsX2llX2NoYW5faWRlbnQgKmNoYW5faWRlbnQsCisJCSAgICAgIHVfaW50OF90IGJzX3Bvd2VyLCB1X2ludDhfdCBtc19wb3dlciwKKwkJICAgICAgdV9pbnQ4X3QgdGEpOworaW50IHJzbF9jaGFuX2FjdGl2YXRlX2xjaGFuKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBhY3RfdHlwZSwgCisJCQkgICAgdV9pbnQ4X3QgdGEsIHVfaW50OF90IGhvX3JlZik7CitpbnQgcnNsX2NoYW5fbW9kZV9tb2RpZnlfcmVxKHN0cnVjdCBnc21fbGNoYW4gKnRzKTsKK2ludCByc2xfZW5jcnlwdGlvbl9jbWQoc3RydWN0IG1zZ2IgKm1zZyk7CitpbnQgcnNsX3BhZ2luZ19jbWQoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgcGFnaW5nX2dyb3VwLCB1X2ludDhfdCBsZW4sCisJCSAgIHVfaW50OF90ICptc19pZGVudCwgdV9pbnQ4X3QgY2hhbl9uZWVkZWQpOworaW50IHJzbF9wYWdpbmdfY21kX3N1YnNjcihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBjaGFuX25lZWRlZCwKKwkJCSBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CitpbnQgcnNsX2ltbV9hc3NpZ25fY21kKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGxlbiwgdV9pbnQ4X3QgKnZhbCk7CisKK2ludCByc2xfZGF0YV9yZXF1ZXN0KHN0cnVjdCBtc2diICptc2csIHVfaW50OF90IGxpbmtfaWQpOworaW50IHJzbF9lc3RhYmxpc2hfcmVxdWVzdChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCk7CitpbnQgcnNsX3JlbGFzZV9yZXF1ZXN0KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsaW5rX2lkKTsKKworLyogU2llbWVucyB2ZW5kb3Itc3BlY2lmaWMgUlNMIGV4dGVuc2lvbnMgKi8KK2ludCByc2xfc2llbWVuc19tcnBjaShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgc3RydWN0IHJzbF9tcnBjaSAqbXJwY2kpOworCisvKiBpcC5hY2Nlc3Mgc3BlY2ZpYyBSU0wgZXh0ZW5zaW9ucyAqLworaW50IHJzbF9pcGFjY19jcmN4KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKK2ludCByc2xfaXBhY2NfbWRjeChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQzMl90IGlwLAorCQkgICB1X2ludDE2X3QgcG9ydCwgdV9pbnQ4X3QgcnRwX3BheWxvYWQyKTsKK2ludCByc2xfaXBhY2NfbWRjeF90b19ydHBzb2NrKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKK2ludCByc2xfaXBhY2NfcGRjaF9hY3RpdmF0ZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CisKK2ludCBhYmlzX3JzbF9yY3Ztc2coc3RydWN0IG1zZ2IgKm1zZyk7CisKK3Vuc2lnbmVkIGludCBnZXRfcGFnaW5nX2dyb3VwKHVfaW50NjRfdCBpbXNpLCB1bnNpZ25lZCBpbnQgYnNfY2NfY2hhbnMsCisJCQkgICAgICBpbnQgbl9wYWdfYmxvY2tzKTsKK3Vuc2lnbmVkIGludCBuX3BhZ19ibG9ja3MoaW50IGJzX2NjY2hfc2RjY2hfY29tYiwgdW5zaWduZWQgaW50IGJzX2FnX2Jsa3NfcmVzKTsKK3VfaW50NjRfdCBzdHJfdG9faW1zaShjb25zdCBjaGFyICppbXNpX3N0cik7Cit1X2ludDhfdCBsY2hhbjJjaGFuX25yKGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKK2ludCByc2xfcmVsZWFzZV9yZXF1ZXN0KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsaW5rX2lkKTsKKworLyogdG8gYmUgcHJvdmlkZWQgYnkgZXh0ZXJuYWwgY29kZSAqLworaW50IGFiaXNfcnNsX3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZyk7CitpbnQgcnNsX2RlYWN0X3NhY2NoKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKK2ludCByc2xfY2hhbl9yZWxlYXNlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKKworLyogQkNDSCByZWxhdGVkIGNvZGUgKi8KK2ludCByc2xfY2NjaF9jb25mX3RvX2JzX2NjX2NoYW5zKGludCBjY2NoX2NvbmYpOworaW50IHJzbF9jY2NoX2NvbmZfdG9fYnNfY2NjaF9zZGNjaF9jb21iKGludCBjY2NoX2NvbmYpOworaW50IHJzbF9udW1iZXJfb2ZfcGFnaW5nX3N1YmNoYW5uZWxzKHN0cnVjdCBnc21fYnRzICpidHMpOworCitpbnQgcnNsX2NoYW5fYnNfcG93ZXJfY3RybChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdW5zaWduZWQgaW50IGZwYywgaW50IGRiKTsKK2ludCByc2xfY2hhbl9tc19wb3dlcl9jdHJsKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1bnNpZ25lZCBpbnQgZnBjLCBpbnQgZGJtKTsKKworI2VuZGlmIC8qIFJTTF9NVF9IICovCisKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2JzY19ybGwuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2JzY19ybGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjg5OGQxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvYnNjX3JsbC5oCkBAIC0wLDAgKzEsMTkgQEAKKyNpZm5kZWYgX0JTQ19STExfSAorI2RlZmluZSBfQlNDX1JMTF9ICisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisKK2VudW0gYnNjX3JsbHJfaW5kIHsKKwlCU0NfUkxMUl9JTkRfRVNUX0NPTkYsCisJQlNDX1JMTFJfSU5EX1JFTF9JTkQsCisJQlNDX1JMTFJfSU5EX0VSUl9JTkQsCisJQlNDX1JMTFJfSU5EX1RJTUVPVVQsCit9OworCitpbnQgcmxsX2VzdGFibGlzaChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCwKKwkJICB2b2lkICgqY2IpKHN0cnVjdCBnc21fbGNoYW4gKiwgdV9pbnQ4X3QsIHZvaWQgKiwKKwkJCSAgICAgZW51bSBic2Nfcmxscl9pbmQpLAorCQkgIHZvaWQgKmRhdGEpOwordm9pZCBybGxfaW5kaWNhdGlvbihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCwgdV9pbnQ4X3QgdHlwZSk7CisKKyNlbmRpZiAvKiBfQlNDX1JMTF9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9jaGFuX2FsbG9jLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9jaGFuX2FsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjU2NGU5ZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2NoYW5fYWxsb2MuaApAQCAtMCwwICsxLDY2IEBACisvKiBNYW5hZ2VtZW50IGZ1bmN0aW9ucyB0byBhbGxvY2F0ZS9yZWxlYXNlIHN0cnVjdCBnc21fbGNoYW4gKi8KKy8qIChDKSAyMDA4IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKyNpZm5kZWYgX0NIQU5fQUxMT0NfSAorI2RlZmluZSBfQ0hBTl9BTExPQ19ICisKKyNpbmNsdWRlICJnc21fc3Vic2NyaWJlci5oIgorCisvKiBTcGVjaWFsIGFsbG9jYXRvciBmb3IgQzAgb2YgQlRTICovCitzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzX2MwX2FsbG9jKHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJICAgZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBwY2hhbik7CisKKy8qIFJlZ3VsYXIgcGh5c2ljYWwgY2hhbm5lbCBhbGxvY2F0b3IgKi8KK3N0cnVjdCBnc21fYnRzX3RyeF90cyAqdHNfYWxsb2Moc3RydWN0IGdzbV9idHMgKmJ0cywKKwkJCQllbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIHBjaGFuKTsKKworLyogUmVndWxhciBwaHlzaWNhbCBjaGFubmVsIChUUykgKi8KK3ZvaWQgdHNfZnJlZShzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzKTsKKworLyogRmluZCBhbiBhbGxvY2F0ZWQgY2hhbm5lbCAqLworc3RydWN0IGdzbV9sY2hhbiAqbGNoYW5fZmluZChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CisKKy8qIEZpbmQgYW4gYWxsb2NhdGVkIGNoYW5uZWwgZm9yIGEgc3BlY2lmaWVkIHN1YnNjcmliZXIgKi8KK3N0cnVjdCBnc21fbGNoYW4gKmxjaGFuX2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworCisvKiBBbGxvY2F0ZSBhIGxvZ2ljYWwgY2hhbm5lbCAoU0RDQ0gsIFRDSCwgLi4uKSAqLworc3RydWN0IGdzbV9sY2hhbiAqbGNoYW5fYWxsb2Moc3RydWN0IGdzbV9idHMgKmJ0cywgZW51bSBnc21fY2hhbl90IHR5cGUpOworCisvKiBGcmVlIGEgbG9naWNhbCBjaGFubmVsIChTRENDSCwgVENILCAuLi4pICovCit2b2lkIGxjaGFuX2ZyZWUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworCisvKiBDb25zaWRlciByZWxlYXNpbmcgdGhlIGNoYW5uZWwgKi8KK2ludCBsY2hhbl9hdXRvX3JlbGVhc2Uoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworCitzdHJ1Y3QgbG9hZF9jb3VudGVyIHsKKwl1bnNpZ25lZCBpbnQgdG90YWw7CisJdW5zaWduZWQgaW50IHVzZWQ7Cit9OworCitzdHJ1Y3QgcGNoYW5fbG9hZCB7CisJc3RydWN0IGxvYWRfY291bnRlciBwY2hhbltHU01fUENIQU5fVU5LTk9XTl07Cit9OworCit2b2lkIGJ0c19jaGFuX2xvYWQoc3RydWN0IHBjaGFuX2xvYWQgKmNsLCBjb25zdCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK3ZvaWQgbmV0d29ya19jaGFuX2xvYWQoc3RydWN0IHBjaGFuX2xvYWQgKnBsLCBzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCk7CisKK2ludCB0cnhfaXNfdXNhYmxlKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KTsKKworI2VuZGlmIC8qIF9DSEFOX0FMTE9DX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2RiLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9kYi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNjY0ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9kYi5oCkBAIC0wLDAgKzEsNzEgQEAKKy8qIChDKSAyMDA4IGJ5IEphbiBMdWViYmUgPGpsdWViYmVAZGViaWFuLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIF9EQl9ICisjZGVmaW5lIF9EQl9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKworLyogb25lIHRpbWUgaW5pdGlhbGlzYXRpb24gKi8KK2ludCBkYl9pbml0KGNvbnN0IGNoYXIgKm5hbWUpOworaW50IGRiX3ByZXBhcmUoKTsKK2ludCBkYl9maW5pKCk7CisKKy8qIHN1YnNjcmliZXIgbWFuYWdlbWVudCAqLworc3RydWN0IGdzbV9zdWJzY3JpYmVyKiBkYl9jcmVhdGVfc3Vic2NyaWJlcihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJICAgIGNoYXIgKmltc2kpOworc3RydWN0IGdzbV9zdWJzY3JpYmVyKiBkYl9nZXRfc3Vic2NyaWJlcihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJIGVudW0gZ3NtX3N1YnNjcmliZXJfZmllbGQgZmllbGQsCisJCQkJCSBjb25zdCBjaGFyICpzdWJzY3IpOworaW50IGRiX3N5bmNfc3Vic2NyaWJlcihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIqIHN1YnNjcmliZXIpOworaW50IGRiX3N1YnNjcmliZXJfYWxsb2NfdG1zaShzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIqIHN1YnNjcmliZXIpOworaW50IGRiX3N1YnNjcmliZXJfYWxsb2NfZXh0ZW4oc3RydWN0IGdzbV9zdWJzY3JpYmVyKiBzdWJzY3JpYmVyKTsKK2ludCBkYl9zdWJzY3JpYmVyX2FsbG9jX3Rva2VuKHN0cnVjdCBnc21fc3Vic2NyaWJlciogc3Vic2NyaWJlciwgdV9pbnQzMl90KiB0b2tlbik7CitpbnQgZGJfc3Vic2NyaWJlcl9hc3NvY19pbWVpKHN0cnVjdCBnc21fc3Vic2NyaWJlciogc3Vic2NyaWJlciwgY2hhciAqaW1laSk7CitpbnQgZGJfc3luY19lcXVpcG1lbnQoc3RydWN0IGdzbV9lcXVpcG1lbnQgKmVxdWlwKTsKKworLyogYXV0aCBpbmZvICovCitpbnQgZ2V0X2F1dGhpbmZvX2J5X3N1YnNjcihzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyAqYWluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CitpbnQgc2V0X2F1dGhpbmZvX2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9hdXRoX2luZm8gKmFpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKK2ludCBnZXRfYXV0aHR1cGxlX2J5X3N1YnNjcihzdHJ1Y3QgZ3NtX2F1dGhfdHVwbGUgKmF0dXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CitpbnQgc2V0X2F1dGh0dXBsZV9mb3Jfc3Vic2NyKHN0cnVjdCBnc21fYXV0aF90dXBsZSAqYXR1cGxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CisKKy8qIFNNUyBzdG9yZS1hbmQtZm9yd2FyZCAqLworaW50IGRiX3Ntc19zdG9yZShzdHJ1Y3QgZ3NtX3NtcyAqc21zKTsKK3N0cnVjdCBnc21fc21zICpkYl9zbXNfZ2V0X3Vuc2VudChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgaW50IG1pbl9pZCk7CitzdHJ1Y3QgZ3NtX3NtcyAqZGJfc21zX2dldF91bnNlbnRfYnlfc3Vic2NyKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBpbnQgbWluX3N1YnNjcl9pZCk7CitzdHJ1Y3QgZ3NtX3NtcyAqZGJfc21zX2dldF91bnNlbnRfZm9yX3N1YnNjcihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CitpbnQgZGJfc21zX21hcmtfc2VudChzdHJ1Y3QgZ3NtX3NtcyAqc21zKTsKKworLyogQVBEVSBibG9iIHN0b3JhZ2UgKi8KK2ludCBkYl9hcGR1X2Jsb2Jfc3RvcmUoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsIAorCQkJdV9pbnQ4X3QgYXBkdV9pZF9mbGFncywgdV9pbnQ4X3QgbGVuLAorCQkJdV9pbnQ4X3QgKmFwZHUpOworCisvKiBTdGF0aXN0aWNzIGNvdW50ZXIgc3RvcmFnZSAqLworaW50IGRiX3N0b3JlX2NvdW50ZXIoc3RydWN0IGNvdW50ZXIgKmN0cik7CisKKyNlbmRpZiAvKiBfREJfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZGVidWcuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2RlYnVnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGI2N2M2MQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2RlYnVnLmgKQEAgLTAsMCArMSwxMzEgQEAKKyNpZm5kZWYgX0RFQlVHX0gKKyNkZWZpbmUgX0RFQlVHX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisKKyNkZWZpbmUgREVCVUcKKworLyogRGVidWcgQXJlYXMgb2YgdGhlIGNvZGUgKi8KK2VudW0geworCURSTEwsCisJRENDLAorCURNTSwKKwlEUlIsCisJRFJTTCwKKwlETk0sCisJRE1OQ0MsCisJRFNNUywKKwlEUEFHLAorCURNRUFTLAorCURNSSwKKwlETUlCLAorCURNVVgsCisJRElOUCwKKwlEU0NDUCwKKwlETVNDLAorCURNR0NQLAorCURITywKKwlEREIsCisJRFJFRiwKKwlEZWJ1Z19MYXN0RW50cnksCit9OworCisjaWZkZWYgREVCVUcKKyNkZWZpbmUgREVCVUdQKHNzLCBmbXQsIGFyZ3MuLi4pIGRlYnVncChzcywgX19GSUxFX18sIF9fTElORV9fLCAwLCBmbXQsICMjIGFyZ3MpCisjZGVmaW5lIERFQlVHUEMoc3MsIGZtdCwgYXJncy4uLikgZGVidWdwKHNzLCBfX0ZJTEVfXywgX19MSU5FX18sIDEsIGZtdCwgIyMgYXJncykKKyNlbHNlCisjZGVmaW5lIERFQlVHUCh4c3MsIGZtdCwgYXJncy4uLikKKyNkZWZpbmUgREVCVUdQQyhzcywgZm10LCBhcmdzLi4uKQorI2VuZGlmCisKKworI2RlZmluZSBzdGF0aWNfYXNzZXJ0KGV4cCwgbmFtZSkgdHlwZWRlZiBpbnQgZHVtbXkjI25hbWUgWyhleHApID8gMSA6IC0xXTsKKworY2hhciAqaGV4ZHVtcChjb25zdCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pOwordm9pZCBkZWJ1Z3AodW5zaWduZWQgaW50IHN1YnN5cywgY2hhciAqZmlsZSwgaW50IGxpbmUsIGludCBjb250LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA1LCA2KSkpOworCisvKiBuZXcgbG9nZ2luZyBpbnRlcmZhY2UgKi8KKyNkZWZpbmUgTE9HUChzcywgbGV2ZWwsIGZtdCwgYXJncy4uLikgZGVidWdwMihzcywgbGV2ZWwsIF9fRklMRV9fLCBfX0xJTkVfXywgMCwgZm10LCAjI2FyZ3MpCisjZGVmaW5lIExPR1BDKHNzLCBsZXZlbCwgZm10LCBhcmdzLi4uKSBkZWJ1Z3AyKHNzLCBsZXZlbCwgX19GSUxFX18sIF9fTElORV9fLCAxLCBmbXQsICMjYXJncykKKworLyogZGlmZmVyZW50IGxldmVscyAqLworI2RlZmluZSBMT0dMX0RFQlVHCTEJLyogZGVidWdnaW5nIGluZm9ybWF0aW9uICovCisjZGVmaW5lIExPR0xfSU5GTwkzCisjZGVmaW5lIExPR0xfTk9USUNFCTUJLyogYWJub3JtYWwvdW5leHBlY3RlZCBjb25kaXRpb24gKi8KKyNkZWZpbmUgTE9HTF9FUlJPUgk3CS8qIGVycm9yIGNvbmRpdGlvbiwgcmVxdWlyZXMgdXNlciBhY3Rpb24gKi8KKyNkZWZpbmUgTE9HTF9GQVRBTAk4CS8qIGZhdGFsLCBwcm9ncmFtIGFib3J0ZWQgKi8KKworLyogY29udGV4dCAqLworI2RlZmluZSBCU0NfQ1RYX0xDSEFOCTAKKyNkZWZpbmUgQlNDX0NUWF9TVUJTQ1IJMQorI2RlZmluZSBCU0NfQ1RYX0JUUwkyCisjZGVmaW5lIEJTQ19DVFhfU0NDUAkzCisKKy8qIHRhcmdldCAqLworCitlbnVtIHsKKwlERUJVR19GSUxURVJfSU1TSSA9IDEgPDwgMCwKKwlERUJVR19GSUxURVJfQUxMID0gMSA8PCAxLAorfTsKKworc3RydWN0IGRlYnVnX2NhdGVnb3J5IHsKKwlpbnQgZW5hYmxlZDsKKwlpbnQgbG9nbGV2ZWw7Cit9OworCitzdHJ1Y3QgZGVidWdfdGFyZ2V0IHsKKwlpbnQgZmlsdGVyX21hcDsKKwljaGFyICppbXNpX2ZpbHRlcjsKKworCisJc3RydWN0IGRlYnVnX2NhdGVnb3J5IGNhdGVnb3JpZXNbRGVidWdfTGFzdEVudHJ5XTsKKwlpbnQgdXNlX2NvbG9yOworCWludCBwcmludF90aW1lc3RhbXA7CisJaW50IGxvZ2xldmVsOworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJRklMRSAqb3V0OworCQl9IHRndF9zdGRvdXQ7CisKKwkJc3RydWN0IHsKKwkJCWludCBwcmlvcml0eTsKKwkJfSB0Z3Rfc3lzbG9nOworCisJCXN0cnVjdCB7CisJCQl2b2lkICp2dHk7CisJCX0gdGd0X3Z0eTsKKwl9OworCisgICAgICAgIHZvaWQgKCpvdXRwdXQpIChzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQsIGNvbnN0IGNoYXIgKnN0cmluZyk7CisKKyAgICAgICAgc3RydWN0IGxsaXN0X2hlYWQgZW50cnk7Cit9OworCisvKiB1c2UgdGhlIGFib3ZlIG1hY3JvcyAqLwordm9pZCBkZWJ1Z3AyKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBsZXZlbCwgY2hhciAqZmlsZSwgaW50IGxpbmUsIGludCBjb250LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikgX19hdHRyaWJ1dGVfXyAoKGZvcm1hdCAocHJpbnRmLCA2LCA3KSkpOwordm9pZCBkZWJ1Z19pbml0KHZvaWQpOworCisvKiBjb250ZXh0IG1hbmFnZW1lbnQgKi8KK3ZvaWQgZGVidWdfcmVzZXRfY29udGV4dCh2b2lkKTsKK3ZvaWQgZGVidWdfc2V0X2NvbnRleHQoaW50IGN0eCwgdm9pZCAqdmFsdWUpOworCisvKiBmaWx0ZXIgb24gdGhlIHRhcmdldHMgKi8KK3ZvaWQgZGVidWdfc2V0X2ltc2lfZmlsdGVyKHN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldCwgY29uc3QgY2hhciAqaW1zaSk7Cit2b2lkIGRlYnVnX3NldF9hbGxfZmlsdGVyKHN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldCwgaW50KTsKK3ZvaWQgZGVidWdfc2V0X3VzZV9jb2xvcihzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQsIGludCk7Cit2b2lkIGRlYnVnX3NldF9wcmludF90aW1lc3RhbXAoc3RydWN0IGRlYnVnX3RhcmdldCAqdGFyZ2V0LCBpbnQpOwordm9pZCBkZWJ1Z19zZXRfbG9nX2xldmVsKHN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldCwgaW50IGxvZ19sZXZlbCk7Cit2b2lkIGRlYnVnX3BhcnNlX2NhdGVnb3J5X21hc2soc3RydWN0IGRlYnVnX3RhcmdldCAqdGFyZ2V0LCBjb25zdCBjaGFyKiBtYXNrKTsKK2ludCBkZWJ1Z19wYXJzZV9sZXZlbChjb25zdCBjaGFyICpsdmwpOworaW50IGRlYnVnX3BhcnNlX2NhdGVnb3J5KGNvbnN0IGNoYXIgKmNhdGVnb3J5KTsKK3ZvaWQgZGVidWdfc2V0X2NhdGVnb3J5X2ZpbHRlcihzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQsIGludCBjYXRlZ29yeSwgaW50IGVuYWJsZSwgaW50IGxldmVsKTsKKworCisvKiBtYW5hZ2VtZW50IG9mIHRoZSB0YXJnZXRzICovCitzdHJ1Y3QgZGVidWdfdGFyZ2V0ICpkZWJ1Z190YXJnZXRfY3JlYXRlKHZvaWQpOworc3RydWN0IGRlYnVnX3RhcmdldCAqZGVidWdfdGFyZ2V0X2NyZWF0ZV9zdGRlcnIodm9pZCk7Cit2b2lkIGRlYnVnX2FkZF90YXJnZXQoc3RydWN0IGRlYnVnX3RhcmdldCAqdGFyZ2V0KTsKK3ZvaWQgZGVidWdfZGVsX3RhcmdldChzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQpOworI2VuZGlmIC8qIF9ERUJVR19IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9lMV9pbnB1dC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZTFfaW5wdXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYTNkOWQ2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZTFfaW5wdXQuaApAQCAtMCwwICsxLDE2OCBAQAorI2lmbmRlZiBfRTFfSU5QVVRfSAorI2RlZmluZSBfRTFfSU5QVVRfSAorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3N1YmNoYW5fZGVtdXguaD4KKworI2RlZmluZSBOVU1fRTFfVFMgICAzMgorCitlbnVtIGUxaW5wX3NpZ25fdHlwZSB7CisJRTFJTlBfU0lHTl9OT05FLAorCUUxSU5QX1NJR05fT01MLAorCUUxSU5QX1NJR05fUlNMLAorfTsKK2NvbnN0IGNoYXIgKmUxaW5wX3NpZ250eXBlX25hbWUoZW51bSBlMWlucF9zaWduX3R5cGUgdHApOworCitzdHJ1Y3QgZTFpbnBfdHM7CisKK3N0cnVjdCBlMWlucF9zaWduX2xpbmsgeworCS8qIGxpc3Qgb2Ygc2lnbmFsbGluZyBsaW5rcyAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwkvKiB0byB3aGljaCB0aW1lc2xvdCBkbyB3ZSBiZWxvbmc/ICovCisJc3RydWN0IGUxaW5wX3RzICp0czsKKworCWVudW0gZTFpbnBfc2lnbl90eXBlIHR5cGU7CisKKwkvKiB0cnggZm9yIG1zZy0+dHJ4IG9mIHJlY2VpdmVkIG1zZ3MgKi8JCisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisKKwkvKiBtc2diIHF1ZXVlIG9mIHRvLWJlLXRyYW5zbWl0dGVkIG1zZ3MgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCB0eF9saXN0OworCisJLyogU0FQSSBhbmQgVEVJIG9uIHRoZSBFMSBUUyAqLworCXVfaW50OF90IHNhcGk7CisJdV9pbnQ4X3QgdGVpOworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdV9pbnQ4X3QgY2hhbm5lbDsKKwkJfSBtaXNkbjsKKwl9IGRyaXZlcjsKK307CisKK2VudW0gZTFpbnBfdHNfdHlwZSB7CisJRTFJTlBfVFNfVFlQRV9OT05FLAorCUUxSU5QX1RTX1RZUEVfU0lHTiwKKwlFMUlOUF9UU19UWVBFX1RSQVUsCit9OworY29uc3QgY2hhciAqZTFpbnBfdHN0eXBlX25hbWUoZW51bSBlMWlucF90c190eXBlIHRwKTsKKworLyogQSB0aW1lc2xvdCBpbiB0aGUgRTEgaW50ZXJmYWNlICovCitzdHJ1Y3QgZTFpbnBfdHMgeworCWVudW0gZTFpbnBfdHNfdHlwZSB0eXBlOworCWludCBudW07CisKKwkvKiB0byB3aGljaCBsaW5lIGRvIHdlIGJlbG9uZyA/ICovCisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisKKwl1bmlvbiB7CisJCXN0cnVjdCB7CisJCQkvKiBsaXN0IG9mIGFsbCBzaWduYWxsaW5nIGxpbmtzIG9uIHRoaXMgVFMgKi8KKwkJCXN0cnVjdCBsbGlzdF9oZWFkIHNpZ25fbGlua3M7CisJCQkvKiB0aW1lciB3aGVuIHRvIGRlcXVldWUgbmV4dCBmcmFtZSAqLworCQkJc3RydWN0IHRpbWVyX2xpc3QgdHhfdGltZXI7CisJCX0gc2lnbjsKKwkJc3RydWN0IHsKKwkJCS8qIHN1YmNoYW5uZWwgZGVtdXhlciBmb3IgZnJhbWVzIGZyb20gRTEgKi8KKwkJCXN0cnVjdCBzdWJjaF9kZW11eCBkZW11eDsKKwkJCS8qIHN1YmNoYW5uZWwgbXV4ZXIgZm9yIGZyYW1lcyB0byBFMSAqLworCQkJc3RydWN0IHN1YmNoX211eCBtdXg7CisJCX0gdHJhdTsKKwl9OworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCS8qIG1JU0ROIGRyaXZlciBoYXMgb25lIGZkIGZvciBlYWNoIHRzICovCisJCQlzdHJ1Y3QgYnNjX2ZkIGZkOworCQl9IG1pc2RuOworCQlzdHJ1Y3QgeworCQkJLyogaXAuYWNjZXNzIGRyaXZlciBoYXMgb25lIGZkIGZvciBlYWNoIHRzICovCisJCQlzdHJ1Y3QgYnNjX2ZkIGZkOworCQl9IGlwYWNjZXNzOworCisJfSBkcml2ZXI7Cit9OworCitzdHJ1Y3QgZTFpbnBfZHJpdmVyIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCWNvbnN0IGNoYXIgKm5hbWU7CisJaW50ICgqd2FudF93cml0ZSkoc3RydWN0IGUxaW5wX3RzICp0cyk7Cit9OwkKKworc3RydWN0IGUxaW5wX2xpbmUgeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisJdW5zaWduZWQgaW50IG51bTsKKwljb25zdCBjaGFyICpuYW1lOworCisJLyogYXJyYXkgb2YgdGltZXN0bG90cyAqLworCXN0cnVjdCBlMWlucF90cyB0c1tOVU1fRTFfVFNdOworCisJc3RydWN0IGUxaW5wX2RyaXZlciAqZHJpdmVyOworCXZvaWQgKmRyaXZlcl9kYXRhOworfTsKKworLyogcmVnaXN0ZXIgYSBkcml2ZXIgd2l0aCB0aGUgRTEgY29yZSAqLworaW50IGUxaW5wX2RyaXZlcl9yZWdpc3RlcihzdHJ1Y3QgZTFpbnBfZHJpdmVyICpkcnYpOworCisvKiByZWdpc3RlciBhIGxpbmUgd2l0aCB0aGUgRTEgY29yZSAqLworaW50IGUxaW5wX2xpbmVfcmVnaXN0ZXIoc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUpOworCisvKiBlbnN1cmUgYSBjZXJ0YWluIGxpbmUgZXhpc3RzLCByZXR1cm4gcG9pbnRlciB0byBpdCAqLworc3RydWN0IGUxaW5wX2xpbmUgKmUxaW5wX2xpbmVfZ2V0X2NyZWF0ZSh1X2ludDhfdCBlMV9ucik7CisKKy8qIGZpbmQgYSBzaWduX2xpbmsgZm9yIGdpdmVuIFRFSSBhbmQgU0FQSSBpbiBhIFRTICovCitzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICoKK2UxaW5wX2xvb2t1cF9zaWduX2xpbmsoc3RydWN0IGUxaW5wX3RzICp0cywgdV9pbnQ4X3QgdGVpLAorCQkJdV9pbnQ4X3Qgc2FwaSk7CisKKy8qIGNyZWF0ZSBhIG5ldyBzaWduYWxsaW5nIGxpbmsgaW4gYSBFMSB0aW1lc2xvdCAqLworc3RydWN0IGUxaW5wX3NpZ25fbGluayAqCitlMWlucF9zaWduX2xpbmtfY3JlYXRlKHN0cnVjdCBlMWlucF90cyAqdHMsIGVudW0gZTFpbnBfc2lnbl90eXBlIHR5cGUsCisJCQlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgdGVpLAorCQkJdV9pbnQ4X3Qgc2FwaSk7CisKKy8qIGNvbmZpZ3VyZSBhbmQgaW5pdGlhbGl6ZSBvbmUgZTFpbnBfdHMgKi8KK2ludCBlMWlucF90c19jb25maWcoc3RydWN0IGUxaW5wX3RzICp0cywgc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUsCisJCSAgICBlbnVtIGUxaW5wX3RzX3R5cGUgdHlwZSk7CisKKy8qIENhbGwgZnJvbSB0aGUgU3RhY2s6IGNvbmZpZ3VyYXRpb24gb2YgdGhpcyBUUyBoYXMgY2hhbmdlZCAqLworaW50IGUxaW5wX3VwZGF0ZV90cyhzdHJ1Y3QgZTFpbnBfdHMgKnRzKTsKKworLyogUmVjZWl2ZSBhIHBhY2tldCBmcm9tIHRoZSBFMSBkcml2ZXIgKi8KK2ludCBlMWlucF9yeF90cyhzdHJ1Y3QgZTFpbnBfdHMgKnRzLCBzdHJ1Y3QgbXNnYiAqbXNnLAorCQl1X2ludDhfdCB0ZWksIHVfaW50OF90IHNhcGkpOworCisvKiBjYWxsZWQgYnkgZHJpdmVyIGlmIGl0IHdhbnRzIHRvIHRyYW5zbWl0IG9uIGEgZ2l2ZW4gVFMgKi8KK3N0cnVjdCBtc2diICplMWlucF90eF90cyhzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cywKKwkJCSBzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICoqc2lnbl9saW5rKTsKKworLyogY2FsbGVkIGJ5IGRyaXZlciBpbiBjYXNlIHNvbWUga2luZCBvZiBsaW5rIHN0YXRlIGV2ZW50ICovCitpbnQgZTFpbnBfZXZlbnQoc3RydWN0IGUxaW5wX3RzICp0cywgaW50IGV2dCwgdV9pbnQ4X3QgdGVpLCB1X2ludDhfdCBzYXBpKTsKKworLyogV3JpdGUgTEFQRCBmcmFtZXMgdG8gdGhlIGZkLiAqLwordm9pZCBlMV9zZXRfcGNhcF9mZChpbnQgZmQpOworCisvKiBjYWxsZWQgYnkgVFJBVSBtdXhlciB0byBvYnRhaW4gdGhlIGRlc3RpbmF0aW9uIG11eCBlbnRpdHkgKi8KK3N0cnVjdCBzdWJjaF9tdXggKmUxaW5wX2dldF9tdXgodV9pbnQ4X3QgZTFfbnIsIHVfaW50OF90IHRzX25yKTsKKwordm9pZCBlMWlucF9zaWduX2xpbmtfZGVzdHJveShzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpsaW5rKTsKK2ludCBlMWlucF9saW5lX3VwZGF0ZShzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSk7CisKKy8qIGUxX2NvbmZpZy5jICovCitpbnQgZTFfcmVjb25maWdfdHMoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyk7CitpbnQgZTFfcmVjb25maWdfdHJ4KHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KTsKK2ludCBlMV9yZWNvbmZpZ19idHMoc3RydWN0IGdzbV9idHMgKmJ0cyk7CisKK2ludCBpYV9jb25maWdfY29ubmVjdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNpbik7CitpbnQgaXBhY2Nlc3Nfc2V0dXAoc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQpOworCitleHRlcm4gc3RydWN0IGxsaXN0X2hlYWQgZTFpbnBfZHJpdmVyX2xpc3Q7CitleHRlcm4gc3RydWN0IGxsaXN0X2hlYWQgZTFpbnBfbGluZV9saXN0OworCisjZW5kaWYgLyogX0UxX0lOUFVUX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF8wOC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzA4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzQwMThjZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF8wOC5oCkBAIC0wLDAgKzEsNTYgQEAKKyNpZm5kZWYgX0dTTV8wNF8wOF9ICisjZGVmaW5lIF9HU01fMDRfMDhfSAorCisjaW5jbHVkZSA8b3BlbmJzYy9tZWFzX3JlcC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtNDguaD4KKworc3RydWN0IG1zZ2I7CitzdHJ1Y3QgZ3NtX2J0czsKK3N0cnVjdCBnc21fc3Vic2NyaWJlcjsKK3N0cnVjdCBnc21fbmV0d29yazsKK3N0cnVjdCBnc21fdHJhbnM7CisKKy8qIGNvbmZpZyBvcHRpb25zIGNvbnRyb2xsaW5nIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGxvd2VyIGxldmVzICovCit2b2lkIGdzbTA0MDhfYWxsb3dfZXZlcnlvbmUoaW50IGFsbG93KTsKKworaW50IGdzbTA0MDhfcmN2bXNnKHN0cnVjdCBtc2diICptc2csIHVfaW50OF90IGxpbmtfaWQpOworZW51bSBnc21fY2hhbl90IGdldF9jdHlwZV9ieV9jaHJlcShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCByYSwgaW50IG5lY2kpOworZW51bSBnc21fY2hyZXFfcmVhc29uX3QgZ2V0X3JlYXNvbl9ieV9jaHJlcShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCByYSwgaW50IG5lY2kpOworCitpbnQgZ3NtNDhfdHhfbW1faW5mbyhzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7CitpbnQgZ3NtNDhfdHhfbW1fYXV0aF9yZXEoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90ICpyYW5kLCBpbnQga2V5X3NlcSk7CitpbnQgZ3NtNDhfdHhfbW1fYXV0aF9yZWooc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworc3RydWN0IG1zZ2IgKmdzbTQ4X21zZ2JfYWxsb2Modm9pZCk7CitpbnQgZ3NtNDhfc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucyk7CitpbnQgZ3NtNDhfbWlfdG9fc3RyaW5nKGNoYXIgKnN0cmluZywgY29uc3QgaW50IHN0cl9sZW4sIGNvbnN0IHVfaW50OF90ICptaSwgY29uc3QgaW50IG1pX2xlbik7CisKK2ludCBnc200OF9zZW5kX3JyX3JlbGVhc2Uoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworaW50IGdzbTQ4X3NlbmRfcnJfY2lwaF9tb2RlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBpbnQgd2FudF9pbWVpc3YpOworaW50IGdzbTQ4X3NlbmRfcnJfYXBwX2luZm8oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGFwZHVfaWQsCisJCQkgICB1X2ludDhfdCBhcGR1X2xlbiwgY29uc3QgdV9pbnQ4X3QgKmFwZHUpOworaW50IGdzbTQ4X3NlbmRfcnJfYXNzX2NtZChzdHJ1Y3QgZ3NtX2xjaGFuICpkZXN0X2xjaGFuLCBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgcG93ZXJfY2xhc3MpOworaW50IGdzbTQ4X3NlbmRfaG9fY21kKHN0cnVjdCBnc21fbGNoYW4gKm9sZF9sY2hhbiwgc3RydWN0IGdzbV9sY2hhbiAqbmV3X2xjaGFuLAorCQkgICAgICB1X2ludDhfdCBwb3dlcl9jb21tYW5kLCB1X2ludDhfdCBob19yZWYpOworCitpbnQgYnNjX3VwcXVldWUoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpOworCitpbnQgbW5jY19zZW5kKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBpbnQgbXNnX3R5cGUsIHZvaWQgKmFyZyk7CisKKy8qIGNvbnZlcnQgYSBBU0NJSSBwaG9uZSBudW1iZXIgdG8gY2FsbC1jb250cm9sIEJDRCAqLworaW50IGVuY29kZV9iY2RfbnVtYmVyKHVfaW50OF90ICpiY2RfbHYsIHVfaW50OF90IG1heF9sZW4sCisJCSAgICAgIGludCBoX2xlbiwgY29uc3QgY2hhciAqaW5wdXQpOworaW50IGRlY29kZV9iY2RfbnVtYmVyKGNoYXIgKm91dHB1dCwgaW50IG91dHB1dF9sZW4sIGNvbnN0IHVfaW50OF90ICpiY2RfbHYsCisJCSAgICAgIGludCBoX2xlbik7CisKK2ludCBzZW5kX3NpZW1lbnNfbXJwY2koc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90ICpjbGFzc21hcmsyX2x2KTsKK2ludCBnc200OF9wYWdpbmdfZXh0cmFjdF9taShzdHJ1Y3QgbXNnYiAqbXNnLCBjaGFyICptaV9zdHJpbmcsIHVfaW50OF90ICptaV90eXBlKTsKK2ludCBnc200OF9oYW5kbGVfcGFnaW5nX3Jlc3Aoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworCitpbnQgZ3NtNDhfbGNoYW5fbW9kaWZ5KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsY2hhbl9tb2RlKTsKK2ludCBnc200OF9yeF9ycl9tb2RpZl9hY2soc3RydWN0IG1zZ2IgKm1zZyk7CitpbnQgZ3NtNDhfcGFyc2VfbWVhc19yZXAoc3RydWN0IGdzbV9tZWFzX3JlcCAqcmVwLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKKworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF8xMS5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzExLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJhZGQzNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF8xMS5oCkBAIC0wLDAgKzEsMzYgQEAKKyNpZm5kZWYgX0dTTV8wNF8xMV9ICisjZGVmaW5lIF9HU01fMDRfMTFfSAorCisjaW5jbHVkZSA8b3Ntb2NvcmUvcHJvdG9jb2wvZ3NtXzA0XzExLmg+CisKKy8qIFNNUyBkZWxpdmVyIFBEVSAqLworc3RydWN0IHNtc19kZWxpdmVyIHsKKwl1X2ludDhfdCBtdGk6MjsJCS8qIG1lc3NhZ2UgdHlwZSBpbmRpY2F0b3IgKi8KKwl1X2ludDhfdCBtbXM6MTsJCS8qIG1vcmUgbWVzc2FnZXMgdG8gc2VuZCAqLworCXVfaW50OF90IHJwOjE7CQkvKiByZXBseSBwYXRoICovCisJdV9pbnQ4X3QgdWRoaToxOwkvKiB1c2VyIGRhdGEgaGVhZGVyIGluZGljYXRvciAqLworCXVfaW50OF90IHNyaToxOwkJLyogc3RhdHVzIHJlcG9ydCBpbmRpY2F0aW9uICovCisJdV9pbnQ4X3QgKm9yaWdfYWRkcjsJLyogb3JpZ2luYXRpbmcgYWRkcmVzcyAqLworCXVfaW50OF90IHBpZDsJCS8qIHByb3RvY29sIGlkZW50aWZpZXIgKi8KKwl1X2ludDhfdCBkY3M7CQkvKiBkYXRhIGNvZGluZyBzY2hlbWUgKi8KKwkJCQkvKiBzZXJ2aWNlIGNlbnRyZSB0aW1lIHN0YW1wICovCisJdV9pbnQ4X3QgdWRfbGVuOwkvKiB1c2VyIGRhdGEgbGVuZ3RoICovCisJdV9pbnQ4X3QgKnVzZXJfZGF0YTsJLyogdXNlciBkYXRhICovCisKKwl1X2ludDhfdCBtc2dfcmVmOwkvKiBtZXNzYWdlIHJlZmVyZW5jZSAqLworCXVfaW50OF90ICpzbXNjOworfTsKKworc3RydWN0IG1zZ2I7CisKK2ludCBnc20wNDExX3Jjdl9zbXMoc3RydWN0IG1zZ2IgKm1zZywgdV9pbnQ4X3QgbGlua19pZCk7CisKK2ludCBnc200MTFfc2VuZF9zbXNfbGNoYW4oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHN0cnVjdCBnc21fc21zICpzbXMpOworCitzdHJ1Y3QgZ3NtX3NtcyAqc21zX2FsbG9jKHZvaWQpOwordm9pZCBzbXNfZnJlZShzdHJ1Y3QgZ3NtX3NtcyAqc21zKTsKKwordm9pZCBfZ3NtNDExX3Ntc190cmFuc19mcmVlKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKTsKK2ludCBnc200MTFfc2VuZF9zbXNfc3Vic2NyKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJICAgc3RydWN0IGdzbV9zbXMgKnNtcyk7CisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF84MC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtXzA0XzgwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjVhYjFjNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV8wNF84MC5oCkBAIC0wLDAgKzEsMjIgQEAKKyNpZm5kZWYgX0dTTV8wNF84MF9ICisjZGVmaW5lIF9HU01fMDRfODBfSAorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Byb3RvY29sL2dzbV8wNF84MC5oPgorCisjZGVmaW5lIE1BWF9MRU5fVVNTRF9TVFJJTkcJMzEKKworc3RydWN0IHVzc2RfcmVxdWVzdCB7CisJCQljaGFyIHRleHRbTUFYX0xFTl9VU1NEX1NUUklORyArIDFdOworCQkJdV9pbnQ4X3QgdHJhbnNhY3Rpb25faWQ7CisJCQl1X2ludDhfdCBpbnZva2VfaWQ7Cit9OworCitpbnQgZ3NtMDQ4MF9kZWNvZGVfdXNzZF9yZXF1ZXN0KGNvbnN0IHN0cnVjdCBtc2diICptc2csIAorCQkJCXN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcXVlc3QpOyAKK2ludCBnc20wNDgwX3NlbmRfdXNzZF9yZXNwb25zZShjb25zdCBzdHJ1Y3QgbXNnYiAqaW5fbXNnLCBjb25zdCBjaGFyKiByZXNwb25zZV90ZXh0LCAKKwkJCQkJCWNvbnN0IHN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSk7CitpbnQgZ3NtMDQ4MF9zZW5kX3Vzc2RfcmVqZWN0KGNvbnN0IHN0cnVjdCBtc2diICptc2csIAorCQkJCWNvbnN0IHN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcXVlc3QpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2dzbV9kYXRhLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fZGF0YS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZTdmMTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fZGF0YS5oCkBAIC0wLDAgKzEsNzA2IEBACisjaWZuZGVmIF9HU01fREFUQV9ICisjZGVmaW5lIF9HU01fREFUQV9ICisKKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyB7CisJR1NNX1BDSEFOX05PTkUsCisJR1NNX1BDSEFOX0NDQ0gsCisJR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0LAorCUdTTV9QQ0hBTl9UQ0hfRiwKKwlHU01fUENIQU5fVENIX0gsCisJR1NNX1BDSEFOX1NEQ0NIOF9TQUNDSDhDLAorCUdTTV9QQ0hBTl9QRENILAkJLyogR1BSUyBQRENIICovCisJR1NNX1BDSEFOX1RDSF9GX1BEQ0gsCS8qIFRDSC9GIGlmIHVzZWQsIFBEQ0ggb3RoZXJ3aXNlICovCisJR1NNX1BDSEFOX1VOS05PV04sCit9OworCitlbnVtIGdzbV9jaGFuX3QgeworCUdTTV9MQ0hBTl9OT05FLAorCUdTTV9MQ0hBTl9TRENDSCwKKwlHU01fTENIQU5fVENIX0YsCisJR1NNX0xDSEFOX1RDSF9ILAorCUdTTV9MQ0hBTl9VTktOT1dOLAorfTsKKworLyogUlJMUCBtb2RlIG9mIG9wZXJhdGlvbiAqLworZW51bSBycmxwX21vZGUgeworCVJSTFBfTU9ERV9OT05FLAorCVJSTFBfTU9ERV9NU19CQVNFRCwKKwlSUkxQX01PREVfTVNfUFJFRiwKKwlSUkxQX01PREVfQVNTX1BSRUYsCit9OworCisvKiBDaGFubmVsIFJlcXVlc3QgcmVhc29uICovCitlbnVtIGdzbV9jaHJlcV9yZWFzb25fdCB7CisJR1NNX0NIUkVRX1JFQVNPTl9FTUVSRywKKwlHU01fQ0hSRVFfUkVBU09OX1BBRywKKwlHU01fQ0hSRVFfUkVBU09OX0NBTEwsCisJR1NNX0NIUkVRX1JFQVNPTl9MT0NBVElPTl9VUEQsCisJR1NNX0NIUkVRX1JFQVNPTl9PVEhFUiwKK307CisKKyNpbmNsdWRlIDxvc21vY29yZS90aW1lci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbW5jYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2JpdHZlYy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3N0YXRpc3RpY3MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvc21vY29yZS91dGlscy5oPgorCisjZGVmaW5lIFRSWF9OUl9UUwk4CisjZGVmaW5lIFRTX01BWF9MQ0hBTgk4CisKKyNkZWZpbmUgSEFSRENPREVEX0FSRkNOIDEyMworI2RlZmluZSBIQVJEQ09ERURfVFNDCTcKKyNkZWZpbmUgSEFSRENPREVEX0JTSUMJMHgzZgkvKiBOQ0MgPSA3IC8gQkNDID0gNyAqLworCisvKiBmb3IgbXVsdGktZHJvcCBjb25maWcgKi8KKyNkZWZpbmUgSEFSRENPREVEX0JUUzBfVFMJMQorI2RlZmluZSBIQVJEQ09ERURfQlRTMV9UUwk2CisjZGVmaW5lIEhBUkRDT0RFRF9CVFMyX1RTCTExCisKK2VudW0gZ3NtX2hvb2tzIHsKKwlHU01fSE9PS19OTV9TV0xPQUQsCisJR1NNX0hPT0tfUlJfUEFHSU5HLAorfTsKKworZW51bSBnc21fcGFnaW5nX2V2ZW50IHsKKwlHU01fUEFHSU5HX1NVQ0NFRURFRCwKKwlHU01fUEFHSU5HX0VYUElSRUQsCisJR1NNX1BBR0lOR19PT00sCit9OworCitzdHJ1Y3QgbXNnYjsKK3R5cGVkZWYgaW50IGdzbV9jYmZuKHVuc2lnbmVkIGludCBob29rbnVtLAorCQkgICAgIHVuc2lnbmVkIGludCBldmVudCwKKwkJICAgICBzdHJ1Y3QgbXNnYiAqbXNnLAorCQkgICAgIHZvaWQgKmRhdGEsIHZvaWQgKnBhcmFtKTsKKworLyoKKyAqIFVzZSB0aGUgY2hhbm5lbC4gQXMgc2lkZSBlZmZlY3QgdGhlIGxjaGFubmVsIHJlY3ljbGUgdGltZXIKKyAqIHdpbGwgYmUgc3RhcnRlZC4KKyAqLworI2RlZmluZSBMQ0hBTl9SRUxFQVNFX1RJTUVPVVQgMjAsIDAKKyNkZWZpbmUgdXNlX2xjaGFuKGxjaGFuKSBcCisJZG8gewlsY2hhbi0+dXNlX2NvdW50Kys7IFwKKwkJREVCVUdQKERSRUYsICJsY2hhbiAoYnRzPSVkLHRyeD0lZCx0cz0lZCxjaD0lZCkgaW5jcmVhc2VzIHVzYWdlIHRvOiAlZFxuIiwgXAorCQkJbGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIGxjaGFuLT50cy0+dHJ4LT5uciwgbGNoYW4tPnRzLT5uciwgXAorCQkJbGNoYW4tPm5yLCBsY2hhbi0+dXNlX2NvdW50KTsgXAorCQlic2Nfc2NoZWR1bGVfdGltZXIoJmxjaGFuLT5yZWxlYXNlX3RpbWVyLCBMQ0hBTl9SRUxFQVNFX1RJTUVPVVQpOyB9IHdoaWxlKDApOworCisjZGVmaW5lIHB1dF9sY2hhbihsY2hhbikgXAorCWRvIHsgbGNoYW4tPnVzZV9jb3VudC0tOyBcCisJCURFQlVHUChEUkVGLCAibGNoYW4gKGJ0cz0lZCx0cng9JWQsdHM9JWQsY2g9JWQpIGRlY3JlYXNlcyB1c2FnZSB0bzogJWRcbiIsIFwKKwkJCWxjaGFuLT50cy0+dHJ4LT5idHMtPm5yLCBsY2hhbi0+dHMtPnRyeC0+bnIsIGxjaGFuLT50cy0+bnIsIFwKKwkJCWxjaGFuLT5uciwgbGNoYW4tPnVzZV9jb3VudCk7IFwKKwl9IHdoaWxlKDApOworCisKKy8qIGNvbW11bmljYXRpb25zIGxpbmsgd2l0aCBhIEJUUyAqLworc3RydWN0IGdzbV9idHNfbGluayB7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKK307CisKKy8qIFJlYWwgYXV0aGVudGljYXRpb24gaW5mb3JtYXRpb24gY29udGFpbmluZyBLaSAqLworZW51bSBnc21fYXV0aF9hbGdvIHsKKwlBVVRIX0FMR09fTk9ORSwKKwlBVVRIX0FMR09fWE9SLAorCUFVVEhfQUxHT19DT01QMTI4djEsCit9OworCitzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyB7CisJZW51bSBnc21fYXV0aF9hbGdvIGF1dGhfYWxnbzsKKwl1bnNpZ25lZCBpbnQgYTNhOF9raV9sZW47CisJdV9pbnQ4X3QgYTNhOF9raVsxNl07Cit9OworCitzdHJ1Y3QgZ3NtX2F1dGhfdHVwbGUgeworCWludCB1c2VfY291bnQ7CisJaW50IGtleV9zZXE7CisJdV9pbnQ4X3QgcmFuZFsxNl07CisJdV9pbnQ4X3Qgc3Jlc1s0XTsKKwl1X2ludDhfdCBrY1s4XTsKK307CisKKworc3RydWN0IGdzbV9sY2hhbjsKK3N0cnVjdCBnc21fc3Vic2NyaWJlcjsKK3N0cnVjdCBnc21fbW5jYzsKK3N0cnVjdCBydHBfc29ja2V0OworCisvKiBOZXR3b3JrIE1hbmFnZW1lbnQgU3RhdGUgKi8KK3N0cnVjdCBnc21fbm1fc3RhdGUgeworCXVfaW50OF90IG9wZXJhdGlvbmFsOworCXVfaW50OF90IGFkbWluaXN0cmF0aXZlOworCXVfaW50OF90IGF2YWlsYWJpbGl0eTsKK307CisKKy8qCisgKiBMT0NBVElPTiBVUERBVElORyBSRVFVRVNUIHN0YXRlCisgKgorICogT3VyIGN1cnJlbnQgb3BlcmF0aW9uIGlzOgorICoJLSBHZXQgaW1laS90bXNpCisgKgktIEFjY2VwdC9SZWplY3QgYWNjb3JkaW5nIHRvIGdsb2JhbCBwb2xpY3kKKyAqLworc3RydWN0IGdzbV9sb2NfdXBkYXRpbmdfb3BlcmF0aW9uIHsKKyAgICAgICAgc3RydWN0IHRpbWVyX2xpc3QgdXBkYXRpbmdfdGltZXI7CisJdW5zaWduZWQgaW50IHdhaXRpbmdfZm9yX2ltc2kgOiAxOworCXVuc2lnbmVkIGludCB3YWl0aW5nX2Zvcl9pbWVpIDogMTsKK307CisKKy8qIE1heGltdW0gbnVtYmVyIG9mIG5laWdoYm9yIGNlbGxzIHdob3NlIGF2ZXJhZ2Ugd2UgdHJhY2sgKi8KKyNkZWZpbmUgTUFYX05FSUdIX01FQVMJCTEwCisvKiBNYXhpbXVtIHNpemUgb2YgdGhlIGF2ZXJhZ2luZyB3aW5kb3cgZm9yIG5laWdoYm9yIGNlbGxzICovCisjZGVmaW5lIE1BWF9XSU5fTkVJR0hfQVZHCTEwCisKKy8qIHByb2Nlc3NlZCBuZWlnaGJvciBtZWFzdXJlbWVudHMgZm9yIG9uZSBjZWxsICovCitzdHJ1Y3QgbmVpZ2hfbWVhc19wcm9jIHsKKwl1X2ludDE2X3QgYXJmY247CisJdV9pbnQ4X3QgYnNpYzsKKwl1X2ludDhfdCByeGxldltNQVhfV0lOX05FSUdIX0FWR107CisJdW5zaWduZWQgaW50IHJ4bGV2X2NudDsKKwl1X2ludDhfdCBsYXN0X3NlZW5fbnI7Cit9OworCisjZGVmaW5lIE1BWF9BNV9LRVlfTEVOCSgxMjgvOCkKKyNkZWZpbmUgUlNMX0VOQ19BTEdfQTUoeCkJKHgrMSkKKworLyogaXMgdGhlIGRhdGEgbGluayBlc3RhYmxpc2hlZD8gd2hvIGVzdGFibGlzaGVkIGl0PyAqLworI2RlZmluZSBMQ0hBTl9TQVBJX1VOVVNFRAkwCisjZGVmaW5lIExDSEFOX1NBUElfTVMJCTEKKyNkZWZpbmUgTENIQU5fU0FQSV9ORVQJCTIKKworLyogc3RhdGUgb2YgYSBsb2dpY2FsIGNoYW5uZWwgKi8KK2VudW0gZ3NtX2xjaGFuX3N0YXRlIHsKKwlMQ0hBTl9TX05PTkUsCQkvKiBjaGFubmVsIGlzIG5vdCBhY3RpdmUgKi8KKwlMQ0hBTl9TX0FDVF9SRVEsCS8qIGNoYW5uZWwgYWN0aXZhdGluIHJlcXVlc3RlZCAqLworCUxDSEFOX1NfQUNUSVZFLAkJLyogY2hhbm5lbCBpcyBhY3RpdmUgYW5kIG9wZXJhdGlvbmFsICovCisJTENIQU5fU19SRUxfUkVRLAkvKiBjaGFubmVsIHJlbGVhc2UgaGFzIGJlZW4gcmVxdWVzdGVkICovCisJTENIQU5fU19JTkFDVElWRSwJLyogY2hhbm5lbCBpcyBzZXQgaW5hY3RpdmUgKi8KK307CisKK3N0cnVjdCBnc21fbGNoYW4geworCS8qIFRoZSBUUyB0aGF0IHdlJ3JlIHBhcnQgb2YgKi8KKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzOworCS8qIFRoZSBsb2dpY2FsIHN1YnNsb3QgbnVtYmVyIGluIHRoZSBUUyAqLworCXVfaW50OF90IG5yOworCS8qIFRoZSBsb2dpY2FsIGNoYW5uZWwgdHlwZSAqLworCWVudW0gZ3NtX2NoYW5fdCB0eXBlOworCS8qIFJTTCBjaGFubmVsIG1vZGUgKi8KKwllbnVtIHJzbF9jbW9kX3NwZCByc2xfY21vZGU7CisJLyogSWYgVENILCB0cmFmZmljIGNoYW5uZWwgbW9kZSAqLworCWVudW0gZ3NtNDhfY2hhbl9tb2RlIHRjaF9tb2RlOworCS8qIFN0YXRlICovCisJZW51bSBnc21fbGNoYW5fc3RhdGUgc3RhdGU7CisJLyogUG93ZXIgbGV2ZWxzIGZvciBNUyBhbmQgQlRTICovCisJdV9pbnQ4X3QgYnNfcG93ZXI7CisJdV9pbnQ4X3QgbXNfcG93ZXI7CisJLyogRW5jcnlwdGlvbiBpbmZvcm1hdGlvbiAqLworCXN0cnVjdCB7CisJCXVfaW50OF90IGFsZ19pZDsKKwkJdV9pbnQ4X3Qga2V5X2xlbjsKKwkJdV9pbnQ4X3Qga2V5W01BWF9BNV9LRVlfTEVOXTsKKwl9IGVuY3I7CisJLyogQXJlIHdlIHBhcnQgb2YgYSBzcGVjaWFsICJzaWxlbnQiIGNhbGwgKi8KKwlpbnQgc2lsZW50X2NhbGw7CisKKwkvKiBBTVIgYml0cyAqLworCXN0cnVjdCBnc200OF9tdWx0aV9yYXRlX2NvbmYgbXJfY29uZjsKKwkKKwkvKiBUbyB3aG9tIHdlIGFyZSBhbGxvY2F0ZWQgYXQgdGhlIG1vbWVudCAqLworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCisJLyogVGltZXIgc3RhcnRlZCB0byByZWxlYXNlIHRoZSBjaGFubmVsICovCisJc3RydWN0IHRpbWVyX2xpc3QgcmVsZWFzZV90aW1lcjsKKworCXN0cnVjdCB0aW1lcl9saXN0IFQzMTAxOworCisJLyogRXN0YWJsaXNoZWQgZGF0YSBsaW5rIGxheWVyIHNlcnZpY2VzICovCisJdV9pbnQ4X3Qgc2FwaXNbOF07CisKKwkvKgorCSAqIE9wZXJhdGlvbnMgdGhhdCBoYXZlIGEgc3RhdGUgYW5kIG1pZ2h0IGJlIHBlbmRpbmcKKwkgKi8KKwlzdHJ1Y3QgZ3NtX2xvY191cGRhdGluZ19vcGVyYXRpb24gKmxvY19vcGVyYXRpb247CisKKwkvKiB1c2UgY291bnQuIGhvdyBtYW55IHVzZXJzIHVzZSB0aGlzIGNoYW5uZWwgKi8KKwl1bnNpZ25lZCBpbnQgdXNlX2NvdW50OworCisJLyogY2FjaGUgb2YgbGFzdCBtZWFzdXJlbWVudCByZXBvcnRzIG9uIHRoaXMgbGNoYW4gKi8KKwlzdHJ1Y3QgZ3NtX21lYXNfcmVwIG1lYXNfcmVwWzZdOworCWludCBtZWFzX3JlcF9pZHg7CisKKwkvKiB0YWJsZSBvZiBuZWlnaGJvciBjZWxsIG1lYXN1cmVtZW50cyAqLworCXN0cnVjdCBuZWlnaF9tZWFzX3Byb2MgbmVpZ2hfbWVhc1tNQVhfTkVJR0hfTUVBU107CisKKwlzdHJ1Y3QgeworCQl1X2ludDMyX3QgYm91bmRfaXA7CisJCXVfaW50MzJfdCBjb25uZWN0X2lwOworCQl1X2ludDE2X3QgYm91bmRfcG9ydDsKKwkJdV9pbnQxNl90IGNvbm5lY3RfcG9ydDsKKwkJdV9pbnQxNl90IGNvbm5faWQ7CisJCXVfaW50OF90IHJ0cF9wYXlsb2FkMjsKKwkJdV9pbnQ4X3Qgc3BlZWNoX21vZGU7CisJCXN0cnVjdCBydHBfc29ja2V0ICpydHBfc29ja2V0OworCX0gYWJpc19pcDsKK307CisKK3N0cnVjdCBnc21fZTFfc3Vic2xvdCB7CisJLyogTnVtYmVyIG9mIEUxIGxpbmsgKi8KKwl1X2ludDhfdAllMV9ucjsKKwkvKiBOdW1iZXIgb2YgRTEgVFMgaW5zaWRlIEUxIGxpbmsgKi8KKwl1X2ludDhfdAllMV90czsKKwkvKiBTdWItc2xvdCB3aXRoaW4gdGhlIEUxIFRTLCAweGZmIGlmIGZ1bGwgVFMgKi8KKwl1X2ludDhfdAllMV90c19zczsKK307CisKKyNkZWZpbmUgQlRTX1RSWF9GX0FDVElWQVRFRAkweDAwMDEKKy8qIE9uZSBUaW1lc2xvdCBpbiBhIFRSWCAqLworc3RydWN0IGdzbV9idHNfdHJ4X3RzIHsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwkvKiBudW1iZXIgb2YgdGhpcyB0aW1lc2xvdCBhdCB0aGUgVFJYICovCisJdV9pbnQ4X3QgbnI7CisKKwllbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIHBjaGFuOworCisJdW5zaWduZWQgaW50IGZsYWdzOworCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7CisJc3RydWN0IHRsdl9wYXJzZWQgbm1fYXR0cjsKKwl1X2ludDhfdCBubV9jaGFuX2NvbWI7CisKKwkvKiBUbyB3aGljaCBFMSBzdWJzbG90IGFyZSB3ZSBjb25uZWN0ZWQgKi8KKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgZTFfbGluazsKKworCXN0cnVjdCBnc21fbGNoYW4gbGNoYW5bVFNfTUFYX0xDSEFOXTsKK307CisKKy8qIE9uZSBUUlggaW4gYSBCVFMgKi8KK3N0cnVjdCBnc21fYnRzX3RyeCB7CisJLyogbGlzdCBoZWFkZXIgaW4gYnRzLT50cnhfbGlzdCAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCS8qIG51bWJlciBvZiB0aGlzIFRSWCBpbiB0aGUgQlRTICovCisJdV9pbnQ4X3QgbnI7CisJLyogaG93IGRvIHdlIHRhbGsgUlNMIHdpdGggdGhpcyBUUlg/ICovCisJc3RydWN0IGdzbV9lMV9zdWJzbG90IHJzbF9lMV9saW5rOworCXVfaW50OF90IHJzbF90ZWk7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqcnNsX2xpbms7CisKKwlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworCXN0cnVjdCB0bHZfcGFyc2VkIG5tX2F0dHI7CisJc3RydWN0IHsKKwkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwl9IGJiX3RyYW5zYzsKKworCXVfaW50MTZfdCBhcmZjbjsKKwlpbnQgbm9taW5hbF9wb3dlcjsJCS8qIGluIGRCbSAqLworCXVuc2lnbmVkIGludCBtYXhfcG93ZXJfcmVkOwkvKiBpbiBhY3R1YWwgZEIgKi8KKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCB7CisJCQkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwkJCX0gYmJzaWc7CisJCQlzdHJ1Y3QgeworCQkJCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7CisJCQl9IHBhOworCQl9IGJzMTE7CisJfTsKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgdHNbVFJYX05SX1RTXTsKK307CisKK2VudW0gZ3NtX2J0c190eXBlIHsKKwlHU01fQlRTX1RZUEVfVU5LTk9XTiwKKwlHU01fQlRTX1RZUEVfQlMxMSwKKwlHU01fQlRTX1RZUEVfTkFOT0JUUywKK307CisKK3N0cnVjdCBnc21fYnRzX21vZGVsIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCisJZW51bSBnc21fYnRzX3R5cGUgdHlwZTsKKwljb25zdCBjaGFyICpuYW1lOworCisJc3RydWN0IHRsdl9kZWZpbml0aW9uIG5tX2F0dF90bHZkZWY7Cit9OworCisvKioKKyAqIEEgcGVuZGluZyBwYWdpbmcgcmVxdWVzdCAKKyAqLworc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCB7CisJLyogbGlzdF9oZWFkIGZvciBsaXN0IG9mIGFsbCBwYWdpbmcgcmVxdWVzdHMgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBlbnRyeTsKKwkvKiB0aGUgc3Vic2NyaWJlciB3aGljaCB3ZSdyZSBwYWdpbmcuIExhdGVyIGdzbV9wYWdpbmdfcmVxdWVzdAorCSAqIHNob3VsZCBwcm9iYWJseSBiZWNvbWUgYSBwYXJ0IG9mIHRoZSBnc21fc3Vic2NyaWJlciBzdHJ1Y3Q/ICovCisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisJLyogYmFjay1wb2ludGVyIHRvIHRoZSBCVFMgb24gd2hpY2ggd2UgYXJlIHBhZ2luZyAqLworCXN0cnVjdCBnc21fYnRzICpidHM7CisJLyogd2hhdCBraW5kIG9mIGNoYW5uZWwgdHlwZSBkbyB3ZSBhc2sgdGhlIE1TIHRvIGVzdGFibGlzaCAqLworCWludCBjaGFuX3R5cGU7CisKKwkvKiBUaW1lciAzMTEzOiBob3cgbG9uZyBkbyB3ZSB0cnkgdG8gcGFnZT8gKi8KKwlzdHJ1Y3QgdGltZXJfbGlzdCBUMzExMzsKKworCS8qIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBpbiBjYXNlIHBhZ2luZyBjb21wbGV0ZXMgKi8KKwlnc21fY2JmbiAqY2JmbjsKKwl2b2lkICpjYmZuX3BhcmFtOworfTsKKworLyoKKyAqIFRoaXMga2VlcHMgdHJhY2sgb2YgdGhlIHBhZ2luZyBzdGF0dXMgb2Ygb25lIEJUUy4gSXQKKyAqIGluY2x1ZGVzIGEgbnVtYmVyIG9mIHBlbmRpbmcgcmVxdWVzdHMsIGEgYmFjayBwb2ludGVyCisgKiB0byB0aGUgZ3NtX2J0cywgYSB0aW1lciBhbmQgc29tZSBtb3JlIHN0YXRlLgorICovCitzdHJ1Y3QgZ3NtX2J0c19wYWdpbmdfc3RhdGUgeworCS8qIHBlbmRpbmcgcmVxdWVzdHMgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBwZW5kaW5nX3JlcXVlc3RzOworCXN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKmxhc3RfcmVxdWVzdDsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJc3RydWN0IHRpbWVyX2xpc3Qgd29ya190aW1lcjsKKworCS8qIGxvYWQgKi8KKwl1X2ludDE2X3QgYXZhaWxhYmxlX3Nsb3RzOworfTsKKworc3RydWN0IGdzbV9lbnZhYnRzZSB7CisJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKK307CisKK3N0cnVjdCBnc21fYnRzX2dwcnNfbnN2YyB7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlpbnQgaWQ7CisJdV9pbnQxNl90IG5zdmNpOworCXVfaW50MTZfdCBsb2NhbF9wb3J0OworCXVfaW50MTZfdCByZW1vdGVfcG9ydDsKKwl1X2ludDMyX3QgcmVtb3RlX2lwOworCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7Cit9OworCisvKiBPbmUgQlRTICovCitzdHJ1Y3QgZ3NtX2J0cyB7CisJLyogbGlzdCBoZWFkZXIgaW4gbmV0LT5idHNfbGlzdCAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldHdvcms7CisJLyogbnVtYmVyIG9mIHRocyBCVFMgaW4gbmV0d29yayAqLworCXVfaW50OF90IG5yOworCS8qIENlbGwgSWRlbnRpdHkgKi8KKwl1X2ludDE2X3QgY2VsbF9pZGVudGl0eTsKKwkvKiBsb2NhdGlvbiBhcmVhIGNvZGUgb2YgdGhpcyBCVFMgKi8KKwl1X2ludDE2X3QgbG9jYXRpb25fYXJlYV9jb2RlOworCS8qIFRyYWluaW5nIFNlcXVlbmNlIENvZGUgKi8KKwl1X2ludDhfdCB0c2M7CisJLyogQmFzZSBTdGF0aW9uIElkZW50aWZpY2F0aW9uIENvZGUgKEJTSUMpICovCisJdV9pbnQ4X3QgYnNpYzsKKwkvKiB0eXBlIG9mIEJUUyAqLworCWVudW0gZ3NtX2J0c190eXBlIHR5cGU7CisJc3RydWN0IGdzbV9idHNfbW9kZWwgKm1vZGVsOworCWVudW0gZ3NtX2JhbmQgYmFuZDsKKwkvKiBzaG91bGQgdGhlIGNoYW5uZWwgYWxsb2NhdG9yIGFsbG9jYXRlIGNoYW5uZWxzIGZyb20gaGlnaCBUUlggdG8gVFJYMCwKKwkgKiByYXRoZXIgdGhhbiBzdGFydGluZyBmcm9tIFRSWDAgYW5kIGdvIHVwd2FyZHM/ICovCisJaW50IGNoYW5fYWxsb2NfcmV2ZXJzZTsKKwkvKiBtYXhpbXVtIFR4IHBvd2VyIHRoYXQgdGhlIE1TIGlzIHBlcm1pdHRlZCB0byB1c2UgaW4gdGhpcyBjZWxsICovCisJaW50IG1zX21heF9wb3dlcjsKKworCS8qIGhvdyBkbyB3ZSB0YWxrIE9NTCB3aXRoIHRoaXMgVFJYPyAqLworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCBvbWxfZTFfbGluazsKKwl1X2ludDhfdCBvbWxfdGVpOworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKm9tbF9saW5rOworCisJLyogQWJpcyBuZXR3b3JrIG1hbmFnZW1lbnQgTyZNIGhhbmRsZSAqLworCXN0cnVjdCBhYmlzX25tX2ggKm5taDsKKwlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworCXN0cnVjdCB0bHZfcGFyc2VkIG5tX2F0dHI7CisKKwkvKiBudW1iZXIgb2YgdGhpcyBCVFMgb24gZ2l2ZW4gRTEgbGluayAqLworCXVfaW50OF90IGJ0c19ucjsKKworCS8qIHBhZ2luZyBzdGF0ZSBhbmQgY29udHJvbCAqLworCXN0cnVjdCBnc21fYnRzX3BhZ2luZ19zdGF0ZSBwYWdpbmc7CisKKwkvKiBDQ0NIIGlzIG9uIEMwICovCisJc3RydWN0IGdzbV9idHNfdHJ4ICpjMDsKKworCXN0cnVjdCB7CisJCXN0cnVjdCBnc21fbm1fc3RhdGUgbm1fc3RhdGU7CisJfSBzaXRlX21ncjsKKworCS8qIHBhcmFtZXRlcnMgZnJvbSB3aGljaCB3ZSBidWlsZCBTWVNURU0gSU5GT1JNQVRJT04gKi8KKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgZ3NtNDhfcmFjaF9jb250cm9sIHJhY2hfY29udHJvbDsKKwkJdV9pbnQ4X3QgbmNjX3Blcm1pdHRlZDsKKwkJc3RydWN0IGdzbTQ4X2NlbGxfc2VsX3BhciBjZWxsX3NlbF9wYXI7CisJCXN0cnVjdCBnc200OF9jZWxsX29wdGlvbnMgY2VsbF9vcHRpb25zOworCQlzdHJ1Y3QgZ3NtNDhfY29udHJvbF9jaGFubmVsX2Rlc2NyIGNoYW5fZGVzYzsKKwkJc3RydWN0IGJpdHZlYyBuZWlnaF9saXN0OworCQlzdHJ1Y3QgYml0dmVjIGNlbGxfYWxsb2M7CisJCXN0cnVjdCB7CisJCQkvKiBiaXRtYXNrIGxhcmdlIGVub3VnaCBmb3IgYWxsIHBvc3NpYmxlIEFSRkNOJ3MgKi8KKwkJCXVfaW50OF90IG5laWdoX2xpc3RbMTAyNC84XTsKKwkJCXVfaW50OF90IGNlbGxfYWxsb2NbMTAyNC84XTsKKwkJfSBkYXRhOworCX0gc2lfY29tbW9uOworCisJLyogaXAuYWNjZXNzcyBVbml0IElEJ3MgaGF2ZSBTaXRlL0JUUy9UUlggbGF5b3V0ICovCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdV9pbnQxNl90IHNpdGVfaWQ7CisJCQl1X2ludDE2X3QgYnRzX2lkOworCQkJdV9pbnQzMl90IGZsYWdzOworCQl9IGlwX2FjY2VzczsKKwkJc3RydWN0IHsKKwkJCXN0cnVjdCB7CisJCQkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwkJCX0gY2NsazsKKwkJCXN0cnVjdCB7CisJCQkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwkJCX0gcmFjazsKKwkJCXN0cnVjdCBnc21fZW52YWJ0c2UgZW52YWJ0c2VbNF07CisJCX0gYnMxMTsKKwl9OworCisJLyogTm90IGVudGlyZWx5IHN1cmUgaG93IGlwLmFjY2VzcyBzcGVjaWZpYyB0aGlzIGlzICovCisJc3RydWN0IHsKKwkJaW50IGVuYWJsZWQ7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgZ3NtX25tX3N0YXRlIG5tX3N0YXRlOworCQkJdV9pbnQxNl90IG5zZWk7CisJCX0gbnNlOworCQlzdHJ1Y3QgeworCQkJc3RydWN0IGdzbV9ubV9zdGF0ZSBubV9zdGF0ZTsKKwkJCXVfaW50MTZfdCBidmNpOworCQl9IGNlbGw7CisJCXN0cnVjdCBnc21fYnRzX2dwcnNfbnN2YyBuc3ZjWzJdOworCQl1X2ludDhfdCByYWM7CisJfSBncHJzOworCQorCS8qIHRyYW5zY2VpdmVycyAqLworCWludCBudW1fdHJ4OworCXN0cnVjdCBsbGlzdF9oZWFkIHRyeF9saXN0OworfTsKKworLyogU29tZSBzdGF0aXN0aWNzIG9mIG91ciBuZXR3b3JrICovCitzdHJ1Y3QgZ3NtbmV0X3N0YXRzIHsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgY291bnRlciAqdG90YWw7CisJCXN0cnVjdCBjb3VudGVyICpub19jaGFubmVsOworCX0gY2hyZXE7CisJc3RydWN0IHsKKwkJc3RydWN0IGNvdW50ZXIgKmF0dGVtcHRlZDsKKwkJc3RydWN0IGNvdW50ZXIgKm5vX2NoYW5uZWw7CS8qIG5vIGNoYW5uZWwgYXZhaWxhYmxlICovCisJCXN0cnVjdCBjb3VudGVyICp0aW1lb3V0OwkJLyogVDMxMDMgdGltZW91dCAqLworCQlzdHJ1Y3QgY291bnRlciAqY29tcGxldGVkOwkvKiBITyBDT01QTCByZWNlaXZlZCAqLworCQlzdHJ1Y3QgY291bnRlciAqZmFpbGVkOwkJLyogSE8gRkFJTCByZWNlaXZlZCAqLworCX0gaGFuZG92ZXI7CisJc3RydWN0IHsKKwkJc3RydWN0IGNvdW50ZXIgKmF0dGFjaDsKKwkJc3RydWN0IGNvdW50ZXIgKm5vcm1hbDsKKwkJc3RydWN0IGNvdW50ZXIgKnBlcmlvZGljOworCQlzdHJ1Y3QgY291bnRlciAqZGV0YWNoOworCX0gbG9jX3VwZF90eXBlOworCXN0cnVjdCB7CisJCXN0cnVjdCBjb3VudGVyICpyZWplY3Q7CisJCXN0cnVjdCBjb3VudGVyICphY2NlcHQ7CisJfSBsb2NfdXBkX3Jlc3A7CisJc3RydWN0IHsKKwkJc3RydWN0IGNvdW50ZXIgKmF0dGVtcHRlZDsKKwkJc3RydWN0IGNvdW50ZXIgKmRldGFjaGVkOworCQlzdHJ1Y3QgY291bnRlciAqY29tcGxldGVkOworCQlzdHJ1Y3QgY291bnRlciAqZXhwaXJlZDsKKwl9IHBhZ2luZzsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgY291bnRlciAqc3VibWl0dGVkOyAvKiBNTyBTTVMgc3VibWlzc2lvbnMgKi8KKwkJc3RydWN0IGNvdW50ZXIgKm5vX3JlY2VpdmVyOworCQlzdHJ1Y3QgY291bnRlciAqZGVsaXZlcmVkOyAvKiBNVCBTTVMgZGVsaXZlcmllcyAqLworCQlzdHJ1Y3QgY291bnRlciAqcnBfZXJyX21lbTsKKwkJc3RydWN0IGNvdW50ZXIgKnJwX2Vycl9vdGhlcjsKKwl9IHNtczsKKwlzdHJ1Y3QgeworCQlzdHJ1Y3QgY291bnRlciAqZGlhbGxlZDsJLyogdG90YWwgbnVtYmVyIG9mIGRpYWxsZWQgY2FsbHMgKi8KKwkJc3RydWN0IGNvdW50ZXIgKmFsZXJ0ZWQ7CS8qIHdlIGFsZXJ0ZWQgdGhlIG90aGVyIGVuZCAqLworCQlzdHJ1Y3QgY291bnRlciAqY29ubmVjdGVkOy8qIGhvdyBtYW55IGNhbGxzIHdlcmUgYWNjZXB0ZWQgKi8KKwl9IGNhbGw7Cit9OworCitlbnVtIGdzbV9hdXRoX3BvbGljeSB7CisJR1NNX0FVVEhfUE9MSUNZX0NMT1NFRCwgLyogb25seSBzdWJzY3JpYmVycyBhdXRob3JpemVkIGluIERCICovCisJR1NNX0FVVEhfUE9MSUNZX0FDQ0VQVF9BTEwsIC8qIGFjY2VwdCBldmVyeW9uZSwgZXZlbiBpZiBub3QgYXV0aG9yaXplZCBpbiBEQiAqLworCUdTTV9BVVRIX1BPTElDWV9UT0tFTiwgLyogYWNjZXB0IGZpcnN0LCBzZW5kIHRva2VuIHBlciBzbXMsIHRoZW4gcmV2b2tlIGF1dGhvcml6YXRpb24gKi8KK307CisKKyNkZWZpbmUgR1NNX1QzMTAxX0RFRkFVTFQgMTAKKyNkZWZpbmUgR1NNX1QzMTEzX0RFRkFVTFQgNjAKKworc3RydWN0IGdzbV9uZXR3b3JrIHsKKwkvKiBnbG9iYWwgcGFyYW1ldGVycyAqLworCXVfaW50MTZfdCBjb3VudHJ5X2NvZGU7CisJdV9pbnQxNl90IG5ldHdvcmtfY29kZTsKKwljaGFyICpuYW1lX2xvbmc7CisJY2hhciAqbmFtZV9zaG9ydDsKKwllbnVtIGdzbV9hdXRoX3BvbGljeSBhdXRoX3BvbGljeTsKKwllbnVtIGdzbTQ4X3JlamVjdF92YWx1ZSByZWplY3RfY2F1c2U7CisJaW50IGE1X2VuY3J5cHRpb247CisJaW50IG5lY2k7CisJaW50IHNlbmRfbW1faW5mbzsKKwlzdHJ1Y3QgeworCQlpbnQgYWN0aXZlOworCQkvKiBXaW5kb3cgUlhMRVYgYXZlcmFnaW5nICovCisJCXVuc2lnbmVkIGludCB3aW5fcnhsZXZfYXZnOwkvKiBudW1iZXIgb2YgU0FDQ0ggZnJhbWVzICovCisJCS8qIFdpbmRvdyBSWFFVQUwgYXZlcmFnaW5nICovCisJCXVuc2lnbmVkIGludCB3aW5fcnhxdWFsX2F2ZzsJLyogbnVtYmVyIG9mIFNBQ0NIIGZyYW1lcyAqLworCQkvKiBXaW5kb3cgUlhMRVYgbmVpZ2hib3VyaW5nIGNlbGxzIGF2ZXJhZ2luZyAqLworCQl1bnNpZ25lZCBpbnQgd2luX3J4bGV2X2F2Z19uZWlnaDsgLyogbnVtYmVyIG9mIFNBQ0NIIGZyYW1lcyAqLworCisJCS8qIGhvdyBvZnRlbiBzaG91bGQgd2UgY2hlY2sgZm9yIHBvd2VyIGJ1ZGdldCBITyAqLworCQl1bnNpZ25lZCBpbnQgcHdyX2ludGVydmFsOwkvKiBTQUNDSCBmcmFtZXMgKi8KKwkJLyogaG93IG11Y2ggYmV0dGVyIGRvZXMgYSBuZWlnaGJvciBjZWxsIGhhdmUgdG8gYmUgPyAqLworCQl1bnNpZ25lZCBpbnQgcHdyX2h5c3RlcmVzaXM7CS8qIGRCbSAqLworCQkvKiBtYXhpbXVtIGRpc3RhY25lIGJlZm9yZSB3ZSB0cnkgYSBoYW5kb3ZlciAqLworCQl1bnNpZ25lZCBpbnQgbWF4X2Rpc3RhbmNlOwkvKiBUQSB2YWx1ZXMgKi8KKwl9IGhhbmRvdmVyOworCisJc3RydWN0IGdzbW5ldF9zdGF0cyBzdGF0czsKKworCS8qIGxheWVyIDQgKi8KKwlpbnQgKCptbmNjX3JlY3YpIChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgaW50IG1zZ190eXBlLCB2b2lkICphcmcpOworCXN0cnVjdCBsbGlzdF9oZWFkIHVwcXVldWU7CisJc3RydWN0IGxsaXN0X2hlYWQgdHJhbnNfbGlzdDsKKworCXVuc2lnbmVkIGludCBudW1fYnRzOworCXN0cnVjdCBsbGlzdF9oZWFkIGJ0c19saXN0OworCisJLyogdGltZXIgdmFsdWVzICovCisJaW50IFQzMTAxOworCWludCBUMzEwMzsKKwlpbnQgVDMxMDU7CisJaW50IFQzMTA3OworCWludCBUMzEwOTsKKwlpbnQgVDMxMTE7CisJaW50IFQzMTEzOworCWludCBUMzExNTsKKwlpbnQgVDMxMTc7CisJaW50IFQzMTE5OworCWludCBUMzE0MTsKKworCS8qIFJhZGlvIFJlc291cmNlIExvY2F0aW9uIFByb3RvY29sIChUUyAwNC4zMSkgKi8KKwlzdHJ1Y3QgeworCQllbnVtIHJybHBfbW9kZSBtb2RlOworCX0gcnJscDsKK307CisKKyNkZWZpbmUgU01TX0hEUl9TSVpFCTEyOAorI2RlZmluZSBTTVNfVEVYVF9TSVpFCTI1Ngorc3RydWN0IGdzbV9zbXMgeworCXVuc2lnbmVkIGxvbmcgbG9uZyBpZDsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnNlbmRlcjsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnJlY2VpdmVyOworCisJdW5zaWduZWQgbG9uZyB2YWxpZGl0eV9taW51dGVzOworCXVfaW50OF90IHJlcGx5X3BhdGhfcmVxOworCXVfaW50OF90IHN0YXR1c19yZXBfcmVxOworCXVfaW50OF90IHVkX2hkcl9pbmQ7CisJdV9pbnQ4X3QgcHJvdG9jb2xfaWQ7CisJdV9pbnQ4X3QgZGF0YV9jb2Rpbmdfc2NoZW1lOworCXVfaW50OF90IG1zZ19yZWY7CisJY2hhciBkZXN0X2FkZHJbMjArMV07CS8qIERBIExWIGlzIDEyIGJ5dGVzIG1heCwgaS5lLiAxMCBieXRlcworCQkJCSAqIEJDRCA9PSAyMCBieXRlcyBzdHJpbmcgKi8KKwl1X2ludDhfdCB1c2VyX2RhdGFfbGVuOworCXVfaW50OF90IHVzZXJfZGF0YVtTTVNfVEVYVF9TSVpFXTsKKworCWNoYXIgdGV4dFtTTVNfVEVYVF9TSVpFXTsKK307CisKKworc3RydWN0IGdzbV9uZXR3b3JrICpnc21fbmV0d29ya19pbml0KHVfaW50MTZfdCBjb3VudHJ5X2NvZGUsIHVfaW50MTZfdCBuZXR3b3JrX2NvZGUsCisJCQkJICAgICBpbnQgKCptbmNjX3JlY3YpKHN0cnVjdCBnc21fbmV0d29yayAqLCBpbnQsIHZvaWQgKikpOworc3RydWN0IGdzbV9idHMgKmdzbV9idHNfYWxsb2Moc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGVudW0gZ3NtX2J0c190eXBlIHR5cGUsCisJCQkgICAgICB1X2ludDhfdCB0c2MsIHVfaW50OF90IGJzaWMpOworc3RydWN0IGdzbV9idHNfdHJ4ICpnc21fYnRzX3RyeF9hbGxvYyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKK2ludCBnc21fc2V0X2J0c190eXBlKHN0cnVjdCBnc21fYnRzICpidHMsIGVudW0gZ3NtX2J0c190eXBlIHR5cGUpOworCitzdHJ1Y3QgZ3NtX2J0cyAqZ3NtX2J0c19udW0oc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGludCBudW0pOworCisvKiBHZXQgcmVmZXJlbmNlIHRvIGEgbmVpZ2hib3IgY2VsbCBvbiBhIGdpdmVuIEJDQ0ggQVJGQ04gKi8KK3N0cnVjdCBnc21fYnRzICpnc21fYnRzX25laWdoYm9yKGNvbnN0IHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJIHVfaW50MTZfdCBhcmZjbiwgdV9pbnQ4X3QgYnNpYyk7CisKK3N0cnVjdCBnc21fYnRzX3RyeCAqZ3NtX2J0c190cnhfbnVtKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBudW0pOworCitjb25zdCBjaGFyICpnc21fcGNoYW5fbmFtZShlbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIGMpOworZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBnc21fcGNoYW5fcGFyc2UoY29uc3QgY2hhciAqbmFtZSk7Citjb25zdCBjaGFyICpnc21fbGNoYW50X25hbWUoZW51bSBnc21fY2hhbl90IGMpOworY29uc3QgY2hhciAqZ3NtX2NocmVxX25hbWUoZW51bSBnc21fY2hyZXFfcmVhc29uX3QgYyk7CitjaGFyICpnc21fdHJ4X25hbWUoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpOworY2hhciAqZ3NtX3RzX25hbWUoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyk7CitjaGFyICpnc21fbGNoYW5fbmFtZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbik7Citjb25zdCBjaGFyICpnc21fbGNoYW5zX25hbWUoZW51bSBnc21fbGNoYW5fc3RhdGUgcyk7CisKK2VudW0gZ3NtX2UxX2V2ZW50IHsKKwlFVlRfRTFfTk9ORSwKKwlFVlRfRTFfVEVJX1VQLAorCUVWVF9FMV9URUlfRE4sCit9OworCit2b2lkIHNldF90c19lMWxpbmsoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cywgdV9pbnQ4X3QgZTFfbnIsCisJCSAgIHVfaW50OF90IGUxX3RzLCB1X2ludDhfdCBlMV90c19zcyk7CitlbnVtIGdzbV9idHNfdHlwZSBwYXJzZV9idHN0eXBlKGNvbnN0IGNoYXIgKmFyZyk7Citjb25zdCBjaGFyICpidHN0eXBlMnN0cihlbnVtIGdzbV9idHNfdHlwZSB0eXBlKTsKK3N0cnVjdCBnc21fYnRzX3RyeCAqZ3NtX2J0c190cnhfYnlfbnIoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IG5yKTsKK3N0cnVjdCBnc21fYnRzICpnc21fYnRzX2J5X2xhYyhzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgdW5zaWduZWQgaW50IGxhYywKKwkJCQlzdHJ1Y3QgZ3NtX2J0cyAqc3RhcnRfYnRzKTsKKworZXh0ZXJuIHZvaWQgKnRhbGxfYnNjX2N0eDsKK2V4dGVybiBpbnQgaXBhY2NfcnRwX2RpcmVjdDsKKworc3RhdGljIGlubGluZSBpbnQgaXNfaXBhY2Nlc3NfYnRzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3dpdGNoIChidHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50IGlzX3NpZW1lbnNfYnRzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3dpdGNoIChidHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCitlbnVtIGdzbV9hdXRoX3BvbGljeSBnc21fYXV0aF9wb2xpY3lfcGFyc2UoY29uc3QgY2hhciAqYXJnKTsKK2NvbnN0IGNoYXIgKmdzbV9hdXRoX3BvbGljeV9uYW1lKGVudW0gZ3NtX2F1dGhfcG9saWN5IHBvbGljeSk7CisKK2VudW0gcnJscF9tb2RlIHJybHBfbW9kZV9wYXJzZShjb25zdCBjaGFyICphcmcpOworY29uc3QgY2hhciAqcnJscF9tb2RlX25hbWUoZW51bSBycmxwX21vZGUgbW9kZSk7CisKK3ZvaWQgZ3NtX3RyeF9sb2NrX3JmKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCBpbnQgbG9ja2VkKTsKKworLyogQSBwYXJzZWQgR1BSUyByb3V0aW5nIGFyZWEgKi8KK3N0cnVjdCBncHJzX3JhX2lkIHsKKwl1X2ludDE2X3QJbW5jOworCXVfaW50MTZfdAltY2M7CisJdV9pbnQxNl90CWxhYzsKKwl1X2ludDhfdAlyYWM7Cit9OworCitpbnQgZ3NtNDhfcmFfaWRfYnlfYnRzKHVfaW50OF90ICpidWYsIHN0cnVjdCBnc21fYnRzICpidHMpOwordm9pZCBncHJzX3JhX2lkX2J5X2J0cyhzdHJ1Y3QgZ3Byc19yYV9pZCAqcmFpZCwgc3RydWN0IGdzbV9idHMgKmJ0cyk7CitzdHJ1Y3QgZ3NtX21lYXNfcmVwICpsY2hhbl9uZXh0X21lYXNfcmVwKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKKworaW50IGdzbV9idHNfbW9kZWxfcmVnaXN0ZXIoc3RydWN0IGdzbV9idHNfbW9kZWwgKm1vZGVsKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9nc21fc3Vic2NyaWJlci5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjUzOTk2Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaApAQCAtMCwwICsxLDk1IEBACisjaWZuZGVmIF9HU01fU1VCU0NSX0gKKyNkZWZpbmUgX0dTTV9TVUJTQ1JfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSAiZ3NtX2RhdGEuaCIKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKworI2RlZmluZSBHU01fSU1FSV9MRU5HVEggMTcKKyNkZWZpbmUgR1NNX0lNU0lfTEVOR1RIIDE3CisjZGVmaW5lIEdTTV9OQU1FX0xFTkdUSCAxMjgKKworI2RlZmluZSBHU01fRVhURU5TSU9OX0xFTkdUSCAxNSAvKiBNU0lTRE4gY2FuIG9ubHkgYmUgMTUgZGlnaXRzIGxlbmd0aCAqLworI2RlZmluZSBHU01fTUlOX0VYVEVOIDIwMDAwCisjZGVmaW5lIEdTTV9NQVhfRVhURU4gNDk5OTkKKworLyogcmVzZXJ2ZWQgYWNjb3JkaW5nIHRvIEdTTSAwMy4wMyDCpyAyLjQgKi8KKyNkZWZpbmUgR1NNX1JFU0VSVkVEX1RNU0kgICAweEZGRkZGRkZGCisKKworI2RlZmluZSBHU01fU1VCU0NSSUJFUl9GSVJTVF9DT05UQUNUCTB4MDAwMDAwMDEKKyNkZWZpbmUgdG1zaV9mcm9tX3N0cmluZyhzdHIpIHN0cnRvdWwoc3RyLCBOVUxMLCAxMCkKKworc3RydWN0IGdzbV9lcXVpcG1lbnQgeworCWxvbmcgbG9uZyB1bnNpZ25lZCBpbnQgaWQ7CisJY2hhciBpbWVpW0dTTV9JTUVJX0xFTkdUSF07CisJY2hhciBuYW1lW0dTTV9OQU1FX0xFTkdUSF07CisKKwlzdHJ1Y3QgZ3NtNDhfY2xhc3NtYXJrMSBjbGFzc21hcmsxOworCXVfaW50OF90IGNsYXNzbWFyazJfbGVuOworCXVfaW50OF90IGNsYXNzbWFyazJbM107CisJdV9pbnQ4X3QgY2xhc3NtYXJrM19sZW47CisJdV9pbnQ4X3QgY2xhc3NtYXJrM1sxNF07Cit9OworCitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgeworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0OworCWxvbmcgbG9uZyB1bnNpZ25lZCBpbnQgaWQ7CisJY2hhciBpbXNpW0dTTV9JTVNJX0xFTkdUSF07CisJdV9pbnQzMl90IHRtc2k7CisJdV9pbnQxNl90IGxhYzsKKwljaGFyIG5hbWVbR1NNX05BTUVfTEVOR1RIXTsKKwljaGFyIGV4dGVuc2lvbltHU01fRVhURU5TSU9OX0xFTkdUSF07CisJaW50IGF1dGhvcml6ZWQ7CisKKwkvKiBUZW1wb3JhcnkgZmllbGQgd2hpY2ggaXMgbm90IHN0b3JlZCBpbiB0aGUgREIvSExSICovCisJdV9pbnQzMl90IGZsYWdzOworCisJLyogRXZlcnkgdXNlciBjYW4gb25seSBoYXZlIG9uZSBlcXVpcG1lbnQgaW4gdXNlIGF0IGFueSBnaXZlbgorCSAqIHBvaW50IGluIHRpbWUgKi8KKwlzdHJ1Y3QgZ3NtX2VxdWlwbWVudCBlcXVpcG1lbnQ7CisKKwkvKiBmb3IgaW50ZXJuYWwgbWFuYWdlbWVudCAqLworCWludCB1c2VfY291bnQ7CisJc3RydWN0IGxsaXN0X2hlYWQgZW50cnk7CisKKwkvKiBwZW5kaW5nIHJlcXVlc3RzICovCisJaW50IGluX2NhbGxiYWNrOworCXN0cnVjdCBsbGlzdF9oZWFkIHJlcXVlc3RzOworfTsKKworZW51bSBnc21fc3Vic2NyaWJlcl9maWVsZCB7CisJR1NNX1NVQlNDUklCRVJfSU1TSSwKKwlHU01fU1VCU0NSSUJFUl9UTVNJLAorCUdTTV9TVUJTQ1JJQkVSX0VYVEVOU0lPTiwKKwlHU01fU1VCU0NSSUJFUl9JRCwKK307CisKK2VudW0gZ3NtX3N1YnNjcmliZXJfdXBkYXRlX3JlYXNvbiB7CisJR1NNX1NVQlNDUklCRVJfVVBEQVRFX0FUVEFDSEVELAorCUdTTV9TVUJTQ1JJQkVSX1VQREFURV9ERVRBQ0hFRCwKKwlHU01fU1VCU0NSSUJFUl9VUERBVEVfRVFVSVBNRU5ULAorfTsKKworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfZ2V0KHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX3B1dChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcik7CitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcl9nZXRfYnlfdG1zaShzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJICB1X2ludDMyX3QgdG1zaSk7CitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcl9nZXRfYnlfaW1zaShzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJICBjb25zdCBjaGFyICppbXNpKTsKK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2dldF9ieV9leHRlbnNpb24oc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCSAgICAgICBjb25zdCBjaGFyICpleHQpOworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfZ2V0X2J5X2lkKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LAorCQkJCQl1bnNpZ25lZCBsb25nIGxvbmcgaWQpOworaW50IHN1YnNjcl91cGRhdGUoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgcmVhc29uKTsKK3ZvaWQgc3Vic2NyX3B1dF9jaGFubmVsKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKK3ZvaWQgc3Vic2NyX2dldF9jaGFubmVsKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR5cGUsIGdzbV9jYmZuICpjYmZuLCB2b2lkICpwYXJhbSk7CisKK2NoYXIgKnN1YnNjcl9uYW1lKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKTsKKworLyogaW50ZXJuYWwgKi8KK3N0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyX2FsbG9jKHZvaWQpOworZXh0ZXJuIHN0cnVjdCBsbGlzdF9oZWFkIGFjdGl2ZV9zdWJzY3JpYmVyczsKKworI2VuZGlmIC8qIF9HU01fU1VCU0NSX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL2hhbmRvdmVyLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9oYW5kb3Zlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYjFiMDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9oYW5kb3Zlci5oCkBAIC0wLDAgKzEsOCBAQAorI2lmbmRlZiBfSEFORE9WRVJfSAorI2RlZmluZSBfSEFORE9WRVJfSAorLyogSGFuZCBvdmVyIHRoZSBzcGVjaWZpZWQgbG9naWNhbCBjaGFubmVsIHRvIHRoZSBzcGVjaWZpZWQgbmV3IEJUUy4KKyAqIFRoaXMgaXMgdGhlIG1haW4gZW50cnkgcG9pbnQgZm9yIHRoZSBhY3R1YWwgaGFuZG92ZXIgYWxnb3JpdGhtLAorICogYWZ0ZXIgaXQgaGFzIGRlY2lkZWQgaXQgd2FudHMgdG8gaW5pdGlhdGUgSE8gdG8gYSBzcGVjaWZpYyBCVFMgKi8KK2ludCBic2NfaGFuZG92ZXJfc3RhcnQoc3RydWN0IGdzbV9sY2hhbiAqb2xkX2xjaGFuLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKTsKKworI2VuZGlmIC8qIF9IQU5ET1ZFUl9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9pcGFjY2Vzcy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvaXBhY2Nlc3MuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjI0OGFhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvaXBhY2Nlc3MuaApAQCAtMCwwICsxLDEwNyBAQAorI2lmbmRlZiBfSVBBQ0NFU1NfSAorI2RlZmluZSBfSVBBQ0NFU1NfSAorCisjaW5jbHVkZSAiZTFfaW5wdXQuaCIKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKworI2RlZmluZSBJUEFfVENQX1BPUlRfT01MCTMwMDIKKyNkZWZpbmUgSVBBX1RDUF9QT1JUX1JTTAkzMDAzCisKK3N0cnVjdCBpcGFjY2Vzc19oZWFkIHsKKwl1X2ludDE2X3QgbGVuOwkvKiBuZXR3b3JrIGJ5dGUgb3JkZXIgKi8KKwl1X2ludDhfdCBwcm90bzsKKwl1X2ludDhfdCBkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisKK2VudW0gaXBhY2Nlc3NfcHJvdG8geworCUlQQUNfUFJPVE9fUlNMCQk9IDB4MDAsCisJSVBBQ19QUk9UT19JUEFDQ0VTUwk9IDB4ZmUsCisJSVBBQ19QUk9UT19TQ0NQCQk9IDB4ZmQsCisJSVBBQ19QUk9UT19PTUwJCT0gMHhmZiwKK307CisKK2VudW0gaXBhY2Nlc3NfbXNndHlwZSB7CisJSVBBQ19NU0dUX1BJTkcJCT0gMHgwMCwKKwlJUEFDX01TR1RfUE9ORwkJPSAweDAxLAorCUlQQUNfTVNHVF9JRF9HRVQJPSAweDA0LAorCUlQQUNfTVNHVF9JRF9SRVNQCT0gMHgwNSwKKwlJUEFDX01TR1RfSURfQUNLCT0gMHgwNiwKK307CisKK2VudW0gaXBhY2Nlc3NfaWRfdGFncyB7CisJSVBBQ19JRFRBR19TRVJOUgkJPSAweDAwLAorCUlQQUNfSURUQUdfVU5JVE5BTUUJCT0gMHgwMSwKKwlJUEFDX0lEVEFHX0xPQ0FUSU9OMQkJPSAweDAyLAorCUlQQUNfSURUQUdfTE9DQVRJT04yCQk9IDB4MDMsCisJSVBBQ19JRFRBR19FUVVJUFZFUlMJCT0gMHgwNCwKKwlJUEFDX0lEVEFHX1NXVkVSU0lPTgkJPSAweDA1LAorCUlQQUNfSURUQUdfSVBBRERSCQk9IDB4MDYsCisJSVBBQ19JRFRBR19NQUNBRERSCQk9IDB4MDcsCisJSVBBQ19JRFRBR19VTklUCQkJPSAweDA4LAorfTsKKworaW50IGlwYWNjZXNzX2Nvbm5lY3Qoc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUsIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2EpOworCisvKgorICogbWV0aG9kcyBmb3IgcGFyc2luZyBhbmQgc2VuZGluZyBhIG1lc3NhZ2UKKyAqLworaW50IGlwYWNjZXNzX3Jjdm1zZ19iYXNlKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBic2NfZmQgKmJmZCk7CitzdHJ1Y3QgbXNnYiAqaXBhY2Nlc3NfcmVhZF9tc2coc3RydWN0IGJzY19mZCAqYmZkLCBpbnQgKmVycm9yKTsKK3ZvaWQgaXBhY2Nlc3NfcHJlcGVuZF9oZWFkZXIoc3RydWN0IG1zZ2IgKm1zZywgaW50IHByb3RvKTsKK2ludCBpcGFjY2Vzc19zZW5kX2lkX2FjayhpbnQgZmQpOworaW50IGlwYWNjZXNzX3NlbmRfaWRfcmVxKGludCBmZCk7CisKK2ludCBpcGFjY2Vzc19pZHRhZ19wYXJzZShzdHJ1Y3QgdGx2X3BhcnNlZCAqZGVjLCB1bnNpZ25lZCBjaGFyICpidWYsIGludCBsZW4pOworCisKKy8qCisgKiBGaXJtd2FyZSBzcGVjaWZpYyBoZWFkZXIKKyAqLworc3RydWN0IHNkcF9maXJtd2FyZSB7CisJY2hhciBtYWdpY1s0XTsKKwljaGFyIG1vcmVfbWFnaWNbMl07CisJdV9pbnQxNl90IG1vcmVfbW9yZV9tYWdpYzsKKwl1X2ludDMyX3QgaGVhZGVyX2xlbmd0aDsKKwl1X2ludDMyX3QgZmlsZV9sZW5ndGg7CisJY2hhciBzd19wYXJ0WzIwXTsKKwljaGFyIHRleHQxWzY0XTsKKwljaGFyIHRpbWVbMTJdOworCWNoYXIgZGF0ZVsxNF07CisJY2hhciB0ZXh0MlsxMF07CisJY2hhciB2ZXJzaW9uWzIwXTsKKwl1X2ludDE2X3QgdGFibGVfb2Zmc2V0OworCS8qIHN0dWZmIGkgZG9uJ3Qga25vdyAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNkcF9oZWFkZXJfZW50cnkgeworCXVfaW50MTZfdCBzb21ldGhpbmcxOworCWNoYXIgdGV4dDFbNjRdOworCWNoYXIgdGltZVsxMl07CisJY2hhciBkYXRlWzE0XTsKKwljaGFyIHRleHQyWzEwXTsKKwljaGFyIHZlcnNpb25bMjBdOworCXVfaW50MzJfdCBsZW5ndGg7CisJdV9pbnQzMl90IGFkZHIxOworCXVfaW50MzJfdCBhZGRyMjsKKwl1X2ludDMyX3Qgc3RhcnQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc2RwX2hlYWRlcl9pdGVtIHsKKwlzdHJ1Y3Qgc2RwX2hlYWRlcl9lbnRyeSBoZWFkZXJfZW50cnk7CisJc3RydWN0IGxsaXN0X2hlYWQgZW50cnk7CisJb2ZmX3QgYWJzb2x1dGVfb2Zmc2V0OworfTsKKworc3RydWN0IHNkcF9oZWFkZXIgeworCXN0cnVjdCBzZHBfZmlybXdhcmUgZmlybXdhcmVfaW5mbzsKKworCS8qIGZvciBtb3JlX21hZ2ljIGEgbGlzdCBvZiBzZHBfaGVhZGVyX2VudHJ5X2xpc3QgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBoZWFkZXJfbGlzdDsKKworCS8qIHRoZSBlbnRyeSBvZiB0aGUgc2RwX2hlYWRlciAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGVudHJ5OworfTsKKworaW50IGlwYWNjZXNzX2FuYWx5emVfZmlsZShpbnQgZmQsIGNvbnN0IHVuc2lnbmVkIGludCBzdF9zaXplLCBjb25zdCB1bnNpZ25lZCBiYXNlX29mZnNldCwgc3RydWN0IGxsaXN0X2hlYWQgKmxpc3QpOworCisjZW5kaWYgLyogX0lQQUNDRVNTX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21lYXNfcmVwLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tZWFzX3JlcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjMmM4ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tZWFzX3JlcC5oCkBAIC0wLDAgKzEsODUgQEAKKyNpZm5kZWYgX01FQVNfUkVQX0gKKyNkZWZpbmUgX01FQVNfUkVQX0gKKworI2RlZmluZSBNUkNfRl9QUk9DRVNTRUQJMHgwMDAxCisKKy8qIGV4dHJhY3RlZCBmcm9tIGEgTDMgbWVhc3VyZW1lbnQgcmVwb3J0IElFICovCitzdHJ1Y3QgZ3NtX21lYXNfcmVwX2NlbGwgeworCXVfaW50OF90IHJ4bGV2OworCXVfaW50OF90IGJzaWM7CisJdV9pbnQ4X3QgbmVpZ2hfaWR4OworCXVfaW50MTZfdCBhcmZjbjsKKwl1bnNpZ25lZCBpbnQgZmxhZ3M7Cit9OworCisvKiBSWCBMZXZlbCBhbmQgUlggUXVhbGl0eSAqLworc3RydWN0IGdzbV9yeF9sZXZfcXVhbCB7CisJdV9pbnQ4X3QgcnhfbGV2OworCXVfaW50OF90IHJ4X3F1YWw7Cit9OworCisvKiB1bmlkaXJlY3Rpb25hbCBtZWFzdW1yZW1lbnQgcmVwb3J0ICovCitzdHJ1Y3QgZ3NtX21lYXNfcmVwX3VuaWRpciB7CisJc3RydWN0IGdzbV9yeF9sZXZfcXVhbCBmdWxsOworCXN0cnVjdCBnc21fcnhfbGV2X3F1YWwgc3ViOworfTsKKworI2RlZmluZSBNRUFTX1JFUF9GX1VMX0RUWAkweDAxCisjZGVmaW5lIE1FQVNfUkVQX0ZfRExfVkFMSUQJMHgwMgorI2RlZmluZSBNRUFTX1JFUF9GX0JBMQkJMHgwNAorI2RlZmluZSBNRUFTX1JFUF9GX0RMX0RUWAkweDA4CisjZGVmaW5lIE1FQVNfUkVQX0ZfTVNfVE8JMHgxMAorI2RlZmluZSBNRUFTX1JFUF9GX01TX0wxCTB4MjAKKyNkZWZpbmUgTUVBU19SRVBfRl9GUEMJCTB4NDAKKworLyogcGFyc2VkIHVwbGluayBhbmQgZG93bmxpbmsgbWVhc3VyZW1lbnQgcmVzdWx0ICovCitzdHJ1Y3QgZ3NtX21lYXNfcmVwIHsKKwkvKiBiYWNrLXBvaW50ZXIgdG8gdGhlIGxvZ2ljYWwgY2hhbm5lbCAqLworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCisJLyogbnVtYmVyIG9mIHRoZSBtZWFzdXJlbWVudCByZXBvcnQgKi8KKwl1X2ludDhfdCBucjsKKwkvKiBmbGFncywgc2VlIE1FQVNfUkVQX0ZfKiAqLworCXVuc2lnbmVkIGludCBmbGFnczsKKworCS8qIHVwbGluayBhbmQgZG93bmxpbmsgcnhsZXYsIHJ4cXVhbDsgZnVsbCBhbmQgc3ViICovCisJc3RydWN0IGdzbV9tZWFzX3JlcF91bmlkaXIgdWw7CisJc3RydWN0IGdzbV9tZWFzX3JlcF91bmlkaXIgZGw7CisKKwl1X2ludDhfdCBic19wb3dlcjsKKwl1X2ludDhfdCBtc190aW1pbmdfb2Zmc2V0OworCXN0cnVjdCB7CisJCWludDhfdCBwd3I7CS8qIE1TIHBvd2VyIGluIGRCbSAqLworCQl1X2ludDhfdCB0YTsJLyogTVMgdGltaW5nIGFkdmFuY2UgKi8KKwl9IG1zX2wxOworCisJLyogbmVpZ2hib3IgbWVhc3VyZW1lbnQgcmVwb3J0cyBmb3IgdXAgdG8gNiBjZWxscyAqLworCWludCBudW1fY2VsbDsKKwlzdHJ1Y3QgZ3NtX21lYXNfcmVwX2NlbGwgY2VsbFs2XTsKK307CisKK2VudW0gbWVhc19yZXBfZmllbGQgeworCU1FQVNfUkVQX0RMX1JYTEVWX0ZVTEwsCisJTUVBU19SRVBfRExfUlhMRVZfU1VCLAorCU1FQVNfUkVQX0RMX1JYUVVBTF9GVUxMLAorCU1FQVNfUkVQX0RMX1JYUVVBTF9TVUIsCisJTUVBU19SRVBfVUxfUlhMRVZfRlVMTCwKKwlNRUFTX1JFUF9VTF9SWExFVl9TVUIsCisJTUVBU19SRVBfVUxfUlhRVUFMX0ZVTEwsCisJTUVBU19SRVBfVUxfUlhRVUFMX1NVQiwKK307CisKKy8qIG9idGFpbiBhbiBhdmVyYWdlIG92ZXIgdGhlIGxhc3QgJ251bScgZmllbGRzIGluIHRoZSBtZWFzIHJlcHMgKi8KK2ludCBnZXRfbWVhc19yZXBfYXZnKGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLAorCQkgICAgIGVudW0gbWVhc19yZXBfZmllbGQgZmllbGQsIHVuc2lnbmVkIGludCBudW0pOworCisvKiBDaGVjayBpZiBOIG91dCBvZiBNIGxhc3QgdmFsdWVzIGZvciBGSUVMRCBhcmUgPj0gYmQgKi8KK2ludCBtZWFzX3JlcF9uX291dF9vZl9tX2JlKGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLAorCQkJZW51bSBtZWFzX3JlcF9maWVsZCBmaWVsZCwKKwkJCXVuc2lnbmVkIGludCBuLCB1bnNpZ25lZCBpbnQgbSwgaW50IGJlKTsKKwordW5zaWduZWQgaW50IGNhbGNfaW5pdGlhbF9pZHgodW5zaWduZWQgaW50IGFycmF5X3NpemUsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgbWVhc19yZXBfaWR4LAorCQkJICAgICAgdW5zaWduZWQgaW50IG51bV92YWx1ZXMpOworCisjZW5kaWYgLyogX01FQVNfUkVQX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21nY3AuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21nY3AuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2U4MDBiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWdjcC5oCkBAIC0wLDAgKzEsMTIyIEBACisvKiBBIE1lZGlhIEdhdGV3YXkgQ29udHJvbCBQcm90b2NvbCBNZWRpYSBHYXRld2F5OiBSRkMgMzQzNSAqLworCisvKgorICogKEMpIDIwMDktMjAxMCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOS0yMDEwIGJ5IE9uLVdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBPUEVOQlNDX01HQ1BfSAorI2RlZmluZSBPUEVOQlNDX01HQ1BfSAorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorCisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNkZWZpbmUgUlRQX1BPUlRfREVGQVVMVCA0MDAwCisKKy8qKgorICogQ2FsY3VsYXRlIHRoZSBSVFAgYXVkaW8gcG9ydCBmb3IgdGhlIGdpdmVuIG11bHRpcGxleAorICogYW5kIHRoZSBkaXJlY3Rpb24uIFRoaXMgYWxsb3dzIGEgc2VtaSBzdGF0aWMgZW5kcG9pbnQKKyAqIHRvIHBvcnQgY2FsY3VsYXRpb24gcmVtb3ZpbmcgdGhlIG5lZWQgZm9yIHRoZSBCU0MKKyAqIGFuZCB0aGUgTWVkaWFHYXRld2F5IHRvIGNvbW11bmljYXRlLgorICoKKyAqIFBvcnQgdXNhZ2UgZXhwbGFpbmVkOgorICogICAgICAgYmFzZSArIChtdWx0aXBsZXggKiAyKSArIDAgPT0gbG9jYWwgcG9ydCB0byB3YWl0IGZvciBuZXR3b3JrIHBhY2tldHMKKyAqICAgICAgIGJhc2UgKyAobXVsdGlwbGV4ICogMikgKyAxID09IGxvY2FsIHBvcnQgZm9yIHJ0Y3AKKyAqCisgKiBUaGUgYWJvdmUgcG9ydCB3aWxsIHJlY2VpdmUgcGFja2V0cyBmcm9tIHRoZSBCVFMgdGhhdCBuZWVkCisgKiB0byBiZSBwYXRjaGVkIGFuZCBmb3J3YXJkZWQgdG8gdGhlIG5ldHdvcmsuCisgKiBUaGUgYWJvdmUgcG9ydCB3aWxsIHJlY2VpdmUgcGFja2V0cyBmcm9tIHRoZSBuZXR3b3JrIHRoYXQKKyAqIG5lZWQgdG8gYmUgcGF0Y2hlZCBhbmQgZm9yd2FyZGVkIHRvIHRoZSBCVFMuCisgKgorICogV2UgYXNzdW1lIHRvIGhhdmUgYSBzdGF0aWMgQlRTIElQIGFkZHJlc3Mgc28gd2UgY2FuIGRpZmZlcmVudGlhdGUKKyAqIG5ldHdvcmsgYW5kIEJUUy4KKyAqCisgKi8KK3N0YXRpYyBpbmxpbmUgaW50IHJ0cF9jYWxjdWxhdGVfcG9ydChpbnQgbXVsdGlwbGV4LCBpbnQgYmFzZSkKK3sKKwlyZXR1cm4gYmFzZSArIChtdWx0aXBsZXggKiAyKTsKK30KKworCisvKgorICogSGFuZGxpbmcgb2YgTUdDUCBFbmRwb2ludHMgYW5kIHRoZSBNR0NQIENvbmZpZworICovCitzdHJ1Y3QgbWdjcF9lbmRwb2ludDsKK3N0cnVjdCBtZ2NwX2NvbmZpZzsKKworI2RlZmluZSBNR0NQX0VORFBfQ1JDWCAxCisjZGVmaW5lIE1HQ1BfRU5EUF9ETENYIDIKKyNkZWZpbmUgTUdDUF9FTkRQX01EQ1ggMworCisvKgorICogd2hhdCB0byBkbyB3aXRoIHRoZSBtc2c/CisgKgktIGNvbnRpbnVlIGFzIHVzdWFsPworICoJLSByZWplY3QgYW5kIHNlbmQgYSBmYWlsdXJlIGNvZGU/CisgKgktIGRlZmVyPyBkbyBub3Qgc2VuZCBhbnl0aGluZworICovCisjZGVmaW5lIE1HQ1BfUE9MSUNZX0NPTlQJNAorI2RlZmluZSBNR0NQX1BPTElDWV9SRUpFQ1QJNQorI2RlZmluZSBNR0NQX1BPTElDWV9ERUZFUgk2CisKK3R5cGVkZWYgaW50ICgqbWdjcF9jaGFuZ2UpKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBpbnQgZW5kcG9pbnQsIGludCBzdGF0ZSwgaW50IGxvY2FsX3J0cCk7Cit0eXBlZGVmIGludCAoKm1nY3BfcG9saWN5KShzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgaW50IGVuZHBvaW50LCBpbnQgc3RhdGUsIGNvbnN0IGNoYXIgKnRyYW5zYWN0aW9faWQpOworCitzdHJ1Y3QgbWdjcF9jb25maWcgeworCWludCBzb3VyY2VfcG9ydDsKKwljaGFyICpsb2NhbF9pcDsKKwljaGFyICpzb3VyY2VfYWRkcjsKKwl1bnNpZ25lZCBpbnQgbnVtYmVyX2VuZHBvaW50czsKKwljaGFyICpidHNfaXA7CisKKwlzdHJ1Y3QgaW5fYWRkciBidHNfaW47CisJY2hhciAqYXVkaW9fbmFtZTsKKwlpbnQgYXVkaW9fcGF5bG9hZDsKKwlpbnQgYXVkaW9fbG9vcDsKKwlpbnQgZWFybHlfYmluZDsKKwlpbnQgcnRwX2Jhc2VfcG9ydDsKKworCWNoYXIgKmZvcndhcmRfaXA7CisJaW50IGZvcndhcmRfcG9ydDsKKworCW1nY3BfY2hhbmdlIGNoYW5nZV9jYjsKKwltZ2NwX3BvbGljeSBwb2xpY3lfY2I7CisJdm9pZCAqZGF0YTsKKworCXN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwb2ludHM7CisJdW5zaWduZWQgaW50IGxhc3RfY2FsbF9pZDsKK307CisKKy8qIGNvbmZpZyBtYW5hZ2VtZW50ICovCitzdHJ1Y3QgbWdjcF9jb25maWcgKm1nY3BfY29uZmlnX2FsbG9jKHZvaWQpOworaW50IG1nY3BfcGFyc2VfY29uZmlnKGNvbnN0IGNoYXIgKmNvbmZpZ19maWxlLCBzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZyk7CitpbnQgbWdjcF92dHlfaW5pdCh2b2lkKTsKK2ludCBtZ2NwX2VuZHBvaW50c19hbGxvY2F0ZShzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZyk7CitpbnQgbWdjcF9iaW5kX3J0cF9wb3J0KHN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwLCBpbnQgcnRwX3BvcnQpOwordm9pZCBtZ2NwX2ZyZWVfZW5kcChzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcCk7CisKKy8qCisgKiBmb3JtYXQgaGVscGVyIGZ1bmN0aW9ucworICovCitzdHJ1Y3QgbXNnYiAqbWdjcF9oYW5kbGVfbWVzc2FnZShzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZyk7CitzdHJ1Y3QgbXNnYiAqbWdjcF9jcmVhdGVfcnNpcCh2b2lkKTsKK3N0cnVjdCBtc2diICptZ2NwX2NyZWF0ZV9yZXNwb25zZV93aXRoX2RhdGEoaW50IGNvZGUsIGNvbnN0IGNoYXIgKm1zZywgY29uc3QgY2hhciAqdHJhbnMsIGNvbnN0IGNoYXIgKmRhdGEpOworCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWdjcF9pbnRlcm5hbC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvbWdjcF9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwZDBjYTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tZ2NwX2ludGVybmFsLmgKQEAgLTAsMCArMSw2NCBAQAorLyogTUdDUCBQcml2YXRlIERhdGEgKi8KKworLyoKKyAqIChDKSAyMDA5LTIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDktMjAxMCBieSBPbi1XYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgT1BFTkJTQ19NR0NQX0RBVEFfSAorI2RlZmluZSBPUEVOQlNDX01HQ1BfREFUQV9ICisKKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKworI2RlZmluZSBDSV9VTlVTRUQgMAorCitzdHJ1Y3QgbWdjcF9lbmRwb2ludCB7CisJaW50IGNpOworCWNoYXIgKmNhbGxpZDsKKwljaGFyICpsb2NhbF9vcHRpb25zOworCWludCBjb25uX21vZGU7CisKKwlpbnQgYnRzX3BheWxvYWRfdHlwZTsKKwlpbnQgbmV0X3BheWxvYWRfdHlwZTsKKworCS8qIHRoZSBsb2NhbCBydHAgcG9ydCB3ZSBhcmUgYmluZGluZyB0byAqLworCWludCBydHBfcG9ydDsKKworCS8qCisJICogUlRQIG1hbmdsaW5nOgorCSAqICAtIHdlIGdldCBSVFAgYW5kIFJUQ1AgdG8gdXMgYW5kIG5lZWQgdG8gZm9yd2FyZCB0byB0aGUgQlRTCisJICogIC0gd2UgZ2V0IFJUUCBhbmQgUlRDUCBmcm9tIHRoZSBCVFMgYW5kIGZvcndhcmQgdG8gdGhlIG5ldHdvcmsKKwkgKi8KKwlzdHJ1Y3QgYnNjX2ZkIGxvY2FsX3J0cDsKKwlzdHJ1Y3QgYnNjX2ZkIGxvY2FsX3J0Y3A7CisKKwlzdHJ1Y3QgaW5fYWRkciByZW1vdGU7CisJc3RydWN0IGluX2FkZHIgYnRzOworCisJLyogaW4gbmV0d29yayBieXRlIG9yZGVyICovCisJaW50IG5ldF9ydHAsIG5ldF9ydGNwOworCWludCBidHNfcnRwLCBidHNfcnRjcDsKKworCS8qIGJhY2twb2ludGVyICovCisJc3RydWN0IG1nY3BfY29uZmlnICpjZmc7Cit9OworCisjZGVmaW5lIEVORFBPSU5UX05VTUJFUihlbmRwKSBhYnMoZW5kcCAtIGVuZHAtPmNmZy0+ZW5kcG9pbnRzKQorCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21pc2RuLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9taXNkbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjMzhkZTcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9taXNkbi5oCkBAIC0wLDAgKzEsMjkgQEAKKy8qIChDKSAyMDA4IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBNSVNETl9ICisjZGVmaW5lIE1JU0ROX0gKKworI2luY2x1ZGUgImUxX2lucHV0LmgiCisKK2ludCBtaV9zZXR1cChpbnQgY2FyZG5yLCAgc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUsIGludCByZWxlYXNlX2wyKTsKK2ludCBfYWJpc19ubV9zZW5kbXNnKHN0cnVjdCBtc2diICptc2cpOworaW50IG1pX2UxX2xpbmVfdXBkYXRlKHN0cnVjdCBlMWlucF9saW5lICpsaW5lKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tbmNjLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9tbmNjLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2I4MzM5YQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL21uY2MuaApAQCAtMCwwICsxLDE1OSBAQAorLyogR1NNIE1vYmlsZSBSYWRpbyBJbnRlcmZhY2UgTGF5ZXIgMyBtZXNzYWdlcyBvbiB0aGUgQS1iaXMgaW50ZXJmYWNlIAorICogM0dQUCBUUyAwNC4wOCB2ZXJzaW9uIDcuMjEuMCBSZWxlYXNlIDE5OTggLyBFVFNJIFRTIDEwMCA5NDAgVjcuMjEuMCAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOCwgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpZm5kZWYgX01OQ0NfSAorI2RlZmluZSBfTU5DQ19ICisKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tbmNjLmg+CisKKy8qIE9uZSBlbmQgb2YgYSBjYWxsICovCitzdHJ1Y3QgZ3NtX2NhbGwgeworCXN0cnVjdCBsbGlzdF9oZWFkIGVudHJ5OworCisJLyogbmV0d29yayBoYW5kbGUgKi8KKwl2b2lkICpuZXQ7CisKKwkvKiB0aGUgJ2xvY2FsJyB0cmFuc2FjdGlvbiAqLworCXVfaW50MzJfdCBjYWxscmVmOworCS8qIHRoZSAncmVtb3RlJyB0cmFuc2FjdGlvbiAqLworCXVfaW50MzJfdCByZW1vdGVfcmVmOworfTsKKworI2RlZmluZSBNTkNDX1NFVFVQX1JFUQkJMHgwMTAxCisjZGVmaW5lIE1OQ0NfU0VUVVBfSU5ECQkweDAxMDIKKyNkZWZpbmUgTU5DQ19TRVRVUF9SU1AJCTB4MDEwMworI2RlZmluZSBNTkNDX1NFVFVQX0NORgkJMHgwMTA0CisjZGVmaW5lIE1OQ0NfU0VUVVBfQ09NUExfUkVRCTB4MDEwNQorI2RlZmluZSBNTkNDX1NFVFVQX0NPTVBMX0lORAkweDAxMDYKKy8qIE1OQ0NfUkVKXyogaXMgcGVyZm9tZWQgdmlhIE1OQ0NfUkVMXyogKi8KKyNkZWZpbmUgTU5DQ19DQUxMX0NPTkZfSU5ECTB4MDEwNworI2RlZmluZSBNTkNDX0NBTExfUFJPQ19SRVEJMHgwMTA4CisjZGVmaW5lIE1OQ0NfUFJPR1JFU1NfUkVRCTB4MDEwOQorI2RlZmluZSBNTkNDX0FMRVJUX1JFUQkJMHgwMTBhCisjZGVmaW5lIE1OQ0NfQUxFUlRfSU5ECQkweDAxMGIKKyNkZWZpbmUgTU5DQ19OT1RJRllfUkVRCQkweDAxMGMKKyNkZWZpbmUgTU5DQ19OT1RJRllfSU5ECQkweDAxMGQKKyNkZWZpbmUgTU5DQ19ESVNDX1JFUQkJMHgwMTBlCisjZGVmaW5lIE1OQ0NfRElTQ19JTkQJCTB4MDEwZgorI2RlZmluZSBNTkNDX1JFTF9SRVEJCTB4MDExMAorI2RlZmluZSBNTkNDX1JFTF9JTkQJCTB4MDExMQorI2RlZmluZSBNTkNDX1JFTF9DTkYJCTB4MDExMgorI2RlZmluZSBNTkNDX0ZBQ0lMSVRZX1JFUQkweDAxMTMKKyNkZWZpbmUgTU5DQ19GQUNJTElUWV9JTkQJMHgwMTE0CisjZGVmaW5lIE1OQ0NfU1RBUlRfRFRNRl9JTkQJMHgwMTE1CisjZGVmaW5lIE1OQ0NfU1RBUlRfRFRNRl9SU1AJMHgwMTE2CisjZGVmaW5lIE1OQ0NfU1RBUlRfRFRNRl9SRUoJMHgwMTE3CisjZGVmaW5lIE1OQ0NfU1RPUF9EVE1GX0lORAkweDAxMTgKKyNkZWZpbmUgTU5DQ19TVE9QX0RUTUZfUlNQCTB4MDExOQorI2RlZmluZSBNTkNDX01PRElGWV9SRVEJCTB4MDExYQorI2RlZmluZSBNTkNDX01PRElGWV9JTkQJCTB4MDExYgorI2RlZmluZSBNTkNDX01PRElGWV9SU1AJCTB4MDExYworI2RlZmluZSBNTkNDX01PRElGWV9DTkYJCTB4MDExZAorI2RlZmluZSBNTkNDX01PRElGWV9SRUoJCTB4MDExZQorI2RlZmluZSBNTkNDX0hPTERfSU5ECQkweDAxMWYKKyNkZWZpbmUgTU5DQ19IT0xEX0NORgkJMHgwMTIwCisjZGVmaW5lIE1OQ0NfSE9MRF9SRUoJCTB4MDEyMQorI2RlZmluZSBNTkNDX1JFVFJJRVZFX0lORAkweDAxMjIKKyNkZWZpbmUgTU5DQ19SRVRSSUVWRV9DTkYJMHgwMTIzCisjZGVmaW5lIE1OQ0NfUkVUUklFVkVfUkVKCTB4MDEyNAorI2RlZmluZSBNTkNDX1VTRVJJTkZPX1JFUQkweDAxMjUKKyNkZWZpbmUgTU5DQ19VU0VSSU5GT19JTkQJMHgwMTI2CisjZGVmaW5lIE1OQ0NfUkVKX1JFUQkJMHgwMTI3CisjZGVmaW5lIE1OQ0NfUkVKX0lORAkJMHgwMTI4CisKKyNkZWZpbmUgTU5DQ19CUklER0UJCTB4MDIwMAorI2RlZmluZSBNTkNDX0ZSQU1FX1JFQ1YJCTB4MDIwMQorI2RlZmluZSBNTkNDX0ZSQU1FX0RST1AJCTB4MDIwMgorI2RlZmluZSBNTkNDX0xDSEFOX01PRElGWQkweDAyMDMKKworI2RlZmluZSBHU01fVENIRl9GUkFNRQkJMHgwMzAwCisjZGVmaW5lIEdTTV9UQ0hGX0ZSQU1FX0VGUgkweDAzMDEKKworI2RlZmluZSBHU01fTUFYX0ZBQ0lMSVRZCTEyOAorI2RlZmluZSBHU01fTUFYX1NTVkVSU0lPTgkxMjgKKyNkZWZpbmUgR1NNX01BWF9VU0VSVVNFUgkxMjgKKworI2RlZmluZQlNTkNDX0ZfQkVBUkVSX0NBUAkweDAwMDEKKyNkZWZpbmUgTU5DQ19GX0NBTExFRAkJMHgwMDAyCisjZGVmaW5lIE1OQ0NfRl9DQUxMSU5HCQkweDAwMDQKKyNkZWZpbmUgTU5DQ19GX1JFRElSRUNUSU5HCTB4MDAwOAorI2RlZmluZSBNTkNDX0ZfQ09OTkVDVEVECTB4MDAxMAorI2RlZmluZSBNTkNDX0ZfQ0FVU0UJCTB4MDAyMAorI2RlZmluZSBNTkNDX0ZfVVNFUlVTRVIJCTB4MDA0MAorI2RlZmluZSBNTkNDX0ZfUFJPR1JFU1MJCTB4MDA4MAorI2RlZmluZSBNTkNDX0ZfRU1FUkdFTkNZCTB4MDEwMAorI2RlZmluZSBNTkNDX0ZfRkFDSUxJVFkJCTB4MDIwMAorI2RlZmluZSBNTkNDX0ZfU1NWRVJTSU9OCTB4MDQwMAorI2RlZmluZSBNTkNDX0ZfQ0NDQVAJCTB4MDgwMAorI2RlZmluZSBNTkNDX0ZfS0VZUEFECQkweDEwMDAKKyNkZWZpbmUgTU5DQ19GX1NJR05BTAkJMHgyMDAwCisKK3N0cnVjdCBnc21fbW5jYyB7CisJLyogY29udGV4dCBiYXNlZCBpbmZvcm1hdGlvbiAqLworCXVfaW50MzJfdAltc2dfdHlwZTsKKwl1X2ludDMyX3QJY2FsbHJlZjsKKworCS8qIHdoaWNoIGZpZWxkcyBhcmUgcHJlc2VudCAqLworCXVfaW50MzJfdAlmaWVsZHM7CisKKwkvKiBkYXRhIGRlcml2ZWQgaW5mb3JtYXRpb25zIChNTkNDX0ZfIGJhc2VkKSAqLworCXN0cnVjdCBnc21fbW5jY19iZWFyZXJfY2FwCWJlYXJlcl9jYXA7CisJc3RydWN0IGdzbV9tbmNjX251bWJlcgkJY2FsbGVkOworCXN0cnVjdCBnc21fbW5jY19udW1iZXIJCWNhbGxpbmc7CisJc3RydWN0IGdzbV9tbmNjX251bWJlcgkJcmVkaXJlY3Rpbmc7CisJc3RydWN0IGdzbV9tbmNjX251bWJlcgkJY29ubmVjdGVkOworCXN0cnVjdCBnc21fbW5jY19jYXVzZQkJY2F1c2U7CisJc3RydWN0IGdzbV9tbmNjX3Byb2dyZXNzCXByb2dyZXNzOworCXN0cnVjdCBnc21fbW5jY191c2VydXNlcgl1c2VydXNlcjsKKwlzdHJ1Y3QgZ3NtX21uY2NfZmFjaWxpdHkJZmFjaWxpdHk7CisJc3RydWN0IGdzbV9tbmNjX2NjY2FwCQljY2NhcDsKKwlzdHJ1Y3QgZ3NtX21uY2Nfc3N2ZXJzaW9uCXNzdmVyc2lvbjsKKwlzdHJ1Y3QJeworCQlpbnQJCXN1cDsKKwkJaW50CQlpbnY7CisJfSBjbGlyOworCWludAkJc2lnbmFsOworCisJLyogZGF0YSBkZXJpdmVkIGluZm9ybWF0aW9uLCBub3QgTU5DQ19GIGJhc2VkICovCisJaW50CQlrZXlwYWQ7CisJaW50CQltb3JlOworCWludAkJbm90aWZ5OyAvKiAwLi4xMjcgKi8KKwlpbnQJCWVtZXJnZW5jeTsKKwljaGFyCQlpbXNpWzE2XTsKKworCXVuc2lnbmVkIGNoYXIJbGNoYW5fbW9kZTsKK307CisKK3N0cnVjdCBnc21fZGF0YV9mcmFtZSB7CisJdV9pbnQzMl90CW1zZ190eXBlOworCXVfaW50MzJfdAljYWxscmVmOworCXVuc2lnbmVkIGNoYXIJZGF0YVswXTsKK307CisKK2NoYXIgKmdldF9tbmNjX25hbWUoaW50IHZhbHVlKTsKK2ludCBtbmNjX3JlY3Yoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGludCBtc2dfdHlwZSwgdm9pZCAqYXJnKTsKK3ZvaWQgbW5jY19zZXRfY2F1c2Uoc3RydWN0IGdzbV9tbmNjICpkYXRhLCBpbnQgbG9jLCBpbnQgdmFsKTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9vcGVuYnNjZGVmaW5lcy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvb3BlbmJzY2RlZmluZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wODJlNTkyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvb3BlbmJzY2RlZmluZXMuaApAQCAtMCwwICsxLDM1IEBACisvKiAKKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBPUEVOQlNDREVGSU5FU19ICisjZGVmaW5lIE9QRU5CU0NERUZJTkVTX0gKKworI2lmZGVmIEJVSUxESU5HX09OX1dJTkRPV1MKKyAgICAjaWZkZWYgQlVJTERJTkdfT1BFTkJTQworICAgICAgICAjZGVmaW5lIEJTQ19BUEkgX19kZWNsc3BlYyhkbGxleHBvcnQpCisgICAgI2Vsc2UKKyAgICAgICAgI2RlZmluZSBCU0NfQVBJIF9fZGVjbHNwZWMoZGxsaW1wb3J0KQorICAgICNlbmRpZgorI2Vsc2UKKyAgICAjZGVmaW5lIEJTQ19BUEkgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKKyNlbmRpZgorCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3BhZ2luZy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcGFnaW5nLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNiZGNhOQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3BhZ2luZy5oCkBAIC0wLDAgKzEsNDYgQEAKKy8qIFBhZ2luZyBoZWxwZXIgYW5kIG1hbmFnZXIuLi4uICovCisvKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBQQUdJTkdfSAorI2RlZmluZSBQQUdJTkdfSAorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlICJnc21fZGF0YS5oIgorI2luY2x1ZGUgImdzbV9zdWJzY3JpYmVyLmgiCisjaW5jbHVkZSA8b3Ntb2NvcmUvdGltZXIuaD4KKworLyogY2FsbCBvbmNlIGZvciBldmVyeSBnc21fYnRzLi4uICovCit2b2lkIHBhZ2luZ19pbml0KHN0cnVjdCBnc21fYnRzICpidHMpOworCisvKiBzY2hlZHVsZSBwYWdpbmcgcmVxdWVzdCAqLworaW50IHBhZ2luZ19yZXF1ZXN0KHN0cnVjdCBnc21fbmV0d29yayAqbmV0d29yaywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCSAgIGludCB0eXBlLCBnc21fY2JmbiAqY2Jmbiwgdm9pZCAqZGF0YSk7CisKKy8qIHN0b3AgcGFnaW5nIHJlcXVlc3RzICovCit2b2lkIHBhZ2luZ19yZXF1ZXN0X3N0b3Aoc3RydWN0IGdzbV9idHMgKmJ0cywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pOworCisvKiB1cGRhdGUgcGFnaW5nIGxvYWQgKi8KK3ZvaWQgcGFnaW5nX3VwZGF0ZV9idWZmZXJfc3BhY2Uoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQxNl90KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9yZXN0X29jdGV0cy5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcmVzdF9vY3RldHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZTcyYzBmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvcmVzdF9vY3RldHMuaApAQCAtMCwwICsxLDEyMiBAQAorI2lmbmRlZiBfUkVTVF9PQ1RFVFNfSAorI2RlZmluZSBfUkVTVF9PQ1RFVFNfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKworLyogZ2VuZXJhdGUgU0kxIHJlc3Qgb2N0ZXRzICovCitpbnQgcmVzdF9vY3RldHNfc2kxKHVfaW50OF90ICpkYXRhLCB1X2ludDhfdCAqbmNoX3Bvcyk7CisKK3N0cnVjdCBnc200OF9zaV9zZWxlY3Rpb25fcGFyYW1zIHsKKwl1X2ludDE2X3QgcGVuYWx0eV90aW1lOjUsCisJCSAgdGVtcF9vZmZzOjMsCisJCSAgY2VsbF9yZXNlbF9vZmY6NiwKKwkJICBjYnE6MSwKKwkJICBwcmVzZW50OjE7Cit9OworCitzdHJ1Y3QgZ3NtNDhfc2lfcG93ZXJfb2Zmc2V0IHsKKwl1X2ludDhfdCBwb3dlcl9vZmZzZXQ6MiwKKwkJIHByZXNlbnQ6MTsKK307CisKK3N0cnVjdCBnc200OF9zaTNfZ3Byc19pbmQgeworCXVfaW50OF90IHNpMTNfcG9zaXRpb246MSwKKwkJIHJhX2NvbG91cjozLAorCQkgcHJlc2VudDoxOworfTsKKworc3RydWN0IGdzbTQ4X2xzYV9wYXJhbXMgeworCXVfaW50MzJfdCBwcmlvX3RocjozLAorCQkgbHNhX29mZnNldDozLAorCQkgbWNjOjEyLAorCQkgbW5jOjEyOworCXVuc2lnbmVkIGludCBwcmVzZW50OworfTsKKworc3RydWN0IGdzbTQ4X3NpX3JvX2luZm8geworCXN0cnVjdCBnc200OF9zaV9zZWxlY3Rpb25fcGFyYW1zIHNlbGVjdGlvbl9wYXJhbXM7CisJc3RydWN0IGdzbTQ4X3NpX3Bvd2VyX29mZnNldCBwb3dlcl9vZmZzZXQ7CisJdV9pbnQ4X3Qgc2kydGVyX2luZGljYXRvcjsKKwl1X2ludDhfdCBlYXJseV9jbV9jdHJsOworCXN0cnVjdCB7CisJCXVfaW50OF90IHdoZXJlOjMsCisJCQkgcHJlc2VudDoxOworCX0gc2NoZWR1bGluZzsKKwlzdHJ1Y3QgZ3NtNDhfc2kzX2dwcnNfaW5kIGdwcnNfaW5kOworCisJLyogU0kgNCBzcGVjaWZpYyAqLworCXN0cnVjdCBnc200OF9sc2FfcGFyYW1zIGxzYV9wYXJhbXM7CisJdV9pbnQxNl90IGNlbGxfaWQ7CisJdV9pbnQ4X3QgYnJlYWtfaW5kOwkvKiBkbyB3ZSBoYXZlIFNJNyArIFNJOCA/ICovCit9OworCisKKy8qIEdlbmVyYXRlIFNJMyBSZXN0IE9jdGVzdHMgKENoYXB0ZXIgMTAuNS4yLjM0IC8gVGFibGUgMTAuNC43MikgKi8KK2ludCByZXN0X29jdGV0c19zaTModV9pbnQ4X3QgKmRhdGEsIGNvbnN0IHN0cnVjdCBnc200OF9zaV9yb19pbmZvICpzaTMpOworCisvKiBHZW5lcmF0ZSBTSTQgUmVzdCBPY3RldHMgKENoYXB0ZXIgMTAuNS4yLjM1KSAqLworaW50IHJlc3Rfb2N0ZXRzX3NpNCh1X2ludDhfdCAqZGF0YSwgY29uc3Qgc3RydWN0IGdzbTQ4X3NpX3JvX2luZm8gKnNpNCk7CisKK2VudW0gcGJjY2hfY2Fycmllcl90eXBlIHsKKwlQQkNDSF9CQ0NILAorCVBCQ0NIX0FSRkNOLAorCVBCQ0NIX01BSU8KK307CisKKy8qIFRTIDAzLjYwIENoYXB0ZXIgNi4zLjMuMTogTmV0d29yayBNb2RlIG9mIE9wZXJhdGlvbiAqLworZW51bSBncHJzX25tbyB7CisJR1BSU19OTU9fSQk9IDAsCS8qIENTIHBhZ2luIG9uIEdQUlMgcGFnaW5nIG9yIHRyYWZmaWMgY2hhbm5lbCAqLworCUdQUlNfTk1PX0lJCT0gMSwJLyogYWxsIHBhZ2luZyBvbiBDQ0NIICovCisJR1BSU19OTU9fSUlJCT0gMiwJLyogbm8gcGFnaW5nIGNvb3JkaW5hdGlvbiAqLworfTsKKworc3RydWN0IGdwcnNfY2VsbF9vcHRpb25zIHsKKwllbnVtIGdwcnNfbm1vIG5tbzsKKwkvKiBUMzE2ODogd2FpdCBmb3IgcGFja2V0IHVwbGluayBhc3NpZ25tZW50IG1lc3NhZ2UgKi8KKwl1X2ludDMyX3QgdDMxNjg7CS8qIGluIG1pbGxpc2Vjb25kcyAqLworCS8qIFQzMTkyOiB3YWl0IGZvciByZWxlYXNlIG9mIHRoZSBUQkYgYWZ0ZXIgcmVjZXB0aW9uIG9mIHRoZSBmaW5hbCBibG9jayAqLworCXVfaW50MzJfdCB0MzE5MjsJLyogaW4gbWlsbGlzZWNvbmRzICovCisJdV9pbnQzMl90IGRyeF90aW1lcl9tYXg7LyogaW4gc2Vjb25kcyAqLworCXVfaW50MzJfdCBic19jdl9tYXg7Cit9OworCisvKiBUUyAwNC42MCBUYWJsZSAxMi45LjIgKi8KK3N0cnVjdCBncHJzX3Bvd2VyX2N0cmxfcGFycyB7CisJdV9pbnQ4X3QgYWxwaGE7CisJdV9pbnQ4X3QgdF9hdmdfdzsKKwl1X2ludDhfdCB0X2F2Z190OworCXVfaW50OF90IHBjX21lYXNfY2hhbjsKKwl1X2ludDhfdCBuX2F2Z19pOworfTsKKworc3RydWN0IGdzbTQ4X3NpMTNfaW5mbyB7CisJc3RydWN0IGdwcnNfY2VsbF9vcHRpb25zIGNlbGxfb3B0czsKKwlzdHJ1Y3QgZ3Byc19wb3dlcl9jdHJsX3BhcnMgcHdyX2N0cmxfcGFyczsKKwl1X2ludDhfdCBiY2NoX2NoYW5nZV9tYXJrOworCXVfaW50OF90IHNpX2NoYW5nZV9maWVsZDsKKwl1X2ludDhfdCBwYmNjaF9wcmVzZW50OworCisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJdV9pbnQ4X3QgcmFjOworCQkJdV9pbnQ4X3Qgc3BnY19jY2NoX3N1cDsKKwkJCXVfaW50OF90IG5ldF9jdHJsX29yZDsKKwkJCXVfaW50OF90IHByaW9fYWNjX3RocjsKKwkJfSBub19wYmNjaDsKKwkJc3RydWN0IHsKKwkJCXVfaW50OF90IHBzaTFfcmVwX3BlcjsKKwkJCXVfaW50OF90IHBiOworCQkJdV9pbnQ4X3QgdHNjOworCQkJdV9pbnQ4X3QgdG47CisJCQllbnVtIHBiY2NoX2NhcnJpZXJfdHlwZSBjYXJyaWVyX3R5cGU7CisJCQl1X2ludDE2X3QgYXJmY247CisJCQl1X2ludDhfdCBtYWlvOworCQl9IHBiY2NoOworCX07Cit9OworCisvKiBHZW5lcmF0ZSBTSTEzIFJlc3QgT2N0ZXN0cyAoQ2hhcHRlciAxMC41LjIuMzdiKSAqLworaW50IHJlc3Rfb2N0ZXRzX3NpMTModV9pbnQ4X3QgKmRhdGEsIGNvbnN0IHN0cnVjdCBnc200OF9zaTEzX2luZm8gKnNpMTMpOworCisjZW5kaWYgLyogX1JFU1RfT0NURVRTX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3JzMjMyLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9yczIzMi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxMTg3Y2EKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9yczIzMi5oCkBAIC0wLDAgKzEsOSBAQAorI2lmbmRlZiBfUlMyMzJfSAorI2RlZmluZSBfUlMyMzJfSAorCitpbnQgcnMyMzJfc2V0dXAoY29uc3QgY2hhciAqc2VyaWFsX3BvcnQsIHVuc2lnbmVkIGludCBkZWxheV9tcywKKwkJc3RydWN0IGdzbV9idHMgKmJ0cyk7CisKK2ludCBoYW5kbGVfc2VyaWFsX21zZyhzdHJ1Y3QgbXNnYiAqbXNnKTsKKworI2VuZGlmIC8qIF9SUzIzMl9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ydHBfcHJveHkuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3J0cF9wcm94eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4MjcxMWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9ydHBfcHJveHkuaApAQCAtMCwwICsxLDg1IEBACisjaWZuZGVmIF9SVFBfUFJPWFlfSAorI2RlZmluZSBfUlRQX1BST1hZX0gKKworLyogUlRQIHByb3h5IGhhbmRsaW5nIGZvciBpcC5hY2Nlc3MgbmFub0JUUyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorCitlbnVtIHJ0cF9yeF9hY3Rpb24geworCVJUUF9OT05FLAorCVJUUF9QUk9YWSwKKwlSVFBfUkVDVl9VUFNUUkVBTSwKK307CisKK2VudW0gcnRwX3R4X2FjdGlvbiB7CisJUlRQX1NFTkRfTk9ORSwKKwlSVFBfU0VORF9ET1dOU1RSRUFNLAorfTsKKworc3RydWN0IHJ0cF9zdWJfc29ja2V0IHsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luX2xvY2FsOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW5fcmVtb3RlOworCisJc3RydWN0IGJzY19mZCBiZmQ7CisJLyogbGlua2VkIGxpc3Qgb2YgdG8tYmUtdHJhbnNtaXR0ZWQgbXNnYidzICovCisJc3RydWN0IGxsaXN0X2hlYWQgdHhfcXVldWU7Cit9OworCitzdHJ1Y3QgcnRwX3NvY2tldCB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKworCXN0cnVjdCBydHBfc3ViX3NvY2tldCBydHA7CisJc3RydWN0IHJ0cF9zdWJfc29ja2V0IHJ0Y3A7CisKKwkvKiB3aGF0IHNob3VsZCB3ZSBkbyBvbiByZWNlaXZlPyAqLworCWVudW0gcnRwX3J4X2FjdGlvbiByeF9hY3Rpb247CisJdW5pb24geworCQlzdHJ1Y3QgeworCQkJc3RydWN0IHJ0cF9zb2NrZXQgKm90aGVyX3NvY2s7CisJCX0gcHJveHk7CisJCXN0cnVjdCB7CisJCQlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldDsKKwkJCXVfaW50MzJfdCBjYWxscmVmOworCQl9IHJlY2VpdmU7CisJfTsKKwllbnVtIHJ0cF90eF9hY3Rpb24gdHhfYWN0aW9uOworCXN0cnVjdCB7CisJCXVfaW50MTZfdCBzZXF1ZW5jZTsKKwkJdV9pbnQzMl90IHRpbWVzdGFtcDsKKwkJdV9pbnQzMl90IHNzcmM7CisJCXN0cnVjdCB0aW1ldmFsIGxhc3RfdHY7CisJfSB0cmFuc21pdDsKK307CisKK3N0cnVjdCBydHBfc29ja2V0ICpydHBfc29ja2V0X2NyZWF0ZSh2b2lkKTsKK2ludCBydHBfc29ja2V0X2JpbmQoc3RydWN0IHJ0cF9zb2NrZXQgKnJzLCB1X2ludDMyX3QgaXApOworaW50IHJ0cF9zb2NrZXRfY29ubmVjdChzdHJ1Y3QgcnRwX3NvY2tldCAqcnMsIHVfaW50MzJfdCBpcCwgdV9pbnQxNl90IHBvcnQpOworaW50IHJ0cF9zb2NrZXRfcHJveHkoc3RydWN0IHJ0cF9zb2NrZXQgKnRoaXMsIHN0cnVjdCBydHBfc29ja2V0ICpvdGhlcik7CitpbnQgcnRwX3NvY2tldF91cHN0cmVhbShzdHJ1Y3QgcnRwX3NvY2tldCAqdGhpcywgc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIHVfaW50MzJfdCBjYWxscmVmKTsKK2ludCBydHBfc29ja2V0X2ZyZWUoc3RydWN0IHJ0cF9zb2NrZXQgKnJzKTsKK2ludCBydHBfc2VuZF9mcmFtZShzdHJ1Y3QgcnRwX3NvY2tldCAqcnMsIHN0cnVjdCBnc21fZGF0YV9mcmFtZSAqZnJhbWUpOworCisjZW5kaWYgLyogX1JUUF9QUk9YWV9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zaWduYWwuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3NpZ25hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMjI4NjkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zaWduYWwuaApAQCAtMCwwICsxLDEzMyBAQAorLyogR2VuZXJpYyBzaWduYWxsaW5nL25vdGlmaWNhdGlvbiBpbmZyYXN0cnVjdHVyZSAqLworLyogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIE9QRU5CU0NfU0lHTkFMX0gKKyNkZWZpbmUgT1BFTkJTQ19TSUdOQUxfSAorCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9zaWduYWwuaD4KKworLyoKKyAqIFNpZ25hbGxpbmcgc3Vic3lzdGVtcworICovCitlbnVtIHNpZ25hbF9zdWJzeXN0ZW1zIHsKKwlTU19QQUdJTkcsCisJU1NfU01TLAorCVNTX0FCSVNJUCwKKwlTU19OTSwKKwlTU19MQ0hBTiwKKwlTU19TVUJTQ1IsCisJU1NfU0NBTEwsCisJU1NfR0xPQkFMLAorfTsKKworLyogU1NfUEFHSU5HIHNpZ25hbHMgKi8KK2VudW0gc2lnbmFsX3BhZ2luZyB7CisJU19QQUdJTkdfU1VDQ0VFREVELAorCVNfUEFHSU5HX0VYUElSRUQsCit9OworCisvKiBTU19TTVMgc2lnbmFscyAqLworZW51bSBzaWduYWxfc21zIHsKKwlTX1NNU19TVUJNSVRURUQsCS8qIEEgU01TIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBzdWJtaXR0ZWQgdG8gdXMgKi8KKwlTX1NNU19ERUxJVkVSRUQsCS8qIEEgU01TIGhhcyBiZWVuIHN1Y2Nlc3NmdWxseSBkZWxpdmVyZWQgdG8gYSBNUyAqLworCVNfU01TX1NNTUEsCQkvKiBBIE1TIHRlbGxzIHVzIGl0IGhhcyBtb3JlIHNwYWNlIGF2YWlsYWJsZSAqLworCVNfU01TX01FTV9FWENFRURFRCwJLyogQSBNUyB0ZWxscyB1cyBpdCBoYXMgbm8gbW9yZSBzcGFjZSBhdmFpbGFibGUgKi8KK307CisKKy8qIFNTX0FCSVNJUCBzaWduYWxzICovCitlbnVtIHNpZ25hbF9hYmlzaXAgeworCVNfQUJJU0lQX0NSQ1hfQUNLLAorCVNfQUJJU0lQX01EQ1hfQUNLLAorCVNfQUJJU0lQX0RMQ1hfSU5ELAorfTsKKworLyogU1NfTk0gc2lnbmFscyAqLworZW51bSBzaWduYWxfbm0geworCVNfTk1fU1dfQUNUSVZfUkVQLAkvKiBHU00gMTIuMjEgc29mdHdhcmUgYWN0aXZhdGVkIHJlcG9ydCAqLworCVNfTk1fRkFJTF9SRVAsCQkvKiBHU00gMTIuMjEgZmFpbHVyZSBldmVudCByZXBvcnQgKi8KKwlTX05NX05BQ0ssCQkvKiBHU00gMTIuMjEgdmFyaW91cyBOTV9NVF8qX05BQ0sgaGFwcGVuZWQgKi8KKwlTX05NX0lQQUNDX05BQ0ssCS8qIEdTTSAxMi4yMSBuYW5vQlRTIGV4dGVuc2lvbnMgTk1fTVRfSVBBQ0NfKl8qX05BQ0sgaGFwcGVuZWQgKi8KKwlTX05NX0lQQUNDX0FDSywJCS8qIEdTTSAxMi4yMSBuYW5vQlRTIGV4dGVuc2lvbnMgTk1fTVRfSVBBQ0NfKl8qX0FDSyBoYXBwZW5lZCAqLworCVNfTk1fSVBBQ0NfUkVTVEFSVF9BQ0ssIC8qIG5hbm9CVFMgaGFzIHNlbmQgYSByZXN0YXJ0IGFjayAqLworCVNfTk1fSVBBQ0NfUkVTVEFSVF9OQUNLLC8qIG5hbm9CVFMgaGFzIHNlbmQgYSByZXN0YXJ0IGFjayAqLworCVNfTk1fVEVTVF9SRVAsCQkvKiBHU00gMTIuMjEgVGVzdCBSZXBvcnQgKi8KK307CisKKy8qIFNTX0xDSEFOIHNpZ25hbHMgKi8KK2VudW0gc2lnbmFsX2xjaGFuIHsKKwkvKgorCSAqIFRoZSBsY2hhbiBnb3QgZnJlZWQgd2l0aCBhbiB1c2VfY291bnQgIT0gMCBhbmQgZXJyb3IKKwkgKiByZWNvdmVyeSBuZWVkcyB0byBiZSBjYXJyaWVkIG91dCBmcm9tIHdpdGhpbiB0aGUKKwkgKiBzaWduYWwgaGFuZGxlci4KKwkgKi8KKwlTX0xDSEFOX1VORVhQRUNURURfUkVMRUFTRSwKKwlTX0xDSEFOX0FDVElWQVRFX0FDSywJCS8qIDA4LjU4IENoYW5uZWwgQWN0aXZhdGUgQUNLICovCisJU19MQ0hBTl9BQ1RJVkFURV9OQUNLLAkJLyogMDguNTggQ2hhbm5lbCBBY3RpdmF0ZSBOQUNLICovCisJU19MQ0hBTl9IQU5ET1ZFUl9DT01QTCwJCS8qIDA0LjA4IEhhbmRvdmVyIENvbXBsZXRlZCAqLworCVNfTENIQU5fSEFORE9WRVJfRkFJTCwJCS8qIDA0LjA4IEhhbmRvdmVyIEZhaWxlZCAqLworCVNfTENIQU5fSEFORE9WRVJfREVURUNULAkvKiAwOC41OCBIYW5kb3ZlciBEZXRlY3QgKi8KKwlTX0xDSEFOX01FQVNfUkVQLAkJLyogMDguNTggTWVhc3VyZW1lbnQgUmVwb3J0ICovCit9OworCisvKiBTU19TVUJTQ1Igc2lnbmFscyAqLworZW51bSBzaWduYWxfc3Vic2NyIHsKKwlTX1NVQlNDUl9BVFRBQ0hFRCwKKwlTX1NVQlNDUl9ERVRBQ0hFRCwKKwlTX1NVQlNDUl9JREVOVElUWSwJCS8qIHdlJ3ZlIHJlY2VpdmVkIHNvbWUgaWRlbnRpdHkgaW5mb3JtYXRpb24gKi8KK307CisKKy8qIFNTX1NDQUxMIHNpZ25hbHMgKi8KK2VudW0gc2lnbmFsX3NjYWxsIHsKKwlTX1NDQUxMX1NVQ0NFU1MsCisJU19TQ0FMTF9FWFBJUkVELAorCVNfU0NBTExfREVUQUNIRUQsCit9OworCitlbnVtIHNpZ25hbF9nbG9iYWwgeworCVNfR0xPQkFMX1NIVVRET1dOLAorfTsKKworc3RydWN0IHBhZ2luZ19zaWduYWxfZGF0YSB7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKworCS8qIE5VTEwgaW4gY2FzZSB0aGUgcGFnaW5nIGRpZG4ndCB3b3JrICovCisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47Cit9OworCitzdHJ1Y3Qgc2NhbGxfc2lnbmFsX2RhdGEgeworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCXZvaWQgKmRhdGE7Cit9OworCitzdHJ1Y3QgaXBhY2NfYWNrX3NpZ25hbF9kYXRhIHsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCXVfaW50OF90IG1zZ190eXBlOwkKK307CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc2lsZW50X2NhbGwuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3NpbGVudF9jYWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVmYzUxOAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3NpbGVudF9jYWxsLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfU0lMRU5UX0NBTExfSAorI2RlZmluZSBfU0lMRU5UX0NBTExfSAorCitleHRlcm4gaW50IGdzbV9zaWxlbnRfY2FsbF9zdGFydChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmRhdGEsIGludCB0eXBlKTsKK2V4dGVybiBpbnQgZ3NtX3NpbGVudF9jYWxsX3N0b3Aoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpOworZXh0ZXJuIGludCBzaWxlbnRfY2FsbF9yeChzdHJ1Y3QgbXNnYiAqbXNnKTsKK2V4dGVybiBpbnQgc2lsZW50X2NhbGxfcmVyb3V0ZShzdHJ1Y3QgbXNnYiAqbXNnKTsKKworI2VuZGlmIC8qIF9TSUxFTlRfQ0FMTF9IICovCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zdWJjaGFuX2RlbXV4LmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zdWJjaGFuX2RlbXV4LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDJmYTAyMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3N1YmNoYW5fZGVtdXguaApAQCAtMCwwICsxLDEwMiBAQAorI2lmbmRlZiBfU1VCQ0hfREVNVVhfSAorI2RlZmluZSBfU1VCQ0hfREVNVVhfSAorLyogQSBFMSBzdWItY2hhbm5lbCAoZGUpbXVsdGlwbGV4ZXIgd2l0aCBUUkFVIGZyYW1lIHN5bmMgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisKKyNkZWZpbmUgTlJfU1VCQ0gJNAorI2RlZmluZSBUUkFVX0ZSQU1FX1NJWkUJNDAKKyNkZWZpbmUgVFJBVV9GUkFNRV9CSVRTCShUUkFVX0ZSQU1FX1NJWkUqOCkKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogREVNVUxUSVBMRVhFUiAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdHJ1Y3QgZGVtdXhfc3ViY2ggeworCXVfaW50OF90IG91dF9iaXRidWZbVFJBVV9GUkFNRV9CSVRTXTsKKwl1X2ludDE2X3Qgb3V0X2lkeDsgLyogbmV4dCBiaXQgdG8gYmUgd3JpdHRlbiBpbiBvdXRfYml0YnVmICovCisJLyogbnVtYmVyIG9mIGNvbnNlY3V0aXZlIHplcm9zIHRoYXQgd2UgaGF2ZSByZWNlaXZlZCAoZm9yIHN5bmMpICovCisJdW5zaWduZWQgaW50IGNvbnNlY3V0aXZlX3plcm9zOworCS8qIGFyZSB3ZSBpbiBUUkFVIGZyYW1lIHN5bmMgb3Igbm90PyAqLworCXVuc2lnbmVkIGludCBpbl9zeW5jOworfTsKKworc3RydWN0IHN1YmNoX2RlbXV4IHsKKwkvKiBiaXRtYXNrIG9mIGN1cnJlbnRseSBhY3RpdmUgc3ViY2hhbm5lbHMgKi8KKwl1X2ludDhfdCBjaGFuX2FjdGl2OworCS8qIG9uZSBkZW11eF9zdWJjaCBzdHJ1Y3QgZm9yIGV2ZXJ5IHN1YmNoYW5uZWwgKi8KKwlzdHJ1Y3QgZGVtdXhfc3ViY2ggc3ViY2hbTlJfU1VCQ0hdOworCS8qIGNhbGxiYWNrIHRvIGJlIGNhbGxlZCBvbmNlIHdlIGhhdmUgcmVjZWl2ZWQgYSBjb21wbGV0ZQorCSAqIGZyYW1lIG9uIGEgZ2l2ZW4gc3ViY2hhbm5lbCAqLworCWludCAoKm91dF9jYikoc3RydWN0IHN1YmNoX2RlbXV4ICpkbXgsIGludCBjaCwgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4sCisJCSAgICAgIHZvaWQgKik7CisJLyogdXNlci1wcm92aWRlZCBkYXRhLCB0cmFuc3BhcmVudGx5IHBhc3NlZCB0byBvdXRfY2IoKSAqLworCXZvaWQgKmRhdGE7Cit9OworCisvKiBpbml0aWFsaXplIG9uZSBkZW11bHRpcGxleGVyIGluc3RhbmNlICovCitpbnQgc3ViY2hfZGVtdXhfaW5pdChzdHJ1Y3Qgc3ViY2hfZGVtdXggKmRteCk7CisKKy8qIGZlZWQgJ2xlbicgbnVtYmVyIG9mIG11eGVkIGJ5dGVzIGludG8gdGhlIGRlbXVsdGlwbGV4ZXIgKi8KK2ludCBzdWJjaF9kZW11eF9pbihzdHJ1Y3Qgc3ViY2hfZGVtdXggKmRteCwgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4pOworCisvKiBhY3RpdmF0ZSBkZWNvZGluZy9wcm9jZXNzaW5nIGZvciBvbmUgc3ViY2hhbm5lbCAqLworaW50IHN1YmNoX2RlbXV4X2FjdGl2YXRlKHN0cnVjdCBzdWJjaF9kZW11eCAqZG14LCBpbnQgc3ViY2gpOworCisvKiBkZWFjdGl2YXRlIGRlY29kaW5nL3Byb2Nlc3NpbmcgZm9yIG9uZSBzdWJjaGFubmVsICovCitpbnQgc3ViY2hfZGVtdXhfZGVhY3RpdmF0ZShzdHJ1Y3Qgc3ViY2hfZGVtdXggKmRteCwgaW50IHN1YmNoKTsKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworLyogTVVMVElQTEVYRVIgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogb25lIGVsZW1lbnQgaW4gdGhlIHR4X3F1ZXVlIG9mIGEgbXV4ZXIgc3ViLWNoYW5uZWwgKi8KK3N0cnVjdCBzdWJjaF90eHFfZW50cnkgeworCXN0cnVjdCBsbGlzdF9oZWFkIGxpc3Q7CisKKwl1bnNpZ25lZCBpbnQgYml0X2xlbjsJLyogdG90YWwgbnVtYmVyIG9mIGJpdHMgaW4gJ2JpdHMnICovCisJdW5zaWduZWQgaW50IG5leHRfYml0OwkvKiBuZXh0IGJpdCB0byBiZSB0cmFuc21pdHRlZCAqLworCisJdV9pbnQ4X3QgYml0c1swXTsJLyogb25lIGJpdCBwZXIgYnl0ZSAqLworfTsKKworc3RydWN0IG11eF9zdWJjaCB7CisJc3RydWN0IGxsaXN0X2hlYWQgdHhfcXVldWU7Cit9OworCisvKiBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIG9uZSBpbnN0YW5jZSBvZiB0aGUgc3ViY2hhbm5lbCBtdXhlciAqLworc3RydWN0IHN1YmNoX211eCB7CisJc3RydWN0IG11eF9zdWJjaCBzdWJjaFtOUl9TVUJDSF07Cit9OworCisvKiBpbml0aWFsaXplIGEgc3ViY2hhbm5lbCBtdXhlciBpbnN0YW5jZSAqLworaW50IHN1YmNoYW5fbXV4X2luaXQoc3RydWN0IHN1YmNoX211eCAqbXgpOworCisvKiByZXF1ZXN0IHRoZSBvdXRwdXQgb2YgJ2xlbicgbXVsdGlwbGV4ZWQgYnl0ZXMgKi8KK2ludCBzdWJjaGFuX211eF9vdXQoc3RydWN0IHN1YmNoX211eCAqbXgsIHVfaW50OF90ICpkYXRhLCBpbnQgbGVuKTsKKworLyogZW5xdWV1ZSBzb21lIGRhdGEgaW50byBvbmUgc3ViLWNoYW5uZWwgb2YgdGhlIG11eGVyICovCitpbnQgc3ViY2hhbl9tdXhfZW5xdWV1ZShzdHJ1Y3Qgc3ViY2hfbXV4ICpteCwgaW50IHNfbnIsIGNvbnN0IHVfaW50OF90ICpkYXRhLAorCQkJaW50IGxlbik7CisKKyNlbmRpZiAvKiBfU1VCQ0hfREVNVVhfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc3lzdGVtX2luZm9ybWF0aW9uLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9zeXN0ZW1faW5mb3JtYXRpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODJhOWFjCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2Mvc3lzdGVtX2luZm9ybWF0aW9uLmgKQEAgLTAsMCArMSw2IEBACisjaWZuZGVmIF9TWVNURU1fSU5GT19ICisjZGVmaW5lIF9TWVNURU1fSU5GT19ICisKK2ludCBnc21fZ2VuZXJhdGVfc2kodV9pbnQ4X3QgKm91dHB1dCwgc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IHR5cGUpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RlbG5ldF9pbnRlcmZhY2UuaCBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RlbG5ldF9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGU3OTRiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdGVsbmV0X2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNDMgQEAKKy8qIG1pbmltYWxpc3RpYyB0ZWxuZXQvbmV0d29yayBpbnRlcmZhY2UgaXQgbWlnaHQgdHVybiBpbnRvIGEgd2lyZSBpbnRlcmZhY2UgKi8KKy8qIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaWZuZGVmIFRFTE5FVF9JTlRFUkZBQ0VfSAorI2RlZmluZSBURUxORVRfSU5URVJGQUNFX0gKKworI2luY2x1ZGUgImdzbV9kYXRhLmgiCisjaW5jbHVkZSAiZGVidWcuaCIKKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKworI2luY2x1ZGUgPHZ0eS92dHkuaD4KKworc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBlbnRyeTsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldHdvcms7CisJc3RydWN0IGJzY19mZCBmZDsKKwlzdHJ1Y3QgdnR5ICp2dHk7CisJc3RydWN0IGRlYnVnX3RhcmdldCAqZGJnOworfTsKKworCit2b2lkIHRlbG5ldF9pbml0KHN0cnVjdCBnc21fbmV0d29yayAqbmV0d29yaywgaW50IHBvcnQpOworCitpbnQgYnNjX3Z0eV9pbml0KHN0cnVjdCBnc21fbmV0d29yayAqbmV0KTsKKworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmFuc2FjdGlvbi5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdHJhbnNhY3Rpb24uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MGMzY2M1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdHJhbnNhY3Rpb24uaApAQCAtMCwwICsxLDc2IEBACisjaWZuZGVmIF9UUkFOU0FDVF9ICisjZGVmaW5lIF9UUkFOU0FDVF9ICisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzExLmg+CisKKy8qIE9uZSB0cmFuc2FjdGlvbiAqLworc3RydWN0IGdzbV90cmFucyB7CisJLyogRW50cnkgaW4gbGlzdCBvZiBhbGwgdHJhbnNhY3Rpb25zICovCisJc3RydWN0IGxsaXN0X2hlYWQgZW50cnk7CisKKwkvKiBUaGUgcHJvdG9jb2wgd2l0aGluIHdoaWNoIHdlIGxpdmUgKi8KKwl1X2ludDhfdCBwcm90b2NvbDsKKworCS8qIFRoZSBjdXJyZW50IHRyYW5zYWN0aW9uIElEICovCisJdV9pbnQ4X3QgdHJhbnNhY3Rpb25faWQ7CisJCisJLyogVG8gd2hvbSB3ZSBiZWxvbmcsIHVuaXF1ZSBpZGVudGlmaWVyIG9mIHJlbW90ZSBNTSBlbnRpdHkgKi8KKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCS8qIFRoZSBMQ0hBTiB0aGF0IHdlJ3JlIGN1cnJlbnRseSB1c2luZyB0byB0cmFuc21pdCBtZXNzYWdlcyAqLworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCisJLyogcmVmZXJlbmNlIGZyb20gTU5DQyBvciBvdGhlciBhcHBsaWNhdGlvbiAqLworCXVfaW50MzJfdCBjYWxscmVmOworCisJLyogaWYgdHJhZmZpYyBjaGFubmVsIHJlY2VpdmUgd2FzIHJlcXVlc3RlZCAqLworCWludCB0Y2hfcmVjdjsKKworCXVuaW9uIHsKKwkJc3RydWN0IHsKKworCQkJLyogY3VycmVudCBjYWxsIHN0YXRlICovCisJCQlpbnQgc3RhdGU7CisKKwkJCS8qIGN1cnJlbnQgdGltZXIgYW5kIG1lc3NhZ2UgcXVldWUgKi8KKwkJCWludCBUY3VycmVudDsJCS8qIGN1cnJlbnQgQ0MgdGltZXIgKi8KKwkJCWludCBUMzA4X3NlY29uZDsJLyogdXNlZCB0byBzZW5kIHJlbGVhc2UgYWdhaW4gKi8KKwkJCXN0cnVjdCB0aW1lcl9saXN0IHRpbWVyOworCQkJc3RydWN0IGdzbV9tbmNjIG1zZzsJLyogc3RvcmVzIHNldHVwL2Rpc2Nvbm5lY3QvcmVsZWFzZSBtZXNzYWdlICovCisJCX0gY2M7CisJCXN0cnVjdCB7CisJCQl1X2ludDhfdCBsaW5rX2lkOwkvKiBSU0wgTGluayBJRCB0byBiZSB1c2VkIGZvciB0aGlzIHRyYW5zICovCisJCQlpbnQgaXNfbXQ7CS8qIGlzIHRoaXMgYSBNTyAoMCkgb3IgTVQgKDEpIHRyYW5zZmVyICovCisJCQllbnVtIGdzbTQxMV9jcF9zdGF0ZSBjcF9zdGF0ZTsKKwkJCXN0cnVjdCB0aW1lcl9saXN0IGNwX3RpbWVyOworCisJCQllbnVtIGdzbTQxMV9ycF9zdGF0ZSBycF9zdGF0ZTsKKworCQkJc3RydWN0IGdzbV9zbXMgKnNtczsKKwkJfSBzbXM7CisJfTsKK307CisKKworCitzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuc19maW5kX2J5X2lkKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJCSAgIHVfaW50OF90IHByb3RvLCB1X2ludDhfdCB0cmFuc19pZCk7CitzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuc19maW5kX2J5X2NhbGxyZWYoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCXVfaW50MzJfdCBjYWxscmVmKTsKKworc3RydWN0IGdzbV90cmFucyAqdHJhbnNfYWxsb2Moc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkgICAgICB1X2ludDhfdCBwcm90b2NvbCwgdV9pbnQ4X3QgdHJhbnNfaWQsCisJCQkgICAgICB1X2ludDMyX3QgY2FsbHJlZik7Cit2b2lkIHRyYW5zX2ZyZWUoc3RydWN0IGdzbV90cmFucyAqdHJhbnMpOworCitpbnQgdHJhbnNfYXNzaWduX3RyYW5zX2lkKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJICB1X2ludDhfdCBwcm90b2NvbCwgdV9pbnQ4X3QgdGlfZmxhZyk7CisKKy8qIHVwZGF0ZSBhbGwgdHJhbnNhY3Rpb25zIHRvIHVzZSBhIGRpZmZlcmVudCBMQ0hBTiwgZS5nLgorICogYWZ0ZXIgaGFuZG92ZXIgaGFzIHN1Y2NlZWRlZCAqLworaW50IHRyYW5zX2xjaGFuX2NoYW5nZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbl9vbGQsCisJCSAgICAgICBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbl9uZXcpOworI2VuZGlmCmRpZmYgLS1naXQgYS9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmF1X2ZyYW1lLmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmF1X2ZyYW1lLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkyM2Q0YQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYXVfZnJhbWUuaApAQCAtMCwwICsxLDY1IEBACisjaWZuZGVmIF9UUkFVX0ZSQU1FX0gKKyNkZWZpbmUgX1RSQVVfRlJBTUVfSAorLyogVFJBVSBmcmFtZSBoYW5kbGluZyBhY2NvcmRpbmcgdG8gR1NNIFRTIDA4LjYwICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisvKiAyMSBmb3IgRlIvRUZSLCAyNSBmb3IgQU1SLCAxNSBmb3IgT00sIDE1IGZvciBkYXRhLCAxMyBmb3IgRS1kYXRhLCAyMSBpZGxlICovCisjZGVmaW5lIE1BWF9DX0JJVFMJMjUKKy8qIDI2MCBmb3IgRlIvRUZSLCAyNTYgZm9yIEFNUiwgMjY0IGZvciBPTSwgMjg4IGZvciBFLWRhdGEgKi8KKyNkZWZpbmUgTUFYX0RfQklUUwkyODgKKy8qIGZvciBhbGwgc3BlZWNoIGZyYW1lcyAqLworI2RlZmluZSBNQVhfVF9CSVRTCTQKKy8qIGZvciBPTSAqLworI2RlZmluZSBNQVhfU19CSVRTCTYKKy8qIGZvciBFLWRhdGEgKi8KKyNkZWZpbmUgTUFYX01fQklUUwkyCisKK3N0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgeworCXVfaW50OF90IGNfYml0c1tNQVhfQ19CSVRTXTsKKwl1X2ludDhfdCBkX2JpdHNbTUFYX0RfQklUU107CisJdV9pbnQ4X3QgdF9iaXRzW01BWF9UX0JJVFNdOworCXVfaW50OF90IHNfYml0c1tNQVhfU19CSVRTXTsKKwl1X2ludDhfdCBtX2JpdHNbTUFYX01fQklUU107Cit9OworCisjZGVmaW5lIFRSQVVfRlRfRlJfVVAJCTB4MDIJLyogMCAwIDAgMSAwIC0gMy41LjEuMS4xICovCisjZGVmaW5lIFRSQVVfRlRfRlJfRE9XTgkJMHgxYwkvKiAxIDEgMSAwIDAgLSAzLjUuMS4xLjEgKi8KKyNkZWZpbmUgVFJBVV9GVF9FRlIJCTB4MWEJLyogMSAxIDAgMSAwIC0gMy41LjEuMS4xICovCisjZGVmaW5lIFRSQVVfRlRfQU1SCQkweDA2CS8qIDAgMCAxIDEgMCAtIDMuNS4xLjIgKi8KKyNkZWZpbmUgVFJBVV9GVF9PTV9VUAkJMHgwNwkvKiAwIDAgMSAwIDEgLSAzLjUuMiAqLworI2RlZmluZSBUUkFVX0ZUX09NX0RPV04JCTB4MWIJLyogMSAxIDAgMSAxIC0gMy41LjIgKi8KKyNkZWZpbmUgVFJBVV9GVF9EQVRBX1VQCQkweDA4CS8qIDAgMSAwIDAgMCAtIDMuNS4zICovCisjZGVmaW5lIFRSQVVfRlRfREFUQV9ET1dOCTB4MTYJLyogMSAwIDEgMSAwIC0gMy41LjMgKi8KKyNkZWZpbmUgVFJBVV9GVF9EMTQ1X1NZTkMJMHgxNAkvKiAxIDAgMSAwIDAgLSAzLjUuMyAqLworI2RlZmluZSBUUkFVX0ZUX0VEQVRBCQkweDFmCS8qIDEgMSAxIDEgMSAtIDMuNS40ICovCisjZGVmaW5lIFRSQVVfRlRfSURMRV9VUAkJMHgxMAkvKiAxIDAgMCAwIDAgLSAzLjUuNSAqLworI2RlZmluZSBUUkFVX0ZUX0lETEVfRE9XTgkweDBlCS8qIDAgMSAxIDEgMCAtIDMuNS41ICovCisKKworaW50IGRlY29kZV90cmF1X2ZyYW1lKHN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgKmZyLCBjb25zdCB1X2ludDhfdCAqdHJhdV9iaXRzKTsKK2ludCBlbmNvZGVfdHJhdV9mcmFtZSh1X2ludDhfdCAqdHJhdV9iaXRzLCBjb25zdCBzdHJ1Y3QgZGVjb2RlZF90cmF1X2ZyYW1lICpmcik7CitpbnQgdHJhdV9mcmFtZV91cDJkb3duKHN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgKmZyKTsKK3VfaW50OF90ICp0cmF1X2lkbGVfZnJhbWUodm9pZCk7CisKKworI2VuZGlmIC8qIF9UUkFVX0ZSQU1FX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9vcGVuYnNjL3RyYXVfbXV4LmggYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmF1X211eC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkZWI3MDgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy90cmF1X211eC5oCkBAIC0wLDAgKzEsNDkgQEAKKy8qIFNpbXBsZSBUUkFVIGZyYW1lIHJlZmxlY3RvciB0byByb3V0ZSB2b2ljZSBjYWxscyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKy8qIFRoZSAiVFJBVSBtdXggbWFwIiBkZWZpbmVzIHdoaWNoIHBhcnRpY3VsYXIgMTZrYml0IHN1Yi1zbG90IChpbiB3aGljaCBFMQorICogdGltZXNsb3Qgb24gd2hpY2ggRTEgaW50ZXJmYWNlKSBzaG91bGQgYmUgZGlyZWN0bHkgbXV4ZWQgdG8gd2hpY2ggb3RoZXIgCisgKiBzdWItc2xvdC4gIEVudHJpZXMgaW4gdGhlIG11eCBtYXAgYXJlIGFsd2F5cyBiaS1kaXJlY3Rpb25hbC4gCisgKgorICogVGhlIGlkZWEgb2YgYWxsIHRoaXMgaXMgdG8gZGlyZWN0bHkgc3dpdGNoIHZvaWNlIGNoYW5uZWxzIGluIHRoZSBCU0MKKyAqIGZyb20gb25lIHBob25lIHRvIGFub3RoZXIuICBXZSBkbyB0aGlzIHJpZ2h0IG5vdyBzaW5jZSB3ZSBkb24ndCBzdXBwb3J0CisgKiBhbnkgZXh0ZXJuYWwgaW50ZXJmYWNlIGZvciB2b2ljZSBjaGFubmVscywgYW5kIGluIHRoZSBmdXR1cmUgYXMgYW4KKyAqIG9wdGltaXphdGlvbiB0byByb3V0aW5nIHRoZW0gZXh0ZXJuYWxseS4KKyAqLworCisvKiBtYXAgYSBUUkFVIG11eCBtYXAgZW50cnkgKi8KK2ludCB0cmF1X211eF9tYXAoY29uc3Qgc3RydWN0IGdzbV9lMV9zdWJzbG90ICpzcmMsCisJCSBjb25zdCBzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmRzdCk7CitpbnQgdHJhdV9tdXhfbWFwX2xjaGFuKGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKnNyYywJCisJCQljb25zdCBzdHJ1Y3QgZ3NtX2xjaGFuICpkc3QpOworCisvKiB1bm1hcCBhIFRSQVUgbXV4IG1hcCBlbnRyeSAqLworaW50IHRyYXVfbXV4X3VubWFwKGNvbnN0IHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqc3MsIHVfaW50MzJfdCBjYWxscmVmKTsKKworLyogd2UgZ2V0IGNhbGxlZCBieSBzdWJjaGFuX2RlbXV4ICovCitpbnQgdHJhdV9tdXhfaW5wdXQoc3RydWN0IGdzbV9lMV9zdWJzbG90ICpzcmNfZTFfc3MsCisJCSAgIGNvbnN0IHVfaW50OF90ICp0cmF1X2JpdHMsIGludCBudW1fYml0cyk7CisKKy8qIGFkZCBhIHRyYXUgcmVjZWl2ZXIgKi8KK2ludCB0cmF1X3JlY3ZfbGNoYW4oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50MzJfdCBjYWxscmVmKTsKKworLyogc2VuZCB0cmF1IGZyb20gYXBwbGljYXRpb24gKi8KK2ludCB0cmF1X3NlbmRfZnJhbWUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHN0cnVjdCBnc21fZGF0YV9mcmFtZSAqZnJhbWUpOwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdXNzZC5oIGIvb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdXNzZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzZWEzMWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy91c3NkLmgKQEAgLTAsMCArMSwxMCBAQAorI2lmbmRlZiBfVVNTRF9ICisjZGVmaW5lIF9VU1NEX0gKKworLyogSGFuZGxlciBmdW5jdGlvbiBmb3IgbW9iaWxlLW9yaWdpbmF0ZWQgVVNTRCBtZXNzYWdlcyAqLworCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorCitpbnQgaGFuZGxlX3Jjdl91c3NkKHN0cnVjdCBtc2diICptc2cpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS9zY2NwL01ha2VmaWxlLmFtIGIvb3BlbmJzYy9pbmNsdWRlL3NjY3AvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM4YTUxNwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS9zY2NwL01ha2VmaWxlLmFtCkBAIC0wLDAgKzEsMiBAQAorc2NjcF9IRUFERVJTID0gc2NjcF90eXBlcy5oIHNjY3AuaAorc2NjcGRpciA9ICQoaW5jbHVkZWRpcikvc2NjcApkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL3NjY3Avc2NjcC5oIGIvb3BlbmJzYy9pbmNsdWRlL3NjY3Avc2NjcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0MzQ3OWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvc2NjcC9zY2NwLmgKQEAgLTAsMCArMSwxNjcgQEAKKy8qCisgKiBTQ0NQIG1hbmFnZW1lbnQgY29kZQorICoKKyAqIChDKSAyMDA5LCAyMDEwIGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBTQ0NQX0gKKyNkZWZpbmUgU0NDUF9ICisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgInNjY3BfdHlwZXMuaCIKKworc3RydWN0IG1zZ2I7CitzdHJ1Y3Qgc2NjcF9zeXN0ZW07CisKK2VudW0geworCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9OT05FLAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRVFVRVNULAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9DT05GSVJNLAorCVNDQ1BfQ09OTkVDVElPTl9TVEFURV9FU1RBQkxJU0hFRCwKKwlTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVMRUFTRSwKKwlTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVMRUFTRV9DT01QTEVURSwKKwlTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVGVVNFRCwKKwlTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfU0VUVVBfRVJST1IsCit9OworCitzdHJ1Y3Qgc29ja2FkZHJfc2NjcCB7CisJc2FfZmFtaWx5X3QJc2NjcF9mYW1pbHk7CQkvKiBBRl9TQ0NQIGluIHRoZSBmdXR1cmU/Pz8gKi8KKwl1X2ludDhfdAlzY2NwX3NzbjsJCS8qIHN1YnNzeXN0ZW0gbnVtYmVyIGZvciByb3V0aW5nICovCisKKwkvKiBUT0RPIGZpbGwgaW4gYWRkcmVzcyBpbmRpY2F0b3IuLi4gaWYgdGhhdCBpcyBldmVyIG5lZWRlZCAqLworCisJLyogbm90IHN1cmUgYWJvdXQgdGhlc2UgKi8KKwkvKiB1X2ludDhfdCAgICBzY2NwX2NsYXNzOyAqLworfTsKKworLyoKKyAqIHBhcnNlZCBzdHJ1Y3R1cmUgb2YgYW4gYWRkcmVzcworICovCitzdHJ1Y3Qgc2NjcF9hZGRyZXNzIHsKKwlzdHJ1Y3Qgc2NjcF9jYWxsZWRfcGFydHlfYWRkcmVzcyAgICBhZGRyZXNzOworCXVfaW50OF90CQkJICAgIHNzbjsKKwl1X2ludDhfdAkJCSAgICBwb2lbMl07Cit9OworCitzdHJ1Y3Qgc2NjcF9vcHRpb25hbF9kYXRhIHsKKwl1X2ludDhfdAkJCSAgICBkYXRhX2xlbjsKKwl1X2ludDhfdAkJCSAgICBkYXRhX3N0YXJ0OworfTsKKworc3RydWN0IHNjY3BfY29ubmVjdGlvbiB7CisJLyogcHVibGljICovCisJdm9pZCAqZGF0YV9jdHg7CisJdm9pZCAoKmRhdGFfY2IpKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4sIHN0cnVjdCBtc2diICptc2csIHVuc2lnbmVkIGludCBsZW4pOworCisJdm9pZCAqc3RhdGVfY3R4OworCXZvaWQgKCpzdGF0ZV9jYikoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqLCBpbnQgb2xkX3N0YXRlKTsKKworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2Ugc291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlIGRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKworCWludCBjb25uZWN0aW9uX3N0YXRlOworCisJLyogcHJpdmF0ZSAqLworCS8qIGxpc3Qgb2YgYWN0aXZlIGNvbm5lY3Rpb25zICovCisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3Qgc2NjcF9zeXN0ZW0gKnN5c3RlbTsKKwlpbnQgaW5jb21pbmc7Cit9OworCisvKioKKyAqIHN5c3RlbSBmdW5jdGlvbmFsaXR5IHRvIGltcGxlbWVudCBvbiB0b3Agb2YgYW55IG90aGVyIHRyYW5zcG9ydCBsYXllcjoKKyAqICAgY2FsbCBzY2NwX3N5c3RlbV9pbmNvbWluZyBmb3IgaW5jb21pbmcgZGF0YSAoZnJvbSB0aGUgbmV0d29yaykKKyAqICAgc2NjcCB3aWxsIGNhbGwgb3V0Z29pbmcgd2hlbmV2ZXIgb3V0Z29pbmcgZGF0YSBleGlzdHMKKyAqLworaW50IHNjY3Bfc3lzdGVtX2luaXQoaW50ICgqb3V0Z29pbmcpKHN0cnVjdCBtc2diICpkYXRhLCB2b2lkICpjdHgpLCB2b2lkICpjb250ZXh0KTsKK2ludCBzY2NwX3N5c3RlbV9pbmNvbWluZyhzdHJ1Y3QgbXNnYiAqZGF0YSk7CisKKy8qKgorICogU2VuZCBkYXRhIG9uIGFuIGV4aXN0aW5nIGNvbm5lY3Rpb24KKyAqLworaW50IHNjY3BfY29ubmVjdGlvbl93cml0ZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBzdHJ1Y3QgbXNnYiAqZGF0YSk7CitpbnQgc2NjcF9jb25uZWN0aW9uX3NlbmRfaXQoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CitpbnQgc2NjcF9jb25uZWN0aW9uX2Nsb3NlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIGludCBjYXVzZSk7CitpbnQgc2NjcF9jb25uZWN0aW9uX2ZyZWUoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbik7CisKKy8qKgorICogQ3JlYXRlIGEgbmV3IHNvY2tldC4gU2V0IHlvdXIgY2FsbGJhY2tzIGFuZCB0aGVuIGNhbGwgYmluZCB0byBvcGVuCisgKiB0aGUgY29ubmVjdGlvbi4KKyAqLworc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqc2NjcF9jb25uZWN0aW9uX3NvY2tldCh2b2lkKTsKKworLyoqCisgKiBPcGVuIHRoZSBjb25uZWN0aW9uIGFuZCBzZW5kIGFkZGl0aW9uYWwgZGF0YQorICovCitpbnQgc2NjcF9jb25uZWN0aW9uX2Nvbm5lY3Qoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubiwKKwkJCSAgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqc2NjcF9jYWxsZWQsCisJCQkgICAgc3RydWN0IG1zZ2IgKmRhdGEpOworCisvKioKKyAqIG1vc3RseSBmb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LiBTZXQgdGhlIGFjY2VwdCBjYWxsYmFjay4KKyAqIFRPRE86IGFkZCB0cnVlIHJvdXRpbmcgaW5mb3JtYXRpb24uLi4gaW4gYW5hbG9neSB0byBzb2NrZXQsIGJpbmQsIGFjY2VwdAorICovCitpbnQgc2NjcF9jb25uZWN0aW9uX3NldF9pbmNvbWluZyhjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqc29jaywKKwkJCQkgaW50ICgqYWNjZXB0X2NiKShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCB2b2lkICpkYXRhKSwKKwkJCQkgdm9pZCAqdXNlcl9kYXRhKTsKKworLyoqCisgKiBTZW5kIGRhdGEgaW4gdGVybXMgb2YgdW5pdCBkYXRhLiBBIGZpeGVkIGFkZHJlc3MgaW5kaWNhdG9yIHdpbGwgYmUgdXNlZC4KKyAqLworaW50IHNjY3Bfd3JpdGUoc3RydWN0IG1zZ2IgKmRhdGEsCisJICAgICAgIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICpzb2NrX3NlbmRlciwKKwkgICAgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKnNvY2tfdGFyZ2V0LCBpbnQgY2xhc3MpOworaW50IHNjY3Bfc2V0X3JlYWQoY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKnNvY2ssCisJCSAgaW50ICgqcmVhZF9jYikoc3RydWN0IG1zZ2IgKm1zZ2IsIHVuc2lnbmVkIGludCwgdm9pZCAqdXNlcl9kYXRhKSwKKwkJICB2b2lkICp1c2VyX2RhdGEpOworCisvKiBnZW5lcmljIHNvY2sgYWRkcmVzc2VzICovCitleHRlcm4gY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3Agc2NjcF9zc25fYnNzYXA7CisKKy8qIGhlbHBlcnMgKi8KK3VfaW50MzJfdCBzY2NwX3NyY19yZWZfdG9faW50KHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgKnJlZik7CitzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlIHNjY3Bfc3JjX3JlZl9mcm9tX2ludCh1X2ludDMyX3QpOworCisvKioKKyAqIEJlbG93IHRoaXMgYXJlIGhlbHBlciBmdW5jdGlvbnMgYW5kIHN0cnVjdHMgZm9yIHBhcnNpbmcgU0NDUCBtZXNzYWdlcworICovCitzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgeworCXN0cnVjdCBzY2NwX2FkZHJlc3MgY2FsbGVkOworCXN0cnVjdCBzY2NwX2FkZHJlc3MgY2FsbGluZzsKKworCS8qIHBvaW50IHRvIHRoZSBtc2cgcGFja2V0ICovCisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSAqc291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlICpkZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisKKwkvKiBkYXRhIHBvaW50ZXIgKi8KKwlpbnQgZGF0YV9sZW47Cit9OworCisvKgorICogaGVscGVyIGZ1bmN0aW9ucyBmb3IgdGhlIG5hdCBjb2RlCisgKi8KK2ludCBzY2NwX2RldGVybWluZV9tc2dfdHlwZShzdHJ1Y3QgbXNnYiAqbXNnKTsKK2ludCBzY2NwX3BhcnNlX2hlYWRlcihzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgKnJlc3VsdCk7CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL3NjY3Avc2NjcF90eXBlcy5oIGIvb3BlbmJzYy9pbmNsdWRlL3NjY3Avc2NjcF90eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZmRhOTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvc2NjcC9zY2NwX3R5cGVzLmgKQEAgLTAsMCArMSw0MTQgQEAKKy8qCisgKiBJVFUgUS43MTMgZGVmaW5lZCB0eXBlcyBmb3IgU0NDUAorICoKKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2lmbmRlZiBTQ0NQX1RZUEVTX0gKKyNkZWZpbmUgU0NDUF9UWVBFU19ICisKKyNpbmNsdWRlIDxlbmRpYW4uaD4KKworLyogVGFibGUgMS9RLjcxMyAtIFNDQ1AgbWVzc2FnZSB0eXBlcyAqLworZW51bSBzY2NwX21lc3NhZ2VfdHlwZXMgeworCVNDQ1BfTVNHX1RZUEVfQ1IJPSAxLAorCVNDQ1BfTVNHX1RZUEVfQ0MJPSAyLAorCVNDQ1BfTVNHX1RZUEVfQ1JFRgk9IDMsCisJU0NDUF9NU0dfVFlQRV9STFNECT0gNCwKKwlTQ0NQX01TR19UWVBFX1JMQwk9IDUsCisJU0NDUF9NU0dfVFlQRV9EVDEJPSA2LAorCVNDQ1BfTVNHX1RZUEVfRFQyCT0gNywKKwlTQ0NQX01TR19UWVBFX0FLCT0gOCwKKwlTQ0NQX01TR19UWVBFX1VEVAk9IDksCisJU0NDUF9NU0dfVFlQRV9VRFRTCT0gMTAsCisJU0NDUF9NU0dfVFlQRV9FRAk9IDExLAorCVNDQ1BfTVNHX1RZUEVfRUEJPSAxMiwKKwlTQ0NQX01TR19UWVBFX1JTUgk9IDEzLAorCVNDQ1BfTVNHX1RZUEVfUlNDCT0gMTQsCisJU0NDUF9NU0dfVFlQRV9FUlIJPSAxNSwKKwlTQ0NQX01TR19UWVBFX0lUCT0gMTYsCisJU0NDUF9NU0dfVFlQRV9YVURUCT0gMTcsCisJU0NDUF9NU0dfVFlQRV9YVURUUwk9IDE4LAorCVNDQ1BfTVNHX1RZUEVfTFVEVAk9IDE5LAorCVNDQ1BfTVNHX1RZUEVfTFVEVFMJPSAyMAorfTsKKworLyogVGFibGUgMi9RLjcxMyAtIFNDQ1AgcGFyYW1ldGVyIG5hbWUgY29kZXMgKi8KK2VudW0gc2NjcF9wYXJhbWV0ZXJfbmFtZV9jb2RlcyB7CisJU0NDUF9QTkNfRU5EX09GX09QVElPTkFMCQk9IDAsCisJU0NDUF9QTkNfREVTVElOQVRJT05fTE9DQUxfUkVGRVJFTkNFCT0gMSwKKwlTQ0NQX1BOQ19TT1VSQ0VfTE9DQUxfUkVGRVJFTkNFCQk9IDIsCisJU0NDUF9QTkNfQ0FMTEVEX1BBUlRZX0FERFJFU1MJCT0gMywKKwlTQ0NQX1BOQ19DQUxMSU5HX1BBUlRZX0FERFJFU1MJCT0gNCwKKwlTQ0NQX1BOQ19QUk9UT0NPTF9DTEFTUwkJCT0gNSwKKwlTQ0NQX1BOQ19TRUdNRU5USU5HCQkJPSA2LAorCVNDQ1BfUE5DX1JFQ0VJVkVfU0VRX05VTUJFUgkJPSA3LAorCVNDQ1BfUE5DX1NFUVVFTkNJTkcJCQk9IDgsCisJU0NDUF9QTkNfQ1JFRElUCQkJCT0gOSwKKwlTQ0NQX1BOQ19SRUxFQVNFX0NBVVNFCQkJPSAxMCwKKwlTQ0NQX1BOQ19SRVRVUk5fQ0FVU0UJCQk9IDExLAorCVNDQ1BfUE5DX1JFU0VUX0NBVVNFCQkJPSAxMiwKKwlTQ0NQX1BOQ19FUlJPUl9DQVVTRQkJCT0gMTMsCisJU0NDUF9QTkNfUkVGVVNBTF9DQVVTRQkJCT0gMTQsCisJU0NDUF9QTkNfREFUQQkJCQk9IDE1LAorCVNDQ1BfUE5DX1NFR01FTlRBVElPTgkJCT0gMTYsCisJU0NDUF9QTkNfSE9QX0NPVU5URVIJCQk9IDE3LAorCVNDQ1BfUE5DX0lNUE9SVEFOQ0UJCQk9IDE4LAorCVNDQ1BfUE5DX0xPTkdfREFUQQkJCT0gMTksCit9OworCisvKiBGaWd1cmUgMy9RLjcxMyBDYWxsZWQvY2FsbGluZyBwYXJ0eSBhZGRyZXNzICovCitlbnVtIHsKKwlTQ0NQX1RJVExFX0lORF9OT05FCQkJPSAwLAorCVNDQ1BfVElUTEVfSU5EX05BVFVSRV9PTkxZCQk9IDEsCisJU0NDUF9USVRMRV9JTkRfVFJBTlNMQVRJT05fT05MWQkJPSAyLAorCVNDQ1BfVElUTEVfSU5EX1RSQU5TX05VTV9FTkMJCT0gMywKKwlTQ0NQX1RJVExFX0lORF9UUkFOU19OVU1fRU5DX05BVFVSRQk9IDQsCit9OworCitlbnVtIHsKKwlTQ0NQX0NBTExfUk9VVEVfT05fU1NOCQkJPSAxLAorCVNDQ1BfQ0FMTF9ST1VURV9PTl9HVAkJCT0gMCwKK307CisKK3N0cnVjdCBzY2NwX2NhbGxlZF9wYXJ0eV9hZGRyZXNzIHsKKyNpZiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOCisJdV9pbnQ4X3QJcG9pbnRfY29kZV9pbmRpY2F0b3IgOiAxLAorCQkJc3NuX2luZGljYXRvcgkgICAgIDogMSwKKwkJCWdsb2JhbF90aXRsZV9pbmRpY2F0b3IgOiA0LAorCQkJcm91dGluZ19pbmRpY2F0b3IgICAgOiAxLAorCQkJcmVzZXJ2ZWQJICAgICA6IDE7CisjZWxpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdV9pbnQ4X3QJcmVzZXJ2ZWQJICAgICA6IDEsCisJCQlyb3V0aW5nX2luZGljYXRvciAgICA6IDEsCisJCQlnbG9iYWxfdGl0bGVfaW5kaWNhdG9yIDogNCwKKwkJCXNzbl9pbmRpY2F0b3IJICAgICA6IDEsCisJCQlwb2ludF9jb2RlX2luZGljYXRvciA6IDE7CisjZW5kaWYKKwl1X2ludDhfdAlkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworLyogaW5kaWNhdG9yIGluZGljYXRlcyBwcmVzZW5jZSBpbiB0aGUgYWJvdmUgb3JkZXIgKi8KKworLyogRmlndXJlIDYvUS43MTMgKi8KK3N0cnVjdCBzY2NwX3NpZ25hbGxpbmdfcG9pbnRfY29kZSB7CisJdV9pbnQ4X3QJbHNiOworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKwl1X2ludDhfdAltc2IgOiA2LAorCQkJcmVzZXJ2ZWQgOiAyOworI2VsaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCXVfaW50OF90CXJlc2VydmVkIDogMiwKKwkJCW1zYiA6IDY7CisjZW5kaWYKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIFNTTiA9PSBzdWJzeXN0ZW0gbnVtYmVyICovCitlbnVtIHNjY3Bfc3Vic3lzdGVtX251bWJlciB7CisJU0NDUF9TU05fTk9UX0tOT1dOX09SX1VTRUQJICAgID0gMCwKKwlTQ0NQX1NTTl9NQU5BR0VNRU5UCQkgICAgPSAxLAorCVNDQ1BfU1NOX1JFU0VSVkVEX0lUVQkJICAgID0gMiwKKwlTQ0NQX1NTTl9JU0ROX1VTRVJfUEFSVAkJICAgID0gMywKKwlTQ0NQX1NTTl9PTUFQCQkJICAgID0gNCwgLyogb3BlcmF0aW9uLCBtYWludCBhbmQgYWRtaW5pc3RyYXRpb24gcGFydCAqLworCVNDQ1BfU1NOX01BUAkJCSAgICA9IDUsIC8qIG1vYmlsZSBhcHBsaWNhdGlvbiBwYXJ0ICovCisJU0NDUF9TU05fSExSCQkJICAgID0gNiwKKwlTQ0NQX1NTTl9WTFIJCQkgICAgPSA3LAorCVNDQ1BfU1NOX01TQwkJCSAgICA9IDgsCisJU0NDUF9TU05fRUlDCQkJICAgID0gOSwgLyogZXF1aXBlbnQgaWRlbnRpZmllciBjZW50cmUgKi8KKwlTQ0NQX1NTTl9BVUMJCQkgICAgPSAxMCwgLyogYXV0aGVudGljYXRpb24gY2VudHJlICovCisJU0NDUF9TU05fSVNETl9TVVBQTF9TRVJWSUNFUwkgICAgPSAxMSwKKwlTQ0NQX1NTTl9SRVNFUlZFRF9JTlRMCQkgICAgPSAxMiwKKwlTQ0NQX1NTTl9JU0ROX0VER0VfVE9fRURHRQkgICAgPSAxMywKKwlTQ0NQX1NTTl9UQ19URVNUX1JFU1BPTkRFUgkgICAgPSAxNCwKKworCS8qIEZyb20gR1NNIDAzLjAzIDguMiAqLworCVNDQ1BfU1NOX0JTU0FQCQkJICAgID0gMjU0LAorCVNDQ1BfU1NOX0JTU09NCQkJICAgID0gMjUzLAorfTsKKworLyogUS43MTMsIDMuNC4yLjMgKi8KK2VudW0geworCVNDQ1BfTkFJX1VOS05PV04JCSAgICA9IDAsCisJU0NDUF9OQUlfU1VCU0NSSUJFUl9OVU1CRVIJICAgID0gMSwKKwlTQ0NQX05BSV9SRVNFUlZFRF9OQVRJT05BTAkgICAgPSAyLAorCVNDQ1BfTkFJX05BVElPTkFMX1NJR05JRklDQU5UCSAgICA9IDMsCisJU0NDUF9OQUlfSU5URVJOQVRJT05BTAkJICAgID0gNCwKK307CisKK3N0cnVjdCBzY2NwX2dsb2JhbF90aXRsZSB7CisjaWYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTgorCXVfaW50OF90CW5hdHVyZV9vZl9hZGRyX2luZCA6IDcsCisJCQlvZGRfZXZlbiA6IDE7CisjZWxpZiBfX0JZVEVfT1JERVIgPT0gX19CSUdfRU5ESUFOCisJdV9pbnQ4X3QJb2RkX2V2ZW4gOiAxLAorCQkJbmF0dXJlX29mX2FkZHJfaW5kIDogNzsKKyNlbmRpZgorCXVfaW50OF90CWRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisvKiBRLjcxMywgMy4zICovCitzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlIHsKKwl1X2ludDhfdCAgICBvY3RldDE7CisJdV9pbnQ4X3QgICAgb2N0ZXQyOworCXVfaW50OF90ICAgIG9jdGV0MzsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKy8qIFEuNzE0LCAzLjYgKi8KK2VudW0gc2NjcF9wcm90b2NvbF9jbGFzcyB7CisJU0NDUF9QUk9UT0NPTF9DTEFTU18wCQkgICAgPSAwLAorCVNDQ1BfUFJPVE9DT0xfQ0xBU1NfMQkJICAgID0gMSwKKwlTQ0NQX1BST1RPQ09MX0NMQVNTXzIJCSAgICA9IDIsCisJU0NDUF9QUk9UT0NPTF9DTEFTU18zCQkgICAgPSAzLAorfTsKKworLyogYml0cyA1LTggd2hlbiBjbGFzczAsIGNsYXNzMSBpcyB1c2VkICovCitlbnVtIHNjY3BfcHJvdG9jb2xfb3B0aW9ucyB7CisJU0NDUF9QUk9UT0NPTF9OT19TUEVDSUFMCSAgICA9IDAsCisJU0NDUF9QUk9UT0NPTF9SRVRVUk5fTUVTU0FHRQkgICAgPSA4LAorfTsKKworZW51bSBzY2NwX3JlbGVhc2VfY2F1c2UgeworCVNDQ1BfUkVMRUFTRV9DQVVTRV9FTkRfVVNFUl9PUklHSU5BVEVECSAgICA9IDAsCisJU0NDUF9SRUxFQVNFX0NBVVNFX0VORF9VU0VSX0NPTkdFU1RJT04JICAgID0gMSwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfRU5EX1VTRVJfRkFJTFVSRQkgICAgPSAyLAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9TQ0NQX1VTRVJfT1JJR0lOQVRFRAkgICAgPSAzLAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9SRU1PVEVfUFJPQ0VEVVJFX0VSUk9SICAgPSA0LAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9JTkNPTlNJU1RFTlRfQ09OTl9EQVRBICAgPSA1LAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9BQ0NFU1NfRkFJTFVSRQkgICAgPSA2LAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9BQ0NFU1NfQ09OR0VTVElPTgkgICAgPSA3LAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9TVUJTWVNURU1fRkFJTFVSRQkgICAgPSA4LAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9TVUJTWVNURU1fQ09OR0VTVElPTgkgICAgPSA5LAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9NVFBfRkFJTFVSRQkJICAgID0gMTAsCisJU0NDUF9SRUxFQVNFX0NBVVNFX05FVFdPUktfQ09OR0VTVElPTgkgICAgPSAxMSwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfRVhQSVJBVElPTl9SRVNFVAkgICAgPSAxMiwKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfRVhQSVJBVElPTl9JTkFDVElWRQkgICAgPSAxMywKKwlTQ0NQX1JFTEVBU0VfQ0FVU0VfUkVTRVJWRUQJCSAgICA9IDE0LAorCVNDQ1BfUkVMRUFTRV9DQVVTRV9VTlFVQUxJRklFRAkJICAgID0gMTUsCisJU0NDUF9SRUxFQVNFX0NBVVNFX1NDQ1BfRkFJTFVSRQkJICAgID0gMTYsCit9OworCitlbnVtIHNjY3BfcmV0dXJuX2NhdXNlIHsKKwlTQ0NQX1JFVFVSTl9DQVVTRV9OT19UUkFOU0xBVElPTl9OQVRVUkUJICAgID0gMCwKKwlTQ0NQX1JFVFVSTl9DQVVTRV9OT19UUkFOU0xBVElPTgkgICAgPSAxLAorCVNDQ1BfUkVUVVJOX0NBVVNFX1NVQlNZU1RFTV9DT05HRVNUSU9OCSAgICA9IDIsCisJU0NDUF9SRVRVUk5fQ0FVU0VfU1VCU1lTVEVNX0ZBSUxVUkUJICAgID0gMywKKwlTQ0NQX1JFVFVSTl9DQVVTRV9VTkVRVUlQUEVEX1VTRVIJICAgID0gNCwKKwlTQ0NQX1JFVFVSTl9DQVVTRV9NVFBfRkFJTFVSRQkJICAgID0gNSwKKwlTQ0NQX1JFVFVSTl9DQVVTRV9ORVRXT1JLX0NPTkdFU1RJT04JICAgID0gNiwKKwlTQ0NQX1JFVFVSTl9DQVVTRV9VTlFVQUxJRklFRAkJICAgID0gNywKKwlTQ0NQX1JFVFVSTl9DQVVTRV9FUlJPUl9JTl9NU0dfVFJBTlNQT1JUICAgID0gOCwKKwlTQ0NQX1JFVFVSTl9DQVVTRV9FUlJPUl9JTl9MT0NBTF9QUk9DRVNTSU5HID0gOSwKKwlTQ0NQX1JFVFVSTl9DQVVTRV9ERVNUX0NBTk5PVF9QRVJGT1JNX1JFQVNTRU1CTFkgPSAxMCwKKwlTQ0NQX1JFVFVSTl9DQVVTRV9TQ0NQX0ZBSUxVUkUJCSAgICA9IDExLAorCVNDQ1BfUkVUVVJOX0NBVVNFX0hPUF9DT1VOVEVSX1ZJT0xBVElPTgkgICAgPSAxMiwKKwlTQ0NQX1JFVFVSTl9DQVVTRV9TRUdNRU5UQVRJT05fTk9UX1NVUFBPUlRFRD0gMTMsCisJU0NDUF9SRVRVUk5fQ0FVU0VfU0VHTUVOVEFUSU9OX0ZBT0xVUkUJICAgID0gMTQKK307CisKK2VudW0gc2NjcF9yZXNldF9jYXVzZSB7CisJU0NDUF9SRVNFVF9DQVVTRV9FTkRfVVNFUl9PUklHSU5BVEVECSAgICA9IDAsCisJU0NDUF9SRVNFVF9DQVVTRV9TQ0NQX1VTRVJfT1JJR0lOQVRFRAkgICAgPSAxLAorCVNDQ1BfUkVTRVRfQ0FVU0VfTVNHX09VVF9PRl9PUkRFUl9QUwkgICAgPSAyLAorCVNDQ1BfUkVTRVRfQ0FVU0VfTVNHX09VVF9PRl9PUkRFUl9QUgkgICAgPSAzLAorCVNDQ1BfUkVTRVRfQ0FVU0VfUlBDX09VVF9PRl9XSU5ET1cJICAgID0gNCwKKwlTQ0NQX1JFU0VUX0NBVVNFX1JQQ19JTkNPUlJFQ1RfUFMJICAgID0gNSwKKwlTQ0NQX1JFU0VUX0NBVVNFX1JQQ19HRU5FUkFMCQkgICAgPSA2LAorCVNDQ1BfUkVTRVRfQ0FVU0VfUkVNT1RFX0VORF9VU0VSX09QRVJBVElPTkFMPSA3LAorCVNDQ1BfUkVTRVRfQ0FVU0VfTkVUV09SS19PUEVSQVRJT05BTAkgICAgPSA4LAorCVNDQ1BfUkVTRVRfQ0FVU0VfQUNDRVNTX09QRVJBVElPTkFMCSAgICA9IDksCisJU0NDUF9SRVNFVF9DQVVTRV9ORVRXT1JLX0NPTkdFU1RJT04JICAgID0gMTAsCisJU0NDUF9SRVNFVF9DQVVTRV9SRVNFUlZFRAkJICAgID0gMTEsCit9OworCitlbnVtIHNjY3BfZXJyb3JfY2F1c2UgeworCVNDQ1BfRVJST1JfTFJOX01JU01BVENIX1VOQVNTSUdORUQJICAgID0gMCwgLyogbG9jYWwgcmVmZXJlbmNlIG51bWJlciAqLworCVNDQ1BfRVJST1JfTFJOX01JU01BVENIX0lOQ09OU0lTVEVOVAkgICAgPSAxLAorCVNDQ1BfRVJST1JfUE9JTlRfQ09ERV9NSVNNQVRDSAkJICAgID0gMiwKKwlTQ0NQX0VSUk9SX1NFUlZJQ0VfQ0xBU1NfTUlTTUFUQ0gJICAgID0gMywKKwlTQ0NQX0VSUk9SX1VOUVVBTElGSUVECQkJICAgID0gNCwKK307CisKK2VudW0gc2NjcF9yZWZ1c2FsX2NhdXNlIHsKKwlTQ0NQX1JFRlVTQUxfRU5EX1VTRVJfT1JJR0lOQVRFRAkgICAgPSAwLAorCVNDQ1BfUkVGVVNBTF9FTkRfVVNFUl9DT05HRVNUSU9OCSAgICA9IDEsCisJU0NDUF9SRUZVU0FMX0VORF9VU0VSX0ZBSUxVUkUJCSAgICA9IDIsCisJU0NDUF9SRUZVU0FMX1NDQ1BfVVNFUl9PUklHSU5BVEVECSAgICA9IDMsCisJU0NDUF9SRUZVU0FMX0RFU1RJTkFUSU9OX0FERFJFU1NfVUtOT1dOCSAgICA9IDQsCisJU0NDUF9SRUZVU0FMX0RFU1RJTkFUSU9OX0lOQUNDRVNTSUJMRQkgICAgPSA1LAorCVNDQ1BfUkVGVVNBTF9ORVRfUU9TX05PTl9UUkFOU0lFTlQJICAgID0gNiwKKwlTQ0NQX1JFRlVTQUxfTkVUX1FPU19UUkFOU0lFTlQJCSAgICA9IDcsCisJU0NDUF9SRUZVU0FMX0FDQ0VTU19GQUlMVVJFCQkgICAgPSA4LAorCVNDQ1BfUkVGVVNBTF9BQ0NFU1NfQ09OR0VTVElPTgkJICAgID0gOSwKKwlTQ0NQX1JFRlVTQUxfU1VCU1lTVEVNX0ZBSUxVUkUJCSAgICA9IDEwLAorCVNDQ1BfUkVGVVNBTF9TVUJTWVRFTV9DT05HRVNUSU9OCSAgICA9IDExLAorCVNDQ1BfUkVGVVNBTF9FWFBJUkFUSU9OCQkJICAgID0gMTIsCisJU0NDUF9SRUZVU0FMX0lOQ09NUEFUSUJMRV9VU0VSX0RBVEEJICAgID0gMTMsCisJU0NDUF9SRUZVU0FMX1JFU0VSVkVECQkJICAgID0gMTQsCisJU0NDUF9SRUZVU0FMX1VOUVVBTElGSUVECQkgICAgPSAxNSwKKwlTQ0NQX1JFRlVTQUxfSE9QX0NPVU5URVJfVklPTEFUSU9OCSAgICA9IDE2LAorCVNDQ1BfUkVGVVNBTF9TQ0NQX0ZBSUxVUkUJCSAgICA9IDE3LAorCVNDQ1BfUkVGVVNBTF9VTkVRVUlQUEVEX1VTRVIJCSAgICA9IDE4LAorfTsKKworLyoKKyAqIG1lc3NhZ2VzLi4uIGFzIG9mIFEuNzEzIENoYXB0ZXIgNAorICovCitzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlcXVlc3QgeworCS8qIG1hbmRhbnRvcnkgKi8KKwl1X2ludDhfdAkJCXR5cGU7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlzb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCXVfaW50OF90CQkJcHJvdG9fY2xhc3M7CisKKworCS8qIHZhcmlhYmxlICovCisJdV9pbnQ4X3QJCQl2YXJpYWJsZV9jYWxsZWQ7CisjaWYgVkFSSUFCTEUKKwljYWxsZWRfcGFydHlfYWRkcmVzcworI2VuZGlmCisKKwkvKiBvcHRpb25hbCAqLworCXVfaW50OF90CQkJb3B0aW9uYWxfc3RhcnQ7CisKKyNpZiBPUFRJT05BTAorCWNyZWRpdCAzCisJY2FsbGluZ3BhcnR5IHZhciA0LW4KKwlkYXRhICAgICAgICAgICAgMy0xMzAKKwlob3BfY291bnRlciAgICAgMworCWltcG9ydGFuY2UgICAgICAzCisJZW5kX29mX29wdGlvbmFsIDEKKyNlbmRpZgorCisJdV9pbnQ4X3QJCQlkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNjY3BfY29ubmVjdGlvbl9jb25maXJtIHsKKwkvKiBtYW5kYW50b3J5ICovCisJdV9pbnQ4X3QJCQl0eXBlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJc291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKwl1X2ludDhfdAkJCXByb3RvX2NsYXNzOworCisJLyogb3B0aW9uYWwgKi8KKwl1X2ludDhfdAkJCW9wdGlvbmFsX3N0YXJ0OworCisJLyogb3B0aW9uYWwgKi8KKyNpZiBPUFRJT05BTAorCWNyZWRpdCAzCisJY2FsbGVkIHBhcnR5IDQKKwlkYXRhICAgICAgICAgICAgMy0xMzAKKwlpbXBvcnRhbmNlICAgICAgMworCWVuZF9vZl9vcHRpb25hbCAxCisjZW5kaWYKKworCXVfaW50OF90CQkJZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVmdXNlZCB7CisJLyogbWFuZGFudG9yeSAqLworCXVfaW50OF90CQkJdHlwZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCWRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKwl1X2ludDhfdAkJCWNhdXNlOworCisJLyogb3B0aW9uYWwgKi8KKwl1X2ludDhfdAkJCW9wdGlvbmFsX3N0YXJ0OworCisJLyogb3B0aW9uYWwgKi8KKyNpZiBPUFRJT05BTAorCWNhbGxlZCBwYXJ0eSA0CisJZGF0YSAgICAgICAgICAgIDMtMTMwCisJaW1wb3J0YW5jZSAgICAgIDMKKwllbmRfb2Zfb3B0aW9uYWwgMQorI2VuZGlmCisKKwl1X2ludDhfdAkJCWRhdGFbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlbGVhc2VkIHsKKwkvKiBtYW5kYW50b3J5ICovCisJdV9pbnQ4X3QJCQl0eXBlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UJc291cmNlX2xvY2FsX3JlZmVyZW5jZTsKKwl1X2ludDhfdAkJCXJlbGVhc2VfY2F1c2U7CisKKworCS8qIG9wdGlvbmFsICovCisJdV9pbnQ4X3QJCQlvcHRpb25hbF9zdGFydDsKKworI2lmIE9QVElPTkFMCisJZGF0YSAgICAgICAgICAgIDMtMTMwCisJaW1wb3J0YW5jZSAgICAgIDMKKwllbmRfb2Zfb3B0aW9uYWwgMQorI2VuZGlmCisJdV9pbnQ4X3QJCQlkYXRhWzBdOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlX2NvbXBsZXRlIHsKKwl1X2ludDhfdAkJCXR5cGU7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlkZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlzb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHNjY3BfZGF0YV9mb3JtMSB7CisJLyogbWFuZGFudG9yeSAqLworCXVfaW50OF90CQkJdHlwZTsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlCWRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKwl1X2ludDhfdAkJCXNlZ21lbnRpbmc7CisKKwkvKiB2YXJpYWJsZSAqLworCXVfaW50OF90CQkJdmFyaWFibGVfc3RhcnQ7CisKKyNpZiBWQVJJQUJMRQorCWRhdGEgMi0yNTY7CisjZW5kaWYKKworCXVfaW50OF90CQkJZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworc3RydWN0IHNjY3BfZGF0YV91bml0ZGF0YSB7CisJLyogbWFuZGFudG9yeSAqLworCXVfaW50OF90CQkJdHlwZTsKKwl1X2ludDhfdAkJCXByb3RvX2NsYXNzOworCisKKwkvKiB2YXJpYWJsZSAqLworCXVfaW50OF90CQkJdmFyaWFibGVfY2FsbGVkOworCXVfaW50OF90CQkJdmFyaWFibGVfY2FsbGluZzsKKwl1X2ludDhfdAkJCXZhcmlhYmxlX2RhdGE7CisKKyNpZiBWQVJJQUJMRQorCWNhbGxlZCBwYXJ0eSBhZGRyZXNzCisJY2FsbGluZyBwYXJ0eSBhZGRyZXNzCisjZW5kaWYKKworCXVfaW50OF90CQkJZGF0YVswXTsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBzY2NwX2RhdGFfaXQgeworCS8qIG1hbmRhbnRvcnkgKi8KKwl1X2ludDhfdAkJCXR5cGU7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlkZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZQlzb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCXVfaW50OF90CQkJcHJvdG9fY2xhc3M7CisKKwl1X2ludDhfdAkJCXNlcXVlbmNpbmdbMl07CisJdV9pbnQ4X3QJCQljcmVkaXQ7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZW5kaWYKZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS92dHkvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL2luY2x1ZGUvdnR5L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2NzQ3NjYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvdnR5L01ha2VmaWxlLmFtCkBAIC0wLDAgKzEgQEAKK25vaW5zdF9IRUFERVJTID0gYnVmZmVyLmggY29tbWFuZC5oICB2ZWN0b3IuaCB2dHkuaApkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL3Z0eS9idWZmZXIuaCBiL29wZW5ic2MvaW5jbHVkZS92dHkvYnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE1MTk0MAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS92dHkvYnVmZmVyLmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBCdWZmZXJpbmcgdG8gb3V0cHV0IGFuZCBpbnB1dC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCBLdW5paGlybyBJc2hpZ3VybworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBaZWJyYS4KKyAqCisgKiBHTlUgWmVicmEgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEdOVSBaZWJyYSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIFplYnJhOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX1pFQlJBX0JVRkZFUl9ICisjZGVmaW5lIF9aRUJSQV9CVUZGRVJfSAorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKy8qIENyZWF0ZSBhIG5ldyBidWZmZXIuICBNZW1vcnkgd2lsbCBiZSBhbGxvY2F0ZWQgaW4gY2h1bmtzIG9mIHRoZSBnaXZlbgorICAgc2l6ZS4gIElmIHRoZSBhcmd1bWVudCBpcyAwLCB0aGUgbGlicmFyeSB3aWxsIHN1cHBseSBhIHJlYXNvbmFibGUKKyAgIGRlZmF1bHQgc2l6ZSBzdWl0YWJsZSBmb3IgYnVmZmVyaW5nIHNvY2tldCBJL08uICovCitzdHJ1Y3QgYnVmZmVyICpidWZmZXJfbmV3KHNpemVfdCk7CisKKy8qIEZyZWUgYWxsIGRhdGEgaW4gdGhlIGJ1ZmZlci4gKi8KK3ZvaWQgYnVmZmVyX3Jlc2V0KHN0cnVjdCBidWZmZXIgKik7CisKKy8qIFRoaXMgZnVuY3Rpb24gZmlyc3QgY2FsbHMgYnVmZmVyX3Jlc2V0IHRvIHJlbGVhc2UgYWxsIGJ1ZmZlcmVkIGRhdGEuCisgICBUaGVuIGl0IGZyZWVzIHRoZSBzdHJ1Y3QgYnVmZmVyIGl0c2VsZi4gKi8KK3ZvaWQgYnVmZmVyX2ZyZWUoc3RydWN0IGJ1ZmZlciAqKTsKKworLyogQWRkIHRoZSBnaXZlbiBkYXRhIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4gKi8KK2V4dGVybiB2b2lkIGJ1ZmZlcl9wdXQoc3RydWN0IGJ1ZmZlciAqLCBjb25zdCB2b2lkICosIHNpemVfdCk7CisvKiBBZGQgYSBzaW5nbGUgY2hhcmFjdGVyIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4gKi8KK2V4dGVybiB2b2lkIGJ1ZmZlcl9wdXRjKHN0cnVjdCBidWZmZXIgKiwgdV9jaGFyKTsKKy8qIEFkZCBhIE5VTC10ZXJtaW5hdGVkIHN0cmluZyB0byB0aGUgZW5kIG9mIHRoZSBidWZmZXIuICovCitleHRlcm4gdm9pZCBidWZmZXJfcHV0c3RyKHN0cnVjdCBidWZmZXIgKiwgY29uc3QgY2hhciAqKTsKKworLyogQ29tYmluZSBhbGwgYWNjdW11bGF0ZWQgKGFuZCB1bmZsdXNoZWQpIGRhdGEgaW5zaWRlIHRoZSBidWZmZXIgaW50byBhCisgICBzaW5nbGUgTlVMLXRlcm1pbmF0ZWQgc3RyaW5nIGFsbG9jYXRlZCB1c2luZyBYTUFMTE9DKE1UWVBFX1RNUCkuICBOb3RlCisgICB0aGF0IHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgYWx0ZXIgdGhlIHN0YXRlIG9mIHRoZSBidWZmZXIsIHNvIHRoZSBkYXRhCisgICBpcyBzdGlsbCBpbnNpZGUgd2FpdGluZyB0byBiZSBmbHVzaGVkLiAqLworY2hhciAqYnVmZmVyX2dldHN0cihzdHJ1Y3QgYnVmZmVyICopOworCisvKiBSZXR1cm5zIDEgaWYgdGhlcmUgaXMgbm8gcGVuZGluZyBkYXRhIGluIHRoZSBidWZmZXIuICBPdGhlcndpc2UgcmV0dXJucyAwLiAqLworaW50IGJ1ZmZlcl9lbXB0eShzdHJ1Y3QgYnVmZmVyICopOworCit0eXBlZGVmIGVudW0geworCS8qIEFuIEkvTyBlcnJvciBvY2N1cnJlZC4gIFRoZSBidWZmZXIgc2hvdWxkIGJlIGRlc3Ryb3llZCBhbmQgdGhlCisJICAgZmlsZSBkZXNjcmlwdG9yIHNob3VsZCBiZSBjbG9zZWQuICovCisJQlVGRkVSX0VSUk9SID0gLTEsCisKKwkvKiBUaGUgZGF0YSB3YXMgd3JpdHRlbiBzdWNjZXNzZnVsbHksIGFuZCB0aGUgYnVmZmVyIGlzIG5vdyBlbXB0eQorCSAgICh0aGVyZSBpcyBubyBwZW5kaW5nIGRhdGEgd2FpdGluZyB0byBiZSBmbHVzaGVkKS4gKi8KKwlCVUZGRVJfRU1QVFkgPSAwLAorCisJLyogVGhlcmUgaXMgcGVuZGluZyBkYXRhIGluIHRoZSBidWZmZXIgd2FpdGluZyB0byBiZSBmbHVzaGVkLiAgUGxlYXNlCisJICAgdHJ5IGZsdXNoaW5nIHRoZSBidWZmZXIgd2hlbiBzZWxlY3QgaW5kaWNhdGVzIHRoYXQgdGhlIGZpbGUgZGVzY3JpcHRvcgorCSAgIGlzIHdyaXRlYWJsZS4gKi8KKwlCVUZGRVJfUEVORElORyA9IDEKK30gYnVmZmVyX3N0YXR1c190OworCisvKiBUcnkgdG8gd3JpdGUgdGhpcyBkYXRhIHRvIHRoZSBmaWxlIGRlc2NyaXB0b3IuICBBbnkgZGF0YSB0aGF0IGNhbm5vdAorICAgYmUgd3JpdHRlbiBpbW1lZGlhdGVseSBpcyBhZGRlZCB0byB0aGUgYnVmZmVyIHF1ZXVlLiAqLworZXh0ZXJuIGJ1ZmZlcl9zdGF0dXNfdCBidWZmZXJfd3JpdGUoc3RydWN0IGJ1ZmZlciAqLCBpbnQgZmQsCisJCQkJICAgIGNvbnN0IHZvaWQgKiwgc2l6ZV90KTsKKworLyogVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBmbHVzaCBzb21lIChidXQgcGVyaGFwcyBub3QgYWxsKSBvZgorICAgdGhlIHF1ZXVlZCBkYXRhIHRvIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IuICovCitleHRlcm4gYnVmZmVyX3N0YXR1c190IGJ1ZmZlcl9mbHVzaF9hdmFpbGFibGUoc3RydWN0IGJ1ZmZlciAqLCBpbnQgZmQpOworCisvKiBUaGUgZm9sbG93aW5nIDIgZnVuY3Rpb25zIChidWZmZXJfZmx1c2hfYWxsIGFuZCBidWZmZXJfZmx1c2hfd2luZG93KQorICAgYXJlIGZvciB1c2UgaW4gbGliL3Z0eS5jIG9ubHkuICBUaGV5IHNob3VsZCBub3QgYmUgdXNlZCBlbHNld2hlcmUuICovCisKKy8qIENhbGwgYnVmZmVyX2ZsdXNoX2F2YWlsYWJsZSByZXBlYXRlZGx5IHVudGlsIGVpdGhlciBhbGwgZGF0YSBoYXMgYmVlbgorICAgZmx1c2hlZCwgb3IgYW4gSS9PIGVycm9yIGhhcyBiZWVuIGVuY291bnRlcmVkLCBvciB0aGUgb3BlcmF0aW9uIHdvdWxkCisgICBibG9jay4gKi8KK2V4dGVybiBidWZmZXJfc3RhdHVzX3QgYnVmZmVyX2ZsdXNoX2FsbChzdHJ1Y3QgYnVmZmVyICosIGludCBmZCk7CisKKy8qIEF0dGVtcHQgdG8gd3JpdGUgZW5vdWdoIGRhdGEgdG8gdGhlIGdpdmVuIGZkIHRvIGZpbGwgYSB3aW5kb3cgb2YgdGhlCisgICBnaXZlbiB3aWR0aCBhbmQgaGVpZ2h0IChhbmQgcmVtb3ZlIHRoZSBkYXRhIHdyaXR0ZW4gZnJvbSB0aGUgYnVmZmVyKS4KKworICAgSWYgIW5vX21vcmUsIHRoZW4gYSBtZXNzYWdlIHNheWluZyAiIC0tTW9yZS0tICIgaXMgYXBwZW5kZWQuCisgICBJZiBlcmFzZSBpcyB0cnVlLCB0aGVuIGZpcnN0IG92ZXJ3cml0ZSB0aGUgcHJldmlvdXMgIiAtLU1vcmUtLSAiIG1lc3NhZ2UKKyAgIHdpdGggc3BhY2VzLgorCisgICBBbnkgd3JpdGUgZXJyb3IgKGluY2x1ZGluZyBFQUdBSU4gb3IgRUlOVFIpIHdpbGwgY2F1c2UgdGhpcyBmdW5jdGlvbgorICAgdG8gcmV0dXJuIC0xIChiZWNhdXNlIHRoZSBsb2dpYyBmb3IgaGFuZGxpbmcgdGhlIGVyYXNlIGFuZCBtb3JlIGZlYXR1cmVzCisgICBpcyB0b28gY29tcGxpY2F0ZWQgdG8gcmV0cnkgdGhlIHdyaXRlIGxhdGVyKS4KKyovCitleHRlcm4gYnVmZmVyX3N0YXR1c190IGJ1ZmZlcl9mbHVzaF93aW5kb3coc3RydWN0IGJ1ZmZlciAqLCBpbnQgZmQsIGludCB3aWR0aCwKKwkJCQkJICAgaW50IGhlaWdodCwgaW50IGVyYXNlLCBpbnQgbm9fbW9yZSk7CisKKyNlbmRpZgkJCQkvKiBfWkVCUkFfQlVGRkVSX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS92dHkvY29tbWFuZC5oIGIvb3BlbmJzYy9pbmNsdWRlL3Z0eS9jb21tYW5kLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDNiMDcxZgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS92dHkvY29tbWFuZC5oCkBAIC0wLDAgKzEsMzYxIEBACisvKgorICogWmVicmEgY29uZmlndXJhdGlvbiBjb21tYW5kIGludGVyZmFjZSByb3V0aW5lCisgKiBDb3B5cmlnaHQgKEMpIDE5OTcsIDk4IEt1bmloaXJvIElzaGlndXJvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIFplYnJhLgorICoKKyAqIEdOVSBaZWJyYSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorICogYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIKKyAqIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogR05VIFplYnJhIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgWmVicmE7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLAorICogQm9zdG9uLCBNQSAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2lmbmRlZiBfWkVCUkFfQ09NTUFORF9ICisjZGVmaW5lIF9aRUJSQV9DT01NQU5EX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSAidmVjdG9yLmgiCisjaW5jbHVkZSAidnR5LmgiCisKKy8qIEhvc3QgY29uZmlndXJhdGlvbiB2YXJpYWJsZSAqLworc3RydWN0IGhvc3QgeworCS8qIEhvc3QgbmFtZSBvZiB0aGlzIHJvdXRlci4gKi8KKwljaGFyICpuYW1lOworCisJLyogUGFzc3dvcmQgZm9yIHZ0eSBpbnRlcmZhY2UuICovCisJY2hhciAqcGFzc3dvcmQ7CisJY2hhciAqcGFzc3dvcmRfZW5jcnlwdDsKKworCS8qIEVuYWJsZSBwYXNzd29yZCAqLworCWNoYXIgKmVuYWJsZTsKKwljaGFyICplbmFibGVfZW5jcnlwdDsKKworCS8qIFN5c3RlbSB3aWRlIHRlcm1pbmFsIGxpbmVzLiAqLworCWludCBsaW5lczsKKworCS8qIExvZyBmaWxlbmFtZS4gKi8KKwljaGFyICpsb2dmaWxlOworCisJLyogY29uZmlnIGZpbGUgbmFtZSBvZiB0aGlzIGhvc3QgKi8KKwljaGFyICpjb25maWc7CisKKwkvKiBGbGFncyBmb3Igc2VydmljZXMgKi8KKwlpbnQgYWR2YW5jZWQ7CisJaW50IGVuY3J5cHQ7CisKKwkvKiBCYW5uZXIgY29uZmlndXJhdGlvbi4gKi8KKwljb25zdCBjaGFyICptb3RkOworCWNoYXIgKm1vdGRmaWxlOworfTsKKworLyogVGhlcmUgYXJlIHNvbWUgY29tbWFuZCBsZXZlbHMgd2hpY2ggY2FsbGVkIGZyb20gY29tbWFuZCBub2RlLiAqLworZW51bSBub2RlX3R5cGUgeworCUFVVEhfTk9ERSwJCS8qIEF1dGhlbnRpY2F0aW9uIG1vZGUgb2YgdnR5IGludGVyZmFjZS4gKi8KKwlWSUVXX05PREUsCQkvKiBWaWV3IG5vZGUuIERlZmF1bHQgbW9kZSBvZiB2dHkgaW50ZXJmYWNlLiAqLworCUFVVEhfRU5BQkxFX05PREUsCS8qIEF1dGhlbnRpY2F0aW9uIG1vZGUgZm9yIGNoYW5nZSBlbmFibGUuICovCisJRU5BQkxFX05PREUsCQkvKiBFbmFibGUgbm9kZS4gKi8KKwlDT05GSUdfTk9ERSwJCS8qIENvbmZpZyBub2RlLiBEZWZhdWx0IG1vZGUgb2YgY29uZmlnIGZpbGUuICovCisJU0VSVklDRV9OT0RFLAkJLyogU2VydmljZSBub2RlLiAqLworCURFQlVHX05PREUsCQkvKiBEZWJ1ZyBub2RlLiAqLworI2lmIDAKKwlBQUFfTk9ERSwJCS8qIEFBQSBub2RlLiAqLworCUtFWUNIQUlOX05PREUsCQkvKiBLZXktY2hhaW4gbm9kZS4gKi8KKwlLRVlDSEFJTl9LRVlfTk9ERSwJLyogS2V5LWNoYWluIGtleSBub2RlLiAqLworCUlOVEVSRkFDRV9OT0RFLAkJLyogSW50ZXJmYWNlIG1vZGUgbm9kZS4gKi8KKwlaRUJSQV9OT0RFLAkJLyogemVicmEgY29ubmVjdGlvbiBub2RlLiAqLworCVRBQkxFX05PREUsCQkvKiBydG1fdGFibGUgc2VsZWN0aW9uIG5vZGUuICovCisJUklQX05PREUsCQkvKiBSSVAgcHJvdG9jb2wgbW9kZSBub2RlLiAqLworCVJJUE5HX05PREUsCQkvKiBSSVBuZyBwcm90b2NvbCBtb2RlIG5vZGUuICovCisJQkdQX05PREUsCQkvKiBCR1AgcHJvdG9jb2wgbW9kZSB3aGljaCBpbmNsdWRlcyBCR1A0KyAqLworCUJHUF9WUE5WNF9OT0RFLAkJLyogQkdQIE1QTFMtVlBOIFBFIGV4Y2hhbmdlLiAqLworCUJHUF9JUFY0X05PREUsCQkvKiBCR1AgSVB2NCB1bmljYXN0IGFkZHJlc3MgZmFtaWx5LiAgKi8KKwlCR1BfSVBWNE1fTk9ERSwJCS8qIEJHUCBJUHY0IG11bHRpY2FzdCBhZGRyZXNzIGZhbWlseS4gICovCisJQkdQX0lQVjZfTk9ERSwJCS8qIEJHUCBJUHY2IGFkZHJlc3MgZmFtaWx5ICovCisJT1NQRl9OT0RFLAkJLyogT1NQRiBwcm90b2NvbCBtb2RlICovCisJT1NQRjZfTk9ERSwJCS8qIE9TUEYgcHJvdG9jb2wgZm9yIElQdjYgbW9kZSAqLworCUlTSVNfTk9ERSwJCS8qIElTSVMgcHJvdG9jb2wgbW9kZSAqLworCU1BU0NfTk9ERSwJCS8qIE1BU0MgZm9yIG11bHRpY2FzdC4gICovCisJSVJEUF9OT0RFLAkJLyogSUNNUCBSb3V0ZXIgRGlzY292ZXJ5IFByb3RvY29sIG1vZGUuICovCisJSVBfTk9ERSwJCS8qIFN0YXRpYyBpcCByb3V0ZSBub2RlLiAqLworCUFDQ0VTU19OT0RFLAkJLyogQWNjZXNzIGxpc3Qgbm9kZS4gKi8KKwlQUkVGSVhfTk9ERSwJCS8qIFByZWZpeCBsaXN0IG5vZGUuICovCisJQUNDRVNTX0lQVjZfTk9ERSwJLyogQWNjZXNzIGxpc3Qgbm9kZS4gKi8KKwlQUkVGSVhfSVBWNl9OT0RFLAkvKiBQcmVmaXggbGlzdCBub2RlLiAqLworCUFTX0xJU1RfTk9ERSwJCS8qIEFTIGxpc3Qgbm9kZS4gKi8KKwlDT01NVU5JVFlfTElTVF9OT0RFLAkvKiBDb21tdW5pdHkgbGlzdCBub2RlLiAqLworCVJNQVBfTk9ERSwJCS8qIFJvdXRlIG1hcCBub2RlLiAqLworCVNNVVhfTk9ERSwJCS8qIFNOTVAgY29uZmlndXJhdGlvbiBub2RlLiAqLworCURVTVBfTk9ERSwJCS8qIFBhY2tldCBkdW1wIG5vZGUuICovCisJRk9SV0FSRElOR19OT0RFLAkvKiBJUCBmb3J3YXJkaW5nIG5vZGUuICovCisjZW5kaWYKKwlWVFlfTk9ERSwJCS8qIFZ0eSBub2RlLiAqLworCisJR1NNTkVUX05PREUsCisJQlRTX05PREUsCisJVFJYX05PREUsCisJVFNfTk9ERSwKKwlTVUJTQ1JfTk9ERSwKKwlNR0NQX05PREUsCit9OworCisvKiBOb2RlIHdoaWNoIGhhcyBzb21lIGNvbW1hbmRzIGFuZCBwcm9tcHQgc3RyaW5nIGFuZCBjb25maWd1cmF0aW9uCisgICBmdW5jdGlvbiBwb2ludGVyIC4gKi8KK3N0cnVjdCBjbWRfbm9kZSB7CisJLyogTm9kZSBpbmRleC4gKi8KKwllbnVtIG5vZGVfdHlwZSBub2RlOworCisJLyogUHJvbXB0IGNoYXJhY3RlciBhdCB2dHkgaW50ZXJmYWNlLiAqLworCWNvbnN0IGNoYXIgKnByb21wdDsKKworCS8qIElzIHRoaXMgbm9kZSdzIGNvbmZpZ3VyYXRpb24gZ29lcyB0byB2dHlzaCA/ICovCisJaW50IHZ0eXNoOworCisJLyogTm9kZSdzIGNvbmZpZ3VyYXRpb24gd3JpdGUgZnVuY3Rpb24gKi8KKwlpbnQgKCpmdW5jKSAoc3RydWN0IHZ0eSAqKTsKKworCS8qIFZlY3RvciBvZiB0aGlzIG5vZGUncyBjb21tYW5kIGxpc3QuICovCisJdmVjdG9yIGNtZF92ZWN0b3I7Cit9OworCitlbnVtIHsKKwlDTURfQVRUUl9ERVBSRUNBVEVEID0gMSwKKwlDTURfQVRUUl9ISURERU4sCit9OworCisvKiBTdHJ1Y3R1cmUgb2YgY29tbWFuZCBlbGVtZW50LiAqLworc3RydWN0IGNtZF9lbGVtZW50IHsKKwljb25zdCBjaGFyICpzdHJpbmc7CS8qIENvbW1hbmQgc3BlY2lmaWNhdGlvbiBieSBzdHJpbmcuICovCisJaW50ICgqZnVuYykgKHN0cnVjdCBjbWRfZWxlbWVudCAqLCBzdHJ1Y3QgdnR5ICosIGludCwgY29uc3QgY2hhciAqW10pOworCWNvbnN0IGNoYXIgKmRvYzsJLyogRG9jdW1lbnRhdGlvbiBvZiB0aGlzIGNvbW1hbmQuICovCisJaW50IGRhZW1vbjsJCS8qIERhZW1vbiB0byB3aGljaCB0aGlzIGNvbW1hbmQgYmVsb25nLiAqLworCXZlY3RvciBzdHJ2ZWM7CQkvKiBQb2ludGluZyBvdXQgZWFjaCBkZXNjcmlwdGlvbiB2ZWN0b3IuICovCisJdW5zaWduZWQgaW50IGNtZHNpemU7CS8qIENvbW1hbmQgaW5kZXggY291bnQuICovCisJY2hhciAqY29uZmlnOwkJLyogQ29uZmlndXJhdGlvbiBzdHJpbmcgKi8KKwl2ZWN0b3Igc3ViY29uZmlnOwkvKiBTdWIgY29uZmlndXJhdGlvbiBzdHJpbmcgKi8KKwl1X2NoYXIgYXR0cjsJCS8qIENvbW1hbmQgYXR0cmlidXRlcyAqLworfTsKKworLyogQ29tbWFuZCBkZXNjcmlwdGlvbiBzdHJ1Y3R1cmUuICovCitzdHJ1Y3QgZGVzYyB7CisJY29uc3QgY2hhciAqY21kOwkvKiBDb21tYW5kIHN0cmluZy4gKi8KKwljb25zdCBjaGFyICpzdHI7CS8qIENvbW1hbmQncyBkZXNjcmlwdGlvbi4gKi8KK307CisKKy8qIFJldHVybiB2YWx1ZSBvZiB0aGUgY29tbWFuZHMuICovCisjZGVmaW5lIENNRF9TVUNDRVNTICAgICAgICAgICAgICAwCisjZGVmaW5lIENNRF9XQVJOSU5HICAgICAgICAgICAgICAxCisjZGVmaW5lIENNRF9FUlJfTk9fTUFUQ0ggICAgICAgICAyCisjZGVmaW5lIENNRF9FUlJfQU1CSUdVT1VTICAgICAgICAzCisjZGVmaW5lIENNRF9FUlJfSU5DT01QTEVURSAgICAgICA0CisjZGVmaW5lIENNRF9FUlJfRVhFRURfQVJHQ19NQVggICA1CisjZGVmaW5lIENNRF9FUlJfTk9USElOR19UT0RPICAgICA2CisjZGVmaW5lIENNRF9DT01QTEVURV9GVUxMX01BVENIICA3CisjZGVmaW5lIENNRF9DT01QTEVURV9NQVRDSCAgICAgICA4CisjZGVmaW5lIENNRF9DT01QTEVURV9MSVNUX01BVENIICA5CisjZGVmaW5lIENNRF9TVUNDRVNTX0RBRU1PTiAgICAgIDEwCisKKy8qIEFyZ2MgbWF4IGNvdW50cy4gKi8KKyNkZWZpbmUgQ01EX0FSR0NfTUFYICAgMjUKKworLyogVHVybiBvZmYgdGhlc2UgbWFjcm9zIHdoZW4gdWlzbmcgY3BwIHdpdGggZXh0cmFjdC5wbCAqLworI2lmbmRlZiBWVFlTSF9FWFRSQUNUX1BMCisKKy8qIGhlbHBlciBkZWZpbmVzIGZvciBlbmQtdXNlciBERUZVTiogbWFjcm9zICovCisjZGVmaW5lIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIGF0dHJzLCBkbnVtKSBcCisgIHN0cnVjdCBjbWRfZWxlbWVudCBjbWRuYW1lID0gXAorICB7IFwKKyAgICAuc3RyaW5nID0gY21kc3RyLCBcCisgICAgLmZ1bmMgPSBmdW5jbmFtZSwgXAorICAgIC5kb2MgPSBoZWxwc3RyLCBcCisgICAgLmF0dHIgPSBhdHRycywgXAorICAgIC5kYWVtb24gPSBkbnVtLCBcCisgIH07CisKKyNkZWZpbmUgREVGVU5fQ01EX0ZVTkNfREVDTChmdW5jbmFtZSkgXAorICBzdGF0aWMgaW50IGZ1bmNuYW1lIChzdHJ1Y3QgY21kX2VsZW1lbnQgKiwgc3RydWN0IHZ0eSAqLCBpbnQsIGNvbnN0IGNoYXIgKltdKTsgXAorCisjZGVmaW5lIERFRlVOX0NNRF9GVU5DX1RFWFQoZnVuY25hbWUpIFwKKyAgc3RhdGljIGludCBmdW5jbmFtZSBcCisgICAgKHN0cnVjdCBjbWRfZWxlbWVudCAqc2VsZiwgc3RydWN0IHZ0eSAqdnR5LCBpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdKQorCisvKiBERUZVTiBmb3IgdnR5IGNvbW1hbmQgaW50ZXJhZmNlLiBMaXR0bGUgYml0IGhhY2t5IDstKS4gKi8KKyNkZWZpbmUgREVGVU4oZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9DTURfRlVOQ19ERUNMKGZ1bmNuYW1lKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIDAsIDApIFwKKyAgREVGVU5fQ01EX0ZVTkNfVEVYVChmdW5jbmFtZSkKKworI2RlZmluZSBERUZVTl9BVFRSKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIGF0dHIpIFwKKyAgREVGVU5fQ01EX0ZVTkNfREVDTChmdW5jbmFtZSkgXAorICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBhdHRyLCAwKSBcCisgIERFRlVOX0NNRF9GVU5DX1RFWFQoZnVuY25hbWUpCisKKyNkZWZpbmUgREVGVU5fSElEREVOKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5fQVRUUiAoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgQ01EX0FUVFJfSElEREVOKQorCisjZGVmaW5lIERFRlVOX0RFUFJFQ0FURUQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9BVFRSIChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBDTURfQVRUUl9ERVBSRUNBVEVEKSBcCisKKy8qIERFRlVOX05PU0ggZm9yIGNvbW1hbmRzIHRoYXQgdnR5c2ggc2hvdWxkIGlnbm9yZSAqLworI2RlZmluZSBERUZVTl9OT1NIKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU4oZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikKKworLyogREVGU0ggZm9yIHZ0eXNoLiAqLworI2RlZmluZSBERUZTSChkYWVtb24sIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9DTURfRUxFTUVOVChOVUxMLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIDAsIGRhZW1vbikgXAorCisvKiBERUZVTiArIERFRlNIICovCisjZGVmaW5lIERFRlVOU0goZGFlbW9uLCBmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0NNRF9GVU5DX0RFQ0woZnVuY25hbWUpIFwKKyAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgMCwgZGFlbW9uKSBcCisgIERFRlVOX0NNRF9GVU5DX1RFWFQoZnVuY25hbWUpCisKKy8qIERFRlVOICsgREVGU0ggd2l0aCBhdHRyaWJ1dGVzICovCisjZGVmaW5lIERFRlVOU0hfQVRUUihkYWVtb24sIGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIGF0dHIpIFwKKyAgREVGVU5fQ01EX0ZVTkNfREVDTChmdW5jbmFtZSkgXAorICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBhdHRyLCBkYWVtb24pIFwKKyAgREVGVU5fQ01EX0ZVTkNfVEVYVChmdW5jbmFtZSkKKworI2RlZmluZSBERUZVTlNIX0hJRERFTihkYWVtb24sIGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5TSF9BVFRSIChkYWVtb24sIGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIENNRF9BVFRSX0hJRERFTikKKworI2RlZmluZSBERUZVTlNIX0RFUFJFQ0FURUQoZGFlbW9uLCBmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOU0hfQVRUUiAoZGFlbW9uLCBmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBDTURfQVRUUl9ERVBSRUNBVEVEKQorCisvKiBBTElBUyBtYWNybyB3aGljaCBkZWZpbmUgZXhpc3RpbmcgY29tbWFuZCdzIGFsaWFzLiAqLworI2RlZmluZSBBTElBUyhmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIDAsIDApCisKKyNkZWZpbmUgQUxJQVNfQVRUUihmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBhdHRyKSBcCisgIERFRlVOX0NNRF9FTEVNRU5UKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIsIGF0dHIsIDApCisKKyNkZWZpbmUgQUxJQVNfSElEREVOKGZ1bmNuYW1lLCBjbWRuYW1lLCBjbWRzdHIsIGhlbHBzdHIpIFwKKyAgREVGVU5fQ01EX0VMRU1FTlQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0ciwgQ01EX0FUVFJfSElEREVOLCAwKQorCisjZGVmaW5lIEFMSUFTX0RFUFJFQ0FURUQoZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBDTURfQVRUUl9ERVBSRUNBVEVELCAwKQorCisjZGVmaW5lIEFMSUFTX1NIKGRhZW1vbiwgZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCAwLCBkYWVtb24pCisKKyNkZWZpbmUgQUxJQVNfU0hfSElEREVOKGRhZW1vbiwgZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBDTURfQVRUUl9ISURERU4sIGRhZW1vbikKKworI2RlZmluZSBBTElBU19TSF9ERVBSRUNBVEVEKGRhZW1vbiwgZnVuY25hbWUsIGNtZG5hbWUsIGNtZHN0ciwgaGVscHN0cikgXAorICBERUZVTl9DTURfRUxFTUVOVChmdW5jbmFtZSwgY21kbmFtZSwgY21kc3RyLCBoZWxwc3RyLCBDTURfQVRUUl9ERVBSRUNBVEVELCBkYWVtb24pCisKKyNlbmRpZgkJCQkvKiBWVFlTSF9FWFRSQUNUX1BMICovCisKKy8qIFNvbWUgbWFjcm9lcyAqLworI2RlZmluZSBDTURfT1BUSU9OKFMpICAgKChTWzBdKSA9PSAnWycpCisjZGVmaW5lIENNRF9WQVJJQUJMRShTKSAoKChTWzBdKSA+PSAnQScgJiYgKFNbMF0pIDw9ICdaJykgfHwgKChTWzBdKSA9PSAnPCcpKQorI2RlZmluZSBDTURfVkFSQVJHKFMpICAgKChTWzBdKSA9PSAnLicpCisjZGVmaW5lIENNRF9SQU5HRShTKQkoKFNbMF0gPT0gJzwnKSkKKworI2RlZmluZSBDTURfSVBWNChTKQkgICAoKHN0cmNtcCAoKFMpLCAiQS5CLkMuRCIpID09IDApKQorI2RlZmluZSBDTURfSVBWNF9QUkVGSVgoUykgKChzdHJjbXAgKChTKSwgIkEuQi5DLkQvTSIpID09IDApKQorI2RlZmluZSBDTURfSVBWNihTKSAgICAgICAgKChzdHJjbXAgKChTKSwgIlg6WDo6WDpYIikgPT0gMCkpCisjZGVmaW5lIENNRF9JUFY2X1BSRUZJWChTKSAoKHN0cmNtcCAoKFMpLCAiWDpYOjpYOlgvTSIpID09IDApKQorCisvKiBDb21tb24gZGVzY3JpcHRpb25zLiAqLworI2RlZmluZSBTSE9XX1NUUiAiU2hvdyBydW5uaW5nIHN5c3RlbSBpbmZvcm1hdGlvblxuIgorI2RlZmluZSBJUF9TVFIgIklQIGluZm9ybWF0aW9uXG4iCisjZGVmaW5lIElQVjZfU1RSICJJUHY2IGluZm9ybWF0aW9uXG4iCisjZGVmaW5lIE5PX1NUUiAiTmVnYXRlIGEgY29tbWFuZCBvciBzZXQgaXRzIGRlZmF1bHRzXG4iCisjZGVmaW5lIENMRUFSX1NUUiAiUmVzZXQgZnVuY3Rpb25zXG4iCisjZGVmaW5lIFJJUF9TVFIgIlJJUCBpbmZvcm1hdGlvblxuIgorI2RlZmluZSBCR1BfU1RSICJCR1AgaW5mb3JtYXRpb25cbiIKKyNkZWZpbmUgT1NQRl9TVFIgIk9TUEYgaW5mb3JtYXRpb25cbiIKKyNkZWZpbmUgTkVJR0hCT1JfU1RSICJTcGVjaWZ5IG5laWdoYm9yIHJvdXRlclxuIgorI2RlZmluZSBERUJVR19TVFIgIkRlYnVnZ2luZyBmdW5jdGlvbnMgKHNlZSBhbHNvICd1bmRlYnVnJylcbiIKKyNkZWZpbmUgVU5ERUJVR19TVFIgIkRpc2FibGUgZGVidWdnaW5nIGZ1bmN0aW9ucyAoc2VlIGFsc28gJ2RlYnVnJylcbiIKKyNkZWZpbmUgUk9VVEVSX1NUUiAiRW5hYmxlIGEgcm91dGluZyBwcm9jZXNzXG4iCisjZGVmaW5lIEFTX1NUUiAiQVMgbnVtYmVyXG4iCisjZGVmaW5lIE1CR1BfU1RSICJNQkdQIGluZm9ybWF0aW9uXG4iCisjZGVmaW5lIE1BVENIX1NUUiAiTWF0Y2ggdmFsdWVzIGZyb20gcm91dGluZyB0YWJsZVxuIgorI2RlZmluZSBTRVRfU1RSICJTZXQgdmFsdWVzIGluIGRlc3RpbmF0aW9uIHJvdXRpbmcgcHJvdG9jb2xcbiIKKyNkZWZpbmUgT1VUX1NUUiAiRmlsdGVyIG91dGdvaW5nIHJvdXRpbmcgdXBkYXRlc1xuIgorI2RlZmluZSBJTl9TVFIgICJGaWx0ZXIgaW5jb21pbmcgcm91dGluZyB1cGRhdGVzXG4iCisjZGVmaW5lIFY0Tk9UQVRJT05fU1RSICJzcGVjaWZ5IGJ5IElQdjQgYWRkcmVzcyBub3RhdGlvbihlLmcuIDAuMC4wLjApXG4iCisjZGVmaW5lIE9TUEY2X05VTUJFUl9TVFIgIlNwZWNpZnkgYnkgbnVtYmVyXG4iCisjZGVmaW5lIElOVEVSRkFDRV9TVFIgIkludGVyZmFjZSBpbmZvbWF0aW9uXG4iCisjZGVmaW5lIElGTkFNRV9TVFIgIkludGVyZmFjZSBuYW1lKGUuZy4gZXAwKVxuIgorI2RlZmluZSBJUDZfU1RSICJJUHY2IEluZm9ybWF0aW9uXG4iCisjZGVmaW5lIE9TUEY2X1NUUiAiT3BlbiBTaG9ydGVzdCBQYXRoIEZpcnN0IChPU1BGKSBmb3IgSVB2NlxuIgorI2RlZmluZSBPU1BGNl9ST1VURVJfU1RSICJFbmFibGUgYSByb3V0aW5nIHByb2Nlc3NcbiIKKyNkZWZpbmUgT1NQRjZfSU5TVEFOQ0VfU1RSICI8MS02NTUzNT4gSW5zdGFuY2UgSURcbiIKKyNkZWZpbmUgU0VDT05EU19TVFIgIjwxLTY1NTM1PiBTZWNvbmRzXG4iCisjZGVmaW5lIFJPVVRFX1NUUiAiUm91dGluZyBUYWJsZVxuIgorI2RlZmluZSBQUkVGSVhfTElTVF9TVFIgIkJ1aWxkIGEgcHJlZml4IGxpc3RcbiIKKyNkZWZpbmUgT1NQRjZfRFVNUF9UWVBFX0xJU1QgXAorIihuZWlnaGJvcnxpbnRlcmZhY2V8YXJlYXxsc2F8emVicmF8Y29uZmlnfGRiZXh8c3BmfHJvdXRlfGxzZGJ8cmVkaXN0cmlidXRlfGhvb2t8YXNicnxwcmVmaXh8YWJyKSIKKyNkZWZpbmUgSVNJU19TVFIgIklTLUlTIGluZm9ybWF0aW9uXG4iCisjZGVmaW5lIEFSRUFfVEFHX1NUUiAiW2FyZWEgdGFnXVxuIgorCisjZGVmaW5lIENPTkZfQkFDS1VQX0VYVCAiLnNhdiIKKworLyogSVB2NCBvbmx5IG1hY2hpbmUgc2hvdWxkIG5vdCBhY2NlcHQgSVB2NiBhZGRyZXNzIGZvciBwZWVyJ3MgSVAKKyAgIGFkZHJlc3MuICBTbyB3ZSByZXBsYWNlIFZUWSBjb21tYW5kIHN0cmluZyBsaWtlIGJlbG93LiAqLworI2lmZGVmIEhBVkVfSVBWNgorI2RlZmluZSBORUlHSEJPUl9DTUQgICAgICAgIm5laWdoYm9yIChBLkIuQy5EfFg6WDo6WDpYKSAiCisjZGVmaW5lIE5PX05FSUdIQk9SX0NNRCAgICAibm8gbmVpZ2hib3IgKEEuQi5DLkR8WDpYOjpYOlgpICIKKyNkZWZpbmUgTkVJR0hCT1JfQUREUl9TVFIgICJOZWlnaGJvciBhZGRyZXNzXG5JUHY2IGFkZHJlc3NcbiIKKyNkZWZpbmUgTkVJR0hCT1JfQ01EMiAgICAgICJuZWlnaGJvciAoQS5CLkMuRHxYOlg6Olg6WHxXT1JEKSAiCisjZGVmaW5lIE5PX05FSUdIQk9SX0NNRDIgICAibm8gbmVpZ2hib3IgKEEuQi5DLkR8WDpYOjpYOlh8V09SRCkgIgorI2RlZmluZSBORUlHSEJPUl9BRERSX1NUUjIgIk5laWdoYm9yIGFkZHJlc3Ncbk5laWdoYm9yIElQdjYgYWRkcmVzc1xuTmVpZ2hib3IgdGFnXG4iCisjZWxzZQorI2RlZmluZSBORUlHSEJPUl9DTUQgICAgICAgIm5laWdoYm9yIEEuQi5DLkQgIgorI2RlZmluZSBOT19ORUlHSEJPUl9DTUQgICAgIm5vIG5laWdoYm9yIEEuQi5DLkQgIgorI2RlZmluZSBORUlHSEJPUl9BRERSX1NUUiAgIk5laWdoYm9yIGFkZHJlc3NcbiIKKyNkZWZpbmUgTkVJR0hCT1JfQ01EMiAgICAgICJuZWlnaGJvciAoQS5CLkMuRHxXT1JEKSAiCisjZGVmaW5lIE5PX05FSUdIQk9SX0NNRDIgICAibm8gbmVpZ2hib3IgKEEuQi5DLkR8V09SRCkgIgorI2RlZmluZSBORUlHSEJPUl9BRERSX1NUUjIgIk5laWdoYm9yIGFkZHJlc3Ncbk5laWdoYm9yIHRhZ1xuIgorI2VuZGlmCQkJCS8qIEhBVkVfSVBWNiAqLworCisvKiBQcm90b3R5cGVzLiAqLwordm9pZCBpbnN0YWxsX25vZGUoc3RydWN0IGNtZF9ub2RlICosIGludCAoKikoc3RydWN0IHZ0eSAqKSk7Cit2b2lkIGluc3RhbGxfZGVmYXVsdChlbnVtIG5vZGVfdHlwZSk7Cit2b2lkIGluc3RhbGxfZWxlbWVudChlbnVtIG5vZGVfdHlwZSwgc3RydWN0IGNtZF9lbGVtZW50ICopOwordm9pZCBzb3J0X25vZGUoKTsKKworLyogQ29uY2F0ZW5hdGVzIGFyZ3Zbc2hpZnRdIHRocm91Z2ggYXJndlthcmdjLTFdIGludG8gYSBzaW5nbGUgTlVMLXRlcm1pbmF0ZWQKKyAgIHN0cmluZyB3aXRoIGEgc3BhY2UgYmV0d2VlbiBlYWNoIGVsZW1lbnQgKGFsbG9jYXRlZCB1c2luZworICAgWE1BTExPQyhNVFlQRV9UTVApKS4gIFJldHVybnMgTlVMTCBpZiBzaGlmdCA+PSBhcmdjLiAqLworY2hhciAqYXJndl9jb25jYXQoY29uc3QgY2hhciAqKmFyZ3YsIGludCBhcmdjLCBpbnQgc2hpZnQpOworCit2ZWN0b3IgY21kX21ha2Vfc3RydmVjKGNvbnN0IGNoYXIgKik7Cit2b2lkIGNtZF9mcmVlX3N0cnZlYyh2ZWN0b3IpOwordmVjdG9yIGNtZF9kZXNjcmliZV9jb21tYW5kKCk7CitjaGFyICoqY21kX2NvbXBsZXRlX2NvbW1hbmQoKTsKK2NvbnN0IGNoYXIgKmNtZF9wcm9tcHQoZW51bSBub2RlX3R5cGUpOworaW50IGNvbmZpZ19mcm9tX2ZpbGUoc3RydWN0IHZ0eSAqLCBGSUxFICopOworZW51bSBub2RlX3R5cGUgbm9kZV9wYXJlbnQoZW51bSBub2RlX3R5cGUpOworaW50IGNtZF9leGVjdXRlX2NvbW1hbmQodmVjdG9yLCBzdHJ1Y3QgdnR5ICosIHN0cnVjdCBjbWRfZWxlbWVudCAqKiwgaW50KTsKK2ludCBjbWRfZXhlY3V0ZV9jb21tYW5kX3N0cmljdCh2ZWN0b3IsIHN0cnVjdCB2dHkgKiwgc3RydWN0IGNtZF9lbGVtZW50ICoqKTsKK3ZvaWQgY29uZmlnX3JlcGxhY2Vfc3RyaW5nKHN0cnVjdCBjbWRfZWxlbWVudCAqLCBjaGFyICosIC4uLik7Cit2b2lkIGNtZF9pbml0KGludCk7CisKKy8qIEV4cG9ydCB0eXBpY2FsIGZ1bmN0aW9ucy4gKi8KK2V4dGVybiBzdHJ1Y3QgY21kX2VsZW1lbnQgY29uZmlnX2VuZF9jbWQ7CitleHRlcm4gc3RydWN0IGNtZF9lbGVtZW50IGNvbmZpZ19leGl0X2NtZDsKK2V4dGVybiBzdHJ1Y3QgY21kX2VsZW1lbnQgY29uZmlnX3F1aXRfY21kOworZXh0ZXJuIHN0cnVjdCBjbWRfZWxlbWVudCBjb25maWdfaGVscF9jbWQ7CitleHRlcm4gc3RydWN0IGNtZF9lbGVtZW50IGNvbmZpZ19saXN0X2NtZDsKK2NoYXIgKmhvc3RfY29uZmlnX2ZpbGUoKTsKK3ZvaWQgaG9zdF9jb25maWdfc2V0KGNvbnN0IGNoYXIgKik7CisKK3ZvaWQgcHJpbnRfdmVyc2lvbihjb25zdCBjaGFyICopOworCitleHRlcm4gdm9pZCAqdGFsbF92dHlfY21kX2N0eDsKKworI2VuZGlmCQkJCS8qIF9aRUJSQV9DT01NQU5EX0ggKi8KZGlmZiAtLWdpdCBhL29wZW5ic2MvaW5jbHVkZS92dHkvdmVjdG9yLmggYi9vcGVuYnNjL2luY2x1ZGUvdnR5L3ZlY3Rvci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyYTE4NGQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2luY2x1ZGUvdnR5L3ZlY3Rvci5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBHZW5lcmljIHZlY3RvciBpbnRlcmZhY2UgaGVhZGVyLgorICogQ29weXJpZ2h0IChDKSAxOTk3LCA5OCBLdW5paGlybyBJc2hpZ3VybworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBaZWJyYS4KKyAqCisgKiBHTlUgWmVicmEgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55CisgKiBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEdOVSBaZWJyYSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIFplYnJhOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQorICogMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpZm5kZWYgX1pFQlJBX1ZFQ1RPUl9ICisjZGVmaW5lIF9aRUJSQV9WRUNUT1JfSAorCisvKiBzdHJ1Y3QgZm9yIHZlY3RvciAqLworc3RydWN0IF92ZWN0b3IgeworCXVuc2lnbmVkIGludCBhY3RpdmU7CS8qIG51bWJlciBvZiBhY3RpdmUgc2xvdHMgKi8KKwl1bnNpZ25lZCBpbnQgYWxsb2NlZDsJLyogbnVtYmVyIG9mIGFsbG9jYXRlZCBzbG90ICovCisJdm9pZCAqKmluZGV4OwkJLyogaW5kZXggdG8gZGF0YSAqLworfTsKK3R5cGVkZWYgc3RydWN0IF92ZWN0b3IgKnZlY3RvcjsKKworI2RlZmluZSBWRUNUT1JfTUlOX1NJWkUgMQorCisvKiAoU29tZXRpbWVzKSB1c2VmdWxsIG1hY3Jvcy4gIFRoaXMgbWFjcm8gY29udmVydCBpbmRleCBleHByZXNzaW9uIHRvCisgYXJyYXkgZXhwcmVzc2lvbi4gKi8KKy8qIFJlZmVyZW5jZSBzbG90IGF0IGdpdmVuIGluZGV4LCBjYWxsZXIgbXVzdCBlbnN1cmUgc2xvdCBpcyBhY3RpdmUgKi8KKyNkZWZpbmUgdmVjdG9yX3Nsb3QoVixJKSAgKChWKS0+aW5kZXhbKEkpXSkKKy8qIE51bWJlciBvZiBhY3RpdmUgc2xvdHMuCisgKiBOb3RlIHRoYXQgdGhpcyBkaWZmZXJzIGZyb20gdmVjdG9yX2NvdW50KCkgYXMgaXQgdGhlIGNvdW50IHJldHVybmVkCisgKiB3aWxsIGluY2x1ZGUgYW55IGVtcHR5IHNsb3RzCisgKi8KKyNkZWZpbmUgdmVjdG9yX2FjdGl2ZShWKSAoKFYpLT5hY3RpdmUpCisKKy8qIFByb3RvdHlwZXMuICovCit2ZWN0b3IgdmVjdG9yX2luaXQodW5zaWduZWQgaW50IHNpemUpOwordm9pZCB2ZWN0b3JfZW5zdXJlKHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgbnVtKTsKK2ludCB2ZWN0b3JfZW1wdHlfc2xvdCh2ZWN0b3Igdik7CitpbnQgdmVjdG9yX3NldCh2ZWN0b3Igdiwgdm9pZCAqdmFsKTsKK2ludCB2ZWN0b3Jfc2V0X2luZGV4KHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgaSwgdm9pZCAqdmFsKTsKK3ZvaWQgdmVjdG9yX3Vuc2V0KHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgaSk7Cit1bnNpZ25lZCBpbnQgdmVjdG9yX2NvdW50KHZlY3RvciB2KTsKK3ZvaWQgdmVjdG9yX29ubHlfd3JhcHBlcl9mcmVlKHZlY3RvciB2KTsKK3ZvaWQgdmVjdG9yX29ubHlfaW5kZXhfZnJlZSh2b2lkICppbmRleCk7Cit2b2lkIHZlY3Rvcl9mcmVlKHZlY3RvciB2KTsKK3ZlY3RvciB2ZWN0b3JfY29weSh2ZWN0b3Igdik7CisKK3ZvaWQgKnZlY3Rvcl9sb29rdXAodmVjdG9yLCB1bnNpZ25lZCBpbnQpOwordm9pZCAqdmVjdG9yX2xvb2t1cF9lbnN1cmUodmVjdG9yLCB1bnNpZ25lZCBpbnQpOworCitleHRlcm4gdm9pZCAqdGFsbF92dHlfdmVjX2N0eDsKKworI2VuZGlmCQkJCS8qIF9aRUJSQV9WRUNUT1JfSCAqLwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9pbmNsdWRlL3Z0eS92dHkuaCBiL29wZW5ic2MvaW5jbHVkZS92dHkvdnR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQ0MWZjNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvaW5jbHVkZS92dHkvdnR5LmgKQEAgLTAsMCArMSwxNTEgQEAKKyNpZm5kZWYgX1ZUWV9ICisjZGVmaW5lIF9WVFlfSAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworLyogR0NDIGhhdmUgcHJpbnRmIHR5cGUgYXR0cmlidXRlIGNoZWNrLiAgKi8KKyNpZmRlZiBfX0dOVUNfXworI2RlZmluZSBWVFlfUFJJTlRGX0FUVFJJQlVURShhLGIpIF9fYXR0cmlidXRlX18gKChfX2Zvcm1hdF9fIChfX3ByaW50Zl9fLCBhLCBiKSkpCisjZWxzZQorI2RlZmluZSBWVFlfUFJJTlRGX0FUVFJJQlVURShhLGIpCisjZW5kaWYJCQkJLyogX19HTlVDX18gKi8KKworLyogRG9lcyB0aGUgSS9PIGVycm9yIGluZGljYXRlIHRoYXQgdGhlIG9wZXJhdGlvbiBzaG91bGQgYmUgcmV0cmllZCBsYXRlcj8gKi8KKyNkZWZpbmUgRVJSTk9fSU9fUkVUUlkoRU4pIFwKKwkoKChFTikgPT0gRUFHQUlOKSB8fCAoKEVOKSA9PSBFV09VTERCTE9DSykgfHwgKChFTikgPT0gRUlOVFIpKQorCisvKiBWdHkgcmVhZCBidWZmZXIgc2l6ZS4gKi8KKyNkZWZpbmUgVlRZX1JFQURfQlVGU0laIDUxMgorCisjZGVmaW5lIFZUWV9CVUZTSVogNTEyCisjZGVmaW5lIFZUWV9NQVhISVNUIDIwCisKKy8qIFZ0eSBldmVudHMgKi8KK2VudW0gZXZlbnQgeworCVZUWV9TRVJWLAorCVZUWV9SRUFELAorCVZUWV9XUklURSwKKwlWVFlfQ0xPU0VELAorCVZUWV9USU1FT1VUX1JFU0VULAorI2lmZGVmIFZUWVNICisJVlRZU0hfU0VSViwKKwlWVFlTSF9SRUFELAorCVZUWVNIX1dSSVRFCisjZW5kaWYJCQkJLyogVlRZU0ggKi8KK307CisKK3N0cnVjdCB2dHkgeworCUZJTEUgKmZpbGU7CisKKwkvKiBwcml2YXRlIGRhdGEsIHNwZWNpZmllZCBieSBjcmVhdG9yICovCisJdm9pZCAqcHJpdjsKKworCS8qIEZpbGUgZGVzY3JpcHRlciBvZiB0aGlzIHZ0eS4gKi8KKwlpbnQgZmQ7CisKKwkvKiBJcyB0aGlzIHZ0eSBjb25uZWN0IHRvIGZpbGUgb3Igbm90ICovCisJZW51bSB7IFZUWV9URVJNLCBWVFlfRklMRSwgVlRZX1NIRUxMLCBWVFlfU0hFTExfU0VSViB9IHR5cGU7CisKKwkvKiBOb2RlIHN0YXR1cyBvZiB0aGlzIHZ0eSAqLworCWludCBub2RlOworCisJLyogRmFpbHVyZSBjb3VudCAqLworCWludCBmYWlsOworCisJLyogT3V0cHV0IGJ1ZmZlci4gKi8KKwlzdHJ1Y3QgYnVmZmVyICpvYnVmOworCisJLyogQ29tbWFuZCBpbnB1dCBidWZmZXIgKi8KKwljaGFyICpidWY7CisKKwkvKiBDb21tYW5kIGN1cnNvciBwb2ludCAqLworCWludCBjcDsKKworCS8qIENvbW1hbmQgbGVuZ3RoICovCisJaW50IGxlbmd0aDsKKworCS8qIENvbW1hbmQgbWF4IGxlbmd0aC4gKi8KKwlpbnQgbWF4OworCisJLyogSGlzdHJ5IG9mIGNvbW1hbmQgKi8KKwljaGFyICpoaXN0W1ZUWV9NQVhISVNUXTsKKworCS8qIEhpc3RvcnkgbG9va3VwIGN1cnJlbnQgcG9pbnQgKi8KKwlpbnQgaHA7CisKKwkvKiBIaXN0b3J5IGluc2VydCBlbmQgcG9pbnQgKi8KKwlpbnQgaGluZGV4OworCisJLyogRm9yIGN1cnJlbnQgcmVmZXJlbmNpbmcgcG9pbnQgb2YgaW50ZXJmYWNlLCByb3V0ZS1tYXAsCisJICAgYWNjZXNzLWxpc3QgZXRjLi4uICovCisJdm9pZCAqaW5kZXg7CisKKwkvKiBGb3IgbXVsdGlwbGUgbGV2ZWwgaW5kZXggdHJlYXRtZW50IHN1Y2ggYXMga2V5IGNoYWluIGFuZCBrZXkuICovCisJdm9pZCAqaW5kZXhfc3ViOworCisJLyogRm9yIGVzY2FwZSBjaGFyYWN0ZXIuICovCisJdW5zaWduZWQgY2hhciBlc2NhcGU7CisKKwkvKiBDdXJyZW50IHZ0eSBzdGF0dXMuICovCisJZW51bSB7IFZUWV9OT1JNQUwsIFZUWV9DTE9TRSwgVlRZX01PUkUsIFZUWV9NT1JFTElORSB9IHN0YXR1czsKKworCS8qIElBQyBoYW5kbGluZzogd2FzIHRoZSBsYXN0IGNoYXJhY3RlciByZWNlaXZlZCB0aGUgSUFDCisJICogKGludGVycHJldC1hcy1jb21tYW5kKSBlc2NhcGUgY2hhcmFjdGVyIChhbmQgdGhlcmVmb3JlIHRoZSBuZXh0CisJICogY2hhcmFjdGVyIHdpbGwgYmUgdGhlIGNvbW1hbmQgY29kZSk/ICBSZWZlciB0byBUZWxuZXQgUkZDIDg1NC4gKi8KKwl1bnNpZ25lZCBjaGFyIGlhYzsKKworCS8qIElBQyBTQiAob3B0aW9uIHN1Ym5lZ290aWF0aW9uKSBoYW5kbGluZyAqLworCXVuc2lnbmVkIGNoYXIgaWFjX3NiX2luX3Byb2dyZXNzOworCS8qIEF0IHRoZSBtb21lbnQsIHdlIGNhcmUgb25seSBhYm91dCB0aGUgTkFXUyAod2luZG93IHNpemUpIG5lZ290aWF0aW9uLAorCSAqIGFuZCB0aGF0IHJlcXVpcmVzIGp1c3QgYSA1LWNoYXJhY3RlciBidWZmZXIgKFJGQyAxMDczKToKKwkgKiA8TkFXUyBjaGFyPiA8MTYtYml0IHdpZHRoPiA8MTYtYml0IGhlaWdodD4gKi8KKyNkZWZpbmUgVEVMTkVUX05BV1NfU0JfTEVOIDUKKwl1bnNpZ25lZCBjaGFyIHNiX2J1ZltURUxORVRfTkFXU19TQl9MRU5dOworCS8qIEhvdyBtYW55IHN1Ym5lZ290aWF0aW9uIGNoYXJhY3RlcnMgaGF2ZSB3ZSByZWNlaXZlZD8gIFdlIGp1c3QgZHJvcAorCSAqIHRob3NlIHRoYXQgZG8gbm90IGZpdCBpbiB0aGUgYnVmZmVyLiAqLworCXNpemVfdCBzYl9sZW47CisKKwkvKiBXaW5kb3cgd2lkdGgvaGVpZ2h0LiAqLworCWludCB3aWR0aDsKKwlpbnQgaGVpZ2h0OworCisJLyogQ29uZmlndXJlIGxpbmVzLiAqLworCWludCBsaW5lczsKKworCWludCBtb25pdG9yOworCisJLyogSW4gY29uZmlndXJlIG1vZGUuICovCisJaW50IGNvbmZpZzsKK307CisKKy8qIFNtYWxsIG1hY3JvIHRvIGRldGVybWluZSBuZXdsaW5lIGlzIG5ld2xpbmUgb25seSBvciBsaW5lZmVlZCBuZWVkZWQuICovCisjZGVmaW5lIFZUWV9ORVdMSU5FICAoKHZ0eS0+dHlwZSA9PSBWVFlfVEVSTSkgPyAiXHJcbiIgOiAiXG4iKQorCitzdGF0aWMgaW5saW5lIGNoYXIgKnZ0eV9uZXdsaW5lKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlyZXR1cm4gVlRZX05FV0xJTkU7Cit9CisKKy8qIFByb3RvdHlwZXMuICovCit2b2lkIHZ0eV9pbml0ICh2b2lkKTsKK2ludCB2dHlfcmVhZF9jb25maWdfZmlsZShjb25zdCBjaGFyICpmaWxlX25hbWUpOwordm9pZCB2dHlfaW5pdF92dHlzaCAodm9pZCk7Cit2b2lkIHZ0eV9yZXNldCAodm9pZCk7CitzdHJ1Y3QgdnR5ICp2dHlfbmV3ICh2b2lkKTsKK3N0cnVjdCB2dHkgKnZ0eV9jcmVhdGUgKGludCB2dHlfc29jaywgdm9pZCAqcHJpdik7CitpbnQgdnR5X291dCAoc3RydWN0IHZ0eSAqLCBjb25zdCBjaGFyICosIC4uLikgVlRZX1BSSU5URl9BVFRSSUJVVEUoMiwgMyk7CitpbnQgdnR5X291dF9uZXdsaW5lKHN0cnVjdCB2dHkgKik7CitpbnQgdnR5X3JlYWQoc3RydWN0IHZ0eSAqdnR5KTsKKy8vdm9pZCB2dHlfdGltZV9wcmludCAoc3RydWN0IHZ0eSAqLCBpbnQpOwordm9pZCB2dHlfY2xvc2UgKHN0cnVjdCB2dHkgKik7CitjaGFyICp2dHlfZ2V0X2N3ZCAodm9pZCk7Cit2b2lkIHZ0eV9sb2cgKGNvbnN0IGNoYXIgKmxldmVsLCBjb25zdCBjaGFyICpwcm90bywgY29uc3QgY2hhciAqZm10LCB2YV9saXN0KTsKK2ludCB2dHlfY29uZmlnX2xvY2sgKHN0cnVjdCB2dHkgKik7CitpbnQgdnR5X2NvbmZpZ191bmxvY2sgKHN0cnVjdCB2dHkgKik7CitpbnQgdnR5X3NoZWxsIChzdHJ1Y3QgdnR5ICopOworaW50IHZ0eV9zaGVsbF9zZXJ2IChzdHJ1Y3QgdnR5ICopOwordm9pZCB2dHlfaGVsbG8gKHN0cnVjdCB2dHkgKik7CisKK3ZvaWQgKnRhbGxfdnR5X2N0eDsKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9saWJzY2NwLnBjLmluIGIvb3BlbmJzYy9saWJzY2NwLnBjLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYThkNDkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL2xpYnNjY3AucGMuaW4KQEAgLTAsMCArMSwxMCBAQAorcHJlZml4PUBwcmVmaXhACitleGVjX3ByZWZpeD1AZXhlY19wcmVmaXhACitsaWJkaXI9QGxpYmRpckAKK2luY2x1ZGVkaXI9QGluY2x1ZGVkaXJACisKK05hbWU6IE9wZW5CU0MgU0NDUCBMaWIKK0Rlc2NyaXB0aW9uOiBPcGVuQlNDIFNDQ1AgTGliCitWZXJzaW9uOiBAVkVSU0lPTkAKK0xpYnM6IC1MJHtsaWJkaXJ9IC1sc2NjcAorQ2ZsYWdzOiAtSSR7aW5jbHVkZWRpcn0vCmRpZmYgLS1naXQgYS9vcGVuYnNjL29wZW5ic2MucGMuaW4gYi9vcGVuYnNjL29wZW5ic2MucGMuaW4KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWJhMDdlMgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvb3BlbmJzYy5wYy5pbgpAQCAtMCwwICsxLDExIEBACitwcmVmaXg9QHByZWZpeEAKK2V4ZWNfcHJlZml4PUBleGVjX3ByZWZpeEAKK2xpYmRpcj1AbGliZGlyQAoraW5jbHVkZWRpcj1AaW5jbHVkZWRpckAvCisKK05hbWU6IE9wZW5CU0MKK0Rlc2NyaXB0aW9uOiBPcGVuQlNDIGJhc2Ugc3RhdGlvbiBjb250cm9sbGVyCitSZXF1aXJlczoKK1ZlcnNpb246IEBWRVJTSU9OQAorTGliczogLUwke2xpYmRpcn0gLWxvcGVuYnNjCitDZmxhZ3M6IC1JJHtpbmNsdWRlZGlyfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL3NyYy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGFjOWRlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw0OCBAQAorSU5DTFVERVMgPSAkKGFsbF9pbmNsdWRlcykgLUkkKHRvcF9zcmNkaXIpL2luY2x1ZGUKK0FNX0NGTEFHUz0tV2FsbCAkKExJQk9TTU9DT1JFX0NGTEFHUykKK0FNX0xERkxBR1MgPSAkKExJQk9TTU9DT1JFX0xJQlMpCisKK3NiaW5fUFJPR1JBTVMgPSBic2NfaGFjayBiczExX2NvbmZpZyBpcGFjY2Vzcy1maW5kIGlwYWNjZXNzLWNvbmZpZyBcCisgICAgICAgICAgICAgICAgaXNkbnN5bmMgYnNjX21nY3AgaXBhY2Nlc3MtcHJveHkKK25vaW5zdF9MSUJSQVJJRVMgPSBsaWJic2MuYSBsaWJtc2MuYSBsaWJ2dHkuYQorbm9pbnN0X0hFQURFUlMgPSB2dHkvY2FyZHNoZWxsLmgKKworYnNjZGlyID0gJChsaWJkaXIpCitic2NfTElCUkFSSUVTID0gbGlic2NjcC5hCisKK2xpYmJzY19hX1NPVVJDRVMgPSBhYmlzX3JzbC5jIGFiaXNfbm0uYyBnc21fZGF0YS5jIGdzbV8wNF8wOF91dGlscy5jIFwKKwkJY2hhbl9hbGxvYy5jIGRlYnVnLmMgXAorCQlnc21fc3Vic2NyaWJlcl9iYXNlLmMgc3ViY2hhbl9kZW11eC5jIGJzY19ybGwuYyB0cmFuc2FjdGlvbi5jIFwKKwkJdHJhdV9mcmFtZS5jIHRyYXVfbXV4LmMgcGFnaW5nLmMgZTFfY29uZmlnLmMgZTFfaW5wdXQuYyBcCisJCWlucHV0L21pc2RuLmMgaW5wdXQvaXBhY2Nlc3MuYyBcCisJCXRhbGxvY19jdHguYyBzeXN0ZW1faW5mb3JtYXRpb24uYyByZXN0X29jdGV0cy5jIFwKKwkJcnRwX3Byb3h5LmMgYnRzX3NpZW1lbnNfYnMxMS5jIGJ0c19pcGFjY2Vzc19uYW5vYnRzLmMgXAorCQlidHNfdW5rbm93bi5jCisKK2xpYm1zY19hX1NPVVJDRVMgPSBnc21fc3Vic2NyaWJlci5jIGRiLmMgdGVsbmV0X2ludGVyZmFjZS5jIFwKKwkJbW5jYy5jIGdzbV8wNF8wOC5jIGdzbV8wNF8xMS5jIHRyYW5zYWN0aW9uLmMgXAorCQl0b2tlbl9hdXRoLmMgcnJscC5jIGdzbV8wNF84MC5jIHVzc2QuYyBzaWxlbnRfY2FsbC5jIFwKKwkJaGFuZG92ZXJfbG9naWMuYyBoYW5kb3Zlcl9kZWNpc2lvbi5jIG1lYXNfcmVwLmMKKworbGlidnR5X2FfU09VUkNFUyA9IHZ0eS9idWZmZXIuYyB2dHkvY29tbWFuZC5jIHZ0eS92ZWN0b3IuYyB2dHkvdnR5LmMKKworbGlic2NjcF9hX1NPVVJDRVMgPSBzY2NwL3NjY3AuYworCitic2NfaGFja19TT1VSQ0VTID0gYnNjX2hhY2suYyBic2NfaW5pdC5jIHZ0eV9pbnRlcmZhY2UuYyB2dHlfaW50ZXJmYWNlX2xheWVyMy5jCitic2NfaGFja19MREFERCA9IGxpYm1zYy5hIGxpYmJzYy5hIGxpYm1zYy5hIGxpYnZ0eS5hIC1sZGwgLWxkYmkgJChMSUJDUllQVCkKKworYnMxMV9jb25maWdfU09VUkNFUyA9IGJzMTFfY29uZmlnLmMgYWJpc19ubS5jIGdzbV9kYXRhLmMgZGVidWcuYyBcCisJCSAgICAgIHJzMjMyLmMgYnRzX3NpZW1lbnNfYnMxMS5jCisKK2lwYWNjZXNzX2ZpbmRfU09VUkNFUyA9IGlwYWNjZXNzL2lwYWNjZXNzLWZpbmQuYworCitpcGFjY2Vzc19jb25maWdfU09VUkNFUyA9IGlwYWNjZXNzL2lwYWNjZXNzLWNvbmZpZy5jIGlwYWNjZXNzL2lwYWNjZXNzLWZpcm13YXJlLmMKK2lwYWNjZXNzX2NvbmZpZ19MREFERCA9IGxpYmJzYy5hIGxpYm1zYy5hIGxpYmJzYy5hIGxpYnZ0eS5hIC1sZGwgLWxkYmkgJChMSUJDUllQVCkKKworaXNkbnN5bmNfU09VUkNFUyA9IGlzZG5zeW5jLmMKKworYnNjX21nY3BfU09VUkNFUyA9IG1nY3AvbWdjcF9tYWluLmMgbWdjcC9tZ2NwX3Byb3RvY29sLmMgbWdjcC9tZ2NwX25ldHdvcmsuYyBtZ2NwL21nY3BfdnR5LmMgXAorCQkgICBkZWJ1Zy5jIHRlbG5ldF9pbnRlcmZhY2UuYworYnNjX21nY3BfTERBREQgPSBsaWJ2dHkuYQorCitpcGFjY2Vzc19wcm94eV9TT1VSQ0VTID0gaXBhY2Nlc3MvaXBhY2Nlc3MtcHJveHkuYyBkZWJ1Zy5jCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9hYmlzX25tLmMgYi9vcGVuYnNjL3NyYy9hYmlzX25tLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWU1ZTFjOAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2FiaXNfbm0uYwpAQCAtMCwwICsxLDMwMDIgQEAKKy8qIEdTTSBOZXR3b3JrIE1hbmFnZW1lbnQgKE9NTCkgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZSAKKyAqIDNHUFAgVFMgMTIuMjEgdmVyc2lvbiA4LjAuMCBSZWxlYXNlIDE5OTkgLyBFVFNJIFRTIDEwMCA2MjMgVjguMC4wICovCisKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bGliZ2VuLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21pc2RuLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKworI2RlZmluZSBPTV9BTExPQ19TSVpFCQkxMDI0CisjZGVmaW5lIE9NX0hFQURST09NX1NJWkUJMTI4CisjZGVmaW5lIElQQUNDX1NFR01FTlRfU0laRQkyNDUKKworLyogdW5pZGlyZWN0aW9uYWwgbWVzc2FnZXMgZnJvbSBCVFMgdG8gQlNDICovCitzdGF0aWMgY29uc3QgZW51bSBhYmlzX25tX21zZ3R5cGUgcmVwb3J0c1tdID0geworCU5NX01UX1NXX0FDVElWQVRFRF9SRVAsCisJTk1fTVRfVEVTVF9SRVAsCisJTk1fTVRfU1RBVEVDSEdfRVZFTlRfUkVQLAorCU5NX01UX0ZBSUxVUkVfRVZFTlRfUkVQLAorfTsKKworLyogbWVzc2FnZXMgd2l0aG91dCBBQ0svTkFDSyAqLworc3RhdGljIGNvbnN0IGVudW0gYWJpc19ubV9tc2d0eXBlIG5vX2Fja19uYWNrW10gPSB7CisJTk1fTVRfTUVBU19SRVNfUkVRLAorCU5NX01UX1NUT1BfTUVBUywKKwlOTV9NVF9TVEFSVF9NRUFTLAorfTsKKworLyogTWVzc2FnZXMgcmVsYXRlZCB0byBzb2Z0d2FyZSBsb2FkICovCitzdGF0aWMgY29uc3QgZW51bSBhYmlzX25tX21zZ3R5cGUgc3dfbG9hZF9tc2dzW10gPSB7CisJTk1fTVRfTE9BRF9JTklUX0FDSywKKwlOTV9NVF9MT0FEX0lOSVRfTkFDSywKKwlOTV9NVF9MT0FEX1NFR19BQ0ssCisJTk1fTVRfTE9BRF9BQk9SVCwKKwlOTV9NVF9MT0FEX0VORF9BQ0ssCisJTk1fTVRfTE9BRF9FTkRfTkFDSywKKwkvL05NX01UX1NXX0FDVF9SRVEsCisJTk1fTVRfQUNUSVZBVEVfU1dfQUNLLAorCU5NX01UX0FDVElWQVRFX1NXX05BQ0ssCisJTk1fTVRfU1dfQUNUSVZBVEVEX1JFUCwKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIGFiaXNfbm1fbXNndHlwZSBuYWNrc1tdID0geworCU5NX01UX0xPQURfSU5JVF9OQUNLLAorCU5NX01UX0xPQURfRU5EX05BQ0ssCisJTk1fTVRfU1dfQUNUX1JFUV9OQUNLLAorCU5NX01UX0FDVElWQVRFX1NXX05BQ0ssCisJTk1fTVRfRVNUQUJMSVNIX1RFSV9OQUNLLAorCU5NX01UX0NPTk5fVEVSUl9TSUdOX05BQ0ssCisJTk1fTVRfRElTQ19URVJSX1NJR05fTkFDSywKKwlOTV9NVF9DT05OX1RFUlJfVFJBRl9OQUNLLAorCU5NX01UX0RJU0NfVEVSUl9UUkFGX05BQ0ssCisJTk1fTVRfQ09OTl9NRFJPUF9MSU5LX05BQ0ssCisJTk1fTVRfRElTQ19NRFJPUF9MSU5LX05BQ0ssCisJTk1fTVRfU0VUX0JUU19BVFRSX05BQ0ssCisJTk1fTVRfU0VUX1JBRElPX0FUVFJfTkFDSywKKwlOTV9NVF9TRVRfQ0hBTl9BVFRSX05BQ0ssCisJTk1fTVRfUEVSRl9URVNUX05BQ0ssCisJTk1fTVRfU0VORF9URVNUX1JFUF9OQUNLLAorCU5NX01UX1NUT1BfVEVTVF9OQUNLLAorCU5NX01UX1NUT1BfRVZFTlRfUkVQX05BQ0ssCisJTk1fTVRfUkVTVF9FVkVOVF9SRVBfTkFDSywKKwlOTV9NVF9DSEdfQURNX1NUQVRFX05BQ0ssCisJTk1fTVRfQ0hHX0FETV9TVEFURV9SRVFfTkFDSywKKwlOTV9NVF9SRVBfT1VUU1RfQUxBUk1TX05BQ0ssCisJTk1fTVRfQ0hBTkdFT1ZFUl9OQUNLLAorCU5NX01UX09QU1RBUlRfTkFDSywKKwlOTV9NVF9SRUlOSVRfTkFDSywKKwlOTV9NVF9TRVRfU0lURV9PVVRfTkFDSywKKwlOTV9NVF9DSEdfSFdfQ09ORl9OQUNLLAorCU5NX01UX0dFVF9BVFRSX05BQ0ssCisJTk1fTVRfU0VUX0FMQVJNX1RIUkVTX05BQ0ssCisJTk1fTVRfQlMxMV9CRUdJTl9EQl9UWF9OQUNLLAorCU5NX01UX0JTMTFfRU5EX0RCX1RYX05BQ0ssCisJTk1fTVRfQlMxMV9DUkVBVEVfT0JKX05BQ0ssCisJTk1fTVRfQlMxMV9ERUxFVEVfT0JKX05BQ0ssCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqbmFja19uYW1lc1sweGZmXSA9IHsKKwlbTk1fTVRfTE9BRF9JTklUX05BQ0tdCQk9ICJTT0ZUV0FSRSBMT0FEIElOSVQiLAorCVtOTV9NVF9MT0FEX0VORF9OQUNLXQkJPSAiU09GVFdBUkUgTE9BRCBFTkQiLAorCVtOTV9NVF9TV19BQ1RfUkVRX05BQ0tdCQk9ICJTT0ZUV0FSRSBBQ1RJVkFURSBSRVFVRVNUIiwKKwlbTk1fTVRfQUNUSVZBVEVfU1dfTkFDS10JPSAiQUNUSVZBVEUgU09GVFdBUkUiLAorCVtOTV9NVF9FU1RBQkxJU0hfVEVJX05BQ0tdCT0gIkVTVEFCTElTSCBURUkiLAorCVtOTV9NVF9DT05OX1RFUlJfU0lHTl9OQUNLXQk9ICJDT05ORUNUIFRFUlJFU1RSSUFMIFNJR05BTExJTkciLAorCVtOTV9NVF9ESVNDX1RFUlJfU0lHTl9OQUNLXQk9ICJESVNDT05ORUNUIFRFUlJFU1RSSUFMIFNJR05BTExJTkciLAorCVtOTV9NVF9DT05OX1RFUlJfVFJBRl9OQUNLXQk9ICJDT05ORUNUIFRFUlJFU1RSSUFMIFRSQUZGSUMiLAorCVtOTV9NVF9ESVNDX1RFUlJfVFJBRl9OQUNLXQk9ICJESVNDT05ORUNUIFRFUlJFU1RSSUFMIFRSQUZGSUMiLAorCVtOTV9NVF9DT05OX01EUk9QX0xJTktfTkFDS10JPSAiQ09OTkVDVCBNVUxUSS1EUk9QIExJTksiLAorCVtOTV9NVF9ESVNDX01EUk9QX0xJTktfTkFDS10JPSAiRElTQ09OTkVDVCBNVUxUSS1EUk9QIExJTksiLAorCVtOTV9NVF9TRVRfQlRTX0FUVFJfTkFDS10JPSAiU0VUIEJUUyBBVFRSSUJVVEUiLAorCVtOTV9NVF9TRVRfUkFESU9fQVRUUl9OQUNLXQk9ICJTRVQgUkFESU8gQVRUUklCVVRFIiwKKwlbTk1fTVRfU0VUX0NIQU5fQVRUUl9OQUNLXQk9ICJTRVQgQ0hBTk5FTCBBVFRSSUJVVEUiLAorCVtOTV9NVF9QRVJGX1RFU1RfTkFDS10JCT0gIlBFUkZPUk0gVEVTVCIsCisJW05NX01UX1NFTkRfVEVTVF9SRVBfTkFDS10JPSAiU0VORCBURVNUIFJFUE9SVCIsCisJW05NX01UX1NUT1BfVEVTVF9OQUNLXQkJPSAiU1RPUCBURVNUIiwKKwlbTk1fTVRfU1RPUF9FVkVOVF9SRVBfTkFDS10JPSAiU1RPUCBFVkVOVCBSRVBPUlQiLAorCVtOTV9NVF9SRVNUX0VWRU5UX1JFUF9OQUNLXQk9ICJSRVNFVCBFVkVOVCBSRVBPUlQiLAorCVtOTV9NVF9DSEdfQURNX1NUQVRFX05BQ0tdCT0gIkNIQU5HRSBBRE1JTklTVFJBVElWRSBTVEFURSIsCisJW05NX01UX0NIR19BRE1fU1RBVEVfUkVRX05BQ0tdCT0gIkNIQU5HRSBBRE1JTklTVFJBVElWRSBTVEFURSBSRVFVRVNUIiwKKwlbTk1fTVRfUkVQX09VVFNUX0FMQVJNU19OQUNLXQk9ICJSRVBPUlQgT1VUU1RBTkRJTkcgQUxBUk1TIiwKKwlbTk1fTVRfQ0hBTkdFT1ZFUl9OQUNLXQkJPSAiQ0hBTkdFT1ZFUiIsCisJW05NX01UX09QU1RBUlRfTkFDS10JCT0gIk9QU1RBUlQiLAorCVtOTV9NVF9SRUlOSVRfTkFDS10JCT0gIlJFSU5JVCIsCisJW05NX01UX1NFVF9TSVRFX09VVF9OQUNLXQk9ICJTRVQgU0lURSBPVVRQVVQiLAorCVtOTV9NVF9DSEdfSFdfQ09ORl9OQUNLXQk9ICJDSEFOR0UgSEFSRFdBUkUgQ09ORklHVVJBVElPTiIsCisJW05NX01UX0dFVF9BVFRSX05BQ0tdCQk9ICJHRVQgQVRUUklCVVRFIiwKKwlbTk1fTVRfU0VUX0FMQVJNX1RIUkVTX05BQ0tdCT0gIlNFVCBBTEFSTSBUSFJFU0hPTEQiLAorCVtOTV9NVF9CUzExX0JFR0lOX0RCX1RYX05BQ0tdCT0gIkJTMTEgQkVHSU4gREFUQUJBU0UgVFJBTlNNSVNTSU9OIiwKKwlbTk1fTVRfQlMxMV9FTkRfREJfVFhfTkFDS10JPSAiQlMxMSBFTkQgREFUQUJBU0UgVFJBTlNNSVNTSU9OIiwKKwlbTk1fTVRfQlMxMV9DUkVBVEVfT0JKX05BQ0tdCT0gIkJTMTEgQ1JFQVRFIE9CSkVDVCIsCisJW05NX01UX0JTMTFfREVMRVRFX09CSl9OQUNLXQk9ICJCUzExIERFTEVURSBPQkpFQ1QiLAorfTsKKworLyogQ2hhcHRlciA5LjQuMzYgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpuYWNrX2NhdXNlX25hbWVzW10gPSB7CisJLyogR2VuZXJhbCBOYWNrIENhdXNlcyAqLworCVtOTV9OQUNLX0lOQ09SUl9TVFJVQ1RdCQk9ICJJbmNvcnJlY3QgbWVzc2FnZSBzdHJ1Y3R1cmUiLAorCVtOTV9OQUNLX01TR1RZUEVfSU5WQUxdCQk9ICJJbnZhbGlkIG1lc3NhZ2UgdHlwZSB2YWx1ZSIsCisJW05NX05BQ0tfT0JKQ0xBU1NfSU5WQUxdCT0gIkludmFsaWQgT2JqZWN0IGNsYXNzIHZhbHVlIiwKKwlbTk1fTkFDS19PQkpDTEFTU19OT1RTVVBQXQk9ICJPYmplY3QgY2xhc3Mgbm90IHN1cHBvcnRlZCIsCisJW05NX05BQ0tfQlRTTlJfVU5LTl0JCT0gIkJUUyBuby4gdW5rbm93biIsCisJW05NX05BQ0tfVFJYTlJfVU5LTl0JCT0gIkJhc2ViYW5kIFRyYW5zY2VpdmVyIG5vLiB1bmtub3duIiwKKwlbTk1fTkFDS19PQkpJTlNUX1VOS05dCQk9ICJPYmplY3QgSW5zdGFuY2UgdW5rbm93biIsCisJW05NX05BQ0tfQVRUUklEX0lOVkFMXQkJPSAiSW52YWxpZCBhdHRyaWJ1dGUgaWRlbnRpZmllciB2YWx1ZSIsCisJW05NX05BQ0tfQVRUUklEX05PVFNVUFBdCT0gIkF0dHJpYnV0ZSBpZGVudGlmaWVyIG5vdCBzdXBwb3J0ZWQiLAorCVtOTV9OQUNLX1BBUkFNX1JBTkdFXQkJPSAiUGFyYW1ldGVyIHZhbHVlIG91dHNpZGUgcGVybWl0dGVkIHJhbmdlIiwKKwlbTk1fTkFDS19BVFRSTElTVF9JTkNPTlNJU1RFTlRdCT0gIkluY29uc2lzdGVuY3kgaW4gYXR0cmlidXRlIGxpc3QiLAorCVtOTV9OQUNLX1NQRUNfSU1QTF9OT1RTVVBQXQk9ICJTcGVjaWZpZWQgaW1wbGVtZW50YXRpb24gbm90IHN1cHBvcnRlZCIsCisJW05NX05BQ0tfQ0FOVF9QRVJGT1JNXQkJPSAiTWVzc2FnZSBjYW5ub3QgYmUgcGVyZm9ybWVkIiwKKwkvKiBTcGVjaWZpYyBOYWNrIENhdXNlcyAqLworCVtOTV9OQUNLX1JFU19OT1RJTVBMXQkJPSAiUmVzb3VyY2Ugbm90IGltcGxlbWVudGVkIiwKKwlbTk1fTkFDS19SRVNfTk9UQVZBSUxdCQk9ICJSZXNvdXJjZSBub3QgYXZhaWxhYmxlIiwKKwlbTk1fTkFDS19GUkVRX05PVEFWQUlMXQkJPSAiRnJlcXVlbmN5IG5vdCBhdmFpbGFibGUiLAorCVtOTV9OQUNLX1RFU1RfTk9UU1VQUF0JCT0gIlRlc3Qgbm90IHN1cHBvcnRlZCIsCisJW05NX05BQ0tfQ0FQQUNJVFlfUkVTVFJdCT0gIkNhcGFjaXR5IHJlc3RyaWN0aW9ucyIsCisJW05NX05BQ0tfUEhZU0NGR19OT1RQRVJGT1JNXQk9ICJQaHlzaWNhbCBjb25maWd1cmF0aW9uIGNhbm5vdCBiZSBwZXJmb3JtZWQiLAorCVtOTV9OQUNLX1RFU1RfTk9USU5JVF0JCT0gIlRlc3Qgbm90IGluaXRpYXRlZCIsCisJW05NX05BQ0tfUEhZU0NGR19OT1RSRVNUT1JFXQk9ICJQaHlzaWNhbCBjb25maWd1cmF0aW9uIGNhbm5vdCBiZSByZXN0b3JlZCIsCisJW05NX05BQ0tfVEVTVF9OT1NVQ0hdCQk9ICJObyBzdWNoIHRlc3QiLAorCVtOTV9OQUNLX1RFU1RfTk9TVE9QXQkJPSAiVGVzdCBjYW5ub3QgYmUgc3RvcHBlZCIsCisJW05NX05BQ0tfTVNHSU5DT05TSVNUX1BIWVNDRkddCT0gIk1lc3NhZ2UgaW5jb25zaXN0ZW50IHdpdGggcGh5c2ljYWwgY29uZmlndXJhdGlvbiIsCisJW05NX05BQ0tfRklMRV9JTkNPTVBMRVRFXQk9ICJDb21wbGV0ZSBmaWxlIG5vdHJlY2VpdmVkIiwKKwlbTk1fTkFDS19GSUxFX05PVEFWQUlMXQkJPSAiRmlsZSBub3QgYXZhaWxhYmxlIGF0IGRlc3RpbmF0aW9uIiwKKwlbTk1fTkFDS19GSUxFX05PVEFDVElWQVRFXQk9ICJGaWxlIGNhbm5vdCBiZSBhY3RpdmF0ZSIsCisJW05NX05BQ0tfUkVRX05PVF9HUkFOVF0JCT0gIlJlcXVlc3Qgbm90IGdyYW50ZWQiLAorCVtOTV9OQUNLX1dBSVRdCQkJPSAiV2FpdCIsCisJW05NX05BQ0tfTk9USF9SRVBPUlRfRVhJU1RdCT0gIk5vdGhpbmcgcmVwb3J0YWJsZSBleGlzdGluZyIsCisJW05NX05BQ0tfTUVBU19OT1RTVVBQXQkJPSAiTWVhc3VyZW1lbnQgbm90IHN1cHBvcnRlZCIsCisJW05NX05BQ0tfTUVBU19OT1RTVEFSVF0JCT0gIk1lYXN1cmVtZW50IG5vdCBzdGFydGVkIiwKK307CisKK3N0YXRpYyBjaGFyIG5hbWVidWZbMjU1XTsKK3N0YXRpYyBjb25zdCBjaGFyICpuYWNrX2NhdXNlX25hbWUodV9pbnQ4X3QgY2F1c2UpCit7CisJaWYgKGNhdXNlIDwgQVJSQVlfU0laRShuYWNrX2NhdXNlX25hbWVzKSAmJiBuYWNrX2NhdXNlX25hbWVzW2NhdXNlXSkKKwkJcmV0dXJuIG5hY2tfY2F1c2VfbmFtZXNbY2F1c2VdOworCisJc25wcmludGYobmFtZWJ1Ziwgc2l6ZW9mKG5hbWVidWYpLCAiMHglMDJ4XG4iLCBjYXVzZSk7CisJcmV0dXJuIG5hbWVidWY7Cit9CisKKy8qIENoYXB0ZXIgOS40LjE2OiBFdmVudCBUeXBlICovCitzdGF0aWMgY29uc3QgY2hhciAqZXZlbnRfdHlwZV9uYW1lc1tdID0geworCVtOTV9FVlRfQ09NTV9GQUlMXQkJPSAiY29tbXVuaWNhdGlvbiBmYWlsdXJlIiwKKwlbTk1fRVZUX1FPU19GQUlMXQkJPSAicXVhbGl0eSBvZiBzZXJ2aWNlIGZhaWx1cmUiLAorCVtOTV9FVlRfUFJPQ19GQUlMXQkJPSAicHJvY2Vzc2luZyBmYWlsdXJlIiwKKwlbTk1fRVZUX0VRVUlQX0ZBSUxdCQk9ICJlcXVpcG1lbnQgZmFpbHVyZSIsCisJW05NX0VWVF9FTlZfRkFJTF0JCT0gImVudmlyb25tZW50IGZhaWx1cmUiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmV2ZW50X3R5cGVfbmFtZSh1X2ludDhfdCBjYXVzZSkKK3sKKwlpZiAoY2F1c2UgPCBBUlJBWV9TSVpFKGV2ZW50X3R5cGVfbmFtZXMpICYmIGV2ZW50X3R5cGVfbmFtZXNbY2F1c2VdKQorCQlyZXR1cm4gZXZlbnRfdHlwZV9uYW1lc1tjYXVzZV07CisKKwlzbnByaW50ZihuYW1lYnVmLCBzaXplb2YobmFtZWJ1ZiksICIweCUwMnhcbiIsIGNhdXNlKTsKKwlyZXR1cm4gbmFtZWJ1ZjsKK30KKworLyogQ2hhcHRlciA5LjQuNjM6IFBlcmNlaXZlZCBTZXZlcml0eSAqLworc3RhdGljIGNvbnN0IGNoYXIgKnNldmVyaXR5X25hbWVzW10gPSB7CisJW05NX1NFVkVSX0NFQVNFRF0JCT0gImZhaWx1cmUgY2Vhc2VkIiwKKwlbTk1fU0VWRVJfQ1JJVElDQUxdCQk9ICJjcml0aWNhbCBmYWlsdXJlIiwKKwlbTk1fU0VWRVJfTUFKT1JdCQk9ICJtYWpvciBmYWlsdXJlIiwKKwlbTk1fU0VWRVJfTUlOT1JdCQk9ICJtaW5vciBmYWlsdXJlIiwKKwlbTk1fU0VWRVJfV0FSTklOR10JCT0gIndhcm5pbmcgbGV2ZWwgZmFpbHVyZSIsCisJW05NX1NFVkVSX0lOREVURVJNSU5BVEVdCT0gImluZGV0ZXJtaW5hdGUgZmFpbHVyZSIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqc2V2ZXJpdHlfbmFtZSh1X2ludDhfdCBjYXVzZSkKK3sKKwlpZiAoY2F1c2UgPCBBUlJBWV9TSVpFKHNldmVyaXR5X25hbWVzKSAmJiBzZXZlcml0eV9uYW1lc1tjYXVzZV0pCisJCXJldHVybiBzZXZlcml0eV9uYW1lc1tjYXVzZV07CisKKwlzbnByaW50ZihuYW1lYnVmLCBzaXplb2YobmFtZWJ1ZiksICIweCUwMnhcbiIsIGNhdXNlKTsKKwlyZXR1cm4gbmFtZWJ1ZjsKK30KKworLyogQXR0cmlidXRlcyB0aGF0IHRoZSBCU0MgY2FuIHNldCwgbm90IG9ubHkgZ2V0LCBhY2NvcmRpbmcgdG8gU2VjdGlvbiA5LjQgKi8KK3N0YXRpYyBjb25zdCBlbnVtIGFiaXNfbm1fYXR0ciBubV9hdHRfc2V0dGFibGVbXSA9IHsKKwlOTV9BVFRfQUREX0lORk8sCisJTk1fQVRUX0FERF9URVhULAorCU5NX0FUVF9ERVNULAorCU5NX0FUVF9FVkVOVF9UWVBFLAorCU5NX0FUVF9GSUxFX0RBVEEsCisJTk1fQVRUX0dFVF9BUkksCisJTk1fQVRUX0hXX0NPTkZfQ0hHLAorCU5NX0FUVF9MSVNUX1JFUV9BVFRSLAorCU5NX0FUVF9NRFJPUF9MSU5LLAorCU5NX0FUVF9NRFJPUF9ORVhULAorCU5NX0FUVF9OQUNLX0NBVVNFUywKKwlOTV9BVFRfT1VUU1RfQUxBUk0sCisJTk1fQVRUX1BIWVNfQ09ORiwKKwlOTV9BVFRfUFJPQl9DQVVTRSwKKwlOTV9BVFRfUkFEX1NVQkMsCisJTk1fQVRUX1NPVVJDRSwKKwlOTV9BVFRfU1BFQ19QUk9CLAorCU5NX0FUVF9TVEFSVF9USU1FLAorCU5NX0FUVF9URVNUX0RVUiwKKwlOTV9BVFRfVEVTVF9OTywKKwlOTV9BVFRfVEVTVF9SRVBPUlQsCisJTk1fQVRUX1dJTkRPV19TSVpFLAorCU5NX0FUVF9TRVZFUklUWSwKKwlOTV9BVFRfTUVBU19SRVMsCisJTk1fQVRUX01FQVNfVFlQRSwKK307CisKK2NvbnN0IHN0cnVjdCB0bHZfZGVmaW5pdGlvbiBubV9hdHRfdGx2ZGVmID0geworCS5kZWYgPSB7CisJCVtOTV9BVFRfQUJJU19DSEFOTkVMXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAzIH0sCisJCVtOTV9BVFRfQUREX0lORk9dID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9BRERfVEVYVF0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0FETV9TVEFURV0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0FSRkNOX0xJU1RdPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0FVVE9OX1JFUE9SVF0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0FWQUlMX1NUQVRVU10gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0JDQ0hfQVJGQ05dID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJW05NX0FUVF9CU0lDXSA9CQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0JUU19BSVJfVElNRVJdID0JeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0NDQ0hfTF9JX1BdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9DQ0NIX0xfVF0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0NIQU5fQ09NQl0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0NPTk5fRkFJTF9DUklUXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9ERVNUXSA9CQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0VWRU5UX1RZUEVdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9GSUxFX0RBVEFdID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9GSUxFX0lEXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfRklMRV9WRVJTSU9OXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfR1NNX1RJTUVdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJW05NX0FUVF9IU05dID0JCQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfSFdfQ09ORklHXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCVtOTV9BVFRfSFdfREVTQ10gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX0lOVEFWRV9QQVJBTV0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0lOVEVSRl9CT1VORF0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgNiB9LAorCQlbTk1fQVRUX0xJU1RfUkVRX0FUVFJdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX01BSU9dID0JCQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfTUFOVUZfU1RBVEVdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9NQU5VRl9USFJFU0hdID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9NQU5VRl9JRF0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX01BWF9UQV0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX01EUk9QX0xJTktdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJW05NX0FUVF9NRFJPUF9ORVhUXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCVtOTV9BVFRfTkFDS19DQVVTRVNdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9OWTFdID0JCQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfT1BFUl9TVEFURV0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX09WRVJMX1BFUklPRF0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX1BIWVNfQ09ORl0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX1BPV0VSX0NMQVNTXSA9CQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfUE9XRVJfVEhSRVNIXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAzIH0sCisJCVtOTV9BVFRfUFJPQl9DQVVTRV0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMyB9LAorCQlbTk1fQVRUX1JBQ0hfQl9USFJFU0hdID0JeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0xEQVZHX1NMT1RTXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCVtOTV9BVFRfUkFEX1NVQkNdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9SRl9NQVhQT1dSX1JdID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9TSVRFX0lOUFVUU10gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX1NJVEVfT1VUUFVUU10gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX1NPVVJDRV0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX1NQRUNfUFJPQl0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX1NUQVJUX1RJTUVdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJW05NX0FUVF9UMjAwXSA9CQkJeyBUTFZfVFlQRV9GSVhFRCwgNyB9LAorCQlbTk1fQVRUX1RFSV0gPQkJCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9URVNUX0RVUl0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorCQlbTk1fQVRUX1RFU1RfTk9dID0JCXsgVExWX1RZUEVfVFYgfSwKKwkJW05NX0FUVF9URVNUX1JFUE9SVF0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX1ZTV1JfVEhSRVNIXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCVtOTV9BVFRfV0lORE9XX1NJWkVdID0gCQl7IFRMVl9UWVBFX1RWIH0sCisJCVtOTV9BVFRfVFNDXSA9CQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX1NXX0NPTkZJR10gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQlbTk1fQVRUX1NFVkVSSVRZXSA9IAkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX0dFVF9BUkldID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9IV19DT05GX0NIR10gPSAJCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJW05NX0FUVF9PVVRTVF9BTEFSTV0gPQkJeyBUTFZfVFlQRV9UViB9LAorCQlbTk1fQVRUX01FQVNfUkVTXSA9CQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJfSwKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIGFiaXNfbm1fY2hhbl9jb21iIGNoY29tYjRwY2hhbltdID0geworCVtHU01fUENIQU5fQ0NDSF0JPSBOTV9DSEFOQ19tYWluQkNDSCwKKwlbR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0XQk9IE5NX0NIQU5DX0JDQ0hDb21iLAorCVtHU01fUENIQU5fVENIX0ZdCT0gTk1fQ0hBTkNfVENIRnVsbCwKKwlbR1NNX1BDSEFOX1RDSF9IXQk9IE5NX0NIQU5DX1RDSEhhbGYsCisJW0dTTV9QQ0hBTl9TRENDSDhfU0FDQ0g4Q10gPSBOTV9DSEFOQ19TRENDSCwKKwlbR1NNX1BDSEFOX1BEQ0hdCT0gTk1fQ0hBTkNfSVBBQ19QRENILAorCVtHU01fUENIQU5fVENIX0ZfUERDSF0JPSBOTV9DSEFOQ19JUEFDX1RDSEZ1bGxfUERDSCwKKwkvKiBGSVhNRTogYm91bmRzIGNoZWNrICovCit9OworCitpbnQgYWJpc19ubV9jaGNvbWI0cGNoYW4oZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBwY2hhbikKK3sKKwlpZiAocGNoYW4gPCBBUlJBWV9TSVpFKGNoY29tYjRwY2hhbikpCisJCXJldHVybiBjaGNvbWI0cGNoYW5bcGNoYW5dOworCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKK2ludCBhYmlzX25tX3Rsdl9wYXJzZShzdHJ1Y3QgdGx2X3BhcnNlZCAqdHAsIHN0cnVjdCBnc21fYnRzICpidHMsIGNvbnN0IHVfaW50OF90ICpidWYsIGludCBsZW4pCit7CisJaWYgKCFidHMtPm1vZGVsKQorCQlyZXR1cm4gLUVJTzsKKwlyZXR1cm4gdGx2X3BhcnNlKHRwLCAmYnRzLT5tb2RlbC0+bm1fYXR0X3RsdmRlZiwgYnVmLCBsZW4sIDAsIDApOworfQorCitzdGF0aWMgaW50IGlzX2luX2FycihlbnVtIGFiaXNfbm1fbXNndHlwZSBtdCwgY29uc3QgZW51bSBhYmlzX25tX21zZ3R5cGUgKmFyciwgaW50IHNpemUpCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CisJCWlmIChhcnJbaV0gPT0gbXQpCisJCQlyZXR1cm4gMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworI2lmIDAKKy8qIGlzIHRoaXMgbXNndHlwZSB0aGUgdXN1YWwgQUNLL05BQ0sgdHlwZSA/ICovCitzdGF0aWMgaW50IGlzX2Fja19uYWNrKGVudW0gYWJpc19ubV9tc2d0eXBlIG10KQoreworCXJldHVybiAhaXNfaW5fYXJyKG10LCBub19hY2tfbmFjaywgQVJSQVlfU0laRShub19hY2tfbmFjaykpOworfQorI2VuZGlmCisKKy8qIGlzIHRoaXMgbXNndHlwZSBhIHJlcG9ydCA/ICovCitzdGF0aWMgaW50IGlzX3JlcG9ydChlbnVtIGFiaXNfbm1fbXNndHlwZSBtdCkKK3sKKwlyZXR1cm4gaXNfaW5fYXJyKG10LCByZXBvcnRzLCBBUlJBWV9TSVpFKHJlcG9ydHMpKTsKK30KKworI2RlZmluZSBNVF9BQ0soeCkJKHgrMSkKKyNkZWZpbmUgTVRfTkFDSyh4KQkoeCsyKQorCitzdGF0aWMgdm9pZCBmaWxsX29tX2hkcihzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oLCB1X2ludDhfdCBsZW4pCit7CisJb2gtPm1kaXNjID0gQUJJU19PTV9NRElTQ19GT007CisJb2gtPnBsYWNlbWVudCA9IEFCSVNfT01fUExBQ0VNRU5UX09OTFk7CisJb2gtPnNlcXVlbmNlID0gMDsKKwlvaC0+bGVuZ3RoID0gbGVuOworfQorCitzdGF0aWMgdm9pZCBmaWxsX29tX2ZvbV9oZHIoc3RydWN0IGFiaXNfb21faGRyICpvaCwgdV9pbnQ4X3QgbGVuLAorCQkJICAgIHVfaW50OF90IG1zZ190eXBlLCB1X2ludDhfdCBvYmpfY2xhc3MsCisJCQkgICAgdV9pbnQ4X3QgYnRzX25yLCB1X2ludDhfdCB0cnhfbnIsIHVfaW50OF90IHRzX25yKQoreworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCA9CisJCQkoc3RydWN0IGFiaXNfb21fZm9tX2hkciAqKSBvaC0+ZGF0YTsKKworCWZpbGxfb21faGRyKG9oLCBsZW4rc2l6ZW9mKCpmb2gpKTsKKwlmb2gtPm1zZ190eXBlID0gbXNnX3R5cGU7CisJZm9oLT5vYmpfY2xhc3MgPSBvYmpfY2xhc3M7CisJZm9oLT5vYmpfaW5zdC5idHNfbnIgPSBidHNfbnI7CisJZm9oLT5vYmpfaW5zdC50cnhfbnIgPSB0cnhfbnI7CisJZm9oLT5vYmpfaW5zdC50c19uciA9IHRzX25yOworfQorCitzdGF0aWMgc3RydWN0IG1zZ2IgKm5tX21zZ2JfYWxsb2Modm9pZCkKK3sKKwlyZXR1cm4gbXNnYl9hbGxvY19oZWFkcm9vbShPTV9BTExPQ19TSVpFLCBPTV9IRUFEUk9PTV9TSVpFLAorCQkJCSAgICJPTUwiKTsKK30KKworLyogU2VuZCBhIE9NTCBOTSBNZXNzYWdlIGZyb20gQlNDIHRvIEJUUyAqLworaW50IGFiaXNfbm1fc2VuZG1zZyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCW1zZy0+dHJ4ID0gYnRzLT5jMDsKKworCXJldHVybiBfYWJpc19ubV9zZW5kbXNnKG1zZyk7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19ubV9yY3Ztc2dfc3coc3RydWN0IG1zZ2IgKm1iKTsKKworc3RhdGljIGNvbnN0IGNoYXIgKm9ial9jbGFzc19uYW1lKHVfaW50OF90IG9jKQoreworCXN3aXRjaCAob2MpIHsKKwljYXNlIE5NX09DX1NJVEVfTUFOQUdFUjoKKwkJcmV0dXJuICJTSVRFIE1BTkFHRVIiOworCWNhc2UgTk1fT0NfQlRTOgorCQlyZXR1cm4gIkJUUyI7CisJY2FzZSBOTV9PQ19SQURJT19DQVJSSUVSOgorCQlyZXR1cm4gIlJBRElPIENBUlJJRVIiOworCWNhc2UgTk1fT0NfQkFTRUJfVFJBTlNDOgorCQlyZXR1cm4gIkJBU0VCQU5EIFRSQU5TQ0VJVkVSIjsKKwljYXNlIE5NX09DX0NIQU5ORUw6CisJCXJldHVybiAiQ0hBTk5FTCI7CisJY2FzZSBOTV9PQ19CUzExX0FESkM6CisJCXJldHVybiAiQURKQyI7CisJY2FzZSBOTV9PQ19CUzExX0hBTkRPVkVSOgorCQlyZXR1cm4gIkhBTkRPVkVSIjsKKwljYXNlIE5NX09DX0JTMTFfUFdSX0NUUkw6CisJCXJldHVybiAiUE9XRVIgQ09OVFJPTCI7CisJY2FzZSBOTV9PQ19CUzExX0JUU0U6CisJCXJldHVybiAiQlRTRSI7CisJY2FzZSBOTV9PQ19CUzExX1JBQ0s6CisJCXJldHVybiAiUkFDSyI7CisJY2FzZSBOTV9PQ19CUzExX1RFU1Q6CisJCXJldHVybiAiVEVTVCI7CisJY2FzZSBOTV9PQ19CUzExX0VOVkFCVFNFOgorCQlyZXR1cm4gIkVOVkFCVFNFIjsKKwljYXNlIE5NX09DX0JTMTFfQlBPUlQ6CisJCXJldHVybiAiQlBPUlQiOworCWNhc2UgTk1fT0NfR1BSU19OU0U6CisJCXJldHVybiAiR1BSUyBOU0UiOworCWNhc2UgTk1fT0NfR1BSU19DRUxMOgorCQlyZXR1cm4gIkdQUlMgQ0VMTCI7CisJY2FzZSBOTV9PQ19HUFJTX05TVkM6CisJCXJldHVybiAiR1BSUyBOU1ZDIjsKKwljYXNlIE5NX09DX0JTMTE6CisJCXJldHVybiAiU0lFTUVOU0hXIjsKKwl9CisKKwlyZXR1cm4gIlVOS05PV04iOworfQorCitjb25zdCBjaGFyICpubV9vcHN0YXRlX25hbWUodV9pbnQ4X3Qgb3MpCit7CisJc3dpdGNoIChvcykgeworCWNhc2UgTk1fT1BTVEFURV9ESVNBQkxFRDoKKwkJcmV0dXJuICJEaXNhYmxlZCI7CisJY2FzZSBOTV9PUFNUQVRFX0VOQUJMRUQ6CisJCXJldHVybiAiRW5hYmxlZCI7CisJY2FzZSBOTV9PUFNUQVRFX05VTEw6CisJCXJldHVybiAiTlVMTCI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJSRlUiOworCX0KK30KKworLyogQ2hhcHRlciA5LjQuNyAqLworc3RhdGljIGNvbnN0IGNoYXIgKmF2YWlsX25hbWVzW10gPSB7CisJIkluIHRlc3QiLAorCSJGYWlsZWQiLAorCSJQb3dlciBvZmYiLAorCSJPZmYgbGluZSIsCisJIjxub3QgdXNlZD4iLAorCSJEZXBlbmRlbmN5IiwKKwkiRGVncmFkZWQiLAorCSJOb3QgaW5zdGFsbGVkIiwKK307CisKK2NvbnN0IGNoYXIgKm5tX2F2YWlsX25hbWUodV9pbnQ4X3QgYXZhaWwpCit7CisJaWYgKGF2YWlsID09IDB4ZmYpCisJCXJldHVybiAiT0siOworCWlmIChhdmFpbCA+PSBBUlJBWV9TSVpFKGF2YWlsX25hbWVzKSkKKwkJcmV0dXJuICJVTktOT1dOIjsKKwlyZXR1cm4gYXZhaWxfbmFtZXNbYXZhaWxdOworfQorCitzdGF0aWMgc3RydWN0IHZhbHVlX3N0cmluZyB0ZXN0X25hbWVzW10gPSB7CisJLyogRklYTUU6IHN0YW5kYXJkIHRlc3QgbmFtZXMgKi8KKwl7IE5NX0lQQUNDX1RFU1ROT19DSEFOX1VTQUdFLCAiQ2hhbm5lbCBVc2FnZSIgfSwKKwl7IE5NX0lQQUNDX1RFU1ROT19CQ0NIX0NIQU5fVVNBR0UsICJCQ0NIIENoYW5uZWwgVXNhZ2UiIH0sCisJeyBOTV9JUEFDQ19URVNUTk9fRlJFUV9TWU5DLCAiRnJlcXVlbmN5IFN5bmNocm9uaXphdGlvbiIgfSwKKwl7IE5NX0lQQUNDX1RFU1ROT19CQ0NIX0lORk8sICJCQ0NIIEluZm8iIH0sCisJeyBOTV9JUEFDQ19URVNUTk9fVFhfQkVBQ09OLCAiVHJhbnNtaXQgQmVhY29uIiB9LAorCXsgTk1fSVBBQ0NfVEVTVE5PX1NZU0lORk9fTU9OSVRPUiwgIlN5c3RlbSBJbmZvIE1vbml0b3IiIH0sCisJeyBOTV9JUEFDQ19URVNUTk9fQkNDQ0hfTU9OSVRPUiwgIkJDQ0ggTW9uaXRvciIgfSwKKwl7IDAsIE5VTEwgfQorfTsKKworY29uc3QgY2hhciAqbm1fYWRtX25hbWUodV9pbnQ4X3QgYWRtKQoreworCXN3aXRjaCAoYWRtKSB7CisJY2FzZSAxOgorCQlyZXR1cm4gIkxvY2tlZCI7CisJY2FzZSAyOgorCQlyZXR1cm4gIlVubG9ja2VkIjsKKwljYXNlIDM6CisJCXJldHVybiAiU2h1dGRvd24iOworCWRlZmF1bHQ6CisJCXJldHVybiAiPG5vdCB1c2VkPiI7CisJfQorfQorCitpbnQgbm1faXNfcnVubmluZyhzdHJ1Y3QgZ3NtX25tX3N0YXRlICpzKSB7CisJcmV0dXJuIChzLT5vcGVyYXRpb25hbCA9PSBOTV9PUFNUQVRFX0VOQUJMRUQpICYmICgKKwkJKHMtPmF2YWlsYWJpbGl0eSA9PSBOTV9BVlNUQVRFX09LKSB8fAorCQkocy0+YXZhaWxhYmlsaXR5ID09IDB4ZmYpCisJKTsKK30KKworc3RhdGljIHZvaWQgZGVidWdwX2ZvaChzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2gpCit7CisJREVCVUdQKEROTSwgIk9DPSVzKCUwMngpIElOU1Q9KCUwMngsJTAyeCwlMDJ4KSAiLAorCQlvYmpfY2xhc3NfbmFtZShmb2gtPm9ial9jbGFzcyksIGZvaC0+b2JqX2NsYXNzLCAKKwkJZm9oLT5vYmpfaW5zdC5idHNfbnIsIGZvaC0+b2JqX2luc3QudHJ4X25yLAorCQlmb2gtPm9ial9pbnN0LnRzX25yKTsKK30KKworLyogb2J0YWluIHRoZSBnc21fbm1fc3RhdGUgZGF0YSBzdHJ1Y3R1cmUgZm9yIGEgZ2l2ZW4gb2JqZWN0IGluc3RhbmNlICovCitzdGF0aWMgc3RydWN0IGdzbV9ubV9zdGF0ZSAqCitvYmpjbGFzczJubXN0YXRlKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywKKwkJIHN0cnVjdCBhYmlzX29tX29ial9pbnN0ICpvYmpfaW5zdCkKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwlzdHJ1Y3QgZ3NtX25tX3N0YXRlICpubV9zdGF0ZSA9IE5VTEw7CisKKwlzd2l0Y2ggKG9ial9jbGFzcykgeworCWNhc2UgTk1fT0NfQlRTOgorCQlubV9zdGF0ZSA9ICZidHMtPm5tX3N0YXRlOworCQlicmVhazsKKwljYXNlIE5NX09DX1JBRElPX0NBUlJJRVI6CisJCWlmIChvYmpfaW5zdC0+dHJ4X25yID49IGJ0cy0+bnVtX3RyeCkgeworCQkJREVCVUdQQyhETk0sICJUUlggJXUgZG9lcyBub3QgZXhpc3QgIiwgb2JqX2luc3QtPnRyeF9ucik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJbm1fc3RhdGUgPSAmdHJ4LT5ubV9zdGF0ZTsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19CQVNFQl9UUkFOU0M6CisJCWlmIChvYmpfaW5zdC0+dHJ4X25yID49IGJ0cy0+bnVtX3RyeCkgeworCQkJREVCVUdQQyhETk0sICJUUlggJXUgZG9lcyBub3QgZXhpc3QgIiwgb2JqX2luc3QtPnRyeF9ucik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJbm1fc3RhdGUgPSAmdHJ4LT5iYl90cmFuc2Mubm1fc3RhdGU7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfQ0hBTk5FTDoKKwkJaWYgKG9ial9pbnN0LT50cnhfbnIgPj0gYnRzLT5udW1fdHJ4KSB7CisJCQlERUJVR1BDKEROTSwgIlRSWCAldSBkb2VzIG5vdCBleGlzdCAiLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIG9ial9pbnN0LT50cnhfbnIpOworCQlpZiAob2JqX2luc3QtPnRzX25yID49IFRSWF9OUl9UUykKKwkJCXJldHVybiBOVUxMOworCQlubV9zdGF0ZSA9ICZ0cngtPnRzW29ial9pbnN0LT50c19ucl0ubm1fc3RhdGU7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfU0lURV9NQU5BR0VSOgorCQlubV9zdGF0ZSA9ICZidHMtPnNpdGVfbWdyLm5tX3N0YXRlOworCQlicmVhazsKKwljYXNlIE5NX09DX0JTMTE6CisJCXN3aXRjaCAob2JqX2luc3QtPmJ0c19ucikgeworCQljYXNlIEJTMTFfT0JKX0NDTEs6CisJCQlubV9zdGF0ZSA9ICZidHMtPmJzMTEuY2Nsay5ubV9zdGF0ZTsKKwkJCWJyZWFrOworCQljYXNlIEJTMTFfT0JKX0JCU0lHOgorCQkJaWYgKG9ial9pbnN0LT50c19uciA+IGJ0cy0+bnVtX3RyeCkKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIG9ial9pbnN0LT50cnhfbnIpOworCQkJbm1fc3RhdGUgPSAmdHJ4LT5iczExLmJic2lnLm5tX3N0YXRlOworCQkJYnJlYWs7CisJCWNhc2UgQlMxMV9PQkpfUEE6CisJCQlpZiAob2JqX2luc3QtPnRzX25yID4gYnRzLT5udW1fdHJ4KQorCQkJCXJldHVybiBOVUxMOworCQkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgb2JqX2luc3QtPnRyeF9ucik7CisJCQlubV9zdGF0ZSA9ICZ0cngtPmJzMTEucGEubm1fc3RhdGU7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBOVUxMOworCQl9CisJY2FzZSBOTV9PQ19CUzExX1JBQ0s6CisJCW5tX3N0YXRlID0gJmJ0cy0+YnMxMS5yYWNrLm5tX3N0YXRlOworCQlicmVhazsKKwljYXNlIE5NX09DX0JTMTFfRU5WQUJUU0U6CisJCWlmIChvYmpfaW5zdC0+dHJ4X25yID49IEFSUkFZX1NJWkUoYnRzLT5iczExLmVudmFidHNlKSkKKwkJCXJldHVybiBOVUxMOworCQlubV9zdGF0ZSA9ICZidHMtPmJzMTEuZW52YWJ0c2Vbb2JqX2luc3QtPnRyeF9ucl0ubm1fc3RhdGU7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfR1BSU19OU0U6CisJCW5tX3N0YXRlID0gJmJ0cy0+Z3Bycy5uc2Uubm1fc3RhdGU7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfR1BSU19DRUxMOgorCQlubV9zdGF0ZSA9ICZidHMtPmdwcnMuY2VsbC5ubV9zdGF0ZTsKKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19HUFJTX05TVkM6CisJCWlmIChvYmpfaW5zdC0+dHJ4X25yID49IEFSUkFZX1NJWkUoYnRzLT5ncHJzLm5zdmMpKQorCQkJcmV0dXJuIE5VTEw7CisJCW5tX3N0YXRlID0gJmJ0cy0+Z3Bycy5uc3ZjW29ial9pbnN0LT50cnhfbnJdLm5tX3N0YXRlOworCQlicmVhazsKKwl9CisJcmV0dXJuIG5tX3N0YXRlOworfQorCisvKiBvYnRhaW4gdGhlIGluLW1lbW9yeSBkYXRhIHN0cnVjdHVyZSBvZiBhIGdpdmVuIG9iamVjdCBpbnN0YW5jZSAqLworc3RhdGljIHZvaWQgKgorb2JqY2xhc3Myb2JqKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywKKwkgICAgIHN0cnVjdCBhYmlzX29tX29ial9pbnN0ICpvYmpfaW5zdCkKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwl2b2lkICpvYmogPSBOVUxMOworCisJc3dpdGNoIChvYmpfY2xhc3MpIHsKKwljYXNlIE5NX09DX0JUUzoKKwkJb2JqID0gYnRzOworCQlicmVhazsKKwljYXNlIE5NX09DX1JBRElPX0NBUlJJRVI6CisJCWlmIChvYmpfaW5zdC0+dHJ4X25yID49IGJ0cy0+bnVtX3RyeCkgeworCQkJREVCVUdQQyhETk0sICJUUlggJXUgZG9lcyBub3QgZXhpc3QgIiwgb2JqX2luc3QtPnRyeF9ucik7CisJCQlyZXR1cm4gTlVMTDsKKwkJfQorCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJb2JqID0gdHJ4OworCQlicmVhazsKKwljYXNlIE5NX09DX0JBU0VCX1RSQU5TQzoKKwkJaWYgKG9ial9pbnN0LT50cnhfbnIgPj0gYnRzLT5udW1fdHJ4KSB7CisJCQlERUJVR1BDKEROTSwgIlRSWCAldSBkb2VzIG5vdCBleGlzdCAiLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIG9ial9pbnN0LT50cnhfbnIpOworCQlvYmogPSAmdHJ4LT5iYl90cmFuc2M7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfQ0hBTk5FTDoKKwkJaWYgKG9ial9pbnN0LT50cnhfbnIgPj0gYnRzLT5udW1fdHJ4KSB7CisJCQlERUJVR1BDKEROTSwgIlRSWCAldSBkb2VzIG5vdCBleGlzdCAiLCBvYmpfaW5zdC0+dHJ4X25yKTsKKwkJCXJldHVybiBOVUxMOworCQl9CisJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIG9ial9pbnN0LT50cnhfbnIpOworCQlpZiAob2JqX2luc3QtPnRzX25yID49IFRSWF9OUl9UUykKKwkJCXJldHVybiBOVUxMOworCQlvYmogPSAmdHJ4LT50c1tvYmpfaW5zdC0+dHNfbnJdOworCQlicmVhazsKKwljYXNlIE5NX09DX1NJVEVfTUFOQUdFUjoKKwkJb2JqID0gJmJ0cy0+c2l0ZV9tZ3I7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfR1BSU19OU0U6CisJCW9iaiA9ICZidHMtPmdwcnMubnNlOworCQlicmVhazsKKwljYXNlIE5NX09DX0dQUlNfQ0VMTDoKKwkJb2JqID0gJmJ0cy0+Z3Bycy5jZWxsOworCQlicmVhazsKKwljYXNlIE5NX09DX0dQUlNfTlNWQzoKKwkJaWYgKG9ial9pbnN0LT50cnhfbnIgPj0gQVJSQVlfU0laRShidHMtPmdwcnMubnN2YykpCisJCQlyZXR1cm4gTlVMTDsKKwkJb2JqID0gJmJ0cy0+Z3Bycy5uc3ZjW29ial9pbnN0LT50cnhfbnJdOworCQlicmVhazsKKwl9CisJcmV0dXJuIG9iajsKK30KKworLyogVXBkYXRlIHRoZSBhZG1pbmlzdHJhdGl2ZSBzdGF0ZSBvZiBhIGdpdmVuIG9iamVjdCBpbiBvdXIgaW4tbWVtb3J5IGRhdGEKKyAqIHN0cnVjdHVyZXMgYW5kIHNlbmQgYW4gZXZlbnQgdG8gdGhlIGhpZ2hlciBsYXllciAqLworc3RhdGljIGludCB1cGRhdGVfYWRtc3RhdGUoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLAorCQkJICAgc3RydWN0IGFiaXNfb21fb2JqX2luc3QgKm9ial9pbnN0LCB1X2ludDhfdCBhZG1fc3RhdGUpCit7CisJc3RydWN0IGdzbV9ubV9zdGF0ZSAqbm1fc3RhdGUsIG5ld19zdGF0ZTsKKwl2b2lkICpvYmo7CisJaW50IHJjOworCisJb2JqID0gb2JqY2xhc3Myb2JqKGJ0cywgb2JqX2NsYXNzLCBvYmpfaW5zdCk7CisJaWYgKCFvYmopCisJCXJldHVybiAtRUlOVkFMOworCW5tX3N0YXRlID0gb2JqY2xhc3Mybm1zdGF0ZShidHMsIG9ial9jbGFzcywgb2JqX2luc3QpOworCWlmICghbm1fc3RhdGUpCisJCXJldHVybiAtMTsKKworCW5ld19zdGF0ZSA9ICpubV9zdGF0ZTsKKwluZXdfc3RhdGUuYWRtaW5pc3RyYXRpdmUgPSBhZG1fc3RhdGU7CisKKwlyYyA9IG5tX3N0YXRlX2V2ZW50KEVWVF9TVEFURUNIR19BRE0sIG9ial9jbGFzcywgb2JqLCBubV9zdGF0ZSwgJm5ld19zdGF0ZSk7CisKKwlubV9zdGF0ZS0+YWRtaW5pc3RyYXRpdmUgPSBhZG1fc3RhdGU7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19ubV9yeF9zdGF0ZWNoZ19yZXAoc3RydWN0IG1zZ2IgKm1iKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2ggPSBtc2diX2wyKG1iKTsKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2ggPSBtc2diX2wzKG1iKTsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbWItPnRyeC0+YnRzOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbm1fc3RhdGUgKm5tX3N0YXRlLCBuZXdfc3RhdGU7CisJaW50IHJjOworCisJREVCVUdQQyhETk0sICJTVEFURSBDSEc6ICIpOworCisJbWVtc2V0KCZuZXdfc3RhdGUsIDAsIHNpemVvZihuZXdfc3RhdGUpKTsKKworCW5tX3N0YXRlID0gb2JqY2xhc3Mybm1zdGF0ZShidHMsIGZvaC0+b2JqX2NsYXNzLCAmZm9oLT5vYmpfaW5zdCk7CisJaWYgKCFubV9zdGF0ZSkgeworCQlERUJVR1BDKEROTSwgInVua25vd24gb2JqZWN0IGNsYXNzXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbmV3X3N0YXRlID0gKm5tX3N0YXRlOworCQorCWFiaXNfbm1fdGx2X3BhcnNlKCZ0cCwgYnRzLCBmb2gtPmRhdGEsIG9oLT5sZW5ndGgtc2l6ZW9mKCpmb2gpKTsKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX09QRVJfU1RBVEUpKSB7CisJCW5ld19zdGF0ZS5vcGVyYXRpb25hbCA9ICpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9PUEVSX1NUQVRFKTsKKwkJREVCVUdQQyhETk0sICJPUF9TVEFURT0lcyAiLCBubV9vcHN0YXRlX25hbWUobmV3X3N0YXRlLm9wZXJhdGlvbmFsKSk7CisJfQorCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfQVZBSUxfU1RBVFVTKSkgeworCQlpZiAoVExWUF9MRU4oJnRwLCBOTV9BVFRfQVZBSUxfU1RBVFVTKSA9PSAwKQorCQkJbmV3X3N0YXRlLmF2YWlsYWJpbGl0eSA9IDB4ZmY7CisJCWVsc2UKKwkJCW5ld19zdGF0ZS5hdmFpbGFiaWxpdHkgPSAqVExWUF9WQUwoJnRwLCBOTV9BVFRfQVZBSUxfU1RBVFVTKTsKKwkJREVCVUdQQyhETk0sICJBVkFJTD0lcyglMDJ4KSAiLCBubV9hdmFpbF9uYW1lKG5ld19zdGF0ZS5hdmFpbGFiaWxpdHkpLAorCQkJbmV3X3N0YXRlLmF2YWlsYWJpbGl0eSk7CisJfSBlbHNlCisJCW5ld19zdGF0ZS5hdmFpbGFiaWxpdHkgPSAweGZmOworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfQURNX1NUQVRFKSkgeworCQluZXdfc3RhdGUuYWRtaW5pc3RyYXRpdmUgPSAqVExWUF9WQUwoJnRwLCBOTV9BVFRfQURNX1NUQVRFKTsKKwkJREVCVUdQQyhETk0sICJBRE09JTJzICIsIG5tX2FkbV9uYW1lKG5ld19zdGF0ZS5hZG1pbmlzdHJhdGl2ZSkpOworCX0KKwlERUJVR1BDKEROTSwgIlxuIik7CisKKwlpZiAoKG5ld19zdGF0ZS5hZG1pbmlzdHJhdGl2ZSAhPSAwICYmIG5tX3N0YXRlLT5hZG1pbmlzdHJhdGl2ZSA9PSAwKSB8fAorCSAgICBuZXdfc3RhdGUub3BlcmF0aW9uYWwgIT0gbm1fc3RhdGUtPm9wZXJhdGlvbmFsIHx8CisJICAgIG5ld19zdGF0ZS5hdmFpbGFiaWxpdHkgIT0gbm1fc3RhdGUtPmF2YWlsYWJpbGl0eSkgeworCQkvKiBVcGRhdGUgdGhlIG9wZXJhdGlvbmFsIHN0YXRlIG9mIGEgZ2l2ZW4gb2JqZWN0IGluIG91ciBpbi1tZW1vcnkgZGF0YQorIAkJKiBzdHJ1Y3R1cmVzIGFuZCBzZW5kIGFuIGV2ZW50IHRvIHRoZSBoaWdoZXIgbGF5ZXIgKi8KKwkJdm9pZCAqb2JqID0gb2JqY2xhc3Myb2JqKGJ0cywgZm9oLT5vYmpfY2xhc3MsICZmb2gtPm9ial9pbnN0KTsKKwkJcmMgPSBubV9zdGF0ZV9ldmVudChFVlRfU1RBVEVDSEdfT1BFUiwgZm9oLT5vYmpfY2xhc3MsIG9iaiwgbm1fc3RhdGUsICZuZXdfc3RhdGUpOworCQlubV9zdGF0ZS0+b3BlcmF0aW9uYWwgPSBuZXdfc3RhdGUub3BlcmF0aW9uYWw7CisJCW5tX3N0YXRlLT5hdmFpbGFiaWxpdHkgPSBuZXdfc3RhdGUuYXZhaWxhYmlsaXR5OworCQlpZiAobm1fc3RhdGUtPmFkbWluaXN0cmF0aXZlID09IDApCisJCQlubV9zdGF0ZS0+YWRtaW5pc3RyYXRpdmUgPSBuZXdfc3RhdGUuYWRtaW5pc3RyYXRpdmU7CisJfQorI2lmIDAKKwlpZiAob3Bfc3RhdGUgPT0gMSkgeworCQkvKiB0cnkgdG8gZW5hYmxlIG9iamVjdHMgdGhhdCBhcmUgZGlzYWJsZWQgKi8KKwkJYWJpc19ubV9vcHN0YXJ0KGJ0cywgZm9oLT5vYmpfY2xhc3MsCisJCQkJZm9oLT5vYmpfaW5zdC5idHNfbnIsCisJCQkJZm9oLT5vYmpfaW5zdC50cnhfbnIsCisJCQkJZm9oLT5vYmpfaW5zdC50c19ucik7CisJfQorI2VuZGlmCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcnhfZmFpbF9ldnRfcmVwKHN0cnVjdCBtc2diICptYikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oID0gbXNnYl9sMihtYik7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oID0gbXNnYl9sMyhtYik7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisKKwlERUJVR1BDKEROTSwgIkZhaWx1cmUgRXZlbnQgUmVwb3J0ICIpOworCQorCWFiaXNfbm1fdGx2X3BhcnNlKCZ0cCwgbWItPnRyeC0+YnRzLCBmb2gtPmRhdGEsIG9oLT5sZW5ndGgtc2l6ZW9mKCpmb2gpKTsKKworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfRVZFTlRfVFlQRSkpCisJCURFQlVHUEMoRE5NLCAiVHlwZT0lcyAiLCBldmVudF90eXBlX25hbWUoKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX0VWRU5UX1RZUEUpKSk7CisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9TRVZFUklUWSkpCisJCURFQlVHUEMoRE5NLCAiU2V2ZXJpdHk9JXMgIiwgc2V2ZXJpdHlfbmFtZSgqVExWUF9WQUwoJnRwLCBOTV9BVFRfU0VWRVJJVFkpKSk7CisKKwlERUJVR1BDKEROTSwgIlxuIik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYmlzX25tX3Jjdm1zZ19yZXBvcnQoc3RydWN0IG1zZ2IgKm1iKQoreworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCA9IG1zZ2JfbDMobWIpOworCXVfaW50OF90IG10ID0gZm9oLT5tc2dfdHlwZTsKKworCWRlYnVncF9mb2goZm9oKTsKKworCS8vbm1oLT5jZmctPnJlcG9ydF9jYihtYiwgZm9oKTsKKworCXN3aXRjaCAobXQpIHsKKwljYXNlIE5NX01UX1NUQVRFQ0hHX0VWRU5UX1JFUDoKKwkJcmV0dXJuIGFiaXNfbm1fcnhfc3RhdGVjaGdfcmVwKG1iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9TV19BQ1RJVkFURURfUkVQOgorCQlERUJVR1BDKEROTSwgIlNvZnR3YXJlIEFjdGl2YXRlZCBSZXBvcnRcbiIpOworCQlkaXNwYXRjaF9zaWduYWwoU1NfTk0sIFNfTk1fU1dfQUNUSVZfUkVQLCBtYik7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfRkFJTFVSRV9FVkVOVF9SRVA6CisJCXJ4X2ZhaWxfZXZ0X3JlcChtYik7CisJCWRpc3BhdGNoX3NpZ25hbChTU19OTSwgU19OTV9GQUlMX1JFUCwgbWIpOworCQlicmVhazsKKwljYXNlIE5NX01UX1RFU1RfUkVQOgorCQlERUJVR1BDKEROTSwgIlRlc3QgUmVwb3J0XG4iKTsKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX05NLCBTX05NX1RFU1RfUkVQLCBtYik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUEMoRE5NLCAicmVwb3J0aW5nIE5NIE1UIDB4JTAyeFxuIiwgbXQpOworCQlicmVhazsKKwkJCisJfTsKKworCXJldHVybiAwOworfQorCisvKiBBY3RpdmF0ZSB0aGUgc3BlY2lmaWVkIHNvZnR3YXJlIGludG8gdGhlIEJUUyAqLworc3RhdGljIGludCBpcGFjY19zd19hY3RpdmF0ZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsIHVfaW50OF90IGkwLCB1X2ludDhfdCBpMSwKKwkJCSAgICAgdV9pbnQ4X3QgaTIsIGNvbnN0IHVfaW50OF90ICpzd19kZXNjLCB1X2ludDhfdCBzd2Rlc2NfbGVuKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCBsZW4gPSBzd2Rlc2NfbGVuOworCXVfaW50OF90ICp0cmFpbGVyOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgbGVuLCBOTV9NVF9BQ1RJVkFURV9TVywgb2JqX2NsYXNzLCBpMCwgaTEsIGkyKTsKKworCXRyYWlsZXIgPSBtc2diX3B1dChtc2csIHN3ZGVzY19sZW4pOworCW1lbWNweSh0cmFpbGVyLCBzd19kZXNjLCBzd2Rlc2NfbGVuKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitzdGF0aWMgaW50IGFiaXNfbm1fcnhfc3dfYWN0X3JlcShzdHJ1Y3QgbXNnYiAqbWIpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaCA9IG1zZ2JfbDIobWIpOworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCA9IG1zZ2JfbDMobWIpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCWNvbnN0IHVfaW50OF90ICpzd19jb25maWc7CisJaW50IHN3X2NvbmZpZ19sZW47CisJaW50IGZpbGVfaWRfbGVuOworCWludCByZXQ7CisKKwlkZWJ1Z3BfZm9oKGZvaCk7CisKKwlERUJVR1BDKEROTSwgIlNXIEFjdGl2YXRlIFJlcXVlc3Q6ICIpOworCisJREVCVUdQKEROTSwgIlNvZnR3YXJlIEFjdGl2YXRlIFJlcXVlc3QsIEFDS2luZyBhbmQgQWN0aXZhdGluZ1xuIik7CisKKwlyZXQgPSBhYmlzX25tX3N3X2FjdF9yZXFfYWNrKG1iLT50cngtPmJ0cywgZm9oLT5vYmpfY2xhc3MsCisJCQkJICAgICAgZm9oLT5vYmpfaW5zdC5idHNfbnIsCisJCQkJICAgICAgZm9oLT5vYmpfaW5zdC50cnhfbnIsCisJCQkJICAgICAgZm9oLT5vYmpfaW5zdC50c19uciwgMCwKKwkJCQkgICAgICBmb2gtPmRhdGEsIG9oLT5sZW5ndGgtc2l6ZW9mKCpmb2gpKTsKKworCWFiaXNfbm1fdGx2X3BhcnNlKCZ0cCwgbWItPnRyeC0+YnRzLCBmb2gtPmRhdGEsIG9oLT5sZW5ndGgtc2l6ZW9mKCpmb2gpKTsKKwlzd19jb25maWcgPSBUTFZQX1ZBTCgmdHAsIE5NX0FUVF9TV19DT05GSUcpOworCXN3X2NvbmZpZ19sZW4gPSBUTFZQX0xFTigmdHAsIE5NX0FUVF9TV19DT05GSUcpOworCWlmICghVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX1NXX0NPTkZJRykpIHsKKwkJREVCVUdQKEROTSwgIlNXIGNvbmZpZyBub3QgZm91bmQhIENhbid0IGNvbnRpbnVlLlxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCURFQlVHUChETk0sICJGb3VuZCBTVyBjb25maWc6ICVzXG4iLCBoZXhkdW1wKHN3X2NvbmZpZywgc3dfY29uZmlnX2xlbikpOworCX0KKworCWlmIChzd19jb25maWdbMF0gIT0gTk1fQVRUX1NXX0RFU0NSKQorCQlERUJVR1AoRE5NLCAiU1dfREVTQ1IgYXR0cmlidXRlIGlkZW50aWZpZXIgbm90IGZvdW5kIVxuIik7CisJaWYgKHN3X2NvbmZpZ1sxXSAhPSBOTV9BVFRfRklMRV9JRCkKKwkJREVCVUdQKEROTSwgIkZJTEVfSUQgYXR0cmlidXRlIGlkZW50aWZpZXIgbm90IGZvdW5kIVxuIik7CisJZmlsZV9pZF9sZW4gPSBzd19jb25maWdbMl0gKiAyNTYgKyBzd19jb25maWdbM107CisKKwkvKiBBc3N1bWVzIGZpcnN0IFNXIGZpbGUgaW4gbGlzdCBpcyB0aGUgb25lIHRvIGJlIGFjdGl2YXRlZCAqLworCS8qIHN3X2NvbmZpZyArIDQgdG8gc2tpcCBvdmVyIDIgYXR0cmlidXRlIElEIGJ5dGVzIGFuZCAxNi1iaXQgbGVuZ3RoIGZpZWxkICovCisJcmV0dXJuIGlwYWNjX3N3X2FjdGl2YXRlKG1iLT50cngtPmJ0cywgZm9oLT5vYmpfY2xhc3MsCisJCQkJIGZvaC0+b2JqX2luc3QuYnRzX25yLAorCQkJCSBmb2gtPm9ial9pbnN0LnRyeF9uciwKKwkJCQkgZm9oLT5vYmpfaW5zdC50c19uciwKKwkJCQkgc3dfY29uZmlnICsgNCwKKwkJCQkgZmlsZV9pZF9sZW4pOworfQorCisvKiBSZWNlaXZlIGEgQ0hBTkdFX0FETV9TVEFURV9BQ0ssIHBhcnNlIHRoZSBUTFYgYW5kIHVwZGF0ZSBsb2NhbCBzdGF0ZSAqLworc3RhdGljIGludCBhYmlzX25tX3J4X2NoZ19hZG1fc3RhdGVfYWNrKHN0cnVjdCBtc2diICptYikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oID0gbXNnYl9sMihtYik7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oID0gbXNnYl9sMyhtYik7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJdV9pbnQ4X3QgYWRtX3N0YXRlOworCisJYWJpc19ubV90bHZfcGFyc2UoJnRwLCBtYi0+dHJ4LT5idHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCWlmICghVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0FETV9TVEFURSkpCisJCXJldHVybiAtRUlOVkFMOworCisJYWRtX3N0YXRlID0gKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX0FETV9TVEFURSk7CisKKwlyZXR1cm4gdXBkYXRlX2FkbXN0YXRlKG1iLT50cngtPmJ0cywgZm9oLT5vYmpfY2xhc3MsICZmb2gtPm9ial9pbnN0LCBhZG1fc3RhdGUpOworfQorCitzdGF0aWMgaW50IGFiaXNfbm1fcnhfbG10X2V2ZW50KHN0cnVjdCBtc2diICptYikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oID0gbXNnYl9sMihtYik7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oID0gbXNnYl9sMyhtYik7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisKKwlERUJVR1AoRE5NLCAiTE1UIEV2ZW50ICIpOworCWFiaXNfbm1fdGx2X3BhcnNlKCZ0cCwgbWItPnRyeC0+YnRzLCBmb2gtPmRhdGEsIG9oLT5sZW5ndGgtc2l6ZW9mKCpmb2gpKTsKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX0xPR09OX1NFU1NJT04pICYmCisJICAgIFRMVlBfTEVOKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX0xPR09OX1NFU1NJT04pID49IDEpIHsKKwkJdV9pbnQ4X3Qgb25vZmYgPSAqVExWUF9WQUwoJnRwLCBOTV9BVFRfQlMxMV9MTVRfTE9HT05fU0VTU0lPTik7CisJCURFQlVHUEMoRE5NLCAiTE9HJXMgIiwgb25vZmYgPyAiT04iIDogIk9GRiIpOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFVikgJiYKKwkgICAgVExWUF9MRU4oJnRwLCBOTV9BVFRfQlMxMV9MTVRfVVNFUl9BQ0NfTEVWKSA+PSAxKSB7CisJCXVfaW50OF90IGxldmVsID0gKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFVik7CisJCURFQlVHUEMoRE5NLCAiTGV2ZWw9JXUgIiwgbGV2ZWwpOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0JTMTFfTE1UX1VTRVJfTkFNRSkgJiYKKwkgICAgVExWUF9MRU4oJnRwLCBOTV9BVFRfQlMxMV9MTVRfVVNFUl9OQU1FKSA+PSAxKSB7CisJCWNoYXIgKm5hbWUgPSAoY2hhciAqKSBUTFZQX1ZBTCgmdHAsIE5NX0FUVF9CUzExX0xNVF9VU0VSX05BTUUpOworCQlERUJVR1BDKEROTSwgIlVzZXJuYW1lPSVzICIsIG5hbWUpOworCX0KKwlERUJVR1BDKEROTSwgIlxuIik7CisJLyogRklYTUU6IHBhcnNlIExNVCBMT0dPTiBUSU1FICovCisJcmV0dXJuIDA7Cit9CisKKy8qIFJlY2VpdmUgYSBPTUwgTk0gTWVzc2FnZSBmcm9tIEJUUyAqLworc3RhdGljIGludCBhYmlzX25tX3Jjdm1zZ19mb20oc3RydWN0IG1zZ2IgKm1iKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2ggPSBtc2diX2wyKG1iKTsKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2ggPSBtc2diX2wzKG1iKTsKKwl1X2ludDhfdCBtdCA9IGZvaC0+bXNnX3R5cGU7CisKKwkvKiBjaGVjayBmb3IgdW5zb2xpY2l0ZWQgbWVzc2FnZSAqLworCWlmIChpc19yZXBvcnQobXQpKQorCQlyZXR1cm4gYWJpc19ubV9yY3Ztc2dfcmVwb3J0KG1iKTsKKworCWlmIChpc19pbl9hcnIobXQsIHN3X2xvYWRfbXNncywgQVJSQVlfU0laRShzd19sb2FkX21zZ3MpKSkKKwkJcmV0dXJuIGFiaXNfbm1fcmN2bXNnX3N3KG1iKTsKKworCWlmIChpc19pbl9hcnIobXQsIG5hY2tzLCBBUlJBWV9TSVpFKG5hY2tzKSkpIHsKKwkJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisKKwkJZGVidWdwX2ZvaChmb2gpOworCisJCWlmIChuYWNrX25hbWVzW210XSkKKwkJCURFQlVHUEMoRE5NLCAiJXMgTkFDSyAiLCBuYWNrX25hbWVzW210XSk7CisJCQkvKiBGSVhNRTogTkFDSyBjYXVzZSAqLworCQllbHNlCisJCQlERUJVR1BDKEROTSwgIk5BQ0sgMHglMDJ4ICIsIG10KTsKKworCQlhYmlzX25tX3Rsdl9wYXJzZSgmdHAsIG1iLT50cngtPmJ0cywgZm9oLT5kYXRhLCBvaC0+bGVuZ3RoLXNpemVvZigqZm9oKSk7CisJCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfTkFDS19DQVVTRVMpKQorCQkJREVCVUdQQyhETk0sICJDQVVTRT0lc1xuIiwgCisJCQkJbmFja19jYXVzZV9uYW1lKCpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9OQUNLX0NBVVNFUykpKTsKKwkJZWxzZQorCQkJREVCVUdQQyhETk0sICJcbiIpOworCisJCWRpc3BhdGNoX3NpZ25hbChTU19OTSwgU19OTV9OQUNLLCAodm9pZCopICZtdCk7CisJCXJldHVybiAwOworCX0KKyNpZiAwCisJLyogY2hlY2sgaWYgbGFzdCBtZXNzYWdlIGlzIHRvIGJlIGFja2VkICovCisJaWYgKGlzX2Fja19uYWNrKG5taC0+bGFzdF9tc2d0eXBlKSkgeworCQlpZiAobXQgPT0gTVRfQUNLKG5taC0+bGFzdF9tc2d0eXBlKSkgeworCQkJREVCVUdQKEROTSwgInJlY2VpdmVkIEFDSyAoMHgleClcbiIsIGZvaC0+bXNnX3R5cGUpOworCQkJLyogd2UgZ290IG91ciBBQ0ssIGNvbnRpbnVlIHNlbmRpbmcgdGhlIG5leHQgbXNnICovCisJCX0gZWxzZSBpZiAobXQgPT0gTVRfTkFDSyhubWgtPmxhc3RfbXNndHlwZSkpIHsKKwkJCS8qIHdlIGdvdCBhIE5BQ0ssIHNpZ25hbCB0aGlzIHRvIHRoZSBjYWxsZXIgKi8KKwkJCURFQlVHUChETk0sICJyZWNlaXZlZCBOQUNLICgweCV4KVxuIiwgZm9oLT5tc2dfdHlwZSk7CisJCQkvKiBGSVhNRTogc29tZWhvdyBzaWduYWwgdGhpcyB0byB0aGUgY2FsbGVyICovCisJCX0gZWxzZSB7CisJCQkvKiByZWFsbHkgc3RyYW5nZSB0aGluZ3MgaGFwcGVuICovCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKyNlbmRpZgorCisJc3dpdGNoIChtdCkgeworCWNhc2UgTk1fTVRfQ0hHX0FETV9TVEFURV9BQ0s6CisJCXJldHVybiBhYmlzX25tX3J4X2NoZ19hZG1fc3RhdGVfYWNrKG1iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9TV19BQ1RfUkVROgorCQlyZXR1cm4gYWJpc19ubV9yeF9zd19hY3RfcmVxKG1iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9CUzExX0xNVF9TRVNTSU9OOgorCQlyZXR1cm4gYWJpc19ubV9yeF9sbXRfZXZlbnQobWIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0NPTk5fTURST1BfTElOS19BQ0s6CisJCURFQlVHUChETk0sICJDT05OIE1EUk9QIExJTksgQUNLXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19SRVNUQVJUX0FDSzoKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX05NLCBTX05NX0lQQUNDX1JFU1RBUlRfQUNLLCBOVUxMKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19SRVNUQVJUX05BQ0s6CisJCWRpc3BhdGNoX3NpZ25hbChTU19OTSwgU19OTV9JUEFDQ19SRVNUQVJUX05BQ0ssIE5VTEwpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYmlzX25tX3J4X2lwYWNjKHN0cnVjdCBtc2diICptYik7CisKK3N0YXRpYyBpbnQgYWJpc19ubV9yY3Ztc2dfbWFudWYoc3RydWN0IG1zZ2IgKm1iKQoreworCWludCByYzsKKwlpbnQgYnRzX3R5cGUgPSBtYi0+dHJ4LT5idHMtPnR5cGU7CisKKwlzd2l0Y2ggKGJ0c190eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzoKKwkJcmMgPSBhYmlzX25tX3J4X2lwYWNjKG1iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJkb24ndCBrbm93IGhvdyB0byBwYXJzZSBPTUwgZm9yIHRoaXMgIgorCQkgICAgICJCVFMgdHlwZSAoJXUpXG4iLCBidHNfdHlwZSk7CisJCXJjID0gMDsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiBIaWdoLUxldmVsIEFQSSAqLworLyogRW50cnktcG9pbnQgd2hlcmUgTDIgT01MIGZyb20gQlRTIGVudGVycyB0aGUgTk0gY29kZSAqLworaW50IGFiaXNfbm1fcmN2bXNnKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaCA9IG1zZ2JfbDIobXNnKTsKKwlpbnQgcmMgPSAwOworCisJLyogVmFyaW91cyBjb25zaXN0ZW5jeSBjaGVja3MgKi8KKwlpZiAob2gtPnBsYWNlbWVudCAhPSBBQklTX09NX1BMQUNFTUVOVF9PTkxZKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiQUJJUyBPTUwgcGxhY2VtZW50IDB4JXggbm90IHN1cHBvcnRlZFxuIiwKKwkJCW9oLT5wbGFjZW1lbnQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKG9oLT5zZXF1ZW5jZSAhPSAwKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiQUJJUyBPTUwgc2VxdWVuY2UgMHgleCAhPSAweDAwXG4iLAorCQkJb2gtPnNlcXVlbmNlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorI2lmIDAKKwl1bnNpZ25lZCBpbnQgbDJfbGVuID0gbXNnLT50YWlsIC0gKHVfaW50OF90ICopbXNnYl9sMihtc2cpOworCXVuc2lnbmVkIGludCBobGVuID0gc2l6ZW9mKCpvaCkgKyBzaXplb2Yoc3RydWN0IGFiaXNfb21fZm9tX2hkcik7CisJaWYgKG9oLT5sZW5ndGggKyBobGVuID4gbDJfbGVuKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiQUJJUyBPTUwgdHJ1bmNhdGVkIG1lc3NhZ2UgKCV1ID4gJXUpXG4iLAorCQkJb2gtPmxlbmd0aCArIHNpemVvZigqb2gpLCBsMl9sZW4pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJaWYgKG9oLT5sZW5ndGggKyBobGVuIDwgbDJfbGVuKQorCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIkFCSVMgT01MIG1lc3NhZ2Ugd2l0aCBleHRyYSB0cmFpbGVyPyE/IChvaC0+bGVuPSVkLCBzaXplb2Zfb2g9JWQgbDJfbGVuPSVkXG4iLCBvaC0+bGVuZ3RoLCBzaXplb2YoKm9oKSwgbDJfbGVuKTsKKyNlbmRpZgorCW1zZy0+bDNoID0gKHVuc2lnbmVkIGNoYXIgKilvaCArIHNpemVvZigqb2gpOworCisJc3dpdGNoIChvaC0+bWRpc2MpIHsKKwljYXNlIEFCSVNfT01fTURJU0NfRk9NOgorCQlyYyA9IGFiaXNfbm1fcmN2bXNnX2ZvbShtc2cpOworCQlicmVhazsKKwljYXNlIEFCSVNfT01fTURJU0NfTUFOVUY6CisJCXJjID0gYWJpc19ubV9yY3Ztc2dfbWFudWYobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBBQklTX09NX01ESVNDX01NSToKKwljYXNlIEFCSVNfT01fTURJU0NfVFJBVToKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJ1bmltcGxlbWVudGVkIEFCSVMgT01MIG1lc3NhZ2UgZGlzY3JpbWluYXRvciAweCV4XG4iLAorCQkJb2gtPm1kaXNjKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJ1bmtub3duIEFCSVMgT01MIG1lc3NhZ2UgZGlzY3JpbWluYXRvciAweCV4XG4iLAorCQkJb2gtPm1kaXNjKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbXNnYl9mcmVlKG1zZyk7CisJcmV0dXJuIHJjOworfQorCisjaWYgMAorLyogaW5pdGlhbGl6ZWQgYWxsIHJlc291cmNlcyAqLworc3RydWN0IGFiaXNfbm1faCAqYWJpc19ubV9pbml0KHN0cnVjdCBhYmlzX25tX2NmZyAqY2ZnKQoreworCXN0cnVjdCBhYmlzX25tX2ggKm5taDsKKworCW5taCA9IG1hbGxvYyhzaXplb2YoKm5taCkpOworCWlmICghbm1oKQorCQlyZXR1cm4gTlVMTDsKKworCW5taC0+Y2ZnID0gY2ZnOworCisJcmV0dXJuIG5taDsKK30KKworLyogZnJlZSBhbGwgcmVzb3VyY2VzICovCit2b2lkIGFiaXNfbm1fZmluaShzdHJ1Y3QgYWJpc19ubV9oICpubWgpCit7CisJZnJlZShubWgpOworfQorI2VuZGlmCisKKy8qIEhlcmUgd2UgYXJlIHRyeWluZyB0byBkZWZpbmUgYSBoaWdoLWxldmVsIEFQSSB0aGF0IGNhbiBiZSB1c2VkIGJ5CisgKiB0aGUgYWN0dWFsIEJTQyBpbXBsZW1lbnRhdGlvbi4gIEhvd2V2ZXIsIHRoZSBhcmNoaXRlY3R1cmUgaXMgY3VycmVudGx5CisgKiBzdGlsbCB1bmRlciBkZXNpZ24uICBJZGVhbGx5IHRoZSBjYWxscyB0byB0aGlzIEFQSSB3b3VsZCBiZSBzeW5jaHJvbm91cywKKyAqIHdoaWxlIHRoZSB1bmRlcmx5aW5nIHN0YWNrIGJlaGluZCB0aGUgQVBpIHJ1bnMgaW4gYSB0cmFkaXRpb25hbCBzZWxlY3QKKyAqIGJhc2VkIHN0YXRlIG1hY2hpbmUuCisgKi8KKworLyogNi4yIFNvZnR3YXJlIExvYWQ6ICovCitlbnVtIHN3X3N0YXRlIHsKKwlTV19TVEFURV9OT05FLAorCVNXX1NUQVRFX1dBSVRfSU5JVEFDSywKKwlTV19TVEFURV9XQUlUX1NFR0FDSywKKwlTV19TVEFURV9XQUlUX0VOREFDSywKKwlTV19TVEFURV9XQUlUX0FDVEFDSywKKwlTV19TVEFURV9FUlJPUiwKK307CisKK3N0cnVjdCBhYmlzX25tX3N3IHsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCWdzbV9jYmZuICpjYmZuOworCXZvaWQgKmNiX2RhdGE7CisJaW50IGZvcmNlZDsKKworCS8qIHRoaXMgd2lsbCBiZWNvbWUgcGFydCBvZiB0aGUgU1cgTE9BRCBJTklUSUFURSAqLworCXVfaW50OF90IG9ial9jbGFzczsKKwl1X2ludDhfdCBvYmpfaW5zdGFuY2VbM107CisKKwl1X2ludDhfdCBmaWxlX2lkWzI1NV07CisJdV9pbnQ4X3QgZmlsZV9pZF9sZW47CisKKwl1X2ludDhfdCBmaWxlX3ZlcnNpb25bMjU1XTsKKwl1X2ludDhfdCBmaWxlX3ZlcnNpb25fbGVuOworCisJdV9pbnQ4X3Qgd2luZG93X3NpemU7CisJdV9pbnQ4X3Qgc2VnX2luX3dpbmRvdzsKKworCWludCBmZDsKKwlGSUxFICpzdHJlYW07CisJZW51bSBzd19zdGF0ZSBzdGF0ZTsKKwlpbnQgbGFzdF9zZWc7Cit9OworCitzdGF0aWMgc3RydWN0IGFiaXNfbm1fc3cgZ19zdzsKKworc3RhdGljIHZvaWQgc3dfYWRkX2ZpbGVfaWRfYW5kX3ZlcihzdHJ1Y3QgYWJpc19ubV9zdyAqc3csIHN0cnVjdCBtc2diICptc2cpCit7CisJaWYgKHN3LT5idHMtPnR5cGUgPT0gR1NNX0JUU19UWVBFX05BTk9CVFMpIHsKKwkJbXNnYl92X3B1dChtc2csIE5NX0FUVF9TV19ERVNDUik7CisJCW1zZ2JfdGwxNnZfcHV0KG1zZywgTk1fQVRUX0ZJTEVfSUQsIHN3LT5maWxlX2lkX2xlbiwgc3ctPmZpbGVfaWQpOworCQltc2diX3RsMTZ2X3B1dChtc2csIE5NX0FUVF9GSUxFX1ZFUlNJT04sIHN3LT5maWxlX3ZlcnNpb25fbGVuLAorCQkJICAgICAgIHN3LT5maWxlX3ZlcnNpb24pOworCX0gZWxzZSBpZiAoc3ctPmJ0cy0+dHlwZSA9PSBHU01fQlRTX1RZUEVfQlMxMSkgeworCQltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfRklMRV9JRCwgc3ctPmZpbGVfaWRfbGVuLCBzdy0+ZmlsZV9pZCk7CisJCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9GSUxFX1ZFUlNJT04sIHN3LT5maWxlX3ZlcnNpb25fbGVuLAorCQkJICAgICBzdy0+ZmlsZV92ZXJzaW9uKTsKKwl9IGVsc2UgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlBsZWFzZSBpbXBsZW1lbnQgdGhpcyBmb3IgdGhlIEJUUy5cbiIpOworCX0KK30KKworLyogNi4yLjEgLyA4LjMuMTogTG9hZCBEYXRhIEluaXRpYXRlICovCitzdGF0aWMgaW50IHN3X2xvYWRfaW5pdChzdHJ1Y3QgYWJpc19ubV9zdyAqc3cpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IGxlbiA9IDMqMiArIHN3LT5maWxlX2lkX2xlbiArIHN3LT5maWxlX3ZlcnNpb25fbGVuOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgbGVuLCBOTV9NVF9MT0FEX0lOSVQsIHN3LT5vYmpfY2xhc3MsCisJCQlzdy0+b2JqX2luc3RhbmNlWzBdLCBzdy0+b2JqX2luc3RhbmNlWzFdLAorCQkJc3ctPm9ial9pbnN0YW5jZVsyXSk7CisKKwlzd19hZGRfZmlsZV9pZF9hbmRfdmVyKHN3LCBtc2cpOworCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX1dJTkRPV19TSVpFLCBzdy0+d2luZG93X3NpemUpOworCQorCXJldHVybiBhYmlzX25tX3NlbmRtc2coc3ctPmJ0cywgbXNnKTsKK30KKworc3RhdGljIGludCBpc19sYXN0X2xpbmUoRklMRSAqc3RyZWFtKQoreworCWNoYXIgbmV4dF9zZWdfYnVmWzI1Nl07CisJbG9uZyBwb3M7CisKKwkvKiBjaGVjayBpZiB3ZSdyZSBzZW5kaW5nIHRoZSBsYXN0IGxpbmUgKi8KKwlwb3MgPSBmdGVsbChzdHJlYW0pOworCWlmICghZmdldHMobmV4dF9zZWdfYnVmLCBzaXplb2YobmV4dF9zZWdfYnVmKS0yLCBzdHJlYW0pKSB7CisJCWZzZWVrKHN0cmVhbSwgcG9zLCBTRUVLX1NFVCk7CisJCXJldHVybiAxOworCX0KKworCWZzZWVrKHN0cmVhbSwgcG9zLCBTRUVLX1NFVCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIDYuMi4yIC8gOC4zLjIgTG9hZCBEYXRhIFNlZ21lbnQgKi8KK3N0YXRpYyBpbnQgc3dfbG9hZF9zZWdtZW50KHN0cnVjdCBhYmlzX25tX3N3ICpzdykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJY2hhciBzZWdfYnVmWzI1Nl07CisJY2hhciAqbGluZV9idWYgPSBzZWdfYnVmKzI7CisJdW5zaWduZWQgY2hhciAqdGx2OworCXVfaW50OF90IGxlbjsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKworCXN3aXRjaCAoc3ctPmJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCWlmIChmZ2V0cyhsaW5lX2J1Ziwgc2l6ZW9mKHNlZ19idWYpLTIsIHN3LT5zdHJlYW0pID09IE5VTEwpIHsKKwkJCXBlcnJvcigiZmdldHMgcmVhZGluZyBzZWdtZW50Iik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlzZWdfYnVmWzBdID0gMHgwMDsKKworCQkvKiBjaGVjayBpZiB3ZSdyZSBzZW5kaW5nIHRoZSBsYXN0IGxpbmUgKi8KKwkJc3ctPmxhc3Rfc2VnID0gaXNfbGFzdF9saW5lKHN3LT5zdHJlYW0pOworCQlpZiAoc3ctPmxhc3Rfc2VnKQorCQkJc2VnX2J1ZlsxXSA9IDA7CisJCWVsc2UKKwkJCXNlZ19idWZbMV0gPSAxICsgc3ctPnNlZ19pbl93aW5kb3crKzsKKworCQlsZW4gPSBzdHJsZW4obGluZV9idWYpICsgMjsKKwkJdGx2ID0gbXNnYl9wdXQobXNnLCBUTFZfR1JPU1NfTEVOKGxlbikpOworCQl0bHZfcHV0KHRsdiwgTk1fQVRUX0JTMTFfRklMRV9EQVRBLCBsZW4sICh1X2ludDhfdCAqKXNlZ19idWYpOworCQkvKiBCUzExIHdhbnRzIENSICsgTEYgaW4gZXhjZXNzIG9mIHRoZSBUTFYgbGVuZ3RoICE/ISAqLworCQl0bHZbMV0gLT0gMjsKKworCQkvKiB3ZSBvbmx5IG5vdyBrbm93IHRoZSBleGFjdCBsZW5ndGggZm9yIHRoZSBPTSBoZHIgKi8KKwkJbGVuID0gc3RybGVuKGxpbmVfYnVmKSsyOworCQlicmVhazsKKwljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOiB7CisJCXN0YXRpY19hc3NlcnQoc2l6ZW9mKHNlZ19idWYpID49IElQQUNDX1NFR01FTlRfU0laRSwgYnVmZmVyX2JpZ19lbm91Z2gpOworCQlsZW4gPSByZWFkKHN3LT5mZCwgJnNlZ19idWYsIElQQUNDX1NFR01FTlRfU0laRSk7CisJCWlmIChsZW4gPCAwKSB7CisJCQlwZXJyb3IoInJlYWQgZmFpbGVkIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWlmIChsZW4gIT0gSVBBQ0NfU0VHTUVOVF9TSVpFKQorCQkJc3ctPmxhc3Rfc2VnID0gMTsKKworCQkrK3N3LT5zZWdfaW5fd2luZG93OworCQltc2diX3RsMTZ2X3B1dChtc2csIE5NX0FUVF9JUEFDQ19GSUxFX0RBVEEsIGxlbiwgKGNvbnN0IHVfaW50OF90ICopIHNlZ19idWYpOworCQlsZW4gKz0gMzsKKwkJYnJlYWs7CisJfQorCWRlZmF1bHQ6CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAic3dfbG9hZF9zZWdtZW50IG5lZWRzIGltcGxlbWVudGF0aW9uIGZvciB0aGUgQlRTLlxuIik7CisJCS8qIEZJWE1FOiBPdGhlciBCVFMgdHlwZXMgKi8KKwkJcmV0dXJuIC0xOworCX0KKworCWZpbGxfb21fZm9tX2hkcihvaCwgbGVuLCBOTV9NVF9MT0FEX1NFRywgc3ctPm9ial9jbGFzcywKKwkJCXN3LT5vYmpfaW5zdGFuY2VbMF0sIHN3LT5vYmpfaW5zdGFuY2VbMV0sCisJCQlzdy0+b2JqX2luc3RhbmNlWzJdKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coc3ctPmJ0cywgbXNnKTsKK30KKworLyogNi4yLjQgLyA4LjMuNCBMb2FkIERhdGEgRW5kICovCitzdGF0aWMgaW50IHN3X2xvYWRfZW5kKHN0cnVjdCBhYmlzX25tX3N3ICpzdykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgbGVuID0gMioyICsgc3ctPmZpbGVfaWRfbGVuICsgc3ctPmZpbGVfdmVyc2lvbl9sZW47CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBsZW4sIE5NX01UX0xPQURfRU5ELCBzdy0+b2JqX2NsYXNzLAorCQkJc3ctPm9ial9pbnN0YW5jZVswXSwgc3ctPm9ial9pbnN0YW5jZVsxXSwKKwkJCXN3LT5vYmpfaW5zdGFuY2VbMl0pOworCisJc3dfYWRkX2ZpbGVfaWRfYW5kX3ZlcihzdywgbXNnKTsKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKHN3LT5idHMsIG1zZyk7Cit9CisKKy8qIEFjdGl2YXRlIHRoZSBzcGVjaWZpZWQgc29mdHdhcmUgaW50byB0aGUgQlRTICovCitzdGF0aWMgaW50IHN3X2FjdGl2YXRlKHN0cnVjdCBhYmlzX25tX3N3ICpzdykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgbGVuID0gMioyICsgc3ctPmZpbGVfaWRfbGVuICsgc3ctPmZpbGVfdmVyc2lvbl9sZW47CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBsZW4sIE5NX01UX0FDVElWQVRFX1NXLCBzdy0+b2JqX2NsYXNzLAorCQkJc3ctPm9ial9pbnN0YW5jZVswXSwgc3ctPm9ial9pbnN0YW5jZVsxXSwKKwkJCXN3LT5vYmpfaW5zdGFuY2VbMl0pOworCisJLyogRklYTUU6IHRoaXMgaXMgQlMxMSBzcGVjaWZpYyBmb3JtYXQgKi8KKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfRklMRV9JRCwgc3ctPmZpbGVfaWRfbGVuLCBzdy0+ZmlsZV9pZCk7CisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0ZJTEVfVkVSU0lPTiwgc3ctPmZpbGVfdmVyc2lvbl9sZW4sCisJCSAgICAgc3ctPmZpbGVfdmVyc2lvbik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKHN3LT5idHMsIG1zZyk7Cit9CisKK3N0cnVjdCBzZHBfZmlybXdhcmUgeworCWNoYXIgbWFnaWNbNF07CisJY2hhciBtb3JlX21hZ2ljWzRdOworCXVuc2lnbmVkIGludCBoZWFkZXJfbGVuZ3RoOworCXVuc2lnbmVkIGludCBmaWxlX2xlbmd0aDsKK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworCitzdGF0aWMgaW50IHBhcnNlX3NkcF9oZWFkZXIoc3RydWN0IGFiaXNfbm1fc3cgKnN3KQoreworCXN0cnVjdCBzZHBfZmlybXdhcmUgZmlybXdhcmVfaGVhZGVyOworCWludCByYzsKKwlzdHJ1Y3Qgc3RhdCBzdGF0OworCisJcmMgPSByZWFkKHN3LT5mZCwgJmZpcm13YXJlX2hlYWRlciwgc2l6ZW9mKGZpcm13YXJlX2hlYWRlcikpOworCWlmIChyYyAhPSBzaXplb2YoZmlybXdhcmVfaGVhZGVyKSkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIkNvdWxkIG5vdCByZWFkIFNEUCBmaWxlIGhlYWRlci5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKHN0cm5jbXAoZmlybXdhcmVfaGVhZGVyLm1hZ2ljLCAiIFNEUCIsIDQpICE9IDApIHsKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJUaGUgbWFnaWMgbnVtYmVyMSBpcyB3cm9uZy5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGZpcm13YXJlX2hlYWRlci5tb3JlX21hZ2ljWzBdICE9IDB4MTAgfHwKKwkgICAgZmlybXdhcmVfaGVhZGVyLm1vcmVfbWFnaWNbMV0gIT0gMHgwMiB8fAorCSAgICBmaXJtd2FyZV9oZWFkZXIubW9yZV9tYWdpY1syXSAhPSAweDAwIHx8CisJICAgIGZpcm13YXJlX2hlYWRlci5tb3JlX21hZ2ljWzNdICE9IDB4MDApIHsKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJUaGUgbW9yZSBtYWdpYyBudW1iZXIgaXMgd3JvbmcuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCisJaWYgKGZzdGF0KHN3LT5mZCwgJnN0YXQpID09IC0xKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiQ291bGQgbm90IHN0YXQgdGhlIGZpbGUuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChudG9obChmaXJtd2FyZV9oZWFkZXIuZmlsZV9sZW5ndGgpICE9IHN0YXQuc3Rfc2l6ZSkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlRoZSBmaWxlc2l6ZXMgZG8gbm90IG1hdGNoLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBnbyBiYWNrIHRvIHRoZSBzdGFydCBhcyB3ZSBjaGVja2VkIHRoZSB3aG9sZSBmaWxlc2l6ZS4uICovCisJbHNlZWsoc3ctPmZkLCAwbCwgU0VFS19TRVQpOworCUxPR1AoRE5NLCBMT0dMX05PVElDRSwgIlRoZSBpcGFjY2VzcyBTRFAgaGVhZGVyIGlzIG5vdCBmdWxseSB1bmRlcnN0b29kLlxuIgorCQkJICAgICAgICJUaGVyZSBtaWdodCBiZSBjaGVja3N1bXMgaW4gdGhlIGZpbGUgdGhhdCBhcmUgbm90XG4iCisJCQkgICAgICAgInZlcmlmaWVkIGFuZCBpbmNvbXBsZXRlIGZpcm13YXJlIG1pZ2h0IGJlIGZsYXNoZWQuXG4iCisJCQkgICAgICAgIlRoZXJlIGlzIGFic29sdXRlbHkgbm8gV0FSUkFOVFkgdGhhdCBmbGFzaGluZyB3aWxsXG4iCisJCQkgICAgICAgIndvcmsuXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBzd19vcGVuX2ZpbGUoc3RydWN0IGFiaXNfbm1fc3cgKnN3LCBjb25zdCBjaGFyICpmbmFtZSkKK3sKKwljaGFyIGZpbGVfaWRbMTIrMV07CisJY2hhciBmaWxlX3ZlcnNpb25bODArMV07CisJaW50IHJjOworCisJc3ctPmZkID0gb3BlbihmbmFtZSwgT19SRE9OTFkpOworCWlmIChzdy0+ZmQgPCAwKQorCQlyZXR1cm4gc3ctPmZkOworCisJc3dpdGNoIChzdy0+YnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJc3ctPnN0cmVhbSA9IGZkb3Blbihzdy0+ZmQsICJyIik7CisJCWlmICghc3ctPnN0cmVhbSkgeworCQkJcGVycm9yKCJmZG9wZW4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQkvKiByZWFkIGZpcnN0IGxpbmUgYW5kIHBhcnNlIGZpbGUgSUQgYW5kIFZFUlNJT04gKi8KKwkJcmMgPSBmc2NhbmYoc3ctPnN0cmVhbSwgIkAoIyklMTJzOiU4MHNcclxuIiwgCisJCQkgICAgZmlsZV9pZCwgZmlsZV92ZXJzaW9uKTsKKwkJaWYgKHJjICE9IDIpIHsKKwkJCXBlcnJvcigicGFyc2luZyBoZWFkZXIgbGluZSBvZiBzb2Z0d2FyZSBmaWxlIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKwkJc3RyY3B5KChjaGFyICopc3ctPmZpbGVfaWQsIGZpbGVfaWQpOworCQlzdy0+ZmlsZV9pZF9sZW4gPSBzdHJsZW4oZmlsZV9pZCk7CisJCXN0cmNweSgoY2hhciAqKXN3LT5maWxlX3ZlcnNpb24sIGZpbGVfdmVyc2lvbik7CisJCXN3LT5maWxlX3ZlcnNpb25fbGVuID0gc3RybGVuKGZpbGVfdmVyc2lvbik7CisJCS8qIHJld2luZCB0byBzdGFydCBvZiBmaWxlICovCisJCXJld2luZChzdy0+c3RyZWFtKTsKKwkJYnJlYWs7CQorCWNhc2UgR1NNX0JUU19UWVBFX05BTk9CVFM6CisJCS8qIFRPRE86IGV4dHJhY3QgdGhhdCBmcm9tIHRoZSBmaWxlbmFtZSBvciBjb250ZW50ICovCisJCXJjID0gcGFyc2Vfc2RwX2hlYWRlcihzdyk7CisJCWlmIChyYyA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQ291bGQgbm90IHBhcnNlIHRoZSBpcGFjY2VzcyBTRFAgaGVhZGVyXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXN0cmNweSgoY2hhciAqKXN3LT5maWxlX2lkLCAiaWQiKTsKKwkJc3ctPmZpbGVfaWRfbGVuID0gMzsKKwkJc3RyY3B5KChjaGFyICopc3ctPmZpbGVfdmVyc2lvbiwgInZlcnNpb24iKTsKKwkJc3ctPmZpbGVfdmVyc2lvbl9sZW4gPSA4OworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBXZSBkb24ndCBrbm93IGhvdyB0byB0cmVhdCB0aGVtIHlldCAqLworCQljbG9zZShzdy0+ZmQpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwkKK3N0YXRpYyB2b2lkIHN3X2Nsb3NlX2ZpbGUoc3RydWN0IGFiaXNfbm1fc3cgKnN3KQoreworCXN3aXRjaCAoc3ctPmJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCWZjbG9zZShzdy0+c3RyZWFtKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJY2xvc2Uoc3ctPmZkKTsKKwkJYnJlYWs7CisJfQorfQorCisvKiBGaWxsIHRoZSB3aW5kb3cgKi8KK3N0YXRpYyBpbnQgc3dfZmlsbF93aW5kb3coc3RydWN0IGFiaXNfbm1fc3cgKnN3KQoreworCWludCByYzsKKworCXdoaWxlIChzdy0+c2VnX2luX3dpbmRvdyA8IHN3LT53aW5kb3dfc2l6ZSkgeworCQlyYyA9IHN3X2xvYWRfc2VnbWVudChzdyk7CisJCWlmIChyYyA8IDApCisJCQlyZXR1cm4gcmM7CisJCWlmIChzdy0+bGFzdF9zZWcpCisJCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIGNhbGxiYWNrIGZ1bmN0aW9uIGZyb20gYWJpc19ubV9yY3Ztc2coKSBoYW5kbGVyICovCitzdGF0aWMgaW50IGFiaXNfbm1fcmN2bXNnX3N3KHN0cnVjdCBtc2diICptYikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2ggPSBtc2diX2wzKG1iKTsKKwlpbnQgcmMgPSAtMTsKKwlzdHJ1Y3QgYWJpc19ubV9zdyAqc3cgPSAmZ19zdzsKKwllbnVtIHN3X3N0YXRlIG9sZF9zdGF0ZSA9IHN3LT5zdGF0ZTsKKwkKKwkvL0RFQlVHUChETk0sICJzdGF0ZSAldSwgTk0gTVQgMHglMDJ4XG4iLCBzdy0+c3RhdGUsIGZvaC0+bXNnX3R5cGUpOworCisJc3dpdGNoIChzdy0+c3RhdGUpIHsKKwljYXNlIFNXX1NUQVRFX1dBSVRfSU5JVEFDSzoKKwkJc3dpdGNoIChmb2gtPm1zZ190eXBlKSB7CisJCWNhc2UgTk1fTVRfTE9BRF9JTklUX0FDSzoKKwkJCS8qIGZpbGwgd2luZG93IHdpdGggc2VnbWVudHMgKi8KKwkJCWlmIChzdy0+Y2JmbikKKwkJCQlzdy0+Y2JmbihHU01fSE9PS19OTV9TV0xPQUQsCisJCQkJCSBOTV9NVF9MT0FEX0lOSVRfQUNLLCBtYiwKKwkJCQkJIHN3LT5jYl9kYXRhLCBOVUxMKTsKKwkJCXJjID0gc3dfZmlsbF93aW5kb3coc3cpOworCQkJc3ctPnN0YXRlID0gU1dfU1RBVEVfV0FJVF9TRUdBQ0s7CisJCQlicmVhazsKKwkJY2FzZSBOTV9NVF9MT0FEX0lOSVRfTkFDSzoKKwkJCWlmIChzdy0+Zm9yY2VkKSB7CisJCQkJREVCVUdQKEROTSwgIkZPUkNFRDogSWdub3JpbmcgU29mdHdhcmUgTG9hZCAiCisJCQkJCSJJbml0IE5BQ0tcbiIpOworCQkJCWlmIChzdy0+Y2JmbikKKwkJCQkJc3ctPmNiZm4oR1NNX0hPT0tfTk1fU1dMT0FELAorCQkJCQkJIE5NX01UX0xPQURfSU5JVF9BQ0ssIG1iLAorCQkJCQkJIHN3LT5jYl9kYXRhLCBOVUxMKTsKKwkJCQlyYyA9IHN3X2ZpbGxfd2luZG93KHN3KTsKKwkJCQlzdy0+c3RhdGUgPSBTV19TVEFURV9XQUlUX1NFR0FDSzsKKwkJCX0gZWxzZSB7CisJCQkJREVCVUdQKEROTSwgIlNvZnR3YXJlIExvYWQgSW5pdCBOQUNLXG4iKTsKKwkJCQkvKiBGSVhNRTogY2F1c2UgKi8KKwkJCQlpZiAoc3ctPmNiZm4pCisJCQkJCXN3LT5jYmZuKEdTTV9IT09LX05NX1NXTE9BRCwKKwkJCQkJCSBOTV9NVF9MT0FEX0lOSVRfTkFDSywgbWIsCisJCQkJCQkgc3ctPmNiX2RhdGEsIE5VTEwpOworCQkJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX0VSUk9SOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTV19TVEFURV9XQUlUX1NFR0FDSzoKKwkJc3dpdGNoIChmb2gtPm1zZ190eXBlKSB7CisJCWNhc2UgTk1fTVRfTE9BRF9TRUdfQUNLOgorCQkJaWYgKHN3LT5jYmZuKQorCQkJCXN3LT5jYmZuKEdTTV9IT09LX05NX1NXTE9BRCwKKwkJCQkJIE5NX01UX0xPQURfU0VHX0FDSywgbWIsCisJCQkJCSBzdy0+Y2JfZGF0YSwgTlVMTCk7CisJCQlzdy0+c2VnX2luX3dpbmRvdyA9IDA7CisJCQlpZiAoIXN3LT5sYXN0X3NlZykgeworCQkJCS8qIGZpbGwgd2luZG93IHdpdGggbW9yZSBzZWdtZW50cyAqLworCQkJCXJjID0gc3dfZmlsbF93aW5kb3coc3cpOworCQkJCXN3LT5zdGF0ZSA9IFNXX1NUQVRFX1dBSVRfU0VHQUNLOworCQkJfSBlbHNlIHsKKwkJCQkvKiBlbmQgdGhlIHRyYW5zZmVyICovCisJCQkJc3ctPnN0YXRlID0gU1dfU1RBVEVfV0FJVF9FTkRBQ0s7CisJCQkJcmMgPSBzd19sb2FkX2VuZChzdyk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBOTV9NVF9MT0FEX0FCT1JUOgorCQkJaWYgKHN3LT5jYmZuKQorCQkJCXN3LT5jYmZuKEdTTV9IT09LX05NX1NXTE9BRCwKKwkJCQkJIE5NX01UX0xPQURfQUJPUlQsIG1iLAorCQkJCQkgc3ctPmNiX2RhdGEsIE5VTEwpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTV19TVEFURV9XQUlUX0VOREFDSzoKKwkJc3dpdGNoIChmb2gtPm1zZ190eXBlKSB7CisJCWNhc2UgTk1fTVRfTE9BRF9FTkRfQUNLOgorCQkJc3dfY2xvc2VfZmlsZShzdyk7CisJCQlERUJVR1AoRE5NLCAiU29mdHdhcmUgTG9hZCBFbmQgKEJUUyAldSlcbiIsCisJCQkJc3ctPmJ0cy0+bnIpOworCQkJc3ctPnN0YXRlID0gU1dfU1RBVEVfTk9ORTsKKwkJCWlmIChzdy0+Y2JmbikKKwkJCQlzdy0+Y2JmbihHU01fSE9PS19OTV9TV0xPQUQsCisJCQkJCSBOTV9NVF9MT0FEX0VORF9BQ0ssIG1iLAorCQkJCQkgc3ctPmNiX2RhdGEsIE5VTEwpOworCQkJcmMgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgTk1fTVRfTE9BRF9FTkRfTkFDSzoKKwkJCWlmIChzdy0+Zm9yY2VkKSB7CisJCQkJREVCVUdQKEROTSwgIkZPUkNFRDogSWdub3JpbmcgU29mdHdhcmUgTG9hZCIKKwkJCQkJIkVuZCBOQUNLXG4iKTsKKwkJCQlzdy0+c3RhdGUgPSBTV19TVEFURV9OT05FOworCQkJCWlmIChzdy0+Y2JmbikKKwkJCQkJc3ctPmNiZm4oR1NNX0hPT0tfTk1fU1dMT0FELAorCQkJCQkJIE5NX01UX0xPQURfRU5EX0FDSywgbWIsCisJCQkJCQkgc3ctPmNiX2RhdGEsIE5VTEwpOworCQkJfSBlbHNlIHsKKwkJCQlERUJVR1AoRE5NLCAiU29mdHdhcmUgTG9hZCBFbmQgTkFDS1xuIik7CisJCQkJLyogRklYTUU6IGNhdXNlICovCisJCQkJc3ctPnN0YXRlID0gU1dfU1RBVEVfRVJST1I7CisJCQkJaWYgKHN3LT5jYmZuKQorCQkJCQlzdy0+Y2JmbihHU01fSE9PS19OTV9TV0xPQUQsCisJCQkJCQkgTk1fTVRfTE9BRF9FTkRfTkFDSywgbWIsCisJCQkJCQkgc3ctPmNiX2RhdGEsIE5VTEwpOworCQkJfQorCQkJYnJlYWs7CisJCX0KKwljYXNlIFNXX1NUQVRFX1dBSVRfQUNUQUNLOgorCQlzd2l0Y2ggKGZvaC0+bXNnX3R5cGUpIHsKKwkJY2FzZSBOTV9NVF9BQ1RJVkFURV9TV19BQ0s6CisJCQkvKiB3ZSdyZSBkb25lICovCisJCQlERUJVR1AoRE5NLCAiQWN0aXZhdGUgU29mdHdhcmUgRE9ORSFcbiIpOworCQkJc3ctPnN0YXRlID0gU1dfU1RBVEVfTk9ORTsKKwkJCXJjID0gMDsKKwkJCWlmIChzdy0+Y2JmbikKKwkJCQlzdy0+Y2JmbihHU01fSE9PS19OTV9TV0xPQUQsCisJCQkJCSBOTV9NVF9BQ1RJVkFURV9TV19BQ0ssIG1iLAorCQkJCQkgc3ctPmNiX2RhdGEsIE5VTEwpOworCQkJYnJlYWs7CisJCWNhc2UgTk1fTVRfQUNUSVZBVEVfU1dfTkFDSzoKKwkJCURFQlVHUChETk0sICJBY3RpdmF0ZSBTb2Z0d2FyZSBOQUNLXG4iKTsKKwkJCS8qIEZJWE1FOiBjYXVzZSAqLworCQkJc3ctPnN0YXRlID0gU1dfU1RBVEVfRVJST1I7CisJCQlpZiAoc3ctPmNiZm4pCisJCQkJc3ctPmNiZm4oR1NNX0hPT0tfTk1fU1dMT0FELAorCQkJCQkgTk1fTVRfQUNUSVZBVEVfU1dfTkFDSywgbWIsCisJCQkJCSBzdy0+Y2JfZGF0YSwgTlVMTCk7CisJCQlicmVhazsKKwkJfQorCWNhc2UgU1dfU1RBVEVfTk9ORToKKwkJc3dpdGNoIChmb2gtPm1zZ190eXBlKSB7CisJCWNhc2UgTk1fTVRfQUNUSVZBVEVfU1dfQUNLOgorCQkJcmMgPSAwOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTV19TVEFURV9FUlJPUjoKKwkJYnJlYWs7CisJfQorCisJaWYgKHJjKQorCQlERUJVR1AoRE5NLCAidW5leHBlY3RlZCBOTSBNVCAweCUwMnggaW4gc3RhdGUgJXUgLT4gJXVcbiIsCisJCQlmb2gtPm1zZ190eXBlLCBvbGRfc3RhdGUsIHN3LT5zdGF0ZSk7CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIExvYWQgdGhlIHNwZWNpZmllZCBzb2Z0d2FyZSBpbnRvIHRoZSBCVFMgKi8KK2ludCBhYmlzX25tX3NvZnR3YXJlX2xvYWQoc3RydWN0IGdzbV9idHMgKmJ0cywgY29uc3QgY2hhciAqZm5hbWUsCisJCQkgIHVfaW50OF90IHdpbl9zaXplLCBpbnQgZm9yY2VkLAorCQkJICBnc21fY2JmbiAqY2Jmbiwgdm9pZCAqY2JfZGF0YSkKK3sKKwlzdHJ1Y3QgYWJpc19ubV9zdyAqc3cgPSAmZ19zdzsKKwlpbnQgcmM7CisKKwlERUJVR1AoRE5NLCAiU29mdHdhcmUgTG9hZCAoQlRTICV1LCBGaWxlIFwiJXNcIilcbiIsCisJCWJ0cy0+bnIsIGZuYW1lKTsKKworCWlmIChzdy0+c3RhdGUgIT0gU1dfU1RBVEVfTk9ORSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXN3LT5idHMgPSBidHM7CisKKwlzd2l0Y2ggKGJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCXN3LT5vYmpfY2xhc3MgPSBOTV9PQ19TSVRFX01BTkFHRVI7CisJCXN3LT5vYmpfaW5zdGFuY2VbMF0gPSAweGZmOworCQlzdy0+b2JqX2luc3RhbmNlWzFdID0gMHhmZjsKKwkJc3ctPm9ial9pbnN0YW5jZVsyXSA9IDB4ZmY7CisJCWJyZWFrOworCWNhc2UgR1NNX0JUU19UWVBFX05BTk9CVFM6CisJCXN3LT5vYmpfY2xhc3MgPSBOTV9PQ19CQVNFQl9UUkFOU0M7CisJCXN3LT5vYmpfaW5zdGFuY2VbMF0gPSAweDAwOworCQlzdy0+b2JqX2luc3RhbmNlWzFdID0gMHgwMDsKKwkJc3ctPm9ial9pbnN0YW5jZVsyXSA9IDB4ZmY7CisJCWJyZWFrOworCWNhc2UgR1NNX0JUU19UWVBFX1VOS05PV046CisJZGVmYXVsdDoKKwkJTE9HUEMoRE5NLCBMT0dMX0VSUk9SLCAiU29mdHdhcmUgTG9hZCBub3QgcHJvcGVybHkgaW1wbGVtZW50ZWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCQlicmVhazsKKwl9CisJc3ctPndpbmRvd19zaXplID0gd2luX3NpemU7CisJc3ctPnN0YXRlID0gU1dfU1RBVEVfV0FJVF9JTklUQUNLOworCXN3LT5jYmZuID0gY2JmbjsKKwlzdy0+Y2JfZGF0YSA9IGNiX2RhdGE7CisJc3ctPmZvcmNlZCA9IGZvcmNlZDsKKworCXJjID0gc3dfb3Blbl9maWxlKHN3LCBmbmFtZSk7CisJaWYgKHJjIDwgMCkgeworCQlzdy0+c3RhdGUgPSBTV19TVEFURV9OT05FOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIHN3X2xvYWRfaW5pdChzdyk7Cit9CisKK2ludCBhYmlzX25tX3NvZnR3YXJlX2xvYWRfc3RhdHVzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGFiaXNfbm1fc3cgKnN3ID0gJmdfc3c7CisJc3RydWN0IHN0YXQgc3Q7CisJaW50IHJjLCBwZXJjZW50OworCisJcmMgPSBmc3RhdChzdy0+ZmQsICZzdCk7CisJaWYgKHJjIDwgMCkgeworCQlwZXJyb3IoIkVSUk9SIGR1cmluZyBzdGF0Iik7CisJCXJldHVybiByYzsKKwl9CisKKwlpZiAoc3ctPnN0cmVhbSkKKwkJcGVyY2VudCA9IChmdGVsbChzdy0+c3RyZWFtKSAqIDEwMCkgLyBzdC5zdF9zaXplOworCWVsc2UKKwkJcGVyY2VudCA9IChsc2Vlayhzdy0+ZmQsIDAsIFNFRUtfQ1VSKSAqIDEwMCkgLyBzdC5zdF9zaXplOworCXJldHVybiBwZXJjZW50OworfQorCisvKiBBY3RpdmF0ZSB0aGUgc3BlY2lmaWVkIHNvZnR3YXJlIGludG8gdGhlIEJUUyAqLworaW50IGFiaXNfbm1fc29mdHdhcmVfYWN0aXZhdGUoc3RydWN0IGdzbV9idHMgKmJ0cywgY29uc3QgY2hhciAqZm5hbWUsCisJCQkgICAgICBnc21fY2JmbiAqY2Jmbiwgdm9pZCAqY2JfZGF0YSkKK3sKKwlzdHJ1Y3QgYWJpc19ubV9zdyAqc3cgPSAmZ19zdzsKKwlpbnQgcmM7CisKKwlERUJVR1AoRE5NLCAiQWN0aXZhdGluZyBTb2Z0d2FyZSAoQlRTICV1LCBGaWxlIFwiJXNcIilcbiIsCisJCWJ0cy0+bnIsIGZuYW1lKTsKKworCWlmIChzdy0+c3RhdGUgIT0gU1dfU1RBVEVfTk9ORSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCXN3LT5idHMgPSBidHM7CisJc3ctPm9ial9jbGFzcyA9IE5NX09DX1NJVEVfTUFOQUdFUjsKKwlzdy0+b2JqX2luc3RhbmNlWzBdID0gMHhmZjsKKwlzdy0+b2JqX2luc3RhbmNlWzFdID0gMHhmZjsKKwlzdy0+b2JqX2luc3RhbmNlWzJdID0gMHhmZjsKKwlzdy0+c3RhdGUgPSBTV19TVEFURV9XQUlUX0FDVEFDSzsKKwlzdy0+Y2JmbiA9IGNiZm47CisJc3ctPmNiX2RhdGEgPSBjYl9kYXRhOworCisJLyogT3BlbiB0aGUgZmlsZSBpbiBvcmRlciB0byBmaWxsIHNvbWUgc3cgc3RydWN0IG1lbWJlcnMgKi8KKwlyYyA9IHN3X29wZW5fZmlsZShzdywgZm5hbWUpOworCWlmIChyYyA8IDApIHsKKwkJc3ctPnN0YXRlID0gU1dfU1RBVEVfTk9ORTsKKwkJcmV0dXJuIHJjOworCX0KKwlzd19jbG9zZV9maWxlKHN3KTsKKworCXJldHVybiBzd19hY3RpdmF0ZShzdyk7Cit9CisKK3N0YXRpYyB2b2lkIGZpbGxfbm1fY2hhbm5lbChzdHJ1Y3QgYWJpc19ubV9jaGFubmVsICpjaCwgdV9pbnQ4X3QgYnRzX3BvcnQsCisJCSAgICAgICB1X2ludDhfdCB0c19uciwgdV9pbnQ4X3Qgc3Vic2xvdF9ucikKK3sKKwljaC0+YXR0cmliID0gTk1fQVRUX0FCSVNfQ0hBTk5FTDsKKwljaC0+YnRzX3BvcnQgPSBidHNfcG9ydDsKKwljaC0+dGltZXNsb3QgPSB0c19ucjsKKwljaC0+c3Vic2xvdCA9IHN1YnNsb3RfbnI7CQorfQorCitpbnQgYWJpc19ubV9lc3RhYmxpc2hfdGVpKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IHRyeF9uciwKKwkJCSAgdV9pbnQ4X3QgZTFfcG9ydCwgdV9pbnQ4X3QgZTFfdGltZXNsb3QsIHVfaW50OF90IGUxX3N1YnNsb3QsCisJCQkgIHVfaW50OF90IHRlaSkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKmNoOworCXVfaW50OF90IGxlbiA9IHNpemVvZigqY2gpICsgMjsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgbGVuLCBOTV9NVF9FU1RBQkxJU0hfVEVJLCBOTV9PQ19SQURJT19DQVJSSUVSLAorCQkJYnRzLT5idHNfbnIsIHRyeF9uciwgMHhmZik7CisJCisJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfVEVJLCB0ZWkpOworCisJY2ggPSAoc3RydWN0IGFiaXNfbm1fY2hhbm5lbCAqKSBtc2diX3B1dChtc2csIHNpemVvZigqY2gpKTsKKwlmaWxsX25tX2NoYW5uZWwoY2gsIGUxX3BvcnQsIGUxX3RpbWVzbG90LCBlMV9zdWJzbG90KTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisvKiBjb25uZWN0IHNpZ25hbGxpbmcgb2Ygb25lIChCVFMsVFJYKSB0byBhIHBhcnRpY3VsYXIgdGltZXNsb3Qgb24gdGhlIEUxICovCitpbnQgYWJpc19ubV9jb25uX3RlcnJfc2lnbihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwKKwkJCSAgIHVfaW50OF90IGUxX3BvcnQsIHVfaW50OF90IGUxX3RpbWVzbG90LCB1X2ludDhfdCBlMV9zdWJzbG90KQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB0cngtPmJ0czsKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKmNoOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBzaXplb2YoKmNoKSwgTk1fTVRfQ09OTl9URVJSX1NJR04sCisJCQlOTV9PQ19SQURJT19DQVJSSUVSLCBidHMtPmJ0c19uciwgdHJ4LT5uciwgMHhmZik7CisJCisJY2ggPSAoc3RydWN0IGFiaXNfbm1fY2hhbm5lbCAqKSBtc2diX3B1dChtc2csIHNpemVvZigqY2gpKTsKKwlmaWxsX25tX2NoYW5uZWwoY2gsIGUxX3BvcnQsIGUxX3RpbWVzbG90LCBlMV9zdWJzbG90KTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisjaWYgMAoraW50IGFiaXNfbm1fZGlzY190ZXJyX3NpZ24oc3RydWN0IGFiaXNfbm1faCAqaCwgc3RydWN0IGFiaXNfb21fb2JqX2luc3QgKmluc3QsCisJCQkgICBzdHJ1Y3QgYWJpc19ubV9hYmlzX2NoYW5uZWwgKmNoYW4pCit7Cit9CisjZW5kaWYKKworaW50IGFiaXNfbm1fY29ubl90ZXJyX3RyYWYoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cywKKwkJCSAgIHVfaW50OF90IGUxX3BvcnQsIHVfaW50OF90IGUxX3RpbWVzbG90LAorCQkJICAgdV9pbnQ4X3QgZTFfc3Vic2xvdCkKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdHMtPnRyeC0+YnRzOworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IGFiaXNfbm1fY2hhbm5lbCAqY2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIHNpemVvZigqY2gpLCBOTV9NVF9DT05OX1RFUlJfVFJBRiwKKwkJCU5NX09DX0NIQU5ORUwsIGJ0cy0+YnRzX25yLCB0cy0+dHJ4LT5uciwgdHMtPm5yKTsKKworCWNoID0gKHN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmNoKSk7CisJZmlsbF9ubV9jaGFubmVsKGNoLCBlMV9wb3J0LCBlMV90aW1lc2xvdCwgZTFfc3Vic2xvdCk7CisKKwlERUJVR1AoRE5NLCAiQ09OTkVDVCBURVJSIFRSQUYgVW09JXMgRTE9KCV1LCV1LCV1KVxuIiwKKwkJZ3NtX3RzX25hbWUodHMpLAorCQllMV9wb3J0LCBlMV90aW1lc2xvdCwgZTFfc3Vic2xvdCk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworI2lmIDAKK2ludCBhYmlzX25tX2Rpc2NfdGVycl90cmFmKHN0cnVjdCBhYmlzX25tX2ggKmgsIHN0cnVjdCBhYmlzX29tX29ial9pbnN0ICppbnN0LAorCQkJICAgc3RydWN0IGFiaXNfbm1fYWJpc19jaGFubmVsICpjaGFuLAorCQkJICAgdV9pbnQ4X3Qgc3ViY2hhbikKK3sKK30KKyNlbmRpZgorCisvKiBDaGFwdGVyIDguNi4xICovCitpbnQgYWJpc19ubV9zZXRfYnRzX2F0dHIoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgKmF0dHIsIGludCBhdHRyX2xlbikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgKmN1cjsKKworCURFQlVHUChETk0sICJTZXQgQlRTIEF0dHIgKGJ0cz0lZClcbiIsIGJ0cy0+bnIpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgYXR0cl9sZW4sIE5NX01UX1NFVF9CVFNfQVRUUiwgTk1fT0NfQlRTLCBidHMtPmJ0c19uciwgMHhmZiwgMHhmZik7CisJY3VyID0gbXNnYl9wdXQobXNnLCBhdHRyX2xlbik7CisJbWVtY3B5KGN1ciwgYXR0ciwgYXR0cl9sZW4pOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKy8qIENoYXB0ZXIgOC42LjIgKi8KK2ludCBhYmlzX25tX3NldF9yYWRpb19hdHRyKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCAqYXR0ciwgaW50IGF0dHJfbGVuKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCAqY3VyOworCisJREVCVUdQKEROTSwgIlNldCBUUlggQXR0ciAoYnRzPSVkLHRyeD0lZClcbiIsIHRyeC0+YnRzLT5uciwgdHJ4LT5ucik7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBhdHRyX2xlbiwgTk1fTVRfU0VUX1JBRElPX0FUVFIsIE5NX09DX1JBRElPX0NBUlJJRVIsCisJCQl0cngtPmJ0cy0+YnRzX25yLCB0cngtPm5yLCAweGZmKTsKKwljdXIgPSBtc2diX3B1dChtc2csIGF0dHJfbGVuKTsKKwltZW1jcHkoY3VyLCBhdHRyLCBhdHRyX2xlbik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKHRyeC0+YnRzLCBtc2cpOworfQorCitzdGF0aWMgaW50IHZlcmlmeV9jaGFuX2NvbWIoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cywgdV9pbnQ4X3QgY2hhbl9jb21iKQoreworCWludCBpOworCisJLyogQXMgaXQgdHVybnMgb3V0LCB0aGUgQlMtMTEgaGFzIHNvbWUgdmVyeSBwZWN1bGlhciByZXN0cmljdGlvbnMKKwkgKiBvbiB0aGUgY2hhbm5lbCBjb21iaW5hdGlvbnMgaXQgYWxsb3dzICovCisJc3dpdGNoICh0cy0+dHJ4LT5idHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlzd2l0Y2ggKGNoYW5fY29tYikgeworCQljYXNlIE5NX0NIQU5DX1RDSEhhbGY6CisJCWNhc2UgTk1fQ0hBTkNfVENISGFsZjI6CisJCQkvKiBub3Qgc3VwcG9ydGVkICovCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJY2FzZSBOTV9DSEFOQ19TRENDSDoKKwkJCS8qIG9ubHkgb25lIFNEQ0NILzggcGVyIFRSWCAqLworCQkJZm9yIChpID0gMDsgaSA8IFRSWF9OUl9UUzsgaSsrKSB7CisJCQkJaWYgKGkgPT0gdHMtPm5yKQorCQkJCQljb250aW51ZTsKKwkJCQlpZiAodHMtPnRyeC0+dHNbaV0ubm1fY2hhbl9jb21iID09CisJCQkJICAgIE5NX0NIQU5DX1NEQ0NIKQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCS8qIG5vdCBhbGxvd2VkIGZvciBUUzAgb2YgQkNDSC1UUlggKi8KKwkJCWlmICh0cy0+dHJ4ID09IHRzLT50cngtPmJ0cy0+YzAgJiYKKwkJCSAgICB0cy0+bnIgPT0gMCkKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkvKiBub3Qgb24gdGhlIHNhbWUgVFJYIHRoYXQgaGFzIGEgQkNDSCtTRENDSDQKKwkJCSAqIGNvbWJpbmF0aW9uICovCisJCQlpZiAodHMtPnRyeCA9PSB0cy0+dHJ4LT5idHMtPmMwICYmCisJCQkgICAgKHRzLT50cngtPnRzWzBdLm5tX2NoYW5fY29tYiA9PSA1IHx8CisJCQkgICAgIHRzLT50cngtPnRzWzBdLm5tX2NoYW5fY29tYiA9PSA4KSkKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJY2FzZSBOTV9DSEFOQ19tYWluQkNDSDoKKwkJY2FzZSBOTV9DSEFOQ19CQ0NIQ29tYjoKKwkJCS8qIGFsbG93ZWQgb25seSBmb3IgVFMwIG9mIEMwICovCisJCQlpZiAodHMtPnRyeCAhPSB0cy0+dHJ4LT5idHMtPmMwIHx8CisJCQkgICAgdHMtPm5yICE9IDApCisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwkJY2FzZSBOTV9DSEFOQ19CQ0NIOgorCQkJLyogYWxsb3dlZCBvbmx5IGZvciBUUyAyLzQvNiBvZiBDMCAqLworCQkJaWYgKHRzLT50cnggIT0gdHMtPnRyeC0+YnRzLT5jMCkKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCWlmICh0cy0+bnIgIT0gMiAmJiB0cy0+bnIgIT0gNCAmJgorCQkJICAgIHRzLT5uciAhPSA2KQorCQkJCXJldHVybiAtRUlOVkFMOworCQkJYnJlYWs7CisJCWNhc2UgODogLyogdGhpcyBpcyBub3QgbGlrZSAwOC41OCwgYnV0IGluIGZhY3QKKwkJCSAqIEZDQ0grU0NIK0JDQ0grQ0NDSCtTRENDSC80K1NBQ0NIL0M0K0NCQ0ggKi8KKwkJCS8qIEZJWE1FOiBvbmx5IG9uZSBDQkNIIGFsbG93ZWQgcGVyIGNlbGwgKi8KKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgR1NNX0JUU19UWVBFX05BTk9CVFM6CisJCXN3aXRjaCAodHMtPm5yKSB7CisJCWNhc2UgMDoKKwkJCWlmICh0cy0+dHJ4LT5uciA9PSAwKSB7CisJCQkJLyogb25seSBvbiBUUlgwICovCisJCQkJc3dpdGNoIChjaGFuX2NvbWIpIHsKKwkJCQljYXNlIE5NX0NIQU5DX0JDQ0g6CisJCQkJY2FzZSBOTV9DSEFOQ19tYWluQkNDSDoKKwkJCQljYXNlIE5NX0NIQU5DX0JDQ0hDb21iOgorCQkJCQlyZXR1cm4gMDsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJfSBlbHNlIHsKKwkJCQlzd2l0Y2ggKGNoYW5fY29tYikgeworCQkJCWNhc2UgTk1fQ0hBTkNfVENIRnVsbDoKKwkJCQljYXNlIE5NX0NIQU5DX1RDSEhhbGY6CisJCQkJY2FzZSBOTV9DSEFOQ19JUEFDX1RDSEZ1bGxfVENISGFsZjoKKwkJCQkJcmV0dXJuIDA7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMToKKwkJCWlmICh0cy0+dHJ4LT5uciA9PSAwKSB7CisJCQkJc3dpdGNoIChjaGFuX2NvbWIpIHsKKwkJCQljYXNlIE5NX0NIQU5DX1NEQ0NIX0NCQ0g6CisJCQkJCWlmICh0cy0+dHJ4LT50c1swXS5ubV9jaGFuX2NvbWIgPT0KKwkJCQkJICAgIE5NX0NIQU5DX21haW5CQ0NIKQorCQkJCQkJcmV0dXJuIDA7CisJCQkJCXJldHVybiAtRUlOVkFMOworCQkJCWNhc2UgTk1fQ0hBTkNfU0RDQ0g6CisJCQkJY2FzZSBOTV9DSEFOQ19UQ0hGdWxsOgorCQkJCWNhc2UgTk1fQ0hBTkNfVENISGFsZjoKKwkJCQljYXNlIE5NX0NIQU5DX0lQQUNfVENIRnVsbF9UQ0hIYWxmOgorCQkJCWNhc2UgTk1fQ0hBTkNfSVBBQ19UQ0hGdWxsX1BEQ0g6CisJCQkJCXJldHVybiAwOworCQkJCX0KKwkJCX0gZWxzZSB7CisJCQkJc3dpdGNoIChjaGFuX2NvbWIpIHsKKwkJCQljYXNlIE5NX0NIQU5DX1NEQ0NIOgorCQkJCWNhc2UgTk1fQ0hBTkNfVENIRnVsbDoKKwkJCQljYXNlIE5NX0NIQU5DX1RDSEhhbGY6CisJCQkJY2FzZSBOTV9DSEFOQ19JUEFDX1RDSEZ1bGxfVENISGFsZjoKKwkJCQkJcmV0dXJuIDA7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQkJfQorCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgMjoKKwkJY2FzZSAzOgorCQljYXNlIDQ6CisJCWNhc2UgNToKKwkJY2FzZSA2OgorCQljYXNlIDc6CisJCQlzd2l0Y2ggKGNoYW5fY29tYikgeworCQkJY2FzZSBOTV9DSEFOQ19UQ0hGdWxsOgorCQkJY2FzZSBOTV9DSEFOQ19UQ0hIYWxmOgorCQkJY2FzZSBOTV9DSEFOQ19JUEFDX1RDSEZ1bGxfVENISGFsZjoKKwkJCQlyZXR1cm4gMDsKKwkJCWNhc2UgTk1fQ0hBTkNfSVBBQ19QRENIOgorCQkJY2FzZSBOTV9DSEFOQ19JUEFDX1RDSEZ1bGxfUERDSDoKKwkJCQlpZiAodHMtPnRyeC0+bnIgPT0gMCkKKwkJCQkJcmV0dXJuIDA7CisJCQkJZWxzZQorCQkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWJyZWFrOworCQl9CisJCXJldHVybiAtRUlOVkFMOworCWRlZmF1bHQ6CisJCS8qIHVua25vd24gQlRTIHR5cGUgKi8KKwkJcmV0dXJuIDA7CisJfQorCXJldHVybiAwOworfQorCisvKiBDaGFwdGVyIDguNi4zICovCitpbnQgYWJpc19ubV9zZXRfY2hhbm5lbF9hdHRyKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMsIHVfaW50OF90IGNoYW5fY29tYikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdHMtPnRyeC0+YnRzOworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJdV9pbnQxNl90IGFyZmNuID0gaHRvbnModHMtPnRyeC0+YXJmY24pOworCXVfaW50OF90IHplcm8gPSAweDAwOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgbGVuID0gMiArIDI7CisKKwlpZiAoYnRzLT50eXBlID09IEdTTV9CVFNfVFlQRV9CUzExKQorCQlsZW4gKz0gNCArIDIgKyAyICsgMzsKKworCURFQlVHUChETk0sICJTZXQgQ2hhbiBBdHRyICVzXG4iLCBnc21fdHNfbmFtZSh0cykpOworCWlmICh2ZXJpZnlfY2hhbl9jb21iKHRzLCBjaGFuX2NvbWIpIDwgMCkgeworCQltc2diX2ZyZWUobXNnKTsKKwkJREVCVUdQKEROTSwgIkludmFsaWQgQ2hhbm5lbCBDb21iaW5hdGlvbiEhIVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwl0cy0+bm1fY2hhbl9jb21iID0gY2hhbl9jb21iOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgbGVuLCBOTV9NVF9TRVRfQ0hBTl9BVFRSLAorCQkJTk1fT0NfQ0hBTk5FTCwgYnRzLT5idHNfbnIsCisJCQl0cy0+dHJ4LT5uciwgdHMtPm5yKTsKKwkvKiBGSVhNRTogZG9uJ3Qgc2VuZCBBUkZDTiBsaXN0LCBob3BwaW5nIHNlcXVlbmNlLCBtQUlPLCAuLi4qLworCWlmIChidHMtPnR5cGUgPT0gR1NNX0JUU19UWVBFX0JTMTEpCisJCW1zZ2JfdGx2MTZfcHV0KG1zZywgTk1fQVRUX0FSRkNOX0xJU1QsIDEsICZhcmZjbik7CisJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfQ0hBTl9DT01CLCBjaGFuX2NvbWIpOworCWlmIChidHMtPnR5cGUgPT0gR1NNX0JUU19UWVBFX0JTMTEpIHsKKwkJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfSFNOLCAweDAwKTsKKwkJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfTUFJTywgMHgwMCk7CisJfQorCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX1RTQywgYnRzLT50c2MpOwkvKiB0cmFpbmluZyBzZXF1ZW5jZSAqLworCWlmIChidHMtPnR5cGUgPT0gR1NNX0JUU19UWVBFX0JTMTEpCisJCW1zZ2JfdGx2X3B1dChtc2csIDB4NTksIDEsICZ6ZXJvKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9zd19hY3RfcmVxX2FjayhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsIHVfaW50OF90IGkxLAorCQkJdV9pbnQ4X3QgaTIsIHVfaW50OF90IGkzLCBpbnQgbmFjaywgdV9pbnQ4X3QgKmF0dHIsIGludCBhdHRfbGVuKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwl1X2ludDhfdCBtc2d0eXBlID0gTk1fTVRfU1dfQUNUX1JFUV9BQ0s7CisJdV9pbnQ4X3QgbGVuID0gYXR0X2xlbjsKKworCWlmIChuYWNrKSB7CisJCWxlbiArPSAyOworCQltc2d0eXBlID0gTk1fTVRfU1dfQUNUX1JFUV9OQUNLOworCX0KKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIGF0dF9sZW4sIG1zZ3R5cGUsIG9ial9jbGFzcywgaTEsIGkyLCBpMyk7CisKKwlpZiAoYXR0cikgeworCQl1X2ludDhfdCAqcHRyID0gbXNnYl9wdXQobXNnLCBhdHRfbGVuKTsKKwkJbWVtY3B5KHB0ciwgYXR0ciwgYXR0X2xlbik7CisJfQorCWlmIChuYWNrKQorCQltc2diX3R2X3B1dChtc2csIE5NX0FUVF9OQUNLX0NBVVNFUywgTk1fTkFDS19PQkpDTEFTU19OT1RTVVBQKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9yYXdfbXNnKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBsZW4sIHVfaW50OF90ICpyYXdtc2cpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXVfaW50OF90ICpkYXRhOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpvaCkpOworCWZpbGxfb21faGRyKG9oLCBsZW4pOworCWRhdGEgPSBtc2diX3B1dChtc2csIGxlbik7CisJbWVtY3B5KGRhdGEsIHJhd21zZywgbGVuKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisvKiBTaWVtZW5zIHNwZWNpZmljIGNvbW1hbmRzICovCitzdGF0aWMgaW50IF9fc2ltcGxlX2NtZChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBtc2dfdHlwZSkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAwLCBtc2dfdHlwZSwgTk1fT0NfU0lURV9NQU5BR0VSLAorCQkJMHhmZiwgMHhmZiwgMHhmZik7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogQ2hhcHRlciA4LjkuMiAqLworaW50IGFiaXNfbm1fb3BzdGFydChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBvYmpfY2xhc3MsIHVfaW50OF90IGkwLCB1X2ludDhfdCBpMSwgdV9pbnQ4X3QgaTIpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMCwgTk1fTVRfT1BTVEFSVCwgb2JqX2NsYXNzLCBpMCwgaTEsIGkyKTsKKworCWRlYnVncF9mb2goKHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKikgb2gtPmRhdGEpOworCURFQlVHUEMoRE5NLCAiU2VuZGluZyBPUFNUQVJUXG4iKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisvKiBDaGFwdGVyIDguOC41ICovCitpbnQgYWJpc19ubV9jaGdfYWRtX3N0YXRlKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywgdV9pbnQ4X3QgaTAsCisJCQkgIHVfaW50OF90IGkxLCB1X2ludDhfdCBpMiwgZW51bSBhYmlzX25tX2FkbV9zdGF0ZSBhZG1fc3RhdGUpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMiwgTk1fTVRfQ0hHX0FETV9TVEFURSwgb2JqX2NsYXNzLCBpMCwgaTEsIGkyKTsKKwltc2diX3R2X3B1dChtc2csIE5NX0FUVF9BRE1fU1RBVEUsIGFkbV9zdGF0ZSk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fY29ubl9tZHJvcF9saW5rKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGUxX3BvcnQwLCB1X2ludDhfdCB0czAsCisJCQkgICAgdV9pbnQ4X3QgZTFfcG9ydDEsIHVfaW50OF90IHRzMSkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgKmF0dHI7CisKKwlERUJVR1AoRE5NLCAiQ09OTkVDVCBNRFJPUCBMSU5LIEUxPSgldSwldSkgLT4gRTE9KCV1LCAldSlcbiIsCisJCWUxX3BvcnQwLCB0czAsIGUxX3BvcnQxLCB0czEpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgNiwgTk1fTVRfQ09OTl9NRFJPUF9MSU5LLAorCQkJTk1fT0NfU0lURV9NQU5BR0VSLCAweDAwLCAweDAwLCAweDAwKTsKKworCWF0dHIgPSBtc2diX3B1dChtc2csIDMpOworCWF0dHJbMF0gPSBOTV9BVFRfTURST1BfTElOSzsKKwlhdHRyWzFdID0gZTFfcG9ydDA7CisJYXR0clsyXSA9IHRzMDsKKworCWF0dHIgPSBtc2diX3B1dChtc2csIDMpOworCWF0dHJbMF0gPSBOTV9BVFRfTURST1BfTkVYVDsKKwlhdHRyWzFdID0gZTFfcG9ydDE7CisJYXR0clsyXSA9IHRzMTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisvKiBDaGFwdGVyIDguNy4xICovCitpbnQgYWJpc19ubV9wZXJmb3JtX3Rlc3Qoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3Qgb2JqX2NsYXNzLAorCQkJIHVfaW50OF90IGJ0c19uciwgdV9pbnQ4X3QgdHJ4X25yLCB1X2ludDhfdCB0c19uciwKKwkJCSB1X2ludDhfdCB0ZXN0X25yLCB1X2ludDhfdCBhdXRvbl9yZXBvcnQsCisJCQkgdV9pbnQ4X3QgKnBoeXNfY29uZmlnLCB1X2ludDE2X3QgcGh5c19jb25maWdfbGVuKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwlpbnQgbGVuID0gNDsgLyogMiBUViBhdHRyaWJ1dGVzICovCisKKwlERUJVR1AoRE5NLCAiUEVGT1JNIFRFU1RcbiIpOworCQorCWlmIChwaHlzX2NvbmZpZ19sZW4pCisJCWxlbiArPSAzICsgcGh5c19jb25maWdfbGVuOworCQorCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIGxlbiwgTk1fTVRfUEVSRl9URVNULAorCQkJb2JqX2NsYXNzLCBidHNfbnIsIHRyeF9uciwgdHNfbnIpOworCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX1RFU1RfTk8sIHRlc3RfbnIpOworCW1zZ2JfdHZfcHV0KG1zZywgTk1fQVRUX0FVVE9OX1JFUE9SVCwgYXV0b25fcmVwb3J0KTsKKwlpZiAocGh5c19jb25maWdfbGVuKQorCQltc2diX3RsMTZ2X3B1dChtc2csIE5NX0FUVF9QSFlTX0NPTkYsIHBoeXNfY29uZmlnX2xlbiwKKwkJCQlwaHlzX2NvbmZpZyk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fZXZlbnRfcmVwb3J0cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgb24pCit7CisJaWYgKG9uID09IDApCisJCXJldHVybiBfX3NpbXBsZV9jbWQoYnRzLCBOTV9NVF9TVE9QX0VWRU5UX1JFUCk7CisJZWxzZQorCQlyZXR1cm4gX19zaW1wbGVfY21kKGJ0cywgTk1fTVRfUkVTVF9FVkVOVF9SRVApOworfQorCisvKiBTaWVtZW5zIChvciBCUy0xMSkgc3BlY2lmaWMgY29tbWFuZHMgKi8KKworaW50IGFiaXNfbm1fYnMxMV9ic2NfZGlzY29ubmVjdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgcmVjb25uZWN0KQoreworCWlmIChyZWNvbm5lY3QgPT0gMCkKKwkJcmV0dXJuIF9fc2ltcGxlX2NtZChidHMsIE5NX01UX0JTMTFfRElTQ09OTkVDVCk7CisJZWxzZQorCQlyZXR1cm4gX19zaW1wbGVfY21kKGJ0cywgTk1fTVRfQlMxMV9SRUNPTk5FQ1QpOworfQorCitpbnQgYWJpc19ubV9iczExX3Jlc3RhcnQoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlyZXR1cm4gX19zaW1wbGVfY21kKGJ0cywgTk1fTVRfQlMxMV9SRVNUQVJUKTsKK30KKworCitzdHJ1Y3QgYnMxMV9kYXRlX3RpbWUgeworCXVfaW50MTZfdAl5ZWFyOworCXVfaW50OF90CW1vbnRoOworCXVfaW50OF90CWRheTsKKwl1X2ludDhfdAlob3VyOworCXVfaW50OF90CW1pbjsKKwl1X2ludDhfdAlzZWM7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisKK3ZvaWQgZ2V0X2JzMTFfZGF0ZV90aW1lKHN0cnVjdCBiczExX2RhdGVfdGltZSAqYWV0KQoreworCXRpbWVfdCB0OworCXN0cnVjdCB0bSAqdG07CisKKwl0ID0gdGltZShOVUxMKTsKKwl0bSA9IGxvY2FsdGltZSgmdCk7CisJYWV0LT5zZWMgPSB0bS0+dG1fc2VjOworCWFldC0+bWluID0gdG0tPnRtX21pbjsKKwlhZXQtPmhvdXIgPSB0bS0+dG1faG91cjsKKwlhZXQtPmRheSA9IHRtLT50bV9tZGF5OworCWFldC0+bW9udGggPSB0bS0+dG1fbW9uOworCWFldC0+eWVhciA9IGh0b25zKDE5MDAgKyB0bS0+dG1feWVhcik7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfcmVzZXRfcmVzb3VyY2Uoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlyZXR1cm4gX19zaW1wbGVfY21kKGJ0cywgTk1fTVRfQlMxMV9SRVNFVF9SRVNPVVJDRSk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfZGJfdHJhbnNtaXNzaW9uKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBiZWdpbikKK3sKKwlpZiAoYmVnaW4pCisJCXJldHVybiBfX3NpbXBsZV9jbWQoYnRzLCBOTV9NVF9CUzExX0JFR0lOX0RCX1RYKTsKKwllbHNlCisJCXJldHVybiBfX3NpbXBsZV9jbWQoYnRzLCBOTV9NVF9CUzExX0VORF9EQl9UWCk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfY3JlYXRlX29iamVjdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLAorCQkJCWVudW0gYWJpc19iczExX29ianR5cGUgdHlwZSwgdV9pbnQ4X3QgaWR4LAorCQkJCXVfaW50OF90IGF0dHJfbGVuLCBjb25zdCB1X2ludDhfdCAqYXR0cikKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgKmN1cjsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIGF0dHJfbGVuLCBOTV9NVF9CUzExX0NSRUFURV9PQkosCisJCQlOTV9PQ19CUzExLCB0eXBlLCAwLCBpZHgpOworCWN1ciA9IG1zZ2JfcHV0KG1zZywgYXR0cl9sZW4pOworCW1lbWNweShjdXIsIGF0dHIsIGF0dHJfbGVuKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX2RlbGV0ZV9vYmplY3Qoc3RydWN0IGdzbV9idHMgKmJ0cywKKwkJCQllbnVtIGFiaXNfYnMxMV9vYmp0eXBlIHR5cGUsIHVfaW50OF90IGlkeCkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAwLCBOTV9NVF9CUzExX0RFTEVURV9PQkosCisJCQlOTV9PQ19CUzExLCB0eXBlLCAwLCBpZHgpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfY3JlYXRlX2VudmFCVFNFKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGlkeCkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgemVybyA9IDB4MDA7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAzLCBOTV9NVF9CUzExX0NSRUFURV9PQkosCisJCQlOTV9PQ19CUzExX0VOVkFCVFNFLCAwLCBpZHgsIDB4ZmYpOworCW1zZ2JfdGx2X3B1dChtc2csIDB4OTksIDEsICZ6ZXJvKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX2NyZWF0ZV9icG9ydChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBpZHgpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMCwgTk1fTVRfQlMxMV9DUkVBVEVfT0JKLCBOTV9PQ19CUzExX0JQT1JULAorCQkJaWR4LCAweGZmLCAweGZmKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX2RlbGV0ZV9icG9ydChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBpZHgpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMCwgTk1fTVRfQlMxMV9ERUxFVEVfT0JKLCBOTV9PQ19CUzExX0JQT1JULAorCQkJaWR4LCAweGZmLCAweGZmKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitzdGF0aWMgY29uc3QgdV9pbnQ4X3Qgc21fYXR0cltdID0geyBOTV9BVFRfVEVJLCBOTV9BVFRfQUJJU19DSEFOTkVMIH07CitpbnQgYWJpc19ubV9iczExX2dldF9vbWxfdGVpX3RzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMitzaXplb2Yoc21fYXR0ciksIE5NX01UX0dFVF9BVFRSLCBOTV9PQ19TSVRFX01BTkFHRVIsCisJCQkweGZmLCAweGZmLCAweGZmKTsKKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfTElTVF9SRVFfQVRUUiwgc2l6ZW9mKHNtX2F0dHIpLCBzbV9hdHRyKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisvKiBsaWtlIGFiaXNfbm1fY29ubl90ZXJyX3RyYWYgKyBzZXRfdGVpICovCitpbnQgYWJpc19ubV9iczExX2Nvbm5fb21sX3RlaShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBlMV9wb3J0LCAKKwkJCSAgdV9pbnQ4X3QgZTFfdGltZXNsb3QsIHVfaW50OF90IGUxX3N1YnNsb3QsCisJCQkgIHVfaW50OF90IHRlaSkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKmNoOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCBzaXplb2YoKmNoKSsyLCBOTV9NVF9CUzExX1NFVF9BVFRSLAorCQkJTk1fT0NfU0lURV9NQU5BR0VSLCAweGZmLCAweGZmLCAweGZmKTsKKworCWNoID0gKHN0cnVjdCBhYmlzX25tX2NoYW5uZWwgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmNoKSk7CisJZmlsbF9ubV9jaGFubmVsKGNoLCBlMV9wb3J0LCBlMV90aW1lc2xvdCwgZTFfc3Vic2xvdCk7CisJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfVEVJLCB0ZWkpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfc2V0X3RyeF9wb3dlcihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgbGV2ZWwpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMywgTk1fTVRfQlMxMV9TRVRfQVRUUiwKKwkJCU5NX09DX0JTMTEsIEJTMTFfT0JKX1BBLCAweDAwLCB0cngtPm5yKTsKKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfQlMxMV9UWFBXUiwgMSwgJmxldmVsKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2codHJ4LT5idHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfZ2V0X3RyeF9wb3dlcihzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBtc2diICptc2cgPSBubV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgYXR0ciA9IE5NX0FUVF9CUzExX1RYUFdSOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMitzaXplb2YoYXR0ciksIE5NX01UX0dFVF9BVFRSLAorCQkJTk1fT0NfQlMxMSwgQlMxMV9PQkpfUEEsIDB4MDAsIHRyeC0+bnIpOworCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9MSVNUX1JFUV9BVFRSLCBzaXplb2YoYXR0ciksICZhdHRyKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2codHJ4LT5idHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfZ2V0X3BsbF9tb2RlKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IGF0dHJbXSA9IHsgTk1fQVRUX0JTMTFfUExMX01PREUgfTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIrc2l6ZW9mKGF0dHIpLCBOTV9NVF9HRVRfQVRUUiwKKwkJCU5NX09DX0JTMTEsIEJTMTFfT0JKX0xJLCAweDAwLCAweDAwKTsKKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfTElTVF9SRVFfQVRUUiwgc2l6ZW9mKGF0dHIpLCBhdHRyKTsKKworCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX2dldF9jY2xrKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXVfaW50OF90IGF0dHJbXSA9IHsgTk1fQVRUX0JTMTFfQ0NMS19BQ0NVUkFDWSwKKwkJCSAgICBOTV9BVFRfQlMxMV9DQ0xLX1RZUEUgfTsKKworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIrc2l6ZW9mKGF0dHIpLCBOTV9NVF9HRVRfQVRUUiwKKwkJCU5NX09DX0JTMTEsIEJTMTFfT0JKX0NDTEssIDB4MDAsIDB4MDApOworCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9MSVNUX1JFUV9BVFRSLCBzaXplb2YoYXR0ciksIGF0dHIpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7CisKK30KKworLy9zdGF0aWMgY29uc3QgdV9pbnQ4X3QgYnMxMV9sb2dvbl9jN1tdID0geyAweDA3LCAweGQ5LCAweDAxLCAweDExLCAweDBkLCAweDEwLCAweDIwIH07CisKK2ludCBhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgb24pCit7CisJcmV0dXJuIGFiaXNfbm1fYnMxMV9sb2dvbihidHMsIDB4MDIsICJGQUNUT1JZIiwgb24pOworfQorCitpbnQgYWJpc19ubV9iczExX2luZmllbGRfbG9nb24oc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IG9uKQoreworCXJldHVybiBhYmlzX25tX2JzMTFfbG9nb24oYnRzLCAweDAzLCAiRklFTEQgICIsIG9uKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9sb2dvbihzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBsZXZlbCwgY29uc3QgY2hhciAqbmFtZSwgaW50IG9uKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYnMxMV9kYXRlX3RpbWUgYmR0OworCisJZ2V0X2JzMTFfZGF0ZV90aW1lKCZiZHQpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWlmIChvbikgeworCQl1X2ludDhfdCBsZW4gPSAzKjIgKyBzaXplb2YoYmR0KQorCQkJCSsgMSArIHN0cmxlbihuYW1lKTsKKwkJZmlsbF9vbV9mb21faGRyKG9oLCBsZW4sIE5NX01UX0JTMTFfTE1UX0xPR09OLAorCQkJCU5NX09DX0JTMTFfQlRTRSwgMHhmZiwgMHhmZiwgMHhmZik7CisJCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9CUzExX0xNVF9MT0dJTl9USU1FLAorCQkJICAgICBzaXplb2YoYmR0KSwgKHVfaW50OF90ICopICZiZHQpOworCQltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfQlMxMV9MTVRfVVNFUl9BQ0NfTEVWLAorCQkJICAgICAxLCAmbGV2ZWwpOworCQltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfQlMxMV9MTVRfVVNFUl9OQU1FLAorCQkJICAgICBzdHJsZW4obmFtZSksICh1X2ludDhfdCAqKW5hbWUpOworCX0gZWxzZSB7CisJCWZpbGxfb21fZm9tX2hkcihvaCwgMCwgTk1fTVRfQlMxMV9MTVRfTE9HT0ZGLAorCQkJCU5NX09DX0JTMTFfQlRTRSwgMHhmZiwgMHhmZiwgMHhmZik7CisJfQorCQorCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCitpbnQgYWJpc19ubV9iczExX3NldF90cngxX3B3KHN0cnVjdCBnc21fYnRzICpidHMsIGNvbnN0IGNoYXIgKnBhc3N3b3JkKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZzsKKworCWlmIChzdHJsZW4ocGFzc3dvcmQpICE9IDEwKQorCQlyZXR1cm4gLUVJTlZBTDsKKworIAltc2cgPSBubV9tc2diX2FsbG9jKCk7CisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMitzdHJsZW4ocGFzc3dvcmQpLCBOTV9NVF9CUzExX1NFVF9BVFRSLAorCQkJTk1fT0NfQlMxMSwgQlMxMV9PQkpfVFJYMSwgMHgwMCwgMHgwMCk7CisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0JTMTFfUEFTU1dPUkQsIDEwLCAoY29uc3QgdV9pbnQ4X3QgKilwYXNzd29yZCk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworLyogY2hhbmdlIHRoZSBCUy0xMSBQTEwgTW9kZSB0byBlaXRoZXIgbG9ja2VkIChFMSBkZXJpdmVkKSBvciBzdGFuZGFsb25lICovCitpbnQgYWJpc19ubV9iczExX3NldF9wbGxfbG9ja2VkKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBsb2NrZWQpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXVfaW50OF90IHRsdl92YWx1ZTsKKwkKKwltc2cgPSBubV9tc2diX2FsbG9jKCk7CisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCWZpbGxfb21fZm9tX2hkcihvaCwgMywgTk1fTVRfQlMxMV9TRVRfQVRUUiwgTk1fT0NfQlMxMSwKKwkJCUJTMTFfT0JKX0xJLCAweDAwLCAweDAwKTsKKworCWlmIChsb2NrZWQpCisJCXRsdl92YWx1ZSA9IEJTMTFfTElfUExMX0xPQ0tFRDsKKwllbHNlCisJCXRsdl92YWx1ZSA9IEJTMTFfTElfUExMX1NUQU5EQUxPTkU7CisJCisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0JTMTFfUExMX01PREUsIDEsICZ0bHZfdmFsdWUpOworCQorCXJldHVybiBhYmlzX25tX3NlbmRtc2coYnRzLCBtc2cpOworfQorCisvKiBTZXQgdGhlIGNhbGlicmF0aW9uIHZhbHVlIG9mIHRoZSBQTEwgKHdvcmsgdmFsdWUvc2V0IHZhbHVlKQorICogSXQgZGVwZW5kcyBvbiB0aGUgbG9naW4gd2hpY2ggb25lIGlzIGNoYW5nZWQgKi8KK2ludCBhYmlzX25tX2JzMTFfc2V0X3BsbChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgdmFsdWUpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXVfaW50OF90IHRsdl92YWx1ZVsyXTsKKworCW1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBBQklTX09NX0ZPTV9IRFJfU0laRSk7CisJZmlsbF9vbV9mb21faGRyKG9oLCAzLCBOTV9NVF9CUzExX1NFVF9BVFRSLCBOTV9PQ19CUzExLAorCQkJQlMxMV9PQkpfVFJYMSwgMHgwMCwgMHgwMCk7CisKKwl0bHZfdmFsdWVbMF0gPSB2YWx1ZT4+ODsKKwl0bHZfdmFsdWVbMV0gPSB2YWx1ZSYweGZmOworCisJbXNnYl90bHZfcHV0KG1zZywgTk1fQVRUX0JTMTFfUExMLCAyLCB0bHZfdmFsdWUpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfZ2V0X3N0YXRlKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJcmV0dXJuIF9fc2ltcGxlX2NtZChidHMsIE5NX01UX0JTMTFfR0VUX1NUQVRFKTsKK30KKworLyogQlMxMSBTV0wgKi8KKwordm9pZCAqdGFsbF9mbGVfY3R4OworCitzdHJ1Y3QgYWJpc19ubV9iczExX3N3IHsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCWNoYXIgc3dsX2ZuYW1lW1BBVEhfTUFYXTsKKwl1X2ludDhfdCB3aW5fc2l6ZTsKKwlpbnQgZm9yY2VkOworCXN0cnVjdCBsbGlzdF9oZWFkIGZpbGVfbGlzdDsKKwlnc21fY2JmbiAqdXNlcl9jYjsJLyogc3BlY2lmaWVkIGJ5IHRoZSB1c2VyICovCit9Oworc3RhdGljIHN0cnVjdCBhYmlzX25tX2JzMTFfc3cgX2dfYnMxMV9zdywgKmdfYnMxMV9zdyA9ICZfZ19iczExX3N3OworCitzdHJ1Y3QgZmlsZV9saXN0X2VudHJ5IHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCWNoYXIgZm5hbWVbUEFUSF9NQVhdOworfTsKKworc3RydWN0IGZpbGVfbGlzdF9lbnRyeSAqZmxfZGVxdWV1ZShzdHJ1Y3QgbGxpc3RfaGVhZCAqcXVldWUpCit7CisJc3RydWN0IGxsaXN0X2hlYWQgKmxoOworCisJaWYgKGxsaXN0X2VtcHR5KHF1ZXVlKSkKKwkJcmV0dXJuIE5VTEw7CisKKwlsaCA9IHF1ZXVlLT5uZXh0OworCWxsaXN0X2RlbChsaCk7CisJCisJcmV0dXJuIGxsaXN0X2VudHJ5KGxoLCBzdHJ1Y3QgZmlsZV9saXN0X2VudHJ5LCBsaXN0KTsKK30KKworc3RhdGljIGludCBiczExX3JlYWRfc3dsX2ZpbGUoc3RydWN0IGFiaXNfbm1fYnMxMV9zdyAqYnMxMV9zdykKK3sKKwljaGFyIGxpbmVidWZbMjU1XTsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCAqbGgsICpsaDI7CisJRklMRSAqc3dsOworCWludCByYyA9IDA7CisKKwlzd2wgPSBmb3BlbihiczExX3N3LT5zd2xfZm5hbWUsICJyIik7CisJaWYgKCFzd2wpCisJCXJldHVybiAtRU5PREVWOworCisJLyogemVybyB0aGUgc3RhbGUgZmlsZSBsaXN0LCBpZiBhbnkgKi8KKwlsbGlzdF9mb3JfZWFjaF9zYWZlKGxoLCBsaDIsICZiczExX3N3LT5maWxlX2xpc3QpIHsKKwkJbGxpc3RfZGVsKGxoKTsKKwkJdGFsbG9jX2ZyZWUobGgpOworCX0KKworCXdoaWxlIChmZ2V0cyhsaW5lYnVmLCBzaXplb2YobGluZWJ1ZiksIHN3bCkpIHsKKwkJY2hhciBmaWxlX2lkWzEyKzFdOworCQljaGFyIGZpbGVfdmVyc2lvbls4MCsxXTsKKwkJc3RydWN0IGZpbGVfbGlzdF9lbnRyeSAqZmxlOworCQlzdGF0aWMgY2hhciBkaXJbUEFUSF9NQVhdOworCisJCWlmIChzdHJsZW4obGluZWJ1ZikgPCA0KQorCQkJY29udGludWU7CisJCisJCXJjID0gc3NjYW5mKGxpbmVidWYrNCwgIiUxMnM6JTgwc1xyXG4iLCBmaWxlX2lkLCBmaWxlX3ZlcnNpb24pOworCQlpZiAocmMgPCAwKSB7CisJCQlwZXJyb3IoIkVSUiBwYXJzaW5nIFNXTCBmaWxlIik7CisJCQlyYyA9IC1FSU5WQUw7CisJCQlnb3RvIG91dDsKKwkJfQorCQlpZiAocmMgPCAyKQorCQkJY29udGludWU7CisKKwkJZmxlID0gdGFsbG9jX3plcm8odGFsbF9mbGVfY3R4LCBzdHJ1Y3QgZmlsZV9saXN0X2VudHJ5KTsKKwkJaWYgKCFmbGUpIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gb3V0OworCQl9CisKKwkJLyogY29uc3RydWN0IG5ldyBmaWxlbmFtZSAqLworCQlzdHJuY3B5KGRpciwgYnMxMV9zdy0+c3dsX2ZuYW1lLCBzaXplb2YoZGlyKSk7CisJCXN0cm5jYXQoZmxlLT5mbmFtZSwgZGlybmFtZShkaXIpLCBzaXplb2YoZmxlLT5mbmFtZSkgLSAxKTsKKwkJc3RyY2F0KGZsZS0+Zm5hbWUsICIvIik7CisJCXN0cm5jYXQoZmxlLT5mbmFtZSwgZmlsZV9pZCwgc2l6ZW9mKGZsZS0+Zm5hbWUpIC0gMSAtc3RybGVuKGZsZS0+Zm5hbWUpKTsKKwkJCisJCWxsaXN0X2FkZF90YWlsKCZmbGUtPmxpc3QsICZiczExX3N3LT5maWxlX2xpc3QpOworCX0KKworb3V0OgorCWZjbG9zZShzd2wpOworCXJldHVybiByYzsKK30KKworLyogYnMxMSBzd2xvYWQgc3BlY2lmaWMgY2FsbGJhY2ssIHBhc3NlZCB0byBhYmlzX25tIGNvcmUgc3dsb2FkICovCitzdGF0aWMgaW50IGJzMTFfc3dsb2FkX2NiZm4odW5zaWduZWQgaW50IGhvb2ssIHVuc2lnbmVkIGludCBldmVudCwKKwkJCSAgICBzdHJ1Y3QgbXNnYiAqbXNnLCB2b2lkICpkYXRhLCB2b2lkICpwYXJhbSkKK3sKKwlzdHJ1Y3QgYWJpc19ubV9iczExX3N3ICpiczExX3N3ID0gZGF0YTsKKwlzdHJ1Y3QgZmlsZV9saXN0X2VudHJ5ICpmbGU7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE5NX01UX0xPQURfRU5EX0FDSzoKKwkJZmxlID0gZmxfZGVxdWV1ZSgmYnMxMV9zdy0+ZmlsZV9saXN0KTsKKwkJaWYgKGZsZSkgeworCQkJLyogc3RhcnQgZG93bmxvYWQgdGhlIG5leHQgZmlsZSBvZiBvdXIgZmlsZSBsaXN0ICovCisJCQlyYyA9IGFiaXNfbm1fc29mdHdhcmVfbG9hZChiczExX3N3LT5idHMsIGZsZS0+Zm5hbWUsCisJCQkJCQkgICBiczExX3N3LT53aW5fc2l6ZSwKKwkJCQkJCSAgIGJzMTFfc3ctPmZvcmNlZCwKKwkJCQkJCSAgICZiczExX3N3bG9hZF9jYmZuLCBiczExX3N3KTsKKwkJCXRhbGxvY19mcmVlKGZsZSk7CisJCX0gZWxzZSB7CisJCQkvKiBhY3RpdmF0ZSB0aGUgU1dMICovCisJCQlyYyA9IGFiaXNfbm1fc29mdHdhcmVfYWN0aXZhdGUoYnMxMV9zdy0+YnRzLAorCQkJCQkJCWJzMTFfc3ctPnN3bF9mbmFtZSwKKwkJCQkJCQliczExX3N3bG9hZF9jYmZuLAorCQkJCQkJCWJzMTFfc3cpOworCQl9CisJCWJyZWFrOworCWNhc2UgTk1fTVRfTE9BRF9TRUdfQUNLOgorCWNhc2UgTk1fTVRfTE9BRF9FTkRfTkFDSzoKKwljYXNlIE5NX01UX0xPQURfSU5JVF9BQ0s6CisJY2FzZSBOTV9NVF9MT0FEX0lOSVRfTkFDSzoKKwljYXNlIE5NX01UX0FDVElWQVRFX1NXX05BQ0s6CisJY2FzZSBOTV9NVF9BQ1RJVkFURV9TV19BQ0s6CisJZGVmYXVsdDoKKwkJLyogZmFsbHRocm91Z2ggdG8gdGhlIHVzZXIgY2FsbGJhY2sgKi8KKwkJaWYgKGJzMTFfc3ctPnVzZXJfY2IpCisJCQlyYyA9IGJzMTFfc3ctPnVzZXJfY2IoaG9vaywgZXZlbnQsIG1zZywgTlVMTCwgTlVMTCk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworLyogU2llbWVucyBwcm92aWRlcyBhIFNXTCBmaWxlIHRoYXQgaXMgYSBtZXJlIGxpc3Rpbmcgb2YgYWxsIHRoZSBvdGhlcgorICogZmlsZXMgdGhhdCBhcmUgcGFydCBvZiBhIHNvZnR3YXJlIHJlbGVhc2UuICBXZSBuZWVkIHRvIHVwbG9hZCBmaXJzdAorICogdGhlIGxpc3QgZmlsZSwgYW5kIHRoZW4gZWFjaCBmaWxlIHRoYXQgaXMgbGlzdGVkIGluIHRoZSBsaXN0IGZpbGUgKi8KK2ludCBhYmlzX25tX2JzMTFfbG9hZF9zd2woc3RydWN0IGdzbV9idHMgKmJ0cywgY29uc3QgY2hhciAqZm5hbWUsCisJCQkgIHVfaW50OF90IHdpbl9zaXplLCBpbnQgZm9yY2VkLCBnc21fY2JmbiAqY2JmbikKK3sKKwlzdHJ1Y3QgYWJpc19ubV9iczExX3N3ICpiczExX3N3ID0gZ19iczExX3N3OworCXN0cnVjdCBmaWxlX2xpc3RfZW50cnkgKmZsZTsKKwlpbnQgcmMgPSAwOworCisJSU5JVF9MTElTVF9IRUFEKCZiczExX3N3LT5maWxlX2xpc3QpOworCWJzMTFfc3ctPmJ0cyA9IGJ0czsKKwliczExX3N3LT53aW5fc2l6ZSA9IHdpbl9zaXplOworCWJzMTFfc3ctPnVzZXJfY2IgPSBjYmZuOworCWJzMTFfc3ctPmZvcmNlZCA9IGZvcmNlZDsKKworCXN0cm5jcHkoYnMxMV9zdy0+c3dsX2ZuYW1lLCBmbmFtZSwgc2l6ZW9mKGJzMTFfc3ctPnN3bF9mbmFtZSkpOworCXJjID0gYnMxMV9yZWFkX3N3bF9maWxlKGJzMTFfc3cpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCS8qIGRlcXVldWUgbmV4dCBpdGVtIGluIGZpbGUgbGlzdCAqLworCWZsZSA9IGZsX2RlcXVldWUoJmJzMTFfc3ctPmZpbGVfbGlzdCk7CisJaWYgKCFmbGUpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogc3RhcnQgZG93bmxvYWQgdGhlIG5leHQgZmlsZSBvZiBvdXIgZmlsZSBsaXN0ICovCisJcmMgPSBhYmlzX25tX3NvZnR3YXJlX2xvYWQoYnRzLCBmbGUtPmZuYW1lLCB3aW5fc2l6ZSwgZm9yY2VkLAorCQkJCSAgIGJzMTFfc3dsb2FkX2NiZm4sIGJzMTFfc3cpOworCXRhbGxvY19mcmVlKGZsZSk7CisJcmV0dXJuIHJjOworfQorCisjaWYgMAorc3RhdGljIHVfaW50OF90IHJlcV9hdHRyX2J0c2VbXSA9IHsKKwlOTV9BVFRfQURNX1NUQVRFLCBOTV9BVFRfQlMxMV9MTVRfTE9HT05fU0VTU0lPTiwKKwlOTV9BVFRfQlMxMV9MTVRfTE9HSU5fVElNRSwgTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFViwKKwlOTV9BVFRfQlMxMV9MTVRfVVNFUl9OQU1FLAorCisJMHhhZiwgTk1fQVRUX0JTMTFfUlhfT0ZGU0VULCBOTV9BVFRfQlMxMV9WRU5ET1JfTkFNRSwKKworCU5NX0FUVF9CUzExX1NXX0xPQURfSU5URU5ERUQsIE5NX0FUVF9CUzExX1NXX0xPQURfU0FGRVRZLAorCisJTk1fQVRUX0JTMTFfU1dfTE9BRF9TVE9SRUQgfTsKKworc3RhdGljIHVfaW50OF90IHJlcV9hdHRyX2J0c21bXSA9IHsKKwlOTV9BVFRfQUJJU19DSEFOTkVMLCBOTV9BVFRfVEVJLCBOTV9BVFRfQlMxMV9BQklTX0VYVF9USU1FLAorCU5NX0FUVF9BRE1fU1RBVEUsIE5NX0FUVF9BVkFJTF9TVEFUVVMsIDB4Y2UsIE5NX0FUVF9GSUxFX0lELAorCU5NX0FUVF9GSUxFX1ZFUlNJT04sIE5NX0FUVF9PUEVSX1NUQVRFLCAweGU4LCBOTV9BVFRfQlMxMV9BTExfVEVTVF9DQVRHLAorCU5NX0FUVF9TV19ERVNDUiwgTk1fQVRUX0dFVF9BUkkgfTsKKyNlbmRpZgorCQorc3RhdGljIHVfaW50OF90IHJlcV9hdHRyW10gPSB7IAorCU5NX0FUVF9BRE1fU1RBVEUsIE5NX0FUVF9BVkFJTF9TVEFUVVMsIDB4YTgsIE5NX0FUVF9PUEVSX1NUQVRFLAorCTB4ZDUsIDB4YTEsIE5NX0FUVF9CUzExX0VTTl9GV19DT0RFX05PLCBOTV9BVFRfQlMxMV9FU05fSFdfQ09ERV9OTywKKwkweDQyLCBOTV9BVFRfQlMxMV9FU05fUENCX1NFUklBTCwgTk1fQVRUX0JTMTFfUExMIH07CisKK2ludCBhYmlzX25tX2JzMTFfZ2V0X3Nlcm5vKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCS8qIFNpZW1lbnNIVyBDQ1RSTCBvYmplY3QgKi8KKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIrc2l6ZW9mKHJlcV9hdHRyKSwgTk1fTVRfR0VUX0FUVFIsIE5NX09DX0JTMTEsCisJCQkweDAzLCAweDAwLCAweDAwKTsKKwltc2diX3Rsdl9wdXQobXNnLCBOTV9BVFRfTElTVF9SRVFfQVRUUiwgc2l6ZW9mKHJlcV9hdHRyKSwgcmVxX2F0dHIpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKK2ludCBhYmlzX25tX2JzMTFfc2V0X2V4dF90aW1lKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXN0cnVjdCBiczExX2RhdGVfdGltZSBhZXQ7CisKKwlnZXRfYnMxMV9kYXRlX3RpbWUoJmFldCk7CisJb2ggPSAoc3RydWN0IGFiaXNfb21faGRyICopIG1zZ2JfcHV0KG1zZywgQUJJU19PTV9GT01fSERSX1NJWkUpOworCS8qIFNpZW1lbnNIVyBDQ1RSTCBvYmplY3QgKi8KKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIrc2l6ZW9mKGFldCksIE5NX01UX0JTMTFfU0VUX0FUVFIsIE5NX09DX1NJVEVfTUFOQUdFUiwKKwkJCTB4ZmYsIDB4ZmYsIDB4ZmYpOworCW1zZ2JfdGx2X3B1dChtc2csIE5NX0FUVF9CUzExX0FCSVNfRVhUX1RJTUUsIHNpemVvZihhZXQpLCAodV9pbnQ4X3QgKikgJmFldCk7CisKKwlyZXR1cm4gYWJpc19ubV9zZW5kbXNnKGJ0cywgbXNnKTsKK30KKworaW50IGFiaXNfbm1fYnMxMV9zZXRfYnBvcnRfbGluZV9jZmcoc3RydWN0IGdzbV9idHMgKmJ0cywgdV9pbnQ4X3QgYnBvcnQsIGVudW0gYWJpc19iczExX2xpbmVfY2ZnIGxpbmVfY2ZnKQoreworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG5tX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYnMxMV9kYXRlX3RpbWUgYWV0OworCisJZ2V0X2JzMTFfZGF0ZV90aW1lKCZhZXQpOworCW9oID0gKHN0cnVjdCBhYmlzX29tX2hkciAqKSBtc2diX3B1dChtc2csIEFCSVNfT01fRk9NX0hEUl9TSVpFKTsKKwlmaWxsX29tX2ZvbV9oZHIob2gsIDIsIE5NX01UX0JTMTFfU0VUX0FUVFIsIE5NX09DX0JTMTFfQlBPUlQsCisJCQlicG9ydCwgMHhmZiwgMHgwMik7CisJbXNnYl90dl9wdXQobXNnLCBOTV9BVFRfQlMxMV9MSU5FX0NGRywgbGluZV9jZmcpOworCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKy8qIGlwLmFjY2VzcyBuYW5vQlRTIHNwZWNpZmljIGNvbW1hbmRzICovCitzdGF0aWMgY29uc3QgY2hhciBpcGFjY2Vzc19tYWdpY1tdID0gImNvbS5pcGFjY2VzcyI7CisKKworc3RhdGljIGludCBhYmlzX25tX3J4X2lwYWNjKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfb21faGRyICpvaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2g7CisJdV9pbnQ4X3QgaWRzdHJsZW4gPSBvaC0+ZGF0YVswXTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgaXBhY2NfYWNrX3NpZ25hbF9kYXRhIHNpZ25hbDsKKworCWlmIChzdHJuY21wKChjaGFyICopJm9oLT5kYXRhWzFdLCBpcGFjY2Vzc19tYWdpYywgaWRzdHJsZW4pKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiaWQgc3RyaW5nIGlzIG5vdCBjb20uaXBhY2Nlc3MgIT8hXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZm9oID0gKHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKikgKG9oLT5kYXRhICsgMSArIGlkc3RybGVuKTsKKwlhYmlzX25tX3Rsdl9wYXJzZSgmdHAsIG1zZy0+dHJ4LT5idHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCisJZGVidWdwX2ZvaChmb2gpOworCisJREVCVUdQQyhETk0sICJJUEFDQ0VTUygweCUwMngpOiAiLCBmb2gtPm1zZ190eXBlKTsKKworCXN3aXRjaCAoZm9oLT5tc2dfdHlwZSkgeworCWNhc2UgTk1fTVRfSVBBQ0NfUlNMX0NPTk5FQ1RfQUNLOgorCQlERUJVR1BDKEROTSwgIlJTTCBDT05ORUNUIEFDSyAiKTsKKwkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9JUEFDQ19EU1RfSVApKQorCQkJREVCVUdQQyhETk0sICJJUD0lcyAiLAorCQkJCWluZXRfbnRvYSgqKChzdHJ1Y3QgaW5fYWRkciAqKSAKKwkJCQkJVExWUF9WQUwoJnRwLCBOTV9BVFRfSVBBQ0NfRFNUX0lQKSkpKTsKKwkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9JUEFDQ19EU1RfSVBfUE9SVCkpCisJCQlERUJVR1BDKEROTSwgIlBPUlQ9JXUgIiwKKwkJCQludG9ocygqKCh1X2ludDE2X3QgKikgCisJCQkJCVRMVlBfVkFMKCZ0cCwgTk1fQVRUX0lQQUNDX0RTVF9JUF9QT1JUKSkpKTsKKwkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9JUEFDQ19TVFJFQU1fSUQpKQorCQkJREVCVUdQQyhETk0sICJTVFJFQU09MHglMDJ4ICIsCisJCQkJCSpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9JUEFDQ19TVFJFQU1fSUQpKTsKKwkJREVCVUdQQyhETk0sICJcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX1JTTF9DT05ORUNUX05BQ0s6CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiUlNMIENPTk5FQ1QgTkFDSyAiKTsKKwkJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIE5NX0FUVF9OQUNLX0NBVVNFUykpCisJCQlERUJVR1BDKEROTSwgIiBDQVVTRT0lc1xuIiwgCisJCQkJbmFja19jYXVzZV9uYW1lKCpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9OQUNLX0NBVVNFUykpKTsKKwkJZWxzZQorCQkJREVCVUdQQyhETk0sICJcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX1NFVF9OVkFUVFJfQUNLOgorCQlERUJVR1BDKEROTSwgIlNFVCBOVkFUVFIgQUNLXG4iKTsKKwkJLyogRklYTUU6IGRlY29kZSBhbmQgc2hvdyB0aGUgYWN0dWFsIGF0dHJpYnV0ZXMgKi8KKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19TRVRfTlZBVFRSX05BQ0s6CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiU0VUIE5WQVRUUiBOQUNLICIpOworCQlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkKKwkJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIiBDQVVTRT0lc1xuIiwgCisJCQkJbmFja19jYXVzZV9uYW1lKCpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9OQUNLX0NBVVNFUykpKTsKKwkJZWxzZQorCQkJTE9HUEMoRE5NLCBMT0dMX0VSUk9SLCAiXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9JUEFDQ19HRVRfTlZBVFRSX0FDSzoKKwkJREVCVUdQQyhETk0sICJHRVQgTlZBVFRSIEFDS1xuIik7CisJCS8qIEZJWE1FOiBkZWNvZGUgYW5kIHNob3cgdGhlIGFjdHVhbCBhdHRyaWJ1dGVzICovCisJCWJyZWFrOworCWNhc2UgTk1fTVRfSVBBQ0NfR0VUX05WQVRUUl9OQUNLOgorCQlMT0dQQyhETk0sIExPR0xfRVJST1IsICJHRVQgTlZBVFRSIE5BQ0sgIik7CisJCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfTkFDS19DQVVTRVMpKQorCQkJTE9HUEMoRE5NLCBMT0dMX0VSUk9SLCAiIENBVVNFPSVzXG4iLCAKKwkJCQluYWNrX2NhdXNlX25hbWUoKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkpOworCQllbHNlCisJCQlMT0dQQyhETk0sIExPR0xfRVJST1IsICJcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX1NFVF9BVFRSX0FDSzoKKwkJREVCVUdQQyhETk0sICJTRVQgQVRUUiBBQ0tcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX1NFVF9BVFRSX05BQ0s6CisJCUxPR1BDKEROTSwgTE9HTF9FUlJPUiwgIlNFVCBBVFRSIE5BQ0sgIik7CisJCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBOTV9BVFRfTkFDS19DQVVTRVMpKQorCQkJTE9HUEMoRE5NLCBMT0dMX0VSUk9SLCAiIENBVVNFPSVzXG4iLCAKKwkJCQluYWNrX2NhdXNlX25hbWUoKlRMVlBfVkFMKCZ0cCwgTk1fQVRUX05BQ0tfQ0FVU0VTKSkpOworCQllbHNlCisJCQlMT0dQQyhETk0sIExPR0xfRVJST1IsICJcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1BDKEROTSwgInVua25vd25cbiIpOworCQlicmVhazsKKwl9CisKKwkvKiBzaWduYWwgaGFuZGxpbmcgKi8KKwlzd2l0Y2ggIChmb2gtPm1zZ190eXBlKSB7CisJY2FzZSBOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVF9OQUNLOgorCWNhc2UgTk1fTVRfSVBBQ0NfU0VUX05WQVRUUl9OQUNLOgorCWNhc2UgTk1fTVRfSVBBQ0NfR0VUX05WQVRUUl9OQUNLOgorCQlzaWduYWwuYnRzID0gbXNnLT50cngtPmJ0czsKKwkJc2lnbmFsLm1zZ190eXBlID0gZm9oLT5tc2dfdHlwZTsKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX05NLCBTX05NX0lQQUNDX05BQ0ssICZzaWduYWwpOworCQlicmVhazsKKwljYXNlIE5NX01UX0lQQUNDX1NFVF9OVkFUVFJfQUNLOgorCQlzaWduYWwuYnRzID0gbXNnLT50cngtPmJ0czsKKwkJc2lnbmFsLm1zZ190eXBlID0gZm9oLT5tc2dfdHlwZTsKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX05NLCBTX05NX0lQQUNDX0FDSywgJnNpZ25hbCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisvKiBzZW5kIGFuIGlwLWFjY2VzcyBtYW51ZmFjdHVyZXIgc3BlY2lmaWMgbWVzc2FnZSAqLworaW50IGFiaXNfbm1faXBhY2Nlc3NfbXNnKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG1zZ190eXBlLAorCQkJIHVfaW50OF90IG9ial9jbGFzcywgdV9pbnQ4X3QgYnRzX25yLAorCQkJIHVfaW50OF90IHRyeF9uciwgdV9pbnQ4X3QgdHNfbnIsCisJCQkgdV9pbnQ4X3QgKmF0dHIsIGludCBhdHRyX2xlbikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbm1fbXNnYl9hbGxvYygpOworCXN0cnVjdCBhYmlzX29tX2hkciAqb2g7CisJc3RydWN0IGFiaXNfb21fZm9tX2hkciAqZm9oOworCXVfaW50OF90ICpkYXRhOworCisJLyogY29uc3RydWN0IHRoZSAxMi4yMSBPTSBoZWFkZXIsIG9ic2VydmUgdGhlIGVycm9uZW91cyBsZW5ndGggKi8KKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKm9oKSk7CisJZmlsbF9vbV9oZHIob2gsIHNpemVvZigqZm9oKSArIGF0dHJfbGVuKTsKKwlvaC0+bWRpc2MgPSBBQklTX09NX01ESVNDX01BTlVGOworCisJLyogYWRkIHRoZSBpcC5hY2Nlc3MgbWFnaWMgKi8KKwlkYXRhID0gbXNnYl9wdXQobXNnLCBzaXplb2YoaXBhY2Nlc3NfbWFnaWMpKzEpOworCSpkYXRhKysgPSBzaXplb2YoaXBhY2Nlc3NfbWFnaWMpOworCW1lbWNweShkYXRhLCBpcGFjY2Vzc19tYWdpYywgc2l6ZW9mKGlwYWNjZXNzX21hZ2ljKSk7CisKKwkvKiBmaWxsIHRoZSAxMi4yMSBGT00gaGVhZGVyICovCisJZm9oID0gKHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmZvaCkpOworCWZvaC0+bXNnX3R5cGUgPSBtc2dfdHlwZTsKKwlmb2gtPm9ial9jbGFzcyA9IG9ial9jbGFzczsKKwlmb2gtPm9ial9pbnN0LmJ0c19uciA9IGJ0c19ucjsKKwlmb2gtPm9ial9pbnN0LnRyeF9uciA9IHRyeF9ucjsKKwlmb2gtPm9ial9pbnN0LnRzX25yID0gdHNfbnI7CisKKwlpZiAoYXR0ciAmJiBhdHRyX2xlbikgeworCQlkYXRhID0gbXNnYl9wdXQobXNnLCBhdHRyX2xlbik7CisJCW1lbWNweShkYXRhLCBhdHRyLCBhdHRyX2xlbik7CisJfQorCisJcmV0dXJuIGFiaXNfbm1fc2VuZG1zZyhidHMsIG1zZyk7Cit9CisKKy8qIHNldCBzb21lIGF0dHJpYnV0ZXMgaW4gTlZSQU0gKi8KK2ludCBhYmlzX25tX2lwYWNjZXNzX3NldF9udmF0dHIoc3RydWN0IGdzbV9idHNfdHJ4ICp0cngsIHVfaW50OF90ICphdHRyLAorCQkJCWludCBhdHRyX2xlbikKK3sKKwlyZXR1cm4gYWJpc19ubV9pcGFjY2Vzc19tc2codHJ4LT5idHMsIE5NX01UX0lQQUNDX1NFVF9OVkFUVFIsCisJCQkJICAgIE5NX09DX0JBU0VCX1RSQU5TQywgMCwgdHJ4LT5uciwgMHhmZiwgYXR0ciwKKwkJCQkgICAgYXR0cl9sZW4pOworfQorCitpbnQgYWJpc19ubV9pcGFjY2Vzc19yc2xfY29ubmVjdChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgCisJCQkJIHVfaW50MzJfdCBpcCwgdV9pbnQxNl90IHBvcnQsIHVfaW50OF90IHN0cmVhbSkKK3sKKwlzdHJ1Y3QgaW5fYWRkciBpYTsKKwl1X2ludDhfdCBhdHRyW10gPSB7IE5NX0FUVF9JUEFDQ19TVFJFQU1fSUQsIDAsCisJCQkgICAgTk1fQVRUX0lQQUNDX0RTVF9JUF9QT1JULCAwLCAwLAorCQkJICAgIE5NX0FUVF9JUEFDQ19EU1RfSVAsIDAsIDAsIDAsIDAgfTsKKworCWludCBhdHRyX2xlbiA9IHNpemVvZihhdHRyKTsKKworCWlhLnNfYWRkciA9IGh0b25sKGlwKTsKKwlhdHRyWzFdID0gc3RyZWFtOworCWF0dHJbM10gPSBwb3J0ID4+IDg7CisJYXR0cls0XSA9IHBvcnQgJiAweGZmOworCSoodV9pbnQzMl90ICopKGF0dHIrNikgPSBpYS5zX2FkZHI7CisKKwkvKiBpZiBpcCA9PSAwLCB3ZSB1c2UgdGhlIGRlZmF1bHQgSVAgKi8KKwlpZiAoaXAgPT0gMCkKKwkJYXR0cl9sZW4gLT0gNTsKKworCURFQlVHUChETk0sICJpcC5hY2Nlc3MgUlNMIENPTk5FQ1QgSVA9JXMgUE9SVD0ldSBTVFJFQU09MHglMDJ4XG4iLAorCQlpbmV0X250b2EoaWEpLCBwb3J0LCBzdHJlYW0pOworCisJcmV0dXJuIGFiaXNfbm1faXBhY2Nlc3NfbXNnKHRyeC0+YnRzLCBOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVCwKKwkJCQkgICAgTk1fT0NfQkFTRUJfVFJBTlNDLCB0cngtPmJ0cy0+YnRzX25yLAorCQkJCSAgICB0cngtPm5yLCAweGZmLCBhdHRyLCBhdHRyX2xlbik7Cit9CisKKy8qIHJlc3RhcnQgLyByZWJvb3QgYW4gaXAuYWNjZXNzIG5hbm9CVFMgKi8KK2ludCBhYmlzX25tX2lwYWNjZXNzX3Jlc3RhcnQoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlyZXR1cm4gX19zaW1wbGVfY21kKGJ0cywgTk1fTVRfSVBBQ0NfUkVTVEFSVCk7Cit9CisKK2ludCBhYmlzX25tX2lwYWNjZXNzX3NldF9hdHRyKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IG9ial9jbGFzcywKKwkJCQl1X2ludDhfdCBidHNfbnIsIHVfaW50OF90IHRyeF9uciwgdV9pbnQ4X3QgdHNfbnIsCisJCQkJdV9pbnQ4X3QgKmF0dHIsIHVfaW50OF90IGF0dHJfbGVuKQoreworCXJldHVybiBhYmlzX25tX2lwYWNjZXNzX21zZyhidHMsIE5NX01UX0lQQUNDX1NFVF9BVFRSLAorCQkJCSAgICBvYmpfY2xhc3MsIGJ0c19uciwgdHJ4X25yLCB0c19uciwKKwkJCQkgICAgIGF0dHIsIGF0dHJfbGVuKTsKK30KKwordm9pZCBhYmlzX25tX2lwYWNjZXNzX2NnaSh1X2ludDhfdCAqYnVmLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCS8qIHdlIHNpbXBseSByZXVzZSB0aGUgR1NNNDggZnVuY3Rpb24gYW5kIG92ZXJ3cml0ZSB0aGUgUkFDCisJICogd2l0aCB0aGUgQ2VsbCBJRCAqLworCWdzbTQ4X3JhX2lkX2J5X2J0cyhidWYsIGJ0cyk7CisJKigodV9pbnQxNl90ICopKGJ1ZiArIDUpKSA9IGh0b25zKGJ0cy0+Y2VsbF9pZGVudGl0eSk7Cit9CisKK3ZvaWQgZ3NtX3RyeF9sb2NrX3JmKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCBpbnQgbG9ja2VkKQoreworCWludCBuZXdfc3RhdGUgPSBsb2NrZWQgPyBOTV9TVEFURV9MT0NLRUQgOiBOTV9TVEFURV9VTkxPQ0tFRDsKKworCXRyeC0+bm1fc3RhdGUuYWRtaW5pc3RyYXRpdmUgPSBuZXdfc3RhdGU7CisJaWYgKCF0cngtPmJ0cyB8fCAhdHJ4LT5idHMtPm9tbF9saW5rKQorCQlyZXR1cm47CisKKwlhYmlzX25tX2NoZ19hZG1fc3RhdGUodHJ4LT5idHMsIE5NX09DX1JBRElPX0NBUlJJRVIsCisJCQkgICAgICB0cngtPmJ0cy0+YnRzX25yLCB0cngtPm5yLCAweGZmLAorCQkJICAgICAgbmV3X3N0YXRlKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKmlwYWNjX3Rlc3RyZXNfbmFtZXNbXSA9IHsKKwlbTk1fSVBBQ0NfVEVTVFJFU19TVUNDRVNTXQk9ICJTVUNDRVNTIiwKKwlbTk1fSVBBQ0NfVEVTVFJFU19USU1FT1VUXQk9ICJUSU1FT1VUIiwKKwlbTk1fSVBBQ0NfVEVTVFJFU19OT19DSEFOU10JPSAiTk8gQ0hBTk5FTFMiLAorCVtOTV9JUEFDQ19URVNUUkVTX1BBUlRJQUxdCT0gIlBBUlRJQUwiLAorCVtOTV9JUEFDQ19URVNUUkVTX1NUT1BQRURdCT0gIlNUT1BQRUQiLAorfTsKKworY29uc3QgY2hhciAqaXBhY2NfdGVzdHJlc19uYW1lKHVfaW50OF90IHJlcykKK3sKKwlpZiAocmVzIDwgQVJSQVlfU0laRShpcGFjY190ZXN0cmVzX25hbWVzKSAmJgorCSAgICBpcGFjY190ZXN0cmVzX25hbWVzW3Jlc10pCisJCXJldHVybiBpcGFjY190ZXN0cmVzX25hbWVzW3Jlc107CisKKwlyZXR1cm4gInVua25vd24iOworfQorCit2b2lkIGlwYWNfcGFyc2VfY2dpKHN0cnVjdCBjZWxsX2dsb2JhbF9pZCAqY2lkLCBjb25zdCB1X2ludDhfdCAqYnVmKQoreworCWNpZC0+bWNjID0gKGJ1ZlswXSAmIDB4ZikgKiAxMDA7CisJY2lkLT5tY2MgKz0gKGJ1ZlswXSA+PiA0KSAqICAxMDsKKwljaWQtPm1jYyArPSAoYnVmWzFdICYgMHhmKSAqICAxOworCisJaWYgKGJ1ZlsxXSA+PiA0ID09IDB4ZikgeworCQljaWQtPm1uYyA9IChidWZbMl0gJiAweGYpICogMTA7CisJCWNpZC0+bW5jICs9IChidWZbMl0gPj4gNCkgKiAgMTsKKwl9IGVsc2UgeworCQljaWQtPm1uYyA9IChidWZbMl0gJiAweGYpICogMTAwOworCQljaWQtPm1uYyArPSAoYnVmWzJdID4+IDQpICogIDEwOworCQljaWQtPm1uYyArPSAoYnVmWzFdID4+IDQpICogICAxOworCX0KKworCWNpZC0+bGFjID0gbnRvaHMoKigodV9pbnQxNl90ICopJmJ1ZlszXSkpOworCWNpZC0+Y2kgPSBudG9ocygqKCh1X2ludDE2X3QgKikmYnVmWzVdKSk7Cit9CisKKy8qIHBhcnNlIEJDQ0ggaW5mb3JtYXRpb24gSUVJIGZyb20gd2lyZSBmb3JtYXQgdG8gc3RydWN0IGlwYWNfYmNjaF9pbmZvICovCitpbnQgaXBhY19wYXJzZV9iY2NoX2luZm8oc3RydWN0IGlwYWNfYmNjaF9pbmZvICpiaW5mLCB1X2ludDhfdCAqYnVmKQoreworCXVfaW50OF90ICpjdXIgPSBidWY7CisJdV9pbnQxNl90IGxlbjsKKworCW1lbXNldChiaW5mLCAwLCBzaXplb2YoYmluZikpOworCisJaWYgKGN1clswXSAhPSBOTV9JUEFDX0VJRV9CQ0NIX0lORk8pCisJCXJldHVybiAtRUlOVkFMOworCWN1cisrOworCisJbGVuID0gbnRvaHMoKih1X2ludDE2X3QgKiljdXIpOworCWN1ciArPSAyOworCisJYmluZi0+aW5mb190eXBlID0gbnRvaHMoKih1X2ludDE2X3QgKiljdXIpOworCWN1ciArPSAyOworCisJaWYgKGJpbmYtPmluZm9fdHlwZSAmIElQQUNfQklORl9GUkVRX0VSUl9RVUFMKQorCQliaW5mLT5mcmVxX3F1YWwgPSAqY3VyID4+IDI7CisKKwliaW5mLT5hcmZjbiA9ICpjdXIrKyAmIDMgPDwgODsKKwliaW5mLT5hcmZjbiB8PSAqY3VyKys7CisKKwlpZiAoYmluZi0+aW5mb190eXBlICYgSVBBQ19CSU5GX1JYTEVWKQorCQliaW5mLT5yeF9sZXYgPSAqY3VyICYgMHgzZjsKKwljdXIrKzsKKworCWlmIChiaW5mLT5pbmZvX3R5cGUgJiBJUEFDX0JJTkZfUlhRVUFMKQorCQliaW5mLT5yeF9xdWFsID0gKmN1ciAmIDB4NzsKKwljdXIrKzsKKworCWlmIChiaW5mLT5pbmZvX3R5cGUgJiBJUEFDX0JJTkZfRlJFUV9FUlJfUVVBTCkKKwkJYmluZi0+ZnJlcV9lcnIgPSBudG9ocygqKHVfaW50MTZfdCAqKWN1cik7CisJY3VyICs9IDI7CisKKwlpZiAoYmluZi0+aW5mb190eXBlICYgSVBBQ19CSU5GX0ZSQU1FX09GRlNFVCkKKwkJYmluZi0+ZnJhbWVfb2Zmc2V0ID0gbnRvaHMoKih1X2ludDE2X3QgKiljdXIpOworCWN1ciArPSAyOworCisJaWYgKGJpbmYtPmluZm9fdHlwZSAmIElQQUNfQklORl9GUkFNRV9OUl9PRkZTRVQpCisJCWJpbmYtPmZyYW1lX25yX29mZnNldCA9IG50b2hsKCoodV9pbnQzMl90ICopY3VyKTsKKwljdXIgKz0gNDsKKworCWlmIChiaW5mLT5pbmZvX3R5cGUgJiBJUEFDX0JJTkZfQlNJQykKKwkJYmluZi0+YnNpYyA9ICpjdXIgJiAweDNmOworCWN1cisrOworCisJaXBhY19wYXJzZV9jZ2koJmJpbmYtPmNnaSwgY3VyKTsKKwljdXIgKz0gNzsKKworCWlmIChiaW5mLT5pbmZvX3R5cGUgJiBJUEFDX0JJTkZfTkVJR0hfQkFfU0kyKSB7CisJCW1lbWNweShiaW5mLT5iYV9saXN0X3NpMiwgY3VyLCBzaXplb2YoYmluZi0+YmFfbGlzdF9zaTIpKTsKKwkJY3VyICs9IHNpemVvZihiaW5mLT5iYV9saXN0X3NpMik7CisJfQorCisJaWYgKGJpbmYtPmluZm9fdHlwZSAmIElQQUNfQklORl9ORUlHSF9CQV9TSTJiaXMpIHsKKwkJbWVtY3B5KGJpbmYtPmJhX2xpc3Rfc2kyYmlzLCBjdXIsCisJCQlzaXplb2YoYmluZi0+YmFfbGlzdF9zaTJiaXMpKTsKKwkJY3VyICs9IHNpemVvZihiaW5mLT5iYV9saXN0X3NpMmJpcyk7CisJfQorCisJaWYgKGJpbmYtPmluZm9fdHlwZSAmIElQQUNfQklORl9ORUlHSF9CQV9TSTJ0ZXIpIHsKKwkJbWVtY3B5KGJpbmYtPmJhX2xpc3Rfc2kydGVyLCBjdXIsCisJCQlzaXplb2YoYmluZi0+YmFfbGlzdF9zaTJ0ZXIpKTsKKwkJY3VyICs9IHNpemVvZihiaW5mLT5iYV9saXN0X3NpMnRlcik7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9hYmlzX3JzbC5jIGIvb3BlbmJzYy9zcmMvYWJpc19yc2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MGU2NGNmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYWJpc19yc2wuYwpAQCAtMCwwICsxLDE2ODggQEAKKy8qIEdTTSBSYWRpbyBTaWduYWxsaW5nIExpbmsgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZSAKKyAqIDNHUFAgVFMgMDguNTggdmVyc2lvbiA4LjYuMCBSZWxlYXNlIDE5OTkgLyBFVFNJIFRTIDEwMCA1OTYgVjguNi4wICovCisKKy8qIChDKSAyMDA4LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ic2NfcmxsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcGFnaW5nLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21lYXNfcmVwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ydHBfcHJveHkuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9yc2wuaD4KKworI2RlZmluZSBSU0xfQUxMT0NfU0laRQkJMTAyNAorI2RlZmluZSBSU0xfQUxMT0NfSEVBRFJPT00JMTI4CisKKyNkZWZpbmUgTUFYKGEsIGIpIChhKSA+PSAoYikgPyAoYSkgOiAoYikKKworc3RhdGljIHVfaW50OF90IG1kaXNjX2J5X21zZ3R5cGUodV9pbnQ4X3QgbXNnX3R5cGUpCit7CisJLyogbWFzayBvZmYgdGhlIHRyYW5zcGFyZW50IGJpdCA/ICovCisJbXNnX3R5cGUgJj0gMHhmZTsKKworCWlmICgobXNnX3R5cGUgJiAweGYwKSA9PSAweDAwKQorCQlyZXR1cm4gQUJJU19SU0xfTURJU0NfUkxMOworCWlmICgobXNnX3R5cGUgJiAweGYwKSA9PSAweDEwKSB7CisJCWlmIChtc2dfdHlwZSA+PSAweDE5ICYmIG1zZ190eXBlIDw9IDB4MjIpCisJCQlyZXR1cm4gQUJJU19SU0xfTURJU0NfVFJYOworCQllbHNlCisJCQlyZXR1cm4gQUJJU19SU0xfTURJU0NfQ09NX0NIQU47CisJfQorCWlmICgobXNnX3R5cGUgJiAweGUwKSA9PSAweDIwKQorCQlyZXR1cm4gQUJJU19SU0xfTURJU0NfREVEX0NIQU47CisJCisJcmV0dXJuIEFCSVNfUlNMX01ESVNDX0xPQzsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGluaXRfZGNoYW5faGRyKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoLAorCQkJCSAgdV9pbnQ4X3QgbXNnX3R5cGUpCit7CisJZGgtPmMubXNnX2Rpc2NyID0gbWRpc2NfYnlfbXNndHlwZShtc2dfdHlwZSk7CisJZGgtPmMubXNnX3R5cGUgPSBtc2dfdHlwZTsKKwlkaC0+aWVfY2hhbiA9IFJTTF9JRV9DSEFOX05SOworfQorCisvKiBkZXRlcm1pbmUgbG9naWNhbCBjaGFubmVsIGJhc2VkIG9uIFRSWCBhbmQgY2hhbm5lbCBudW1iZXIgSUUgKi8KK3N0cnVjdCBnc21fbGNoYW4gKmxjaGFuX2xvb2t1cChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgY2hhbl9ucikKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwl1X2ludDhfdCB0c19uciA9IGNoYW5fbnIgJiAweDA3OworCXVfaW50OF90IGNiaXRzID0gY2hhbl9uciA+PiAzOworCXVfaW50OF90IGxjaF9pZHg7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9ICZ0cngtPnRzW3RzX25yXTsKKworCWlmIChjYml0cyA9PSAweDAxKSB7CisJCWxjaF9pZHggPSAwOwkvKiBUQ0gvRiAqLwkKKwkJaWYgKHRzLT5wY2hhbiAhPSBHU01fUENIQU5fVENIX0YgJiYKKwkJICAgIHRzLT5wY2hhbiAhPSBHU01fUENIQU5fUERDSCAmJgorCQkgICAgdHMtPnBjaGFuICE9IEdTTV9QQ0hBTl9UQ0hfRl9QRENIKQorCQkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiY2hhbl9ucj0weCUwMnggYnV0IHBjaGFuPSV1XG4iLAorCQkJCWNoYW5fbnIsIHRzLT5wY2hhbik7CisJfSBlbHNlIGlmICgoY2JpdHMgJiAweDFlKSA9PSAweDAyKSB7CisJCWxjaF9pZHggPSBjYml0cyAmIDB4MTsJLyogVENIL0ggKi8KKwkJaWYgKHRzLT5wY2hhbiAhPSBHU01fUENIQU5fVENIX0gpCisJCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJjaGFuX25yPTB4JTAyeCBidXQgcGNoYW49JXVcbiIsCisJCQkJY2hhbl9uciwgdHMtPnBjaGFuKTsKKwl9IGVsc2UgaWYgKChjYml0cyAmIDB4MWMpID09IDB4MDQpIHsKKwkJbGNoX2lkeCA9IGNiaXRzICYgMHgzOwkvKiBTRENDSC80ICovCisJCWlmICh0cy0+cGNoYW4gIT0gR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0KQorCQkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiY2hhbl9ucj0weCUwMnggYnV0IHBjaGFuPSV1XG4iLAorCQkJCWNoYW5fbnIsIHRzLT5wY2hhbik7CisJfSBlbHNlIGlmICgoY2JpdHMgJiAweDE4KSA9PSAweDA4KSB7CisJCWxjaF9pZHggPSBjYml0cyAmIDB4NzsJLyogU0RDQ0gvOCAqLworCQlpZiAodHMtPnBjaGFuICE9IEdTTV9QQ0hBTl9TRENDSDhfU0FDQ0g4QykKKwkJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgImNoYW5fbnI9MHglMDJ4IGJ1dCBwY2hhbj0ldVxuIiwKKwkJCQljaGFuX25yLCB0cy0+cGNoYW4pOworCX0gZWxzZSBpZiAoY2JpdHMgPT0gMHgxMCB8fCBjYml0cyA9PSAweDExIHx8IGNiaXRzID09IDB4MTIpIHsKKwkJbGNoX2lkeCA9IDA7CisJCWlmICh0cy0+cGNoYW4gIT0gR1NNX1BDSEFOX0NDQ0ggJiYKKwkJICAgIHRzLT5wY2hhbiAhPSBHU01fUENIQU5fQ0NDSF9TRENDSDQpCisJCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJjaGFuX25yPTB4JTAyeCBidXQgcGNoYW49JXVcbiIsCisJCQkJY2hhbl9uciwgdHMtPnBjaGFuKTsKKwkJLyogRklYTUU6IHdlIHNob3VsZCBub3QgcmV0dXJuIGZpcnN0IHNkY2NoNCAhISEgKi8KKwl9IGVsc2UgeworCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJ1bmtub3duIGNoYW5fbnI9MHglMDJ4XG4iLCBjaGFuX25yKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbGNoYW4gPSAmdHMtPmxjaGFuW2xjaF9pZHhdOworCWRlYnVnX3NldF9jb250ZXh0KEJTQ19DVFhfTENIQU4sIGxjaGFuKTsKKwlkZWJ1Z19zZXRfY29udGV4dChCU0NfQ1RYX1NVQlNDUiwgbGNoYW4tPnN1YnNjcik7CisKKwlyZXR1cm4gbGNoYW47Cit9CisKKy8qIFNlZSBUYWJsZSAxMC41LjI1IG9mIEdTTTA0LjA4ICovCit1X2ludDhfdCBsY2hhbjJjaGFuX25yKGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMgPSBsY2hhbi0+dHM7CisJdV9pbnQ4X3QgY2JpdHMsIGNoYW5fbnI7CisKKwlzd2l0Y2ggKHRzLT5wY2hhbikgeworCWNhc2UgR1NNX1BDSEFOX1RDSF9GOgorCWNhc2UgR1NNX1BDSEFOX1BEQ0g6CisJY2FzZSBHU01fUENIQU5fVENIX0ZfUERDSDoKKwkJY2JpdHMgPSAweDAxOworCQlicmVhazsKKwljYXNlIEdTTV9QQ0hBTl9UQ0hfSDoKKwkJY2JpdHMgPSAweDAyOworCQljYml0cyArPSBsY2hhbi0+bnI7CisJCWJyZWFrOworCWNhc2UgR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0OgorCQljYml0cyA9IDB4MDQ7CisJCWNiaXRzICs9IGxjaGFuLT5ucjsKKwkJYnJlYWs7CisJY2FzZSBHU01fUENIQU5fU0RDQ0g4X1NBQ0NIOEM6CisJCWNiaXRzID0gMHgwODsKKwkJY2JpdHMgKz0gbGNoYW4tPm5yOworCQlicmVhazsKKwlkZWZhdWx0OgorCWNhc2UgR1NNX1BDSEFOX0NDQ0g6CisJCWNiaXRzID0gMHgxMDsKKwkJYnJlYWs7CisJfQorCisJY2hhbl9uciA9IChjYml0cyA8PCAzKSB8ICh0cy0+bnIgJiAweDcpOworCisJcmV0dXJuIGNoYW5fbnI7Cit9CisKKy8qIEFzIHBlciBUUyAwMy4wMyBTZWN0aW9uIDIuMiwgdGhlIElNU0kgaGFzICdub3QgbW9yZSB0aGFuIDE1IGRpZ2l0cycgKi8KK3VfaW50NjRfdCBzdHJfdG9faW1zaShjb25zdCBjaGFyICppbXNpX3N0cikKK3sKKwl1X2ludDY0X3QgcmV0OworCisJcmV0ID0gc3RydG91bGwoaW1zaV9zdHIsIE5VTEwsIDEwKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIFRhYmxlIDUgQ2xhdXNlIDcgVFMgMDUuMDIgKi8KK3Vuc2lnbmVkIGludCBuX3BhZ19ibG9ja3MoaW50IGJzX2NjY2hfc2RjY2hfY29tYiwgdW5zaWduZWQgaW50IGJzX2FnX2Jsa3NfcmVzKQoreworCWlmICghYnNfY2NjaF9zZGNjaF9jb21iKQorCQlyZXR1cm4gOSAtIGJzX2FnX2Jsa3NfcmVzOworCWVsc2UKKwkJcmV0dXJuIDMgLSBic19hZ19ibGtzX3JlczsKK30KKworLyogQ2hhcHRlciA2LjUuMiBvZiBUUyAwNS4wMiAqLwordW5zaWduZWQgaW50IGdldF9jY2NoX2dyb3VwKHVfaW50NjRfdCBpbXNpLCB1bnNpZ25lZCBpbnQgYnNfY2NfY2hhbnMsCisJCQkgICAgdW5zaWduZWQgaW50IG5fcGFnX2Jsb2NrcykKK3sKKwlyZXR1cm4gKGltc2kgJSAxMDAwKSAlIChic19jY19jaGFucyAqIG5fcGFnX2Jsb2NrcykgLyBuX3BhZ19ibG9ja3M7Cit9CisKKy8qIENoYXB0ZXIgNi41LjIgb2YgVFMgMDUuMDIgKi8KK3Vuc2lnbmVkIGludCBnZXRfcGFnaW5nX2dyb3VwKHVfaW50NjRfdCBpbXNpLCB1bnNpZ25lZCBpbnQgYnNfY2NfY2hhbnMsCisJCQkgICAgICBpbnQgbl9wYWdfYmxvY2tzKQoreworCXJldHVybiAoaW1zaSAlIDEwMDApICUgKGJzX2NjX2NoYW5zICogbl9wYWdfYmxvY2tzKSAlIG5fcGFnX2Jsb2NrczsKK30KKworc3RhdGljIHN0cnVjdCBtc2diICpyc2xfbXNnYl9hbGxvYyh2b2lkKQoreworCXJldHVybiBtc2diX2FsbG9jX2hlYWRyb29tKFJTTF9BTExPQ19TSVpFLCBSU0xfQUxMT0NfSEVBRFJPT00sCisJCQkJICAgIlJTTCIpOworfQorCisjZGVmaW5lIE1BQ0JMT0NLX1NJWkUJMjMKK3N0YXRpYyB2b2lkIHBhZF9tYWNibG9jayh1X2ludDhfdCAqb3V0LCBjb25zdCB1X2ludDhfdCAqaW4sIGludCBsZW4pCit7CisJbWVtY3B5KG91dCwgaW4sIGxlbik7CisKKwlpZiAobGVuIDwgTUFDQkxPQ0tfU0laRSkKKwkJbWVtc2V0KG91dCtsZW4sIDB4MmIsIE1BQ0JMT0NLX1NJWkUtbGVuKTsKK30KKworLyogQ2hhcHRlciA5LjMuNzogRW5jcnlwdGlvbiBJbmZvcm1hdGlvbiAqLworc3RhdGljIGludCBidWlsZF9lbmNyX2luZm8odV9pbnQ4X3QgKm91dCwgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJKm91dCsrID0gbGNoYW4tPmVuY3IuYWxnX2lkICYgMHhmZjsKKwlpZiAobGNoYW4tPmVuY3Iua2V5X2xlbikKKwkJbWVtY3B5KG91dCwgbGNoYW4tPmVuY3Iua2V5LCBsY2hhbi0+ZW5jci5rZXlfbGVuKTsKKwlyZXR1cm4gbGNoYW4tPmVuY3Iua2V5X2xlbiArIDE7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X3JzbF9jYXVzZShpbnQgbHZsLCBjb25zdCB1X2ludDhfdCAqY2F1c2VfdiwgdV9pbnQ4X3QgY2F1c2VfbGVuKQoreworCWludCBpOworCisJTE9HUEMoRFJTTCwgbHZsLCAiQ0FVU0U9MHglMDJ4KCVzKSAiLAorCQljYXVzZV92WzBdLCByc2xfZXJyX25hbWUoY2F1c2VfdlswXSkpOworCWZvciAoaSA9IDE7IGkgPCBjYXVzZV9sZW4tMTsgaSsrKSAKKwkJTE9HUEMoRFJTTCwgbHZsLCAiJTAyeCAiLCBjYXVzZV92W2ldKTsKK30KKworLyogU2VuZCBhIEJDQ0hfSU5GTyBtZXNzYWdlIGFzIHBlciBDaGFwdGVyIDguNS4xICovCitpbnQgcnNsX2JjY2hfaW5mbyhzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgdV9pbnQ4X3QgdHlwZSwKKwkJICBjb25zdCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbikKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YqZGgpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfQkNDSF9JTkZPKTsKKwlkaC0+Y2hhbl9uciA9IFJTTF9DSEFOX0JDQ0g7CisKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9TWVNJTkZPX1RZUEUsIHR5cGUpOworCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9GVUxMX0JDQ0hfSU5GTywgbGVuLCBkYXRhKTsKKworCW1zZy0+dHJ4ID0gdHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworaW50IHJzbF9zYWNjaF9maWxsaW5nKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCB0eXBlLCAKKwkJICAgICAgY29uc3QgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IGFiaXNfcnNsX2NvbW1vbl9oZHIgKmNoOworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCisJY2ggPSAoc3RydWN0IGFiaXNfcnNsX2NvbW1vbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmNoKSk7CisJY2gtPm1zZ19kaXNjciA9IEFCSVNfUlNMX01ESVNDX1RSWDsKKwljaC0+bXNnX3R5cGUgPSBSU0xfTVRfU0FDQ0hfRklMTDsKKworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX1NZU0lORk9fVFlQRSwgdHlwZSk7CisJbXNnYl90bDE2dl9wdXQobXNnLCBSU0xfSUVfTDNfSU5GTywgbGVuLCBkYXRhKTsKKworCW1zZy0+dHJ4ID0gdHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworaW50IHJzbF9jaGFuX2JzX3Bvd2VyX2N0cmwoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVuc2lnbmVkIGludCBmcGMsIGludCBkYikKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXVfaW50OF90IGNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKworCWRiID0gYWJzKGRiKTsKKwlpZiAoZGIgPiAzMCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltc2cgPSByc2xfbXNnYl9hbGxvYygpOworCisJbGNoYW4tPmJzX3Bvd2VyID0gZGIvMjsKKwlpZiAoZnBjKQorCQlsY2hhbi0+YnNfcG93ZXIgfD0gMHgxMDsKKwkKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfQlNfUE9XRVJfQ09OVFJPTCk7CisJZGgtPmNoYW5fbnIgPSBjaGFuX25yOworCisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfQlNfUE9XRVIsIGxjaGFuLT5ic19wb3dlcik7CisKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworaW50IHJzbF9jaGFuX21zX3Bvd2VyX2N0cmwoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVuc2lnbmVkIGludCBmcGMsIGludCBkYm0pCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwl1X2ludDhfdCBjaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisJaW50IGN0bF9sdmw7CisKKwljdGxfbHZsID0gbXNfcHdyX2N0bF9sdmwobGNoYW4tPnRzLT50cngtPmJ0cy0+YmFuZCwgZGJtKTsKKwlpZiAoY3RsX2x2bCA8IDApCisJCXJldHVybiBjdGxfbHZsOworCisJbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKworCWxjaGFuLT5tc19wb3dlciA9IGN0bF9sdmw7CisKKwlpZiAoZnBjKQorCQlsY2hhbi0+bXNfcG93ZXIgfD0gMHgyMDsKKwkKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfTVNfUE9XRVJfQ09OVFJPTCk7CisJZGgtPmNoYW5fbnIgPSBjaGFuX25yOworCisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfTVNfUE9XRVIsIGxjaGFuLT5tc19wb3dlcik7CisKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworc3RhdGljIGludCBjaGFubmVsX21vZGVfZnJvbV9sY2hhbihzdHJ1Y3QgcnNsX2llX2NoYW5fbW9kZSAqY20sCisJCQkJICAgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJbWVtc2V0KGNtLCAwLCBzaXplb2YoY20pKTsKKworCS8qIEZJWE1FOiB3aGF0IHRvIGRvIHdpdGggZGF0YSBjYWxscyA/ICovCisJY20tPmR0eF9kdHUgPSAweDAwOworCisJLyogc2V0IFRDSCBTcGVlY2gvRGF0YSAqLworCWNtLT5zcGRfaW5kID0gbGNoYW4tPnJzbF9jbW9kZTsKKworCWlmIChsY2hhbi0+cnNsX2Ntb2RlID09IFJTTF9DTU9EX1NQRF9TSUdOICYmCisJICAgIGxjaGFuLT50Y2hfbW9kZSAhPSBHU000OF9DTU9ERV9TSUdOKQorCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICJ1bnN1cHBvcnRlZDogcnNsX21vZGUgPT0gc2lnbmFsbGluZywgIgorCQkJImJ1dCB0Y2hfbW9kZSAhPSBzaWduYWxsaW5nXG4iKTsKKworCXN3aXRjaCAobGNoYW4tPnR5cGUpIHsKKwljYXNlIEdTTV9MQ0hBTl9TRENDSDoKKwkJY20tPmNoYW5fcnQgPSBSU0xfQ01PRF9DUlRfU0RDQ0g7CisJCWJyZWFrOworCWNhc2UgR1NNX0xDSEFOX1RDSF9GOgorCQljbS0+Y2hhbl9ydCA9IFJTTF9DTU9EX0NSVF9UQ0hfQm07CisJCWJyZWFrOworCWNhc2UgR1NNX0xDSEFOX1RDSF9IOgorCQljbS0+Y2hhbl9ydCA9IFJTTF9DTU9EX0NSVF9UQ0hfTG07CisJCWJyZWFrOworCWNhc2UgR1NNX0xDSEFOX05PTkU6CisJY2FzZSBHU01fTENIQU5fVU5LTk9XTjoKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlzd2l0Y2ggKGxjaGFuLT50Y2hfbW9kZSkgeworCWNhc2UgR1NNNDhfQ01PREVfU0lHTjoKKwkJY20tPmNoYW5fcmF0ZSA9IDA7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfQ01PREVfU1BFRUNIX1YxOgorCQljbS0+Y2hhbl9yYXRlID0gUlNMX0NNT0RfU1BfR1NNMTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9DTU9ERV9TUEVFQ0hfRUZSOgorCQljbS0+Y2hhbl9yYXRlID0gUlNMX0NNT0RfU1BfR1NNMjsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9DTU9ERV9TUEVFQ0hfQU1SOgorCQljbS0+Y2hhbl9yYXRlID0gUlNMX0NNT0RfU1BfR1NNMzsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9DTU9ERV9EQVRBXzE0azU6CisJCWNtLT5jaGFuX3JhdGUgPSBSU0xfQ01PRF9TUF9OVF8xNGs1OworCQlicmVhazsKKwljYXNlIEdTTTQ4X0NNT0RFX0RBVEFfMTJrMDoKKwkJY20tPmNoYW5fcmF0ZSA9IFJTTF9DTU9EX1NQX05UXzEyazA7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfQ01PREVfREFUQV82azA6CisJCWNtLT5jaGFuX3JhdGUgPSBSU0xfQ01PRF9TUF9OVF82azA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCisvKiBDaGFwdGVyIDguNC4xICovCisjaWYgMAoraW50IHJzbF9jaGFuX2FjdGl2YXRlKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCBjaGFuX25yLAorCQkgICAgICB1X2ludDhfdCBhY3RfdHlwZSwKKwkJICAgICAgc3RydWN0IHJzbF9pZV9jaGFuX21vZGUgKmNoYW5fbW9kZSwKKwkJICAgICAgc3RydWN0IHJzbF9pZV9jaGFuX2lkZW50ICpjaGFuX2lkZW50LAorCQkgICAgICB1X2ludDhfdCBic19wb3dlciwgdV9pbnQ4X3QgbXNfcG93ZXIsCisJCSAgICAgIHVfaW50OF90IHRhKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX0NIQU5fQUNUSVYpOworCWRoLT5jaGFuX25yID0gY2hhbl9ucjsKKworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0FDVF9UWVBFLCBhY3RfdHlwZSk7CisJLyogRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBQaGFzZSAxICovCisJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0NIQU5fTU9ERSwgc2l6ZW9mKCpjaGFuX21vZGUpLAorCQkgICAgICh1X2ludDhfdCAqKSBjaGFuX21vZGUpOworCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9DSEFOX0lERU5ULCA0LAorCQkgICAgICh1X2ludDhfdCAqKSBjaGFuX2lkZW50KTsKKyNpZiAwCisJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0VOQ1JfSU5GTywgMSwKKwkJICAgICAodV9pbnQ4X3QgKikgJmVuY3JfaW5mbyk7CisjZW5kaWYKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9CU19QT1dFUiwgYnNfcG93ZXIpOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX01TX1BPV0VSLCBtc19wb3dlcik7CisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfVElNSU5HX0FEVkFOQ0UsIHRhKTsKKworCW1zZy0+dHJ4ID0gdHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKyNlbmRpZgorCitpbnQgcnNsX2NoYW5fYWN0aXZhdGVfbGNoYW4oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGFjdF90eXBlLCAKKwkJCSAgICB1X2ludDhfdCB0YSwgdV9pbnQ4X3QgaG9fcmVmKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXN0cnVjdCBtc2diICptc2c7CisJaW50IHJjOworCisJdV9pbnQ4X3QgY2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCXVfaW50MTZfdCBhcmZjbiA9IGxjaGFuLT50cy0+dHJ4LT5hcmZjbjsKKwlzdHJ1Y3QgcnNsX2llX2NoYW5fbW9kZSBjbTsKKwlzdHJ1Y3QgcnNsX2llX2NoYW5faWRlbnQgY2k7CisKKwlyYyA9IGNoYW5uZWxfbW9kZV9mcm9tX2xjaGFuKCZjbSwgbGNoYW4pOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCW1lbXNldCgmY2ksIDAsIHNpemVvZihjaSkpOworCWNpLmNoYW5fZGVzYy5pZWkgPSAweDY0OworCWNpLmNoYW5fZGVzYy5jaGFuX25yID0gY2hhbl9ucjsKKwljaS5jaGFuX2Rlc2Mub2N0MyA9IChsY2hhbi0+dHMtPnRyeC0+YnRzLT50c2MgPDwgNSkgfCAoKGFyZmNuICYgMHgzZmYpID4+IDgpOworCWNpLmNoYW5fZGVzYy5vY3Q0ID0gYXJmY24gJiAweGZmOworCisJbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfQ0hBTl9BQ1RJVik7CisJZGgtPmNoYW5fbnIgPSBjaGFuX25yOworCisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfQUNUX1RZUEUsIGFjdF90eXBlKTsKKwltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfQ0hBTl9NT0RFLCBzaXplb2YoY20pLAorCQkgICAgICh1X2ludDhfdCAqKSAmY20pOworCS8qIEZvciBjb21wYXRpYmlsaXR5IHdpdGggUGhhc2UgMSAqLworCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9DSEFOX0lERU5ULCA0LAorCQkgICAgICh1X2ludDhfdCAqKSAmY2kpOworCisJaWYgKGxjaGFuLT5lbmNyLmFsZ19pZCA+IFJTTF9FTkNfQUxHX0E1KDApKSB7CisJCXVfaW50OF90IGVuY3JfaW5mb1tNQVhfQTVfS0VZX0xFTisyXTsKKwkJcmMgPSBidWlsZF9lbmNyX2luZm8oZW5jcl9pbmZvLCBsY2hhbik7CisJCWlmIChyYyA+IDApCisJCQltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfRU5DUl9JTkZPLCByYywgZW5jcl9pbmZvKTsKKwl9CisKKwlzd2l0Y2ggKGFjdF90eXBlKSB7CisJY2FzZSBSU0xfQUNUX0lOVEVSX0FTWU5DOgorCWNhc2UgUlNMX0FDVF9JTlRFUl9TWU5DOgorCQltc2diX3R2X3B1dChtc2csIFJTTF9JRV9IQU5ET19SRUYsIGhvX3JlZik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0JTX1BPV0VSLCBsY2hhbi0+YnNfcG93ZXIpOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX01TX1BPV0VSLCBsY2hhbi0+bXNfcG93ZXIpOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX1RJTUlOR19BRFZBTkNFLCB0YSk7CisKKwlpZiAobGNoYW4tPnRjaF9tb2RlID09IEdTTTQ4X0NNT0RFX1NQRUVDSF9BTVIpCisJCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9NUl9DT05GSUcsIHNpemVvZihsY2hhbi0+bXJfY29uZiksCisJCQkgICAgICh1X2ludDhfdCAqKSAmbGNoYW4tPm1yX2NvbmYpOworCisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIENoYXB0ZXIgOC40Ljk6IE1vZGlmeSBjaGFubmVsIG1vZGUgb24gQlRTIHNpZGUgKi8KK2ludCByc2xfY2hhbl9tb2RlX21vZGlmeV9yZXEoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlpbnQgcmM7CisKKwl1X2ludDhfdCBjaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisJc3RydWN0IHJzbF9pZV9jaGFuX21vZGUgY207CisKKwlyYyA9IGNoYW5uZWxfbW9kZV9mcm9tX2xjaGFuKCZjbSwgbGNoYW4pOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCW1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX01PREVfTU9ESUZZX1JFUSk7CisJZGgtPmNoYW5fbnIgPSBjaGFuX25yOworCisJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0NIQU5fTU9ERSwgc2l6ZW9mKGNtKSwKKwkJICAgICAodV9pbnQ4X3QgKikgJmNtKTsKKworCWlmIChsY2hhbi0+ZW5jci5hbGdfaWQgPiBSU0xfRU5DX0FMR19BNSgwKSkgeworCQl1X2ludDhfdCBlbmNyX2luZm9bTUFYX0E1X0tFWV9MRU4rMl07CisJCXJjID0gYnVpbGRfZW5jcl9pbmZvKGVuY3JfaW5mbywgbGNoYW4pOworCQlpZiAocmMgPiAwKQorCQkJbXNnYl90bHZfcHV0KG1zZywgUlNMX0lFX0VOQ1JfSU5GTywgcmMsIGVuY3JfaW5mbyk7CisJfQorCisJaWYgKGxjaGFuLT50Y2hfbW9kZSA9PSBHU000OF9DTU9ERV9TUEVFQ0hfQU1SKSB7CisJCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9NUl9DT05GSUcsIHNpemVvZihsY2hhbi0+bXJfY29uZiksCisJCQkgICAgICh1X2ludDhfdCAqKSAmbGNoYW4tPm1yX2NvbmYpOworCX0KKworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCisvKiBDaGFwdGVyIDguNC42OiBTZW5kIHRoZSBlbmNyeXB0aW9uIGNvbW1hbmQgd2l0aCBnaXZlbiBMMyBpbmZvICovCitpbnQgcnNsX2VuY3J5cHRpb25fY21kKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOworCXVfaW50OF90IGNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKwl1X2ludDhfdCBlbmNyX2luZm9bTUFYX0E1X0tFWV9MRU4rMl07CisJdV9pbnQ4X3QgbDNfbGVuID0gbXNnLT5sZW47CisJaW50IHJjOworCisJLyogRmlyc3QgcHVzaCB0aGUgTDMgSUUgdGFnIGFuZCBsZW5ndGggKi8KKwltc2diX3R2MTZfcHVzaChtc2csIFJTTF9JRV9MM19JTkZPLCBsM19sZW4pOworCisJLyogdGhlbiB0aGUgbGluayBpZGVudGlmaWVyIChTQVBJMCwgbWFpbiBzaWduIGxpbmspICovCisJbXNnYl90dl9wdXNoKG1zZywgUlNMX0lFX0xJTktfSURFTlQsIDApOworCisJLyogdGhlbiBlbmNyeXB0aW9uIGluZm9ybWF0aW9uICovCisJcmMgPSBidWlsZF9lbmNyX2luZm8oZW5jcl9pbmZvLCBsY2hhbik7CisJaWYgKHJjIDw9IDApCisJCXJldHVybiByYzsKKwltc2diX3Rsdl9wdXNoKG1zZywgUlNMX0lFX0VOQ1JfSU5GTywgcmMsIGVuY3JfaW5mbyk7CisKKwkvKiBhbmQgZmluYWxseSB0aGUgRENIQU4gaGVhZGVyICovCisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1c2gobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9FTkNSX0NNRCk7CisJZGgtPmNoYW5fbnIgPSBjaGFuX25yOworCisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIENoYXB0ZXIgOC40LjUgLyA0LjY6IERlYWN0aXZhdGUgdGhlIFNBQ0NIIGFmdGVyIDA0LjA4IFJSIENIQU4gUkVMRUFTRSAqLworaW50IHJzbF9kZWFjdF9zYWNjaChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9ERUFDVElWQVRFX1NBQ0NIKTsKKwlkaC0+Y2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlERUJVR1AoRFJTTCwgIiVzIERFQUNUaXZhdGUgU0FDQ0ggQ01EXG4iLCBnc21fbGNoYW5fbmFtZShsY2hhbikpOworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworLyogQ2hhcHRlciA4LjQuMTQgLyA0Ljc6IFRlbGwgQlRTIHRvIHJlbGVhc2UgdGhlIHJhZGlvIGNoYW5uZWwgKi8KK2ludCByc2xfcmZfY2hhbl9yZWxlYXNlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoOworCXN0cnVjdCBtc2diICptc2cgPSByc2xfbXNnYl9hbGxvYygpOworCisJZGggPSAoc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZGgpKTsKKwlpbml0X2RjaGFuX2hkcihkaCwgUlNMX01UX1JGX0NIQU5fUkVMKTsKKwlkaC0+Y2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlERUJVR1AoRFJTTCwgIiVzIFJGIENoYW5uZWwgUmVsZWFzZSBDTURcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSk7CisKKwkvKiBCVFMgd2lsbCByZXNwb25kIGJ5IFJGIENIQU4gUkVMIEFDSyAqLworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKK2ludCByc2xfcGFnaW5nX2NtZChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDhfdCBwYWdpbmdfZ3JvdXAsIHVfaW50OF90IGxlbiwKKwkJICAgdV9pbnQ4X3QgKm1zX2lkZW50LCB1X2ludDhfdCBjaGFuX25lZWRlZCkKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKworCWRoID0gKHN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmRoKSk7CisJaW5pdF9kY2hhbl9oZHIoZGgsIFJTTF9NVF9QQUdJTkdfQ01EKTsKKwlkaC0+Y2hhbl9uciA9IFJTTF9DSEFOX1BDSF9BR0NIOworCisJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfUEFHSU5HX0dST1VQLCBwYWdpbmdfZ3JvdXApOworCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9NU19JREVOVElUWSwgbGVuLTIsIG1zX2lkZW50KzIpOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0NIQU5fTkVFREVELCBjaGFuX25lZWRlZCk7CisKKwltc2ctPnRyeCA9IGJ0cy0+YzA7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCitpbnQgcnNsX3BhZ2luZ19jbWRfc3Vic2NyKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGNoYW5fbmVlZCwKKwkJCSAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisjaWYgMAorCXVfaW50OF90IG1pWzEyOF07CisJdW5zaWduZWQgaW50IG1pX2xlbjsKKwl1X2ludDhfdCBwYWdpbmdfZ3JvdXA7CisjZW5kaWYKKworCXJldHVybiAtMTsKK30KKworaW50IGltc2lfc3RyMmJjZCh1X2ludDhfdCAqYmNkX291dCwgY29uc3QgY2hhciAqc3RyX2luKQoreworCWludCBpLCBsZW4gPSBzdHJsZW4oc3RyX2luKTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpbnQgbnVtID0gc3RyX2luW2ldIC0gMHgzMDsKKwkJaWYgKG51bSA8IDAgfHwgbnVtID4gOSkKKwkJCXJldHVybiAtMTsKKwkJaWYgKGkgJSAyID09IDApCisJCQliY2Rfb3V0W2kvMl0gPSBudW07CisJCWVsc2UKKwkJCWJjZF9vdXRbaS8yXSB8PSAobnVtIDw8IDQpOworCX0KKworCXJldHVybiAwOworfQorCisvKiBDaGFwdGVyIDguNS42ICovCitpbnQgcnNsX2ltbV9hc3NpZ25fY21kKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IGxlbiwgdV9pbnQ4X3QgKnZhbCkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gcnNsX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaDsKKwl1X2ludDhfdCBidWZbTUFDQkxPQ0tfU0laRV07CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfSU1NRURJQVRFX0FTU0lHTl9DTUQpOworCWRoLT5jaGFuX25yID0gUlNMX0NIQU5fUENIX0FHQ0g7CisKKwlzd2l0Y2ggKGJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCW1zZ2JfdGx2X3B1dChtc2csIFJTTF9JRV9JTU1fQVNTX0lORk8sIGxlbiwgdmFsKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJLyogSWYgcGhhc2UgMiwgY29uc3RydWN0IGEgRlVMTF9JTU1fQVNTX0lORk8gKi8KKwkJcGFkX21hY2Jsb2NrKGJ1ZiwgdmFsLCBsZW4pOworCQltc2diX3Rsdl9wdXQobXNnLCBSU0xfSUVfRlVMTF9JTU1fQVNTX0lORk8sIE1BQ0JMT0NLX1NJWkUsIGJ1Zik7CisJCWJyZWFrOworCX0KKworCW1zZy0+dHJ4ID0gYnRzLT5jMDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIFNlbmQgU2llbWVucyBzcGVjaWZpYyBNUyBSRiBQb3dlciBDYXBhYmlsaXR5IEluZGljYXRpb24gKi8KK2ludCByc2xfc2llbWVuc19tcnBjaShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgc3RydWN0IHJzbF9tcnBjaSAqbXJwY2kpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfU0lFTUVOU19NUlBDSSk7CisJZGgtPmMubXNnX2Rpc2NyID0gQUJJU19SU0xfTURJU0NfREVEX0NIQU47CisJZGgtPmNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9TSUVNRU5TX01SUENJLCAqKHVfaW50OF90ICopbXJwY2kpOworCisJREVCVUdQKERSU0wsICIlcyBUWCBTaWVtZW5zIE1SUENJIDB4JTAyeFxuIiwKKwkJZ3NtX2xjaGFuX25hbWUobGNoYW4pLCAqKHVfaW50OF90ICopbXJwY2kpOworCisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKworLyogU2VuZCAiREFUQSBSRVFVRVNUIiBtZXNzYWdlIHdpdGggZ2l2ZW4gTDMgSW5mbyBwYXlsb2FkICovCisvKiBDaGFwdGVyIDguMy4xICovCitpbnQgcnNsX2RhdGFfcmVxdWVzdChzdHJ1Y3QgbXNnYiAqbXNnLCB1X2ludDhfdCBsaW5rX2lkKQoreworCWlmIChtc2ctPmxjaGFuID09IE5VTEwpIHsKKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiY2Fubm90IHNlbmQgREFUQSBSRVFVRVNUIHRvIHVua25vd24gbGNoYW5cbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyc2xfcmxsX3B1c2hfbDMobXNnLCBSU0xfTVRfREFUQV9SRVEsIGxjaGFuMmNoYW5fbnIobXNnLT5sY2hhbiksCisJCQlsaW5rX2lkLCAxKTsKKworCW1zZy0+dHJ4ID0gbXNnLT5sY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIFNlbmQgIkVTVEFCTElTSCBSRVFVRVNUIiBtZXNzYWdlIHdpdGggZ2l2ZW4gTDMgSW5mbyBwYXlsb2FkICovCisvKiBDaGFwdGVyIDguMy4xICovCitpbnQgcnNsX2VzdGFibGlzaF9yZXF1ZXN0KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsaW5rX2lkKQoreworCXN0cnVjdCBtc2diICptc2c7CisKKwltc2cgPSByc2xfcmxsX3NpbXBsZShSU0xfTVRfRVNUX1JFUSwgbGNoYW4yY2hhbl9ucihsY2hhbiksCisJCQkgICAgIGxpbmtfaWQsIDApOworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCisvKiBDaGFwdGVyIDguMy43IFJlcXVlc3QgdGhlIHJlbGVhc2Ugb2YgbXVsdGlmcmFtZSBtb2RlIG9mIFJMTCBjb25uZWN0aW9uLgorICAgVGhpcyBpcyB3aGF0IGhpZ2hlciBsYXllcnMgc2hvdWxkIGNhbGwuICBUaGUgQlRTIHRoZW4gcmVzcG9uZHMgd2l0aAorICAgUkVMRUFTRSBDT05GSVJNLCB3aGljaCB3ZSBpbiB0dXJuIHVzZSB0byB0cmlnZ2VyIFJTTCBDSEFOTkVMIFJFTEVBU0UsCisgICB3aGljaCBpbiB0dXJuIGlzIGFja25vd2xlZGdlZCBieSBSU0wgQ0hBTk5FTCBSRUxFQVNFIEFDSywgd2hpY2ggY2FsbHMKKyAgIGxjaGFuX2ZyZWUoKSAqLworaW50IHJzbF9yZWxlYXNlX3JlcXVlc3Qoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxpbmtfaWQpCit7CisKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCisJbXNnID0gcnNsX3JsbF9zaW1wbGUoUlNMX01UX1JFTF9SRVEsIGxjaGFuMmNoYW5fbnIobGNoYW4pLAorCQkJICAgICBsaW5rX2lkLCAwKTsKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9SRUxFQVNFX01PREUsIDApOwkvKiBub3JtYWwgcmVsZWFzZSAqLworCisJbGNoYW4tPnN0YXRlID0gTENIQU5fU19SRUxfUkVROworCS8qIEZJWE1FOiBzdGFydCBzb21lIHRpbWVyIGluIGNhc2Ugd2UgZG9uJ3QgcmVjZWl2ZSBhIFJFTCBBQ0sgPyAqLworCisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIENoYXB0ZXIgOC40LjI6IENoYW5uZWwgQWN0aXZhdGUgQWNrbm93bGVkZ2UgKi8KK3N0YXRpYyBpbnQgcnNsX3J4X2NoYW5fYWN0X2FjayhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKnJzbGggPSBtc2diX2wyKG1zZyk7CisKKwkvKiBCVFMgaGFzIGNvbmZpcm1lZCBjaGFubmVsIGFjdGl2YXRpb24sIHdlIG5vdyBuZWVkCisJICogdG8gYXNzaWduIHRoZSBhY3RpdmF0ZWQgY2hhbm5lbCB0byB0aGUgTVMgKi8KKwlpZiAocnNsaC0+aWVfY2hhbiAhPSBSU0xfSUVfQ0hBTl9OUikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlpZiAobXNnLT5sY2hhbi0+c3RhdGUgIT0gTENIQU5fU19BQ1RfUkVRKQorCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiJXMgQ0hBTiBBQ1QgQUNLLCBidXQgc3RhdGUgJXNcbiIsCisJCQlnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKSwKKwkJCWdzbV9sY2hhbnNfbmFtZShtc2ctPmxjaGFuLT5zdGF0ZSkpOworCW1zZy0+bGNoYW4tPnN0YXRlID0gTENIQU5fU19BQ1RJVkU7CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfTENIQU4sIFNfTENIQU5fQUNUSVZBVEVfQUNLLCBtc2ctPmxjaGFuKTsKKworCXJldHVybiAwOworfQorCisvKiBDaGFwdGVyIDguNC4zOiBDaGFubmVsIEFjdGl2YXRlIE5BQ0sgKi8KK3N0YXRpYyBpbnQgcnNsX3J4X2NoYW5fYWN0X25hY2soc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKworCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIiVzIENIQU5ORUwgQUNUSVZBVEUgTkFDSyIsCisJCWdzbV9sY2hhbl9uYW1lKG1zZy0+bGNoYW4pKTsKKworCS8qIEJUUyBoYXMgcmVqZWN0ZWQgY2hhbm5lbCBhY3RpdmF0aW9uID8hPyAqLworCWlmIChkaC0+aWVfY2hhbiAhPSBSU0xfSUVfQ0hBTl9OUikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlyc2xfdGx2X3BhcnNlKCZ0cCwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9DQVVTRSkpIHsKKwkJY29uc3QgdV9pbnQ4X3QgKmNhdXNlID0gVExWUF9WQUwoJnRwLCBSU0xfSUVfQ0FVU0UpOworCQlwcmludF9yc2xfY2F1c2UoTE9HTF9FUlJPUiwgY2F1c2UsCisJCQkJVExWUF9MRU4oJnRwLCBSU0xfSUVfQ0FVU0UpKTsKKwkJaWYgKCpjYXVzZSAhPSBSU0xfRVJSX1JDSF9BTFJfQUNUVl9BTExPQykKKwkJCW1zZy0+bGNoYW4tPnN0YXRlID0gTENIQU5fU19OT05FOworCX0gZWxzZQorCQltc2ctPmxjaGFuLT5zdGF0ZSA9IExDSEFOX1NfTk9ORTsKKyAKKwlMT0dQQyhEUlNMLCBMT0dMX0VSUk9SLCAiXG4iKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19MQ0hBTiwgU19MQ0hBTl9BQ1RJVkFURV9OQUNLLCBtc2ctPmxjaGFuKTsKKworCWxjaGFuX2ZyZWUobXNnLT5sY2hhbik7CisJcmV0dXJuIDA7Cit9CisKKy8qIENoYXB0ZXIgOC40LjQ6IENvbm5lY3Rpb24gRmFpbHVyZSBJbmRpY2F0aW9uICovCitzdGF0aWMgaW50IHJzbF9yeF9jb25uX2ZhaWwoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKworCS8qIEZJWE1FOiBwcmludCB3aGljaCBjaGFubmVsICovCisJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIiVzIENPTk5FQ1RJT04gRkFJTDogUkVMRUFTSU5HICIsCisJICAgICBnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKSk7CisKKwlyc2xfdGx2X3BhcnNlKCZ0cCwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX0NBVVNFKSkKKwkJcHJpbnRfcnNsX2NhdXNlKExPR0xfTk9USUNFLCBUTFZQX1ZBTCgmdHAsIFJTTF9JRV9DQVVTRSksCisJCQkJVExWUF9MRU4oJnRwLCBSU0xfSUVfQ0FVU0UpKTsKKworCUxPR1BDKERSU0wsIExPR0xfTk9USUNFLCAiXG4iKTsKKwkvKiBGSVhNRTogb25seSBmcmVlIGl0IGFmdGVyIGNoYW5uZWwgcmVsZWFzZSBBQ0sgKi8KKwlyZXR1cm4gcnNsX3JmX2NoYW5fcmVsZWFzZShtc2ctPmxjaGFuKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfbWVhc19yZXBfdW5pKHN0cnVjdCBnc21fbWVhc19yZXBfdW5pZGlyICptcnUsCisJCQkJY29uc3QgY2hhciAqcHJlZml4KQoreworCURFQlVHUEMoRE1FQVMsICJSWEwtRlVMTC0lcz0lM2RkQm0gUlhMLVNVQi0lcz0lM2RkQm0gIiwKKwkJcHJlZml4LCByeGxldjJkYm0obXJ1LT5mdWxsLnJ4X2xldiksCisJCXByZWZpeCwgcnhsZXYyZGJtKG1ydS0+c3ViLnJ4X2xldikpOworCURFQlVHUEMoRE1FQVMsICJSWFEtRlVMTC0lcz0lZCBSWFEtU1VCLSVzPSVkICIsCisJCXByZWZpeCwgbXJ1LT5mdWxsLnJ4X3F1YWwsIHByZWZpeCwgbXJ1LT5zdWIucnhfcXVhbCk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X21lYXNfcmVwKHN0cnVjdCBnc21fbWVhc19yZXAgKm1yKQoreworCWludCBpOworCisJREVCVUdQKERNRUFTLCAiTUVBU1VSRU1FTlQgUkVTVUxUIE5SPSVkICIsIG1yLT5ucik7CisKKwlpZiAobXItPmZsYWdzICYgTUVBU19SRVBfRl9ETF9EVFgpCisJCURFQlVHUEMoRE1FQVMsICJEVFhkICIpOworCisJcHJpbnRfbWVhc19yZXBfdW5pKCZtci0+dWwsICJ1bCIpOworCURFQlVHUEMoRE1FQVMsICJCU19QT1dFUj0lZCAiLCBtci0+YnNfcG93ZXIpOworCWlmIChtci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX01TX1RPKQorCQlERUJVR1BDKERNRUFTLCAiTVNfVE89JWQgIiwgbXItPm1zX3RpbWluZ19vZmZzZXQpOworCisJaWYgKG1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfTVNfTDEpIHsKKwkJREVCVUdQQyhETUVBUywgIkwxX01TX1BXUj0lM2RkQm0gIiwgbXItPm1zX2wxLnB3cik7CisJCURFQlVHUEMoRE1FQVMsICJMMV9GUEM9JXUgIiwKKwkJCW1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfRlBDID8gMSA6IDApOworCQlERUJVR1BDKERNRUFTLCAiTDFfVEE9JXUgIiwgbXItPm1zX2wxLnRhKTsKKwl9CisKKwlpZiAobXItPmZsYWdzICYgTUVBU19SRVBfRl9VTF9EVFgpCisJCURFQlVHUEMoRE1FQVMsICJEVFh1ICIpOworCWlmIChtci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX0JBMSkKKwkJREVCVUdQQyhETUVBUywgIkJBMSAiKTsKKwlpZiAoIShtci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX0RMX1ZBTElEKSkKKwkJREVCVUdQQyhETUVBUywgIk5PVCBWQUxJRCAiKTsKKwllbHNlCisJCXByaW50X21lYXNfcmVwX3VuaSgmbXItPmRsLCAiZGwiKTsKKworCURFQlVHUEMoRE1FQVMsICJOVU1fTkVJR0g9JXVcbiIsIG1yLT5udW1fY2VsbCk7CisJaWYgKG1yLT5udW1fY2VsbCA9PSA3KQorCQlyZXR1cm47CisJZm9yIChpID0gMDsgaSA8IG1yLT5udW1fY2VsbDsgaSsrKSB7CisJCXN0cnVjdCBnc21fbWVhc19yZXBfY2VsbCAqbXJjID0gJm1yLT5jZWxsW2ldOworCQlERUJVR1AoRE1FQVMsICJJRFg9JXUgQVJGQ049JXUgQlNJQz0ldSA9PiAlZCBkQm1cbiIsCisJCQltcmMtPm5laWdoX2lkeCwgbXJjLT5hcmZjbiwgbXJjLT5ic2ljLCByeGxldjJkYm0obXJjLT5yeGxldikpOworCX0KK30KKworc3RhdGljIGludCByc2xfcnhfbWVhc19yZXMoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21lYXNfcmVwICptciA9IGxjaGFuX25leHRfbWVhc19yZXAobXNnLT5sY2hhbik7CisJdV9pbnQ4X3QgbGVuOworCWNvbnN0IHVfaW50OF90ICp2YWw7CisJaW50IHJjOworCisJLyogY2hlY2sgaWYgdGhpcyBjaGFubmVsIGlzIGFjdHVhbGx5IGFjdGl2ZSAqLworCS8qIEZJWE1FOiBtYXliZSB0aGlzIGNoZWNrIHNob3VsZCBiZSB3YXkgbW9yZSBnZW5lcmljL2NlbnRyYWxpemVkICovCisJaWYgKG1zZy0+bGNoYW4tPnN0YXRlICE9IExDSEFOX1NfQUNUSVZFKSB7CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICIlczogTUVBUyBSRVMgZm9yIGluYWN0aXZlIGNoYW5uZWxcbiIsCisJCQlnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKSk7CisJCXJldHVybiAwOworCX0KKworCW1lbXNldChtciwgMCwgc2l6ZW9mKCptcikpOworCW1yLT5sY2hhbiA9IG1zZy0+bGNoYW47CisKKwlyc2xfdGx2X3BhcnNlKCZ0cCwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisKKwlpZiAoIVRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9NRUFTX1JFU19OUikgfHwKKwkgICAgIVRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9VUExJTktfTUVBUykgfHwKKwkgICAgIVRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9CU19QT1dFUikpCisJCXJldHVybiAtRUlPOworCisJLyogTWFuZGF0b3J5IFBhcnRzICovCisJbXItPm5yID0gKlRMVlBfVkFMKCZ0cCwgUlNMX0lFX01FQVNfUkVTX05SKTsKKworCWxlbiA9IFRMVlBfTEVOKCZ0cCwgUlNMX0lFX1VQTElOS19NRUFTKTsKKwl2YWwgPSBUTFZQX1ZBTCgmdHAsIFJTTF9JRV9VUExJTktfTUVBUyk7CisJaWYgKGxlbiA+PSAzKSB7CisJCWlmICh2YWxbMF0gJiAweDQwKQorCQkJbXItPmZsYWdzIHw9IE1FQVNfUkVQX0ZfRExfRFRYOworCQltci0+dWwuZnVsbC5yeF9sZXYgPSB2YWxbMF0gJiAweDNmOworCQltci0+dWwuc3ViLnJ4X2xldiA9IHZhbFsxXSAmIDB4M2Y7CisJCW1yLT51bC5mdWxsLnJ4X3F1YWwgPSB2YWxbMl0+PjMgJiAweDc7CisJCW1yLT51bC5zdWIucnhfcXVhbCA9IHZhbFsyXSAmIDB4NzsKKwl9CisKKwltci0+YnNfcG93ZXIgPSAqVExWUF9WQUwoJnRwLCBSU0xfSUVfQlNfUE9XRVIpOworCisJLyogT3B0aW9uYWwgUGFydHMgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX01TX1RJTUlOR19PRkZTRVQpKQorCQltci0+bXNfdGltaW5nX29mZnNldCA9CisJCQkqVExWUF9WQUwoJnRwLCBSU0xfSUVfTVNfVElNSU5HX09GRlNFVCk7CisKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX0wxX0lORk8pKSB7CisJCXZhbCA9IFRMVlBfVkFMKCZ0cCwgUlNMX0lFX0wxX0lORk8pOworCQltci0+ZmxhZ3MgfD0gTUVBU19SRVBfRl9NU19MMTsKKwkJbXItPm1zX2wxLnB3ciA9IG1zX3B3cl9kYm0obXNnLT50cngtPmJ0cy0+YmFuZCwgdmFsWzBdID4+IDMpOworCQlpZiAodmFsWzBdICYgMHgwNCkKKwkJCW1yLT5mbGFncyB8PSBNRUFTX1JFUF9GX0ZQQzsKKwkJbXItPm1zX2wxLnRhID0gdmFsWzFdOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgUlNMX0lFX0wzX0lORk8pKSB7CisJCW1zZy0+bDNoID0gKHVfaW50OF90ICopIFRMVlBfVkFMKCZ0cCwgUlNMX0lFX0wzX0lORk8pOworCQlyYyA9IGdzbTQ4X3BhcnNlX21lYXNfcmVwKG1yLCBtc2cpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCX0KKworCXByaW50X21lYXNfcmVwKG1yKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19MQ0hBTiwgU19MQ0hBTl9NRUFTX1JFUCwgbXIpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIENoYXB0ZXIgOC40LjcgKi8KK3N0YXRpYyBpbnQgcnNsX3J4X2hhbmRvX2RldChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9kY2hhbl9oZHIgKmRoID0gbXNnYl9sMihtc2cpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCisJREVCVUdQKERSU0wsICIlcyBIQU5ET1ZFUiBERVRFQ1QgIiwgZ3NtX2xjaGFuX25hbWUobXNnLT5sY2hhbikpOworCisJcnNsX3Rsdl9wYXJzZSgmdHAsIGRoLT5kYXRhLCBtc2diX2wybGVuKG1zZyktc2l6ZW9mKCpkaCkpOworCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9BQ0NFU1NfREVMQVkpKQorCQlERUJVR1BDKERSU0wsICJhY2Nlc3MgZGVsYXkgPSAldVxuIiwKKwkJCSpUTFZQX1ZBTCgmdHAsIFJTTF9JRV9BQ0NFU1NfREVMQVkpKTsKKwllbHNlCisJCURFQlVHUEMoRFJTTCwgIlxuIik7CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfTENIQU4sIFNfTENIQU5fSEFORE9WRVJfREVURUNULCBtc2ctPmxjaGFuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFiaXNfcnNsX3J4X2RjaGFuKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqcnNsaCA9IG1zZ2JfbDIobXNnKTsKKwlpbnQgcmMgPSAwOworCWNoYXIgKnRzX25hbWU7CisKKwltc2ctPmxjaGFuID0gbGNoYW5fbG9va3VwKG1zZy0+dHJ4LCByc2xoLT5jaGFuX25yKTsKKwl0c19uYW1lID0gZ3NtX2xjaGFuX25hbWUobXNnLT5sY2hhbik7CisKKwlzd2l0Y2ggKHJzbGgtPmMubXNnX3R5cGUpIHsKKwljYXNlIFJTTF9NVF9DSEFOX0FDVElWX0FDSzoKKwkJREVCVUdQKERSU0wsICIlcyBDSEFOTkVMIEFDVElWQVRFIEFDS1xuIiwgdHNfbmFtZSk7CisJCXJjID0gcnNsX3J4X2NoYW5fYWN0X2Fjayhtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9DSEFOX0FDVElWX05BQ0s6CisJCXJjID0gcnNsX3J4X2NoYW5fYWN0X25hY2sobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfQ09OTl9GQUlMOgorCQlyYyA9IHJzbF9yeF9jb25uX2ZhaWwobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfTUVBU19SRVM6CisJCXJjID0gcnNsX3J4X21lYXNfcmVzKG1zZyk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0hBTkRPX0RFVDoKKwkJcmMgPSByc2xfcnhfaGFuZG9fZGV0KG1zZyk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX1JGX0NIQU5fUkVMX0FDSzoKKwkJREVCVUdQKERSU0wsICIlcyBSRiBDSEFOTkVMIFJFTEVBU0UgQUNLXG4iLCB0c19uYW1lKTsKKwkJaWYgKG1zZy0+bGNoYW4tPnN0YXRlICE9IExDSEFOX1NfUkVMX1JFUSkKKwkJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICIlcyBDSEFOIFJFTCBBQ0sgYnV0IHN0YXRlICVzXG4iLAorCQkJCWdzbV9sY2hhbl9uYW1lKG1zZy0+bGNoYW4pLAorCQkJCWdzbV9sY2hhbnNfbmFtZShtc2ctPmxjaGFuLT5zdGF0ZSkpOworCQltc2ctPmxjaGFuLT5zdGF0ZSA9IExDSEFOX1NfTk9ORTsKKwkJbGNoYW5fZnJlZShtc2ctPmxjaGFuKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfTU9ERV9NT0RJRllfQUNLOgorCQlERUJVR1AoRFJTTCwgIiVzIENIQU5ORUwgTU9ERSBNT0RJRlkgQUNLXG4iLCB0c19uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfTU9ERV9NT0RJRllfTkFDSzoKKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiJXMgQ0hBTk5FTCBNT0RFIE1PRElGWSBOQUNLXG4iLCB0c19uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSVBBQ19QRENIX0FDVF9BQ0s6CisJCURFQlVHUEMoRFJTTCwgIiVzIElQQUMgUERDSCBBQ1QgQUNLXG4iLCB0c19uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSVBBQ19QRENIX0FDVF9OQUNLOgorCQlMT0dQKERSU0wsIExPR0xfRVJST1IsICIlcyBJUEFDIFBEQ0ggQUNUIE5BQ0tcbiIsIHRzX25hbWUpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9JUEFDX1BEQ0hfREVBQ1RfQUNLOgorCQlERUJVR1AoRFJTTCwgIiVzIElQQUMgUERDSCBERUFDVCBBQ0tcbiIsIHRzX25hbWUpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9JUEFDX1BEQ0hfREVBQ1RfTkFDSzoKKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiJXMgSVBBQyBQRENIIERFQUNUIE5BQ0tcbiIsIHRzX25hbWUpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9QSFlfQ09OVEVYVF9DT05GOgorCWNhc2UgUlNMX01UX1BSRVBST0NfTUVBU19SRVM6CisJY2FzZSBSU0xfTVRfVEFMS0VSX0RFVDoKKwljYXNlIFJTTF9NVF9MSVNURU5FUl9ERVQ6CisJY2FzZSBSU0xfTVRfUkVNT1RFX0NPREVDX0NPTkZfUkVQOgorCWNhc2UgUlNMX01UX01SX0NPREVDX01PRF9BQ0s6CisJY2FzZSBSU0xfTVRfTVJfQ09ERUNfTU9EX05BQ0s6CisJY2FzZSBSU0xfTVRfTVJfQ09ERUNfTU9EX1BFUjoKKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIiVzIFVuaW1wbGVtZW50ZWQgQWJpcyBSU0wgRENoYW4gIgorCQkJIm1zZyAweCUwMnhcbiIsIHRzX25hbWUsIHJzbGgtPmMubXNnX3R5cGUpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiJXMgdW5rbm93biBBYmlzIFJTTCBEQ2hhbiBtc2cgMHglMDJ4XG4iLAorCQkJdHNfbmFtZSwgcnNsaC0+Yy5tc2dfdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCByc2xfcnhfZXJyb3JfcmVwKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2NvbW1vbl9oZHIgKnJzbGggPSBtc2diX2wyKG1zZyk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisKKwlMT0dQKERSU0wsIExPR0xfRVJST1IsICIlcyBFUlJPUiBSRVBPUlQgIiwgZ3NtX3RyeF9uYW1lKG1zZy0+dHJ4KSk7CisKKwlyc2xfdGx2X3BhcnNlKCZ0cCwgcnNsaC0+ZGF0YSwgbXNnYl9sMmxlbihtc2cpLXNpemVvZigqcnNsaCkpOworCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIFJTTF9JRV9DQVVTRSkpCisJCXByaW50X3JzbF9jYXVzZShMT0dMX0VSUk9SLCBUTFZQX1ZBTCgmdHAsIFJTTF9JRV9DQVVTRSksCisJCQkJVExWUF9MRU4oJnRwLCBSU0xfSUVfQ0FVU0UpKTsKKworCUxPR1BDKERSU0wsIExPR0xfRVJST1IsICJcbiIpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19yc2xfcnhfdHJ4KHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2NvbW1vbl9oZHIgKnJzbGggPSBtc2diX2wyKG1zZyk7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAocnNsaC0+bXNnX3R5cGUpIHsKKwljYXNlIFJTTF9NVF9FUlJPUl9SRVBPUlQ6CisJCXJjID0gcnNsX3J4X2Vycm9yX3JlcChtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9SRl9SRVNfSU5EOgorCQkvKiBpbnRlcmZlcmVuY2Ugb24gaWRsZSBjaGFubmVscyBvZiBUUlggKi8KKwkJLy9ERUJVR1AoRFJTTCwgIiVzIFJGIFJlc291cmNlIEluZGljYXRpb25cbiIsIGdzbV90cnhfbmFtZShtc2ctPnRyeCkpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9PVkVSTE9BRDoKKwkJLyogaW5kaWNhdGUgQ0NDSCAvIEFDQ0ggLyBwcm9jZXNzb3Igb3ZlcmxvYWQgKi8gCisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIiVzIENDQ0gvQUNDSC9DUFUgT3ZlcmxvYWRcbiIsCisJCSAgICAgZ3NtX3RyeF9uYW1lKG1zZy0+dHJ4KSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICIlcyBVbmtub3duIEFiaXMgUlNMIFRSWCBtZXNzYWdlICIKKwkJCSJ0eXBlIDB4JTAyeFxuIiwgZ3NtX3RyeF9uYW1lKG1zZy0+dHJ4KSwgcnNsaC0+bXNnX3R5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJcmV0dXJuIHJjOworfQorCisvKiBJZiBUMzEwMSBleHBpcmVzLCB3ZSBuZXZlciByZWNlaXZlZCBhIHJlc3BvbnNlIHRvIElNTUVESUFURSBBU1NJR04gKi8KK3N0YXRpYyB2b2lkIHQzMTAxX2V4cGlyZWQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IGRhdGE7CisKKwlyc2xfcmZfY2hhbl9yZWxlYXNlKGxjaGFuKTsKK30KKworLyogTVMgaGFzIHJlcXVlc3RlZCBhIGNoYW5uZWwgb24gdGhlIFJBQ0ggKi8KK3N0YXRpYyBpbnQgcnNsX3J4X2NoYW5fcnFkKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IG1zZy0+dHJ4LT5idHM7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqcnFkX2hkciA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgZ3NtNDhfcmVxX3JlZiAqcnFkX3JlZjsKKwlzdHJ1Y3QgZ3NtNDhfaW1tX2FzcyBpYTsKKwllbnVtIGdzbV9jaGFuX3QgbGN0eXBlOworCWVudW0gZ3NtX2NocmVxX3JlYXNvbl90IGNocmVxX3JlYXNvbjsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwl1X2ludDhfdCBycWRfdGE7CisJaW50IHJldDsKKworCXVfaW50MTZfdCBhcmZjbjsKKwl1X2ludDhfdCB0c19udW1iZXIsIHN1YmNoOworCisJLyogcGFyc2UgcmVxdWVzdCByZWZlcmVuY2UgdG8gYmUgdXNlZCBpbiBpbW1lZGlhdGUgYXNzaWduICovCisJaWYgKHJxZF9oZHItPmRhdGFbMF0gIT0gUlNMX0lFX1JFUV9SRUZFUkVOQ0UpCisJCXJldHVybiAtRUlOVkFMOworCisJcnFkX3JlZiA9IChzdHJ1Y3QgZ3NtNDhfcmVxX3JlZiAqKSAmcnFkX2hkci0+ZGF0YVsxXTsKKworCS8qIHBhcnNlIGFjY2VzcyBkZWxheSBhbmQgdXNlIGFzIFRBICovCisJaWYgKHJxZF9oZHItPmRhdGFbc2l6ZW9mKHN0cnVjdCBnc200OF9yZXFfcmVmKSsxXSAhPSBSU0xfSUVfQUNDRVNTX0RFTEFZKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlycWRfdGEgPSBycWRfaGRyLT5kYXRhW3NpemVvZihzdHJ1Y3QgZ3NtNDhfcmVxX3JlZikrMl07CisKKwkvKiBkZXRlcm1pbmUgY2hhbm5lbCB0eXBlIChTRENDSC9UQ0hfRi9UQ0hfSCkgYmFzZWQgb24KKwkgKiByZXF1ZXN0IHJlZmVyZW5jZSBSQSAqLworCWxjdHlwZSA9IGdldF9jdHlwZV9ieV9jaHJlcShidHMsIHJxZF9yZWYtPnJhLCBidHMtPm5ldHdvcmstPm5lY2kpOworCWNocmVxX3JlYXNvbiA9IGdldF9yZWFzb25fYnlfY2hyZXEoYnRzLCBycWRfcmVmLT5yYSwgYnRzLT5uZXR3b3JrLT5uZWNpKTsKKworCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMuY2hyZXEudG90YWwpOworCisJLyogY2hlY2sgYXZhaWxhYmlsaXR5IC8gYWxsb2NhdGUgY2hhbm5lbCAqLworCWxjaGFuID0gbGNoYW5fYWxsb2MoYnRzLCBsY3R5cGUpOworCWlmICghbGNoYW4pIHsKKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIkJUUyAlZCBDSEFOIFJRRDogbm8gcmVzb3VyY2VzIGZvciAlcyAweCV4XG4iLAorCQkgICAgIG1zZy0+bGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIGdzbV9sY2hhbnRfbmFtZShsY3R5cGUpLCBycWRfcmVmLT5yYSk7CisJCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMuY2hyZXEubm9fY2hhbm5lbCk7CisJCS8qIEZJWE1FOiBzZW5kIHNvbWUga2luZCBvZiByZWplY3QgPyE/ICovCisJCXJldHVybiAtRU5PTUVNOworCX0KKworCWlmIChsY2hhbi0+c3RhdGUgIT0gTENIQU5fU19OT05FKQorCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAiJXMgbGNoYW5fYWxsb2MoKSByZXR1cm5lZCBjaGFubmVsICIKKwkJICAgICAiaW4gc3RhdGUgJXNcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSwKKwkJICAgICBnc21fbGNoYW5zX25hbWUobGNoYW4tPnN0YXRlKSk7CisJbGNoYW4tPnN0YXRlID0gTENIQU5fU19BQ1RfUkVROworCisJdHNfbnVtYmVyID0gbGNoYW4tPnRzLT5ucjsKKwlhcmZjbiA9IGxjaGFuLT50cy0+dHJ4LT5hcmZjbjsKKwlzdWJjaCA9IGxjaGFuLT5ucjsKKwkKKwlsY2hhbi0+ZW5jci5hbGdfaWQgPSBSU0xfRU5DX0FMR19BNSgwKTsJLyogbm8gZW5jcnlwdGlvbiAqLworCWxjaGFuLT5tc19wb3dlciA9IG1zX3B3cl9jdGxfbHZsKGJ0cy0+YmFuZCwgYnRzLT5tc19tYXhfcG93ZXIpOworCWxjaGFuLT5ic19wb3dlciA9IDA7IC8qIDBkQiByZWR1Y3Rpb24sIG91dHB1dCBwb3dlciA9IFBuICovCisJbGNoYW4tPnJzbF9jbW9kZSA9IFJTTF9DTU9EX1NQRF9TSUdOOworCWxjaGFuLT50Y2hfbW9kZSA9IEdTTTQ4X0NNT0RFX1NJR047CisJcnNsX2NoYW5fYWN0aXZhdGVfbGNoYW4obGNoYW4sIDB4MDAsIHJxZF90YSwgMCk7CisKKwkvKiBjcmVhdGUgSU1NRURJQVRFIEFTU0lHTiAwNC4wOCBtZXNzZ2UgKi8KKwltZW1zZXQoJmlhLCAwLCBzaXplb2YoaWEpKTsKKwlpYS5sMl9wbGVuID0gMHgyZDsKKwlpYS5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX1JSOworCWlhLm1zZ190eXBlID0gR1NNNDhfTVRfUlJfSU1NX0FTUzsKKwlpYS5wYWdlX21vZGUgPSBHU000OF9QTV9TQU1FOworCWlhLmNoYW5fZGVzYy5jaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisJaWEuY2hhbl9kZXNjLmgwLmggPSAwOworCWlhLmNoYW5fZGVzYy5oMC5hcmZjbl9oaWdoID0gYXJmY24gPj4gODsKKwlpYS5jaGFuX2Rlc2MuaDAuYXJmY25fbG93ID0gYXJmY24gJiAweGZmOworCWlhLmNoYW5fZGVzYy5oMC50c2MgPSBidHMtPnRzYzsKKwkvKiB1c2UgcmVxdWVzdCByZWZlcmVuY2UgZXh0cmFjdGVkIGZyb20gQ0hBTl9SUUQgKi8KKwltZW1jcHkoJmlhLnJlcV9yZWYsIHJxZF9yZWYsIHNpemVvZihpYS5yZXFfcmVmKSk7CisJaWEudGltaW5nX2FkdmFuY2UgPSBycWRfdGE7CisJaWEubW9iX2FsbG9jX2xlbiA9IDA7CisKKwlERUJVR1AoRFJTTCwgIiVzIEFjdGl2YXRpbmcgQVJGQ04oJXUpIFNTKCV1KSBsY3R5cGUgJXMgIgorCQkicj0lcyByYT0weCUwMnhcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSwgYXJmY24sIHN1YmNoLAorCQlnc21fbGNoYW50X25hbWUobGNoYW4tPnR5cGUpLCBnc21fY2hyZXFfbmFtZShjaHJlcV9yZWFzb24pLAorCQlycWRfcmVmLT5yYSk7CisKKwkvKiBTdGFydCB0aW1lciBUMzEwMSB0byB3YWl0IGZvciBHU000OF9NVF9SUl9QQUdfUkVTUCAqLworCWxjaGFuLT5UMzEwMS5jYiA9IHQzMTAxX2V4cGlyZWQ7CisJbGNoYW4tPlQzMTAxLmRhdGEgPSBsY2hhbjsKKwlic2Nfc2NoZWR1bGVfdGltZXIoJmxjaGFuLT5UMzEwMSwgYnRzLT5uZXR3b3JrLT5UMzEwMSwgMCk7CisKKwkvKiBzZW5kIElNTUVESUFURSBBU1NJR04gQ01EIG9uIFJTTCB0byBCVFMgKHRvIHNlbmQgb24gQ0NDSCB0byBNUykgKi8KKwlyZXQgPSByc2xfaW1tX2Fzc2lnbl9jbWQoYnRzLCBzaXplb2YoaWEpLCAodV9pbnQ4X3QgKikgJmlhKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIE1TIGhhcyByZXF1ZXN0ZWQgYSBjaGFubmVsIG9uIHRoZSBSQUNIICovCitzdGF0aWMgaW50IHJzbF9yeF9jY2NoX2xvYWQoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpyc2xoID0gbXNnYl9sMihtc2cpOworCXVfaW50MTZfdCBwZ19idWZfc3BhY2U7CisJdV9pbnQxNl90IHJhY2hfc2xvdF9jb3VudCA9IC0xOworCXVfaW50MTZfdCByYWNoX2J1c3lfY291bnQgPSAtMTsKKwl1X2ludDE2X3QgcmFjaF9hY2Nlc3NfY291bnQgPSAtMTsKKworCXN3aXRjaCAocnNsaC0+ZGF0YVswXSkgeworCWNhc2UgUlNMX0lFX1BBR0lOR19MT0FEOgorCQlwZ19idWZfc3BhY2UgPSByc2xoLT5kYXRhWzFdIDw8IDggfCByc2xoLT5kYXRhWzJdOworCQlwYWdpbmdfdXBkYXRlX2J1ZmZlcl9zcGFjZShtc2ctPnRyeC0+YnRzLCBwZ19idWZfc3BhY2UpOworCQlicmVhazsKKwljYXNlIFJTTF9JRV9SQUNIX0xPQUQ6CisJCWlmIChtc2ctPmRhdGFfbGVuID49IDcpIHsKKwkJCXJhY2hfc2xvdF9jb3VudCA9IHJzbGgtPmRhdGFbMl0gPDwgOCB8IHJzbGgtPmRhdGFbM107CisJCQlyYWNoX2J1c3lfY291bnQgPSByc2xoLT5kYXRhWzRdIDw8IDggfCByc2xoLT5kYXRhWzVdOworCQkJcmFjaF9hY2Nlc3NfY291bnQgPSByc2xoLT5kYXRhWzZdIDw8IDggfCByc2xoLT5kYXRhWzddOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFiaXNfcnNsX3J4X2NjaGFuKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqcnNsaCA9IG1zZ2JfbDIobXNnKTsKKwlpbnQgcmMgPSAwOworCisJbXNnLT5sY2hhbiA9IGxjaGFuX2xvb2t1cChtc2ctPnRyeCwgcnNsaC0+Y2hhbl9ucik7CisKKwlzd2l0Y2ggKHJzbGgtPmMubXNnX3R5cGUpIHsKKwljYXNlIFJTTF9NVF9DSEFOX1JRRDoKKwkJLyogTVMgaGFzIHJlcXVlc3RlZCBhIGNoYW5uZWwgb24gdGhlIFJBQ0ggKi8KKwkJcmMgPSByc2xfcnhfY2hhbl9ycWQobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfQ0NDSF9MT0FEX0lORDoKKwkJLyogY3VycmVudCBsb2FkIG9uIHRoZSBDQ0NIICovCisJCXJjID0gcnNsX3J4X2NjY2hfbG9hZChtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9ERUxFVEVfSU5EOgorCQkvKiBDQ0NIIG92ZXJsb2FkZWQsIElNTV9BU1NJR04gd2FzIGRyb3BwZWQgKi8KKwljYXNlIFJTTF9NVF9DQkNIX0xPQURfSU5EOgorCQkvKiBjdXJyZW50IGxvYWQgb24gdGhlIENCQ0ggKi8KKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIlVuaW1wbGVtZW50ZWQgQWJpcyBSU0wgVFJYIG1lc3NhZ2UgIgorCQkJInR5cGUgMHglMDJ4XG4iLCByc2xoLT5jLm1zZ190eXBlKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEUlNMLCBMT0dMX05PVElDRSwgIlVua25vd24gQWJpcyBSU0wgVFJYIG1lc3NhZ2UgdHlwZSAiCisJCQkiMHglMDJ4XG4iLCByc2xoLT5jLm1zZ190eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHJzbF9yeF9ybGxfZXJyX2luZChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9ybGxfaGRyICpybGxoID0gbXNnYl9sMihtc2cpOworCXVfaW50OF90ICpybG1fY2F1c2UgPSBybGxoLT5kYXRhOworCisJTE9HUChEUkxMLCBMT0dMX0VSUk9SLCAiJXMgRVJST1IgSU5ESUNBVElPTiBjYXVzZT0lc1xuIiwKKwkJZ3NtX2xjaGFuX25hbWUobXNnLT5sY2hhbiksCisJCWdldF92YWx1ZV9zdHJpbmcocnNsX3JsbV9jYXVzZV9zdHJzLCBybG1fY2F1c2VbMV0pKTsKKworCXJsbF9pbmRpY2F0aW9uKG1zZy0+bGNoYW4sIHJsbGgtPmxpbmtfaWQsIEJTQ19STExSX0lORF9FUlJfSU5EKTsKKworCWlmIChybG1fY2F1c2VbMV0gPT0gUkxMX0NBVVNFX1QyMDBfRVhQSVJFRCkKKwkJcmV0dXJuIHJzbF9yZl9jaGFuX3JlbGVhc2UobXNnLT5sY2hhbik7CisKKwlyZXR1cm4gMDsKK30KKworLyoJRVNUQUJMSVNIIElORElDQVRJT04sIExPQ0FUSU9OIEFSRUEgVVBEQVRFIFJFUVVFU1QgCisJMHgwMiwgMHgwNiwKKwkweDAxLCAweDIwLAorCTB4MDIsIDB4MDAsCisJMHgwYiwgMHgwMCwgMHgwZiwgMHgwNSwgMHgwOCwgLi4uICovCisKK3N0YXRpYyBpbnQgYWJpc19yc2xfcnhfcmxsKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX3JsbF9oZHIgKnJsbGggPSBtc2diX2wyKG1zZyk7CisJaW50IHJjID0gMDsKKwljaGFyICp0c19uYW1lOworCXVfaW50OF90IHNhcGkgPSBybGxoLT5saW5rX2lkICYgNzsKKworCW1zZy0+bGNoYW4gPSBsY2hhbl9sb29rdXAobXNnLT50cngsIHJsbGgtPmNoYW5fbnIpOworCXRzX25hbWUgPSBnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKTsKKwlERUJVR1AoRFJMTCwgIiVzIFNBUEk9JXUgIiwgdHNfbmFtZSwgc2FwaSk7CisJCisJc3dpdGNoIChybGxoLT5jLm1zZ190eXBlKSB7CisJY2FzZSBSU0xfTVRfREFUQV9JTkQ6CisJCURFQlVHUEMoRFJMTCwgIkRBVEEgSU5ESUNBVElPTlxuIik7CisJCWlmIChtc2diX2wybGVuKG1zZykgPiAKKwkJICAgIHNpemVvZihzdHJ1Y3QgYWJpc19yc2xfY29tbW9uX2hkcikgKyBzaXplb2YoKnJsbGgpICYmCisJCSAgICBybGxoLT5kYXRhWzBdID09IFJTTF9JRV9MM19JTkZPKSB7CisJCQltc2ctPmwzaCA9ICZybGxoLT5kYXRhWzNdOworCQkJcmV0dXJuIGdzbTA0MDhfcmN2bXNnKG1zZywgcmxsaC0+bGlua19pZCk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfRVNUX0lORDoKKwkJREVCVUdQQyhEUkxMLCAiRVNUQUJMSVNIIElORElDQVRJT05cbiIpOworCQkvKiBsY2hhbiBpcyBlc3RhYmxpc2hlZCwgc3RvcCBUMzEwMSAqLworCQltc2ctPmxjaGFuLT5zYXBpc1tybGxoLT5saW5rX2lkICYgMHg3XSA9IExDSEFOX1NBUElfTVM7CisJCWJzY19kZWxfdGltZXIoJm1zZy0+bGNoYW4tPlQzMTAxKTsKKwkJaWYgKG1zZ2JfbDJsZW4obXNnKSA+IAorCQkgICAgc2l6ZW9mKHN0cnVjdCBhYmlzX3JzbF9jb21tb25faGRyKSArIHNpemVvZigqcmxsaCkgJiYKKwkJICAgIHJsbGgtPmRhdGFbMF0gPT0gUlNMX0lFX0wzX0lORk8pIHsKKwkJCW1zZy0+bDNoID0gJnJsbGgtPmRhdGFbM107CisJCQlyZXR1cm4gZ3NtMDQwOF9yY3Ztc2cobXNnLCBybGxoLT5saW5rX2lkKTsKKwkJfQorCQlicmVhazsKKwljYXNlIFJTTF9NVF9FU1RfQ09ORjoKKwkJREVCVUdQQyhEUkxMLCAiRVNUQUJMSVNIIENPTkZJUk1cbiIpOworCQltc2ctPmxjaGFuLT5zYXBpc1tybGxoLT5saW5rX2lkICYgMHg3XSA9IExDSEFOX1NBUElfTkVUOworCQlybGxfaW5kaWNhdGlvbihtc2ctPmxjaGFuLCBybGxoLT5saW5rX2lkLAorCQkJCSAgQlNDX1JMTFJfSU5EX0VTVF9DT05GKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfUkVMX0lORDoKKwkJLyogQlRTIGluZm9ybXMgdXMgb2YgaGF2aW5nIHJlY2VpdmVkICBESVNDIGZyb20gTVMgKi8KKwkJREVCVUdQQyhEUkxMLCAiUkVMRUFTRSBJTkRJQ0FUSU9OXG4iKTsKKwkJbXNnLT5sY2hhbi0+c2FwaXNbcmxsaC0+bGlua19pZCAmIDB4N10gPSBMQ0hBTl9TQVBJX1VOVVNFRDsKKwkJcmxsX2luZGljYXRpb24obXNnLT5sY2hhbiwgcmxsaC0+bGlua19pZCwKKwkJCQkgIEJTQ19STExSX0lORF9SRUxfSU5EKTsKKwkJLyogd2UgY2FuIG5vdyByZWxlYWUgdGhlIGNoYW5uZWwgb24gdGhlIEJUUy9BYmlzIHNpZGUgKi8KKwkJLyogRklYTUU6IG9mZmljaWFsbHkgd2UgbmVlZCB0byBzdGFydCBUMzExMSBhbmQgd2FpdCBmb3IKKwkJICogc29tZSBncmFjZSBwZXJpb2QgKi8KKwkJcnNsX3JmX2NoYW5fcmVsZWFzZShtc2ctPmxjaGFuKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfUkVMX0NPTkY6CisJCS8qIEJUUyBpbmZvcm1zIHVzIG9mIGhhdmluZyByZWNlaXZlZCBVQSBmcm9tIE1TLAorCQkgKiBpbiByZXNwb25zZSB0byBESVNDIHRoYXQgd2UndmUgc2VudCBlYXJsaWVyICovCisJCURFQlVHUEMoRFJMTCwgIlJFTEVBU0UgQ09ORklSTUFUSU9OXG4iKTsKKwkJbXNnLT5sY2hhbi0+c2FwaXNbcmxsaC0+bGlua19pZCAmIDB4N10gPSBMQ0hBTl9TQVBJX1VOVVNFRDsKKwkJLyogd2UgY2FuIG5vdyByZWxlYWUgdGhlIGNoYW5uZWwgb24gdGhlIEJUUy9BYmlzIHNpZGUgKi8KKwkJLyogRklYTUU6IG9mZmljaWFsbHkgd2UgbmVlZCB0byBzdGFydCBUMzExMSBhbmQgd2FpdCBmb3IKKwkJICogc29tZSBncmFjZSBwZXJpb2QgKi8KKwkJcnNsX3JmX2NoYW5fcmVsZWFzZShtc2ctPmxjaGFuKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfRVJST1JfSU5EOgorCQlyYyA9IHJzbF9yeF9ybGxfZXJyX2luZChtc2cpOworCQlicmVhazsKKwljYXNlIFJTTF9NVF9VTklUX0RBVEFfSU5EOgorCQlMT0dQKERSTEwsIExPR0xfTk9USUNFLCAidW5pbXBsZW1lbnRlZCBBYmlzIFJMTCBtZXNzYWdlICIKKwkJCSJ0eXBlIDB4JTAyeFxuIiwgcmxsaC0+Yy5tc2dfdHlwZSk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFJMTCwgTE9HTF9OT1RJQ0UsICJ1bmtub3duIEFiaXMgUkxMIG1lc3NhZ2UgIgorCQkJInR5cGUgMHglMDJ4XG4iLCBybGxoLT5jLm1zZ190eXBlKTsKKwl9CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgdV9pbnQ4X3QgaXBhX3Ntb2Rfc19mb3JfbGNoYW4oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3dpdGNoIChsY2hhbi0+dGNoX21vZGUpIHsKKwljYXNlIEdTTTQ4X0NNT0RFX1NQRUVDSF9WMToKKwkJc3dpdGNoIChsY2hhbi0+dHlwZSkgeworCQljYXNlIEdTTV9MQ0hBTl9UQ0hfRjoKKwkJCXJldHVybiAweDAwOworCQljYXNlIEdTTV9MQ0hBTl9UQ0hfSDoKKwkJCXJldHVybiAweDAzOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwljYXNlIEdTTTQ4X0NNT0RFX1NQRUVDSF9FRlI6CisJCXN3aXRjaCAobGNoYW4tPnR5cGUpIHsKKwkJY2FzZSBHU01fTENIQU5fVENIX0Y6CisJCQlyZXR1cm4gMHgwMTsKKwkJLyogdGhlcmUncyBubyBoYWxmLXJhdGUgRUZSICovCisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCWNhc2UgR1NNNDhfQ01PREVfU1BFRUNIX0FNUjoKKwkJc3dpdGNoIChsY2hhbi0+dHlwZSkgeworCQljYXNlIEdTTV9MQ0hBTl9UQ0hfRjoKKwkJCXJldHVybiAweDAyOworCQljYXNlIEdTTV9MQ0hBTl9UQ0hfSDoKKwkJCXJldHVybiAweDA1OworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAiQ2Fubm90IGRldGVybWluZSBpcC5hY2Nlc3Mgc3BlZWNoIG1vZGUgZm9yICIKKwkJInRjaF9tb2RlID09IDB4JTAyeFxuIiwgbGNoYW4tPnRjaF9tb2RlKTsKKwlyZXR1cm4gMDsKK30KKworLyogaXAuYWNjZXNzIHNwZWNpZmljIFJTTCBleHRlbnNpb25zICovCitzdGF0aWMgdm9pZCBpcGFjX3BhcnNlX3J0cChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgc3RydWN0IHRsdl9wYXJzZWQgKnR2KQoreworCXN0cnVjdCBpbl9hZGRyIGlwOworCXVfaW50MTZfdCBwb3J0LCBjb25uX2lkOworCisJaWYgKFRMVlBfUFJFU0VOVCh0diwgUlNMX0lFX0lQQUNfTE9DQUxfSVApKSB7CisJCWlwLnNfYWRkciA9ICooKHVfaW50MzJfdCAqKSBUTFZQX1ZBTCh0diwgUlNMX0lFX0lQQUNfTE9DQUxfSVApKTsKKwkJREVCVUdQQyhEUlNMLCAiTE9DQUxfSVA9JXMgIiwgaW5ldF9udG9hKGlwKSk7CisJCWxjaGFuLT5hYmlzX2lwLmJvdW5kX2lwID0gbnRvaGwoaXAuc19hZGRyKTsKKwl9CisKKwlpZiAoVExWUF9QUkVTRU5UKHR2LCBSU0xfSUVfSVBBQ19MT0NBTF9QT1JUKSkgeworCQlwb3J0ID0gKigodV9pbnQxNl90ICopIFRMVlBfVkFMKHR2LCBSU0xfSUVfSVBBQ19MT0NBTF9QT1JUKSk7CisJCXBvcnQgPSBudG9ocyhwb3J0KTsKKwkJREVCVUdQQyhEUlNMLCAiTE9DQUxfUE9SVD0ldSAiLCBwb3J0KTsKKwkJbGNoYW4tPmFiaXNfaXAuYm91bmRfcG9ydCA9IHBvcnQ7CisJfQorCisJaWYgKFRMVlBfUFJFU0VOVCh0diwgUlNMX0lFX0lQQUNfQ09OTl9JRCkpIHsKKwkJY29ubl9pZCA9ICooKHVfaW50MTZfdCAqKSBUTFZQX1ZBTCh0diwgUlNMX0lFX0lQQUNfQ09OTl9JRCkpOworCQljb25uX2lkID0gbnRvaHMoY29ubl9pZCk7CisJCURFQlVHUEMoRFJTTCwgIkNPTl9JRD0ldSAiLCBjb25uX2lkKTsKKwkJbGNoYW4tPmFiaXNfaXAuY29ubl9pZCA9IGNvbm5faWQ7CisJfQorCisJaWYgKFRMVlBfUFJFU0VOVCh0diwgUlNMX0lFX0lQQUNfUlRQX1BBWUxPQUQyKSkgeworCQlsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZDIgPQorCQkJCSpUTFZQX1ZBTCh0diwgUlNMX0lFX0lQQUNfUlRQX1BBWUxPQUQyKTsKKwkJREVCVUdQQyhEUlNMLCAiUlRQX1BBWUxPQUQyPTB4JTAyeCAiLAorCQkJbGNoYW4tPmFiaXNfaXAucnRwX3BheWxvYWQyKTsKKwl9CisKKwlpZiAoVExWUF9QUkVTRU5UKHR2LCBSU0xfSUVfSVBBQ19TUEVFQ0hfTU9ERSkpIHsKKwkJbGNoYW4tPmFiaXNfaXAuc3BlZWNoX21vZGUgPQorCQkJCSpUTFZQX1ZBTCh0diwgUlNMX0lFX0lQQUNfU1BFRUNIX01PREUpOworCQlERUJVR1BDKERSU0wsICJzcGVlY2hfbW9kZT0weCUwMnggIiwKKwkJCWxjaGFuLT5hYmlzX2lwLnNwZWVjaF9tb2RlKTsKKwl9CisKKwlpZiAoVExWUF9QUkVTRU5UKHR2LCBSU0xfSUVfSVBBQ19SRU1PVEVfSVApKSB7CisJCWlwLnNfYWRkciA9ICooKHVfaW50MzJfdCAqKSBUTFZQX1ZBTCh0diwgUlNMX0lFX0lQQUNfUkVNT1RFX0lQKSk7CisJCURFQlVHUEMoRFJTTCwgIlJFTU9URV9JUD0lcyAiLCBpbmV0X250b2EoaXApKTsKKwkJbGNoYW4tPmFiaXNfaXAuY29ubmVjdF9pcCA9IG50b2hsKGlwLnNfYWRkcik7CisJfQorCisJaWYgKFRMVlBfUFJFU0VOVCh0diwgUlNMX0lFX0lQQUNfUkVNT1RFX1BPUlQpKSB7CisJCXBvcnQgPSAqKCh1X2ludDE2X3QgKikgVExWUF9WQUwodHYsIFJTTF9JRV9JUEFDX1JFTU9URV9QT1JUKSk7CisJCXBvcnQgPSBudG9ocyhwb3J0KTsKKwkJREVCVUdQQyhEUlNMLCAiUkVNT1RFX1BPUlQ9JXUgIiwgcG9ydCk7CisJCWxjaGFuLT5hYmlzX2lwLmNvbm5lY3RfcG9ydCA9IHBvcnQ7CisJfQorfQorCitpbnQgcnNsX2lwYWNjX2NyY3goc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfSVBBQ19DUkNYKTsKKwlkaC0+Yy5tc2dfZGlzY3IgPSBBQklTX1JTTF9NRElTQ19JUEFDQ0VTUzsKKwlkaC0+Y2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCisJLyogMHgxLSA9PSByZWNlaXZlLW9ubHksIDB4LTEgPT0gRUZSIGNvZGVjICovCisJbGNoYW4tPmFiaXNfaXAuc3BlZWNoX21vZGUgPSAweDEwIHwgaXBhX3Ntb2Rfc19mb3JfbGNoYW4obGNoYW4pOworCW1zZ2JfdHZfcHV0KG1zZywgUlNMX0lFX0lQQUNfU1BFRUNIX01PREUsIGxjaGFuLT5hYmlzX2lwLnNwZWVjaF9tb2RlKTsKKworCURFQlVHUChEUlNMLCAiJXMgSVBBQ19CSU5EIHNwZWVjaF9tb2RlPTB4JTAyeFxuIiwKKwkJZ3NtX2xjaGFuX25hbWUobGNoYW4pLCBsY2hhbi0+YWJpc19pcC5zcGVlY2hfbW9kZSk7CisKKwltc2ctPnRyeCA9IGxjaGFuLT50cy0+dHJ4OworCisJcmV0dXJuIGFiaXNfcnNsX3NlbmRtc2cobXNnKTsKK30KKworaW50IHJzbF9pcGFjY19tZGN4KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDMyX3QgaXAsIHVfaW50MTZfdCBwb3J0LAorCQkgICB1X2ludDhfdCBydHBfcGF5bG9hZDIpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisJdV9pbnQzMl90ICphdHRfaXA7CisJc3RydWN0IGluX2FkZHIgaWE7CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfSVBBQ19NRENYKTsKKwlkaC0+Yy5tc2dfZGlzY3IgPSBBQklTX1JTTF9NRElTQ19JUEFDQ0VTUzsKKwlkaC0+Y2hhbl9uciA9IGxjaGFuMmNoYW5fbnIobGNoYW4pOworCisJLyogd2UgbmVlZCB0byBzdG9yZSB0aGVzZSBub3cgYXMgTURDWF9BQ0sgZG9lcyBub3QgcmV0dXJuIHRoZW0gOiggKi8KKwlsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZDIgPSBydHBfcGF5bG9hZDI7CisJbGNoYW4tPmFiaXNfaXAuY29ubmVjdF9wb3J0ID0gcG9ydDsKKwlsY2hhbi0+YWJpc19pcC5jb25uZWN0X2lwID0gaXA7CisKKwkvKiAweDAtID09IGJvdGggZGlyZWN0aW9ucywgMHgtMSA9PSBFRlIgY29kZWMgKi8KKwlsY2hhbi0+YWJpc19pcC5zcGVlY2hfbW9kZSA9IDB4MDAgfCBpcGFfc21vZF9zX2Zvcl9sY2hhbihsY2hhbik7CisKKwlpYS5zX2FkZHIgPSBodG9ubChpcCk7CisJREVCVUdQKERSU0wsICIlcyBJUEFDX01EQ1ggSVA9JXMgUE9SVD0lZCBSVFBfUEFZTE9BRDI9JWQgQ09OTl9JRD0lZCAiCisJCSJzcGVlY2hfbW9kZT0weCUwMnhcbiIsIGdzbV9sY2hhbl9uYW1lKGxjaGFuKSwgaW5ldF9udG9hKGlhKSwgcG9ydCwKKwkJcnRwX3BheWxvYWQyLCBsY2hhbi0+YWJpc19pcC5jb25uX2lkLCBsY2hhbi0+YWJpc19pcC5zcGVlY2hfbW9kZSk7CisKKwltc2diX3R2MTZfcHV0KG1zZywgUlNMX0lFX0lQQUNfQ09OTl9JRCwgbGNoYW4tPmFiaXNfaXAuY29ubl9pZCk7CisJbXNnYl92X3B1dChtc2csIFJTTF9JRV9JUEFDX1JFTU9URV9JUCk7CisJYXR0X2lwID0gKHVfaW50MzJfdCAqKSBtc2diX3B1dChtc2csIHNpemVvZihpcCkpOworCSphdHRfaXAgPSBpYS5zX2FkZHI7CisJbXNnYl90djE2X3B1dChtc2csIFJTTF9JRV9JUEFDX1JFTU9URV9QT1JULCBwb3J0KTsKKwltc2diX3R2X3B1dChtc2csIFJTTF9JRV9JUEFDX1NQRUVDSF9NT0RFLCBsY2hhbi0+YWJpc19pcC5zcGVlY2hfbW9kZSk7CisJaWYgKHJ0cF9wYXlsb2FkMikKKwkJbXNnYl90dl9wdXQobXNnLCBSU0xfSUVfSVBBQ19SVFBfUEFZTE9BRDIsIHJ0cF9wYXlsb2FkMik7CisJCisJbXNnLT50cnggPSBsY2hhbi0+dHMtPnRyeDsKKworCXJldHVybiBhYmlzX3JzbF9zZW5kbXNnKG1zZyk7Cit9CisKKy8qIHRlbGwgQlRTIHRvIGNvbm5lY3QgUlRQIHN0cmVhbSB0byBvdXIgbG9jYWwgUlRQIHNvY2tldCAqLworaW50IHJzbF9pcGFjY19tZGN4X3RvX3J0cHNvY2soc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IHJ0cF9zb2NrZXQgKnJzID0gbGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldDsKKwlpbnQgcmM7CisKKwlyYyA9IHJzbF9pcGFjY19tZGN4KGxjaGFuLCBudG9obChycy0+cnRwLnNpbl9sb2NhbC5zaW5fYWRkci5zX2FkZHIpLAorCQkJCW50b2hzKHJzLT5ydHAuc2luX2xvY2FsLnNpbl9wb3J0KSwKKwkJCS8qIEZJWE1FOiB1c2UgUlRQIHBheWxvYWQgb2YgYm91bmQgc29ja2V0LCBub3QgQlRTKi8KKwkJCQlsY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZDIpOworCisJcmV0dXJuIHJjOworfQorCitpbnQgcnNsX2lwYWNjX3BkY2hfYWN0aXZhdGUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IHJzbF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGg7CisKKwlkaCA9IChzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpkaCkpOworCWluaXRfZGNoYW5faGRyKGRoLCBSU0xfTVRfSVBBQ19QRENIX0FDVCk7CisJZGgtPmMubXNnX2Rpc2NyID0gQUJJU19SU0xfTURJU0NfREVEX0NIQU47CisJZGgtPmNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKworCURFQlVHUChEUlNMLCAiJXMgSVBBQ19QRENIX0FDVFxuIiwgZ3NtX2xjaGFuX25hbWUobGNoYW4pKTsKKworCW1zZy0+dHJ4ID0gbGNoYW4tPnRzLT50cng7CisKKwlyZXR1cm4gYWJpc19yc2xfc2VuZG1zZyhtc2cpOworfQorCitzdGF0aWMgaW50IGFiaXNfcnNsX3J4X2lwYWNjX2NyY3hfYWNrKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGggPSBtc2diX2wyKG1zZyk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHY7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOworCisJLyogdGhlIEJUUyBoYXMgYWNrbm93bGVkZ2VkIGEgbG9jYWwgYmluZCwgaXQgbm93IHRlbGxzIHVzIHRoZSBJUAorCSogYWRkcmVzcyBhbmQgcG9ydCBudW1iZXIgdG8gd2hpY2ggaXQgaGFzIGJvdW5kIHRoZSBnaXZlbiBsb2dpY2FsCisJKiBjaGFubmVsICovCisKKwlyc2xfdGx2X3BhcnNlKCZ0diwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisJaWYgKCFUTFZQX1BSRVNFTlQoJnR2LCBSU0xfSUVfSVBBQ19MT0NBTF9QT1JUKSB8fAorCSAgICAhVExWUF9QUkVTRU5UKCZ0diwgUlNMX0lFX0lQQUNfTE9DQUxfSVApIHx8CisJICAgICFUTFZQX1BSRVNFTlQoJnR2LCBSU0xfSUVfSVBBQ19DT05OX0lEKSkgeworCQlMT0dQKERSU0wsIExPR0xfTk9USUNFLCAibWFuZGF0b3J5IElFIG1pc3NpbmciKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaXBhY19wYXJzZV9ydHAobGNoYW4sICZ0dik7CisKKwkvKiBpbiBjYXNlIHdlIGRvbid0IHVzZSBkaXJlY3QgQlRTLXRvLUJUUyBSVFAgKi8KKwlpZiAoIWlwYWNjX3J0cF9kaXJlY3QpIHsKKwkJaW50IHJjOworCQkvKiB0aGUgQlRTIGhhcyBzdWNjZXNzZnVsbHkgYm91bmQgYSBUQ0ggdG8gYSBsb2NhbCBpcC9wb3J0LAorCQkgKiB3aGljaCBtZWFucyB3ZSBjYW4gY29ubmVjdCBvdXIgVURQIHNvY2tldCB0byBpdCAqLworCQlpZiAobGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCkgeworCQkJcnRwX3NvY2tldF9mcmVlKGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQpOworCQkJbGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCA9IE5VTEw7CisJCX0KKworCQlsY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0ID0gcnRwX3NvY2tldF9jcmVhdGUoKTsKKwkJaWYgKCFsY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0KQorCQkJZ290byBvdXRfZXJyOworCisJCXJjID0gcnRwX3NvY2tldF9jb25uZWN0KGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQsCisJCQkJICAgbGNoYW4tPmFiaXNfaXAuYm91bmRfaXAsCisJCQkJICAgbGNoYW4tPmFiaXNfaXAuYm91bmRfcG9ydCk7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIG91dF9lcnI7CisJfQorCisJZGlzcGF0Y2hfc2lnbmFsKFNTX0FCSVNJUCwgU19BQklTSVBfQ1JDWF9BQ0ssIG1zZy0+bGNoYW4pOworCisJcmV0dXJuIDA7CitvdXRfZXJyOgorCXJldHVybiAtRUlPOworfQorCitzdGF0aWMgaW50IGFiaXNfcnNsX3J4X2lwYWNjX21kY3hfYWNrKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGFiaXNfcnNsX2RjaGFuX2hkciAqZGggPSBtc2diX2wyKG1zZyk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHY7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOworCisJLyogdGhlIEJUUyBoYXMgYWNrbm93bGVkZ2VkIGEgcmVtb3RlIGNvbm5lY3QgcmVxdWVzdCBhbmQKKwkgKiBpdCBub3cgdGVsbHMgdXMgdGhlIElQIGFkZHJlc3MgYW5kIHBvcnQgbnVtYmVyIHRvIHdoaWNoIGl0IGhhcworCSAqIGNvbm5lY3RlZCB0aGUgZ2l2ZW4gbG9naWNhbCBjaGFubmVsICovCisKKwlyc2xfdGx2X3BhcnNlKCZ0diwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisJaXBhY19wYXJzZV9ydHAobGNoYW4sICZ0dik7CisJZGlzcGF0Y2hfc2lnbmFsKFNTX0FCSVNJUCwgU19BQklTSVBfTURDWF9BQ0ssIG1zZy0+bGNoYW4pOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYWJpc19yc2xfcnhfaXBhY2NfZGxjeF9pbmQoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgYWJpc19yc2xfZGNoYW5faGRyICpkaCA9IG1zZ2JfbDIobXNnKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0djsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IG1zZy0+bGNoYW47CisKKwlyc2xfdGx2X3BhcnNlKCZ0diwgZGgtPmRhdGEsIG1zZ2JfbDJsZW4obXNnKS1zaXplb2YoKmRoKSk7CisKKwlpZiAoVExWUF9QUkVTRU5UKCZ0diwgUlNMX0lFX0NBVVNFKSkKKwkJcHJpbnRfcnNsX2NhdXNlKExPR0xfREVCVUcsIFRMVlBfVkFMKCZ0diwgUlNMX0lFX0NBVVNFKSwKKwkJCQlUTFZQX0xFTigmdHYsIFJTTF9JRV9DQVVTRSkpOworCisJLyogdGhlIEJUUyB0ZWxscyB1cyBhIFJUUCBzdHJlYW0gaGFzIGJlZW4gZGlzY29ubmVjdGVkICovCisJaWYgKGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQpIHsKKwkJcnRwX3NvY2tldF9mcmVlKGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQpOworCQlsY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0ID0gTlVMTDsKKwl9CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfQUJJU0lQLCBTX0FCSVNJUF9ETENYX0lORCwgbXNnLT5sY2hhbik7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBhYmlzX3JzbF9yeF9pcGFjYyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9ybGxfaGRyICpybGxoID0gbXNnYl9sMihtc2cpOworCWNoYXIgKnRzX25hbWU7CisJaW50IHJjID0gMDsKKworCW1zZy0+bGNoYW4gPSBsY2hhbl9sb29rdXAobXNnLT50cngsIHJsbGgtPmNoYW5fbnIpOworCXRzX25hbWUgPSBnc21fbGNoYW5fbmFtZShtc2ctPmxjaGFuKTsKKwkKKwlzd2l0Y2ggKHJsbGgtPmMubXNnX3R5cGUpIHsKKwljYXNlIFJTTF9NVF9JUEFDX0NSQ1hfQUNLOgorCQlERUJVR1AoRFJTTCwgIiVzIElQQUNfQ1JDWF9BQ0sgIiwgdHNfbmFtZSk7CisJCXJjID0gYWJpc19yc2xfcnhfaXBhY2NfY3JjeF9hY2sobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSVBBQ19DUkNYX05BQ0s6CisJCS8qIHNvbWVob3cgdGhlIEJUUyB3YXMgdW5hYmxlIHRvIGJpbmQgdGhlIGxjaGFuIHRvIGl0cyBsb2NhbAorCQkgKiBwb3J0PyE/ICovCisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIiVzIElQQUNfQ1JDWF9OQUNLXG4iLCB0c19uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSVBBQ19NRENYX0FDSzoKKwkJLyogdGhlIEJUUyB0ZWxscyB1cyB0aGF0IGEgY29ubmVjdCBvcGVyYXRpb24gd2FzIHN1Y2Nlc3NmdWwgKi8KKwkJREVCVUdQKERSU0wsICIlcyBJUEFDX01EQ1hfQUNLICIsIHRzX25hbWUpOworCQlyYyA9IGFiaXNfcnNsX3J4X2lwYWNjX21kY3hfYWNrKG1zZyk7CisJCWJyZWFrOworCWNhc2UgUlNMX01UX0lQQUNfTURDWF9OQUNLOgorCQkvKiBzb21laG93IHRoZSBCVFMgd2FzIHVuYWJsZSB0byBjb25uZWN0IHRoZSBsY2hhbiB0byBhIHJlbW90ZQorCQkgKiBwb3J0ICovCisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgIiVzIElQQUNfTURDWF9OQUNLXG4iLCB0c19uYW1lKTsKKwkJYnJlYWs7CisJY2FzZSBSU0xfTVRfSVBBQ19ETENYX0lORDoKKwkJREVCVUdQKERSU0wsICIlcyBJUEFDX0RMQ1hfSU5EICIsIHRzX25hbWUpOworCQlyYyA9IGFiaXNfcnNsX3J4X2lwYWNjX2RsY3hfaW5kKG1zZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICJVbmtub3duIGlwLmFjY2VzcyBtc2dfdHlwZSAweCUwMnhcbiIsCisJCQlybGxoLT5jLm1zZ190eXBlKTsKKwkJYnJlYWs7CisJfQorCURFQlVHUEMoRFJTTCwgIlxuIik7CisKKwlyZXR1cm4gcmM7Cit9CisKKworLyogRW50cnktcG9pbnQgd2hlcmUgTDIgUlNMIGZyb20gQlRTIGVudGVycyAqLworaW50IGFiaXNfcnNsX3Jjdm1zZyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBhYmlzX3JzbF9jb21tb25faGRyICpyc2xoID0gbXNnYl9sMihtc2cpCTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChyc2xoLT5tc2dfZGlzY3IgJiAweGZlKSB7CisJY2FzZSBBQklTX1JTTF9NRElTQ19STEw6CisJCXJjID0gYWJpc19yc2xfcnhfcmxsKG1zZyk7CisJCWJyZWFrOworCWNhc2UgQUJJU19SU0xfTURJU0NfREVEX0NIQU46CisJCXJjID0gYWJpc19yc2xfcnhfZGNoYW4obXNnKTsKKwkJYnJlYWs7CisJY2FzZSBBQklTX1JTTF9NRElTQ19DT01fQ0hBTjoKKwkJcmMgPSBhYmlzX3JzbF9yeF9jY2hhbihtc2cpOworCQlicmVhazsKKwljYXNlIEFCSVNfUlNMX01ESVNDX1RSWDoKKwkJcmMgPSBhYmlzX3JzbF9yeF90cngobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBBQklTX1JTTF9NRElTQ19MT0M6CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICJ1bmltcGxlbWVudGVkIFJTTCBtc2cgZGlzYyAweCUwMnhcbiIsCisJCQlyc2xoLT5tc2dfZGlzY3IpOworCQlicmVhazsKKwljYXNlIEFCSVNfUlNMX01ESVNDX0lQQUNDRVNTOgorCQlyYyA9IGFiaXNfcnNsX3J4X2lwYWNjKG1zZyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICJ1bmtub3duIFJTTCBtZXNzYWdlIGRpc2NyaW1pbmF0b3IgIgorCQkJIjB4JTAyeFxuIiwgcnNsaC0+bXNnX2Rpc2NyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCW1zZ2JfZnJlZShtc2cpOworCXJldHVybiByYzsKK30KKworLyogRnJvbSBUYWJsZSAxMC41LjMzIG9mIEdTTSAwNC4wOCAqLworaW50IHJzbF9udW1iZXJfb2ZfcGFnaW5nX3N1YmNoYW5uZWxzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJaWYgKGJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5jY2NoX2NvbmYgPT0gUlNMX0JDQ0hfQ0NDSF9DT05GXzFfQykgeworCQlyZXR1cm4gTUFYKDEsICgzIC0gYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmJzX2FnX2Jsa3NfcmVzKSkKKwkJCSogKGJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5ic19wYV9tZnJtcyArIDIpOworCX0gZWxzZSB7CisJCXJldHVybiAoOSAtIGJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5ic19hZ19ibGtzX3JlcykKKwkJCSogKGJ0cy0+c2lfY29tbW9uLmNoYW5fZGVzYy5ic19wYV9tZnJtcyArIDIpOworCX0KK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2JzMTFfY29uZmlnLmMgYi9vcGVuYnNjL3NyYy9iczExX2NvbmZpZy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZjliYTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9iczExX2NvbmZpZy5jCkBAIC0wLDAgKzEsODcyIEBACisvKiBTaWVtZW5zIEJTLTExIG1pY3JvQlRTIGNvbmZpZ3VyYXRpb24gdG9vbCAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgc29mdHdhcmUgaXMgYmFzZWQgb24gaWRlYXMgKGJ1dCBub3QgY29kZSkgb2YgQlMxMUNvbmZpZyAKKyAqIChDKSAyMDA5IGJ5IERpZXRlciBTcGFhciA8c3BhYXJAbWlyaWRlci5hdWd1c3RhLmRlPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3JzMjMyLmg+CisKKy8qIHN0YXRlIG9mIG91ciBiczExX2NvbmZpZyBhcHBsaWNhdGlvbiAqLworZW51bSBiczExY2ZnX3N0YXRlIHsKKwlTVEFURV9OT05FLAorCVNUQVRFX0xPR09OX1dBSVQsCisJU1RBVEVfTE9HT05fQUNLLAorCVNUQVRFX1NXTE9BRCwKKwlTVEFURV9RVUVSWSwKK307CitzdGF0aWMgZW51bSBiczExY2ZnX3N0YXRlIGJzMTFjZmdfc3RhdGUgPSBTVEFURV9OT05FOworc3RhdGljIGNoYXIgKmNvbW1hbmQsICp2YWx1ZTsKK3N0cnVjdCB0aW1lcl9saXN0IHN0YXR1c190aW1lcjsKKworc3RhdGljIGNvbnN0IHVfaW50OF90IG9ial9saV9hdHRyW10gPSB7IAorCU5NX0FUVF9CUzExX0JJVF9FUlJfVEhFU0gsIDB4MDksIDB4MDAsCisJTk1fQVRUX0JTMTFfTDFfUFJPVF9UWVBFLCAweDAwLCAKKwlOTV9BVFRfQlMxMV9MSU5FX0NGRywgMHgwMCwKK307CitzdGF0aWMgY29uc3QgdV9pbnQ4X3Qgb2JqX2Jic2lnMF9hdHRyW10gPSB7CisJTk1fQVRUX0JTMTFfUlNTSV9PRkZTLCAweDAyLCAweDAwLCAweDAwLAorCU5NX0FUVF9CUzExX0RJVkVSU0lUWSwgMHgwMSwgMHgwMCwKK307CitzdGF0aWMgY29uc3QgdV9pbnQ4X3Qgb2JqX3BhMF9hdHRyW10gPSB7CisJTk1fQVRUX0JTMTFfVFhQV1IsIDB4MDEsIEJTMTFfVFJYX1BPV0VSX0dTTV8zMG1XLAorfTsKK3N0YXRpYyBjb25zdCBjaGFyICp0cngxX3Bhc3N3b3JkID0gIjExMTExMTExMTEiOworI2RlZmluZSBURUlfT01MCTI1CisKK3N0YXRpYyBjb25zdCB1X2ludDhfdCB0b29fZmFzdFtdID0geyAweDEyLCAweDgwLCAweDAwLCAweDAwLCAweDAyLCAweDAyIH07CisKK3N0YXRpYyBzdHJ1Y3QgZGVidWdfdGFyZ2V0ICpzdGRlcnJfdGFyZ2V0OworCisvKiBkdW1teSBmdW5jdGlvbiB0byBrZWVwIGdzbV9kYXRhLmMgaGFwcHkgKi8KK3N0cnVjdCBjb3VudGVyICpjb3VudGVyX2FsbG9jKGNvbnN0IGNoYXIgKm5hbWUpCit7CisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBoYW5kbGVfc2VyaWFsX21zZyhzdHJ1Y3QgbXNnYiAqcnhfbXNnKTsKKworLyogY3JlYXRlIGFsbCBvYmplY3RzIGZvciBhbiBpbml0aWFsIGNvbmZpZ3VyYXRpb24gKi8KK3N0YXRpYyBpbnQgY3JlYXRlX29iamVjdHMoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlmcHJpbnRmKHN0ZG91dCwgIkNyYXRpbmcgT2JqZWN0cyBmb3IgbWluaW1hbCBjb25maWdcbiIpOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfb2JqZWN0KGJ0cywgQlMxMV9PQkpfTEksIDAsIHNpemVvZihvYmpfbGlfYXR0ciksCisJCQkJICAgb2JqX2xpX2F0dHIpOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfb2JqZWN0KGJ0cywgQlMxMV9PQkpfR1BTVSwgMCwgMCwgTlVMTCk7CisJYWJpc19ubV9iczExX2NyZWF0ZV9vYmplY3QoYnRzLCBCUzExX09CSl9BTENPLCAwLCAwLCBOVUxMKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX29iamVjdChidHMsIEJTMTFfT0JKX0NDTEssIDAsIDAsIE5VTEwpOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfb2JqZWN0KGJ0cywgQlMxMV9PQkpfQkJTSUcsIDAsCisJCQkJICAgc2l6ZW9mKG9ial9iYnNpZzBfYXR0ciksIG9ial9iYnNpZzBfYXR0cik7CisJYWJpc19ubV9iczExX2NyZWF0ZV9vYmplY3QoYnRzLCBCUzExX09CSl9QQSwgMCwKKwkJCQkgICBzaXplb2Yob2JqX3BhMF9hdHRyKSwgb2JqX3BhMF9hdHRyKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX2VudmFCVFNFKGJ0cywgMCk7CisJYWJpc19ubV9iczExX2NyZWF0ZV9lbnZhQlRTRShidHMsIDEpOworCWFiaXNfbm1fYnMxMV9jcmVhdGVfZW52YUJUU0UoYnRzLCAyKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX2VudmFCVFNFKGJ0cywgMyk7CisKKwlhYmlzX25tX2JzMTFfY29ubl9vbWxfdGVpKGJ0cywgMCwgMSwgMHhmZiwgVEVJX09NTCk7CisKKwlhYmlzX25tX2JzMTFfc2V0X3RyeF9wb3dlcihidHMtPmMwLCBCUzExX1RSWF9QT1dFUl9HU01fMzBtVyk7CisJCisJc2xlZXAoMSk7CisKKwlhYmlzX25tX2JzMTFfc2V0X3RyeDFfcHcoYnRzLCB0cngxX3Bhc3N3b3JkKTsKKworCXNsZWVwKDEpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY3JlYXRlX3RyeDEoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwl1X2ludDhfdCBiYnNpZzFfYXR0cltzaXplb2Yob2JqX2Jic2lnMF9hdHRyKSsxMl07CisJdV9pbnQ4X3QgKmN1ciA9IGJic2lnMV9hdHRyOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgMSk7CisKKwlpZiAoIXRyeCkKKwkJdHJ4ID0gZ3NtX2J0c190cnhfYWxsb2MoYnRzKTsKKworCWZwcmludGYoc3Rkb3V0LCAiQ3JhdGluZyBPYmplY3RzIGZvciBUUlgxXG4iKTsKKworCWFiaXNfbm1fYnMxMV9zZXRfdHJ4MV9wdyhidHMsIHRyeDFfcGFzc3dvcmQpOworCisJc2xlZXAoMSk7CisKKwljdXIgPSB0bHZfcHV0KGN1ciwgTk1fQVRUX0JTMTFfUEFTU1dPUkQsIDEwLAorCQkgICAgICAodV9pbnQ4X3QgKil0cngxX3Bhc3N3b3JkKTsKKwltZW1jcHkoY3VyLCBvYmpfYmJzaWcwX2F0dHIsIHNpemVvZihvYmpfYmJzaWcwX2F0dHIpKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX29iamVjdChidHMsIEJTMTFfT0JKX0JCU0lHLCAxLAorCQkJCSAgIHNpemVvZihiYnNpZzFfYXR0ciksIGJic2lnMV9hdHRyKTsKKwlhYmlzX25tX2JzMTFfY3JlYXRlX29iamVjdChidHMsIEJTMTFfT0JKX1BBLCAxLAorCQkJCSAgIHNpemVvZihvYmpfcGEwX2F0dHIpLCBvYmpfcGEwX2F0dHIpOworCWFiaXNfbm1fYnMxMV9zZXRfdHJ4X3Bvd2VyKHRyeCwgQlMxMV9UUlhfUE9XRVJfR1NNXzMwbVcpOworCQorCXJldHVybiAwOworfQorCitzdGF0aWMgY2hhciAqc2VyaWFsX3BvcnQgPSAiL2Rldi90dHlVU0IwIjsKK3N0YXRpYyBjaGFyICpmbmFtZV9zYWZldHkgPSAiQlRTQk1DNzYuU1dJIjsKK3N0YXRpYyBjaGFyICpmbmFtZV9zb2Z0d2FyZSA9ICJIUzAxMTEwNi5TV0wiOworc3RhdGljIGludCBkZWxheV9tcyA9IDA7CitzdGF0aWMgaW50IHdpbl9zaXplID0gODsKK3N0YXRpYyBpbnQgcGFyYW1fZGlzY29ubmVjdCA9IDA7CitzdGF0aWMgaW50IHBhcmFtX3Jlc3RhcnQgPSAwOworc3RhdGljIGludCBwYXJhbV9mb3JjZWQgPSAwOworc3RhdGljIHN0cnVjdCBnc21fYnRzICpnX2J0czsKKworc3RhdGljIGludCBmaWxlX2lzX3JlYWRhYmxlKGNvbnN0IGNoYXIgKmZuYW1lKQoreworCWludCByYzsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKworCXJjID0gc3RhdChmbmFtZSwgJnN0KTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gMDsKKworCWlmIChTX0lTUkVHKHN0LnN0X21vZGUpICYmIChzdC5zdF9tb2RlICYgU19JUlVTUikpCisJCXJldHVybiAxOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGVyY2VudDsKK3N0YXRpYyBpbnQgcGVyY2VudF9vbGQ7CisKKy8qIGNhbGxiYWNrIGZ1bmN0aW9uIHBhc3NlZCB0byB0aGUgQUJJUyBPTUwgY29kZSAqLworc3RhdGljIGludCBzd2xvYWRfY2Jmbih1bnNpZ25lZCBpbnQgaG9vaywgdW5zaWduZWQgaW50IGV2ZW50LCBzdHJ1Y3QgbXNnYiAqbXNnLAorCQkgICAgICAgdm9pZCAqZGF0YSwgdm9pZCAqcGFyYW0pCit7CisJaWYgKGhvb2sgIT0gR1NNX0hPT0tfTk1fU1dMT0FEKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIE5NX01UX0xPQURfSU5JVF9BQ0s6CisJCWZwcmludGYoc3Rkb3V0LCAiU29mdHdhcmUgTG9hZCBJbml0aWF0ZSBBQ0tcbiIpOworCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfSU5JVF9OQUNLOgorCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBTb2Z0d2FyZSBMb2FkIEluaXRpYXRlIE5BQ0tcbiIpOworCQlleGl0KDUpOworCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfRU5EX0FDSzoKKwkJaWYgKGRhdGEpIHsKKwkJCS8qIHdlIGRpZCBhIHNhZmV0eSBsb2FkIGFuZCBtdXN0IGFjdGl2YXRlIGl0ICovCisJCQlhYmlzX25tX3NvZnR3YXJlX2FjdGl2YXRlKGdfYnRzLCBmbmFtZV9zYWZldHksCisJCQkJCQkgIHN3bG9hZF9jYmZuLCBnX2J0cyk7CisJCQlzbGVlcCg1KTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfRU5EX05BQ0s6CisJCWZwcmludGYoc3RkZXJyLCAiRVJST1I6IFNvZnR3YXJlIExvYWQgRW5kIE5BQ0tcbiIpOworCQlleGl0KDMpOworCQlicmVhazsKKwljYXNlIE5NX01UX0FDVElWQVRFX1NXX05BQ0s6CisJCWZwcmludGYoc3RkZXJyLCAiRVJST1I6IEFjdGl2YXRlIFNvZnR3YXJlIE5BQ0tcbiIpOworCQlleGl0KDQpOworCQlicmVhazsKKwljYXNlIE5NX01UX0FDVElWQVRFX1NXX0FDSzoKKwkJYnMxMWNmZ19zdGF0ZSA9IFNUQVRFX05PTkU7CisJCQorCQlicmVhazsKKwljYXNlIE5NX01UX0xPQURfU0VHX0FDSzoKKwkJcGVyY2VudCA9IGFiaXNfbm1fc29mdHdhcmVfbG9hZF9zdGF0dXMoZ19idHMpOworCQlpZiAocGVyY2VudCA+IHBlcmNlbnRfb2xkKQorCQkJcHJpbnRmKCJTb2Z0d2FyZSBEb3dubG9hZCBQcm9ncmVzczogJWQlJVxuIiwgcGVyY2VudCk7CisJCXBlcmNlbnRfb2xkID0gcGVyY2VudDsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYnMxMV9saW5rX3N0YXRlW10gPSB7CisJWzB4MDBdCT0gIkRvd24iLAorCVsweDAxXQk9ICJVcCIsCisJWzB4MDJdCT0gIlJlc3RvcmluZyIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqbGlua3N0YXRlX25hbWUodV9pbnQ4X3QgbGlua3N0YXRlKQoreworCWlmIChsaW5rc3RhdGUgPiBBUlJBWV9TSVpFKGJzMTFfbGlua19zdGF0ZSkpCisJCXJldHVybiAiVW5rbm93biI7CisKKwlyZXR1cm4gYnMxMV9saW5rX3N0YXRlW2xpbmtzdGF0ZV07Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICptYmNjdV9sb2FkW10gPSB7CisJWzBdCT0gIk5vIExvYWQiLAorCVsxXQk9ICJMb2FkIEJUU0NBQyIsCisJWzJdCT0gIkxvYWQgQlRTRFJYIiwKKwlbM10JPSAiTG9hZCBCVFNCQlgiLAorCVs0XQk9ICJMb2FkIEJUU0FSQyIsCisJWzVdCT0gIkxvYWQiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKm1iY2N1X2xvYWRfbmFtZSh1X2ludDhfdCBsaW5rc3RhdGUpCit7CisJaWYgKGxpbmtzdGF0ZSA+IEFSUkFZX1NJWkUobWJjY3VfbG9hZCkpCisJCXJldHVybiAiVW5rbm93biI7CisKKwlyZXR1cm4gbWJjY3VfbG9hZFtsaW5rc3RhdGVdOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYnRzX3BoYXNlX25hbWUodV9pbnQ4X3QgcGhhc2UpCit7CisJc3dpdGNoIChwaGFzZSkgeworCWNhc2UgQlMxMV9TVEFURV9XQVJNX1VQOgorCWNhc2UgQlMxMV9TVEFURV9XQVJNX1VQXzI6CisJCXJldHVybiAiV2FybSBVcCI7CisJCWJyZWFrOworCWNhc2UgQlMxMV9TVEFURV9MT0FEX1NNVV9TQUZFVFk6CisJCXJldHVybiAiTG9hZCBTTVUgU2FmZXR5IjsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX0xPQURfU01VX0lOVEVOREVEOgorCQlyZXR1cm4gIkxvYWQgU01VIEludGVuZGVkIjsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX0xPQURfTUJDQ1U6CisJCXJldHVybiAiTG9hZCBNQkNDVSI7CisJCWJyZWFrOworCWNhc2UgQlMxMV9TVEFURV9TT0ZUV0FSRV9SUUQ6CisJCXJldHVybiAiU29mdHdhcmUgcmVxdWlyZWQiOworCQlicmVhazsKKwljYXNlIEJTMTFfU1RBVEVfV0FJVF9NSU5fQ0ZHOgorCWNhc2UgQlMxMV9TVEFURV9XQUlUX01JTl9DRkdfMjoKKwkJcmV0dXJuICJXYWl0IG1pbmltYWwgY29uZmlnIjsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX01BSU5URU5BTkNFOgorCQlyZXR1cm4gIk1haW50ZW5hbmNlIjsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX05PUk1BTDoKKwkJcmV0dXJuICJOb3JtYWwiOworCQlicmVhazsKKwljYXNlIEJTMTFfU1RBVEVfQUJJU19MT0FEOgorCQlyZXR1cm4gIkFiaXMgbG9hZCI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldHVybiAiVW5rbm93biI7CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnRyeF9wb3dlcl9uYW1lKHVfaW50OF90IHB3cikKK3sKKwlzd2l0Y2ggKHB3cikgeworCWNhc2UgQlMxMV9UUlhfUE9XRVJfR1NNXzJXOgkKKwkJcmV0dXJuICIyVyAoR1NNKSI7CisJY2FzZSBCUzExX1RSWF9QT1dFUl9HU01fMjUwbVc6CisJCXJldHVybiAiMjUwbVcgKEdTTSkiOworCWNhc2UgQlMxMV9UUlhfUE9XRVJfR1NNXzgwbVc6CisJCXJldHVybiAiODBtVyAoR1NNKSI7CisJY2FzZSBCUzExX1RSWF9QT1dFUl9HU01fMzBtVzoKKwkJcmV0dXJuICIzMG1XIChHU00pIjsKKwljYXNlIEJTMTFfVFJYX1BPV0VSX0RDU18zVzoKKwkJcmV0dXJuICIzVyAoRENTKSI7CisJY2FzZSBCUzExX1RSWF9QT1dFUl9EQ1NfMVc2OgorCQlyZXR1cm4gIjEuNlcgKERDUykiOworCWNhc2UgQlMxMV9UUlhfUE9XRVJfRENTXzUwMG1XOgorCQlyZXR1cm4gIjUwMG1XIChEQ1MpIjsKKwljYXNlIEJTMTFfVFJYX1BPV0VSX0RDU18xNjBtVzoKKwkJcmV0dXJuICIxNjBtVyAoRENTKSI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJ1bmtub3duIHZhbHVlIjsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpwbGxfbW9kZV9uYW1lKHVfaW50OF90IG1vZGUpCit7CisJc3dpdGNoIChtb2RlKSB7CisJY2FzZSBCUzExX0xJX1BMTF9MT0NLRUQ6CisJCXJldHVybiAiRTEgTG9ja2VkIjsKKwljYXNlIEJTMTFfTElfUExMX1NUQU5EQUxPTkU6CisJCXJldHVybiAiU3RhbmRhbG9uZSI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJ1bmtub3duIjsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpjY2xrX2FjY19uYW1lKHVfaW50OF90IGFjYykKK3sKKwlzd2l0Y2ggKGFjYykgeworCWNhc2UgMDoKKwkJLyogT3V0IG9mIHRoZSBkZW1hbmRlZCArLy0gMC4wNXBwbSAqLworCQlyZXR1cm4gIk1lZGl1bSI7CisJY2FzZSAxOgorCQkvKiBTeW5jaHJvbml6ZWQgd2l0aCBBYmlzLCB3aXRoaW4gZGVtYW5kZWQgdG9sZXJhbmNlICsvLSAwLjA1cHBtICovCisJCXJldHVybiAiSGlnaCI7CisJZGVmYXVsdDoKKwkJcmV0dXJuICJ1bmtub3duIjsKKwl9Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpvYmpfbmFtZShzdHJ1Y3QgYWJpc19vbV9mb21faGRyICpmb2gpCit7CisJc3RhdGljIGNoYXIgcmV0YnVmWzI1Nl07CisKKwlyZXRidWZbMF0gPSAwOworCisJc3dpdGNoIChmb2gtPm9ial9jbGFzcykgeworCWNhc2UgTk1fT0NfQlMxMToKKwkJc3RyY2F0KHJldGJ1ZiwgIkJTMTEgIik7CisJCXN3aXRjaCAoZm9oLT5vYmpfaW5zdC5idHNfbnIpIHsKKwkJY2FzZSBCUzExX09CSl9QQToKKwkJCXNwcmludGYocmV0YnVmK3N0cmxlbihyZXRidWYpLCAiUG93ZXIgQW1wbGlmaWVyICVkICIsCisJCQkJZm9oLT5vYmpfaW5zdC50c19ucik7CisJCQlicmVhazsKKwkJY2FzZSBCUzExX09CSl9MSToKKwkJCXNwcmludGYocmV0YnVmK3N0cmxlbihyZXRidWYpLCAiTGluZSBJbnRlcmZhY2UgIik7CisJCQlicmVhazsKKwkJY2FzZSBCUzExX09CSl9DQ0xLOgorCQkJc3ByaW50ZihyZXRidWYrc3RybGVuKHJldGJ1ZiksICJDQ0xLICIpOworCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOTV9PQ19TSVRFX01BTkFHRVI6CisJCXN0cmNhdChyZXRidWYsICJTSVRFIE1BTkFHRVIgIik7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0YnVmOworfQorCitzdGF0aWMgdm9pZCBwcmludF9zdGF0ZShzdHJ1Y3QgdGx2X3BhcnNlZCAqdHApCit7CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKSkgeworCQl1X2ludDhfdCBwaGFzZSwgbWJjY3U7CisJCWlmIChUTFZQX0xFTih0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKSA+PSAxKSB7CisJCQlwaGFzZSA9ICpUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKTsKKwkJCXByaW50ZigiUEhBU0U6ICV1ICUtMjBzICIsIHBoYXNlICYgMHhmLAorCQkJCWJ0c19waGFzZV9uYW1lKHBoYXNlKSk7CisJCX0KKwkJaWYgKFRMVlBfTEVOKHRwLCBOTV9BVFRfQlMxMV9CVFNfU1RBVEUpID49IDIpIHsKKwkJCW1iY2N1ID0gKihUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKSsxKTsKKwkJCXByaW50ZigiTUJDQ1UwOiAlLTExcyBNQkNDVTE6ICUtMTFzICIsCisJCQkJbWJjY3VfbG9hZF9uYW1lKG1iY2N1ICYgMHhmKSwgbWJjY3VfbG9hZF9uYW1lKG1iY2N1ID4+IDQpKTsKKwkJfQorCX0KKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfQlMxMV9FMV9TVEFURSkgJiYKKwkgICAgVExWUF9MRU4odHAsIE5NX0FUVF9CUzExX0UxX1NUQVRFKSA+PSAxKSB7CisJCXVfaW50OF90IGUxX3N0YXRlID0gKlRMVlBfVkFMKHRwLCBOTV9BVFRfQlMxMV9FMV9TVEFURSk7CisJCXByaW50ZigiQWJpcy1saW5rOiAlLTlzICIsIGxpbmtzdGF0ZV9uYW1lKGUxX3N0YXRlICYgMHhmKSk7CisJfQorCXByaW50ZigiXG4iKTsKK30KKworc3RhdGljIGludCBwcmludF9hdHRyKHN0cnVjdCB0bHZfcGFyc2VkICp0cCkKK3sKKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfQlMxMV9FU05fUENCX1NFUklBTCkpIHsKKwkJcHJpbnRmKCJcdEJTLTExIEVTTiBQQ0IgU2VyaWFsIE51bWJlcjogJXNcbiIsCisJCQlUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfRVNOX1BDQl9TRVJJQUwpKTsKKwl9CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfRVNOX0hXX0NPREVfTk8pKSB7CisJCXByaW50ZigiXHRCUy0xMSBFU04gSGFyZHdhcmUgQ29kZSBOdW1iZXI6ICVzXG4iLAorCQkJVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX0VTTl9IV19DT0RFX05PKSs2KTsKKwl9CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfRVNOX0ZXX0NPREVfTk8pKSB7CisJCXByaW50ZigiXHRCUy0xMSBFU04gRmlybXdhcmUgQ29kZSBOdW1iZXI6ICVzXG4iLAorCQkJVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX0VTTl9GV19DT0RFX05PKSs2KTsKKwl9CisjaWYgMAorCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX0JPT1RfU1dfVkVSUykpIHsKKwkJcHJpbnRmKCJCUy0xMSBCb290IFNvZnR3YXJlIFZlcnNpb246ICVzXG4iLAorCQkJVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX0JPT1RfU1dfVkVSUykrNik7CisJfQorI2VuZGlmCisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0FCSVNfQ0hBTk5FTCkgJiYKKwkgICAgVExWUF9MRU4odHAsIE5NX0FUVF9BQklTX0NIQU5ORUwpID49IDMpIHsKKwkJY29uc3QgdV9pbnQ4X3QgKmNoYW4gPSBUTFZQX1ZBTCh0cCwgTk1fQVRUX0FCSVNfQ0hBTk5FTCk7CisJCXByaW50ZigiXHRFMSBDaGFubmVsOiBQb3J0PSV1IFRpbWVzbG90PSV1ICIsCisJCQljaGFuWzBdLCBjaGFuWzFdKTsKKwkJaWYgKGNoYW5bMl0gPT0gMHhmZikKKwkJCXByaW50ZigiKEZ1bGwgU2xvdClcbiIpOworCQllbHNlCisJCQlwcmludGYoIlN1YnNsb3Q9JXVcbiIsIGNoYW5bMl0pOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfVEVJKSkKKwkJcHJpbnRmKCJcdFRFSTogJWRcbiIsICpUTFZQX1ZBTCh0cCwgTk1fQVRUX1RFSSkpOworCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX1RYUFdSKSAmJgorCSAgICBUTFZQX0xFTih0cCwgTk1fQVRUX0JTMTFfVFhQV1IpID49IDEpIHsKKwkJcHJpbnRmKCJcdFRSWCBQb3dlcjogJXNcbiIsCisJCQl0cnhfcG93ZXJfbmFtZSgqVExWUF9WQUwodHAsIE5NX0FUVF9CUzExX1RYUFdSKSkpOworCX0KKwlpZiAoVExWUF9QUkVTRU5UKHRwLCBOTV9BVFRfQlMxMV9QTExfTU9ERSkgJiYKKwkgICAgVExWUF9MRU4odHAsIE5NX0FUVF9CUzExX1BMTF9NT0RFKSA+PSAxKSB7CisJCXByaW50ZigiXHRQTEwgTW9kZTogJXNcbiIsCisJCQlwbGxfbW9kZV9uYW1lKCpUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfUExMX01PREUpKSk7CisJfQorCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX1BMTCkgJiYKKwkgICAgVExWUF9MRU4odHAsIE5NX0FUVF9CUzExX1BMTCkgPj0gNCkgeworCQljb25zdCB1X2ludDhfdCAqdnAgPSBUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfUExMKTsKKwkJcHJpbnRmKCJcdFBMTCBTZXQgVmFsdWU9JWQsIFdvcmsgVmFsdWU9JWRcbiIsCisJCQl2cFswXSA8PCA4IHwgdnBbMV0sIHZwWzJdIDw8IDggfCB2cFszXSk7CisJfQorCWlmIChUTFZQX1BSRVNFTlQodHAsIE5NX0FUVF9CUzExX0NDTEtfQUNDVVJBQ1kpICYmCisJICAgIFRMVlBfTEVOKHRwLCBOTV9BVFRfQlMxMV9DQ0xLX0FDQ1VSQUNZKSA+PSAxKSB7CisJCWNvbnN0IHVfaW50OF90ICphY2MgPSBUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfQ0NMS19BQ0NVUkFDWSk7CisJCXByaW50ZigiXHRDQ0xLIEFjY3VyYWN5OiAlcyAoJWQpXG4iLCBjY2xrX2FjY19uYW1lKCphY2MpLCAqYWNjKTsKKwl9CisJaWYgKFRMVlBfUFJFU0VOVCh0cCwgTk1fQVRUX0JTMTFfQ0NMS19UWVBFKSAmJgorCSAgICBUTFZQX0xFTih0cCwgTk1fQVRUX0JTMTFfQ0NMS19UWVBFKSA+PSAxKSB7CisJCWNvbnN0IHVfaW50OF90ICphY2MgPSBUTFZQX1ZBTCh0cCwgTk1fQVRUX0JTMTFfQ0NMS19UWVBFKTsKKwkJcHJpbnRmKCJcdENDTEsgVHlwZT0lZFxuIiwgKmFjYyk7CisJfQorCisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgY21kX3F1ZXJ5KHZvaWQpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSBnX2J0cy0+YzA7CisKKwliczExY2ZnX3N0YXRlID0gU1RBVEVfUVVFUlk7CisJYWJpc19ubV9iczExX2dldF9zZXJubyhnX2J0cyk7CisJYWJpc19ubV9iczExX2dldF9vbWxfdGVpX3RzKGdfYnRzKTsKKwlhYmlzX25tX2JzMTFfZ2V0X3BsbF9tb2RlKGdfYnRzKTsKKwlhYmlzX25tX2JzMTFfZ2V0X2NjbGsoZ19idHMpOworCWFiaXNfbm1fYnMxMV9nZXRfdHJ4X3Bvd2VyKHRyeCk7CisJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGdfYnRzLCAxKTsKKwlpZiAodHJ4KQorCQlhYmlzX25tX2JzMTFfZ2V0X3RyeF9wb3dlcih0cngpOworCXNsZWVwKDEpOworCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwljb21tYW5kID0gTlVMTDsKK30KKworLyogaGFuZGxlIGEgcmVzcG9uc2UgZnJvbSB0aGUgQlRTIHRvIGEgR0VUIFNUQVRFIGNvbW1hbmQgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX3N0YXRlX3Jlc3AoZW51bSBhYmlzX2JzMTFfcGhhc2Ugc3RhdGUpCit7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoc3RhdGUpIHsKKwljYXNlIEJTMTFfU1RBVEVfV0FSTV9VUDoKKwljYXNlIEJTMTFfU1RBVEVfTE9BRF9TTVVfU0FGRVRZOgorCWNhc2UgQlMxMV9TVEFURV9MT0FEX1NNVV9JTlRFTkRFRDoKKwljYXNlIEJTMTFfU1RBVEVfTE9BRF9NQkNDVToKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX1NPRlRXQVJFX1JRRDoKKwkJYnMxMWNmZ19zdGF0ZSA9IFNUQVRFX1NXTE9BRDsKKwkJLyogc2VuZCBzYWZldHkgbG9hZC4gVXNlIGdfYnRzIGFzIHByaXZhdGUgJ3BhcmFtJworCQkgKiBhcmd1bWVudCwgc28gb3VyIHN3bG9hZF9jYmZuIGNhbiBkaXN0aW5ndWlzaAorCQkgKiBhIHNhZmV0eSBsb2FkIGZyb20gYSByZWd1bGFyIHNvZnR3YXJlICovCisJCWlmIChmaWxlX2lzX3JlYWRhYmxlKGZuYW1lX3NhZmV0eSkpCisJCQlyYyA9IGFiaXNfbm1fc29mdHdhcmVfbG9hZChnX2J0cywgZm5hbWVfc2FmZXR5LAorCQkJCQkJICAgd2luX3NpemUsIHBhcmFtX2ZvcmNlZCwKKwkJCQkJCSAgIHN3bG9hZF9jYmZuLCBnX2J0cyk7CisJCWVsc2UKKwkJCWZwcmludGYoc3RkZXJyLCAiTm8gdmFsaWQgU2FmZXR5IExvYWQgZmlsZSBcIiVzXCJcbiIsCisJCQkJZm5hbWVfc2FmZXR5KTsKKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX1dBSVRfTUlOX0NGRzoKKwljYXNlIEJTMTFfU1RBVEVfV0FJVF9NSU5fQ0ZHXzI6CisJCWJzMTFjZmdfc3RhdGUgPSBTVEFURV9TV0xPQUQ7CisJCXJjID0gY3JlYXRlX29iamVjdHMoZ19idHMpOworCQlicmVhazsKKwljYXNlIEJTMTFfU1RBVEVfTUFJTlRFTkFOQ0U6CisJCWlmIChjb21tYW5kKSB7CisJCQlpZiAoIXN0cmNtcChjb21tYW5kLCAiZGlzY29ubmVjdCIpKQorCQkJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJCWVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgInJlY29ubmVjdCIpKQorCQkJCXJjID0gYWJpc19ubV9iczExX2JzY19kaXNjb25uZWN0KGdfYnRzLCAxKTsKKwkJCWVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgInNvZnR3YXJlIikKKwkJCSAgICAmJiBiczExY2ZnX3N0YXRlICE9IFNUQVRFX1NXTE9BRCkgeworCQkJCWJzMTFjZmdfc3RhdGUgPSBTVEFURV9TV0xPQUQ7CisJCQkJLyogc2VuZCBzb2Z0d2FyZSAoRklYTUU6IG92ZXIgQS1iaXM/KSAqLworCQkJCWlmIChmaWxlX2lzX3JlYWRhYmxlKGZuYW1lX3NvZnR3YXJlKSkKKwkJCQkJcmMgPSBhYmlzX25tX2JzMTFfbG9hZF9zd2woZ19idHMsIGZuYW1lX3NvZnR3YXJlLAorCQkJCQkJCQkgICB3aW5fc2l6ZSwgcGFyYW1fZm9yY2VkLAorCQkJCQkJCQkgICBzd2xvYWRfY2Jmbik7CisJCQkJZWxzZQorCQkJCQlmcHJpbnRmKHN0ZGVyciwgIk5vIHZhbGlkIFNvZnR3YXJlIGZpbGUgXCIlc1wiXG4iLAorCQkJCQkJZm5hbWVfc29mdHdhcmUpOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJkZWxldGUtdHJ4MSIpKSB7CisJCQkJcHJpbnRmKCJMb2NpbmcgQkJTSUcgYW5kIFBBIG9iamVjdHMgb2YgVFJYMVxuIik7CisJCQkJYWJpc19ubV9jaGdfYWRtX3N0YXRlKGdfYnRzLCBOTV9PQ19CUzExLAorCQkJCQkJICAgICAgQlMxMV9PQkpfQkJTSUcsIDAsIDEsCisJCQkJCQkgICAgICBOTV9TVEFURV9MT0NLRUQpOworCQkJCWFiaXNfbm1fY2hnX2FkbV9zdGF0ZShnX2J0cywgTk1fT0NfQlMxMSwKKwkJCQkJCSAgICAgIEJTMTFfT0JKX1BBLCAwLCAxLAorCQkJCQkJICAgICAgTk1fU1RBVEVfTE9DS0VEKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlwcmludGYoIkRlbGV0aW5nIEJCU0lHIGFuZCBQQSBvYmplY3RzIG9mIFRSWDFcbiIpOworCQkJCWFiaXNfbm1fYnMxMV9kZWxldGVfb2JqZWN0KGdfYnRzLCBCUzExX09CSl9CQlNJRywgMSk7CisJCQkJYWJpc19ubV9iczExX2RlbGV0ZV9vYmplY3QoZ19idHMsIEJTMTFfT0JKX1BBLCAxKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgImNyZWF0ZS10cngxIikpIHsKKwkJCQljcmVhdGVfdHJ4MShnX2J0cyk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJwbGwtZTEtbG9ja2VkIikpIHsKKwkJCQlhYmlzX25tX2JzMTFfc2V0X3BsbF9sb2NrZWQoZ19idHMsIDEpOworCQkJCXNsZWVwKDEpOworCQkJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJCQljb21tYW5kID0gTlVMTDsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAicGxsLXN0YW5kYWxvbmUiKSkgeworCQkJCWFiaXNfbm1fYnMxMV9zZXRfcGxsX2xvY2tlZChnX2J0cywgMCk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJwbGwtc2V0dmFsdWUiKSkgeworCQkJCWFiaXNfbm1fYnMxMV9zZXRfcGxsKGdfYnRzLCBhdG9pKHZhbHVlKSk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJwbGwtd29ya3ZhbHVlIikpIHsKKwkJCQkvKiBUbyBzZXQgdGhlIHdvcmsgdmFsdWUgd2UgbmVlZCB0byBsb2dpbiBhcyBGSUVMRCAqLworCQkJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfaW5maWVsZF9sb2dvbihnX2J0cywgMSk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX3NldF9wbGwoZ19idHMsIGF0b2kodmFsdWUpKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfaW5maWVsZF9sb2dvbihnX2J0cywgMCk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgIm9tbC10ZWkiKSkgeworCQkJCWFiaXNfbm1fYnMxMV9jb25uX29tbF90ZWkoZ19idHMsIDAsIDEsIDB4ZmYsIFRFSV9PTUwpOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJyZXN0YXJ0IikpIHsKKwkJCQlhYmlzX25tX2JzMTFfcmVzdGFydChnX2J0cyk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgInF1ZXJ5IikpIHsKKwkJCQljbWRfcXVlcnkoKTsKKwkJCX0gZWxzZSBpZiAoIXN0cmNtcChjb21tYW5kLCAiY3JlYXRlLWJwb3J0MSIpKSB7CisJCQkJYWJpc19ubV9iczExX2NyZWF0ZV9icG9ydChnX2J0cywgMSk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJkZWxldGUtYnBvcnQxIikpIHsKKwkJCQlhYmlzX25tX2NoZ19hZG1fc3RhdGUoZ19idHMsIE5NX09DX0JTMTFfQlBPUlQsIDEsIDB4ZmYsIDB4ZmYsIE5NX1NUQVRFX0xPQ0tFRCk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2RlbGV0ZV9icG9ydChnX2J0cywgMSk7CisJCQkJc2xlZXAoMSk7CisJCQkJYWJpc19ubV9iczExX2ZhY3RvcnlfbG9nb24oZ19idHMsIDApOworCQkJCWNvbW1hbmQgPSBOVUxMOworCQkJfSBlbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJicG9ydDAtc3RhciIpKSB7CisJCQkJYWJpc19ubV9iczExX3NldF9icG9ydF9saW5lX2NmZyhnX2J0cywgMCwgQlMxMV9MSU5FX0NGR19TVEFSKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9IGVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgImJwb3J0MC1tdWx0aWRyb3AiKSkgeworCQkJCWFiaXNfbm1fYnMxMV9zZXRfYnBvcnRfbGluZV9jZmcoZ19idHMsIDAsIEJTMTFfTElORV9DRkdfTVVMVElEUk9QKTsKKwkJCQlzbGVlcCgxKTsKKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQkJY29tbWFuZCA9IE5VTEw7CisJCQl9CisJCX0KKwkJYnJlYWs7CisJY2FzZSBCUzExX1NUQVRFX05PUk1BTDoKKwkJaWYgKGNvbW1hbmQpIHsKKwkJCWlmICghc3RyY21wKGNvbW1hbmQsICJyZWNvbm5lY3QiKSkKKwkJCQlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisJCQllbHNlIGlmICghc3RyY21wKGNvbW1hbmQsICJkaXNjb25uZWN0IikpCisJCQkJYWJpc19ubV9iczExX2JzY19kaXNjb25uZWN0KGdfYnRzLCAwKTsKKwkJCWVsc2UgaWYgKCFzdHJjbXAoY29tbWFuZCwgInF1ZXJ5IikpIHsKKwkJCQljbWRfcXVlcnkoKTsKKwkJCX0KKwkJfSBlbHNlIGlmIChwYXJhbV9kaXNjb25uZWN0KSB7CisJCQlwYXJhbV9kaXNjb25uZWN0ID0gMDsKKwkJCWFiaXNfbm1fYnMxMV9ic2NfZGlzY29ubmVjdChnX2J0cywgMCk7CisJCQlpZiAocGFyYW1fcmVzdGFydCkgeworCQkJCXBhcmFtX3Jlc3RhcnQgPSAwOworCQkJCWFiaXNfbm1fYnMxMV9yZXN0YXJ0KGdfYnRzKTsKKwkJCX0KKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIHJjOworfQorCisvKiBoYW5kbGUgYSBmdWxseS1yZWNlaXZlZCBtZXNzYWdlL3BhY2tldCBmcm9tIHRoZSBSUzIzMiBwb3J0ICovCitpbnQgaGFuZGxlX3NlcmlhbF9tc2coc3RydWN0IG1zZ2IgKnJ4X21zZykKK3sKKwlzdHJ1Y3QgYWJpc19vbV9oZHIgKm9oOworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaDsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlpbnQgcmMgPSAtMTsKKworI2lmIDAKKwlpZiAocnhfbXNnLT5sZW4gPCBMQVBEX0hEUl9MRU4KKwkJCSAgKyBzaXplb2Yoc3RydWN0IGFiaXNfb21fZm9tX2hkcikKKwkJCSAgKyBzaXplb2Yoc3RydWN0IGFiaXNfb21faGRyKSkgeworCQlpZiAoIW1lbWNtcChyeF9tc2ctPmRhdGEgKyAyLCB0b29fZmFzdCwKKwkJCSAgICBzaXplb2YodG9vX2Zhc3QpKSkgeworCQkJZnByaW50ZihzdGRlcnIsICJCUzExIHRlbGxzIHVzIHdlJ3JlIHRvbyAiCisJCQkJImZhc3QsIHRyeSAtLWRlbGF5IGJpZ2dlciB0aGFuICV1XG4iLAorCQkJCWRlbGF5X21zKTsKKwkJCXJldHVybiAtRTJCSUc7CisJCX0gZWxzZQorCQkJZnByaW50ZihzdGRlcnIsICJ1bmtub3duIEJTMTEgbWVzc2FnZVxuIik7CisJfQorI2VuZGlmCisKKwlvaCA9IChzdHJ1Y3QgYWJpc19vbV9oZHIgKikgbXNnYl9sMihyeF9tc2cpOworCWZvaCA9IChzdHJ1Y3QgYWJpc19vbV9mb21faGRyICopIG9oLT5kYXRhOworCXN3aXRjaCAoZm9oLT5tc2dfdHlwZSkgeworCWNhc2UgTk1fTVRfQlMxMV9MTVRfTE9HT05fQUNLOgorCQlwcmludGYoIkxNVCBMT0dPTjogQUNLXG5cbiIpOworCQlpZiAoYnMxMWNmZ19zdGF0ZSA9PSBTVEFURV9OT05FKQorCQkJYnMxMWNmZ19zdGF0ZSA9IFNUQVRFX0xPR09OX0FDSzsKKwkJcmMgPSBhYmlzX25tX2JzMTFfZ2V0X3N0YXRlKGdfYnRzKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9CUzExX0xNVF9MT0dPRkZfQUNLOgorCQlwcmludGYoIkxNVCBMT0dPRkY6IEFDS1xuIik7CisJCWV4aXQoMCk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfQlMxMV9HRVRfU1RBVEVfQUNLOgorCQlyYyA9IGFiaXNfbm1fdGx2X3BhcnNlKCZ0cCwgZ19idHMsIGZvaC0+ZGF0YSwgb2gtPmxlbmd0aC1zaXplb2YoKmZvaCkpOworCQlwcmludF9zdGF0ZSgmdHApOworCQlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgTk1fQVRUX0JTMTFfQlRTX1NUQVRFKSAmJgorCQkgICAgVExWUF9MRU4oJnRwLCBOTV9BVFRfQlMxMV9CVFNfU1RBVEUpID49IDEpCisJCQlyYyA9IGhhbmRsZV9zdGF0ZV9yZXNwKCpUTFZQX1ZBTCgmdHAsIE5NX0FUVF9CUzExX0JUU19TVEFURSkpOworCQlicmVhazsKKwljYXNlIE5NX01UX0dFVF9BVFRSX1JFU1A6CisJCXByaW50ZigiXG4lc0FUVFJJQlVURVM6XG4iLCBvYmpfbmFtZShmb2gpKTsKKwkJYWJpc19ubV90bHZfcGFyc2UoJnRwLCBnX2J0cywgZm9oLT5kYXRhLCBvaC0+bGVuZ3RoLXNpemVvZigqZm9oKSk7CisJCXJjID0gcHJpbnRfYXR0cigmdHApOworCQkvL2hleGR1bXAoZm9oLT5kYXRhLCBvaC0+bGVuZ3RoLXNpemVvZigqZm9oKSk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfQlMxMV9TRVRfQVRUUl9BQ0s6CisJCXByaW50ZigiU0VUIEFUVFJJQlVURSBPYmpDbGFzcz0weCUwMnggT2JqSW5zdD0oJWQsJWQsJWQpIEFDS1xuIiwKKwkJCWZvaC0+b2JqX2NsYXNzLCBmb2gtPm9ial9pbnN0LmJ0c19uciwKKwkJCWZvaC0+b2JqX2luc3QudHJ4X25yLCBmb2gtPm9ial9pbnN0LnRzX25yKTsKKwkJcmMgPSAwOworCQlicmVhazsKKwljYXNlIE5NX01UX0JTMTFfU0VUX0FUVFJfTkFDSzoKKwkJcHJpbnRmKCJTRVQgQVRUUklCVVRFIE9iakNsYXNzPTB4JTAyeCBPYmpJbnN0PSglZCwlZCwlZCkgTkFDS1xuIiwKKwkJCWZvaC0+b2JqX2NsYXNzLCBmb2gtPm9ial9pbnN0LmJ0c19uciwKKwkJCWZvaC0+b2JqX2luc3QudHJ4X25yLCBmb2gtPm9ial9pbnN0LnRzX25yKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmMgPSBhYmlzX25tX3Jjdm1zZyhyeF9tc2cpOworCX0KKwlpZiAocmMgPCAwKSB7CisJCXBlcnJvcigiRVJST1IgaW4gbWFpbiBsb29wIik7CisJCS8vYnJlYWs7CisJfQorCWlmIChyYyA9PSAxKQorCQlyZXR1cm4gcmM7CisKKwlzd2l0Y2ggKGJzMTFjZmdfc3RhdGUpIHsKKwljYXNlIFNUQVRFX05PTkU6CisJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAxKTsKKwkJYnJlYWs7CisJY2FzZSBTVEFURV9MT0dPTl9BQ0s6CisJCWJzY19zY2hlZHVsZV90aW1lcigmc3RhdHVzX3RpbWVyLCA1LCAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCitpbnQgbm1fc3RhdGVfZXZlbnQoZW51bSBubV9ldnQgZXZ0LCB1X2ludDhfdCBvYmpfY2xhc3MsIHZvaWQgKm9iaiwKKwkJICAgc3RydWN0IGdzbV9ubV9zdGF0ZSAqb2xkX3N0YXRlLCBzdHJ1Y3QgZ3NtX25tX3N0YXRlICpuZXdfc3RhdGUpCit7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc3RhdHVzX3RpbWVyX2NiKHZvaWQgKmRhdGEpCit7CisJYWJpc19ubV9iczExX2dldF9zdGF0ZShnX2J0cyk7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2Jhbm5lcih2b2lkKQoreworCXByaW50ZigiYnMxMV9jb25maWcgKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIGFuZCBEaWV0ZXIgU3BhYXJcbiIpOworCXByaW50ZigiVGhpcyBpcyBGUkVFIFNPRlRXQVJFIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWVxuXG4iKTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfaGVscCh2b2lkKQoreworCXByaW50ZigiYnMxMV9jb25maWcgW29wdGlvbnNdIFtjb21tYW5kXVxuIik7CisJcHJpbnRmKCJcblN1cHBvcnRlZCBvcHRpb25zOlxuIik7CisJcHJpbnRmKCJcdC1oIC0taGVscFx0XHRcdFByaW50IHRoaXMgaGVscCB0ZXh0XG4iKTsKKwlwcmludGYoIlx0LXAgLS1wb3J0IDwvZGV2L3R0eVhYWD5cdFx0U3BlY2lmeSBzZXJpYWwgcG9ydFxuIik7CisJcHJpbnRmKCJcdC1zIC0tc29mdHdhcmUgPGZpbGU+XHRcdFNwZWNpZnkgU29mdHdhcmUgZmlsZVxuIik7CisJcHJpbnRmKCJcdC1TIC0tc2FmZXR5IDxmaWxlPlx0XHRTcGVjaWZ5IFNhZmV0eSBMb2FkIGZpbGVcbiIpOworCXByaW50ZigiXHQtZCAtLWRlbGF5IDxtcz5cdFx0XHRTcGVjaWZ5IGRlbGF5IGluIG1pbGxpc2Vjb25kc1xuIik7CisJcHJpbnRmKCJcdC1EIC0tZGlzY29ubmVjdFx0XHRcdERpc2Nvbm5lY3QgQlRTIGZyb20gQlNDXG4iKTsKKwlwcmludGYoIlx0LXcgLS13aW4tc2l6ZSA8bnVtPlx0XHRTcGVjaWZ5IFdpbmRvdyBTaXplXG4iKTsKKwlwcmludGYoIlx0LWYgLS1mb3JjZWRcdFx0XHRGb3JjZSBTb2Z0d2FyZSBMb2FkXG4iKTsKKwlwcmludGYoIlxuU3VwcG9ydGVkIGNvbW1hbmRzOlxuIik7CisJcHJpbnRmKCJcdHF1ZXJ5XHRcdFx0UXVlcnkgdGhlIEJTLTExIGFib3V0IHNlcmlhbCBudW1iZXIgYW5kIGNvbmZpZ3VyYXRpb25cbiIpOworCXByaW50ZigiXHRkaXNjb25uZWN0XHRcdERpc2Nvbm5lY3QgQS1iaXMgbGluayAoZ28gaW50byBhZG1pbmlzdHJhdGl2ZSBzdGF0ZSlcbiIpOworCXByaW50ZigiXHRyZXNjb25uZWN0XHRcdFJlY29ubmVjdCBBLWJpcyBsaW5rIChnbyBpbnRvIG5vcm1hbCBzdGF0ZSlcbiIpOworCXByaW50ZigiXHRyZXN0YXJ0XHRcdFx0UmVzdGFydCB0aGUgQlRTXG4iKTsKKwlwcmludGYoIlx0c29mdHdhcmVcdFx0RG93bmxvYWQgU29mdHdhcmUgKG9ubHkgaW4gYWRtaW5pc3RyYXRpdmUgc3RhdGUpXG4iKTsKKwlwcmludGYoIlx0Y3JlYXRlLXRyeDFcdFx0Q3JlYXRlIG9iamVjdHMgZm9yIFRSWDEgKERhbmdlcjogWW91ciBCUy0xMSBtaWdodCBvdmVyaGVhdClcbiIpOworCXByaW50ZigiXHRkZWxldGUtdHJ4MVx0XHREZWxldGUgb2JqZWN0cyBmb3IgVFJYMVxuIik7CisJcHJpbnRmKCJcdHBsbC1lMS1sb2NrZWRcdFx0U2V0IHRoZSBQTEwgdG8gYmUgbG9ja2VkIHRvIEUxIGNsb2NrXG4iKTsKKwlwcmludGYoIlx0cGxsLXN0YW5kYWxvbmVcdFx0U2V0IHRoZSBQTEwgdG8gYmUgaW4gc3RhbmRhbG9uZSBtb2RlXG4iKTsKKwlwcmludGYoIlx0cGxsLXNldHZhbHVlIDx2YWx1ZT5cdFNldCB0aGUgUExMIHNldCB2YWx1ZVxuIik7CisJcHJpbnRmKCJcdHBsbC13b3JrdmFsdWUgPHZhbHVlPlx0U2V0IHRoZSBQTEwgd29yayB2YWx1ZVxuIik7CisJcHJpbnRmKCJcdG9tbC10ZWlcdFx0XHRTZXQgT01MIEUxIFRTIGFuZCBURUlcbiIpOworCXByaW50ZigiXHRicG9ydDAtc3Rhclx0XHRTZXQgQlBPUlQwIGxpbmUgY29uZmlnIHRvIHN0YXJcbiIpOworCXByaW50ZigiXHRicG9ydDAtbXVsdGlwb3J0XHRTZXQgQlBPUlQwIGxpbmUgY29uZmlnIHRvIG11bHRpcG9ydFxuIik7CisJcHJpbnRmKCJcdGNyZWF0ZS1icG9ydDFcdFx0Q3JlYXRlIEJQT1JUMSBvYmplY3RcbiIpOworCXByaW50ZigiXHRkZWxldGUtYnBvcnQxXHRcdERlbGV0ZSBCUE9SVDEgb2JqZWN0XG4iKTsKK30KKworc3RhdGljIHZvaWQgaGFuZGxlX29wdGlvbnMoaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCBvcHRpb25faW5kZXggPSAwOworCXByaW50X2Jhbm5lcigpOworCisJd2hpbGUgKDEpIHsKKwkJaW50IGM7CisJCXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0geworCQkJeyAiaGVscCIsIDAsIDAsICdoJyB9LAorCQkJeyAicG9ydCIsIDEsIDAsICdwJyB9LAorCQkJeyAic29mdHdhcmUiLCAxLCAwLCAncycgfSwKKwkJCXsgInNhZmV0eSIsIDEsIDAsICdTJyB9LAorCQkJeyAiZGVsYXkiLCAxLCAwLCAnZCcgfSwKKwkJCXsgImRpc2Nvbm5lY3QiLCAwLCAwLCAnRCcgfSwKKwkJCXsgIndpbi1zaXplIiwgMSwgMCwgJ3cnIH0sCisJCQl7ICJmb3JjZWQiLCAwLCAwLCAnZicgfSwKKwkJCXsgInJlc3RhcnQiLCAwLCAwLCAncicgfSwKKwkJCXsgImRlYnVnIiwgMSwgMCwgJ2InfSwKKwkJfTsKKworCQljID0gZ2V0b3B0X2xvbmcoYXJnYywgYXJndiwgImhwOnM6Uzp0ZDpEdzpmcmE6IiwKKwkJCQlsb25nX29wdGlvbnMsICZvcHRpb25faW5kZXgpOworCisJCWlmIChjID09IC0xKQorCQkJYnJlYWs7CisKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ2gnOgorCQkJcHJpbnRfaGVscCgpOworCQkJZXhpdCgwKTsKKwkJY2FzZSAncCc6CisJCQlzZXJpYWxfcG9ydCA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdiJzoKKwkJCWRlYnVnX3BhcnNlX2NhdGVnb3J5X21hc2soc3RkZXJyX3RhcmdldCwgb3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdzJzoKKwkJCWZuYW1lX3NvZnR3YXJlID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ1MnOgorCQkJZm5hbWVfc2FmZXR5ID0gb3B0YXJnOworCQkJYnJlYWs7CisJCWNhc2UgJ2QnOgorCQkJZGVsYXlfbXMgPSBhdG9pKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAndyc6CisJCQl3aW5fc2l6ZSA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdEJzoKKwkJCXBhcmFtX2Rpc2Nvbm5lY3QgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ2YnOgorCQkJcGFyYW1fZm9yY2VkID0gMTsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCXBhcmFtX2Rpc2Nvbm5lY3QgPSAxOworCQkJcGFyYW1fcmVzdGFydCA9IDE7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisJfQorCWlmIChvcHRpbmQgPCBhcmdjKQorCQljb21tYW5kID0gYXJndltvcHRpbmRdOworCSAgICAgICAgaWYgKG9wdGluZCsxIDwgYXJnYykKKwkJCXZhbHVlID0gYXJndltvcHRpbmQrMV07CisKK30KKworc3RhdGljIGludCBudW1fc2lnaW50OworCitzdGF0aWMgdm9pZCBzaWduYWxfaGFuZGxlcihpbnQgc2lnbmFsKQoreworCWZwcmludGYoc3Rkb3V0LCAiXG5zaWduYWwgJXUgcmVjZWl2ZWRcbiIsIHNpZ25hbCk7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU0lHSU5UOgorCQludW1fc2lnaW50Kys7CisJCWFiaXNfbm1fYnMxMV9mYWN0b3J5X2xvZ29uKGdfYnRzLCAwKTsKKwkJaWYgKG51bV9zaWdpbnQgPj0gMykKKwkJCWV4aXQoMCk7CisJCWJyZWFrOworCX0KK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0OworCWludCByYzsKKworCWRlYnVnX2luaXQoKTsKKwlzdGRlcnJfdGFyZ2V0ID0gZGVidWdfdGFyZ2V0X2NyZWF0ZV9zdGRlcnIoKTsKKwlkZWJ1Z19hZGRfdGFyZ2V0KHN0ZGVycl90YXJnZXQpOworCWRlYnVnX3NldF9hbGxfZmlsdGVyKHN0ZGVycl90YXJnZXQsIDEpOworCWhhbmRsZV9vcHRpb25zKGFyZ2MsIGFyZ3YpOworCWJ0c19tb2RlbF9iczExX2luaXQoKTsKKworCWdzbW5ldCA9IGdzbV9uZXR3b3JrX2luaXQoMSwgMSwgTlVMTCk7CisJaWYgKCFnc21uZXQpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVbmFibGUgdG8gYWxsb2NhdGUgZ3NtIG5ldHdvcmtcbiIpOworCQlleGl0KDEpOworCX0KKwlnX2J0cyA9IGdzbV9idHNfYWxsb2MoZ3NtbmV0LCBHU01fQlRTX1RZUEVfQlMxMSwgSEFSRENPREVEX1RTQywKKwkJCQlIQVJEQ09ERURfQlNJQyk7CisKKwlyYyA9IHJzMjMyX3NldHVwKHNlcmlhbF9wb3J0LCBkZWxheV9tcywgZ19idHMpOworCWlmIChyYyA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJQcm9ibGVtIHNldHRpbmcgdXAgc2VyaWFsIHBvcnRcbiIpOworCQlleGl0KDEpOworCX0KKworCXNpZ25hbChTSUdJTlQsICZzaWduYWxfaGFuZGxlcik7CisKKwlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMSk7CisJLy9hYmlzX25tX2JzMTFfZ2V0X3Nlcm5vKGdfYnRzKTsKKworCXN0YXR1c190aW1lci5jYiA9IHN0YXR1c190aW1lcl9jYjsKKworCXdoaWxlICgxKSB7CisJCWJzY19zZWxlY3RfbWFpbigwKTsKKwl9CisKKwlhYmlzX25tX2JzMTFfZmFjdG9yeV9sb2dvbihnX2J0cywgMCk7CisKKwlleGl0KDApOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvYnNjX2hhY2suYyBiL29wZW5ic2Mvc3JjL2JzY19oYWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDljOWQzNgotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2JzY19oYWNrLmMKQEAgLTAsMCArMSwyNDMgQEAKKy8qIEEgaGFja2lzaCBtaW5pbWFsIEJTQyAoK01TQyArSExSKSBpbXBsZW1lbnRhdGlvbiAqLworCisvKiAoQykgMjAwOC0yMDEwIGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHNpZ25hbC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworI2RlZmluZSBfR05VX1NPVVJDRQorI2luY2x1ZGUgPGdldG9wdC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9kYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2UxX2lucHV0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKworLyogTUNDIGFuZCBNTkMgZm9yIHRoZSBMb2NhdGlvbiBBcmVhIElkZW50aWZpZXIgKi8KK3N0YXRpYyBzdHJ1Y3QgZGVidWdfdGFyZ2V0ICpzdGRlcnJfdGFyZ2V0Oworc3RydWN0IGdzbV9uZXR3b3JrICpic2NfZ3NtbmV0ID0gMDsKK3N0YXRpYyBjb25zdCBjaGFyICpkYXRhYmFzZV9uYW1lID0gImhsci5zcWxpdGUzIjsKK3N0YXRpYyBjb25zdCBjaGFyICpjb25maWdfZmlsZSA9ICJvcGVuYnNjLmNmZyI7CisKKworLyogdGltZXIgdG8gc3RvcmUgc3RhdGlzdGljcyAqLworI2RlZmluZSBEQl9TWU5DX0lOVEVSVkFMCTYwLCAwCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgZGJfc3luY190aW1lcjsKKworZXh0ZXJuIGludCBic2NfYm9vdHN0cmFwX25ldHdvcmsoaW50ICgqbW1jX3Jldikoc3RydWN0IGdzbV9uZXR3b3JrICosIGludCwgdm9pZCAqKSwKKwkJCQkgY29uc3QgY2hhciAqY2ZnX2ZpbGUpOworZXh0ZXJuIGludCBic2Nfc2h1dGRvd25fbmV0KHN0cnVjdCBnc21fbmV0d29yayAqbmV0KTsKKworc3RhdGljIHZvaWQgY3JlYXRlX3BjYXBfZmlsZShjaGFyICpmaWxlKQoreworCW1vZGVfdCBtb2RlID0gU19JUlVTUiB8IFNfSVdVU1IgfCBTX0lSR1JQIHwgU19JUk9USDsKKwlpbnQgZmQgPSBvcGVuKGZpbGUsIE9fV1JPTkxZfE9fVFJVTkN8T19DUkVBVCwgbW9kZSk7CisKKwlpZiAoZmQgPCAwKSB7CisJCXBlcnJvcigiRmFpbGVkIHRvIG9wZW4gZmlsZSBmb3IgcGNhcCIpOworCQlyZXR1cm47CisJfQorCisJZTFfc2V0X3BjYXBfZmQoZmQpOworfQorCitzdGF0aWMgdm9pZCBwcmludF91c2FnZSgpCit7CisJcHJpbnRmKCJVc2FnZTogYnNjX2hhY2tcbiIpOworfQorCitzdGF0aWMgdm9pZCBwcmludF9oZWxwKCkKK3sKKwlwcmludGYoIiAgU29tZSB1c2VmdWwgaGVscC4uLlxuIik7CisJcHJpbnRmKCIgIC1oIC0taGVscCB0aGlzIHRleHRcbiIpOworCXByaW50ZigiICAtZCBvcHRpb24gLS1kZWJ1Zz1EUkxMOkRDQzpETU06RFJSOkRSU0w6RE5NIGVuYWJsZSBkZWJ1Z2dpbmdcbiIpOworCXByaW50ZigiICAtcyAtLWRpc2FibGUtY29sb3JcbiIpOworCXByaW50ZigiICAtYyAtLWNvbmZpZy1maWxlIGZpbGVuYW1lIFRoZSBjb25maWcgZmlsZSB0byB1c2UuXG4iKTsKKwlwcmludGYoIiAgLWwgLS1kYXRhYmFzZSBkYi1uYW1lIFRoZSBkYXRhYmFzZSB0byB1c2VcbiIpOworCXByaW50ZigiICAtcCAtLXBjYXAgZmlsZSAgVGhlIGZpbGVuYW1lIG9mIHRoZSBwY2FwIGZpbGVcbiIpOworCXByaW50ZigiICAtVCAtLXRpbWVzdGFtcCBQcmVmaXggZXZlcnkgbG9nIGxpbmUgd2l0aCBhIHRpbWVzdGFtcFxuIik7CisJcHJpbnRmKCIgIC1QIC0tcnRwLXByb3h5IEVuYWJsZSB0aGUgUlRQIFByb3h5IGNvZGUgaW5zaWRlIE9wZW5CU0NcbiIpOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfb3B0aW9ucyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisJd2hpbGUgKDEpIHsKKwkJaW50IG9wdGlvbl9pbmRleCA9IDAsIGM7CisJCXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0geworCQkJeyJoZWxwIiwgMCwgMCwgJ2gnfSwKKwkJCXsiZGVidWciLCAxLCAwLCAnZCd9LAorCQkJeyJjb25maWctZmlsZSIsIDEsIDAsICdjJ30sCisJCQl7ImRpc2FibGUtY29sb3IiLCAwLCAwLCAncyd9LAorCQkJeyJkYXRhYmFzZSIsIDEsIDAsICdsJ30sCisJCQl7ImF1dGhvcml6ZS1ldmVyeW9uZSIsIDAsIDAsICdhJ30sCisJCQl7InBjYXAiLCAxLCAwLCAncCd9LAorCQkJeyJ0aW1lc3RhbXAiLCAwLCAwLCAnVCd9LAorCQkJeyJydHAtcHJveHkiLCAwLCAwLCAnUCd9LAorCQkJezAsIDAsIDAsIDB9CisJCX07CisKKwkJYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJoZDpzbDphcjpwOlRQYzoiLAorCQkJCWxvbmdfb3B0aW9ucywgJm9wdGlvbl9pbmRleCk7CisJCWlmIChjID09IC0xKQorCQkJYnJlYWs7CisKKwkJc3dpdGNoIChjKSB7CisJCWNhc2UgJ2gnOgorCQkJcHJpbnRfdXNhZ2UoKTsKKwkJCXByaW50X2hlbHAoKTsKKwkJCWV4aXQoMCk7CisJCWNhc2UgJ3MnOgorCQkJZGVidWdfc2V0X3VzZV9jb2xvcihzdGRlcnJfdGFyZ2V0LCAwKTsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCWRlYnVnX3BhcnNlX2NhdGVnb3J5X21hc2soc3RkZXJyX3RhcmdldCwgb3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdsJzoKKwkJCWRhdGFiYXNlX25hbWUgPSBzdHJkdXAob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdjJzoKKwkJCWNvbmZpZ19maWxlID0gc3RyZHVwKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAncCc6CisJCQljcmVhdGVfcGNhcF9maWxlKG9wdGFyZyk7CisJCQlicmVhazsKKwkJY2FzZSAnVCc6CisJCQlkZWJ1Z19zZXRfcHJpbnRfdGltZXN0YW1wKHN0ZGVycl90YXJnZXQsIDEpOworCQkJYnJlYWs7CisJCWNhc2UgJ1AnOgorCQkJaXBhY2NfcnRwX2RpcmVjdCA9IDA7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIGlnbm9yZSAqLworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKK2V4dGVybiB2b2lkICp0YWxsX3Z0eV9jdHg7CitzdGF0aWMgdm9pZCBzaWduYWxfaGFuZGxlcihpbnQgc2lnbmFsKQoreworCWZwcmludGYoc3Rkb3V0LCAic2lnbmFsICV1IHJlY2VpdmVkXG4iLCBzaWduYWwpOworCisJc3dpdGNoIChzaWduYWwpIHsKKwljYXNlIFNJR0lOVDoKKwkJYnNjX3NodXRkb3duX25ldChic2NfZ3NtbmV0KTsKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX0dMT0JBTCwgU19HTE9CQUxfU0hVVERPV04sIE5VTEwpOworCQlzbGVlcCgzKTsKKwkJZXhpdCgwKTsKKwkJYnJlYWs7CisJY2FzZSBTSUdBQlJUOgorCQkvKiBpbiBjYXNlIG9mIGFib3J0LCB3ZSB3YW50IHRvIG9idGFpbiBhIHRhbGxvYyByZXBvcnQKKwkJICogYW5kIHRoZW4gcmV0dXJuIHRvIHRoZSBjYWxsZXIsIHdobyB3aWxsIGFib3J0IHRoZSBwcm9jZXNzICovCisJY2FzZSBTSUdVU1IxOgorCQl0YWxsb2NfcmVwb3J0KHRhbGxfdnR5X2N0eCwgc3RkZXJyKTsKKwkJdGFsbG9jX3JlcG9ydF9mdWxsKHRhbGxfYnNjX2N0eCwgc3RkZXJyKTsKKwkJYnJlYWs7CisJY2FzZSBTSUdVU1IyOgorCQl0YWxsb2NfcmVwb3J0X2Z1bGwodGFsbF92dHlfY3R4LCBzdGRlcnIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKKy8qIHRpbWVyIGhhbmRsaW5nICovCitzdGF0aWMgaW50IF9kYl9zdG9yZV9jb3VudGVyKHN0cnVjdCBjb3VudGVyICpjb3VudGVyLCB2b2lkICpkYXRhKQoreworCXJldHVybiBkYl9zdG9yZV9jb3VudGVyKGNvdW50ZXIpOworfQorCitzdGF0aWMgdm9pZCBkYl9zeW5jX3RpbWVyX2NiKHZvaWQgKmRhdGEpCit7CisJLyogc3RvcmUgY291bnRlcnMgdG8gZGF0YWJhc2UgYW5kIHJlLXNjaGVkdWxlICovCisJY291bnRlcnNfZm9yX2VhY2goX2RiX3N0b3JlX2NvdW50ZXIsIE5VTEwpOworCWJzY19zY2hlZHVsZV90aW1lcigmZGJfc3luY190aW1lciwgREJfU1lOQ19JTlRFUlZBTCk7Cit9CisKK2V4dGVybiBpbnQgYnRzX21vZGVsX3Vua25vd25faW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgYnRzX21vZGVsX2JzMTFfaW5pdCh2b2lkKTsKK2V4dGVybiBpbnQgYnRzX21vZGVsX25hbm9idHNfaW5pdCh2b2lkKTsKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCWludCByYzsKKworCWRlYnVnX2luaXQoKTsKKwl0YWxsX2JzY19jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QoTlVMTCwgMSwgIm9wZW5ic2MiKTsKKwl0YWxsb2NfY3R4X2luaXQoKTsKKwlvbl9kc29fbG9hZF90b2tlbigpOworCW9uX2Rzb19sb2FkX3JybHAoKTsKKwlvbl9kc29fbG9hZF9ob19kZWMoKTsKKwlzdGRlcnJfdGFyZ2V0ID0gZGVidWdfdGFyZ2V0X2NyZWF0ZV9zdGRlcnIoKTsKKwlkZWJ1Z19hZGRfdGFyZ2V0KHN0ZGVycl90YXJnZXQpOworCisJYnRzX21vZGVsX3Vua25vd25faW5pdCgpOworCWJ0c19tb2RlbF9iczExX2luaXQoKTsKKwlidHNfbW9kZWxfbmFub2J0c19pbml0KCk7CisKKwkvKiBlbmFibGUgZmlsdGVycyAqLworCWRlYnVnX3NldF9hbGxfZmlsdGVyKHN0ZGVycl90YXJnZXQsIDEpOworCisJLyogcGFyc2Ugb3B0aW9ucyAqLworCWhhbmRsZV9vcHRpb25zKGFyZ2MsIGFyZ3YpOworCisJLyogc2VlZCB0aGUgUFJORyAqLworCXNyYW5kKHRpbWUoTlVMTCkpOworCisJaWYgKGRiX2luaXQoZGF0YWJhc2VfbmFtZSkpIHsKKwkJcHJpbnRmKCJEQjogRmFpbGVkIHRvIGluaXQgZGF0YWJhc2UuIFBsZWFzZSBjaGVjayB0aGUgb3B0aW9uIHNldHRpbmdzLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisJcHJpbnRmKCJEQjogRGF0YWJhc2UgaW5pdGlhbGl6ZWQuXG4iKTsKKworCWlmIChkYl9wcmVwYXJlKCkpIHsKKwkJcHJpbnRmKCJEQjogRmFpbGVkIHRvIHByZXBhcmUgZGF0YWJhc2UuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKwlwcmludGYoIkRCOiBEYXRhYmFzZSBwcmVwYXJlZC5cbiIpOworCisJLyogc2V0dXAgdGhlIHRpbWVyICovCisJZGJfc3luY190aW1lci5jYiA9IGRiX3N5bmNfdGltZXJfY2I7CisJZGJfc3luY190aW1lci5kYXRhID0gTlVMTDsKKwlic2Nfc2NoZWR1bGVfdGltZXIoJmRiX3N5bmNfdGltZXIsIERCX1NZTkNfSU5URVJWQUwpOworCisJcmMgPSBic2NfYm9vdHN0cmFwX25ldHdvcmsobW5jY19yZWN2LCBjb25maWdfZmlsZSk7CisJaWYgKHJjIDwgMCkKKwkJZXhpdCgxKTsKKworCXNpZ25hbChTSUdJTlQsICZzaWduYWxfaGFuZGxlcik7CisJc2lnbmFsKFNJR0FCUlQsICZzaWduYWxfaGFuZGxlcik7CisJc2lnbmFsKFNJR1VTUjEsICZzaWduYWxfaGFuZGxlcik7CisJc2lnbmFsKFNJR1VTUjIsICZzaWduYWxfaGFuZGxlcik7CisJc2lnbmFsKFNJR1BJUEUsIFNJR19JR04pOworCisJd2hpbGUgKDEpIHsKKwkJYnNjX3VwcXVldWUoYnNjX2dzbW5ldCk7CisJCWRlYnVnX3Jlc2V0X2NvbnRleHQoKTsKKwkJYnNjX3NlbGVjdF9tYWluKDApOworCX0KK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2JzY19pbml0LmMgYi9vcGVuYnNjL3NyYy9ic2NfaW5pdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzNDM2NjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ic2NfaW5pdC5jCkBAIC0wLDAgKzEsMTAxNiBAQAorLyogQSBoYWNraXNoIG1pbmltYWwgQlNDICgrTVNDICtITFIpIGltcGxlbWVudGF0aW9uICovCisKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21pc2RuLmg+CisjaW5jbHVkZSA8b3BlbmJzYy90ZWxuZXRfaW50ZXJmYWNlLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zeXN0ZW1faW5mb3JtYXRpb24uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3BhZ2luZy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKKy8qIGdsb2JhbCBwb2ludGVyIHRvIHRoZSBnc20gbmV0d29yayBkYXRhIHN0cnVjdHVyZSAqLworZXh0ZXJuIHN0cnVjdCBnc21fbmV0d29yayAqYnNjX2dzbW5ldDsKKworc3RhdGljIHZvaWQgcGF0Y2hfbm1fdGFibGVzKHN0cnVjdCBnc21fYnRzICpidHMpOworCisvKiBUaGUgZm9sbG93aW5nIGRlZmluaXRpb25zIGFyZSBmb3IgT00gYW5kIE5NIHBhY2tldHMgdGhhdCB3ZSBjYW5ub3QgeWV0CisgKiBnZW5lcmF0ZSBieSBjb2RlIGJ1dCB3ZSBqdXN0IHBhc3Mgb24gKi8KKworLy8gQlRTIFNpdGUgTWFuYWdlciwgU0VUIEFUVFJJQlVURVMKKworLyoKKyAgT2JqZWN0IENsYXNzOiBCVFMgU2l0ZSBNYW5hZ2VyCisgIEluc3RhbmNlIDE6IEZGCisgIEluc3RhbmNlIDI6IEZGCisgIEluc3RhbmNlIDM6IEZGCitTRVQgQVRUUklCVVRFUworICBzQWJpc0V4dGVybmFsVGltZTogMjAwNy8wOS8wOCAgIDE0OjM2OjExCisgIG9tTEFQRFJlbFRpbWVyOiAzMHNlYworICBzaG9ydExBUERJbnRUaW1lcjogNXNlYworICBlbWVyZ2VuY3lUaW1lcjE6IDEwIG1pbnV0ZXMKKyAgZW1lcmdlbmN5VGltZXIyOiAwIG1pbnV0ZXMKKyovCisKK3Vuc2lnbmVkIGNoYXIgbXNnXzFbXSA9Cit7CisJTk1fTVRfQlMxMV9TRVRfQVRUUiwgTk1fT0NfU0lURV9NQU5BR0VSLCAweEZGLCAweEZGLCAweEZGLAorCQlOTV9BVFRfQlMxMV9BQklTX0VYVF9USU1FLCAweDA3LAorCQkJMHhENywgMHgwOSwgMHgwOCwgMHgwRSwgMHgyNCwgMHgwQiwgMHhDRSwKKwkJMHgwMiwKKwkJCTB4MDAsIDB4MUUsCisJCU5NX0FUVF9CUzExX1NIX0xBUERfSU5UX1RJTUVSLAorCQkJMHgwMSwgMHgwNSwKKwkJMHg0MiwgMHgwMiwgMHgwMCwgMHgwQSwKKwkJMHg0NCwgMHgwMiwgMHgwMCwgMHgwMAorfTsKKworLy8gQlRTLCBTRVQgQlRTIEFUVFJJQlVURVMKKworLyoKKyAgT2JqZWN0IENsYXNzOiBCVFMKKyAgQlRTIHJlbGF0LiBOdW1iZXI6IDAKKyAgSW5zdGFuY2UgMjogRkYKKyAgSW5zdGFuY2UgMzogRkYKK1NFVCBCVFMgQVRUUklCVVRFUworICBic0lkZW50aXR5Q29kZSAvIEJTSUM6CisgICAgUExNTl9jb2xvdXJfY29kZTogN2gKKyAgICBCU19jb2xvdXJfY29kZTogICA3aAorICBCVFMgQWlyIFRpbWVyIFQzMTA1OiA0ICAsdW5pdCAxMCBtcworICBidHNJc0hvcHBpbmc6IEZBTFNFCisgIHBlcmlvZENDQ0hMb2FkSW5kaWNhdGlvbjogMXNlYworICB0aHJlc2hvbGRDQ0NITG9hZEluZGljYXRpb246IDAlCisgIGNlbGxBbGxvY2F0aW9uTnVtYmVyOiAwMGggPSBHU00gOTAwCisgIGVuYWJsZUludGVyZmVyZW5jZUNsYXNzOiAwMGggPSAgRGlzYWJsZWQKKyAgZkFDQ0hRdWFsOiA2IChGQUNDSCBzdGVhbGluZyBmbGFncyBtaW51cyAxKQorICBpbnRhdmVQYXJhbWV0ZXI6IDMxIFNBQ0NIIG11bHRpZnJhbWVzCisgIGludGVyZmVyZW5jZUxldmVsQm91bmRhcmllczoKKyAgICBJbnRlcmZlcmVuY2UgQm91bmRhcnkgMTogMEFoCisgICAgSW50ZXJmZXJlbmNlIEJvdW5kYXJ5IDI6IDBGaAorICAgIEludGVyZmVyZW5jZSBCb3VuZGFyeSAzOiAxNGgKKyAgICBJbnRlcmZlcmVuY2UgQm91bmRhcnkgNDogMTloCisgICAgSW50ZXJmZXJlbmNlIEJvdW5kYXJ5IDU6IDFFaAorICBtU1R4UHdyTWF4OiAxMQorICAgICAgR1NNIHJhbmdlOiAgICAgMj0zOWRCbSwgMTU9MTNkQm0sIHN0ZXBzaXplIDIgZEJtCisgICAgICBEQ1MxODAwIHJhbmdlOiAwPTMwZEJtLCAxNT0wZEJtLCBzdGVwc2l6ZSAyIGRCbQorICAgICAgUENTMTkwMCByYW5nZTogMD0zMGRCbSwgMTU9MGRCbSwgc3RlcHNpemUgMiBkQm0KKyAgICAgICAgICAgICAgICAgICAgMzA9MzNkQm0sIDMxPTMyZEJtCisgIG55MToKKyAgICBNYXhpbXVtIG51bWJlciBvZiByZXBldGl0aW9ucyBmb3IgUEhZU0lDQUwgSU5GT1JNQVRJT04gbWVzc2FnZSAoR1NNIDA0LjA4KTogMjAKKyAgcG93ZXJPdXRwdXRUaHJlc2hvbGRzOgorICAgIE91dCBQb3dlciBGYXVsdCBUaHJlc2hvbGQ6ICAgICAtMTAgZEIKKyAgICBSZWQgT3V0IFBvd2VyIFRocmVzaG9sZDogICAgICAgLSA2IGRCCisgICAgRXhjZXNzaXZlIE91dCBQb3dlciBUaHJlc2hvbGQ6ICAgNSBkQgorICByQUNIQnVzeVRocmVzaG9sZDogLTEyNyBkQm0KKyAgckFDSExvYWRBdmVyYWdpbmdTbG90czogMjUwICxudW1iZXIgb2YgUkFDSCBidXJzdCBwZXJpb2RzCisgIHJmUmVzb3VyY2VJbmRpY2F0aW9uUGVyaW9kOiAxMjUgIFNBQ0NIIG11bHRpZnJhbWVzCisgIFQyMDA6CisgICAgU0RDQ0g6ICAgICAgICAgICAgICAgIDA0NCBpbiAgNSBtcworICAgIEZBQ0NIL0Z1bGwgcmF0ZTogICAgICAwMzEgaW4gIDUgbXMKKyAgICBGQUNDSC9IYWxmIHJhdGU6ICAgICAgMDQxIGluICA1IG1zCisgICAgU0FDQ0ggd2l0aCBUQ0ggU0FQSTA6IDA5MCBpbiAxMCBtcworICAgIFNBQ0NIIHdpdGggU0RDQ0g6ICAgICAwOTAgaW4gMTAgbXMKKyAgICBTRENDSCB3aXRoIFNBUEkzOiAgICAgMDkwIGluICA1IG1zCisgICAgU0FDQ0ggd2l0aCBUQ0ggU0FQSTM6IDEzNSBpbiAxMCBtcworICB0U3luYzogOTAwMCB1bml0cyBvZiAxMCBtc2VjCisgIHRUcmF1OiA5MDAwIHVuaXRzIG9mIDEwIG1zZWMKKyAgZW5hYmxlVW1Mb29wVGVzdDogMDBoID0gIGRpc2FibGVkCisgIGVuYWJsZUV4Y2Vzc2l2ZURpc3RhbmNlOiAwMGggPSAgRGlzYWJsZWQKKyAgZXhjZXNzaXZlRGlzdGFuY2U6IDY0a20KKyAgaG9wcGluZ01vZGU6IDAwaCA9IGJhc2ViYW5kIGhvcHBpbmcKKyAgY2VsbFR5cGU6IDAwaCA9ICBTdGFuZGFyZCBDZWxsCisgIEJDQ0ggQVJGQ04gLyBiQ0NIRnJlcXVlbmN5OiAxCisqLworCitzdGF0aWMgdW5zaWduZWQgY2hhciBiczExX2F0dHJfYnRzW10gPQoreworCQlOTV9BVFRfQlNJQywgSEFSRENPREVEX0JTSUMsCisJCU5NX0FUVF9CVFNfQUlSX1RJTUVSLCAweDA0LAorCQlOTV9BVFRfQlMxMV9CVFNMU19IT1BQSU5HLCAweDAwLAorCQlOTV9BVFRfQ0NDSF9MX0lfUCwgMHgwMSwKKwkJTk1fQVRUX0NDQ0hfTF9ULCAweDAwLAorCQlOTV9BVFRfQlMxMV9DRUxMX0FMTE9DX05SLCBOTV9CUzExX0NBTlJfR1NNLAorCQlOTV9BVFRfQlMxMV9FTkFfSU5URVJGX0NMQVNTLCAweDAxLAorCQlOTV9BVFRfQlMxMV9GQUNDSF9RVUFMLCAweDA2LAorCQkvKiBpbnRlcmZlcmVuY2UgYXZnLiBwZXJpb2QgaW4gbnVtYmVycyBvZiBTQUNDSCBtdWx0aWZyICovCisJCU5NX0FUVF9JTlRBVkVfUEFSQU0sIDB4MUYsCisJCU5NX0FUVF9JTlRFUkZfQk9VTkQsIDB4MEEsIDB4MEYsIDB4MTQsIDB4MTksIDB4MUUsIDB4N0IsCisJCU5NX0FUVF9DQ0NIX0xfVCwgMHgyMywKKwkJTk1fQVRUX0dTTV9USU1FLCAweDI4LCAweDAwLAorCQlOTV9BVFRfQURNX1NUQVRFLCAweDAzLAorCQlOTV9BVFRfUkFDSF9CX1RIUkVTSCwgMHg3RiwKKwkJTk1fQVRUX0xEQVZHX1NMT1RTLCAweDAwLCAweEZBLAorCQlOTV9BVFRfQlMxMV9SRl9SRVNfSU5EX1BFUiwgMHg3RCwKKwkJTk1fQVRUX1QyMDAsIDB4MkMsIDB4MUYsIDB4MjksIDB4NUEsIDB4NUEsIDB4NUEsIDB4ODcsCisJCU5NX0FUVF9CUzExX1RTWU5DLCAweDIzLCAweDI4LAorCQlOTV9BVFRfQlMxMV9UVFJBVSwgMHgyMywgMHgyOCwKKwkJTk1fQVRUX1RFU1RfRFVSLCAweDAxLCAweDAwLAorCQlOTV9BVFRfT1VUU1RfQUxBUk0sIDB4MDEsIDB4MDAsCisJCU5NX0FUVF9CUzExX0VYQ0VTU0lWRV9ESVNUQU5DRSwgMHgwMSwgMHg0MCwKKwkJTk1fQVRUX0JTMTFfSE9QUElOR19NT0RFLCAweDAxLCAweDAwLAorCQlOTV9BVFRfQlMxMV9QTEwsIDB4MDEsIDB4MDAsCisJCU5NX0FUVF9CQ0NIX0FSRkNOLCAweDAwLCBIQVJEQ09ERURfQVJGQ04vKjB4MDEqLywKK307CisKKy8vIEhhbmRvdmVyIFJlY29nbml0aW9uLCBTRVQgQVRUUklCVVRFUworCisvKgorSWxsZWdhbCBDb250ZW50cyBHU00gRm9ybWF0dGVkIE8mTSBNc2cKKyAgT2JqZWN0IENsYXNzOiBIYW5kb3ZlciBSZWNvZ25pdGlvbgorICBCVFMgcmVsYXQuIE51bWJlcjogMAorICBJbnN0YW5jZSAyOiBGRgorICBJbnN0YW5jZSAzOiBGRgorU0VUIEFUVFJJQlVURVMKKyAgZW5hYmxlRGVsYXlQb3dlckJ1ZGdldEhPOiAwMGggPSBEaXNhYmxlZAorICBlbmFibGVEaXN0YW5jZUhPOiAwMGggPSAgRGlzYWJsZWQKKyAgZW5hYmxlSW50ZXJuYWxJbnRlckNlbGxIYW5kb3ZlcjogMDBoID0gRGlzYWJsZWQKKyAgZW5hYmxlSW50ZXJuYWxJbnRyYUNlbGxIYW5kb3ZlcjogMDBoID0gIERpc2FibGVkCisgIGVuYWJsZVBvd2VyQnVkZ2V0SE86IDAwaCA9IERpc2FibGVkCisgIGVuYWJsZVJYTEVWSE86IDAwaCA9ICBEaXNhYmxlZAorICBlbmFibGVSWFFVQUxITzogMDBoID0gIERpc2FibGVkCisgIGhvQXZlcmFnaW5nRGlzdGFuY2U6IDggIFNBQ0NIIG11bHRpZnJhbWVzCisgIGhvQXZlcmFnaW5nTGV2OgorICAgIEFfTEVWX0hPOiA4ICBTQUNDSCBtdWx0aWZyYW1lcworICAgIFdfTEVWX0hPOiAxICBTQUNDSCBtdWx0aWZyYW1lcworICBob0F2ZXJhZ2luZ1Bvd2VyQnVkZ2V0OiAgMTYgIFNBQ0NIIG11bHRpZnJhbWVzCisgIGhvQXZlcmFnaW5nUXVhbDoKKyAgICBBX1FVQUxfSE86IDggIFNBQ0NIIG11bHRpZnJhbWVzCisgICAgV19RVUFMX0hPOiAyICBTQUNDSCBtdWx0aWZyYW1lcworICBob0xvd2VyVGhyZXNob2xkTGV2REw6ICgxMCAtIDExMCkgZEJtCisgIGhvTG93ZXJUaHJlc2hvbGRMZXZVTDogKDUgLSAxMTApIGRCbQorICBob0xvd2VyVGhyZXNob2xkUXVhbERMOiAwNmggPSAgIDYuNCUgPCBCRVIgPCAxMi44JQorICBob0xvd2VyVGhyZXNob2xkUXVhbFVMOiAwNmggPSAgIDYuNCUgPCBCRVIgPCAxMi44JQorICBob1RocmVzaG9sZExldkRMaW50cmEgOiAoMjAgLSAxMTApIGRCbQorICBob1RocmVzaG9sZExldlVMaW50cmE6ICgyMCAtIDExMCkgZEJtCisgIGhvVGhyZXNob2xkTXNSYW5nZU1heDogMjAga20KKyAgbkNlbGw6IDA2aAorICB0aW1lckhPUmVxdWVzdDogMyAgLHVuaXQgMiBTQUNDSCBtdWx0aWZyYW1lcworKi8KKwordW5zaWduZWQgY2hhciBtc2dfM1tdID0KK3sKKwlOTV9NVF9CUzExX1NFVF9BVFRSLCBOTV9PQ19CUzExX0hBTkRPVkVSLCAweDAwLCAweEZGLCAweEZGLAorCQkweEQwLCAweDAwLAkJLyogZW5hYmxlRGVsYXlQb3dlckJ1ZGdldEhPICovCisJCTB4NjQsIDB4MDAsCQkvKiBlbmFibGVEaXN0YW5jZUhPICovCisJCTB4NjcsIDB4MDAsCQkvKiBlbmFibGVJbnRlcm5hbEludGVyQ2VsbEhhbmRvdmVyICovCisJCTB4NjgsIDB4MDAsCQkvKiBlbmFibGVJbnRlcm5hbEludGVyQ2VsbEhhbmRvdmVyICovCisJCTB4NkEsIDB4MDAsCQkvKiBlbmFibGVQb3dlckJ1ZGdldEhPICovCisJCTB4NkMsIDB4MDAsCQkvKiBlbmFibGVSWExFVkhPICovCisJCTB4NkQsIDB4MDAsCQkvKiBlbmFibGVSWFFVQUxITyAqLworCQkweDZGLCAweDA4LAkJLyogaG9BdmVyYWdpbmdEaXN0YW5jZSAqLworCQkweDcwLCAweDA4LCAweDAxLAkvKiBob0F2ZXJhZ2luZ0xldiAqLworCQkweDcxLCAweDEwLCAweDEwLCAweDEwLAorCQkweDcyLCAweDA4LCAweDAyLAkvKiBob0F2ZXJhZ2luZ1F1YWwgKi8KKwkJMHg3MywgMHgwQSwJCS8qIGhvTG93ZXJUaHJlc2hvbGRMZXZETCAqLworCQkweDc0LCAweDA1LAkJLyogaG9Mb3dlclRocmVzaG9sZExldlVMICovCisJCTB4NzUsIDB4MDYsCQkvKiBob0xvd2VyVGhyZXNob2xkUXVhbERMICovCisJCTB4NzYsIDB4MDYsCQkvKiBob0xvd2VyVGhyZXNob2xkUXVhbFVMICovCisJCTB4NzgsIDB4MTQsCQkvKiBob1RocmVzaG9sZExldkRMaW50cmEgKi8KKwkJMHg3OSwgMHgxNCwJCS8qIGhvVGhyZXNob2xkTGV2VUxpbnRyYSAqLworCQkweDdBLCAweDE0LAkJLyogaG9UaHJlc2hvbGRNc1JhbmdlTWF4ICovCisJCTB4N0QsIDB4MDYsCQkvKiBuQ2VsbCAqLworCQlOTV9BVFRfQlMxMV9USU1FUl9IT19SRVFVRVNULCAweDAzLAorCQkweDIwLCAweDAxLCAweDAwLAorCQkweDQ1LCAweDAxLCAweDAwLAorCQkweDQ4LCAweDAxLCAweDAwLAorCQkweDVBLCAweDAxLCAweDAwLAorCQkweDVCLCAweDAxLCAweDA1LAorCQkweDVFLCAweDAxLCAweDFBLAorCQkweDVGLCAweDAxLCAweDIwLAorCQkweDlELCAweDAxLCAweDAwLAorCQkweDQ3LCAweDAxLCAweDAwLAorCQkweDVDLCAweDAxLCAweDY0LAorCQkweDVELCAweDAxLCAweDFFLAorCQkweDk3LCAweDAxLCAweDIwLAorCQkweEY3LCAweDAxLCAweDNDLAorfTsKKworLy8gUG93ZXIgQ29udHJvbCwgU0VUIEFUVFJJQlVURVMKKworLyoKKyAgT2JqZWN0IENsYXNzOiBQb3dlciBDb250cm9sCisgIEJUUyByZWxhdC4gTnVtYmVyOiAwCisgIEluc3RhbmNlIDI6IEZGCisgIEluc3RhbmNlIDM6IEZGCitTRVQgQVRUUklCVVRFUworICBlbmFibGVNc1Bvd2VyQ29udHJvbDogMDBoID0gIERpc2FibGVkCisgIGVuYWJsZVBvd2VyQ29udHJvbFJMRlc6IDAwaCA9ICBEaXNhYmxlZAorICBwY0F2ZXJhZ2luZ0xldjoKKyAgICBBX0xFVl9QQzogNCAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgICBXX0xFVl9QQzogMSAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgcGNBdmVyYWdpbmdRdWFsOgorICAgIEFfUVVBTF9QQzogNCAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgICBXX1FVQUxfUEM6IDIgIFNBQ0NIIG11bHRpZnJhbWVzCisgIHBjTG93ZXJUaHJlc2hvbGRMZXZETDogMEZoCisgIHBjTG93ZXJUaHJlc2hvbGRMZXZVTDogMEFoCisgIHBjTG93ZXJUaHJlc2hvbGRRdWFsREw6IDA1aCA9ICAgMy4yJSA8IEJFUiA8ICA2LjQlCisgIHBjTG93ZXJUaHJlc2hvbGRRdWFsVUw6IDA1aCA9ICAgMy4yJSA8IEJFUiA8ICA2LjQlCisgIHBjUkxGVGhyZXNob2xkOiAwQ2gKKyAgcGNVcHBlclRocmVzaG9sZExldkRMOiAxNGgKKyAgcGNVcHBlclRocmVzaG9sZExldlVMOiAwRmgKKyAgcGNVcHBlclRocmVzaG9sZFF1YWxETDogMDRoID0gICAxLjYlIDwgQkVSIDwgIDMuMiUKKyAgcGNVcHBlclRocmVzaG9sZFF1YWxVTDogMDRoID0gICAxLjYlIDwgQkVSIDwgIDMuMiUKKyAgcG93ZXJDb25maXJtOiAyICAsdW5pdCAyIFNBQ0NIIG11bHRpZnJhbWVzCisgIHBvd2VyQ29udHJvbEludGVydmFsOiAyICAsdW5pdCAyIFNBQ0NIIG11bHRpZnJhbWVzCisgIHBvd2VySW5jclN0ZXBTaXplOiAwMmggPSA0IGRCCisgIHBvd2VyUmVkU3RlcFNpemU6IDAxaCA9IDIgZEIKKyAgcmFkaW9MaW5rVGltZW91dEJzOiA2NCAgU0FDQ0ggbXVsdGlmcmFtZXMKKyAgZW5hYmxlQlNQb3dlckNvbnRyb2w6IDAwaCA9ICBkaXNhYmxlZAorKi8KKwordW5zaWduZWQgY2hhciBtc2dfNFtdID0KK3sKKwlOTV9NVF9CUzExX1NFVF9BVFRSLCBOTV9PQ19CUzExX1BXUl9DVFJMLCAweDAwLCAweEZGLCAweEZGLAorCQlOTV9BVFRfQlMxMV9FTkFfTVNfUFdSX0NUUkwsIDB4MDAsCisJCU5NX0FUVF9CUzExX0VOQV9QV1JfQ1RSTF9STEZXLCAweDAwLAorCQkweDdFLCAweDA0LCAweDAxLAkvKiBwY0F2ZXJhZ2luZ0xldiAqLworCQkweDdGLCAweDA0LCAweDAyLAkvKiBwY0F2ZXJhZ2luZ1F1YWwgKi8KKwkJMHg4MCwgMHgwRiwJCS8qIHBjTG93ZXJUaHJlc2hvbGRMZXZETCAqLworCQkweDgxLCAweDBBLAkJLyogcGNMb3dlclRocmVzaG9sZExldlVMICovCisJCTB4ODIsIDB4MDUsCQkvKiBwY0xvd2VyVGhyZXNob2xkUXVhbERMICovCisJCTB4ODMsIDB4MDUsCQkvKiBwY0xvd2VyVGhyZXNob2xkUXVhbFVMICovCisJCTB4ODQsIDB4MEMsIAkJLyogcGNSTEZUaHJlc2hvbGQgKi8KKwkJMHg4NSwgMHgxNCwgCQkvKiBwY1VwcGVyVGhyZXNob2xkTGV2REwgKi8KKwkJMHg4NiwgMHgwRiwgCQkvKiBwY1VwcGVyVGhyZXNob2xkTGV2VUwgKi8KKwkJMHg4NywgMHgwNCwJCS8qIHBjVXBwZXJUaHJlc2hvbGRRdWFsREwgKi8KKwkJMHg4OCwgMHgwNCwJCS8qIHBjVXBwZXJUaHJlc2hvbGRRdWFsVUwgKi8KKwkJMHg4OSwgMHgwMiwJCS8qIHBvd2VyQ29uZmlybSAqLworCQkweDhBLCAweDAyLAkJLyogcG93ZXJDb25maXJtSW50ZXJ2YWwgKi8KKwkJMHg4QiwgMHgwMiwJCS8qIHBvd2VySW5jclN0ZXBTaXplICovCisJCTB4OEMsIDB4MDEsCQkvKiBwb3dlclJlZFN0ZXBTaXplICovCisJCTB4OEQsIDB4NDAsCQkvKiByYWRpb0xpbmtUaW1lb3V0QnMgKi8KKwkJMHg2NSwgMHgwMSwgMHgwMCAvLyBzZXQgdG8gMHgwMSB0byBlbmFibGUgQlNQb3dlckNvbnRyb2wKK307CisKKworLy8gVHJhbnNjZWl2ZXIsIFNFVCBUUlggQVRUUklCVVRFUyAoVFJYIDApCisKKy8qCisgIE9iamVjdCBDbGFzczogVHJhbnNjZWl2ZXIKKyAgQlRTIHJlbGF0LiBOdW1iZXI6IDAKKyAgVHJhbmNlaXZlciBudW1iZXI6IDAKKyAgSW5zdGFuY2UgMzogRkYKK1NFVCBUUlggQVRUUklCVVRFUworICBhUkZDTkxpc3QgKEhFWCk6ICAwMDAxCisgIHR4UHdyTWF4UmVkdWN0aW9uOiAwMGggPSAgIDMwZEIKKyAgcmFkaW9NZWFzR3JhbjogMjU0ICBTQUNDSCBtdWx0aWZyYW1lcworICByYWRpb01lYXNSZXA6IDAxaCA9ICBlbmFibGVkCisgIG1lbWJlck9mRW1lcmdlbmN5Q29uZmlnOiAwMWggPSAgVFJVRQorICB0cnhBcmVhOiAwMGggPSBUUlggZG9lc24ndCBiZWxvbmcgdG8gYSBjb25jZW50cmljIGNlbGwKKyovCisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGJzMTFfYXR0cl9yYWRpb1tdID0KK3sKKwkJTk1fQVRUX0FSRkNOX0xJU1QsIDB4MDEsIDB4MDAsIEhBUkRDT0RFRF9BUkZDTiAvKjB4MDEqLywKKwkJTk1fQVRUX1JGX01BWFBPV1JfUiwgMHgwMCwKKwkJTk1fQVRUX0JTMTFfUkFESU9fTUVBU19HUkFOLCAweDAxLCAweDA1LAorCQlOTV9BVFRfQlMxMV9SQURJT19NRUFTX1JFUCwgMHgwMSwgMHgwMSwKKwkJTk1fQVRUX0JTMTFfRU1SR19DRkdfTUVNQkVSLCAweDAxLCAweDAxLAorCQlOTV9BVFRfQlMxMV9UUlhfQVJFQSwgMHgwMSwgMHgwMCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG5hbm9idHNfYXR0cl9idHNbXSA9IHsKKwlOTV9BVFRfSU5URVJGX0JPVU5ELCAweDU1LCAweDViLCAweDYxLCAweDY3LCAweDZkLCAweDczLAorCS8qIGludGVyZmVyZW5jZSBhdmcuIHBlcmlvZCBpbiBudW1iZXJzIG9mIFNBQ0NIIG11bHRpZnIgKi8KKwlOTV9BVFRfSU5UQVZFX1BBUkFNLCAweDA2LAorCS8qIGNvbm4gZmFpbCBiYXNlZCBvbiBTQUNDSCBlcnJvciByYXRlICovCisJTk1fQVRUX0NPTk5fRkFJTF9DUklULCAweDAwLCAweDAyLCAweDAxLCAweDEwLAorCU5NX0FUVF9UMjAwLCAweDFlLCAweDI0LCAweDI0LCAweGE4LCAweDM0LCAweDIxLCAweGE4LAorCU5NX0FUVF9NQVhfVEEsIDB4M2YsCisJTk1fQVRUX09WRVJMX1BFUklPRCwgMHgwMCwgMHgwMSwgMTAsIC8qIHNlY29uZHMgKi8KKwlOTV9BVFRfQ0NDSF9MX1QsIDEwLCAvKiBwZXJjZW50ICovCisJTk1fQVRUX0NDQ0hfTF9JX1AsIDEsIC8qIHNlY29uZHMgKi8KKwlOTV9BVFRfUkFDSF9CX1RIUkVTSCwgMTAsIC8qIGJ1c3kgdGhyZXNob2xkIGluIC0gZEJtICovCisJTk1fQVRUX0xEQVZHX1NMT1RTLCAweDAzLCAweGU4LCAvKiByYWNoIGxvYWQgYXZlcmFnaW5nIDEwMDAgc2xvdHMgKi8KKwlOTV9BVFRfQlRTX0FJUl9USU1FUiwgMTI4LCAvKiBtaWxpc2Vjb25kcyAqLworCU5NX0FUVF9OWTEsIDEwLCAvKiAxMCByZXRyYW5zbWlzc2lvbnMgb2YgcGh5c2ljYWwgY29uZmlnICovCisJTk1fQVRUX0JDQ0hfQVJGQ04sIEhBUkRDT0RFRF9BUkZDTiA+PiA4LCBIQVJEQ09ERURfQVJGQ04gJiAweGZmLAorCU5NX0FUVF9CU0lDLCBIQVJEQ09ERURfQlNJQywKKwlOTV9BVFRfSVBBQ0NfQ0dJLCAwLCA3LCAgMHgwMCwgMHhmMSwgMHgxMCwgMHgwMCwgMHgwMSwgMHgwMCwgMHgwMCwKK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG5hbm9idHNfYXR0cl9yYWRpb1tdID0geworCU5NX0FUVF9SRl9NQVhQT1dSX1IsIDB4MGMsIC8qIG51bWJlciBvZiAtMmRCIHJlZHVjdGlvbiBzdGVwcyAvIFBuICovCisJTk1fQVRUX0FSRkNOX0xJU1QsIDB4MDAsIDB4MDIsIEhBUkRDT0RFRF9BUkZDTiA+PiA4LCBIQVJEQ09ERURfQVJGQ04gJiAweGZmLAorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbmFub2J0c19hdHRyX25zZVtdID0geworCU5NX0FUVF9JUEFDQ19OU0VJLCAwLCAyLCAgMHgwMywgMHg5ZCwgLyogTlNFSSA5MjUgKi8KKwlOTV9BVFRfSVBBQ0NfTlNfQ0ZHLCAwLCA3LCAgMywgIC8qICh1bilibG9ja2luZyB0aW1lciAoVG5zLWJsb2NrKSAqLworCQkJCSAgICAzLCAgLyogKHVuKWJsb2NraW5nIHJldHJpZXMgKi8KKwkJCQkgICAgMywgIC8qIHJlc2V0IHRpbWVyIChUbnMtcmVzZXQpICovCisJCQkJICAgIDMsICAvKiByZXNldCByZXRyaWVzICovCisJCQkJICAgIDMwLCAgLyogdGVzdCB0aW1lciAoVG5zLXRlc3QpICovCisJCQkJICAgIDMsICAvKiBhbGl2ZSB0aW1lciAoVG5zLWFsaXZlKSAqLworCQkJCSAgICAxMCwgLyogYWxpdmUgcmV0cmlyZXMgKi8KKwlOTV9BVFRfSVBBQ0NfQlNTR1BfQ0ZHLCAwLCAxMSwKKwkJCQkgICAgMywgIC8qIGJsb2NraW1nIHRpbWVyIChUMSkgKi8KKwkJCQkgICAgMywgIC8qIGJsb2NraW5nIHJldHJpZXMgKi8KKwkJCQkgICAgMywgIC8qIHVuYmxvY2tpbmcgcmV0cmllcyAqLworCQkJCSAgICAzLCAgLyogcmVzZXQgdGltZXIgKi8KKwkJCQkgICAgMywgIC8qIHJlc2V0IHJldHJpZXMgKi8KKwkJCQkgICAgMTAsIC8qIHN1c3BlbmQgdGltZXIgKFQzKSBpbiAxMDBtcyAqLworCQkJCSAgICAzLCAgLyogc3VzcGVuZCByZXRyaWVzICovCisJCQkJICAgIDEwLCAvKiByZXN1bWUgdGltZXIgKFQ0KSBpbiAxMDBtcyAqLworCQkJCSAgICAzLCAgLyogcmVzdW1lIHJldHJpZXMgKi8KKwkJCQkgICAgMTAsIC8qIGNhcGFiaWxpdHkgdXBkYXRlIHRpbWVyIChUNSkgKi8KKwkJCQkgICAgMywgIC8qIGNhcGFiaWxpdHkgdXBkYXRlIHJldHJpZXMgKi8KK307CisKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIG5hbm9idHNfYXR0cl9jZWxsW10gPSB7CisJTk1fQVRUX0lQQUNDX1JBQywgMCwgMSwgIDEsIC8qIHJvdXRpbmcgYXJlYSBjb2RlICovCisJTk1fQVRUX0lQQUNDX0dQUlNfUEFHSU5HX0NGRywgMCwgMiwKKwkJNSwJLyogcmVwZWF0IHRpbWUgKDUwbXMpICovCisJCTMsCS8qIHJlcGVhdCBjb3VudCAqLworCU5NX0FUVF9JUEFDQ19CVkNJLCAwLCAyLCAgMHgwMywgMHg5ZCwgLyogQlZDSSA5MjUgKi8KKwlOTV9BVFRfSVBBQ0NfUkxDX0NGRywgMCwgOSwKKwkJMjAsIAkvKiBUMzE0MiAqLworCQk1LCAJLyogVDMxNjkgKi8KKwkJNSwJLyogVDMxOTEgKi8KKwkJMjAwLAkvKiBUMzE5MyAqLworCQk1LAkvKiBUMzE5NSAqLworCQkxMCwJLyogTjMxMDEgKi8KKwkJNCwJLyogTjMxMDMgKi8KKwkJOCwJLyogTjMxMDUgKi8KKwkJMTUsCS8qIFJMQyBDViBjb3VudGRvd24gKi8KKwlOTV9BVFRfSVBBQ0NfQ09ESU5HX1NDSEVNRVMsIDAsIDIsICAweDBmLCAweDAwLAorCU5NX0FUVF9JUEFDQ19STENfQ0ZHXzIsIDAsIDUsCisJCTB4MDAsIDI1MCwKKwkJMHgwMCwgMjUwLAorCQkyLAkvKiBNQ1MyICovCisjaWYgMAorCS8qIEVER0UgbW9kZWwgb25seSwgYnJlYWtzIG9sZGVyIG1vZGVscy4KKwkgKiBTaG91bGQgaW5xdWlyZSB0aGUgQlRTIGNhcGFiaWxpdGllcyAqLworCU5NX0FUVF9JUEFDQ19STENfQ0ZHXzMsIDAsIDEsCisJCTIsCS8qIE1DUzIgKi8KKyNlbmRpZgorfTsKKworc3RhdGljIHVuc2lnbmVkIGNoYXIgbmFub2J0c19hdHRyX25zdmMwW10gPSB7CisJTk1fQVRUX0lQQUNDX05TVkNJLCAwLCAyLCAgMHgwMywgMHg5ZCwgLyogOTI1ICovCisJTk1fQVRUX0lQQUNDX05TX0xJTktfQ0ZHLCAwLCA4LAorCQkweDU5LCAweGQ4LCAvKiByZW1vdGUgdWRwIHBvcnQgKDIzMDAwKSAqLworCQkxOTIsIDE2OCwgMTAwLCAxMSwgLyogcmVtb3RlIGlwIGFkZHJlc3MgKi8KKwkJMHg1OSwgMHhkOCwgLyogbG9jYWwgdWRwIHBvcnQgKDIzMDAwKSAqLworfTsKKworLyogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW5ldmVyIHdlIGdldCBhIEdTTSAxMi4yMSBzdGF0ZSBjaGFuZ2UgZXZlbnQgKi8KK2ludCBubV9zdGF0ZV9ldmVudChlbnVtIG5tX2V2dCBldnQsIHVfaW50OF90IG9ial9jbGFzcywgdm9pZCAqb2JqLAorCQkgICBzdHJ1Y3QgZ3NtX25tX3N0YXRlICpvbGRfc3RhdGUsIHN0cnVjdCBnc21fbm1fc3RhdGUgKm5ld19zdGF0ZSkKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHM7CisJc3RydWN0IGdzbV9idHNfZ3Byc19uc3ZjICpuc3ZjOworCisJLyogVGhpcyBldmVudC1kcml2ZW4gQlRTIHNldHVwIGlzIGN1cnJlbnRseSBvbmx5IHJlcXVpcmVkIG9uIG5hbm9CVFMgKi8KKworCS8qIEVWVF9TVEFURUNIR19BRE0gaXMgY2FsbGVkIGFmdGVyIHdlIGNhbGwgY2hnX2FkbV9zdGF0ZSgpIGFuZCB3b3VsZCBjcmVhdGUKKwkgKiBlbmRsZXNzIGxvb3AgKi8KKwlpZiAoZXZ0ICE9IEVWVF9TVEFURUNIR19PUEVSKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAob2JqX2NsYXNzKSB7CisJY2FzZSBOTV9PQ19TSVRFX01BTkFHRVI6CisJCWJ0cyA9IGNvbnRhaW5lcl9vZihvYmosIHN0cnVjdCBnc21fYnRzLCBzaXRlX21ncik7CisJCWlmICgobmV3X3N0YXRlLT5vcGVyYXRpb25hbCA9PSAyICYmCisJCSAgICAgbmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gTk1fQVZTVEFURV9PSykgfHwKKwkJICAgIChuZXdfc3RhdGUtPm9wZXJhdGlvbmFsID09IDEgJiYKKwkJICAgICBuZXdfc3RhdGUtPmF2YWlsYWJpbGl0eSA9PSBOTV9BVlNUQVRFX09GRl9MSU5FKSkKKwkJCWFiaXNfbm1fb3BzdGFydChidHMsIG9ial9jbGFzcywgMHhmZiwgMHhmZiwgMHhmZik7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfQlRTOgorCQlidHMgPSBvYmo7CisJCWlmIChuZXdfc3RhdGUtPmF2YWlsYWJpbGl0eSA9PSBOTV9BVlNUQVRFX0RFUEVOREVOQ1kpIHsKKwkJCXBhdGNoX25tX3RhYmxlcyhidHMpOworCQkJYWJpc19ubV9zZXRfYnRzX2F0dHIoYnRzLCBuYW5vYnRzX2F0dHJfYnRzLAorCQkJCQkgICAgIHNpemVvZihuYW5vYnRzX2F0dHJfYnRzKSk7CisJCQlhYmlzX25tX2NoZ19hZG1fc3RhdGUoYnRzLCBvYmpfY2xhc3MsCisJCQkJCSAgICAgIGJ0cy0+YnRzX25yLCAweGZmLCAweGZmLAorCQkJCQkgICAgICBOTV9TVEFURV9VTkxPQ0tFRCk7CisJCQlhYmlzX25tX29wc3RhcnQoYnRzLCBvYmpfY2xhc3MsCisJCQkJCWJ0cy0+YnRzX25yLCAweGZmLCAweGZmKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5NX09DX0NIQU5ORUw6CisJCXRzID0gb2JqOworCQl0cnggPSB0cy0+dHJ4OworCQlpZiAobmV3X3N0YXRlLT5vcGVyYXRpb25hbCA9PSAxICYmCisJCSAgICBuZXdfc3RhdGUtPmF2YWlsYWJpbGl0eSA9PSBOTV9BVlNUQVRFX0RFUEVOREVOQ1kpIHsKKwkJCXBhdGNoX25tX3RhYmxlcyh0cngtPmJ0cyk7CisJCQllbnVtIGFiaXNfbm1fY2hhbl9jb21iIGNjb21iID0KKwkJCQkJCWFiaXNfbm1fY2hjb21iNHBjaGFuKHRzLT5wY2hhbik7CisJCQlhYmlzX25tX3NldF9jaGFubmVsX2F0dHIodHMsIGNjb21iKTsKKwkJCWFiaXNfbm1fY2hnX2FkbV9zdGF0ZSh0cngtPmJ0cywgb2JqX2NsYXNzLAorCQkJCQkgICAgICB0cngtPmJ0cy0+YnRzX25yLCB0cngtPm5yLCB0cy0+bnIsCisJCQkJCSAgICAgIE5NX1NUQVRFX1VOTE9DS0VEKTsKKwkJCWFiaXNfbm1fb3BzdGFydCh0cngtPmJ0cywgb2JqX2NsYXNzLAorCQkJCQl0cngtPmJ0cy0+YnRzX25yLCB0cngtPm5yLCB0cy0+bnIpOworCQl9CisJCWJyZWFrOworCWNhc2UgTk1fT0NfUkFESU9fQ0FSUklFUjoKKwkJdHJ4ID0gb2JqOworCQlpZiAobmV3X3N0YXRlLT5vcGVyYXRpb25hbCA9PSAxICYmCisJCSAgICBuZXdfc3RhdGUtPmF2YWlsYWJpbGl0eSA9PSBOTV9BVlNUQVRFX09LKQorCQkJYWJpc19ubV9vcHN0YXJ0KHRyeC0+YnRzLCBvYmpfY2xhc3MsIHRyeC0+YnRzLT5idHNfbnIsCisJCQkJCXRyeC0+bnIsIDB4ZmYpOworCQlicmVhazsKKwljYXNlIE5NX09DX0dQUlNfTlNFOgorCQlidHMgPSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgZ3NtX2J0cywgZ3Bycy5uc2UpOworCQlpZiAoIWJ0cy0+Z3Bycy5lbmFibGVkKQorCQkJYnJlYWs7CisJCWlmIChuZXdfc3RhdGUtPmF2YWlsYWJpbGl0eSA9PSA1KSB7CisJCQlhYmlzX25tX2lwYWNjZXNzX3NldF9hdHRyKGJ0cywgb2JqX2NsYXNzLCBidHMtPmJ0c19uciwKKwkJCQkJCSAgMHhmZiwgMHhmZiwgbmFub2J0c19hdHRyX25zZSwKKwkJCQkJCSAgc2l6ZW9mKG5hbm9idHNfYXR0cl9uc2UpKTsKKwkJCWFiaXNfbm1fb3BzdGFydChidHMsIG9ial9jbGFzcywgYnRzLT5idHNfbnIsCisJCQkJCTB4ZmYsIDB4ZmYpOworCQkJYWJpc19ubV9jaGdfYWRtX3N0YXRlKGJ0cywgb2JqX2NsYXNzLCBidHMtPmJ0c19uciwKKwkJCQkJICAgICAgMHhmZiwgMHhmZiwgTk1fU1RBVEVfVU5MT0NLRUQpOworCQl9CisJCWJyZWFrOworCWNhc2UgTk1fT0NfR1BSU19DRUxMOgorCQlidHMgPSBjb250YWluZXJfb2Yob2JqLCBzdHJ1Y3QgZ3NtX2J0cywgZ3Bycy5jZWxsKTsKKwkJaWYgKCFidHMtPmdwcnMuZW5hYmxlZCkKKwkJCWJyZWFrOworCQlpZiAobmV3X3N0YXRlLT5hdmFpbGFiaWxpdHkgPT0gNSkgeworCQkJYWJpc19ubV9pcGFjY2Vzc19zZXRfYXR0cihidHMsIG9ial9jbGFzcywgYnRzLT5idHNfbnIsCisJCQkJCQkgIDAsIDB4ZmYsIG5hbm9idHNfYXR0cl9jZWxsLAorCQkJCQkJICBzaXplb2YobmFub2J0c19hdHRyX2NlbGwpKTsKKwkJCWFiaXNfbm1fb3BzdGFydChidHMsIG9ial9jbGFzcywgYnRzLT5idHNfbnIsCisJCQkJCTAsIDB4ZmYpOworCQkJYWJpc19ubV9jaGdfYWRtX3N0YXRlKGJ0cywgb2JqX2NsYXNzLCBidHMtPmJ0c19uciwKKwkJCQkJICAgICAgMCwgMHhmZiwgTk1fU1RBVEVfVU5MT0NLRUQpOworCQl9CisJCWJyZWFrOworCWNhc2UgTk1fT0NfR1BSU19OU1ZDOgorCQluc3ZjID0gb2JqOworCQlidHMgPSBuc3ZjLT5idHM7CisJCWlmICghYnRzLT5ncHJzLmVuYWJsZWQpCisJCQlicmVhazsKKwkgICAgICAgIC8qIFdlIHNraXAgTlNWQzEgc2luY2Ugd2Ugb25seSB1c2UgTlNWQzAgKi8KKwkJaWYgKG5zdmMtPmlkID09IDEpCisJCQlicmVhazsKKwkJaWYgKG5ld19zdGF0ZS0+YXZhaWxhYmlsaXR5ID09IE5NX0FWU1RBVEVfT0ZGX0xJTkUpIHsKKwkJCWFiaXNfbm1faXBhY2Nlc3Nfc2V0X2F0dHIoYnRzLCBvYmpfY2xhc3MsIGJ0cy0+YnRzX25yLAorCQkJCQkJICBuc3ZjLT5pZCwgMHhmZiwKKwkJCQkJCSAgbmFub2J0c19hdHRyX25zdmMwLAorCQkJCQkJICBzaXplb2YobmFub2J0c19hdHRyX25zdmMwKSk7CisJCQlhYmlzX25tX29wc3RhcnQoYnRzLCBvYmpfY2xhc3MsIGJ0cy0+YnRzX25yLAorCQkJCQluc3ZjLT5pZCwgMHhmZik7CisJCQlhYmlzX25tX2NoZ19hZG1fc3RhdGUoYnRzLCBvYmpfY2xhc3MsIGJ0cy0+YnRzX25yLAorCQkJCQkgICAgICBuc3ZjLT5pZCwgMHhmZiwKKwkJCQkJICAgICAgTk1fU1RBVEVfVU5MT0NLRUQpOworCQl9CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCisvKiBDYWxsYmFjayBmdW5jdGlvbiB0byBiZSBjYWxsZWQgZXZlcnkgdGltZSB3ZSByZWNlaXZlIGEgMTIuMjEgU1cgYWN0aXZhdGVkIHJlcG9ydCAqLworc3RhdGljIGludCBzd19hY3Rpdl9yZXAoc3RydWN0IG1zZ2IgKm1iKQoreworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCA9IG1zZ2JfbDMobWIpOworCXN0cnVjdCBnc21fYnRzICpidHMgPSBtYi0+dHJ4LT5idHM7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCBmb2gtPm9ial9pbnN0LnRyeF9ucik7CisKKwlpZiAoIXRyeCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlzd2l0Y2ggKGZvaC0+b2JqX2NsYXNzKSB7CisJY2FzZSBOTV9PQ19CQVNFQl9UUkFOU0M6CisJCWFiaXNfbm1fY2hnX2FkbV9zdGF0ZSh0cngtPmJ0cywgZm9oLT5vYmpfY2xhc3MsCisJCQkJICAgICAgdHJ4LT5idHMtPmJ0c19uciwgdHJ4LT5uciwgMHhmZiwKKwkJCQkgICAgICBOTV9TVEFURV9VTkxPQ0tFRCk7CisJCWFiaXNfbm1fb3BzdGFydCh0cngtPmJ0cywgZm9oLT5vYmpfY2xhc3MsCisJCQkJdHJ4LT5idHMtPmJ0c19uciwgdHJ4LT5uciwgMHhmZik7CisJCS8qIFRSWCBzb2Z0d2FyZSBpcyBhY3RpdmUsIHRlbGwgaXQgdG8gaW5pdGlhdGUgUlNMIExpbmsgKi8KKwkJYWJpc19ubV9pcGFjY2Vzc19yc2xfY29ubmVjdCh0cngsIDAsIDMwMDMsIHRyeC0+cnNsX3RlaSk7CisJCWJyZWFrOworCWNhc2UgTk1fT0NfUkFESU9fQ0FSUklFUjogeworCQkvKgorCQkgKiBMb2NraW5nIHRoZSByYWRpbyBjYXJyaWVyIHdpbGwgbWFrZSBpdCBnbworCQkgKiBvZmZsaW5lIGFnYWluIGFuZCB3ZSB3b3VsZCBjb21lIGhlcmUuIFRoZQorCQkgKiBmcmFtZXdvcmsgc2hvdWxkIGRldGVybWluZSB0aGF0IHRoZXJlIHdhcworCQkgKiBubyBjaGFuZ2UgYW5kIGF2b2lkIHJlY3Vyc2lvbi4KKwkJICoKKwkJICogVGhpcyBjb2RlIGlzIGhlcmUgdG8gbWFrZSBzdXJlIHRoYXQgb24gc3RhcnQKKwkJICogYSBUUlggcmVtYWlucyBsb2NrZWQuCisJCSAqLworCQlpbnQgcmNfc3RhdGUgPSB0cngtPm5tX3N0YXRlLmFkbWluaXN0cmF0aXZlOworCQkvKiBQYXRjaCBBUkZDTiBpbnRvIHJhZGlvIGF0dHJpYnV0ZSAqLworCQluYW5vYnRzX2F0dHJfcmFkaW9bNV0gJj0gMHhmMDsKKwkJbmFub2J0c19hdHRyX3JhZGlvWzVdIHw9IHRyeC0+YXJmY24gPj4gODsKKwkJbmFub2J0c19hdHRyX3JhZGlvWzZdID0gdHJ4LT5hcmZjbiAmIDB4ZmY7CisJCWFiaXNfbm1fc2V0X3JhZGlvX2F0dHIodHJ4LCBuYW5vYnRzX2F0dHJfcmFkaW8sCisJCQkJICAgICAgIHNpemVvZihuYW5vYnRzX2F0dHJfcmFkaW8pKTsKKwkJYWJpc19ubV9jaGdfYWRtX3N0YXRlKHRyeC0+YnRzLCBmb2gtPm9ial9jbGFzcywKKwkJCQkgICAgICB0cngtPmJ0cy0+YnRzX25yLCB0cngtPm5yLCAweGZmLAorCQkJCSAgICAgIHJjX3N0YXRlKTsKKwkJYWJpc19ubV9vcHN0YXJ0KHRyeC0+YnRzLCBmb2gtPm9ial9jbGFzcywgdHJ4LT5idHMtPmJ0c19uciwKKwkJCQl0cngtPm5yLCAweGZmKTsKKwkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBOQUNLIG9uIHRoZSBPTUwgTk0gKi8KK3N0YXRpYyBpbnQgb21sX21zZ19uYWNrKHVfaW50OF90IG10KQoreworCWlmIChtdCA9PSBOTV9NVF9TRVRfQlRTX0FUVFJfTkFDSykgeworCQlMT0dQKEROTSwgTE9HTF9GQVRBTCwgIkZhaWxlZCB0byBzZXQgQlRTIGF0dHJpYnV0ZXMuIFRoYXQgaXMgZmF0YWwuICIKKwkJCQkiV2FzIHRoZSBidHMgdHlwZSBhbmQgZnJlcXVlbmN5IHByb3Blcmx5IHNwZWNpZmllZD9cbiIpOworCQlleGl0KC0xKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2FsbGJhY2sgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIGV2ZXJ5IHRpbWUgd2UgcmVjZWl2ZSBhIHNpZ25hbCBmcm9tIE5NICovCitzdGF0aWMgaW50IG5tX3NpZ19jYih1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkgICAgIHZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpCit7CisJdV9pbnQ4X3QgKm1zZ190eXBlOworCisJc3dpdGNoIChzaWduYWwpIHsKKwljYXNlIFNfTk1fU1dfQUNUSVZfUkVQOgorCQlyZXR1cm4gc3dfYWN0aXZfcmVwKHNpZ25hbF9kYXRhKTsKKwljYXNlIFNfTk1fTkFDSzoKKwkJbXNnX3R5cGUgPSBzaWduYWxfZGF0YTsKKwkJcmV0dXJuIG9tbF9tc2dfbmFjaygqbXNnX3R5cGUpOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYm9vdHN0cmFwX29tX25hbm9idHMoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwkvKiBXZSBkb24ndCBkbyBjYWxsYmFjayBiYXNlZCBib290c3RyYXBwaW5nLCBidXQgZXZlbnQgZHJpdmVuIChzZWUgYWJvdmUpICovCit9CisKK3N0YXRpYyB2b2lkIG5tX3JlY29uZmlnX3RzKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMpCit7CisJZW51bSBhYmlzX25tX2NoYW5fY29tYiBjY29tYiA9IGFiaXNfbm1fY2hjb21iNHBjaGFuKHRzLT5wY2hhbik7CisJc3RydWN0IGdzbV9lMV9zdWJzbG90ICplMWwgPSAmdHMtPmUxX2xpbms7CisKKwlhYmlzX25tX3NldF9jaGFubmVsX2F0dHIodHMsIGNjb21iKTsKKworCWlmIChpc19pcGFjY2Vzc19idHModHMtPnRyeC0+YnRzKSkKKwkJcmV0dXJuOworCisJc3dpdGNoICh0cy0+cGNoYW4pIHsKKwljYXNlIEdTTV9QQ0hBTl9UQ0hfRjoKKwljYXNlIEdTTV9QQ0hBTl9UQ0hfSDoKKwkJYWJpc19ubV9jb25uX3RlcnJfdHJhZih0cywgZTFsLT5lMV9uciwgZTFsLT5lMV90cywKKwkJCQkJZTFsLT5lMV90c19zcyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KK30KKworc3RhdGljIHZvaWQgbm1fcmVjb25maWdfdHJ4KHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KQoreworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCAqZTFsID0gJnRyeC0+cnNsX2UxX2xpbms7CisJaW50IGk7CisKKwlwYXRjaF9ubV90YWJsZXModHJ4LT5idHMpOworCisJc3dpdGNoICh0cngtPmJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCS8qIEZJWE1FOiBkaXNjb3ZlciB0aGlzIGJ5IGZldGNoaW5nIGFuIGF0dHJpYnV0ZSAqLworI2lmIDAKKwkJdHJ4LT5ub21pbmFsX3Bvd2VyID0gMTU7IC8qIDE1ZEJtID09IDMwbVcgUEEgY29uZmlndXJhdGlvbiAqLworI2Vsc2UKKwkJdHJ4LT5ub21pbmFsX3Bvd2VyID0gMjQ7IC8qIDI0ZEJtID09IDI1MG1XIFBBIGNvbmZpZ3VyYXRpb24gKi8KKyNlbmRpZgorCQlhYmlzX25tX2Nvbm5fdGVycl9zaWduKHRyeCwgZTFsLT5lMV9uciwgZTFsLT5lMV90cywKKwkJCQkJZTFsLT5lMV90c19zcyk7CisJCWFiaXNfbm1fZXN0YWJsaXNoX3RlaSh0cngtPmJ0cywgdHJ4LT5uciwgZTFsLT5lMV9uciwKKwkJCQkgICAgICBlMWwtPmUxX3RzLCBlMWwtPmUxX3RzX3NzLCB0cngtPnJzbF90ZWkpOworCisJCS8qIFNldCBSYWRpbyBBdHRyaWJ1dGVzICovCisJCWlmICh0cnggPT0gdHJ4LT5idHMtPmMwKQorCQkJYWJpc19ubV9zZXRfcmFkaW9fYXR0cih0cngsIGJzMTFfYXR0cl9yYWRpbywKKwkJCQkJICAgICAgIHNpemVvZihiczExX2F0dHJfcmFkaW8pKTsKKwkJZWxzZSB7CisJCQl1X2ludDhfdCB0cngxX2F0dHJfcmFkaW9bc2l6ZW9mKGJzMTFfYXR0cl9yYWRpbyldOworCQkJdV9pbnQ4X3QgYXJmY25fbG93ID0gdHJ4LT5hcmZjbiAmIDB4ZmY7CisJCQl1X2ludDhfdCBhcmZjbl9oaWdoID0gKHRyeC0+YXJmY24gPj4gOCkgJiAweDBmOworCQkJbWVtY3B5KHRyeDFfYXR0cl9yYWRpbywgYnMxMV9hdHRyX3JhZGlvLAorCQkJCXNpemVvZih0cngxX2F0dHJfcmFkaW8pKTsKKworCQkJLyogcGF0Y2ggQVJGQ04gaW50byBUUlggQXR0cmlidXRlcyAqLworCQkJdHJ4MV9hdHRyX3JhZGlvWzJdICY9IDB4ZjA7CisJCQl0cngxX2F0dHJfcmFkaW9bMl0gfD0gYXJmY25faGlnaDsKKwkJCXRyeDFfYXR0cl9yYWRpb1szXSA9IGFyZmNuX2xvdzsKKworCQkJYWJpc19ubV9zZXRfcmFkaW9fYXR0cih0cngsIHRyeDFfYXR0cl9yYWRpbywKKwkJCQkJICAgICAgIHNpemVvZih0cngxX2F0dHJfcmFkaW8pKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOgorCQlzd2l0Y2ggKHRyeC0+YnRzLT5iYW5kKSB7CisJCWNhc2UgR1NNX0JBTkRfODUwOgorCQljYXNlIEdTTV9CQU5EXzkwMDoKKwkJCXRyeC0+bm9taW5hbF9wb3dlciA9IDIwOworCQkJYnJlYWs7CisJCWNhc2UgR1NNX0JBTkRfMTgwMDoKKwkJY2FzZSBHU01fQkFORF8xOTAwOgorCQkJdHJ4LT5ub21pbmFsX3Bvd2VyID0gMjM7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiVW5zdXBwb3J0ZWQgbmFub0JUUyBHU00gYmFuZCAlc1xuIiwKKwkJCQlnc21fYmFuZF9uYW1lKHRyeC0+YnRzLT5iYW5kKSk7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgVFJYX05SX1RTOyBpKyspCisJCW5tX3JlY29uZmlnX3RzKCZ0cngtPnRzW2ldKTsKK30KKworc3RhdGljIHZvaWQgbm1fcmVjb25maWdfYnRzKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisKKwlzd2l0Y2ggKGJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCXBhdGNoX25tX3RhYmxlcyhidHMpOworCQlhYmlzX25tX3Jhd19tc2coYnRzLCBzaXplb2YobXNnXzEpLCBtc2dfMSk7IC8qIHNldCBCVFMgU2l0ZU1nciBhdHRyKi8KKwkJYWJpc19ubV9zZXRfYnRzX2F0dHIoYnRzLCBiczExX2F0dHJfYnRzLCBzaXplb2YoYnMxMV9hdHRyX2J0cykpOworCQlhYmlzX25tX3Jhd19tc2coYnRzLCBzaXplb2YobXNnXzMpLCBtc2dfMyk7IC8qIHNldCBCVFMgaGFuZG92ZXIgYXR0ciAqLworCQlhYmlzX25tX3Jhd19tc2coYnRzLCBzaXplb2YobXNnXzQpLCBtc2dfNCk7IC8qIHNldCBCVFMgcG93ZXIgY29udHJvbCBhdHRyICovCisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyeCwgJmJ0cy0+dHJ4X2xpc3QsIGxpc3QpCisJCW5tX3JlY29uZmlnX3RyeCh0cngpOworfQorCitzdGF0aWMgdm9pZCBib290c3RyYXBfb21fYnMxMShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCS8qIHN0b3Agc2VuZGluZyBldmVudCByZXBvcnRzICovCisJYWJpc19ubV9ldmVudF9yZXBvcnRzKGJ0cywgMCk7CisKKwkvKiBiZWdpbiBEQiB0cmFuc21pc3Npb24gKi8KKwlhYmlzX25tX2JzMTFfZGJfdHJhbnNtaXNzaW9uKGJ0cywgMSk7CisKKwkvKiBlbmQgREIgdHJhbnNtaXNzaW9uICovCisJYWJpc19ubV9iczExX2RiX3RyYW5zbWlzc2lvbihidHMsIDApOworCisJLyogUmVzZXQgQlRTIFNpdGUgbWFuYWdlciByZXNvdXJjZSAqLworCWFiaXNfbm1fYnMxMV9yZXNldF9yZXNvdXJjZShidHMpOworCisJLyogYmVnaW4gREIgdHJhbnNtaXNzaW9uICovCisJYWJpc19ubV9iczExX2RiX3RyYW5zbWlzc2lvbihidHMsIDEpOworCisJLyogcmVjb25maWd1cmUgQlRTIHdpdGggYWxsIFRSWCBhbmQgYWxsIFRTICovCisJbm1fcmVjb25maWdfYnRzKGJ0cyk7CisKKwkvKiBlbmQgREIgdHJhbnNtaXNzaW9uICovCisJYWJpc19ubV9iczExX2RiX3RyYW5zbWlzc2lvbihidHMsIDApOworCisJLyogUmVzZXQgQlRTIFNpdGUgbWFuYWdlciByZXNvdXJjZSAqLworCWFiaXNfbm1fYnMxMV9yZXNldF9yZXNvdXJjZShidHMpOworCisJLyogcmVzdGFydCBzZW5kaW5nIGV2ZW50IHJlcG9ydHMgKi8KKwlhYmlzX25tX2V2ZW50X3JlcG9ydHMoYnRzLCAxKTsKK30KKworc3RhdGljIHZvaWQgYm9vdHN0cmFwX29tKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJTE9HUChETk0sIExPR0xfTk9USUNFLCAiYm9vdHN0cmFwcGluZyBPTUwgZm9yIEJUUyAldVxuIiwgYnRzLT5ucik7CisKKwlzd2l0Y2ggKGJ0cy0+dHlwZSkgeworCWNhc2UgR1NNX0JUU19UWVBFX0JTMTE6CisJCWJvb3RzdHJhcF9vbV9iczExKGJ0cyk7CisJCWJyZWFrOworCWNhc2UgR1NNX0JUU19UWVBFX05BTk9CVFM6CisJCWJvb3RzdHJhcF9vbV9uYW5vYnRzKGJ0cyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiVW5hYmxlIHRvIGJvb3RzdHJhcCBPTUw6IFVua25vd24gQlRTIHR5cGUgJWRcbiIsIGJ0cy0+dHlwZSk7CisJfQorfQorCitzdGF0aWMgaW50IHNodXRkb3duX29tKHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJTE9HUChETk0sIExPR0xfTk9USUNFLCAic2h1dHRpbmcgZG93biBPTUwgZm9yIEJUUyAldVxuIiwgYnRzLT5ucik7CisKKwkvKiBzdG9wIHNlbmRpbmcgZXZlbnQgcmVwb3J0cyAqLworCWFiaXNfbm1fZXZlbnRfcmVwb3J0cyhidHMsIDApOworCisJLyogYmVnaW4gREIgdHJhbnNtaXNzaW9uICovCisJYWJpc19ubV9iczExX2RiX3RyYW5zbWlzc2lvbihidHMsIDEpOworCisJLyogZW5kIERCIHRyYW5zbWlzc2lvbiAqLworCWFiaXNfbm1fYnMxMV9kYl90cmFuc21pc3Npb24oYnRzLCAwKTsKKworCS8qIFJlc2V0IEJUUyBTaXRlIG1hbmFnZXIgcmVzb3VyY2UgKi8KKwlhYmlzX25tX2JzMTFfcmVzZXRfcmVzb3VyY2UoYnRzKTsKKworCXJldHVybiAwOworfQorCitpbnQgYnNjX3NodXRkb3duX25ldChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCkKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoYnRzLCAmbmV0LT5idHNfbGlzdCwgbGlzdCkgeworCQlpbnQgcmM7CisJCXJjID0gc2h1dGRvd25fb20oYnRzKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogc2V0IGFsbCBzeXN0ZW0gaW5mb3JtYXRpb24gdHlwZXMgKi8KK3N0YXRpYyBpbnQgc2V0X3N5c3RlbV9pbmZvcyhzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlpbnQgaSwgcmM7CisJdV9pbnQ4X3Qgc2lfdG1wWzIzXTsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdHJ4LT5idHM7CisKKwlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIubXNfdHhwd3JfbWF4X2NjY2ggPQorCQkJbXNfcHdyX2N0bF9sdmwoYnRzLT5iYW5kLCBidHMtPm1zX21heF9wb3dlcik7CisJYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLm5lY2kgPSBidHMtPm5ldHdvcmstPm5lY2k7CisKKwlpZiAodHJ4ID09IHRyeC0+YnRzLT5jMCkgeworCQlmb3IgKGkgPSAxOyBpIDw9IDQ7IGkrKykgeworCQkJcmMgPSBnc21fZ2VuZXJhdGVfc2koc2lfdG1wLCB0cngtPmJ0cywgaSk7CisJCQlpZiAocmMgPCAwKQorCQkJCWdvdG8gZXJyX291dDsKKwkJCURFQlVHUChEUlIsICJTSSUydTogJXNcbiIsIGksIGhleGR1bXAoc2lfdG1wLCByYykpOworCQkJcnNsX2JjY2hfaW5mbyh0cngsIGksIHNpX3RtcCwgc2l6ZW9mKHNpX3RtcCkpOworCQl9CisJCWlmIChidHMtPmdwcnMuZW5hYmxlZCkgeworCQkJaSA9IDEzOworCQkJcmMgPSBnc21fZ2VuZXJhdGVfc2koc2lfdG1wLCB0cngtPmJ0cywgUlNMX1NZU1RFTV9JTkZPXzEzKTsKKwkJCWlmIChyYyA8IDApCisJCQkJZ290byBlcnJfb3V0OworCQkJREVCVUdQKERSUiwgIlNJJTJ1OiAlc1xuIiwgaSwgaGV4ZHVtcChzaV90bXAsIHJjKSk7CisJCQlyc2xfYmNjaF9pbmZvKHRyeCwgUlNMX1NZU1RFTV9JTkZPXzEzLCBzaV90bXAsIHJjKTsKKwkJfQorCX0KKworCWkgPSA1OworCXJjID0gZ3NtX2dlbmVyYXRlX3NpKHNpX3RtcCwgdHJ4LT5idHMsIFJTTF9TWVNURU1fSU5GT181KTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGVycl9vdXQ7CisJREVCVUdQKERSUiwgIlNJJTJ1OiAlc1xuIiwgaSwgaGV4ZHVtcChzaV90bXAsIHJjKSk7CisJcnNsX3NhY2NoX2ZpbGxpbmcodHJ4LCBSU0xfU1lTVEVNX0lORk9fNSwgc2lfdG1wLCByYyk7CisKKwlpID0gNjsKKwlyYyA9IGdzbV9nZW5lcmF0ZV9zaShzaV90bXAsIHRyeC0+YnRzLCBSU0xfU1lTVEVNX0lORk9fNik7CisJaWYgKHJjIDwgMCkKKwkJZ290byBlcnJfb3V0OworCURFQlVHUChEUlIsICJTSSUydTogJXNcbiIsIGksIGhleGR1bXAoc2lfdG1wLCByYykpOworCXJzbF9zYWNjaF9maWxsaW5nKHRyeCwgUlNMX1NZU1RFTV9JTkZPXzYsIHNpX3RtcCwgcmMpOworCisJcmV0dXJuIDA7CitlcnJfb3V0OgorCUxPR1AoRFJSLCBMT0dMX0VSUk9SLCAiQ2Fubm90IGdlbmVyYXRlIFNJICV1IGZvciBCVFMgJXUsIG1vc3QgbGlrZWx5ICIKKwkJImEgcHJvYmxlbSB3aXRoIG5laWdoYm9yIGNlbGwgbGlzdCBnZW5lcmF0aW9uXG4iLAorCQlpLCB0cngtPmJ0cy0+bnIpOworCXJldHVybiByYzsKK30KKworLyoKKyAqIFBhdGNoIHRoZSB2YXJpb3VzIFNZU1RFTSBJTkZPUk1BVElPTiB0YWJsZXMgdG8gdXBkYXRlCisgKiB0aGUgTEFJCisgKi8KK3N0YXRpYyB2b2lkIHBhdGNoX25tX3RhYmxlcyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXVfaW50OF90IGFyZmNuX2xvdyA9IGJ0cy0+YzAtPmFyZmNuICYgMHhmZjsKKwl1X2ludDhfdCBhcmZjbl9oaWdoID0gKGJ0cy0+YzAtPmFyZmNuID4+IDgpICYgMHgwZjsKKworCS8qIHBhdGNoIEFSRkNOIGludG8gQlRTIEF0dHJpYnV0ZXMgKi8KKwliczExX2F0dHJfYnRzWzY5XSAmPSAweGYwOworCWJzMTFfYXR0cl9idHNbNjldIHw9IGFyZmNuX2hpZ2g7CisJYnMxMV9hdHRyX2J0c1s3MF0gPSBhcmZjbl9sb3c7CisJbmFub2J0c19hdHRyX2J0c1s0Ml0gJj0gMHhmMDsKKwluYW5vYnRzX2F0dHJfYnRzWzQyXSB8PSBhcmZjbl9oaWdoOworCW5hbm9idHNfYXR0cl9idHNbNDNdID0gYXJmY25fbG93OworCisJLyogcGF0Y2ggQVJGQ04gaW50byBUUlggQXR0cmlidXRlcyAqLworCWJzMTFfYXR0cl9yYWRpb1syXSAmPSAweGYwOworCWJzMTFfYXR0cl9yYWRpb1syXSB8PSBhcmZjbl9oaWdoOworCWJzMTFfYXR0cl9yYWRpb1szXSA9IGFyZmNuX2xvdzsKKworCS8qIHBhdGNoIEJTSUMgKi8KKwliczExX2F0dHJfYnRzWzFdID0gYnRzLT5ic2ljOworCW5hbm9idHNfYXR0cl9idHNbc2l6ZW9mKG5hbm9idHNfYXR0cl9idHMpLTExXSA9IGJ0cy0+YnNpYzsKKworCS8qIHBhdGNoIENHSSAqLworCWFiaXNfbm1faXBhY2Nlc3NfY2dpKG5hbm9idHNfYXR0cl9idHMrc2l6ZW9mKG5hbm9idHNfYXR0cl9idHMpLTcsIGJ0cyk7CisKKwkvKiBwYXRjaCB0aGUgcG93ZXIgcmVkdWN0aW9uICovCisJYnMxMV9hdHRyX3JhZGlvWzVdID0gYnRzLT5jMC0+bWF4X3Bvd2VyX3JlZCAvIDI7CisJbmFub2J0c19hdHRyX3JhZGlvWzFdID0gYnRzLT5jMC0+bWF4X3Bvd2VyX3JlZCAvIDI7CisKKwkvKiBwYXRjaCBOU0VJICovCisJbmFub2J0c19hdHRyX25zZVszXSA9IGJ0cy0+Z3Bycy5uc2UubnNlaSA+PiA4OworCW5hbm9idHNfYXR0cl9uc2VbNF0gPSBidHMtPmdwcnMubnNlLm5zZWkgJiAweGZmOworCisJLyogcGF0Y2ggTlNWQ0kgKi8KKwluYW5vYnRzX2F0dHJfbnN2YzBbM10gPSBidHMtPmdwcnMubnN2Y1swXS5uc3ZjaSA+PiA4OworCW5hbm9idHNfYXR0cl9uc3ZjMFs0XSA9IGJ0cy0+Z3Bycy5uc3ZjWzBdLm5zdmNpICYgMHhmZjsKKworCS8qIHBhdGNoIElQIGFkZHJlc3MgYXMgU0dTTiBJUCAqLworCSoodV9pbnQxNl90ICopKG5hbm9idHNfYXR0cl9uc3ZjMCs4KSA9CisJCQkJaHRvbnMoYnRzLT5ncHJzLm5zdmNbMF0ucmVtb3RlX3BvcnQpOworCSoodV9pbnQzMl90ICopKG5hbm9idHNfYXR0cl9uc3ZjMCsxMCkgPQorCQkJCWh0b25sKGJ0cy0+Z3Bycy5uc3ZjWzBdLnJlbW90ZV9pcCk7CisJKih1X2ludDE2X3QgKikobmFub2J0c19hdHRyX25zdmMwKzE0KSA9CisJCQkJaHRvbnMoYnRzLT5ncHJzLm5zdmNbMF0ubG9jYWxfcG9ydCk7CisKKwkvKiBwYXRjaCBCVkNJICovCisJbmFub2J0c19hdHRyX2NlbGxbMTJdID0gYnRzLT5ncHJzLmNlbGwuYnZjaSA+PiA4OworCW5hbm9idHNfYXR0cl9jZWxsWzEzXSA9IGJ0cy0+Z3Bycy5jZWxsLmJ2Y2kgJiAweGZmOworCS8qIHBhdGNoIFJBQyAqLworCW5hbm9idHNfYXR0cl9jZWxsWzNdID0gYnRzLT5ncHJzLnJhYzsKKworfQorCitzdGF0aWMgdm9pZCBib290c3RyYXBfcnNsKHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KQoreworCUxPR1AoRFJTTCwgTE9HTF9OT1RJQ0UsICJib290c3RyYXBwaW5nIFJTTCBmb3IgQlRTL1RSWCAoJXUvJXUpICIKKwkJIm9uIEFSRkNOICV1IHVzaW5nIE1DQz0ldSBNTkM9JXUgTEFDPSV1IENJRD0ldSBCU0lDPSV1IFRTQz0ldVxuIiwKKwkJdHJ4LT5idHMtPm5yLCB0cngtPm5yLCB0cngtPmFyZmNuLCBic2NfZ3NtbmV0LT5jb3VudHJ5X2NvZGUsCisJCWJzY19nc21uZXQtPm5ldHdvcmtfY29kZSwgdHJ4LT5idHMtPmxvY2F0aW9uX2FyZWFfY29kZSwKKwkJdHJ4LT5idHMtPmNlbGxfaWRlbnRpdHksIHRyeC0+YnRzLT5ic2ljLCB0cngtPmJ0cy0+dHNjKTsKKwlzZXRfc3lzdGVtX2luZm9zKHRyeCk7Cit9CisKK3ZvaWQgaW5wdXRfZXZlbnQoaW50IGV2ZW50LCBlbnVtIGUxaW5wX3NpZ25fdHlwZSB0eXBlLCBzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBFVlRfRTFfVEVJX1VQOgorCQlzd2l0Y2ggKHR5cGUpIHsKKwkJY2FzZSBFMUlOUF9TSUdOX09NTDoKKwkJCWJvb3RzdHJhcF9vbSh0cngtPmJ0cyk7CisJCQlicmVhazsKKwkJY2FzZSBFMUlOUF9TSUdOX1JTTDoKKwkJCWJvb3RzdHJhcF9yc2wodHJ4KTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFVlRfRTFfVEVJX0ROOgorCQlMT0dQKERNSSwgTE9HTF9OT1RJQ0UsICJMb3N0IHNvbWUgRTEgVEVJIGxpbmtcbiIpOworCQkvKiBGSVhNRTogZGVhbCB3aXRoIFRFSSBvciBMMSBsaW5rIGxvc3MgKi8KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCitzdGF0aWMgaW50IGJvb3RzdHJhcF9idHMoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzd2l0Y2ggKGJ0cy0+YmFuZCkgeworCWNhc2UgR1NNX0JBTkRfMTgwMDoKKwkJaWYgKGJ0cy0+YzAtPmFyZmNuIDwgNTEyIHx8IGJ0cy0+YzAtPmFyZmNuID4gODg1KSB7CisJCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIkdTTTE4MDAgY2hhbm5lbCBtdXN0IGJlIGJldHdlZW4gNTEyLTg4NS5cbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBHU01fQkFORF8xOTAwOgorCQlpZiAoYnRzLT5jMC0+YXJmY24gPCA1MTIgfHwgYnRzLT5jMC0+YXJmY24gPiA4MTApIHsKKwkJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiR1NNMTkwMCBjaGFubmVsIG11c3QgYmUgYmV0d2VlbiA1MTItODEwLlxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlicmVhazsKKwljYXNlIEdTTV9CQU5EXzkwMDoKKwkJaWYgKGJ0cy0+YzAtPmFyZmNuIDwgMSB8fAorCQkgICAoYnRzLT5jMC0+YXJmY24gPiAxMjQgJiYgYnRzLT5jMC0+YXJmY24gPCA5NTUpIHx8CisJCSAgICBidHMtPmMwLT5hcmZjbiA+IDEwMjMpICB7CisJCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIkdTTTkwMCBjaGFubmVsIG11c3QgYmUgYmV0d2VlbiAxLTEyNCwgOTU1LTEwMjMuXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiVW5zdXBwb3J0ZWQgZnJlcXVlbmN5IGJhbmQuXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKGJ0cy0+bmV0d29yay0+YXV0aF9wb2xpY3kgPT0gR1NNX0FVVEhfUE9MSUNZX0FDQ0VQVF9BTEwgJiYKKwkgICAgIWJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC5jZWxsX2JhcikKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJcbldBUk5JTkc6IFlvdSBhcmUgcnVubmluZyBhbiAnYWNjZXB0LWFsbCcgIgorCQkJIm5ldHdvcmsgb24gYSBCVFMgdGhhdCBpcyBub3QgYmFycmVkLiAgVGhpcyAiCisJCQkiY29uZmlndXJhdGlvbiBpcyBsaWtlbHkgdG8gaW50ZXJmZXJlIHdpdGggcHJvZHVjdGlvbiAiCisJCQkiR1NNIG5ldHdvcmtzIGFuZCBzaG91bGQgb25seSBiZSB1c2VkIGluIGEgUkYgIgorCQkJInNoaWVsZGVkIGVudmlyb25tZW50IHN1Y2ggYXMgYSBmYXJhZGF5IGNhZ2UhXG5cbiIpOworCisJLyogQ29udHJvbCBDaGFubmVsIERlc2NyaXB0aW9uICovCisJYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmF0dCA9IDE7CisJYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmNjY2hfY29uZiA9IFJTTF9CQ0NIX0NDQ0hfQ09ORl8xX0M7CisJYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLmJzX3BhX21mcm1zID0gUlNMX0JTX1BBX01GUk1TXzU7CisJLyogVDMyMTIgaXMgc2V0IGZyb20gdnR5L2NvbmZpZyAqLworCisJLyogc29tZSBkZWZhdWx0cyBmb3Igb3VyIHN5c3RlbSBpbmZvcm1hdGlvbiAqLworCWJ0cy0+c2lfY29tbW9uLmNlbGxfb3B0aW9ucy5yYWRpb19saW5rX3RpbWVvdXQgPSAyOyAvKiAxMiAqLworCWJ0cy0+c2lfY29tbW9uLmNlbGxfb3B0aW9ucy5kdHggPSAyOyAvKiBNUyBzaGFsbCBub3QgdXNlIHVwcGxpbmsgRFRYICovCisJYnRzLT5zaV9jb21tb24uY2VsbF9vcHRpb25zLnB3cmMgPSAwOyAvKiBQV1JDIG5vdCBzZXQgKi8KKworCWJ0cy0+c2lfY29tbW9uLmNlbGxfc2VsX3Bhci5hY3MgPSAwOworCisJYnRzLT5zaV9jb21tb24ubmNjX3Blcm1pdHRlZCA9IDB4ZmY7CisKKwlwYWdpbmdfaW5pdChidHMpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBic2NfYm9vdHN0cmFwX25ldHdvcmsoaW50ICgqbW5jY19yZWN2KShzdHJ1Y3QgZ3NtX25ldHdvcmsgKiwgaW50LCB2b2lkICopLAorCQkJICBjb25zdCBjaGFyICpjb25maWdfZmlsZSkKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCWludCByYzsKKworCS8qIGluaXRpYWxpemUgb3VyIGRhdGEgc3RydWN0dXJlcyAqLworCWJzY19nc21uZXQgPSBnc21fbmV0d29ya19pbml0KDEsIDEsIG1uY2NfcmVjdik7CisJaWYgKCFic2NfZ3NtbmV0KQorCQlyZXR1cm4gLUVOT01FTTsKKworCWJzY19nc21uZXQtPm5hbWVfbG9uZyA9IHRhbGxvY19zdHJkdXAoYnNjX2dzbW5ldCwgIk9wZW5CU0MiKTsKKwlic2NfZ3NtbmV0LT5uYW1lX3Nob3J0ID0gdGFsbG9jX3N0cmR1cChic2NfZ3NtbmV0LCAiT3BlbkJTQyIpOworCisJdGVsbmV0X2luaXQoYnNjX2dzbW5ldCwgNDI0Mik7CisJcmMgPSB2dHlfcmVhZF9jb25maWdfZmlsZShjb25maWdfZmlsZSk7CisJaWYgKHJjIDwgMCkgeworCQlMT0dQKEROTSwgTE9HTF9GQVRBTCwgIkZhaWxlZCB0byBwYXJzZSB0aGUgY29uZmlnIGZpbGU6ICclcydcbiIsIGNvbmZpZ19maWxlKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX05NLCBubV9zaWdfY2IsIE5VTEwpOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoYnRzLCAmYnNjX2dzbW5ldC0+YnRzX2xpc3QsIGxpc3QpIHsKKwkJYm9vdHN0cmFwX2J0cyhidHMpOworCQlpZiAoIWlzX2lwYWNjZXNzX2J0cyhidHMpKQorCQkJcmMgPSBlMV9yZWNvbmZpZ19idHMoYnRzKTsKKworCQlpZiAocmMgPCAwKQorCQkJZXhpdCAoMSk7CisJfQorCisJLyogaW5pdGlhbGl6ZSBuYW5vQlRTIHN1cHBvcnQgb21jZSAqLworCXJjID0gaXBhY2Nlc3Nfc2V0dXAoYnNjX2dzbW5ldCk7CisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2JzY19ybGwuYyBiL29wZW5ic2Mvc3JjL2JzY19ybGwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWQ2ZjI1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvYnNjX3JsbC5jCkBAIC0wLDAgKzEsMTE4IEBACisvKiBHU00gQlNDIFJhZGlvIExpbmsgTGF5ZXIgQVBJCisgKiAzR1BQIFRTIDA4LjU4IHZlcnNpb24gOC42LjAgUmVsZWFzZSAxOTk5IC8gRVRTSSBUUyAxMDAgNTk2IFY4LjYuMCAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90aW1lci5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYnNjX3JsbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2NoYW5fYWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisKK3N0cnVjdCBic2NfcmxsX3JlcSB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgdGltZXJfbGlzdCB0aW1lcjsKKworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCXVfaW50OF90IGxpbmtfaWQ7CisKKwl2b2lkICgqY2IpKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsaW5rX2lkLAorCQkgICB2b2lkICpkYXRhLCBlbnVtIGJzY19ybGxyX2luZCk7CisJdm9pZCAqZGF0YTsKK307CisKKy8qIHdlIG9ubHkgY29tcGFyZSBDMSwgQzIgYW5kIFNBUEkgKi8KKyNkZWZpbmUgTElOS0lEX01BU0sJMHhDNworCitzdGF0aWMgTExJU1RfSEVBRChic2NfcmxsX3JlcXMpOworCitzdGF0aWMgdm9pZCBjb21wbGV0ZV9ybGxyKHN0cnVjdCBic2NfcmxsX3JlcSAqcmxsciwgZW51bSBic2Nfcmxscl9pbmQgdHlwZSkKK3sKKwlsbGlzdF9kZWwoJnJsbHItPmxpc3QpOworCXB1dF9sY2hhbihybGxyLT5sY2hhbik7CisJcmxsci0+Y2Iocmxsci0+bGNoYW4sIHJsbHItPmxpbmtfaWQsIHJsbHItPmRhdGEsIHR5cGUpOworCXRhbGxvY19mcmVlKHJsbHIpOworfQorCitzdGF0aWMgdm9pZCB0aW1lcl9jYih2b2lkICpfcmxscikKK3sKKwlzdHJ1Y3QgYnNjX3JsbF9yZXEgKnJsbHIgPSBfcmxscjsKKworCWNvbXBsZXRlX3JsbHIocmxsciwgQlNDX1JMTFJfSU5EX1RJTUVPVVQpOworfQorCisvKiBlc3RhYmxpc2ggYSBSTEwgY29ubmVjdGlvbiB3aXRoIGdpdmVuIFNBUEkgLyBwcmlvcml0eSAqLworaW50IHJsbF9lc3RhYmxpc2goc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IHNhcGksCisJCSAgdm9pZCAoKmNiKShzdHJ1Y3QgZ3NtX2xjaGFuICosIHVfaW50OF90LCB2b2lkICosCisJCQkgICAgIGVudW0gYnNjX3JsbHJfaW5kKSwKKwkJICB2b2lkICpkYXRhKQoreworCXN0cnVjdCBic2NfcmxsX3JlcSAqcmxsciA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGJzY19ybGxfcmVxKTsKKwl1X2ludDhfdCBsaW5rX2lkOworCWlmICghcmxscikKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlsaW5rX2lkID0gc2FwaTsKKworCS8qIElmIHdlIGFyZSBhIFRDSCBhbmQgbm90IGluIHNpZ25hbGxpbmcgbW9kZSwgd2UgbmVlZCB0bworCSAqIGluZGljYXRlIHRoYXQgdGhlIG5ldyBSTEwgY29ubmVjdGlvbiBpcyB0byBiZSBtYWRlIG9uIHRoZSBTQUNDSCAqLworCWlmICgobGNoYW4tPnR5cGUgPT0gR1NNX0xDSEFOX1RDSF9GIHx8CisJICAgICBsY2hhbi0+dHlwZSA9PSBHU01fTENIQU5fVENIX0gpICYmCisJICAgIGxjaGFuLT5yc2xfY21vZGUgIT0gUlNMX0NNT0RfU1BEX1NJR04pCisJCWxpbmtfaWQgfD0gMHg0MDsKKworCXVzZV9sY2hhbihsY2hhbik7CisJcmxsci0+bGNoYW4gPSBsY2hhbjsKKwlybGxyLT5saW5rX2lkID0gbGlua19pZDsKKwlybGxyLT5jYiA9IGNiOworCXJsbHItPmRhdGEgPSBkYXRhOworCisJbGxpc3RfYWRkKCZybGxyLT5saXN0LCAmYnNjX3JsbF9yZXFzKTsKKworCXJsbHItPnRpbWVyLmNiID0gJnRpbWVyX2NiOworCXJsbHItPnRpbWVyLmRhdGEgPSBybGxyOworCisJYnNjX3NjaGVkdWxlX3RpbWVyKCZybGxyLT50aW1lciwgMTAsIDApOworCisJLyogc2VuZCB0aGUgUlNMIFJMTCBFU1RhYmxpc2ggUkVRdWVzdCAqLworCXJldHVybiByc2xfZXN0YWJsaXNoX3JlcXVlc3Qocmxsci0+bGNoYW4sIHJsbHItPmxpbmtfaWQpOworfQorCisvKiBDYWxsZWQgZnJvbSBSU0wgY29kZSBpbiBjYXNlIHdlIGhhdmUgcmVjZWl2ZWQgYW4gaW5kaWNhdGlvbiByZWdhcmRpbmcKKyAqIGFueSBSTEwgbGluayAqLwordm9pZCBybGxfaW5kaWNhdGlvbihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgbGlua19pZCwgdV9pbnQ4X3QgdHlwZSkKK3sKKwlzdHJ1Y3QgYnNjX3JsbF9yZXEgKnJsbHIsICpybGxyMjsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUocmxsciwgcmxscjIsICZic2NfcmxsX3JlcXMsIGxpc3QpIHsKKwkJaWYgKHJsbHItPmxjaGFuID09IGxjaGFuICYmCisJCSAgICAocmxsci0+bGlua19pZCAmIExJTktJRF9NQVNLKSA9PSAobGlua19pZCAmIExJTktJRF9NQVNLKSkgeworCQkJYnNjX2RlbF90aW1lcigmcmxsci0+dGltZXIpOworCQkJY29tcGxldGVfcmxscihybGxyLCB0eXBlKTsKKwkJCXJldHVybjsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2J0c19pcGFjY2Vzc19uYW5vYnRzLmMgYi9vcGVuYnNjL3NyYy9idHNfaXBhY2Nlc3NfbmFub2J0cy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiNDhlYTkKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9idHNfaXBhY2Nlc3NfbmFub2J0cy5jCkBAIC0wLDAgKzEsODQgQEAKKy8qIGlwLmFjY2VzcyBuYW5vQlRTIHNwZWNpZmljIGNvZGUgKi8KKworLyogKEMpIDIwMDktMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX2J0c19tb2RlbCBtb2RlbF9uYW5vYnRzID0geworCS50eXBlID0gR1NNX0JUU19UWVBFX05BTk9CVFMsCisJLm5tX2F0dF90bHZkZWYgPSB7CisJCS5kZWYgPSB7CisJCQkvKiBpcC5hY2Nlc3Mgc3BlY2lmaWNzICovCisJCQlbTk1fQVRUX0lQQUNDX0RTVF9JUF0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgNCB9LAorCQkJW05NX0FUVF9JUEFDQ19EU1RfSVBfUE9SVF0gPQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCQlbTk1fQVRUX0lQQUNDX1NUUkVBTV9JRF0gPQl7IFRMVl9UWVBFX1RWLCB9LAorCQkJW05NX0FUVF9JUEFDQ19GUkVRX0NUUkxdID0JeyBUTFZfVFlQRV9UViwgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfU0VDX09NTF9DRkddID0JeyBUTFZfVFlQRV9GSVhFRCwgNiB9LAorCQkJW05NX0FUVF9JUEFDQ19JUF9JRl9DRkddID0JeyBUTFZfVFlQRV9GSVhFRCwgOCB9LAorCQkJW05NX0FUVF9JUEFDQ19JUF9HV19DRkddID0JeyBUTFZfVFlQRV9GSVhFRCwgMTIgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfSU5fU0VSVl9USU1FXSA9CXsgVExWX1RZUEVfRklYRUQsIDQgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfTE9DQVRJT05dID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19QQUdJTkdfQ0ZHXSA9CXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfVU5JVF9JRF0gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1VOSVRfTkFNRV0gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1NOTVBfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfUFJJTV9PTUxfQ0ZHX0xJU1RdID0geyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19OVl9GTEFHU10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0ZSRVFfQ1RSTF0gPQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCQlbTk1fQVRUX0lQQUNDX1BSSU1fT01MX0ZCX1RPVVRdID0geyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19DVVJfU1dfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfVElNSU5HX0JVU10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0NHSV0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19SQUNdID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfT0JKX1ZFUlNJT05dID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19HUFJTX1BBR0lOR19DRkddPSB7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX05TRUldID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfQlZDSV0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19OU1ZDSV0gPQkJeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19OU19DRkddID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfQlNTR1BfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfTlNfTElOS19DRkddID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19STENfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfQUxNX1RIUkVTSF9MSVNUXT0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19NT05JVF9WQUxfTElTVF0gPSB7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1RJQl9DT05UUk9MXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfU1VQUF9GRUFUVVJFU10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0NPRElOR19TQ0hFTUVTXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfUkxDX0NGR18yXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfSEVBUlRCX1RPVVRdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19VUFRJTUVdID0JCXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfUkxDX0NGR18zXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJCVtOTV9BVFRfSVBBQ0NfU1NMX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX1NFQ19QT1NTSUJMRV0gPQl7IFRMVl9UWVBFX1RMMTZWIH0sCisJCQlbTk1fQVRUX0lQQUNDX0lNTF9TU0xfU1RBVEVdID0JeyBUTFZfVFlQRV9UTDE2ViB9LAorCQkJW05NX0FUVF9JUEFDQ19SRVZPQ19EQVRFXSA9CXsgVExWX1RZUEVfVEwxNlYgfSwKKwkJfSwKKwl9LAorfTsKKworaW50IGJ0c19tb2RlbF9uYW5vYnRzX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gZ3NtX2J0c19tb2RlbF9yZWdpc3RlcigmbW9kZWxfbmFub2J0cyk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9idHNfc2llbWVuc19iczExLmMgYi9vcGVuYnNjL3NyYy9idHNfc2llbWVuc19iczExLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk2NjgyNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2J0c19zaWVtZW5zX2JzMTEuYwpAQCAtMCwwICsxLDY2IEBACisvKiBTaWVtZW5zIEJTLTExIHNwZWNpZmljIGNvZGUgKi8KKworLyogKEMpIDIwMDktMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX2J0c19tb2RlbCBtb2RlbF9iczExID0geworCS50eXBlID0gR1NNX0JUU19UWVBFX0JTMTEsCisJLm5tX2F0dF90bHZkZWYgPSB7CisJCS5kZWYgPSB7CisJCQlbTk1fQVRUX0FWQUlMX1NUQVRVU10gPQkJeyBUTFZfVFlQRV9UTFYgfSwKKwkJCS8qIEJTMTEgc3BlY2lmaWNzICovCisJCQlbTk1fQVRUX0JTMTFfRVNOX0ZXX0NPREVfTk9dID0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9FU05fSFdfQ09ERV9OT10gPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX0VTTl9QQ0JfU0VSSUFMXSA9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfQk9PVF9TV19WRVJTXSA9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbMHhkNV0gPQkJCXsgVExWX1RZUEVfVExWIH0sCisJCQlbMHhhOF0gPQkJCXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfUEFTU1dPUkRdID0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9UWFBXUl0gPQkJeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9SU1NJX09GRlNdID0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9MSU5FX0NGR10gPSAJeyBUTFZfVFlQRV9UViB9LAorCQkJW05NX0FUVF9CUzExX0wxX1BST1RfVFlQRV0gPQl7IFRMVl9UWVBFX1RWIH0sCisJCQlbTk1fQVRUX0JTMTFfQklUX0VSUl9USEVTSF0gPQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCQlbTk1fQVRUX0JTMTFfRElWRVJTSVRZXSA9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfTE1UX0xPR09OX1NFU1NJT05dPXsgVExWX1RZUEVfVExWIH0sCQorCQkJW05NX0FUVF9CUzExX0xNVF9MT0dJTl9USU1FXSA9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfTE1UX1VTRVJfQUNDX0xFVl0gPXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfTE1UX1VTRVJfTkFNRV0gPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX0JUU19TVEFURV0JPQl7IFRMVl9UWVBFX1RMViB9LAorCQkJW05NX0FUVF9CUzExX0UxX1NUQVRFXQk9CXsgVExWX1RZUEVfVExWIH0sCisJCQlbTk1fQVRUX0JTMTFfUExMX01PREVdCT0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9QTExdCT0JeyBUTFZfVFlQRV9UTFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9DQ0xLX0FDQ1VSQUNZXSA9CXsgVExWX1RZUEVfVFYgfSwKKwkJCVtOTV9BVFRfQlMxMV9DQ0xLX1RZUEVdID0JeyBUTFZfVFlQRV9UViB9LAorCQkJWzB4OTVdID0JCQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisJCX0sCisJfSwKK307CisKK2ludCBidHNfbW9kZWxfYnMxMV9pbml0KHZvaWQpCit7CisJcmV0dXJuIGdzbV9idHNfbW9kZWxfcmVnaXN0ZXIoJm1vZGVsX2JzMTEpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvYnRzX3Vua25vd24uYyBiL29wZW5ic2Mvc3JjL2J0c191bmtub3duLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWFjNWQ5OQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2J0c191bmtub3duLmMKQEAgLTAsMCArMSw0MCBAQAorLyogR2VuZXJpYyBCVFMgLSBWVFkgY29kZSB0cmllcyB0byBhbGxvY2F0ZSB0aGlzIEJUUyBiZWZvcmUgdHlwZSBpcyBrbm93biAqLworCisvKiAoQykgMjAxMCBieSBEYW5pZWwgV2lsbG1hbm4gPGRhbmllbEB0b3RhbHVlYmVyd2FjaHVuZy5kZT4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3Rsdi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorCitzdGF0aWMgc3RydWN0IGdzbV9idHNfbW9kZWwgbW9kZWxfdW5rbm93biA9IHsKKwkudHlwZSA9IEdTTV9CVFNfVFlQRV9VTktOT1dOLAorCS5ubV9hdHRfdGx2ZGVmID0geworCQkuZGVmID0geworCQl9LAorCX0sCit9OworCitpbnQgYnRzX21vZGVsX3Vua25vd25faW5pdCh2b2lkKQoreworCXJldHVybiBnc21fYnRzX21vZGVsX3JlZ2lzdGVyKCZtb2RlbF91bmtub3duKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2NoYW5fYWxsb2MuYyBiL29wZW5ic2Mvc3JjL2NoYW5fYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTg4NTI0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvY2hhbl9hbGxvYy5jCkBAIC0wLDAgKzEsNDE4IEBACisvKiBHU00gQ2hhbm5lbCBhbGxvY2F0aW9uIHJvdXRpbmVzCisgKgorICogKEMpIDIwMDggYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA4LCAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2NoYW5fYWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfcnNsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisKK3N0YXRpYyB2b2lkIGF1dG9fcmVsZWFzZV9jaGFubmVsKHZvaWQgKl9sY2hhbik7CisKK3N0YXRpYyBpbnQgdHNfaXNfdXNhYmxlKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMpCit7CisJLyogRklYTUU6IEhvdyBkb2VzIHRoaXMgYmVoYXZlIGZvciBCUy0xMSA/ICovCisJaWYgKGlzX2lwYWNjZXNzX2J0cyh0cy0+dHJ4LT5idHMpKSB7CisJCWlmICghbm1faXNfcnVubmluZygmdHMtPm5tX3N0YXRlKSkKKwkJCXJldHVybiAwOworCX0KKworCXJldHVybiAxOworfQorCitpbnQgdHJ4X2lzX3VzYWJsZShzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwkvKiBGSVhNRTogSG93IGRvZXMgdGhpcyBiZWhhdmUgZm9yIEJTLTExID8gKi8KKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKHRyeC0+YnRzKSkgeworCQlpZiAoIW5tX2lzX3J1bm5pbmcoJnRyeC0+bm1fc3RhdGUpIHx8CisJCSAgICAhbm1faXNfcnVubmluZygmdHJ4LT5iYl90cmFuc2Mubm1fc3RhdGUpKQorCQkJcmV0dXJuIDA7CisJfQorCisJcmV0dXJuIDE7Cit9CisKK3N0cnVjdCBnc21fYnRzX3RyeF90cyAqdHNfYzBfYWxsb2Moc3RydWN0IGdzbV9idHMgKmJ0cywKKwkJCQkgICBlbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIHBjaGFuKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gYnRzLT5jMDsKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gJnRyeC0+dHNbMF07CisKKwlpZiAocGNoYW4gIT0gR1NNX1BDSEFOX0NDQ0ggJiYKKwkgICAgcGNoYW4gIT0gR1NNX1BDSEFOX0NDQ0hfU0RDQ0g0KQorCQlyZXR1cm4gTlVMTDsKKworCWlmICh0cy0+cGNoYW4gIT0gR1NNX1BDSEFOX05PTkUpCisJCXJldHVybiBOVUxMOworCisJdHMtPnBjaGFuID0gcGNoYW47CisKKwlyZXR1cm4gdHM7Cit9CisKKy8qIEFsbG9jYXRlIGEgcGh5c2ljYWwgY2hhbm5lbCAoVFMpICovCitzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzX2FsbG9jKHN0cnVjdCBnc21fYnRzICpidHMsCisJCQkJZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBwY2hhbikKK3sKKwlpbnQgajsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyeCwgJmJ0cy0+dHJ4X2xpc3QsIGxpc3QpIHsKKwkJaW50IGZyb20sIHRvOworCisJCWlmICghdHJ4X2lzX3VzYWJsZSh0cngpKQorCQkJY29udGludWU7CisKKwkJLyogdGhlIGZvbGxvd2luZyBjb25zdHJhaW50cyBhcmUgcHVyZSBwb2xpY3ksCisJCSAqIG5vIHJlcXVpcmVtZW50IHRvIHB1dCB0aGlzIHJlc3RyaWN0aW9uIGluIHBsYWNlICovCisJCWlmICh0cnggPT0gYnRzLT5jMCkgeworCQkJLyogT24gdGhlIGZpcnN0IFRSWCB3ZSBydW4gb25lIENDQ0ggYW5kIG9uZSBTRENDSDggKi8KKwkJCXN3aXRjaCAocGNoYW4pIHsKKwkJCWNhc2UgR1NNX1BDSEFOX0NDQ0g6CisJCQljYXNlIEdTTV9QQ0hBTl9DQ0NIX1NEQ0NINDoKKwkJCQlmcm9tID0gMDsgdG8gPSAwOworCQkJCWJyZWFrOworCQkJY2FzZSBHU01fUENIQU5fVENIX0Y6CisJCQljYXNlIEdTTV9QQ0hBTl9UQ0hfSDoKKwkJCQlmcm9tID0gMTsgdG8gPSA3OworCQkJCWJyZWFrOworCQkJY2FzZSBHU01fUENIQU5fU0RDQ0g4X1NBQ0NIOEM6CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9IGVsc2UgeworCQkJLyogRXZlcnkgc2Vjb25kYXJ5IFRSWCBpcyBjb25maWd1cmVkIGZvciBUQ0gvRgorCQkJICogYW5kIFRDSC9IIG9ubHkgKi8KKwkJCXN3aXRjaCAocGNoYW4pIHsKKwkJCWNhc2UgR1NNX1BDSEFOX1NEQ0NIOF9TQUNDSDhDOgorCQkJCWZyb20gPSAxOyB0byA9IDE7CisJCQljYXNlIEdTTV9QQ0hBTl9UQ0hfRjoKKwkJCWNhc2UgR1NNX1BDSEFOX1RDSF9IOgorCQkJCWZyb20gPSAxOyB0byA9IDc7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisKKwkJZm9yIChqID0gZnJvbTsgaiA8PSB0bzsgaisrKSB7CisJCQlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gJnRyeC0+dHNbal07CisKKwkJCWlmICghdHNfaXNfdXNhYmxlKHRzKSkKKwkJCQljb250aW51ZTsKKworCQkJaWYgKHRzLT5wY2hhbiA9PSBHU01fUENIQU5fTk9ORSkgeworCQkJCXRzLT5wY2hhbiA9IHBjaGFuOworCQkJCS8qIHNldCBjaGFubmVsIGF0dHJpYnV0ZSBvbiBPTUwgKi8KKwkJCQlhYmlzX25tX3NldF9jaGFubmVsX2F0dHIodHMsIGFiaXNfbm1fY2hjb21iNHBjaGFuKHBjaGFuKSk7CisJCQkJcmV0dXJuIHRzOworCQkJfQorCQl9CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBGcmVlIGEgcGh5c2ljYWwgY2hhbm5lbCAoVFMpICovCit2b2lkIHRzX2ZyZWUoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cykKK3sKKwl0cy0+cGNoYW4gPSBHU01fUENIQU5fTk9ORTsKK30KKworc3RhdGljIGNvbnN0IHVfaW50OF90IHN1YnNsb3RzX3Blcl9wY2hhbltdID0geworCVtHU01fUENIQU5fTk9ORV0gPSAwLAorCVtHU01fUENIQU5fQ0NDSF0gPSAwLAorCVtHU01fUENIQU5fQ0NDSF9TRENDSDRdID0gNCwKKwlbR1NNX1BDSEFOX1RDSF9GXSA9IDEsCisJW0dTTV9QQ0hBTl9UQ0hfSF0gPSAyLAorCVtHU01fUENIQU5fU0RDQ0g4X1NBQ0NIOENdID0gOCwKKwkvKiBGSVhNRTogd2hhdCBhYm91dCBkeW5hbWljIFRDSF9GX1RDSF9IID8gKi8KK307CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX2xjaGFuICoKK19sY19maW5kX3RyeChzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCwgZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBwY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzOworCWludCBqLCBzczsKKworCWlmICghdHJ4X2lzX3VzYWJsZSh0cngpKQorCQlyZXR1cm4gTlVMTDsKKworCWZvciAoaiA9IDA7IGogPCA4OyBqKyspIHsKKwkJdHMgPSAmdHJ4LT50c1tqXTsKKwkJaWYgKCF0c19pc191c2FibGUodHMpKQorCQkJY29udGludWU7CisJCWlmICh0cy0+cGNoYW4gIT0gcGNoYW4pCisJCQljb250aW51ZTsKKwkJLyogY2hlY2sgaWYgYWxsIHN1Yi1zbG90cyBhcmUgYWxsb2NhdGVkIHlldCAqLworCQlmb3IgKHNzID0gMDsgc3MgPCBzdWJzbG90c19wZXJfcGNoYW5bcGNoYW5dOyBzcysrKSB7CisJCQlzdHJ1Y3QgZ3NtX2xjaGFuICpsYyA9ICZ0cy0+bGNoYW5bc3NdOworCQkJaWYgKGxjLT50eXBlID09IEdTTV9MQ0hBTl9OT05FICYmCisJCQkgICAgbGMtPnN0YXRlID09IExDSEFOX1NfTk9ORSkKKwkJCQlyZXR1cm4gbGM7CisJCX0KKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX2xjaGFuICoKK19sY19maW5kX2J0cyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBlbnVtIGdzbV9waHlzX2NoYW5fY29uZmlnIHBjaGFuKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHM7CisJc3RydWN0IGdzbV9sY2hhbiAqbGM7CisKKwlpZiAoYnRzLT5jaGFuX2FsbG9jX3JldmVyc2UpIHsKKwkJbGxpc3RfZm9yX2VhY2hfZW50cnlfcmV2ZXJzZSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KSB7CisJCQlsYyA9IF9sY19maW5kX3RyeCh0cngsIHBjaGFuKTsKKwkJCWlmIChsYykKKwkJCQlyZXR1cm4gbGM7CisJCX0KKwl9IGVsc2UgeworCQlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KSB7CisJCQlsYyA9IF9sY19maW5kX3RyeCh0cngsIHBjaGFuKTsKKwkJCWlmIChsYykKKwkJCQlyZXR1cm4gbGM7CisJCX0KKwl9CisKKwkvKiB3ZSBjYW5ub3QgYWxsb2NhdGUgbW9yZSBvZiB0aGVzZSAqLworCWlmIChwY2hhbiA9PSBHU01fUENIQU5fQ0NDSF9TRENDSDQpCisJCXJldHVybiBOVUxMOworCisJLyogaWYgd2UndmUgcmVhY2hlZCBoZXJlLCB3ZSBuZWVkIHRvIGFsbG9jYXRlIGEgbmV3IHBoeXNpY2FsCisJICogY2hhbm5lbCBmb3IgdGhlIGxvZ2ljYWwgY2hhbm5lbCB0eXBlIHJlcXVlc3RlZCAqLworCXRzID0gdHNfYWxsb2MoYnRzLCBwY2hhbik7CisJaWYgKCF0cykgeworCQkvKiBubyBtb3JlIHJhZGlvIHJlc291cmNlcyAqLworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuICZ0cy0+bGNoYW5bMF07Cit9CisKKy8qIEFsbG9jYXRlIGEgbG9naWNhbCBjaGFubmVsICovCitzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbl9hbGxvYyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBlbnVtIGdzbV9jaGFuX3QgdHlwZSkKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IE5VTEw7CisJZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBmaXJzdCwgc2Vjb25kOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBHU01fTENIQU5fU0RDQ0g6CisJCWlmIChidHMtPmNoYW5fYWxsb2NfcmV2ZXJzZSkgeworCQkJZmlyc3QgPSBHU01fUENIQU5fU0RDQ0g4X1NBQ0NIOEM7CisJCQlzZWNvbmQgPSBHU01fUENIQU5fQ0NDSF9TRENDSDQ7CisJCX0gZWxzZSB7CisJCQlmaXJzdCA9IEdTTV9QQ0hBTl9DQ0NIX1NEQ0NINDsKKwkJCXNlY29uZCA9IEdTTV9QQ0hBTl9TRENDSDhfU0FDQ0g4QzsKKwkJfQorCisJCWxjaGFuID0gX2xjX2ZpbmRfYnRzKGJ0cywgZmlyc3QpOworCQlpZiAobGNoYW4gPT0gTlVMTCkKKwkJCWxjaGFuID0gX2xjX2ZpbmRfYnRzKGJ0cywgc2Vjb25kKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fTENIQU5fVENIX0Y6CisJCWxjaGFuID0gX2xjX2ZpbmRfYnRzKGJ0cywgR1NNX1BDSEFOX1RDSF9GKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fTENIQU5fVENIX0g6CisJCWxjaGFuID1fbGNfZmluZF9idHMoYnRzLCBHU01fUENIQU5fVENIX0gpOworCQkvKiBJZiB3ZSBkb24ndCBoYXZlIFRDSC9IIGF2YWlsYWJsZSwgZmFsbC1iYWNrIHRvIFRDSC9GICovCisJCWlmICghbGNoYW4pIHsKKwkJCWxjaGFuID0gX2xjX2ZpbmRfYnRzKGJ0cywgR1NNX1BDSEFOX1RDSF9GKTsKKwkJCXR5cGUgPSBHU01fTENIQU5fVENIX0Y7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEUkxMLCBMT0dMX0VSUk9SLCAiVW5rbm93biBnc21fY2hhbl90ICV1XG4iLCB0eXBlKTsKKwl9CisKKwlpZiAobGNoYW4pIHsKKwkJbGNoYW4tPnR5cGUgPSB0eXBlOworCQlsY2hhbi0+dXNlX2NvdW50ID0gMDsKKworCQkvKiBjbGVhciBzYXBpcyAqLworCQltZW1zZXQobGNoYW4tPnNhcGlzLCAwLCBBUlJBWV9TSVpFKGxjaGFuLT5zYXBpcykpOworCisJCS8qIGNsZWFyIG11bHRpIHJhdGUgY29uZmlnICovCisJCW1lbXNldCgmbGNoYW4tPm1yX2NvbmYsIDAsIHNpemVvZihsY2hhbi0+bXJfY29uZikpOworCisJCS8qIENvbmZpZ3VyZSB0aGUgdGltZSBhbmQgc3RhcnQgaXQgc28gaXQgd2lsbCBiZSBjbG9zZWQgKi8KKwkJbGNoYW4tPnJlbGVhc2VfdGltZXIuY2IgPSBhdXRvX3JlbGVhc2VfY2hhbm5lbDsKKwkJbGNoYW4tPnJlbGVhc2VfdGltZXIuZGF0YSA9IGxjaGFuOworCQlic2Nfc2NoZWR1bGVfdGltZXIoJmxjaGFuLT5yZWxlYXNlX3RpbWVyLCBMQ0hBTl9SRUxFQVNFX1RJTUVPVVQpOworCX0KKworCXJldHVybiBsY2hhbjsKK30KKworLyogRnJlZSBhIGxvZ2ljYWwgY2hhbm5lbCAqLwordm9pZCBsY2hhbl9mcmVlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCWludCBpOworCisJbGNoYW4tPnR5cGUgPSBHU01fTENIQU5fTk9ORTsKKwlpZiAobGNoYW4tPnN1YnNjcikgeworCQlzdWJzY3JfcHV0KGxjaGFuLT5zdWJzY3IpOworCQlsY2hhbi0+c3Vic2NyID0gTlVMTDsKKwl9CisKKwkvKiBXZSBtaWdodCBraWxsIGFuIGFjdGl2ZSBjaGFubmVsLi4uICovCisJaWYgKGxjaGFuLT51c2VfY291bnQgIT0gMCkgeworCQlkaXNwYXRjaF9zaWduYWwoU1NfTENIQU4sIFNfTENIQU5fVU5FWFBFQ1RFRF9SRUxFQVNFLCBsY2hhbik7CisJCWxjaGFuLT51c2VfY291bnQgPSAwOworCX0KKworCS8qIHN0b3AgdGhlIHRpbWVyICovCisJYnNjX2RlbF90aW1lcigmbGNoYW4tPnJlbGVhc2VfdGltZXIpOworCWJzY19kZWxfdGltZXIoJmxjaGFuLT5UMzEwMSk7CisKKwkvKiBjbGVhciBjYWNoZWQgbWVhc3VlbWVudCByZXBvcnRzICovCisJbGNoYW4tPm1lYXNfcmVwX2lkeCA9IDA7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobGNoYW4tPm1lYXNfcmVwKTsgaSsrKSB7CisJCWxjaGFuLT5tZWFzX3JlcFtpXS5mbGFncyA9IDA7CisJCWxjaGFuLT5tZWFzX3JlcFtpXS5uciA9IDA7CisJfQorCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGxjaGFuLT5uZWlnaF9tZWFzKTsgaSsrKQorCQlsY2hhbi0+bmVpZ2hfbWVhc1tpXS5hcmZjbiA9IDA7CisKKwlsY2hhbi0+c2lsZW50X2NhbGwgPSAwOworCisJLyogRklYTUU6IHRzX2ZyZWUoKSB0aGUgdGltZXNsb3QsIGlmIHdlJ3JlIHRoZSBsYXN0IGxvZ2ljYWwKKwkgKiBjaGFubmVsIHVzaW5nIGl0ICovCit9CisKKy8qIENvbnNpZGVyIHJlbGVhc2luZyB0aGUgY2hhbm5lbCBub3cgKi8KK2ludCBsY2hhbl9hdXRvX3JlbGVhc2Uoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJaWYgKGxjaGFuLT51c2VfY291bnQgPiAwKSB7CisJCXJldHVybiAwOworCX0KKworCS8qIEFzc3VtZSB3ZSBoYXZlIEdTTTA0LjA4IHJ1bm5pbmcgYW5kIHNlbmQgYSByZWxlYXNlICovCisJaWYgKGxjaGFuLT5zdWJzY3IpIHsKKwkJZ3NtNDhfc2VuZF9ycl9yZWxlYXNlKGxjaGFuKTsKKwl9CisKKwkvKiBzcG9vZmVkPyBtZXNzYWdlICovCisJaWYgKGxjaGFuLT51c2VfY291bnQgPCAwKQorCQlMT0dQKERSTEwsIExPR0xfRVJST1IsICJDaGFubmVsIGNvdW50IGlzIG5lZ2F0aXZlOiAlZFxuIiwKKwkJCWxjaGFuLT51c2VfY291bnQpOworCisJREVCVUdQKERSTEwsICIlcyBSZWN5Y2xpbmcgQ2hhbm5lbFxuIiwgZ3NtX2xjaGFuX25hbWUobGNoYW4pKTsKKwlyc2xfcmVsZWFzZV9yZXF1ZXN0KGxjaGFuLCAwKTsKKwlyZXR1cm4gMTsKK30KKworLyogQXV0byByZWxlYXNlIHRoZSBjaGFubmVsIHdoZW4gdGhlIHVzZSBjb3VudCBpcyB6ZXJvICovCitzdGF0aWMgdm9pZCBhdXRvX3JlbGVhc2VfY2hhbm5lbCh2b2lkICpfbGNoYW4pCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBfbGNoYW47CisKKwlpZiAoIWxjaGFuX2F1dG9fcmVsZWFzZShsY2hhbikpCisJCWJzY19zY2hlZHVsZV90aW1lcigmbGNoYW4tPnJlbGVhc2VfdGltZXIsIExDSEFOX1JFTEVBU0VfVElNRU9VVCk7Cit9CisKK3N0cnVjdCBnc21fbGNoYW4qIGxjaGFuX2ZpbmQoc3RydWN0IGdzbV9idHMgKmJ0cywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpIHsKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwlpbnQgdHNfbm8sIGxjaGFuX25vOyAKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyeCwgJmJ0cy0+dHJ4X2xpc3QsIGxpc3QpIHsKKwkJZm9yICh0c19ubyA9IDA7IHRzX25vIDwgODsgKyt0c19ubykgeworCQkJZm9yIChsY2hhbl9ubyA9IDA7IGxjaGFuX25vIDwgVFNfTUFYX0xDSEFOOyArK2xjaGFuX25vKSB7CisJCQkJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPQorCQkJCQkmdHJ4LT50c1t0c19ub10ubGNoYW5bbGNoYW5fbm9dOworCQkJCWlmIChzdWJzY3IgPT0gbGNoYW4tPnN1YnNjcikKKwkJCQkJcmV0dXJuIGxjaGFuOworCQkJfQorCQl9CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0cnVjdCBnc21fbGNoYW4gKmxjaGFuX2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IHN1YnNjci0+bmV0OworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoYnRzLCAmbmV0LT5idHNfbGlzdCwgbGlzdCkgeworCQlsY2hhbiA9IGxjaGFuX2ZpbmQoYnRzLCBzdWJzY3IpOworCQlpZiAobGNoYW4pCisJCQlyZXR1cm4gbGNoYW47CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgYnRzX2NoYW5fbG9hZChzdHJ1Y3QgcGNoYW5fbG9hZCAqY2wsIGNvbnN0IHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cngsICZidHMtPnRyeF9saXN0LCBsaXN0KSB7CisJCWludCBpOworCisJCS8qIHNraXAgYWRtaW5pc3RyYXRpdmVseSBkZWFjdGl2YXRlZCB0cmFueHNjZWl2ZXJzICovCisJCWlmICghbm1faXNfcnVubmluZygmdHJ4LT5ubV9zdGF0ZSkgfHwKKwkJICAgICFubV9pc19ydW5uaW5nKCZ0cngtPmJiX3RyYW5zYy5ubV9zdGF0ZSkpCisJCQljb250aW51ZTsKKworCQlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRSh0cngtPnRzKTsgaSsrKSB7CisJCQlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gJnRyeC0+dHNbaV07CisJCQlzdHJ1Y3QgbG9hZF9jb3VudGVyICpwbCA9ICZjbC0+cGNoYW5bdHMtPnBjaGFuXTsKKwkJCWludCBqOworCisJCQkvKiBza2lwIGFkbWluaXN0cmF0aXZlbHkgZGVhY3RpdmF0ZWQgdGltZXNsb3RzICovCisJCQlpZiAoIW5tX2lzX3J1bm5pbmcoJnRzLT5ubV9zdGF0ZSkpCisJCQkJY29udGludWU7CisKKwkJCWZvciAoaiA9IDA7IGogPCBzdWJzbG90c19wZXJfcGNoYW5bdHMtPnBjaGFuXTsgaisrKSB7CisJCQkJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSAmdHMtPmxjaGFuW2pdOworCisJCQkJcGwtPnRvdGFsKys7CisKKwkJCQlzd2l0Y2ggKGxjaGFuLT5zdGF0ZSkgeworCQkJCWNhc2UgTENIQU5fU19OT05FOgorCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlwbC0+dXNlZCsrOworCQkJCQlicmVhazsKKwkJCQl9CisJCQl9CisJCX0KKwl9Cit9CisKK3ZvaWQgbmV0d29ya19jaGFuX2xvYWQoc3RydWN0IHBjaGFuX2xvYWQgKnBsLCBzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCkKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJbWVtc2V0KHBsLCAwLCBzaXplb2YoKnBsKSk7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShidHMsICZuZXQtPmJ0c19saXN0LCBsaXN0KQorCQlidHNfY2hhbl9sb2FkKHBsLCBidHMpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZGIuYyBiL29wZW5ic2Mvc3JjL2RiLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTBjMWQ2ZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2RiLmMKQEAgLTAsMCArMSwxMTc5IEBACisvKiBTaW1wbGUgSExSL1ZMUiBkYXRhYmFzZSBiYWNrZW5kIHVzaW5nIGRiaSAqLworLyogKEMpIDIwMDggYnkgSmFuIEx1ZWJiZSA8amx1ZWJiZUBkZWJpYW4ub3JnPgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzExLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zdGF0aXN0aWNzLmg+CisKKyNpbmNsdWRlIDxsaWJnZW4uaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZGJpL2RiaS5oPgorCitzdGF0aWMgY2hhciAqZGJfYmFzZW5hbWUgPSBOVUxMOworc3RhdGljIGNoYXIgKmRiX2Rpcm5hbWUgPSBOVUxMOworc3RhdGljIGRiaV9jb25uIGNvbm47CisKK3N0YXRpYyBjaGFyICpjcmVhdGVfc3RtdHNbXSA9IHsKKwkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgTWV0YSAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJrZXkgVEVYVCBVTklRVUUgTk9UIE5VTEwsICIKKwkJInZhbHVlIFRFWFQgTk9UIE5VTEwiCisJCSIpIiwKKwkiSU5TRVJUIE9SIElHTk9SRSBJTlRPIE1ldGEgIgorCQkiKGtleSwgdmFsdWUpICIKKwkJIlZBTFVFUyAiCisJCSIoJ3JldmlzaW9uJywgJzInKSIsCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIFN1YnNjcmliZXIgKCIKKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkiY3JlYXRlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJInVwZGF0ZWQgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJpbXNpIE5VTUVSSUMgVU5JUVVFIE5PVCBOVUxMLCAiCisJCSJuYW1lIFRFWFQsICIKKwkJImV4dGVuc2lvbiBURVhUIFVOSVFVRSwgIgorCQkiYXV0aG9yaXplZCBJTlRFR0VSIE5PVCBOVUxMIERFRkFVTFQgMCwgIgorCQkidG1zaSBURVhUIFVOSVFVRSwgIgorCQkibGFjIElOVEVHRVIgTk9UIE5VTEwgREVGQVVMVCAwIgorCQkiKSIsCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIEF1dGhUb2tlbiAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJzdWJzY3JpYmVyX2lkIElOVEVHRVIgVU5JUVVFIE5PVCBOVUxMLCAiCisJCSJjcmVhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkidG9rZW4gVEVYVCBVTklRVUUgTk9UIE5VTEwiCisJCSIpIiwKKwkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgRXF1aXBtZW50ICgiCisJCSJpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsICIKKwkJImNyZWF0ZWQgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJ1cGRhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkibmFtZSBURVhULCAiCisJCSJjbGFzc21hcmsxIE5VTUVSSUMsICIKKwkJImNsYXNzbWFyazIgQkxPQiwgIgorCQkiY2xhc3NtYXJrMyBCTE9CLCAiCisJCSJpbWVpIE5VTUVSSUMgVU5JUVVFIE5PVCBOVUxMIgorCQkiKSIsCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIEVxdWlwbWVudFdhdGNoICgiCisJCSJpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsICIKKwkJImNyZWF0ZWQgVElNRVNUQU1QIE5PVCBOVUxMLCAiCisJCSJ1cGRhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkic3Vic2NyaWJlcl9pZCBOVU1FUklDIE5PVCBOVUxMLCAiCisJCSJlcXVpcG1lbnRfaWQgTlVNRVJJQyBOT1QgTlVMTCwgIgorCQkiVU5JUVVFIChzdWJzY3JpYmVyX2lkLCBlcXVpcG1lbnRfaWQpICIKKwkJIikiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBTTVMgKCIKKwkJLyogbWV0YWRhdGEsIG5vdCBwYXJ0IG9mIHNtcyAqLworCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJjcmVhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkic2VudCBUSU1FU1RBTVAsICIKKwkJInNlbmRlcl9pZCBJTlRFR0VSIE5PVCBOVUxMLCAiCisJCSJyZWNlaXZlcl9pZCBJTlRFR0VSIE5PVCBOVUxMLCAiCisJCSJkZWxpdmVyX2F0dGVtcHRzIElOVEVHRVIgTk9UIE5VTEwgREVGQVVMVCAwLCAiCisJCS8qIGRhdGEgZGlyZWN0bHkgY29waWVkL2Rlcml2ZWQgZnJvbSBTTVMgKi8KKwkJInZhbGlkX3VudGlsIFRJTUVTVEFNUCwgIgorCQkicmVwbHlfcGF0aF9yZXEgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkic3RhdHVzX3JlcF9yZXEgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkicHJvdG9jb2xfaWQgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkiZGF0YV9jb2Rpbmdfc2NoZW1lIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJInVkX2hkcl9pbmQgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkiZGVzdF9hZGRyIFRFWFQsICIKKwkJInVzZXJfZGF0YSBCTE9CLCAiCS8qIFRQLVVEICovCisJCS8qIGFkZGl0aW9uYWwgZGF0YSwgaW50ZXJwcmV0ZWQgZnJvbSBTTVMgKi8KKwkJImhlYWRlciBCTE9CLCAiCQkvKiBVRCBIZWFkZXIgKi8KKwkJInRleHQgVEVYVCAiCQkvKiBkZWNvZGVkIFVEIGFmdGVyIFVESCAqLworCQkiKSIsCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIFZMUiAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJjcmVhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkidXBkYXRlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJInN1YnNjcmliZXJfaWQgTlVNRVJJQyBVTklRVUUgTk9UIE5VTEwsICIKKwkJImxhc3RfYnRzIE5VTUVSSUMgTk9UIE5VTEwgIgorCQkiKSIsCisJIkNSRUFURSBUQUJMRSBJRiBOT1QgRVhJU1RTIEFwZHVCbG9icyAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJjcmVhdGVkIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkiYXBkdV9pZF9mbGFncyBJTlRFR0VSIE5PVCBOVUxMLCAiCisJCSJzdWJzY3JpYmVyX2lkIElOVEVHRVIgTk9UIE5VTEwsICIKKwkJImFwZHUgQkxPQiAiCisJCSIpIiwKKwkiQ1JFQVRFIFRBQkxFIElGIE5PVCBFWElTVFMgQ291bnRlcnMgKCIKKwkJImlkIElOVEVHRVIgUFJJTUFSWSBLRVkgQVVUT0lOQ1JFTUVOVCwgIgorCQkidGltZXN0YW1wIFRJTUVTVEFNUCBOT1QgTlVMTCwgIgorCQkidmFsdWUgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkibmFtZSBURVhUIE5PVCBOVUxMICIKKwkJIikiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBBdXRoS2V5cyAoIgorCQkiaWQgSU5URUdFUiBQUklNQVJZIEtFWSBBVVRPSU5DUkVNRU5ULCAiCisJCSJzdWJzY3JpYmVyX2lkIElOVEVHRVIgVU5JUVVFIE5PVCBOVUxMLCAiCisJCSJhbGdvcml0aG1faWQgSU5URUdFUiBOT1QgTlVMTCwgIgorCQkiYTNhOF9raSBCTE9CICIKKwkJIikiLAorCSJDUkVBVEUgVEFCTEUgSUYgTk9UIEVYSVNUUyBBdXRoVHVwbGVzICgiCisJCSJpZCBJTlRFR0VSIFBSSU1BUlkgS0VZIEFVVE9JTkNSRU1FTlQsICIKKwkJInN1YnNjcmliZXJfaWQgTlVNRVJJQyBVTklRVUUgTk9UIE5VTEwsICIKKwkJImlzc3VlZCBUSU1FU1RBTVAgTk9UIE5VTEwsICIKKwkJInVzZV9jb3VudCBJTlRFR0VSIE5PVCBOVUxMIERFRkFVTFQgMCwgIgorCQkia2V5X3NlcSBJTlRFR0VSIE5PVCBOVUxMLCAiCisJCSJyYW5kIEJMT0IgTk9UIE5VTEwsICIKKwkJInNyZXMgQkxPQiBOT1QgTlVMTCwgIgorCQkia2MgQkxPQiBOT1QgTlVMTCAiCisJCSIpIiwKK307CisKK3ZvaWQgZGJfZXJyb3JfZnVuYyhkYmlfY29ubiBjb25uLCB2b2lkICpkYXRhKQoreworCWNvbnN0IGNoYXIgKm1zZzsKKwlkYmlfY29ubl9lcnJvcihjb25uLCAmbXNnKTsKKwlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkRCSTogJXNcbiIsIG1zZyk7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfZGJfcmV2aXNpb24odm9pZCkKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwljb25zdCBjaGFyICpyZXY7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeShjb25uLAorCQkJCSJTRUxFQ1QgdmFsdWUgRlJPTSBNZXRhIFdIRVJFIGtleT0ncmV2aXNpb24nIik7CisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAtRUlOVkFMOworCisJaWYgKCFkYmlfcmVzdWx0X25leHRfcm93KHJlc3VsdCkpIHsKKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlyZXYgPSBkYmlfcmVzdWx0X2dldF9zdHJpbmcocmVzdWx0LCAidmFsdWUiKTsKKwlpZiAoIXJldiB8fCBhdG9pKHJldikgIT0gMikgeworCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkYl9pbml0KGNvbnN0IGNoYXIgKm5hbWUpCit7CisJZGJpX2luaXRpYWxpemUoTlVMTCk7CisKKwljb25uID0gZGJpX2Nvbm5fbmV3KCJzcWxpdGUzIik7CisJaWYgKGNvbm4gPT0gTlVMTCkgeworCQlMT0dQKEREQiwgTE9HTF9GQVRBTCwgIkZhaWxlZCB0byBjcmVhdGUgY29ubmVjdGlvbi5cbiIpOworCQlyZXR1cm4gMTsKKwl9CisKKwlkYmlfY29ubl9lcnJvcl9oYW5kbGVyKCBjb25uLCBkYl9lcnJvcl9mdW5jLCBOVUxMICk7CisKKwkvKiBNeVNRTAorCWRiaV9jb25uX3NldF9vcHRpb24oY29ubiwgImhvc3QiLCAibG9jYWxob3N0Iik7CisJZGJpX2Nvbm5fc2V0X29wdGlvbihjb25uLCAidXNlcm5hbWUiLCAieW91cl9uYW1lIik7CisJZGJpX2Nvbm5fc2V0X29wdGlvbihjb25uLCAicGFzc3dvcmQiLCAieW91cl9wYXNzd29yZCIpOworCWRiaV9jb25uX3NldF9vcHRpb24oY29ubiwgImRibmFtZSIsICJ5b3VyX2RibmFtZSIpOworCWRiaV9jb25uX3NldF9vcHRpb24oY29ubiwgImVuY29kaW5nIiwgIlVURi04Iik7CisJKi8KKworCS8qIFNxTGl0ZSAzICovCisJZGJfYmFzZW5hbWUgPSBzdHJkdXAobmFtZSk7CisJZGJfZGlybmFtZSA9IHN0cmR1cChuYW1lKTsKKwlkYmlfY29ubl9zZXRfb3B0aW9uKGNvbm4sICJzcWxpdGUzX2RiZGlyIiwgZGlybmFtZShkYl9kaXJuYW1lKSk7CisJZGJpX2Nvbm5fc2V0X29wdGlvbihjb25uLCAiZGJuYW1lIiwgYmFzZW5hbWUoZGJfYmFzZW5hbWUpKTsKKworCWlmIChkYmlfY29ubl9jb25uZWN0KGNvbm4pIDwgMCkKKwkJZ290byBvdXRfZXJyOworCisJcmV0dXJuIDA7CisKK291dF9lcnI6CisJZnJlZShkYl9kaXJuYW1lKTsKKwlmcmVlKGRiX2Jhc2VuYW1lKTsKKwlkYl9kaXJuYW1lID0gZGJfYmFzZW5hbWUgPSBOVUxMOworCXJldHVybiAtMTsKK30KKworCitpbnQgZGJfcHJlcGFyZSgpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShjcmVhdGVfc3RtdHMpOyBpKyspIHsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnkoY29ubiwgY3JlYXRlX3N0bXRzW2ldKTsKKwkJaWYgKCFyZXN1bHQpIHsKKwkJCUxPR1AoRERCLCBMT0dMX0VSUk9SLAorCQkJICAgICAiRmFpbGVkIHRvIGNyZWF0ZSBzb21lIHRhYmxlLlxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwl9CisKKwlpZiAoY2hlY2tfZGJfcmV2aXNpb24oKSA8IDApIHsKKwkJTE9HUChEREIsIExPR0xfRkFUQUwsICJEYXRhYmFzZSBzY2hlbWEgcmV2aXNpb24gaW52YWxpZCwgIgorCQkJInBsZWFzZSB1cGRhdGUgeW91ciBkYXRhYmFzZSBzY2hlbWFcbiIpOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IGRiX2ZpbmkoKQoreworCWRiaV9jb25uX2Nsb3NlKGNvbm4pOworCWRiaV9zaHV0ZG93bigpOworCisJaWYgKGRiX2Rpcm5hbWUpCisJICAgIGZyZWUoZGJfZGlybmFtZSk7CisJaWYgKGRiX2Jhc2VuYW1lKQorCSAgICBmcmVlKGRiX2Jhc2VuYW1lKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpkYl9jcmVhdGVfc3Vic2NyaWJlcihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgY2hhciAqaW1zaSkKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCS8qIElzIHRoaXMgc3Vic2NyaWJlciBrbm93biBpbiB0aGUgZGI/ICovCisJc3Vic2NyID0gZGJfZ2V0X3N1YnNjcmliZXIobmV0LCBHU01fU1VCU0NSSUJFUl9JTVNJLCBpbXNpKTsgCisJaWYgKHN1YnNjcikgeworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVVBEQVRFIFN1YnNjcmliZXIgc2V0IHVwZGF0ZWQgPSBkYXRldGltZSgnbm93JykgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJXSEVSRSBpbXNpID0gJXMgIiAsIGltc2kpOworCQlpZiAoIXJlc3VsdCkKKwkJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiZmFpbGVkIHRvIHVwZGF0ZSB0aW1lc3RhbXBcbiIpOworCQllbHNlCisJCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJcmV0dXJuIHN1YnNjcjsKKwl9CisKKwlzdWJzY3IgPSBzdWJzY3JfYWxsb2MoKTsKKwlzdWJzY3ItPmZsYWdzIHw9IEdTTV9TVUJTQ1JJQkVSX0ZJUlNUX0NPTlRBQ1Q7CisJaWYgKCFzdWJzY3IpCisJCXJldHVybiBOVUxMOworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiSU5TRVJUIElOVE8gU3Vic2NyaWJlciAiCisJCSIoaW1zaSwgY3JlYXRlZCwgdXBkYXRlZCkgIgorCQkiVkFMVUVTICIKKwkJIiglcywgZGF0ZXRpbWUoJ25vdycpLCBkYXRldGltZSgnbm93JykpICIsCisJCWltc2kKKwkpOworCWlmICghcmVzdWx0KQorCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgU3Vic2NyaWJlciBieSBJTVNJLlxuIik7CisJc3Vic2NyLT5uZXQgPSBuZXQ7CisJc3Vic2NyLT5pZCA9IGRiaV9jb25uX3NlcXVlbmNlX2xhc3QoY29ubiwgTlVMTCk7CisJc3RybmNweShzdWJzY3ItPmltc2ksIGltc2ksIEdTTV9JTVNJX0xFTkdUSC0xKTsKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwlMT0dQKEREQiwgTE9HTF9JTkZPLCAiTmV3IFN1YnNjcmliZXI6IElEICVsbHUsIElNU0kgJXNcbiIsIHN1YnNjci0+aWQsIHN1YnNjci0+aW1zaSk7CisJZGJfc3Vic2NyaWJlcl9hbGxvY19leHRlbihzdWJzY3IpOworCXJldHVybiBzdWJzY3I7Cit9CisKK3N0YXRpYyBpbnQgZ2V0X2VxdWlwbWVudF9ieV9zdWJzY3Ioc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJY29uc3QgY2hhciAqc3RyaW5nOworCXVuc2lnbmVkIGNoYXIgY20xOworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmNtMiwgKmNtMzsKKwlzdHJ1Y3QgZ3NtX2VxdWlwbWVudCAqZXF1aXAgPSAmc3Vic2NyLT5lcXVpcG1lbnQ7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCQkiU0VMRUNUIGVxdWlwbWVudC4qIEZST00gRXF1aXBtZW50LEVxdWlwbWVudFdhdGNoICIKKwkJCQkiV0hFUkUgRXF1aXBtZW50V2F0Y2guZXF1aXBtZW50X2lkPUVxdWlwbWVudC5pZCAiCisJCQkJIkFORCBFcXVpcG1lbnRXYXRjaC5zdWJzY3JpYmVyX2lkID0gJWxsdSAiCisJCQkJIk9SREVSIEJZIHVwZGF0ZWQgREVTQyIsIHN1YnNjci0+aWQpOworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwllcXVpcC0+aWQgPSBkYmlfcmVzdWx0X2dldF91bG9uZ2xvbmcocmVzdWx0LCAiaWQiKTsKKworCXN0cmluZyA9IGRiaV9yZXN1bHRfZ2V0X3N0cmluZyhyZXN1bHQsICJpbWVpIik7CisJaWYgKHN0cmluZykKKwkJc3RybmNweShlcXVpcC0+aW1laSwgc3RyaW5nLCBzaXplb2YoZXF1aXAtPmltZWkpKTsKKworCXN0cmluZyA9IGRiaV9yZXN1bHRfZ2V0X3N0cmluZyhyZXN1bHQsICJjbGFzc21hcmsxIik7CisJaWYgKHN0cmluZykKKwkJIGNtMSA9IGF0b2koc3RyaW5nKSAmIDB4ZmY7CisJZXF1aXAtPmNsYXNzbWFyazEgPSAqKChzdHJ1Y3QgZ3NtNDhfY2xhc3NtYXJrMSAqKSAmY20xKTsKKworCWVxdWlwLT5jbGFzc21hcmsyX2xlbiA9IGRiaV9yZXN1bHRfZ2V0X2ZpZWxkX2xlbmd0aChyZXN1bHQsICJjbGFzc21hcmsyIik7CisJY20yID0gZGJpX3Jlc3VsdF9nZXRfYmluYXJ5KHJlc3VsdCwgImNsYXNzbWFyazIiKTsKKwlpZiAoZXF1aXAtPmNsYXNzbWFyazJfbGVuID4gc2l6ZW9mKGVxdWlwLT5jbGFzc21hcmsyKSkKKwkJZXF1aXAtPmNsYXNzbWFyazJfbGVuID0gc2l6ZW9mKGVxdWlwLT5jbGFzc21hcmsyKTsKKwltZW1jcHkoZXF1aXAtPmNsYXNzbWFyazIsIGNtMiwgZXF1aXAtPmNsYXNzbWFyazJfbGVuKTsKKworCWVxdWlwLT5jbGFzc21hcmszX2xlbiA9IGRiaV9yZXN1bHRfZ2V0X2ZpZWxkX2xlbmd0aChyZXN1bHQsICJjbGFzc21hcmszIik7CisJY20zID0gZGJpX3Jlc3VsdF9nZXRfYmluYXJ5KHJlc3VsdCwgImNsYXNzbWFyazMiKTsKKwlpZiAoZXF1aXAtPmNsYXNzbWFyazNfbGVuID4gc2l6ZW9mKGVxdWlwLT5jbGFzc21hcmszKSkKKwkJZXF1aXAtPmNsYXNzbWFyazNfbGVuID0gc2l6ZW9mKGVxdWlwLT5jbGFzc21hcmszKTsKKwltZW1jcHkoZXF1aXAtPmNsYXNzbWFyazMsIGNtMywgZXF1aXAtPmNsYXNzbWFyazNfbGVuKTsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBnZXRfYXV0aGluZm9fYnlfc3Vic2NyKHN0cnVjdCBnc21fYXV0aF9pbmZvICphaW5mbywKKwkJCSAgIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCWNvbnN0IHVuc2lnbmVkIGNoYXIgKmEzYThfa2k7CisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCSJTRUxFQ1QgKiBGUk9NIEF1dGhLZXlzIFdIRVJFIHN1YnNjcmliZXJfaWQ9JXUiLAorCQkJIHN1YnNjci0+aWQpOworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gLUVJTzsKKworCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQlyZXR1cm4gLUVOT0VOVDsKKwl9CisKKwlhaW5mby0+YXV0aF9hbGdvID0gZGJpX3Jlc3VsdF9nZXRfdWxvbmdsb25nKHJlc3VsdCwgImFsZ29yaXRobV9pZCIpOworCWFpbmZvLT5hM2E4X2tpX2xlbiA9IGRiaV9yZXN1bHRfZ2V0X2ZpZWxkX2xlbmd0aChyZXN1bHQsICJhM2E4X2tpIik7CisJYTNhOF9raSA9IGRiaV9yZXN1bHRfZ2V0X2JpbmFyeShyZXN1bHQsICJhM2E4X2tpIik7CisJaWYgKGFpbmZvLT5hM2E4X2tpX2xlbiA+IHNpemVvZihhaW5mby0+YTNhOF9raSkpCisJCWFpbmZvLT5hM2E4X2tpX2xlbiA9IHNpemVvZihhaW5mby0+YTNhOF9raV9sZW4pOworCW1lbWNweShhaW5mby0+YTNhOF9raSwgYTNhOF9raSwgYWluZm8tPmEzYThfa2lfbGVuKTsKKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBzZXRfYXV0aGluZm9fZm9yX3N1YnNjcihzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyAqYWluZm8sCisJCQkgICAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IGdzbV9hdXRoX2luZm8gYWluZm9fb2xkOworCWludCByYywgdXBkOworCXVuc2lnbmVkIGNoYXIgKmtpX3N0cjsKKworCS8qIERlbGV0aW9uID8gKi8KKwlpZiAoYWluZm8gPT0gTlVMTCkgeworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCSJERUxFVEUgRlJPTSBBdXRoS2V5cyBXSEVSRSBzdWJzY3JpYmVyX2lkPSV1IiwKKwkJCXN1YnNjci0+aWQpOworCisJCWlmICghcmVzdWx0KQorCQkJcmV0dXJuIC1FSU87CisKKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisKKwkJcmV0dXJuIDA7CisJfQorCisJLyogQ2hlY2sgaWYgYWxyZWFkeSBleGlzdGluZyAqLworCXJjID0gZ2V0X2F1dGhpbmZvX2J5X3N1YnNjcigmYWluZm9fb2xkLCBzdWJzY3IpOworCWlmIChyYyAmJiByYyAhPSAtRU5PRU5UKQorCQlyZXR1cm4gcmM7CisJdXBkID0gcmMgPyAwIDogMTsKKworCS8qIFVwZGF0ZSAvIEluc2VydCAqLworCWRiaV9jb25uX3F1b3RlX2JpbmFyeV9jb3B5KGNvbm4sCisJCWFpbmZvLT5hM2E4X2tpLCBhaW5mby0+YTNhOF9raV9sZW4sICZraV9zdHIpOworCisJaWYgKCF1cGQpIHsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQkJIklOU0VSVCBJTlRPIEF1dGhLZXlzICIKKwkJCQkiKHN1YnNjcmliZXJfaWQsIGFsZ29yaXRobV9pZCwgYTNhOF9raSkgIgorCQkJCSJWQUxVRVMgKCV1LCAldSwgJXMpIiwKKwkJCQlzdWJzY3ItPmlkLCBhaW5mby0+YXV0aF9hbGdvLCBraV9zdHIpOworCX0gZWxzZSB7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJCSJVUERBVEUgQXV0aEtleXMgIgorCQkJCSJTRVQgYWxnb3JpdGhtX2lkPSV1LCBhM2E4X2tpPSVzICIKKwkJCQkiV0hFUkUgc3Vic2NyaWJlcl9pZD0ldSIsCisJCQkJYWluZm8tPmF1dGhfYWxnbywga2lfc3RyLCBzdWJzY3ItPmlkKTsKKwl9CisKKwlmcmVlKGtpX3N0cik7CisKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIC1FSU87CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCXJldHVybiAwOworfQorCitpbnQgZ2V0X2F1dGh0dXBsZV9ieV9zdWJzY3Ioc3RydWN0IGdzbV9hdXRoX3R1cGxlICphdHVwbGUsCisJCQkgICAgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJaW50IGxlbjsKKwljb25zdCB1bnNpZ25lZCBjaGFyICpibG9iOworCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQkiU0VMRUNUICogRlJPTSBBdXRoVHVwbGVzIFdIRVJFIHN1YnNjcmliZXJfaWQ9JXUiLAorCQkJc3Vic2NyLT5pZCk7CisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAtRUlPOworCisJaWYgKCFkYmlfcmVzdWx0X25leHRfcm93KHJlc3VsdCkpIHsKKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCXJldHVybiAtRU5PRU5UOworCX0KKworCW1lbXNldChhdHVwbGUsIDAsIHNpemVvZihhdHVwbGUpKTsKKworCWF0dXBsZS0+dXNlX2NvdW50ID0gZGJpX3Jlc3VsdF9nZXRfdWxvbmdsb25nKHJlc3VsdCwgInVzZV9jb3VudCIpOworCWF0dXBsZS0+a2V5X3NlcSA9IGRiaV9yZXN1bHRfZ2V0X3Vsb25nbG9uZyhyZXN1bHQsICJrZXlfc2VxIik7CisKKwlsZW4gPSBkYmlfcmVzdWx0X2dldF9maWVsZF9sZW5ndGgocmVzdWx0LCAicmFuZCIpOworCWlmIChsZW4gIT0gc2l6ZW9mKGF0dXBsZS0+cmFuZCkpCisJCWdvdG8gZXJyX3NpemU7CisKKwlibG9iID0gZGJpX3Jlc3VsdF9nZXRfYmluYXJ5KHJlc3VsdCwgInJhbmQiKTsKKwltZW1jcHkoYXR1cGxlLT5yYW5kLCBibG9iLCBsZW4pOworCisJbGVuID0gZGJpX3Jlc3VsdF9nZXRfZmllbGRfbGVuZ3RoKHJlc3VsdCwgInNyZXMiKTsKKwlpZiAobGVuICE9IHNpemVvZihhdHVwbGUtPnNyZXMpKQorCQlnb3RvIGVycl9zaXplOworCisJYmxvYiA9IGRiaV9yZXN1bHRfZ2V0X2JpbmFyeShyZXN1bHQsICJzcmVzIik7CisJbWVtY3B5KGF0dXBsZS0+c3JlcywgYmxvYiwgbGVuKTsKKworCWxlbiA9IGRiaV9yZXN1bHRfZ2V0X2ZpZWxkX2xlbmd0aChyZXN1bHQsICJrYyIpOworCWlmIChsZW4gIT0gc2l6ZW9mKGF0dXBsZS0+a2MpKQorCQlnb3RvIGVycl9zaXplOworCisJYmxvYiA9IGRiaV9yZXN1bHRfZ2V0X2JpbmFyeShyZXN1bHQsICJrYyIpOworCW1lbWNweShhdHVwbGUtPmtjLCBibG9iLCBsZW4pOworCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisKKwlyZXR1cm4gMDsKKworZXJyX3NpemU6CisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJcmV0dXJuIC1FSU87Cit9CisKK2ludCBzZXRfYXV0aHR1cGxlX2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9hdXRoX3R1cGxlICphdHVwbGUsCisJCQkgICAgIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCWludCByYywgdXBkOworCXN0cnVjdCBnc21fYXV0aF90dXBsZSBhdHVwbGVfb2xkOworCXVuc2lnbmVkIGNoYXIgKnJhbmRfc3RyLCAqc3Jlc19zdHIsICprY19zdHI7CisKKwkvKiBEZWxldGlvbiA/ICovCisJaWYgKGF0dXBsZSA9PSBOVUxMKSB7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJIkRFTEVURSBGUk9NIEF1dGhUdXBsZXMgV0hFUkUgc3Vic2NyaWJlcl9pZD0ldSIsCisJCQlzdWJzY3ItPmlkKTsKKworCQlpZiAoIXJlc3VsdCkKKwkJCXJldHVybiAtRUlPOworCisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJCXJldHVybiAwOworCX0KKworCS8qIENoZWNrIGlmIGFscmVhZHkgZXhpc3RpbmcgKi8KKwlyYyA9IGdldF9hdXRodHVwbGVfYnlfc3Vic2NyKCZhdHVwbGVfb2xkLCBzdWJzY3IpOworCWlmIChyYyAmJiByYyAhPSAtRU5PRU5UKQorCQlyZXR1cm4gcmM7CisJdXBkID0gcmMgPyAwIDogMTsKKworCS8qIFVwZGF0ZSAvIEluc2VydCAqLworCWRiaV9jb25uX3F1b3RlX2JpbmFyeV9jb3B5KGNvbm4sCisJCWF0dXBsZS0+cmFuZCwgc2l6ZW9mKGF0dXBsZS0+cmFuZCksICZyYW5kX3N0cik7CisJZGJpX2Nvbm5fcXVvdGVfYmluYXJ5X2NvcHkoY29ubiwKKwkJYXR1cGxlLT5zcmVzLCBzaXplb2YoYXR1cGxlLT5zcmVzKSwgJnNyZXNfc3RyKTsKKwlkYmlfY29ubl9xdW90ZV9iaW5hcnlfY29weShjb25uLAorCQlhdHVwbGUtPmtjLCBzaXplb2YoYXR1cGxlLT5rYyksICZrY19zdHIpOworCisJaWYgKCF1cGQpIHsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQkJIklOU0VSVCBJTlRPIEF1dGhUdXBsZXMgIgorCQkJCSIoc3Vic2NyaWJlcl9pZCwgaXNzdWVkLCB1c2VfY291bnQsICIKKwkJCQkgImtleV9zZXEsIHJhbmQsIHNyZXMsIGtjKSAiCisJCQkJIlZBTFVFUyAoJXUsIGRhdGV0aW1lKCdub3cnKSwgJXUsICIKKwkJCQkgIiV1LCAlcywgJXMsICVzICkgIiwKKwkJCQlzdWJzY3ItPmlkLCBhdHVwbGUtPnVzZV9jb3VudCwgYXR1cGxlLT5rZXlfc2VxLAorCQkJCXJhbmRfc3RyLCBzcmVzX3N0ciwga2Nfc3RyKTsKKwl9IGVsc2UgeworCQljaGFyICppc3N1ZWQgPSBhdHVwbGUtPmtleV9zZXEgPT0gYXR1cGxlX29sZC5rZXlfc2VxID8KKwkJCQkJImlzc3VlZCIgOiAiZGF0ZXRpbWUoJ25vdycpIjsKKwkJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCQkJIlVQREFURSBBdXRoS2V5cyAiCisJCQkJIlNFVCBpc3N1ZWQ9JXMsIHVzZV9jb3VudD0ldSwgIgorCQkJCSAia2V5X3NlcT0ldSwgcmFuZD0lcywgc3Jlcz0lcywga2M9JXMgIgorCQkJCSJXSEVSRSBzdWJzY3JpYmVyX2lkID0gJXUiLAorCQkJCWlzc3VlZCwgYXR1cGxlLT51c2VfY291bnQsIGF0dXBsZS0+a2V5X3NlcSwKKwkJCQlyYW5kX3N0ciwgc3Jlc19zdHIsIGtjX3N0ciwgc3Vic2NyLT5pZCk7CisJfQorCisJZnJlZShyYW5kX3N0cik7CisJZnJlZShzcmVzX3N0cik7CisJZnJlZShrY19zdHIpOworCisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAtRUlPOworCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBCQVNFX1FVRVJZICJTRUxFQ1QgKiBGUk9NIFN1YnNjcmliZXIgIgorc3RydWN0IGdzbV9zdWJzY3JpYmVyICpkYl9nZXRfc3Vic2NyaWJlcihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJIGVudW0gZ3NtX3N1YnNjcmliZXJfZmllbGQgZmllbGQsCisJCQkJCSBjb25zdCBjaGFyICppZCkKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwljb25zdCBjaGFyICpzdHJpbmc7CisJY2hhciAqcXVvdGVkOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCisJc3dpdGNoIChmaWVsZCkgeworCWNhc2UgR1NNX1NVQlNDUklCRVJfSU1TSToKKwkJZGJpX2Nvbm5fcXVvdGVfc3RyaW5nX2NvcHkoY29ubiwgaWQsICZxdW90ZWQpOworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCUJBU0VfUVVFUlkKKwkJCSJXSEVSRSBpbXNpID0gJXMgIiwKKwkJCXF1b3RlZAorCQkpOworCQlmcmVlKHF1b3RlZCk7CisJCWJyZWFrOworCWNhc2UgR1NNX1NVQlNDUklCRVJfVE1TSToKKwkJZGJpX2Nvbm5fcXVvdGVfc3RyaW5nX2NvcHkoY29ubiwgaWQsICZxdW90ZWQpOworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCUJBU0VfUVVFUlkKKwkJCSJXSEVSRSB0bXNpID0gJXMgIiwKKwkJCXF1b3RlZAorCQkpOworCQlmcmVlKHF1b3RlZCk7CisJCWJyZWFrOworCWNhc2UgR1NNX1NVQlNDUklCRVJfRVhURU5TSU9OOgorCQlkYmlfY29ubl9xdW90ZV9zdHJpbmdfY29weShjb25uLCBpZCwgJnF1b3RlZCk7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJQkFTRV9RVUVSWQorCQkJIldIRVJFIGV4dGVuc2lvbiA9ICVzICIsCisJCQlxdW90ZWQKKwkJKTsKKwkJZnJlZShxdW90ZWQpOworCQlicmVhazsKKwljYXNlIEdTTV9TVUJTQ1JJQkVSX0lEOgorCQlkYmlfY29ubl9xdW90ZV9zdHJpbmdfY29weShjb25uLCBpZCwgJnF1b3RlZCk7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJQkFTRV9RVUVSWQorCQkJIldIRVJFIGlkID0gJXMgIiwgcXVvdGVkKTsKKwkJZnJlZShxdW90ZWQpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKEREQiwgTE9HTF9OT1RJQ0UsICJVbmtub3duIHF1ZXJ5IHNlbGVjdG9yIGZvciBTdWJzY3JpYmVyLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoIXJlc3VsdCkgeworCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBxdWVyeSBTdWJzY3JpYmVyLlxuIik7CisJCXJldHVybiBOVUxMOworCX0KKwlpZiAoIWRiaV9yZXN1bHRfbmV4dF9yb3cocmVzdWx0KSkgeworCQlERUJVR1AoRERCLCAiRmFpbGVkIHRvIGZpbmQgdGhlIFN1YnNjcmliZXIuICcldScgJyVzJ1xuIiwKKwkJCWZpZWxkLCBpZCk7CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzdWJzY3IgPSBzdWJzY3JfYWxsb2MoKTsKKwlzdWJzY3ItPm5ldCA9IG5ldDsKKwlzdWJzY3ItPmlkID0gZGJpX3Jlc3VsdF9nZXRfdWxvbmdsb25nKHJlc3VsdCwgImlkIik7CisJc3RyaW5nID0gZGJpX3Jlc3VsdF9nZXRfc3RyaW5nKHJlc3VsdCwgImltc2kiKTsKKwlpZiAoc3RyaW5nKQorCQlzdHJuY3B5KHN1YnNjci0+aW1zaSwgc3RyaW5nLCBHU01fSU1TSV9MRU5HVEgpOworCisJc3RyaW5nID0gZGJpX3Jlc3VsdF9nZXRfc3RyaW5nKHJlc3VsdCwgInRtc2kiKTsKKwlpZiAoc3RyaW5nKQorCQlzdWJzY3ItPnRtc2kgPSB0bXNpX2Zyb21fc3RyaW5nKHN0cmluZyk7CisKKwlzdHJpbmcgPSBkYmlfcmVzdWx0X2dldF9zdHJpbmcocmVzdWx0LCAibmFtZSIpOworCWlmIChzdHJpbmcpCisJCXN0cm5jcHkoc3Vic2NyLT5uYW1lLCBzdHJpbmcsIEdTTV9OQU1FX0xFTkdUSCk7CisKKwlzdHJpbmcgPSBkYmlfcmVzdWx0X2dldF9zdHJpbmcocmVzdWx0LCAiZXh0ZW5zaW9uIik7CisJaWYgKHN0cmluZykKKwkJc3RybmNweShzdWJzY3ItPmV4dGVuc2lvbiwgc3RyaW5nLCBHU01fRVhURU5TSU9OX0xFTkdUSCk7CisKKwlzdWJzY3ItPmxhYyA9IGRiaV9yZXN1bHRfZ2V0X3VpbnQocmVzdWx0LCAibGFjIik7CisJc3Vic2NyLT5hdXRob3JpemVkID0gZGJpX3Jlc3VsdF9nZXRfdWludChyZXN1bHQsICJhdXRob3JpemVkIik7CisJREVCVUdQKEREQiwgIkZvdW5kIFN1YnNjcmliZXI6IElEICVsbHUsIElNU0kgJXMsIE5BTUUgJyVzJywgVE1TSSAldSwgRVhURU4gJyVzJywgTEFDICVodSwgQVVUSCAldVxuIiwKKwkJc3Vic2NyLT5pZCwgc3Vic2NyLT5pbXNpLCBzdWJzY3ItPm5hbWUsIHN1YnNjci0+dG1zaSwgc3Vic2NyLT5leHRlbnNpb24sCisJCXN1YnNjci0+bGFjLCBzdWJzY3ItPmF1dGhvcml6ZWQpOworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJZ2V0X2VxdWlwbWVudF9ieV9zdWJzY3Ioc3Vic2NyKTsKKworCXJldHVybiBzdWJzY3I7Cit9CisKK2ludCBkYl9zeW5jX3N1YnNjcmliZXIoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JpYmVyKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCWNoYXIgdG1zaVsxNF07CisJY2hhciAqcV90bXNpOworCisJaWYgKHN1YnNjcmliZXItPnRtc2kgIT0gR1NNX1JFU0VSVkVEX1RNU0kpIHsKKwkJc3ByaW50Zih0bXNpLCAiJXUiLCBzdWJzY3JpYmVyLT50bXNpKTsKKwkJZGJpX2Nvbm5fcXVvdGVfc3RyaW5nX2NvcHkoY29ubiwKKwkJCQkgICB0bXNpLAorCQkJCSAgICZxX3Rtc2kpOworCX0gZWxzZQorCQlxX3Rtc2kgPSBzdHJkdXAoIk5VTEwiKTsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiVVBEQVRFIFN1YnNjcmliZXIgIgorCQkiU0VUIHVwZGF0ZWQgPSBkYXRldGltZSgnbm93JyksICIKKwkJIm5hbWUgPSAnJXMnLCAiCisJCSJleHRlbnNpb24gPSAnJXMnLCAiCisJCSJhdXRob3JpemVkID0gJWksICIKKwkJInRtc2kgPSAlcywgIgorCQkibGFjID0gJWkgIgorCQkiV0hFUkUgaW1zaSA9ICVzICIsCisJCXN1YnNjcmliZXItPm5hbWUsCisJCXN1YnNjcmliZXItPmV4dGVuc2lvbiwKKwkJc3Vic2NyaWJlci0+YXV0aG9yaXplZCwKKwkJcV90bXNpLAorCQlzdWJzY3JpYmVyLT5sYWMsCisJCXN1YnNjcmliZXItPmltc2kpOworCisJZnJlZShxX3Rtc2kpOworCisJaWYgKCFyZXN1bHQpIHsKKwkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gdXBkYXRlIFN1YnNjcmliZXIgKGJ5IElNU0kpLlxuIik7CisJCXJldHVybiAxOworCX0KKworCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkYl9zeW5jX2VxdWlwbWVudChzdHJ1Y3QgZ3NtX2VxdWlwbWVudCAqZXF1aXApCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJdW5zaWduZWQgY2hhciAqY20yLCAqY20zOworCXVfaW50OF90IGNsYXNzbWFyazE7CisKKwltZW1jcHkoJmNsYXNzbWFyazEsICZlcXVpcC0+Y2xhc3NtYXJrMSwgc2l6ZW9mKGNsYXNzbWFyazEpKTsKKwlERUJVR1AoRERCLCAiU3luYyBFcXVpcG1lbnQgSU1FST0lcywgY2xhc3NtYXJrMT0lMDJ4IiwKKwkJZXF1aXAtPmltZWksIGNsYXNzbWFyazEpOworCWlmIChlcXVpcC0+Y2xhc3NtYXJrMl9sZW4pCisJCURFQlVHUEMoRERCLCAiLCBjbGFzc21hcmsyPSVzIiwKKwkJCWhleGR1bXAoZXF1aXAtPmNsYXNzbWFyazIsIGVxdWlwLT5jbGFzc21hcmsyX2xlbikpOworCWlmIChlcXVpcC0+Y2xhc3NtYXJrM19sZW4pCisJCURFQlVHUEMoRERCLCAiLCBjbGFzc21hcmszPSVzIiwKKwkJCWhleGR1bXAoZXF1aXAtPmNsYXNzbWFyazMsIGVxdWlwLT5jbGFzc21hcmszX2xlbikpOworCURFQlVHUEMoRERCLCAiXG4iKTsKKworCWRiaV9jb25uX3F1b3RlX2JpbmFyeV9jb3B5KGNvbm4sIGVxdWlwLT5jbGFzc21hcmsyLAorCQkJCSAgIGVxdWlwLT5jbGFzc21hcmsyX2xlbiwgJmNtMik7CisJZGJpX2Nvbm5fcXVvdGVfYmluYXJ5X2NvcHkoY29ubiwgZXF1aXAtPmNsYXNzbWFyazMsCisJCQkJICAgZXF1aXAtPmNsYXNzbWFyazNfbGVuLCAmY20zKTsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiVVBEQVRFIEVxdWlwbWVudCBTRVQgIgorCQkJInVwZGF0ZWQgPSBkYXRldGltZSgnbm93JyksICIKKwkJCSJjbGFzc21hcmsxID0gJXUsICIKKwkJCSJjbGFzc21hcmsyID0gJXMsICIKKwkJCSJjbGFzc21hcmszID0gJXMgIgorCQkiV0hFUkUgaW1laSA9ICclcycgIiwKKwkJY2xhc3NtYXJrMSwgY20yLCBjbTMsIGVxdWlwLT5pbWVpKTsKKworCWZyZWUoY20yKTsKKwlmcmVlKGNtMyk7CisKKwlpZiAoIXJlc3VsdCkgeworCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byB1cGRhdGUgRXF1aXBtZW50XG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkYl9zdWJzY3JpYmVyX2FsbG9jX3Rtc2koc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JpYmVyKQoreworCWRiaV9yZXN1bHQgcmVzdWx0ID0gTlVMTDsKKwljaGFyIHRtc2lbMTRdOworCWNoYXIqIHRtc2lfcXVvdGVkOworCisJZm9yICg7OykgeworCQlzdWJzY3JpYmVyLT50bXNpID0gcmFuZCgpOworCQlpZiAoc3Vic2NyaWJlci0+dG1zaSA9PSBHU01fUkVTRVJWRURfVE1TSSkKKwkJCWNvbnRpbnVlOworCisJCXNwcmludGYodG1zaSwgIiV1Iiwgc3Vic2NyaWJlci0+dG1zaSk7CisJCWRiaV9jb25uX3F1b3RlX3N0cmluZ19jb3B5KGNvbm4sIHRtc2ksICZ0bXNpX3F1b3RlZCk7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJIlNFTEVDVCAqIEZST00gU3Vic2NyaWJlciAiCisJCQkiV0hFUkUgdG1zaSA9ICVzICIsCisJCQl0bXNpX3F1b3RlZCk7CisKKwkJZnJlZSh0bXNpX3F1b3RlZCk7CisKKwkJaWYgKCFyZXN1bHQpIHsKKwkJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIHF1ZXJ5IFN1YnNjcmliZXIgIgorCQkJCSJ3aGlsZSBhbGxvY2F0aW5nIG5ldyBUTVNJLlxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZiAoZGJpX3Jlc3VsdF9nZXRfbnVtcm93cyhyZXN1bHQpKSB7CisJCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJCURFQlVHUChEREIsICJBbGxvY2F0ZWQgVE1TSSAldSBmb3IgSU1TSSAlcy5cbiIsCisJCQkJc3Vic2NyaWJlci0+dG1zaSwgc3Vic2NyaWJlci0+aW1zaSk7CisJCQlyZXR1cm4gZGJfc3luY19zdWJzY3JpYmVyKHN1YnNjcmliZXIpOworCQl9CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IGRiX3N1YnNjcmliZXJfYWxsb2NfZXh0ZW4oc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JpYmVyKQoreworCWRiaV9yZXN1bHQgcmVzdWx0ID0gTlVMTDsKKwl1X2ludDMyX3QgdHJ5OworCisJZm9yICg7OykgeworCQl0cnkgPSAocmFuZCgpJShHU01fTUFYX0VYVEVOLUdTTV9NSU5fRVhURU4rMSkrR1NNX01JTl9FWFRFTik7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJIlNFTEVDVCAqIEZST00gU3Vic2NyaWJlciAiCisJCQkiV0hFUkUgZXh0ZW5zaW9uID0gJWkiLAorCQkJdHJ5CisJCSk7CisJCWlmICghcmVzdWx0KSB7CisJCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBxdWVyeSBTdWJzY3JpYmVyICIKKwkJCQkid2hpbGUgYWxsb2NhdGluZyBuZXcgZXh0ZW5zaW9uLlxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZiAoZGJpX3Jlc3VsdF9nZXRfbnVtcm93cyhyZXN1bHQpKXsKKwkJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQkJY29udGludWU7CisJCX0KKwkJaWYgKCFkYmlfcmVzdWx0X25leHRfcm93KHJlc3VsdCkpIHsKKwkJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQkJYnJlYWs7CisJCX0KKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJfQorCXNwcmludGYoc3Vic2NyaWJlci0+ZXh0ZW5zaW9uLCAiJWkiLCB0cnkpOworCURFQlVHUChEREIsICJBbGxvY2F0ZWQgZXh0ZW5zaW9uICVpIGZvciBJTVNJICVzLlxuIiwgdHJ5LCBzdWJzY3JpYmVyLT5pbXNpKTsKKwlyZXR1cm4gZGJfc3luY19zdWJzY3JpYmVyKHN1YnNjcmliZXIpOworfQorLyoKKyAqIHRyeSB0byBhbGxvY2F0ZSBhIG5ldyB1bmlxdWUgdG9rZW4gZm9yIHRoaXMgc3Vic2NyaWJlciBhbmQgcmV0dXJuIGl0CisgKiB2aWEgYSBwYXJhbWV0ZXIuIGlmIHRoZSBzdWJzY3JpYmVyIGFscmVhZHkgaGFzIGEgdG9rZW4sIHJldHVybgorICogYW4gZXJyb3IuCisgKi8KKworaW50IGRiX3N1YnNjcmliZXJfYWxsb2NfdG9rZW4oc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JpYmVyLCB1X2ludDMyX3QgKnRva2VuKQoreworCWRiaV9yZXN1bHQgcmVzdWx0OworCXVfaW50MzJfdCB0cnk7CisKKwlmb3IgKDs7KSB7CisJCXRyeSA9IHJhbmQoKTsKKwkJaWYgKCF0cnkpIC8qIDAgaXMgYW4gaW52YWxpZCB0b2tlbiAqLworCQkJY29udGludWU7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJIlNFTEVDVCAqIEZST00gQXV0aFRva2VuICIKKwkJCSJXSEVSRSBzdWJzY3JpYmVyX2lkID0gJWxsdSBPUiB0b2tlbiA9IFwiJTA4WFwiICIsCisJCQlzdWJzY3JpYmVyLT5pZCwgdHJ5KTsKKwkJaWYgKCFyZXN1bHQpIHsKKwkJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIHF1ZXJ5IEF1dGhUb2tlbiAiCisJCQkJIndoaWxlIGFsbG9jYXRpbmcgbmV3IHRva2VuLlxuIik7CisJCQlyZXR1cm4gMTsKKwkJfQorCQlpZiAoZGJpX3Jlc3VsdF9nZXRfbnVtcm93cyhyZXN1bHQpKSB7CisJCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJCWNvbnRpbnVlOworCQl9CisJCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCQlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwkJCWJyZWFrOworCQl9CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCX0KKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIklOU0VSVCBJTlRPIEF1dGhUb2tlbiAiCisJCSIoc3Vic2NyaWJlcl9pZCwgY3JlYXRlZCwgdG9rZW4pICIKKwkJIlZBTFVFUyAiCisJCSIoJWxsdSwgZGF0ZXRpbWUoJ25vdycpLCBcIiUwOFhcIikgIiwKKwkJc3Vic2NyaWJlci0+aWQsIHRyeSk7CisJaWYgKCFyZXN1bHQpIHsKKwkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIHRva2VuICUwOFggZm9yICIKKwkJCSJJTVNJICVzLlxuIiwgdHJ5LCBzdWJzY3JpYmVyLT5pbXNpKTsKKwkJcmV0dXJuIDE7CisJfQorCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCSp0b2tlbiA9IHRyeTsKKwlERUJVR1AoRERCLCAiQWxsb2NhdGVkIHRva2VuICUwOFggZm9yIElNU0kgJXMuXG4iLCB0cnksIHN1YnNjcmliZXItPmltc2kpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBkYl9zdWJzY3JpYmVyX2Fzc29jX2ltZWkoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JpYmVyLCBjaGFyIGltZWlbR1NNX0lNRUlfTEVOR1RIXSkKK3sKKwl1bnNpZ25lZCBsb25nIGxvbmcgZXF1aXBtZW50X2lkLCB3YXRjaF9pZDsKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKworCXN0cm5jcHkoc3Vic2NyaWJlci0+ZXF1aXBtZW50LmltZWksIGltZWksCisJCXNpemVvZihzdWJzY3JpYmVyLT5lcXVpcG1lbnQuaW1laSktMSksCisKKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIklOU0VSVCBPUiBJR05PUkUgSU5UTyBFcXVpcG1lbnQgIgorCQkiKGltZWksIGNyZWF0ZWQsIHVwZGF0ZWQpICIKKwkJIlZBTFVFUyAiCisJCSIoJXMsIGRhdGV0aW1lKCdub3cnKSwgZGF0ZXRpbWUoJ25vdycpKSAiLAorCQlpbWVpKTsKKwlpZiAoIXJlc3VsdCkgeworCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgRXF1aXBtZW50IGJ5IElNRUkuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZXF1aXBtZW50X2lkID0gMDsKKwlpZiAoZGJpX3Jlc3VsdF9nZXRfbnVtcm93c19hZmZlY3RlZChyZXN1bHQpKSB7CisJCWVxdWlwbWVudF9pZCA9IGRiaV9jb25uX3NlcXVlbmNlX2xhc3QoY29ubiwgTlVMTCk7CisJfQorCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCisJaWYgKGVxdWlwbWVudF9pZCkKKwkJREVCVUdQKEREQiwgIk5ldyBFcXVpcG1lbnQ6IElEICVsbHUsIElNRUkgJXNcbiIsIGVxdWlwbWVudF9pZCwgaW1laSk7CisJZWxzZSB7CisJCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkJIlNFTEVDVCBpZCBGUk9NIEVxdWlwbWVudCAiCisJCQkiV0hFUkUgaW1laSA9ICVzICIsCisJCQlpbWVpCisJCSk7CisJCWlmICghcmVzdWx0KSB7CisJCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBxdWVyeSBFcXVpcG1lbnQgYnkgSU1FSS5cbiIpOworCQkJcmV0dXJuIDE7CisJCX0KKwkJaWYgKCFkYmlfcmVzdWx0X25leHRfcm93KHJlc3VsdCkpIHsKKwkJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIGZpbmQgdGhlIEVxdWlwbWVudC5cbiIpOworCQkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCQlyZXR1cm4gMTsKKwkJfQorCQllcXVpcG1lbnRfaWQgPSBkYmlfcmVzdWx0X2dldF91bG9uZ2xvbmcocmVzdWx0LCAiaWQiKTsKKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJfQorCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJJTlNFUlQgT1IgSUdOT1JFIElOVE8gRXF1aXBtZW50V2F0Y2ggIgorCQkiKHN1YnNjcmliZXJfaWQsIGVxdWlwbWVudF9pZCwgY3JlYXRlZCwgdXBkYXRlZCkgIgorCQkiVkFMVUVTICIKKwkJIiglbGx1LCAlbGx1LCBkYXRldGltZSgnbm93JyksIGRhdGV0aW1lKCdub3cnKSkgIiwKKwkJc3Vic2NyaWJlci0+aWQsIGVxdWlwbWVudF9pZCk7CisJaWYgKCFyZXN1bHQpIHsKKwkJTE9HUChEREIsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIEVxdWlwbWVudFdhdGNoLlxuIik7CisJCXJldHVybiAxOworCX0KKworCXdhdGNoX2lkID0gMDsKKwlpZiAoZGJpX3Jlc3VsdF9nZXRfbnVtcm93c19hZmZlY3RlZChyZXN1bHQpKQorCQl3YXRjaF9pZCA9IGRiaV9jb25uX3NlcXVlbmNlX2xhc3QoY29ubiwgTlVMTCk7CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwlpZiAod2F0Y2hfaWQpCisJCURFQlVHUChEREIsICJOZXcgRXF1aXBtZW50V2F0Y2g6IElEICVsbHUsIElNU0kgJXMsIElNRUkgJXNcbiIsCisJCQllcXVpcG1lbnRfaWQsIHN1YnNjcmliZXItPmltc2ksIGltZWkpOworCWVsc2UgeworCQlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJCSJVUERBVEUgRXF1aXBtZW50V2F0Y2ggIgorCQkJIlNFVCB1cGRhdGVkID0gZGF0ZXRpbWUoJ25vdycpICIKKwkJCSJXSEVSRSBzdWJzY3JpYmVyX2lkID0gJWxsdSBBTkQgZXF1aXBtZW50X2lkID0gJWxsdSAiLAorCQkJc3Vic2NyaWJlci0+aWQsIGVxdWlwbWVudF9pZCk7CisJCWlmICghcmVzdWx0KSB7CisJCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byB1cGRhdGUgRXF1aXBtZW50V2F0Y2guXG4iKTsKKwkJCXJldHVybiAxOworCQl9CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQlERUJVR1AoRERCLCAiVXBkYXRlZCBFcXVpcG1lbnRXYXRjaDogSUQgJWxsdSwgSU1TSSAlcywgSU1FSSAlc1xuIiwKKwkJCWVxdWlwbWVudF9pZCwgc3Vic2NyaWJlci0+aW1zaSwgaW1laSk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHN0b3JlIGFuIFt1bnNlbnRdIFNNUyB0byB0aGUgZGF0YWJhc2UgKi8KK2ludCBkYl9zbXNfc3RvcmUoc3RydWN0IGdzbV9zbXMgKnNtcykKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwljaGFyICpxX3RleHQsICpxX2RhZGRyOworCXVuc2lnbmVkIGNoYXIgKnFfdWRhdGE7CisJY2hhciAqdmFsaWRpdHlfdGltZXN0YW1wID0gIjIyMjItMi0yIjsKKworCS8qIEZJWE1FOiBnZW5lcmF0ZSB2YWxpZGl0eSB0aW1lc3RhbXAgYmFzZWQgb24gdmFsaWRpdHlfbWludXRlcyAqLworCisJZGJpX2Nvbm5fcXVvdGVfc3RyaW5nX2NvcHkoY29ubiwgKGNoYXIgKilzbXMtPnRleHQsICZxX3RleHQpOworCWRiaV9jb25uX3F1b3RlX3N0cmluZ19jb3B5KGNvbm4sIChjaGFyICopc21zLT5kZXN0X2FkZHIsICZxX2RhZGRyKTsKKwlkYmlfY29ubl9xdW90ZV9iaW5hcnlfY29weShjb25uLCBzbXMtPnVzZXJfZGF0YSwgc21zLT51c2VyX2RhdGFfbGVuLAorCQkJCSAgICZxX3VkYXRhKTsKKwkvKiBGSVhNRTogY29ycmVjdCB2YWxpZGl0eSBwZXJpb2QgKi8KKwlyZXN1bHQgPSBkYmlfY29ubl9xdWVyeWYoY29ubiwKKwkJIklOU0VSVCBJTlRPIFNNUyAiCisJCSIoY3JlYXRlZCwgc2VuZGVyX2lkLCByZWNlaXZlcl9pZCwgdmFsaWRfdW50aWwsICIKKwkJICJyZXBseV9wYXRoX3JlcSwgc3RhdHVzX3JlcF9yZXEsIHByb3RvY29sX2lkLCAiCisJCSAiZGF0YV9jb2Rpbmdfc2NoZW1lLCB1ZF9oZHJfaW5kLCBkZXN0X2FkZHIsICIKKwkJICJ1c2VyX2RhdGEsIHRleHQpIFZBTFVFUyAiCisJCSIoZGF0ZXRpbWUoJ25vdycpLCAlbGx1LCAlbGx1LCAldSwgIgorCQkgIiV1LCAldSwgJXUsICV1LCAldSwgJXMsICVzLCAlcykiLAorCQlzbXMtPnNlbmRlci0+aWQsCisJCXNtcy0+cmVjZWl2ZXIgPyBzbXMtPnJlY2VpdmVyLT5pZCA6IDAsIHZhbGlkaXR5X3RpbWVzdGFtcCwKKwkJc21zLT5yZXBseV9wYXRoX3JlcSwgc21zLT5zdGF0dXNfcmVwX3JlcSwgc21zLT5wcm90b2NvbF9pZCwKKwkJc21zLT5kYXRhX2NvZGluZ19zY2hlbWUsIHNtcy0+dWRfaGRyX2luZCwKKwkJcV9kYWRkciwgcV91ZGF0YSwgcV90ZXh0KTsKKwlmcmVlKHFfdGV4dCk7CisJZnJlZShxX2RhZGRyKTsKKwlmcmVlKHFfdWRhdGEpOworCisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAtRUlPOworCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX3NtcyAqc21zX2Zyb21fcmVzdWx0KHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBkYmlfcmVzdWx0IHJlc3VsdCkKK3sKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zID0gc21zX2FsbG9jKCk7CisJbG9uZyBsb25nIHVuc2lnbmVkIGludCBzZW5kZXJfaWQsIHJlY2VpdmVyX2lkOworCWNvbnN0IGNoYXIgKnRleHQsICpkYWRkcjsKKwljb25zdCB1bnNpZ25lZCBjaGFyICp1c2VyX2RhdGE7CisKKwlpZiAoIXNtcykKKwkJcmV0dXJuIE5VTEw7CisKKwlzbXMtPmlkID0gZGJpX3Jlc3VsdF9nZXRfdWxvbmdsb25nKHJlc3VsdCwgImlkIik7CisKKwlzZW5kZXJfaWQgPSBkYmlfcmVzdWx0X2dldF91bG9uZ2xvbmcocmVzdWx0LCAic2VuZGVyX2lkIik7CisJc21zLT5zZW5kZXIgPSBzdWJzY3JfZ2V0X2J5X2lkKG5ldCwgc2VuZGVyX2lkKTsKKworCXJlY2VpdmVyX2lkID0gZGJpX3Jlc3VsdF9nZXRfdWxvbmdsb25nKHJlc3VsdCwgInJlY2VpdmVyX2lkIik7CisJc21zLT5yZWNlaXZlciA9IHN1YnNjcl9nZXRfYnlfaWQobmV0LCByZWNlaXZlcl9pZCk7CisKKwkvKiBGSVhNRTogdmFsaWRpdHkgKi8KKwkvKiBGSVhNRTogdGhvc2Ugc2hvdWxkIGFsbCBiZSBnZXRfdWNoYXIsIGJ1dCBzcWxpdGUzIGlzIGJyYWluZGVhZCAqLworCXNtcy0+cmVwbHlfcGF0aF9yZXEgPSBkYmlfcmVzdWx0X2dldF91aW50KHJlc3VsdCwgInJlcGx5X3BhdGhfcmVxIik7CisJc21zLT5zdGF0dXNfcmVwX3JlcSA9IGRiaV9yZXN1bHRfZ2V0X3VpbnQocmVzdWx0LCAic3RhdHVzX3JlcF9yZXEiKTsKKwlzbXMtPnVkX2hkcl9pbmQgPSBkYmlfcmVzdWx0X2dldF91aW50KHJlc3VsdCwgInVkX2hkcl9pbmQiKTsKKwlzbXMtPnByb3RvY29sX2lkID0gZGJpX3Jlc3VsdF9nZXRfdWludChyZXN1bHQsICJwcm90b2NvbF9pZCIpOworCXNtcy0+ZGF0YV9jb2Rpbmdfc2NoZW1lID0gZGJpX3Jlc3VsdF9nZXRfdWludChyZXN1bHQsCisJCQkJCQkgICJkYXRhX2NvZGluZ19zY2hlbWUiKTsKKwkvKiBzbXMtPm1zZ19yZWYgaXMgdGVtcG9yYXJ5IGFuZCBub3Qgc3RvcmVkIGluIERCICovCisKKwlkYWRkciA9IGRiaV9yZXN1bHRfZ2V0X3N0cmluZyhyZXN1bHQsICJkZXN0X2FkZHIiKTsKKwlpZiAoZGFkZHIpIHsKKwkJc3RybmNweShzbXMtPmRlc3RfYWRkciwgZGFkZHIsIHNpemVvZihzbXMtPmRlc3RfYWRkcikpOworCQlzbXMtPmRlc3RfYWRkcltzaXplb2Yoc21zLT5kZXN0X2FkZHIpLTFdID0gJ1wwJzsKKwl9CisKKwlzbXMtPnVzZXJfZGF0YV9sZW4gPSBkYmlfcmVzdWx0X2dldF9maWVsZF9sZW5ndGgocmVzdWx0LCAidXNlcl9kYXRhIik7CisJdXNlcl9kYXRhID0gZGJpX3Jlc3VsdF9nZXRfYmluYXJ5KHJlc3VsdCwgInVzZXJfZGF0YSIpOworCWlmIChzbXMtPnVzZXJfZGF0YV9sZW4gPiBzaXplb2Yoc21zLT51c2VyX2RhdGEpKQorCQlzbXMtPnVzZXJfZGF0YV9sZW4gPSAodV9pbnQ4X3QpIHNpemVvZihzbXMtPnVzZXJfZGF0YSk7CisJbWVtY3B5KHNtcy0+dXNlcl9kYXRhLCB1c2VyX2RhdGEsIHNtcy0+dXNlcl9kYXRhX2xlbik7CisKKwl0ZXh0ID0gZGJpX3Jlc3VsdF9nZXRfc3RyaW5nKHJlc3VsdCwgInRleHQiKTsKKwlpZiAodGV4dCkgeworCQlzdHJuY3B5KHNtcy0+dGV4dCwgdGV4dCwgc2l6ZW9mKHNtcy0+dGV4dCkpOworCQlzbXMtPnRleHRbc2l6ZW9mKHNtcy0+dGV4dCktMV0gPSAnXDAnOworCX0KKwlyZXR1cm4gc21zOworfQorCisvKiByZXRyaWV2ZSB0aGUgbmV4dCB1bnNlbnQgU01TIHdpdGggSUQgPj0gbWluX2lkICovCitzdHJ1Y3QgZ3NtX3NtcyAqZGJfc21zX2dldF91bnNlbnQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGludCBtaW5faWQpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IGdzbV9zbXMgKnNtczsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiU0VMRUNUICogRlJPTSBTTVMsU3Vic2NyaWJlciAiCisJCSJXSEVSRSBzbXMuaWQgPj0gJWxsdSBBTkQgc21zLnNlbnQgaXMgTlVMTCAiCisJCQkiQU5EIHNtcy5yZWNlaXZlcl9pZCA9IHN1YnNjcmliZXIuaWQgIgorCQkJIkFORCBzdWJzY3JpYmVyLmxhYyA+IDAgIgorCQkiT1JERVIgQlkgc21zLmlkIExJTUlUIDEiLAorCQltaW5faWQpOworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzbXMgPSBzbXNfZnJvbV9yZXN1bHQobmV0LCByZXN1bHQpOworCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisKKwlyZXR1cm4gc21zOworfQorCitzdHJ1Y3QgZ3NtX3NtcyAqZGJfc21zX2dldF91bnNlbnRfYnlfc3Vic2NyKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBpbnQgbWluX3N1YnNjcl9pZCkKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zOworCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJTRUxFQ1QgKiBGUk9NIFNNUyxTdWJzY3JpYmVyICIKKwkJIldIRVJFIHNtcy5yZWNlaXZlcl9pZCA+PSAlbGx1IEFORCBzbXMuc2VudCBpcyBOVUxMICIKKwkJCSJBTkQgc21zLnJlY2VpdmVyX2lkID0gc3Vic2NyaWJlci5pZCAiIAorCQkJIkFORCBzdWJzY3JpYmVyLmxhYyA+IDAgIgorCQkiT1JERVIgQlkgc21zLnJlY2VpdmVyX2lkLCBpZCBMSU1JVCAxIiwKKwkJbWluX3N1YnNjcl9pZCk7CisJaWYgKCFyZXN1bHQpCisJCXJldHVybiBOVUxMOworCisJaWYgKCFkYmlfcmVzdWx0X25leHRfcm93KHJlc3VsdCkpIHsKKwkJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXNtcyA9IHNtc19mcm9tX3Jlc3VsdChuZXQsIHJlc3VsdCk7CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCXJldHVybiBzbXM7Cit9CisKKy8qIHJldHJpZXZlIHRoZSBuZXh0IHVuc2VudCBTTVMgZm9yIGEgZ2l2ZW4gc3Vic2NyaWJlciAqLworc3RydWN0IGdzbV9zbXMgKmRiX3Ntc19nZXRfdW5zZW50X2Zvcl9zdWJzY3Ioc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJc3RydWN0IGdzbV9zbXMgKnNtczsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiU0VMRUNUICogRlJPTSBTTVMsU3Vic2NyaWJlciAiCisJCSJXSEVSRSBzbXMucmVjZWl2ZXJfaWQgPSAlbGx1IEFORCBzbXMuc2VudCBpcyBOVUxMICIKKwkJCSJBTkQgc21zLnJlY2VpdmVyX2lkID0gc3Vic2NyaWJlci5pZCAiCisJCQkiQU5EIHN1YnNjcmliZXIubGFjID4gMCAiCisJCSJPUkRFUiBCWSBzbXMuaWQgTElNSVQgMSIsCisJCXN1YnNjci0+aWQpOworCWlmICghcmVzdWx0KQorCQlyZXR1cm4gTlVMTDsKKworCWlmICghZGJpX3Jlc3VsdF9uZXh0X3JvdyhyZXN1bHQpKSB7CisJCWRiaV9yZXN1bHRfZnJlZShyZXN1bHQpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlzbXMgPSBzbXNfZnJvbV9yZXN1bHQoc3Vic2NyLT5uZXQsIHJlc3VsdCk7CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKworCXJldHVybiBzbXM7Cit9CisKKy8qIG1hcmsgYSBnaXZlbiBTTVMgYXMgcmVhZCAqLworaW50IGRiX3Ntc19tYXJrX3NlbnQoc3RydWN0IGdzbV9zbXMgKnNtcykKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiVVBEQVRFIFNNUyAiCisJCSJTRVQgc2VudCA9IGRhdGV0aW1lKCdub3cnKSAiCisJCSJXSEVSRSBpZCA9ICVsbHUiLCBzbXMtPmlkKTsKKwlpZiAoIXJlc3VsdCkgeworCQlMT0dQKEREQiwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBtYXJrIFNNUyAlbGx1IGFzIHNlbnQuXG4iLCBzbXMtPmlkKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgYXR0ZW1wdGVkIGRlbGl2ZXJpZXMgKi8KK2ludCBkYl9zbXNfaW5jX2RlbGl2ZXJfYXR0ZW1wdHMoc3RydWN0IGdzbV9zbXMgKnNtcykKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiVVBEQVRFIFNNUyAiCisJCSJTRVQgZGVsaXZlcl9hdHRlbXB0cyA9IGRlbGl2ZXJfYXR0ZW1wdHMgKyAxICIKKwkJIldIRVJFIGlkID0gJWxsdSIsIHNtcy0+aWQpOworCWlmICghcmVzdWx0KSB7CisJCUxPR1AoRERCLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIGluYyBkZWxpdmVyIGF0dGVtcHRzIGZvciAiCisJCQkiU01TICVsbHUuXG4iLCBzbXMtPmlkKTsKKwkJcmV0dXJuIDE7CisJfQorCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBkYl9hcGR1X2Jsb2Jfc3RvcmUoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsIAorCQkJdV9pbnQ4X3QgYXBkdV9pZF9mbGFncywgdV9pbnQ4X3QgbGVuLAorCQkJdV9pbnQ4X3QgKmFwZHUpCit7CisJZGJpX3Jlc3VsdCByZXN1bHQ7CisJdW5zaWduZWQgY2hhciAqcV9hcGR1OworCisJZGJpX2Nvbm5fcXVvdGVfYmluYXJ5X2NvcHkoY29ubiwgYXBkdSwgbGVuLCAmcV9hcGR1KTsKKworCXJlc3VsdCA9IGRiaV9jb25uX3F1ZXJ5Zihjb25uLAorCQkiSU5TRVJUIElOVE8gQXBkdUJsb2JzICIKKwkJIihjcmVhdGVkLHN1YnNjcmliZXJfaWQsYXBkdV9pZF9mbGFncyxhcGR1KSBWQUxVRVMgIgorCQkiKGRhdGV0aW1lKCdub3cnKSwlbGx1LCV1LCVzKSIsCisJCXN1YnNjci0+aWQsIGFwZHVfaWRfZmxhZ3MsIHFfYXBkdSk7CisKKwlmcmVlKHFfYXBkdSk7CisKKwlpZiAoIXJlc3VsdCkKKwkJcmV0dXJuIC1FSU87CisKKwlkYmlfcmVzdWx0X2ZyZWUocmVzdWx0KTsKKwlyZXR1cm4gMDsKK30KKworaW50IGRiX3N0b3JlX2NvdW50ZXIoc3RydWN0IGNvdW50ZXIgKmN0cikKK3sKKwlkYmlfcmVzdWx0IHJlc3VsdDsKKwljaGFyICpxX25hbWU7CisKKwlkYmlfY29ubl9xdW90ZV9zdHJpbmdfY29weShjb25uLCBjdHItPm5hbWUsICZxX25hbWUpOworCisJcmVzdWx0ID0gZGJpX2Nvbm5fcXVlcnlmKGNvbm4sCisJCSJJTlNFUlQgSU5UTyBDb3VudGVycyAiCisJCSIodGltZXN0YW1wLG5hbWUsdmFsdWUpIFZBTFVFUyAiCisJCSIoZGF0ZXRpbWUoJ25vdycpLCVzLCVsdSkiLCBxX25hbWUsIGN0ci0+dmFsdWUpOworCisJZnJlZShxX25hbWUpOworCisJaWYgKCFyZXN1bHQpCisJCXJldHVybiAtRUlPOworCisJZGJpX3Jlc3VsdF9mcmVlKHJlc3VsdCk7CisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9kZWJ1Zy5jIGIvb3BlbmJzYy9zcmMvZGVidWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmI1MzA5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZGVidWcuYwpAQCAtMCwwICsxLDQyNyBAQAorLyogRGVidWdnaW5nL0xvZ2dpbmcgc3VwcG9ydCBjb2RlICovCisvKiAoQykgMjAwOCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDggYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN0cmluZ3MuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS91dGlscy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisKKy8qIGRlZmF1bHQgY2F0ZWdvcmllcyAqLworc3RhdGljIHN0cnVjdCBkZWJ1Z19jYXRlZ29yeSBkZWZhdWx0X2NhdGVnb3JpZXNbRGVidWdfTGFzdEVudHJ5XSA9IHsKKyAgICBbRFJMTF0JPSB7IC5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UgfSwKKyAgICBbRENDXQk9IHsgLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSB9LAorICAgIFtETk1dCT0geyAuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFIH0sCisgICAgW0RSUl0JPSB7IC5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UgfSwKKyAgICBbRFJTTF0JPSB7IC5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UgfSwKKyAgICBbRE1NXQk9IHsgLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX0lORk8gfSwKKyAgICBbRE1OQ0NdCT0geyAuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFIH0sCisgICAgW0RTTVNdCT0geyAuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFIH0sCisgICAgW0RQQUddCT0geyAuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFIH0sCisgICAgW0RNRUFTXQk9IHsgLmVuYWJsZWQgPSAwLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSB9LAorICAgIFtETUldCT0geyAuZW5hYmxlZCA9IDAsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFIH0sCisgICAgW0RNSUJdCT0geyAuZW5hYmxlZCA9IDAsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFIH0sCisgICAgW0RNVVhdCT0geyAuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFIH0sCisgICAgW0RJTlBdCT0geyAuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFIH0sCisgICAgW0RTQ0NQXQk9IHsgLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSB9LAorICAgIFtETVNDXQk9IHsgLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSB9LAorICAgIFtETUdDUF0JPSB7IC5lbmFibGVkID0gMSwgLmxvZ2xldmVsID0gTE9HTF9OT1RJQ0UgfSwKKyAgICBbREhPXQk9IHsgLmVuYWJsZWQgPSAxLCAubG9nbGV2ZWwgPSBMT0dMX05PVElDRSB9LAorICAgIFtEREJdCT0geyAuZW5hYmxlZCA9IDEsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFIH0sCisgICAgW0RSRUZdCT0geyAuZW5hYmxlZCA9IDAsIC5sb2dsZXZlbCA9IExPR0xfTk9USUNFIH0sCit9OworCitzdHJ1Y3QgZGVidWdfaW5mbyB7CisJY29uc3QgY2hhciAqbmFtZTsKKwljb25zdCBjaGFyICpjb2xvcjsKKwljb25zdCBjaGFyICpkZXNjcmlwdGlvbjsKKwlpbnQgbnVtYmVyOworCWludCBwb3NpdGlvbjsKK307CisKK3N0cnVjdCBkZWJ1Z19jb250ZXh0IHsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworfTsKKworc3RhdGljIHN0cnVjdCBkZWJ1Z19jb250ZXh0IGRlYnVnX2NvbnRleHQ7CitzdGF0aWMgdm9pZCAqdGFsbF9kYmdfY3R4ID0gTlVMTDsKK3N0YXRpYyBMTElTVF9IRUFEKHRhcmdldF9saXN0KTsKKworI2RlZmluZSBERUJVR19DQVRFR09SWShOVU1CRVIsIE5BTUUsIENPTE9SLCBERVNDUklQVElPTikgXAorCXsgLm5hbWUgPSBOQU1FLCAuY29sb3IgPSBDT0xPUiwgLmRlc2NyaXB0aW9uID0gREVTQ1JJUFRJT04sIC5udW1iZXIgPSBOVU1CRVIgfSwKKworc3RhdGljIGNvbnN0IHN0cnVjdCBkZWJ1Z19pbmZvIGRlYnVnX2luZm9bXSA9IHsKKwlERUJVR19DQVRFR09SWShEUkxMLCAgIkRSTEwiLCAiXDAzM1sxOzMxbSIsICIiKQorCURFQlVHX0NBVEVHT1JZKERDQywgICAiRENDIiwgICJcMDMzWzE7MzJtIiwgIiIpCisJREVCVUdfQ0FURUdPUlkoRE1NLCAgICJETU0iLCAgIlwwMzNbMTszM20iLCAiIikKKwlERUJVR19DQVRFR09SWShEUlIsICAgIkRSUiIsICAiXDAzM1sxOzM0bSIsICIiKQorCURFQlVHX0NBVEVHT1JZKERSU0wsICAiRFJTTCIsICJcMDMzWzE7MzVtIiwgIiIpCisJREVCVUdfQ0FURUdPUlkoRE5NLCAgICJETk0iLCAgIlwwMzNbMTszNm0iLCAiIikKKwlERUJVR19DQVRFR09SWShEU01TLCAgIkRTTVMiLCAiXDAzM1sxOzM3bSIsICIiKQorCURFQlVHX0NBVEVHT1JZKERQQUcsICAiRFBBRyIsICJcMDMzWzE7MzhtIiwgIiIpCisJREVCVUdfQ0FURUdPUlkoRE1OQ0MsICJETU5DQyIsIlwwMzNbMTszOW0iLCAiIikKKwlERUJVR19DQVRFR09SWShESU5QLCAgIkRJTlAiLCAiIiwgIiIpCisJREVCVUdfQ0FURUdPUlkoRE1JLCAgIkRNSSIsICIiLCAiIikKKwlERUJVR19DQVRFR09SWShETUlCLCAgIkRNSUIiLCAiIiwgIiIpCisJREVCVUdfQ0FURUdPUlkoRE1VWCwgICJETVVYIiwgIiIsICIiKQorCURFQlVHX0NBVEVHT1JZKERNRUFTLCAgIkRNRUFTIiwgIiIsICIiKQorCURFQlVHX0NBVEVHT1JZKERTQ0NQLCAiRFNDQ1AiLCAiIiwgIiIpCisJREVCVUdfQ0FURUdPUlkoRE1TQywgIkRNU0MiLCAiIiwgIiIpCisJREVCVUdfQ0FURUdPUlkoRE1HQ1AsICJETUdDUCIsICIiLCAiIikKKwlERUJVR19DQVRFR09SWShESE8sICJESE8iLCAiIiwgIiIpCisJREVCVUdfQ0FURUdPUlkoRERCLCAiRERCIiwgIiIsICIiKQorCURFQlVHX0NBVEVHT1JZKERSRUYsICJEUkVGIiwgIiIsICIiKQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgbG9nbGV2ZWxfc3Ryc1tdID0geworCXsgMCwJIkVWRVJZVEhJTkciIH0sCisJeyAxLAkiREVCVUciIH0sCisJeyAzLAkiSU5GTyIgfSwKKwl7IDUsCSJOT1RJQ0UiIH0sCisJeyA3LAkiRVJST1IiIH0sCisJeyA4LAkiRkFUQUwiIH0sCisJeyAwLCBOVUxMIH0sCit9OworCitpbnQgZGVidWdfcGFyc2VfbGV2ZWwoY29uc3QgY2hhciAqbHZsKQoreworCXJldHVybiBnZXRfc3RyaW5nX3ZhbHVlKGxvZ2xldmVsX3N0cnMsIGx2bCk7Cit9CisKK2ludCBkZWJ1Z19wYXJzZV9jYXRlZ29yeShjb25zdCBjaGFyICpjYXRlZ29yeSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRlYnVnX2luZm8pOyArK2kpIHsKKwkJaWYgKCFzdHJjYXNlY21wKGRlYnVnX2luZm9baV0ubmFtZSsxLCBjYXRlZ29yeSkpCisJCQlyZXR1cm4gZGVidWdfaW5mb1tpXS5udW1iZXI7CisJfQorCisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qCisgKiBQYXJzZSB0aGUgY2F0ZWdvcnkgbWFzay4KKyAqIFRoZSBmb3JtYXQgY2FuIGJlIHRoaXM6IGNhdGVnb3J5MTpjYXRlZ29yeTI6Y2F0ZWdvcnkzCisgKiBvciBjYXRlZ29yeTEsMjpjYXRlZ29yeTIsMzouLi4KKyAqLwordm9pZCBkZWJ1Z19wYXJzZV9jYXRlZ29yeV9tYXNrKHN0cnVjdCBkZWJ1Z190YXJnZXQqIHRhcmdldCwgY29uc3QgY2hhciAqX21hc2spCit7CisJaW50IGkgPSAwOworCWNoYXIgKm1hc2sgPSBzdHJkdXAoX21hc2spOworCWNoYXIgKmNhdGVnb3J5X3Rva2VuID0gTlVMTDsKKworCS8qIERpc2FibGUgZXZlcnl0aGluZyB0byBlbmFibGUgaXQgYWZ0ZXJ3YXJkcyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHRhcmdldC0+Y2F0ZWdvcmllcyk7ICsraSkKKwkJdGFyZ2V0LT5jYXRlZ29yaWVzW2ldLmVuYWJsZWQgPSAwOworCisJY2F0ZWdvcnlfdG9rZW4gPSBzdHJ0b2sobWFzaywgIjoiKTsKKwlkbyB7CisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGRlYnVnX2luZm8pOyArK2kpIHsKKwkJCWNoYXIqIGNvbG9uID0gc3Ryc3RyKGNhdGVnb3J5X3Rva2VuLCAiLCIpOworCQkJaW50IGxlbmd0aCA9IHN0cmxlbihjYXRlZ29yeV90b2tlbik7CisKKwkJCWlmIChjb2xvbikKKwkJCSAgICBsZW5ndGggPSBjb2xvbiAtIGNhdGVnb3J5X3Rva2VuOworCisJCQlpZiAoc3RybmNhc2VjbXAoZGVidWdfaW5mb1tpXS5uYW1lLCBjYXRlZ29yeV90b2tlbiwgbGVuZ3RoKSA9PSAwKSB7CisJCQkJaW50IG51bWJlciA9IGRlYnVnX2luZm9baV0ubnVtYmVyOworCQkJCWludCBsZXZlbCA9IDA7CisKKwkJCQlpZiAoY29sb24pCisJCQkJCWxldmVsID0gYXRvaShjb2xvbisxKTsKKworCQkJCXRhcmdldC0+Y2F0ZWdvcmllc1tudW1iZXJdLmVuYWJsZWQgPSAxOworCQkJCXRhcmdldC0+Y2F0ZWdvcmllc1tudW1iZXJdLmxvZ2xldmVsID0gbGV2ZWw7CisJCQl9CisJCX0KKwl9IHdoaWxlICgoY2F0ZWdvcnlfdG9rZW4gPSBzdHJ0b2soTlVMTCwgIjoiKSkpOworCisJZnJlZShtYXNrKTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqIGNvbG9yKGludCBzdWJzeXMpCit7CisJaW50IGkgPSAwOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZGVidWdfaW5mbyk7ICsraSkgeworCQlpZiAoZGVidWdfaW5mb1tpXS5udW1iZXIgPT0gc3Vic3lzKQorCQkJcmV0dXJuIGRlYnVnX2luZm9baV0uY29sb3I7CisJfQorCisJcmV0dXJuICIiOworfQorCitzdGF0aWMgdm9pZCBfb3V0cHV0KHN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldCwgdW5zaWduZWQgaW50IHN1YnN5cywgY2hhciAqZmlsZSwgaW50IGxpbmUsCisJCSAgICBpbnQgY29udCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKQoreworCWNoYXIgY29sWzMwXTsKKwljaGFyIHN1YlszMF07CisJY2hhciB0aW1bMzBdOworCWNoYXIgYnVmWzQwOTZdOworCWNoYXIgZmluYWxbNDA5Nl07CisKKwkvKiBwcmVwYXJlIHRoZSBkYXRhICovCisJY29sWzBdID0gJ1wwJzsKKwlzdWJbMF0gPSAnXDAnOworCXRpbVswXSA9ICdcMCc7CisJYnVmWzBdID0gJ1wwJzsKKworCS8qIGFyZSB3ZSB1c2luZyBjb2xvciAqLworCWlmICh0YXJnZXQtPnVzZV9jb2xvcikgeworCQlzbnByaW50Zihjb2wsIHNpemVvZihjb2wpLCAiJXMiLCBjb2xvcihzdWJzeXMpKTsKKwkJY29sW3NpemVvZihjb2wpLTFdID0gJ1wwJzsKKwl9CisJdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGZvcm1hdCwgYXApOworCWJ1ZltzaXplb2YoYnVmKS0xXSA9ICdcMCc7CisKKwlpZiAoIWNvbnQpIHsKKwkJaWYgKHRhcmdldC0+cHJpbnRfdGltZXN0YW1wKSB7CisJCQljaGFyICp0aW1lc3RyOworCQkJdGltZV90IHRtOworCQkJdG0gPSB0aW1lKE5VTEwpOworCQkJdGltZXN0ciA9IGN0aW1lKCZ0bSk7CisJCQl0aW1lc3RyW3N0cmxlbih0aW1lc3RyKS0xXSA9ICdcMCc7CisJCQlzbnByaW50Zih0aW0sIHNpemVvZih0aW0pLCAiJXMgIiwgdGltZXN0cik7CisJCQl0aW1bc2l6ZW9mKHRpbSktMV0gPSAnXDAnOworCQl9CisJCXNucHJpbnRmKHN1Yiwgc2l6ZW9mKHN1YiksICI8JTQuNHg+ICVzOiVkICIsIHN1YnN5cywgZmlsZSwgbGluZSk7CisJCXN1YltzaXplb2Yoc3ViKS0xXSA9ICdcMCc7CisJfQorCisJc25wcmludGYoZmluYWwsIHNpemVvZihmaW5hbCksICIlcyVzJXMlc1wwMzNbMDttIiwgY29sLCB0aW0sIHN1YiwgYnVmKTsKKwlmaW5hbFtzaXplb2YoZmluYWwpLTFdID0gJ1wwJzsKKwl0YXJnZXQtPm91dHB1dCh0YXJnZXQsIGZpbmFsKTsKK30KKworCitzdGF0aWMgdm9pZCBfZGVidWdwKHVuc2lnbmVkIGludCBzdWJzeXMsIGludCBsZXZlbCwgY2hhciAqZmlsZSwgaW50IGxpbmUsCisJCSAgICBpbnQgY29udCwgY29uc3QgY2hhciAqZm9ybWF0LCB2YV9saXN0IGFwKQoreworCXN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcjsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRhciwgJnRhcmdldF9saXN0LCBlbnRyeSkgeworCQlzdHJ1Y3QgZGVidWdfY2F0ZWdvcnkgKmNhdGVnb3J5OworCQlpbnQgb3V0cHV0ID0gMDsKKworCQljYXRlZ29yeSA9ICZ0YXItPmNhdGVnb3JpZXNbc3Vic3lzXTsKKwkJLyogc3Vic3lzdGVtIGlzIG5vdCBzdXBwb3NlZCB0byBiZSBkZWJ1Z2dlZCAqLworCQlpZiAoIWNhdGVnb3J5LT5lbmFibGVkKQorCQkJY29udGludWU7CisKKwkJLyogQ2hlY2sgdGhlIGdsb2JhbCBsb2cgbGV2ZWwgKi8KKwkJaWYgKHRhci0+bG9nbGV2ZWwgIT0gMCAmJiBsZXZlbCA8IHRhci0+bG9nbGV2ZWwpCisJCQljb250aW51ZTsKKworCQkvKiBDaGVjayB0aGUgY2F0ZWdvcnkgbG9nIGxldmVsICovCisJCWlmIChjYXRlZ29yeS0+bG9nbGV2ZWwgIT0gMCAmJiBsZXZlbCA8IGNhdGVnb3J5LT5sb2dsZXZlbCkKKwkJCWNvbnRpbnVlOworCisJCS8qCisJCSAqIEFwcGx5IGZpbHRlcnMgaGVyZS4uLiBpZiB0aGF0IGJlY29tZXMgbWVzc3kgd2Ugd2lsbCBuZWVkIHRvIHB1dAorCQkgKiBmaWx0ZXJzIGluIGEgbGlzdCBhbmQgZWFjaCBmaWx0ZXIgd2lsbCBzYXkgc3RvcCwgY29udGludWUsIG91dHB1dAorCQkgKi8KKwkJaWYgKCh0YXItPmZpbHRlcl9tYXAgJiBERUJVR19GSUxURVJfQUxMKSAhPSAwKSB7CisJCQlvdXRwdXQgPSAxOworCQl9IGVsc2UgaWYgKCh0YXItPmZpbHRlcl9tYXAgJiBERUJVR19GSUxURVJfSU1TSSkgIT0gMAorCQkJICAgICAgJiYgZGVidWdfY29udGV4dC5zdWJzY3IgJiYgc3RyY21wKGRlYnVnX2NvbnRleHQuc3Vic2NyLT5pbXNpLCB0YXItPmltc2lfZmlsdGVyKSA9PSAwKSB7CisJCQlvdXRwdXQgPSAxOworCQl9CisKKwkJaWYgKG91dHB1dCkgeworCQkJLyogRklYTUU6IGNvcHlpbmcgdGhlIHZhX2xpc3QgaXMgYW4gdWdseSB3b3JrYXJvdW5kIGFnYWluc3QgYSBidWcKKwkJCSAqIGhpZGRlbiBzb21ld2hlcmUgaW4gX291dHB1dC4gIElmIHdlIGRvIG5vdCBjb3B5IGhlcmUsIHRoZSBmaXJzdAorCQkJICogY2FsbCB0byBfb3V0cHV0KCkgd2lsbCBjb3JydXB0IHRoZSB2YV9saXN0IGNvbnRlbnRzLCBhbmQgYW55CisJCQkgKiBmdXJ0aGVyIF9vdXRwdXQoKSBjYWxscyB3aXRoIHRoZSBzYW1lIHZhX2xpc3Qgd2lsbCBzZWdmYXVsdCAqLworCQkJdmFfbGlzdCBicDsKKwkJCXZhX2NvcHkoYnAsIGFwKTsKKwkJCV9vdXRwdXQodGFyLCBzdWJzeXMsIGZpbGUsIGxpbmUsIGNvbnQsIGZvcm1hdCwgYnApOworCQkJdmFfZW5kKGJwKTsKKwkJfQorCX0KK30KKwordm9pZCBkZWJ1Z3AodW5zaWduZWQgaW50IHN1YnN5cywgY2hhciAqZmlsZSwgaW50IGxpbmUsIGludCBjb250LCBjb25zdCBjaGFyICpmb3JtYXQsIC4uLikKK3sKKwl2YV9saXN0IGFwOworCisJdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisJX2RlYnVncChzdWJzeXMsIExPR0xfREVCVUcsIGZpbGUsIGxpbmUsIGNvbnQsIGZvcm1hdCwgYXApOworCXZhX2VuZChhcCk7Cit9CisKK3ZvaWQgZGVidWdwMih1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgbGV2ZWwsIGNoYXIgKmZpbGUsIGludCBsaW5lLCBpbnQgY29udCwgY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pCit7CisJdmFfbGlzdCBhcDsKKworCXZhX3N0YXJ0KGFwLCBmb3JtYXQpOworCV9kZWJ1Z3Aoc3Vic3lzLCBsZXZlbCwgZmlsZSwgbGluZSwgY29udCwgZm9ybWF0LCBhcCk7CisJdmFfZW5kKGFwKTsKK30KKworc3RhdGljIGNoYXIgaGV4ZF9idWZmWzQwOTZdOworCitjaGFyICpoZXhkdW1wKGNvbnN0IHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IGxlbikKK3sKKwlpbnQgaTsKKwljaGFyICpjdXIgPSBoZXhkX2J1ZmY7CisKKwloZXhkX2J1ZmZbMF0gPSAwOworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpbnQgbGVuX3JlbWFpbiA9IHNpemVvZihoZXhkX2J1ZmYpIC0gKGN1ciAtIGhleGRfYnVmZik7CisJCWludCByYyA9IHNucHJpbnRmKGN1ciwgbGVuX3JlbWFpbiwgIiUwMnggIiwgYnVmW2ldKTsKKwkJaWYgKHJjIDw9IDApCisJCQlicmVhazsKKwkJY3VyICs9IHJjOworCX0KKwloZXhkX2J1ZmZbc2l6ZW9mKGhleGRfYnVmZiktMV0gPSAwOworCXJldHVybiBoZXhkX2J1ZmY7Cit9CisKKworCit2b2lkIGRlYnVnX2FkZF90YXJnZXQoc3RydWN0IGRlYnVnX3RhcmdldCAqdGFyZ2V0KQoreworCWxsaXN0X2FkZF90YWlsKCZ0YXJnZXQtPmVudHJ5LCAmdGFyZ2V0X2xpc3QpOworfQorCit2b2lkIGRlYnVnX2RlbF90YXJnZXQoc3RydWN0IGRlYnVnX3RhcmdldCAqdGFyZ2V0KQoreworCWxsaXN0X2RlbCgmdGFyZ2V0LT5lbnRyeSk7Cit9CisKK3ZvaWQgZGVidWdfcmVzZXRfY29udGV4dCh2b2lkKQoreworCW1lbXNldCgmZGVidWdfY29udGV4dCwgMCwgc2l6ZW9mKGRlYnVnX2NvbnRleHQpKTsKK30KKworLyogY3VycmVudGx5IHdlIGFyZSBub3QgcmVmZmluZyB0aGVzZSAqLwordm9pZCBkZWJ1Z19zZXRfY29udGV4dChpbnQgY3R4LCB2b2lkICp2YWx1ZSkKK3sKKwlzd2l0Y2ggKGN0eCkgeworCWNhc2UgQlNDX0NUWF9MQ0hBTjoKKwkJZGVidWdfY29udGV4dC5sY2hhbiA9IChzdHJ1Y3QgZ3NtX2xjaGFuICopIHZhbHVlOworCQlicmVhazsKKwljYXNlIEJTQ19DVFhfU1VCU0NSOgorCQlkZWJ1Z19jb250ZXh0LnN1YnNjciA9IChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKikgdmFsdWU7CisJCWJyZWFrOworCWNhc2UgQlNDX0NUWF9CVFM6CisJCWRlYnVnX2NvbnRleHQuYnRzID0gKHN0cnVjdCBnc21fYnRzICopIHZhbHVlOworCQlicmVhazsKKwljYXNlIEJTQ19DVFhfU0NDUDoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCit2b2lkIGRlYnVnX3NldF9pbXNpX2ZpbHRlcihzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQsIGNvbnN0IGNoYXIgKmltc2kpCit7CisJaWYgKGltc2kpIHsKKwkJdGFyZ2V0LT5maWx0ZXJfbWFwIHw9IERFQlVHX0ZJTFRFUl9JTVNJOworCQl0YXJnZXQtPmltc2lfZmlsdGVyID0gdGFsbG9jX3N0cmR1cCh0YXJnZXQsIGltc2kpOworCX0gZWxzZSBpZiAodGFyZ2V0LT5pbXNpX2ZpbHRlcikgeworCQl0YXJnZXQtPmZpbHRlcl9tYXAgJj0gfkRFQlVHX0ZJTFRFUl9JTVNJOworCQl0YWxsb2NfZnJlZSh0YXJnZXQtPmltc2lfZmlsdGVyKTsKKwkJdGFyZ2V0LT5pbXNpX2ZpbHRlciA9IE5VTEw7CisJfQorfQorCit2b2lkIGRlYnVnX3NldF9hbGxfZmlsdGVyKHN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldCwgaW50IGFsbCkKK3sKKwlpZiAoYWxsKQorCQl0YXJnZXQtPmZpbHRlcl9tYXAgfD0gREVCVUdfRklMVEVSX0FMTDsKKwllbHNlCisJCXRhcmdldC0+ZmlsdGVyX21hcCAmPSB+REVCVUdfRklMVEVSX0FMTDsKK30KKwordm9pZCBkZWJ1Z19zZXRfdXNlX2NvbG9yKHN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldCwgaW50IHVzZV9jb2xvcikKK3sKKwl0YXJnZXQtPnVzZV9jb2xvciA9IHVzZV9jb2xvcjsKK30KKwordm9pZCBkZWJ1Z19zZXRfcHJpbnRfdGltZXN0YW1wKHN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldCwgaW50IHByaW50X3RpbWVzdGFtcCkKK3sKKwl0YXJnZXQtPnByaW50X3RpbWVzdGFtcCA9IHByaW50X3RpbWVzdGFtcDsKK30KKwordm9pZCBkZWJ1Z19zZXRfbG9nX2xldmVsKHN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldCwgaW50IGxvZ19sZXZlbCkKK3sKKwl0YXJnZXQtPmxvZ2xldmVsID0gbG9nX2xldmVsOworfQorCit2b2lkIGRlYnVnX3NldF9jYXRlZ29yeV9maWx0ZXIoc3RydWN0IGRlYnVnX3RhcmdldCAqdGFyZ2V0LCBpbnQgY2F0ZWdvcnksIGludCBlbmFibGUsIGludCBsZXZlbCkKK3sKKwlpZiAoY2F0ZWdvcnkgPj0gRGVidWdfTGFzdEVudHJ5KQorCQlyZXR1cm47CisJdGFyZ2V0LT5jYXRlZ29yaWVzW2NhdGVnb3J5XS5lbmFibGVkID0gISFlbmFibGU7CisJdGFyZ2V0LT5jYXRlZ29yaWVzW2NhdGVnb3J5XS5sb2dsZXZlbCA9IGxldmVsOworfQorCitzdGF0aWMgdm9pZCBfc3RkZXJyX291dHB1dChzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQsIGNvbnN0IGNoYXIgKmxvZykKK3sKKwlmcHJpbnRmKHRhcmdldC0+dGd0X3N0ZG91dC5vdXQsICIlcyIsIGxvZyk7CisJZmZsdXNoKHRhcmdldC0+dGd0X3N0ZG91dC5vdXQpOworfQorCitzdHJ1Y3QgZGVidWdfdGFyZ2V0ICpkZWJ1Z190YXJnZXRfY3JlYXRlKHZvaWQpCit7CisJc3RydWN0IGRlYnVnX3RhcmdldCAqdGFyZ2V0OworCisJdGFyZ2V0ID0gdGFsbG9jX3plcm8odGFsbF9kYmdfY3R4LCBzdHJ1Y3QgZGVidWdfdGFyZ2V0KTsKKwlpZiAoIXRhcmdldCkKKwkJcmV0dXJuIE5VTEw7CisKKwlJTklUX0xMSVNUX0hFQUQoJnRhcmdldC0+ZW50cnkpOworCW1lbWNweSh0YXJnZXQtPmNhdGVnb3JpZXMsIGRlZmF1bHRfY2F0ZWdvcmllcywgc2l6ZW9mKGRlZmF1bHRfY2F0ZWdvcmllcykpOworCXRhcmdldC0+dXNlX2NvbG9yID0gMTsKKwl0YXJnZXQtPnByaW50X3RpbWVzdGFtcCA9IDA7CisJdGFyZ2V0LT5sb2dsZXZlbCA9IDA7CisJcmV0dXJuIHRhcmdldDsKK30KKworc3RydWN0IGRlYnVnX3RhcmdldCAqZGVidWdfdGFyZ2V0X2NyZWF0ZV9zdGRlcnIodm9pZCkKK3sKKwlzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0YXJnZXQ7CisKKwl0YXJnZXQgPSBkZWJ1Z190YXJnZXRfY3JlYXRlKCk7CisJaWYgKCF0YXJnZXQpCisJCXJldHVybiBOVUxMOworCisJdGFyZ2V0LT50Z3Rfc3Rkb3V0Lm91dCA9IHN0ZGVycjsKKwl0YXJnZXQtPm91dHB1dCA9IF9zdGRlcnJfb3V0cHV0OworCXJldHVybiB0YXJnZXQ7Cit9CisKK3ZvaWQgZGVidWdfaW5pdCh2b2lkKQoreworCXRhbGxfZGJnX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdChOVUxMLCAxLCAiZGVidWciKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2UxX2NvbmZpZy5jIGIvb3BlbmJzYy9zcmMvZTFfY29uZmlnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTBmYmNlYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2UxX2NvbmZpZy5jCkBAIC0wLDAgKzEsMjM2IEBACisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2UxX2lucHV0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmF1X2ZyYW1lLmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmF1X211eC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWlzZG4uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2lwYWNjZXNzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorCisjZGVmaW5lIFNBUElfTDJNTAkwCisjZGVmaW5lIFNBUElfT01MCTYyCisjZGVmaW5lIFNBUElfUlNMCTAJLyogNjMgPyAqLworCisvKiBUaGUgZTFfcmVjb25maWdfKigpIGZ1bmN0aW9ucyBiZWxvdyB0YWxlIHRoZSBjb25maWd1cmF0aW9uIHByZXNlbnQgaW4gdGhlCisgKiBidHMvdHJ4L3RzIGRhdGEgc3RydWN0dXJlcyBhbmQgZW5zdXJlIHRoZSBFMSBjb25maWd1cmF0aW9uIHJlZmxlY3RzIHRoZQorICogdGltZXNsb3Qvc3Vic2xvdC9URUkgY29uZmlndXJhdGlvbiAqLworCitpbnQgZTFfcmVjb25maWdfdHMoc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cykKK3sKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmUxX2xpbmsgPSAmdHMtPmUxX2xpbms7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisJc3RydWN0IGUxaW5wX3RzICplMV90czsKKworCURFQlVHUChETUksICJlMV9yZWNvbmZpZ190cygldSwldSwldSlcbiIsIHRzLT50cngtPmJ0cy0+bnIsIHRzLT50cngtPm5yLCB0cy0+bnIpOworCisJaWYgKCFlMV9saW5rLT5lMV90cykKKwkJcmV0dXJuIDA7CisKKwlsaW5lID0gZTFpbnBfbGluZV9nZXRfY3JlYXRlKGUxX2xpbmstPmUxX25yKTsKKwlpZiAoIWxpbmUpCisJCXJldHVybiAtRU5PTUVNOworCisJc3dpdGNoICh0cy0+cGNoYW4pIHsKKwljYXNlIEdTTV9QQ0hBTl9UQ0hfRjoKKwljYXNlIEdTTV9QQ0hBTl9UQ0hfSDoKKwkJZTFfdHMgPSAmbGluZS0+dHNbZTFfbGluay0+ZTFfdHMtMV07CisJCWUxaW5wX3RzX2NvbmZpZyhlMV90cywgbGluZSwgRTFJTlBfVFNfVFlQRV9UUkFVKTsKKwkJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmUxX3RzLT50cmF1LmRlbXV4LCBlMV9saW5rLT5lMV90c19zcyk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgZTFfcmVjb25maWdfdHJ4KHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KQoreworCXN0cnVjdCBnc21fZTFfc3Vic2xvdCAqZTFfbGluayA9ICZ0cngtPnJzbF9lMV9saW5rOworCXN0cnVjdCBlMWlucF90cyAqc2lnbl90czsKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpyc2xfbGluazsKKwlpbnQgaTsKKworCWlmICghZTFfbGluay0+ZTFfdHMpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogUlNMIExpbmsgKi8KKwlsaW5lID0gZTFpbnBfbGluZV9nZXRfY3JlYXRlKGUxX2xpbmstPmUxX25yKTsKKwlpZiAoIWxpbmUpCisJCXJldHVybiAtRU5PTUVNOworCXNpZ25fdHMgPSAmbGluZS0+dHNbZTFfbGluay0+ZTFfdHMtMV07CisJZTFpbnBfdHNfY29uZmlnKHNpZ25fdHMsIGxpbmUsIEUxSU5QX1RTX1RZUEVfU0lHTik7CisJcnNsX2xpbmsgPSBlMWlucF9zaWduX2xpbmtfY3JlYXRlKHNpZ25fdHMsIEUxSU5QX1NJR05fUlNMLAorCQkJCQkgIHRyeCwgdHJ4LT5yc2xfdGVpLCBTQVBJX1JTTCk7CisJaWYgKCFyc2xfbGluaykKKwkJcmV0dXJuIC1FTk9NRU07CisJaWYgKHRyeC0+cnNsX2xpbmspCisJCWUxaW5wX3NpZ25fbGlua19kZXN0cm95KHRyeC0+cnNsX2xpbmspOworCXRyeC0+cnNsX2xpbmsgPSByc2xfbGluazsKKworCWZvciAoaSA9IDA7IGkgPCBUUlhfTlJfVFM7IGkrKykKKwkJZTFfcmVjb25maWdfdHMoJnRyeC0+dHNbaV0pOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBlMV9yZWNvbmZpZ19idHMoc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmUxX2xpbmsgPSAmYnRzLT5vbWxfZTFfbGluazsKKwlzdHJ1Y3QgZTFpbnBfdHMgKnNpZ25fdHM7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmU7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqb21sX2xpbms7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisKKwlERUJVR1AoRE1JLCAiZTFfcmVjb25maWdfYnRzKCV1KVxuIiwgYnRzLT5ucik7CisKKwlpZiAoIWUxX2xpbmstPmUxX3RzKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCS8qIE9NTCBsaW5rICovCisJbGluZSA9IGUxaW5wX2xpbmVfZ2V0X2NyZWF0ZShlMV9saW5rLT5lMV9ucik7CisJaWYgKCFsaW5lKQorCQlyZXR1cm4gLUVOT01FTTsKKwlzaWduX3RzID0gJmxpbmUtPnRzW2UxX2xpbmstPmUxX3RzLTFdOworCWUxaW5wX3RzX2NvbmZpZyhzaWduX3RzLCBsaW5lLCBFMUlOUF9UU19UWVBFX1NJR04pOworCW9tbF9saW5rID0gZTFpbnBfc2lnbl9saW5rX2NyZWF0ZShzaWduX3RzLCBFMUlOUF9TSUdOX09NTCwKKwkJCQkJICBidHMtPmMwLCBidHMtPm9tbF90ZWksIFNBUElfT01MKTsKKwlpZiAoIW9tbF9saW5rKQorCQlyZXR1cm4gLUVOT01FTTsKKwlpZiAoYnRzLT5vbWxfbGluaykKKwkJZTFpbnBfc2lnbl9saW5rX2Rlc3Ryb3koYnRzLT5vbWxfbGluayk7CisJYnRzLT5vbWxfbGluayA9IG9tbF9saW5rOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJ4LCAmYnRzLT50cnhfbGlzdCwgbGlzdCkKKwkJZTFfcmVjb25maWdfdHJ4KHRyeCk7CisKKwkvKiBub3RpZnkgRTEgaW5wdXQgc29tZXRoaW5nIGhhcyBjaGFuZ2VkICovCisJcmV0dXJuIGUxaW5wX2xpbmVfdXBkYXRlKGxpbmUpOworfQorCisjaWYgMAorLyogZG8gc29tZSBjb21waWxlZC1pbiBjb25maWd1cmF0aW9uIGZvciBvdXIgQlRTL0UxIHNldHVwICovCitpbnQgZTFfY29uZmlnKHN0cnVjdCBnc21fYnRzICpidHMsIGludCBjYXJkbnIsIGludCByZWxlYXNlX2wyKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCXN0cnVjdCBlMWlucF90cyAqc2lnbl90czsKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpvbWxfbGluaywgKnJzbF9saW5rOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gYnRzLT5jMDsKKwlpbnQgYmFzZV90czsKKworCXN3aXRjaCAoYnRzLT5ucikgeworCWNhc2UgMDoKKwkJLyogRmlyc3QgQlRTIHVzZXMgRTEgVFMgMDEsMDIsMDMsMDQsMDUgKi8KKwkJYmFzZV90cyA9IEhBUkRDT0RFRF9CVFMwX1RTIC0gMTsKKwkJYnJlYWs7CisJY2FzZSAxOgorCQkvKiBTZWNvbmQgQlRTIHVzZXMgRTEgVFMgMDYsMDcsMDgsMDksMTAgKi8KKwkJYmFzZV90cyA9IEhBUkRDT0RFRF9CVFMxX1RTIC0gMTsKKwkJYnJlYWs7CisJY2FzZSAyOgorCQkvKiBUaGlyZCBCVFMgdXNlcyBFMSBUUyAxMSwxMiwxMywxNCwxNSAqLworCQliYXNlX3RzID0gSEFSRENPREVEX0JUUzJfVFMgLSAxOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWxpbmUgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBlMWlucF9saW5lKTsKKwlpZiAoIWxpbmUpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogY3JlYXRlIEUxIHRpbWVzbG90cyBmb3Igc2lnbmFsbGluZyBhbmQgVFJBVSBmcmFtZXMgKi8KKwllMWlucF90c19jb25maWcoJmxpbmUtPnRzW2Jhc2VfdHMrMS0xXSwgbGluZSwgRTFJTlBfVFNfVFlQRV9TSUdOKTsKKwllMWlucF90c19jb25maWcoJmxpbmUtPnRzW2Jhc2VfdHMrMi0xXSwgbGluZSwgRTFJTlBfVFNfVFlQRV9UUkFVKTsKKwllMWlucF90c19jb25maWcoJmxpbmUtPnRzW2Jhc2VfdHMrMy0xXSwgbGluZSwgRTFJTlBfVFNfVFlQRV9UUkFVKTsKKworCS8qIGNyZWF0ZSBzaWduYWxsaW5nIGxpbmtzIGZvciBUUzEgKi8KKwlzaWduX3RzID0gJmxpbmUtPnRzW2Jhc2VfdHMrMS0xXTsKKwlvbWxfbGluayA9IGUxaW5wX3NpZ25fbGlua19jcmVhdGUoc2lnbl90cywgRTFJTlBfU0lHTl9PTUwsCisJCQkJCSAgdHJ4LCBURUlfT01MLCBTQVBJX09NTCk7CisJcnNsX2xpbmsgPSBlMWlucF9zaWduX2xpbmtfY3JlYXRlKHNpZ25fdHMsIEUxSU5QX1NJR05fUlNMLAorCQkJCQkgIHRyeCwgVEVJX1JTTCwgU0FQSV9SU0wpOworCisJLyogY3JlYXRlIGJhY2stbGlua3MgZnJvbSBidHMvdHJ4ICovCisJYnRzLT5vbWxfbGluayA9IG9tbF9saW5rOworCXRyeC0+cnNsX2xpbmsgPSByc2xfbGluazsKKworCS8qIGVuYWJsZSBzdWJjaGFubmVsIGRlbXV4ZXIgb24gVFMyICovCisJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrMi0xXS50cmF1LmRlbXV4LCAxKTsKKwlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cysyLTFdLnRyYXUuZGVtdXgsIDIpOworCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzItMV0udHJhdS5kZW11eCwgMyk7CisKKwkvKiBlbmFibGUgc3ViY2hhbm5lbCBkZW11eGVyIG9uIFRTMyAqLworCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzMtMV0udHJhdS5kZW11eCwgMCk7CisJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrMy0xXS50cmF1LmRlbXV4LCAxKTsKKwlzdWJjaF9kZW11eF9hY3RpdmF0ZSgmbGluZS0+dHNbYmFzZV90cyszLTFdLnRyYXUuZGVtdXgsIDIpOworCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzMtMV0udHJhdS5kZW11eCwgMyk7CisKKwl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCAxKTsKKwlpZiAodHJ4KSB7CisJCS8qIGNyZWF0ZSBFMSB0aW1lc2xvdHMgZm9yIFRSQVUgZnJhbWVzIG9mIFRSWDEgKi8KKwkJZTFpbnBfdHNfY29uZmlnKCZsaW5lLT50c1tiYXNlX3RzKzQtMV0sIGxpbmUsIEUxSU5QX1RTX1RZUEVfVFJBVSk7CisJCWUxaW5wX3RzX2NvbmZpZygmbGluZS0+dHNbYmFzZV90cys1LTFdLCBsaW5lLCBFMUlOUF9UU19UWVBFX1RSQVUpOworCisJCS8qIGNyZWF0ZSBSU0wgc2lnbmFsbGluZyBsaW5rIGZvciBUUlgxICovCisJCXNpZ25fdHMgPSAmbGluZS0+dHNbYmFzZV90cysxLTFdOworCQlyc2xfbGluayA9IGUxaW5wX3NpZ25fbGlua19jcmVhdGUoc2lnbl90cywgRTFJTlBfU0lHTl9SU0wsCisJCQkJCSAgdHJ4LCBURUlfUlNMKzEsIFNBUElfUlNMKTsKKwkJLyogY3JlYXRlIGJhY2stbGlua3MgZnJvbSB0cnggKi8KKwkJdHJ4LT5yc2xfbGluayA9IHJzbF9saW5rOworCisJCS8qIGVuYWJsZSBzdWJjaGFubmVsIGRlbXV4ZXIgb24gVFMyICovCisJCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzQtMV0udHJhdS5kZW11eCwgMCk7CisJCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzQtMV0udHJhdS5kZW11eCwgMSk7CisJCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzQtMV0udHJhdS5kZW11eCwgMik7CisJCXN1YmNoX2RlbXV4X2FjdGl2YXRlKCZsaW5lLT50c1tiYXNlX3RzKzQtMV0udHJhdS5kZW11eCwgMyk7CisKKwkJLyogZW5hYmxlIHN1YmNoYW5uZWwgZGVtdXhlciBvbiBUUzMgKi8KKwkJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrNS0xXS50cmF1LmRlbXV4LCAwKTsKKwkJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrNS0xXS50cmF1LmRlbXV4LCAxKTsKKwkJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrNS0xXS50cmF1LmRlbXV4LCAyKTsKKwkJc3ViY2hfZGVtdXhfYWN0aXZhdGUoJmxpbmUtPnRzW2Jhc2VfdHMrNS0xXS50cmF1LmRlbXV4LCAzKTsKKwl9CisKKwlyZXR1cm4gbWlfc2V0dXAoY2FyZG5yLCBsaW5lLCByZWxlYXNlX2wyKTsKK30KKyNlbmRpZgorCisvKiBjb25maWd1cmUgcHNldWRvIEUxIGxpbmUgaW4gaXAuYWNjZXNzIHN0eWxlIGFuZCBjb25uZWN0IHRvIEJUUyAqLworaW50IGlhX2NvbmZpZ19jb25uZWN0KHN0cnVjdCBnc21fYnRzICpidHMsIHN0cnVjdCBzb2NrYWRkcl9pbiAqc2luKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCXN0cnVjdCBlMWlucF90cyAqc2lnbl90cywgKnJzbF90czsKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpvbWxfbGluaywgKnJzbF9saW5rOworCisJbGluZSA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGUxaW5wX2xpbmUpOworCWlmICghbGluZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwkvKiBjcmVhdGUgRTEgdGltZXNsb3RzIGZvciBzaWduYWxsaW5nIGFuZCBUUkFVIGZyYW1lcyAqLworCWUxaW5wX3RzX2NvbmZpZygmbGluZS0+dHNbMS0xXSwgbGluZSwgRTFJTlBfVFNfVFlQRV9TSUdOKTsKKwllMWlucF90c19jb25maWcoJmxpbmUtPnRzWzItMV0sIGxpbmUsIEUxSU5QX1RTX1RZUEVfU0lHTik7CisKKwkvKiBjcmVhdGUgc2lnbmFsbGluZyBsaW5rcyBmb3IgVFMxICovCisJc2lnbl90cyA9ICZsaW5lLT50c1sxLTFdOworCXJzbF90cyA9ICZsaW5lLT50c1syLTFdOworCW9tbF9saW5rID0gZTFpbnBfc2lnbl9saW5rX2NyZWF0ZShzaWduX3RzLCBFMUlOUF9TSUdOX09NTCwKKwkJCQkJICBidHMtPmMwLCAweGZmLCAwKTsKKwlyc2xfbGluayA9IGUxaW5wX3NpZ25fbGlua19jcmVhdGUocnNsX3RzLCBFMUlOUF9TSUdOX1JTTCwKKwkJCQkJICBidHMtPmMwLCAwLCAwKTsKKworCS8qIGNyZWF0ZSBiYWNrLWxpbmtzIGZyb20gYnRzL3RyeCAqLworCWJ0cy0+b21sX2xpbmsgPSBvbWxfbGluazsKKwlidHMtPmMwLT5yc2xfbGluayA9IHJzbF9saW5rOworCisJLyogZGVmYXVsdCBwb3J0IGF0IEJUUyBmb3IgaW5jb21pbmcgY29ubmVjdGlvbnMgaXMgMzAwNiAqLworCWlmIChzaW4tPnNpbl9wb3J0ID09IDApCisJCXNpbi0+c2luX3BvcnQgPSBodG9ucygzMDA2KTsKKworCXJldHVybiBpcGFjY2Vzc19jb25uZWN0KGxpbmUsIHNpbik7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9lMV9pbnB1dC5jIGIvb3BlbmJzYy9zcmMvZTFfaW5wdXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjAzNTljCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZTFfaW5wdXQuYwpAQCAtMCwwICsxLDU1NSBAQAorLyogT3BlbkJTQyBBYmlzIGludGVyZmFjZSB0byBFMSAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy9mY250bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKyNpbmNsdWRlIDxtSVNETmlmLmg+CisKKy8vI2RlZmluZSBBRl9DT01QQVRJQklMSVRZX0ZVTkMKKy8vI2luY2x1ZGUgPGNvbXBhdF9hZl9pc2RuLmg+CisjaWZuZGVmIEFGX0lTRE4KKyNkZWZpbmUgQUZfSVNETiAzNAorI2RlZmluZSBQRl9JU0ROIEFGX0lTRE4KKyNlbmRpZgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9lMV9pbnB1dC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9saW51eGxpc3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3N1YmNoYW5fZGVtdXguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYXVfZnJhbWUuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYXVfbXV4Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21pc2RuLmg+CisKKyNkZWZpbmUgTlVNX0UxX1RTCTMyCisKKy8qIGxpc3Qgb2YgYWxsIEUxIGRyaXZlcnMgKi8KK0xMSVNUX0hFQUQoZTFpbnBfZHJpdmVyX2xpc3QpOworCisvKiBsaXN0IG9mIGFsbCBFMSBsaW5lcyAqLworTExJU1RfSEVBRChlMWlucF9saW5lX2xpc3QpOworCitzdGF0aWMgdm9pZCAqdGFsbF9zaWdsX2N0eDsKKworLyogdG8gYmUgaW1wbGVtZW50ZWQsIGUuZy4gYnkgYnNjX2hhY2suYyAqLwordm9pZCBpbnB1dF9ldmVudChpbnQgZXZlbnQsIGVudW0gZTFpbnBfc2lnbl90eXBlIHR5cGUsIHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KTsKKworLyoKKyAqIHBjYXAgd3JpdGluZyBvZiB0aGUgbWlzZG4gbG9hZAorICogcGNhcCBmb3JtYXQgaXMgZnJvbSBodHRwOi8vd2lraS53aXJlc2hhcmsub3JnL0RldmVsb3BtZW50L0xpYnBjYXBGaWxlRm9ybWF0CisgKi8KKyNkZWZpbmUgRExUX0xJTlVYX0xBUEQJCTE3NworI2RlZmluZSBQQ0FQX0lOUFVUCQkwCisjZGVmaW5lIFBDQVBfT1VUUFVUCQkxCisKK3N0cnVjdCBwY2FwX2hkciB7CisJdV9pbnQzMl90IG1hZ2ljX251bWJlcjsKKwl1X2ludDE2X3QgdmVyc2lvbl9tYWpvcjsKKwl1X2ludDE2X3QgdmVyc2lvbl9taW5vcjsKKwlpbnQzMl90ICB0aGlzem9uZTsKKwl1X2ludDMyX3Qgc2lnZmlnczsKKwl1X2ludDMyX3Qgc25hcGxlbjsKKwl1X2ludDMyX3QgbmV0d29yazsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBwY2FwcmVjX2hkciB7CisJdV9pbnQzMl90IHRzX3NlYzsKKwl1X2ludDMyX3QgdHNfdXNlYzsKKwl1X2ludDMyX3QgaW5jbF9sZW47CisJdV9pbnQzMl90IG9yaWdfbGVuOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGZha2VfbGludXhfbGFwZF9oZWFkZXIgeworICAgICAgICB1X2ludDE2X3QgcGt0dHlwZTsKKwl1X2ludDE2X3QgaGF0eXBlOworCXVfaW50MTZfdCBoYWxlbjsKKwl1X2ludDY0X3QgYWRkcjsKKwlpbnQxNl90IHByb3RvY29sOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IGxhcGRfaGVhZGVyIHsKKwl1X2ludDhfdCBlYTEgOiAxOworCXVfaW50OF90IGNyIDogMTsKKwl1X2ludDhfdCBzYXBpIDogNjsKKwl1X2ludDhfdCBlYTIgOiAxOworCXVfaW50OF90IHRlaSA6IDc7CisJdV9pbnQ4X3QgY29udHJvbF9mb287IC8qIGZha2UgVU0ncyAuLi4gKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0YXRpY19hc3NlcnQoKGludCkmKChzdHJ1Y3QgZmFrZV9saW51eF9sYXBkX2hlYWRlciopTlVMTCktPmhhdHlwZSA9PSAyLAloYXR5cGVfb2Zmc2V0KTsKK3N0YXRpY19hc3NlcnQoKGludCkmKChzdHJ1Y3QgZmFrZV9saW51eF9sYXBkX2hlYWRlciopTlVMTCktPmhhbGVuID09IDQsCQloYWxlbl9vZmZzZXQpOworc3RhdGljX2Fzc2VydCgoaW50KSYoKHN0cnVjdCBmYWtlX2xpbnV4X2xhcGRfaGVhZGVyKilOVUxMKS0+YWRkciA9PSA2LAkJYWRkcl9vZmZzZXQpOworc3RhdGljX2Fzc2VydCgoaW50KSYoKHN0cnVjdCBmYWtlX2xpbnV4X2xhcGRfaGVhZGVyKilOVUxMKS0+cHJvdG9jb2wgPT0gMTQsCXByb3RvX29mZnNldCk7CitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgZmFrZV9saW51eF9sYXBkX2hlYWRlcikgPT0gMTYsCQkJbGFwZF9oZWFkZXJfc2l6ZSk7CisKKworc3RhdGljIGludCBwY2FwX2ZkID0gLTE7CisKK3ZvaWQgZTFfc2V0X3BjYXBfZmQoaW50IGZkKQoreworCWludCByZXQ7CisJc3RydWN0IHBjYXBfaGRyIGhlYWRlciA9IHsKKwkJLm1hZ2ljX251bWJlcgk9IDB4YTFiMmMzZDQsCisJCS52ZXJzaW9uX21ham9yCT0gMiwKKwkJLnZlcnNpb25fbWlub3IJPSA0LAorCQkudGhpc3pvbmUJPSAwLAorCQkuc2lnZmlncwk9IDAsCisJCS5zbmFwbGVuCT0gNjU1MzUsCisJCS5uZXR3b3JrCT0gRExUX0xJTlVYX0xBUEQsCisJfTsKKworCXBjYXBfZmQgPSBmZDsKKwlyZXQgPSB3cml0ZShwY2FwX2ZkLCAmaGVhZGVyLCBzaXplb2YoaGVhZGVyKSk7Cit9CisKKy8qIFRoaXMgY3VycmVudGx5IG9ubHkgd29ya3MgZm9yIHRoZSBELUNoYW5uZWwgKi8KK3N0YXRpYyB2b2lkIHdyaXRlX3BjYXBfcGFja2V0KGludCBkaXJlY3Rpb24sIGludCBzYXBpLCBpbnQgdGVpLAorCQkJICAgICAgc3RydWN0IG1zZ2IgKm1zZykgeworCWlmIChwY2FwX2ZkIDwgMCkKKwkJcmV0dXJuOworCisJaW50IHJldDsKKwl0aW1lX3QgY3VyX3RpbWU7CisJc3RydWN0IHRtICp0bTsKKwlpbnQgbWlfaGVhZCA9IChkaXJlY3Rpb249PVBDQVBfSU5QVVQpID8gTUlTRE5fSEVBREVSX0xFTiA6IDA7CisKKwlzdHJ1Y3QgZmFrZV9saW51eF9sYXBkX2hlYWRlciBoZWFkZXIgPSB7CisJCS5wa3R0eXBlCT0gNCwKKwkJLmhhdHlwZQkJPSAwLAorCQkuaGFsZW4JCT0gMCwKKwkJLmFkZHIJCT0gZGlyZWN0aW9uID09IFBDQVBfT1VUUFVUID8gMHgwIDogMHgxLAorCQkucHJvdG9jb2wJPSBudG9ocyg0OCksCisJfTsKKworCXN0cnVjdCBsYXBkX2hlYWRlciBsYXBkX2hlYWRlciA9IHsKKwkJLmVhMQkJPSAwLAorCQkuY3IJCT0gZGlyZWN0aW9uID09IFBDQVBfT1VUUFVUID8gMSA6IDAsCisJCS5zYXBpCQk9IHNhcGkgJiAweDNGLAorCQkuZWEyCQk9IDEsCisJCS50ZWkJCT0gdGVpICYgMHg3RiwKKwkJLmNvbnRyb2xfZm9vCT0gMHgwMyAvKiBVSSAqLywKKwl9OwkKKworCXN0cnVjdCBwY2FwcmVjX2hkciBwYXlsb2FkX2hlYWRlciA9IHsKKwkJLnRzX3NlYwkgICAgPSAwLAorCQkudHNfdXNlYyAgICA9IDAsCisJCS5pbmNsX2xlbiAgID0gbXNnLT5sZW4gKyBzaXplb2Yoc3RydWN0IGZha2VfbGludXhfbGFwZF9oZWFkZXIpCisJCQkJKyBzaXplb2Yoc3RydWN0IGxhcGRfaGVhZGVyKQorCQkJCS0gbWlfaGVhZCwKKwkJLm9yaWdfbGVuICAgPSBtc2ctPmxlbiArIHNpemVvZihzdHJ1Y3QgZmFrZV9saW51eF9sYXBkX2hlYWRlcikKKwkJCQkrIHNpemVvZihzdHJ1Y3QgbGFwZF9oZWFkZXIpCisJCQkJLSBtaV9oZWFkLAorCX07CisKKworCWN1cl90aW1lID0gdGltZShOVUxMKTsKKwl0bSA9IGxvY2FsdGltZSgmY3VyX3RpbWUpOworCXBheWxvYWRfaGVhZGVyLnRzX3NlYyA9IG1rdGltZSh0bSk7CisKKwlyZXQgPSB3cml0ZShwY2FwX2ZkLCAmcGF5bG9hZF9oZWFkZXIsIHNpemVvZihwYXlsb2FkX2hlYWRlcikpOworCXJldCA9IHdyaXRlKHBjYXBfZmQsICZoZWFkZXIsIHNpemVvZihoZWFkZXIpKTsKKwlyZXQgPSB3cml0ZShwY2FwX2ZkLCAmbGFwZF9oZWFkZXIsIHNpemVvZihsYXBkX2hlYWRlcikpOworCXJldCA9IHdyaXRlKHBjYXBfZmQsIG1zZy0+ZGF0YSArIG1pX2hlYWQsCisJCQltc2ctPmxlbiAtIG1pX2hlYWQpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqc2lnbl90eXBlc1tdID0geworCVtFMUlOUF9TSUdOX05PTkVdCT0gIk5vbmUiLAorCVtFMUlOUF9TSUdOX09NTF0JPSAiT01MIiwKKwlbRTFJTlBfU0lHTl9SU0xdCT0gIlJTTCIsCit9OworY29uc3QgY2hhciAqZTFpbnBfc2lnbnR5cGVfbmFtZShlbnVtIGUxaW5wX3NpZ25fdHlwZSB0cCkKK3sKKwlpZiAodHAgPj0gQVJSQVlfU0laRShzaWduX3R5cGVzKSkKKwkJcmV0dXJuICJ1bmRlZmluZWQiOworCXJldHVybiBzaWduX3R5cGVzW3RwXTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKnRzX3R5cGVzW10gPSB7CisJW0UxSU5QX1RTX1RZUEVfTk9ORV0JPSAiTm9uZSIsCisJW0UxSU5QX1RTX1RZUEVfU0lHTl0JPSAiU2lnbmFsbGluZyIsCisJW0UxSU5QX1RTX1RZUEVfVFJBVV0JPSAiVFJBVSIsCit9OworCitjb25zdCBjaGFyICplMWlucF90c3R5cGVfbmFtZShlbnVtIGUxaW5wX3RzX3R5cGUgdHApCit7CisJaWYgKHRwID49IEFSUkFZX1NJWkUodHNfdHlwZXMpKQorCQlyZXR1cm4gInVuZGVmaW5lZCI7CisJcmV0dXJuIHRzX3R5cGVzW3RwXTsKK30KKworLyogY2FsbGJhY2sgd2hlbiBhIFRSQVUgZnJhbWUgd2FzIHJlY2VpdmVkICovCitzdGF0aWMgaW50IHN1YmNoX2NiKHN0cnVjdCBzdWJjaF9kZW11eCAqZG14LCBpbnQgY2gsIHVfaW50OF90ICpkYXRhLCBpbnQgbGVuLAorCQkgICAgdm9pZCAqX3ByaXYpCit7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSBfcHJpdjsKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3Qgc3JjX3NzOworCisJc3JjX3NzLmUxX25yID0gZTFpX3RzLT5saW5lLT5udW07CisJc3JjX3NzLmUxX3RzID0gZTFpX3RzLT5udW07CisJc3JjX3NzLmUxX3RzX3NzID0gY2g7CisKKwlyZXR1cm4gdHJhdV9tdXhfaW5wdXQoJnNyY19zcywgZGF0YSwgbGVuKTsKK30KKworaW50IGFiaXNfcnNsX3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpzaWduX2xpbms7CisJc3RydWN0IGUxaW5wX2RyaXZlciAqZTFpbnBfZHJpdmVyOworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzOworCisJbXNnLT5sMmggPSBtc2ctPmRhdGE7CisKKwlpZiAoIW1zZy0+dHJ4KSB7CisJCUxPR1AoRFJTTCwgTE9HTF9FUlJPUiwgInJzbF9zZW5kbXNnOiBtc2ctPnRyeCA9PSBOVUxMOiAlc1xuIiwKKwkJCWhleGR1bXAobXNnLT5kYXRhLCBtc2ctPmxlbikpOworCQl0YWxsb2NfZnJlZShtc2cpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9IGVsc2UgaWYgKCFtc2ctPnRyeC0+cnNsX2xpbmspIHsKKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAicnNsX3NlbmRtc2c6IG1zZy0+dHJ4LT5yc2xfbGluayA9PSBOVUxMOiAlc1xuIiwKKwkJCWhleGR1bXAobXNnLT5kYXRhLCBtc2ctPmxlbikpOworCQl0YWxsb2NfZnJlZShtc2cpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlzaWduX2xpbmsgPSBtc2ctPnRyeC0+cnNsX2xpbms7CisJZTFpX3RzID0gc2lnbl9saW5rLT50czsKKwlpZiAoIWJzY190aW1lcl9wZW5kaW5nKCZlMWlfdHMtPnNpZ24udHhfdGltZXIpKSB7CisJCS8qIG5vdGlmeSB0aGUgZHJpdmVyIHdlIGhhdmUgc29tZXRoaW5nIHRvIHdyaXRlICovCisJCWUxaW5wX2RyaXZlciA9IHNpZ25fbGluay0+dHMtPmxpbmUtPmRyaXZlcjsKKwkJZTFpbnBfZHJpdmVyLT53YW50X3dyaXRlKGUxaV90cyk7CisJfQorCW1zZ2JfZW5xdWV1ZSgmc2lnbl9saW5rLT50eF9saXN0LCBtc2cpOworCisJLyogZHVtcCBpdCAqLworCXdyaXRlX3BjYXBfcGFja2V0KFBDQVBfT1VUUFVULCBzaWduX2xpbmstPnNhcGksIHNpZ25fbGluay0+dGVpLCBtc2cpOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBfYWJpc19ubV9zZW5kbXNnKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGUxaW5wX3NpZ25fbGluayAqc2lnbl9saW5rOworCXN0cnVjdCBlMWlucF9kcml2ZXIgKmUxaW5wX2RyaXZlcjsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90czsKKworCW1zZy0+bDJoID0gbXNnLT5kYXRhOworCisJaWYgKCFtc2ctPnRyeCB8fCAhbXNnLT50cngtPmJ0cyB8fCAhbXNnLT50cngtPmJ0cy0+b21sX2xpbmspIHsKKwkJTE9HUChEUlNMLCBMT0dMX0VSUk9SLCAibm1fc2VuZG1zZzogbXNnLT50cnggPT0gTlVMTFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXNpZ25fbGluayA9IG1zZy0+dHJ4LT5idHMtPm9tbF9saW5rOworCWUxaV90cyA9IHNpZ25fbGluay0+dHM7CisJaWYgKCFic2NfdGltZXJfcGVuZGluZygmZTFpX3RzLT5zaWduLnR4X3RpbWVyKSkgeworCQkvKiBub3RpZnkgdGhlIGRyaXZlciB3ZSBoYXZlIHNvbWV0aGluZyB0byB3cml0ZSAqLworCQllMWlucF9kcml2ZXIgPSBzaWduX2xpbmstPnRzLT5saW5lLT5kcml2ZXI7CisJCWUxaW5wX2RyaXZlci0+d2FudF93cml0ZShlMWlfdHMpOworCX0KKwltc2diX2VucXVldWUoJnNpZ25fbGluay0+dHhfbGlzdCwgbXNnKTsKKworCS8qIGR1bXAgaXQgKi8KKwl3cml0ZV9wY2FwX3BhY2tldChQQ0FQX09VVFBVVCwgc2lnbl9saW5rLT5zYXBpLCBzaWduX2xpbmstPnRlaSwgbXNnKTsKKworCXJldHVybiAwOworfQorCisvKiBUaW1lc2xvdCAqLworCisvKiBjb25maWd1cmUgYW5kIGluaXRpYWxpemUgb25lIGUxaW5wX3RzICovCitpbnQgZTFpbnBfdHNfY29uZmlnKHN0cnVjdCBlMWlucF90cyAqdHMsIHN0cnVjdCBlMWlucF9saW5lICpsaW5lLAorCQkgICAgZW51bSBlMWlucF90c190eXBlIHR5cGUpCit7CisJaWYgKHRzLT50eXBlID09IHR5cGUgJiYgdHMtPmxpbmUgJiYgbGluZSkKKwkJcmV0dXJuIDA7CisKKwl0cy0+dHlwZSA9IHR5cGU7CisJdHMtPmxpbmUgPSBsaW5lOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBFMUlOUF9UU19UWVBFX1NJR046CisJCUlOSVRfTExJU1RfSEVBRCgmdHMtPnNpZ24uc2lnbl9saW5rcyk7CisJCWJyZWFrOworCWNhc2UgRTFJTlBfVFNfVFlQRV9UUkFVOgorCQlzdWJjaGFuX211eF9pbml0KCZ0cy0+dHJhdS5tdXgpOworCQl0cy0+dHJhdS5kZW11eC5vdXRfY2IgPSBzdWJjaF9jYjsKKwkJdHMtPnRyYXUuZGVtdXguZGF0YSA9IHRzOworCQlzdWJjaF9kZW11eF9pbml0KCZ0cy0+dHJhdS5kZW11eCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE1JLCBMT0dMX0VSUk9SLCAidW5zdXBwb3J0ZWQgRTEgdGltZXNsb3QgdHlwZSAldVxuIiwKKwkJCXRzLT50eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGUxaW5wX2xpbmUgKmUxaW5wX2xpbmVfZ2V0KHVfaW50OF90IGUxX25yKQoreworCXN0cnVjdCBlMWlucF9saW5lICplMWlfbGluZTsKKworCS8qIGl0ZXJhdGUgb3ZlciBnbG9iYWwgbGlzdCBvZiBlMSBsaW5lcyAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGUxaV9saW5lLCAmZTFpbnBfbGluZV9saXN0LCBsaXN0KSB7CisJCWlmIChlMWlfbGluZS0+bnVtID09IGUxX25yKQorCQkJcmV0dXJuIGUxaV9saW5lOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGUxaW5wX2xpbmUgKmUxaW5wX2xpbmVfZ2V0X2NyZWF0ZSh1X2ludDhfdCBlMV9ucikKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKwlpbnQgaTsKKworCWxpbmUgPSBlMWlucF9saW5lX2dldChlMV9ucik7CisJaWYgKGxpbmUpCisJCXJldHVybiBsaW5lOworCisJbGluZSA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGUxaW5wX2xpbmUpOworCWlmICghbGluZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlsaW5lLT5udW0gPSBlMV9ucjsKKwlmb3IgKGkgPSAwOyBpIDwgTlVNX0UxX1RTOyBpKyspIHsKKwkJbGluZS0+dHNbaV0ubnVtID0gaSsxOworCQlsaW5lLT50c1tpXS5saW5lID0gbGluZTsKKwl9CisJbGxpc3RfYWRkX3RhaWwoJmxpbmUtPmxpc3QsICZlMWlucF9saW5lX2xpc3QpOworCisJcmV0dXJuIGxpbmU7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZTFpbnBfdHMgKmUxaW5wX3RzX2dldCh1X2ludDhfdCBlMV9uciwgdV9pbnQ4X3QgdHNfbnIpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmUxaV9saW5lOworCisJZTFpX2xpbmUgPSBlMWlucF9saW5lX2dldChlMV9ucik7CisJaWYgKCFlMWlfbGluZSkKKwkJcmV0dXJuIE5VTEw7CisKKwlyZXR1cm4gJmUxaV9saW5lLT50c1t0c19uci0xXTsKK30KKworc3RydWN0IHN1YmNoX211eCAqZTFpbnBfZ2V0X211eCh1X2ludDhfdCBlMV9uciwgdV9pbnQ4X3QgdHNfbnIpCit7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSBlMWlucF90c19nZXQoZTFfbnIsIHRzX25yKTsKKworCWlmICghZTFpX3RzKQorCQlyZXR1cm4gTlVMTDsKKworCXJldHVybiAmZTFpX3RzLT50cmF1Lm11eDsKK30KKworLyogU2lnbmFsbGluZyBMaW5rICovCisKK3N0cnVjdCBlMWlucF9zaWduX2xpbmsgKmUxaW5wX2xvb2t1cF9zaWduX2xpbmsoc3RydWN0IGUxaW5wX3RzICplMWksCisJCQkJCSAJdV9pbnQ4X3QgdGVpLCB1X2ludDhfdCBzYXBpKQoreworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKmxpbms7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShsaW5rLCAmZTFpLT5zaWduLnNpZ25fbGlua3MsIGxpc3QpIHsKKwkJaWYgKGxpbmstPnNhcGkgPT0gc2FwaSAmJiBsaW5rLT50ZWkgPT0gdGVpKQorCQkJcmV0dXJuIGxpbms7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIGNyZWF0ZSBhIG5ldyBzaWduYWxsaW5nIGxpbmsgaW4gYSBFMSB0aW1lc2xvdCAqLworCitzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICoKK2UxaW5wX3NpZ25fbGlua19jcmVhdGUoc3RydWN0IGUxaW5wX3RzICp0cywgZW51bSBlMWlucF9zaWduX3R5cGUgdHlwZSwKKwkJCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4LCB1X2ludDhfdCB0ZWksCisJCQl1X2ludDhfdCBzYXBpKQoreworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKmxpbms7CisKKwlpZiAodHMtPnR5cGUgIT0gRTFJTlBfVFNfVFlQRV9TSUdOKQorCQlyZXR1cm4gTlVMTDsKKworCWxpbmsgPSB0YWxsb2NfemVybyh0YWxsX3NpZ2xfY3R4LCBzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rKTsKKwlpZiAoIWxpbmspCisJCXJldHVybiBOVUxMOworCisJbGluay0+dHMgPSB0czsKKwlsaW5rLT50eXBlID0gdHlwZTsKKwlJTklUX0xMSVNUX0hFQUQoJmxpbmstPnR4X2xpc3QpOworCWxpbmstPnRyeCA9IHRyeDsKKwlsaW5rLT50ZWkgPSB0ZWk7CisJbGluay0+c2FwaSA9IHNhcGk7CisKKwlsbGlzdF9hZGRfdGFpbCgmbGluay0+bGlzdCwgJnRzLT5zaWduLnNpZ25fbGlua3MpOworCisJcmV0dXJuIGxpbms7Cit9CisKK3ZvaWQgZTFpbnBfc2lnbl9saW5rX2Rlc3Ryb3koc3RydWN0IGUxaW5wX3NpZ25fbGluayAqbGluaykKK3sKKwlsbGlzdF9kZWwoJmxpbmstPmxpc3QpOworCXRhbGxvY19mcmVlKGxpbmspOworfQorCisvKiB0aGUgRTEgZHJpdmVyIHRlbGxzIHVzIGhlIGhhcyByZWNlaXZlZCBzb21ldGhpbmcgb24gYSBUUyAqLworaW50IGUxaW5wX3J4X3RzKHN0cnVjdCBlMWlucF90cyAqdHMsIHN0cnVjdCBtc2diICptc2csCisJCXVfaW50OF90IHRlaSwgdV9pbnQ4X3Qgc2FwaSkKK3sKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpsaW5rOworCWludCByZXQ7CisKKwlzd2l0Y2ggKHRzLT50eXBlKSB7CisJY2FzZSBFMUlOUF9UU19UWVBFX1NJR046CisJCS8qIGNvbnN1bHQgdGhlIGxpc3Qgb2Ygc2lnbmFsbGluZyBsaW5rcyAqLworCQl3cml0ZV9wY2FwX3BhY2tldChQQ0FQX0lOUFVULCBzYXBpLCB0ZWksIG1zZyk7CisJCWxpbmsgPSBlMWlucF9sb29rdXBfc2lnbl9saW5rKHRzLCB0ZWksIHNhcGkpOworCQlpZiAoIWxpbmspIHsKKwkJCUxPR1AoRE1JLCBMT0dMX0VSUk9SLCAiZGlkbid0IGZpbmQgc2lnbmFsbGluZyBsaW5rIGZvciAiCisJCQkJInRlaSAlZCwgc2FwaSAlZFxuIiwgdGVpLCBzYXBpKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJZGVidWdfc2V0X2NvbnRleHQoQlNDX0NUWF9CVFMsIGxpbmstPnRyeC0+YnRzKTsKKwkJc3dpdGNoIChsaW5rLT50eXBlKSB7CisJCWNhc2UgRTFJTlBfU0lHTl9PTUw6CisJCQltc2ctPnRyeCA9IGxpbmstPnRyeDsKKwkJCXJldCA9IGFiaXNfbm1fcmN2bXNnKG1zZyk7CisJCQlicmVhazsKKwkJY2FzZSBFMUlOUF9TSUdOX1JTTDoKKwkJCW1zZy0+dHJ4ID0gbGluay0+dHJ4OworCQkJcmV0ID0gYWJpc19yc2xfcmN2bXNnKG1zZyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCXJldCA9IC1FSU5WQUw7CisJCQlMT0dQKERNSSwgTE9HTF9FUlJPUiwgInVua25vd24gbGluayB0eXBlICV1XG4iLCBsaW5rLT50eXBlKTsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWNhc2UgRTFJTlBfVFNfVFlQRV9UUkFVOgorCQlyZXQgPSBzdWJjaF9kZW11eF9pbigmdHMtPnRyYXUuZGVtdXgsIG1zZy0+bDJoLCBtc2diX2wybGVuKG1zZykpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXQgPSAtRUlOVkFMOworCQlMT0dQKERNSSwgTE9HTF9FUlJPUiwgInVua25vd24gVFMgdHlwZSAldVxuIiwgdHMtPnR5cGUpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFRTWF9BTExPQ19TSVpFIDQwOTYKKworLyogY2FsbGVkIGJ5IGRyaXZlciBpZiBpdCB3YW50cyB0byB0cmFuc21pdCBvbiBhIGdpdmVuIFRTICovCitzdHJ1Y3QgbXNnYiAqZTFpbnBfdHhfdHMoc3RydWN0IGUxaW5wX3RzICplMWlfdHMsCisJCQkgc3RydWN0IGUxaW5wX3NpZ25fbGluayAqKnNpZ25fbGluaykKK3sKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpsaW5rOworCXN0cnVjdCBtc2diICptc2cgPSBOVUxMOworCWludCBsZW47CisKKwlzd2l0Y2ggKGUxaV90cy0+dHlwZSkgeworCWNhc2UgRTFJTlBfVFNfVFlQRV9TSUdOOgorCQkvKiBGSVhNRTogaW1wbGVtZW50IHRoaXMgcm91bmQgcm9iaW4gKi8KKwkJbGxpc3RfZm9yX2VhY2hfZW50cnkobGluaywgJmUxaV90cy0+c2lnbi5zaWduX2xpbmtzLCBsaXN0KSB7CisJCQltc2cgPSBtc2diX2RlcXVldWUoJmxpbmstPnR4X2xpc3QpOworCQkJaWYgKG1zZykgeworCQkJCWlmIChzaWduX2xpbmspCisJCQkJCSpzaWduX2xpbmsgPSBsaW5rOworCQkJCWJyZWFrOworCQkJfQorCQl9CisJCWJyZWFrOworCWNhc2UgRTFJTlBfVFNfVFlQRV9UUkFVOgorCQltc2cgPSBtc2diX2FsbG9jKFRTWF9BTExPQ19TSVpFLCAiVFJBVV9UWCIpOworCQlpZiAoIW1zZykKKwkJCXJldHVybiBOVUxMOworCQlsZW4gPSBzdWJjaGFuX211eF9vdXQoJmUxaV90cy0+dHJhdS5tdXgsIG1zZy0+ZGF0YSwgNDApOworCQltc2diX3B1dChtc2csIDQwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETUksIExPR0xfRVJST1IsICJ1bnN1cHBvcnRlZCBFMSBUUyB0eXBlICV1XG4iLCBlMWlfdHMtPnR5cGUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIG1zZzsKK30KKworLyogY2FsbGVkIGJ5IGRyaXZlciBpbiBjYXNlIHNvbWUga2luZCBvZiBsaW5rIHN0YXRlIGV2ZW50ICovCitpbnQgZTFpbnBfZXZlbnQoc3RydWN0IGUxaW5wX3RzICp0cywgaW50IGV2dCwgdV9pbnQ4X3QgdGVpLCB1X2ludDhfdCBzYXBpKQoreworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKmxpbms7CisKKwlsaW5rID0gZTFpbnBfbG9va3VwX3NpZ25fbGluayh0cywgdGVpLCBzYXBpKTsKKwlpZiAoIWxpbmspCisJCXJldHVybiAtRUlOVkFMOworCisJLyogRklYTUU6IHJlcG9ydCBmdXJ0aGVyIHVwd2FyZHMgKi8KKwlpbnB1dF9ldmVudChldnQsIGxpbmstPnR5cGUsIGxpbmstPnRyeCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHJlZ2lzdGVyIGEgZHJpdmVyIHdpdGggdGhlIEUxIGNvcmUgKi8KK2ludCBlMWlucF9kcml2ZXJfcmVnaXN0ZXIoc3RydWN0IGUxaW5wX2RyaXZlciAqZHJ2KQoreworCWxsaXN0X2FkZF90YWlsKCZkcnYtPmxpc3QsICZlMWlucF9kcml2ZXJfbGlzdCk7CisJcmV0dXJuIDA7Cit9CisKK2ludCBlMWlucF9saW5lX3VwZGF0ZShzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSkKK3sKKwlyZXR1cm4gbWlfZTFfbGluZV91cGRhdGUobGluZSk7Cit9CisKK3N0YXRpYyBpbnQgZTFpX3NpZ19jYih1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkgICAgICB2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCWlmIChzdWJzeXMgIT0gU1NfR0xPQkFMIHx8CisJICAgIHNpZ25hbCAhPSBTX0dMT0JBTF9TSFVURE9XTikKKwkJcmV0dXJuIDA7CisKKwlpZiAocGNhcF9mZCkgeworCQljbG9zZShwY2FwX2ZkKTsKKwkJcGNhcF9mZCA9IC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSB2b2lkIG9uX2Rzb19sb2FkX2UxX2lucCh2b2lkKQoreworCXRhbGxfc2lnbF9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAxLAorCQkJCQkgICAiZTFpbnBfc2lnbl9saW5rIik7CisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfR0xPQkFMLCBlMWlfc2lnX2NiLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dzbV8wNF8wOC5jIGIvb3BlbmJzYy9zcmMvZ3NtXzA0XzA4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmI5MGFlMwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2dzbV8wNF8wOC5jCkBAIC0wLDAgKzEsMjkyMCBAQAorLyogR1NNIE1vYmlsZSBSYWRpbyBJbnRlcmZhY2UgTGF5ZXIgMyBtZXNzYWdlcyBvbiB0aGUgQS1iaXMgaW50ZXJmYWNlIAorICogM0dQUCBUUyAwNC4wOCB2ZXJzaW9uIDcuMjEuMCBSZWxlYXNlIDE5OTggLyBFVFNJIFRTIDEwMCA5NDAgVjcuMjEuMCAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOCwgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9kYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9iaXR2ZWMuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8xMS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvY2hhbl9hbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcGFnaW5nLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYXVfZnJhbWUuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYXVfbXV4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9ydHBfcHJveHkuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc200OC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhbnNhY3Rpb24uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3Vzc2QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpbGVudF9jYWxsLmg+CisKK3ZvaWQgKnRhbGxfbG9jb3BfY3R4OworCitpbnQgZ3NtMDQwOF9sb2NfdXBkX2FjYyhzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQzMl90IHRtc2kpOworc3RhdGljIGludCBnc200OF90eF9zaW1wbGUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sCisJCQkgICB1X2ludDhfdCBwZGlzYywgdV9pbnQ4X3QgbXNnX3R5cGUpOworc3RhdGljIHZvaWQgc2NoZWR1bGVfcmVqZWN0KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKTsKKworc3RydWN0IGdzbV9sYWkgeworCXVfaW50MTZfdCBtY2M7CisJdV9pbnQxNl90IG1uYzsKKwl1X2ludDE2X3QgbGFjOworfTsKKworc3RhdGljIHVfaW50MzJfdCBuZXdfY2FsbHJlZiA9IDB4ODAwMDAwMDE7CisKK3N0YXRpYyBpbnQgYXV0aG9yaXplX3N1YnNjcmliZXIoc3RydWN0IGdzbV9sb2NfdXBkYXRpbmdfb3BlcmF0aW9uICpsb2MsCisJCQkJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JpYmVyKQoreworCWlmICghc3Vic2NyaWJlcikKKwkJcmV0dXJuIDA7CisKKwkvKgorCSAqIERvIG5vdCBzZW5kIGFjY2VwdCB5ZXQgYXMgbW9yZSBpbmZvcm1hdGlvbiBzaG91bGQgYXJyaXZlLiBTb21lCisJICogcGhvbmVzIHdpbGwgbm90IHNlbmQgdXMgdGhlIGluZm9ybWF0aW9uIGFuZCB3ZSB3aWxsIGhhdmUgdG8gY2hlY2sKKwkgKiB3aGF0IHdlIHdhbnQgdG8gZG8gd2l0aCB0aGF0LgorCSAqLworCWlmIChsb2MgJiYgKGxvYy0+d2FpdGluZ19mb3JfaW1zaSB8fCBsb2MtPndhaXRpbmdfZm9yX2ltZWkpKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoc3Vic2NyaWJlci0+bmV0LT5hdXRoX3BvbGljeSkgeworCWNhc2UgR1NNX0FVVEhfUE9MSUNZX0NMT1NFRDoKKwkJcmV0dXJuIHN1YnNjcmliZXItPmF1dGhvcml6ZWQ7CisJY2FzZSBHU01fQVVUSF9QT0xJQ1lfVE9LRU46CisJCWlmIChzdWJzY3JpYmVyLT5hdXRob3JpemVkKQorCQkJcmV0dXJuIHN1YnNjcmliZXItPmF1dGhvcml6ZWQ7CisJCXJldHVybiAoc3Vic2NyaWJlci0+ZmxhZ3MgJiBHU01fU1VCU0NSSUJFUl9GSVJTVF9DT05UQUNUKTsKKwljYXNlIEdTTV9BVVRIX1BPTElDWV9BQ0NFUFRfQUxMOgorCQlyZXR1cm4gMTsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9Cit9CisKK3N0YXRpYyB2b2lkIHJlbGVhc2VfbG9jX3VwZGF0aW5nX3JlcShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlpZiAoIWxjaGFuLT5sb2Nfb3BlcmF0aW9uKQorCQlyZXR1cm47CisKKwlic2NfZGVsX3RpbWVyKCZsY2hhbi0+bG9jX29wZXJhdGlvbi0+dXBkYXRpbmdfdGltZXIpOworCXRhbGxvY19mcmVlKGxjaGFuLT5sb2Nfb3BlcmF0aW9uKTsKKwlsY2hhbi0+bG9jX29wZXJhdGlvbiA9IDA7CisJcHV0X2xjaGFuKGxjaGFuKTsKK30KKworc3RhdGljIHZvaWQgYWxsb2NhdGVfbG9jX3VwZGF0aW5nX3JlcShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwl1c2VfbGNoYW4obGNoYW4pOworCXJlbGVhc2VfbG9jX3VwZGF0aW5nX3JlcShsY2hhbik7CisKKwlsY2hhbi0+bG9jX29wZXJhdGlvbiA9IHRhbGxvY196ZXJvKHRhbGxfbG9jb3BfY3R4LAorCQkJCQkgICBzdHJ1Y3QgZ3NtX2xvY191cGRhdGluZ19vcGVyYXRpb24pOworfQorCitzdGF0aWMgaW50IGdzbTA0MDhfYXV0aG9yaXplKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCWlmIChhdXRob3JpemVfc3Vic2NyaWJlcihsY2hhbi0+bG9jX29wZXJhdGlvbiwgbGNoYW4tPnN1YnNjcikpIHsKKwkJaW50IHJjOworCisJCWRiX3N1YnNjcmliZXJfYWxsb2NfdG1zaShsY2hhbi0+c3Vic2NyKTsKKwkJcmVsZWFzZV9sb2NfdXBkYXRpbmdfcmVxKGxjaGFuKTsKKwkJcmMgPSBnc20wNDA4X2xvY191cGRfYWNjKG1zZy0+bGNoYW4sIGxjaGFuLT5zdWJzY3ItPnRtc2kpOworCQlpZiAobGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yay0+c2VuZF9tbV9pbmZvKSB7CisJCQkvKiBzZW5kIE1NIElORk8gd2l0aCBuZXR3b3JrIG5hbWUgKi8KKwkJCXJjID0gZ3NtNDhfdHhfbW1faW5mbyhtc2ctPmxjaGFuKTsKKwkJfQorCisJCS8qIGNhbGwgc3Vic2NyX3VwZGF0ZSBhZnRlciBwdXR0aW5nIHRoZSBsb2NfdXBkX2FjYworCQkgKiBpbiB0aGUgdHJhbnNtaXQgcXVldWUsIHNpbmNlIFNfU1VCU0NSX0FUVEFDSEVEIG1pZ2h0CisJCSAqIHRyaWdnZXIgZnVydGhlciBhY3Rpb24gbGlrZSBTTVMgZGVsaXZlcnkgKi8KKwkJc3Vic2NyX3VwZGF0ZShsY2hhbi0+c3Vic2NyLCBtc2ctPnRyeC0+YnRzLAorCQkJICAgICAgR1NNX1NVQlNDUklCRVJfVVBEQVRFX0FUVEFDSEVEKTsKKwkJLyogdHJ5IHRvIGNsb3NlIGNoYW5uZWwgQVNBUCAqLworCQlsY2hhbl9hdXRvX3JlbGVhc2UobGNoYW4pOworCQlyZXR1cm4gcmM7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3NtMDQwOF9oYW5kbGVfbGNoYW5fc2lnbmFsKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsCisJCQkJCXZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpCit7CisJc3RydWN0IGdzbV90cmFucyAqdHJhbnMsICp0ZW1wOworCisJaWYgKHN1YnN5cyAhPSBTU19MQ0hBTiB8fCBzaWduYWwgIT0gU19MQ0hBTl9VTkVYUEVDVEVEX1JFTEVBU0UpCisJCXJldHVybiAwOworCisJLyoKKwkgKiBDYW5jZWwgYW55IG91dHN0YW5kaW5nIGxvY2F0aW9uIHVwZGF0aW5nIHJlcXVlc3QKKwkgKiBvcGVyYXRpb24gdGFraW5nIHBsYWNlIG9uIHRoZSBsY2hhbi4KKwkgKi8KKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IChzdHJ1Y3QgZ3NtX2xjaGFuICopc2lnbmFsX2RhdGE7CisJaWYgKCFsY2hhbikKKwkJcmV0dXJuIDA7CisKKwlyZWxlYXNlX2xvY191cGRhdGluZ19yZXEobGNoYW4pOworCisJLyogRnJlZSBhbGwgdHJhbnNhY3Rpb25zIHRoYXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgcmVsZWFzZWQgbGNoYW4gKi8KKwkvKiBGSVhNRTogdGhpcyBpcyBub3QgbmVjY2Vzc2FyaWx5IHRoZSByaWdodCB0aGluZyB0byBkbywgd2Ugc2hvdWxkCisJICogb25seSBzZXQgdHJhbnMtPmxjaGFuIHRvIE5VTEwgYW5kIHdhaXQgZm9yIGFub3RoZXIgbGNoYW4gdG8gYmUKKwkgKiBlc3RhYmxpc2hlZCB0byB0aGUgc2FtZSBNTSBlbnRpdHkgKHBob25lL3N1YnNjcmliZXIpICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZSh0cmFucywgdGVtcCwgJmxjaGFuLT50cy0+dHJ4LT5idHMtPm5ldHdvcmstPnRyYW5zX2xpc3QsIGVudHJ5KSB7CisJCWlmICh0cmFucy0+bGNoYW4gPT0gbGNoYW4pCisJCQl0cmFuc19mcmVlKHRyYW5zKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogQ2hhcHRlciA5LjIuMTQgOiBTZW5kIExPQ0FUSU9OIFVQREFUSU5HIFJFSkVDVCAqLworaW50IGdzbTA0MDhfbG9jX3VwZF9yZWooc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGNhdXNlKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSBsY2hhbi0+dHMtPnRyeC0+YnRzOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisJCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpICsgMSk7CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfTU07CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfTU1fTE9DX1VQRF9SRUpFQ1Q7CisJZ2gtPmRhdGFbMF0gPSBjYXVzZTsKKworCUxPR1AoRE1NLCBMT0dMX0lORk8sICJTdWJzY3JpYmVyICVzOiBMT0NBVElPTiBVUERBVElORyBSRUpFQ1QgIgorCSAgICAgIkxBQz0ldSBCVFM9JXVcbiIsIGxjaGFuLT5zdWJzY3IgPworCSAgICAgCQkJc3Vic2NyX25hbWUobGNoYW4tPnN1YnNjcikgOiAidW5rbm93biIsCisJICAgICBsY2hhbi0+dHMtPnRyeC0+YnRzLT5sb2NhdGlvbl9hcmVhX2NvZGUsIGxjaGFuLT50cy0+dHJ4LT5idHMtPm5yKTsKKworCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMubG9jX3VwZF9yZXNwLnJlamVjdCk7CisJCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKK30KKworLyogQ2hhcHRlciA5LjIuMTMgOiBTZW5kIExPQ0FUSU9OIFVQREFURSBBQ0NFUFQgKi8KK2ludCBnc20wNDA4X2xvY191cGRfYWNjKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDMyX3QgdG1zaSkKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbGNoYW4tPnRzLT50cngtPmJ0czsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCXN0cnVjdCBnc200OF9sb2NfYXJlYV9pZCAqbGFpOworCXVfaW50OF90ICptaWQ7CisJCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19NTTsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9NTV9MT0NfVVBEX0FDQ0VQVDsKKworCWxhaSA9IChzdHJ1Y3QgZ3NtNDhfbG9jX2FyZWFfaWQgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmxhaSkpOworCWdzbTQ4X2dlbmVyYXRlX2xhaShsYWksIGJ0cy0+bmV0d29yay0+Y291bnRyeV9jb2RlLAorCQkgICAgIGJ0cy0+bmV0d29yay0+bmV0d29ya19jb2RlLCBidHMtPmxvY2F0aW9uX2FyZWFfY29kZSk7CisKKwltaWQgPSBtc2diX3B1dChtc2csIEdTTTQ4X01JRF9UTVNJX0xFTik7CisJZ3NtNDhfZ2VuZXJhdGVfbWlkX2Zyb21fdG1zaShtaWQsIHRtc2kpOworCisJREVCVUdQKERNTSwgIi0+IExPQ0FUSU9OIFVQREFURSBBQ0NFUFRcbiIpOworCisJY291bnRlcl9pbmMoYnRzLT5uZXR3b3JrLT5zdGF0cy5sb2NfdXBkX3Jlc3AuYWNjZXB0KTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CisKKy8qIFRyYW5zbWl0IENoYXB0ZXIgOS4yLjEwIElkZW50aXR5IFJlcXVlc3QgKi8KK3N0YXRpYyBpbnQgbW1fdHhfaWRlbnRpdHlfcmVxKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBpZF90eXBlKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisKKwltc2ctPmxjaGFuID0gbGNoYW47CisKKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkgKyAxKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19NTTsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9NTV9JRF9SRVE7CisJZ2gtPmRhdGFbMF0gPSBpZF90eXBlOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKK30KKworCisvKiBQYXJzZSBDaGFwdGVyIDkuMi4xMSBJZGVudGl0eSBSZXNwb25zZSAqLworc3RhdGljIGludCBtbV9yeF9pZF9yZXNwKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOworCXN0cnVjdCBnc21fYnRzICpidHMgPSBsY2hhbi0+dHMtPnRyeC0+YnRzOworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gYnRzLT5uZXR3b3JrOworCXVfaW50OF90IG1pX3R5cGUgPSBnaC0+ZGF0YVsxXSAmIEdTTV9NSV9UWVBFX01BU0s7CisJY2hhciBtaV9zdHJpbmdbR1NNNDhfTUlfU0laRV07CisKKwlnc200OF9taV90b19zdHJpbmcobWlfc3RyaW5nLCBzaXplb2YobWlfc3RyaW5nKSwgJmdoLT5kYXRhWzFdLCBnaC0+ZGF0YVswXSk7CisJREVCVUdQKERNTSwgIklERU5USVRZIFJFU1BPTlNFOiBtaV90eXBlPTB4JTAyeCBNSSglcylcbiIsCisJCW1pX3R5cGUsIG1pX3N0cmluZyk7CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfU1VCU0NSLCBTX1NVQlNDUl9JREVOVElUWSwgZ2gtPmRhdGEpOworCisJc3dpdGNoIChtaV90eXBlKSB7CisJY2FzZSBHU01fTUlfVFlQRV9JTVNJOgorCQkvKiBsb29rIHVwIHN1YnNjcmliZXIgYmFzZWQgb24gSU1TSSwgY3JlYXRlIGlmIG5vdCBmb3VuZCAqLworCQlpZiAoIWxjaGFuLT5zdWJzY3IpIHsKKwkJCWxjaGFuLT5zdWJzY3IgPSBzdWJzY3JfZ2V0X2J5X2ltc2kobmV0LCBtaV9zdHJpbmcpOworCQkJaWYgKCFsY2hhbi0+c3Vic2NyKQorCQkJCWxjaGFuLT5zdWJzY3IgPSBkYl9jcmVhdGVfc3Vic2NyaWJlcihuZXQsIG1pX3N0cmluZyk7CisJCX0KKwkJaWYgKGxjaGFuLT5sb2Nfb3BlcmF0aW9uKQorCQkJbGNoYW4tPmxvY19vcGVyYXRpb24tPndhaXRpbmdfZm9yX2ltc2kgPSAwOworCQlicmVhazsKKwljYXNlIEdTTV9NSV9UWVBFX0lNRUk6CisJY2FzZSBHU01fTUlfVFlQRV9JTUVJU1Y6CisJCS8qIHVwZGF0ZSBzdWJzY3JpYmUgPC0+IElNRUkgbWFwcGluZyAqLworCQlpZiAobGNoYW4tPnN1YnNjcikgeworCQkJZGJfc3Vic2NyaWJlcl9hc3NvY19pbWVpKGxjaGFuLT5zdWJzY3IsIG1pX3N0cmluZyk7CisJCQlkYl9zeW5jX2VxdWlwbWVudCgmbGNoYW4tPnN1YnNjci0+ZXF1aXBtZW50KTsKKwkJfQorCQlpZiAobGNoYW4tPmxvY19vcGVyYXRpb24pCisJCQlsY2hhbi0+bG9jX29wZXJhdGlvbi0+d2FpdGluZ19mb3JfaW1laSA9IDA7CisJCWJyZWFrOworCX0KKworCS8qIENoZWNrIGlmIHdlIGNhbiBsZXQgdGhlIG1vYmlsZSBzdGF0aW9uIGVudGVyICovCisJcmV0dXJuIGdzbTA0MDhfYXV0aG9yaXplKGxjaGFuLCBtc2cpOworfQorCisKK3N0YXRpYyB2b2lkIGxvY191cGRfcmVqX2NiKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBkYXRhOworCXN0cnVjdCBnc21fYnRzICpidHMgPSBsY2hhbi0+dHMtPnRyeC0+YnRzOworCisJcmVsZWFzZV9sb2NfdXBkYXRpbmdfcmVxKGxjaGFuKTsKKwlnc20wNDA4X2xvY191cGRfcmVqKGxjaGFuLCBidHMtPm5ldHdvcmstPnJlamVjdF9jYXVzZSk7CisJbGNoYW5fYXV0b19yZWxlYXNlKGxjaGFuKTsKK30KKworc3RhdGljIHZvaWQgc2NoZWR1bGVfcmVqZWN0KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCWxjaGFuLT5sb2Nfb3BlcmF0aW9uLT51cGRhdGluZ190aW1lci5jYiA9IGxvY191cGRfcmVqX2NiOworCWxjaGFuLT5sb2Nfb3BlcmF0aW9uLT51cGRhdGluZ190aW1lci5kYXRhID0gbGNoYW47CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZsY2hhbi0+bG9jX29wZXJhdGlvbi0+dXBkYXRpbmdfdGltZXIsIDUsIDApOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqbHVwZF9uYW1lKHVfaW50OF90IHR5cGUpCit7CisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBHU000OF9MVVBEX05PUk1BTDoKKwkJcmV0dXJuICJOT1JNQUwiOworCWNhc2UgR1NNNDhfTFVQRF9QRVJJT0RJQzoKKwkJcmV0dXJuICJQRVJPSURPQyI7CisJY2FzZSBHU000OF9MVVBEX0lNU0lfQVRUOgorCQlyZXR1cm4gIklNU0kgQVRUQUNIIjsKKwlkZWZhdWx0OgorCQlyZXR1cm4gIlVOS05PV04iOworCX0KK30KKworLyogQ2hhcHRlciA5LjIuMTU6IFJlY2VpdmUgTG9jYXRpb24gVXBkYXRpbmcgUmVxdWVzdCAqLworc3RhdGljIGludCBtbV9yeF9sb2NfdXBkX3JlcShzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXN0cnVjdCBnc200OF9sb2NfdXBkX3JlcSAqbHU7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSBOVUxMOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gbXNnLT5sY2hhbjsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbGNoYW4tPnRzLT50cngtPmJ0czsKKwl1X2ludDhfdCBtaV90eXBlOworCWNoYXIgbWlfc3RyaW5nW0dTTTQ4X01JX1NJWkVdOworCWludCByYzsKKworIAlsdSA9IChzdHJ1Y3QgZ3NtNDhfbG9jX3VwZF9yZXEgKikgZ2gtPmRhdGE7CisKKwltaV90eXBlID0gbHUtPm1pWzBdICYgR1NNX01JX1RZUEVfTUFTSzsKKworCWdzbTQ4X21pX3RvX3N0cmluZyhtaV9zdHJpbmcsIHNpemVvZihtaV9zdHJpbmcpLCBsdS0+bWksIGx1LT5taV9sZW4pOworCisJREVCVUdQQyhETU0sICJtaV90eXBlPTB4JTAyeCBNSSglcykgdHlwZT0lcyAiLCBtaV90eXBlLCBtaV9zdHJpbmcsCisJCWx1cGRfbmFtZShsdS0+dHlwZSkpOworCisJZGlzcGF0Y2hfc2lnbmFsKFNTX1NVQlNDUiwgU19TVUJTQ1JfSURFTlRJVFksICZsdS0+bWlfbGVuKTsKKworCXN3aXRjaCAobHUtPnR5cGUpIHsKKwljYXNlIEdTTTQ4X0xVUERfTk9STUFMOgorCQljb3VudGVyX2luYyhidHMtPm5ldHdvcmstPnN0YXRzLmxvY191cGRfdHlwZS5ub3JtYWwpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X0xVUERfSU1TSV9BVFQ6CisJCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMubG9jX3VwZF90eXBlLmF0dGFjaCk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTFVQRF9QRVJJT0RJQzoKKwkJY291bnRlcl9pbmMoYnRzLT5uZXR3b3JrLT5zdGF0cy5sb2NfdXBkX3R5cGUucGVyaW9kaWMpOworCQlicmVhazsKKwl9CisKKwkvKgorCSAqIFBzZXVkbyBTcG9vZiBkZXRlY3Rpb246IEp1c3QgZHJvcCBhIHNlY29uZC9jb25jdXJyZW50CisJICogbG9jYXRpb24gdXBkYXRpbmcgcmVxdWVzdC4KKwkgKi8KKwlpZiAobGNoYW4tPmxvY19vcGVyYXRpb24pIHsKKwkJREVCVUdQQyhETU0sICJpZ25vcmluZyByZXF1ZXN0IGR1ZSBhbiBleGlzdGluZyBvbmU6ICVwLlxuIiwKKwkJCWxjaGFuLT5sb2Nfb3BlcmF0aW9uKTsKKwkJZ3NtMDQwOF9sb2NfdXBkX3JlaihsY2hhbiwgR1NNNDhfUkVKRUNUX1BST1RPQ09MX0VSUk9SKTsKKwkJcmV0dXJuIDA7CisJfQorCisJYWxsb2NhdGVfbG9jX3VwZGF0aW5nX3JlcShsY2hhbik7CisKKwlzd2l0Y2ggKG1pX3R5cGUpIHsKKwljYXNlIEdTTV9NSV9UWVBFX0lNU0k6CisJCURFQlVHUEMoRE1NLCAiXG4iKTsKKwkJLyogd2UgYWx3YXlzIHdhbnQgdGhlIElNRUksIHRvbyAqLworCQlyYyA9IG1tX3R4X2lkZW50aXR5X3JlcShsY2hhbiwgR1NNX01JX1RZUEVfSU1FSSk7CisJCWxjaGFuLT5sb2Nfb3BlcmF0aW9uLT53YWl0aW5nX2Zvcl9pbWVpID0gMTsKKworCQkvKiBsb29rIHVwIHN1YnNjcmliZXIgYmFzZWQgb24gSU1TSSwgY3JlYXRlIGlmIG5vdCBmb3VuZCAqLworCQlzdWJzY3IgPSBzdWJzY3JfZ2V0X2J5X2ltc2koYnRzLT5uZXR3b3JrLCBtaV9zdHJpbmcpOworCQlpZiAoIXN1YnNjcikgeworCQkJc3Vic2NyID0gZGJfY3JlYXRlX3N1YnNjcmliZXIoYnRzLT5uZXR3b3JrLCBtaV9zdHJpbmcpOworCQl9CisJCWJyZWFrOworCWNhc2UgR1NNX01JX1RZUEVfVE1TSToKKwkJREVCVUdQQyhETU0sICJcbiIpOworCQkvKiB3ZSBhbHdheXMgd2FudCB0aGUgSU1FSSwgdG9vICovCisJCXJjID0gbW1fdHhfaWRlbnRpdHlfcmVxKGxjaGFuLCBHU01fTUlfVFlQRV9JTUVJKTsKKwkJbGNoYW4tPmxvY19vcGVyYXRpb24tPndhaXRpbmdfZm9yX2ltZWkgPSAxOworCisJCS8qIGxvb2sgdXAgdGhlIHN1YnNjcmliZXIgYmFzZWQgb24gVE1TSSwgcmVxdWVzdCBJTVNJIGlmIGl0IGZhaWxzICovCisJCXN1YnNjciA9IHN1YnNjcl9nZXRfYnlfdG1zaShidHMtPm5ldHdvcmssCisJCQkJCSAgICB0bXNpX2Zyb21fc3RyaW5nKG1pX3N0cmluZykpOworCQlpZiAoIXN1YnNjcikgeworCQkJLyogc2VuZCBJREVOVElUWSBSRVFVRVNUIG1lc3NhZ2UgdG8gZ2V0IElNU0kgKi8KKwkJCXJjID0gbW1fdHhfaWRlbnRpdHlfcmVxKGxjaGFuLCBHU01fTUlfVFlQRV9JTVNJKTsKKwkJCWxjaGFuLT5sb2Nfb3BlcmF0aW9uLT53YWl0aW5nX2Zvcl9pbXNpID0gMTsKKwkJfQorCQlicmVhazsKKwljYXNlIEdTTV9NSV9UWVBFX0lNRUk6CisJY2FzZSBHU01fTUlfVFlQRV9JTUVJU1Y6CisJCS8qIG5vIHNpbSBjYXJkLi4uIEZJWE1FOiB3aGF0IHRvIGRvID8gKi8KKwkJREVCVUdQQyhETU0sICJ1bmltcGxlbWVudGVkIG1vYmlsZSBpZGVudGl0eSB0eXBlXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoJCisJCURFQlVHUEMoRE1NLCAidW5rbm93biBtb2JpbGUgaWRlbnRpdHkgdHlwZVxuIik7CisJCWJyZWFrOworCX0KKworCS8qIHNjaGVkdWxlIHRoZSByZWplY3QgdGltZXIgKi8KKwlzY2hlZHVsZV9yZWplY3QobGNoYW4pOworCisJaWYgKCFzdWJzY3IpIHsKKwkJREVCVUdQQyhEUlIsICI8LSBDYW4ndCBmaW5kIGFueSBzdWJzY3JpYmVyIGZvciB0aGlzIElEXG4iKTsKKwkJLyogRklYTUU6IHJlcXVlc3QgaWQ/IGNsb3NlIGNoYW5uZWw/ICovCisJCXJldHVybiAtRUlOVkFMOworCX0KKworCWxjaGFuLT5zdWJzY3IgPSBzdWJzY3I7CisJbGNoYW4tPnN1YnNjci0+ZXF1aXBtZW50LmNsYXNzbWFyazEgPSBsdS0+Y2xhc3NtYXJrMTsKKworCS8qIGNoZWNrIGlmIHdlIGNhbiBsZXQgdGhlIHN1YnNjcmliZXIgaW50byBvdXIgbmV0d29yayBpbW1lZGlhdGVseQorCSAqIG9yIGlmIHdlIG5lZWQgdG8gd2FpdCBmb3IgaWRlbnRpdHkgcmVzcG9uc2VzLiAqLworCXJldHVybiBnc20wNDA4X2F1dGhvcml6ZShsY2hhbiwgbXNnKTsKK30KKworI2lmIDAKK3N0YXRpYyB1X2ludDhfdCB0b19iY2Q4KHVfaW50OF90IHZhbCkKK3sKKyAgICAgICByZXR1cm4gKCh2YWwgLyAxMCkgPDwgNCkgfCAodmFsICUgMTApOworfQorI2VuZGlmCisKKy8qIFNlY3Rpb24gOS4yLjE1YSAqLworaW50IGdzbTQ4X3R4X21tX2luZm8oc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaDsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGxjaGFuLT50cy0+dHJ4LT5idHMtPm5ldHdvcms7CisJdV9pbnQ4X3QgKnB0cjg7CisJaW50IG5hbWVfbGVuLCBuYW1lX3BhZDsKKyNpZiAwCisJdGltZV90IGN1cl90OworCXN0cnVjdCB0bSogY3VyX3RpbWU7CisJaW50IHR6MTVtaW47CisjZW5kaWYKKworCW1zZy0+bGNoYW4gPSBsY2hhbjsKKworCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfTU07CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfTU1fSU5GTzsKKworCWlmIChuZXQtPm5hbWVfbG9uZykgeworI2lmIDAKKwkJbmFtZV9sZW4gPSBzdHJsZW4obmV0LT5uYW1lX2xvbmcpOworCQkvKiAxMC41LjMuNWEgKi8KKwkJcHRyOCA9IG1zZ2JfcHV0KG1zZywgMyk7CisJCXB0cjhbMF0gPSBHU000OF9JRV9OQU1FX0xPTkc7CisJCXB0cjhbMV0gPSBuYW1lX2xlbioyICsxOworCQlwdHI4WzJdID0gMHg5MDsgLyogVUNTMiwgbm8gc3BhcmUgYml0cywgbm8gQ0kgKi8KKworCQlwdHIxNiA9ICh1X2ludDE2X3QgKikgbXNnYl9wdXQobXNnLCBuYW1lX2xlbioyKTsKKwkJZm9yIChpID0gMDsgaSA8IG5hbWVfbGVuOyBpKyspCisJCQlwdHIxNltpXSA9IGh0b25zKG5ldC0+bmFtZV9sb25nW2ldKTsKKworCQkvKiBGSVhNRTogVXNlIENlbGwgQnJvYWRjYXN0LCBub3QgVUNTLTIsIHNpbmNlCisJCSAqIFVDUy0yIGlzIG9ubHkgc3VwcG9ydGVkIGJ5IGxhdGVyIHJldmlzaW9ucyBvZiB0aGUgc3BlYyAqLworI2VuZGlmCisJCW5hbWVfbGVuID0gKHN0cmxlbihuZXQtPm5hbWVfbG9uZykqNykvODsKKwkJbmFtZV9wYWQgPSAoOCAtIHN0cmxlbihuZXQtPm5hbWVfbG9uZykqNyklODsKKwkJaWYgKG5hbWVfcGFkID4gMCkKKwkJCW5hbWVfbGVuKys7CisJCS8qIDEwLjUuMy41YSAqLworCQlwdHI4ID0gbXNnYl9wdXQobXNnLCAzKTsKKwkJcHRyOFswXSA9IEdTTTQ4X0lFX05BTUVfTE9ORzsKKwkJcHRyOFsxXSA9IG5hbWVfbGVuICsxOworCQlwdHI4WzJdID0gMHg4MCB8IG5hbWVfcGFkOyAvKiBDZWxsIEJyb2FkY2FzdCBEQ1MsIG5vIENJICovCisKKwkJcHRyOCA9IG1zZ2JfcHV0KG1zZywgbmFtZV9sZW4pOworCQlnc21fN2JpdF9lbmNvZGUocHRyOCwgbmV0LT5uYW1lX2xvbmcpOworCisJfQorCisJaWYgKG5ldC0+bmFtZV9zaG9ydCkgeworI2lmIDAKKwkJbmFtZV9sZW4gPSBzdHJsZW4obmV0LT5uYW1lX3Nob3J0KTsKKwkJLyogMTAuNS4zLjVhICovCisJCXB0cjggPSAodV9pbnQ4X3QgKikgbXNnYl9wdXQobXNnLCAzKTsKKwkJcHRyOFswXSA9IEdTTTQ4X0lFX05BTUVfU0hPUlQ7CisJCXB0cjhbMV0gPSBuYW1lX2xlbioyICsgMTsKKwkJcHRyOFsyXSA9IDB4OTA7IC8qIFVDUzIsIG5vIHNwYXJlIGJpdHMsIG5vIENJICovCisKKwkJcHRyMTYgPSAodV9pbnQxNl90ICopIG1zZ2JfcHV0KG1zZywgbmFtZV9sZW4qMik7CisJCWZvciAoaSA9IDA7IGkgPCBuYW1lX2xlbjsgaSsrKQorCQkJcHRyMTZbaV0gPSBodG9ucyhuZXQtPm5hbWVfc2hvcnRbaV0pOworI2VuZGlmCisJCW5hbWVfbGVuID0gKHN0cmxlbihuZXQtPm5hbWVfc2hvcnQpKjcpLzg7CisJCW5hbWVfcGFkID0gKDggLSBzdHJsZW4obmV0LT5uYW1lX3Nob3J0KSo3KSU4OworCQlpZiAobmFtZV9wYWQgPiAwKQorCQkJbmFtZV9sZW4rKzsKKwkJLyogMTAuNS4zLjVhICovCisJCXB0cjggPSAodV9pbnQ4X3QgKikgbXNnYl9wdXQobXNnLCAzKTsKKwkJcHRyOFswXSA9IEdTTTQ4X0lFX05BTUVfU0hPUlQ7CisJCXB0cjhbMV0gPSBuYW1lX2xlbiArMTsKKwkJcHRyOFsyXSA9IDB4ODAgfCBuYW1lX3BhZDsgLyogQ2VsbCBCcm9hZGNhc3QgRENTLCBubyBDSSAqLworCisJCXB0cjggPSBtc2diX3B1dChtc2csIG5hbWVfbGVuKTsKKwkJZ3NtXzdiaXRfZW5jb2RlKHB0cjgsIG5ldC0+bmFtZV9zaG9ydCk7CisKKwl9CisKKyNpZiAwCisJLyogU2VjdGlvbiAxMC41LjMuOSAqLworCWN1cl90ID0gdGltZShOVUxMKTsKKwljdXJfdGltZSA9IGdtdGltZSgmY3VyX3QpOworCXB0cjggPSBtc2diX3B1dChtc2csIDgpOworCXB0cjhbMF0gPSBHU000OF9JRV9ORVRfVElNRV9UWjsKKwlwdHI4WzFdID0gdG9fYmNkOChjdXJfdGltZS0+dG1feWVhciAlIDEwMCk7CisJcHRyOFsyXSA9IHRvX2JjZDgoY3VyX3RpbWUtPnRtX21vbik7CisJcHRyOFszXSA9IHRvX2JjZDgoY3VyX3RpbWUtPnRtX21kYXkpOworCXB0cjhbNF0gPSB0b19iY2Q4KGN1cl90aW1lLT50bV9ob3VyKTsKKwlwdHI4WzVdID0gdG9fYmNkOChjdXJfdGltZS0+dG1fbWluKTsKKwlwdHI4WzZdID0gdG9fYmNkOChjdXJfdGltZS0+dG1fc2VjKTsKKwkvKiAwMi40MjogY29kZWQgYXMgQkNEIGVuY29kZWQgc2lnbmVkIHZhbHVlIGluIHVuaXRzIG9mIDE1IG1pbnV0ZXMgKi8KKwl0ejE1bWluID0gKGN1cl90aW1lLT50bV9nbXRvZmYpLyg2MCoxNSk7CisJcHRyOFs3XSA9IHRvX2JjZDgodHoxNW1pbik7CisJaWYgKHR6MTVtaW4gPCAwKQorCQlwdHI4WzddIHw9IDB4ODA7CisjZW5kaWYKKworCURFQlVHUChETU0sICItPiBNTSBJTkZPXG4iKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CisKKy8qIFNlY3Rpb24gOS4yLjIgKi8KK2ludCBnc200OF90eF9tbV9hdXRoX3JlcShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgKnJhbmQsIGludCBrZXlfc2VxKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKwlzdHJ1Y3QgZ3NtNDhfYXV0aF9yZXEgKmFyID0gKHN0cnVjdCBnc200OF9hdXRoX3JlcSAqKSBtc2diX3B1dChtc2csIHNpemVvZigqYXIpKTsKKworCURFQlVHUChETU0sICItPiBBVVRIIFJFUSAocmFuZCA9ICVzKVxuIiwgaGV4ZHVtcChyYW5kLCAxNikpOworCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX01NOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX01NX0FVVEhfUkVROworCisJYXItPmtleV9zZXEgPSBrZXlfc2VxOworCisJLyogMTYgYnl0ZXMgUkFORCBwYXJhbWV0ZXJzICovCisJaWYgKHJhbmQpCisJCW1lbWNweShhci0+cmFuZCwgcmFuZCwgMTYpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKK30KKworLyogU2VjdGlvbiA5LjIuMSAqLworaW50IGdzbTQ4X3R4X21tX2F1dGhfcmVqKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCURFQlVHUChETU0sICItPiBBVVRIIFJFSkVDVFxuIik7CisJcmV0dXJuIGdzbTQ4X3R4X3NpbXBsZShsY2hhbiwgR1NNNDhfUERJU0NfTU0sIEdTTTQ4X01UX01NX0FVVEhfUkVKKTsKK30KKworc3RhdGljIGludCBnc200OF90eF9tbV9zZXJ2X2FjayhzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlERUJVR1AoRE1NLCAiLT4gQ00gU0VSVklDRSBBQ0tcbiIpOworCXJldHVybiBnc200OF90eF9zaW1wbGUobGNoYW4sIEdTTTQ4X1BESVNDX01NLCBHU000OF9NVF9NTV9DTV9TRVJWX0FDQyk7Cit9CisKKy8qIDkuMi42IENNIHNlcnZpY2UgcmVqZWN0ICovCitzdGF0aWMgaW50IGdzbTQ4X3R4X21tX3NlcnZfcmVqKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLAorCQkJCWVudW0gZ3NtNDhfcmVqZWN0X3ZhbHVlIHZhbHVlKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisKKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkgKyAxKTsKKworCW1zZy0+bGNoYW4gPSBsY2hhbjsKKwl1c2VfbGNoYW4obGNoYW4pOworCisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfTU07CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfTU1fQ01fU0VSVl9SRUo7CisJZ2gtPmRhdGFbMF0gPSB2YWx1ZTsKKwlERUJVR1AoRE1NLCAiLT4gQ00gU0VSVklDRSBSZWplY3QgY2F1c2U6ICVkXG4iLCB2YWx1ZSk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworfQorCisvKgorICogSGFuZGxlIENNIFNlcnZpY2UgUmVxdWVzdHMKKyAqIGEpIFZlcmlmeSB0aGF0IHRoZSBwYWNrZXQgaXMgbG9uZyBlbm91Z2ggdG8gY29udGFpbiB0aGUgaW5mb3JtYXRpb24KKyAqICAgIHdlIHJlcXVpcmUgb3RoZXJ3c2llIHJlamVjdCB3aXRoIElOQ09SUkVDVF9NRVNTQUdFCisgKiBiKSBUcnkgdG8gcGFyc2UgdGhlIFRNU0kuIElmIHdlIGRvIG5vdCBoYXZlIG9uZSByZWplY3QKKyAqIGMpIENoZWNrIHRoYXQgd2Uga25vdyB0aGUgc3Vic2NyaWJlciB3aXRoIHRoZSBUTVNJIG90aGVyd2lzZSByZWplY3QKKyAqICAgIHdpdGggYSBITFIgY2F1c2UKKyAqIGQpIFNldCB0aGUgc3Vic2NyaWJlciBvbiB0aGUgZ3NtX2xjaGFuIGFuZCBhY2NlcHQKKyAqLworc3RhdGljIGludCBnc200OF9yeF9tbV9zZXJ2X3JlcShzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXVfaW50OF90IG1pX3R5cGU7CisJY2hhciBtaV9zdHJpbmdbR1NNNDhfTUlfU0laRV07CisKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbXNnLT5sY2hhbi0+dHMtPnRyeC0+YnRzOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXN0cnVjdCBnc200OF9zZXJ2aWNlX3JlcXVlc3QgKnJlcSA9CisJCQkoc3RydWN0IGdzbTQ4X3NlcnZpY2VfcmVxdWVzdCAqKWdoLT5kYXRhOworCS8qIHVuZm9ydHVuYXRlbHkgaW4gUGhhc2UxIHRoZSBjbGFzc21hcjIgbGVuZ3RoIGlzIHZhcmlhYmxlICovCisJdV9pbnQ4X3QgY2xhc3NtYXJrMl9sZW4gPSBnaC0+ZGF0YVsxXTsKKwl1X2ludDhfdCAqY2xhc3NtYXJrMiA9IGdoLT5kYXRhKzI7CisJdV9pbnQ4X3QgbWlfbGVuID0gKihjbGFzc21hcmsyICsgY2xhc3NtYXJrMl9sZW4pOworCXVfaW50OF90ICptaSA9IChjbGFzc21hcmsyICsgY2xhc3NtYXJrMl9sZW4gKyAxKTsKKworCURFQlVHUChETU0sICI8LSBDTSBTRVJWSUNFIFJFUVVFU1QgIik7CisJaWYgKG1zZy0+ZGF0YV9sZW4gPCBzaXplb2Yoc3RydWN0IGdzbTQ4X3NlcnZpY2VfcmVxdWVzdCopKSB7CisJCURFQlVHUEMoRE1NLCAid3Jvbmcgc2l6ZWQgbWVzc2FnZVxuIik7CisJCXJldHVybiBnc200OF90eF9tbV9zZXJ2X3Jlaihtc2ctPmxjaGFuLAorCQkJCQkgICAgR1NNNDhfUkVKRUNUX0lOQ09SUkVDVF9NRVNTQUdFKTsKKwl9CisKKwlpZiAobXNnLT5kYXRhX2xlbiA8IHJlcS0+bWlfbGVuICsgNikgeworCQlERUJVR1BDKERNTSwgImRvZXMgbm90IGZpdCBpbiBwYWNrZXRcbiIpOworCQlyZXR1cm4gZ3NtNDhfdHhfbW1fc2Vydl9yZWoobXNnLT5sY2hhbiwKKwkJCQkJICAgIEdTTTQ4X1JFSkVDVF9JTkNPUlJFQ1RfTUVTU0FHRSk7CisJfQorCisJbWlfdHlwZSA9IG1pWzBdICYgR1NNX01JX1RZUEVfTUFTSzsKKwlpZiAobWlfdHlwZSAhPSBHU01fTUlfVFlQRV9UTVNJKSB7CisJCURFQlVHUEMoRE1NLCAibWlfdHlwZSBpcyBub3QgVE1TSTogJWRcbiIsIG1pX3R5cGUpOworCQlyZXR1cm4gZ3NtNDhfdHhfbW1fc2Vydl9yZWoobXNnLT5sY2hhbiwKKwkJCQkJICAgIEdTTTQ4X1JFSkVDVF9JTkNPUlJFQ1RfTUVTU0FHRSk7CisJfQorCisJZ3NtNDhfbWlfdG9fc3RyaW5nKG1pX3N0cmluZywgc2l6ZW9mKG1pX3N0cmluZyksIG1pLCBtaV9sZW4pOworCURFQlVHUEMoRE1NLCAic2Vydl90eXBlPTB4JTAyeCBtaV90eXBlPTB4JTAyeCBNKCVzKVxuIiwKKwkJcmVxLT5jbV9zZXJ2aWNlX3R5cGUsIG1pX3R5cGUsIG1pX3N0cmluZyk7CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfU1VCU0NSLCBTX1NVQlNDUl9JREVOVElUWSwgKGNsYXNzbWFyazIgKyBjbGFzc21hcmsyX2xlbikpOworCisJaWYgKGlzX3NpZW1lbnNfYnRzKGJ0cykpCisJCXNlbmRfc2llbWVuc19tcnBjaShtc2ctPmxjaGFuLCBjbGFzc21hcmsyLTEpOworCisJc3Vic2NyID0gc3Vic2NyX2dldF9ieV90bXNpKGJ0cy0+bmV0d29yaywKKwkJCQkgICAgdG1zaV9mcm9tX3N0cmluZyhtaV9zdHJpbmcpKTsKKworCS8qIEZJWE1FOiBpZiB3ZSBkb24ndCBrbm93IHRoZSBUTVNJLCBpbnF1aXJlIGFiaXQgSU1TSSBhbmQgYWxsb2NhdGUgbmV3IFRNU0kgKi8KKwlpZiAoIXN1YnNjcikKKwkJcmV0dXJuIGdzbTQ4X3R4X21tX3NlcnZfcmVqKG1zZy0+bGNoYW4sCisJCQkJCSAgICBHU000OF9SRUpFQ1RfSU1TSV9VTktOT1dOX0lOX0hMUik7CisKKwlpZiAoIW1zZy0+bGNoYW4tPnN1YnNjcikKKwkJbXNnLT5sY2hhbi0+c3Vic2NyID0gc3Vic2NyOworCWVsc2UgaWYgKG1zZy0+bGNoYW4tPnN1YnNjciA9PSBzdWJzY3IpCisJCXN1YnNjcl9wdXQoc3Vic2NyKTsgLyogbGNoYW4gYWxyZWFkeSBoYXMgYSByZWYsIGRvbid0IG5lZWQgYW5vdGhlciBvbmUgKi8KKwllbHNlIHsKKwkJREVCVUdQKERNTSwgIjwtIENNIENoYW5uZWwgYWxyZWFkeSBvd25lZCBieSBzb21lb25lIGVsc2U/XG4iKTsKKwkJc3Vic2NyX3B1dChzdWJzY3IpOworCX0KKworCXN1YnNjci0+ZXF1aXBtZW50LmNsYXNzbWFyazJfbGVuID0gY2xhc3NtYXJrMl9sZW47CisJbWVtY3B5KHN1YnNjci0+ZXF1aXBtZW50LmNsYXNzbWFyazIsIGNsYXNzbWFyazIsIGNsYXNzbWFyazJfbGVuKTsKKwlkYl9zeW5jX2VxdWlwbWVudCgmc3Vic2NyLT5lcXVpcG1lbnQpOworCisJcmV0dXJuIGdzbTQ4X3R4X21tX3NlcnZfYWNrKG1zZy0+bGNoYW4pOworfQorCitzdGF0aWMgaW50IGdzbTQ4X3J4X21tX2ltc2lfZGV0YWNoX2luZChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSBtc2ctPmxjaGFuLT50cy0+dHJ4LT5idHM7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJc3RydWN0IGdzbTQ4X2ltc2lfZGV0YWNoX2luZCAqaWRpID0KKwkJCQkoc3RydWN0IGdzbTQ4X2ltc2lfZGV0YWNoX2luZCAqKSBnaC0+ZGF0YTsKKwl1X2ludDhfdCBtaV90eXBlID0gaWRpLT5taVswXSAmIEdTTV9NSV9UWVBFX01BU0s7CisJY2hhciBtaV9zdHJpbmdbR1NNNDhfTUlfU0laRV07CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSBOVUxMOworCisJZ3NtNDhfbWlfdG9fc3RyaW5nKG1pX3N0cmluZywgc2l6ZW9mKG1pX3N0cmluZyksIGlkaS0+bWksIGlkaS0+bWlfbGVuKTsKKwlERUJVR1AoRE1NLCAiSU1TSSBERVRBQ0ggSU5ESUNBVElPTjogbWlfdHlwZT0weCUwMnggTUkoJXMpOiAiLAorCQltaV90eXBlLCBtaV9zdHJpbmcpOworCisJY291bnRlcl9pbmMoYnRzLT5uZXR3b3JrLT5zdGF0cy5sb2NfdXBkX3R5cGUuZGV0YWNoKTsKKworCXN3aXRjaCAobWlfdHlwZSkgeworCWNhc2UgR1NNX01JX1RZUEVfVE1TSToKKwkJc3Vic2NyID0gc3Vic2NyX2dldF9ieV90bXNpKGJ0cy0+bmV0d29yaywKKwkJCQkJICAgIHRtc2lfZnJvbV9zdHJpbmcobWlfc3RyaW5nKSk7CisJCWJyZWFrOworCWNhc2UgR1NNX01JX1RZUEVfSU1TSToKKwkJc3Vic2NyID0gc3Vic2NyX2dldF9ieV9pbXNpKGJ0cy0+bmV0d29yaywgbWlfc3RyaW5nKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fTUlfVFlQRV9JTUVJOgorCWNhc2UgR1NNX01JX1RZUEVfSU1FSVNWOgorCQkvKiBubyBzaW0gY2FyZC4uLiBGSVhNRTogd2hhdCB0byBkbyA/ICovCisJCURFQlVHUEMoRE1NLCAidW5pbXBsZW1lbnRlZCBtb2JpbGUgaWRlbnRpdHkgdHlwZVxuIik7CisJCWJyZWFrOworCWRlZmF1bHQ6CQorCQlERUJVR1BDKERNTSwgInVua25vd24gbW9iaWxlIGlkZW50aXR5IHR5cGVcbiIpOworCQlicmVhazsKKwl9CisKKwlpZiAoc3Vic2NyKSB7CisJCXN1YnNjcl91cGRhdGUoc3Vic2NyLCBtc2ctPnRyeC0+YnRzLAorCQkJCUdTTV9TVUJTQ1JJQkVSX1VQREFURV9ERVRBQ0hFRCk7CisJCURFQlVHUChETU0sICJTdWJzY3JpYmVyOiAlc1xuIiwgc3Vic2NyX25hbWUoc3Vic2NyKSk7CisKKwkJc3Vic2NyLT5lcXVpcG1lbnQuY2xhc3NtYXJrMSA9IGlkaS0+Y2xhc3NtYXJrMTsKKwkJZGJfc3luY19lcXVpcG1lbnQoJnN1YnNjci0+ZXF1aXBtZW50KTsKKworCQlzdWJzY3JfcHV0KHN1YnNjcik7CisJfSBlbHNlCisJCURFQlVHUChETU0sICJVbmtub3duIFN1YnNjcmliZXIgPyE/XG4iKTsKKworCS8qIEZJWE1FOiBpdGVyYXRlIG92ZXIgYWxsIHRyYW5zYWN0aW9ucyBhbmQgcmVsZWFzZSB0aGVtLAorCSAqIGltYWdpbmUgYW4gSU1TSSBERVRBQ0ggaGFwcGVuaW5nIGR1cmluZyBhbiBhY3RpdmUgY2FsbCEgKi8KKworCS8qIHN1YnNjcmliZXIgaXMgZGV0YWNoZWQ6IHNob3VsZCB3ZSByZWxlYXNlIGxjaGFuPyAqLworCWxjaGFuX2F1dG9fcmVsZWFzZShtc2ctPmxjaGFuKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdzbTQ4X3J4X21tX3N0YXR1cyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCisJREVCVUdQKERNTSwgIk1NIFNUQVRVUyAocmVqZWN0IGNhdXNlIDB4JTAyeClcbiIsIGdoLT5kYXRhWzBdKTsKKworCXJldHVybiAwOworfQorCisvKiBSZWNlaXZlIGEgR1NNIDA0LjA4IE1vYmlsaXR5IE1hbmFnZW1lbnQgKE1NKSBtZXNzYWdlICovCitzdGF0aWMgaW50IGdzbTA0MDhfcmN2X21tKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAoZ2gtPm1zZ190eXBlICYgMHhiZikgeworCWNhc2UgR1NNNDhfTVRfTU1fTE9DX1VQRF9SRVFVRVNUOgorCQlERUJVR1AoRE1NLCAiTE9DQVRJT04gVVBEQVRJTkcgUkVRVUVTVDogIik7CisJCXJjID0gbW1fcnhfbG9jX3VwZF9yZXEobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9NTV9JRF9SRVNQOgorCQlyYyA9IG1tX3J4X2lkX3Jlc3AobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9NTV9DTV9TRVJWX1JFUToKKwkJcmMgPSBnc200OF9yeF9tbV9zZXJ2X3JlcShtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX01NX1NUQVRVUzoKKwkJcmMgPSBnc200OF9yeF9tbV9zdGF0dXMobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9NTV9UTVNJX1JFQUxMX0NPTVBMOgorCQlERUJVR1AoRE1NLCAiVE1TSSBSZWFsbG9jYXRpb24gQ29tcGxldGVkLiBTdWJzY3JpYmVyOiAlc1xuIiwKKwkJICAgICAgIG1zZy0+bGNoYW4tPnN1YnNjciA/CisJCQkJc3Vic2NyX25hbWUobXNnLT5sY2hhbi0+c3Vic2NyKSA6CisJCQkJInVua25vd24gc3Vic2NyaWJlciIpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX01NX0lNU0lfREVUQUNIX0lORDoKKwkJcmMgPSBnc200OF9yeF9tbV9pbXNpX2RldGFjaF9pbmQobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9NTV9DTV9SRUVTVF9SRVE6CisJCURFQlVHUChETU0sICJDTSBSRUVTVEFCTElTSCBSRVFVRVNUOiBOb3QgaW1wbGVtZW50ZWRcbiIpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX01NX0FVVEhfUkVTUDoKKwkJREVCVUdQKERNTSwgIkFVVEhFTlRJQ0FUSU9OIFJFU1BPTlNFOiBOb3QgaW1wbGVtZW50ZWRcbiIpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERNTSwgTE9HTF9OT1RJQ0UsICJVbmtub3duIEdTTSAwNC4wOCBNTSBtc2cgdHlwZSAweCUwMnhcbiIsCisJCQlnaC0+bXNnX3R5cGUpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIFJlY2VpdmUgYSBQQUdJTkcgUkVTUE9OU0UgbWVzc2FnZSBmcm9tIHRoZSBNUyAqLworc3RhdGljIGludCBnc200OF9yeF9ycl9wYWdfcmVzcChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSBtc2ctPmxjaGFuLT50cy0+dHJ4LT5idHM7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdV9pbnQ4X3QgKmNsYXNzbWFyazJfbHYgPSBnaC0+ZGF0YSArIDE7CisJdV9pbnQ4X3QgbWlfdHlwZTsKKwljaGFyIG1pX3N0cmluZ1tHU000OF9NSV9TSVpFXTsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IE5VTEw7CisJaW50IHJjID0gMDsKKworCWdzbTQ4X3BhZ2luZ19leHRyYWN0X21pKG1zZywgbWlfc3RyaW5nLCAmbWlfdHlwZSk7CisJREVCVUdQKERSUiwgIlBBR0lORyBSRVNQT05TRTogbWlfdHlwZT0weCUwMnggTUkoJXMpXG4iLAorCQltaV90eXBlLCBtaV9zdHJpbmcpOworCisJc3dpdGNoIChtaV90eXBlKSB7CisJY2FzZSBHU01fTUlfVFlQRV9UTVNJOgorCQlzdWJzY3IgPSBzdWJzY3JfZ2V0X2J5X3Rtc2koYnRzLT5uZXR3b3JrLAorCQkJCQkgICAgdG1zaV9mcm9tX3N0cmluZyhtaV9zdHJpbmcpKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fTUlfVFlQRV9JTVNJOgorCQlzdWJzY3IgPSBzdWJzY3JfZ2V0X2J5X2ltc2koYnRzLT5uZXR3b3JrLCBtaV9zdHJpbmcpOworCQlicmVhazsKKwl9CisKKwlpZiAoIXN1YnNjcikgeworCQlERUJVR1AoRFJSLCAiPC0gQ2FuJ3QgZmluZCBhbnkgc3Vic2NyaWJlciBmb3IgdGhpcyBJRFxuIik7CisJCS8qIEZJWE1FOiByZXF1ZXN0IGlkPyBjbG9zZSBjaGFubmVsPyAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJREVCVUdQKERSUiwgIjwtIENoYW5uZWwgd2FzIHJlcXVlc3RlZCBieSAlc1xuIiwKKwkJc3Vic2NyLT5uYW1lICYmIHN0cmxlbihzdWJzY3ItPm5hbWUpID8gc3Vic2NyLT5uYW1lIDogc3Vic2NyLT5pbXNpKTsKKworCXN1YnNjci0+ZXF1aXBtZW50LmNsYXNzbWFyazJfbGVuID0gKmNsYXNzbWFyazJfbHY7CisJbWVtY3B5KHN1YnNjci0+ZXF1aXBtZW50LmNsYXNzbWFyazIsIGNsYXNzbWFyazJfbHYrMSwgKmNsYXNzbWFyazJfbHYpOworCWRiX3N5bmNfZXF1aXBtZW50KCZzdWJzY3ItPmVxdWlwbWVudCk7CisKKwlyYyA9IGdzbTQ4X2hhbmRsZV9wYWdpbmdfcmVzcChtc2csIHN1YnNjcik7CisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGdzbTQ4X3J4X3JyX2NsYXNzbWFyayhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gbXNnLT5sY2hhbi0+c3Vic2NyOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXVfaW50OF90IGNtMl9sZW4sIGNtM19sZW4gPSAwOworCXVfaW50OF90ICpjbTIsICpjbTMgPSBOVUxMOworCisJREVCVUdQKERSUiwgIkNMQVNTTUFSSyBDSEFOR0UgIik7CisKKwkvKiBjbGFzc21hcmsgMiAqLworCWNtMl9sZW4gPSBnaC0+ZGF0YVswXTsKKwljbTIgPSAmZ2gtPmRhdGFbMV07CisJREVCVUdQQyhEUlIsICJDTTIobGVuPSV1KSAiLCBjbTJfbGVuKTsKKworCWlmIChwYXlsb2FkX2xlbiA+IGNtMl9sZW4gKyAxKSB7CisJCS8qIHdlIG11c3QgaGF2ZSBhIGNsYXNzbWFyazMgKi8KKwkJaWYgKGdoLT5kYXRhW2NtMl9sZW4rMV0gIT0gMHgyMCkgeworCQkJREVCVUdQQyhEUlIsICJFUlIgQ00zIFRBR1xuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlpZiAoY20yX2xlbiA+IDMpIHsKKwkJCURFQlVHUEMoRFJSLCAiQ00yIHRvbyBsb25nIVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQkKKwkJY20zX2xlbiA9IGdoLT5kYXRhW2NtMl9sZW4rMl07CisJCWNtMyA9ICZnaC0+ZGF0YVtjbTJfbGVuKzNdOworCQlpZiAoY20zX2xlbiA+IDE0KSB7CisJCQlERUJVR1BDKERSUiwgIkNNMyBsZW4gJXUgdG9vIGxvbmchXG4iLCBjbTNfbGVuKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCURFQlVHUEMoRFJSLCAiQ00zKGxlbj0ldSlcbiIsIGNtM19sZW4pOworCX0KKwlpZiAoc3Vic2NyKSB7CisJCXN1YnNjci0+ZXF1aXBtZW50LmNsYXNzbWFyazJfbGVuID0gY20yX2xlbjsKKwkJbWVtY3B5KHN1YnNjci0+ZXF1aXBtZW50LmNsYXNzbWFyazIsIGNtMiwgY20yX2xlbik7CisJCWlmIChjbTMpIHsKKwkJCXN1YnNjci0+ZXF1aXBtZW50LmNsYXNzbWFyazNfbGVuID0gY20zX2xlbjsKKwkJCW1lbWNweShzdWJzY3ItPmVxdWlwbWVudC5jbGFzc21hcmszLCBjbTMsIGNtM19sZW4pOworCQl9CisJCWRiX3N5bmNfZXF1aXBtZW50KCZzdWJzY3ItPmVxdWlwbWVudCk7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfcnhfcnJfc3RhdHVzKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisKKwlERUJVR1AoRFJSLCAiU1RBVFVTIHJyX2NhdXNlID0gJXNcbiIsIAorCQlycl9jYXVzZV9uYW1lKGdoLT5kYXRhWzBdKSk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnc200OF9yeF9ycl9tZWFzX3JlcChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc21fbWVhc19yZXAgKm1lYXNfcmVwID0gbGNoYW5fbmV4dF9tZWFzX3JlcChtc2ctPmxjaGFuKTsKKworCS8qIFRoaXMgc2hvdWxkbid0IGFjdHVhbGx5IGVuZCB1cCBoZXJlLCBhcyBSU0wgdHJlYXRzCisJICogTDMgSW5mbyBvZiAwOC41OCBNRUFTVVJFTUVOVCBSRVBPUlQgZGlmZmVyZW50IGJ5IGNhbGxpbmcKKwkgKiBkaXJlY3RseSBpbnRvIGdzbTQ4X3BhcnNlX21lYXNfcmVwICovCisJREVCVUdQKERNRUFTLCAiRElSRUNUIEdTTTQ4IE1FQVNVUkVNRU5UIFJFUE9SVCA/IT8gIik7CisJZ3NtNDhfcGFyc2VfbWVhc19yZXAobWVhc19yZXAsIG1zZyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnc200OF9yeF9ycl9hcHBfaW5mbyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVfaW50OF90IGFwZHVfaWRfZmxhZ3M7CisJdV9pbnQ4X3QgYXBkdV9sZW47CisJdV9pbnQ4X3QgKmFwZHVfZGF0YTsKKworCWFwZHVfaWRfZmxhZ3MgPSBnaC0+ZGF0YVswXTsKKwlhcGR1X2xlbiA9IGdoLT5kYXRhWzFdOworCWFwZHVfZGF0YSA9IGdoLT5kYXRhKzI7CisJCisJREVCVUdQKEROTSwgIlJYIEFQUExJQ0FUSU9OIElORk8gaWQvZmxhZ3M9MHglMDJ4IGFwZHVfbGVuPSV1IGFwZHU9JXMiLAorCQlhcGR1X2lkX2ZsYWdzLCBhcGR1X2xlbiwgaGV4ZHVtcChhcGR1X2RhdGEsIGFwZHVfbGVuKSk7CisKKwlyZXR1cm4gZGJfYXBkdV9ibG9iX3N0b3JlKG1zZy0+bGNoYW4tPnN1YnNjciwgYXBkdV9pZF9mbGFncywgYXBkdV9sZW4sIGFwZHVfZGF0YSk7Cit9CisKKy8qIENoYXB0ZXIgOS4xLjE2IEhhbmRvdmVyIGNvbXBsZXRlICovCitzdGF0aWMgaW50IGdzbTQ4X3J4X3JyX2hvX2NvbXBsKHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisKKwlERUJVR1AoRFJSLCAiSEFORE9WRVIgQ09NUExFVEUgY2F1c2UgPSAlc1xuIiwKKwkJcnJfY2F1c2VfbmFtZShnaC0+ZGF0YVswXSkpOworCisJZGlzcGF0Y2hfc2lnbmFsKFNTX0xDSEFOLCBTX0xDSEFOX0hBTkRPVkVSX0NPTVBMLCBtc2ctPmxjaGFuKTsKKwkvKiBGSVhNRTogcmVsZWFzZSBvbGQgY2hhbm5lbCAqLworCisJcmV0dXJuIDA7Cit9CisKKy8qIENoYXB0ZXIgOS4xLjE3IEhhbmRvdmVyIEZhaWx1cmUgKi8KK3N0YXRpYyBpbnQgZ3NtNDhfcnhfcnJfaG9fZmFpbChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCisJREVCVUdQKERSUiwgIkhBTkRPVkVSIEZBSUxFRCBjYXVzZSA9ICVzXG4iLAorCQlycl9jYXVzZV9uYW1lKGdoLT5kYXRhWzBdKSk7CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfTENIQU4sIFNfTENIQU5fSEFORE9WRVJfRkFJTCwgbXNnLT5sY2hhbik7CisJLyogRklYTUU6IHJlbGVhc2UgYWxsb2NhdGVkIG5ldyBjaGFubmVsICovCisKKwlyZXR1cm4gMDsKK30KKworLyogUmVjZWl2ZSBhIEdTTSAwNC4wOCBSYWRpbyBSZXNvdXJjZSAoUlIpIG1lc3NhZ2UgKi8KK3N0YXRpYyBpbnQgZ3NtMDQwOF9yY3ZfcnIoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwlpbnQgcmMgPSAwOworCisJc3dpdGNoIChnaC0+bXNnX3R5cGUpIHsKKwljYXNlIEdTTTQ4X01UX1JSX0NMU01fQ0hHOgorCQlyYyA9IGdzbTQ4X3J4X3JyX2NsYXNzbWFyayhtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX1JSX0dQUlNfU1VTUF9SRVE6CisJCURFQlVHUChEUlIsICJHUlBTIFNVU1BFTkQgUkVRVUVTVFxuIik7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfUlJfUEFHX1JFU1A6CisJCXJjID0gZ3NtNDhfcnhfcnJfcGFnX3Jlc3AobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9SUl9DSEFOX01PREVfTU9ESUZfQUNLOgorCQlyYyA9IGdzbTQ4X3J4X3JyX21vZGlmX2Fjayhtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX1JSX1NUQVRVUzoKKwkJcmMgPSBnc200OF9yeF9ycl9zdGF0dXMobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9SUl9NRUFTX1JFUDoKKwkJcmMgPSBnc200OF9yeF9ycl9tZWFzX3JlcChtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X01UX1JSX0FQUF9JTkZPOgorCQlyYyA9IGdzbTQ4X3J4X3JyX2FwcF9pbmZvKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfUlJfQ0lQSF9NX0NPTVBMOgorCQlERUJVR1AoRFJSLCAiQ0lQSEVSSU5HIE1PREUgQ09NUExFVEVcbiIpOworCQkvKiBGSVhNRTogY2hlY2sgZm9yIE1JIChpZiBhbnkpICovCisJCWJyZWFrOworCWNhc2UgR1NNNDhfTVRfUlJfSEFORE9fQ09NUEw6CisJCXJjID0gZ3NtNDhfcnhfcnJfaG9fY29tcGwobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9NVF9SUl9IQU5ET19GQUlMOgorCQlyYyA9IGdzbTQ4X3J4X3JyX2hvX2ZhaWwobXNnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEUlIsIExPR0xfTk9USUNFLCAiVW5pbXBsZW1lbnRlZCAiCisJCQkiR1NNIDA0LjA4IFJSIG1zZyB0eXBlIDB4JTAyeFxuIiwgZ2gtPm1zZ190eXBlKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCitpbnQgZ3NtNDhfc2VuZF9ycl9hcHBfaW5mbyhzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgYXBkdV9pZCwKKwkJCSAgIHVfaW50OF90IGFwZHVfbGVuLCBjb25zdCB1X2ludDhfdCAqYXBkdSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCQorCURFQlVHUChEUlIsICJUWCBBUFBMSUNBVElPTiBJTkZPIGlkPTB4JTAyeCwgbGVuPSV1XG4iLAorCQlhcGR1X2lkLCBhcGR1X2xlbik7CisJCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpICsgMiArIGFwZHVfbGVuKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19SUjsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9SUl9BUFBfSU5GTzsKKwlnaC0+ZGF0YVswXSA9IGFwZHVfaWQ7CisJZ2gtPmRhdGFbMV0gPSBhcGR1X2xlbjsKKwltZW1jcHkoZ2gtPmRhdGErMiwgYXBkdSwgYXBkdV9sZW4pOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKK30KKworLyogQ2FsbCBDb250cm9sICovCisKKy8qIFRoZSBlbnRpcmUgY2FsbCBjb250cm9sIGNvZGUgaXMgd3JpdHRlbiBpbiBhY2NvcmRhbmNlIHdpdGggRmlndXJlIDcuMTBjCisgKiBmb3IgJ3ZlcnkgZWFybHkgYXNzaWdubWVudCcsIGkuZS4gd2UgYWxsb2NhdGUgYSBUQ0gvRiBkdXJpbmcgSU1NRURJQVRFCisgKiBBU1NJR04sIHRoZW4gZmlyc3QgdXNlIHRoYXQgVENIL0YgZm9yIHNpZ25hbGxpbmcgYW5kIGxhdGVyIE1PREUgTU9ESUZZCisgKiBpdCBmb3Igdm9pY2UgKi8KKworc3RhdGljIHZvaWQgbmV3X2NjX3N0YXRlKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBpbnQgc3RhdGUpCit7CisJaWYgKHN0YXRlID4gMzEgfHwgc3RhdGUgPCAwKQorCQlyZXR1cm47CisKKwlERUJVR1AoRENDLCAibmV3IHN0YXRlICVzIC0+ICVzXG4iLAorCQljY19zdGF0ZV9uYW1lc1t0cmFucy0+Y2Muc3RhdGVdLCBjY19zdGF0ZV9uYW1lc1tzdGF0ZV0pOworCisJdHJhbnMtPmNjLnN0YXRlID0gc3RhdGU7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfc3RhdHVzKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCXVfaW50OF90ICpjYXVzZSwgKmNhbGxfc3RhdGU7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19TVEFUVVM7CisKKwljYXVzZSA9IG1zZ2JfcHV0KG1zZywgMyk7CisJY2F1c2VbMF0gPSAyOworCWNhdXNlWzFdID0gR1NNNDhfQ0FVU0VfQ1NfR1NNIHwgR1NNNDhfQ0FVU0VfTE9DX1VTRVI7CisJY2F1c2VbMl0gPSAweDgwIHwgMzA7CS8qIHJlc3BvbnNlIHRvIHN0YXR1cyBpbnF1aXJ5ICovCisKKwljYWxsX3N0YXRlID0gbXNnYl9wdXQobXNnLCAxKTsKKwljYWxsX3N0YXRlWzBdID0gMHhjMCB8IDB4MDA7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF90eF9zaW1wbGUoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sCisJCQkgICB1X2ludDhfdCBwZGlzYywgdV9pbnQ4X3QgbXNnX3R5cGUpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCisJZ2gtPnByb3RvX2Rpc2NyID0gcGRpc2M7CisJZ2gtPm1zZ190eXBlID0gbXNnX3R5cGU7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworfQorCitzdGF0aWMgdm9pZCBnc200OF9zdG9wX2NjX3RpbWVyKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKQoreworCWlmIChic2NfdGltZXJfcGVuZGluZygmdHJhbnMtPmNjLnRpbWVyKSkgeworCQlERUJVR1AoRENDLCAic3RvcHBpbmcgcGVuZGluZyB0aW1lciBUJXhcbiIsIHRyYW5zLT5jYy5UY3VycmVudCk7CisJCWJzY19kZWxfdGltZXIoJnRyYW5zLT5jYy50aW1lcik7CisJCXRyYW5zLT5jYy5UY3VycmVudCA9IDA7CisJfQorfQorIAorc3RhdGljIGludCBtbmNjX3JlY3Ztc2coc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLAorCQkJaW50IG1zZ190eXBlLCBzdHJ1Y3QgZ3NtX21uY2MgKm1uY2MpCit7CisJc3RydWN0IG1zZ2IgKm1zZzsKKworCWlmICh0cmFucykKKwkJaWYgKHRyYW5zLT5sY2hhbikKKwkJCURFQlVHUChEQ0MsICIoYnRzICVkIHRyeCAlZCB0cyAlZCB0aSAleCBzdWIgJXMpICIKKwkJCQkiU2VuZGluZyAnJXMnIHRvIE1OQ0MuXG4iLAorCQkJCXRyYW5zLT5sY2hhbi0+dHMtPnRyeC0+YnRzLT5uciwKKwkJCQl0cmFucy0+bGNoYW4tPnRzLT50cngtPm5yLAorCQkJCXRyYW5zLT5sY2hhbi0+dHMtPm5yLCB0cmFucy0+dHJhbnNhY3Rpb25faWQsCisJCQkJKHRyYW5zLT5zdWJzY3IpPyh0cmFucy0+c3Vic2NyLT5leHRlbnNpb24pOiItIiwKKwkJCQlnZXRfbW5jY19uYW1lKG1zZ190eXBlKSk7CisJCWVsc2UKKwkJCURFQlVHUChEQ0MsICIoYnRzIC0gdHJ4IC0gdHMgLSB0aSAtLSBzdWIgJXMpICIKKwkJCQkiU2VuZGluZyAnJXMnIHRvIE1OQ0MuXG4iLAorCQkJCSh0cmFucy0+c3Vic2NyKT8odHJhbnMtPnN1YnNjci0+ZXh0ZW5zaW9uKToiLSIsCisJCQkJZ2V0X21uY2NfbmFtZShtc2dfdHlwZSkpOworCWVsc2UKKwkJREVCVUdQKERDQywgIihidHMgLSB0cnggLSB0cyAtIHRpIC0tIHN1YiAtKSAiCisJCQkiU2VuZGluZyAnJXMnIHRvIE1OQ0MuXG4iLCBnZXRfbW5jY19uYW1lKG1zZ190eXBlKSk7CisKKwltbmNjLT5tc2dfdHlwZSA9IG1zZ190eXBlOworCQorCW1zZyA9IG1zZ2JfYWxsb2Moc2l6ZW9mKHN0cnVjdCBnc21fbW5jYyksICJNTkNDIik7CisJaWYgKCFtc2cpCisJCXJldHVybiAtRU5PTUVNOworCW1lbWNweShtc2ctPmRhdGEsIG1uY2MsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwltc2diX2VucXVldWUoJm5ldC0+dXBxdWV1ZSwgbXNnKTsKKworCXJldHVybiAwOworfQorCitpbnQgbW5jY19yZWxlYXNlX2luZChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgc3RydWN0IGdzbV90cmFucyAqdHJhbnMsCisJCSAgICAgdV9pbnQzMl90IGNhbGxyZWYsIGludCBsb2NhdGlvbiwgaW50IHZhbHVlKQoreworCXN0cnVjdCBnc21fbW5jYyByZWw7CisKKwltZW1zZXQoJnJlbCwgMCwgc2l6ZW9mKHJlbCkpOworCXJlbC5jYWxscmVmID0gY2FsbHJlZjsKKwltbmNjX3NldF9jYXVzZSgmcmVsLCBsb2NhdGlvbiwgdmFsdWUpOworCXJldHVybiBtbmNjX3JlY3Ztc2cobmV0LCB0cmFucywgTU5DQ19SRUxfSU5ELCAmcmVsKTsKK30KKworLyogQ2FsbCBDb250cm9sIFNwZWNpZmljIHRyYW5zYWN0aW9uIHJlbGVhc2UuCisgKiBnZXRzIGNhbGxlZCBieSB0cmFuc19mcmVlLCBETyBOT1QgQ0FMTCBZT1VSU0VMRiEgKi8KK3ZvaWQgX2dzbTQ4X2NjX3RyYW5zX2ZyZWUoc3RydWN0IGdzbV90cmFucyAqdHJhbnMpCit7CisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisKKwkvKiBzZW5kIHJlbGVhc2UgdG8gTDQsIGlmIGNhbGxyZWYgc3RpbGwgZXhpc3RzICovCisJaWYgKHRyYW5zLT5jYWxscmVmKSB7CisJCS8qIFJlc3NvdXJjZSB1bmF2YWlsYWJsZSAqLworCQltbmNjX3JlbGVhc2VfaW5kKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIHRyYW5zLT5jYWxscmVmLAorCQkJCSBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJIEdTTTQ4X0NDX0NBVVNFX1JFU09VUkNFX1VOQVZBSUwpOworCX0KKwlpZiAodHJhbnMtPmNjLnN0YXRlICE9IEdTTV9DU1RBVEVfTlVMTCkKKwkJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX05VTEwpOworCWlmICh0cmFucy0+bGNoYW4pCisJCXRyYXVfbXV4X3VubWFwKCZ0cmFucy0+bGNoYW4tPnRzLT5lMV9saW5rLCB0cmFucy0+Y2FsbHJlZik7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfc2V0dXAoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZyk7CisgCisvKiBjYWxsLWJhY2sgZnJvbSBwYWdpbmcgdGhlIEItZW5kIG9mIHRoZSBjb25uZWN0aW9uICovCitzdGF0aWMgaW50IHNldHVwX3RyaWdfcGFnX2V2dCh1bnNpZ25lZCBpbnQgaG9va251bSwgdW5zaWduZWQgaW50IGV2ZW50LAorCQkJICAgICAgc3RydWN0IG1zZ2IgKm1zZywgdm9pZCAqX2xjaGFuLCB2b2lkICpwYXJhbSkKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IF9sY2hhbjsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IHBhcmFtOworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zdCwgKnRtcDsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldDsKKworCWlmIChob29rbnVtICE9IEdTTV9IT09LX1JSX1BBR0lORykKKwkJcmV0dXJuIC1FSU5WQUw7CisgIAorCWlmICghc3Vic2NyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwluZXQgPSBzdWJzY3ItPm5ldDsKKwlpZiAoIW5ldCkgeworCQlERUJVR1AoRENDLCAiRXJyb3IgTmV0d29yayBub3Qgc2V0IVxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGNoZWNrIGFsbCB0cmFuYWN0aW9ucyAod2l0aG91dCBsY2hhbikgZm9yIHN1YnNjcmliZXIgKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHRyYW5zdCwgdG1wLCAmbmV0LT50cmFuc19saXN0LCBlbnRyeSkgeworCQlpZiAodHJhbnN0LT5zdWJzY3IgIT0gc3Vic2NyIHx8IHRyYW5zdC0+bGNoYW4pCisJCQljb250aW51ZTsKKwkJc3dpdGNoIChldmVudCkgeworCQljYXNlIEdTTV9QQUdJTkdfU1VDQ0VFREVEOgorCQkJaWYgKCFsY2hhbikgLy8gcGFyYW5vaWQKKwkJCQlicmVhazsKKwkJCURFQlVHUChEQ0MsICJQYWdpbmcgc3Vic2NyICVzIHN1Y2NlZWRlZCFcbiIsCisJCQkJc3Vic2NyLT5leHRlbnNpb24pOworCQkJLyogQXNzaWduIGxjaGFuICovCisJCQlpZiAoIXRyYW5zdC0+bGNoYW4pIHsKKwkJCQl0cmFuc3QtPmxjaGFuID0gbGNoYW47CisJCQkJdXNlX2xjaGFuKGxjaGFuKTsKKwkJCX0KKwkJCS8qIHNlbmQgU0VUVVAgcmVxdWVzdCB0byBjYWxsZWQgcGFydHkgKi8KKwkJCWdzbTQ4X2NjX3R4X3NldHVwKHRyYW5zdCwgJnRyYW5zdC0+Y2MubXNnKTsKKwkJCWJyZWFrOworCQljYXNlIEdTTV9QQUdJTkdfRVhQSVJFRDoKKwkJCURFQlVHUChEQ0MsICJQYWdpbmcgc3Vic2NyICVzIGV4cGlyZWQhXG4iLAorCQkJCXN1YnNjci0+ZXh0ZW5zaW9uKTsKKwkJCS8qIFRlbXBvcmFyaWx5IG91dCBvZiBvcmRlciAqLworCQkJbW5jY19yZWxlYXNlX2luZCh0cmFuc3QtPnN1YnNjci0+bmV0LCB0cmFuc3QsCisJCQkJCSB0cmFuc3QtPmNhbGxyZWYsCisJCQkJCSBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJCSBHU000OF9DQ19DQVVTRV9ERVNUX09PTyk7CisJCQl0cmFuc3QtPmNhbGxyZWYgPSAwOworCQkJdHJhbnNfZnJlZSh0cmFuc3QpOworCQkJYnJlYWs7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdGNoX3JlY3ZfbW5jYyhzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgdV9pbnQzMl90IGNhbGxyZWYsIGludCBlbmFibGUpOworCisvKiBzb21lIG90aGVyIHBhcnQgb2YgdGhlIGNvZGUgc2VuZHMgdXMgYSBzaWduYWwgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX2FiaXNpcF9zaWduYWwodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJCQkgdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IHNpZ25hbF9kYXRhOworCWludCByYzsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldDsKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuczsKKworCWlmIChzdWJzeXMgIT0gU1NfQUJJU0lQKQorCQlyZXR1cm4gMDsKKworCS8qIGluIGNhc2Ugd2UgdXNlIGRpcmVjdCBCVFMtdG8tQlRTIFJUUCAqLworCWlmIChpcGFjY19ydHBfZGlyZWN0KQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoc2lnbmFsKSB7CisJY2FzZSBTX0FCSVNJUF9DUkNYX0FDSzoKKwkJLyogY2hlY2sgaWYgYW55IHRyYW5zYWN0aW9ucyBvbiB0aGlzIGxjaGFuIHN0aWxsIGhhdmUKKwkJICogYSB0Y2hfcmVjdl9tbmNjIHJlcXVlc3QgcGVuZGluZyAqLworCQluZXQgPSBsY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrOworCQlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cmFucywgJm5ldC0+dHJhbnNfbGlzdCwgZW50cnkpIHsKKwkJCWlmICh0cmFucy0+bGNoYW4gPT0gbGNoYW4gJiYgdHJhbnMtPnRjaF9yZWN2KSB7CisJCQkJREVCVUdQKERDQywgInBlbmRpbmcgdGNoX3JlY3ZfbW5jYyByZXF1ZXN0XG4iKTsKKwkJCQl0Y2hfcmVjdl9tbmNjKG5ldCwgdHJhbnMtPmNhbGxyZWYsIDEpOworCQkJfQorCQl9CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisvKiBtYXAgdHdvIGlwYWNjZXNzIFJUUCBzdHJlYW1zIG9udG8gZWFjaCBvdGhlciAqLworc3RhdGljIGludCB0Y2hfbWFwKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCBzdHJ1Y3QgZ3NtX2xjaGFuICpyZW1vdGVfbGNoYW4pCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IGxjaGFuLT50cy0+dHJ4LT5idHM7CisJc3RydWN0IGdzbV9idHMgKnJlbW90ZV9idHMgPSByZW1vdGVfbGNoYW4tPnRzLT50cngtPmJ0czsKKwlpbnQgcmM7CisKKwlERUJVR1AoRENDLCAiU2V0dGluZyB1cCBUQ0ggbWFwIGJldHdlZW4gKGJ0cz0ldSx0cng9JXUsdHM9JXUpIGFuZCAoYnRzPSV1LHRyeD0ldSx0cz0ldSlcbiIsCisJCWJ0cy0+bnIsIGxjaGFuLT50cy0+dHJ4LT5uciwgbGNoYW4tPnRzLT5uciwKKwkJcmVtb3RlX2J0cy0+bnIsIHJlbW90ZV9sY2hhbi0+dHMtPnRyeC0+bnIsIHJlbW90ZV9sY2hhbi0+dHMtPm5yKTsKKworCWlmIChidHMtPnR5cGUgIT0gcmVtb3RlX2J0cy0+dHlwZSkgeworCQlERUJVR1AoRENDLCAiQ2Fubm90IHN3aXRjaCBjYWxscyBiZXR3ZWVuIGRpZmZlcmVudCBCVFMgdHlwZXMgeWV0XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLy8gdG9kbzogbWFwIGJldHdlZW4gZGlmZmVyZW50IGJ0cyB0eXBlcworCXN3aXRjaCAoYnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzoKKwkJaWYgKCFpcGFjY19ydHBfZGlyZWN0KSB7CisJCQkvKiBjb25uZWN0IHRoZSBUQ0gncyB0byBvdXIgUlRQIHByb3h5ICovCisJCQlyYyA9IHJzbF9pcGFjY19tZGN4X3RvX3J0cHNvY2sobGNoYW4pOworCQkJaWYgKHJjIDwgMCkKKwkJCQlyZXR1cm4gcmM7CisJCQlyYyA9IHJzbF9pcGFjY19tZGN4X3RvX3J0cHNvY2socmVtb3RlX2xjaGFuKTsKKyN3YXJuaW5nIGRvIHdlIG5lZWQgYSBjaGVjayBvZiByYyBoZXJlPworCisJCQkvKiBjb25uZWN0IHRoZW0gd2l0aCBlYWNoIG90aGVyICovCisJCQlydHBfc29ja2V0X3Byb3h5KGxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQsCisJCQkJCSByZW1vdGVfbGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCk7CisJCX0gZWxzZSB7CisJCQkvKiBkaXJlY3RseSBjb25uZWN0IFRDSCBSVFAgc3RyZWFtcyB0byBlYWNoIG90aGVyICovCisJCQlyYyA9IHJzbF9pcGFjY19tZGN4KGxjaGFuLCByZW1vdGVfbGNoYW4tPmFiaXNfaXAuYm91bmRfaXAsCisJCQkJCQlyZW1vdGVfbGNoYW4tPmFiaXNfaXAuYm91bmRfcG9ydCwKKwkJCQkJCXJlbW90ZV9sY2hhbi0+YWJpc19pcC5ydHBfcGF5bG9hZDIpOworCQkJaWYgKHJjIDwgMCkKKwkJCQlyZXR1cm4gcmM7CisJCQlyYyA9IHJzbF9pcGFjY19tZGN4KHJlbW90ZV9sY2hhbiwgbGNoYW4tPmFiaXNfaXAuYm91bmRfaXAsCisJCQkJCQlsY2hhbi0+YWJpc19pcC5ib3VuZF9wb3J0LAorCQkJCQkJbGNoYW4tPmFiaXNfaXAucnRwX3BheWxvYWQyKTsKKwkJfQorCQlicmVhazsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQl0cmF1X211eF9tYXBfbGNoYW4obGNoYW4sIHJlbW90ZV9sY2hhbik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUChEQ0MsICJVbmtub3duIEJUUyB0eXBlICV1XG4iLCBidHMtPnR5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLyogYnJpZGdlIGNoYW5uZWxzIG9mIHR3byB0cmFuc2FjdGlvbnMgKi8KK3N0YXRpYyBpbnQgdGNoX2JyaWRnZShzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgdV9pbnQzMl90ICpyZWZzKQoreworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zMSA9IHRyYW5zX2ZpbmRfYnlfY2FsbHJlZihuZXQsIHJlZnNbMF0pOworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zMiA9IHRyYW5zX2ZpbmRfYnlfY2FsbHJlZihuZXQsIHJlZnNbMV0pOworCisJaWYgKCF0cmFuczEgfHwgIXRyYW5zMikKKwkJcmV0dXJuIC1FSU87CisKKwlpZiAoIXRyYW5zMS0+bGNoYW4gfHwgIXRyYW5zMi0+bGNoYW4pCisJCXJldHVybiAtRUlPOworCisJLyogdGhyb3VnaC1jb25uZWN0IGNoYW5uZWwgKi8KKwlyZXR1cm4gdGNoX21hcCh0cmFuczEtPmxjaGFuLCB0cmFuczItPmxjaGFuKTsKK30KKworLyogZW5hYmxlIHJlY2VpdmUgb2YgY2hhbm5lbHMgdG8gTU5DQyB1cHF1ZXVlICovCitzdGF0aWMgaW50IHRjaF9yZWN2X21uY2Moc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIHVfaW50MzJfdCBjYWxscmVmLCBpbnQgZW5hYmxlKQoreworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCXN0cnVjdCBnc21fYnRzICpidHM7CisJaW50IHJjOworCisJLyogRmluZCBjYWxscmVmICovCisJdHJhbnMgPSB0cmFuc19maW5kX2J5X2NhbGxyZWYobmV0LCBjYWxscmVmKTsKKwlpZiAoIXRyYW5zKQorCQlyZXR1cm4gLUVJTzsKKwlpZiAoIXRyYW5zLT5sY2hhbikKKwkJcmV0dXJuIDA7CisJbGNoYW4gPSB0cmFucy0+bGNoYW47CisJYnRzID0gbGNoYW4tPnRzLT50cngtPmJ0czsKKworCXN3aXRjaCAoYnRzLT50eXBlKSB7CisJY2FzZSBHU01fQlRTX1RZUEVfTkFOT0JUUzoKKwkJaWYgKGlwYWNjX3J0cF9kaXJlY3QpIHsKKwkJCURFQlVHUChEQ0MsICJFcnJvcjogUlRQIHByb3h5IGlzIGRpc2FibGVkXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCS8qIGluIGNhc2UsIHdlIGRvbid0IGhhdmUgYSBSVFAgc29ja2V0IHlldCwgd2Ugbm90ZSB0aGlzCisJCSAqIGluIHRoZSB0cmFuc2FjdGlvbiBhbmQgdHJ5IGxhdGVyICovCisJCWlmICghbGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCkgeworCQkJdHJhbnMtPnRjaF9yZWN2ID0gZW5hYmxlOworCQkJREVCVUdQKERDQywgInF1ZXVlIHRjaF9yZWN2X21uY2MgcmVxdWVzdCAoJWQpXG4iLCBlbmFibGUpOworCQkJcmV0dXJuIDA7CisJCX0KKwkJaWYgKGVuYWJsZSkgeworCQkJLyogY29ubmVjdCB0aGUgVENIJ3MgdG8gb3VyIFJUUCBwcm94eSAqLworCQkJcmMgPSByc2xfaXBhY2NfbWRjeF90b19ydHBzb2NrKGxjaGFuKTsKKwkJCWlmIChyYyA8IDApCisJCQkJcmV0dXJuIHJjOworCQkJLyogYXNzaWduIHNvY2tldCB0byBhcHBsaWNhdGlvbiBpbnRlcmZhY2UgKi8KKwkJCXJ0cF9zb2NrZXRfdXBzdHJlYW0obGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCwKKwkJCQluZXQsIGNhbGxyZWYpOworCQl9IGVsc2UKKwkJCXJ0cF9zb2NrZXRfdXBzdHJlYW0obGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCwKKwkJCQluZXQsIDApOworCQlicmVhazsKKwljYXNlIEdTTV9CVFNfVFlQRV9CUzExOgorCQlpZiAoZW5hYmxlKQorCQkJcmV0dXJuIHRyYXVfcmVjdl9sY2hhbihsY2hhbiwgY2FsbHJlZik7CisJCXJldHVybiB0cmF1X211eF91bm1hcChOVUxMLCBjYWxscmVmKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdQKERDQywgIlVua25vd24gQlRTIHR5cGUgJXVcbiIsIGJ0cy0+dHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X3N0YXR1c19lbnEoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJREVCVUdQKERDQywgIi0+IFNUQVRVUyBFTlFcbiIpOworCXJldHVybiBnc200OF9jY190eF9zdGF0dXModHJhbnMsIG1zZyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfcmVsZWFzZShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKTsKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfZGlzY29ubmVjdChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKTsKKworc3RhdGljIHZvaWQgZ3NtNDhfY2NfdGltZW91dCh2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV90cmFucyAqdHJhbnMgPSBhcmc7CisJaW50IGRpc2Nvbm5lY3QgPSAwLCByZWxlYXNlID0gMDsKKwlpbnQgbW9fY2F1c2UgPSBHU000OF9DQ19DQVVTRV9SRUNPVkVSWV9USU1FUjsKKwlpbnQgbW9fbG9jYXRpb24gPSBHU000OF9DQVVTRV9MT0NfVVNFUjsKKwlpbnQgbDRfY2F1c2UgPSBHU000OF9DQ19DQVVTRV9OT1JNQUxfVU5TUEVDOworCWludCBsNF9sb2NhdGlvbiA9IEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVTsKKwlzdHJ1Y3QgZ3NtX21uY2MgbW9fcmVsLCBsNF9yZWw7CisKKwltZW1zZXQoJm1vX3JlbCwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCW1vX3JlbC5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJbWVtc2V0KCZsNF9yZWwsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlsNF9yZWwuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCisJc3dpdGNoKHRyYW5zLT5jYy5UY3VycmVudCkgeworCWNhc2UgMHgzMDM6CisJCXJlbGVhc2UgPSAxOworCQlsNF9jYXVzZSA9IEdTTTQ4X0NDX0NBVVNFX1VTRVJfTk9UUkVTUE9ORDsKKwkJYnJlYWs7CisJY2FzZSAweDMxMDoKKwkJZGlzY29ubmVjdCA9IDE7CisJCWw0X2NhdXNlID0gR1NNNDhfQ0NfQ0FVU0VfVVNFUl9OT1RSRVNQT05EOworCQlicmVhazsKKwljYXNlIDB4MzEzOgorCQlkaXNjb25uZWN0ID0gMTsKKwkJLyogdW5rbm93biwgZGlkIG5vdCBmaW5kIGl0IGluIHRoZSBzcGVjcyAqLworCQlicmVhazsKKwljYXNlIDB4MzAxOgorCQlkaXNjb25uZWN0ID0gMTsKKwkJbDRfY2F1c2UgPSBHU000OF9DQ19DQVVTRV9VU0VSX05PVFJFU1BPTkQ7CisJCWJyZWFrOworCWNhc2UgMHgzMDg6CisJCWlmICghdHJhbnMtPmNjLlQzMDhfc2Vjb25kKSB7CisJCQkvKiByZXN0YXJ0IFQzMDggYSBzZWNvbmQgdGltZSAqLworCQkJZ3NtNDhfY2NfdHhfcmVsZWFzZSh0cmFucywgJnRyYW5zLT5jYy5tc2cpOworCQkJdHJhbnMtPmNjLlQzMDhfc2Vjb25kID0gMTsKKwkJCWJyZWFrOyAvKiBzdGF5IGluIHJlbGVhc2Ugc3RhdGUgKi8KKwkJfQorCQl0cmFuc19mcmVlKHRyYW5zKTsKKwkJcmV0dXJuOworLy8JCXJlbGVhc2UgPSAxOworLy8JCWw0X2NhdXNlID0gMTQ7CisvLwkJYnJlYWs7CisJY2FzZSAweDMwNjoKKwkJcmVsZWFzZSA9IDE7CisJCW1vX2NhdXNlID0gdHJhbnMtPmNjLm1zZy5jYXVzZS52YWx1ZTsKKwkJbW9fbG9jYXRpb24gPSB0cmFucy0+Y2MubXNnLmNhdXNlLmxvY2F0aW9uOworCQlicmVhazsKKwljYXNlIDB4MzIzOgorCQlkaXNjb25uZWN0ID0gMTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJcmVsZWFzZSA9IDE7CisJfQorCisJaWYgKHJlbGVhc2UgJiYgdHJhbnMtPmNhbGxyZWYpIHsKKwkJLyogcHJvY2VzcyByZWxlYXNlIHRvd2FyZHMgbGF5ZXIgNCAqLworCQltbmNjX3JlbGVhc2VfaW5kKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIHRyYW5zLT5jYWxscmVmLAorCQkJCSBsNF9sb2NhdGlvbiwgbDRfY2F1c2UpOworCQl0cmFucy0+Y2FsbHJlZiA9IDA7CisJfQorCisJaWYgKGRpc2Nvbm5lY3QgJiYgdHJhbnMtPmNhbGxyZWYpIHsKKwkJLyogcHJvY2VzcyBkaXNjb25uZWN0IHRvd2FyZHMgbGF5ZXIgNCAqLworCQltbmNjX3NldF9jYXVzZSgmbDRfcmVsLCBsNF9sb2NhdGlvbiwgbDRfY2F1c2UpOworCQltbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19ESVNDX0lORCwgJmw0X3JlbCk7CisJfQorCisJLyogcHJvY2VzcyBkaXNjb25uZWN0IHRvd2FyZHMgbW9iaWxlIHN0YXRpb24gKi8KKwlpZiAoZGlzY29ubmVjdCB8fCByZWxlYXNlKSB7CisJCW1uY2Nfc2V0X2NhdXNlKCZtb19yZWwsIG1vX2xvY2F0aW9uLCBtb19jYXVzZSk7CisJCW1vX3JlbC5jYXVzZS5kaWFnWzBdID0gKCh0cmFucy0+Y2MuVGN1cnJlbnQgJiAweGYwMCkgPj4gOCkgKyAnMCc7CisJCW1vX3JlbC5jYXVzZS5kaWFnWzFdID0gKCh0cmFucy0+Y2MuVGN1cnJlbnQgJiAweDBmMCkgPj4gNCkgKyAnMCc7CisJCW1vX3JlbC5jYXVzZS5kaWFnWzJdID0gKHRyYW5zLT5jYy5UY3VycmVudCAmIDB4MDBmKSArICcwJzsKKwkJbW9fcmVsLmNhdXNlLmRpYWdfbGVuID0gMzsKKworCQlpZiAoZGlzY29ubmVjdCkKKwkJCWdzbTQ4X2NjX3R4X2Rpc2Nvbm5lY3QodHJhbnMsICZtb19yZWwpOworCQlpZiAocmVsZWFzZSkKKwkJCWdzbTQ4X2NjX3R4X3JlbGVhc2UodHJhbnMsICZtb19yZWwpOworCX0KKworfQorCitzdGF0aWMgdm9pZCBnc200OF9zdGFydF9jY190aW1lcihzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgaW50IGN1cnJlbnQsCisJCQkJIGludCBzZWMsIGludCBtaWNybykKK3sKKwlERUJVR1AoRENDLCAic3RhcnRpbmcgdGltZXIgVCV4IHdpdGggJWQgc2Vjb25kc1xuIiwgY3VycmVudCwgc2VjKTsKKwl0cmFucy0+Y2MudGltZXIuY2IgPSBnc200OF9jY190aW1lb3V0OworCXRyYW5zLT5jYy50aW1lci5kYXRhID0gdHJhbnM7CisJYnNjX3NjaGVkdWxlX3RpbWVyKCZ0cmFucy0+Y2MudGltZXIsIHNlYywgbWljcm8pOworCXRyYW5zLT5jYy5UY3VycmVudCA9IGN1cnJlbnQ7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2Nfcnhfc2V0dXAoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdV9pbnQ4X3QgbXNnX3R5cGUgPSBnaC0+bXNnX3R5cGUgJiAweGJmOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyBzZXR1cDsKKworCW1lbXNldCgmc2V0dXAsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlzZXR1cC5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgMCwgMCk7CisJLyogZW1lcmdlbmN5IHNldHVwIGlzIGlkZW50aWZpZWQgYnkgbXNnX3R5cGUgKi8KKwlpZiAobXNnX3R5cGUgPT0gR1NNNDhfTVRfQ0NfRU1FUkdfU0VUVVApCisJCXNldHVwLmVtZXJnZW5jeSA9IDE7CisKKwkvKiB1c2Ugc3Vic2NyaWJlciBhcyBjYWxsaW5nIHBhcnR5IG51bWJlciAqLworCWlmICh0cmFucy0+c3Vic2NyKSB7CisJCXNldHVwLmZpZWxkcyB8PSBNTkNDX0ZfQ0FMTElORzsKKwkJc3RybmNweShzZXR1cC5jYWxsaW5nLm51bWJlciwgdHJhbnMtPnN1YnNjci0+ZXh0ZW5zaW9uLAorCQkJc2l6ZW9mKHNldHVwLmNhbGxpbmcubnVtYmVyKS0xKTsKKwkJc3RybmNweShzZXR1cC5pbXNpLCB0cmFucy0+c3Vic2NyLT5pbXNpLAorCQkJc2l6ZW9mKHNldHVwLmltc2kpLTEpOworCX0KKwkvKiBiZWFyZXIgY2FwYWJpbGl0eSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9CRUFSRVJfQ0FQKSkgeworCQlzZXR1cC5maWVsZHMgfD0gTU5DQ19GX0JFQVJFUl9DQVA7CisJCWdzbTQ4X2RlY29kZV9iZWFyZXJfY2FwKCZzZXR1cC5iZWFyZXJfY2FwLAorCQkJCSAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9CRUFSRVJfQ0FQKS0xKTsKKwl9CisJLyogZmFjaWxpdHkgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfRkFDSUxJVFkpKSB7CisJCXNldHVwLmZpZWxkcyB8PSBNTkNDX0ZfRkFDSUxJVFk7CisJCWdzbTQ4X2RlY29kZV9mYWNpbGl0eSgmc2V0dXAuZmFjaWxpdHksCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9GQUNJTElUWSktMSk7CisJfQorCS8qIGNhbGxlZCBwYXJ0eSBiY2QgbnVtYmVyICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0NBTExFRF9CQ0QpKSB7CisJCXNldHVwLmZpZWxkcyB8PSBNTkNDX0ZfQ0FMTEVEOworCQlnc200OF9kZWNvZGVfY2FsbGVkKCZzZXR1cC5jYWxsZWQsCisJCQkgICAgICBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0NBTExFRF9CQ0QpLTEpOworCX0KKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKSkgeworCQlzZXR1cC5maWVsZHMgfD0gTU5DQ19GX1VTRVJVU0VSOworCQlnc200OF9kZWNvZGVfdXNlcnVzZXIoJnNldHVwLnVzZXJ1c2VyLAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKS0xKTsKKwl9CisJLyogc3MtdmVyc2lvbiAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9TU19WRVJTKSkgeworCQlzZXR1cC5maWVsZHMgfD0gTU5DQ19GX1NTVkVSU0lPTjsKKwkJZ3NtNDhfZGVjb2RlX3NzdmVyc2lvbigmc2V0dXAuc3N2ZXJzaW9uLAorCQkJCSBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpLTEpOworCX0KKwkvKiBDTElSIHN1cHByZXNzaW9uICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0NMSVJfU1VQUCkpCisJCXNldHVwLmNsaXIuc3VwID0gMTsKKwkvKiBDTElSIGludm9jYXRpb24gKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQ0xJUl9JTlZPQykpCisJCXNldHVwLmNsaXIuaW52ID0gMTsKKwkvKiBjYyBjYXAgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQ0NfQ0FQKSkgeworCQlzZXR1cC5maWVsZHMgfD0gTU5DQ19GX0NDQ0FQOworCQlnc200OF9kZWNvZGVfY2NjYXAoJnNldHVwLmNjY2FwLAorCQkJICAgICBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0NDX0NBUCktMSk7CisJfQorCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0lOSVRJQVRFRCk7CisKKwlMT0dQKERDQywgTE9HTF9JTkZPLCAiU3Vic2NyaWJlciAlcyAoJXMpIHNlbmRzIFNFVFVQIHRvICVzXG4iLAorCSAgICAgc3Vic2NyX25hbWUodHJhbnMtPnN1YnNjciksIHRyYW5zLT5zdWJzY3ItPmV4dGVuc2lvbiwKKwkgICAgIHNldHVwLmNhbGxlZC5udW1iZXIpOworCisJLyogaW5kaWNhdGUgc2V0dXAgdG8gTU5DQyAqLworCW1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX1NFVFVQX0lORCwgJnNldHVwKTsKKworCS8qIE1OQ0MgY29kZSB3aWxsIG1vZGlmeSB0aGUgY2hhbm5lbCBhc3luY2hyb25vdXNseSwgd2Ugc2hvdWxkCisJICogaXBhY2Nlc3MtYmluZCBvbmx5IGFmdGVyIHRoZSBtb2RpZmljYXRpb24gaGFzIGJlZW4gbWFkZSB0byB0aGUKKwkgKiBsY2hhbi0+dGNoX21vZGUgKi8KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9zZXR1cChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisJc3RydWN0IGdzbV9tbmNjICpzZXR1cCA9IGFyZzsKKwlpbnQgcmMsIHRyYW5zX2lkOworCisJZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCS8qIHRyYW5zYWN0aW9uIGlkIG11c3Qgbm90IGJlIGFzc2lnbmVkICovCisJaWYgKHRyYW5zLT50cmFuc2FjdGlvbl9pZCAhPSAweGZmKSB7IC8qIHVuYXNzc2lnbmVkICovCisJCURFQlVHUChEQ0MsICJUWCBTZXR1cCB3aXRoIGFzc2lnbmVkIHRyYW5zYWN0aW9uLiAiCisJCQkiVGhpcyBpcyBub3QgYWxsb3dlZCFcbiIpOworCQkvKiBUZW1wb3JhcmlseSBvdXQgb2Ygb3JkZXIgKi8KKwkJcmMgPSBtbmNjX3JlbGVhc2VfaW5kKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIHRyYW5zLT5jYWxscmVmLAorCQkJCSAgICAgIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQkgICAgICBHU000OF9DQ19DQVVTRV9SRVNPVVJDRV9VTkFWQUlMKTsKKwkJdHJhbnMtPmNhbGxyZWYgPSAwOworCQl0cmFuc19mcmVlKHRyYW5zKTsKKwkJcmV0dXJuIHJjOworCX0KKwkKKwkvKiBHZXQgZnJlZSB0cmFuc2FjdGlvbl9pZCAqLworCXRyYW5zX2lkID0gdHJhbnNfYXNzaWduX3RyYW5zX2lkKHRyYW5zLT5zdWJzY3IsIEdTTTQ4X1BESVNDX0NDLCAwKTsKKwlpZiAodHJhbnNfaWQgPCAwKSB7CisJCS8qIG5vIGZyZWUgdHJhbnNhY3Rpb24gSUQgKi8KKwkJcmMgPSBtbmNjX3JlbGVhc2VfaW5kKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIHRyYW5zLT5jYWxscmVmLAorCQkJCSAgICAgIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQkgICAgICBHU000OF9DQ19DQVVTRV9SRVNPVVJDRV9VTkFWQUlMKTsKKwkJdHJhbnMtPmNhbGxyZWYgPSAwOworCQl0cmFuc19mcmVlKHRyYW5zKTsKKwkJcmV0dXJuIHJjOworCX0KKwl0cmFucy0+dHJhbnNhY3Rpb25faWQgPSB0cmFuc19pZDsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX1NFVFVQOworCisJZ3NtNDhfc3RhcnRfY2NfdGltZXIodHJhbnMsIDB4MzAzLCBHU000OF9UMzAzKTsKKworCS8qIGJlYXJlciBjYXBhYmlsaXR5ICovCisJaWYgKHNldHVwLT5maWVsZHMgJiBNTkNDX0ZfQkVBUkVSX0NBUCkKKwkJZ3NtNDhfZW5jb2RlX2JlYXJlcl9jYXAobXNnLCAwLCAmc2V0dXAtPmJlYXJlcl9jYXApOworCS8qIGZhY2lsaXR5ICovCisJaWYgKHNldHVwLT5maWVsZHMgJiBNTkNDX0ZfRkFDSUxJVFkpCisJCWdzbTQ4X2VuY29kZV9mYWNpbGl0eShtc2csIDAsICZzZXR1cC0+ZmFjaWxpdHkpOworCS8qIHByb2dyZXNzICovCisJaWYgKHNldHVwLT5maWVsZHMgJiBNTkNDX0ZfUFJPR1JFU1MpCisJCWdzbTQ4X2VuY29kZV9wcm9ncmVzcyhtc2csIDAsICZzZXR1cC0+cHJvZ3Jlc3MpOworCS8qIGNhbGxpbmcgcGFydHkgQkNEIG51bWJlciAqLworCWlmIChzZXR1cC0+ZmllbGRzICYgTU5DQ19GX0NBTExJTkcpCisJCWdzbTQ4X2VuY29kZV9jYWxsaW5nKG1zZywgJnNldHVwLT5jYWxsaW5nKTsKKwkvKiBjYWxsZWQgcGFydHkgQkNEIG51bWJlciAqLworCWlmIChzZXR1cC0+ZmllbGRzICYgTU5DQ19GX0NBTExFRCkKKwkJZ3NtNDhfZW5jb2RlX2NhbGxlZChtc2csICZzZXR1cC0+Y2FsbGVkKTsKKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAoc2V0dXAtPmZpZWxkcyAmIE1OQ0NfRl9VU0VSVVNFUikKKwkJZ3NtNDhfZW5jb2RlX3VzZXJ1c2VyKG1zZywgMCwgJnNldHVwLT51c2VydXNlcik7CisJLyogcmVkaXJlY3RpbmcgcGFydHkgQkNEIG51bWJlciAqLworCWlmIChzZXR1cC0+ZmllbGRzICYgTU5DQ19GX1JFRElSRUNUSU5HKQorCQlnc200OF9lbmNvZGVfcmVkaXJlY3RpbmcobXNnLCAmc2V0dXAtPnJlZGlyZWN0aW5nKTsKKwkvKiBzaWduYWwgKi8KKwlpZiAoc2V0dXAtPmZpZWxkcyAmIE1OQ0NfRl9TSUdOQUwpCisJCWdzbTQ4X2VuY29kZV9zaWduYWwobXNnLCBzZXR1cC0+c2lnbmFsKTsKKwkKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfQ0FMTF9QUkVTRU5UKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X2NhbGxfY29uZihzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2MgY2FsbF9jb25mOworCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisJZ3NtNDhfc3RhcnRfY2NfdGltZXIodHJhbnMsIDB4MzEwLCBHU000OF9UMzEwKTsKKworCW1lbXNldCgmY2FsbF9jb25mLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJY2FsbF9jb25mLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwl0bHZfcGFyc2UoJnRwLCAmZ3NtNDhfYXR0X3RsdmRlZiwgZ2gtPmRhdGEsIHBheWxvYWRfbGVuLCAwLCAwKTsKKyNpZiAwCisJLyogcmVwZWF0ICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1JFUEVBVF9DSVIpKQorCQljYWxsX2NvbmYucmVwZWF0ID0gMTsKKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfUkVQRUFUX1NFUSkpCisJCWNhbGxfY29uZi5yZXBlYXQgPSAyOworI2VuZGlmCisJLyogYmVhcmVyIGNhcGFiaWxpdHkgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQkVBUkVSX0NBUCkpIHsKKwkJY2FsbF9jb25mLmZpZWxkcyB8PSBNTkNDX0ZfQkVBUkVSX0NBUDsKKwkJZ3NtNDhfZGVjb2RlX2JlYXJlcl9jYXAoJmNhbGxfY29uZi5iZWFyZXJfY2FwLAorCQkJCSAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9CRUFSRVJfQ0FQKS0xKTsKKwl9CisJLyogY2F1c2UgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQ0FVU0UpKSB7CisJCWNhbGxfY29uZi5maWVsZHMgfD0gTU5DQ19GX0NBVVNFOworCQlnc200OF9kZWNvZGVfY2F1c2UoJmNhbGxfY29uZi5jYXVzZSwKKwkJCSAgICAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9DQVVTRSktMSk7CisJfQorCS8qIGNjIGNhcCAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9DQ19DQVApKSB7CisJCWNhbGxfY29uZi5maWVsZHMgfD0gTU5DQ19GX0NDQ0FQOworCQlnc200OF9kZWNvZGVfY2NjYXAoJmNhbGxfY29uZi5jY2NhcCwKKwkJCSAgICAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9DQ19DQVApLTEpOworCX0KKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9NT19URVJNX0NBTExfQ09ORik7CisKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfQ0FMTF9DT05GX0lORCwKKwkJCSAgICAmY2FsbF9jb25mKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9jYWxsX3Byb2Moc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKnByb2NlZWRpbmcgPSBhcmc7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfQ0NfQ0FMTF9QUk9DOworCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX01PX0NBTExfUFJPQyk7CisKKwkvKiBiZWFyZXIgY2FwYWJpbGl0eSAqLworCWlmIChwcm9jZWVkaW5nLT5maWVsZHMgJiBNTkNDX0ZfQkVBUkVSX0NBUCkKKwkJZ3NtNDhfZW5jb2RlX2JlYXJlcl9jYXAobXNnLCAwLCAmcHJvY2VlZGluZy0+YmVhcmVyX2NhcCk7CisJLyogZmFjaWxpdHkgKi8KKwlpZiAocHJvY2VlZGluZy0+ZmllbGRzICYgTU5DQ19GX0ZBQ0lMSVRZKQorCQlnc200OF9lbmNvZGVfZmFjaWxpdHkobXNnLCAwLCAmcHJvY2VlZGluZy0+ZmFjaWxpdHkpOworCS8qIHByb2dyZXNzICovCisJaWYgKHByb2NlZWRpbmctPmZpZWxkcyAmIE1OQ0NfRl9QUk9HUkVTUykKKwkJZ3NtNDhfZW5jb2RlX3Byb2dyZXNzKG1zZywgMCwgJnByb2NlZWRpbmctPnByb2dyZXNzKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X2FsZXJ0aW5nKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyBhbGVydGluZzsKKwkKKwlnc200OF9zdG9wX2NjX3RpbWVyKHRyYW5zKTsKKwlnc200OF9zdGFydF9jY190aW1lcih0cmFucywgMHgzMDEsIEdTTTQ4X1QzMDEpOworCisJbWVtc2V0KCZhbGVydGluZywgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCWFsZXJ0aW5nLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwl0bHZfcGFyc2UoJnRwLCAmZ3NtNDhfYXR0X3RsdmRlZiwgZ2gtPmRhdGEsIHBheWxvYWRfbGVuLCAwLCAwKTsKKwkvKiBmYWNpbGl0eSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9GQUNJTElUWSkpIHsKKwkJYWxlcnRpbmcuZmllbGRzIHw9IE1OQ0NfRl9GQUNJTElUWTsKKwkJZ3NtNDhfZGVjb2RlX2ZhY2lsaXR5KCZhbGVydGluZy5mYWNpbGl0eSwKKwkJCQlUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKS0xKTsKKwl9CisKKwkvKiBwcm9ncmVzcyAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9QUk9HUl9JTkQpKSB7CisJCWFsZXJ0aW5nLmZpZWxkcyB8PSBNTkNDX0ZfUFJPR1JFU1M7CisJCWdzbTQ4X2RlY29kZV9wcm9ncmVzcygmYWxlcnRpbmcucHJvZ3Jlc3MsCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9QUk9HUl9JTkQpLTEpOworCX0KKwkvKiBzcy12ZXJzaW9uICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpKSB7CisJCWFsZXJ0aW5nLmZpZWxkcyB8PSBNTkNDX0ZfU1NWRVJTSU9OOworCQlnc200OF9kZWNvZGVfc3N2ZXJzaW9uKCZhbGVydGluZy5zc3ZlcnNpb24sCisJCQkJIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfU1NfVkVSUyktMSk7CisJfQorCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0NBTExfUkVDRUlWRUQpOworCisJcmV0dXJuIG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX0FMRVJUX0lORCwKKwkJCSAgICAmYWxlcnRpbmcpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X2FsZXJ0aW5nKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV9tbmNjICphbGVydGluZyA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19BTEVSVElORzsKKworCS8qIGZhY2lsaXR5ICovCisJaWYgKGFsZXJ0aW5nLT5maWVsZHMgJiBNTkNDX0ZfRkFDSUxJVFkpCisJCWdzbTQ4X2VuY29kZV9mYWNpbGl0eShtc2csIDAsICZhbGVydGluZy0+ZmFjaWxpdHkpOworCS8qIHByb2dyZXNzICovCisJaWYgKGFsZXJ0aW5nLT5maWVsZHMgJiBNTkNDX0ZfUFJPR1JFU1MpCisJCWdzbTQ4X2VuY29kZV9wcm9ncmVzcyhtc2csIDAsICZhbGVydGluZy0+cHJvZ3Jlc3MpOworCS8qIHVzZXItdXNlciAqLworCWlmIChhbGVydGluZy0+ZmllbGRzICYgTU5DQ19GX1VTRVJVU0VSKQorCQlnc200OF9lbmNvZGVfdXNlcnVzZXIobXNnLCAwLCAmYWxlcnRpbmctPnVzZXJ1c2VyKTsKKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9DQUxMX0RFTElWRVJFRCk7CisJCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfcHJvZ3Jlc3Moc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKnByb2dyZXNzID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX1BST0dSRVNTOworCisJLyogcHJvZ3Jlc3MgKi8KKwlnc200OF9lbmNvZGVfcHJvZ3Jlc3MobXNnLCAxLCAmcHJvZ3Jlc3MtPnByb2dyZXNzKTsKKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAocHJvZ3Jlc3MtPmZpZWxkcyAmIE1OQ0NfRl9VU0VSVVNFUikKKwkJZ3NtNDhfZW5jb2RlX3VzZXJ1c2VyKG1zZywgMCwgJnByb2dyZXNzLT51c2VydXNlcik7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9jb25uZWN0KHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV9tbmNjICpjb25uZWN0ID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX0NPTk5FQ1Q7CisKKwlnc200OF9zdG9wX2NjX3RpbWVyKHRyYW5zKTsKKwlnc200OF9zdGFydF9jY190aW1lcih0cmFucywgMHgzMTMsIEdTTTQ4X1QzMTMpOworCisJLyogZmFjaWxpdHkgKi8KKwlpZiAoY29ubmVjdC0+ZmllbGRzICYgTU5DQ19GX0ZBQ0lMSVRZKQorCQlnc200OF9lbmNvZGVfZmFjaWxpdHkobXNnLCAwLCAmY29ubmVjdC0+ZmFjaWxpdHkpOworCS8qIHByb2dyZXNzICovCisJaWYgKGNvbm5lY3QtPmZpZWxkcyAmIE1OQ0NfRl9QUk9HUkVTUykKKwkJZ3NtNDhfZW5jb2RlX3Byb2dyZXNzKG1zZywgMCwgJmNvbm5lY3QtPnByb2dyZXNzKTsKKwkvKiBjb25uZWN0ZWQgbnVtYmVyICovCisJaWYgKGNvbm5lY3QtPmZpZWxkcyAmIE1OQ0NfRl9DT05ORUNURUQpCisJCWdzbTQ4X2VuY29kZV9jb25uZWN0ZWQobXNnLCAmY29ubmVjdC0+Y29ubmVjdGVkKTsKKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAoY29ubmVjdC0+ZmllbGRzICYgTU5DQ19GX1VTRVJVU0VSKQorCQlnc200OF9lbmNvZGVfdXNlcnVzZXIobXNnLCAwLCAmY29ubmVjdC0+dXNlcnVzZXIpOworCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0NPTk5FQ1RfSU5EKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X2Nvbm5lY3Qoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuID0gbXNnYl9sM2xlbihtc2cpIC0gc2l6ZW9mKCpnaCk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJc3RydWN0IGdzbV9tbmNjIGNvbm5lY3Q7CisKKwlnc200OF9zdG9wX2NjX3RpbWVyKHRyYW5zKTsKKworCW1lbXNldCgmY29ubmVjdCwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCWNvbm5lY3QuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXRsdl9wYXJzZSgmdHAsICZnc200OF9hdHRfdGx2ZGVmLCBnaC0+ZGF0YSwgcGF5bG9hZF9sZW4sIDAsIDApOworCS8qIHVzZSBzdWJzY3JpYmVyIGFzIGNvbm5lY3RlZCBwYXJ0eSBudW1iZXIgKi8KKwlpZiAodHJhbnMtPnN1YnNjcikgeworCQljb25uZWN0LmZpZWxkcyB8PSBNTkNDX0ZfQ09OTkVDVEVEOworCQlzdHJuY3B5KGNvbm5lY3QuY29ubmVjdGVkLm51bWJlciwgdHJhbnMtPnN1YnNjci0+ZXh0ZW5zaW9uLAorCQkJc2l6ZW9mKGNvbm5lY3QuY29ubmVjdGVkLm51bWJlciktMSk7CisJCXN0cm5jcHkoY29ubmVjdC5pbXNpLCB0cmFucy0+c3Vic2NyLT5pbXNpLAorCQkJc2l6ZW9mKGNvbm5lY3QuaW1zaSktMSk7CisJfQorCS8qIGZhY2lsaXR5ICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKSkgeworCQljb25uZWN0LmZpZWxkcyB8PSBNTkNDX0ZfRkFDSUxJVFk7CisJCWdzbTQ4X2RlY29kZV9mYWNpbGl0eSgmY29ubmVjdC5mYWNpbGl0eSwKKwkJCQlUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKS0xKTsKKwl9CisJLyogdXNlci11c2VyICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1VTRVJfVVNFUikpIHsKKwkJY29ubmVjdC5maWVsZHMgfD0gTU5DQ19GX1VTRVJVU0VSOworCQlnc200OF9kZWNvZGVfdXNlcnVzZXIoJmNvbm5lY3QudXNlcnVzZXIsCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9VU0VSX1VTRVIpLTEpOworCX0KKwkvKiBzcy12ZXJzaW9uICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpKSB7CisJCWNvbm5lY3QuZmllbGRzIHw9IE1OQ0NfRl9TU1ZFUlNJT047CisJCWdzbTQ4X2RlY29kZV9zc3ZlcnNpb24oJmNvbm5lY3Quc3N2ZXJzaW9uLAorCQkJCSBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpLTEpOworCX0KKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9DT05ORUNUX1JFUVVFU1QpOworCisJcmV0dXJuIG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX1NFVFVQX0NORiwgJmNvbm5lY3QpOworfQorCisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfY29ubmVjdF9hY2soc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9tbmNjIGNvbm5lY3RfYWNrOworCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfQUNUSVZFKTsKKwkKKwltZW1zZXQoJmNvbm5lY3RfYWNrLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJY29ubmVjdF9hY2suY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19TRVRVUF9DT01QTF9JTkQsCisJCQkgICAgJmNvbm5lY3RfYWNrKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9jb25uZWN0X2FjayhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX0NPTk5FQ1RfQUNLOworCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0FDVElWRSk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9kaXNjb25uZWN0KHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyBkaXNjOworCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfRElTQ09OTkVDVF9SRVEpOworCisJbWVtc2V0KCZkaXNjLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJZGlzYy5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgR1NNNDhfSUVfQ0FVU0UsIDApOworCS8qIGNhdXNlICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0NBVVNFKSkgeworCQlkaXNjLmZpZWxkcyB8PSBNTkNDX0ZfQ0FVU0U7CisJCWdzbTQ4X2RlY29kZV9jYXVzZSgmZGlzYy5jYXVzZSwKKwkJCSAgICAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9DQVVTRSktMSk7CisJfQorCS8qIGZhY2lsaXR5ICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKSkgeworCQlkaXNjLmZpZWxkcyB8PSBNTkNDX0ZfRkFDSUxJVFk7CisJCWdzbTQ4X2RlY29kZV9mYWNpbGl0eSgmZGlzYy5mYWNpbGl0eSwKKwkJCQlUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKS0xKTsKKwl9CisJLyogdXNlci11c2VyICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1VTRVJfVVNFUikpIHsKKwkJZGlzYy5maWVsZHMgfD0gTU5DQ19GX1VTRVJVU0VSOworCQlnc200OF9kZWNvZGVfdXNlcnVzZXIoJmRpc2MudXNlcnVzZXIsCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9VU0VSX1VTRVIpLTEpOworCX0KKwkvKiBzcy12ZXJzaW9uICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpKSB7CisJCWRpc2MuZmllbGRzIHw9IE1OQ0NfRl9TU1ZFUlNJT047CisJCWdzbTQ4X2RlY29kZV9zc3ZlcnNpb24oJmRpc2Muc3N2ZXJzaW9uLAorCQkJCSBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpLTEpOworCX0KKworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19ESVNDX0lORCwgJmRpc2MpOworCit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX21uY2NfY2F1c2UgZGVmYXVsdF9jYXVzZSA9IHsKKwkubG9jYXRpb24JPSBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJLmNvZGluZwkJPSAwLAorCS5yZWMJCT0gMCwKKwkucmVjX3ZhbAk9IDAsCisJLnZhbHVlCQk9IEdTTTQ4X0NDX0NBVVNFX05PUk1BTF9VTlNQRUMsCisJLmRpYWdfbGVuCT0gMCwKKwkuZGlhZwkJPSB7IDAgfSwKK307CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfZGlzY29ubmVjdChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqZGlzYyA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19ESVNDT05ORUNUOworCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisJZ3NtNDhfc3RhcnRfY2NfdGltZXIodHJhbnMsIDB4MzA2LCBHU000OF9UMzA2KTsKKworCS8qIGNhdXNlICovCisJaWYgKGRpc2MtPmZpZWxkcyAmIE1OQ0NfRl9DQVVTRSkKKwkJZ3NtNDhfZW5jb2RlX2NhdXNlKG1zZywgMSwgJmRpc2MtPmNhdXNlKTsKKwllbHNlCisJCWdzbTQ4X2VuY29kZV9jYXVzZShtc2csIDEsICZkZWZhdWx0X2NhdXNlKTsKKworCS8qIGZhY2lsaXR5ICovCisJaWYgKGRpc2MtPmZpZWxkcyAmIE1OQ0NfRl9GQUNJTElUWSkKKwkJZ3NtNDhfZW5jb2RlX2ZhY2lsaXR5KG1zZywgMCwgJmRpc2MtPmZhY2lsaXR5KTsKKwkvKiBwcm9ncmVzcyAqLworCWlmIChkaXNjLT5maWVsZHMgJiBNTkNDX0ZfUFJPR1JFU1MpCisJCWdzbTQ4X2VuY29kZV9wcm9ncmVzcyhtc2csIDAsICZkaXNjLT5wcm9ncmVzcyk7CisJLyogdXNlci11c2VyICovCisJaWYgKGRpc2MtPmZpZWxkcyAmIE1OQ0NfRl9VU0VSVVNFUikKKwkJZ3NtNDhfZW5jb2RlX3VzZXJ1c2VyKG1zZywgMCwgJmRpc2MtPnVzZXJ1c2VyKTsKKworCS8qIHN0b3JlIGRpc2Nvbm5lY3QgY2F1c2UgZm9yIFQzMDYgZXhwaXJ5ICovCisJbWVtY3B5KCZ0cmFucy0+Y2MubXNnLCBkaXNjLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfRElTQ09OTkVDVF9JTkQpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfcmVsZWFzZShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2MgcmVsOworCWludCByYzsKKworCWdzbTQ4X3N0b3BfY2NfdGltZXIodHJhbnMpOworCisJbWVtc2V0KCZyZWwsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlyZWwuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXRsdl9wYXJzZSgmdHAsICZnc200OF9hdHRfdGx2ZGVmLCBnaC0+ZGF0YSwgcGF5bG9hZF9sZW4sIDAsIDApOworCS8qIGNhdXNlICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0NBVVNFKSkgeworCQlyZWwuZmllbGRzIHw9IE1OQ0NfRl9DQVVTRTsKKwkJZ3NtNDhfZGVjb2RlX2NhdXNlKCZyZWwuY2F1c2UsCisJCQkgICAgIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfQ0FVU0UpLTEpOworCX0KKwkvKiBmYWNpbGl0eSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9GQUNJTElUWSkpIHsKKwkJcmVsLmZpZWxkcyB8PSBNTkNDX0ZfRkFDSUxJVFk7CisJCWdzbTQ4X2RlY29kZV9mYWNpbGl0eSgmcmVsLmZhY2lsaXR5LAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfRkFDSUxJVFkpLTEpOworCX0KKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKSkgeworCQlyZWwuZmllbGRzIHw9IE1OQ0NfRl9VU0VSVVNFUjsKKwkJZ3NtNDhfZGVjb2RlX3VzZXJ1c2VyKCZyZWwudXNlcnVzZXIsCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9VU0VSX1VTRVIpLTEpOworCX0KKwkvKiBzcy12ZXJzaW9uICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpKSB7CisJCXJlbC5maWVsZHMgfD0gTU5DQ19GX1NTVkVSU0lPTjsKKwkJZ3NtNDhfZGVjb2RlX3NzdmVyc2lvbigmcmVsLnNzdmVyc2lvbiwKKwkJCQkgVExWUF9WQUwoJnRwLCBHU000OF9JRV9TU19WRVJTKS0xKTsKKwl9CisKKwlpZiAodHJhbnMtPmNjLnN0YXRlID09IEdTTV9DU1RBVEVfUkVMRUFTRV9SRVEpIHsKKwkJLyogcmVsZWFzZSBjb2xsaXNpb24gNS40LjUgKi8KKwkJcmMgPSBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19SRUxfQ05GLCAmcmVsKTsKKwl9IGVsc2UgeworCQlyYyA9IGdzbTQ4X3R4X3NpbXBsZShtc2ctPmxjaGFuLAorCQkJCSAgICAgR1NNNDhfUERJU0NfQ0MgfCAodHJhbnMtPnRyYW5zYWN0aW9uX2lkIDw8IDQpLAorCQkJCSAgICAgR1NNNDhfTVRfQ0NfUkVMRUFTRV9DT01QTCk7CisJCXJjID0gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfUkVMX0lORCwgJnJlbCk7CisJfQorCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX05VTEwpOworCisJdHJhbnMtPmNhbGxyZWYgPSAwOworCXRyYW5zX2ZyZWUodHJhbnMpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X3JlbGVhc2Uoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKnJlbCA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19SRUxFQVNFOworCisJdHJhbnMtPmNhbGxyZWYgPSAwOworCQorCWdzbTQ4X3N0b3BfY2NfdGltZXIodHJhbnMpOworCWdzbTQ4X3N0YXJ0X2NjX3RpbWVyKHRyYW5zLCAweDMwOCwgR1NNNDhfVDMwOCk7CisKKwkvKiBjYXVzZSAqLworCWlmIChyZWwtPmZpZWxkcyAmIE1OQ0NfRl9DQVVTRSkKKwkJZ3NtNDhfZW5jb2RlX2NhdXNlKG1zZywgMCwgJnJlbC0+Y2F1c2UpOworCS8qIGZhY2lsaXR5ICovCisJaWYgKHJlbC0+ZmllbGRzICYgTU5DQ19GX0ZBQ0lMSVRZKQorCQlnc200OF9lbmNvZGVfZmFjaWxpdHkobXNnLCAwLCAmcmVsLT5mYWNpbGl0eSk7CisJLyogdXNlci11c2VyICovCisJaWYgKHJlbC0+ZmllbGRzICYgTU5DQ19GX1VTRVJVU0VSKQorCQlnc200OF9lbmNvZGVfdXNlcnVzZXIobXNnLCAwLCAmcmVsLT51c2VydXNlcik7CisKKwl0cmFucy0+Y2MuVDMwOF9zZWNvbmQgPSAwOworCW1lbWNweSgmdHJhbnMtPmNjLm1zZywgcmVsLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisKKwlpZiAodHJhbnMtPmNjLnN0YXRlICE9IEdTTV9DU1RBVEVfUkVMRUFTRV9SRVEpCisJCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9SRUxFQVNFX1JFUSk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9yZWxlYXNlX2NvbXBsKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyByZWw7CisJaW50IHJjID0gMDsKKworCWdzbTQ4X3N0b3BfY2NfdGltZXIodHJhbnMpOworCisJbWVtc2V0KCZyZWwsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlyZWwuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXRsdl9wYXJzZSgmdHAsICZnc200OF9hdHRfdGx2ZGVmLCBnaC0+ZGF0YSwgcGF5bG9hZF9sZW4sIDAsIDApOworCS8qIGNhdXNlICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0NBVVNFKSkgeworCQlyZWwuZmllbGRzIHw9IE1OQ0NfRl9DQVVTRTsKKwkJZ3NtNDhfZGVjb2RlX2NhdXNlKCZyZWwuY2F1c2UsCisJCQkgICAgIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfQ0FVU0UpLTEpOworCX0KKwkvKiBmYWNpbGl0eSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9GQUNJTElUWSkpIHsKKwkJcmVsLmZpZWxkcyB8PSBNTkNDX0ZfRkFDSUxJVFk7CisJCWdzbTQ4X2RlY29kZV9mYWNpbGl0eSgmcmVsLmZhY2lsaXR5LAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfRkFDSUxJVFkpLTEpOworCX0KKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKSkgeworCQlyZWwuZmllbGRzIHw9IE1OQ0NfRl9VU0VSVVNFUjsKKwkJZ3NtNDhfZGVjb2RlX3VzZXJ1c2VyKCZyZWwudXNlcnVzZXIsCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9VU0VSX1VTRVIpLTEpOworCX0KKwkvKiBzcy12ZXJzaW9uICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpKSB7CisJCXJlbC5maWVsZHMgfD0gTU5DQ19GX1NTVkVSU0lPTjsKKwkJZ3NtNDhfZGVjb2RlX3NzdmVyc2lvbigmcmVsLnNzdmVyc2lvbiwKKwkJCQkgVExWUF9WQUwoJnRwLCBHU000OF9JRV9TU19WRVJTKS0xKTsKKwl9CisKKwlpZiAodHJhbnMtPmNhbGxyZWYpIHsKKwkJc3dpdGNoICh0cmFucy0+Y2Muc3RhdGUpIHsKKwkJY2FzZSBHU01fQ1NUQVRFX0NBTExfUFJFU0VOVDoKKwkJCXJjID0gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsCisJCQkJCSAgTU5DQ19SRUpfSU5ELCAmcmVsKTsKKwkJCWJyZWFrOworCQljYXNlIEdTTV9DU1RBVEVfUkVMRUFTRV9SRVE6CisJCQlyYyA9IG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLAorCQkJCQkgIE1OQ0NfUkVMX0NORiwgJnJlbCk7CisJCQkvKiBGSVhNRTogaW4gY2FzZSBvZiBtdWx0aXBsZSBjYWxscywgd2UgY2FuJ3Qgc2ltcGx5CisJCQkgKiBoYW5nIHVwIGhlcmUgISAqLworCQkJbGNoYW5fYXV0b19yZWxlYXNlKG1zZy0+bGNoYW4pOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlyYyA9IG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLAorCQkJCQkgIE1OQ0NfUkVMX0lORCwgJnJlbCk7CisJCX0KKwl9CisKKwl0cmFucy0+Y2FsbHJlZiA9IDA7CisJdHJhbnNfZnJlZSh0cmFucyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfcmVsZWFzZV9jb21wbChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqcmVsID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX1JFTEVBU0VfQ09NUEw7CisKKwl0cmFucy0+Y2FsbHJlZiA9IDA7CisJCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisKKwkvKiBjYXVzZSAqLworCWlmIChyZWwtPmZpZWxkcyAmIE1OQ0NfRl9DQVVTRSkKKwkJZ3NtNDhfZW5jb2RlX2NhdXNlKG1zZywgMCwgJnJlbC0+Y2F1c2UpOworCS8qIGZhY2lsaXR5ICovCisJaWYgKHJlbC0+ZmllbGRzICYgTU5DQ19GX0ZBQ0lMSVRZKQorCQlnc200OF9lbmNvZGVfZmFjaWxpdHkobXNnLCAwLCAmcmVsLT5mYWNpbGl0eSk7CisJLyogdXNlci11c2VyICovCisJaWYgKHJlbC0+ZmllbGRzICYgTU5DQ19GX1VTRVJVU0VSKQorCQlnc200OF9lbmNvZGVfdXNlcnVzZXIobXNnLCAwLCAmcmVsLT51c2VydXNlcik7CisKKwl0cmFuc19mcmVlKHRyYW5zKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X2ZhY2lsaXR5KHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyBmYWM7CisKKwltZW1zZXQoJmZhYywgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCWZhYy5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgR1NNNDhfSUVfRkFDSUxJVFksIDApOworCS8qIGZhY2lsaXR5ICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0ZBQ0lMSVRZKSkgeworCQlmYWMuZmllbGRzIHw9IE1OQ0NfRl9GQUNJTElUWTsKKwkJZ3NtNDhfZGVjb2RlX2ZhY2lsaXR5KCZmYWMuZmFjaWxpdHksCisJCQkJVExWUF9WQUwoJnRwLCBHU000OF9JRV9GQUNJTElUWSktMSk7CisJfQorCS8qIHNzLXZlcnNpb24gKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfU1NfVkVSUykpIHsKKwkJZmFjLmZpZWxkcyB8PSBNTkNDX0ZfU1NWRVJTSU9OOworCQlnc200OF9kZWNvZGVfc3N2ZXJzaW9uKCZmYWMuc3N2ZXJzaW9uLAorCQkJCSBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX1NTX1ZFUlMpLTEpOworCX0KKworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19GQUNJTElUWV9JTkQsICZmYWMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X2ZhY2lsaXR5KHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV9tbmNjICpmYWMgPSBhcmc7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfQ0NfRkFDSUxJVFk7CisKKwkvKiBmYWNpbGl0eSAqLworCWdzbTQ4X2VuY29kZV9mYWNpbGl0eShtc2csIDEsICZmYWMtPmZhY2lsaXR5KTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X2hvbGQoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9tbmNjIGhvbGQ7CisKKwltZW1zZXQoJmhvbGQsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlob2xkLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfSE9MRF9JTkQsICZob2xkKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9ob2xkX2FjayhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX0hPTERfQUNLOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfaG9sZF9yZWooc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKmhvbGRfcmVqID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX0hPTERfUkVKOworCisJLyogY2F1c2UgKi8KKwlpZiAoaG9sZF9yZWotPmZpZWxkcyAmIE1OQ0NfRl9DQVVTRSkKKwkJZ3NtNDhfZW5jb2RlX2NhdXNlKG1zZywgMSwgJmhvbGRfcmVqLT5jYXVzZSk7CisJZWxzZQorCQlnc200OF9lbmNvZGVfY2F1c2UobXNnLCAxLCAmZGVmYXVsdF9jYXVzZSk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9yZXRyaWV2ZShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgcmV0cmlldmU7CisKKwltZW1zZXQoJnJldHJpZXZlLCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJcmV0cmlldmUuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19SRVRSSUVWRV9JTkQsCisJCQkgICAgJnJldHJpZXZlKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9yZXRyaWV2ZV9hY2soc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19SRVRSX0FDSzsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X3JldHJpZXZlX3JlaihzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqcmV0cmlldmVfcmVqID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX1JFVFJfUkVKOworCisJLyogY2F1c2UgKi8KKwlpZiAocmV0cmlldmVfcmVqLT5maWVsZHMgJiBNTkNDX0ZfQ0FVU0UpCisJCWdzbTQ4X2VuY29kZV9jYXVzZShtc2csIDEsICZyZXRyaWV2ZV9yZWotPmNhdXNlKTsKKwllbHNlCisJCWdzbTQ4X2VuY29kZV9jYXVzZShtc2csIDEsICZkZWZhdWx0X2NhdXNlKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3J4X3N0YXJ0X2R0bWYoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuID0gbXNnYl9sM2xlbihtc2cpIC0gc2l6ZW9mKCpnaCk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJc3RydWN0IGdzbV9tbmNjIGR0bWY7CisKKwltZW1zZXQoJmR0bWYsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlkdG1mLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwl0bHZfcGFyc2UoJnRwLCAmZ3NtNDhfYXR0X3RsdmRlZiwgZ2gtPmRhdGEsIHBheWxvYWRfbGVuLCAwLCAwKTsKKwkvKiBrZXlwYWQgZmFjaWxpdHkgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfS1BEX0ZBQ0lMSVRZKSkgeworCQlkdG1mLmZpZWxkcyB8PSBNTkNDX0ZfS0VZUEFEOworCQlnc200OF9kZWNvZGVfa2V5cGFkKCZkdG1mLmtleXBhZCwKKwkJCSAgICAgIFRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfS1BEX0ZBQ0lMSVRZKS0xKTsKKwl9CisKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfU1RBUlRfRFRNRl9JTkQsICZkdG1mKTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF9zdGFydF9kdG1mX2FjayhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqZHRtZiA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19TVEFSVF9EVE1GX0FDSzsKKworCS8qIGtleXBhZCAqLworCWlmIChkdG1mLT5maWVsZHMgJiBNTkNDX0ZfS0VZUEFEKQorCQlnc200OF9lbmNvZGVfa2V5cGFkKG1zZywgZHRtZi0+a2V5cGFkKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X3N0YXJ0X2R0bWZfcmVqKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB2b2lkICphcmcpCit7CisJc3RydWN0IGdzbV9tbmNjICpkdG1mID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX1NUQVJUX0RUTUZfUkVKOworCisJLyogY2F1c2UgKi8KKwlpZiAoZHRtZi0+ZmllbGRzICYgTU5DQ19GX0NBVVNFKQorCQlnc200OF9lbmNvZGVfY2F1c2UobXNnLCAxLCAmZHRtZi0+Y2F1c2UpOworCWVsc2UKKwkJZ3NtNDhfZW5jb2RlX2NhdXNlKG1zZywgMSwgJmRlZmF1bHRfY2F1c2UpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfc3RvcF9kdG1mX2FjayhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX1NUT1BfRFRNRl9BQ0s7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9zdG9wX2R0bWYoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbV9tbmNjIGR0bWY7CisKKwltZW1zZXQoJmR0bWYsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlkdG1mLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19TVE9QX0RUTUZfSU5ELCAmZHRtZik7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfbW9kaWZ5KHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyBtb2RpZnk7CisKKwltZW1zZXQoJm1vZGlmeSwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCW1vZGlmeS5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgR1NNNDhfSUVfQkVBUkVSX0NBUCwgMCk7CisJLyogYmVhcmVyIGNhcGFiaWxpdHkgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQkVBUkVSX0NBUCkpIHsKKwkJbW9kaWZ5LmZpZWxkcyB8PSBNTkNDX0ZfQkVBUkVSX0NBUDsKKwkJZ3NtNDhfZGVjb2RlX2JlYXJlcl9jYXAoJm1vZGlmeS5iZWFyZXJfY2FwLAorCQkJCSAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9CRUFSRVJfQ0FQKS0xKTsKKwl9CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfTU9fT1JJR19NT0RJRlkpOworCisJcmV0dXJuIG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX01PRElGWV9JTkQsICZtb2RpZnkpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X21vZGlmeShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqbW9kaWZ5ID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX01PRElGWTsKKworCWdzbTQ4X3N0YXJ0X2NjX3RpbWVyKHRyYW5zLCAweDMyMywgR1NNNDhfVDMyMyk7CisKKwkvKiBiZWFyZXIgY2FwYWJpbGl0eSAqLworCWdzbTQ4X2VuY29kZV9iZWFyZXJfY2FwKG1zZywgMSwgJm1vZGlmeS0+YmVhcmVyX2NhcCk7CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfTU9fVEVSTV9NT0RJRlkpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfbW9kaWZ5X2NvbXBsZXRlKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVuc2lnbmVkIGludCBwYXlsb2FkX2xlbiA9IG1zZ2JfbDNsZW4obXNnKSAtIHNpemVvZigqZ2gpOworCXN0cnVjdCB0bHZfcGFyc2VkIHRwOworCXN0cnVjdCBnc21fbW5jYyBtb2RpZnk7CisKKwlnc200OF9zdG9wX2NjX3RpbWVyKHRyYW5zKTsKKworCW1lbXNldCgmbW9kaWZ5LCAwLCBzaXplb2Yoc3RydWN0IGdzbV9tbmNjKSk7CisJbW9kaWZ5LmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwl0bHZfcGFyc2UoJnRwLCAmZ3NtNDhfYXR0X3RsdmRlZiwgZ2gtPmRhdGEsIHBheWxvYWRfbGVuLCBHU000OF9JRV9CRUFSRVJfQ0FQLCAwKTsKKwkvKiBiZWFyZXIgY2FwYWJpbGl0eSAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9CRUFSRVJfQ0FQKSkgeworCQltb2RpZnkuZmllbGRzIHw9IE1OQ0NfRl9CRUFSRVJfQ0FQOworCQlnc200OF9kZWNvZGVfYmVhcmVyX2NhcCgmbW9kaWZ5LmJlYXJlcl9jYXAsCisJCQkJICBUTFZQX1ZBTCgmdHAsIEdTTTQ4X0lFX0JFQVJFUl9DQVApLTEpOworCX0KKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9BQ1RJVkUpOworCisJcmV0dXJuIG1uY2NfcmVjdm1zZyh0cmFucy0+c3Vic2NyLT5uZXQsIHRyYW5zLCBNTkNDX01PRElGWV9DTkYsICZtb2RpZnkpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X21vZGlmeV9jb21wbGV0ZShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqbW9kaWZ5ID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX01PRElGWV9DT01QTDsKKworCS8qIGJlYXJlciBjYXBhYmlsaXR5ICovCisJZ3NtNDhfZW5jb2RlX2JlYXJlcl9jYXAobXNnLCAxLCAmbW9kaWZ5LT5iZWFyZXJfY2FwKTsKKworCW5ld19jY19zdGF0ZSh0cmFucywgR1NNX0NTVEFURV9BQ1RJVkUpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfbW9kaWZ5X3JlamVjdChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2MgbW9kaWZ5OworCisJZ3NtNDhfc3RvcF9jY190aW1lcih0cmFucyk7CisKKwltZW1zZXQoJm1vZGlmeSwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCW1vZGlmeS5jYWxscmVmID0gdHJhbnMtPmNhbGxyZWY7CisJdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbiwgR1NNNDhfSUVfQkVBUkVSX0NBUCwgR1NNNDhfSUVfQ0FVU0UpOworCS8qIGJlYXJlciBjYXBhYmlsaXR5ICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX0JFQVJFUl9DQVApKSB7CisJCW1vZGlmeS5maWVsZHMgfD0gR1NNNDhfSUVfQkVBUkVSX0NBUDsKKwkJZ3NtNDhfZGVjb2RlX2JlYXJlcl9jYXAoJm1vZGlmeS5iZWFyZXJfY2FwLAorCQkJCSAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9CRUFSRVJfQ0FQKS0xKTsKKwl9CisJLyogY2F1c2UgKi8KKwlpZiAoVExWUF9QUkVTRU5UKCZ0cCwgR1NNNDhfSUVfQ0FVU0UpKSB7CisJCW1vZGlmeS5maWVsZHMgfD0gTU5DQ19GX0NBVVNFOworCQlnc200OF9kZWNvZGVfY2F1c2UoJm1vZGlmeS5jYXVzZSwKKwkJCSAgICAgVExWUF9WQUwoJnRwLCBHU000OF9JRV9DQVVTRSktMSk7CisJfQorCisJbmV3X2NjX3N0YXRlKHRyYW5zLCBHU01fQ1NUQVRFX0FDVElWRSk7CisKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfTU9ESUZZX1JFSiwgJm1vZGlmeSk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfdHhfbW9kaWZ5X3JlamVjdChzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqbW9kaWZ5ID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX01PRElGWV9SRUpFQ1Q7CisKKwkvKiBiZWFyZXIgY2FwYWJpbGl0eSAqLworCWdzbTQ4X2VuY29kZV9iZWFyZXJfY2FwKG1zZywgMSwgJm1vZGlmeS0+YmVhcmVyX2NhcCk7CisJLyogY2F1c2UgKi8KKwlnc200OF9lbmNvZGVfY2F1c2UobXNnLCAxLCAmbW9kaWZ5LT5jYXVzZSk7CisKKwluZXdfY2Nfc3RhdGUodHJhbnMsIEdTTV9DU1RBVEVfQUNUSVZFKTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgdHJhbnMpOworfQorCitzdGF0aWMgaW50IGdzbTQ4X2NjX3R4X25vdGlmeShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqbm90aWZ5ID0gYXJnOworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX0NDX05PVElGWTsKKworCS8qIG5vdGlmeSAqLworCWdzbTQ4X2VuY29kZV9ub3RpZnkobXNnLCBub3RpZnktPm5vdGlmeSk7CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIHRyYW5zKTsKK30KKworc3RhdGljIGludCBnc200OF9jY19yeF9ub3RpZnkoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuID0gbXNnYl9sM2xlbihtc2cpIC0gc2l6ZW9mKCpnaCk7CisvLwlzdHJ1Y3QgdGx2X3BhcnNlZCB0cDsKKwlzdHJ1Y3QgZ3NtX21uY2Mgbm90aWZ5OworCisJbWVtc2V0KCZub3RpZnksIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlub3RpZnkuY2FsbHJlZiA9IHRyYW5zLT5jYWxscmVmOworLy8JdGx2X3BhcnNlKCZ0cCwgJmdzbTQ4X2F0dF90bHZkZWYsIGdoLT5kYXRhLCBwYXlsb2FkX2xlbik7CisJaWYgKHBheWxvYWRfbGVuID49IDEpCisJCWdzbTQ4X2RlY29kZV9ub3RpZnkoJm5vdGlmeS5ub3RpZnksIGdoLT5kYXRhKTsKKworCXJldHVybiBtbmNjX3JlY3Ztc2codHJhbnMtPnN1YnNjci0+bmV0LCB0cmFucywgTU5DQ19OT1RJRllfSU5ELCAmbm90aWZ5KTsKK30KKworc3RhdGljIGludCBnc200OF9jY190eF91c2VyaW5mbyhzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqdXNlciA9IGFyZzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9DQ19VU0VSX0lORk87CisKKwkvKiB1c2VyLXVzZXIgKi8KKwlpZiAodXNlci0+ZmllbGRzICYgTU5DQ19GX1VTRVJVU0VSKQorCQlnc200OF9lbmNvZGVfdXNlcnVzZXIobXNnLCAxLCAmdXNlci0+dXNlcnVzZXIpOworCS8qIG1vcmUgZGF0YSAqLworCWlmICh1c2VyLT5tb3JlKQorCQlnc200OF9lbmNvZGVfbW9yZShtc2cpOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCB0cmFucyk7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDhfY2NfcnhfdXNlcmluZm8oc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdW5zaWduZWQgaW50IHBheWxvYWRfbGVuID0gbXNnYl9sM2xlbihtc2cpIC0gc2l6ZW9mKCpnaCk7CisJc3RydWN0IHRsdl9wYXJzZWQgdHA7CisJc3RydWN0IGdzbV9tbmNjIHVzZXI7CisKKwltZW1zZXQoJnVzZXIsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwl1c2VyLmNhbGxyZWYgPSB0cmFucy0+Y2FsbHJlZjsKKwl0bHZfcGFyc2UoJnRwLCAmZ3NtNDhfYXR0X3RsdmRlZiwgZ2gtPmRhdGEsIHBheWxvYWRfbGVuLCBHU000OF9JRV9VU0VSX1VTRVIsIDApOworCS8qIHVzZXItdXNlciAqLworCWlmIChUTFZQX1BSRVNFTlQoJnRwLCBHU000OF9JRV9VU0VSX1VTRVIpKSB7CisJCXVzZXIuZmllbGRzIHw9IE1OQ0NfRl9VU0VSVVNFUjsKKwkJZ3NtNDhfZGVjb2RlX3VzZXJ1c2VyKCZ1c2VyLnVzZXJ1c2VyLAorCQkJCVRMVlBfVkFMKCZ0cCwgR1NNNDhfSUVfVVNFUl9VU0VSKS0xKTsKKwl9CisJLyogbW9yZSBkYXRhICovCisJaWYgKFRMVlBfUFJFU0VOVCgmdHAsIEdTTTQ4X0lFX01PUkVfREFUQSkpCisJCXVzZXIubW9yZSA9IDE7CisKKwlyZXR1cm4gbW5jY19yZWN2bXNnKHRyYW5zLT5zdWJzY3ItPm5ldCwgdHJhbnMsIE1OQ0NfVVNFUklORk9fSU5ELCAmdXNlcik7Cit9CisKK3N0YXRpYyBpbnQgX2dzbTQ4X2xjaGFuX21vZGlmeShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdm9pZCAqYXJnKQoreworCXN0cnVjdCBnc21fbW5jYyAqbW9kZSA9IGFyZzsKKworCXJldHVybiBnc200OF9sY2hhbl9tb2RpZnkodHJhbnMtPmxjaGFuLCBtb2RlLT5sY2hhbl9tb2RlKTsKK30KKworc3RhdGljIHN0cnVjdCBkb3duc3RhdGUgeworCXVfaW50MzJfdAlzdGF0ZXM7CisJaW50CQl0eXBlOworCWludAkJKCpyb3V0KSAoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHZvaWQgKmFyZyk7Cit9IGRvd25zdGF0ZWxpc3RbXSA9IHsKKwkvKiBtb2JpbGUgb3JpZ2luYXRpbmcgY2FsbCBlc3RhYmxpc2htZW50ICovCisJe1NCSVQoR1NNX0NTVEFURV9JTklUSUFURUQpLCAvKiA1LjIuMS4yICovCisJIE1OQ0NfQ0FMTF9QUk9DX1JFUSwgZ3NtNDhfY2NfdHhfY2FsbF9wcm9jfSwKKwl7U0JJVChHU01fQ1NUQVRFX0lOSVRJQVRFRCkgfCBTQklUKEdTTV9DU1RBVEVfTU9fQ0FMTF9QUk9DKSwgLyogNS4yLjEuMiB8IDUuMi4xLjUgKi8KKwkgTU5DQ19BTEVSVF9SRVEsIGdzbTQ4X2NjX3R4X2FsZXJ0aW5nfSwKKwl7U0JJVChHU01fQ1NUQVRFX0lOSVRJQVRFRCkgfCBTQklUKEdTTV9DU1RBVEVfTU9fQ0FMTF9QUk9DKSB8IFNCSVQoR1NNX0NTVEFURV9DQUxMX0RFTElWRVJFRCksIC8qIDUuMi4xLjIgfCA1LjIuMS42IHwgNS4yLjEuNiAqLworCSBNTkNDX1NFVFVQX1JTUCwgZ3NtNDhfY2NfdHhfY29ubmVjdH0sCisJe1NCSVQoR1NNX0NTVEFURV9NT19DQUxMX1BST0MpLCAvKiA1LjIuMS40LjIgKi8KKwkgTU5DQ19QUk9HUkVTU19SRVEsIGdzbTQ4X2NjX3R4X3Byb2dyZXNzfSwKKwkvKiBtb2JpbGUgdGVybWluYXRpbmcgY2FsbCBlc3RhYmxpc2htZW50ICovCisJe1NCSVQoR1NNX0NTVEFURV9OVUxMKSwgLyogNS4yLjIuMSAqLworCSBNTkNDX1NFVFVQX1JFUSwgZ3NtNDhfY2NfdHhfc2V0dXB9LAorCXtTQklUKEdTTV9DU1RBVEVfQ09OTkVDVF9SRVFVRVNUKSwKKwkgTU5DQ19TRVRVUF9DT01QTF9SRVEsIGdzbTQ4X2NjX3R4X2Nvbm5lY3RfYWNrfSwKKwkgLyogc2lnbmFsbGluZyBkdXJpbmcgY2FsbCAqLworCXtTQklUKEdTTV9DU1RBVEVfQUNUSVZFKSwKKwkgTU5DQ19OT1RJRllfUkVRLCBnc200OF9jY190eF9ub3RpZnl9LAorCXtBTExfU1RBVEVTIC0gU0JJVChHU01fQ1NUQVRFX05VTEwpIC0gU0JJVChHU01fQ1NUQVRFX1JFTEVBU0VfUkVRKSwKKwkgTU5DQ19GQUNJTElUWV9SRVEsIGdzbTQ4X2NjX3R4X2ZhY2lsaXR5fSwKKwl7QUxMX1NUQVRFUywKKwkgTU5DQ19TVEFSVF9EVE1GX1JTUCwgZ3NtNDhfY2NfdHhfc3RhcnRfZHRtZl9hY2t9LAorCXtBTExfU1RBVEVTLAorCSBNTkNDX1NUQVJUX0RUTUZfUkVKLCBnc200OF9jY190eF9zdGFydF9kdG1mX3Jlan0sCisJe0FMTF9TVEFURVMsCisJIE1OQ0NfU1RPUF9EVE1GX1JTUCwgZ3NtNDhfY2NfdHhfc3RvcF9kdG1mX2Fja30sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBNTkNDX0hPTERfQ05GLCBnc200OF9jY190eF9ob2xkX2Fja30sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBNTkNDX0hPTERfUkVKLCBnc200OF9jY190eF9ob2xkX3Jlan0sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBNTkNDX1JFVFJJRVZFX0NORiwgZ3NtNDhfY2NfdHhfcmV0cmlldmVfYWNrfSwKKwl7U0JJVChHU01fQ1NUQVRFX0FDVElWRSksCisJIE1OQ0NfUkVUUklFVkVfUkVKLCBnc200OF9jY190eF9yZXRyaWV2ZV9yZWp9LAorCXtTQklUKEdTTV9DU1RBVEVfQUNUSVZFKSwKKwkgTU5DQ19NT0RJRllfUkVRLCBnc200OF9jY190eF9tb2RpZnl9LAorCXtTQklUKEdTTV9DU1RBVEVfTU9fT1JJR19NT0RJRlkpLAorCSBNTkNDX01PRElGWV9SU1AsIGdzbTQ4X2NjX3R4X21vZGlmeV9jb21wbGV0ZX0sCisJe1NCSVQoR1NNX0NTVEFURV9NT19PUklHX01PRElGWSksCisJIE1OQ0NfTU9ESUZZX1JFSiwgZ3NtNDhfY2NfdHhfbW9kaWZ5X3JlamVjdH0sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBNTkNDX1VTRVJJTkZPX1JFUSwgZ3NtNDhfY2NfdHhfdXNlcmluZm99LAorCS8qIGNsZWFyaW5nICovCisJe1NCSVQoR1NNX0NTVEFURV9JTklUSUFURUQpLAorCSBNTkNDX1JFSl9SRVEsIGdzbTQ4X2NjX3R4X3JlbGVhc2VfY29tcGx9LAorCXtBTExfU1RBVEVTIC0gU0JJVChHU01fQ1NUQVRFX05VTEwpIC0gU0JJVChHU01fQ1NUQVRFX0RJU0NPTk5FQ1RfSU5EKSAtIFNCSVQoR1NNX0NTVEFURV9SRUxFQVNFX1JFUSkgLSBTQklUKEdTTV9DU1RBVEVfRElTQ09OTkVDVF9SRVEpLCAvKiA1LjQuNCAqLworCSBNTkNDX0RJU0NfUkVRLCBnc200OF9jY190eF9kaXNjb25uZWN0fSwKKwl7QUxMX1NUQVRFUyAtIFNCSVQoR1NNX0NTVEFURV9OVUxMKSAtIFNCSVQoR1NNX0NTVEFURV9SRUxFQVNFX1JFUSksIC8qIDUuNC4zLjIgKi8KKwkgTU5DQ19SRUxfUkVRLCBnc200OF9jY190eF9yZWxlYXNlfSwKKwkvKiBzcGVjaWFsICovCisJe0FMTF9TVEFURVMsCisJIE1OQ0NfTENIQU5fTU9ESUZZLCBfZ3NtNDhfbGNoYW5fbW9kaWZ5fSwKK307CisKKyNkZWZpbmUgRE9XTlNMTEVOIFwKKwkoc2l6ZW9mKGRvd25zdGF0ZWxpc3QpIC8gc2l6ZW9mKHN0cnVjdCBkb3duc3RhdGUpKQorCisKK2ludCBtbmNjX3NlbmQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsIGludCBtc2dfdHlwZSwgdm9pZCAqYXJnKQoreworCWludCBpLCByYyA9IDA7CisJc3RydWN0IGdzbV90cmFucyAqdHJhbnMgPSBOVUxMLCAqdHJhbnN0OworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gTlVMTDsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gTlVMTDsKKwlzdHJ1Y3QgZ3NtX21uY2MgKmRhdGEgPSBhcmcsIHJlbDsKKworCS8qIGhhbmRsZSBzcGVjaWFsIG1lc3NhZ2VzICovCisJc3dpdGNoKG1zZ190eXBlKSB7CisJY2FzZSBNTkNDX0JSSURHRToKKwkJcmV0dXJuIHRjaF9icmlkZ2UobmV0LCBhcmcpOworCWNhc2UgTU5DQ19GUkFNRV9EUk9QOgorCQlyZXR1cm4gdGNoX3JlY3ZfbW5jYyhuZXQsIGRhdGEtPmNhbGxyZWYsIDApOworCWNhc2UgTU5DQ19GUkFNRV9SRUNWOgorCQlyZXR1cm4gdGNoX3JlY3ZfbW5jYyhuZXQsIGRhdGEtPmNhbGxyZWYsIDEpOworCWNhc2UgR1NNX1RDSEZfRlJBTUU6CisJCS8qIEZpbmQgY2FsbHJlZiAqLworCQl0cmFucyA9IHRyYW5zX2ZpbmRfYnlfY2FsbHJlZihuZXQsIGRhdGEtPmNhbGxyZWYpOworCQlpZiAoIXRyYW5zKQorCQkJcmV0dXJuIC1FSU87CisJCWlmICghdHJhbnMtPmxjaGFuKQorCQkJcmV0dXJuIDA7CisJCWlmICh0cmFucy0+bGNoYW4tPnR5cGUgIT0gR1NNX0xDSEFOX1RDSF9GKQorCQkJcmV0dXJuIDA7CisJCWJ0cyA9IHRyYW5zLT5sY2hhbi0+dHMtPnRyeC0+YnRzOworCQlzd2l0Y2ggKGJ0cy0+dHlwZSkgeworCQljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOgorCQkJaWYgKCF0cmFucy0+bGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCkKKwkJCQlyZXR1cm4gMDsKKwkJCXJldHVybiBydHBfc2VuZF9mcmFtZSh0cmFucy0+bGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCwgYXJnKTsKKwkJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJCXJldHVybiB0cmF1X3NlbmRfZnJhbWUodHJhbnMtPmxjaGFuLCBhcmcpOworCQlkZWZhdWx0OgorCQkJREVCVUdQKERDQywgIlVua25vd24gQlRTIHR5cGUgJXVcbiIsIGJ0cy0+dHlwZSk7CisJCX0KKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbWVtc2V0KCZyZWwsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwlyZWwuY2FsbHJlZiA9IGRhdGEtPmNhbGxyZWY7CisKKwkvKiBGaW5kIGNhbGxyZWYgKi8KKwl0cmFucyA9IHRyYW5zX2ZpbmRfYnlfY2FsbHJlZihuZXQsIGRhdGEtPmNhbGxyZWYpOworCisJLyogQ2FsbHJlZiB1bmtub3duICovCisJaWYgKCF0cmFucykgeworCQlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCQlpZiAobXNnX3R5cGUgIT0gTU5DQ19TRVRVUF9SRVEpIHsKKwkJCURFQlVHUChEQ0MsICIoYnRzIC0gdHJ4IC0gdHMgLSB0aSAtLSBzdWIgJXMpICIKKwkJCQkiUmVjZWl2ZWQgJyVzJyBmcm9tIE1OQ0Mgd2l0aCAiCisJCQkJInVua25vd24gY2FsbHJlZiAlZFxuIiwgZGF0YS0+Y2FsbGVkLm51bWJlciwKKwkJCQlnZXRfbW5jY19uYW1lKG1zZ190eXBlKSwgZGF0YS0+Y2FsbHJlZik7CisJCQkvKiBJbnZhbGlkIGNhbGwgcmVmZXJlbmNlICovCisJCQlyZXR1cm4gbW5jY19yZWxlYXNlX2luZChuZXQsIE5VTEwsIGRhdGEtPmNhbGxyZWYsCisJCQkJCQlHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJCQlHU000OF9DQ19DQVVTRV9JTlZBTF9UUkFOU19JRCk7CisJCX0KKwkJaWYgKCFkYXRhLT5jYWxsZWQubnVtYmVyWzBdICYmICFkYXRhLT5pbXNpWzBdKSB7CisJCQlERUJVR1AoRENDLCAiKGJ0cyAtIHRyeCAtIHRzIC0gdGkpICIKKwkJCQkiUmVjZWl2ZWQgJyVzJyBmcm9tIE1OQ0Mgd2l0aCAiCisJCQkJIm5vIG51bWJlciBvciBJTVNJXG4iLCBnZXRfbW5jY19uYW1lKG1zZ190eXBlKSk7CisJCQkvKiBJbnZhbGlkIG51bWJlciAqLworCQkJcmV0dXJuIG1uY2NfcmVsZWFzZV9pbmQobmV0LCBOVUxMLCBkYXRhLT5jYWxscmVmLAorCQkJCQkJR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCQkJCQkJR1NNNDhfQ0NfQ0FVU0VfSU5WX05SX0ZPUk1BVCk7CisJCX0KKwkJLyogTmV3IHRyYW5zYWN0aW9uIGR1ZSB0byBzZXR1cCwgZmluZCBzdWJzY3JpYmVyICovCisJCWlmIChkYXRhLT5jYWxsZWQubnVtYmVyWzBdKQorCQkJc3Vic2NyID0gc3Vic2NyX2dldF9ieV9leHRlbnNpb24obmV0LAorCQkJCQkJCWRhdGEtPmNhbGxlZC5udW1iZXIpOworCQllbHNlCisJCQlzdWJzY3IgPSBzdWJzY3JfZ2V0X2J5X2ltc2kobmV0LCBkYXRhLT5pbXNpKTsKKwkJLyogSWYgc3Vic2NyaWJlciBpcyBub3QgZm91bmQgKi8KKwkJaWYgKCFzdWJzY3IpIHsKKwkJCURFQlVHUChEQ0MsICIoYnRzIC0gdHJ4IC0gdHMgLSB0aSAtLSBzdWIgJXMpICIKKwkJCQkiUmVjZWl2ZWQgJyVzJyBmcm9tIE1OQ0Mgd2l0aCAiCisJCQkJInVua25vd24gc3Vic2NyaWJlciAlc1xuIiwgZGF0YS0+Y2FsbGVkLm51bWJlciwKKwkJCQlnZXRfbW5jY19uYW1lKG1zZ190eXBlKSwgZGF0YS0+Y2FsbGVkLm51bWJlcik7CisJCQkvKiBVbmtub3duIHN1YnNjcmliZXIgKi8KKwkJCXJldHVybiBtbmNjX3JlbGVhc2VfaW5kKG5ldCwgTlVMTCwgZGF0YS0+Y2FsbHJlZiwKKwkJCQkJCUdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQkJCUdTTTQ4X0NDX0NBVVNFX1VOQVNTSUdORURfTlIpOworCQl9CisJCS8qIElmIHN1YnNjcmliZXIgaXMgbm90ICJhdHRhY2hlZCIgKi8KKwkJaWYgKCFzdWJzY3ItPmxhYykgeworCQkJREVCVUdQKERDQywgIihidHMgLSB0cnggLSB0cyAtIHRpIC0tIHN1YiAlcykgIgorCQkJCSJSZWNlaXZlZCAnJXMnIGZyb20gTU5DQyB3aXRoICIKKwkJCQkiZGV0YWNoZWQgc3Vic2NyaWJlciAlc1xuIiwgZGF0YS0+Y2FsbGVkLm51bWJlciwKKwkJCQlnZXRfbW5jY19uYW1lKG1zZ190eXBlKSwgZGF0YS0+Y2FsbGVkLm51bWJlcik7CisJCQlzdWJzY3JfcHV0KHN1YnNjcik7CisJCQkvKiBUZW1wb3JhcmlseSBvdXQgb2Ygb3JkZXIgKi8KKwkJCXJldHVybiBtbmNjX3JlbGVhc2VfaW5kKG5ldCwgTlVMTCwgZGF0YS0+Y2FsbHJlZiwKKwkJCQkJCUdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQkJCUdTTTQ4X0NDX0NBVVNFX0RFU1RfT09PKTsKKwkJfQorCQkvKiBDcmVhdGUgdHJhbnNhY3Rpb24gKi8KKwkJdHJhbnMgPSB0cmFuc19hbGxvYyhzdWJzY3IsIEdTTTQ4X1BESVNDX0NDLCAweGZmLCBkYXRhLT5jYWxscmVmKTsKKwkJaWYgKCF0cmFucykgeworCQkJREVCVUdQKERDQywgIk5vIG1lbW9yeSBmb3IgdHJhbnMuXG4iKTsKKwkJCXN1YnNjcl9wdXQoc3Vic2NyKTsKKwkJCS8qIFJlc3NvdXJjZSB1bmF2YWlsYWJsZSAqLworCQkJbW5jY19yZWxlYXNlX2luZChuZXQsIE5VTEwsIGRhdGEtPmNhbGxyZWYsCisJCQkJCSBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJCSBHU000OF9DQ19DQVVTRV9SRVNPVVJDRV9VTkFWQUlMKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCS8qIEZpbmQgbGNoYW4gKi8KKwkJbGNoYW4gPSBsY2hhbl9mb3Jfc3Vic2NyKHN1YnNjcik7CisJCS8qIElmIHN1YnNjcmliZXIgaGFzIG5vIGxjaGFuICovCisJCWlmICghbGNoYW4pIHsKKwkJCS8qIGZpbmQgdHJhbnNhY3Rpb24gd2l0aCB0aGlzIHN1YnNjcmliZXIgYWxyZWFkeSBwYWdpbmcgKi8KKwkJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyYW5zdCwgJm5ldC0+dHJhbnNfbGlzdCwgZW50cnkpIHsKKwkJCQkvKiBUcmFuc2FjdGlvbiBvZiBvdXIgbGNoYW4/ICovCisJCQkJaWYgKHRyYW5zdCA9PSB0cmFucyB8fAorCQkJCSAgICB0cmFuc3QtPnN1YnNjciAhPSBzdWJzY3IpCisJCQkJCWNvbnRpbnVlOworCQkJCURFQlVHUChEQ0MsICIoYnRzICVkIHRyeCAtIHRzIC0gdGkgLS0gc3ViICVzKSAiCisJCQkJCSJSZWNlaXZlZCAnJXMnIGZyb20gTU5DQyB3aXRoICIKKwkJCQkJInVuYWxsb2NhdGVkIGNoYW5uZWwsIHBhZ2luZyBhbHJlYWR5ICIKKwkJCQkJInN0YXJ0ZWQuXG4iLCBidHMtPm5yLAorCQkJCQlkYXRhLT5jYWxsZWQubnVtYmVyLAorCQkJCQlnZXRfbW5jY19uYW1lKG1zZ190eXBlKSk7CisJCQkJc3Vic2NyX3B1dChzdWJzY3IpOworCQkJCXRyYW5zX2ZyZWUodHJhbnMpOworCQkJCXJldHVybiAwOworCQkJfQorCQkJLyogc3RvcmUgc2V0dXAgaW5mb3JtYXRpb25zIHVudGlsIHBhZ2luZyB3YXMgc3VjY2Vzc2Z1bGwgKi8KKwkJCW1lbWNweSgmdHJhbnMtPmNjLm1zZywgZGF0YSwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCQkJLyogVHJpZ2dlciBwYWdpbmcgKi8KKwkJCXBhZ2luZ19yZXF1ZXN0KG5ldCwgc3Vic2NyLCBSU0xfQ0hBTk5FRURfVENIX0YsCisJCQkJCXNldHVwX3RyaWdfcGFnX2V2dCwgc3Vic2NyKTsKKwkJCXN1YnNjcl9wdXQoc3Vic2NyKTsKKwkJCXJldHVybiAwOworCQl9CisJCS8qIEFzc2lnbiBsY2hhbiAqLworCQl0cmFucy0+bGNoYW4gPSBsY2hhbjsKKwkJdXNlX2xjaGFuKGxjaGFuKTsKKwkJc3Vic2NyX3B1dChzdWJzY3IpOworCX0KKwlsY2hhbiA9IHRyYW5zLT5sY2hhbjsKKworCS8qIGlmIHBhZ2luZyBkaWQgbm90IHJlc3BvbmQgeWV0ICovCisJaWYgKCFsY2hhbikgeworCQlERUJVR1AoRENDLCAiKGJ0cyAtIHRyeCAtIHRzIC0gdGkgLS0gc3ViICVzKSAiCisJCQkiUmVjZWl2ZWQgJyVzJyBmcm9tIE1OQ0MgaW4gcGFnaW5nIHN0YXRlXG4iLCAKKwkJCSh0cmFucy0+c3Vic2NyKT8odHJhbnMtPnN1YnNjci0+ZXh0ZW5zaW9uKToiLSIsCisJCQlnZXRfbW5jY19uYW1lKG1zZ190eXBlKSk7CisJCW1uY2Nfc2V0X2NhdXNlKCZyZWwsIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQlHU000OF9DQ19DQVVTRV9OT1JNX0NBTExfQ0xFQVIpOworCQlpZiAobXNnX3R5cGUgPT0gTU5DQ19SRUxfUkVRKQorCQkJcmMgPSBtbmNjX3JlY3Ztc2cobmV0LCB0cmFucywgTU5DQ19SRUxfQ05GLCAmcmVsKTsKKwkJZWxzZQorCQkJcmMgPSBtbmNjX3JlY3Ztc2cobmV0LCB0cmFucywgTU5DQ19SRUxfSU5ELCAmcmVsKTsKKwkJdHJhbnMtPmNhbGxyZWYgPSAwOworCQl0cmFuc19mcmVlKHRyYW5zKTsKKwkJcmV0dXJuIHJjOworCX0KKworCURFQlVHUChEQ0MsICIoYnRzICVkIHRyeCAlZCB0cyAlZCB0aSAlMDJ4IHN1YiAlcykgIgorCQkiUmVjZWl2ZWQgJyVzJyBmcm9tIE1OQ0MgaW4gc3RhdGUgJWQgKCVzKVxuIiwKKwkJbGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIGxjaGFuLT50cy0+dHJ4LT5uciwgbGNoYW4tPnRzLT5uciwKKwkJdHJhbnMtPnRyYW5zYWN0aW9uX2lkLAorCQkobGNoYW4tPnN1YnNjcik/KGxjaGFuLT5zdWJzY3ItPmV4dGVuc2lvbik6Ii0iLAorCQlnZXRfbW5jY19uYW1lKG1zZ190eXBlKSwgdHJhbnMtPmNjLnN0YXRlLAorCQljY19zdGF0ZV9uYW1lc1t0cmFucy0+Y2Muc3RhdGVdKTsKKworCS8qIEZpbmQgZnVuY3Rpb24gZm9yIGN1cnJlbnQgc3RhdGUgYW5kIG1lc3NhZ2UgKi8KKwlmb3IgKGkgPSAwOyBpIDwgRE9XTlNMTEVOOyBpKyspCisJCWlmICgobXNnX3R5cGUgPT0gZG93bnN0YXRlbGlzdFtpXS50eXBlKQorCQkgJiYgKCgxIDw8IHRyYW5zLT5jYy5zdGF0ZSkgJiBkb3duc3RhdGVsaXN0W2ldLnN0YXRlcykpCisJCQlicmVhazsKKwlpZiAoaSA9PSBET1dOU0xMRU4pIHsKKwkJREVCVUdQKERDQywgIk1lc3NhZ2UgdW5oYW5kbGVkIGF0IHRoaXMgc3RhdGUuXG4iKTsKKwkJcmV0dXJuIDA7CisJfQorCisJcmMgPSBkb3duc3RhdGVsaXN0W2ldLnJvdXQodHJhbnMsIGFyZyk7CisKKwlyZXR1cm4gcmM7Cit9CisKKworc3RhdGljIHN0cnVjdCBkYXRhc3RhdGUgeworCXVfaW50MzJfdAlzdGF0ZXM7CisJaW50CQl0eXBlOworCWludAkJKCpyb3V0KSAoc3RydWN0IGdzbV90cmFucyAqdHJhbnMsIHN0cnVjdCBtc2diICptc2cpOworfSBkYXRhc3RhdGVsaXN0W10gPSB7CisJLyogbW9iaWxlIG9yaWdpbmF0aW5nIGNhbGwgZXN0YWJsaXNobWVudCAqLworCXtTQklUKEdTTV9DU1RBVEVfTlVMTCksIC8qIDUuMi4xLjIgKi8KKwkgR1NNNDhfTVRfQ0NfU0VUVVAsIGdzbTQ4X2NjX3J4X3NldHVwfSwKKwl7U0JJVChHU01fQ1NUQVRFX05VTEwpLCAvKiA1LjIuMS4yICovCisJIEdTTTQ4X01UX0NDX0VNRVJHX1NFVFVQLCBnc200OF9jY19yeF9zZXR1cH0sCisJe1NCSVQoR1NNX0NTVEFURV9DT05ORUNUX0lORCksIC8qIDUuMi4xLjIgKi8KKwkgR1NNNDhfTVRfQ0NfQ09OTkVDVF9BQ0ssIGdzbTQ4X2NjX3J4X2Nvbm5lY3RfYWNrfSwKKwkvKiBtb2JpbGUgdGVybWluYXRpbmcgY2FsbCBlc3RhYmxpc2htZW50ICovCisJe1NCSVQoR1NNX0NTVEFURV9DQUxMX1BSRVNFTlQpLCAvKiA1LjIuMi4zLjIgKi8KKwkgR1NNNDhfTVRfQ0NfQ0FMTF9DT05GLCBnc200OF9jY19yeF9jYWxsX2NvbmZ9LAorCXtTQklUKEdTTV9DU1RBVEVfQ0FMTF9QUkVTRU5UKSB8IFNCSVQoR1NNX0NTVEFURV9NT19URVJNX0NBTExfQ09ORiksIC8qID8/Pz8gfCA1LjIuMi4zLjIgKi8KKwkgR1NNNDhfTVRfQ0NfQUxFUlRJTkcsIGdzbTQ4X2NjX3J4X2FsZXJ0aW5nfSwKKwl7U0JJVChHU01fQ1NUQVRFX0NBTExfUFJFU0VOVCkgfCBTQklUKEdTTV9DU1RBVEVfTU9fVEVSTV9DQUxMX0NPTkYpIHwgU0JJVChHU01fQ1NUQVRFX0NBTExfUkVDRUlWRUQpLCAvKiAoNS4yLjIuNikgfCA1LjIuMi42IHwgNS4yLjIuNiAqLyAgCisJIEdTTTQ4X01UX0NDX0NPTk5FQ1QsIGdzbTQ4X2NjX3J4X2Nvbm5lY3R9LAorCSAvKiBzaWduYWxsaW5nIGR1cmluZyBjYWxsICovCisJe0FMTF9TVEFURVMgLSBTQklUKEdTTV9DU1RBVEVfTlVMTCksCisJIEdTTTQ4X01UX0NDX0ZBQ0lMSVRZLCBnc200OF9jY19yeF9mYWNpbGl0eX0sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBHU000OF9NVF9DQ19OT1RJRlksIGdzbTQ4X2NjX3J4X25vdGlmeX0sCisJe0FMTF9TVEFURVMsCisJIEdTTTQ4X01UX0NDX1NUQVJUX0RUTUYsIGdzbTQ4X2NjX3J4X3N0YXJ0X2R0bWZ9LAorCXtBTExfU1RBVEVTLAorCSBHU000OF9NVF9DQ19TVE9QX0RUTUYsIGdzbTQ4X2NjX3J4X3N0b3BfZHRtZn0sCisJe0FMTF9TVEFURVMsCisJIEdTTTQ4X01UX0NDX1NUQVRVU19FTlEsIGdzbTQ4X2NjX3J4X3N0YXR1c19lbnF9LAorCXtTQklUKEdTTV9DU1RBVEVfQUNUSVZFKSwKKwkgR1NNNDhfTVRfQ0NfSE9MRCwgZ3NtNDhfY2NfcnhfaG9sZH0sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBHU000OF9NVF9DQ19SRVRSLCBnc200OF9jY19yeF9yZXRyaWV2ZX0sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBHU000OF9NVF9DQ19NT0RJRlksIGdzbTQ4X2NjX3J4X21vZGlmeX0sCisJe1NCSVQoR1NNX0NTVEFURV9NT19URVJNX01PRElGWSksCisJIEdTTTQ4X01UX0NDX01PRElGWV9DT01QTCwgZ3NtNDhfY2NfcnhfbW9kaWZ5X2NvbXBsZXRlfSwKKwl7U0JJVChHU01fQ1NUQVRFX01PX1RFUk1fTU9ESUZZKSwKKwkgR1NNNDhfTVRfQ0NfTU9ESUZZX1JFSkVDVCwgZ3NtNDhfY2NfcnhfbW9kaWZ5X3JlamVjdH0sCisJe1NCSVQoR1NNX0NTVEFURV9BQ1RJVkUpLAorCSBHU000OF9NVF9DQ19VU0VSX0lORk8sIGdzbTQ4X2NjX3J4X3VzZXJpbmZvfSwKKwkvKiBjbGVhcmluZyAqLworCXtBTExfU1RBVEVTIC0gU0JJVChHU01fQ1NUQVRFX05VTEwpIC0gU0JJVChHU01fQ1NUQVRFX1JFTEVBU0VfUkVRKSwgLyogNS40LjMuMiAqLworCSBHU000OF9NVF9DQ19ESVNDT05ORUNULCBnc200OF9jY19yeF9kaXNjb25uZWN0fSwKKwl7QUxMX1NUQVRFUyAtIFNCSVQoR1NNX0NTVEFURV9OVUxMKSwgLyogNS40LjQuMS4yLjIgKi8KKwkgR1NNNDhfTVRfQ0NfUkVMRUFTRSwgZ3NtNDhfY2NfcnhfcmVsZWFzZX0sCisJe0FMTF9TVEFURVMsIC8qIDUuNC4zLjQgKi8KKwkgR1NNNDhfTVRfQ0NfUkVMRUFTRV9DT01QTCwgZ3NtNDhfY2NfcnhfcmVsZWFzZV9jb21wbH0sCit9OworCisjZGVmaW5lIERBVEFTTExFTiBcCisJKHNpemVvZihkYXRhc3RhdGVsaXN0KSAvIHNpemVvZihzdHJ1Y3QgZGF0YXN0YXRlKSkKKworc3RhdGljIGludCBnc20wNDA4X3Jjdl9jYyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVfaW50OF90IG1zZ190eXBlID0gZ2gtPm1zZ190eXBlICYgMHhiZjsKKwl1X2ludDhfdCB0cmFuc2FjdGlvbl9pZCA9ICgoZ2gtPnByb3RvX2Rpc2NyICYgMHhmMCkgXiAweDgwKSA+PiA0OyAvKiBmbGlwICovCisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBtc2ctPmxjaGFuOworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zID0gTlVMTDsKKwlpbnQgaSwgcmMgPSAwOworCisJaWYgKG1zZ190eXBlICYgMHg4MCkgeworCQlERUJVR1AoRENDLCAiTVNHIDB4JTJ4IG5vdCBkZWZpbmVkIGZvciBQRCBlcnJvclxuIiwgbXNnX3R5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJCisJLyogRmluZCB0cmFuc2FjdGlvbiAqLworCXRyYW5zID0gdHJhbnNfZmluZF9ieV9pZChsY2hhbi0+c3Vic2NyLCBHU000OF9QRElTQ19DQywgdHJhbnNhY3Rpb25faWQpOworCisJREVCVUdQKERDQywgIihidHMgJWQgdHJ4ICVkIHRzICVkIHRpICV4IHN1YiAlcykgIgorCQkiUmVjZWl2ZWQgJyVzJyBmcm9tIE1TIGluIHN0YXRlICVkICglcylcbiIsCisJCWxjaGFuLT50cy0+dHJ4LT5idHMtPm5yLCBsY2hhbi0+dHMtPnRyeC0+bnIsIGxjaGFuLT50cy0+bnIsCisJCXRyYW5zYWN0aW9uX2lkLCAobGNoYW4tPnN1YnNjcik/KGxjaGFuLT5zdWJzY3ItPmV4dGVuc2lvbik6Ii0iLAorCQlnc200OF9jY19tc2dfbmFtZXNbbXNnX3R5cGVdLCB0cmFucz8odHJhbnMtPmNjLnN0YXRlKTowLAorCQljY19zdGF0ZV9uYW1lc1t0cmFucz8odHJhbnMtPmNjLnN0YXRlKTowXSk7CisKKwkvKiBDcmVhdGUgdHJhbnNhY3Rpb24gKi8KKwlpZiAoIXRyYW5zKSB7CisJCURFQlVHUChEQ0MsICJVbmtub3duIHRyYW5zYWN0aW9uIElEICV4LCAiCisJCQkiY3JlYXRpbmcgbmV3IHRyYW5zLlxuIiwgdHJhbnNhY3Rpb25faWQpOworCQkvKiBDcmVhdGUgdHJhbnNhY3Rpb24gKi8KKwkJdHJhbnMgPSB0cmFuc19hbGxvYyhsY2hhbi0+c3Vic2NyLCBHU000OF9QRElTQ19DQywKKwkJCQkgICAgdHJhbnNhY3Rpb25faWQsIG5ld19jYWxscmVmKyspOworCQlpZiAoIXRyYW5zKSB7CisJCQlERUJVR1AoRENDLCAiTm8gbWVtb3J5IGZvciB0cmFucy5cbiIpOworCQkJcmMgPSBnc200OF90eF9zaW1wbGUobXNnLT5sY2hhbiwKKwkJCQkJICAgICBHU000OF9QRElTQ19DQyB8ICh0cmFuc2FjdGlvbl9pZCA8PCA0KSwKKwkJCQkJICAgICBHU000OF9NVF9DQ19SRUxFQVNFX0NPTVBMKTsKKwkJCXJldHVybiAtRU5PTUVNOworCQl9CisJCS8qIEFzc2lnbiB0cmFuc2FjdGlvbiAqLworCQl0cmFucy0+bGNoYW4gPSBsY2hhbjsKKwkJdXNlX2xjaGFuKGxjaGFuKTsKKwl9CisKKwkvKiBmaW5kIGZ1bmN0aW9uIGZvciBjdXJyZW50IHN0YXRlIGFuZCBtZXNzYWdlICovCisJZm9yIChpID0gMDsgaSA8IERBVEFTTExFTjsgaSsrKQorCQlpZiAoKG1zZ190eXBlID09IGRhdGFzdGF0ZWxpc3RbaV0udHlwZSkKKwkJICYmICgoMSA8PCB0cmFucy0+Y2Muc3RhdGUpICYgZGF0YXN0YXRlbGlzdFtpXS5zdGF0ZXMpKQorCQkJYnJlYWs7CisJaWYgKGkgPT0gREFUQVNMTEVOKSB7CisJCURFQlVHUChEQ0MsICJNZXNzYWdlIHVuaGFuZGxlZCBhdCB0aGlzIHN0YXRlLlxuIik7CisJCXJldHVybiAwOworCX0KKworCXJjID0gZGF0YXN0YXRlbGlzdFtpXS5yb3V0KHRyYW5zLCBtc2cpOworCisJcmV0dXJuIHJjOworfQorCisvKiBoZXJlIHdlIHBhc3MgaW4gYSBtc2diIGZyb20gdGhlIFJTTC0+UkxMLiAgV2UgZXhwZWN0IHRoZSBsMyBwb2ludGVyIHRvIGJlIHNldCAqLworaW50IGdzbTA0MDhfcmN2bXNnKHN0cnVjdCBtc2diICptc2csIHVfaW50OF90IGxpbmtfaWQpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdV9pbnQ4X3QgcGRpc2MgPSBnaC0+cHJvdG9fZGlzY3IgJiAweDBmOworCWludCByYyA9IDA7CisKKwlpZiAoc2lsZW50X2NhbGxfcmVyb3V0ZShtc2cpKQorCQlyZXR1cm4gc2lsZW50X2NhbGxfcngobXNnKTsKKwkKKwlzd2l0Y2ggKHBkaXNjKSB7CisJY2FzZSBHU000OF9QRElTQ19DQzoKKwkJcmMgPSBnc20wNDA4X3Jjdl9jYyhtc2cpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X1BESVNDX01NOgorCQlyYyA9IGdzbTA0MDhfcmN2X21tKG1zZyk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfUERJU0NfUlI6CisJCXJjID0gZ3NtMDQwOF9yY3ZfcnIobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9QRElTQ19TTVM6CisJCXJjID0gZ3NtMDQxMV9yY3Zfc21zKG1zZywgbGlua19pZCk7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfUERJU0NfTU1fR1BSUzoKKwljYXNlIEdTTTQ4X1BESVNDX1NNX0dQUlM6CisJCUxPR1AoRFJMTCwgTE9HTF9OT1RJQ0UsICJVbmltcGxlbWVudGVkICIKKwkJCSJHU00gMDQuMDggZGlzY3JpbWluYXRvciAweCUwMnhcbiIsIHBkaXNjKTsKKwkJYnJlYWs7CisJY2FzZSBHU000OF9QRElTQ19OQ19TUzoKKwkJcmMgPSBoYW5kbGVfcmN2X3Vzc2QobXNnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChEUkxMLCBMT0dMX05PVElDRSwgIlVua25vd24gIgorCQkJIkdTTSAwNC4wOCBkaXNjcmltaW5hdG9yIDB4JTAyeFxuIiwgcGRpc2MpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIGRlcXVldWUgbWVzc2FnZXMgdG8gbGF5ZXIgNCAqLworaW50IGJzY191cHF1ZXVlKHN0cnVjdCBnc21fbmV0d29yayAqbmV0KQoreworCXN0cnVjdCBnc21fbW5jYyAqbW5jYzsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCWludCB3b3JrID0gMDsKKworCWlmIChuZXQpCisJCXdoaWxlICgobXNnID0gbXNnYl9kZXF1ZXVlKCZuZXQtPnVwcXVldWUpKSkgeworCQkJbW5jYyA9IChzdHJ1Y3QgZ3NtX21uY2MgKiltc2ctPmRhdGE7CisJCQlpZiAobmV0LT5tbmNjX3JlY3YpCisJCQkJbmV0LT5tbmNjX3JlY3YobmV0LCBtbmNjLT5tc2dfdHlwZSwgbW5jYyk7CisJCQl3b3JrID0gMTsgLyogd29yayBkb25lICovCisJCQl0YWxsb2NfZnJlZShtc2cpOworCQl9CisKKwlyZXR1cm4gd29yazsKK30KKworLyoKKyAqIFRoaXMgd2lsbCBiZSByYW4gYnkgdGhlIGxpbmtlciB3aGVuIGxvYWRpbmcgdGhlIERTTy4gV2UgdXNlIGl0IHRvCisgKiBkbyBzeXN0ZW0gaW5pdGlhbGl6YXRpb24sIGUuZy4gcmVnaXN0cmF0aW9uIG9mIHNpZ25hbCBoYW5kbGVycy4KKyAqLworc3RhdGljIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkgdm9pZCBvbl9kc29fbG9hZF8wNDA4KHZvaWQpCit7CisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfTENIQU4sIGdzbTA0MDhfaGFuZGxlX2xjaGFuX3NpZ25hbCwgTlVMTCk7CisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfQUJJU0lQLCBoYW5kbGVfYWJpc2lwX3NpZ25hbCwgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9nc21fMDRfMDhfdXRpbHMuYyBiL29wZW5ic2Mvc3JjL2dzbV8wNF8wOF91dGlscy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4ZjM0ZjQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9nc21fMDRfMDhfdXRpbHMuYwpAQCAtMCwwICsxLDYyOSBAQAorLyogR1NNIE1vYmlsZSBSYWRpbyBJbnRlcmZhY2UgTGF5ZXIgMyBtZXNzYWdlcyBvbiB0aGUgQS1iaXMgaW50ZXJmYWNlCisgKiAzR1BQIFRTIDA0LjA4IHZlcnNpb24gNy4yMS4wIFJlbGVhc2UgMTk5OCAvIEVUU0kgVFMgMTAwIDk0MCBWNy4yMS4wCisgKiB1dGlsaXR5IGZ1bmN0aW9ucworICovCisKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA4LCAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbTQ4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmFuc2FjdGlvbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcGFnaW5nLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKworI2RlZmluZSBHU000OF9BTExPQ19TSVpFCTEwMjQKKyNkZWZpbmUgR1NNNDhfQUxMT0NfSEVBRFJPT00JMTI4CisKKy8qIHNob3VsZCBpcC5hY2Nlc3MgQlRTIHVzZSBkaXJlY3QgUlRQIHN0cmVhbXMgYmV0d2VlbiBlYWNoIG90aGVyICgxKSwKKyAqIG9yIHNob3VsZCBPcGVuQlNDIGFsd2F5cyBhY3QgYXMgUlRQIHJlbGF5L3Byb3h5IGluIGJldHdlZW4gKDApID8gKi8KK2ludCBpcGFjY19ydHBfZGlyZWN0ID0gMTsKKworc3RydWN0IG1zZ2IgKmdzbTQ4X21zZ2JfYWxsb2Modm9pZCkKK3sKKwlyZXR1cm4gbXNnYl9hbGxvY19oZWFkcm9vbShHU000OF9BTExPQ19TSVpFLCBHU000OF9BTExPQ19IRUFEUk9PTSwKKwkJCQkgICAiR1NNIDA0LjA4Iik7Cit9CisKK2ludCBnc200OF9zZW5kbXNnKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnLT5kYXRhOworCisJLyogaWYgd2UgZ2V0IHBhc3NlZCBhIHRyYW5zYWN0aW9uIHJlZmVyZW5jZSwgZG8gc29tZSBjb21tb24KKwkgKiB3b3JrIHRoYXQgdGhlIGNhbGxlciBubyBsb25nZXIgaGFzIHRvIGRvICovCisJaWYgKHRyYW5zKSB7CisJCWdoLT5wcm90b19kaXNjciA9IHRyYW5zLT5wcm90b2NvbCB8ICh0cmFucy0+dHJhbnNhY3Rpb25faWQgPDwgNCk7CisJCW1zZy0+bGNoYW4gPSB0cmFucy0+bGNoYW47CisJfQorCisJaWYgKG1zZy0+bGNoYW4pIHsKKwkJbXNnLT50cnggPSBtc2ctPmxjaGFuLT50cy0+dHJ4OworCisJCWlmICgoZ2gtPnByb3RvX2Rpc2NyICYgR1NNNDhfUERJU0NfTUFTSykgPT0gR1NNNDhfUERJU0NfQ0MpCisJCQlERUJVR1AoRENDLCAiKGJ0cyAlZCB0cnggJWQgdHMgJWQgdGkgJTAyeCkgIgorCQkJCSJTZW5kaW5nICclcycgdG8gTVMuXG4iLCBtc2ctPnRyeC0+YnRzLT5uciwKKwkJCQltc2ctPnRyeC0+bnIsIG1zZy0+bGNoYW4tPnRzLT5uciwKKwkJCQlnaC0+cHJvdG9fZGlzY3IgJiAweGYwLAorCQkJCWdzbTQ4X2NjX21zZ19uYW1lc1tnaC0+bXNnX3R5cGUgJiAweDNmXSk7CisJCWVsc2UKKwkJCURFQlVHUChEQ0MsICIoYnRzICVkIHRyeCAlZCB0cyAlZCBwZCAlMDJ4KSAiCisJCQkJIlNlbmRpbmcgMHglMDJ4IHRvIE1TLlxuIiwgbXNnLT50cngtPmJ0cy0+bnIsCisJCQkJbXNnLT50cngtPm5yLCBtc2ctPmxjaGFuLT50cy0+bnIsCisJCQkJZ2gtPnByb3RvX2Rpc2NyLCBnaC0+bXNnX3R5cGUpOworCX0KKworCW1zZy0+bDNoID0gbXNnLT5kYXRhOworCisJcmV0dXJuIHJzbF9kYXRhX3JlcXVlc3QobXNnLCAwKTsKK30KKworLyogU2VjdGlvbiA5LjEuOCAvIFRhYmxlIDkuOSAqLworc3RydWN0IGNocmVxIHsKKwl1X2ludDhfdCB2YWw7CisJdV9pbnQ4X3QgbWFzazsKKwllbnVtIGNocmVxX3R5cGUgdHlwZTsKK307CisKKy8qIElmIFNZU1RFTSBJTkZPUk1BVElPTiBUWVBFIDQgTkVDSSBiaXQgPT0gMSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBjaHJlcSBjaHJlcV90eXBlX25lY2kxW10gPSB7CisJeyAweGEwLCAweGUwLCBDSFJFUV9UX0VNRVJHX0NBTEwgfSwKKwl7IDB4YzAsIDB4ZTAsIENIUkVRX1RfQ0FMTF9SRUVTVF9UQ0hfRiB9LAorCXsgMHg2OCwgMHhmYywgQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9IIH0sCisJeyAweDZjLCAweGZjLCBDSFJFUV9UX0NBTExfUkVFU1RfVENIX0hfREJMIH0sCisJeyAweGUwLCAweGUwLCBDSFJFUV9UX1NEQ0NIIH0sCisJeyAweDQwLCAweGYwLCBDSFJFUV9UX1ZPSUNFX0NBTExfVENIX0ggfSwKKwl7IDB4NTAsIDB4ZjAsIENIUkVRX1RfREFUQV9DQUxMX1RDSF9IIH0sCisJeyAweDAwLCAweGYwLCBDSFJFUV9UX0xPQ0FUSU9OX1VQRCB9LAorCXsgMHgxMCwgMHhmMCwgQ0hSRVFfVF9TRENDSCB9LAorCXsgMHg4MCwgMHhlMCwgQ0hSRVFfVF9QQUdfUl9BTllfTkVDSTEgfSwKKwl7IDB4MjAsIDB4ZjAsIENIUkVRX1RfUEFHX1JfVENIX0YgfSwKKwl7IDB4MzAsIDB4ZjAsIENIUkVRX1RfUEFHX1JfVENIX0ZIIH0sCisJeyAweDY3LCAweGZmLCBDSFJFUV9UX0xNVSB9LAorCXsgMHg2MCwgMHhmOSwgQ0hSRVFfVF9SRVNFUlZFRF9TRENDSCB9LAorCXsgMHg2MSwgMHhmYiwgQ0hSRVFfVF9SRVNFUlZFRF9TRENDSCB9LAorCXsgMHg2MywJMHhmZiwgQ0hSRVFfVF9SRVNFUlZFRF9TRENDSCB9LAorCXsgMHg3ZiwgMHhmZiwgQ0hSRVFfVF9SRVNFUlZFRF9JR05PUkUgfSwKK307CisKKy8qIElmIFNZU1RFTSBJTkZPUk1BVElPTiBUWVBFIDQgTkVDSSBiaXQgPT0gMCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBjaHJlcSBjaHJlcV90eXBlX25lY2kwW10gPSB7CisJeyAweGEwLCAweGUwLCBDSFJFUV9UX0VNRVJHX0NBTEwgfSwKKwl7IDB4YzAsIDB4ZTAsIENIUkVRX1RfQ0FMTF9SRUVTVF9UQ0hfSCB9LAorCXsgMHhlMCwgMHhlMCwgQ0hSRVFfVF9UQ0hfRiB9LAorCXsgMHg1MCwgMHhmMCwgQ0hSRVFfVF9EQVRBX0NBTExfVENIX0ggfSwKKwl7IDB4MDAsIDB4ZTAsIENIUkVRX1RfTE9DQVRJT05fVVBEIH0sCisJeyAweDgwLCAweGUwLCBDSFJFUV9UX1BBR19SX0FOWV9ORUNJMCB9LAorCXsgMHgyMCwgMHhmMCwgQ0hSRVFfVF9QQUdfUl9UQ0hfRiB9LAorCXsgMHgzMCwgMHhmMCwgQ0hSRVFfVF9QQUdfUl9UQ0hfRkggfSwKKwl7IDB4NjcsIDB4ZmYsIENIUkVRX1RfTE1VIH0sCisJeyAweDYwLCAweGY5LCBDSFJFUV9UX1JFU0VSVkVEX1NEQ0NIIH0sCisJeyAweDYxLCAweGZiLCBDSFJFUV9UX1JFU0VSVkVEX1NEQ0NIIH0sCisJeyAweDYzLAkweGZmLCBDSFJFUV9UX1JFU0VSVkVEX1NEQ0NIIH0sCisJeyAweDdmLCAweGZmLCBDSFJFUV9UX1JFU0VSVkVEX0lHTk9SRSB9LAorfTsKKworc3RhdGljIGNvbnN0IGVudW0gZ3NtX2NoYW5fdCBjdHlwZV9ieV9jaHJlcVtdID0geworCVtDSFJFUV9UX0VNRVJHX0NBTExdCQk9IEdTTV9MQ0hBTl9UQ0hfRiwKKwlbQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9GXQk9IEdTTV9MQ0hBTl9UQ0hfRiwKKwlbQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9IXQk9IEdTTV9MQ0hBTl9UQ0hfSCwKKwlbQ0hSRVFfVF9DQUxMX1JFRVNUX1RDSF9IX0RCTF0JPSBHU01fTENIQU5fVENIX0gsCisJW0NIUkVRX1RfU0RDQ0hdCQkJPSBHU01fTENIQU5fU0RDQ0gsCisJW0NIUkVRX1RfVENIX0ZdCQkJPSBHU01fTENIQU5fVENIX0YsCisJW0NIUkVRX1RfVk9JQ0VfQ0FMTF9UQ0hfSF0JPSBHU01fTENIQU5fVENIX0gsCisJW0NIUkVRX1RfREFUQV9DQUxMX1RDSF9IXQk9IEdTTV9MQ0hBTl9UQ0hfSCwKKwlbQ0hSRVFfVF9MT0NBVElPTl9VUERdCQk9IEdTTV9MQ0hBTl9TRENDSCwKKwlbQ0hSRVFfVF9QQUdfUl9BTllfTkVDSTFdCT0gR1NNX0xDSEFOX1NEQ0NILAorCVtDSFJFUV9UX1BBR19SX0FOWV9ORUNJMF0JPSBHU01fTENIQU5fU0RDQ0gsCisJW0NIUkVRX1RfUEFHX1JfVENIX0ZdCQk9IEdTTV9MQ0hBTl9UQ0hfRiwKKwlbQ0hSRVFfVF9QQUdfUl9UQ0hfRkhdCQk9IEdTTV9MQ0hBTl9UQ0hfRiwKKwlbQ0hSRVFfVF9MTVVdCQkJPSBHU01fTENIQU5fU0RDQ0gsCisJW0NIUkVRX1RfUkVTRVJWRURfU0RDQ0hdCT0gR1NNX0xDSEFOX1NEQ0NILAorCVtDSFJFUV9UX1JFU0VSVkVEX0lHTk9SRV0JPSBHU01fTENIQU5fVU5LTk9XTiwKK307CisKK3N0YXRpYyBjb25zdCBlbnVtIGdzbV9jaHJlcV9yZWFzb25fdCByZWFzb25fYnlfY2hyZXFbXSA9IHsKKwlbQ0hSRVFfVF9FTUVSR19DQUxMXQkJPSBHU01fQ0hSRVFfUkVBU09OX0VNRVJHLAorCVtDSFJFUV9UX0NBTExfUkVFU1RfVENIX0ZdCT0gR1NNX0NIUkVRX1JFQVNPTl9DQUxMLAorCVtDSFJFUV9UX0NBTExfUkVFU1RfVENIX0hdCT0gR1NNX0NIUkVRX1JFQVNPTl9DQUxMLAorCVtDSFJFUV9UX0NBTExfUkVFU1RfVENIX0hfREJMXQk9IEdTTV9DSFJFUV9SRUFTT05fQ0FMTCwKKwlbQ0hSRVFfVF9TRENDSF0JCQk9IEdTTV9DSFJFUV9SRUFTT05fT1RIRVIsCisJW0NIUkVRX1RfVENIX0ZdCQkJPSBHU01fQ0hSRVFfUkVBU09OX09USEVSLAorCVtDSFJFUV9UX1ZPSUNFX0NBTExfVENIX0hdCT0gR1NNX0NIUkVRX1JFQVNPTl9DQUxMLAorCVtDSFJFUV9UX0RBVEFfQ0FMTF9UQ0hfSF0JPSBHU01fQ0hSRVFfUkVBU09OX09USEVSLAorCVtDSFJFUV9UX0xPQ0FUSU9OX1VQRF0JCT0gR1NNX0NIUkVRX1JFQVNPTl9MT0NBVElPTl9VUEQsCisJW0NIUkVRX1RfUEFHX1JfQU5ZX05FQ0kxXQk9IEdTTV9DSFJFUV9SRUFTT05fUEFHLAorCVtDSFJFUV9UX1BBR19SX0FOWV9ORUNJMF0JPSBHU01fQ0hSRVFfUkVBU09OX1BBRywKKwlbQ0hSRVFfVF9QQUdfUl9UQ0hfRl0JCT0gR1NNX0NIUkVRX1JFQVNPTl9QQUcsCisJW0NIUkVRX1RfUEFHX1JfVENIX0ZIXQkJPSBHU01fQ0hSRVFfUkVBU09OX1BBRywKKwlbQ0hSRVFfVF9MTVVdCQkJPSBHU01fQ0hSRVFfUkVBU09OX09USEVSLAorCVtDSFJFUV9UX1JFU0VSVkVEX1NEQ0NIXQk9IEdTTV9DSFJFUV9SRUFTT05fT1RIRVIsCisJW0NIUkVRX1RfUkVTRVJWRURfSUdOT1JFXQk9IEdTTV9DSFJFUV9SRUFTT05fT1RIRVIsCit9OworCitlbnVtIGdzbV9jaGFuX3QgZ2V0X2N0eXBlX2J5X2NocmVxKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IHJhLCBpbnQgbmVjaSkKK3sKKwlpbnQgaTsKKwlpbnQgbGVuZ3RoOworCWNvbnN0IHN0cnVjdCBjaHJlcSAqY2hyZXE7CisKKwlpZiAobmVjaSkgeworCQljaHJlcSA9IGNocmVxX3R5cGVfbmVjaTE7CisJCWxlbmd0aCA9IEFSUkFZX1NJWkUoY2hyZXFfdHlwZV9uZWNpMSk7CisJfSBlbHNlIHsKKwkJY2hyZXEgPSBjaHJlcV90eXBlX25lY2kwOworCQlsZW5ndGggPSBBUlJBWV9TSVpFKGNocmVxX3R5cGVfbmVjaTApOworCX0KKworCisJZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBjaHJlcSAqY2hyID0gJmNocmVxW2ldOworCQlpZiAoKHJhICYgY2hyLT5tYXNrKSA9PSBjaHItPnZhbCkKKwkJCXJldHVybiBjdHlwZV9ieV9jaHJlcVtjaHItPnR5cGVdOworCX0KKwlMT0dQKERSUiwgTE9HTF9FUlJPUiwgIlVua25vd24gQ0hBTk5FTCBSRVFVRVNUIFJRRCAweCUwMnhcbiIsIHJhKTsKKwlyZXR1cm4gR1NNX0xDSEFOX1NEQ0NIOworfQorCitlbnVtIGdzbV9jaHJlcV9yZWFzb25fdCBnZXRfcmVhc29uX2J5X2NocmVxKHN0cnVjdCBnc21fYnRzICpidHMsIHVfaW50OF90IHJhLCBpbnQgbmVjaSkKK3sKKwlpbnQgaTsKKwlpbnQgbGVuZ3RoOworCWNvbnN0IHN0cnVjdCBjaHJlcSAqY2hyZXE7CisKKwlpZiAobmVjaSkgeworCQljaHJlcSA9IGNocmVxX3R5cGVfbmVjaTE7CisJCWxlbmd0aCA9IEFSUkFZX1NJWkUoY2hyZXFfdHlwZV9uZWNpMSk7CisJfSBlbHNlIHsKKwkJY2hyZXEgPSBjaHJlcV90eXBlX25lY2kwOworCQlsZW5ndGggPSBBUlJBWV9TSVpFKGNocmVxX3R5cGVfbmVjaTApOworCX0KKworCWZvciAoaSA9IDA7IGkgPCBsZW5ndGg7IGkrKykgeworCQljb25zdCBzdHJ1Y3QgY2hyZXEgKmNociA9ICZjaHJlcVtpXTsKKwkJaWYgKChyYSAmIGNoci0+bWFzaykgPT0gY2hyLT52YWwpCisJCQlyZXR1cm4gcmVhc29uX2J5X2NocmVxW2Noci0+dHlwZV07CisJfQorCUxPR1AoRFJSLCBMT0dMX0VSUk9SLCAiVW5rbm93biBDSEFOTkVMIFJFUVVFU1QgUkVBU09OIDB4JTAyeFxuIiwgcmEpOworCXJldHVybiBHU01fQ0hSRVFfUkVBU09OX09USEVSOworfQorCisvKiA3LjEuNyBhbmQgOS4xLjc6IFJSIENIQU5uZWwgUkVMZWFzZSAqLworaW50IGdzbTQ4X3NlbmRfcnJfcmVsZWFzZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisJdV9pbnQ4X3QgKmNhdXNlOworCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX1JSOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX1JSX0NIQU5fUkVMOworCisJY2F1c2UgPSBtc2diX3B1dChtc2csIDEpOworCWNhdXNlWzBdID0gR1NNNDhfUlJfQ0FVU0VfTk9STUFMOworCisJREVCVUdQKERSUiwgIlNlbmRpbmcgQ2hhbm5lbCBSZWxlYXNlOiBDaGFuOiBOdW1iZXI6ICVkIFR5cGU6ICVkXG4iLAorCQlsY2hhbi0+bnIsIGxjaGFuLT50eXBlKTsKKworCS8qIFNlbmQgYWN0dWFsIHJlbGVhc2UgcmVxdWVzdCB0byBNUyAqLworCWdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKKwkvKiBGSVhNRTogU3RhcnQgVGltZXIgVDMxMDkgKi8KKworCS8qIERlYWN0aXZhdGUgdGhlIFNBQ0NIIG9uIHRoZSBCVFMgc2lkZSAqLworCXJldHVybiByc2xfZGVhY3Rfc2FjY2gobGNoYW4pOworfQorCisvKiBDb252ZXJ0IE1vYmlsZSBJZGVudGl0eSAoMTAuNS4xLjQpIHRvIHN0cmluZyAqLworaW50IGdzbTQ4X21pX3RvX3N0cmluZyhjaGFyICpzdHJpbmcsIGNvbnN0IGludCBzdHJfbGVuLCBjb25zdCB1X2ludDhfdCAqbWksIGNvbnN0IGludCBtaV9sZW4pCit7CisJaW50IGk7CisJdV9pbnQ4X3QgbWlfdHlwZTsKKwljaGFyICpzdHJfY3VyID0gc3RyaW5nOworCXVfaW50MzJfdCB0bXNpOworCisJbWlfdHlwZSA9IG1pWzBdICYgR1NNX01JX1RZUEVfTUFTSzsKKworCXN3aXRjaCAobWlfdHlwZSkgeworCWNhc2UgR1NNX01JX1RZUEVfTk9ORToKKwkJYnJlYWs7CisJY2FzZSBHU01fTUlfVFlQRV9UTVNJOgorCQkvKiBUYWJsZSAxMC41LjQuMywgcmV2ZXJzZSBnZW5lcmF0ZV9taWRfZnJvbV90bXNpICovCisJCWlmIChtaV9sZW4gPT0gR1NNNDhfVE1TSV9MRU4gJiYgbWlbMF0gPT0gKDB4ZjAgfCBHU01fTUlfVFlQRV9UTVNJKSkgeworCQkJbWVtY3B5KCZ0bXNpLCAmbWlbMV0sIDQpOworCQkJdG1zaSA9IG50b2hsKHRtc2kpOworCQkJcmV0dXJuIHNucHJpbnRmKHN0cmluZywgc3RyX2xlbiwgIiV1IiwgdG1zaSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBHU01fTUlfVFlQRV9JTVNJOgorCWNhc2UgR1NNX01JX1RZUEVfSU1FSToKKwljYXNlIEdTTV9NSV9UWVBFX0lNRUlTVjoKKwkJKnN0cl9jdXIrKyA9IGJjZDJjaGFyKG1pWzBdID4+IDQpOworCisgICAgICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8IG1pX2xlbjsgaSsrKSB7CisJCQlpZiAoc3RyX2N1ciArIDIgPj0gc3RyaW5nICsgc3RyX2xlbikKKwkJCQlyZXR1cm4gc3RyX2N1ciAtIHN0cmluZzsKKwkJCSpzdHJfY3VyKysgPSBiY2QyY2hhcihtaVtpXSAmIDB4Zik7CisJCQkvKiBza2lwIGxhc3QgbmliYmxlIGluIGxhc3QgaW5wdXQgYnl0ZSB3aGVuIEdTTV9FVkVOICovCisJCQlpZiggKGkgIT0gbWlfbGVuLTEpIHx8IChtaVswXSAmIEdTTV9NSV9PREQpKQorCQkJCSpzdHJfY3VyKysgPSBiY2QyY2hhcihtaVtpXSA+PiA0KTsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJKnN0cl9jdXIrKyA9ICdcMCc7CisKKwlyZXR1cm4gc3RyX2N1ciAtIHN0cmluZzsKK30KKworCitpbnQgc2VuZF9zaWVtZW5zX21ycGNpKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLAorCQkgICAgICAgdV9pbnQ4X3QgKmNsYXNzbWFyazJfbHYpCit7CisJc3RydWN0IHJzbF9tcnBjaSBtcnBjaTsKKworCWlmIChjbGFzc21hcmsyX2x2WzBdIDwgMikKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwltcnBjaS5wb3dlcl9jbGFzcyA9IGNsYXNzbWFyazJfbHZbMV0gJiAweDc7CisJbXJwY2kudmdjc19jYXBhYmxlID0gY2xhc3NtYXJrMl9sdlsyXSAmICgxIDw8IDEpOworCW1ycGNpLnZic19jYXBhYmxlID0gY2xhc3NtYXJrMl9sdlsyXSAmICgxIDw8Mik7CisJbXJwY2kuZ3NtX3BoYXNlID0gKGNsYXNzbWFyazJfbHZbMV0pID4+IDUgJiAweDM7CisKKwlyZXR1cm4gcnNsX3NpZW1lbnNfbXJwY2kobGNoYW4sICZtcnBjaSk7Cit9CisKK2ludCBnc200OF9wYWdpbmdfZXh0cmFjdF9taShzdHJ1Y3QgbXNnYiAqbXNnLCBjaGFyICptaV9zdHJpbmcsIHVfaW50OF90ICptaV90eXBlKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVfaW50OF90ICpjbGFzc21hcmsyX2x2ID0gZ2gtPmRhdGEgKyAxOworCXVfaW50OF90ICptaV9sdiA9IGdoLT5kYXRhICsgMiArICpjbGFzc21hcmsyX2x2OworCSptaV90eXBlID0gbWlfbHZbMV0gJiBHU01fTUlfVFlQRV9NQVNLOworCisJcmV0dXJuIGdzbTQ4X21pX3RvX3N0cmluZyhtaV9zdHJpbmcsIEdTTTQ4X01JX1NJWkUsIG1pX2x2KzEsICptaV9sdik7Cit9CisKK2ludCBnc200OF9oYW5kbGVfcGFnaW5nX3Jlc3Aoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IG1zZy0+bGNoYW4tPnRzLT50cngtPmJ0czsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1X2ludDhfdCAqY2xhc3NtYXJrMl9sdiA9IGdoLT5kYXRhICsgMTsKKwlzdHJ1Y3QgcGFnaW5nX3NpZ25hbF9kYXRhIHNpZ19kYXRhOworCisJaWYgKGlzX3NpZW1lbnNfYnRzKGJ0cykpCisJCXNlbmRfc2llbWVuc19tcnBjaShtc2ctPmxjaGFuLCBjbGFzc21hcmsyX2x2KTsKKworCWlmICghbXNnLT5sY2hhbi0+c3Vic2NyKSB7CisJCW1zZy0+bGNoYW4tPnN1YnNjciA9IHN1YnNjcjsKKwl9IGVsc2UgaWYgKG1zZy0+bGNoYW4tPnN1YnNjciAhPSBzdWJzY3IpIHsKKwkJTE9HUChEUlIsIExPR0xfRVJST1IsICI8LSBDaGFubmVsIGFscmVhZHkgb3duZWQgYnkgc29tZW9uZSBlbHNlP1xuIik7CisJCXN1YnNjcl9wdXQoc3Vic2NyKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfSBlbHNlIHsKKwkJREVCVUdQKERSUiwgIjwtIENoYW5uZWwgYWxyZWFkeSBvd25lZCBieSB1c1xuIik7CisJCXN1YnNjcl9wdXQoc3Vic2NyKTsKKwkJc3Vic2NyID0gbXNnLT5sY2hhbi0+c3Vic2NyOworCX0KKworCXNpZ19kYXRhLnN1YnNjciA9IHN1YnNjcjsKKwlzaWdfZGF0YS5idHMJPSBtc2ctPmxjaGFuLT50cy0+dHJ4LT5idHM7CisJc2lnX2RhdGEubGNoYW4JPSBtc2ctPmxjaGFuOworCisJYnRzLT5uZXR3b3JrLT5zdGF0cy5wYWdpbmcuY29tcGxldGVkKys7CisKKwlkaXNwYXRjaF9zaWduYWwoU1NfUEFHSU5HLCBTX1BBR0lOR19TVUNDRUVERUQsICZzaWdfZGF0YSk7CisKKwkvKiBTdG9wIHBhZ2luZyBvbiB0aGUgYnRzIHdlIHJlY2VpdmVkIHRoZSBwYWdpbmcgcmVzcG9uc2UgKi8KKwlwYWdpbmdfcmVxdWVzdF9zdG9wKG1zZy0+dHJ4LT5idHMsIHN1YnNjciwgbXNnLT5sY2hhbik7CisJcmV0dXJuIDA7Cit9CisKKy8qIENoYXB0ZXIgOS4xLjk6IENpcGhlcmluZyBNb2RlIENvbW1hbmQgKi8KK2ludCBnc200OF9zZW5kX3JyX2NpcGhfbW9kZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgaW50IHdhbnRfaW1laXN2KQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisJdV9pbnQ4X3QgY2lwaF9tb2Rfc2V0OworCisJbXNnLT5sY2hhbiA9IGxjaGFuOworCisJREVCVUdQKERSUiwgIlRYIENJUEhFUklORyBNT0RFIENNRFxuIik7CisKKwlpZiAobGNoYW4tPmVuY3IuYWxnX2lkIDw9IFJTTF9FTkNfQUxHX0E1KDApKQorCQljaXBoX21vZF9zZXQgPSAwOworCWVsc2UKKwkJY2lwaF9tb2Rfc2V0ID0gKGxjaGFuLT5lbmNyLmFsZ19pZC0yKTw8MSB8IDE7CisKKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkgKyAxKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19SUjsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9SUl9DSVBIX01fQ01EOworCWdoLT5kYXRhWzBdID0gKHdhbnRfaW1laXN2ICYgMHgxKSA8PCA0IHwgKGNpcGhfbW9kX3NldCAmIDB4Zik7CisKKwlyZXR1cm4gcnNsX2VuY3J5cHRpb25fY21kKG1zZyk7Cit9CisKK3N0YXRpYyB2b2lkIGdzbTQ4X2NlbGxfZGVzYyhzdHJ1Y3QgZ3NtNDhfY2VsbF9kZXNjICpjZCwKKwkJCSAgICBjb25zdCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCWNkLT5uY2MgPSAoYnRzLT5ic2ljID4+IDMgJiAweDcpOworCWNkLT5iY2MgPSAoYnRzLT5ic2ljICYgMHg3KTsKKwljZC0+YXJmY25faGkgPSBidHMtPmMwLT5hcmZjbiA+PiA4OworCWNkLT5hcmZjbl9sbyA9IGJ0cy0+YzAtPmFyZmNuICYgMHhmZjsKK30KKworc3RhdGljIHZvaWQgZ3NtNDhfY2hhbl9kZXNjKHN0cnVjdCBnc200OF9jaGFuX2Rlc2MgKmNkLAorCQkJICAgIGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXVfaW50MTZfdCBhcmZjbiA9IGxjaGFuLT50cy0+dHJ4LT5hcmZjbiAmIDB4M2ZmOworCisJY2QtPmNoYW5fbnIgPSBsY2hhbjJjaGFuX25yKGxjaGFuKTsKKwljZC0+aDAudHNjID0gbGNoYW4tPnRzLT50cngtPmJ0cy0+dHNjOworCWNkLT5oMC5oID0gMDsKKwljZC0+aDAuYXJmY25faGlnaCA9IGFyZmNuID4+IDg7CisJY2QtPmgwLmFyZmNuX2xvdyA9IGFyZmNuICYgMHhmZjsKK30KKworLyogQ2hhcHRlciA5LjEuMTU6IEhhbmRvdmVyIENvbW1hbmQgKi8KK2ludCBnc200OF9zZW5kX2hvX2NtZChzdHJ1Y3QgZ3NtX2xjaGFuICpvbGRfbGNoYW4sIHN0cnVjdCBnc21fbGNoYW4gKm5ld19sY2hhbiwKKwkJICAgICAgdV9pbnQ4X3QgcG93ZXJfY29tbWFuZCwgdV9pbnQ4X3QgaG9fcmVmKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200OF9tc2diX2FsbG9jKCk7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSAoc3RydWN0IGdzbTQ4X2hkciAqKSBtc2diX3B1dChtc2csIHNpemVvZigqZ2gpKTsKKwlzdHJ1Y3QgZ3NtNDhfaG9fY21kICpobyA9CisJCShzdHJ1Y3QgZ3NtNDhfaG9fY21kICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpobykpOworCisJbXNnLT5sY2hhbiA9IG9sZF9sY2hhbjsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19SUjsKKwlnaC0+bXNnX3R5cGUgPSBHU000OF9NVF9SUl9IQU5ET19DTUQ7CisKKwkvKiBtYW5kYXRvcnkgYml0cyAqLworCWdzbTQ4X2NlbGxfZGVzYygmaG8tPmNlbGxfZGVzYywgbmV3X2xjaGFuLT50cy0+dHJ4LT5idHMpOworCWdzbTQ4X2NoYW5fZGVzYygmaG8tPmNoYW5fZGVzYywgbmV3X2xjaGFuKTsKKwloby0+aG9fcmVmID0gaG9fcmVmOworCWhvLT5wb3dlcl9jb21tYW5kID0gcG93ZXJfY29tbWFuZDsKKworCS8qIEZJWE1FOiBvcHRpb25hbCBiaXRzIGZvciB0eXBlIG9mIHN5bmNocm9uaXphdGlvbj8gKi8KKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CisKKy8qIENoYXB0ZXIgOS4xLjI6IEFzc2lnbm1lbnQgQ29tbWFuZCAqLworaW50IGdzbTQ4X3NlbmRfcnJfYXNzX2NtZChzdHJ1Y3QgZ3NtX2xjaGFuICpkZXN0X2xjaGFuLCBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQ4X3QgcG93ZXJfY29tbWFuZCkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmdoKSk7CisJc3RydWN0IGdzbTQ4X2Fzc19jbWQgKmFzcyA9CisJCShzdHJ1Y3QgZ3NtNDhfYXNzX2NtZCAqKSBtc2diX3B1dChtc2csIHNpemVvZigqYXNzKSk7CisKKwlERUJVR1AoRFJSLCAiLT4gQVNTSUdOTUVOVCBDT01NQU5EIHRjaF9tb2RlPTB4JTAyeFxuIiwgbGNoYW4tPnRjaF9tb2RlKTsKKworCW1zZy0+bGNoYW4gPSBkZXN0X2xjaGFuOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX1JSOworCWdoLT5tc2dfdHlwZSA9IEdTTTQ4X01UX1JSX0FTU19DTUQ7CisKKwkvKgorCSAqIGZpbGwgdGhlIGNoYW5uZWwgaW5mb3JtYXRpb24gZWxlbWVudCwgdGhpcyBjb2RlCisJICogc2hvdWxkIHByb2JhYmx5IGJlIHNoYXJlZCB3aXRoIHJzbF9yeF9jaGFuX3JxZCgpLAorCSAqIGdzbTQ4X3R4X2NoYW5fbW9kZV9tb2RpZnkuIEJ1dCBiZXdhcmUgdGhhdCAxMC41LjIuNQorCSAqIDEwLjUuMi41LmEgaGF2ZSBzbGlnaHRseSBkaWZmZXJlbnQgc2VtYW50aWMgZm9yCisJICogdGhlIGNoYW5fZGVzYy4gQnV0IGFzIGxvbmcgYXMgbXVsdGktc2xvdCBjb25maWd1cmF0aW9ucworCSAqIGFyZSBub3QgdXNlZCB3ZSBzZWVtIHRvIGJlIGZpbmUuCisJICovCisJZ3NtNDhfY2hhbl9kZXNjKCZhc3MtPmNoYW5fZGVzYywgbGNoYW4pOworCWFzcy0+cG93ZXJfY29tbWFuZCA9IHBvd2VyX2NvbW1hbmQ7CisKKwltc2diX3R2X3B1dChtc2csIEdTTTQ4X0lFX0NIQU5NT0RFXzEsIGxjaGFuLT50Y2hfbW9kZSk7CisKKwkvKiBpbiBjYXNlIG9mIG11bHRpIHJhdGUgd2UgbmVlZCB0byBhdHRhY2ggYSBjb25maWcgKi8KKwlpZiAobGNoYW4tPnRjaF9tb2RlID09IEdTTTQ4X0NNT0RFX1NQRUVDSF9BTVIpIHsKKwkJaWYgKGxjaGFuLT5tcl9jb25mLnZlciA9PSAwKSB7CisJCQlMT0dQKERSUiwgTE9HTF9FUlJPUiwgIkJVRzogVXNpbmcgbXVsdGlyYXRlIGNvZGVjICIKKwkJCQkid2l0aG91dCBtdWx0aXJhdGUgY29uZmlnLlxuIik7CisJCX0gZWxzZSB7CisJCQl1X2ludDhfdCAqZGF0YSA9IG1zZ2JfcHV0KG1zZywgNCk7CisJCQlkYXRhWzBdID0gR1NNNDhfSUVfTVVMX1JBVEVfQ0ZHOworCQkJZGF0YVsxXSA9IDB4MjsKKwkJCW1lbWNweSgmZGF0YVsyXSwgJmxjaGFuLT5tcl9jb25mLCAyKTsKKwkJfQorCX0KKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CisKKy8qIDkuMS41IENoYW5uZWwgbW9kZSBtb2RpZnk6IE1vZGlmeSB0aGUgbW9kZSBvbiB0aGUgTVMgc2lkZSAqLworaW50IGdzbTQ4X3R4X2NoYW5fbW9kZV9tb2RpZnkoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IG1vZGUpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHV0KG1zZywgc2l6ZW9mKCpnaCkpOworCXN0cnVjdCBnc200OF9jaGFuX21vZGVfbW9kaWZ5ICpjbW0gPQorCQkoc3RydWN0IGdzbTQ4X2NoYW5fbW9kZV9tb2RpZnkgKikgbXNnYl9wdXQobXNnLCBzaXplb2YoKmNtbSkpOworCXVfaW50MTZfdCBhcmZjbiA9IGxjaGFuLT50cy0+dHJ4LT5hcmZjbiAmIDB4M2ZmOworCisJREVCVUdQKERSUiwgIi0+IENIQU5ORUwgTU9ERSBNT0RJRlkgbW9kZT0weCUwMnhcbiIsIG1vZGUpOworCisJbGNoYW4tPnRjaF9tb2RlID0gbW9kZTsKKwltc2ctPmxjaGFuID0gbGNoYW47CisJZ2gtPnByb3RvX2Rpc2NyID0gR1NNNDhfUERJU0NfUlI7CisJZ2gtPm1zZ190eXBlID0gR1NNNDhfTVRfUlJfQ0hBTl9NT0RFX01PRElGOworCisJLyogZmlsbCB0aGUgY2hhbm5lbCBpbmZvcm1hdGlvbiBlbGVtZW50LCB0aGlzIGNvZGUKKwkgKiBzaG91bGQgcHJvYmFibHkgYmUgc2hhcmVkIHdpdGggcnNsX3J4X2NoYW5fcnFkKCkgKi8KKwljbW0tPmNoYW5fZGVzYy5jaGFuX25yID0gbGNoYW4yY2hhbl9ucihsY2hhbik7CisJY21tLT5jaGFuX2Rlc2MuaDAudHNjID0gbGNoYW4tPnRzLT50cngtPmJ0cy0+dHNjOworCWNtbS0+Y2hhbl9kZXNjLmgwLmggPSAwOworCWNtbS0+Y2hhbl9kZXNjLmgwLmFyZmNuX2hpZ2ggPSBhcmZjbiA+PiA4OworCWNtbS0+Y2hhbl9kZXNjLmgwLmFyZmNuX2xvdyA9IGFyZmNuICYgMHhmZjsKKwljbW0tPm1vZGUgPSBtb2RlOworCisJLyogaW4gY2FzZSBvZiBtdWx0aSByYXRlIHdlIG5lZWQgdG8gYXR0YWNoIGEgY29uZmlnICovCisJaWYgKGxjaGFuLT50Y2hfbW9kZSA9PSBHU000OF9DTU9ERV9TUEVFQ0hfQU1SKSB7CisJCWlmIChsY2hhbi0+bXJfY29uZi52ZXIgPT0gMCkgeworCQkJTE9HUChEUlIsIExPR0xfRVJST1IsICJCVUc6IFVzaW5nIG11bHRpcmF0ZSBjb2RlYyAiCisJCQkJIndpdGhvdXQgbXVsdGlyYXRlIGNvbmZpZy5cbiIpOworCQl9IGVsc2UgeworCQkJdV9pbnQ4X3QgKmRhdGEgPSBtc2diX3B1dChtc2csIDQpOworCQkJZGF0YVswXSA9IEdTTTQ4X0lFX01VTF9SQVRFX0NGRzsKKwkJCWRhdGFbMV0gPSAweDI7CisJCQltZW1jcHkoJmRhdGFbMl0sICZsY2hhbi0+bXJfY29uZiwgMik7CisJCX0KKwl9CisKKwlyZXR1cm4gZ3NtNDhfc2VuZG1zZyhtc2csIE5VTEwpOworfQorCitpbnQgZ3NtNDhfbGNoYW5fbW9kaWZ5KHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuLCB1X2ludDhfdCBsY2hhbl9tb2RlKQoreworCWludCByYzsKKworCXJjID0gZ3NtNDhfdHhfY2hhbl9tb2RlX21vZGlmeShsY2hhbiwgbGNoYW5fbW9kZSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIHJjOworfQorCitpbnQgZ3NtNDhfcnhfcnJfbW9kaWZfYWNrKHN0cnVjdCBtc2diICptc2cpCit7CisJaW50IHJjOworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXN0cnVjdCBnc200OF9jaGFuX21vZGVfbW9kaWZ5ICptb2QgPQorCQkJCShzdHJ1Y3QgZ3NtNDhfY2hhbl9tb2RlX21vZGlmeSAqKSBnaC0+ZGF0YTsKKworCURFQlVHUChEUlIsICJDSEFOTkVMIE1PREUgTU9ESUZZIEFDS1xuIik7CisKKwlpZiAobW9kLT5tb2RlICE9IG1zZy0+bGNoYW4tPnRjaF9tb2RlKSB7CisJCUxPR1AoRFJSLCBMT0dMX0VSUk9SLCAiQ0hBTk5FTCBNT0RFIGNoYW5nZSBmYWlsZWQuIFdhbnRlZDogJWQgR290OiAlZFxuIiwKKwkJCW1zZy0+bGNoYW4tPnRjaF9tb2RlLCBtb2QtPm1vZGUpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogdXBkYXRlIHRoZSBjaGFubmVsIHR5cGUgKi8KKwlzd2l0Y2ggKG1vZC0+bW9kZSkgeworCWNhc2UgR1NNNDhfQ01PREVfU0lHTjoKKwkJbXNnLT5sY2hhbi0+cnNsX2Ntb2RlID0gUlNMX0NNT0RfU1BEX1NJR047CisJCWJyZWFrOworCWNhc2UgR1NNNDhfQ01PREVfU1BFRUNIX1YxOgorCWNhc2UgR1NNNDhfQ01PREVfU1BFRUNIX0VGUjoKKwljYXNlIEdTTTQ4X0NNT0RFX1NQRUVDSF9BTVI6CisJCW1zZy0+bGNoYW4tPnJzbF9jbW9kZSA9IFJTTF9DTU9EX1NQRF9TUEVFQ0g7CisJCWJyZWFrOworCWNhc2UgR1NNNDhfQ01PREVfREFUQV8xNGs1OgorCWNhc2UgR1NNNDhfQ01PREVfREFUQV8xMmswOgorCWNhc2UgR1NNNDhfQ01PREVfREFUQV82azA6CisJY2FzZSBHU000OF9DTU9ERV9EQVRBXzNrNjoKKwkJbXNnLT5sY2hhbi0+cnNsX2Ntb2RlID0gUlNMX0NNT0RfU1BEX0RBVEE7CisJCWJyZWFrOworCX0KKworCS8qIFdlJ3ZlIHN1Y2Nlc3NmdWxseSBtb2RpZmllZCB0aGUgTVMgc2lkZSBvZiB0aGUgY2hhbm5lbCwKKwkgKiBub3cgZ28gb24gdG8gbW9kaWZ5IHRoZSBCVFMgc2lkZSBvZiB0aGUgY2hhbm5lbCAqLworCXJjID0gcnNsX2NoYW5fbW9kZV9tb2RpZnlfcmVxKG1zZy0+bGNoYW4pOworCisJLyogRklYTUU6IHdlIG5vdCBvbmx5IG5lZWQgdG8gZG8gdGhpcyBhZnRlciBtb2RlIG1vZGlmeSwgYnV0CisJICogYWxzbyBhZnRlciBjaGFubmVsIGFjdGl2YXRpb24gKi8KKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKG1zZy0+bGNoYW4tPnRzLT50cngtPmJ0cykgJiYgbW9kLT5tb2RlICE9IEdTTTQ4X0NNT0RFX1NJR04pCisJCXJzbF9pcGFjY19jcmN4KG1zZy0+bGNoYW4pOworCXJldHVybiByYzsKK30KKworaW50IGdzbTQ4X3BhcnNlX21lYXNfcmVwKHN0cnVjdCBnc21fbWVhc19yZXAgKnJlcCwgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaCA9IG1zZ2JfbDMobXNnKTsKKwl1bnNpZ25lZCBpbnQgcGF5bG9hZF9sZW4gPSBtc2diX2wzbGVuKG1zZykgLSBzaXplb2YoKmdoKTsKKwl1X2ludDhfdCAqZGF0YSA9IGdoLT5kYXRhOworCXN0cnVjdCBnc21fYnRzICpidHMgPSBtc2ctPmxjaGFuLT50cy0+dHJ4LT5idHM7CisJc3RydWN0IGJpdHZlYyAqbmJ2ID0gJmJ0cy0+c2lfY29tbW9uLm5laWdoX2xpc3Q7CisJc3RydWN0IGdzbV9tZWFzX3JlcF9jZWxsICptcmM7CisKKwlpZiAoZ2gtPm1zZ190eXBlICE9IEdTTTQ4X01UX1JSX01FQVNfUkVQKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWlmIChkYXRhWzBdICYgMHg4MCkKKwkJcmVwLT5mbGFncyB8PSBNRUFTX1JFUF9GX0JBMTsKKwlpZiAoZGF0YVswXSAmIDB4NDApCisJCXJlcC0+ZmxhZ3MgfD0gTUVBU19SRVBfRl9VTF9EVFg7CisJaWYgKChkYXRhWzFdICYgMHg0MCkgPT0gMHgwMCkKKwkJcmVwLT5mbGFncyB8PSBNRUFTX1JFUF9GX0RMX1ZBTElEOworCisJcmVwLT5kbC5mdWxsLnJ4X2xldiA9IGRhdGFbMF0gJiAweDNmOworCXJlcC0+ZGwuc3ViLnJ4X2xldiA9IGRhdGFbMV0gJiAweDNmOworCXJlcC0+ZGwuZnVsbC5yeF9xdWFsID0gKGRhdGFbM10gPj4gNCkgJiAweDc7CisJcmVwLT5kbC5zdWIucnhfcXVhbCA9IChkYXRhWzNdID4+IDEpICYgMHg3OworCisJcmVwLT5udW1fY2VsbCA9ICgoZGF0YVszXSA+PiA2KSAmIDB4MykgfCAoKGRhdGFbMl0gJiAweDAxKSA8PCAyKTsKKwlpZiAocmVwLT5udW1fY2VsbCA8IDEgfHwgcmVwLT5udW1fY2VsbCA+IDYpCisJCXJldHVybiAwOworCisJLyogYW4gZW5jb2RpbmcgbmlnaHRtYXJlIGluIHBlcmZlY3Rpb24gKi8KKwltcmMgPSAmcmVwLT5jZWxsWzBdOworCW1yYy0+cnhsZXYgPSBkYXRhWzNdICYgMHgzZjsKKwltcmMtPm5laWdoX2lkeCA9IGRhdGFbNF0gPj4gMzsKKwltcmMtPmFyZmNuID0gYml0dmVjX2dldF9udGhfc2V0X2JpdChuYnYsIG1yYy0+bmVpZ2hfaWR4ICsgMSk7CisJbXJjLT5ic2ljID0gKChkYXRhWzRdICYgMHgwNykgPDwgMykgfCAoZGF0YVs1XSA+PiA1KTsKKwlpZiAocmVwLT5udW1fY2VsbCA8IDIpCisJCXJldHVybiAwOworCisJbXJjID0gJnJlcC0+Y2VsbFsxXTsKKwltcmMtPnJ4bGV2ID0gKChkYXRhWzVdICYgMHgxZikgPDwgMSkgfCAoZGF0YVs2XSA+PiA3KTsKKwltcmMtPm5laWdoX2lkeCA9IChkYXRhWzZdID4+IDIpICYgMHgxZjsKKwltcmMtPmFyZmNuID0gYml0dmVjX2dldF9udGhfc2V0X2JpdChuYnYsIG1yYy0+bmVpZ2hfaWR4ICsgMSk7CisJbXJjLT5ic2ljID0gKChkYXRhWzZdICYgMHgwMykgPDwgNCkgfCAoZGF0YVs3XSA+PiA0KTsKKwlpZiAocmVwLT5udW1fY2VsbCA8IDMpCisJCXJldHVybiAwOworCisJbXJjID0gJnJlcC0+Y2VsbFsyXTsKKwltcmMtPnJ4bGV2ID0gKChkYXRhWzddICYgMHgwZikgPDwgMikgfCAoZGF0YVs4XSA+PiA2KTsKKwltcmMtPm5laWdoX2lkeCA9IChkYXRhWzhdID4+IDEpICYgMHgxZjsKKwltcmMtPmFyZmNuID0gYml0dmVjX2dldF9udGhfc2V0X2JpdChuYnYsIG1yYy0+bmVpZ2hfaWR4ICsgMSk7CisJbXJjLT5ic2ljID0gKChkYXRhWzhdICYgMHgwMSkgPDwgNSkgfCAoZGF0YVs5XSA+PiAzKTsKKwlpZiAocmVwLT5udW1fY2VsbCA8IDQpCisJCXJldHVybiAwOworCisJbXJjID0gJnJlcC0+Y2VsbFszXTsKKwltcmMtPnJ4bGV2ID0gKChkYXRhWzldICYgMHgwNykgPDwgMykgfCAoZGF0YVsxMF0gPj4gNSk7CisJbXJjLT5uZWlnaF9pZHggPSBkYXRhWzEwXSAmIDB4MWY7CisJbXJjLT5hcmZjbiA9IGJpdHZlY19nZXRfbnRoX3NldF9iaXQobmJ2LCBtcmMtPm5laWdoX2lkeCArIDEpOworCW1yYy0+YnNpYyA9IGRhdGFbMTFdID4+IDI7CisJaWYgKHJlcC0+bnVtX2NlbGwgPCA1KQorCQlyZXR1cm4gMDsKKworCW1yYyA9ICZyZXAtPmNlbGxbNF07CisJbXJjLT5yeGxldiA9ICgoZGF0YVsxMV0gJiAweDAzKSA8PCA0KSB8IChkYXRhWzEyXSA+PiA0KTsKKwltcmMtPm5laWdoX2lkeCA9ICgoZGF0YVsxMl0gJiAweGYpIDw8IDEpIHwgKGRhdGFbMTNdID4+IDcpOworCW1yYy0+YXJmY24gPSBiaXR2ZWNfZ2V0X250aF9zZXRfYml0KG5idiwgbXJjLT5uZWlnaF9pZHggKyAxKTsKKwltcmMtPmJzaWMgPSAoZGF0YVsxM10gPj4gMSkgJiAweDNmOworCWlmIChyZXAtPm51bV9jZWxsIDwgNikKKwkJcmV0dXJuIDA7CisKKwltcmMgPSAmcmVwLT5jZWxsWzVdOworCW1yYy0+cnhsZXYgPSAoKGRhdGFbMTNdICYgMHgwMSkgPDwgNSkgfCAoZGF0YVsxNF0gPj4gMyk7CisJbXJjLT5uZWlnaF9pZHggPSAoKGRhdGFbMTRdICYgMHgwNykgPDwgMikgfCAoZGF0YVsxNV0gPj4gNik7CisJbXJjLT5hcmZjbiA9IGJpdHZlY19nZXRfbnRoX3NldF9iaXQobmJ2LCBtcmMtPm5laWdoX2lkeCArIDEpOworCW1yYy0+YnNpYyA9IGRhdGFbMTVdICYgMHgzZjsKKworCXJldHVybiAwOworfQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9nc21fMDRfMTEuYyBiL29wZW5ic2Mvc3JjL2dzbV8wNF8xMS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MWMzNzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9nc21fMDRfMTEuYwpAQCAtMCwwICsxLDEyNDEgQEAKKy8qIFBvaW50LXRvLVBvaW50IChQUCkgU2hvcnQgTWVzc2FnZSBTZXJ2aWNlIChTTVMpCisgKiBTdXBwb3J0IG9uIE1vYmlsZSBSYWRpbyBJbnRlcmZhY2UKKyAqIDNHUFAgVFMgMDQuMTEgdmVyc2lvbiA3LjEuMCBSZWxlYXNlIDE5OTggLyBFVFNJIFRTIDEwMCA5NDIgVjcuMS4wICovCisKKy8qIChDKSAyMDA4IGJ5IERhbmllbCBXaWxsbWFubiA8ZGFuaWVsQHRvdGFsdWViZXJ3YWNodW5nLmRlPgorICogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMTEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RyYW5zYWN0aW9uLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9wYWdpbmcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2JzY19ybGwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2NoYW5fYWxsb2MuaD4KKworI2RlZmluZSBHU000MTFfQUxMT0NfU0laRQkxMDI0CisjZGVmaW5lIEdTTTQxMV9BTExPQ19IRUFEUk9PTQkxMjgKKworI2RlZmluZSBVTV9TQVBJX1NNUyAzCS8qIFNlZSBHU00gMDQuMDUvMDQuMDYgKi8KKwordm9pZCAqdGFsbF9nc21zX2N0eDsKK3N0YXRpYyB1X2ludDMyX3QgbmV3X2NhbGxyZWYgPSAweDQwMDAwMDAxOworCitzdGF0aWMgY29uc3Qgc3RydWN0IHZhbHVlX3N0cmluZyBjcF9jYXVzZV9zdHJzW10gPSB7CisJeyBHU000MTFfQ1BfQ0FVU0VfTkVUX0ZBSUwsCSJOZXR3b3JrIEZhaWx1cmUiIH0sCisJeyBHU000MTFfQ1BfQ0FVU0VfQ09OR0VTVElPTiwJIkNvbmdlc3Rpb24iIH0sCisJeyBHU000MTFfQ1BfQ0FVU0VfSU5WX1RSQU5TX0lELAkiSW52YWxpZCBUcmFuc2FjdGlvbiBJRCIgfSwKKwl7IEdTTTQxMV9DUF9DQVVTRV9TRU1BTlRfSU5DX01TRywgIlNlbWFudGljYWxseSBJbmNvcnJlY3QgTWVzc2FnZSIgfSwKKwl7IEdTTTQxMV9DUF9DQVVTRV9JTlZfTUFORF9JTkYsCSJJbnZhbGlkIE1hbmRhdG9yeSBJbmZvcm1hdGlvbiIgfSwKKwl7IEdTTTQxMV9DUF9DQVVTRV9NU0dUWVBFX05PVEVYSVNULCAiTWVzc2FnZSBUeXBlIGRvZXNuJ3QgZXhpc3QiIH0sCisJeyBHU000MTFfQ1BfQ0FVU0VfTVNHX0lOQ09NUF9TVEFURSwgCisJCQkJIk1lc3NhZ2UgaW5jb21wYXRpYmxlIHdpdGggcHJvdG9jb2wgc3RhdGUiIH0sCisJeyBHU000MTFfQ1BfQ0FVU0VfSUVfTk9URVhJU1QsCSJJRSBkb2VzIG5vdCBleGlzdCIgfSwKKwl7IEdTTTQxMV9DUF9DQVVTRV9QUk9UT0NPTF9FUlIsCSJQcm90b2NvbCBFcnJvciIgfSwKKwl7IDAsIDAgfQorfTsKKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgcnBfY2F1c2Vfc3Ryc1tdID0geworCXsgR1NNNDExX1JQX0NBVVNFX01PX05VTV9VTkFTU0lHTkVELCAiKE1PKSBOdW1iZXIgbm90IGFzc2lnbmVkIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX09QX0RFVF9CQVJSLCAiKE1PKSBPcGVyYXRvciBkZXRlcm1pbmVkIGJhcnJpbmciIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fQ0FMTF9CQVJSRUQsICIoTU8pIENhbGwgYmFycmVkIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX1NNU19SRUpFQ1RFRCwgIihNTykgU01TIHJlamVjdGVkIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX0RFU1RfT1VUX09GX09SREVSLCAiKE1PKSBEZXN0aW5hdGlvbiBvdXQgb2Ygb3JkZXIiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fVU5JREVOVElGSUVEX1NVQlNDUiwgIihNTykgVW5pZGVudGlmaWVkIHN1YnNjcmliZXIiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fRkFDSUxJVFlfUkVKLCAiKE1PKSBGYWNpbGl0eSByZWplY3QiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fVU5LTk9XTl9TVUJTQ1IsICIoTU8pIFVua25vd24gc3Vic2NyaWJlciIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19ORVRfT1VUX09GX09SREVSLCAiKE1PKSBOZXR3b3JrIG91dCBvZiBvcmRlciIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NT19URU1QX0ZBSUwsICIoTU8pIFRlbXBvcmFyeSBmYWlsdXJlIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX0NPTkdFU1RJT04sICIoTU8pIENvbmdlc3Rpb24iIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fUkVTX1VOQVZBSUwsICIoTU8pIFJlc291cmNlIHVuYXZhaWxhYmxlIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX1JFUV9GQUNfTk9UU1VCU0NSLCAiKE1PKSBSZXF1ZXN0ZWQgZmFjaWxpdHkgbm90IHN1YnNjcmliZWQiIH0sCisJeyBHU000MTFfUlBfQ0FVU0VfTU9fUkVRX0ZBQ19OT1RJTVBMLCAiKE1PKSBSZXF1ZXN0ZWQgZmFjaWxpdHkgbm90IGltcGxlbWVudGVkIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX01PX0lOVEVSV09SS0lORywgIihNTykgSW50ZXJ3b3JraW5nIiB9LAorCS8qIHZhbGlkIG9ubHkgZm9yIE1UICovCisJeyBHU000MTFfUlBfQ0FVU0VfTVRfTUVNX0VYQ0VFREVELCAiKE1UKSBNZW1vcnkgRXhjZWVkZWQiIH0sCisJLyogdmFsaWQgZm9yIGJvdGggZGlyZWN0aW9ucyAqLworCXsgR1NNNDExX1JQX0NBVVNFX0lOVl9UUkFOU19SRUYsICJJbnZhbGlkIFRyYW5zYWN0aW9uIFJlZmVyZW5jZSIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9TRU1BTlRfSU5DX01TRywgIlNlbWFudGljYWxseSBJbmNvcnJlY3QgTWVzc2FnZSIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9JTlZfTUFORF9JTkYsICJJbnZhbGlkIE1hbmRhdG9yeSBJbmZvcm1hdGlvbiIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NU0dUWVBFX05PVEVYSVNULCAiTWVzc2FnZSBUeXBlIG5vbi1leGlzdGFudCIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9NU0dfSU5DT01QX1NUQVRFLCAiTWVzc2FnZSBpbmNvbXBhdGlibGUgd2l0aCBwcm90b2NvbCBzdGF0ZSIgfSwKKwl7IEdTTTQxMV9SUF9DQVVTRV9JRV9OT1RFWElTVCwgIkluZm9ybWF0aW9uIEVsZW1lbnQgbm90IGV4aXN0aW5nIiB9LAorCXsgR1NNNDExX1JQX0NBVVNFX1BST1RPQ09MX0VSUiwgIlByb3RvY29sIEVycm9yIiB9LAorCXsgMCwgTlVMTCB9Cit9OworCitzdHJ1Y3QgZ3NtX3NtcyAqc21zX2FsbG9jKHZvaWQpCit7CisJcmV0dXJuIHRhbGxvY196ZXJvKHRhbGxfZ3Ntc19jdHgsIHN0cnVjdCBnc21fc21zKTsKK30KKwordm9pZCBzbXNfZnJlZShzdHJ1Y3QgZ3NtX3NtcyAqc21zKQoreworCS8qIGRyb3AgcmVmZXJlbmNlcyB0byBzdWJzY3JpYmVyIHN0cnVjdHVyZSAqLworCWlmIChzbXMtPnNlbmRlcikKKwkJc3Vic2NyX3B1dChzbXMtPnNlbmRlcik7CisJaWYgKHNtcy0+cmVjZWl2ZXIpCisJCXN1YnNjcl9wdXQoc21zLT5yZWNlaXZlcik7CisKKwl0YWxsb2NfZnJlZShzbXMpOworfQorCitzdHJ1Y3QgbXNnYiAqZ3NtNDExX21zZ2JfYWxsb2Modm9pZCkKK3sKKwlyZXR1cm4gbXNnYl9hbGxvY19oZWFkcm9vbShHU000MTFfQUxMT0NfU0laRSwgR1NNNDExX0FMTE9DX0hFQURST09NLAorCQkJCSAgICJHU00gMDQuMTEiKTsKK30KKworc3RhdGljIGludCBnc200MTFfc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnLCB1X2ludDhfdCBsaW5rX2lkKQoreworCWlmIChtc2ctPmxjaGFuKQorCQltc2ctPnRyeCA9IG1zZy0+bGNoYW4tPnRzLT50cng7CisKKwltc2ctPmwzaCA9IG1zZy0+ZGF0YTsKKworCURFQlVHUChEU01TLCAiR1NNNC4xMSBUWCAlc1xuIiwgaGV4ZHVtcChtc2ctPmRhdGEsIG1zZy0+bGVuKSk7CisKKwlyZXR1cm4gcnNsX2RhdGFfcmVxdWVzdChtc2csIGxpbmtfaWQpOworfQorCisvKiBTTUMgVEMxKiBpcyBleHBpcmVkICovCitzdGF0aWMgdm9pZCBjcF90aW1lcl9leHBpcmVkKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGdzbV90cmFucyAqdHJhbnMgPSBkYXRhOworCisJREVCVUdQKERTTVMsICJTTUMgVGltZXIgVEMxKiBpcyBleHBpcmVkLCBjYWxsaW5nIHRyYW5zX2ZyZWUoKVxuIik7CisJLyogRklYTUU6IHdlIG5lZWQgdG8gcmUtdHJhbnNtaXQgdGhlIGxhc3QgQ1AtREFUQSAxLi4zIHRpbWVzICovCisJdHJhbnNfZnJlZSh0cmFucyk7Cit9CisKKy8qIFByZWZpeCBtc2cgd2l0aCBhIDA0LjA4LzA0LjExIENQIGhlYWRlciAqLworc3RhdGljIGludCBnc200MTFfY3Bfc2VuZG1zZyhzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywKKwkJCSAgICAgdV9pbnQ4X3QgbXNnX3R5cGUpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2g7CisKKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHVzaChtc2csIHNpemVvZigqZ2gpKTsKKwkvKiBPdXRnb2luZyBuZWVkcyB0aGUgaGlnaGVzdCBiaXQgc2V0ICovCisJZ2gtPnByb3RvX2Rpc2NyID0gdHJhbnMtPnByb3RvY29sIHwgKHRyYW5zLT50cmFuc2FjdGlvbl9pZDw8NCk7CisJZ2gtPm1zZ190eXBlID0gbXNnX3R5cGU7CisKKwkvKiBhc3NpZ24gdGhlIG91dGdvaW5nIGxjaGFuICovCisJbXNnLT5sY2hhbiA9IHRyYW5zLT5sY2hhbjsKKworCS8qIG1vYmlsZSBvcmlnaW5hdGluZyAqLworCXN3aXRjaCAoZ2gtPm1zZ190eXBlKSB7CisJY2FzZSBHU000MTFfTVRfQ1BfREFUQToKKwkJLyogNS4yLjMuMS4yOiBlbnRlciBNTy13YWl0IGZvciBDUC1hY2sgKi8KKwkJLyogNS4yLjMuMi4zOiBlbnRlciBNVC13YWl0IGZvciBDUC1BQ0sgKi8KKwkJdHJhbnMtPnNtcy5jcF9zdGF0ZSA9IEdTTTQxMV9DUFNfV0FJVF9DUF9BQ0s7CisJCXRyYW5zLT5zbXMuY3BfdGltZXIuZGF0YSA9IHRyYW5zOworCQl0cmFucy0+c21zLmNwX3RpbWVyLmNiID0gY3BfdGltZXJfZXhwaXJlZDsKKwkJLyogNS4zLjIuMTogU2V0IFRpbWVyIFRDMUEgKi8KKwkJYnNjX3NjaGVkdWxlX3RpbWVyKCZ0cmFucy0+c21zLmNwX3RpbWVyLCBHU000MTFfVE1SX1RDMUEpOworCQlERUJVR1AoRFNNUywgIlRYOiBDUC1EQVRBICIpOworCQlicmVhazsKKwljYXNlIEdTTTQxMV9NVF9DUF9BQ0s6CisJCURFQlVHUChEU01TLCAiVFg6IENQLUFDSyAiKTsKKwkJYnJlYWs7CisJY2FzZSBHU000MTFfTVRfQ1BfRVJST1I6CisJCURFQlVHUChEU01TLCAiVFg6IENQLUVSUk9SICIpOworCQlicmVhazsKKwl9CisKKwlERUJVR1BDKERTTVMsICJ0cmFucz0leFxuIiwgdHJhbnMtPnRyYW5zYWN0aW9uX2lkKTsKKworCXJldHVybiBnc200MTFfc2VuZG1zZyhtc2csIHRyYW5zLT5zbXMubGlua19pZCk7Cit9CisKKy8qIFByZWZpeCBtc2cgd2l0aCBhIFJQLURBVEEgaGVhZGVyIGFuZCBzZW5kIGFzIENQLURBVEEgKi8KK3N0YXRpYyBpbnQgZ3NtNDExX3JwX3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV90cmFucyAqdHJhbnMsCisJCQkgICAgIHVfaW50OF90IHJwX21zZ190eXBlLCB1X2ludDhfdCBycF9tc2dfcmVmKQoreworCXN0cnVjdCBnc200MTFfcnBfaGRyICpycDsKKwl1X2ludDhfdCBsZW4gPSBtc2ctPmxlbjsKKworCS8qIEdTTSAwNC4xMSBSUC1EQVRBIGhlYWRlciAqLworCXJwID0gKHN0cnVjdCBnc200MTFfcnBfaGRyICopbXNnYl9wdXNoKG1zZywgc2l6ZW9mKCpycCkpOworCXJwLT5sZW4gPSBsZW4gKyAyOworCXJwLT5tc2dfdHlwZSA9IHJwX21zZ190eXBlOworCXJwLT5tc2dfcmVmID0gcnBfbXNnX3JlZjsgLyogRklYTUU6IENob29zZSByYW5kb21seSAqLworCisJcmV0dXJuIGdzbTQxMV9jcF9zZW5kbXNnKG1zZywgdHJhbnMsIEdTTTQxMV9NVF9DUF9EQVRBKTsKK30KKworLyogVHVybiBpbnQgaW50byBzZW1pLW9jdGV0IHJlcHJlc2VudGF0aW9uOiA5OCA9PiAweDg5ICovCitzdGF0aWMgdV9pbnQ4X3QgYmNkaWZ5KHVfaW50OF90IHZhbHVlKQoreworCXVfaW50OF90IHJldDsKKworCXJldCA9IHZhbHVlIC8gMTA7CisJcmV0IHw9ICh2YWx1ZSAlIDEwKSA8PCA0OworCisJcmV0dXJuIHJldDsKK30KKworLyogVHVybiBzZW1pLW9jdGV0IHJlcHJlc2VudGF0aW9uIGludG8gaW50OiAweDg5ID0+IDk4ICovCitzdGF0aWMgdV9pbnQ4X3QgdW5iY2RpZnkodV9pbnQ4X3QgdmFsdWUpCit7CisJdV9pbnQ4X3QgcmV0OworCisJaWYgKCh2YWx1ZSAmIDB4MEYpID4gOSB8fCAodmFsdWUgPj4gNCkgPiA5KQorCQlMT0dQKERTTVMsIExPR0xfRVJST1IsIAorCQkgICAgICJ1bmJjZGlmeSBnb3QgdG9vIGJpZyBuaWJibGU6IDB4JTAyWFxuIiwgdmFsdWUpOworCisJcmV0ID0gKHZhbHVlJjB4MEYpKjEwOworCXJldCArPSB2YWx1ZT4+NDsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIEdlbmVyYXRlIDAzLjQwIFRQLVNDVFMgKi8KK3N0YXRpYyB2b2lkIGdzbTM0MF9nZW5fc2N0cyh1X2ludDhfdCAqc2N0cywgdGltZV90IHRpbWUpCit7CisJc3RydWN0IHRtICp0bSA9IGxvY2FsdGltZSgmdGltZSk7CisKKwkqc2N0cysrID0gYmNkaWZ5KHRtLT50bV95ZWFyICUgMTAwKTsKKwkqc2N0cysrID0gYmNkaWZ5KHRtLT50bV9tb24gKyAxKTsKKwkqc2N0cysrID0gYmNkaWZ5KHRtLT50bV9tZGF5KTsKKwkqc2N0cysrID0gYmNkaWZ5KHRtLT50bV9ob3VyKTsKKwkqc2N0cysrID0gYmNkaWZ5KHRtLT50bV9taW4pOworCSpzY3RzKysgPSBiY2RpZnkodG0tPnRtX3NlYyk7CisJKnNjdHMrKyA9IGJjZGlmeSh0bS0+dG1fZ210b2ZmLyg2MCoxNSkpOworfQorCisvKiBEZWNvZGUgMDMuNDAgVFAtU0NUUyAoaW50byB1dGMvZ210IHRpbWVzdGFtcCkgKi8KK3N0YXRpYyB0aW1lX3QgZ3NtMzQwX3NjdHModV9pbnQ4X3QgKnNjdHMpCit7CisJc3RydWN0IHRtIHRtOworCisJdV9pbnQ4X3QgeXIgPSB1bmJjZGlmeSgqc2N0cysrKTsKKworCWlmICh5ciA8PSA4MCkKKwkJdG0udG1feWVhciA9IDEwMCArIHlyOworCWVsc2UKKwkJdG0udG1feWVhciA9IHlyOworCXRtLnRtX21vbiAgPSB1bmJjZGlmeSgqc2N0cysrKSAtIDE7CisJdG0udG1fbWRheSA9IHVuYmNkaWZ5KCpzY3RzKyspOworCXRtLnRtX2hvdXIgPSB1bmJjZGlmeSgqc2N0cysrKTsKKwl0bS50bV9taW4gID0gdW5iY2RpZnkoKnNjdHMrKyk7CisJdG0udG1fc2VjICA9IHVuYmNkaWZ5KCpzY3RzKyspOworCS8qIGFjY29yZGluZyB0byBnc20gMDMuNDAgdGltZSB6b25lIGlzCisJICAgImV4cHJlc3NlZCBpbiBxdWFydGVycyBvZiBhbiBob3VyIiAqLworCXRtLnRtX2dtdG9mZiA9IHVuYmNkaWZ5KCpzY3RzKyspICogMTUqNjA7CisKKwlyZXR1cm4gbWt0aW1lKCZ0bSk7Cit9CisKKy8qIFJldHVybiB0aGUgZGVmYXVsdCB2YWxpZGl0eSBwZXJpb2QgaW4gbWludXRlcyAqLworc3RhdGljIHVuc2lnbmVkIGxvbmcgZ3NtMzQwX3ZwX2RlZmF1bHQodm9pZCkKK3sKKwl1bnNpZ25lZCBsb25nIG1pbnV0ZXM7CisJLyogRGVmYXVsdCB2YWxpZGl0eTogdHdvIGRheXMgKi8KKwltaW51dGVzID0gMjQgKiA2MCAqIDI7CisJcmV0dXJuIG1pbnV0ZXM7Cit9CisKKy8qIERlY29kZSB2YWxpZGl0eSBwZXJpb2QgZm9ybWF0ICdyZWxhdGl2ZScgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdzbTM0MF92cF9yZWxhdGl2ZSh1X2ludDhfdCAqc21zX3ZwKQoreworCS8qIENoYXB0ZXIgOS4yLjMuMTIuMSAqLworCXVfaW50OF90IHZwOworCXVuc2lnbmVkIGxvbmcgbWludXRlczsKKworCXZwID0gKihzbXNfdnApOworCWlmICh2cCA8PSAxNDMpCisJCW1pbnV0ZXMgPSB2cCArIDEgKiA1OworCWVsc2UgaWYgKHZwIDw9IDE2NykKKwkJbWludXRlcyA9IDEyKjYwICsgKHZwLTE0MykgKiAzMDsKKwllbHNlIGlmICh2cCA8PSAxOTYpCisJCW1pbnV0ZXMgPSB2cC0xNjYgKiA2MCAqIDI0OworCWVsc2UKKwkJbWludXRlcyA9IHZwLTE5MiAqIDYwICogMjQgKiA3OworCXJldHVybiBtaW51dGVzOworfQorCisvKiBEZWNvZGUgdmFsaWRpdHkgcGVyaW9kIGZvcm1hdCAnYWJzb2x1dGUnICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnc20zNDBfdnBfYWJzb2x1dGUodV9pbnQ4X3QgKnNtc192cCkKK3sKKwkvKiBDaGFwdGVyIDkuMi4zLjEyLjIgKi8KKwl0aW1lX3QgZXhwaXJlcywgbm93OworCXVuc2lnbmVkIGxvbmcgbWludXRlczsKKworCWV4cGlyZXMgPSBnc20zNDBfc2N0cyhzbXNfdnApOworCW5vdyA9IG1rdGltZShnbXRpbWUoTlVMTCkpOworCWlmIChleHBpcmVzIDw9IG5vdykKKwkJbWludXRlcyA9IDA7CisJZWxzZQorCQltaW51dGVzID0gKGV4cGlyZXMtbm93KS82MDsKKwlyZXR1cm4gbWludXRlczsKK30KKworLyogRGVjb2RlIHZhbGlkaXR5IHBlcmlvZCBmb3JtYXQgJ3JlbGF0aXZlIGluIGludGVnZXIgcmVwcmVzZW50YXRpb24nICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnc20zNDBfdnBfcmVsYXRpdmVfaW50ZWdlcih1X2ludDhfdCAqc21zX3ZwKQoreworCXVfaW50OF90IHZwOworCXVuc2lnbmVkIGxvbmcgbWludXRlczsKKwl2cCA9ICooc21zX3ZwKTsKKwlpZiAodnAgPT0gMCkgeworCQlMT0dQKERTTVMsIExPR0xfRVJST1IsCisJCSAgICAgInJlc2VydmVkIHJlbGF0aXZlX2ludGVnZXIgdmFsaWRpdHkgcGVyaW9kXG4iKTsKKwkJcmV0dXJuIGdzbTM0MF92cF9kZWZhdWx0KCk7CisJfQorCW1pbnV0ZXMgPSB2cC82MDsKKwlyZXR1cm4gbWludXRlczsKK30KKworLyogRGVjb2RlIHZhbGlkaXR5IHBlcmlvZCBmb3JtYXQgJ3JlbGF0aXZlIGluIHNlbWktb2N0ZXQgcmVwcmVzZW50YXRpb24nICovCitzdGF0aWMgdW5zaWduZWQgbG9uZyBnc20zNDBfdnBfcmVsYXRpdmVfc2VtaW9jdGV0KHVfaW50OF90ICpzbXNfdnApCit7CisJdW5zaWduZWQgbG9uZyBtaW51dGVzOworCW1pbnV0ZXMgPSB1bmJjZGlmeSgqc21zX3ZwKyspKjYwOyAgLyogaG91cnMgKi8KKwltaW51dGVzICs9IHVuYmNkaWZ5KCpzbXNfdnArKyk7ICAgIC8qIG1pbnV0ZXMgKi8KKwltaW51dGVzICs9IHVuYmNkaWZ5KCpzbXNfdnArKykvNjA7IC8qIHNlY29uZHMgKi8KKwlyZXR1cm4gbWludXRlczsKK30KKworLyogZGVjb2RlIHZhbGlkaXR5IHBlcmlvZC4gcmV0dXJuIG1pbnV0ZXMgKi8KK3N0YXRpYyB1bnNpZ25lZCBsb25nIGdzbTM0MF92YWxpZGl0eV9wZXJpb2QodV9pbnQ4X3Qgc21zX3ZwZiwgdV9pbnQ4X3QgKnNtc192cCkKK3sKKwl1X2ludDhfdCBmaTsgLyogZnVuY3Rpb25hbGl0eSBpbmRpY2F0b3IgKi8KKworCXN3aXRjaCAoc21zX3ZwZikgeworCWNhc2UgR1NNMzQwX1RQX1ZQRl9SRUxBVElWRToKKwkJcmV0dXJuIGdzbTM0MF92cF9yZWxhdGl2ZShzbXNfdnApOworCWNhc2UgR1NNMzQwX1RQX1ZQRl9BQlNPTFVURToKKwkJcmV0dXJuIGdzbTM0MF92cF9hYnNvbHV0ZShzbXNfdnApOworCWNhc2UgR1NNMzQwX1RQX1ZQRl9FTkhBTkNFRDoKKwkJLyogQ2hhcHRlciA5LjIuMy4xMi4zICovCisJCWZpID0gKnNtc192cCsrOworCQkvKiBpZ25vcmUgYWRkaXRpb25hbCBmaSAqLworCQlpZiAoZmkgJiAoMTw8NykpIHNtc192cCsrOworCQkvKiByZWFkIHZhbGlkaXR5IHBlcmlvZCBmb3JtYXQgKi8KKwkJc3dpdGNoIChmaSAmIDBiMTExKSB7CisJCWNhc2UgMGIwMDA6CisJCQlyZXR1cm4gZ3NtMzQwX3ZwX2RlZmF1bHQoKTsgLyogbm8gdnBmIHNwZWNpZmllZCAqLworCQljYXNlIDBiMDAxOgorCQkJcmV0dXJuIGdzbTM0MF92cF9yZWxhdGl2ZShzbXNfdnApOworCQljYXNlIDBiMDEwOgorCQkJcmV0dXJuIGdzbTM0MF92cF9yZWxhdGl2ZV9pbnRlZ2VyKHNtc192cCk7CisJCWNhc2UgMGIwMTE6CisJCQlyZXR1cm4gZ3NtMzQwX3ZwX3JlbGF0aXZlX3NlbWlvY3RldChzbXNfdnApOworCQlkZWZhdWx0OgorCQkJLyogVGhlIEdTTSBzcGVjIHNheXMgdGhhdCB0aGUgU0Mgc2hvdWxkIHJlamVjdCBhbnkKKwkJCSAgIHVuc3VwcG9ydGVkIGFuZC9vciB1bmRlZmluZWQgdmFsdWVzLiBGSVhNRSAqLworCQkJTE9HUChEU01TLCBMT0dMX0VSUk9SLAorCQkJICAgICAiUmVzZXJ2ZWQgZW5oYW5jZWQgdmFsaWRpdHkgcGVyaW9kIGZvcm1hdFxuIik7CisJCQlyZXR1cm4gZ3NtMzQwX3ZwX2RlZmF1bHQoKTsKKwkJfQorCWNhc2UgR1NNMzQwX1RQX1ZQRl9OT05FOgorCWRlZmF1bHQ6CisJCXJldHVybiBnc20zNDBfdnBfZGVmYXVsdCgpOworCX0KK30KKworLyogZGV0ZXJtaW5lIGNvZGluZyBhbHBoYWJldCBkZXBlbmRlbnQgb24gR1NNIDAzLjM4IFNlY3Rpb24gNCBEQ1MgKi8KK2VudW0gc21zX2FscGhhYmV0IGdzbTMzOF9nZXRfc21zX2FscGhhYmV0KHVfaW50OF90IGRjcykKK3sKKwl1X2ludDhfdCBjZ2JpdHMgPSBkY3MgPj4gNDsKKwllbnVtIHNtc19hbHBoYWJldCBhbHBoYSA9IERDU19OT05FOworCisJaWYgKChjZ2JpdHMgJiAweGMpID09IDApIHsKKwkJaWYgKGNnYml0cyAmIDIpCisJCQlMT0dQKERTTVMsIExPR0xfTk9USUNFLAorCQkJICAgICAiQ29tcHJlc3NlZCBTTVMgbm90IHN1cHBvcnRlZCB5ZXRcbiIpOworCisJCXN3aXRjaCAoKGRjcyA+PiAyKSYweDAzKSB7CisJCWNhc2UgMDoKKwkJCWFscGhhID0gRENTXzdCSVRfREVGQVVMVDsKKwkJCWJyZWFrOworCQljYXNlIDE6CisJCQlhbHBoYSA9IERDU184QklUX0RBVEE7CisJCQlicmVhazsKKwkJY2FzZSAyOgorCQkJYWxwaGEgPSBEQ1NfVUNTMjsKKwkJCWJyZWFrOworCQl9CisJfSBlbHNlIGlmIChjZ2JpdHMgPT0gMHhjIHx8IGNnYml0cyA9PSAweGQpCisJCWFscGhhID0gRENTXzdCSVRfREVGQVVMVDsKKwllbHNlIGlmIChjZ2JpdHMgPT0gMHhlKQorCQlhbHBoYSA9IERDU19VQ1MyOworCWVsc2UgaWYgKGNnYml0cyA9PSAweGYpIHsKKwkJaWYgKGRjcyAmIDQpCisJCQlhbHBoYSA9IERDU184QklUX0RBVEE7CisJCWVsc2UKKwkJCWFscGhhID0gRENTXzdCSVRfREVGQVVMVDsKKwl9CisKKwlyZXR1cm4gYWxwaGE7Cit9CisKK3N0YXRpYyBpbnQgZ3NtMzQwX3J4X3Ntc19zdWJtaXQoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IGdzbV9zbXMgKmdzbXMpCit7CisJaWYgKGRiX3Ntc19zdG9yZShnc21zKSAhPSAwKSB7CisJCUxPR1AoRFNNUywgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBzdG9yZSBTTVMgaW4gRGF0YWJhc2VcbiIpOworCQlyZXR1cm4gR1NNNDExX1JQX0NBVVNFX01PX05FVF9PVVRfT0ZfT1JERVI7CisJfQorCS8qIGRpc3BhdGNoIGEgc2lnbmFsIHRvIHRlbGwgaGlnaGVyIGxldmVsIGFib3V0IGl0ICovCisJZGlzcGF0Y2hfc2lnbmFsKFNTX1NNUywgU19TTVNfU1VCTUlUVEVELCBnc21zKTsKKwkvKiB0cnkgZGVsaXZlcmluZyB0aGUgU01TIHJpZ2h0IG5vdyAqLworCS8vZ3NtNDExX3NlbmRfc21zX3N1YnNjcihnc21zLT5yZWNlaXZlciwgZ3Ntcyk7CisKKwlyZXR1cm4gMDsKK30KKworLyogZ2VuZXJhdGUgYSBUUERVIGFkZHJlc3MgZmllbGQgY29tcGxpYW50IHdpdGggMDMuNDAgc2VjLiA5LjEuMi41ICovCitzdGF0aWMgaW50IGdzbTM0MF9nZW5fb2EodV9pbnQ4X3QgKm9hLCB1bnNpZ25lZCBpbnQgb2FfbGVuLAorCQkJIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWludCBsZW5faW5fYnl0ZXM7CisKKwlvYVsxXSA9IDB4Yjk7IC8qIG5ldHdvcmtzLXNwZWNpZmljIG51bWJlciwgcHJpdmF0ZSBudW1iZXJpbmcgcGxhbiAqLworCisJbGVuX2luX2J5dGVzID0gZ3NtNDhfZW5jb2RlX2JjZF9udW1iZXIob2EsIG9hX2xlbiwgMSwgc3Vic2NyLT5leHRlbnNpb24pOworCisJLyogR1NNIDAzLjQwIHRlbGxzIHVzIHRoZSBsZW5ndGggaXMgaW4gJ3VzZWZ1bCBzZW1pLW9jdGV0cycgKi8KKwlvYVswXSA9IHN0cmxlbihzdWJzY3ItPmV4dGVuc2lvbikgJiAweGZmOworCisJcmV0dXJuIGxlbl9pbl9ieXRlczsKK30KKworLyogZ2VuZXJhdGUgYSBtc2diIGNvbnRhaW5pbmcgYSBUUERVIGRlcml2ZWQgZnJvbSBzdHJ1Y3QgZ3NtX3NtcywKKyAqIHJldHVybnMgdG90YWwgc2l6ZSBvZiBUUERVICovCitzdGF0aWMgaW50IGdzbTM0MF9nZW5fdHBkdShzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3NtX3NtcyAqc21zKQoreworCXVfaW50OF90ICpzbXNwOworCXVfaW50OF90IG9hWzEyXTsJLyogbWF4IGxlbiBwZXIgMDMuNDAgKi8KKwl1X2ludDhfdCBvYV9sZW4gPSAwOworCXVfaW50OF90IG9jdGV0X2xlbjsKKwl1bnNpZ25lZCBpbnQgb2xkX21zZ19sZW4gPSBtc2ctPmxlbjsKKworCS8qIGdlbmVyYXRlIGZpcnN0IG9jdGV0IHdpdGggbWFza2VkIGJpdHMgKi8KKwlzbXNwID0gbXNnYl9wdXQobXNnLCAxKTsKKwkvKiBUUC1NVEkgKG1lc3NhZ2UgdHlwZSBpbmRpY2F0b3IpICovCisJKnNtc3AgPSBHU00zNDBfU01TX0RFTElWRVJfU0MyTVM7CisJLyogVFAtTU1TIChtb3JlIG1lc3NhZ2VzIHRvIHNlbmQpICovCisJaWYgKDAgLyogRklYTUUgKi8pCisJCSpzbXNwIHw9IDB4MDQ7CisJLyogVFAtU1JJKGRlbGl2ZXIpL1NSUihzdWJtaXQpICovCisJaWYgKHNtcy0+c3RhdHVzX3JlcF9yZXEpCisJCSpzbXNwIHw9IDB4MjA7CisJLyogVFAtVURISSAoaW5kaWNhdGluZyBUUC1VRCBjb250YWlucyBhIGhlYWRlcikgKi8KKwlpZiAoc21zLT51ZF9oZHJfaW5kKQorCQkqc21zcCB8PSAweDQwOworI2lmIDAKKwkvKiBUUC1SUCAoaW5kaWNhdGluZyB0aGF0IGEgcmVwbHkgcGF0aCBleGlzdHMpICovCisJaWYgKHNtcy0+CisJCSpzbXNwIHw9IDB4ODA7CisjZW5kaWYKKwkKKwkvKiBnZW5lcmF0ZSBvcmlnaW5hdG9yIGFkZHJlc3MgKi8KKwlvYV9sZW4gPSBnc20zNDBfZ2VuX29hKG9hLCBzaXplb2Yob2EpLCBzbXMtPnNlbmRlcik7CisJc21zcCA9IG1zZ2JfcHV0KG1zZywgb2FfbGVuKTsKKwltZW1jcHkoc21zcCwgb2EsIG9hX2xlbik7CisKKwkvKiBnZW5lcmF0ZSBUUC1QSUQgKi8KKwlzbXNwID0gbXNnYl9wdXQobXNnLCAxKTsKKwkqc21zcCA9IHNtcy0+cHJvdG9jb2xfaWQ7CisKKwkvKiBnZW5lcmF0ZSBUUC1EQ1MgKi8KKwlzbXNwID0gbXNnYl9wdXQobXNnLCAxKTsKKwkqc21zcCA9IHNtcy0+ZGF0YV9jb2Rpbmdfc2NoZW1lOworCisJLyogZ2VuZXJhdGUgVFAtU0NUUyAqLworCXNtc3AgPSBtc2diX3B1dChtc2csIDcpOworCWdzbTM0MF9nZW5fc2N0cyhzbXNwLCB0aW1lKE5VTEwpKTsKKworCS8qIGdlbmVyYXRlIFRQLVVETCAqLworCXNtc3AgPSBtc2diX3B1dChtc2csIDEpOworCSpzbXNwID0gc21zLT51c2VyX2RhdGFfbGVuOworCisJLyogZ2VuZXJhdGUgVFAtVUQgKi8KKwlzd2l0Y2ggKGdzbTMzOF9nZXRfc21zX2FscGhhYmV0KHNtcy0+ZGF0YV9jb2Rpbmdfc2NoZW1lKSkgeworCWNhc2UgRENTXzdCSVRfREVGQVVMVDoKKwkJb2N0ZXRfbGVuID0gc21zLT51c2VyX2RhdGFfbGVuKjcvODsKKwkJaWYgKHNtcy0+dXNlcl9kYXRhX2xlbio3JTggIT0gMCkKKwkJCW9jdGV0X2xlbisrOworCQkvKiBXYXJuaW5nLCB1c2VyX2RhdGFfbGVuIGluZGljYXRlcyB0aGUgYW1vdW50IG9mIHNlcHRldHMKKwkJICogKGNoYXJhY3RlcnMpLCB3ZSBuZWVkIGFtb3VudCBvZiBvY3RldHMgb2NjdXBpZWQgKi8KKwkJc21zcCA9IG1zZ2JfcHV0KG1zZywgb2N0ZXRfbGVuKTsKKwkJbWVtY3B5KHNtc3AsIHNtcy0+dXNlcl9kYXRhLCBvY3RldF9sZW4pOworCQlicmVhazsKKwljYXNlIERDU19VQ1MyOgorCWNhc2UgRENTXzhCSVRfREFUQToKKwkJc21zcCA9IG1zZ2JfcHV0KG1zZywgc21zLT51c2VyX2RhdGFfbGVuKTsKKwkJbWVtY3B5KHNtc3AsIHNtcy0+dXNlcl9kYXRhLCBzbXMtPnVzZXJfZGF0YV9sZW4pOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERTTVMsIExPR0xfTk9USUNFLCAiVW5oYW5kbGVkIERhdGEgQ29kaW5nIFNjaGVtZTogMHglMDJYXG4iLAorCQkgICAgIHNtcy0+ZGF0YV9jb2Rpbmdfc2NoZW1lKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIG1zZy0+bGVuIC0gb2xkX21zZ19sZW47Cit9CisKKy8qIHByb2Nlc3MgYW4gaW5jb21pbmcgVFBEVSAoY2FsbGVkIGZyb20gUlAtREFUQSkgCisgKiByZXR1cm4gdmFsdWUgPiAwOiBSUCBDQVVTRSBmb3IgRVJST1I7IDwgMDogc2lsZW50IGVycm9yOyAwID0gc3VjY2VzcyAqLyAKK3N0YXRpYyBpbnQgZ3NtMzQwX3J4X3RwZHUoc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gbXNnLT5sY2hhbi0+dHMtPnRyeC0+YnRzOworCXVfaW50OF90ICpzbXNwID0gbXNnYl9zbXMobXNnKTsKKwlzdHJ1Y3QgZ3NtX3NtcyAqZ3NtczsKKwl1X2ludDhfdCBzbXNfbXRpLCBzbXNfbW1zLCBzbXNfdnBmLCBzbXNfYWxwaGFiZXQsIHNtc19ycDsKKwl1X2ludDhfdCAqc21zX3ZwOworCXVfaW50OF90IGRhX2xlbl9ieXRlczsKKwl1X2ludDhfdCBhZGRyZXNzX2x2WzEyXTsgLyogYWNjb3JkaW5nIHRvIDAzLjQwIC8gOS4xLjIuNSAqLworCWludCByYyA9IDA7CisKKwljb3VudGVyX2luYyhidHMtPm5ldHdvcmstPnN0YXRzLnNtcy5zdWJtaXR0ZWQpOworCisJZ3NtcyA9IHNtc19hbGxvYygpOworCWlmICghZ3NtcykKKwkJcmV0dXJuIEdTTTQxMV9SUF9DQVVTRV9NT19ORVRfT1VUX09GX09SREVSOworCisJLyogaW52ZXJ0IHRob3NlIGZpZWxkcyB3aGVyZSAwIG1lYW5zIGFjdGl2ZS9wcmVzZW50ICovCisJc21zX210aSA9ICpzbXNwICYgMHgwMzsKKwlzbXNfbW1zID0gISEoKnNtc3AgJiAweDA0KTsKKwlzbXNfdnBmID0gKCpzbXNwICYgMHgxOCkgPj4gMzsKKwlnc21zLT5zdGF0dXNfcmVwX3JlcSA9ICgqc21zcCAmIDB4MjApOworCWdzbXMtPnVkX2hkcl9pbmQgPSAoKnNtc3AgJiAweDQwKTsKKwlzbXNfcnAgID0gKCpzbXNwICYgMHg4MCk7CisKKwlzbXNwKys7CisJZ3Ntcy0+bXNnX3JlZiA9ICpzbXNwKys7CisKKwkvKiBsZW5ndGggaW4gYnl0ZXMgb2YgdGhlIGRlc3RpbmF0aW9uIGFkZHJlc3MgKi8KKwlkYV9sZW5fYnl0ZXMgPSAyICsgKnNtc3AvMiArICpzbXNwJTI7CisJaWYgKGRhX2xlbl9ieXRlcyA+IDEyKSB7CisJCUxPR1AoRFNNUywgTE9HTF9FUlJPUiwgIkRlc3RpbmF0aW9uIEFkZHJlc3MgPiAxMiBieXRlcyA/IT9cbiIpOworCQlyYyA9IEdTTTQxMV9SUF9DQVVTRV9TRU1BTlRfSU5DX01TRzsKKwkJZ290byBvdXQ7CisJfQorCW1lbXNldChhZGRyZXNzX2x2LCAwLCBzaXplb2YoYWRkcmVzc19sdikpOworCW1lbWNweShhZGRyZXNzX2x2LCBzbXNwLCBkYV9sZW5fYnl0ZXMpOworCS8qIG1hbmdsZSBmaXJzdCBieXRlIHRvIHJlZmxlY3QgbGVuZ3RoIGluIGJ5dGVzLCBub3QgZGlnaXRzICovCisJYWRkcmVzc19sdlswXSA9IGRhX2xlbl9ieXRlcyAtIDE7CisJLyogY29udmVydCB0byByZWFsIG51bWJlciAqLworCWdzbTQ4X2RlY29kZV9iY2RfbnVtYmVyKGdzbXMtPmRlc3RfYWRkciwgc2l6ZW9mKGdzbXMtPmRlc3RfYWRkciksIGFkZHJlc3NfbHYsIDEpOworCXNtc3AgKz0gZGFfbGVuX2J5dGVzOworCisJZ3Ntcy0+cHJvdG9jb2xfaWQgPSAqc21zcCsrOworCWdzbXMtPmRhdGFfY29kaW5nX3NjaGVtZSA9ICpzbXNwKys7CisKKwlzbXNfYWxwaGFiZXQgPSBnc20zMzhfZ2V0X3Ntc19hbHBoYWJldChnc21zLT5kYXRhX2NvZGluZ19zY2hlbWUpOworCisJc3dpdGNoIChzbXNfdnBmKSB7CisJY2FzZSBHU00zNDBfVFBfVlBGX1JFTEFUSVZFOgorCQlzbXNfdnAgPSBzbXNwKys7CisJCWJyZWFrOworCWNhc2UgR1NNMzQwX1RQX1ZQRl9BQlNPTFVURToKKwljYXNlIEdTTTM0MF9UUF9WUEZfRU5IQU5DRUQ6CisJCXNtc192cCA9IHNtc3A7CisJCS8qIHRoZSBhZGRpdGlvbmFsIGZ1bmN0aW9uYWxpdHkgaW5kaWNhdG9yLi4uICovCisJCWlmIChzbXNfdnBmID09IEdTTTM0MF9UUF9WUEZfRU5IQU5DRUQgJiYgKnNtc3AgJiAoMTw8NykpCisJCQlzbXNwKys7CisJCXNtc3AgKz0gNzsKKwkJYnJlYWs7CisJY2FzZSBHU00zNDBfVFBfVlBGX05PTkU6CisJCXNtc192cCA9IDA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRFNNUywgTE9HTF9OT1RJQ0UsIAorCQkgICAgICJTTVMgVmFsaWRpdHkgcGVyaW9kIG5vdCBpbXBsZW1lbnRlZDogMHglMDJ4XG4iLCBzbXNfdnBmKTsKKwkJcmV0dXJuIEdTTTQxMV9SUF9DQVVTRV9NT19ORVRfT1VUX09GX09SREVSOworCX0KKwlnc21zLT51c2VyX2RhdGFfbGVuID0gKnNtc3ArKzsKKwlpZiAoZ3Ntcy0+dXNlcl9kYXRhX2xlbikgeworCQltZW1jcHkoZ3Ntcy0+dXNlcl9kYXRhLCBzbXNwLCBnc21zLT51c2VyX2RhdGFfbGVuKTsKKworCQlzd2l0Y2ggKHNtc19hbHBoYWJldCkgeworCQljYXNlIERDU183QklUX0RFRkFVTFQ6CisJCQlnc21fN2JpdF9kZWNvZGUoZ3Ntcy0+dGV4dCwgc21zcCwgZ3Ntcy0+dXNlcl9kYXRhX2xlbik7CisJCQlicmVhazsKKwkJY2FzZSBEQ1NfOEJJVF9EQVRBOgorCQljYXNlIERDU19VQ1MyOgorCQljYXNlIERDU19OT05FOgorCQkJYnJlYWs7CisJCX0KKwl9CisKKwlnc21zLT5zZW5kZXIgPSBzdWJzY3JfZ2V0KG1zZy0+bGNoYW4tPnN1YnNjcik7CisKKwlMT0dQKERTTVMsIExPR0xfSU5GTywgIlJYIFNNUzogU2VuZGVyOiAlcywgTVRJOiAweCUwMngsIFZQRjogMHglMDJ4LCAiCisJICAgICAiTVI6IDB4JTAyeCBQSUQ6IDB4JTAyeCwgRENTOiAweCUwMngsIERBOiAlcywgIgorCSAgICAgIlVzZXJEYXRhTGVuZ3RoOiAweCUwMngsIFVzZXJEYXRhOiBcIiVzXCJcbiIsCisJICAgICBzdWJzY3JfbmFtZShnc21zLT5zZW5kZXIpLCBzbXNfbXRpLCBzbXNfdnBmLCBnc21zLT5tc2dfcmVmLAorCSAgICAgZ3Ntcy0+cHJvdG9jb2xfaWQsIGdzbXMtPmRhdGFfY29kaW5nX3NjaGVtZSwgZ3Ntcy0+ZGVzdF9hZGRyLAorCSAgICAgZ3Ntcy0+dXNlcl9kYXRhX2xlbiwKKwkJCXNtc19hbHBoYWJldCA9PSBEQ1NfN0JJVF9ERUZBVUxUID8gZ3Ntcy0+dGV4dCA6IAorCQkJCWhleGR1bXAoZ3Ntcy0+dXNlcl9kYXRhLCBnc21zLT51c2VyX2RhdGFfbGVuKSk7CisKKwlnc21zLT52YWxpZGl0eV9taW51dGVzID0gZ3NtMzQwX3ZhbGlkaXR5X3BlcmlvZChzbXNfdnBmLCBzbXNfdnApOworCisJZGlzcGF0Y2hfc2lnbmFsKFNTX1NNUywgMCwgZ3Ntcyk7CisKKwkvKiBkZXRlcm1pbmUgZ3Ntcy0+cmVjZWl2ZXIgYmFzZWQgb24gZGlhbGxlZCBudW1iZXIgKi8KKwlnc21zLT5yZWNlaXZlciA9IHN1YnNjcl9nZXRfYnlfZXh0ZW5zaW9uKGJ0cy0+bmV0d29yaywgZ3Ntcy0+ZGVzdF9hZGRyKTsKKwlpZiAoIWdzbXMtPnJlY2VpdmVyKSB7CisJCXJjID0gMTsgLyogY2F1c2UgMTogdW5rbm93biBzdWJzY3JpYmVyICovCisJCWNvdW50ZXJfaW5jKGJ0cy0+bmV0d29yay0+c3RhdHMuc21zLm5vX3JlY2VpdmVyKTsKKwkJZ290byBvdXQ7CisJfQorCisJc3dpdGNoIChzbXNfbXRpKSB7CisJY2FzZSBHU00zNDBfU01TX1NVQk1JVF9NUzJTQzoKKwkJLyogTVMgaXMgc3VibWl0dGluZyBhIFNNUyAqLworCQlyYyA9IGdzbTM0MF9yeF9zbXNfc3VibWl0KG1zZywgZ3Ntcyk7CisJCWJyZWFrOworCWNhc2UgR1NNMzQwX1NNU19DT01NQU5EX01TMlNDOgorCWNhc2UgR1NNMzQwX1NNU19ERUxJVkVSX1JFUF9NUzJTQzoKKwkJTE9HUChEU01TLCBMT0dMX05PVElDRSwgIlVuaW1wbGVtZW50ZWQgTVRJIDB4JTAyeFxuIiwgc21zX210aSk7CisJCXJjID0gR1NNNDExX1JQX0NBVVNFX0lFX05PVEVYSVNUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERTTVMsIExPR0xfTk9USUNFLCAiVW5kZWZpbmVkIE1USSAweCUwMnhcbiIsIHNtc19tdGkpOworCQlyYyA9IEdTTTQxMV9SUF9DQVVTRV9JRV9OT1RFWElTVDsKKwkJYnJlYWs7CisJfQorCisJaWYgKCFyYyAmJiAhZ3Ntcy0+cmVjZWl2ZXIpCisJCXJjID0gR1NNNDExX1JQX0NBVVNFX01PX05VTV9VTkFTU0lHTkVEOworCitvdXQ6CisJc21zX2ZyZWUoZ3Ntcyk7CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDExX3NlbmRfcnBfYWNrKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLCB1X2ludDhfdCBtc2dfcmVmKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200MTFfbXNnYl9hbGxvYygpOworCisJREVCVUdQKERTTVMsICJUWDogU01TIFJQIEFDS1xuIik7CisKKwlyZXR1cm4gZ3NtNDExX3JwX3NlbmRtc2cobXNnLCB0cmFucywgR1NNNDExX01UX1JQX0FDS19NVCwgbXNnX3JlZik7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDExX3NlbmRfcnBfZXJyb3Ioc3RydWN0IGdzbV90cmFucyAqdHJhbnMsCisJCQkJdV9pbnQ4X3QgbXNnX3JlZiwgdV9pbnQ4X3QgY2F1c2UpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQxMV9tc2diX2FsbG9jKCk7CisKKwltc2diX3R2X3B1dChtc2csIDEsIGNhdXNlKTsKKworCUxPR1AoRFNNUywgTE9HTF9OT1RJQ0UsICJUWDogU01TIFJQIEVSUk9SLCBjYXVzZSAlZCAoJXMpXG4iLCBjYXVzZSwKKwkJZ2V0X3ZhbHVlX3N0cmluZyhycF9jYXVzZV9zdHJzLCBjYXVzZSkpOworCisJcmV0dXJuIGdzbTQxMV9ycF9zZW5kbXNnKG1zZywgdHJhbnMsIEdTTTQxMV9NVF9SUF9FUlJPUl9NVCwgbXNnX3JlZik7Cit9CisKKy8qIFJlY2VpdmUgYSAwNC4xMSBUUERVIGluc2lkZSBSUC1EQVRBIC8gdXNlciBkYXRhICovCitzdGF0aWMgaW50IGdzbTQxMV9yeF9ycF91ZChzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywKKwkJCSAgc3RydWN0IGdzbTQxMV9ycF9oZHIgKnJwaCwKKwkJCSAgdV9pbnQ4X3Qgc3JjX2xlbiwgdV9pbnQ4X3QgKnNyYywKKwkJCSAgdV9pbnQ4X3QgZHN0X2xlbiwgdV9pbnQ4X3QgKmRzdCwKKwkJCSAgdV9pbnQ4X3QgdHBkdV9sZW4sIHVfaW50OF90ICp0cGR1KQoreworCWludCByYyA9IDA7CisKKwlpZiAoc3JjX2xlbiAmJiBzcmMpCisJCUxPR1AoRFNNUywgTE9HTF9FUlJPUiwgIlJQLURBVEEgKE1PKSB3aXRoIFNSQyA/IT9cbiIpOworCisJaWYgKCFkc3RfbGVuIHx8ICFkc3QgfHwgIXRwZHVfbGVuIHx8ICF0cGR1KSB7CisJCUxPR1AoRFNNUywgTE9HTF9FUlJPUiwKKwkJCSJSUC1EQVRBIChNTykgd2l0aG91dCBEU1Qgb3IgVFBEVSA/IT9cbiIpOworCQlnc200MTFfc2VuZF9ycF9lcnJvcih0cmFucywgcnBoLT5tc2dfcmVmLAorCQkJCSAgICAgR1NNNDExX1JQX0NBVVNFX0lOVl9NQU5EX0lORik7CisJCXJldHVybiAtRUlPOworCX0KKwltc2ctPnNtc2ggPSB0cGR1OworCisJREVCVUdQKERTTVMsICJEU1QoJXUsJXMpXG4iLCBkc3RfbGVuLCBoZXhkdW1wKGRzdCwgZHN0X2xlbikpOworCisJcmMgPSBnc20zNDBfcnhfdHBkdShtc2cpOworCWlmIChyYyA9PSAwKQorCQlyZXR1cm4gZ3NtNDExX3NlbmRfcnBfYWNrKHRyYW5zLCBycGgtPm1zZ19yZWYpOworCWVsc2UgaWYgKHJjID4gMCkKKwkJcmV0dXJuIGdzbTQxMV9zZW5kX3JwX2Vycm9yKHRyYW5zLCBycGgtPm1zZ19yZWYsIHJjKTsKKwllbHNlCisJCXJldHVybiByYzsKK30KKworLyogUmVjZWl2ZSBhIDA0LjExIFJQLURBVEEgbWVzc2FnZSBpbiBhY2NvcmRhbmNlIHdpdGggU2VjdGlvbiA3LjMuMS4yICovCitzdGF0aWMgaW50IGdzbTQxMV9yeF9ycF9kYXRhKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLAorCQkJICAgICBzdHJ1Y3QgZ3NtNDExX3JwX2hkciAqcnBoKQoreworCXVfaW50OF90IHNyY19sZW4sIGRzdF9sZW4sIHJwdWRfbGVuOworCXVfaW50OF90ICpzcmMgPSBOVUxMLCAqZHN0ID0gTlVMTCAsICpycF91ZCA9IE5VTEw7CisKKwkvKiBpbiB0aGUgTU8gY2FzZSwgdGhpcyBzaG91bGQgYWx3YXlzIGJlIHplcm8gbGVuZ3RoICovCisJc3JjX2xlbiA9IHJwaC0+ZGF0YVswXTsKKwlpZiAoc3JjX2xlbikKKwkJc3JjID0gJnJwaC0+ZGF0YVsxXTsKKworCWRzdF9sZW4gPSBycGgtPmRhdGFbMStzcmNfbGVuXTsKKwlpZiAoZHN0X2xlbikKKwkJZHN0ID0gJnJwaC0+ZGF0YVsxK3NyY19sZW4rMV07CisKKwlycHVkX2xlbiA9IHJwaC0+ZGF0YVsxK3NyY19sZW4rMStkc3RfbGVuXTsKKwlpZiAocnB1ZF9sZW4pCisJCXJwX3VkID0gJnJwaC0+ZGF0YVsxK3NyY19sZW4rMStkc3RfbGVuKzFdOworCisJREVCVUdQKERTTVMsICJSWF9SUC1EQVRBOiBzcmNfbGVuPSV1LCBkc3RfbGVuPSV1IHVkX2xlbj0ldVxuIiwKKwkJc3JjX2xlbiwgZHN0X2xlbiwgcnB1ZF9sZW4pOworCXJldHVybiBnc200MTFfcnhfcnBfdWQobXNnLCB0cmFucywgcnBoLCBzcmNfbGVuLCBzcmMsIGRzdF9sZW4sIGRzdCwKKwkJCQlycHVkX2xlbiwgcnBfdWQpOworfQorCisvKiBSZWNlaXZlIGEgMDQuMTEgUlAtQUNLIG1lc3NhZ2UgKHJlc3BvbnNlIHRvIFJQLURBVEEgZnJvbSB1cykgKi8KK3N0YXRpYyBpbnQgZ3NtNDExX3J4X3JwX2FjayhzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywKKwkJCSAgICBzdHJ1Y3QgZ3NtNDExX3JwX2hkciAqcnBoKQoreworCXN0cnVjdCBnc21fc21zICpzbXMgPSB0cmFucy0+c21zLnNtczsKKworCS8qIEFjbmtvd2xlZGdlbWVudCB0byBNVCBSUF9EQVRBLCBpLmUuIHRoZSBNUyBjb25maXJtcyBpdAorCSAqIHN1Y2Nlc3NmdWxseSByZWNlaXZlZCBhIFNNUy4gIFdlIGNhbiBub3cgc2FmZWx5IG1hcmsgaXQgYXMKKwkgKiB0cmFuc21pdHRlZCAqLworCisJaWYgKCF0cmFucy0+c21zLmlzX210KSB7CisJCUxPR1AoRFNNUywgTE9HTF9FUlJPUiwgIlJYIFJQLUFDSyBvbiBhIE1PIHRyYW5zZmVyID9cbiIpOworCQlyZXR1cm4gZ3NtNDExX3NlbmRfcnBfZXJyb3IodHJhbnMsIHJwaC0+bXNnX3JlZiwKKwkJCQkJICAgIEdTTTQxMV9SUF9DQVVTRV9NU0dfSU5DT01QX1NUQVRFKTsKKwl9CisKKwlpZiAoIXNtcykgeworCQlMT0dQKERTTVMsIExPR0xfRVJST1IsICJSWCBSUC1BQ0sgYnV0IG5vIHNtcyBpbiB0cmFuc2FjdGlvbj8hP1xuIik7CisJCXJldHVybiBnc200MTFfc2VuZF9ycF9lcnJvcih0cmFucywgcnBoLT5tc2dfcmVmLAorCQkJCQkgICAgR1NNNDExX1JQX0NBVVNFX1BST1RPQ09MX0VSUik7CisJfQorCisJLyogbWFyayB0aGlzIFNNUyBhcyBzZW50IGluIGRhdGFiYXNlICovCisJZGJfc21zX21hcmtfc2VudChzbXMpOworCisJZGlzcGF0Y2hfc2lnbmFsKFNTX1NNUywgU19TTVNfREVMSVZFUkVELCBzbXMpOworCisJc21zX2ZyZWUoc21zKTsKKwl0cmFucy0+c21zLnNtcyA9IE5VTEw7CisKKwkvKiBjaGVjayBmb3IgbW9yZSBtZXNzYWdlcyBmb3IgdGhpcyBzdWJzY3JpYmVyICovCisJc21zID0gZGJfc21zX2dldF91bnNlbnRfZm9yX3N1YnNjcihtc2ctPmxjaGFuLT5zdWJzY3IpOworCWlmIChzbXMpCisJCWdzbTQxMV9zZW5kX3Ntc19sY2hhbihtc2ctPmxjaGFuLCBzbXMpOworCisJLyogZnJlZSB0aGUgdHJhbnNhY3Rpb24gaGVyZSAqLworCXRyYW5zX2ZyZWUodHJhbnMpOworCisJLyogcmVsZWFzZSBjaGFubmVsIGlmIGRvbmUgKi8KKwlpZiAoIXNtcykKKwkJcnNsX3JlbGVhc2VfcmVxdWVzdChtc2ctPmxjaGFuLCB0cmFucy0+c21zLmxpbmtfaWQpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgZ3NtNDExX3J4X3JwX2Vycm9yKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zLAorCQkJICAgICAgc3RydWN0IGdzbTQxMV9ycF9oZHIgKnJwaCkKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IHRyYW5zLT5sY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrOworCXN0cnVjdCBnc21fc21zICpzbXMgPSB0cmFucy0+c21zLnNtczsKKwl1X2ludDhfdCBjYXVzZV9sZW4gPSBycGgtPmRhdGFbMF07CisJdV9pbnQ4X3QgY2F1c2UgPSBycGgtPmRhdGFbMV07CisKKwkvKiBFcnJvciBpbiByZXNwb25zZSB0byBNVCBSUF9EQVRBLCBpLmUuIHRoZSBNUyBkaWQgbm90CisJICogc3VjY2Vzc2Z1bGx5IHJlY2VpdmUgdGhlIFNNUy4gIFdlIG5lZWQgdG8gaW52ZXN0aWdhdGUKKwkgKiB0aGUgY2F1c2UgYW5kIHRha2UgYWN0aW9uIGRlcGVuZGluZyBvbiBpdCAqLworCisJTE9HUChEU01TLCBMT0dMX05PVElDRSwgIiVzOiBSWCBTTVMgUlAtRVJST1IsIGNhdXNlICVkOiVkICglcylcbiIsCisJICAgICBzdWJzY3JfbmFtZShtc2ctPmxjaGFuLT5zdWJzY3IpLCBjYXVzZV9sZW4sIGNhdXNlLAorCSAgICAgZ2V0X3ZhbHVlX3N0cmluZyhycF9jYXVzZV9zdHJzLCBjYXVzZSkpOworCisJaWYgKCF0cmFucy0+c21zLmlzX210KSB7CisJCUxPR1AoRFNNUywgTE9HTF9FUlJPUiwgIlJYIFJQLUVSUiBvbiBhIE1PIHRyYW5zZmVyID9cbiIpOworI2lmIDAKKwkJcmV0dXJuIGdzbTQxMV9zZW5kX3JwX2Vycm9yKHRyYW5zLCBycGgtPm1zZ19yZWYsCisJCQkJCSAgICBHU000MTFfUlBfQ0FVU0VfTVNHX0lOQ09NUF9TVEFURSk7CisjZW5kaWYKKwl9CisKKwlpZiAoIXNtcykgeworCQlMT0dQKERTTVMsIExPR0xfRVJST1IsCisJCQkiUlggUlAtRVJSLCBidXQgbm8gc21zIGluIHRyYW5zYWN0aW9uPyE/XG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisjaWYgMAorCQlyZXR1cm4gZ3NtNDExX3NlbmRfcnBfZXJyb3IodHJhbnMsIHJwaC0+bXNnX3JlZiwKKwkJCQkJICAgIEdTTTQxMV9SUF9DQVVTRV9QUk9UT0NPTF9FUlIpOworI2VuZGlmCisJfQorCisJaWYgKGNhdXNlID09IEdTTTQxMV9SUF9DQVVTRV9NVF9NRU1fRVhDRUVERUQpIHsKKwkJLyogTVMgaGFzIG5vdCBlbm91Z2ggbWVtb3J5IHRvIHN0b3JlIHRoZSBtZXNzYWdlLiAgV2UgbmVlZAorCQkgKiB0byBzdG9yZSB0aGlzIGluIG91ciBkYXRhYmFzZSBhbmQgd2F0aSBmb3IgYSBTTU1BIG1lc3NhZ2UgKi8KKwkJLyogRklYTUUgKi8KKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX1NNUywgU19TTVNfTUVNX0VYQ0VFREVELCB0cmFucy0+c3Vic2NyKTsKKwkJY291bnRlcl9pbmMobmV0LT5zdGF0cy5zbXMucnBfZXJyX21lbSk7CisJfSBlbHNlCisJCWNvdW50ZXJfaW5jKG5ldC0+c3RhdHMuc21zLnJwX2Vycl9vdGhlcik7CisKKwlzbXNfZnJlZShzbXMpOworCXRyYW5zLT5zbXMuc21zID0gTlVMTDsKKworCS8vdHJhbnNfZnJlZSh0cmFucyk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBnc200MTFfcnhfcnBfc21tYShzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywKKwkJCSAgICAgc3RydWN0IGdzbTQxMV9ycF9oZHIgKnJwaCkKK3sKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zOworCWludCByYzsKKworCXJjID0gZ3NtNDExX3NlbmRfcnBfYWNrKHRyYW5zLCBycGgtPm1zZ19yZWYpOworCXRyYW5zLT5zbXMucnBfc3RhdGUgPSBHU000MTFfUlBTX0lETEU7CisKKwkvKiBNUyB0ZWxscyB1cyB0aGF0IGl0IGhhcyBtZW1vcnkgZm9yIG1vcmUgU01TLCB3ZSBuZWVkCisJICogdG8gY2hlY2sgaWYgd2UgaGF2ZSBhbnkgcGVuZGluZyBtZXNzYWdlcyBmb3IgaXQgYW5kIHRoZW4KKwkgKiB0cmFuc2ZlciB0aG9zZSAqLworCWRpc3BhdGNoX3NpZ25hbChTU19TTVMsIFNfU01TX1NNTUEsIHRyYW5zLT5zdWJzY3IpOworCisJLyogY2hlY2sgZm9yIG1vcmUgbWVzc2FnZXMgZm9yIHRoaXMgc3Vic2NyaWJlciAqLworCXNtcyA9IGRiX3Ntc19nZXRfdW5zZW50X2Zvcl9zdWJzY3IobXNnLT5sY2hhbi0+c3Vic2NyKTsKKwlpZiAoc21zKQorCQlnc200MTFfc2VuZF9zbXNfbGNoYW4obXNnLT5sY2hhbiwgc21zKTsKKwllbHNlCisJCXJzbF9yZWxlYXNlX3JlcXVlc3QobXNnLT5sY2hhbiwgdHJhbnMtPnNtcy5saW5rX2lkKTsKKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBnc200MTFfcnhfY3BfZGF0YShzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgZ3NtNDhfaGRyICpnaCwKKwkJCSAgICAgc3RydWN0IGdzbV90cmFucyAqdHJhbnMpCit7CisJc3RydWN0IGdzbTQxMV9ycF9oZHIgKnJwX2RhdGEgPSAoc3RydWN0IGdzbTQxMV9ycF9oZHIqKSZnaC0+ZGF0YTsKKwl1X2ludDhfdCBtc2dfdHlwZSA9ICBycF9kYXRhLT5tc2dfdHlwZSAmIDB4MDc7CisJaW50IHJjID0gMDsKKworCXN3aXRjaCAobXNnX3R5cGUpIHsKKwljYXNlIEdTTTQxMV9NVF9SUF9EQVRBX01POgorCQlERUJVR1AoRFNNUywgIlJYIFNNUyBSUC1EQVRBIChNTylcbiIpOworCQkvKiBzdGFydCBUUjJOIGFuZCBlbnRlciAnd2FpdCB0byBzZW5kIFJQLUFDSyBzdGF0ZScgKi8KKwkJdHJhbnMtPnNtcy5ycF9zdGF0ZSA9IEdTTTQxMV9SUFNfV0FJVF9UT19UWF9SUF9BQ0s7CisJCXJjID0gZ3NtNDExX3J4X3JwX2RhdGEobXNnLCB0cmFucywgcnBfZGF0YSk7CisJCWJyZWFrOworCWNhc2UgR1NNNDExX01UX1JQX0FDS19NTzoKKwkJREVCVUdQKERTTVMsIlJYIFNNUyBSUC1BQ0sgKE1PKVxuIik7CisJCXJjID0gZ3NtNDExX3J4X3JwX2Fjayhtc2csIHRyYW5zLCBycF9kYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBHU000MTFfTVRfUlBfU01NQV9NTzoKKwkJREVCVUdQKERTTVMsICJSWCBTTVMgUlAtU01NQVxuIik7CisJCS8qIHN0YXJ0IFRSMk4gYW5kIGVudGVyICd3YWl0IHRvIHNlbmQgUlAtQUNLIHN0YXRlJyAqLworCQl0cmFucy0+c21zLnJwX3N0YXRlID0gR1NNNDExX1JQU19XQUlUX1RPX1RYX1JQX0FDSzsKKwkJcmMgPSBnc200MTFfcnhfcnBfc21tYShtc2csIHRyYW5zLCBycF9kYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBHU000MTFfTVRfUlBfRVJST1JfTU86CisJCXJjID0gZ3NtNDExX3J4X3JwX2Vycm9yKG1zZywgdHJhbnMsIHJwX2RhdGEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERTTVMsIExPR0xfTk9USUNFLCAiSW52YWxpZCBSUCB0eXBlIDB4JTAyeFxuIiwgbXNnX3R5cGUpOworCQlyYyA9IGdzbTQxMV9zZW5kX3JwX2Vycm9yKHRyYW5zLCBycF9kYXRhLT5tc2dfcmVmLAorCQkJCQkgIEdTTTQxMV9SUF9DQVVTRV9NU0dUWVBFX05PVEVYSVNUKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIHJjOworfQorCisvKiBzZW5kIENQLUFDSyB0byBnaXZlbiB0cmFuc2FjdGlvbiAqLworc3RhdGljIGludCBnc200MTFfdHhfY3BfYWNrKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKQoreworCXN0cnVjdCBtc2diICptc2cgPSBnc200MTFfbXNnYl9hbGxvYygpOworCWludCByYzsKKworCXJjID0gZ3NtNDExX2NwX3NlbmRtc2cobXNnLCB0cmFucywgR1NNNDExX01UX0NQX0FDSyk7CisKKwlpZiAodHJhbnMtPnNtcy5pc19tdCkgeworCQkvKiBJZiB0aGlzIGlzIGEgTVQgU01TIERFTElWRVIsIHdlIGNhbiBjbGVhciB0cmFuc2FjdGlvbiBoZXJlICovCisJCXRyYW5zLT5zbXMuY3Bfc3RhdGUgPSBHU000MTFfQ1BTX0lETEU7CisJCS8vdHJhbnNfZnJlZSh0cmFucyk7CisJfQorCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IGdzbTQxMV90eF9jcF9lcnJvcihzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucywgdV9pbnQ4X3QgY2F1c2UpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQxMV9tc2diX2FsbG9jKCk7CisJdV9pbnQ4X3QgKmNhdXNlcDsKKworCUxPR1AoRFNNUywgTE9HTF9OT1RJQ0UsICJUWCBDUC1FUlJPUiwgY2F1c2UgJWQgKCVzKVxuIiwgY2F1c2UsCisJCWdldF92YWx1ZV9zdHJpbmcoY3BfY2F1c2Vfc3RycywgY2F1c2UpKTsKKworCWNhdXNlcCA9IG1zZ2JfcHV0KG1zZywgMSk7CisJKmNhdXNlcCA9IGNhdXNlOworCisJcmV0dXJuIGdzbTQxMV9jcF9zZW5kbXNnKG1zZywgdHJhbnMsIEdTTTQxMV9NVF9DUF9FUlJPUik7Cit9CisKKy8qIEVudHJ5IHBvaW50IGZvciBpbmNvbWluZyBHU000OF9QRElTQ19TTVMgZnJvbSBhYmlzX3JzbC5jICovCitpbnQgZ3NtMDQxMV9yY3Zfc21zKHN0cnVjdCBtc2diICptc2csIHVfaW50OF90IGxpbmtfaWQpCit7CisJc3RydWN0IGdzbTQ4X2hkciAqZ2ggPSBtc2diX2wzKG1zZyk7CisJdV9pbnQ4X3QgbXNnX3R5cGUgPSBnaC0+bXNnX3R5cGU7CisJdV9pbnQ4X3QgdHJhbnNhY3Rpb25faWQgPSAoKGdoLT5wcm90b19kaXNjciA+PiA0KSBeIDB4OCk7IC8qIGZsaXAgKi8KKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IG1zZy0+bGNoYW47CisJc3RydWN0IGdzbV90cmFucyAqdHJhbnM7CisJaW50IHJjID0gMDsKKworCWlmICghbGNoYW4tPnN1YnNjcikKKwkJcmV0dXJuIC1FSU87CisJCS8qIEZJWE1FOiBzZW5kIHNvbWUgZXJyb3IgbWVzc2FnZSAqLworCisJREVCVUdQKERTTVMsICJ0cmFuc19pZD0leCAiLCB0cmFuc2FjdGlvbl9pZCk7CisJdHJhbnMgPSB0cmFuc19maW5kX2J5X2lkKGxjaGFuLT5zdWJzY3IsIEdTTTQ4X1BESVNDX1NNUywKKwkJCQkgdHJhbnNhY3Rpb25faWQpOworCWlmICghdHJhbnMpIHsKKwkJREVCVUdQQyhEU01TLCAiKG5ldykgIik7CisJCXRyYW5zID0gdHJhbnNfYWxsb2MobGNoYW4tPnN1YnNjciwgR1NNNDhfUERJU0NfU01TLAorCQkJCSAgICB0cmFuc2FjdGlvbl9pZCwgbmV3X2NhbGxyZWYrKyk7CisJCWlmICghdHJhbnMpIHsKKwkJCURFQlVHUEMoRFNNUywgIk5vIG1lbW9yeSBmb3IgdHJhbnNcbiIpOworCQkJLyogRklYTUU6IHNlbmQgc29tZSBlcnJvciBtZXNzYWdlICovCisJCQlyZXR1cm4gLUVOT01FTTsKKwkJfQorCQl0cmFucy0+c21zLmNwX3N0YXRlID0gR1NNNDExX0NQU19JRExFOworCQl0cmFucy0+c21zLnJwX3N0YXRlID0gR1NNNDExX1JQU19JRExFOworCQl0cmFucy0+c21zLmlzX210ID0gMDsKKwkJdHJhbnMtPnNtcy5saW5rX2lkID0gbGlua19pZDsKKworCQl0cmFucy0+bGNoYW4gPSBsY2hhbjsKKwkJdXNlX2xjaGFuKGxjaGFuKTsKKwl9CisKKwlzd2l0Y2gobXNnX3R5cGUpIHsKKwljYXNlIEdTTTQxMV9NVF9DUF9EQVRBOgorCQlERUJVR1BDKERTTVMsICJSWCBTTVMgQ1AtREFUQVxuIik7CisKKwkJLyogNS40OiBGb3IgTU8sIGlmIGEgQ1AtREFUQSBpcyByZWNlaXZlZCBmb3IgYSBuZXcKKwkJICogdHJhbnNhY3Rpb24sIGVxdWFscyByZWNlcHRpb24gb2YgYW4gaW1wbGljaXQKKwkJICogbGFzdCBDUC1BQ0sgZm9yIHByZXZpb3VzIHRyYW5zYWN0aW9uICovCisJCWlmICh0cmFucy0+c21zLmNwX3N0YXRlID09IEdTTTQxMV9DUFNfSURMRSkgeworCQkJaW50IGk7CisJCQlzdHJ1Y3QgZ3NtX3RyYW5zICpwdHJhbnM7CisKKwkJCS8qIFNjYW4gdGhyb3VnaCBhbGwgcmVtb3RlIGluaXRpYXRlZCB0cmFuc2FjdGlvbnMgKi8KKwkJCWZvciAoaT04OyBpPDE1OyBpKyspIHsKKwkJCQlpZiAoaSA9PSB0cmFuc2FjdGlvbl9pZCkKKwkJCQkJY29udGludWU7CisKKwkJCQlwdHJhbnMgPSB0cmFuc19maW5kX2J5X2lkKGxjaGFuLT5zdWJzY3IsCisJCQkJICAgICAgICAgICAgICAgICAgICAgICAgICBHU000OF9QRElTQ19TTVMsIGkpOworCQkJCWlmICghcHRyYW5zKQorCQkJCQljb250aW51ZTsKKworCQkJCURFQlVHUChEU01TLCAiSW1wbGljaXQgQ1AtQUNLIGZvciB0cmFuc19pZD0leFxuIiwgaSk7CisKKwkJCQkvKiBGaW5pc2ggaXQgZm9yIGdvb2QgKi8KKwkJCQlic2NfZGVsX3RpbWVyKCZwdHJhbnMtPnNtcy5jcF90aW1lcik7CisJCQkJcHRyYW5zLT5zbXMuY3Bfc3RhdGUgPSBHU000MTFfQ1BTX0lETEU7CisJCQkJdHJhbnNfZnJlZShwdHJhbnMpOworCQkJfQorCQl9CisKKwkJLyogNS4yLjMuMS4zOiBNTyBzdGF0ZSBleGlzdHMgd2hlbiBTTUMgaGFzIHJlY2VpdmVkCisJCSAqIENQLURBVEEsIGluY2x1ZGluZyBzZW5kaW5nIG9mIHRoZSBhc3NvYy4gQ1AtQUNLICovCisJCS8qIDUuMi4zLjIuNDogTVQgc3RhdGUgZXhpc3RzIHdoZW4gU01DIGhhcyByZWNlaXZlZAorCQkgKiBDUC1EQVRBLCBpbmNsdWRpbmcgc2VuZGluZyBvZiB0aGUgYXNzb2MuIENQLUFDSyAqLworCQl0cmFucy0+c21zLmNwX3N0YXRlID0gR1NNNDExX0NQU19NTV9FU1RBQkxJU0hFRDsKKworCQkvKiBTTUMgaW5zdGFuY2UgYWNrbm93bGVkZ2VzIHRoZSBDUC1EQVRBIGZyYW1lICovCisJCWdzbTQxMV90eF9jcF9hY2sodHJhbnMpOworCQkKKwkJcmMgPSBnc200MTFfcnhfY3BfZGF0YShtc2csIGdoLCB0cmFucyk7CisjaWYgMAorCQkvKiBTZW5kIENQLUFDSyBvciBDUC1FUk9SUiBpbiByZXNwb25zZSAqLworCQlpZiAocmMgPCAwKSB7CisJCQlyYyA9IGdzbTQxMV90eF9jcF9lcnJvcih0cmFucywgR1NNNDExX0NQX0NBVVNFX05FVF9GQUlMKTsKKwkJfSBlbHNlCisJCQlyYyA9IGdzbTQxMV90eF9jcF9hY2sodHJhbnMpOworI2VuZGlmCisJCWJyZWFrOworCWNhc2UgR1NNNDExX01UX0NQX0FDSzoKKwkJLyogcHJldmlvdXMgQ1AtREFUQSBpbiB0aGlzIHRyYW5zYWN0aW9uIHdhcyBjb25maXJtZWQgKi8KKwkJREVCVUdQQyhEU01TLCAiUlggU01TIENQLUFDS1xuIik7CisJCS8qIDUuMi4zLjEuMzogTU8gc3RhdGUgZXhpc3RzIHdoZW4gU01DIGhhcyByZWNlaXZlZCBDUC1BQ0sgKi8KKwkJLyogNS4yLjMuMi40OiBNVCBzdGF0ZSBleGlzdHMgd2hlbiBTTUMgaGFzIHJlY2VpdmVkIENQLUFDSyAqLworCQl0cmFucy0+c21zLmNwX3N0YXRlID0gR1NNNDExX0NQU19NTV9FU1RBQkxJU0hFRDsKKwkJLyogU3RvcCBUQzEqIGFmdGVyIENQLUFDSyBoYXMgYmVlbiByZWNlaXZlZCAqLworCQlic2NfZGVsX3RpbWVyKCZ0cmFucy0+c21zLmNwX3RpbWVyKTsKKworCQlpZiAoIXRyYW5zLT5zbXMuaXNfbXQpIHsKKwkJCS8qIEZJWE1FOiB3ZSBoYXZlIHNvbnQgb25lIENQLURBVEEsIHdoaWNoIHdhcyBub3cKKwkJCSAqIGFja25vd2xlZGdlZC4gIENoZWNrIGlmIHdlIHdhbnQgdG8gdHJhbnNmZXIgbW9yZSwKKwkJCSAqIGkuZS4gbXVsdGktcGFydCBtZXNzYWdlICovCisJCQl0cmFucy0+c21zLmNwX3N0YXRlID0gR1NNNDExX0NQU19JRExFOworCQkJdHJhbnNfZnJlZSh0cmFucyk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBHU000MTFfTVRfQ1BfRVJST1I6CisJCURFQlVHUEMoRFNNUywgIlJYIFNNUyBDUC1FUlJPUiwgY2F1c2UgJWQgKCVzKVxuIiwgZ2gtPmRhdGFbMF0sCisJCQlnZXRfdmFsdWVfc3RyaW5nKGNwX2NhdXNlX3N0cnMsIGdoLT5kYXRhWzBdKSk7CisJCWJzY19kZWxfdGltZXIoJnRyYW5zLT5zbXMuY3BfdGltZXIpOworCQl0cmFucy0+c21zLmNwX3N0YXRlID0gR1NNNDExX0NQU19JRExFOworCQl0cmFuc19mcmVlKHRyYW5zKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdQQyhEU01TLCAiUlggVW5pbXBsZW1lbnRlZCBDUCBtc2dfdHlwZTogMHglMDJ4XG4iLCBtc2dfdHlwZSk7CisJCXJjID0gZ3NtNDExX3R4X2NwX2Vycm9yKHRyYW5zLCBHU000MTFfQ1BfQ0FVU0VfTVNHVFlQRV9OT1RFWElTVCk7CisJCXRyYW5zLT5zbXMuY3Bfc3RhdGUgPSBHU000MTFfQ1BTX0lETEU7CisJCXRyYW5zX2ZyZWUodHJhbnMpOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKyNpZiAwCisvKiBUZXN0IFRQRFUgLSBBTEwgWU9VUiAqLworc3RhdGljIHVfaW50OF90IHRwZHVfdGVzdFtdID0geworCTB4MDQsIDB4MDQsIDB4ODEsIDB4MzIsIDB4MjQsIDB4MDAsIDB4MDAsIDB4ODAsIDB4MjEsIDB4MDMsIDB4NDEsIDB4MjQsCisJMHgzMiwgMHg0MCwgMHgxRiwgMHg0MSwgMHgyNiwgMHgxMywgMHg5NCwgMHg3RCwgMHg1NiwgMHhBNSwgMHgyMCwgMHgyOCwKKwkweEYyLCAweEU5LCAweDJDLCAweDgyLCAweDgyLCAweEQyLCAweDIyLCAweDQ4LCAweDU4LCAweDY0LCAweDNFLCAweDlELAorCTB4NDcsIDB4MTAsIDB4RjUsIDB4MDksIDB4QUEsIDB4NEUsIDB4MDEKK307CisjZW5kaWYKKworLyogVGFrZSBhIFNNUyBpbiBnc21fc21zIHN0cnVjdHVyZSBhbmQgc2VuZCBpdCB0aHJvdWdoIGFuIGFscmVhZHkKKyAqIGV4aXN0aW5nIGxjaGFuLiBXZSBhbHNvIGFzc3VtZSB0aGF0IHRoZSBjYWxsZXIgZW5zdXJlZCB0aGlzIGxjaGFuIGFscmVhZHkKKyAqIGhhcyBhIFNBUEkzIFJMTCBjb25uZWN0aW9uISAqLworaW50IGdzbTQxMV9zZW5kX3Ntc19sY2hhbihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgc3RydWN0IGdzbV9zbXMgKnNtcykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDExX21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuczsKKwl1X2ludDhfdCAqZGF0YSwgKnJwX3VkX2xlbjsKKwl1X2ludDhfdCBtc2dfcmVmID0gNDI7CisJaW50IHRyYW5zYWN0aW9uX2lkOworCWludCByYzsKKworCXRyYW5zYWN0aW9uX2lkID0gdHJhbnNfYXNzaWduX3RyYW5zX2lkKGxjaGFuLT5zdWJzY3IsIEdTTTQ4X1BESVNDX1NNUywgMCk7CisJaWYgKHRyYW5zYWN0aW9uX2lkID09IC0xKSB7CisJCUxPR1AoRFNNUywgTE9HTF9FUlJPUiwgIk5vIGF2YWlsYWJsZSB0cmFuc2FjdGlvbiBpZHNcbiIpOworCQlyZXR1cm4gLUVCVVNZOworCX0KKworCW1zZy0+bGNoYW4gPSBsY2hhbjsKKworCURFQlVHUChEU01TLCAic2VuZF9zbXNfbGNoYW4oKVxuIik7CisKKwkvKiBGSVhNRTogYWxsb2NhdGUgdHJhbnNhY3Rpb24gd2l0aCBtZXNzYWdlIHJlZmVyZW5jZSAqLworCXRyYW5zID0gdHJhbnNfYWxsb2MobGNoYW4tPnN1YnNjciwgR1NNNDhfUERJU0NfU01TLAorCQkJICAgIHRyYW5zYWN0aW9uX2lkLCBuZXdfY2FsbHJlZisrKTsKKwlpZiAoIXRyYW5zKSB7CisJCUxPR1AoRFNNUywgTE9HTF9FUlJPUiwgIk5vIG1lbW9yeSBmb3IgdHJhbnNcbiIpOworCQkvKiBGSVhNRTogc2VuZCBzb21lIGVycm9yIG1lc3NhZ2UgKi8KKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCXRyYW5zLT5zbXMuY3Bfc3RhdGUgPSBHU000MTFfQ1BTX0lETEU7CisJdHJhbnMtPnNtcy5ycF9zdGF0ZSA9IEdTTTQxMV9SUFNfSURMRTsKKwl0cmFucy0+c21zLmlzX210ID0gMTsKKwl0cmFucy0+c21zLnNtcyA9IHNtczsKKwl0cmFucy0+c21zLmxpbmtfaWQgPSBVTV9TQVBJX1NNUzsJLyogRklYTUU6IG1haW4gb3IgU0FDQ0ggPyAqLworCisJdHJhbnMtPmxjaGFuID0gbGNoYW47CisJdXNlX2xjaGFuKGxjaGFuKTsKKworCS8qIEhhcmRjb2RlIFNNU0MgT3JpZ2luYXRpbmcgQWRkcmVzcyBmb3Igbm93ICovCisJZGF0YSA9ICh1X2ludDhfdCAqKW1zZ2JfcHV0KG1zZywgOCk7CisJZGF0YVswXSA9IDB4MDc7CS8qIG9yaWdpbmF0b3IgbGVuZ3RoID09IDcgKi8KKwlkYXRhWzFdID0gMHg5MTsgLyogdHlwZSBvZiBudW1iZXI6IGludGVybmF0aW9uYWwsIElTRE4gKi8KKwlkYXRhWzJdID0gMHg0NDsgLyogNDQ3Nzg1MDE2MDA1ICovCisJZGF0YVszXSA9IDB4Nzc7CisJZGF0YVs0XSA9IDB4NTg7CisJZGF0YVs1XSA9IDB4MTA7CisJZGF0YVs2XSA9IDB4MDY7CisJZGF0YVs3XSA9IDB4NTA7CisKKwkvKiBIYXJkY29kZWQgRGVzdGluYXRpb24gQWRkcmVzcyAqLworCWRhdGEgPSAodV9pbnQ4X3QgKiltc2diX3B1dChtc2csIDEpOworCWRhdGFbMF0gPSAwOwkvKiBkZXN0aW5hdGlvbiBsZW5ndGggPT0gMCAqLworCisJLyogb2J0YWluIGEgcG9pbnRlciBmb3IgdGhlIHJwX3VkX2xlbiwgc28gd2UgY2FuIGZpbGwgaXQgbGF0ZXIgKi8KKwlycF91ZF9sZW4gPSAodV9pbnQ4X3QgKiltc2diX3B1dChtc2csIDEpOworCisjaWYgMQorCS8qIGdlbmVyYXRlIHRoZSAwMy40MCBUUERVICovCisJcmMgPSBnc20zNDBfZ2VuX3RwZHUobXNnLCBzbXMpOworCWlmIChyYyA8IDApIHsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCXJldHVybiByYzsKKwl9CisKKwkqcnBfdWRfbGVuID0gcmM7CisjZWxzZQorCWRhdGEgPSBtc2diX3B1dChtc2csIHNpemVvZih0cGR1X3Rlc3QpKTsKKwltZW1jcHkoZGF0YSwgdHBkdV90ZXN0LCBzaXplb2YodHBkdV90ZXN0KSk7CisJKnJwX3VkX2xlbiA9IHNpemVvZih0cGR1X3Rlc3QpOworI2VuZGlmCisKKwlERUJVR1AoRFNNUywgIlRYOiBTTVMgREVMSVZFUlxuIik7CisKKwljb3VudGVyX2luYyhsY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrLT5zdGF0cy5zbXMuZGVsaXZlcmVkKTsKKworCXJldHVybiBnc200MTFfcnBfc2VuZG1zZyhtc2csIHRyYW5zLCBHU000MTFfTVRfUlBfREFUQV9NVCwgbXNnX3JlZik7CisJLyogRklYTUU6IGVudGVyICd3YWl0IGZvciBSUC1BQ0snIHN0YXRlLCBzdGFydCBUUjFOICovCit9CisKKy8qIFJMTCBTQVBJMyBlc3RhYmxpc2ggY2FsbGJhY2suIE5vdyB3ZSBoYXZlIGEgUkxMIGNvbm5lY3Rpb24gYW5kCisgKiBjYW4gZGVsaXZlciB0aGUgYWN0dWFsIG1lc3NhZ2UgKi8KK3N0YXRpYyB2b2lkIHJsbF9pbmRfY2Ioc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sIHVfaW50OF90IGxpbmtfaWQsCisJCQl2b2lkICpfc21zLCBlbnVtIGJzY19ybGxyX2luZCB0eXBlKQoreworCXN0cnVjdCBnc21fc21zICpzbXMgPSBfc21zOworCisJREVCVUdQKERTTVMsICJybGxfaW5kX2NiKGxjaGFuPSVwLCBsaW5rX2lkPSV1LCBzbXM9JXAsIHR5cGU9JXVcbiIsCisJCWxjaGFuLCBsaW5rX2lkLCBzbXMsIHR5cGUpOworCisJc3dpdGNoICh0eXBlKSB7CisJY2FzZSBCU0NfUkxMUl9JTkRfRVNUX0NPTkY6CisJCWdzbTQxMV9zZW5kX3Ntc19sY2hhbihsY2hhbiwgc21zKTsKKwkJYnJlYWs7CisJY2FzZSBCU0NfUkxMUl9JTkRfUkVMX0lORDoKKwljYXNlIEJTQ19STExSX0lORF9FUlJfSU5EOgorCWNhc2UgQlNDX1JMTFJfSU5EX1RJTUVPVVQ6CisJCXNtc19mcmVlKHNtcyk7CisJCWJyZWFrOworCX0KK30KKworLyogcGFnaW5nIGNhbGxiYWNrLiBIZXJlIHdlIGdldCBjYWxsZWQgaWYgcGFnaW5nIGEgc3Vic2NyaWJlciBoYXMKKyAqIHN1Y2NlZWRlZCBvciBmYWlsZWQuICovCitzdGF0aWMgaW50IHBhZ2luZ19jYl9zZW5kX3Ntcyh1bnNpZ25lZCBpbnQgaG9va251bSwgdW5zaWduZWQgaW50IGV2ZW50LAorCQkJICAgICAgc3RydWN0IG1zZ2IgKm1zZywgdm9pZCAqX2xjaGFuLCB2b2lkICpfc21zKQoreworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuID0gX2xjaGFuOworCXN0cnVjdCBnc21fc21zICpzbXMgPSBfc21zOworCWludCByYzsKKworCURFQlVHUChEU01TLCAicGFnaW5nX2NiX3NlbmRfc21zKGhvb2tudW09JXUsIGV2ZW50PSV1LCBtc2c9JXAsIgorCQkibGNoYW49JXAsIHNtcz0lcClcbiIsIGhvb2tudW0sIGV2ZW50LCBtc2csIGxjaGFuLCBzbXMpOworCisJaWYgKGhvb2tudW0gIT0gR1NNX0hPT0tfUlJfUEFHSU5HKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEdTTV9QQUdJTkdfU1VDQ0VFREVEOgorCQkvKiBQYWdpbmcgYWJvcnRlZCB3aXRob3V0IGxjaGFuID8hPyAqLworCQlpZiAoIWxjaGFuKSB7CisJCQlzbXNfZnJlZShzbXMpOworCQkJcmMgPSAtRUlPOworCQkJYnJlYWs7CisJCX0KKwkJLyogRXN0YWJsaXNoIGEgU0FQSTMgUkxMIGNvbm5lY3Rpb24gZm9yIFNNUyAqLworCQlyYyA9IHJsbF9lc3RhYmxpc2gobGNoYW4sIFVNX1NBUElfU01TLCBybGxfaW5kX2NiLCBzbXMpOworCQlicmVhazsKKwljYXNlIEdTTV9QQUdJTkdfRVhQSVJFRDoKKwkJc21zX2ZyZWUoc21zKTsKKwkJcmMgPSAtRVRJTUVET1VUOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyYyA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworLyogaGlnaC1sZXZlbCBmdW5jdGlvbiB0byBzZW5kIGEgU01TIHRvIGEgZ2l2ZW4gc3Vic2NyaWJlci4gVGhlIGZ1bmN0aW9uCisgKiB3aWxsIHRha2UgY2FyZSBvZiBwYWdpbmcgdGhlIHN1YnNjcmliZXIsIGVzdGFibGlzaGluZyB0aGUgUkxMIFNBUEkzCisgKiBjb25uZWN0aW9uLCBldGMuICovCitpbnQgZ3NtNDExX3NlbmRfc21zX3N1YnNjcihzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKwkJCSAgIHN0cnVjdCBnc21fc21zICpzbXMpCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJaW50IHJjOworCisJLyogY2hlY2sgaWYgd2UgYWxyZWFkeSBoYXZlIGFuIG9wZW4gbGNoYW4gdG8gdGhlIHN1YnNjcmliZXIuCisJICogaWYgeWVzLCBzZW5kIHRoZSBTTVMgdGhpcyB3YXkgKi8KKwlsY2hhbiA9IGxjaGFuX2Zvcl9zdWJzY3Ioc3Vic2NyKTsKKwlpZiAobGNoYW4pCisJCXJldHVybiBybGxfZXN0YWJsaXNoKGxjaGFuLCBVTV9TQVBJX1NNUywKKwkJCQkgICAgIHJsbF9pbmRfY2IsIHNtcyk7CisKKwkvKiBpZiBub3QsIHdlIGhhdmUgdG8gc3RhcnQgcGFnaW5nICovCisJcmMgPSBwYWdpbmdfcmVxdWVzdChzdWJzY3ItPm5ldCwgc3Vic2NyLCBSU0xfQ0hBTk5FRURfU0RDQ0gsCisJCQkgICAgcGFnaW5nX2NiX3NlbmRfc21zLCBzbXMpOworCWlmIChyYyA8PSAwKQorCQlzbXNfZnJlZShzbXMpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc3Vic2NyX3NpZ19jYih1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkJIHZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJc3RydWN0IGdzbV9zbXMgKnNtczsKKworCXN3aXRjaCAoc2lnbmFsKSB7CisJY2FzZSBTX1NVQlNDUl9BVFRBQ0hFRDoKKwkJLyogQSBzdWJzY3JpYmVyIGhhcyBhdHRhY2hlZC4gQ2hlY2sgaWYgdGhlcmUgYXJlCisJCSAqIGFueSBwZW5kaW5nIFNNUyBmb3IgaGltIHRvIGJlIGRlbGl2ZXJlZCAqLworCQlzdWJzY3IgPSBzaWduYWxfZGF0YTsKKwkJbGNoYW4gPSBsY2hhbl9mb3Jfc3Vic2NyKHN1YnNjcik7CisJCWlmICghbGNoYW4pCisJCQlicmVhazsKKwkJc21zID0gZGJfc21zX2dldF91bnNlbnRfZm9yX3N1YnNjcihzdWJzY3IpOworCQlpZiAoIXNtcykKKwkJCWJyZWFrOworCQkvKiBFc3RhYmxpc2ggYSBTQVBJMyBSTEwgY29ubmVjdGlvbiBmb3IgU01TICovCisJCXJsbF9lc3RhYmxpc2gobGNoYW4sIFVNX1NBUElfU01TLCBybGxfaW5kX2NiLCBzbXMpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgX2dzbTQxMV9zbXNfdHJhbnNfZnJlZShzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFucykKK3sKKwlic2NfZGVsX3RpbWVyKCZ0cmFucy0+c21zLmNwX3RpbWVyKTsKK30KKworc3RhdGljIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkgdm9pZCBvbl9kc29fbG9hZF9zbXModm9pZCkKK3sKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19TVUJTQ1IsIHN1YnNjcl9zaWdfY2IsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvZ3NtXzA0XzgwLmMgYi9vcGVuYnNjL3NyYy9nc21fMDRfODAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjcxMjc0Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3NtXzA0XzgwLmMKQEAgLTAsMCArMSwzMzAgQEAKKy8qIEdTTSBNb2JpbGUgUmFkaW8gSW50ZXJmYWNlIExheWVyIDMgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZQorICogM0dQUCBUUyAwNC4wOCB2ZXJzaW9uIDcuMjEuMCBSZWxlYXNlIDE5OTggLyBFVFNJIFRTIDEwMCA5NDAgVjcuMjEuMCAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOCwgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOSBieSBNaWtlIEhhYmVuIDxtaWNoYWVsLmhhYmVuQGJ0aW50ZXJuZXQuY29tPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzgwLmg+CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCitzdGF0aWMgaW50IHBhcnNlX3Vzc2QodV9pbnQ4X3QgKnVzc2QsIHN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSk7CitzdGF0aWMgaW50IHBhcnNlX3Vzc2RfaW5mb19lbGVtZW50cyh1X2ludDhfdCAqdXNzZF9pZSwKKwkJCQkJc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKTsKK3N0YXRpYyBpbnQgcGFyc2VfZmFjaWxpdHlfaWUodV9pbnQ4X3QgKmZhY2lsaXR5X2llLCB1X2ludDhfdCBsZW5ndGgsCisJCQkJCXN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSk7CitzdGF0aWMgaW50IHBhcnNlX3NzX2ludm9rZSh1X2ludDhfdCAqaW52b2tlX2RhdGEsIHVfaW50OF90IGxlbmd0aCwKKwkJCQkJc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKTsKK3N0YXRpYyBpbnQgcGFyc2VfcHJvY2Vzc191c3NfcmVxKHVfaW50OF90ICp1c3NfcmVxX2RhdGEsIHVfaW50OF90IGxlbmd0aCwKKwkJCQkJc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKTsKKworc3RhdGljIGlubGluZSB1bnNpZ25lZCBjaGFyICptc2diX3dyYXBfd2l0aF9UTChzdHJ1Y3QgbXNnYiAqbXNnYiwgdV9pbnQ4X3QgdGFnKQoreworCW1zZ2ItPmRhdGEgLT0gMjsKKwltc2diLT5kYXRhWzBdID0gdGFnOworCW1zZ2ItPmRhdGFbMV0gPSBtc2diLT5sZW47CisJbXNnYi0+bGVuICs9IDI7CisJcmV0dXJuIG1zZ2ItPmRhdGE7Cit9CisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgY2hhciAqbXNnYl9wdXNoX1RMVjEoc3RydWN0IG1zZ2IgKm1zZ2IsIHVfaW50OF90IHRhZywKKwkJCQkJICAgIHVfaW50OF90IHZhbHVlKQoreworCW1zZ2ItPmRhdGEgLT0gMzsKKwltc2diLT5sZW4gKz0gMzsKKwltc2diLT5kYXRhWzBdID0gdGFnOworCW1zZ2ItPmRhdGFbMV0gPSAxOworCW1zZ2ItPmRhdGFbMl0gPSB2YWx1ZTsKKwlyZXR1cm4gbXNnYi0+ZGF0YTsKK30KKworCisvKiBEZWNvZGUgYSBtb2JpbGUtb3JpZ2luYXRlZCBVU1NELXJlcXVlc3QgbWVzc2FnZSAqLworaW50IGdzbTA0ODBfZGVjb2RlX3Vzc2RfcmVxdWVzdChjb25zdCBzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpCit7CisJaW50IHJjID0gMDsKKwl1X2ludDhfdCAqcGFyc2VfcHRyID0gbXNnYl9sMyhtc2cpOworCisJaWYgKCgqcGFyc2VfcHRyICYgMHgwRikgPT0gR1NNNDhfUERJU0NfTkNfU1MpIHsKKwkJcmVxLT50cmFuc2FjdGlvbl9pZCA9ICpwYXJzZV9wdHIgJiAweDcwOworCQlyYyA9IHBhcnNlX3Vzc2QocGFyc2VfcHRyKzEsIHJlcSk7CisJfQorCisJaWYgKCFyYykKKwkJREVCVUdQKERNTSwgIkVycm9yIG9jY3VycmVkIHdoaWxlIHBhcnNpbmcgcmVjZWl2ZWQgVVNTRCFcbiIpOworCisJcmV0dXJuIHJjOworfQorCitzdGF0aWMgaW50IHBhcnNlX3Vzc2QodV9pbnQ4X3QgKnVzc2QsIHN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQgcmMgPSAxOworCXVfaW50OF90IG1zZ190eXBlID0gdXNzZFswXSAmIDB4QkY7ICAvKiBtZXNzYWdlLXR5cGUgLSBzZWN0aW9uIDMuNCAqLworCisJc3dpdGNoIChtc2dfdHlwZSkgeworCWNhc2UgR1NNMDQ4MF9NVFlQRV9SRUxFQVNFX0NPTVBMRVRFOgorCQlERUJVR1AoRE1NLCAiVVNTIFJlbGVhc2UgQ29tcGxldGVcbiIpOworCQkvKiBjb3VsZCBhbHNvIHBhcnNlIG91dCB0aGUgb3B0aW9uYWwgQ2F1c2UvRmFjaWxpdHkgZGF0YSAqLworCQlyZXEtPnRleHRbMF0gPSAweEZGOworCQlicmVhazsKKwljYXNlIEdTTTA0ODBfTVRZUEVfUkVHSVNURVI6CisJY2FzZSBHU00wNDgwX01UWVBFX0ZBQ0lMSVRZOgorCQlyYyAmPSBwYXJzZV91c3NkX2luZm9fZWxlbWVudHModXNzZCsxLCByZXEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlmcHJpbnRmKHN0ZGVyciwgIlVua25vd24gR1NNIDA0LjgwIG1lc3NhZ2UtdHlwZSBmaWVsZCAweCUwMnhcbiIsCisJCQl1c3NkWzBdKTsKKwkJcmMgPSAwOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfdXNzZF9pbmZvX2VsZW1lbnRzKHVfaW50OF90ICp1c3NkX2llLCBzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpCit7CisJaW50IHJjOworCS8qIEluZm9ybWF0aW9uIEVsZW1lbnQgSWRlbnRpZmllciAtIHRhYmxlIDMuMiAmIEdTTSAwNC4wOCBzZWN0aW9uIDEwLjUgKi8KKwl1X2ludDhfdCBpZWkgPSB1c3NkX2llWzBdOworCXVfaW50OF90IGllaV9sZW5ndGggPSB1c3NkX2llWzFdOworCisJc3dpdGNoIChpZWkpIHsKKwljYXNlIEdTTTQ4X0lFX0NBVVNFOgorCQlicmVhazsKKwljYXNlIEdTTTA0ODBfSUVfRkFDSUxJVFk6CisJCXJjID0gcGFyc2VfZmFjaWxpdHlfaWUodXNzZF9pZSsyLCBpZWlfbGVuZ3RoLCByZXEpOworCQlicmVhazsKKwljYXNlIEdTTTA0ODBfSUVfU1NfVkVSU0lPTjoKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZnByaW50ZihzdGRlcnIsICJVbmhhbmRsZWQgR1NNIDA0LjA4IG9yIDA0LjgwIElFSSAweCUwMnhcbiIsCisJCQlpZWkpOworCQlyYyA9IDA7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBwYXJzZV9mYWNpbGl0eV9pZSh1X2ludDhfdCAqZmFjaWxpdHlfaWUsIHVfaW50OF90IGxlbmd0aCwKKwkJCQkJCXN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSkKK3sKKwlpbnQgcmMgPSAxOworCXVfaW50OF90IG9mZnNldCA9IDA7CisKKwlkbyB7CisJCS8qIENvbXBvbmVudCBUeXBlIHRhZyAtIHRhYmxlIDMuNyAqLworCQl1X2ludDhfdCBjb21wb25lbnRfdHlwZSA9IGZhY2lsaXR5X2llW29mZnNldF07CisJCXVfaW50OF90IGNvbXBvbmVudF9sZW5ndGggPSBmYWNpbGl0eV9pZVtvZmZzZXQrMV07CisKKwkJc3dpdGNoIChjb21wb25lbnRfdHlwZSkgeworCQljYXNlIEdTTTA0ODBfQ1RZUEVfSU5WT0tFOgorCQkJcmMgJj0gcGFyc2Vfc3NfaW52b2tlKGZhY2lsaXR5X2llKzIsCisJCQkJCQljb21wb25lbnRfbGVuZ3RoLAorCQkJCQkJcmVxKTsKKwkJCWJyZWFrOworCQljYXNlIEdTTTA0ODBfQ1RZUEVfUkVUVVJOX1JFU1VMVDoKKwkJCWJyZWFrOworCQljYXNlIEdTTTA0ODBfQ1RZUEVfUkVUVVJOX0VSUk9SOgorCQkJYnJlYWs7CisJCWNhc2UgR1NNMDQ4MF9DVFlQRV9SRUpFQ1Q6CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWZwcmludGYoc3RkZXJyLCAiVW5rbm93biBHU00gMDQuODAgRmFjaWxpdHkgIgorCQkJCSJDb21wb25lbnQgVHlwZSAweCUwMnhcbiIsIGNvbXBvbmVudF90eXBlKTsKKwkJCXJjID0gMDsKKwkJCWJyZWFrOworCQl9CisJCW9mZnNldCArPSAoY29tcG9uZW50X2xlbmd0aCsyKTsKKwl9IHdoaWxlIChvZmZzZXQgPCBsZW5ndGgpOworCisJcmV0dXJuIHJjOworfQorCisvKiBQYXJzZSBhbiBJbnZva2UgY29tcG9uZW50IC0gc2VlIHRhYmxlIDMuMyAqLworc3RhdGljIGludCBwYXJzZV9zc19pbnZva2UodV9pbnQ4X3QgKmludm9rZV9kYXRhLCB1X2ludDhfdCBsZW5ndGgsCisJCQkJCQlzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpCit7CisJaW50IHJjID0gMTsKKwl1X2ludDhfdCBvZmZzZXQ7CisKKwkvKiBtYW5kYXRvcnkgcGFydCAqLworCWlmIChpbnZva2VfZGF0YVswXSAhPSBHU00wNDgwX0NPTVBJRFRBR19JTlZPS0VfSUQpIHsKKwkJZnByaW50ZihzdGRlcnIsICJVbmV4cGVjdGVkIEdTTSAwNC44MCBDb21wb25lbnQtSUQgdGFnICIKKwkJCSIweCUwMnggKGV4cGVjdGluZyBJbnZva2UgSUQgdGFnKVxuIiwgaW52b2tlX2RhdGFbMF0pOworCX0KKworCW9mZnNldCA9IGludm9rZV9kYXRhWzFdICsgMjsKKwlyZXEtPmludm9rZV9pZCA9IGludm9rZV9kYXRhWzJdOworCisJLyogb3B0aW9uYWwgcGFydCAqLworCWlmIChpbnZva2VfZGF0YVtvZmZzZXRdID09IEdTTTA0ODBfQ09NUElEVEFHX0xJTktFRF9JRCkKKwkJb2Zmc2V0ICs9IGludm9rZV9kYXRhW29mZnNldCsxXSArIDI7ICAvKiBza2lwIG92ZXIgaXQgKi8KKworCS8qIG1hbmRhdG9yeSBwYXJ0ICovCisJaWYgKGludm9rZV9kYXRhW29mZnNldF0gPT0gR1NNMDQ4MF9PUEVSQVRJT05fQ09ERSkgeworCQl1X2ludDhfdCBvcGVyYXRpb25fY29kZSA9IGludm9rZV9kYXRhW29mZnNldCsyXTsKKwkJc3dpdGNoIChvcGVyYXRpb25fY29kZSkgeworCQljYXNlIEdTTTA0ODBfT1BfQ09ERV9QUk9DRVNTX1VTU19SRVE6CisJCQlyYyA9IHBhcnNlX3Byb2Nlc3NfdXNzX3JlcShpbnZva2VfZGF0YSArIG9mZnNldCArIDMsCisJCQkJCQkgICBsZW5ndGggLSBvZmZzZXQgLSAzLAorCQkJCQkJICAgcmVxKTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJZnByaW50ZihzdGRlcnIsICJHU00gMDQuODAgb3BlcmF0aW9uIGNvZGUgMHglMDJ4ICIKKwkJCQkiaXMgbm90IHlldCBoYW5kbGVkXG4iLCBvcGVyYXRpb25fY29kZSk7CisJCQlyYyA9IDA7CisJCQlicmVhazsKKwkJfQorCX0gZWxzZSB7CisJCWZwcmludGYoc3RkZXJyLCAiVW5leHBlY3RlZCBHU00gMDQuODAgQ29tcG9uZW50LUlEIHRhZyAweCUwMnggIgorCQkJIihleHBlY3RpbmcgT3BlcmF0aW9uIENvZGUgdGFnKVxuIiwKKwkJCWludm9rZV9kYXRhWzBdKTsKKwkJcmMgPSAwOworCX0KKworCXJldHVybiByYzsKK30KKworLyogUGFyc2UgdGhlIHBhcmFtZXRlcnMgb2YgYSBQcm9jZXNzIFVuc3RydWN0dXJlZFNTIFJlcXVlc3QgKi8KK3N0YXRpYyBpbnQgcGFyc2VfcHJvY2Vzc191c3NfcmVxKHVfaW50OF90ICp1c3NfcmVxX2RhdGEsIHVfaW50OF90IGxlbmd0aCwKKwkJCQkJc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKQoreworCWludCByYyA9IDA7CisJaW50IG51bV9jaGFyczsKKwl1X2ludDhfdCBkY3M7CisKKwlpZiAodXNzX3JlcV9kYXRhWzBdID09IEdTTV8wNDgwX1NFUVVFTkNFX1RBRykgeworCQlpZiAodXNzX3JlcV9kYXRhWzJdID09IEFTTjFfT0NURVRfU1RSSU5HX1RBRykgeworCQkJZGNzID0gdXNzX3JlcV9kYXRhWzRdOworCQkJaWYgKChkY3MgPT0gMHgwRikgJiYKKwkJCSAgICAodXNzX3JlcV9kYXRhWzVdID09IEFTTjFfT0NURVRfU1RSSU5HX1RBRykpIHsKKwkJCQludW1fY2hhcnMgPSAodXNzX3JlcV9kYXRhWzZdICogOCkgLyA3OworCQkJCS8qIFByZXZlbnQgYSBtb2JpbGUtb3JpZ2luYXRlZCBidWZmZXItb3ZlcnJ1biEgKi8KKwkJCQlpZiAobnVtX2NoYXJzID4gTUFYX0xFTl9VU1NEX1NUUklORykKKwkJCQkJbnVtX2NoYXJzID0gTUFYX0xFTl9VU1NEX1NUUklORzsKKwkJCQlnc21fN2JpdF9kZWNvZGUocmVxLT50ZXh0LAorCQkJCQkJJih1c3NfcmVxX2RhdGFbN10pLCBudW1fY2hhcnMpOworCQkJCS8qIGFwcGVuZCBudWxsLXRlcm1pbmF0b3IgKi8KKwkJCQlyZXEtPnRleHRbbnVtX2NoYXJzKzFdID0gMDsgIAorCQkJCXJjID0gMTsKKwkJCX0KKwkJfQorCX0KKwlyZXR1cm4gcmM7Cit9CisKKy8qIFNlbmQgcmVzcG9uc2UgdG8gYSBtb2JpbGUtb3JpZ2luYXRlZCBQcm9jZXNzVW5zdHJ1Y3R1cmVkU1MtUmVxdWVzdCAqLworaW50IGdzbTA0ODBfc2VuZF91c3NkX3Jlc3BvbnNlKGNvbnN0IHN0cnVjdCBtc2diICppbl9tc2csIGNvbnN0IGNoYXIgKnJlc3BvbnNlX3RleHQsCisJCQkJCQljb25zdCBzdHJ1Y3QgdXNzZF9yZXF1ZXN0ICpyZXEpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IGdzbTQ4X21zZ2JfYWxsb2MoKTsKKwlzdHJ1Y3QgZ3NtNDhfaGRyICpnaDsKKwl1X2ludDhfdCAqcHRyODsKKwlpbnQgcmVzcG9uc2VfbGVuOworCisJcmVzcG9uc2VfbGVuID0gKHN0cmxlbihyZXNwb25zZV90ZXh0KSAqIDcpIC8gODsKKwlpZiAoKChzdHJsZW4ocmVzcG9uc2VfdGV4dCkgKiA3KSAlIDgpICE9IDApCisJCXJlc3BvbnNlX2xlbiArPSAxOworCisJbXNnLT5idHNfbGluayA9IGluX21zZy0+YnRzX2xpbms7CisJbXNnLT5sY2hhbiA9IGluX21zZy0+bGNoYW47CisKKwkvKiBGaXJzdCBwdXQgdGhlIHBheWxvYWQgdGV4dCBpbnRvIHRoZSBtZXNzYWdlICovCisJcHRyOCA9IG1zZ2JfcHV0KG1zZywgcmVzcG9uc2VfbGVuKTsKKwlnc21fN2JpdF9lbmNvZGUocHRyOCwgcmVzcG9uc2VfdGV4dCk7CisKKwkvKiBUaGVuIHdyYXAgaXQgYXMgYW4gT2N0ZXQgU3RyaW5nICovCisJbXNnYl93cmFwX3dpdGhfVEwobXNnLCBBU04xX09DVEVUX1NUUklOR19UQUcpOworCisJLyogUHJlLXBlbmQgdGhlIERDUyBvY3RldCBzdHJpbmcgKi8KKwltc2diX3B1c2hfVExWMShtc2csIEFTTjFfT0NURVRfU1RSSU5HX1RBRywgMHgwRik7CisKKwkvKiBUaGVuIHdyYXAgdGhlc2UgYXMgYSBTZXF1ZW5jZSAqLworCW1zZ2Jfd3JhcF93aXRoX1RMKG1zZywgR1NNXzA0ODBfU0VRVUVOQ0VfVEFHKTsKKworCS8qIFByZS1wZW5kIHRoZSBvcGVyYXRpb24gY29kZSAqLworCW1zZ2JfcHVzaF9UTFYxKG1zZywgR1NNMDQ4MF9PUEVSQVRJT05fQ09ERSwKKwkJCUdTTTA0ODBfT1BfQ09ERV9QUk9DRVNTX1VTU19SRVEpOworCisJLyogV3JhcCB0aGUgb3BlcmF0aW9uIGNvZGUgYW5kIElBNSBzdHJpbmcgYXMgYSBzZXF1ZW5jZSAqLworCW1zZ2Jfd3JhcF93aXRoX1RMKG1zZywgR1NNXzA0ODBfU0VRVUVOQ0VfVEFHKTsKKworCS8qIFByZS1wZW5kIHRoZSBpbnZva2UgSUQgKi8KKwltc2diX3B1c2hfVExWMShtc2csIEdTTTA0ODBfQ09NUElEVEFHX0lOVk9LRV9JRCwgcmVxLT5pbnZva2VfaWQpOworCisJLyogV3JhcCB0aGlzIHVwIGFzIGEgUmV0dXJuIFJlc3VsdCBjb21wb25lbnQgKi8KKwltc2diX3dyYXBfd2l0aF9UTChtc2csIEdTTTA0ODBfQ1RZUEVfUkVUVVJOX1JFU1VMVCk7CisKKwkvKiBXcmFwIHRoZSBjb21wb25lbnQgaW4gYSBGYWNpbGl0eSBtZXNzYWdlICovCisJbXNnYl93cmFwX3dpdGhfVEwobXNnLCBHU00wNDgwX0lFX0ZBQ0lMSVRZKTsKKworCS8qIEFuZCBmaW5hbGx5IHByZS1wZW5kIHRoZSBMMyBoZWFkZXIgKi8KKwlnaCA9IChzdHJ1Y3QgZ3NtNDhfaGRyICopIG1zZ2JfcHVzaChtc2csIHNpemVvZigqZ2gpKTsKKwlnaC0+cHJvdG9fZGlzY3IgPSBHU000OF9QRElTQ19OQ19TUyB8IHJlcS0+dHJhbnNhY3Rpb25faWQKKwkJCQkJfCAoMTw8Nyk7ICAvKiBUSSBkaXJlY3Rpb24gPSAxICovCisJZ2gtPm1zZ190eXBlID0gR1NNMDQ4MF9NVFlQRV9SRUxFQVNFX0NPTVBMRVRFOworCisJcmV0dXJuIGdzbTQ4X3NlbmRtc2cobXNnLCBOVUxMKTsKK30KKworaW50IGdzbTA0ODBfc2VuZF91c3NkX3JlamVjdChjb25zdCBzdHJ1Y3QgbXNnYiAqaW5fbXNnLAorCQkJCWNvbnN0IHN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gZ3NtNDhfbXNnYl9hbGxvYygpOworCXN0cnVjdCBnc200OF9oZHIgKmdoOworCisJbXNnLT5idHNfbGluayA9IGluX21zZy0+YnRzX2xpbms7CisJbXNnLT5sY2hhbiA9IGluX21zZy0+bGNoYW47CisKKwkvKiBGaXJzdCBpbnNlcnQgdGhlIHByb2JsZW0gY29kZSAqLworCW1zZ2JfcHVzaF9UTFYxKG1zZywgR1NNXzA0ODBfUFJPQkxFTV9DT0RFX1RBR19HRU5FUkFMLAorCQkJR1NNXzA0ODBfR0VOX1BST0JfQ09ERV9VTlJFQ09HTklTRUQpOworCisJLyogQmVmb3JlIGl0IGluc2VydCB0aGUgaW52b2tlIElEICovCisJbXNnYl9wdXNoX1RMVjEobXNnLCBHU00wNDgwX0NPTVBJRFRBR19JTlZPS0VfSUQsIHJlcS0+aW52b2tlX2lkKTsKKworCS8qIFdyYXAgdGhpcyB1cCBhcyBhIFJlamVjdCBjb21wb25lbnQgKi8KKwltc2diX3dyYXBfd2l0aF9UTChtc2csIEdTTTA0ODBfQ1RZUEVfUkVKRUNUKTsKKworCS8qIFdyYXAgdGhlIGNvbXBvbmVudCBpbiBhIEZhY2lsaXR5IG1lc3NhZ2UgKi8KKwltc2diX3dyYXBfd2l0aF9UTChtc2csIEdTTTA0ODBfSUVfRkFDSUxJVFkpOworCisJLyogQW5kIGZpbmFsbHkgcHJlLXBlbmQgdGhlIEwzIGhlYWRlciAqLworCWdoID0gKHN0cnVjdCBnc200OF9oZHIgKikgbXNnYl9wdXNoKG1zZywgc2l6ZW9mKCpnaCkpOworCWdoLT5wcm90b19kaXNjciA9IEdTTTQ4X1BESVNDX05DX1NTOworCWdoLT5wcm90b19kaXNjciB8PSByZXEtPnRyYW5zYWN0aW9uX2lkIHwgKDE8PDcpOyAgLyogVEkgZGlyZWN0aW9uID0gMSAqLworCWdoLT5tc2dfdHlwZSA9IEdTTTA0ODBfTVRZUEVfUkVMRUFTRV9DT01QTEVURTsKKworCXJldHVybiBnc200OF9zZW5kbXNnKG1zZywgTlVMTCk7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9nc21fZGF0YS5jIGIvb3BlbmJzYy9zcmMvZ3NtX2RhdGEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MzE0ZDEyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3NtX2RhdGEuYwpAQCAtMCwwICsxLDU2NyBAQAorLyogKEMpIDIwMDgtMjAxMCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8Y3R5cGUuaD4KKworI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9nc21fdXRpbHMuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zdGF0aXN0aWNzLmg+CisKK3ZvaWQgKnRhbGxfYnNjX2N0eDsKKworc3RhdGljIExMSVNUX0hFQUQoYnRzX21vZGVscyk7CisKK3ZvaWQgc2V0X3RzX2UxbGluayhzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzLCB1X2ludDhfdCBlMV9uciwKKwkJICAgdV9pbnQ4X3QgZTFfdHMsIHVfaW50OF90IGUxX3RzX3NzKQoreworCXRzLT5lMV9saW5rLmUxX25yID0gZTFfbnI7CisJdHMtPmUxX2xpbmsuZTFfdHMgPSBlMV90czsKKwl0cy0+ZTFfbGluay5lMV90c19zcyA9IGUxX3RzX3NzOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqcGNoYW5fbmFtZXNbXSA9IHsKKwlbR1NNX1BDSEFOX05PTkVdCT0gIk5PTkUiLAorCVtHU01fUENIQU5fQ0NDSF0JPSAiQ0NDSCIsCisJW0dTTV9QQ0hBTl9DQ0NIX1NEQ0NINF0JPSAiQ0NDSCtTRENDSDQiLAorCVtHU01fUENIQU5fVENIX0ZdCT0gIlRDSC9GIiwKKwlbR1NNX1BDSEFOX1RDSF9IXQk9ICJUQ0gvSCIsCisJW0dTTV9QQ0hBTl9TRENDSDhfU0FDQ0g4Q10gPSAiU0RDQ0g4IiwKKwlbR1NNX1BDSEFOX1BEQ0hdCT0gIlBEQ0giLAorCVtHU01fUENIQU5fVENIX0ZfUERDSF0JPSAiVENIL0ZfUERDSCIsCisJW0dTTV9QQ0hBTl9VTktOT1dOXQk9ICJVTktOT1dOIiwKK307CisKK2NvbnN0IGNoYXIgKmdzbV9wY2hhbl9uYW1lKGVudW0gZ3NtX3BoeXNfY2hhbl9jb25maWcgYykKK3sKKwlpZiAoYyA+PSBBUlJBWV9TSVpFKHBjaGFuX25hbWVzKSkKKwkJcmV0dXJuICJJTlZBTElEIjsKKworCXJldHVybiBwY2hhbl9uYW1lc1tjXTsKK30KKworZW51bSBnc21fcGh5c19jaGFuX2NvbmZpZyBnc21fcGNoYW5fcGFyc2UoY29uc3QgY2hhciAqbmFtZSkKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHBjaGFuX25hbWVzKTsgaSsrKSB7CisJCWlmICghc3RyY2FzZWNtcChuYW1lLCBwY2hhbl9uYW1lc1tpXSkpCisJCQlyZXR1cm4gaTsKKwl9CisKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpsY2hhbl9uYW1lc1tdID0geworCVtHU01fTENIQU5fTk9ORV0JPSAiTk9ORSIsCisJW0dTTV9MQ0hBTl9TRENDSF0JPSAiU0RDQ0giLAorCVtHU01fTENIQU5fVENIX0ZdCT0gIlRDSC9GIiwKKwlbR1NNX0xDSEFOX1RDSF9IXQk9ICJUQ0gvSCIsCisJW0dTTV9MQ0hBTl9VTktOT1dOXQk9ICJVTktOT1dOIiwKK307CisKK2NvbnN0IGNoYXIgKmdzbV9sY2hhbnRfbmFtZShlbnVtIGdzbV9jaGFuX3QgYykKK3sKKwlpZiAoYyA+PSBBUlJBWV9TSVpFKGxjaGFuX25hbWVzKSkKKwkJcmV0dXJuICJJTlZBTElEIjsKKworCXJldHVybiBsY2hhbl9uYW1lc1tjXTsKK30KKworc3RhdGljIGNvbnN0IHN0cnVjdCB2YWx1ZV9zdHJpbmcgbGNoYW5fc19uYW1lc1tdID0geworCXsgTENIQU5fU19OT05FLAkJIk5PTkUiIH0sCisJeyBMQ0hBTl9TX0FDVF9SRVEsCSJBQ1RJVkFUSU9OIFJFUVVFU1RFRCIgfSwKKwl7IExDSEFOX1NfQUNUSVZFLAkiQUNUSVZFIiB9LAorCXsgTENIQU5fU19JTkFDVElWRSwJIklOQUNUSVZFIiB9LAorCXsgTENIQU5fU19SRUxfUkVRLAkiUkVMRUFTRSBSRVFVRVNURUQiIH0sCisJeyAwLAkJCU5VTEwgfSwKK307CisKK2NvbnN0IGNoYXIgKmdzbV9sY2hhbnNfbmFtZShlbnVtIGdzbV9sY2hhbl9zdGF0ZSBzKQoreworCXJldHVybiBnZXRfdmFsdWVfc3RyaW5nKGxjaGFuX3NfbmFtZXMsIHMpOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqY2hyZXFfbmFtZXNbXSA9IHsKKwlbR1NNX0NIUkVRX1JFQVNPTl9FTUVSR10JPSAiRU1FUkdFTkNZIiwKKwlbR1NNX0NIUkVRX1JFQVNPTl9QQUddCQk9ICJQQUdJTkciLAorCVtHU01fQ0hSRVFfUkVBU09OX0NBTExdCQk9ICJDQUxMIiwKKwlbR1NNX0NIUkVRX1JFQVNPTl9MT0NBVElPTl9VUERdCT0gIkxPQ0FUSU9OX1VQREFURSIsCisJW0dTTV9DSFJFUV9SRUFTT05fT1RIRVJdCT0gIk9USEVSIiwKK307CisKK2NvbnN0IGNoYXIgKmdzbV9jaHJlcV9uYW1lKGVudW0gZ3NtX2NocmVxX3JlYXNvbl90IGMpCit7CisJaWYgKGMgPj0gQVJSQVlfU0laRShjaHJlcV9uYW1lcykpCisJCXJldHVybiAiSU5WQUxJRCI7CisKKwlyZXR1cm4gY2hyZXFfbmFtZXNbY107Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX2J0c19tb2RlbCAqYnRzX21vZGVsX2ZpbmQoZW51bSBnc21fYnRzX3R5cGUgdHlwZSkKK3sKKwlzdHJ1Y3QgZ3NtX2J0c19tb2RlbCAqbW9kZWw7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShtb2RlbCwgJmJ0c19tb2RlbHMsIGxpc3QpIHsKKwkJaWYgKG1vZGVsLT50eXBlID09IHR5cGUpCisJCQlyZXR1cm4gbW9kZWw7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK2ludCBnc21fYnRzX21vZGVsX3JlZ2lzdGVyKHN0cnVjdCBnc21fYnRzX21vZGVsICptb2RlbCkKK3sKKwlpZiAoYnRzX21vZGVsX2ZpbmQobW9kZWwtPnR5cGUpKQorCQlyZXR1cm4gLUVFWElTVDsKKworCXRsdl9kZWZfcGF0Y2goJm1vZGVsLT5ubV9hdHRfdGx2ZGVmLCAmbm1fYXR0X3RsdmRlZik7CisJbGxpc3RfYWRkX3RhaWwoJm1vZGVsLT5saXN0LCAmYnRzX21vZGVscyk7CisJcmV0dXJuIDA7Cit9CisKKworc3RydWN0IGdzbV9idHNfdHJ4ICpnc21fYnRzX3RyeF9hbGxvYyhzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdGFsbG9jX3plcm8oYnRzLCBzdHJ1Y3QgZ3NtX2J0c190cngpOworCWludCBrOworCisJaWYgKCF0cngpCisJCXJldHVybiBOVUxMOworCisJdHJ4LT5idHMgPSBidHM7CisJdHJ4LT5uciA9IGJ0cy0+bnVtX3RyeCsrOworCXRyeC0+bm1fc3RhdGUuYWRtaW5pc3RyYXRpdmUgPSBOTV9TVEFURV9VTkxPQ0tFRDsKKworCWZvciAoayA9IDA7IGsgPCBUUlhfTlJfVFM7IGsrKykgeworCQlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gJnRyeC0+dHNba107CisJCWludCBsOworCQkKKwkJdHMtPnRyeCA9IHRyeDsKKwkJdHMtPm5yID0gazsKKwkJdHMtPnBjaGFuID0gR1NNX1BDSEFOX05PTkU7CisKKwkJZm9yIChsID0gMDsgbCA8IFRTX01BWF9MQ0hBTjsgbCsrKSB7CisJCQlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKwkJCWxjaGFuID0gJnRzLT5sY2hhbltsXTsKKworCQkJbGNoYW4tPnRzID0gdHM7CisJCQlsY2hhbi0+bnIgPSBsOworCQkJbGNoYW4tPnR5cGUgPSBHU01fTENIQU5fTk9ORTsKKwkJfQorCX0KKworCWlmICh0cngtPm5yICE9IDApCisJCXRyeC0+bm9taW5hbF9wb3dlciA9IGJ0cy0+YzAtPm5vbWluYWxfcG93ZXI7CisKKwlsbGlzdF9hZGRfdGFpbCgmdHJ4LT5saXN0LCAmYnRzLT50cnhfbGlzdCk7CisKKwlyZXR1cm4gdHJ4OworfQorCitzdHJ1Y3QgZ3NtX2J0cyAqZ3NtX2J0c19hbGxvYyhzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwgZW51bSBnc21fYnRzX3R5cGUgdHlwZSwKKwkJCSAgICAgIHVfaW50OF90IHRzYywgdV9pbnQ4X3QgYnNpYykKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdGFsbG9jX3plcm8obmV0LCBzdHJ1Y3QgZ3NtX2J0cyk7CisJc3RydWN0IGdzbV9idHNfbW9kZWwgKm1vZGVsID0gYnRzX21vZGVsX2ZpbmQodHlwZSk7CisJaW50IGk7CisKKwlpZiAoIWJ0cykKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIW1vZGVsICYmIHR5cGUgIT0gR1NNX0JUU19UWVBFX1VOS05PV04pIHsKKwkJdGFsbG9jX2ZyZWUoYnRzKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJYnRzLT5uZXR3b3JrID0gbmV0OworCWJ0cy0+bnIgPSBuZXQtPm51bV9idHMrKzsKKwlidHMtPnR5cGUgPSB0eXBlOworCWJ0cy0+bW9kZWwgPSBtb2RlbDsKKwlidHMtPnRzYyA9IHRzYzsKKwlidHMtPmJzaWMgPSBic2ljOworCWJ0cy0+bnVtX3RyeCA9IDA7CisJSU5JVF9MTElTVF9IRUFEKCZidHMtPnRyeF9saXN0KTsKKwlidHMtPm1zX21heF9wb3dlciA9IDE1OwkvKiBkQm0gKi8KKwlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIuY2VsbF9yZXNlbF9oeXN0ID0gMjsgLyogNCBkQiAqLworCWJ0cy0+c2lfY29tbW9uLmNlbGxfc2VsX3Bhci5yeGxldl9hY2NfbWluID0gMDsKKwlidHMtPnNpX2NvbW1vbi5uZWlnaF9saXN0LmRhdGEgPSBidHMtPnNpX2NvbW1vbi5kYXRhLm5laWdoX2xpc3Q7CisJYnRzLT5zaV9jb21tb24ubmVpZ2hfbGlzdC5kYXRhX2xlbiA9CisJCQkJc2l6ZW9mKGJ0cy0+c2lfY29tbW9uLmRhdGEubmVpZ2hfbGlzdCk7CisJYnRzLT5zaV9jb21tb24uY2VsbF9hbGxvYy5kYXRhID0gYnRzLT5zaV9jb21tb24uZGF0YS5jZWxsX2FsbG9jOworCWJ0cy0+c2lfY29tbW9uLmNlbGxfYWxsb2MuZGF0YV9sZW4gPQorCQkJCXNpemVvZihidHMtPnNpX2NvbW1vbi5kYXRhLmNlbGxfYWxsb2MpOworCWJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC5yZSA9IDE7IC8qIG5vIHJlLWVzdGFibGlzaG1lbnQgKi8KKwlidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wudHhfaW50ZWdlciA9IDk7ICAvKiAxMiBzbG90cyBzcHJlYWQgLSAyMTcvMTE1IHNsb3RzIGRlbGF5ICovCisJYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLm1heF90cmFucyA9IDM7IC8qIDcgcmV0cmFuc21pc3Npb25zICovCisJYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLnQyID0gNDsgLyogbm8gZW1lcmdlbmN5IGNhbGxzICovCisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidHMtPmdwcnMubnN2Yyk7IGkrKykgeworCQlidHMtPmdwcnMubnN2Y1tpXS5idHMgPSBidHM7CisJCWJ0cy0+Z3Bycy5uc3ZjW2ldLmlkID0gaTsKKwl9CisKKwkvKiBjcmVhdGUgb3VyIHByaW1hcnkgVFJYICovCisJYnRzLT5jMCA9IGdzbV9idHNfdHJ4X2FsbG9jKGJ0cyk7CisJaWYgKCFidHMtPmMwKSB7CisJCXRhbGxvY19mcmVlKGJ0cyk7CisJCXJldHVybiBOVUxMOworCX0KKwlidHMtPmMwLT50c1swXS5wY2hhbiA9IEdTTV9QQ0hBTl9DQ0NIX1NEQ0NINDsKKworCWxsaXN0X2FkZF90YWlsKCZidHMtPmxpc3QsICZuZXQtPmJ0c19saXN0KTsKKworCXJldHVybiBidHM7Cit9CisKK3N0cnVjdCBnc21fbmV0d29yayAqZ3NtX25ldHdvcmtfaW5pdCh1X2ludDE2X3QgY291bnRyeV9jb2RlLCB1X2ludDE2X3QgbmV0d29ya19jb2RlLAorCQkJCSAgICAgaW50ICgqbW5jY19yZWN2KShzdHJ1Y3QgZ3NtX25ldHdvcmsgKiwgaW50LCB2b2lkICopKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0OworCisJbmV0ID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgZ3NtX25ldHdvcmspOworCWlmICghbmV0KQorCQlyZXR1cm4gTlVMTDsKKworCW5ldC0+Y291bnRyeV9jb2RlID0gY291bnRyeV9jb2RlOworCW5ldC0+bmV0d29ya19jb2RlID0gbmV0d29ya19jb2RlOworCW5ldC0+bnVtX2J0cyA9IDA7CisJbmV0LT5yZWplY3RfY2F1c2UgPSBHU000OF9SRUpFQ1RfUk9BTUlOR19OT1RfQUxMT1dFRDsKKwluZXQtPlQzMTAxID0gR1NNX1QzMTAxX0RFRkFVTFQ7CisJbmV0LT5UMzExMyA9IEdTTV9UMzExM19ERUZBVUxUOworCS8qIEZJWE1FOiBpbml0aWFsaXplIGFsbCBvdGhlciB0aW1lcnMhICovCisKKwkvKiBkZWZhdWx0IHNldCBvZiBoYW5kb3ZlciBwYXJhbWV0ZXJzICovCisJbmV0LT5oYW5kb3Zlci53aW5fcnhsZXZfYXZnID0gMTA7CisJbmV0LT5oYW5kb3Zlci53aW5fcnhxdWFsX2F2ZyA9IDE7CisJbmV0LT5oYW5kb3Zlci53aW5fcnhsZXZfYXZnX25laWdoID0gMTA7CisJbmV0LT5oYW5kb3Zlci5wd3JfaW50ZXJ2YWwgPSA2OworCW5ldC0+aGFuZG92ZXIucHdyX2h5c3RlcmVzaXMgPSAzOworCW5ldC0+aGFuZG92ZXIubWF4X2Rpc3RhbmNlID0gOTk5OTsKKworCUlOSVRfTExJU1RfSEVBRCgmbmV0LT50cmFuc19saXN0KTsKKwlJTklUX0xMSVNUX0hFQUQoJm5ldC0+dXBxdWV1ZSk7CisJSU5JVF9MTElTVF9IRUFEKCZuZXQtPmJ0c19saXN0KTsKKworCW5ldC0+c3RhdHMuY2hyZXEudG90YWwgPSBjb3VudGVyX2FsbG9jKCJuZXQuY2hyZXEudG90YWwiKTsKKwluZXQtPnN0YXRzLmNocmVxLm5vX2NoYW5uZWwgPSBjb3VudGVyX2FsbG9jKCJuZXQuY2hyZXEubm9fY2hhbm5lbCIpOworCW5ldC0+c3RhdHMuaGFuZG92ZXIuYXR0ZW1wdGVkID0gY291bnRlcl9hbGxvYygibmV0LmhhbmRvdmVyLmF0dGVtcHRlZCIpOworCW5ldC0+c3RhdHMuaGFuZG92ZXIubm9fY2hhbm5lbCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5oYW5kb3Zlci5ub19jaGFubmVsIik7CisJbmV0LT5zdGF0cy5oYW5kb3Zlci50aW1lb3V0ID0gY291bnRlcl9hbGxvYygibmV0LmhhbmRvdmVyLnRpbWVvdXQiKTsKKwluZXQtPnN0YXRzLmhhbmRvdmVyLmNvbXBsZXRlZCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5oYW5kb3Zlci5jb21wbGV0ZWQiKTsKKwluZXQtPnN0YXRzLmhhbmRvdmVyLmZhaWxlZCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5oYW5kb3Zlci5mYWlsZWQiKTsKKwluZXQtPnN0YXRzLmxvY191cGRfdHlwZS5hdHRhY2ggPSBjb3VudGVyX2FsbG9jKCJuZXQubG9jX3VwZF90eXBlLmF0dGFjaCIpOworCW5ldC0+c3RhdHMubG9jX3VwZF90eXBlLm5vcm1hbCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5sb2NfdXBkX3R5cGUubm9ybWFsIik7CisJbmV0LT5zdGF0cy5sb2NfdXBkX3R5cGUucGVyaW9kaWMgPSBjb3VudGVyX2FsbG9jKCJuZXQubG9jX3VwZF90eXBlLnBlcmlvZGljIik7CisJbmV0LT5zdGF0cy5sb2NfdXBkX3R5cGUuZGV0YWNoID0gY291bnRlcl9hbGxvYygibmV0Lmltc2lfZGV0YWNoLmNvdW50Iik7CisJbmV0LT5zdGF0cy5sb2NfdXBkX3Jlc3AucmVqZWN0ID0gY291bnRlcl9hbGxvYygibmV0LmxvY191cGRfcmVzcC5yZWplY3QiKTsKKwluZXQtPnN0YXRzLmxvY191cGRfcmVzcC5hY2NlcHQgPSBjb3VudGVyX2FsbG9jKCJuZXQubG9jX3VwZF9yZXNwLmFjY2VwdCIpOworCW5ldC0+c3RhdHMucGFnaW5nLmF0dGVtcHRlZCA9IGNvdW50ZXJfYWxsb2MoIm5ldC5wYWdpbmcuYXR0ZW1wdGVkIik7CisJbmV0LT5zdGF0cy5wYWdpbmcuZGV0YWNoZWQgPSBjb3VudGVyX2FsbG9jKCJuZXQucGFnaW5nLmRldGFjaGVkIik7CisJbmV0LT5zdGF0cy5wYWdpbmcuY29tcGxldGVkID0gY291bnRlcl9hbGxvYygibmV0LnBhZ2luZy5jb21wbGV0ZWQiKTsKKwluZXQtPnN0YXRzLnBhZ2luZy5leHBpcmVkID0gY291bnRlcl9hbGxvYygibmV0LnBhZ2luZy5leHBpcmVkIik7CisJbmV0LT5zdGF0cy5zbXMuc3VibWl0dGVkID0gY291bnRlcl9hbGxvYygibmV0LnNtcy5zdWJtaXR0ZWQiKTsKKwluZXQtPnN0YXRzLnNtcy5ub19yZWNlaXZlciA9IGNvdW50ZXJfYWxsb2MoIm5ldC5zbXMubm9fcmVjZWl2ZXIiKTsKKwluZXQtPnN0YXRzLnNtcy5kZWxpdmVyZWQgPSBjb3VudGVyX2FsbG9jKCJuZXQuc21zLmRlbGl2ZXJlZCIpOworCW5ldC0+c3RhdHMuc21zLnJwX2Vycl9tZW0gPSBjb3VudGVyX2FsbG9jKCJuZXQuc21zLnJwX2Vycl9tZW0iKTsKKwluZXQtPnN0YXRzLnNtcy5ycF9lcnJfb3RoZXIgPSBjb3VudGVyX2FsbG9jKCJuZXQuc21zLnJwX2Vycl9vdGhlciIpOworCW5ldC0+c3RhdHMuY2FsbC5kaWFsbGVkID0gY291bnRlcl9hbGxvYygibmV0LmNhbGwuZGlhbGxlZCIpOworCW5ldC0+c3RhdHMuY2FsbC5hbGVydGVkID0gY291bnRlcl9hbGxvYygibmV0LmNhbGwuYWxlcnRlZCIpOworCW5ldC0+c3RhdHMuY2FsbC5jb25uZWN0ZWQgPSBjb3VudGVyX2FsbG9jKCJuZXQuY2FsbC5jb25uZWN0ZWQiKTsKKworCW5ldC0+bW5jY19yZWN2ID0gbW5jY19yZWN2OworCisJcmV0dXJuIG5ldDsKK30KKworc3RydWN0IGdzbV9idHMgKmdzbV9idHNfbnVtKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBpbnQgbnVtKQoreworCXN0cnVjdCBnc21fYnRzICpidHM7CisKKwlpZiAobnVtID49IG5ldC0+bnVtX2J0cykKKwkJcmV0dXJuIE5VTEw7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShidHMsICZuZXQtPmJ0c19saXN0LCBsaXN0KSB7CisJCWlmIChidHMtPm5yID09IG51bSkKKwkJCXJldHVybiBidHM7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIEdldCByZWZlcmVuY2UgdG8gYSBuZWlnaGJvciBjZWxsIG9uIGEgZ2l2ZW4gQkNDSCBBUkZDTiAqLworc3RydWN0IGdzbV9idHMgKmdzbV9idHNfbmVpZ2hib3IoY29uc3Qgc3RydWN0IGdzbV9idHMgKmJ0cywKKwkJCQkgdV9pbnQxNl90IGFyZmNuLCB1X2ludDhfdCBic2ljKQoreworCXN0cnVjdCBnc21fYnRzICpuZWlnaDsKKwkvKiBGSVhNRTogdXNlIHNvbWUgYmV0dGVyIGhldXJpc3RpY3MgaGVyZSB0byBkZXRlcm1pbmUgd2hpY2ggY2VsbAorCSAqIHVzaW5nIHRoaXMgQVJGQ04gcmVhbGx5IGlzIGNsb3Nlc3QgdG8gdGhlIHRhcmdldCBjZWxsLiAgRm9yCisJICogbm93IHdlIHNpbXBseSBhc3N1bWUgdGhhdCBlYWNoIEFSRkNOIHdpbGwgb25seSBiZSB1c2VkIGJ5IG9uZQorCSAqIGNlbGwgKi8KKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KG5laWdoLCAmYnRzLT5uZXR3b3JrLT5idHNfbGlzdCwgbGlzdCkgeworCQlpZiAobmVpZ2gtPmMwLT5hcmZjbiA9PSBhcmZjbiAmJgorCQkgICAgbmVpZ2gtPmJzaWMgPT0gYnNpYykKKwkJCXJldHVybiBuZWlnaDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGdzbV9idHNfdHJ4ICpnc21fYnRzX3RyeF9udW0oc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IG51bSkKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKworCWlmIChudW0gPj0gYnRzLT5udW1fdHJ4KQorCQlyZXR1cm4gTlVMTDsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyeCwgJmJ0cy0+dHJ4X2xpc3QsIGxpc3QpIHsKKwkJaWYgKHRyeC0+bnIgPT0gbnVtKQorCQkJcmV0dXJuIHRyeDsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNoYXIgdHMyc3RyWzI1NV07CisKK2NoYXIgKmdzbV90cnhfbmFtZShzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwlzbnByaW50Zih0czJzdHIsIHNpemVvZih0czJzdHIpLCAiKGJ0cz0lZCx0cng9JWQpIiwKKwkJIHRyeC0+YnRzLT5uciwgdHJ4LT5ucik7CisKKwlyZXR1cm4gdHMyc3RyOworfQorCisKK2NoYXIgKmdzbV90c19uYW1lKHN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMpCit7CisJc25wcmludGYodHMyc3RyLCBzaXplb2YodHMyc3RyKSwgIihidHM9JWQsdHJ4PSVkLHRzPSVkKSIsCisJCSB0cy0+dHJ4LT5idHMtPm5yLCB0cy0+dHJ4LT5uciwgdHMtPm5yKTsKKworCXJldHVybiB0czJzdHI7Cit9CisKK2NoYXIgKmdzbV9sY2hhbl9uYW1lKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHMgPSBsY2hhbi0+dHM7CisKKwlzbnByaW50Zih0czJzdHIsIHNpemVvZih0czJzdHIpLCAiKGJ0cz0lZCx0cng9JWQsdHM9JWQsc3M9JWQpIiwKKwkJIHRzLT50cngtPmJ0cy0+bnIsIHRzLT50cngtPm5yLCB0cy0+bnIsIGxjaGFuLT5ucik7CisKKwlyZXR1cm4gdHMyc3RyOworfQorCitzdGF0aWMgY29uc3QgY2hhciAqYnRzX3R5cGVzW10gPSB7CisJW0dTTV9CVFNfVFlQRV9VTktOT1dOXSA9ICJ1bmtub3duIiwKKwlbR1NNX0JUU19UWVBFX0JTMTFdID0gImJzMTEiLAorCVtHU01fQlRTX1RZUEVfTkFOT0JUU10gPSAibmFub2J0cyIsCit9OworCitlbnVtIGdzbV9idHNfdHlwZSBwYXJzZV9idHN0eXBlKGNvbnN0IGNoYXIgKmFyZykKK3sKKwlpbnQgaTsKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShidHNfdHlwZXMpOyBpKyspIHsKKwkJaWYgKCFzdHJjbXAoYXJnLCBidHNfdHlwZXNbaV0pKQorCQkJcmV0dXJuIGk7CisJfQkKKwlyZXR1cm4gR1NNX0JUU19UWVBFX0JTMTE7IC8qIERlZmF1bHQ6IEJTMTEgKi8KK30KKworY29uc3QgY2hhciAqYnRzdHlwZTJzdHIoZW51bSBnc21fYnRzX3R5cGUgdHlwZSkKK3sKKwlpZiAodHlwZSA+IEFSUkFZX1NJWkUoYnRzX3R5cGVzKSkKKwkJcmV0dXJuICJ1bmRlZmluZWQiOworCXJldHVybiBidHNfdHlwZXNbdHlwZV07Cit9CisKK3N0cnVjdCBnc21fYnRzX3RyeCAqZ3NtX2J0c190cnhfYnlfbnIoc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IG5yKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJ4LCAmYnRzLT50cnhfbGlzdCwgbGlzdCkgeworCQlpZiAodHJ4LT5uciA9PSBucikKKwkJCXJldHVybiB0cng7CisJfQorCXJldHVybiBOVUxMOworfQorCisvKiBTZWFyY2ggZm9yIGEgQlRTIGluIHRoZSBnaXZlbiBMb2NhdGlvbiBBcmVhOyBvcHRpb25hbGx5IHN0YXJ0IHNlYXJjaGluZworICogd2l0aCBzdGFydF9idHMgKGZvciBjb250aW51aW5nIHRvIHNlYXJjaCBhZnRlciB0aGUgZmlyc3QgcmVzdWx0KSAqLworc3RydWN0IGdzbV9idHMgKmdzbV9idHNfYnlfbGFjKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCB1bnNpZ25lZCBpbnQgbGFjLAorCQkJCXN0cnVjdCBnc21fYnRzICpzdGFydF9idHMpCit7CisJaW50IGk7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKwlpbnQgc2tpcCA9IDA7CisKKwlpZiAoc3RhcnRfYnRzKQorCQlza2lwID0gMTsKKworCWZvciAoaSA9IDA7IGkgPCBuZXQtPm51bV9idHM7IGkrKykgeworCQlidHMgPSBnc21fYnRzX251bShuZXQsIGkpOworCisJCWlmIChza2lwKSB7CisJCQlpZiAoc3RhcnRfYnRzID09IGJ0cykKKwkJCQlza2lwID0gMDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKGxhYyA9PSBHU01fTEFDX1JFU0VSVkVEX0FMTF9CVFMgfHwgYnRzLT5sb2NhdGlvbl9hcmVhX2NvZGUgPT0gbGFjKQorCQkJcmV0dXJuIGJ0czsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpnc21fYXV0aF9wb2xpY3lfbmFtZXNbXSA9IHsKKwlbR1NNX0FVVEhfUE9MSUNZX0NMT1NFRF0gPSAiY2xvc2VkIiwKKwlbR1NNX0FVVEhfUE9MSUNZX0FDQ0VQVF9BTExdID0gImFjY2VwdC1hbGwiLAorCVtHU01fQVVUSF9QT0xJQ1lfVE9LRU5dID0gInRva2VuIiwKK307CisKK2VudW0gZ3NtX2F1dGhfcG9saWN5IGdzbV9hdXRoX3BvbGljeV9wYXJzZShjb25zdCBjaGFyICphcmcpCit7CisJaW50IGk7CisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoZ3NtX2F1dGhfcG9saWN5X25hbWVzKTsgaSsrKSB7CisJCWlmICghc3RyY21wKGFyZywgZ3NtX2F1dGhfcG9saWN5X25hbWVzW2ldKSkKKwkJCXJldHVybiBpOworCX0KKwlyZXR1cm4gR1NNX0FVVEhfUE9MSUNZX0NMT1NFRDsKK30KKworY29uc3QgY2hhciAqZ3NtX2F1dGhfcG9saWN5X25hbWUoZW51bSBnc21fYXV0aF9wb2xpY3kgcG9saWN5KQoreworCWlmIChwb2xpY3kgPiBBUlJBWV9TSVpFKGdzbV9hdXRoX3BvbGljeV9uYW1lcykpCisJCXJldHVybiAidW5kZWZpbmVkIjsKKwlyZXR1cm4gZ3NtX2F1dGhfcG9saWN5X25hbWVzW3BvbGljeV07Cit9CisKKy8qIHRoaXMgc2hvdWxkIG5vdCBiZSBoZXJlIGJ1dCBpbiBnc21fMDRfMDguLi4gYnV0IHRoYXQgY3JlYXRlcworICAgaW4gdHVybiBhIGRlcGVuZGVuY3kgbmlnaHRtYXJlIChhYmlzX25tIGRlcGVuZGluZyBvbiAwNF8wOCwgLi4uKSAqLworc3RhdGljIGludCBnc200OF9jb25zdHJ1Y3RfcmEodV9pbnQ4X3QgKmJ1ZiwgY29uc3Qgc3RydWN0IGdwcnNfcmFfaWQgKnJhaWQpCit7CisJdV9pbnQxNl90IG1jYyA9IHJhaWQtPm1jYzsKKwl1X2ludDE2X3QgbW5jID0gcmFpZC0+bW5jOworCisJYnVmWzBdID0gKChtY2MgLyAxMDApICUgMTApIHwgKCgobWNjIC8gMTApICUgMTApIDw8IDQpOworCWJ1ZlsxXSA9IChtY2MgJSAxMCk7CisKKwkvKiBJIHdvbmRlciB3aG8gY2FtZSB1cCB3aXRoIHRoZSBzdHVwaWRpdHkgb2YgZW5jb2RpbmcgdGhlIE1OQworCSAqIGRpZmZlcmVudGx5IGRlcGVuZGluZyBvbiBob3cgbWFueSBkaWdpdHMgaXRzIGRlY2ltYWwgbnVtYmVyIGhhcyEgKi8KKwlpZiAobW5jIDwgMTAwKSB7CisJCWJ1ZlsxXSB8PSAweGYwOworCQlidWZbMl0gPSAoKG1uYyAvIDEwKSAlIDEwKSB8ICgobW5jICUgMTApIDw8IDQpOworCX0gZWxzZSB7CisJCWJ1ZlsxXSB8PSAobW5jICUgMTApIDw8IDQ7CisJCWJ1ZlsyXSA9ICgobW5jIC8gMTAwKSAlIDEwKSB8ICgoKG1jYyAvIDEwKSAlIDEwKSA8PCA0KTsKKwl9CisKKwkqKHVfaW50MTZfdCAqKShidWYrMykgPSBodG9ucyhyYWlkLT5sYWMpOworCisJYnVmWzVdID0gcmFpZC0+cmFjOworCisJcmV0dXJuIDY7Cit9CisKK3ZvaWQgZ3Byc19yYV9pZF9ieV9idHMoc3RydWN0IGdwcnNfcmFfaWQgKnJhaWQsIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJcmFpZC0+bWNjID0gYnRzLT5uZXR3b3JrLT5jb3VudHJ5X2NvZGU7CisJcmFpZC0+bW5jID0gYnRzLT5uZXR3b3JrLT5uZXR3b3JrX2NvZGU7CisJcmFpZC0+bGFjID0gYnRzLT5sb2NhdGlvbl9hcmVhX2NvZGU7CisJcmFpZC0+cmFjID0gYnRzLT5ncHJzLnJhYzsKK30KKworaW50IGdzbTQ4X3JhX2lkX2J5X2J0cyh1X2ludDhfdCAqYnVmLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBncHJzX3JhX2lkIHJhaWQ7CisKKwlncHJzX3JhX2lkX2J5X2J0cygmcmFpZCwgYnRzKTsKKworCXJldHVybiBnc200OF9jb25zdHJ1Y3RfcmEoYnVmLCAmcmFpZCk7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICpycmxwX21vZGVfbmFtZXNbXSA9IHsKKwlbUlJMUF9NT0RFX05PTkVdID0gIm5vbmUiLAorCVtSUkxQX01PREVfTVNfQkFTRURdID0gIm1zLWJhc2VkIiwKKwlbUlJMUF9NT0RFX01TX1BSRUZdID0gIm1zLXByZWZlcnJlZCIsCisJW1JSTFBfTU9ERV9BU1NfUFJFRl0gPSAiYXNzLXByZWZlcnJlZCIsCit9OworCitlbnVtIHJybHBfbW9kZSBycmxwX21vZGVfcGFyc2UoY29uc3QgY2hhciAqYXJnKQoreworCWludCBpOworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHJybHBfbW9kZV9uYW1lcyk7IGkrKykgeworCQlpZiAoIXN0cmNtcChhcmcsIHJybHBfbW9kZV9uYW1lc1tpXSkpCisJCQlyZXR1cm4gaTsKKwl9CisJcmV0dXJuIFJSTFBfTU9ERV9OT05FOworfQorCitjb25zdCBjaGFyICpycmxwX21vZGVfbmFtZShlbnVtIHJybHBfbW9kZSBtb2RlKQoreworCWlmIChtb2RlID4gQVJSQVlfU0laRShycmxwX21vZGVfbmFtZXMpKQorCQlyZXR1cm4gIm5vbmUiOworCXJldHVybiBycmxwX21vZGVfbmFtZXNbbW9kZV07Cit9CisKK3N0cnVjdCBnc21fbWVhc19yZXAgKmxjaGFuX25leHRfbWVhc19yZXAoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJc3RydWN0IGdzbV9tZWFzX3JlcCAqbWVhc19yZXA7CisKKwltZWFzX3JlcCA9ICZsY2hhbi0+bWVhc19yZXBbbGNoYW4tPm1lYXNfcmVwX2lkeF07CisJbWVtc2V0KG1lYXNfcmVwLCAwLCBzaXplb2YoKm1lYXNfcmVwKSk7CisJbWVhc19yZXAtPmxjaGFuID0gbGNoYW47CisJbGNoYW4tPm1lYXNfcmVwX2lkeCA9IChsY2hhbi0+bWVhc19yZXBfaWR4ICsgMSkKKwkJCQkJJSBBUlJBWV9TSVpFKGxjaGFuLT5tZWFzX3JlcCk7CisKKwlyZXR1cm4gbWVhc19yZXA7Cit9CisKK2ludCBnc21fc2V0X2J0c190eXBlKHN0cnVjdCBnc21fYnRzICpidHMsIGVudW0gZ3NtX2J0c190eXBlIHR5cGUpCit7CisJc3RydWN0IGdzbV9idHNfbW9kZWwgKm1vZGVsOworCisJbW9kZWwgPSBidHNfbW9kZWxfZmluZCh0eXBlKTsKKwlpZiAoIW1vZGVsKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWJ0cy0+dHlwZSA9IHR5cGU7CisJYnRzLT5tb2RlbCA9IG1vZGVsOworCisJc3dpdGNoIChidHMtPnR5cGUpIHsKKwljYXNlIEdTTV9CVFNfVFlQRV9OQU5PQlRTOgorCQkvKiBTZXQgdGhlIGRlZmF1bHQgT01MIFN0cmVhbSBJRCB0byAweGZmICovCisJCWJ0cy0+b21sX3RlaSA9IDB4ZmY7CisJCWJ0cy0+YzAtPm5vbWluYWxfcG93ZXIgPSAyMzsKKwkJYnJlYWs7CisJY2FzZSBHU01fQlRTX1RZUEVfQlMxMToKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9nc21fc3Vic2NyaWJlci5jIGIvb3BlbmJzYy9zcmMvZ3NtX3N1YnNjcmliZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42OTI1MDg3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3NtX3N1YnNjcmliZXIuYwpAQCAtMCwwICsxLDEzMCBAQAorLyogVGhlIGNvbmNlcHQgb2YgYSBzdWJzY3JpYmVyIGZvciB0aGUgTVNDLCByb3VnaGx5IEhMUi9WTFIgZnVuY3Rpb25hbGl0eSAqLworCisvKiAoQykgMjAwOCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RiLmg+CisKK2V4dGVybiBzdHJ1Y3QgbGxpc3RfaGVhZCAqc3Vic2NyX2JzY19hY3RpdmVfc3Vic2NyaWJlcih2b2lkKTsKKworY2hhciAqc3Vic2NyX25hbWUoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJaWYgKHN0cmxlbihzdWJzY3ItPm5hbWUpKQorCQlyZXR1cm4gc3Vic2NyLT5uYW1lOworCisJcmV0dXJuIHN1YnNjci0+aW1zaTsKK30KKworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfZ2V0X2J5X3Rtc2koc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCSAgdV9pbnQzMl90IHRtc2kpCit7CisJY2hhciB0bXNpX3N0cmluZ1sxNF07CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisKKwkvKiB3ZSBtaWdodCBoYXZlIGEgcmVjb3JkIGluIG1lbW9yeSBhbHJlYWR5ICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoc3Vic2NyLCBzdWJzY3JfYnNjX2FjdGl2ZV9zdWJzY3JpYmVyKCksIGVudHJ5KSB7CisJCWlmICh0bXNpID09IHN1YnNjci0+dG1zaSkKKwkJCXJldHVybiBzdWJzY3JfZ2V0KHN1YnNjcik7CisJfQorCisJc3ByaW50Zih0bXNpX3N0cmluZywgIiV1IiwgdG1zaSk7CisJcmV0dXJuIGRiX2dldF9zdWJzY3JpYmVyKG5ldCwgR1NNX1NVQlNDUklCRVJfVE1TSSwgdG1zaV9zdHJpbmcpOworfQorCitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcl9nZXRfYnlfaW1zaShzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJICBjb25zdCBjaGFyICppbXNpKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoc3Vic2NyLCBzdWJzY3JfYnNjX2FjdGl2ZV9zdWJzY3JpYmVyKCksIGVudHJ5KSB7CisJCWlmIChzdHJjbXAoc3Vic2NyLT5pbXNpLCBpbXNpKSA9PSAwKQorCQkJcmV0dXJuIHN1YnNjcl9nZXQoc3Vic2NyKTsKKwl9CisKKwlyZXR1cm4gZGJfZ2V0X3N1YnNjcmliZXIobmV0LCBHU01fU1VCU0NSSUJFUl9JTVNJLCBpbXNpKTsKK30KKworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfZ2V0X2J5X2V4dGVuc2lvbihzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCwKKwkJCQkJICAgICAgIGNvbnN0IGNoYXIgKmV4dCkKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1YnNjciwgc3Vic2NyX2JzY19hY3RpdmVfc3Vic2NyaWJlcigpLCBlbnRyeSkgeworCQlpZiAoc3RyY21wKHN1YnNjci0+ZXh0ZW5zaW9uLCBleHQpID09IDApCisJCQlyZXR1cm4gc3Vic2NyX2dldChzdWJzY3IpOworCX0KKworCXJldHVybiBkYl9nZXRfc3Vic2NyaWJlcihuZXQsIEdTTV9TVUJTQ1JJQkVSX0VYVEVOU0lPTiwgZXh0KTsKK30KKworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfZ2V0X2J5X2lkKHN0cnVjdCBnc21fbmV0d29yayAqbmV0LAorCQkJCQl1bnNpZ25lZCBsb25nIGxvbmcgaWQpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisJY2hhciBidWZbMzJdOworCXNwcmludGYoYnVmLCAiJWxsdSIsIGlkKTsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1YnNjciwgc3Vic2NyX2JzY19hY3RpdmVfc3Vic2NyaWJlcigpLCBlbnRyeSkgeworCQlpZiAoc3Vic2NyLT5pZCA9PSBpZCkKKwkJCXJldHVybiBzdWJzY3JfZ2V0KHN1YnNjcik7CisJfQorCisJcmV0dXJuIGRiX2dldF9zdWJzY3JpYmVyKG5ldCwgR1NNX1NVQlNDUklCRVJfSUQsIGJ1Zik7Cit9CisKKworaW50IHN1YnNjcl91cGRhdGUoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzLCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBpbnQgcmVhc29uKQoreworCS8qIEZJWE1FOiBNaWdyYXRlIHBlbmRpbmcgcmVxdWVzdHMgZnJvbSBvbmUgQlNDIHRvIGFub3RoZXIgKi8KKwlzd2l0Y2ggKHJlYXNvbikgeworCWNhc2UgR1NNX1NVQlNDUklCRVJfVVBEQVRFX0FUVEFDSEVEOgorCQlzLT5uZXQgPSBidHMtPm5ldHdvcms7CisJCS8qIEluZGljYXRlICJhdHRhY2hlZCB0byBMQUMiICovCisJCXMtPmxhYyA9IGJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlOworCQlMT0dQKERNTSwgTE9HTF9JTkZPLCAiU3Vic2NyaWJlciAlcyBBVFRBQ0hFRCBMQUM9JXVcbiIsCisJCQlzdWJzY3JfbmFtZShzKSwgcy0+bGFjKTsKKwkJZGlzcGF0Y2hfc2lnbmFsKFNTX1NVQlNDUiwgU19TVUJTQ1JfQVRUQUNIRUQsIHMpOworCQlicmVhazsKKwljYXNlIEdTTV9TVUJTQ1JJQkVSX1VQREFURV9ERVRBQ0hFRDoKKwkJLyogT25seSBkZXRhY2ggaWYgd2UgYXJlIGN1cnJlbnRseSBpbiB0aGlzIGFyZWEgKi8KKwkJaWYgKGJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlID09IHMtPmxhYykKKwkJCXMtPmxhYyA9IEdTTV9MQUNfUkVTRVJWRURfREVUQUNIRUQ7CisJCUxPR1AoRE1NLCBMT0dMX0lORk8sICJTdWJzY3JpYmVyICVzIERFVEFDSEVEXG4iLCBzdWJzY3JfbmFtZShzKSk7CisJCWRpc3BhdGNoX3NpZ25hbChTU19TVUJTQ1IsIFNfU1VCU0NSX0RFVEFDSEVELCBzKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZnByaW50ZihzdGRlcnIsICJzdWJzY3JfdXBkYXRlIHdpdGggdW5rbm93biByZWFzb246ICVkXG4iLAorCQkJcmVhc29uKTsKKwkJYnJlYWs7CisJfTsKKwlyZXR1cm4gZGJfc3luY19zdWJzY3JpYmVyKHMpOworfQorCisKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2dzbV9zdWJzY3JpYmVyX2Jhc2UuYyBiL29wZW5ic2Mvc3JjL2dzbV9zdWJzY3JpYmVyX2Jhc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZWU4OWMwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvZ3NtX3N1YnNjcmliZXJfYmFzZS5jCkBAIC0wLDAgKzEsMjEzIEBACisvKiBUaGUgY29uY2VwdCBvZiBhIHN1YnNjcmliZXIgYXMgc2VlbiBieSB0aGUgQlNDICovCisKKy8qIChDKSAyMDA4IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcGFnaW5nLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorCitMTElTVF9IRUFEKGFjdGl2ZV9zdWJzY3JpYmVycyk7Cit2b2lkICp0YWxsX3N1YnNjcl9jdHg7Cit2b2lkICp0YWxsX3N1Yl9yZXFfY3R4OworCisvKiBmb3IgdGhlIGdzbV9zdWJzY3JpYmVyLmMgKi8KK3N0cnVjdCBsbGlzdF9oZWFkICpzdWJzY3JfYnNjX2FjdGl2ZV9zdWJzY3JpYmVyKHZvaWQpCit7CisJcmV0dXJuICZhY3RpdmVfc3Vic2NyaWJlcnM7Cit9CisKKy8qCisgKiBTdHJ1Y3QgZm9yIHBlbmRpbmcgY2hhbm5lbCByZXF1ZXN0cy4gVGhpcyBpcyBtYW5hZ2VkIGluIHRoZQorICogbGxpc3RfaGVhZCByZXF1ZXN0cyBvZiBlYWNoIHN1YnNjcmliZXIuIFRoZSByZWZlcmVuY2UgY291bnRpbmcKKyAqIHNob3VsZCB3b3JrIGluIHN1Y2ggYSB3YXkgdGhhdCBhIHN1YnNjcmliZXIgd2l0aCBhIHBlbmRpbmcgcmVxdWVzdAorICogcmVtYWlucyBpbiBtZW1vcnkuCisgKi8KK3N0cnVjdCBzdWJzY3JfcmVxdWVzdCB7CisJc3RydWN0IGxsaXN0X2hlYWQgZW50cnk7CisKKwkvKiBiYWNrIHJlZmVyZW5jZSAqLworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCisJLyogdGhlIHJlcXVlc3RlZCBjaGFubmVsIHR5cGUgKi8KKwlpbnQgY2hhbm5lbF90eXBlOworCisJLyogdGhlIGNhbGxiYWNrIGRhdGEgKi8KKwlnc21fY2JmbiAqY2JmbjsKKwl2b2lkICpwYXJhbTsKK307CisKKy8qCisgKiBXZSBnb3QgdGhlIGNoYW5uZWwgYXNzaWduZWQgYW5kIGNhbiBub3cgaGFuZCB0aGlzIGNoYW5uZWwKKyAqIG92ZXIgdG8gb25lIG9mIG91ciBjYWxsYmFja3MuCisgKi8KK3N0YXRpYyBpbnQgc3Vic2NyX3BhZ2luZ19jYih1bnNpZ25lZCBpbnQgaG9va251bSwgdW5zaWduZWQgaW50IGV2ZW50LAorCQkJICAgICBzdHJ1Y3QgbXNnYiAqbXNnLCB2b2lkICpkYXRhLCB2b2lkICpwYXJhbSkKK3sKKwlzdHJ1Y3Qgc3Vic2NyX3JlcXVlc3QgKnJlcXVlc3Q7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSAoc3RydWN0IGdzbV9zdWJzY3JpYmVyICopcGFyYW07CisKKwkvKiBUaGVyZSBpcyBubyByZXF1ZXN0IGFueW1vcmUuLi4gKi8KKwlpZiAobGxpc3RfZW1wdHkoJnN1YnNjci0+cmVxdWVzdHMpKQorCQlyZXR1cm4gLTE7CisKKwkvKgorCSAqIEZJWE1FOiBXaGF0IHRvIGRvIHdpdGggcGFnaW5nIHJlcXVlc3RzIGNvbWluZyBkdXJpbmcKKwkgKiB0aGlzIGNhbGxiYWNrPyBXZSBtdXN0IGJlIHN1cmUgdG8gbm90IHN0YXJ0IHBhZ2luZyB3aGVuCisJICogd2UgaGF2ZSBhbiBhY3RpdmUgY29ubmVjdGlvbiB0byBhIHN1YnNjcmliZXIgYW5kIHRvIG1ha2UKKwkgKiB0aGUgc3Vic2NyX3B1dF9jaGFubmVsIHdvcmsgYXMgcmVxdWlyZWQuLi4KKwkgKi8KKwlyZXF1ZXN0ID0gKHN0cnVjdCBzdWJzY3JfcmVxdWVzdCAqKXN1YnNjci0+cmVxdWVzdHMubmV4dDsKKwlsbGlzdF9kZWwoJnJlcXVlc3QtPmVudHJ5KTsKKwlzdWJzY3ItPmluX2NhbGxiYWNrID0gMTsKKwlyZXF1ZXN0LT5jYmZuKGhvb2tudW0sIGV2ZW50LCBtc2csIGRhdGEsIHJlcXVlc3QtPnBhcmFtKTsKKwlzdWJzY3ItPmluX2NhbGxiYWNrID0gMDsKKworCXRhbGxvY19mcmVlKHJlcXVlc3QpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBzdWJzY3Jfc2VuZF9wYWdpbmdfcmVxdWVzdChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlzdHJ1Y3Qgc3Vic2NyX3JlcXVlc3QgKnJlcXVlc3Q7CisJaW50IHJjOworCisJYXNzZXJ0KCFsbGlzdF9lbXB0eSgmc3Vic2NyLT5yZXF1ZXN0cykpOworCisJcmVxdWVzdCA9IChzdHJ1Y3Qgc3Vic2NyX3JlcXVlc3QgKilzdWJzY3ItPnJlcXVlc3RzLm5leHQ7CisJcmMgPSBwYWdpbmdfcmVxdWVzdChzdWJzY3ItPm5ldCwgc3Vic2NyLCByZXF1ZXN0LT5jaGFubmVsX3R5cGUsCisJCQkgICAgc3Vic2NyX3BhZ2luZ19jYiwgc3Vic2NyKTsKKworCS8qIHBhZ2luZyBmYWlsZWQsIHF1aXQgbm93ICovCisJaWYgKHJjIDw9IDApIHsKKwkJc3Vic2NyX3BhZ2luZ19jYihHU01fSE9PS19SUl9QQUdJTkcsIEdTTV9QQUdJTkdfRVhQSVJFRCwKKwkJCQkgTlVMTCwgTlVMTCwgcmVxdWVzdC0+cGFyYW0pOworCX0KK30KKworc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnM7CisKKwlzID0gdGFsbG9jX3plcm8odGFsbF9zdWJzY3JfY3R4LCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIpOworCWlmICghcykKKwkJcmV0dXJuIE5VTEw7CisKKwlsbGlzdF9hZGRfdGFpbCgmcy0+ZW50cnksICZhY3RpdmVfc3Vic2NyaWJlcnMpOworCXMtPnVzZV9jb3VudCA9IDE7CisJcy0+dG1zaSA9IEdTTV9SRVNFUlZFRF9UTVNJOworCisJSU5JVF9MTElTVF9IRUFEKCZzLT5yZXF1ZXN0cyk7CisKKwlyZXR1cm4gczsKK30KKworc3RhdGljIHZvaWQgc3Vic2NyX2ZyZWUoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJbGxpc3RfZGVsKCZzdWJzY3ItPmVudHJ5KTsKKwl0YWxsb2NfZnJlZShzdWJzY3IpOworfQorCitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcl9nZXQoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJc3Vic2NyLT51c2VfY291bnQrKzsKKwlERUJVR1AoRFJFRiwgInN1YnNjciAlcyB1c2FnZSBpbmNyZWFzZXMgdXNhZ2UgdG86ICVkXG4iLAorCQkJc3Vic2NyLT5leHRlbnNpb24sIHN1YnNjci0+dXNlX2NvdW50KTsKKwlyZXR1cm4gc3Vic2NyOworfQorCitzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcl9wdXQoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IpCit7CisJc3Vic2NyLT51c2VfY291bnQtLTsKKwlERUJVR1AoRFJFRiwgInN1YnNjciAlcyB1c2FnZSBkZWNyZWFzZWQgdXNhZ2UgdG86ICVkXG4iLAorCQkJc3Vic2NyLT5leHRlbnNpb24sIHN1YnNjci0+dXNlX2NvdW50KTsKKwlpZiAoc3Vic2NyLT51c2VfY291bnQgPD0gMCkKKwkJc3Vic2NyX2ZyZWUoc3Vic2NyKTsKKwlyZXR1cm4gTlVMTDsKK30KKwordm9pZCBzdWJzY3JfZ2V0X2NoYW5uZWwoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQlpbnQgdHlwZSwgZ3NtX2NiZm4gKmNiZm4sIHZvaWQgKnBhcmFtKQoreworCXN0cnVjdCBzdWJzY3JfcmVxdWVzdCAqcmVxdWVzdDsKKworCXJlcXVlc3QgPSB0YWxsb2ModGFsbF9zdWJfcmVxX2N0eCwgc3RydWN0IHN1YnNjcl9yZXF1ZXN0KTsKKwlpZiAoIXJlcXVlc3QpIHsKKwkJaWYgKGNiZm4pCisJCQljYmZuKEdTTV9IT09LX1JSX1BBR0lORywgR1NNX1BBR0lOR19PT00sCisJCQkJTlVMTCwgTlVMTCwgcGFyYW0pOworCQlyZXR1cm47CisJfQorCisJbWVtc2V0KHJlcXVlc3QsIDAsIHNpemVvZigqcmVxdWVzdCkpOworCXJlcXVlc3QtPnN1YnNjciA9IHN1YnNjcjsKKwlyZXF1ZXN0LT5jaGFubmVsX3R5cGUgPSB0eXBlOworCXJlcXVlc3QtPmNiZm4gPSBjYmZuOworCXJlcXVlc3QtPnBhcmFtID0gcGFyYW07CisKKwkvKgorCSAqIEZJWE1FOiBXZSBtaWdodCBiZSBhYmxlIHRvIGFzc2lnbiBtb3JlIHRoYW4gb25lCisJICogY2hhbm5lbCwgZS5nLiB2b2ljZSBhbmQgU01TIHN1Ym1pdCBhdCB0aGUgc2FtZQorCSAqIHRpbWUuCisJICovCisJaWYgKCFzdWJzY3ItPmluX2NhbGxiYWNrICYmIGxsaXN0X2VtcHR5KCZzdWJzY3ItPnJlcXVlc3RzKSkgeworCQkvKiBhZGQgdG8gdGhlIGxpc3QsIHNlbmQgYSByZXF1ZXN0ICovCisJCWxsaXN0X2FkZF90YWlsKCZyZXF1ZXN0LT5lbnRyeSwgJnN1YnNjci0+cmVxdWVzdHMpOworCQlzdWJzY3Jfc2VuZF9wYWdpbmdfcmVxdWVzdChzdWJzY3IpOworCX0gZWxzZSB7CisJCS8qIHRoaXMgd2lsbCBiZSBwaWNrZWQgdXAgbGF0ZXIsIGZyb20gc3Vic2NyX3B1dF9jaGFubmVsICovCisJCWxsaXN0X2FkZF90YWlsKCZyZXF1ZXN0LT5lbnRyeSwgJnN1YnNjci0+cmVxdWVzdHMpOworCX0KK30KKwordm9pZCBzdWJzY3JfcHV0X2NoYW5uZWwoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4pCit7CisJLyoKKwkgKiBGSVhNRTogQ29udGludWUgd2l0aCBvdGhlciByZXF1ZXN0cyBub3cuLi4gYnkgY2hlY2tpbmcKKwkgKiB0aGUgZ3NtX3N1YnNjcmliZXIgaW5zaWRlIHRoZSBnc21fbGNoYW4uIERyb3AgdGhlIHJlZiBjb3VudAorCSAqIG9mIHRoZSBsY2hhbiBhZnRlciBoYXZpbmcgYXNrZWQgdGhlIG5leHQgcmVxdWVzdGVlIHRvIGhhbmRsZQorCSAqIHRoZSBjaGFubmVsLgorCSAqLworCS8qCisJICogRklYTUU6IGlzIHRoZSBsY2hhbiBpcyBvZiBhIGRpZmZlcmVudCB0eXBlIHdlIGNvdWxkIHN0aWxsCisJICogaXNzdWUgYW4gaW1tZWRpYXRlIGFzc2lnbm1lbnQgZm9yIGFub3RoZXIgY2hhbm5lbCBhbmQgdGhlbgorCSAqIGNsb3NlIHRoaXMgb25lLgorCSAqLworCS8qCisJICogQ3VycmVudGx5IHdlIHdpbGwgZHJvcCB0aGUgbGFzdCByZWYgb2YgdGhlIGxjaGFuIHdoaWNoCisJICogd2lsbCByZXN1bHQgaW4gYSBjaGFubmVsIHJlbGVhc2Ugb24gUlNMIGFuZCB3ZSB3aWxsIHN0YXJ0CisJICogdGhlIHBhZ2luZy4gVGhpcyBzaG91bGQgd29yayBtb3N0IG9mIHRoZSB0aW1lIGFzIHRoZSBNUworCSAqIHdpbGwgbGlzdGVuIHRvIHRoZSBwYWdpbmcgcmVxdWVzdHMgYmVmb3JlIHdlIHRpbWVvdXQKKwkgKi8KKworCXB1dF9sY2hhbihsY2hhbik7CisKKwlpZiAobGNoYW4tPnN1YnNjciAmJiAhbGxpc3RfZW1wdHkoJmxjaGFuLT5zdWJzY3ItPnJlcXVlc3RzKSkKKwkJc3Vic2NyX3NlbmRfcGFnaW5nX3JlcXVlc3QobGNoYW4tPnN1YnNjcik7Cit9CisKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2hhbmRvdmVyX2RlY2lzaW9uLmMgYi9vcGVuYnNjL3NyYy9oYW5kb3Zlcl9kZWNpc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVmYWZjYTYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9oYW5kb3Zlcl9kZWNpc2lvbi5jCkBAIC0wLDAgKzEsMjk4IEBACisvKiBIYW5kb3ZlciBEZWNpc2lvbiBtYWtpbmcgZm9yIEludGVyLUJUUyAoSW50cmEtQlNDKSBIYW5kb3Zlci4gIFRoaXMKKyAqIG9ubHkgaW1wbGVtZW50cyB0aGUgaGFuZG92ZXIgYWxnb3JpdGhtL2RlY2lzaW9uLCBidXQgbm90IGV4ZWN1dGlvbgorICogb2YgaXQgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21lYXNfcmVwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zaWduYWwuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2hhbmRvdmVyLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtX3V0aWxzLmg+CisKKy8qIGlzc3VlIGhhbmRvdmVyIHRvIGEgY2VsbCBpZGVudGlmaWVkIGJ5IEFSRkNOIGFuZCBCU0lDICovCitzdGF0aWMgaW50IGhhbmRvdmVyX3RvX2FyZmNuX2JzaWMoc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sCisJCQkJICB1X2ludDE2X3QgYXJmY24sIHVfaW50OF90IGJzaWMpCit7CisJc3RydWN0IGdzbV9idHMgKm5ld19idHM7CisKKwkvKiByZXNvbHZlIHRoZSBnc21fYnRzIHN0cnVjdHVyZSBmb3IgdGhlIGJlc3QgbmVpZ2hib3IgKi8KKwluZXdfYnRzID0gZ3NtX2J0c19uZWlnaGJvcihsY2hhbi0+dHMtPnRyeC0+YnRzLCBhcmZjbiwgYnNpYyk7CisJaWYgKCFuZXdfYnRzKSB7CisJCUxPR1AoREhPLCBMT0dMX05PVElDRSwgInVuYWJsZSB0byBkZXRlcm1pbmUgbmVpZ2hib3IgQlRTICIKKwkJICAgICAiZm9yIEFSRkNOICV1IEJTSUMgJXUgPyE/XG4iLCBhcmZjbiwgYnNpYyk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIGFuZCBhY3R1YWxseSB0cnkgdG8gaGFuZG92ZXIgdG8gdGhhdCBjZWxsICovCisJcmV0dXJuIGJzY19oYW5kb3Zlcl9zdGFydChsY2hhbiwgbmV3X2J0cyk7Cit9CisKKy8qIGRpZCB3ZSBnZXQgYSBSWExFViBmb3IgYSBnaXZlbiBjZWxsIGluIHRoZSBnaXZlbiByZXBvcnQ/ICovCitzdGF0aWMgaW50IHJ4bGV2X2Zvcl9jZWxsX2luX3JlcChzdHJ1Y3QgZ3NtX21lYXNfcmVwICptciwKKwkJCQkgdV9pbnQxNl90IGFyZmNuLCB1X2ludDhfdCBic2ljKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG1yLT5udW1fY2VsbDsgaSsrKSB7CisJCXN0cnVjdCBnc21fbWVhc19yZXBfY2VsbCAqbXJjID0gJm1yLT5jZWxsW2ldOworCisJCS8qIHNlYXJjaCBmb3IgbWF0Y2hpbmcgcmVwb3J0ICovCisJCWlmICghKG1yYy0+YXJmY24gPT0gYXJmY24gJiYgbXJjLT5ic2ljID09IGJzaWMpKQorCQkJY29udGludWU7CisKKwkJbXJjLT5mbGFncyB8PSBNUkNfRl9QUk9DRVNTRUQ7CisJCXJldHVybiBtcmMtPnJ4bGV2OworCX0KKwlyZXR1cm4gLUVOT0RFVjsKK30KKworLyogb2J0YWluIGF2ZXJhZ2VkIHJ4bGV2IGZvciBnaXZlbiBuZWlnaGJvciAqLworc3RhdGljIGludCBuZWlnaF9tZWFzX2F2ZyhzdHJ1Y3QgbmVpZ2hfbWVhc19wcm9jICpubXAsIGludCB3aW5kb3cpCit7CisJdW5zaWduZWQgaW50IGksIGlkeDsKKwlpbnQgYXZnID0gMDsKKworCWlkeCA9IGNhbGNfaW5pdGlhbF9pZHgoQVJSQVlfU0laRShubXAtPnJ4bGV2KSwKKwkJCQlubXAtPnJ4bGV2X2NudCAlIEFSUkFZX1NJWkUobm1wLT5yeGxldiksCisJCQkJd2luZG93KTsKKworCWZvciAoaSA9IDA7IGkgPCB3aW5kb3c7IGkrKykgeworCQlpbnQgaiA9IChpZHgraSkgJSBBUlJBWV9TSVpFKG5tcC0+cnhsZXYpOworCisJCWF2ZyArPSBubXAtPnJ4bGV2W2pdOworCX0KKworCXJldHVybiBhdmcgLyB3aW5kb3c7Cit9CisKKy8qIGZpbmQgZW1wdHkgb3IgZXZpY3QgYmFkIG5laWdoYm9yICovCitzdGF0aWMgc3RydWN0IG5laWdoX21lYXNfcHJvYyAqZmluZF9ldmljdF9uZWlnaChzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbikKK3sKKwlpbnQgaiwgd29yc3QgPSA5OTk5OTk7CisJc3RydWN0IG5laWdoX21lYXNfcHJvYyAqbm1wX3dvcnN0OworCisJLyogZmlyc3QgdHJ5IHRvIGZpbmQgYW4gZW1wdHkvdW51c2VkIHNsb3QgKi8KKwlmb3IgKGogPSAwOyBqIDwgQVJSQVlfU0laRShsY2hhbi0+bmVpZ2hfbWVhcyk7IGorKykgeworCQlzdHJ1Y3QgbmVpZ2hfbWVhc19wcm9jICpubXAgPSAmbGNoYW4tPm5laWdoX21lYXNbal07CisJCWlmICghbm1wLT5hcmZjbikKKwkJCXJldHVybiBubXA7CisJfQorCisJLyogbm8gZW1wdHkgc2xvdCBmb3VuZC4gZXZpY3Qgd29yc3QgbmVpZ2hib3IgZnJvbSBsaXN0ICovCisJZm9yIChqID0gMDsgaiA8IEFSUkFZX1NJWkUobGNoYW4tPm5laWdoX21lYXMpOyBqKyspIHsKKwkJc3RydWN0IG5laWdoX21lYXNfcHJvYyAqbm1wID0gJmxjaGFuLT5uZWlnaF9tZWFzW2pdOworCQlpbnQgYXZnID0gbmVpZ2hfbWVhc19hdmcobm1wLCBNQVhfV0lOX05FSUdIX0FWRyk7CisJCWlmIChhdmcgPCB3b3JzdCkgeworCQkJd29yc3QgPSBhdmc7CisJCQlubXBfd29yc3QgPSBubXA7CisJCX0KKwl9CisKKwlyZXR1cm4gbm1wX3dvcnN0OworfQorCisvKiBwcm9jZXNzIG5laWdoYm9yIGNlbGwgbWVhc3VyZW1lbnQgcmVwb3J0cyAqLworc3RhdGljIHZvaWQgcHJvY2Vzc19tZWFzX25laWdoKHN0cnVjdCBnc21fbWVhc19yZXAgKm1yKQoreworCWludCBpLCBqLCBpZHg7CisKKwkvKiBmb3IgZWFjaCByZXBvcnRlZCBjZWxsLCB0cnkgdG8gdXBkYXRlIGdsb2JhbCBzdGF0ZSAqLworCWZvciAoaiA9IDA7IGogPCBBUlJBWV9TSVpFKG1yLT5sY2hhbi0+bmVpZ2hfbWVhcyk7IGorKykgeworCQlzdHJ1Y3QgbmVpZ2hfbWVhc19wcm9jICpubXAgPSAmbXItPmxjaGFuLT5uZWlnaF9tZWFzW2pdOworCQl1bnNpZ25lZCBpbnQgaWR4OworCQlpbnQgcnhsZXY7CisKKwkJLyogc2tpcCB1bnVzZWQgZW50cmllcyAqLworCQlpZiAoIW5tcC0+YXJmY24pCisJCQljb250aW51ZTsKKworCQlyeGxldiA9IHJ4bGV2X2Zvcl9jZWxsX2luX3JlcChtciwgbm1wLT5hcmZjbiwgbm1wLT5ic2ljKTsKKwkJaWR4ID0gbm1wLT5yeGxldl9jbnQgJSBBUlJBWV9TSVpFKG5tcC0+cnhsZXYpOworCQlpZiAocnhsZXYgPj0gMCkgeworCQkJbm1wLT5yeGxldltpZHhdID0gcnhsZXY7CisJCQlubXAtPmxhc3Rfc2Vlbl9uciA9IG1yLT5ucjsKKwkJfSBlbHNlCisJCQlubXAtPnJ4bGV2W2lkeF0gPSAwOworCQlubXAtPnJ4bGV2X2NudCsrOworCX0KKworCS8qIGl0ZXJhdGUgb3ZlciBsaXN0IG9mIHJlcG9ydGVkIGNlbGxzLCBjaGVjayBpZiB3ZSBkaWQgbm90CisJICogcHJvY2VzcyBhbGwgb2YgdGhlbSAqLworCWZvciAoaSA9IDA7IGkgPCBtci0+bnVtX2NlbGw7IGkrKykgeworCQlzdHJ1Y3QgZ3NtX21lYXNfcmVwX2NlbGwgKm1yYyA9ICZtci0+Y2VsbFtpXTsKKwkJc3RydWN0IG5laWdoX21lYXNfcHJvYyAqbm1wOworCisJCWlmIChtcmMtPmZsYWdzICYgTVJDX0ZfUFJPQ0VTU0VEKQorCQkJY29udGludWU7CisKKwkJbm1wID0gZmluZF9ldmljdF9uZWlnaChtci0+bGNoYW4pOworCisJCW5tcC0+YXJmY24gPSBtcmMtPmFyZmNuOworCQlubXAtPmJzaWMgPSBtcmMtPmJzaWM7CisKKwkJaWR4ID0gbm1wLT5yeGxldl9jbnQgJSBBUlJBWV9TSVpFKG5tcC0+cnhsZXYpOworCQlubXAtPnJ4bGV2W2lkeF0gPSBtcmMtPnJ4bGV2OworCQlubXAtPnJ4bGV2X2NudCsrOworCQlubXAtPmxhc3Rfc2Vlbl9uciA9IG1yLT5ucjsKKworCQltcmMtPmZsYWdzIHw9IE1SQ19GX1BST0NFU1NFRDsKKwl9Cit9CisKKy8qIGF0dGVtcHQgdG8gZG8gYSBoYW5kb3ZlciAqLworc3RhdGljIGludCBhdHRlbXB0X2hhbmRvdmVyKHN0cnVjdCBnc21fbWVhc19yZXAgKm1yKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gbXItPmxjaGFuLT50cy0+dHJ4LT5idHMtPm5ldHdvcms7CisJc3RydWN0IG5laWdoX21lYXNfcHJvYyAqYmVzdF9jZWxsID0gTlVMTDsKKwl1bnNpZ25lZCBpbnQgYmVzdF9iZXR0ZXJfZGIgPSAwOworCWludCBpLCByYzsKKworCS8qIGZpbmQgdGhlIGJlc3QgY2VsbCBpbiB0aGlzIHJlcG9ydCB0aGF0IGlzIGF0IGxlYXN0IFJYTEVWX0hZU1QKKwkgKiBiZXR0ZXIgdGhhbiB0aGUgY3VycmVudCBzZXJ2aW5nIGNlbGwgKi8KKworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKG1yLT5sY2hhbi0+bmVpZ2hfbWVhcyk7IGkrKykgeworCQlzdHJ1Y3QgbmVpZ2hfbWVhc19wcm9jICpubXAgPSAmbXItPmxjaGFuLT5uZWlnaF9tZWFzW2ldOworCQlpbnQgYXZnLCBiZXR0ZXI7CisKKwkJLyogc2tpcCBlbXB0eSBzbG90cyAqLworCQlpZiAobm1wLT5hcmZjbiA9PSAwKQorCQkJY29udGludWU7CisKKwkJLyogY2FjdWxhdGUgYXZlcmFnZSByeGxldiBmb3IgdGhpcyBjZWxsIG92ZXIgdGhlIHdpbmRvdyAqLworCQlhdmcgPSBuZWlnaF9tZWFzX2F2ZyhubXAsIG5ldC0+aGFuZG92ZXIud2luX3J4bGV2X2F2Z19uZWlnaCk7CisKKwkJLyogY2hlY2sgaWYgaHlzdGVyZXNpcyBpcyBmdWxmaWxsZWQgKi8KKwkJaWYgKGF2ZyA8IG1yLT5kbC5mdWxsLnJ4X2xldiArIG5ldC0+aGFuZG92ZXIucHdyX2h5c3RlcmVzaXMpCisJCQljb250aW51ZTsKKworCQliZXR0ZXIgPSBhdmcgLSBtci0+ZGwuZnVsbC5yeF9sZXY7CisJCWlmIChiZXR0ZXIgPiBiZXN0X2JldHRlcl9kYikgeworCQkJYmVzdF9jZWxsID0gbm1wOworCQkJYmVzdF9iZXR0ZXJfZGIgPSBiZXR0ZXI7CisJCX0KKwl9CisKKwlpZiAoIWJlc3RfY2VsbCkKKwkJcmV0dXJuIDA7CisKKwlMT0dQKERITywgTE9HTF9JTkZPLCAiJXM6IENlbGwgb24gQVJGQ04gJXUgaXMgYmV0dGVyOiAiLAorCQlnc21fdHNfbmFtZShtci0+bGNoYW4tPnRzKSwgYmVzdF9jZWxsLT5hcmZjbik7CisJaWYgKCFuZXQtPmhhbmRvdmVyLmFjdGl2ZSkgeworCQlMT0dQQyhESE8sIExPR0xfSU5GTywgIlNraXBwaW5nLCBIYW5kb3ZlciBkaXNhYmxlZFxuIik7CisJCXJldHVybiAwOworCX0KKworCXJjID0gaGFuZG92ZXJfdG9fYXJmY25fYnNpYyhtci0+bGNoYW4sIGJlc3RfY2VsbC0+YXJmY24sIGJlc3RfY2VsbC0+YnNpYyk7CisJc3dpdGNoIChyYykgeworCWNhc2UgMDoKKwkJTE9HUEMoREhPLCBMT0dMX0lORk8sICJTdGFydGluZyBoYW5kb3ZlclxuIik7CisJCWJyZWFrOworCWNhc2UgLUVOT1NQQzoKKwkJTE9HUEMoREhPLCBMT0dMX0lORk8sICJObyBjaGFubmVsIGF2YWlsYWJsZVxuIik7CisJCWJyZWFrOworCWNhc2UgLUVCVVNZOgorCQlMT0dQQyhESE8sIExPR0xfSU5GTywgIkhhbmRvdmVyIGFscmVhZHkgYWN0aXZlXG4iKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUEMoREhPLCBMT0dMX0VSUk9SLCAiVW5rbm93biBlcnJvclxuIik7CisJfQorCXJldHVybiByYzsKK30KKworLyogcHJvY2VzcyBhbiBhbHJlYWR5IHBhcnNlZCBtZWFzdXJlbWVudCByZXBvcnQgYW5kIGRlY2lkZSBpZiB3ZSB3YW50IHRvCisgKiBhdHRlbXB0IGEgaGFuZG92ZXIgKi8KK3N0YXRpYyBpbnQgcHJvY2Vzc19tZWFzX3JlcChzdHJ1Y3QgZ3NtX21lYXNfcmVwICptcikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IG1yLT5sY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrOworCWludCBhdl9yeGxldjsKKworCS8qIHdlIGN1cnJlbnRseSBvbmx5IGRvIGhhbmRvdmVyIGZvciBUQ0ggY2hhbm5lbHMgKi8KKwlzd2l0Y2ggKG1yLT5sY2hhbi0+dHlwZSkgeworCWNhc2UgR1NNX0xDSEFOX1RDSF9GOgorCWNhc2UgR1NNX0xDSEFOX1RDSF9IOgorCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gMDsKKwl9CisKKwkvKiBwYXJzZSBhY3R1YWwgbmVpZ2hib3IgY2VsbCBpbmZvICovCisJaWYgKG1yLT5udW1fY2VsbCA+IDAgJiYgbXItPm51bV9jZWxsIDwgNykKKwkJcHJvY2Vzc19tZWFzX25laWdoKG1yKTsKKworCWF2X3J4bGV2ID0gZ2V0X21lYXNfcmVwX2F2Zyhtci0+bGNoYW4sIE1FQVNfUkVQX0RMX1JYTEVWX0ZVTEwsCisJCQkJICAgIG5ldC0+aGFuZG92ZXIud2luX3J4bGV2X2F2Zyk7CisKKwkvKiBJbnRlcmZlcmVuY2UgSE8gKi8KKwlpZiAocnhsZXYyZGJtKGF2X3J4bGV2KSA+IC04NSAmJgorCSAgICBtZWFzX3JlcF9uX291dF9vZl9tX2JlKG1yLT5sY2hhbiwgTUVBU19SRVBfRExfUlhRVUFMX0ZVTEwsCisJCQkJICAgMywgNCwgNSkpCisJCXJldHVybiBhdHRlbXB0X2hhbmRvdmVyKG1yKTsKKworCS8qIEJhZCBRdWFsaXR5ICovCisJaWYgKG1lYXNfcmVwX25fb3V0X29mX21fYmUobXItPmxjaGFuLCBNRUFTX1JFUF9ETF9SWFFVQUxfRlVMTCwKKwkJCQkgICAzLCA0LCA1KSkKKwkJcmV0dXJuIGF0dGVtcHRfaGFuZG92ZXIobXIpOworCisJLyogTG93IExldmVsICovCisJaWYgKHJ4bGV2MmRibShhdl9yeGxldikgPD0gLTExMCkKKwkJcmV0dXJuIGF0dGVtcHRfaGFuZG92ZXIobXIpOworCisJLyogRGlzdGFuY2UgKi8KKwlpZiAobXItPm1zX2wxLnRhID4gbmV0LT5oYW5kb3Zlci5tYXhfZGlzdGFuY2UpCisJCXJldHVybiBhdHRlbXB0X2hhbmRvdmVyKG1yKTsKKworCS8qIFBvd2VyIEJ1ZGdldCBBS0EgQmV0dGVyIENlbGwgKi8KKwlpZiAoKG1yLT5uciAlIG5ldC0+aGFuZG92ZXIucHdyX2ludGVydmFsKSA9PSAwKQorCQlyZXR1cm4gYXR0ZW1wdF9oYW5kb3Zlcihtcik7CisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgaW50IGhvX2RlY19zaWdfY2IodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJCSAgIHZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpCit7CisJc3RydWN0IGdzbV9tZWFzX3JlcCAqbXI7CisKKwlpZiAoc3Vic3lzICE9IFNTX0xDSEFOKQorCQlyZXR1cm4gMDsKKworCXN3aXRjaCAoc2lnbmFsKSB7CisJY2FzZSBTX0xDSEFOX01FQVNfUkVQOgorCQltciA9IHNpZ25hbF9kYXRhOworCQlwcm9jZXNzX21lYXNfcmVwKG1yKTsKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgb25fZHNvX2xvYWRfaG9fZGVjKHZvaWQpCit7CisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfTENIQU4sIGhvX2RlY19zaWdfY2IsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvaGFuZG92ZXJfbG9naWMuYyBiL29wZW5ic2Mvc3JjL2hhbmRvdmVyX2xvZ2ljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmQ0YzU2MwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2hhbmRvdmVyX2xvZ2ljLmMKQEAgLTAsMCArMSwzNzYgQEAKKy8qIEhhbmRvdmVyIExvZ2ljIGZvciBJbnRlci1CVFMgKEludHJhLUJTQykgSGFuZG92ZXIuICBUaGlzIGRvZXMgbm90CisgKiBhY3R1YWxseSBpbXBsZW1lbnQgdGhlIGhhbmRvdmVyIGFsZ29yaXRobS9kZWNpc2lvbiwgYnV0IGV4ZWN1dGVzIGEKKyAqIGhhbmRvdmVyIGRlY2lzaW9uICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2dzbV91dGlscy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2NoYW5fYWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhbnNhY3Rpb24uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3J0cF9wcm94eS5oPgorCitzdHJ1Y3QgYnNjX2hhbmRvdmVyIHsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCisJc3RydWN0IGdzbV9sY2hhbiAqb2xkX2xjaGFuOworCXN0cnVjdCBnc21fbGNoYW4gKm5ld19sY2hhbjsKKworCXN0cnVjdCB0aW1lcl9saXN0IFQzMTAzOworCisJdV9pbnQ4X3QgaG9fcmVmOworfTsKKworc3RhdGljIExMSVNUX0hFQUQoYnNjX2hhbmRvdmVycyk7CisKK3N0YXRpYyBzdHJ1Y3QgYnNjX2hhbmRvdmVyICpic2NfaG9fYnlfbmV3X2xjaGFuKHN0cnVjdCBnc21fbGNoYW4gKm5ld19sY2hhbikKK3sKKwlzdHJ1Y3QgYnNjX2hhbmRvdmVyICpobzsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGhvLCAmYnNjX2hhbmRvdmVycywgbGlzdCkgeworCQlpZiAoaG8tPm5ld19sY2hhbiA9PSBuZXdfbGNoYW4pCisJCQlyZXR1cm4gaG87CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnNjX2hhbmRvdmVyICpic2NfaG9fYnlfb2xkX2xjaGFuKHN0cnVjdCBnc21fbGNoYW4gKm9sZF9sY2hhbikKK3sKKwlzdHJ1Y3QgYnNjX2hhbmRvdmVyICpobzsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGhvLCAmYnNjX2hhbmRvdmVycywgbGlzdCkgeworCQlpZiAoaG8tPm9sZF9sY2hhbiA9PSBvbGRfbGNoYW4pCisJCQlyZXR1cm4gaG87CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIEhhbmQgb3ZlciB0aGUgc3BlY2lmaWVkIGxvZ2ljYWwgY2hhbm5lbCB0byB0aGUgc3BlY2lmaWVkIG5ldyBCVFMuCisgKiBUaGlzIGlzIHRoZSBtYWluIGVudHJ5IHBvaW50IGZvciB0aGUgYWN0dWFsIGhhbmRvdmVyIGFsZ29yaXRobSwKKyAqIGFmdGVyIGl0IGhhcyBkZWNpZGVkIGl0IHdhbnRzIHRvIGluaXRpYXRlIEhPIHRvIGEgc3BlY2lmaWMgQlRTICovCitpbnQgYnNjX2hhbmRvdmVyX3N0YXJ0KHN0cnVjdCBnc21fbGNoYW4gKm9sZF9sY2hhbiwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpuZXdfbGNoYW47CisJc3RydWN0IGJzY19oYW5kb3ZlciAqaG87CisJc3RhdGljIHVfaW50OF90IGhvX3JlZjsKKwlpbnQgcmM7CisKKwkvKiBkb24ndCBhdHRlbXB0IG11bHRpcGxlIGhhbmRvdmVycyBmb3IgdGhlIHNhbWUgbGNoYW4gYXQKKwkgKiB0aGUgc2FtZSB0aW1lICovCisJaWYgKGJzY19ob19ieV9vbGRfbGNoYW4ob2xkX2xjaGFuKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCURFQlVHUChESE8sICIob2xkX2xjaGFuIG9uIEJUUyAldSwgbmV3IEJUUyAldSlcbiIsCisJCW9sZF9sY2hhbi0+dHMtPnRyeC0+YnRzLT5uciwgYnRzLT5ucik7CisKKwljb3VudGVyX2luYyhidHMtPm5ldHdvcmstPnN0YXRzLmhhbmRvdmVyLmF0dGVtcHRlZCk7CisKKwluZXdfbGNoYW4gPSBsY2hhbl9hbGxvYyhidHMsIG9sZF9sY2hhbi0+dHlwZSk7CisJaWYgKCFuZXdfbGNoYW4pIHsKKwkJTE9HUChESE8sIExPR0xfTk9USUNFLCAiTm8gZnJlZSBjaGFubmVsXG4iKTsKKwkJY291bnRlcl9pbmMoYnRzLT5uZXR3b3JrLT5zdGF0cy5oYW5kb3Zlci5ub19jaGFubmVsKTsKKwkJcmV0dXJuIC1FTk9TUEM7CisJfQorCisJaG8gPSB0YWxsb2NfemVybyhOVUxMLCBzdHJ1Y3QgYnNjX2hhbmRvdmVyKTsKKwlpZiAoIWhvKSB7CisJCUxPR1AoREhPLCBMT0dMX0ZBVEFMLCAiT3V0IG9mIE1lbW9yeVxuIik7CisJCWxjaGFuX2ZyZWUobmV3X2xjaGFuKTsKKwkJcmV0dXJuIC1FTk9NRU07CisJfQorCWhvLT5vbGRfbGNoYW4gPSBvbGRfbGNoYW47CisJaG8tPm5ld19sY2hhbiA9IG5ld19sY2hhbjsKKwloby0+aG9fcmVmID0gaG9fcmVmKys7CisKKwkvKiBjb3B5IHNvbWUgcGFyYW1ldGVycyBmcm9tIG9sZCBsY2hhbiAqLworCW1lbWNweSgmbmV3X2xjaGFuLT5lbmNyLCAmb2xkX2xjaGFuLT5lbmNyLCBzaXplb2YobmV3X2xjaGFuLT5lbmNyKSk7CisJbmV3X2xjaGFuLT5tc19wb3dlciA9IG9sZF9sY2hhbi0+bXNfcG93ZXI7CisJbmV3X2xjaGFuLT5ic19wb3dlciA9IG9sZF9sY2hhbi0+YnNfcG93ZXI7CisJbmV3X2xjaGFuLT5yc2xfY21vZGUgPSBvbGRfbGNoYW4tPnJzbF9jbW9kZTsKKwluZXdfbGNoYW4tPnRjaF9tb2RlID0gb2xkX2xjaGFuLT50Y2hfbW9kZTsKKwluZXdfbGNoYW4tPnN1YnNjciA9IHN1YnNjcl9nZXQob2xkX2xjaGFuLT5zdWJzY3IpOworCisJLyogRklYTUU6IGRvIHdlIGhhdmUgYSBiZXR0ZXIgaWRlYSBvZiB0aGUgdGltaW5nIGFkdmFuY2U/ICovCisJcmMgPSByc2xfY2hhbl9hY3RpdmF0ZV9sY2hhbihuZXdfbGNoYW4sIFJTTF9BQ1RfSU5URVJfQVNZTkMsIDAsCisJCQkJICAgICBoby0+aG9fcmVmKTsKKwlpZiAocmMgPCAwKSB7CisJCUxPR1AoREhPLCBMT0dMX0VSUk9SLCAiY291bGQgbm90IGFjdGl2YXRlIGNoYW5uZWxcbiIpOworCQl0YWxsb2NfZnJlZShobyk7CisJCWxjaGFuX2ZyZWUobmV3X2xjaGFuKTsKKwkJcmV0dXJuIHJjOworCX0KKworCWxsaXN0X2FkZCgmaG8tPmxpc3QsICZic2NfaGFuZG92ZXJzKTsKKwkvKiB3ZSBjb250aW51ZSBpbiB0aGUgU1NfTENIQU4gaGFuZGxlciAvIGhvX2NoYW5fYWN0aXZfYWNrICovCisKKwlyZXR1cm4gMDsKK30KKworLyogVDMxMDMgZXhwaXJlZDogSGFuZG92ZXIgaGFzIGZhaWxlZCB3aXRob3V0IEhPIENPTVBMRVRFIG9yIEhPIEZBSUwgKi8KK3N0YXRpYyB2b2lkIGhvX1QzMTAzX2NiKHZvaWQgKl9obykKK3sKKwlzdHJ1Y3QgYnNjX2hhbmRvdmVyICpobyA9IF9obzsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGhvLT5uZXdfbGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yazsKKworCURFQlVHUChESE8sICJITyBUMzEwMyBleHBpcmVkXG4iKTsKKwljb3VudGVyX2luYyhuZXQtPnN0YXRzLmhhbmRvdmVyLnRpbWVvdXQpOworCisJbGNoYW5fZnJlZShoby0+bmV3X2xjaGFuKTsKKwlsbGlzdF9kZWwoJmhvLT5saXN0KTsKKwl0YWxsb2NfZnJlZShobyk7Cit9CisKKy8qIFJTTCBoYXMgYWNrbm93bGVkZ2VkIGFjdGl2YXRpb24gb2YgdGhlIG5ldyBsY2hhbiAqLworc3RhdGljIGludCBob19jaGFuX2FjdGl2X2FjayhzdHJ1Y3QgZ3NtX2xjaGFuICpuZXdfbGNoYW4pCit7CisJc3RydWN0IGJzY19oYW5kb3ZlciAqaG87CisJaW50IHJjOworCisJLyogd2UgbmVlZCB0byBjaGVjayBpZiB0aGlzIGNoYW5uZWwgYWN0aXZhdGlvbiBpcyByZWxhdGVkIHRvCisJICogYSBoYW5kb3ZlciBhdCBhbGwgKGFuZCBpZiwgd2hpY2ggcGFydGljdWxhciBoYW5kb3ZlcikgKi8KKwlobyA9IGJzY19ob19ieV9uZXdfbGNoYW4obmV3X2xjaGFuKTsKKwlpZiAoIWhvKQorCQlyZXR1cm4gLUVOT0RFVjsKKworCURFQlVHUChESE8sICJoYW5kb3ZlciBhY3RpdmF0ZSBhY2ssIHNlbmQgSE8gQ29tbWFuZFxuIik7CisKKwkvKiB3ZSBjYW4gbm93IHNlbmQgdGhlIDA0LjA4IEhBTkRPVkVSIENPTU1BTkQgdG8gdGhlIE1TCisJICogdXNpbmcgdGhlIG9sZCBsY2hhbiAqLworCisJcmMgPSBnc200OF9zZW5kX2hvX2NtZChoby0+b2xkX2xjaGFuLCBuZXdfbGNoYW4sIDAsIGhvLT5ob19yZWYpOworCisJLyogc3RhcnQgVDMxMDMuICBXZSBjYW4gY29udGludWUgZWl0aGVyIHdpdGggVDMxMDMgZXhwaXJhdGlvbiwKKwkgKiAwNC4wOCBIQU5ET1ZFUiBDT01QTEVURSBvciAwNC4wOCBIQU5ET1ZFUiBGQUlMICovCisJaG8tPlQzMTAzLmNiID0gaG9fVDMxMDNfY2I7CisJaG8tPlQzMTAzLmRhdGEgPSBobzsKKwlic2Nfc2NoZWR1bGVfdGltZXIoJmhvLT5UMzEwMywgMTAsIDApOworCisJLyogY3JlYXRlIGEgUlRQIGNvbm5lY3Rpb24gKi8KKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKG5ld19sY2hhbi0+dHMtPnRyeC0+YnRzKSkKKwkJcnNsX2lwYWNjX2NyY3gobmV3X2xjaGFuKTsKKworCXJldHVybiAwOworfQorCisvKiBSU0wgaGFzIG5vdCBhY2tub3dsZWRnZWQgYWN0aXZhdGlvbiBvZiB0aGUgbmV3IGxjaGFuICovCitzdGF0aWMgaW50IGhvX2NoYW5fYWN0aXZfbmFjayhzdHJ1Y3QgZ3NtX2xjaGFuICpuZXdfbGNoYW4pCit7CisJc3RydWN0IGJzY19oYW5kb3ZlciAqaG87CisKKwlobyA9IGJzY19ob19ieV9uZXdfbGNoYW4obmV3X2xjaGFuKTsKKwlpZiAoIWhvKSB7CisJCUxPR1AoREhPLCBMT0dMX0VSUk9SLCAidW5hYmxlIHRvIGZpbmQgSE8gcmVjb3JkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJbGxpc3RfZGVsKCZoby0+bGlzdCk7CisJdGFsbG9jX2ZyZWUoaG8pOworCisJLyogRklYTUU6IG1heWJlIHdlIHNob3VsZCB0cnkgdG8gYWxsb2NhdGUgYSBuZXcgTENIQU4gaGVyZT8gKi8KKworCXJldHVybiAwOworfQorCisvKiBHU00gMDQuMDggSEFORE9WRVIgQ09NUExFVEUgaGFzIGJlZW4gcmVjZWl2ZWQgb24gbmV3IGNoYW5uZWwgKi8KK3N0YXRpYyBpbnQgaG9fZ3NtNDhfaG9fY29tcGwoc3RydWN0IGdzbV9sY2hhbiAqbmV3X2xjaGFuKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gbmV3X2xjaGFuLT50cy0+dHJ4LT5idHMtPm5ldHdvcms7CisJc3RydWN0IGJzY19oYW5kb3ZlciAqaG87CisKKwlobyA9IGJzY19ob19ieV9uZXdfbGNoYW4obmV3X2xjaGFuKTsKKwlpZiAoIWhvKSB7CisJCUxPR1AoREhPLCBMT0dMX0VSUk9SLCAidW5hYmxlIHRvIGZpbmQgSE8gcmVjb3JkXG4iKTsKKwkJcmV0dXJuIC1FTk9ERVY7CisJfQorCisJTE9HUChESE8sIExPR0xfSU5GTywgIlN1YnNjcmliZXIgJXMgSE8gZnJvbSBCVFMgJXUtPiV1IG9uIEFSRkNOICIKKwkgICAgICIldS0+JXVcbiIsIHN1YnNjcl9uYW1lKGhvLT5vbGRfbGNoYW4tPnN1YnNjciksCisJICAgICBoby0+b2xkX2xjaGFuLT50cy0+dHJ4LT5idHMtPm5yLCBuZXdfbGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsCisJICAgICBoby0+b2xkX2xjaGFuLT50cy0+dHJ4LT5hcmZjbiwgbmV3X2xjaGFuLT50cy0+dHJ4LT5hcmZjbik7CisKKwljb3VudGVyX2luYyhuZXQtPnN0YXRzLmhhbmRvdmVyLmNvbXBsZXRlZCk7CisKKwlic2NfZGVsX3RpbWVyKCZoby0+VDMxMDMpOworCisJLyogdXBkYXRlIGxjaGFuIHBvaW50ZXIgb2YgdHJhbnNhY3Rpb24gKi8KKwl0cmFuc19sY2hhbl9jaGFuZ2UoaG8tPm9sZF9sY2hhbiwgbmV3X2xjaGFuKTsKKworCWhvLT5vbGRfbGNoYW4tPnN0YXRlID0gTENIQU5fU19JTkFDVElWRTsKKwlsY2hhbl9hdXRvX3JlbGVhc2UoaG8tPm9sZF9sY2hhbik7CisKKwkvKiBkbyBzb21ldGhpbmcgdG8gcmUtcm91dGUgdGhlIGFjdHVhbCBzcGVlY2ggZnJhbWVzICEgKi8KKworCWxsaXN0X2RlbCgmaG8tPmxpc3QpOworCXRhbGxvY19mcmVlKGhvKTsKKworCXJldHVybiAwOworfQorCisvKiBHU00gMDQuMDggSEFORE9WRVIgRkFJTCBoYXMgYmVlbiByZWNlaXZlZCAqLworc3RhdGljIGludCBob19nc200OF9ob19mYWlsKHN0cnVjdCBnc21fbGNoYW4gKm9sZF9sY2hhbikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IG9sZF9sY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrOworCXN0cnVjdCBic2NfaGFuZG92ZXIgKmhvOworCisJaG8gPSBic2NfaG9fYnlfb2xkX2xjaGFuKG9sZF9sY2hhbik7CisJaWYgKCFobykgeworCQlMT0dQKERITywgTE9HTF9FUlJPUiwgInVuYWJsZSB0byBmaW5kIEhPIHJlY29yZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCWNvdW50ZXJfaW5jKG5ldC0+c3RhdHMuaGFuZG92ZXIuZmFpbGVkKTsKKworCWJzY19kZWxfdGltZXIoJmhvLT5UMzEwMyk7CisJbGxpc3RfZGVsKCZoby0+bGlzdCk7CisJcHV0X2xjaGFuKGhvLT5uZXdfbGNoYW4pOworCXRhbGxvY19mcmVlKGhvKTsKKworCXJldHVybiAwOworfQorCisvKiBHU00gMDguNTggSEFORE9WRVIgREVURUNUIGhhcyBiZWVuIHJlY2VpdmVkICovCitzdGF0aWMgaW50IGhvX3JzbF9kZXRlY3Qoc3RydWN0IGdzbV9sY2hhbiAqbmV3X2xjaGFuKQoreworCXN0cnVjdCBic2NfaGFuZG92ZXIgKmhvOworCisJaG8gPSBic2NfaG9fYnlfbmV3X2xjaGFuKG5ld19sY2hhbik7CisJaWYgKCFobykgeworCQlMT0dQKERITywgTE9HTF9FUlJPUiwgInVuYWJsZSB0byBmaW5kIEhPIHJlY29yZFxuIik7CisJCXJldHVybiAtRU5PREVWOworCX0KKworCS8qIEZJWE1FOiBkbyB3ZSBhY3R1YWxseSB3YW50IHRvIGRvIHNvbWV0aGluZyBoZXJlID8gKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhvX2lwYWNfY3JjeF9hY2soc3RydWN0IGdzbV9sY2hhbiAqbmV3X2xjaGFuKQoreworCXN0cnVjdCBic2NfaGFuZG92ZXIgKmhvOworCXN0cnVjdCBydHBfc29ja2V0ICpvbGRfcnMsICpuZXdfcnMsICpvdGhlcl9yczsKKworCWhvID0gYnNjX2hvX2J5X25ld19sY2hhbihuZXdfbGNoYW4pOworCWlmICghaG8pIHsKKwkJLyogaXQgaXMgcGVyZmVjdGx5IG5vcm1hbCwgd2UgaGF2ZSBDUkNYIGV2ZW4gaW4gbm9uLUhPIGNhc2VzICovCisJCXJldHVybiAwOworCX0KKworCWlmIChpcGFjY19ydHBfZGlyZWN0KSB7CisJCUxPR1AoREhPLCBMT0dMX0VSUk9SLCAidW5hYmxlIHRvIGhhbmRvdmVyIGluIGRpcmVjdCBSVFAgbW9kZVxuIik7CisJCXJldHVybiAwOworCX0KKworCS8qIFJUUCBQcm94eSBtb2RlICovCisJbmV3X3JzID0gbmV3X2xjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQ7CisJb2xkX3JzID0gaG8tPm9sZF9sY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0OworCisJaWYgKCFuZXdfcnMpIHsKKwkJTE9HUChESE8sIExPR0xfRVJST1IsICJubyBSVFAgc29ja2V0IGZvciBuZXdfbGNoYW5cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlyc2xfaXBhY2NfbWRjeF90b19ydHBzb2NrKG5ld19sY2hhbik7CisKKwlpZiAoIW9sZF9ycykgeworCQlMT0dQKERITywgTE9HTF9FUlJPUiwgIm5vIFJUUCBzb2Nla3QgZm9yIG9sZF9sY2hhblxuIik7CisJCXJldHVybiAtRUlPOworCX0KKworCS8qIGNvcHkgcnhfYWN0aW9uIGFuZCByZWZlcmVuY2UgdG8gb3RoZXIgc29jayAqLworCW5ld19ycy0+cnhfYWN0aW9uID0gb2xkX3JzLT5yeF9hY3Rpb247CisJbmV3X3JzLT50eF9hY3Rpb24gPSBvbGRfcnMtPnR4X2FjdGlvbjsKKwluZXdfcnMtPnRyYW5zbWl0ID0gb2xkX3JzLT50cmFuc21pdDsKKworCXN3aXRjaCAoaG8tPm9sZF9sY2hhbi0+YWJpc19pcC5ydHBfc29ja2V0LT5yeF9hY3Rpb24pIHsKKwljYXNlIFJUUF9QUk9YWToKKwkJb3RoZXJfcnMgPSBvbGRfcnMtPnByb3h5Lm90aGVyX3NvY2s7CisJCXJ0cF9zb2NrZXRfcHJveHkobmV3X3JzLCBvdGhlcl9ycyk7CisJCS8qIGRlbGV0ZSByZWZlcmVuY2UgdG8gb3RoZXIgZW5kIHNvY2tldCB0byBwcmV2ZW50CisJCSAqIHJ0cF9zb2NrZXRfZnJlZSgpIGZyb20gcmVtb3ZpbmcgdGhlIGludmVyc2UgcmVmZXJlbmNlICovCisJCW9sZF9ycy0+cHJveHkub3RoZXJfc29jayA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgUlRQX1JFQ1ZfVVBTVFJFQU06CisJCW5ld19ycy0+cmVjZWl2ZSA9IG9sZF9ycy0+cmVjZWl2ZTsKKwkJYnJlYWs7CisJY2FzZSBSVFBfTk9ORToKKwkJYnJlYWs7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgaG9fbG9naWNfc2lnX2NiKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsCisJCQkgICB2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCisJc3dpdGNoIChzdWJzeXMpIHsKKwljYXNlIFNTX0xDSEFOOgorCQlsY2hhbiA9IHNpZ25hbF9kYXRhOworCQlzd2l0Y2ggKHNpZ25hbCkgeworCQljYXNlIFNfTENIQU5fQUNUSVZBVEVfQUNLOgorCQkJcmV0dXJuIGhvX2NoYW5fYWN0aXZfYWNrKGxjaGFuKTsKKwkJY2FzZSBTX0xDSEFOX0FDVElWQVRFX05BQ0s6CisJCQlyZXR1cm4gaG9fY2hhbl9hY3Rpdl9uYWNrKGxjaGFuKTsKKwkJY2FzZSBTX0xDSEFOX0hBTkRPVkVSX0RFVEVDVDoKKwkJCXJldHVybiBob19yc2xfZGV0ZWN0KGxjaGFuKTsKKwkJY2FzZSBTX0xDSEFOX0hBTkRPVkVSX0NPTVBMOgorCQkJcmV0dXJuIGhvX2dzbTQ4X2hvX2NvbXBsKGxjaGFuKTsKKwkJY2FzZSBTX0xDSEFOX0hBTkRPVkVSX0ZBSUw6CisJCQlyZXR1cm4gaG9fZ3NtNDhfaG9fZmFpbChsY2hhbik7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBTU19BQklTSVA6CisJCWxjaGFuID0gc2lnbmFsX2RhdGE7CisJCXN3aXRjaCAoc2lnbmFsKSB7CisJCWNhc2UgU19BQklTSVBfQ1JDWF9BQ0s6CisJCQlyZXR1cm4gaG9faXBhY19jcmN4X2FjayhsY2hhbik7CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIF9fYXR0cmlidXRlX18oKGNvbnN0cnVjdG9yKSkgdm9pZCBvbl9kc29fbG9hZF9ob19sb2dpYyh2b2lkKQoreworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX0xDSEFOLCBob19sb2dpY19zaWdfY2IsIE5VTEwpOworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX0FCSVNJUCwgaG9fbG9naWNfc2lnX2NiLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2lucHV0L2lwYWNjZXNzLmMgYi9vcGVuYnNjL3NyYy9pbnB1dC9pcGFjY2Vzcy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0M2E1ZTgKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9pbnB1dC9pcGFjY2Vzcy5jCkBAIC0wLDAgKzEsNzAxIEBACisvKiBPcGVuQlNDIEFiaXMgaW5wdXQgZHJpdmVyIGZvciBpcC5hY2Nlc3MgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL2ZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGx2Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc3ViY2hhbl9kZW11eC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZTFfaW5wdXQuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2lwYWNjZXNzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKKy8qIGRhdGEgc3RydWN0dXJlIGZvciBvbmUgRTEgaW50ZXJmYWNlIHdpdGggQS1iaXMgKi8KK3N0cnVjdCBpYV9lMV9oYW5kbGUgeworCXN0cnVjdCBic2NfZmQgbGlzdGVuX2ZkOworCXN0cnVjdCBic2NfZmQgcnNsX2xpc3Rlbl9mZDsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldDsKK307CisKK3N0YXRpYyBzdHJ1Y3QgaWFfZTFfaGFuZGxlICplMWg7CisKKworI2RlZmluZSBUUzFfQUxMT0NfU0laRQkzMDAKKworc3RhdGljIGNvbnN0IHVfaW50OF90IHBvbmdbXSA9IHsgMCwgMSwgSVBBQ19QUk9UT19JUEFDQ0VTUywgSVBBQ19NU0dUX1BPTkcgfTsKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBpZF9hY2tbXSA9IHsgMCwgMSwgSVBBQ19QUk9UT19JUEFDQ0VTUywgSVBBQ19NU0dUX0lEX0FDSyB9Oworc3RhdGljIGNvbnN0IHVfaW50OF90IGlkX3JlcVtdID0geyAwLCAxNywgSVBBQ19QUk9UT19JUEFDQ0VTUywgSVBBQ19NU0dUX0lEX0dFVCwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19VTklULCAKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19NQUNBRERSLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX0xPQ0FUSU9OMSwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19MT0NBVElPTjIsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfRVFVSVBWRVJTLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX1NXVkVSU0lPTiwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19VTklUTkFNRSwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19TRVJOUiwKKwkJCQl9OworCitzdGF0aWMgY29uc3QgY2hhciAqaWR0YWdfbmFtZXNbXSA9IHsKKwlbSVBBQ19JRFRBR19TRVJOUl0JPSAiU2VyaWFsX051bWJlciIsCisJW0lQQUNfSURUQUdfVU5JVE5BTUVdCT0gIlVuaXRfTmFtZSIsCisJW0lQQUNfSURUQUdfTE9DQVRJT04xXQk9ICJMb2NhdGlvbl8xIiwKKwlbSVBBQ19JRFRBR19MT0NBVElPTjJdCT0gIkxvY2F0aW9uXzIiLAorCVtJUEFDX0lEVEFHX0VRVUlQVkVSU10JPSAiRXF1aXBtZW50X1ZlcnNpb24iLAorCVtJUEFDX0lEVEFHX1NXVkVSU0lPTl0JPSAiU29mdHdhcmVfVmVyc2lvbiIsCisJW0lQQUNfSURUQUdfSVBBRERSXQk9ICJJUF9BZGRyZXNzIiwKKwlbSVBBQ19JRFRBR19NQUNBRERSXQk9ICJNQUNfQWRkcmVzcyIsCisJW0lQQUNfSURUQUdfVU5JVF0JPSAiVW5pdF9JRCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqaXBhY19pZHRhZ19uYW1lKGludCB0YWcpCit7CisJaWYgKHRhZyA+PSBBUlJBWV9TSVpFKGlkdGFnX25hbWVzKSkKKwkJcmV0dXJuICJ1bmtub3duIjsKKworCXJldHVybiBpZHRhZ19uYW1lc1t0YWddOworfQorCitpbnQgaXBhY2Nlc3NfaWR0YWdfcGFyc2Uoc3RydWN0IHRsdl9wYXJzZWQgKmRlYywgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCXVfaW50OF90IHRfbGVuOworCXVfaW50OF90IHRfdGFnOworCXVfaW50OF90ICpjdXIgPSBidWY7CisKKwl3aGlsZSAoY3VyIDwgYnVmICsgbGVuKSB7CisJCXRfbGVuID0gKmN1cisrOworCQl0X3RhZyA9ICpjdXIrKzsKKworCQlERUJVR1BDKERNSSwgIiVzPSclcycgIiwgaXBhY19pZHRhZ19uYW1lKHRfdGFnKSwgY3VyKTsKKworCQlkZWMtPmx2W3RfdGFnXS5sZW4gPSB0X2xlbjsKKwkJZGVjLT5sdlt0X3RhZ10udmFsID0gY3VyOworCisJCWN1ciArPSB0X2xlbjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0cnVjdCBnc21fYnRzICpmaW5kX2J0c19ieV91bml0aWQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJICAgdV9pbnQxNl90IHNpdGVfaWQsIHVfaW50MTZfdCBidHNfaWQpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ0cywgJm5ldC0+YnRzX2xpc3QsIGxpc3QpIHsKKworCQlpZiAoIWlzX2lwYWNjZXNzX2J0cyhidHMpKQorCQkJY29udGludWU7CisKKwkJaWYgKGJ0cy0+aXBfYWNjZXNzLnNpdGVfaWQgPT0gc2l0ZV9pZCAmJgorCQkgICAgYnRzLT5pcF9hY2Nlc3MuYnRzX2lkID09IGJ0c19pZCkKKwkJCXJldHVybiBidHM7CisJfQorCisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfdW5pdGlkKGNvbnN0IGNoYXIgKnN0ciwgdV9pbnQxNl90ICpzaXRlX2lkLCB1X2ludDE2X3QgKmJ0c19pZCwKKwkJCXVfaW50MTZfdCAqdHJ4X2lkKQoreworCXVuc2lnbmVkIGxvbmcgdWw7CisJY2hhciAqZW5kcHRyOworCWNvbnN0IGNoYXIgKm5wdHI7CisKKwlucHRyID0gc3RyOworCXVsID0gc3RydG91bChucHRyLCAmZW5kcHRyLCAxMCk7CisJaWYgKGVuZHB0ciA8PSBucHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc2l0ZV9pZCkKKwkJKnNpdGVfaWQgPSB1bCAmIDB4ZmZmZjsKKworCWlmICgqZW5kcHRyKysgIT0gJy8nKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW5wdHIgPSBlbmRwdHI7CisJdWwgPSBzdHJ0b3VsKG5wdHIsICZlbmRwdHIsIDEwKTsKKwlpZiAoZW5kcHRyIDw9IG5wdHIpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChidHNfaWQpCisJCSpidHNfaWQgPSB1bCAmIDB4ZmZmZjsKKworCWlmICgqZW5kcHRyKysgIT0gJy8nKQorCQlyZXR1cm4gLUVJTlZBTDsKKwkKKwlucHRyID0gZW5kcHRyOworCXVsID0gc3RydG91bChucHRyLCAmZW5kcHRyLCAxMCk7CisJaWYgKGVuZHB0ciA8PSBucHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAodHJ4X2lkKQorCQkqdHJ4X2lkID0gdWwgJiAweGZmZmY7CisKKwlyZXR1cm4gMDsKK30KKworLyogc2VuZCB0aGUgaWQgYWNrICovCitpbnQgaXBhY2Nlc3Nfc2VuZF9pZF9hY2soaW50IGZkKQoreworCXJldHVybiB3cml0ZShmZCwgaWRfYWNrLCBzaXplb2YoaWRfYWNrKSk7Cit9CisKK2ludCBpcGFjY2Vzc19zZW5kX2lkX3JlcShpbnQgZmQpCit7CisJcmV0dXJuIHdyaXRlKGZkLCBpZF9yZXEsIHNpemVvZihpZF9yZXEpKTsKK30KKworLyogYmFzZSBoYW5kbGluZyBvZiB0aGUgaXAuYWNjZXNzIHByb3RvY29sICovCitpbnQgaXBhY2Nlc3NfcmN2bXNnX2Jhc2Uoc3RydWN0IG1zZ2IgKm1zZywKKwkJCSBzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJdV9pbnQ4X3QgbXNnX3R5cGUgPSAqKG1zZy0+bDJoKTsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAobXNnX3R5cGUpIHsKKwljYXNlIElQQUNfTVNHVF9QSU5HOgorCQlyZXQgPSB3cml0ZShiZmQtPmZkLCBwb25nLCBzaXplb2YocG9uZykpOworCQlicmVhazsKKwljYXNlIElQQUNfTVNHVF9QT05HOgorCQlERUJVR1AoRE1JLCAiUE9ORyFcbiIpOworCQlicmVhazsKKwljYXNlIElQQUNfTVNHVF9JRF9BQ0s6CisJCURFQlVHUChETUksICJJRF9BQ0s/IC0+IEFDSyFcbiIpOworCQlyZXQgPSBpcGFjY2Vzc19zZW5kX2lkX2FjayhiZmQtPmZkKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwYWNjZXNzX3Jjdm1zZyhzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSwgc3RydWN0IG1zZ2IgKm1zZywKKwkJCSAgIHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3QgdGx2X3BhcnNlZCB0bHZwOworCXVfaW50OF90IG1zZ190eXBlID0gKihtc2ctPmwyaCk7CisJdV9pbnQxNl90IHNpdGVfaWQgPSAwLCBidHNfaWQgPSAwLCB0cnhfaWQgPSAwOworCXN0cnVjdCBnc21fYnRzICpidHM7CisKKwkvKiBoYW5kbGUgYmFzZSBtZXNzYWdlcyAqLworCWlwYWNjZXNzX3Jjdm1zZ19iYXNlKG1zZywgYmZkKTsKKworCXN3aXRjaCAobXNnX3R5cGUpIHsKKwljYXNlIElQQUNfTVNHVF9JRF9SRVNQOgorCQlERUJVR1AoRE1JLCAiSURfUkVTUCAiKTsKKwkJLyogcGFyc2UgdGFncywgc2VhcmNoIGZvciBVbml0IElEICovCisJCWlwYWNjZXNzX2lkdGFnX3BhcnNlKCZ0bHZwLCAodV9pbnQ4X3QgKiltc2ctPmwyaCArIDIsCisJCQkJIG1zZ2JfbDJsZW4obXNnKS0yKTsKKwkJREVCVUdQKERNSSwgIlxuIik7CisKKwkJaWYgKCFUTFZQX1BSRVNFTlQoJnRsdnAsIElQQUNfSURUQUdfVU5JVCkpCisJCQlicmVhazsKKworCQkvKiBsb29rdXAgQlRTLCBjcmVhdGUgc2lnbl9saW5rLCAuLi4gKi8KKwkJcGFyc2VfdW5pdGlkKChjaGFyICopVExWUF9WQUwoJnRsdnAsIElQQUNfSURUQUdfVU5JVCksCisJCQkgICAgICZzaXRlX2lkLCAmYnRzX2lkLCAmdHJ4X2lkKTsKKwkJYnRzID0gZmluZF9idHNfYnlfdW5pdGlkKGUxaC0+Z3NtbmV0LCBzaXRlX2lkLCBidHNfaWQpOworCQlpZiAoIWJ0cykgeworCQkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiVW5hYmxlIHRvIGZpbmQgQlRTIGNvbmZpZ3VyYXRpb24gZm9yICIKKwkJCSAgICAgICAiICV1LyV1LyV1LCBkaXNjb25uZWN0aW5nXG4iLCBzaXRlX2lkLCBidHNfaWQsCisJCQkJdHJ4X2lkKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCURFQlVHUChESU5QLCAiSWRlbnRpZmllZCBCVFMgJXUvJXUvJXVcbiIsIHNpdGVfaWQsIGJ0c19pZCwgdHJ4X2lkKTsKKwkJaWYgKGJmZC0+cHJpdl9uciA9PSAxKSB7CisJCQlidHMtPm9tbF9saW5rID0gZTFpbnBfc2lnbl9saW5rX2NyZWF0ZSgmbGluZS0+dHNbMS0xXSwKKwkJCQkJCSAgRTFJTlBfU0lHTl9PTUwsIGJ0cy0+YzAsCisJCQkJCQkgIGJ0cy0+b21sX3RlaSwgMCk7CisJCX0gZWxzZSBpZiAoYmZkLT5wcml2X25yID09IDIpIHsKKwkJCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzOworCQkJc3RydWN0IGJzY19mZCAqbmV3YmZkOworCQkJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCB0cnhfaWQpOworCQkJCisJCQliZmQtPmRhdGEgPSBsaW5lID0gYnRzLT5vbWxfbGluay0+dHMtPmxpbmU7CisJCQllMWlfdHMgPSAmbGluZS0+dHNbMit0cnhfaWQgLSAxXTsKKwkJCW5ld2JmZCA9ICZlMWlfdHMtPmRyaXZlci5pcGFjY2Vzcy5mZDsKKwkJCWUxaW5wX3RzX2NvbmZpZyhlMWlfdHMsIGxpbmUsIEUxSU5QX1RTX1RZUEVfU0lHTik7CisKKwkJCXRyeC0+cnNsX2xpbmsgPSBlMWlucF9zaWduX2xpbmtfY3JlYXRlKGUxaV90cywKKwkJCQkJCQlFMUlOUF9TSUdOX1JTTCwgdHJ4LAorCQkJCQkJCXRyeC0+cnNsX3RlaSwgMCk7CisJCQkvKiBnZXQgcmlkIG9mIG91ciBvbGQgdGVtcG9yYXJ5IGJmZCAqLworCQkJbWVtY3B5KG5ld2JmZCwgYmZkLCBzaXplb2YoKm5ld2JmZCkpOworCQkJbmV3YmZkLT5wcml2X25yID0gMit0cnhfaWQ7CisJCQlic2NfdW5yZWdpc3Rlcl9mZChiZmQpOworCQkJYnNjX3JlZ2lzdGVyX2ZkKG5ld2JmZCk7CisJCQl0YWxsb2NfZnJlZShiZmQpOworCQl9CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBPTUxfVVAJCTB4MDAwMQorI2RlZmluZSBSU0xfVVAJCTB4MDAwMgorCisvKgorICogcmVhZCBvbmUgaXBhIG1lc3NhZ2UgZnJvbSB0aGUgc29ja2V0CisgKiByZXR1cm4gTlVMTCBpbiBjYXNlIG9mIGVycm9yCisgKi8KK3N0cnVjdCBtc2diICppcGFjY2Vzc19yZWFkX21zZyhzdHJ1Y3QgYnNjX2ZkICpiZmQsIGludCAqZXJyb3IpCit7CisJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2MoVFMxX0FMTE9DX1NJWkUsICJBYmlzL0lQIik7CisJc3RydWN0IGlwYWNjZXNzX2hlYWQgKmhoOworCWludCBsZW4sIHJldCA9IDA7CisKKwlpZiAoIW1zZykgeworCQkqZXJyb3IgPSAtRU5PTUVNOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBmaXJzdCByZWFkIG91ciAzLWJ5dGUgaGVhZGVyICovCisJaGggPSAoc3RydWN0IGlwYWNjZXNzX2hlYWQgKikgbXNnLT5kYXRhOworCXJldCA9IHJlY3YoYmZkLT5mZCwgbXNnLT5kYXRhLCAzLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlpZiAoZXJybm8gIT0gRUFHQUlOKQorCQkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAicmVjdiBlcnJvciAlZCAlc1xuIiwgcmV0LCBzdHJlcnJvcihlcnJubykpOworCQltc2diX2ZyZWUobXNnKTsKKwkJKmVycm9yID0gcmV0OworCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UgaWYgKHJldCA9PSAwKSB7CisJCW1zZ2JfZnJlZShtc2cpOworCQkqZXJyb3IgPSByZXQ7CisJCXJldHVybiBOVUxMOworCX0KKworCW1zZ2JfcHV0KG1zZywgcmV0KTsKKworCS8qIHRoZW4gcmVhZCB0ZSBsZW5ndGggYXMgc3BlY2lmaWVkIGluIGhlYWRlciAqLworCW1zZy0+bDJoID0gbXNnLT5kYXRhICsgc2l6ZW9mKCpoaCk7CisJbGVuID0gbnRvaHMoaGgtPmxlbik7CisJcmV0ID0gcmVjdihiZmQtPmZkLCBtc2ctPmwyaCwgbGVuLCAwKTsKKwlpZiAocmV0IDwgbGVuKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgInNob3J0IHJlYWQhXG4iKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCSplcnJvciA9IC1FSU87CisJCXJldHVybiBOVUxMOworCX0KKwltc2diX3B1dChtc2csIHJldCk7CisKKwlyZXR1cm4gbXNnOworfQorCitzdGF0aWMgaW50IGhhbmRsZV90czFfcmVhZChzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUgPSBiZmQtPmRhdGE7CisJdW5zaWduZWQgaW50IHRzX25yID0gYmZkLT5wcml2X25yOworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gJmxpbmUtPnRzW3RzX25yLTFdOworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKmxpbms7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlzdHJ1Y3QgaXBhY2Nlc3NfaGVhZCAqaGg7CisJaW50IHJldCA9IDAsIGVycm9yOworCisJbXNnID0gaXBhY2Nlc3NfcmVhZF9tc2coYmZkLCAmZXJyb3IpOworCWlmICghbXNnKSB7CisJCWlmIChlcnJvciA9PSAwKSB7CisJCQlsaW5rID0gZTFpbnBfbG9va3VwX3NpZ25fbGluayhlMWlfdHMsIElQQUNfUFJPVE9fT01MLCAwKTsKKwkJCWlmIChsaW5rKSB7CisJCQkJbGluay0+dHJ4LT5idHMtPmlwX2FjY2Vzcy5mbGFncyA9IDA7CisJCQkJTE9HUChESU5QLCBMT0dMX05PVElDRSwgIkJUUyAldSBkaXNhcHBlYXJlZCwgZGVhZCBzb2NrZXRcbiIsCisJCQkJCWxpbmstPnRyeC0+YnRzLT5ucik7CisJCQl9IGVsc2UKKwkJCQlMT0dQKERJTlAsIExPR0xfTk9USUNFLCAidW5rbm93biBCVFMgZGlzYXBwZWFyZWQsIGRlYWQgc29ja2V0XG4iKTsKKwkJCWUxaW5wX2V2ZW50KGUxaV90cywgRVZUX0UxX1RFSV9ETiwgMCwgSVBBQ19QUk9UT19SU0wpOworCQkJZTFpbnBfZXZlbnQoZTFpX3RzLCBFVlRfRTFfVEVJX0ROLCAwLCBJUEFDX1BST1RPX09NTCk7CisJCQlic2NfdW5yZWdpc3Rlcl9mZChiZmQpOworCQkJY2xvc2UoYmZkLT5mZCk7CisJCQliZmQtPmZkID0gLTE7CisJCX0KKwkJcmV0dXJuIGVycm9yOworCX0KKworCURFQlVHUChETUksICJSWCAldTogJXNcbiIsIHRzX25yLCBoZXhkdW1wKG1zZ2JfbDIobXNnKSwgbXNnYl9sMmxlbihtc2cpKSk7CisKKwloaCA9IChzdHJ1Y3QgaXBhY2Nlc3NfaGVhZCAqKSBtc2ctPmRhdGE7CisJaWYgKGhoLT5wcm90byA9PSBJUEFDX1BST1RPX0lQQUNDRVNTKSB7CisJCXJldCA9IGlwYWNjZXNzX3Jjdm1zZyhsaW5lLCBtc2csIGJmZCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQllMWlucF9ldmVudChlMWlfdHMsIEVWVF9FMV9URUlfRE4sIDAsIElQQUNfUFJPVE9fUlNMKTsKKwkJCWUxaW5wX2V2ZW50KGUxaV90cywgRVZUX0UxX1RFSV9ETiwgMCwgSVBBQ19QUk9UT19PTUwpOworCQkJYnNjX3VucmVnaXN0ZXJfZmQoYmZkKTsKKwkJCWNsb3NlKGJmZC0+ZmQpOworCQkJYmZkLT5mZCA9IC0xOworCQl9CisJCW1zZ2JfZnJlZShtc2cpOworCQlyZXR1cm4gcmV0OworCX0KKwkvKiBCSUcgRkFUIFdBUk5JTkc6IGJmZCBtaWdodCBubyBsb25nZXIgZXhpc3QgaGVyZSwgc2luY2UgaXBhY2Nlc3NfcmN2bXNnKCkKKwkgKiBtaWdodCBoYXZlIGZyZWUnZCBpdCAhISEgKi8KKworCWxpbmsgPSBlMWlucF9sb29rdXBfc2lnbl9saW5rKGUxaV90cywgaGgtPnByb3RvLCAwKTsKKwlpZiAoIWxpbmspIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAibm8gbWF0Y2hpbmcgc2lnbmFsbGluZyBsaW5rIGZvciAiCisJCQkiaGgtPnByb3RvPTB4JTAyeFxuIiwgaGgtPnByb3RvKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCXJldHVybiAtRUlPOworCX0KKwltc2ctPnRyeCA9IGxpbmstPnRyeDsKKworCXN3aXRjaCAobGluay0+dHlwZSkgeworCWNhc2UgRTFJTlBfU0lHTl9SU0w6CisJCWlmICghKG1zZy0+dHJ4LT5idHMtPmlwX2FjY2Vzcy5mbGFncyAmIChSU0xfVVAgPDwgbXNnLT50cngtPm5yKSkpIHsKKwkJCWUxaW5wX2V2ZW50KGUxaV90cywgRVZUX0UxX1RFSV9VUCwgbGluay0+dGVpLCBsaW5rLT5zYXBpKTsKKwkJCW1zZy0+dHJ4LT5idHMtPmlwX2FjY2Vzcy5mbGFncyB8PSAoUlNMX1VQIDw8IG1zZy0+dHJ4LT5ucik7CisJCX0KKwkJcmV0ID0gYWJpc19yc2xfcmN2bXNnKG1zZyk7CisJCWJyZWFrOworCWNhc2UgRTFJTlBfU0lHTl9PTUw6CisJCWlmICghKG1zZy0+dHJ4LT5idHMtPmlwX2FjY2Vzcy5mbGFncyAmIE9NTF9VUCkpIHsKKwkJCWUxaW5wX2V2ZW50KGUxaV90cywgRVZUX0UxX1RFSV9VUCwgbGluay0+dGVpLCBsaW5rLT5zYXBpKTsKKwkJCW1zZy0+dHJ4LT5idHMtPmlwX2FjY2Vzcy5mbGFncyB8PSBPTUxfVVA7CisJCX0KKwkJcmV0ID0gYWJpc19ubV9yY3Ztc2cobXNnKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChESU5QLCBMT0dMX05PVElDRSwgIlVua25vd24gSVAuYWNjZXNzIHByb3RvY29sIHByb3RvPTB4JTAyeFxuIiwgaGgtPnByb3RvKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCWJyZWFrOworCX0KKwlyZXR1cm4gcmV0OworfQorCit2b2lkIGlwYWNjZXNzX3ByZXBlbmRfaGVhZGVyKHN0cnVjdCBtc2diICptc2csIGludCBwcm90bykKK3sKKwlzdHJ1Y3QgaXBhY2Nlc3NfaGVhZCAqaGg7CisKKwkvKiBwcmVwZW5kIHRoZSBpcC5hY2Nlc3MgaGVhZGVyICovCisJaGggPSAoc3RydWN0IGlwYWNjZXNzX2hlYWQgKikgbXNnYl9wdXNoKG1zZywgc2l6ZW9mKCpoaCkpOworCWhoLT5sZW4gPSBodG9ucyhtc2ctPmxlbiAtIHNpemVvZigqaGgpKTsKKwloaC0+cHJvdG8gPSBwcm90bzsKK30KKworc3RhdGljIGludCB0c193YW50X3dyaXRlKHN0cnVjdCBlMWlucF90cyAqZTFpX3RzKQoreworCWUxaV90cy0+ZHJpdmVyLmlwYWNjZXNzLmZkLndoZW4gfD0gQlNDX0ZEX1dSSVRFOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRpbWVvdXRfdHMxX3dyaXRlKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSAoc3RydWN0IGUxaW5wX3RzICopZGF0YTsKKworCS8qIHRyaWdnZXIgd3JpdGUgb2YgdHMxLCBkdWUgdG8gdHggZGVsYXkgdGltZXIgKi8KKwl0c193YW50X3dyaXRlKGUxaV90cyk7Cit9CisKK3N0YXRpYyBpbnQgaGFuZGxlX3RzMV93cml0ZShzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUgPSBiZmQtPmRhdGE7CisJdW5zaWduZWQgaW50IHRzX25yID0gYmZkLT5wcml2X25yOworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gJmxpbmUtPnRzW3RzX25yLTFdOworCXN0cnVjdCBlMWlucF9zaWduX2xpbmsgKnNpZ25fbGluazsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXVfaW50OF90IHByb3RvOworCWludCByZXQ7CisKKwliZmQtPndoZW4gJj0gfkJTQ19GRF9XUklURTsKKworCS8qIGdldCB0aGUgbmV4dCBtc2cgZm9yIHRoaXMgdGltZXNsb3QgKi8KKwltc2cgPSBlMWlucF90eF90cyhlMWlfdHMsICZzaWduX2xpbmspOworCWlmICghbXNnKSB7CisJCS8qIG5vIG1lc3NhZ2UgYWZ0ZXIgdHggZGVsYXkgdGltZXIgKi8KKwkJcmV0dXJuIDA7CisJfQorCisJc3dpdGNoIChzaWduX2xpbmstPnR5cGUpIHsKKwljYXNlIEUxSU5QX1NJR05fT01MOgorCQlwcm90byA9IElQQUNfUFJPVE9fT01MOworCQlicmVhazsKKwljYXNlIEUxSU5QX1NJR05fUlNMOgorCQlwcm90byA9IElQQUNfUFJPVE9fUlNMOworCQlicmVhazsKKwlkZWZhdWx0OgorCQltc2diX2ZyZWUobXNnKTsKKwkJYmZkLT53aGVuIHw9IEJTQ19GRF9XUklURTsgLyogY29tZSBiYWNrIGZvciBtb3JlIG1zZyAqLworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltc2ctPmwyaCA9IG1zZy0+ZGF0YTsKKwlpcGFjY2Vzc19wcmVwZW5kX2hlYWRlcihtc2csIHNpZ25fbGluay0+dGVpKTsKKworCURFQlVHUChETUksICJUWCAldTogJXNcbiIsIHRzX25yLCBoZXhkdW1wKG1zZy0+bDJoLCBtc2diX2wybGVuKG1zZykpKTsKKworCXJldCA9IHNlbmQoYmZkLT5mZCwgbXNnLT5kYXRhLCBtc2ctPmxlbiwgMCk7CisJbXNnYl9mcmVlKG1zZyk7CisKKwkvKiBzZXQgdHggZGVsYXkgdGltZXIgZm9yIG5leHQgZXZlbnQgKi8KKwllMWlfdHMtPnNpZ24udHhfdGltZXIuY2IgPSB0aW1lb3V0X3RzMV93cml0ZTsKKwllMWlfdHMtPnNpZ24udHhfdGltZXIuZGF0YSA9IGUxaV90czsKKwlic2Nfc2NoZWR1bGVfdGltZXIoJmUxaV90cy0+c2lnbi50eF90aW1lciwgMCwgMTAwMDAwKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIGNhbGxiYWNrIGZyb20gc2VsZWN0LmMgaW4gY2FzZSBvbmUgb2YgdGhlIGZkJ3MgY2FuIGJlIHJlYWQvd3JpdHRlbiAqLworc3RhdGljIGludCBpcGFjY2Vzc19mZF9jYihzdHJ1Y3QgYnNjX2ZkICpiZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lID0gYmZkLT5kYXRhOworCXVuc2lnbmVkIGludCB0c19uciA9IGJmZC0+cHJpdl9ucjsKKwl1bnNpZ25lZCBpbnQgaWR4ID0gdHNfbnItMTsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90czsKKwlpbnQgcmMgPSAwOworCisJLyogSW4gY2FzZSBvZiBlYXJseSBSU0wgd2UgbWlnaHQgbm90IHlldCBoYXZlIGEgbGluZSAqLworCisJaWYgKGxpbmUpCisgCQllMWlfdHMgPSAmbGluZS0+dHNbaWR4XTsKKworCWlmICghbGluZSB8fCBlMWlfdHMtPnR5cGUgPT0gRTFJTlBfVFNfVFlQRV9TSUdOKSB7CisJCWlmICh3aGF0ICYgQlNDX0ZEX1JFQUQpCisJCQlyYyA9IGhhbmRsZV90czFfcmVhZChiZmQpOworCQlpZiAod2hhdCAmIEJTQ19GRF9XUklURSkKKwkJCXJjID0gaGFuZGxlX3RzMV93cml0ZShiZmQpOworCX0gZWxzZQorCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJ1bmtub3duIEUxIFRTIHR5cGUgJXVcbiIsIGUxaV90cy0+dHlwZSk7CisKKwlyZXR1cm4gcmM7Cit9CisKKworc3RydWN0IGUxaW5wX2RyaXZlciBpcGFjY2Vzc19kcml2ZXIgPSB7CisJLm5hbWUgPSAiaXAuYWNjZXNzIiwKKwkud2FudF93cml0ZSA9IHRzX3dhbnRfd3JpdGUsCit9OworCisvKiBjYWxsYmFjayBvZiB0aGUgT01MIGxpc3RlbmluZyBmaWxlZGVzY3JpcHRvciAqLworc3RhdGljIGludCBsaXN0ZW5fZmRfY2Ioc3RydWN0IGJzY19mZCAqbGlzdGVuX2JmZCwgdW5zaWduZWQgaW50IHdoYXQpCit7CisJaW50IHJldDsKKwlpbnQgaWR4ID0gMDsKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90czsKKwlzdHJ1Y3QgYnNjX2ZkICpiZmQ7CisJc3RydWN0IHNvY2thZGRyX2luIHNhOworCXNvY2tsZW5fdCBzYV9sZW4gPSBzaXplb2Yoc2EpOworCisJaWYgKCEod2hhdCAmIEJTQ19GRF9SRUFEKSkKKwkJcmV0dXJuIDA7CisKKwlyZXQgPSBhY2NlcHQobGlzdGVuX2JmZC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnNhLCAmc2FfbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQlwZXJyb3IoImFjY2VwdCIpOworCQlyZXR1cm4gcmV0OworCX0KKwlMT0dQKERJTlAsIExPR0xfTk9USUNFLCAiYWNjZXB0KCllZCBuZXcgT01MIGxpbmsgZnJvbSAlc1xuIiwKKwkJaW5ldF9udG9hKHNhLnNpbl9hZGRyKSk7CisKKwlsaW5lID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgZTFpbnBfbGluZSk7CisJaWYgKCFsaW5lKSB7CisJCWNsb3NlKHJldCk7CisJCXJldHVybiAtRU5PTUVNOworCX0KKwlsaW5lLT5kcml2ZXIgPSAmaXBhY2Nlc3NfZHJpdmVyOworCS8vbGluZS0+ZHJpdmVyX2RhdGEgPSBlMWg7CisJLyogY3JlYXRlIHZpcnJ0dWFsIEUxIHRpbWVzbG90cyBmb3Igc2lnbmFsbGluZyAqLworCWUxaW5wX3RzX2NvbmZpZygmbGluZS0+dHNbMS0xXSwgbGluZSwgRTFJTlBfVFNfVFlQRV9TSUdOKTsKKworCWUxaV90cyA9ICZsaW5lLT50c1tpZHhdOworCisJYmZkID0gJmUxaV90cy0+ZHJpdmVyLmlwYWNjZXNzLmZkOworCWJmZC0+ZmQgPSByZXQ7CisJYmZkLT5kYXRhID0gbGluZTsKKwliZmQtPnByaXZfbnIgPSAxOworCWJmZC0+Y2IgPSBpcGFjY2Vzc19mZF9jYjsKKwliZmQtPndoZW4gPSBCU0NfRkRfUkVBRDsKKwlyZXQgPSBic2NfcmVnaXN0ZXJfZmQoYmZkKTsKKwlpZiAocmV0IDwgMCkgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJjb3VsZCBub3QgcmVnaXN0ZXIgRkRcbiIpOworCQljbG9zZShiZmQtPmZkKTsKKwkJdGFsbG9jX2ZyZWUobGluZSk7CisJCXJldHVybiByZXQ7CisJfQorCisJLyogUmVxdWVzdCBJRC4gRklYTUU6IHJlcXVlc3QgTE9DQVRJT04sIEhXL1NXIFZFcnNpb24sIFVuaXQgTmFtZSwgU2Vybm8gKi8KKwlyZXQgPSBpcGFjY2Vzc19zZW5kX2lkX3JlcShiZmQtPmZkKTsKKworICAgICAgICByZXR1cm4gcmV0OworCS8vcmV0dXJuIGUxaW5wX2xpbmVfcmVnaXN0ZXIobGluZSk7Cit9CisKK3N0YXRpYyBpbnQgcnNsX2xpc3Rlbl9mZF9jYihzdHJ1Y3QgYnNjX2ZkICpsaXN0ZW5fYmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2E7CisJc29ja2xlbl90IHNhX2xlbiA9IHNpemVvZihzYSk7CisJc3RydWN0IGJzY19mZCAqYmZkOworCWludCByZXQ7CisKKwlpZiAoISh3aGF0ICYgQlNDX0ZEX1JFQUQpKQorCQlyZXR1cm4gMDsKKworCWJmZCA9IHRhbGxvY196ZXJvKHRhbGxfYnNjX2N0eCwgc3RydWN0IGJzY19mZCk7CisJaWYgKCFiZmQpCisJCXJldHVybiAtRU5PTUVNOworCisJLyogU29tZSBCVFMgaGFzIGNvbm5lY3RlZCB0byB1cywgYnV0IHdlIGRvbid0IGtub3cgeWV0IHdoaWNoIGxpbmUKKwkgKiAoYXMgY3JlYXRlZCBieSB0aGUgT01MIGxpbmspIHRvIGFzc29jaWF0ZSBpdCB3aXRoLiAgVGh1cywgd2UKKwkgKiBhbGxvY2F0ZSBhIHRlbXBvcmFyeSBiZmQgdW50aWwgd2UgaGF2ZSByZWNlaXZlZCBJRCBmcm9tIEJUUyAqLworCisJYmZkLT5mZCA9IGFjY2VwdChsaXN0ZW5fYmZkLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2EsICZzYV9sZW4pOworCWlmIChiZmQtPmZkIDwgMCkgeworCQlwZXJyb3IoImFjY2VwdCIpOworCQlyZXR1cm4gYmZkLT5mZDsKKwl9CisJTE9HUChESU5QLCBMT0dMX05PVElDRSwgImFjY2VwdCgpZWQgbmV3IFJTTCBsaW5rIGZyb20gJXNcbiIsIGluZXRfbnRvYShzYS5zaW5fYWRkcikpOworCWJmZC0+cHJpdl9uciA9IDI7CisJYmZkLT5jYiA9IGlwYWNjZXNzX2ZkX2NiOworCWJmZC0+d2hlbiA9IEJTQ19GRF9SRUFEOworCXJldCA9IGJzY19yZWdpc3Rlcl9mZChiZmQpOworCWlmIChyZXQgPCAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCByZWdpc3RlciBGRFxuIik7CisJCWNsb3NlKGJmZC0+ZmQpOworCQl0YWxsb2NfZnJlZShiZmQpOworCQlyZXR1cm4gcmV0OworCX0KKwkvKiBSZXF1ZXN0IElELiBGSVhNRTogcmVxdWVzdCBMT0NBVElPTiwgSFcvU1cgVkVyc2lvbiwgVW5pdCBOYW1lLCBTZXJubyAqLworCXJldCA9IHdyaXRlKGJmZC0+ZmQsIGlkX3JlcSwgc2l6ZW9mKGlkX3JlcSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFrZV9zb2NrKHN0cnVjdCBic2NfZmQgKmJmZCwgdV9pbnQxNl90IHBvcnQsCisJCSAgICAgaW50ICgqY2IpKHN0cnVjdCBic2NfZmQgKmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkpCit7CisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisJaW50IHJldCwgb24gPSAxOworCQorCWJmZC0+ZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19TVFJFQU0sIElQUFJPVE9fVENQKTsKKwliZmQtPmNiID0gY2I7CisJYmZkLT53aGVuID0gQlNDX0ZEX1JFQUQ7CisJLy9iZmQtPmRhdGEgPSBsaW5lOworCisJaWYgKGJmZC0+ZmQgPCAwKSB7CisJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgImNvdWxkIG5vdCBjcmVhdGUgVENQIHNvY2tldC5cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisJYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisJYWRkci5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOworCisJc2V0c29ja29wdChiZmQtPmZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZvbiwgc2l6ZW9mKG9uKSk7CisKKwlyZXQgPSBiaW5kKGJmZC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSk7CisJaWYgKHJldCA8IDApIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiY291bGQgbm90IGJpbmQgbDIgc29ja2V0ICVzXG4iLAorCQkJc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2UoYmZkLT5mZCk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldCA9IGxpc3RlbihiZmQtPmZkLCAxKTsKKwlpZiAocmV0IDwgMCkgeworCQlwZXJyb3IoImxpc3RlbiIpOworCQljbG9zZShiZmQtPmZkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJCisJcmV0ID0gYnNjX3JlZ2lzdGVyX2ZkKGJmZCk7CisJaWYgKHJldCA8IDApIHsKKwkJcGVycm9yKCJyZWdpc3Rlcl9saXN0ZW5fZmQiKTsKKwkJY2xvc2UoYmZkLT5mZCk7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCisvKiBBY3RpdmVseSBjb25uZWN0IHRvIGEgQlRTLiAgQ3VycmVudGx5IHVzZWQgYnkgaXBhY2Nlc3MtY29uZmlnLmMgKi8KK2ludCBpcGFjY2Vzc19jb25uZWN0KHN0cnVjdCBlMWlucF9saW5lICpsaW5lLCBzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNhKQoreworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gJmxpbmUtPnRzWzBdOworCXN0cnVjdCBic2NfZmQgKmJmZCA9ICZlMWlfdHMtPmRyaXZlci5pcGFjY2Vzcy5mZDsKKwlpbnQgcmV0LCBvbiA9IDE7CisKKwliZmQtPmZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCk7CisJYmZkLT5jYiA9IGlwYWNjZXNzX2ZkX2NiOworCWJmZC0+d2hlbiA9IEJTQ19GRF9SRUFEIHwgQlNDX0ZEX1dSSVRFOworCWJmZC0+ZGF0YSA9IGxpbmU7CisJYmZkLT5wcml2X25yID0gMTsKKworCWlmIChiZmQtPmZkIDwgMCkgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJjb3VsZCBub3QgY3JlYXRlIFRDUCBzb2NrZXQuXG4iKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJc2V0c29ja29wdChiZmQtPmZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZvbiwgc2l6ZW9mKG9uKSk7CisKKwlyZXQgPSBjb25uZWN0KGJmZC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgc2EsIHNpemVvZigqc2EpKTsKKwlpZiAocmV0IDwgMCkgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJjb3VsZCBub3QgY29ubmVjdCBzb2NrZXRcbiIpOworCQljbG9zZShiZmQtPmZkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlyZXQgPSBic2NfcmVnaXN0ZXJfZmQoYmZkKTsKKwlpZiAocmV0IDwgMCkgeworCQljbG9zZShiZmQtPmZkKTsKKwkJcmV0dXJuIHJldDsKKwl9CisJCisJbGluZS0+ZHJpdmVyID0gJmlwYWNjZXNzX2RyaXZlcjsKKworICAgICAgICByZXR1cm4gcmV0OworCS8vcmV0dXJuIGUxaW5wX2xpbmVfcmVnaXN0ZXIobGluZSk7Cit9CisKK2ludCBpcGFjY2Vzc19zZXR1cChzdHJ1Y3QgZ3NtX25ldHdvcmsgKmdzbW5ldCkKK3sKKwlpbnQgcmV0OworCisJLyogcmVnaXN0ZXIgdGhlIGRyaXZlciB3aXRoIHRoZSBjb3JlICovCisJLyogRklYTUU6IGRvIHRoaXMgaW4gdGhlIHBsdWdpbiBpbml0aWFsaXplciBmdW5jdGlvbiAqLworCXJldCA9IGUxaW5wX2RyaXZlcl9yZWdpc3RlcigmaXBhY2Nlc3NfZHJpdmVyKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJZTFoID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgaWFfZTFfaGFuZGxlKTsKKwlpZiAoIWUxaCkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwllMWgtPmdzbW5ldCA9IGdzbW5ldDsKKworCS8qIExpc3RlbiBmb3IgT01MIGNvbm5lY3Rpb25zICovCisJcmV0ID0gbWFrZV9zb2NrKCZlMWgtPmxpc3Rlbl9mZCwgSVBBX1RDUF9QT1JUX09NTCwgbGlzdGVuX2ZkX2NiKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIExpc3RlbiBmb3IgUlNMIGNvbm5lY3Rpb25zICovCisJcmV0ID0gbWFrZV9zb2NrKCZlMWgtPnJzbF9saXN0ZW5fZmQsIElQQV9UQ1BfUE9SVF9SU0wsIHJzbF9saXN0ZW5fZmRfY2IpOworCisJcmV0dXJuIHJldDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2lucHV0L21pc2RuLmMgYi9vcGVuYnNjL3NyYy9pbnB1dC9taXNkbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2OTMwZDQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9pbnB1dC9taXNkbi5jCkBAIC0wLDAgKzEsNTM2IEBACisvKiBPcGVuQlNDIEFiaXMgaW5wdXQgZHJpdmVyIGZvciBtSVNETnVzZXIgKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxzeXMvZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8c3lzL2lvY3RsLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8bUlTRE5pZi5oPgorCisvLyNkZWZpbmUgQUZfQ09NUEFUSUJJTElUWV9GVU5DCisvLyNpbmNsdWRlIDxjb21wYXRfYWZfaXNkbi5oPgorI2lmbmRlZiBBRl9JU0ROCisjZGVmaW5lIEFGX0lTRE4gMzQKKyNkZWZpbmUgUEZfSVNETiBBRl9JU0ROCisjZW5kaWYKKworI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19ubS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3N1YmNoYW5fZGVtdXguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2UxX2lucHV0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKKyNkZWZpbmUgVFMxX0FMTE9DX1NJWkUJMzAwCisKK3N0cnVjdCBwcmltX25hbWUgeworCXVuc2lnbmVkIGludCBwcmltOworCWNvbnN0IGNoYXIgKm5hbWU7Cit9OworCitjb25zdCBzdHJ1Y3QgcHJpbV9uYW1lIHByaW1fbmFtZXNbXSA9IHsKKwl7IFBIX0NPTlRST0xfSU5ELCAiUEhfQ09OVFJPTF9JTkQiIH0sCisJeyBQSF9EQVRBX0lORCwgIlBIX0RBVEFfSU5EIiB9LAorCXsgUEhfREFUQV9DTkYsICJQSF9EQVRBX0NORiIgfSwKKwl7IFBIX0FDVElWQVRFX0lORCwgIlBIX0FDVElWQVRFX0lORCIgfSwKKwl7IERMX0VTVEFCTElTSF9JTkQsICJETF9FU1RBQkxJU0hfSU5EIiB9LAorCXsgRExfRVNUQUJMSVNIX0NORiwgIkRMX0VTVEFCTElTSF9DTkYiIH0sCisJeyBETF9SRUxFQVNFX0lORCwgIkRMX1JFTEVBU0VfSU5EIiB9LAorCXsgRExfUkVMRUFTRV9DTkYsICJETF9SRUxFQVNFX0NORiIgfSwKKwl7IERMX0RBVEFfSU5ELCAiRExfREFUQV9JTkQiIH0sCisJeyBETF9VTklUREFUQV9JTkQsICJETF9VTklUREFUQV9JTkQiIH0sCisJeyBETF9JTkZPUk1BVElPTl9JTkQsICJETF9JTkZPUk1BVElPTl9JTkQiIH0sCisJeyBNUEhfQUNUSVZBVEVfSU5ELCAiTVBIX0FDVElWQVRFX0lORCIgfSwKKwl7IE1QSF9ERUFDVElWQVRFX0lORCwgIk1QSF9ERUFDVElWQVRFX0lORCIgfSwKK307CisKK2NvbnN0IGNoYXIgKmdldF9wcmltX25hbWUodW5zaWduZWQgaW50IHByaW0pCit7CisJaW50IGk7CisKKwlmb3IgKGkgPSAwOyBpIDwgQVJSQVlfU0laRShwcmltX25hbWVzKTsgaSsrKSB7CisJCWlmIChwcmltX25hbWVzW2ldLnByaW0gPT0gcHJpbSkKKwkJCXJldHVybiBwcmltX25hbWVzW2ldLm5hbWU7CisJfQorCisJcmV0dXJuICJVTktOT1dOIjsKK30KKworc3RhdGljIGludCBoYW5kbGVfdHMxX3JlYWQoc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lID0gYmZkLT5kYXRhOworCXVuc2lnbmVkIGludCB0c19uciA9IGJmZC0+cHJpdl9ucjsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9ICZsaW5lLT50c1t0c19uci0xXTsKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpsaW5rOworCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jKFRTMV9BTExPQ19TSVpFLCAibUlTRE4gVFMxIik7CisJc3RydWN0IHNvY2thZGRyX21JU0ROIGwyYWRkcjsKKwlzdHJ1Y3QgbUlTRE5oZWFkICpoaDsKKwlzb2NrbGVuX3QgYWxlbjsKKwlpbnQgcmV0OworCisJaWYgKCFtc2cpCisJCXJldHVybiAtRU5PTUVNOworCisJaGggPSAoc3RydWN0IG1JU0ROaGVhZCAqKSBtc2ctPmRhdGE7CisKKwlhbGVuID0gc2l6ZW9mKGwyYWRkcik7CisJcmV0ID0gcmVjdmZyb20oYmZkLT5mZCwgbXNnLT5kYXRhLCAzMDAsIDAsCisJCSAgICAgICAoc3RydWN0IHNvY2thZGRyICopICZsMmFkZHIsICZhbGVuKTsKKwlpZiAocmV0IDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgInJlY3Zmcm9tIGVycm9yICAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoYWxlbiAhPSBzaXplb2YobDJhZGRyKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzIGVycm9yIGxlblxuIiwgX19mdW5jX18pOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwltc2diX3B1dChtc2csIHJldCk7CisKKwlERUJVR1AoRE1JLCAiYWxlbiA9JWQsIGRldiglZCkgY2hhbm5lbCglZCkgc2FwaSglZCkgdGVpKCVkKVxuIiwKKwkJYWxlbiwgbDJhZGRyLmRldiwgbDJhZGRyLmNoYW5uZWwsIGwyYWRkci5zYXBpLCBsMmFkZHIudGVpKTsKKworCURFQlVHUChETUksICI8PSBsZW4gPSAlZCwgcHJpbSgweCV4KSBpZCgweCV4KTogJXNcbiIsCisJCXJldCwgaGgtPnByaW0sIGhoLT5pZCwgZ2V0X3ByaW1fbmFtZShoaC0+cHJpbSkpOworCisJc3dpdGNoIChoaC0+cHJpbSkgeworCWNhc2UgRExfSU5GT1JNQVRJT05fSU5EOgorCQkvKiBtSVNETiB0ZWxscyB1cyB3aGljaCBjaGFubmVsIG51bWJlciBpcyBhbGxvY2F0ZWQgZm9yIHRoaXMKKwkJICogdHVwbGUgb2YgKFNBUEksIFRFSSkuICovCisJCURFQlVHUChETUksICJETF9JTkZPUk1BVElPTl9JTkQ6IHVzZSBjaGFubmVsKCVkKSBzYXBpKCVkKSB0ZWkoJWQpIGZvciBub3dcbiIsCisJCQlsMmFkZHIuY2hhbm5lbCwgbDJhZGRyLnNhcGksIGwyYWRkci50ZWkpOworCQlsaW5rID0gZTFpbnBfbG9va3VwX3NpZ25fbGluayhlMWlfdHMsIGwyYWRkci50ZWksIGwyYWRkci5zYXBpKTsKKwkJaWYgKCFsaW5rKSB7CisJCQlERUJVR1BDKERNSSwgIm1JU0ROIG1lc3NhZ2UgZm9yIHVua25vd24gc2lnbl9saW5rXG4iKTsKKwkJCW1zZ2JfZnJlZShtc2cpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJLyogc2F2ZSB0aGUgY2hhbm5lbCBudW1iZXIgaW4gdGhlIGRyaXZlciBwcml2YXRlIHN0cnVjdCAqLworCQlsaW5rLT5kcml2ZXIubWlzZG4uY2hhbm5lbCA9IGwyYWRkci5jaGFubmVsOworCQlicmVhazsKKwljYXNlIERMX0VTVEFCTElTSF9JTkQ6CisJCURFQlVHUChETUksICJETF9FU1RBQkxJU0hfSU5EOiBjaGFubmVsKCVkKSBzYXBpKCVkKSB0ZWkoJWQpXG4iLAorCQlsMmFkZHIuY2hhbm5lbCwgbDJhZGRyLnNhcGksIGwyYWRkci50ZWkpOworCQlyZXQgPSBlMWlucF9ldmVudChlMWlfdHMsIEVWVF9FMV9URUlfVVAsIGwyYWRkci50ZWksIGwyYWRkci5zYXBpKTsKKwkJYnJlYWs7CisJY2FzZSBETF9SRUxFQVNFX0lORDoKKwkJREVCVUdQKERNSSwgIkRMX1JFTEVBU0VfSU5EOiBjaGFubmVsKCVkKSBzYXBpKCVkKSB0ZWkoJWQpXG4iLAorCQlsMmFkZHIuY2hhbm5lbCwgbDJhZGRyLnNhcGksIGwyYWRkci50ZWkpOworCQlyZXQgPSBlMWlucF9ldmVudChlMWlfdHMsIEVWVF9FMV9URUlfRE4sIGwyYWRkci50ZWksIGwyYWRkci5zYXBpKTsKKwkJYnJlYWs7CisJY2FzZSBETF9EQVRBX0lORDoKKwljYXNlIERMX1VOSVREQVRBX0lORDoKKwkJbXNnLT5sMmggPSBtc2ctPmRhdGEgKyBNSVNETl9IRUFERVJfTEVOOworCQlERUJVR1AoRE1JLCAiUlg6ICVzXG4iLCBoZXhkdW1wKG1zZ2JfbDIobXNnKSwgcmV0IC0gTUlTRE5fSEVBREVSX0xFTikpOworCQlyZXQgPSBlMWlucF9yeF90cyhlMWlfdHMsIG1zZywgbDJhZGRyLnRlaSwgbDJhZGRyLnNhcGkpOworCQlicmVhazsKKwljYXNlIFBIX0FDVElWQVRFX0lORDoKKwkJREVCVUdQKERNSSwgIlBIX0FDVElWQVRFX0lORDogY2hhbm5lbCglZCkgc2FwaSglZCkgdGVpKCVkKVxuIiwKKwkJbDJhZGRyLmNoYW5uZWwsIGwyYWRkci5zYXBpLCBsMmFkZHIudGVpKTsKKwkJYnJlYWs7CisJY2FzZSBQSF9ERUFDVElWQVRFX0lORDoKKwkJREVCVUdQKERNSSwgIlBIX0RFQUNUSVZBVEVfSU5EOiBjaGFubmVsKCVkKSBzYXBpKCVkKSB0ZWkoJWQpXG4iLAorCQlsMmFkZHIuY2hhbm5lbCwgbDJhZGRyLnNhcGksIGwyYWRkci50ZWkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCB0c193YW50X3dyaXRlKHN0cnVjdCBlMWlucF90cyAqZTFpX3RzKQoreworCS8qIFdlIG5ldmVyIGluY2x1ZGUgdGhlIG1JU0ROIEItQ2hhbm5lbCBGRCBpbnRvIHRoZQorCSAqIHdyaXRlc2V0LCBzaW5jZSBpdCBkb2Vzbid0IHN1cHBvcnQgcG9sbCgpIGJhc2VkCisJICogd3JpdGUgZmxvdyBjb250cm9sICovCQkKKwlpZiAoZTFpX3RzLT50eXBlID09IEUxSU5QX1RTX1RZUEVfVFJBVSkKKwkJcmV0dXJuIDA7CisKKwllMWlfdHMtPmRyaXZlci5taXNkbi5mZC53aGVuIHw9IEJTQ19GRF9XUklURTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0aW1lb3V0X3RzMV93cml0ZSh2b2lkICpkYXRhKQoreworCXN0cnVjdCBlMWlucF90cyAqZTFpX3RzID0gKHN0cnVjdCBlMWlucF90cyAqKWRhdGE7CisKKwkvKiB0cmlnZ2VyIHdyaXRlIG9mIHRzMSwgZHVlIHRvIHR4IGRlbGF5IHRpbWVyICovCisJdHNfd2FudF93cml0ZShlMWlfdHMpOworfQorCitzdGF0aWMgaW50IGhhbmRsZV90czFfd3JpdGUoc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lID0gYmZkLT5kYXRhOworCXVuc2lnbmVkIGludCB0c19uciA9IGJmZC0+cHJpdl9ucjsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9ICZsaW5lLT50c1t0c19uci0xXTsKKwlzdHJ1Y3QgZTFpbnBfc2lnbl9saW5rICpzaWduX2xpbms7CisJc3RydWN0IHNvY2thZGRyX21JU0ROIHNhOworCXN0cnVjdCBtc2diICptc2c7CisJc3RydWN0IG1JU0ROaGVhZCAqaGg7CisJdV9pbnQ4X3QgKmwyX2RhdGE7CisJaW50IHJldDsKKworCWJmZC0+d2hlbiAmPSB+QlNDX0ZEX1dSSVRFOworCisJLyogZ2V0IHRoZSBuZXh0IG1zZyBmb3IgdGhpcyB0aW1lc2xvdCAqLworCW1zZyA9IGUxaW5wX3R4X3RzKGUxaV90cywgJnNpZ25fbGluayk7CisJaWYgKCFtc2cpIHsKKwkJLyogbm8gbWVzc2FnZSBhZnRlciB0eCBkZWxheSB0aW1lciAqLworCQlyZXR1cm4gMDsKKwl9CisKKwlsMl9kYXRhID0gbXNnLT5kYXRhOworCisJLyogcHJlcGVuZCB0aGUgbUlTRE5oZWFkICovCisJaGggPSAoc3RydWN0IG1JU0ROaGVhZCAqKSBtc2diX3B1c2gobXNnLCBzaXplb2YoKmhoKSk7CisJaGgtPnByaW0gPSBETF9EQVRBX1JFUTsKKworCURFQlVHUChETUksICJUWCBURUkoJWQpIFNBUEkoJWQpOiAlc1xuIiwgc2lnbl9saW5rLT50ZWksCisJCXNpZ25fbGluay0+c2FwaSwgaGV4ZHVtcChsMl9kYXRhLCBtc2ctPmxlbiAtIE1JU0ROX0hFQURFUl9MRU4pKTsKKworCS8qIGNvbnN0cnVjdCB0aGUgc29ja2FkZHIgKi8KKwlzYS5mYW1pbHkgPSBBRl9JU0ROOworCXNhLnNhcGkgPSBzaWduX2xpbmstPnNhcGk7CisJc2EuZGV2ID0gc2lnbl9saW5rLT50ZWk7CisJc2EuY2hhbm5lbCA9IHNpZ25fbGluay0+ZHJpdmVyLm1pc2RuLmNoYW5uZWw7CisKKwlyZXQgPSBzZW5kdG8oYmZkLT5mZCwgbXNnLT5kYXRhLCBtc2ctPmxlbiwgMCwKKwkJICAgICAoc3RydWN0IHNvY2thZGRyICopJnNhLCBzaXplb2Yoc2EpKTsKKwlpZiAocmV0IDwgMCkKKwkJZnByaW50ZihzdGRlcnIsICIlcyBzZW5kdG8gZmFpbGVkICVkXG4iLCBfX2Z1bmNfXywgcmV0KTsKKwltc2diX2ZyZWUobXNnKTsKKworCS8qIHNldCB0eCBkZWxheSB0aW1lciBmb3IgbmV4dCBldmVudCAqLworCWUxaV90cy0+c2lnbi50eF90aW1lci5jYiA9IHRpbWVvdXRfdHMxX3dyaXRlOworCWUxaV90cy0+c2lnbi50eF90aW1lci5kYXRhID0gZTFpX3RzOworCWJzY19zY2hlZHVsZV90aW1lcigmZTFpX3RzLT5zaWduLnR4X3RpbWVyLCAwLCA1MDAwMCk7CisKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIEJDSEFOX1RYX0dSQU4JMTYwCisvKiB3cml0ZSB0byBhIEIgY2hhbm5lbCBUUyAqLworc3RhdGljIGludCBoYW5kbGVfdHNYX3dyaXRlKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSA9IGJmZC0+ZGF0YTsKKwl1bnNpZ25lZCBpbnQgdHNfbnIgPSBiZmQtPnByaXZfbnI7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSAmbGluZS0+dHNbdHNfbnItMV07CisJc3RydWN0IG1JU0ROaGVhZCAqaGg7CisJdV9pbnQ4X3QgdHhfYnVmW0JDSEFOX1RYX0dSQU4gKyBzaXplb2YoKmhoKV07CisJc3RydWN0IHN1YmNoX211eCAqbXggPSAmZTFpX3RzLT50cmF1Lm11eDsKKwlpbnQgcmV0OworCisJaGggPSAoc3RydWN0IG1JU0ROaGVhZCAqKSB0eF9idWY7CisJaGgtPnByaW0gPSBQSF9EQVRBX1JFUTsKKworCXN1YmNoYW5fbXV4X291dChteCwgdHhfYnVmK3NpemVvZigqaGgpLCBCQ0hBTl9UWF9HUkFOKTsKKworCURFQlVHUChETUlCLCAiQkNIQU4gVFg6ICVzXG4iLAorCQloZXhkdW1wKHR4X2J1ZitzaXplb2YoKmhoKSwgQkNIQU5fVFhfR1JBTikpOworCisJcmV0ID0gc2VuZChiZmQtPmZkLCB0eF9idWYsIHNpemVvZigqaGgpICsgQkNIQU5fVFhfR1JBTiwgMCk7CisJaWYgKHJldCA8IHNpemVvZigqaGgpICsgQkNIQU5fVFhfR1JBTikKKwkJREVCVUdQKERNSUIsICJzZW5kIHJldHVybnMgJWQgaW5zdGVhZCBvZiAlbHVcbiIsIHJldCwKKwkJCXNpemVvZigqaGgpICsgQkNIQU5fVFhfR1JBTik7CisKKwlyZXR1cm4gcmV0OworfQorCisjZGVmaW5lIFRTWF9BTExPQ19TSVpFIDQwOTYKKy8qIEZJWE1FOiByZWFkIGZyb20gYSBCIGNoYW5uZWwgVFMgKi8KK3N0YXRpYyBpbnQgaGFuZGxlX3RzWF9yZWFkKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSA9IGJmZC0+ZGF0YTsKKwl1bnNpZ25lZCBpbnQgdHNfbnIgPSBiZmQtPnByaXZfbnI7CisJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSAmbGluZS0+dHNbdHNfbnItMV07CisJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2MoVFNYX0FMTE9DX1NJWkUsICJtSVNETiBUU3giKTsKKwlzdHJ1Y3QgbUlTRE5oZWFkICpoaDsKKwlpbnQgcmV0OworCisJaWYgKCFtc2cpCisJCXJldHVybiAtRU5PTUVNOworCisJaGggPSAoc3RydWN0IG1JU0ROaGVhZCAqKSBtc2ctPmRhdGE7CisKKwlyZXQgPSByZWN2KGJmZC0+ZmQsIG1zZy0+ZGF0YSwgVFNYX0FMTE9DX1NJWkUsIDApOworCWlmIChyZXQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCAicmVjdmZyb20gZXJyb3IgICVzXG4iLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gcmV0OworCX0KKworCW1zZ2JfcHV0KG1zZywgcmV0KTsKKworCWlmIChoaC0+cHJpbSAhPSBQSF9DT05UUk9MX0lORCkKKwkJREVCVUdQKERNSUIsICI8PSBCQ0hBTiBsZW4gPSAlZCwgcHJpbSgweCV4KSBpZCgweCV4KTogJXNcbiIsCisJCQlyZXQsIGhoLT5wcmltLCBoaC0+aWQsIGdldF9wcmltX25hbWUoaGgtPnByaW0pKTsKKworCXN3aXRjaCAoaGgtPnByaW0pIHsKKwljYXNlIFBIX0RBVEFfSU5EOgorCQltc2ctPmwyaCA9IG1zZy0+ZGF0YSArIE1JU0ROX0hFQURFUl9MRU47CisJCURFQlVHUChETUlCLCAiQkNIQU4gUlg6ICVzXG4iLAorCQkJaGV4ZHVtcChtc2diX2wyKG1zZyksIHJldCAtIE1JU0ROX0hFQURFUl9MRU4pKTsKKwkJcmV0ID0gZTFpbnBfcnhfdHMoZTFpX3RzLCBtc2csIDAsIDApOworCQlicmVhazsKKwljYXNlIFBIX0FDVElWQVRFX0lORDoKKwljYXNlIFBIX0RBVEFfQ05GOgorCQkvKiBwaHlzaWNhbCBsYXllciBpbmRpY2F0ZXMgdGhhdCBkYXRhIGhhcyBiZWVuIHNlbnQsCisJCSAqIHdlIHRodXMgY2FuIHNlbmQgc29tZSBtb3JlIGRhdGEgKi8KKwkJcmV0ID0gaGFuZGxlX3RzWF93cml0ZShiZmQpOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwkvKiBGSVhNRTogd2h5IGRvIHdlIGZyZWUgc2lnbmFsbGluZyBtc2dzIGluIHRoZSBjYWxsZXIsIGFuZCB0cmF1IG5vdD8gKi8KKwltc2diX2ZyZWUobXNnKTsKKworCXJldHVybiByZXQ7Cit9CisKKy8qIGNhbGxiYWNrIGZyb20gc2VsZWN0LmMgaW4gY2FzZSBvbmUgb2YgdGhlIGZkJ3MgY2FuIGJlIHJlYWQvd3JpdHRlbiAqLworc3RhdGljIGludCBtaXNkbl9mZF9jYihzdHJ1Y3QgYnNjX2ZkICpiZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lID0gYmZkLT5kYXRhOworCXVuc2lnbmVkIGludCB0c19uciA9IGJmZC0+cHJpdl9ucjsKKwl1bnNpZ25lZCBpbnQgaWR4ID0gdHNfbnItMTsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9ICZsaW5lLT50c1tpZHhdOworCWludCByYyA9IDA7CisKKwlzd2l0Y2ggKGUxaV90cy0+dHlwZSkgeworCWNhc2UgRTFJTlBfVFNfVFlQRV9TSUdOOgorCQlpZiAod2hhdCAmIEJTQ19GRF9SRUFEKQorCQkJcmMgPSBoYW5kbGVfdHMxX3JlYWQoYmZkKTsKKwkJaWYgKHdoYXQgJiBCU0NfRkRfV1JJVEUpCisJCQlyYyA9IGhhbmRsZV90czFfd3JpdGUoYmZkKTsKKwkJYnJlYWs7CisJY2FzZSBFMUlOUF9UU19UWVBFX1RSQVU6CisJCWlmICh3aGF0ICYgQlNDX0ZEX1JFQUQpCisJCQlyYyA9IGhhbmRsZV90c1hfcmVhZChiZmQpOworCQkvKiBXZSBuZXZlciBpbmNsdWRlIHRoZSBtSVNETiBCLUNoYW5uZWwgRkQgaW50byB0aGUKKwkJICogd3JpdGVzZXQsIHNpbmNlIGl0IGRvZXNuJ3Qgc3VwcG9ydCBwb2xsKCkgYmFzZWQKKwkJICogd3JpdGUgZmxvdyBjb250cm9sICovCQkKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJZnByaW50ZihzdGRlcnIsICJ1bmtub3duIEUxIFRTIHR5cGUgJXVcbiIsIGUxaV90cy0+dHlwZSk7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCBhY3RpdmF0ZV9iY2hhbihzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSwgaW50IHRzLCBpbnQgYWN0KQoreworCXN0cnVjdCBtSVNETmhlYWQgaGg7CisJaW50IHJldDsKKwl1bnNpZ25lZCBpbnQgaWR4ID0gdHMtMTsKKwlzdHJ1Y3QgZTFpbnBfdHMgKmUxaV90cyA9ICZsaW5lLT50c1tpZHhdOworCXN0cnVjdCBic2NfZmQgKmJmZCA9ICZlMWlfdHMtPmRyaXZlci5taXNkbi5mZDsKKworCWZwcmludGYoc3Rkb3V0LCAiYWN0aXZhdGUgYmNoYW5cbiIpOworCWlmIChhY3QpCisJCWhoLnByaW0gPSBQSF9BQ1RJVkFURV9SRVE7CisJZWxzZQorCQloaC5wcmltID0gUEhfREVBQ1RJVkFURV9SRVE7CisKKwloaC5pZCA9IE1JU0ROX0lEX0FOWTsKKwlyZXQgPSBzZW5kdG8oYmZkLT5mZCwgJmhoLCBzaXplb2YoaGgpLCAwLCBOVUxMLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlmcHJpbnRmKHN0ZG91dCwgImNvdWxkIG5vdCBzZW5kIEFDVElWQVRFX1JRICVzXG4iLAorCQkJc3RyZXJyb3IoZXJybm8pKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCitzdHJ1Y3QgZTFpbnBfZHJpdmVyIG1pc2RuX2RyaXZlciA9IHsKKwkubmFtZSA9ICJtSVNETnVzZXIiLAorCS53YW50X3dyaXRlID0gdHNfd2FudF93cml0ZSwKK307CisKK3N0YXRpYyBpbnQgbWlfZTFfc2V0dXAoc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUsIGludCByZWxlYXNlX2wyKQoreworCWludCB0cywgcmV0OworCisJLyogVFMwIGlzIENSQzQsIGRvbid0IG5lZWQgYW55IGZkIGZvciBpdCAqLworCWZvciAodHMgPSAxOyB0cyA8IE5VTV9FMV9UUzsgdHMrKykgeworCQl1bnNpZ25lZCBpbnQgaWR4ID0gdHMtMTsKKwkJc3RydWN0IGUxaW5wX3RzICplMWlfdHMgPSAmbGluZS0+dHNbaWR4XTsKKwkJc3RydWN0IGJzY19mZCAqYmZkID0gJmUxaV90cy0+ZHJpdmVyLm1pc2RuLmZkOworCQlzdHJ1Y3Qgc29ja2FkZHJfbUlTRE4gYWRkcjsKKworCQliZmQtPmRhdGEgPSBsaW5lOworCQliZmQtPnByaXZfbnIgPSB0czsKKwkJYmZkLT5jYiA9IG1pc2RuX2ZkX2NiOworCisJCXN3aXRjaCAoZTFpX3RzLT50eXBlKSB7CisJCWNhc2UgRTFJTlBfVFNfVFlQRV9OT05FOgorCQkJY29udGludWU7CisJCQlicmVhazsKKwkJY2FzZSBFMUlOUF9UU19UWVBFX1NJR046CisJCQliZmQtPmZkID0gc29ja2V0KFBGX0lTRE4sIFNPQ0tfREdSQU0sIElTRE5fUF9MQVBEX05UKTsKKwkJCWJmZC0+d2hlbiA9IEJTQ19GRF9SRUFEOworCQkJYnJlYWs7CisJCWNhc2UgRTFJTlBfVFNfVFlQRV9UUkFVOgorCQkJYmZkLT5mZCA9IHNvY2tldChQRl9JU0ROLCBTT0NLX0RHUkFNLCBJU0ROX1BfQl9SQVcpOworCQkJLyogV2UgbmV2ZXIgaW5jbHVkZSB0aGUgbUlTRE4gQi1DaGFubmVsIEZEIGludG8gdGhlCisJIAkJKiB3cml0ZXNldCwgc2luY2UgaXQgZG9lc24ndCBzdXBwb3J0IHBvbGwoKSBiYXNlZAorCSAJCSogd3JpdGUgZmxvdyBjb250cm9sICovCQkKKwkJCWJmZC0+d2hlbiA9IEJTQ19GRF9SRUFEOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAoYmZkLT5mZCA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiJXMgY291bGQgbm90IG9wZW4gc29ja2V0ICVzXG4iLAorCQkJCV9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworCQkJcmV0dXJuIGJmZC0+ZmQ7CisJCX0KKworCQltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisJCWFkZHIuZmFtaWx5ID0gQUZfSVNETjsKKwkJYWRkci5kZXYgPSBsaW5lLT5udW07CisJCXN3aXRjaCAoZTFpX3RzLT50eXBlKSB7CisJCWNhc2UgRTFJTlBfVFNfVFlQRV9TSUdOOgorCQkJYWRkci5jaGFubmVsID0gMDsKKwkJCS8qIFNBUEkgbm90IHN1cHBvcnRlZCB5ZXQgaW4ga2VybmVsICovCisJCQkvL2FkZHIuc2FwaSA9IGUxaW5wX3RzLT5zaWduLnNhcGk7CisJCQlhZGRyLnNhcGkgPSAwOworCQkJYWRkci50ZWkgPSBHUk9VUF9URUk7CisJCQlicmVhazsKKwkJY2FzZSBFMUlOUF9UU19UWVBFX1RSQVU6CisJCQlhZGRyLmNoYW5uZWwgPSB0czsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJREVCVUdQKERNSSwgInVuc3VwcG9ydGVkIEUxIFRTIHR5cGU6ICV1XG4iLAorCQkJCWUxaV90cy0+dHlwZSk7CisJCQlicmVhazsKKwkJfQorCisJCXJldCA9IGJpbmQoYmZkLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKwkJaWYgKHJldCA8IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IGJpbmQgbDIgc29ja2V0ICVzXG4iLAorCQkJCXN0cmVycm9yKGVycm5vKSk7CisJCQlyZXR1cm4gLUVJTzsKKwkJfQorCisJCWlmIChlMWlfdHMtPnR5cGUgPT0gRTFJTlBfVFNfVFlQRV9TSUdOKSB7CisJCQlyZXQgPSBpb2N0bChiZmQtPmZkLCBJTUNMRUFSX0wyLCAmcmVsZWFzZV9sMik7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiY291bGQgbm90IHNlbmQgSU9DVEwgSU1DTEVBTl9MMiAlc1xuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlyZXR1cm4gLUVJTzsKKwkJCX0KKwkJfQorCisJCS8qIEZJWE1FOiBvbmx5IGFjdGl2YXRlIEItQ2hhbm5lbHMgb25jZSB3ZSBzdGFydCB0bworCQkgKiB1c2UgdGhlbSB0byBjb25zZXJ2ZSBDUFUgcG93ZXIgKi8KKwkJaWYgKGUxaV90cy0+dHlwZSA9PSBFMUlOUF9UU19UWVBFX1RSQVUpCisJCQlhY3RpdmF0ZV9iY2hhbihsaW5lLCB0cywgMSk7CisKKwkJcmV0ID0gYnNjX3JlZ2lzdGVyX2ZkKGJmZCk7CisJCWlmIChyZXQgPCAwKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImNvdWxkIG5vdCByZWdpc3RlciBGRDogJXNcbiIsCisJCQkJc3RyZXJyb3IocmV0KSk7CisJCQlyZXR1cm4gcmV0OworCQl9CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBtaV9lMV9saW5lX3VwZGF0ZShzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZSkKK3sKKwlzdHJ1Y3QgbUlTRE5fZGV2aW5mbyBkZXZpbmZvOworCWludCBzaywgcmV0LCBjbnQ7CisKKwlpZiAoIWxpbmUtPmRyaXZlcikgeworCQkvKiB0aGlzIG11c3QgYmUgdGhlIGZpcnN0IHVwZGF0ZSAqLworCQlsaW5lLT5kcml2ZXIgPSAmbWlzZG5fZHJpdmVyOworCX0gZWxzZSB7CisJCS8qIHRoaXMgaXMgYSBzdWJzZXF1ZW50IHVwZGF0ZSAqLworCQkvKiBGSVhNRTogZmlyc3QgY2xvc2UgYWxsIHNvY2tldHMgKi8KKwkJZnByaW50ZihzdGRlcnIsICJpbmNyZW1lbnRhbCBsaW5lIHVwZGF0ZXMgbm90IHN1cHBvcnRlZCB5ZXRcbiIpOworCQlyZXR1cm4gMDsKKwl9CisKKwlpZiAobGluZS0+ZHJpdmVyICE9ICZtaXNkbl9kcml2ZXIpCisJCXJldHVybiAtRUlOVkFMOworCisJLyogb3BlbiB0aGUgSVNETiBjYXJkIGRldmljZSAqLworCXNrID0gc29ja2V0KFBGX0lTRE4sIFNPQ0tfUkFXLCBJU0ROX1BfQkFTRSk7CisJaWYgKHNrIDwgMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIiVzIGNvdWxkIG5vdCBvcGVuIHNvY2tldCAlc1xuIiwKKwkJCV9fZnVuY19fLCBzdHJlcnJvcihlcnJubykpOworCQlyZXR1cm4gc2s7CisJfQorCisJcmV0ID0gaW9jdGwoc2ssIElNR0VUQ09VTlQsICZjbnQpOworCWlmIChyZXQpIHsKKwkJZnByaW50ZihzdGRlcnIsICIlcyBlcnJvciBnZXR0aW5nIGludGVyZiBjb3VudDogJXNcbiIsCisJCQlfX2Z1bmNfXywgc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2Uoc2spOworCQlyZXR1cm4gLUVOT0RFVjsKKwl9CisJLy9ERUJVR1AoRE1JLCIlZCBkZXZpY2UlcyBmb3VuZFxuIiwgY250LCAoY250PT0xKT8iIjoicyIpOworCXByaW50ZigiJWQgZGV2aWNlJXMgZm91bmRcbiIsIGNudCwgKGNudD09MSk/IiI6InMiKTsKKyNpZiAxCisJZGV2aW5mby5pZCA9IGxpbmUtPm51bTsKKwlyZXQgPSBpb2N0bChzaywgSU1HRVRERVZJTkZPLCAmZGV2aW5mbyk7CisJaWYgKHJldCA8IDApIHsKKwkJZnByaW50ZihzdGRvdXQsICJlcnJvciBnZXR0aW5nIGluZm8gZm9yIGRldmljZSAlZDogJXNcbiIsCisJCQlsaW5lLT5udW0sIHN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlmcHJpbnRmKHN0ZG91dCwgIiAgICAgICAgaWQ6ICAgICAgICAgICAgICVkXG4iLCBkZXZpbmZvLmlkKTsKKwlmcHJpbnRmKHN0ZG91dCwgIiAgICAgICAgRHByb3RvY29sczogICAgICUwOHhcbiIsIGRldmluZm8uRHByb3RvY29scyk7CisJZnByaW50ZihzdGRvdXQsICIgICAgICAgIEJwcm90b2NvbHM6ICAgICAlMDh4XG4iLCBkZXZpbmZvLkJwcm90b2NvbHMpOworCWZwcmludGYoc3Rkb3V0LCAiICAgICAgICBwcm90b2NvbDogICAgICAgJWRcbiIsIGRldmluZm8ucHJvdG9jb2wpOworCWZwcmludGYoc3Rkb3V0LCAiICAgICAgICBucmJjaGFuOiAgICAgICAgJWRcbiIsIGRldmluZm8ubnJiY2hhbik7CisJZnByaW50ZihzdGRvdXQsICIgICAgICAgIG5hbWU6ICAgICAgICAgICAlc1xuIiwgZGV2aW5mby5uYW1lKTsKKyNlbmRpZgorCisJaWYgKCEoZGV2aW5mby5EcHJvdG9jb2xzICYgKDEgPDwgSVNETl9QX05UX0UxKSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJlcnJvcjogY2FyZCBpcyBub3Qgb2YgdHlwZSBFMSAoTlQtbW9kZSlcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlyZXQgPSBtaV9lMV9zZXR1cChsaW5lLCAxKTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcikpIHZvaWQgb25fZHNvX2xvYWRfc21zKHZvaWQpCit7CisJLyogcmVnaXN0ZXIgdGhlIGRyaXZlciB3aXRoIHRoZSBjb3JlICovCisJZTFpbnBfZHJpdmVyX3JlZ2lzdGVyKCZtaXNkbl9kcml2ZXIpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtY29uZmlnLmMgYi9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1jb25maWcuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45M2ZlNDQyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtY29uZmlnLmMKQEAgLTAsMCArMSw3MjkgQEAKKy8qIGlwLmFjY2VzcyBuYW5vQlRTIGNvbmZpZ3VyYXRpb24gdG9vbCAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIKKyAqIChDKSAyMDA5IGJ5IE9uIFdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8Z2V0b3B0Lmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzeXMvZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworCisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGltZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2lwYWNjZXNzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZTFfaW5wdXQuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2FiaXNfbm0uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKworc3RhdGljIHN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0OworCitzdGF0aWMgaW50IG5ldF9saXN0ZW5fdGVzdG5yOworc3RhdGljIGludCByZXN0YXJ0Oworc3RhdGljIGNoYXIgKnByaW1fb21sX2lwOworc3RhdGljIGNoYXIgKnVuaXRfaWQ7CitzdGF0aWMgdV9pbnQxNl90IG52X2ZsYWdzOworc3RhdGljIHVfaW50MTZfdCBudl9tYXNrOworc3RhdGljIGNoYXIgKnNvZnR3YXJlID0gTlVMTDsKK3N0YXRpYyBpbnQgc3dfbG9hZF9zdGF0ZSA9IDA7CitzdGF0aWMgaW50IG9tbF9zdGF0ZSA9IDA7CitzdGF0aWMgaW50IGR1bXBfZmlsZXMgPSAwOworCitzdHJ1Y3Qgc3dfbG9hZCB7CisJdV9pbnQ4X3QgZmlsZV9pZFsyNTVdOworCXVfaW50OF90IGZpbGVfaWRfbGVuOworCisJdV9pbnQ4X3QgZmlsZV92ZXJzaW9uWzI1NV07CisJdV9pbnQ4X3QgZmlsZV92ZXJzaW9uX2xlbjsKK307CisKK3N0YXRpYyB2b2lkICp0YWxsX2N0eF9jb25maWcgPSBOVUxMOworc3RhdGljIHN0cnVjdCBzd19sb2FkICpzd19sb2FkMSA9IE5VTEw7CitzdGF0aWMgc3RydWN0IHN3X2xvYWQgKnN3X2xvYWQyID0gTlVMTDsKKworLyoKK3N0YXRpYyB1X2ludDhfdCBwcmltX29tbF9hdHRyW10gPSB7IDB4OTUsIDB4MDAsIDcsIDB4ODgsIDE5MiwgMTY4LCAxMDAsIDExLCAweDAwLCAweDAwIH07CitzdGF0aWMgdV9pbnQ4X3QgdW5pdF9pZF9hdHRyW10gPSB7IDB4OTEsIDB4MDAsIDksICcyJywgJzMnLCAnNCcsICcyJywgJy8nICwgJzAnLCAnLycsICcwJywgMHgwMCB9OworKi8KKworLyoKKyAqIENhbGxiYWNrIGZ1bmN0aW9uIGZvciBOQUNLIG9uIHRoZSBPTUwgTk0KKyAqCisgKiBDdXJyZW50bHkgd2Ugc2VuZCB0aGUgY29uZmlnIHJlcXVlc3RzIGJ1dCBkb24ndCBjaGVjayB0aGUKKyAqIHJlc3VsdC4gVGhlIG5hbm9CVFMgd2lsbCBzZW5kIHVzIGEgTkFDSyB3aGVuIHdlIGRpZCBzb21ldGhpbmcgdGhlCisgKiBCVFMgZGlkbid0IGxpa2UuCisgKi8KK3N0YXRpYyBpbnQgaXBhY2NfbXNnX25hY2sodV9pbnQ4X3QgbXQpCit7CisJZnByaW50ZihzdGRlcnIsICJGYWlsdXJlIHRvIHNldCBhdHRyaWJ1dGUuIFRoaXMgc2VlbXMgZmF0YWxcbiIpOworCWV4aXQoLTEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGlwYWNjX21zZ19hY2sodV9pbnQ4X3QgbXQsIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJaWYgKHN3X2xvYWRfc3RhdGUgPT0gMSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlRoZSBuZXcgc29mdHdhcmUgaXMgYWN0aXZhZWQuXG4iKTsKKworCQlpZiAocmVzdGFydCkgeworCQkJYWJpc19ubV9pcGFjY2Vzc19yZXN0YXJ0KGJ0cyk7CisJCX0gZWxzZSB7CisJCQlleGl0KDApOworCQl9CisJfSBlbHNlIGlmIChvbWxfc3RhdGUgPT0gMSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlNldCB0aGUgcHJpbWFyeSBPTUwgSVAuXG4iKTsKKwkJaWYgKHJlc3RhcnQpIHsKKwkJCWFiaXNfbm1faXBhY2Nlc3NfcmVzdGFydChidHMpOworCQl9IGVsc2UgeworCQkJZXhpdCgwKTsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdHJ1Y3QgaXBhY2NfZmVycl9lbGVtIHsKKwlpbnQxNl90IGZyZXFfZXJyOworCXVfaW50OF90IGZyZXFfcXVhbDsKKwl1X2ludDhfdCBhcmZjbjsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBpcGFjY19jdXNhZ2VfZWxlbSB7CisJdV9pbnQxNl90IGFyZmNuOjEwLAorCQkgIHJ4bGV2OjY7Cit9IF9fYXR0cmlidXRlX18gKChwYWNrZWQpKTsKKworc3RhdGljIGludCB0ZXN0X3JlcCh2b2lkICpfbXNnKQoreworCXN0cnVjdCBtc2diICptc2cgPSBfbXNnOworCXN0cnVjdCBhYmlzX29tX2ZvbV9oZHIgKmZvaCA9IG1zZ2JfbDMobXNnKTsKKwl1X2ludDE2X3QgdGVzdF9yZXBfbGVuLCBmZXJyX2xpc3RfbGVuOworCXN0cnVjdCBpcGFjY19mZXJyX2VsZW0gKmlmZTsKKwlzdHJ1Y3QgaXBhY19iY2NoX2luZm8gYmluZm87CisJaW50IGksIHJjOworCisJREVCVUdQKEROTSwgIlRFU1QgUkVQT1JUOiAiKTsKKworCWlmIChmb2gtPmRhdGFbMF0gIT0gTk1fQVRUX1RFU1RfTk8gfHwKKwkgICAgZm9oLT5kYXRhWzJdICE9IE5NX0FUVF9URVNUX1JFUE9SVCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlERUJVR1BDKEROTSwgInRlc3Rfbm89MHglMDJ4ICIsIGZvaC0+ZGF0YVsxXSk7CisJLyogZGF0YVsyXSA9PSBOTV9BVFRfVEVTVF9SRVBPUlQgKi8KKwkvKiBkYXRhWzMuLjRdOiB0ZXN0X3JlcF9sZW4gKi8KKwl0ZXN0X3JlcF9sZW4gPSBudG9ocygqKHVfaW50MTZfdCAqKSAmZm9oLT5kYXRhWzNdKTsKKwkvKiBkYXRhWzVdOiBpcC5hY2Nlc3MgdGVzdCByZXN1bHQgKi8KKwlERUJVR1BDKEROTSwgInRlc3RfcmVzPSVzXG4iLCBpcGFjY190ZXN0cmVzX25hbWUoZm9oLT5kYXRhWzVdKSk7CisKKwkvKiBkYXRhWzZdOiBpcC5hY2Nlc3MgbmVzdGVkIElFLiAzID09IGZyZXFfZXJyX2xpc3QgKi8KKwlzd2l0Y2ggKGZvaC0+ZGF0YVs2XSkgeworCWNhc2UgTk1fSVBBQ19FSUVfRlJFUV9FUlJfTElTVDoKKwkJLyogZGF0YVs3Li44XTogbGVuZ3RoIG9mIGZlcnJfbGlzdCAqLworCQlmZXJyX2xpc3RfbGVuID0gbnRvaHMoKih1X2ludDE2X3QgKikgJmZvaC0+ZGF0YVs3XSk7CisKKwkJLyogZGF0YVs5Li4uXTogZnJlcXVlbmN5IGVycm9yIGxpc3QgZWxlbWVudHMgKi8KKwkJZm9yIChpID0gMDsgaSA8IGZlcnJfbGlzdF9sZW47IGkrPSBzaXplb2YoKmlmZSkpIHsKKwkJCWlmZSA9IChzdHJ1Y3QgaXBhY2NfZmVycl9lbGVtICopIChmb2gtPmRhdGEgKyA5ICsgaSk7CisJCQlERUJVR1AoRE5NLCAiPT0+IEFSRkNOICU0dSwgRnJlcXVlbmN5IEVycm9yICU2aGRcbiIsCisJCQlpZmUtPmFyZmNuLCBudG9ocyhpZmUtPmZyZXFfZXJyKSk7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBOTV9JUEFDX0VJRV9DSEFOX1VTRV9MSVNUOgorCQkvKiBkYXRhWzcuLjhdOiBsZW5ndGggb2YgZmVycl9saXN0ICovCisJCWZlcnJfbGlzdF9sZW4gPSBudG9ocygqKHVfaW50MTZfdCAqKSAmZm9oLT5kYXRhWzddKTsKKworCQkvKiBkYXRhWzkuLi5dOiBjaGFubmVsIHVzYWdlIGxpc3QgZWxlbWVudHMgKi8KKwkJZm9yIChpID0gMDsgaSA8IGZlcnJfbGlzdF9sZW47IGkrPSAyKSB7CisJCQl1X2ludDE2X3QgKmN1X3B0ciA9ICh1X2ludDE2X3QgKikoZm9oLT5kYXRhICsgOSArIGkpOworCQkJdV9pbnQxNl90IGN1ID0gbnRvaHMoKmN1X3B0cik7CisJCQlERUJVR1AoRE5NLCAiPT0+IEFSRkNOICU0dSwgUnhMZXYgJTJ1XG4iLAorCQkJCWN1ICYgMHgzZmYsIGN1ID4+IDEwKTsKKwkJfQorCQlicmVhazsKKwljYXNlIE5NX0lQQUNfRUlFX0JDQ0hfSU5GT19UWVBFOgorCQlicmVhazsKKwljYXNlIE5NX0lQQUNfRUlFX0JDQ0hfSU5GTzoKKwkJcmMgPSBpcGFjX3BhcnNlX2JjY2hfaW5mbygmYmluZm8sIGZvaC0+ZGF0YSs2KTsKKwkJaWYgKHJjIDwgMCkgeworCQkJREVCVUdQKEROTSwgIkJDQ0ggSW5mbyBwYXJzaW5nIGZhaWxlZFxuIik7CisJCQlicmVhazsKKwkJfQorCQlERUJVR1AoRE5NLCAiPT0+IEFSRkNOICV1LCBSeExldiAlMnUsIFJ4UXVhbCAlMnU6ICUzZC0lZCwgTEFDICVkIENJICVkXG4iLAorCQkJYmluZm8uYXJmY24sIGJpbmZvLnJ4X2xldiwgYmluZm8ucnhfcXVhbCwKKwkJCWJpbmZvLmNnaS5tY2MsIGJpbmZvLmNnaS5tbmMsCisJCQliaW5mby5jZ2kubGFjLCBiaW5mby5jZ2kuY2kpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBubV9zaWdfY2IodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJICAgICB2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCXN0cnVjdCBpcGFjY19hY2tfc2lnbmFsX2RhdGEgKmlwYWNjX2RhdGE7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU19OTV9JUEFDQ19OQUNLOgorCQlpcGFjY19kYXRhID0gc2lnbmFsX2RhdGE7CisJCXJldHVybiBpcGFjY19tc2dfbmFjayhpcGFjY19kYXRhLT5tc2dfdHlwZSk7CisJY2FzZSBTX05NX0lQQUNDX0FDSzoKKwkJaXBhY2NfZGF0YSA9IHNpZ25hbF9kYXRhOworCQlyZXR1cm4gaXBhY2NfbXNnX2FjayhpcGFjY19kYXRhLT5tc2dfdHlwZSwgaXBhY2NfZGF0YS0+YnRzKTsKKwljYXNlIFNfTk1fVEVTVF9SRVA6CisJCXJldHVybiB0ZXN0X3JlcChzaWduYWxfZGF0YSk7CisJY2FzZSBTX05NX0lQQUNDX1JFU1RBUlRfQUNLOgorCQlwcmludGYoIlRoZSBCVFMgaGFzIGFja2VkIHRoZSByZXN0YXJ0LiBFeGl0aW5nLlxuIik7CisJCWV4aXQoMCk7CisJCWJyZWFrOworCWNhc2UgU19OTV9JUEFDQ19SRVNUQVJUX05BQ0s6CisJCXByaW50ZigiVGhlIEJUUyBoYXMgbmFja2VkIHRoZSByZXN0YXJ0LiBFeGl0aW5nLlxuIik7CisJCWV4aXQoMCk7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCisvKiBjYWxsYmFjayBmdW5jdGlvbiBwYXNzZWQgdG8gdGhlIEFCSVMgT01MIGNvZGUgKi8KK3N0YXRpYyBpbnQgcGVyY2VudDsKK3N0YXRpYyBpbnQgcGVyY2VudF9vbGQ7CitzdGF0aWMgaW50IHN3bG9hZF9jYmZuKHVuc2lnbmVkIGludCBob29rLCB1bnNpZ25lZCBpbnQgZXZlbnQsIHN0cnVjdCBtc2diICpfbXNnLAorCQkgICAgICAgdm9pZCAqZGF0YSwgdm9pZCAqcGFyYW0pCit7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCisJaWYgKGhvb2sgIT0gR1NNX0hPT0tfTk1fU1dMT0FEKQorCQlyZXR1cm4gMDsKKworCWJ0cyA9IChzdHJ1Y3QgZ3NtX2J0cyAqKSBkYXRhOworCisJc3dpdGNoIChldmVudCkgeworCWNhc2UgTk1fTVRfTE9BRF9JTklUX0FDSzoKKwkJZnByaW50ZihzdGRvdXQsICJTb2Z0d2FyZSBMb2FkIEluaXRpYXRlIEFDS1xuIik7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfTE9BRF9JTklUX05BQ0s6CisJCWZwcmludGYoc3RkZXJyLCAiRVJST1I6IFNvZnR3YXJlIExvYWQgSW5pdGlhdGUgTkFDS1xuIik7CisJCWV4aXQoNSk7CisJCWJyZWFrOworCWNhc2UgTk1fTVRfTE9BRF9FTkRfQUNLOgorCQlmcHJpbnRmKHN0ZGVyciwgIkxPQUQgRU5EIEFDSy4uLiIpOworCQkvKiBub3cgbWFrZSBpdCB0aGUgZGVmYXVsdCAqLworCQlzd19sb2FkX3N0YXRlID0gMTsKKworCQltc2cgPSBtc2diX2FsbG9jKDEwMjQsICJzdzogbnZhdHRyIik7CisJCW1zZy0+bDJoID0gbXNnYl9wdXQobXNnLCAzKTsKKwkJbXNnLT5sM2ggPSAmbXNnLT5sMmhbM107CisKKwkJLyogYWN0aXZhdGUgc29mdHdhcmUgKi8KKwkJaWYgKHN3X2xvYWQxKSB7CisJCQltc2diX3ZfcHV0KG1zZywgTk1fQVRUX1NXX0RFU0NSKTsKKwkJCW1zZ2JfdGwxNnZfcHV0KG1zZywgTk1fQVRUX0ZJTEVfSUQsIHN3X2xvYWQxLT5maWxlX2lkX2xlbiwgc3dfbG9hZDEtPmZpbGVfaWQpOworCQkJbXNnYl90bDE2dl9wdXQobXNnLCBOTV9BVFRfRklMRV9WRVJTSU9OLCBzd19sb2FkMS0+ZmlsZV92ZXJzaW9uX2xlbiwKKwkJCQkJc3dfbG9hZDEtPmZpbGVfdmVyc2lvbik7CisJCX0KKworCQlpZiAoc3dfbG9hZDIpIHsKKwkJCW1zZ2Jfdl9wdXQobXNnLCBOTV9BVFRfU1dfREVTQ1IpOworCQkJbXNnYl90bDE2dl9wdXQobXNnLCBOTV9BVFRfRklMRV9JRCwgc3dfbG9hZDItPmZpbGVfaWRfbGVuLCBzd19sb2FkMi0+ZmlsZV9pZCk7CisJCQltc2diX3RsMTZ2X3B1dChtc2csIE5NX0FUVF9GSUxFX1ZFUlNJT04sIHN3X2xvYWQyLT5maWxlX3ZlcnNpb25fbGVuLAorCQkJCQlzd19sb2FkMi0+ZmlsZV92ZXJzaW9uKTsKKwkJfQorCisJCS8qIGZpbGwgaW4gdGhlIGRhdGEgKi8KKwkJbXNnLT5sMmhbMF0gPSBOTV9BVFRfSVBBQ0NfQ1VSX1NXX0NGRzsKKwkJbXNnLT5sMmhbMV0gPSBtc2diX2wzbGVuKG1zZykgPj4gODsKKwkJbXNnLT5sMmhbMl0gPSBtc2diX2wzbGVuKG1zZykgJiAweGZmOworCQlwcmludGYoIkZvbyBsMmg6ICVwIGwzaDogJXAuLi4gbGVuZ3RoIGwyOiAldSAgbDM6ICV1XG4iLCBtc2ctPmwyaCwgbXNnLT5sM2gsIG1zZ2JfbDJsZW4obXNnKSwgbXNnYl9sM2xlbihtc2cpKTsKKwkJYWJpc19ubV9pcGFjY2Vzc19zZXRfbnZhdHRyKGJ0cy0+YzAsIG1zZy0+bDJoLCBtc2diX2wybGVuKG1zZykpOworCQltc2diX2ZyZWUobXNnKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9MT0FEX0VORF9OQUNLOgorCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBTb2Z0d2FyZSBMb2FkIEVuZCBOQUNLXG4iKTsKKwkJZXhpdCgzKTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9BQ1RJVkFURV9TV19OQUNLOgorCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBBY3RpdmF0ZSBTb2Z0d2FyZSBOQUNLXG4iKTsKKwkJZXhpdCg0KTsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9BQ1RJVkFURV9TV19BQ0s6CisJCWJyZWFrOworCWNhc2UgTk1fTVRfTE9BRF9TRUdfQUNLOgorCQlwZXJjZW50ID0gYWJpc19ubV9zb2Z0d2FyZV9sb2FkX3N0YXR1cyhidHMpOworCQlpZiAocGVyY2VudCA+IHBlcmNlbnRfb2xkKQorCQkJcHJpbnRmKCJTb2Z0d2FyZSBEb3dubG9hZCBQcm9ncmVzczogJWQlJVxuIiwgcGVyY2VudCk7CisJCXBlcmNlbnRfb2xkID0gcGVyY2VudDsKKwkJYnJlYWs7CisJY2FzZSBOTV9NVF9MT0FEX0FCT1JUOgorCQlmcHJpbnRmKHN0ZGVyciwgIkVSUk9SOiBMb2FkIGFib3J0ZWQgYnkgdGhlIEJUUy5cbiIpOworCQlleGl0KDYpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGJvb3RzdHJhcF9vbShzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCWludCBsZW47CisJc3RhdGljIHVfaW50OF90IGJ1ZlsxMDI0XTsKKwl1X2ludDhfdCAqY3VyID0gYnVmOworCisJcHJpbnRmKCJPTUwgbGluayBlc3RhYmxpc2hlZFxuIik7CisKKwlpZiAodW5pdF9pZCkgeworCQlsZW4gPSBzdHJsZW4odW5pdF9pZCk7CisJCWlmIChsZW4gPiBzaXplb2YoYnVmKS0xMCkKKwkJCXJldHVybjsKKwkJYnVmWzBdID0gTk1fQVRUX0lQQUNDX1VOSVRfSUQ7CisJCWJ1ZlsxXSA9IChsZW4rMSkgPj4gODsKKwkJYnVmWzJdID0gKGxlbisxKSAmIDB4ZmY7CisJCW1lbWNweShidWYrMywgdW5pdF9pZCwgbGVuKTsKKwkJYnVmWzMrbGVuXSA9IDA7CisJCXByaW50Zigic2V0dGluZyBVbml0IElEIHRvICclcydcbiIsIHVuaXRfaWQpOworCQlhYmlzX25tX2lwYWNjZXNzX3NldF9udmF0dHIoYnRzLT5jMCwgYnVmLCAzK2xlbisxKTsKKwl9CisJaWYgKHByaW1fb21sX2lwKSB7CisJCXN0cnVjdCBpbl9hZGRyIGlhOworCisJCWlmICghaW5ldF9hdG9uKHByaW1fb21sX2lwLCAmaWEpKSB7CisJCQlmcHJpbnRmKHN0ZGVyciwgImludmFsaWQgSVAgYWRkcmVzczogJXNcbiIsCisJCQkJcHJpbV9vbWxfaXApOworCQkJcmV0dXJuOworCQl9CisKKwkJLyogMHg4OCArIElQICsgcG9ydCAqLworCQlsZW4gPSAxICsgc2l6ZW9mKGlhKSArIDI7CisKKwkJKmN1cisrID0gTk1fQVRUX0lQQUNDX1BSSU1fT01MX0NGR19MSVNUOworCQkqY3VyKysgPSAobGVuKSA+PiA4OworCQkqY3VyKysgPSAobGVuKSAmIDB4ZmY7CisJCSpjdXIrKyA9IDB4ODg7CisJCW1lbWNweShjdXIsICZpYSwgc2l6ZW9mKGlhKSk7CisJCWN1ciArPSBzaXplb2YoaWEpOworCQkqY3VyKysgPSAwOworCQkqY3VyKysgPSAwOworCQlwcmludGYoInNldHRpbmcgcHJpbWFyeSBPTUwgbGluayBJUCB0byAnJXMnXG4iLCBpbmV0X250b2EoaWEpKTsKKwkJb21sX3N0YXRlID0gMTsKKwkJYWJpc19ubV9pcGFjY2Vzc19zZXRfbnZhdHRyKGJ0cy0+YzAsIGJ1ZiwgMytsZW4pOworCX0KKwlpZiAobnZfbWFzaykgeworCQlsZW4gPSA0OworCisJCSpjdXIrKyA9IE5NX0FUVF9JUEFDQ19OVl9GTEFHUzsKKwkJKmN1cisrID0gKGxlbikgPj4gODsKKwkJKmN1cisrID0gKGxlbikgJiAweGZmOworCQkqY3VyKysgPSBudl9mbGFncyAmIDB4ZmY7CisJCSpjdXIrKyA9IG52X21hc2sgJiAweGZmOworCQkqY3VyKysgPSBudl9mbGFncyA+PiA4OworCQkqY3VyKysgPSBudl9tYXNrID4+IDg7CisJCXByaW50Zigic2V0dGluZyBOViBGbGFncy9NYXNrIHRvIDB4JTA0eC8weCUwNHhcbiIsCisJCQludl9mbGFncywgbnZfbWFzayk7CisJCWFiaXNfbm1faXBhY2Nlc3Nfc2V0X252YXR0cihidHMtPmMwLCBidWYsIDMrbGVuKTsKKwl9CisKKwlpZiAocmVzdGFydCAmJiAhcHJpbV9vbWxfaXAgJiYgIXNvZnR3YXJlKSB7CisJCXByaW50ZigicmVzdGFydGluZyBCVFNcbiIpOworCQlhYmlzX25tX2lwYWNjZXNzX3Jlc3RhcnQoYnRzKTsKKwl9CisKK30KKwordm9pZCBpbnB1dF9ldmVudChpbnQgZXZlbnQsIGVudW0gZTFpbnBfc2lnbl90eXBlIHR5cGUsIHN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4KQoreworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIEVWVF9FMV9URUlfVVA6CisJCXN3aXRjaCAodHlwZSkgeworCQljYXNlIEUxSU5QX1NJR05fT01MOgorCQkJYm9vdHN0cmFwX29tKHRyeC0+YnRzKTsKKwkJCWJyZWFrOworCQljYXNlIEUxSU5QX1NJR05fUlNMOgorCQkJLyogRklYTUUgKi8KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJYnJlYWs7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBFVlRfRTFfVEVJX0ROOgorCQlmcHJpbnRmKHN0ZGVyciwgIkxvc3Qgc29tZSBFMSBURUkgbGlua1xuIik7CisJCS8qIEZJWE1FOiBkZWFsIHdpdGggVEVJIG9yIEwxIGxpbmsgbG9zcyAqLworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9Cit9CisKK2ludCBubV9zdGF0ZV9ldmVudChlbnVtIG5tX2V2dCBldnQsIHVfaW50OF90IG9ial9jbGFzcywgdm9pZCAqb2JqLAorCQkgICBzdHJ1Y3QgZ3NtX25tX3N0YXRlICpvbGRfc3RhdGUsIHN0cnVjdCBnc21fbm1fc3RhdGUgKm5ld19zdGF0ZSkKK3sKKwlpZiAoZXZ0ID09IEVWVF9TVEFURUNIR19PUEVSICYmCisJICAgIG9ial9jbGFzcyA9PSBOTV9PQ19SQURJT19DQVJSSUVSICYmCisJICAgIG5ld19zdGF0ZS0+YXZhaWxhYmlsaXR5ID09IDMpIHsKKwkJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSBvYmo7CisKKwkJaWYgKG5ldF9saXN0ZW5fdGVzdG5yKSB7CisJCQl1X2ludDhfdCBwaHlzX2NvbmZpZ1tdID0geyAweDAyLCAweDBhLCAweDAwLCAweDAxLCAweDAyIH07CisJCQlhYmlzX25tX3BlcmZvcm1fdGVzdCh0cngtPmJ0cywgMiwgMCwgMCwgMHhmZiwKKwkJCQkJICAgICBuZXRfbGlzdGVuX3Rlc3RuciwgMSwKKwkJCQkJICAgICBwaHlzX2NvbmZpZywgc2l6ZW9mKHBoeXNfY29uZmlnKSk7CisJCX0gZWxzZSBpZiAoc29mdHdhcmUpIHsKKwkJCWludCByYzsKKwkJCXByaW50ZigiQXR0ZW1wdGluZyBzb2Z0d2FyZSB1cGxvYWQgd2l0aCAnJXMnXG4iLCBzb2Z0d2FyZSk7CisJCQlyYyA9IGFiaXNfbm1fc29mdHdhcmVfbG9hZCh0cngtPmJ0cywgc29mdHdhcmUsIDE5LCAwLCBzd2xvYWRfY2JmbiwgdHJ4LT5idHMpOworCQkJaWYgKHJjIDwgMCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHN0YXJ0IHNvZnR3YXJlIGxvYWRcbiIpOworCQkJCWV4aXQoLTMpOworCQkJfQorCQl9CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHN3X2xvYWQgKmNyZWF0ZV9zd2xvYWQoc3RydWN0IHNkcF9oZWFkZXIgKmhlYWRlcikKK3sKKwlzdHJ1Y3Qgc3dfbG9hZCAqbG9hZDsKKworCWxvYWQgPSB0YWxsb2NfemVybyh0YWxsX2N0eF9jb25maWcsIHN0cnVjdCBzd19sb2FkKTsKKworCXN0cm5jcHkoKGNoYXIgKilsb2FkLT5maWxlX2lkLCBoZWFkZXItPmZpcm13YXJlX2luZm8uc3dfcGFydCwgMjApOworCWxvYWQtPmZpbGVfaWRfbGVuID0gc3RybGVuKGhlYWRlci0+ZmlybXdhcmVfaW5mby5zd19wYXJ0KSArIDE7CisKKwlzdHJuY3B5KChjaGFyICopbG9hZC0+ZmlsZV92ZXJzaW9uLCBoZWFkZXItPmZpcm13YXJlX2luZm8udmVyc2lvbiwgMjApOworCWxvYWQtPmZpbGVfdmVyc2lvbl9sZW4gPSBzdHJsZW4oaGVhZGVyLT5maXJtd2FyZV9pbmZvLnZlcnNpb24pICsgMTsKKworCXJldHVybiBsb2FkOworfQorCitzdGF0aWMgaW50IGZpbmRfc3dfbG9hZF9wYXJhbXMoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJc3RydWN0IHN0YXQgc3RhdDsKKwlzdHJ1Y3Qgc2RwX2hlYWRlciAqaGVhZGVyOworCXN0cnVjdCBsbGlzdF9oZWFkICplbnRyeTsKKwlpbnQgZmQ7CisJdm9pZCAqdGFsbF9maXJtX2N0eCA9IDA7CisKKwllbnRyeSA9IHRhbGxvY196ZXJvKHRhbGxfZmlybV9jdHgsIHN0cnVjdCBsbGlzdF9oZWFkKTsKKwlJTklUX0xMSVNUX0hFQUQoZW50cnkpOworCisJZmQgPSBvcGVuKGZpbGVuYW1lLCBPX1JET05MWSk7CisJaWYgKCFmZCkgeworCQlwZXJyb3IoIm5hZGEiKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIHZlcmlmeSB0aGUgZmlsZSAqLworCWlmIChmc3RhdChmZCwgJnN0YXQpID09IC0xKSB7CisJCXBlcnJvcigiQ2FuIG5vdCBzdGF0IHRoZSBmaWxlIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpcGFjY2Vzc19hbmFseXplX2ZpbGUoZmQsIHN0YXQuc3Rfc2l6ZSwgMCwgZW50cnkpOworCWlmIChjbG9zZShmZCkgIT0gMCkgeworCQlwZXJyb3IoIkNsb3NlIGZhaWxlZC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyogdHJ5IHRvIGZpbmQgd2hhdCB3ZSBhcmUgbG9va2luZyBmb3IgKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShoZWFkZXIsIGVudHJ5LCBlbnRyeSkgeworCQlpZiAobnRvaHMoaGVhZGVyLT5maXJtd2FyZV9pbmZvLm1vcmVfbW9yZV9tYWdpYykgPT0gMHgxMDAwKSB7CisJCQlzd19sb2FkMSA9IGNyZWF0ZV9zd2xvYWQoaGVhZGVyKTsKKwkJfSBlbHNlIGlmIChudG9ocyhoZWFkZXItPmZpcm13YXJlX2luZm8ubW9yZV9tb3JlX21hZ2ljKSA9PSAweDIwMDEpIHsKKwkJCXN3X2xvYWQyID0gY3JlYXRlX3N3bG9hZChoZWFkZXIpOworCQl9CisJfQorCisJaWYgKCFzd19sb2FkMSB8fCAhc3dfbG9hZDIpIHsKKwkJZnByaW50ZihzdGRlcnIsICJEaWQgbm90IGZpbmQgZGF0YS5cbiIpOworCQl0YWxsb2NfZnJlZSh0YWxsX2Zpcm1fY3R4KTsKKwkJcmV0dXJuIC0xOworICAgICAgICB9CisKKwl0YWxsb2NfZnJlZSh0YWxsX2Zpcm1fY3R4KTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZHVtcF9lbnRyeShzdHJ1Y3Qgc2RwX2hlYWRlcl9pdGVtICpzdWJfZW50cnksIGludCBwYXJ0LCBpbnQgZmQpCit7CisJaW50IG91dF9mZDsKKwlpbnQgY29waWVkOworCWNoYXIgZmlsZW5hbWVbNDA5Nl07CisJb2ZmX3QgdGFyZ2V0OworCisJaWYgKCFkdW1wX2ZpbGVzKQorCQlyZXR1cm47CisKKwlpZiAoc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkuc29tZXRoaW5nMSA9PSAwKQorCQlyZXR1cm47CisKKwlzbnByaW50ZihmaWxlbmFtZSwgc2l6ZW9mKGZpbGVuYW1lKSwgInBhcnQuJWQiLCBwYXJ0KyspOworCW91dF9mZCA9IG9wZW4oZmlsZW5hbWUsIE9fV1JPTkxZIHwgT19DUkVBVCwgMDY2MCk7CisJaWYgKG91dF9mZCA8IDApIHsKKwkJcGVycm9yKCJDYW4gbm90IGR1bXAgZmlybXdhcmUiKTsKKwkJcmV0dXJuOworCX0KKworCXRhcmdldCA9IHN1Yl9lbnRyeS0+YWJzb2x1dGVfb2Zmc2V0ICsgbnRvaGwoc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkuc3RhcnQpICsgNDsKKwlpZiAobHNlZWsoZmQsIHRhcmdldCwgU0VFS19TRVQpICE9IHRhcmdldCkgeworCQlwZXJyb3IoInNlZWsgZmFpbGVkIik7CisJCWNsb3NlKG91dF9mZCk7CisJCXJldHVybjsKKwl9CisKKwlmb3IgKGNvcGllZCA9IDA7IGNvcGllZCA8IG50b2hsKHN1Yl9lbnRyeS0+aGVhZGVyX2VudHJ5Lmxlbmd0aCk7ICsrY29waWVkKSB7CisJCWNoYXIgYzsKKwkJaWYgKHJlYWQoZmQsICZjLCBzaXplb2YoYykpICE9IHNpemVvZihjKSkgeworCQkJcGVycm9yKCJjb3B5IGZhaWxlZCIpOworCQkJYnJlYWs7CisJCX0KKworCQlpZiAod3JpdGUob3V0X2ZkLCAmYywgc2l6ZW9mKGMpKSAhPSBzaXplb2YoYykpIHsKKwkJCXBlcnJvcigid3JpdGUgZmFpbGVkIik7CisJCQlicmVhazsKKwkJfQorCX0KKworCWNsb3NlKG91dF9mZCk7Cit9CisKK3N0YXRpYyB2b2lkIGFuYWx5emVfZmlybXdhcmUoY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJc3RydWN0IHN0YXQgc3RhdDsKKwlzdHJ1Y3Qgc2RwX2hlYWRlciAqaGVhZGVyOworCXN0cnVjdCBzZHBfaGVhZGVyX2l0ZW0gKnN1Yl9lbnRyeTsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCAqZW50cnk7CisJaW50IGZkOworCXZvaWQgKnRhbGxfZmlybV9jdHggPSAwOworCWludCBwYXJ0ID0gMDsKKworCWVudHJ5ID0gdGFsbG9jX3plcm8odGFsbF9maXJtX2N0eCwgc3RydWN0IGxsaXN0X2hlYWQpOworCUlOSVRfTExJU1RfSEVBRChlbnRyeSk7CisKKwlwcmludGYoIk9wZW5pbmcgcG9zc2libGUgZmlybXdhcmUgJyVzJ1xuIiwgZmlsZW5hbWUpOworCWZkID0gb3BlbihmaWxlbmFtZSwgT19SRE9OTFkpOworCWlmICghZmQpIHsKKwkJcGVycm9yKCJuYWRhIik7CisJCXJldHVybjsKKwl9CisKKwkvKiB2ZXJpZnkgdGhlIGZpbGUgKi8KKwlpZiAoZnN0YXQoZmQsICZzdGF0KSA9PSAtMSkgeworCQlwZXJyb3IoIkNhbiBub3Qgc3RhdCB0aGUgZmlsZSIpOworCQlyZXR1cm47CisJfQorCisJaXBhY2Nlc3NfYW5hbHl6ZV9maWxlKGZkLCBzdGF0LnN0X3NpemUsIDAsIGVudHJ5KTsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGhlYWRlciwgZW50cnksIGVudHJ5KSB7CisJCXByaW50ZigiUHJpbnRpbmcgaGVhZGVyIGluZm9ybWF0aW9uOlxuIik7CisJCXByaW50ZigibW9yZV9tb3JlX21hZ2ljOiAweCV4XG4iLCBudG9ocyhoZWFkZXItPmZpcm13YXJlX2luZm8ubW9yZV9tb3JlX21hZ2ljKSk7CisJCXByaW50ZigiaGVhZGVyX2xlbmd0aDogJXVcbiIsIG50b2hsKGhlYWRlci0+ZmlybXdhcmVfaW5mby5oZWFkZXJfbGVuZ3RoKSk7CisJCXByaW50ZigiZmlsZV9sZW5ndGg6ICV1XG4iLCBudG9obChoZWFkZXItPmZpcm13YXJlX2luZm8uZmlsZV9sZW5ndGgpKTsKKwkJcHJpbnRmKCJzd19wYXJ0OiAlLjIwc1xuIiwgaGVhZGVyLT5maXJtd2FyZV9pbmZvLnN3X3BhcnQpOworCQlwcmludGYoInRleHQxOiAlLjY0c1xuIiwgaGVhZGVyLT5maXJtd2FyZV9pbmZvLnRleHQxKTsKKwkJcHJpbnRmKCJ0aW1lOiAlLjEyc1xuIiwgaGVhZGVyLT5maXJtd2FyZV9pbmZvLnRpbWUpOworCQlwcmludGYoImRhdGU6ICUuMTRzXG4iLCBoZWFkZXItPmZpcm13YXJlX2luZm8uZGF0ZSk7CisJCXByaW50ZigidGV4dDI6ICUuMTBzXG4iLCBoZWFkZXItPmZpcm13YXJlX2luZm8udGV4dDIpOworCQlwcmludGYoInZlcnNpb246ICUuMjBzXG4iLCBoZWFkZXItPmZpcm13YXJlX2luZm8udmVyc2lvbik7CisJCXByaW50Zigic3ViaXRlbXMuLi5cbiIpOworCisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHN1Yl9lbnRyeSwgJmhlYWRlci0+aGVhZGVyX2xpc3QsIGVudHJ5KSB7CisJCQlwcmludGYoIlx0c29tZXRoaW5nMTogJXVcbiIsIHN1Yl9lbnRyeS0+aGVhZGVyX2VudHJ5LnNvbWV0aGluZzEpOworCQkJcHJpbnRmKCJcdHRleHQxOiAlLjY0c1xuIiwgc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkudGV4dDEpOworCQkJcHJpbnRmKCJcdHRpbWU6ICUuMTJzXG4iLCBzdWJfZW50cnktPmhlYWRlcl9lbnRyeS50aW1lKTsKKwkJCXByaW50ZigiXHRkYXRlOiAlLjE0c1xuIiwgc3ViX2VudHJ5LT5oZWFkZXJfZW50cnkuZGF0ZSk7CisJCQlwcmludGYoIlx0dGV4dDI6ICUuMTBzXG4iLCBzdWJfZW50cnktPmhlYWRlcl9lbnRyeS50ZXh0Mik7CisJCQlwcmludGYoIlx0dmVyc2lvbjogJS4yMHNcbiIsIHN1Yl9lbnRyeS0+aGVhZGVyX2VudHJ5LnZlcnNpb24pOworCQkJcHJpbnRmKCJcdGxlbmd0aDogJXVcbiIsIG50b2hsKHN1Yl9lbnRyeS0+aGVhZGVyX2VudHJ5Lmxlbmd0aCkpOworCQkJcHJpbnRmKCJcdGFkZHIxOiAweCV4XG4iLCBudG9obChzdWJfZW50cnktPmhlYWRlcl9lbnRyeS5hZGRyMSkpOworCQkJcHJpbnRmKCJcdGFkZHIyOiAweCV4XG4iLCBudG9obChzdWJfZW50cnktPmhlYWRlcl9lbnRyeS5hZGRyMikpOworCQkJcHJpbnRmKCJcdHN0YXJ0OiAweCV4XG4iLCBudG9obChzdWJfZW50cnktPmhlYWRlcl9lbnRyeS5zdGFydCkpOworCQkJcHJpbnRmKCJcdGFicy4gb2Zmc2V0OiAweCVseFxuIiwgc3ViX2VudHJ5LT5hYnNvbHV0ZV9vZmZzZXQpOworCQkJcHJpbnRmKCJcblxuIik7CisKKwkJCWR1bXBfZW50cnkoc3ViX2VudHJ5LCBwYXJ0KyssIGZkKTsKKwkJfQorCQlwcmludGYoIlxuXG4iKTsKKwl9CisKKwlpZiAoY2xvc2UoZmQpICE9IDApIHsKKwkJcGVycm9yKCJDbG9zZSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuOworCX0KKworCXRhbGxvY19mcmVlKHRhbGxfZmlybV9jdHgpOworfQorCitzdGF0aWMgdm9pZCBwcmludF91c2FnZSh2b2lkKQoreworCXByaW50ZigiVXNhZ2U6IGlwYWNjZXNzLWNvbmZpZ1xuIik7Cit9CisKK3N0YXRpYyB2b2lkIHByaW50X2hlbHAodm9pZCkKK3sKKwlwcmludGYoIiAgLXUgLS11bml0LWlkIFVOSVRfSURcbiIpOworCXByaW50ZigiICAtbyAtLW9tbC1pcCBpcFxuIik7CisJcHJpbnRmKCIgIC1yIC0tcmVzdGFydFxuIik7CisJcHJpbnRmKCIgIC1uIGZsYWdzL21hc2tcdFNldCBOVlJBTSBhdHRyaWJ1dGVzLlxuIik7CisJcHJpbnRmKCIgIC1sIC0tbGlzdGVuIHRlc3RuciBcdFBlcmZvcm0gc3BlY2lmaWVkIHRlc3QgbnVtYmVyXG4iKTsKKwlwcmludGYoIiAgLWggLS1oZWxwIHRoaXMgdGV4dFxuIik7CisJcHJpbnRmKCIgIC1zIC0tc3RyZWFtLWlkIElEXG4iKTsKKwlwcmludGYoIiAgLWQgLS1zb2Z0d2FyZSBmaXJtd2FyZVxuIik7CisJcHJpbnRmKCIgIC1mIC0tZmlybXdhcmUgZmlybXdhcmUgUHJvdmlkZSBmaXJtd2FyZSBpbmZvcm1hdGlvblxuIik7CisJcHJpbnRmKCIgIC13IC0td3JpdGUtZmlybXdhcmUuIFRoaXMgd2lsbCBkdW1wIHRoZSBmaXJtd2FyZSBwYXJ0cyB0byB0aGUgZmlsZXN5c3RlbS4gVXNlIHdpdGggLWYuXG4iKTsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQoreworCXN0cnVjdCBnc21fYnRzICpidHM7CisJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKwlpbnQgcmMsIG9wdGlvbl9pbmRleCA9IDAsIHN0cmVhbV9pZCA9IDB4ZmY7CisJc3RydWN0IGRlYnVnX3RhcmdldCAqc3RkZXJyX3RhcmdldDsKKworCWRlYnVnX2luaXQoKTsKKwlzdGRlcnJfdGFyZ2V0ID0gZGVidWdfdGFyZ2V0X2NyZWF0ZV9zdGRlcnIoKTsKKwlkZWJ1Z19hZGRfdGFyZ2V0KHN0ZGVycl90YXJnZXQpOworCWRlYnVnX3NldF9hbGxfZmlsdGVyKHN0ZGVycl90YXJnZXQsIDEpOworCWRlYnVnX3NldF9sb2dfbGV2ZWwoc3RkZXJyX3RhcmdldCwgMCk7CisJZGVidWdfcGFyc2VfY2F0ZWdvcnlfbWFzayhzdGRlcnJfdGFyZ2V0LCAiRE5NLDAiKTsKKwlidHNfbW9kZWxfbmFub2J0c19pbml0KCk7CisKKwlwcmludGYoImlwYWNjZXNzLWNvbmZpZyAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGVcbiIpOworCXByaW50ZigiVGhpcyBpcyBGUkVFIFNPRlRXQVJFIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWVxuXG4iKTsKKworCXdoaWxlICgxKSB7CisJCWludCBjOworCQl1bnNpZ25lZCBsb25nIHVsOworCQljaGFyICpzbGFzaDsKKwkJc3RhdGljIHN0cnVjdCBvcHRpb24gbG9uZ19vcHRpb25zW10gPSB7CisJCQl7ICJ1bml0LWlkIiwgMSwgMCwgJ3UnIH0sCisJCQl7ICJvbWwtaXAiLCAxLCAwLCAnbycgfSwKKwkJCXsgInJlc3RhcnQiLCAwLCAwLCAncicgfSwKKwkJCXsgImhlbHAiLCAwLCAwLCAnaCcgfSwKKwkJCXsgImxpc3RlbiIsIDEsIDAsICdsJyB9LAorCQkJeyAic3RyZWFtLWlkIiwgMSwgMCwgJ3MnIH0sCisJCQl7ICJzb2Z0d2FyZSIsIDEsIDAsICdkJyB9LAorCQkJeyAiZmlybXdhcmUiLCAxLCAwLCAnZicgfSwKKwkJCXsgIndyaXRlLWZpcm13YXJlIiwgMCwgMCwgJ3cnIH0sCisJCX07CisKKwkJYyA9IGdldG9wdF9sb25nKGFyZ2MsIGFyZ3YsICJ1Om86cm46bDpoczpkOmY6dyIsIGxvbmdfb3B0aW9ucywKKwkJCQkmb3B0aW9uX2luZGV4KTsKKworCQlpZiAoYyA9PSAtMSkKKwkJCWJyZWFrOworCisJCXN3aXRjaCAoYykgeworCQljYXNlICd1JzoKKwkJCXVuaXRfaWQgPSBvcHRhcmc7CisJCQlicmVhazsKKwkJY2FzZSAnbyc6CisJCQlwcmltX29tbF9pcCA9IG9wdGFyZzsKKwkJCWJyZWFrOworCQljYXNlICdyJzoKKwkJCXJlc3RhcnQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgJ24nOgorCQkJc2xhc2ggPSBzdHJjaHIob3B0YXJnLCAnLycpOworCQkJaWYgKCFzbGFzaCkKKwkJCQlleGl0KDIpOworCQkJdWwgPSBzdHJ0b3VsKG9wdGFyZywgTlVMTCwgMTYpOworCQkJbnZfZmxhZ3MgPSB1bCAmIDB4ZmZmZjsKKwkJCXVsID0gc3RydG91bChzbGFzaCsxLCBOVUxMLCAxNik7CisJCQludl9tYXNrID0gdWwgJiAweGZmZmY7CisJCQlicmVhazsKKwkJY2FzZSAnbCc6CisJCQluZXRfbGlzdGVuX3Rlc3RuciA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdzJzoKKwkJCXN0cmVhbV9pZCA9IGF0b2kob3B0YXJnKTsKKwkJCWJyZWFrOworCQljYXNlICdkJzoKKwkJCXNvZnR3YXJlID0gc3RyZHVwKG9wdGFyZyk7CisJCQlpZiAoZmluZF9zd19sb2FkX3BhcmFtcyhvcHRhcmcpICE9IDApCisJCQkJZXhpdCgwKTsKKwkJCWJyZWFrOworCQljYXNlICdmJzoKKwkJCWFuYWx5emVfZmlybXdhcmUob3B0YXJnKTsKKwkJCWV4aXQoMCk7CisJCWNhc2UgJ3cnOgorCQkJZHVtcF9maWxlcyA9IDE7CisJCQlicmVhazsKKwkJY2FzZSAnaCc6CisJCQlwcmludF91c2FnZSgpOworCQkJcHJpbnRfaGVscCgpOworCQkJZXhpdCgwKTsKKwkJfQorCX07CisKKwlpZiAob3B0aW5kID49IGFyZ2MpIHsKKwkJZnByaW50ZihzdGRlcnIsICJ5b3UgaGF2ZSB0byBzcGVjaWZ5IHRoZSBJUCBhZGRyZXNzIG9mIHRoZSBCVFMuIFVzZSAtLWhlbHAgZm9yIG1vcmUgaW5mb3JtYXRpb25cbiIpOworCQlleGl0KDIpOworCX0KKworCWdzbW5ldCA9IGdzbV9uZXR3b3JrX2luaXQoMSwgMSwgTlVMTCk7CisJaWYgKCFnc21uZXQpCisJCWV4aXQoMSk7CisKKwlidHMgPSBnc21fYnRzX2FsbG9jKGdzbW5ldCwgR1NNX0JUU19UWVBFX05BTk9CVFMsIEhBUkRDT0RFRF9UU0MsCisJCQkJSEFSRENPREVEX0JTSUMpOworCS8qIGlwLmFjY2VzcyBzdXBwb3J0cyB1cCB0byA0IGNoYWluZWQgVFJYICovCisJZ3NtX2J0c190cnhfYWxsb2MoYnRzKTsKKwlnc21fYnRzX3RyeF9hbGxvYyhidHMpOworCWdzbV9idHNfdHJ4X2FsbG9jKGJ0cyk7CisJYnRzLT5vbWxfdGVpID0gc3RyZWFtX2lkOworCQorCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX05NLCBubV9zaWdfY2IsIE5VTEwpOworCXByaW50ZigiVHJ5aW5nIHRvIGNvbm5lY3QgdG8gaXAuYWNjZXNzIEJUUyAuLi5cbiIpOworCisJbWVtc2V0KCZzaW4sIDAsIHNpemVvZihzaW4pKTsKKwlzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJaW5ldF9hdG9uKGFyZ3Zbb3B0aW5kXSwgJnNpbi5zaW5fYWRkcik7CisJcmMgPSBpYV9jb25maWdfY29ubmVjdChidHMsICZzaW4pOworCWlmIChyYyA8IDApIHsKKwkJcGVycm9yKCJFcnJvciBjb25uZWN0aW5nIHRvIHRoZSBCVFMiKTsKKwkJZXhpdCgxKTsKKwl9CisJCisJd2hpbGUgKDEpIHsKKwkJcmMgPSBic2Nfc2VsZWN0X21haW4oMCk7CisJCWlmIChyYyA8IDApCisJCQlleGl0KDMpOworCX0KKworCWV4aXQoMCk7Cit9CisKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLWZpbmQuYyBiL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLWZpbmQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWY4YTJkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtZmluZC5jCkBAIC0wLDAgKzEsMjA4IEBACisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKworI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RpbWVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9pcGFjY2Vzcy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKworc3RhdGljIGNvbnN0IGNoYXIgKmlkdGFnX25hbWVzW10gPSB7CisJW0lQQUNfSURUQUdfU0VSTlJdCT0gIlNlcmlhbCBOdW1iZXIiLAorCVtJUEFDX0lEVEFHX1VOSVROQU1FXQk9ICJVbml0IE5hbWUiLAorCVtJUEFDX0lEVEFHX0xPQ0FUSU9OMV0JPSAiTG9jYXRpb24gMSIsCisJW0lQQUNfSURUQUdfTE9DQVRJT04yXQk9ICJMb2NhdGlvbiAyIiwKKwlbSVBBQ19JRFRBR19FUVVJUFZFUlNdCT0gIkVxdWlwbWVudCBWZXJzaW9uIiwKKwlbSVBBQ19JRFRBR19TV1ZFUlNJT05dCT0gIlNvZnR3YXJlIFZlcnNpb24iLAorCVtJUEFDX0lEVEFHX0lQQUREUl0JPSAiSVAgQWRkcmVzcyIsCisJW0lQQUNfSURUQUdfTUFDQUREUl0JPSAiTUFDIEFkZHJlc3MiLAorCVtJUEFDX0lEVEFHX1VOSVRdCT0gIlVuaXQgSUQiLAorfTsKKworc3RhdGljIGNvbnN0IGNoYXIgKmlwYWNfaWR0YWdfbmFtZShpbnQgdGFnKQoreworCWlmICh0YWcgPj0gQVJSQVlfU0laRShpZHRhZ19uYW1lcykpCisJCXJldHVybiAidW5rbm93biI7CisKKwlyZXR1cm4gaWR0YWdfbmFtZXNbdGFnXTsKK30KKworc3RhdGljIGludCB1ZHBfc29jayhjb25zdCBjaGFyICppZm5hbWUpCit7CisJaW50IGZkLCByYywgYmMgPSAxOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzYTsKKworCWZkID0gc29ja2V0KFBGX0lORVQsIFNPQ0tfREdSQU0sIElQUFJPVE9fVURQKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gZmQ7CisKKwlpZiAoaWZuYW1lKSB7CisJCXJjID0gc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fQklORFRPREVWSUNFLCBpZm5hbWUsCisJCQkJc3RybGVuKGlmbmFtZSkpOworCQlpZiAocmMgPCAwKQorCQkJZ290byBlcnI7CisJfQorCisJc2Euc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJc2Euc2luX3BvcnQgPSBodG9ucygzMDA2KTsKKwlzYS5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOworCisJcmMgPSBiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyICopJnNhLCBzaXplb2Yoc2EpKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIGVycjsKKworCXJjID0gc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgU09fQlJPQURDQVNULCAmYmMsIHNpemVvZihiYykpOworCWlmIChyYyA8IDApCisJCWdvdG8gZXJyOworCisjaWYgMAorCS8qIHdlIGNhbm5vdCBiaW5kLCBzaW5jZSB0aGUgcmVzcG9uc2UgcGFja2V0cyBkb24ndCBjb21lIGZyb20KKwkgKiB0aGUgYnJvYWRjYXN0IGFkZHJlc3MgKi8KKwlzYS5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlzYS5zaW5fcG9ydCA9IGh0b25zKDMwMDYpOworCWluZXRfYXRvbigiMjU1LjI1NS4yNTUuMjU1IiwgJnNhLnNpbl9hZGRyKTsKKworCXJjID0gY29ubmVjdChmZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZzYSwgc2l6ZW9mKHNhKSk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBlcnI7CisjZW5kaWYJCQorCXJldHVybiBmZDsKKworZXJyOgorCWNsb3NlKGZkKTsKKwlyZXR1cm4gcmM7Cit9CisKK2NvbnN0IHVuc2lnbmVkIGNoYXIgZmluZF9wa3RbXSA9IHsgMHgwMCwgMHgwYis4LCBJUEFDX1BST1RPX0lQQUNDRVNTLCAweDAwLCAKKwkJCQlJUEFDX01TR1RfSURfR0VULAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX01BQ0FERFIsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfSVBBRERSLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX1VOSVQsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfTE9DQVRJT04xLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX0xPQ0FUSU9OMiwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19FUVVJUFZFUlMsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfU1dWRVJTSU9OLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX1VOSVROQU1FLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX1NFUk5SLAorCQkJCX07CisKKworc3RhdGljIGludCBiY2FzdF9maW5kKGludCBmZCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2E7CisKKwlzYS5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlzYS5zaW5fcG9ydCA9IGh0b25zKDMwMDYpOworCWluZXRfYXRvbigiMjU1LjI1NS4yNTUuMjU1IiwgJnNhLnNpbl9hZGRyKTsKKworCXJldHVybiBzZW5kdG8oZmQsIGZpbmRfcGt0LCBzaXplb2YoZmluZF9wa3QpLCAwLCAoc3RydWN0IHNvY2thZGRyICopICZzYSwgc2l6ZW9mKHNhKSk7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfcmVzcG9uc2UodW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCXVfaW50OF90IHRfbGVuOworCXVfaW50OF90IHRfdGFnOworCXVfaW50OF90ICpjdXIgPSBidWY7CisKKwl3aGlsZSAoY3VyIDwgYnVmICsgbGVuKSB7CisJCXRfbGVuID0gKmN1cisrOworCQl0X3RhZyA9ICpjdXIrKzsKKwkJCisJCXByaW50ZigiJXM9JyVzJyAgIiwgaXBhY19pZHRhZ19uYW1lKHRfdGFnKSwgY3VyKTsKKworCQljdXIgKz0gdF9sZW47CisJfQorCXByaW50ZigiXG4iKTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCByZWFkX3Jlc3BvbnNlKGludCBmZCkKK3sKKwl1bnNpZ25lZCBjaGFyIGJ1ZlsyNTVdOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzYTsKKwlpbnQgbGVuOworCXNvY2tsZW5fdCBzYV9sZW4gPSBzaXplb2Yoc2EpOworCisJbGVuID0gcmVjdmZyb20oZmQsIGJ1Ziwgc2l6ZW9mKGJ1ZiksIDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikmc2EsICZzYV9sZW4pOworCWlmIChsZW4gPCAwKQorCQlyZXR1cm4gbGVuOworCisJLyogMiBieXRlcyBsZW5ndGgsIDEgYnl0ZSBwcm90b2NvbCAoMHhmZSkgKi8KKwlpZiAoYnVmWzJdICE9IDB4ZmUpCisJCXJldHVybiAwOworCisJaWYgKGJ1Zls0XSAhPSBJUEFDX01TR1RfSURfUkVTUCkKKwkJcmV0dXJuIDA7CisKKwlyZXR1cm4gcGFyc2VfcmVzcG9uc2UoYnVmKzYsIGxlbi02KTsKK30KKworc3RhdGljIGludCBiZmRfY2Ioc3RydWN0IGJzY19mZCAqYmZkLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJaWYgKGZsYWdzICYgQlNDX0ZEX1JFQUQpCisJCXJldHVybiByZWFkX3Jlc3BvbnNlKGJmZC0+ZmQpOworCWlmIChmbGFncyAmIEJTQ19GRF9XUklURSkgeworCQliZmQtPndoZW4gJj0gfkJTQ19GRF9XUklURTsKKwkJcmV0dXJuIGJjYXN0X2ZpbmQoYmZkLT5mZCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IHRpbWVyX2xpc3QgdGltZXI7CisKK3N0YXRpYyB2b2lkIHRpbWVyX2NiKHZvaWQgKl9kYXRhKQoreworCXN0cnVjdCBic2NfZmQgKmJmZCA9IF9kYXRhOworCisJYmZkLT53aGVuIHw9IEJTQ19GRF9XUklURTsKKworCWJzY19zY2hlZHVsZV90aW1lcigmdGltZXIsIDUsIDApOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJc3RydWN0IGJzY19mZCBiZmQ7CisJY2hhciAqaWZuYW1lOworCWludCByYzsKKworCXByaW50ZigiaXBhY2Nlc3MtZmluZCAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGVcbiIpOworCXByaW50ZigiVGhpcyBpcyBGUkVFIFNPRlRXQVJFIHdpdGggQUJTT0xVVEVMWSBOTyBXQVJSQU5UWVxuXG4iKTsKKworCWlmIChhcmdjIDwgMikgeworCQlmcHJpbnRmKHN0ZG91dCwgInlvdSBtaWdodCBuZWVkIHRvIHNwZWNpZnkgdGhlIG91dGdvaW5nXG4iCisJCQkiIG5ldHdvcmsgaW50ZXJmYWNlLCBlLmcuIGBgJXMgZXRoMCcnXG4iLCBhcmd2WzBdKTsKKwl9CisKKwlpZm5hbWUgPSBhcmd2WzFdOworCWJmZC5jYiA9IGJmZF9jYjsKKwliZmQud2hlbiA9IEJTQ19GRF9SRUFEIHwgQlNDX0ZEX1dSSVRFOworCWJmZC5mZCA9IHVkcF9zb2NrKGlmbmFtZSk7CisJaWYgKGJmZC5mZCA8IDApIHsKKwkJcGVycm9yKCJDYW5ub3QgY3JlYXRlIGxvY2FsIHNvY2tldCBmb3IgYnJvYWRjYXN0IHVkcCIpOworCQlleGl0KDEpOworCX0KKworCWJzY19yZWdpc3Rlcl9mZCgmYmZkKTsKKworCXRpbWVyLmNiID0gdGltZXJfY2I7CisJdGltZXIuZGF0YSA9ICZiZmQ7CisKKwlic2Nfc2NoZWR1bGVfdGltZXIoJnRpbWVyLCA1LCAwKTsKKworCXByaW50ZigiVHJ5aW5nIHRvIGZpbmQgaXAuYWNjZXNzIEJUUyBieSBicm9hZGNhc3QgVURQLi4uXG4iKTsKKworCXdoaWxlICgxKSB7CisJCXJjID0gYnNjX3NlbGVjdF9tYWluKDApOworCQlpZiAocmMgPCAwKQorCQkJZXhpdCgzKTsKKwl9CisKKwlleGl0KDApOworfQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9pcGFjY2Vzcy9pcGFjY2Vzcy1maXJtd2FyZS5jIGIvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtZmlybXdhcmUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzQwYzFlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtZmlybXdhcmUuYwpAQCAtMCwwICsxLDEzNiBAQAorLyogUm91dGluZXMgZm9yIHBhcnNpbmcgYW4gaXBhY2NlcyBTRFAgZmlybXdhcmUgZmlsZSAqLworCisvKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2lwYWNjZXNzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjZGVmaW5lIFBBUlRfTEVOR1RIIDEzOAorCitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3Qgc2RwX2hlYWRlcl9lbnRyeSkgPT0gMTM4LCByaWdodF9lbnRyeSk7CitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3Qgc2RwX2Zpcm13YXJlKSA9PSAxNTgsIF9yaWdodF9oZWFkZXJfbGVuZ3RoKTsKKworLyogbW9yZSBtYWdpYywgdGhlIHNlY29uZCAiaW50IiBpbiB0aGUgaGVhZGVyICovCitzdGF0aWMgY2hhciBtb3JlX21hZ2ljW10gPSB7IDB4MTAsIDB4MDIgfTsKKworaW50IGlwYWNjZXNzX2FuYWx5emVfZmlsZShpbnQgZmQsIGNvbnN0IHVuc2lnbmVkIGludCBzdF9zaXplLCBjb25zdCB1bnNpZ25lZCBpbnQgYmFzZV9vZmZzZXQsIHN0cnVjdCBsbGlzdF9oZWFkICpsaXN0KQoreworCXN0cnVjdCBzZHBfZmlybXdhcmUgKmZpcm13YXJlX2hlYWRlciA9IDA7CisJc3RydWN0IHNkcF9oZWFkZXIgKmhlYWRlcjsKKwljaGFyIGJ1Zls0MDk2XTsKKwlpbnQgcmMsIGk7CisJdV9pbnQxNl90IHRhYmxlX3NpemU7CisJdV9pbnQxNl90IHRhYmxlX29mZnNldDsKKwlvZmZfdCB0YWJsZV9zdGFydDsKKworCisJcmMgPSByZWFkKGZkLCBidWYsIHNpemVvZigqZmlybXdhcmVfaGVhZGVyKSk7CisJaWYgKHJjIDwgMCkgeworCQlwZXJyb3IoIkNhbiBub3QgcmVhZCBoZWFkZXIgc3RhcnQuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlmaXJtd2FyZV9oZWFkZXIgPSAoc3RydWN0IHNkcF9maXJtd2FyZSAqKSAmYnVmWzBdOworCWlmIChzdHJuY21wKGZpcm13YXJlX2hlYWRlci0+bWFnaWMsICIgU0RQIiwgNCkgIT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIldyb25nIG1hZ2ljLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAobWVtY21wKGZpcm13YXJlX2hlYWRlci0+bW9yZV9tYWdpYywgbW9yZV9tYWdpYywgMikgIT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIldyb25nIG1vcmUgbWFnaWMuIEdvdDogMHgleCAleCAleCAleFxuIiwKKwkJCWZpcm13YXJlX2hlYWRlci0+bW9yZV9tYWdpY1swXSAmIDB4ZmYsIGZpcm13YXJlX2hlYWRlci0+bW9yZV9tYWdpY1sxXSAmIDB4ZmYsCisJCQlmaXJtd2FyZV9oZWFkZXItPm1vcmVfbWFnaWNbMl0gJiAweGZmLCBmaXJtd2FyZV9oZWFkZXItPm1vcmVfbWFnaWNbM10gJiAweGZmKTsKKwkJcmV0dXJuIC0xOworCX0KKworCisJaWYgKG50b2hsKGZpcm13YXJlX2hlYWRlci0+ZmlsZV9sZW5ndGgpICE9IHN0X3NpemUpIHsKKwkJZnByaW50ZihzdGRlcnIsICJUaGUgZmlsZXNpemUgYW5kIHRoZSBoZWFkZXIgZG8gbm90IG1hdGNoLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBhZGQgdGhlIGZpcm13YXJlICovCisJaGVhZGVyID0gdGFsbG9jX3plcm8obGlzdCwgc3RydWN0IHNkcF9oZWFkZXIpOworCWhlYWRlci0+ZmlybXdhcmVfaW5mbyA9ICpmaXJtd2FyZV9oZWFkZXI7CisJSU5JVF9MTElTVF9IRUFEKCZoZWFkZXItPmhlYWRlcl9saXN0KTsKKwlsbGlzdF9hZGQoJmhlYWRlci0+ZW50cnksIGxpc3QpOworCisJdGFibGVfb2Zmc2V0ID0gbnRvaHMoZmlybXdhcmVfaGVhZGVyLT50YWJsZV9vZmZzZXQpOworCXRhYmxlX3N0YXJ0ID0gbHNlZWsoZmQsIHRhYmxlX29mZnNldCwgU0VFS19DVVIpOworCWlmICh0YWJsZV9zdGFydCA9PSAtMSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkZhaWxlZCB0byBzZWVrIHRvIHRoZSByZWwgcG9zaXRpb246IDB4JXhcbiIsIHRhYmxlX29mZnNldCk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAocmVhZChmZCwgJnRhYmxlX3NpemUsIHNpemVvZih0YWJsZV9zaXplKSkgIT0gc2l6ZW9mKHRhYmxlX3NpemUpKSB7CisJCWZwcmludGYoc3RkZXJyLCAiVGhlIHRhYmxlIHNpemUgY291bGQgbm90IGJlIHJlYWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXRhYmxlX3NpemUgPSBudG9ocyh0YWJsZV9zaXplKTsKKworCWlmICh0YWJsZV9zaXplICUgUEFSVF9MRU5HVEggIT0gMCkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlRoZSBwYXJ0IGxlbmd0aCBzZWVtcyB0byBiZSB3cm9uZzogMHgleFxuIiwgdGFibGVfc2l6ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBsb29rIGludG8gZWFjaCBmaXJtd2FyZSBub3cgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdGFibGVfc2l6ZSAvIFBBUlRfTEVOR1RIOyArK2kpIHsKKwkJc3RydWN0IHNkcF9oZWFkZXJfZW50cnkgZW50cnk7CisJCXN0cnVjdCBzZHBfaGVhZGVyX2l0ZW0gKmhlYWRlcl9lbnRyeTsKKwkJdW5zaWduZWQgaW50IG9mZnNldCA9IHRhYmxlX3N0YXJ0ICsgMjsKKwkJb2Zmc2V0ICs9IGkgKiAxMzg7CisKKwkJaWYgKGxzZWVrKGZkLCBvZmZzZXQsIFNFRUtfU0VUKSAhPSBvZmZzZXQpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQ2FuIG5vdCBzZWVrIHRvIHRoZSBvZmZzZXQ6ICV1LlxuIiwgb2Zmc2V0KTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCXJjID0gcmVhZChmZCwgJmVudHJ5LCBzaXplb2YoZW50cnkpKTsKKwkJaWYgKHJjICE9IHNpemVvZihlbnRyeSkpIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiQ2FuIG5vdCByZWFkIHRoZSBoZWFkZXIgZW50cnkuXG4iKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWhlYWRlcl9lbnRyeSA9IHRhbGxvY196ZXJvKGhlYWRlciwgIHN0cnVjdCBzZHBfaGVhZGVyX2l0ZW0pOworCQloZWFkZXJfZW50cnktPmhlYWRlcl9lbnRyeSA9IGVudHJ5OworCQloZWFkZXJfZW50cnktPmFic29sdXRlX29mZnNldCA9IGJhc2Vfb2Zmc2V0OworCQlsbGlzdF9hZGQoJmhlYWRlcl9lbnRyeS0+ZW50cnksICZoZWFkZXItPmhlYWRlcl9saXN0KTsKKworCQkvKiBub3cgd2UgbmVlZCB0byBmaW5kIHRoZSBTRFAgZmlsZS4uLiAqLworCQlvZmZzZXQgPSBudG9obChlbnRyeS5zdGFydCkgKyA0ICsgYmFzZV9vZmZzZXQ7CisJCWlmIChsc2VlayhmZCwgb2Zmc2V0LCBTRUVLX1NFVCkgIT0gb2Zmc2V0KSB7CisJCQlwZXJyb3IoImNhbid0IHNlZWsgdG8gc2RwIik7CisJCQlyZXR1cm4gLTE7CisJCX0KKworCisJCWlwYWNjZXNzX2FuYWx5emVfZmlsZShmZCwgbnRvaGwoZW50cnkubGVuZ3RoKSwgb2Zmc2V0LCBsaXN0KTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvaXBhY2Nlc3MvaXBhY2Nlc3MtcHJveHkuYyBiL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLXByb3h5LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE3ZTBiZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2lwYWNjZXNzL2lwYWNjZXNzLXByb3h5LmMKQEAgLTAsMCArMSwxMTI3IEBACisvKiBPcGVuQlNDIEFiaXMvSVAgcHJveHkgaXAuYWNjZXNzIG5hbm9CVFMgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8c3lzL2ZjbnRsLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tldC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90bHYuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvaXBhY2Nlc3MuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKworc3RhdGljIHN0cnVjdCBkZWJ1Z190YXJnZXQgKnN0ZGVycl90YXJnZXQ7CisKKy8qIG9uZSBpbnN0YW5jZSBvZiBhbiBpcC5hY2Nlc3MgcHJvdG9jb2wgcHJveHkgKi8KK3N0cnVjdCBpcGFfcHJveHkgeworCS8qIHNvY2tldCB3aGVyZSB3ZSBsaXN0ZW4gZm9yIGluY29taW5nIE9NTCBmcm9tIEJUUyAqLworCXN0cnVjdCBic2NfZmQgb21sX2xpc3Rlbl9mZDsKKwkvKiBzb2NrZXQgd2hlcmUgd2UgbGlzdGVuIGZvciBpbmNvbWluZyBSU0wgZnJvbSBCVFMgKi8KKwlzdHJ1Y3QgYnNjX2ZkIHJzbF9saXN0ZW5fZmQ7CisJLyogbGlzdCBvZiBCVFMncyAoc3RydWN0IGlwYV9idHNfY29ubiAqLworCXN0cnVjdCBsbGlzdF9oZWFkIGJ0c19saXN0OworCS8qIHRoZSBCU0MgcmVjb25uZWN0IHRpbWVyICovCisJc3RydWN0IHRpbWVyX2xpc3QgcmVjb25uX3RpbWVyOworfTsKKworLyogZ2xvYmFsIHBvaW50ZXIgdG8gdGhlIHByb3h5IHN0cnVjdHVyZSAqLworc3RhdGljIHN0cnVjdCBpcGFfcHJveHkgKmlwcDsKKworc3RydWN0IGlwYV9wcm94eV9jb25uIHsKKwlzdHJ1Y3QgYnNjX2ZkIGZkOworCXN0cnVjdCBsbGlzdF9oZWFkIHR4X3F1ZXVlOworCXN0cnVjdCBpcGFfYnRzX2Nvbm4gKmJ0c19jb25uOworfTsKKworI2RlZmluZSBNQVhfVFJYIDQKKworLyogcmVwcmVzZW50cyBhIHBhcnRpY3VsYXIgQlRTIGluIG91ciBwcm94eSAqLworc3RydWN0IGlwYV9idHNfY29ubiB7CisJLyogbGlzdCBvZiBCVFMncyAoaXBhX3Byb3h5LT5idHNfbGlzdCkgKi8KKwlzdHJ1Y3QgbGxpc3RfaGVhZCBsaXN0OworCS8qIGJhY2sgcG9pbnRlciB0byB0aGUgcHJveHkgd2hpY2ggd2UgYmVsb25nIHRvICovCisJc3RydWN0IGlwYV9wcm94eSAqaXBwOworCS8qIHRoZSB1bml0IElEIGFzIGRldGVybWluZWQgYnkgQ0NNICovCisJc3RydWN0IHsKKwkJdV9pbnQxNl90IHNpdGVfaWQ7CisJCXVfaW50MTZfdCBidHNfaWQ7CisJfSB1bml0X2lkOworCisJLyogaW5jb21pbmcgY29ubmVjdGlvbnMgZnJvbSBCVFMgKi8KKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKm9tbF9jb25uOworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqcnNsX2Nvbm5bTUFYX1RSWF07CisKKwkvKiBvdXRnb2luZyBjb25uZWN0aW9ucyB0byBCU0MgKi8KKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmJzY19vbWxfY29ubjsKKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmJzY19yc2xfY29ubltNQVhfVFJYXTsKKworCS8qIFVEUCBzb2NrZXRzIGZvciBCVFMgYW5kIEJTQyBpbmplY3Rpb24gKi8KKwlzdHJ1Y3QgYnNjX2ZkIHVkcF9idHNfZmQ7CisJc3RydWN0IGJzY19mZCB1ZHBfYnNjX2ZkOworCisJY2hhciAqaWRfdGFnc1sweGZmXTsKKwl1X2ludDhfdCAqaWRfcmVzcDsKKwl1bnNpZ25lZCBpbnQgaWRfcmVzcF9sZW47Cit9OworCitlbnVtIGlwcF9mZF90eXBlIHsKKwlPTUxfRlJPTV9CVFMgPSAxLAorCVJTTF9GUk9NX0JUUyA9IDIsCisJT01MX1RPX0JTQyA9IDMsCisJUlNMX1RPX0JTQyA9IDQsCisJVURQX1RPX0JUUyA9IDUsCisJVURQX1RPX0JTQyA9IDYsCit9OworCisvKiBzb21lIG9mIHRoZSBjb2RlIGFnYWluc3Qgd2UgbGluayBmcm9tIE9wZW5CU0MgbmVlZHMgdGhpcyAqLwordm9pZCAqdGFsbF9ic2NfY3R4OworCitzdGF0aWMgY2hhciAqbGlzdGVuX2lwYWRkcjsKK3N0YXRpYyBjaGFyICpic2NfaXBhZGRyOworCisjZGVmaW5lIFBST1hZX0FMTE9DX1NJWkUJMzAwCisKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBwb25nW10gPSB7IDAsIDEsIElQQUNfUFJPVE9fSVBBQ0NFU1MsIElQQUNfTVNHVF9QT05HIH07CitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgaWRfYWNrW10gPSB7IDAsIDEsIElQQUNfUFJPVE9fSVBBQ0NFU1MsIElQQUNfTVNHVF9JRF9BQ0sgfTsKK3N0YXRpYyBjb25zdCB1X2ludDhfdCBpZF9yZXFbXSA9IHsgMCwgMTcsIElQQUNfUFJPVE9fSVBBQ0NFU1MsIElQQUNfTVNHVF9JRF9HRVQsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfVU5JVCwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19NQUNBRERSLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX0xPQ0FUSU9OMSwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19MT0NBVElPTjIsCisJCQkJCTB4MDEsIElQQUNfSURUQUdfRVFVSVBWRVJTLAorCQkJCQkweDAxLCBJUEFDX0lEVEFHX1NXVkVSU0lPTiwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19VTklUTkFNRSwKKwkJCQkJMHgwMSwgSVBBQ19JRFRBR19TRVJOUiwKKwkJCQl9OworCitzdGF0aWMgY29uc3QgY2hhciAqaWR0YWdfbmFtZXNbXSA9IHsKKwlbSVBBQ19JRFRBR19TRVJOUl0JPSAiU2VyaWFsX051bWJlciIsCisJW0lQQUNfSURUQUdfVU5JVE5BTUVdCT0gIlVuaXRfTmFtZSIsCisJW0lQQUNfSURUQUdfTE9DQVRJT04xXQk9ICJMb2NhdGlvbl8xIiwKKwlbSVBBQ19JRFRBR19MT0NBVElPTjJdCT0gIkxvY2F0aW9uXzIiLAorCVtJUEFDX0lEVEFHX0VRVUlQVkVSU10JPSAiRXF1aXBtZW50X1ZlcnNpb24iLAorCVtJUEFDX0lEVEFHX1NXVkVSU0lPTl0JPSAiU29mdHdhcmVfVmVyc2lvbiIsCisJW0lQQUNfSURUQUdfSVBBRERSXQk9ICJJUF9BZGRyZXNzIiwKKwlbSVBBQ19JRFRBR19NQUNBRERSXQk9ICJNQUNfQWRkcmVzcyIsCisJW0lQQUNfSURUQUdfVU5JVF0JPSAiVW5pdF9JRCIsCit9OworCitzdGF0aWMgY29uc3QgY2hhciAqaXBhY19pZHRhZ19uYW1lKGludCB0YWcpCit7CisJaWYgKHRhZyA+PSBBUlJBWV9TSVpFKGlkdGFnX25hbWVzKSkKKwkJcmV0dXJuICJ1bmtub3duIjsKKworCXJldHVybiBpZHRhZ19uYW1lc1t0YWddOworfQorCitzdGF0aWMgaW50IGlwYWNfaWR0YWdfcGFyc2Uoc3RydWN0IHRsdl9wYXJzZWQgKmRlYywgdW5zaWduZWQgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCXVfaW50OF90IHRfbGVuOworCXVfaW50OF90IHRfdGFnOworCXVfaW50OF90ICpjdXIgPSBidWY7CisKKwl3aGlsZSAoY3VyIDwgYnVmICsgbGVuKSB7CisJCXRfbGVuID0gKmN1cisrOworCQl0X3RhZyA9ICpjdXIrKzsKKworCQlERUJVR1BDKERNSSwgIiVzPSclcycgIiwgaXBhY19pZHRhZ19uYW1lKHRfdGFnKSwgY3VyKTsKKworCQlkZWMtPmx2W3RfdGFnXS5sZW4gPSB0X2xlbjsKKwkJZGVjLT5sdlt0X3RhZ10udmFsID0gY3VyOworCisJCWN1ciArPSB0X2xlbjsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfdW5pdGlkKGNvbnN0IGNoYXIgKnN0ciwgdV9pbnQxNl90ICpzaXRlX2lkLCB1X2ludDE2X3QgKmJ0c19pZCwKKwkJCXVfaW50MTZfdCAqdHJ4X2lkKQoreworCXVuc2lnbmVkIGxvbmcgdWw7CisJY2hhciAqZW5kcHRyOworCWNvbnN0IGNoYXIgKm5wdHI7CisKKwlucHRyID0gc3RyOworCXVsID0gc3RydG91bChucHRyLCAmZW5kcHRyLCAxMCk7CisJaWYgKGVuZHB0ciA8PSBucHRyKQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoc2l0ZV9pZCkKKwkJKnNpdGVfaWQgPSB1bCAmIDB4ZmZmZjsKKworCWlmICgqZW5kcHRyKysgIT0gJy8nKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW5wdHIgPSBlbmRwdHI7CisJdWwgPSBzdHJ0b3VsKG5wdHIsICZlbmRwdHIsIDEwKTsKKwlpZiAoZW5kcHRyIDw9IG5wdHIpCisJCXJldHVybiAtRUlOVkFMOworCWlmIChidHNfaWQpCisJCSpidHNfaWQgPSB1bCAmIDB4ZmZmZjsKKworCWlmICgqZW5kcHRyKysgIT0gJy8nKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCW5wdHIgPSBlbmRwdHI7CisJdWwgPSBzdHJ0b3VsKG5wdHIsICZlbmRwdHIsIDEwKTsKKwlpZiAoZW5kcHRyIDw9IG5wdHIpCisJCXJldHVybiAtRUlOVkFMOworCWlmICh0cnhfaWQpCisJCSp0cnhfaWQgPSB1bCAmIDB4ZmZmZjsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGlwYV9idHNfY29ubiAqZmluZF9idHNfYnlfdW5pdGlkKHN0cnVjdCBpcGFfcHJveHkgKmlwcCwKKwkJCQkJCXVfaW50MTZfdCBzaXRlX2lkLAorCQkJCQkJdV9pbnQxNl90IGJ0c19pZCkKK3sKKwlzdHJ1Y3QgaXBhX2J0c19jb25uICppcGJjOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoaXBiYywgJmlwcC0+YnRzX2xpc3QsIGxpc3QpIHsKKwkJaWYgKGlwYmMtPnVuaXRfaWQuc2l0ZV9pZCA9PSBzaXRlX2lkICYmCisJCSAgICBpcGJjLT51bml0X2lkLmJ0c19pZCA9PSBidHNfaWQpCisJCQlyZXR1cm4gaXBiYzsKKwl9CisKKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGlwYV9wcm94eV9jb25uICphbGxvY19jb25uKHZvaWQpCit7CisJc3RydWN0IGlwYV9wcm94eV9jb25uICppcGM7CisKKwlpcGMgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBpcGFfcHJveHlfY29ubik7CisJaWYgKCFpcGMpCisJCXJldHVybiBOVUxMOworCisJSU5JVF9MTElTVF9IRUFEKCZpcGMtPnR4X3F1ZXVlKTsKKworCXJldHVybiBpcGM7Cit9CisKK3N0YXRpYyBpbnQgc3RvcmVfaWR0YWdzKHN0cnVjdCBpcGFfYnRzX2Nvbm4gKmlwYmMsIHN0cnVjdCB0bHZfcGFyc2VkICp0bHZwKQoreworCXVuc2lnbmVkIGludCBpLCBsZW47CisKKwlmb3IgKGkgPSAwOyBpIDw9IDB4ZmY7IGkrKykgeworCQlpZiAoIVRMVlBfUFJFU0VOVCh0bHZwLCBpKSkKKwkJCWNvbnRpbnVlOworCisJCWxlbiA9IFRMVlBfTEVOKHRsdnAsIGkpOworI2lmIDAKKwkJaWYgKCFpcGJjLT5pZF90YWdzW2ldKQorCQkJaXBiYy0+aWRfdGFnc1tpXSA9IHRhbGxvY19zaXplKHRhbGxfYnNjX2N0eCwgbGVuKTsKKwkJZWxzZQorI2VuZGlmCisJCQlpcGJjLT5pZF90YWdzW2ldID0gdGFsbG9jX3JlYWxsb2Nfc2l6ZShpcGJjLAorCQkJCQkJCSAgaXBiYy0+aWRfdGFnc1tpXSwgbGVuKTsKKwkJaWYgKCFpcGJjLT5pZF90YWdzW2ldKQorCQkJcmV0dXJuIC1FTk9NRU07CisKKwkJbWVtc2V0KGlwYmMtPmlkX3RhZ3NbaV0sIDAsIGxlbik7CisJCS8vbWVtY3B5KGlwYmMtPmlkX3RhZ3NbaV0sIFRMVlBfVkFMKHRsdnAsIGkpLCBsZW4pOworCX0KKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgc3RydWN0IGlwYV9wcm94eV9jb25uICpjb25uZWN0X2JzYyhzdHJ1Y3Qgc29ja2FkZHJfaW4gKnNhLCBpbnQgcHJpdl9uciwgdm9pZCAqZGF0YSk7CisKKyNkZWZpbmUgbG9ncF9pcGJjX3VpZChzcywgbHZsLCBpcGJjLCB0cnhfaWQpIF9sb2dwX2lwYmNfdWlkKHNzLCBsdmwsIF9fRklMRV9fLCBfX0xJTkVfXywgaXBiYywgdHJ4X2lkKQorCitzdGF0aWMgdm9pZCBfbG9ncF9pcGJjX3VpZCh1bnNpZ25lZCBpbnQgc3MsIHVuc2lnbmVkIGludCBsdmwsIGNoYXIgKmZpbGUsIGludCBsaW5lLAorCQkJICAgc3RydWN0IGlwYV9idHNfY29ubiAqaXBiYywgdV9pbnQ4X3QgdHJ4X2lkKQoreworCWlmIChpcGJjKQorCQlkZWJ1Z3AyKHNzLCBsdmwsIGZpbGUsIGxpbmUsIDAsICIoJXUvJXUvJXUpICIsIGlwYmMtPnVuaXRfaWQuc2l0ZV9pZCwKKwkJICAgICBpcGJjLT51bml0X2lkLmJ0c19pZCwgdHJ4X2lkKTsKKwllbHNlCisJCWRlYnVncDIoc3MsIGx2bCwgZmlsZSwgbGluZSwgMCwgInVua25vd24gIik7Cit9CisKKy8qIFVEUCBzb2NrZXQgaGFuZGxpbmcgKi8KKworc3RhdGljIGludCBtYWtlX3NvY2soc3RydWN0IGJzY19mZCAqYmZkLCB1X2ludDE2X3QgcG9ydCwgaW50IHByb3RvLCBpbnQgcHJpdl9uciwKKwkJICAgICBpbnQgKCpjYikoc3RydWN0IGJzY19mZCAqZmQsIHVuc2lnbmVkIGludCB3aGF0KSwKKwkJICAgICB2b2lkICpkYXRhKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworCWludCByZXQsIG9uID0gMTsKKworCWJmZC0+ZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgcHJvdG8pOworCWJmZC0+Y2IgPSBjYjsKKwliZmQtPndoZW4gPSBCU0NfRkRfUkVBRDsKKwliZmQtPmRhdGEgPSBkYXRhOworCWJmZC0+cHJpdl9uciA9IHByaXZfbnI7CisKKwltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisJYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisJYWRkci5zaW5fYWRkci5zX2FkZHIgPSBJTkFERFJfQU5ZOworCisJc2V0c29ja29wdChiZmQtPmZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZvbiwgc2l6ZW9mKG9uKSk7CisKKwlyZXQgPSBiaW5kKGJmZC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSk7CisJaWYgKHJldCA8IDApIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiY291bGQgbm90IGJpbmQgc29ja2V0OiAlc1xuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldCA9IGJzY19yZWdpc3Rlcl9mZChiZmQpOworCWlmIChyZXQgPCAwKSB7CisJCXBlcnJvcigicmVnaXN0ZXIgVURQIGZkIik7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV91ZHBfcmVhZChzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IGlwYV9idHNfY29ubiAqaXBiYyA9IGJmZC0+ZGF0YTsKKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKm90aGVyX2Nvbm4gPSBOVUxMOworCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jKFBST1hZX0FMTE9DX1NJWkUsICJBYmlzL0lQIFVEUCIpOworCXN0cnVjdCBpcGFjY2Vzc19oZWFkICpoaDsKKwlpbnQgcmV0OworCisJLyogd2l0aCBVRFAgc29ja2V0cywgd2UgY2Fubm90IHJlYWQgcGFydGlhbCBwYWNrZXRzIGJ1dCBoYXZlIHRvIHJlYWQKKwkgKiBhbGwgb2YgaXQgaW4gb25lIGdvICovCisJaGggPSAoc3RydWN0IGlwYWNjZXNzX2hlYWQgKikgbXNnLT5kYXRhOworCXJldCA9IHJlY3YoYmZkLT5mZCwgbXNnLT5kYXRhLCBtc2ctPmRhdGFfbGVuLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlpZiAoZXJybm8gIT0gRUFHQUlOKQorCQkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAicmVjdiBlcnJvciAgJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCW1zZ2JfZnJlZShtc2cpOworCQlyZXR1cm4gcmV0OworCX0KKwlpZiAocmV0ID09IDApIHsKKwkJREVCVUdQKERJTlAsICJVRFAgcGVlciBkaXNhcHBlYXJlZCwgZGVhZCBzb2NrZXRcbiIpOworCQlic2NfdW5yZWdpc3Rlcl9mZChiZmQpOworCQljbG9zZShiZmQtPmZkKTsKKwkJYmZkLT5mZCA9IC0xOworCQltc2diX2ZyZWUobXNnKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCWlmIChyZXQgPCBzaXplb2YoKmhoKSkgeworCQlERUJVR1AoRElOUCwgImNvdWxkIG5vdCBldmVuIHJlYWQgaGVhZGVyIT8hXG4iKTsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCXJldHVybiAtRUlPOworCX0KKwltc2diX3B1dChtc2csIHJldCk7CisJbXNnLT5sMmggPSBtc2ctPmRhdGEgKyBzaXplb2YoKmhoKTsKKwlERUJVR1AoRE1JLCAiVURQIFJYOiAlc1xuIiwgaGV4ZHVtcChtc2ctPmRhdGEsIG1zZy0+bGVuKSk7CisKKwlpZiAoaGgtPmxlbiAhPSBtc2ctPmxlbiAtIHNpemVvZigqaGgpKSB7CisJCURFQlVHUChESU5QLCAibGVuZ3RoICgldS8ldSkgZGlzYWdyZWVzIHdpdGggaGVhZGVyKCV1KVxuIiwKKwkJCW1zZy0+bGVuLCBtc2ctPmxlbiAtIDMsIGhoLT5sZW4pOworCQltc2diX2ZyZWUobXNnKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJc3dpdGNoIChiZmQtPnByaXZfbnIgJiAweGZmKSB7CisJY2FzZSBVRFBfVE9fQlRTOgorCQkvKiBpbmplY3Rpb24gdG93YXJkcyBCVFMgKi8KKwkJc3dpdGNoIChoaC0+cHJvdG8pIHsKKwkJY2FzZSBJUEFDX1BST1RPX1JTTDoKKwkJCS8qIEZJWE1FOiB3aGF0IHRvIGRvIGFib3V0IFRSWCA+IDAgKi8KKwkJCW90aGVyX2Nvbm4gPSBpcGJjLT5yc2xfY29ublswXTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJREVCVUdQKERJTlAsICJVbmtub3duIHByb3RvY29sIDB4JTAyeCwgc2VuZGluZyB0byAiCisJCQkJIk9NTCBGRFxuIiwgaGgtPnByb3RvKTsKKwkJCS8qIGZhbGwgdGhyb3VnaCAqLworCQljYXNlIElQQUNfUFJPVE9fSVBBQ0NFU1M6CisJCWNhc2UgSVBBQ19QUk9UT19PTUw6CisJCQlvdGhlcl9jb25uID0gaXBiYy0+b21sX2Nvbm47CisJCQlicmVhazsKKwkJfQorCQlicmVhazsKKwljYXNlIFVEUF9UT19CU0M6CisJCS8qIGluamVjdGlvbiB0b3dhcmRzIEJTQyAqLworCQlzd2l0Y2ggKGhoLT5wcm90bykgeworCQljYXNlIElQQUNfUFJPVE9fUlNMOgorCQkJLyogRklYTUU6IHdoYXQgdG8gZG8gYWJvdXQgVFJYID4gMCAqLworCQkJb3RoZXJfY29ubiA9IGlwYmMtPmJzY19yc2xfY29ublswXTsKKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJREVCVUdQKERJTlAsICJVbmtub3duIHByb3RvY29sIDB4JTAyeCwgc2VuZGluZyB0byAiCisJCQkJIk9NTCBGRFxuIiwgaGgtPnByb3RvKTsKKwkJY2FzZSBJUEFDX1BST1RPX0lQQUNDRVNTOgorCQljYXNlIElQQUNfUFJPVE9fT01MOgorCQkJb3RoZXJfY29ubiA9IGlwYmMtPmJzY19vbWxfY29ubjsKKwkJCWJyZWFrOworCQl9CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUChESU5QLCAiVW5rbm93biBmaWxlZGVzY3JpcHRvciBwcml2X25yPSUwNHhcbiIsIGJmZC0+cHJpdl9ucik7CisJCWJyZWFrOworCX0KKworCWlmIChvdGhlcl9jb25uKSB7CisJCS8qIGVucXVldWUgdGhlIG1lc3NhZ2UgZm9yIFRYIG9uIHRoZSByZXNwZWN0aXZlIEZEICovCisJCW1zZ2JfZW5xdWV1ZSgmb3RoZXJfY29ubi0+dHhfcXVldWUsIG1zZyk7CisJCW90aGVyX2Nvbm4tPmZkLndoZW4gfD0gQlNDX0ZEX1dSSVRFOworCX0gZWxzZQorCQltc2diX2ZyZWUobXNnKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGhhbmRsZV91ZHBfd3JpdGUoc3RydWN0IGJzY19mZCAqYmZkKQoreworCS8qIG5vdCBpbXBsZW1lbnRlZCB5ZXQgKi8KKwliZmQtPndoZW4gJj0gfkJTQ19GRF9XUklURTsKKworCXJldHVybiAtRUlPOworfQorCisvKiBjYWxsYmFjayBmcm9tIHNlbGVjdC5jIGluIGNhc2Ugb25lIG9mIHRoZSBmZCdzIGNhbiBiZSByZWFkL3dyaXR0ZW4gKi8KK3N0YXRpYyBpbnQgdWRwX2ZkX2NiKHN0cnVjdCBic2NfZmQgKmJmZCwgdW5zaWduZWQgaW50IHdoYXQpCit7CisJaW50IHJjID0gMDsKKworCWlmICh3aGF0ICYgQlNDX0ZEX1JFQUQpCisJCXJjID0gaGFuZGxlX3VkcF9yZWFkKGJmZCk7CisJaWYgKHdoYXQgJiBCU0NfRkRfV1JJVEUpCisJCXJjID0gaGFuZGxlX3VkcF93cml0ZShiZmQpOworCisJcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyBpbnQgaXBiY19hbGxvY19jb25uZWN0KHN0cnVjdCBpcGFfcHJveHlfY29ubiAqaXBjLCBzdHJ1Y3QgYnNjX2ZkICpiZmQsCisJCQkgICAgICB1X2ludDE2X3Qgc2l0ZV9pZCwgdV9pbnQxNl90IGJ0c19pZCwKKwkJCSAgICAgIHVfaW50MTZfdCB0cnhfaWQsIHN0cnVjdCB0bHZfcGFyc2VkICp0bHZwLAorCQkJICAgICAgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgaXBhX2J0c19jb25uICppcGJjOworCXVfaW50MTZfdCB1ZHBfcG9ydDsKKwlpbnQgcmV0ID0gMDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luOworCisJbWVtc2V0KCZzaW4sIDAsIHNpemVvZihzaW4pKTsKKwlzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJaW5ldF9hdG9uKGJzY19pcGFkZHIsICZzaW4uc2luX2FkZHIpOworCisJREVCVUdQKERJTlAsICIoJXUvJXUvJXUpIE5ldyBCVFMgY29ubmVjdGlvbjogIiwKKwkJc2l0ZV9pZCwgYnRzX2lkLCB0cnhfaWQpOworCisJLyogT01MIG5lZWRzIHRvIGJlIGVzdGFibGlzaGVkIGJlZm9yZSBSU0wgKi8KKwlpZiAoKGJmZC0+cHJpdl9uciAmIDB4ZmYpICE9IE9NTF9GUk9NX0JUUykgeworCQlERUJVR1BDKERJTlAsICJOb3QgYSBPTUwgY29ubmVjdGlvbiA/IT9cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBhbGxvY2F0ZSBuZXcgQlRTIGNvbm5lY3Rpb24gZGF0YSBzdHJ1Y3R1cmUgKi8KKwlpcGJjID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgaXBhX2J0c19jb25uKTsKKwlpZiAoIWlwYmMpIHsKKwkJcmV0ID0gLUVOT01FTTsKKwkJZ290byBlcnJfb3V0OworCX0KKworCURFQlVHUEMoRElOUCwgIkNyZWF0ZWQgQlRTIENvbm4gZGF0YSBzdHJ1Y3R1cmVcbiIpOworCWlwYmMtPmlwcCA9IGlwcDsKKwlpcGJjLT51bml0X2lkLnNpdGVfaWQgPSBzaXRlX2lkOworCWlwYmMtPnVuaXRfaWQuYnRzX2lkID0gYnRzX2lkOworCWlwYmMtPm9tbF9jb25uID0gaXBjOworCWlwYy0+YnRzX2Nvbm4gPSBpcGJjOworCisJLyogc3RvcmUgdGhlIGNvbnRlbnQgb2YgdGhlIElEIFRBR1MgZm9yIGxhdGVyIHJlZmVyZW5jZSAqLworCXN0b3JlX2lkdGFncyhpcGJjLCB0bHZwKTsKKwlpcGJjLT5pZF9yZXNwX2xlbiA9IG1zZy0+bGVuOworCWlwYmMtPmlkX3Jlc3AgPSB0YWxsb2Nfc2l6ZSh0YWxsX2JzY19jdHgsIGlwYmMtPmlkX3Jlc3BfbGVuKTsKKwltZW1jcHkoaXBiYy0+aWRfcmVzcCwgbXNnLT5kYXRhLCBpcGJjLT5pZF9yZXNwX2xlbik7CisKKwkvKiBDcmVhdGUgT01MIFRDUCBjb25uZWN0aW9uIHRvd2FyZHMgQlNDICovCisJc2luLnNpbl9wb3J0ID0gaHRvbnMoSVBBX1RDUF9QT1JUX09NTCk7CisJaXBiYy0+YnNjX29tbF9jb25uID0gY29ubmVjdF9ic2MoJnNpbiwgT01MX1RPX0JTQywgaXBiYyk7CisJaWYgKCFpcGJjLT5ic2Nfb21sX2Nvbm4pIHsKKwkJcmV0ID0gLUVJTzsKKwkJZ290byBlcnJfYnNjX2Nvbm47CisJfQorCisJREVCVUdQKERJTlAsICIoJXUvJXUvJXUpIE9NTCBDb25uZWN0ZWQgdG8gQlNDXG4iLAorCQlzaXRlX2lkLCBidHNfaWQsIHRyeF9pZCk7CisKKwkvKiBDcmVhdGUgVURQIHNvY2tldCBmb3IgQlRTIHBhY2tldCBpbmplY3Rpb24gKi8KKwl1ZHBfcG9ydCA9IDEwMDAwICsgKHNpdGVfaWQgJSAxMDAwKSoxMDAgKyAoYnRzX2lkICUgMTAwKTsKKwlyZXQgPSBtYWtlX3NvY2soJmlwYmMtPnVkcF9idHNfZmQsIHVkcF9wb3J0LCBJUFBST1RPX1VEUCwKKwkJCVVEUF9UT19CVFMsIHVkcF9mZF9jYiwgaXBiYyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3VkcF9idHM7CisJREVCVUdQKERJTlAsICIoJXUvJXUvJXUpIENyZWF0ZWQgVURQIHNvY2tldCBmb3IgaW5qZWN0aW9uICIKKwkJInRvd2FyZHMgQlRTIGF0IHBvcnQgJXVcbiIsIHNpdGVfaWQsIGJ0c19pZCwgdHJ4X2lkLCB1ZHBfcG9ydCk7CisKKwkvKiBDcmVhdGUgVURQIHNvY2tldCBmb3IgQlNDIHBhY2tldCBpbmplY3Rpb24gKi8KKwl1ZHBfcG9ydCA9IDIwMDAwICsgKHNpdGVfaWQgJSAxMDAwKSoxMDAgKyAoYnRzX2lkICUgMTAwKTsKKwlyZXQgPSBtYWtlX3NvY2soJmlwYmMtPnVkcF9ic2NfZmQsIHVkcF9wb3J0LCBJUFBST1RPX1VEUCwKKwkJCVVEUF9UT19CU0MsIHVkcF9mZF9jYiwgaXBiYyk7CisJaWYgKHJldCA8IDApCisJCWdvdG8gZXJyX3VkcF9ic2M7CisJREVCVUdQKERJTlAsICIoJXUvJXUvJXUpIENyZWF0ZWQgVURQIHNvY2tldCBmb3IgaW5qZWN0aW9uICIKKwkJInRvd2FyZHMgQlNDIGF0IHBvcnQgJXVcbiIsIHNpdGVfaWQsIGJ0c19pZCwgdHJ4X2lkLCB1ZHBfcG9ydCk7CisJbGxpc3RfYWRkKCZpcGJjLT5saXN0LCAmaXBwLT5idHNfbGlzdCk7CisKKwlyZXR1cm4gMDsKKworZXJyX3VkcF9ic2M6CisJYnNjX3VucmVnaXN0ZXJfZmQoJmlwYmMtPnVkcF9idHNfZmQpOworZXJyX3VkcF9idHM6CisJYnNjX3VucmVnaXN0ZXJfZmQoJmlwYmMtPmJzY19vbWxfY29ubi0+ZmQpOworCWNsb3NlKGlwYmMtPmJzY19vbWxfY29ubi0+ZmQuZmQpOworCXRhbGxvY19mcmVlKGlwYmMtPmJzY19vbWxfY29ubik7CisJaXBiYy0+YnNjX29tbF9jb25uID0gTlVMTDsKK2Vycl9ic2NfY29ubjoKKwl0YWxsb2NfZnJlZShpcGJjLT5pZF9yZXNwKTsKKwl0YWxsb2NfZnJlZShpcGJjKTsKKyNpZiAwCisJYnNjX3VucmVnaXN0ZXJfZmQoYmZkKTsKKwljbG9zZShiZmQtPmZkKTsKKwl0YWxsb2NfZnJlZShiZmQpOworI2VuZGlmCitlcnJfb3V0OgorCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgaXBhY2Nlc3NfcmN2bXNnKHN0cnVjdCBpcGFfcHJveHlfY29ubiAqaXBjLCBzdHJ1Y3QgbXNnYiAqbXNnLAorCQkJICAgc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCB0bHZfcGFyc2VkIHRsdnA7CisJdV9pbnQ4X3QgbXNnX3R5cGUgPSAqKG1zZy0+bDJoKTsKKwl1X2ludDE2X3Qgc2l0ZV9pZCwgYnRzX2lkLCB0cnhfaWQ7CisJc3RydWN0IGlwYV9idHNfY29ubiAqaXBiYzsKKwlpbnQgcmV0ID0gMDsKKworCXN3aXRjaCAobXNnX3R5cGUpIHsKKwljYXNlIElQQUNfTVNHVF9QSU5HOgorCQlyZXQgPSB3cml0ZShiZmQtPmZkLCBwb25nLCBzaXplb2YocG9uZykpOworCQlpZiAocmV0IDwgMCkKKwkJCXJldHVybiByZXQ7CisJCWlmIChyZXQgPCBzaXplb2YocG9uZykpIHsKKwkJCURFQlVHUChESU5QLCAic2hvcnQgd3JpdGVcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJYnJlYWs7CisJY2FzZSBJUEFDX01TR1RfUE9ORzoKKwkJREVCVUdQKERNSSwgIlBPTkchXG4iKTsKKwkJYnJlYWs7CisJY2FzZSBJUEFDX01TR1RfSURfUkVTUDoKKwkJREVCVUdQKERNSSwgIklEX1JFU1AgIik7CisJCS8qIHBhcnNlIHRhZ3MsIHNlYXJjaCBmb3IgVW5pdCBJRCAqLworCQlpcGFjX2lkdGFnX3BhcnNlKCZ0bHZwLCAodV9pbnQ4X3QgKiltc2ctPmwyaCArIDIsCisJCQkJIG1zZ2JfbDJsZW4obXNnKS0yKTsKKwkJREVCVUdQKERNSSwgIlxuIik7CisKKwkJaWYgKCFUTFZQX1BSRVNFTlQoJnRsdnAsIElQQUNfSURUQUdfVU5JVCkpIHsKKwkJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgIk5vIFVuaXQgSUQgaW4gSUQgUkVTUE9OU0UgIT8hXG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisKKwkJLyogbG9va3VwIEJUUywgY3JlYXRlIHNpZ25fbGluaywgLi4uICovCisJCXBhcnNlX3VuaXRpZCgoY2hhciAqKVRMVlBfVkFMKCZ0bHZwLCBJUEFDX0lEVEFHX1VOSVQpLAorCQkJICAgICAmc2l0ZV9pZCwgJmJ0c19pZCwgJnRyeF9pZCk7CisJCWlwYmMgPSBmaW5kX2J0c19ieV91bml0aWQoaXBwLCBzaXRlX2lkLCBidHNfaWQpOworCQlpZiAoIWlwYmMpIHsKKwkJCS8qIFdlIGhhdmUgbm90IGZvdW5kIGFuIGlwYmMgKHBlci1idHMgcHJveHkgaW5zdGFuY2UpCisJCQkgKiBmb3IgdGhpcyBCVFMgeWV0LiAgVGhlIGZpcnN0IGNvbm5lY3Rpb24gb2YgYSBuZXcgQlRTIG11c3QKKwkJCSAqIGJlIGEgT01MIGNvbm5lY3Rpb24uICBXZSBhbGxvY2F0ZSB0aGUgYXNzb2NpYXRlZCBkYXRhIHN0cnVjdHVyZXMsCisJCQkgKiBhbmQgdHJ5IHRvIGNvbm5lY3QgdG8gdGhlIHJlbW90ZSBlbmQgKi8KKworCQkJcmV0dXJuIGlwYmNfYWxsb2NfY29ubmVjdChpcGMsIGJmZCwgc2l0ZV9pZCwgYnRzX2lkLAorCQkJCQkJICB0cnhfaWQsICZ0bHZwLCBtc2cpOworCQkJLyogaWYgdGhpcyBmYWlscywgdGhlIGNhbGxlciB3aWxsIGNsZWFuIHVwIGJmZCAqLworCQl9IGVsc2UgeworCQkJc3RydWN0IHNvY2thZGRyX2luIHNpbjsKKwkJCW1lbXNldCgmc2luLCAwLCBzaXplb2Yoc2luKSk7CisJCQlzaW4uc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCQlpbmV0X2F0b24oYnNjX2lwYWRkciwgJnNpbi5zaW5fYWRkcik7CisKKwkJCURFQlVHUChESU5QLCAiSWRlbnRpZmllZCBCVFMgJXUvJXUvJXVcbiIsCisJCQkJc2l0ZV9pZCwgYnRzX2lkLCB0cnhfaWQpOworCisJCQlpZiAoKGJmZC0+cHJpdl9uciAmIDB4ZmYpICE9IFJTTF9GUk9NX0JUUykgeworCQkJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgIlNlY29uZCBPTUwgY29ubmVjdGlvbiBmcm9tICIKKwkJCQkgICAgICJzYW1lIEJUUyA/IT9cbiIpOworCQkJCXJldHVybiAwOworCQkJfQorCisJCQlpZiAodHJ4X2lkID4gTUFYX1RSWCkgeworCQkJCUxPR1AoRElOUCwgTE9HTF9FUlJPUiwgIldlIGRvbid0IHN1cHBvcnQgbW9yZSAiCisJCQkJICAgICAidGhhbiAldSBUUlhcbiIsIE1BWF9UUlgpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCisJCQlpcGMtPmJ0c19jb25uID0gaXBiYzsKKwkJCS8qIHN0b3JlIFRSWCBudW1iZXIgaW4gaGlnaGVyIDggYml0IG9mIHRoZSBiZmQgcHJpdmF0ZSBudW1iZXIgKi8KKwkJCWJmZC0+cHJpdl9uciB8PSB0cnhfaWQgPDwgODsKKwkJCWlwYmMtPnJzbF9jb25uW3RyeF9pZF0gPSBpcGM7CisKKwkJCS8qIENyZWF0ZSBSU0wgVENQIGNvbm5lY3Rpb24gdG93YXJkcyBCU0MgKi8KKwkJCXNpbi5zaW5fcG9ydCA9IGh0b25zKElQQV9UQ1BfUE9SVF9SU0wpOworCQkJaXBiYy0+YnNjX3JzbF9jb25uW3RyeF9pZF0gPQorCQkJCWNvbm5lY3RfYnNjKCZzaW4sIFJTTF9UT19CU0MgfCAodHJ4X2lkIDw8IDgpLCBpcGJjKTsKKwkJCWlmICghaXBiYy0+YnNjX29tbF9jb25uKQorCQkJCXJldHVybiAtRUlPOworCQkJREVCVUdQKERJTlAsICIoJXUvJXUvJXUpIENvbm5lY3RlZCBSU0wgdG8gQlNDXG4iLAorCQkJCXNpdGVfaWQsIGJ0c19pZCwgdHJ4X2lkKTsKKwkJfQorCQlicmVhazsKKwljYXNlIElQQUNfTVNHVF9JRF9HRVQ6CisJCURFQlVHUChETUksICJJRF9HRVRcbiIpOworCQlpZiAoKGJmZC0+cHJpdl9uciAmIDB4ZmYpICE9IE9NTF9UT19CU0MgJiYKKwkJICAgIChiZmQtPnByaXZfbnIgJiAweGZmKSAhPSBSU0xfVE9fQlNDKSB7CisJCQlERUJVR1AoRElOUCwgIklEZW50aXR5IFJFUXVlc3QgZnJvbSBCVFMgPyE/XG4iKTsKKwkJCXJldHVybiAtRUlPOworCQl9CisJCWlwYmMgPSBpcGMtPmJ0c19jb25uOworCQlpZiAoIWlwYmMpIHsKKwkJCURFQlVHUChESU5QLCAiSURfR0VUIGZyb20gQlNDIGJlZm9yZSB3ZSBoYXZlIElEX1JFU1AgZnJvbSBCVFNcbiIpOworCQkJcmV0dXJuIC1FSU87CisJCX0KKwkJcmV0ID0gd3JpdGUoYmZkLT5mZCwgaXBiYy0+aWRfcmVzcCwgaXBiYy0+aWRfcmVzcF9sZW4pOworCQlicmVhazsKKwljYXNlIElQQUNfTVNHVF9JRF9BQ0s6CisJCURFQlVHUChETUksICJJRF9BQ0s/IC0+IEFDSyFcbiIpOworCQlyZXQgPSB3cml0ZShiZmQtPmZkLCBpZF9hY2ssIHNpemVvZihpZF9hY2spKTsKKwkJYnJlYWs7CisJfQorCXJldHVybiAwOworfQorCitzdHJ1Y3QgbXNnYiAqaXBhY2Nlc3NfcmVhZF9tc2coc3RydWN0IGJzY19mZCAqYmZkLCBpbnQgKmVycm9yKQoreworCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jKFBST1hZX0FMTE9DX1NJWkUsICJBYmlzL0lQIik7CisJc3RydWN0IGlwYWNjZXNzX2hlYWQgKmhoOworCWludCBsZW4sIHJldCA9IDA7CisKKwlpZiAoIW1zZykgeworCQkqZXJyb3IgPSAtRU5PTUVNOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwkvKiBmaXJzdCByZWFkIG91ciAzLWJ5dGUgaGVhZGVyICovCisJaGggPSAoc3RydWN0IGlwYWNjZXNzX2hlYWQgKikgbXNnLT5kYXRhOworCXJldCA9IHJlY3YoYmZkLT5mZCwgbXNnLT5kYXRhLCAzLCAwKTsKKwlpZiAocmV0IDwgMCkgeworCQlpZiAoZXJybm8gIT0gRUFHQUlOKQorCQkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAicmVjdiBlcnJvcjogJXNcbiIsIHN0cmVycm9yKGVycm5vKSk7CisJCW1zZ2JfZnJlZShtc2cpOworCQkqZXJyb3IgPSByZXQ7CisJCXJldHVybiBOVUxMOworCX0gZWxzZSBpZiAocmV0ID09IDApIHsKKwkJbXNnYl9mcmVlKG1zZyk7CisJCSplcnJvciA9IHJldDsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJbXNnYl9wdXQobXNnLCByZXQpOworCisJLyogdGhlbiByZWFkIHRlIGxlbmd0aCBhcyBzcGVjaWZpZWQgaW4gaGVhZGVyICovCisJbXNnLT5sMmggPSBtc2ctPmRhdGEgKyBzaXplb2YoKmhoKTsKKwlsZW4gPSBudG9ocyhoaC0+bGVuKTsKKwlyZXQgPSByZWN2KGJmZC0+ZmQsIG1zZy0+bDJoLCBsZW4sIDApOworCWlmIChyZXQgPCBsZW4pIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAic2hvcnQgcmVhZCFcbiIpOworCQltc2diX2ZyZWUobXNnKTsKKwkJKmVycm9yID0gLUVJTzsKKwkJcmV0dXJuIE5VTEw7CisJfQorCW1zZ2JfcHV0KG1zZywgcmV0KTsKKworCXJldHVybiBtc2c7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmlwY19ieV9wcml2X25yKHN0cnVjdCBpcGFfYnRzX2Nvbm4gKmlwYmMsCisJCQkJCSAgICAgdW5zaWduZWQgaW50IHByaXZfbnIpCit7CisJc3RydWN0IGlwYV9wcm94eV9jb25uICpic2NfY29ubjsKKwl1bnNpZ25lZCBpbnQgdHJ4X2lkID0gcHJpdl9uciA+PiA4OworCisJc3dpdGNoIChwcml2X25yICYgMHhmZikgeworCWNhc2UgT01MX0ZST01fQlRTOiAvKiBpbmNvbWluZyBPTUwgZGF0YSBmcm9tIEJUUywgZm9yd2FyZCB0byBCU0MgT01MICovCisJCWJzY19jb25uID0gaXBiYy0+YnNjX29tbF9jb25uOworCQlicmVhazsKKwljYXNlIFJTTF9GUk9NX0JUUzogLyogaW5jb21pbmcgUlNMIGRhdGEgZnJvbSBCVFMsIGZvcndhcmQgdG8gQlNDIFJTTCAqLworCQlic2NfY29ubiA9IGlwYmMtPmJzY19yc2xfY29ublt0cnhfaWRdOworCQlicmVhazsKKwljYXNlIE9NTF9UT19CU0M6IC8qIGluY29taW5nIE9NTCBkYXRhIGZyb20gQlNDLCBmb3J3YXJkIHRvIEJUUyBPTUwgKi8KKwkJYnNjX2Nvbm4gPSBpcGJjLT5vbWxfY29ubjsKKwkJYnJlYWs7CisJY2FzZSBSU0xfVE9fQlNDOiAvKiBpbmNvbWluZyBSU0wgZGF0YSBmcm9tIEJTQywgZm9yd2FyZCB0byBCVFMgUlNMICovCisJCWJzY19jb25uID0gaXBiYy0+cnNsX2Nvbm5bdHJ4X2lkXTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnNjX2Nvbm4gPSBOVUxMOworCQlicmVhazsKKwl9CisJcmV0dXJuIGJzY19jb25uOworfQorCitzdGF0aWMgdm9pZCByZWNvbm5fdG1yX2NiKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGlwYV9wcm94eSAqaXBwID0gZGF0YTsKKwlzdHJ1Y3QgaXBhX2J0c19jb25uICppcGJjOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzaW47CisJaW50IGk7CisKKwlERUJVR1AoRElOUCwgIlJ1bm5pbmcgcmVjb25uZWN0IHRpbWVyXG4iKTsKKworCW1lbXNldCgmc2luLCAwLCBzaXplb2Yoc2luKSk7CisJc2luLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWluZXRfYXRvbihic2NfaXBhZGRyLCAmc2luLnNpbl9hZGRyKTsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGlwYmMsICZpcHAtPmJ0c19saXN0LCBsaXN0KSB7CisJCS8qIGlmIE9NTCB0byBCU0MgaXMgZGVhZCwgdHJ5IHRvIHJlc3RvcmUgaXQgKi8KKwkJaWYgKGlwYmMtPm9tbF9jb25uICYmICFpcGJjLT5ic2Nfb21sX2Nvbm4pIHsKKwkJCXNpbi5zaW5fcG9ydCA9IGh0b25zKElQQV9UQ1BfUE9SVF9PTUwpOworCQkJbG9ncF9pcGJjX3VpZChESU5QLCBMT0dMX05PVElDRSwgaXBiYywgMCk7CisJCQlMT0dQQyhESU5QLCBMT0dMX05PVElDRSwgIk9NTCBUcnlpbmcgdG8gcmVjb25uZWN0XG4iKTsKKwkJCWlwYmMtPmJzY19vbWxfY29ubiA9IGNvbm5lY3RfYnNjKCZzaW4sIE9NTF9UT19CU0MsIGlwYmMpOworCQkJaWYgKCFpcGJjLT5ic2Nfb21sX2Nvbm4pCisJCQkJZ290byByZXNjaGVkdWxlOworCQkJbG9ncF9pcGJjX3VpZChESU5QLCBMT0dMX05PVElDRSwgaXBiYywgMCk7CisJCQlMT0dQQyhESU5QLCBMT0dMX05PVElDRSwgIk9NTCBSZWNvbm5lY3RlZFxuIik7CisJCX0KKwkJLyogaWYgd2UgKHN0aWxsKSBkb24ndCBoYXZlIGEgT01MIGNvbm5lY3Rpb24sIHNraXAgUlNMICovCisJCWlmICghaXBiYy0+b21sX2Nvbm4gfHwgIWlwYmMtPmJzY19vbWxfY29ubikKKwkJCWNvbnRpbnVlOworCisJCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGlwYmMtPnJzbF9jb25uKTsgaSsrKSB7CisJCQl1bnNpZ25lZCBpbnQgcHJpdl9ucjsKKwkJCS8qIGRvbid0IGVzdGFibGlzaCBSU0wgbGlua3Mgd2hpY2ggd2UgZG9uJ3QgaGF2ZSAqLworCQkJaWYgKCFpcGJjLT5yc2xfY29ubltpXSkKKwkJCQljb250aW51ZTsKKwkJCWlmIChpcGJjLT5ic2NfcnNsX2Nvbm5baV0pCisJCQkJY29udGludWU7CisJCQlwcml2X25yID0gaXBiYy0+cnNsX2Nvbm5baV0tPmZkLnByaXZfbnI7CisJCQlwcml2X25yICY9IH4weGZmOworCQkJcHJpdl9uciB8PSBSU0xfVE9fQlNDOworCQkJc2luLnNpbl9wb3J0ID0gaHRvbnMoSVBBX1RDUF9QT1JUX1JTTCk7CisJCQlsb2dwX2lwYmNfdWlkKERJTlAsIExPR0xfTk9USUNFLCBpcGJjLCBwcml2X25yID4+IDgpOworCQkJTE9HUEMoRElOUCwgTE9HTF9OT1RJQ0UsICJSU0wgVHJ5aW5nIHRvIHJlY29ubmVjdFxuIik7CisJCQlpcGJjLT5ic2NfcnNsX2Nvbm5baV0gPSBjb25uZWN0X2JzYygmc2luLCBwcml2X25yLCBpcGJjKTsKKwkJCWlmICghaXBiYy0+YnNjX3JzbF9jb25uKQorCQkJCWdvdG8gcmVzY2hlZHVsZTsKKwkJCWxvZ3BfaXBiY191aWQoRElOUCwgTE9HTF9OT1RJQ0UsIGlwYmMsIHByaXZfbnIgPj4gOCk7CisJCQlMT0dQQyhESU5QLCBMT0dMX05PVElDRSwgIlJTTCBSZWNvbm5lY3RlZFxuIik7CisJCX0KKwl9CisJcmV0dXJuOworCityZXNjaGVkdWxlOgorCWJzY19zY2hlZHVsZV90aW1lcigmaXBwLT5yZWNvbm5fdGltZXIsIDUsIDApOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfZGVhZF9zb2NrZXQoc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqaXBjID0gYmZkLT5kYXRhOwkJLyogbG9jYWwgY29ubiAqLworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqYnNjX2Nvbm47CQkvKiByZW1vdGUgY29ubiAqLworCXN0cnVjdCBpcGFfYnRzX2Nvbm4gKmlwYmMgPSBpcGMtPmJ0c19jb25uOworCXVuc2lnbmVkIGludCB0cnhfaWQgPSBiZmQtPnByaXZfbnIgPj4gODsKKwlzdHJ1Y3QgbXNnYiAqbXNnLCAqbXNnMjsKKworCWJzY191bnJlZ2lzdGVyX2ZkKGJmZCk7CisJY2xvc2UoYmZkLT5mZCk7CisJYmZkLT5mZCA9IC0xOworCisJLyogRklYTUU6IGNsZWFyIHR4X3F1ZXVlLCByZW1vdmUgYWxsIHJlZmVyZW5jZXMsIGV0Yy4gKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKG1zZywgbXNnMiwgJmlwYy0+dHhfcXVldWUsIGxpc3QpCisJCW1zZ2JfZnJlZShtc2cpOworCisJc3dpdGNoIChiZmQtPnByaXZfbnIgJiAweGZmKSB7CisJY2FzZSBPTUxfRlJPTV9CVFM6IC8qIGluY29taW5nIE9NTCBkYXRhIGZyb20gQlRTLCBmb3J3YXJkIHRvIEJTQyBPTUwgKi8KKwkJaXBiYy0+b21sX2Nvbm4gPSBOVUxMOworCQlic2NfY29ubiA9IGlwYmMtPmJzY19vbWxfY29ubjsKKwkJLyogY2xvc2UgdGhlIGNvbm5lY3Rpb24gdG8gdGhlIEJTQyAqLworCQlic2NfdW5yZWdpc3Rlcl9mZCgmYnNjX2Nvbm4tPmZkKTsKKwkJY2xvc2UoYnNjX2Nvbm4tPmZkLmZkKTsKKwkJbGxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShtc2csIG1zZzIsICZic2NfY29ubi0+dHhfcXVldWUsIGxpc3QpCisJCQltc2diX2ZyZWUobXNnKTsKKwkJdGFsbG9jX2ZyZWUoYnNjX2Nvbm4pOworCQlpcGJjLT5ic2Nfb21sX2Nvbm4gPSBOVUxMOworCQkvKiBGSVhNRTogZG8gd2UgbmVlZCB0byBkZWxldGUgdGhlIGVudGlyZSBpcGJjID8gKi8KKwkJYnJlYWs7CisJY2FzZSBSU0xfRlJPTV9CVFM6IC8qIGluY29taW5nIFJTTCBkYXRhIGZyb20gQlRTLCBmb3J3YXJkIHRvIEJTQyBSU0wgKi8KKwkJaXBiYy0+cnNsX2Nvbm5bdHJ4X2lkXSA9IE5VTEw7CisJCWJzY19jb25uID0gaXBiYy0+YnNjX3JzbF9jb25uW3RyeF9pZF07CisJCS8qIGNsb3NlIHRoZSBjb25uZWN0aW9uIHRvIHRoZSBCU0MgKi8KKwkJYnNjX3VucmVnaXN0ZXJfZmQoJmJzY19jb25uLT5mZCk7CisJCWNsb3NlKGJzY19jb25uLT5mZC5mZCk7CisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobXNnLCBtc2cyLCAmYnNjX2Nvbm4tPnR4X3F1ZXVlLCBsaXN0KQorCQkJbXNnYl9mcmVlKG1zZyk7CisJCXRhbGxvY19mcmVlKGJzY19jb25uKTsKKwkJaXBiYy0+YnNjX3JzbF9jb25uW3RyeF9pZF0gPSBOVUxMOworCQlicmVhazsKKwljYXNlIE9NTF9UT19CU0M6IC8qIGluY29taW5nIE9NTCBkYXRhIGZyb20gQlNDLCBmb3J3YXJkIHRvIEJUUyBPTUwgKi8KKwkJaXBiYy0+YnNjX29tbF9jb25uID0gTlVMTDsKKwkJYnNjX2Nvbm4gPSBpcGJjLT5vbWxfY29ubjsKKwkJLyogc3RhcnQgcmVjb25uZWN0IHRpbWVyICovCisJCWJzY19zY2hlZHVsZV90aW1lcigmaXBwLT5yZWNvbm5fdGltZXIsIDUsIDApOworCQlicmVhazsKKwljYXNlIFJTTF9UT19CU0M6IC8qIGluY29taW5nIFJTTCBkYXRhIGZyb20gQlNDLCBmb3J3YXJkIHRvIEJUUyBSU0wgKi8KKwkJaXBiYy0+YnNjX3JzbF9jb25uW3RyeF9pZF0gPSBOVUxMOworCQlic2NfY29ubiA9IGlwYmMtPnJzbF9jb25uW3RyeF9pZF07CisJCS8qIHN0YXJ0IHJlY29ubmVjdCB0aW1lciAqLworCQlic2Nfc2NoZWR1bGVfdGltZXIoJmlwcC0+cmVjb25uX3RpbWVyLCA1LCAwKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnNjX2Nvbm4gPSBOVUxMOworCQlicmVhazsKKwl9CisKKwl0YWxsb2NfZnJlZShpcGMpOworfQorCitzdGF0aWMgaW50IGhhbmRsZV90Y3BfcmVhZChzdHJ1Y3QgYnNjX2ZkICpiZmQpCit7CisJc3RydWN0IGlwYV9wcm94eV9jb25uICppcGMgPSBiZmQtPmRhdGE7CisJc3RydWN0IGlwYV9idHNfY29ubiAqaXBiYyA9IGlwYy0+YnRzX2Nvbm47CisJc3RydWN0IGlwYV9wcm94eV9jb25uICpic2NfY29ubjsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCXN0cnVjdCBpcGFjY2Vzc19oZWFkICpoaDsKKwlpbnQgcmV0ID0gMDsKKwljaGFyICpidHNic2M7CisKKwlpZiAoKGJmZC0+cHJpdl9uciAmIDB4ZmYpIDw9IDIpCisJCWJ0c2JzYyA9ICJCVFMiOworCWVsc2UKKwkJYnRzYnNjID0gIkJTQyI7CisKKwltc2cgPSBpcGFjY2Vzc19yZWFkX21zZyhiZmQsICZyZXQpOworCWlmICghbXNnKSB7CisJCWlmIChyZXQgPT0gMCkgeworCQkJbG9ncF9pcGJjX3VpZChESU5QLCBMT0dMX05PVElDRSwgaXBiYywgYmZkLT5wcml2X25yID4+IDgpOworCQkJTE9HUEMoRElOUCwgTE9HTF9OT1RJQ0UsICIlcyBkaXNhcHBlYXJlZCwgIgorCQkJICAgICAiZGVhZCBzb2NrZXRcbiIsIGJ0c2JzYyk7CisJCQloYW5kbGVfZGVhZF9zb2NrZXQoYmZkKTsKKwkJfQorCQlyZXR1cm4gcmV0OworCX0KKworCW1zZ2JfcHV0KG1zZywgcmV0KTsKKwlsb2dwX2lwYmNfdWlkKERNSSwgTE9HTF9ERUJVRywgaXBiYywgYmZkLT5wcml2X25yID4+IDgpOworCURFQlVHUEMoRE1JLCAiUlg8LSVzOiAlc1xuIiwgYnRzYnNjLCBoZXhkdW1wKG1zZy0+ZGF0YSwgbXNnLT5sZW4pKTsKKworCWhoID0gKHN0cnVjdCBpcGFjY2Vzc19oZWFkICopIG1zZy0+ZGF0YTsKKwlpZiAoaGgtPnByb3RvID09IElQQUNfUFJPVE9fSVBBQ0NFU1MpIHsKKwkJcmV0ID0gaXBhY2Nlc3NfcmN2bXNnKGlwYywgbXNnLCBiZmQpOworCQlpZiAocmV0IDwgMCkgeworCQkJYnNjX3VucmVnaXN0ZXJfZmQoYmZkKTsKKwkJCWNsb3NlKGJmZC0+ZmQpOworCQkJYmZkLT5mZCA9IC0xOworCQkJdGFsbG9jX2ZyZWUoYmZkKTsKKwkJfQorCQkvKiB3ZSBkbyBub3QgZm9yd2FyZCB0aGUgQ0NNIHByb3RvY29sIHRocm91Z2ggdGhlCisJCSAqIHByb3h5IGJ1dCByYXRoZXIgdGVybWluYXRlIGl0IG91cnNlbHZlcyAqLworCQltc2diX2ZyZWUobXNnKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwlpZiAoIWlwYmMpIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLAorCQkgICAgICJyZWNlaXZlZCAlcyBwYWNrZXQgYnV0IG5vIGlwYy0+YnRzX2Nvbm4/IT9cbiIsIGJ0c2JzYyk7CisJCW1zZ2JfZnJlZShtc2cpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwlic2NfY29ubiA9IGlwY19ieV9wcml2X25yKGlwYmMsIGJmZC0+cHJpdl9ucik7CisJaWYgKGJzY19jb25uKSB7CisJCS8qIGVucXVldWUgcGFja2V0IHRvd2FyZHMgQlNDICovCisJCW1zZ2JfZW5xdWV1ZSgmYnNjX2Nvbm4tPnR4X3F1ZXVlLCBtc2cpOworCQkvKiBtYXJrIHJlc3BlY3RpdmUgZmlsZWRlc2NyaXB0b3IgYXMgJ3dlIHdhbnQgdG8gd3JpdGUnICovCisJCWJzY19jb25uLT5mZC53aGVuIHw9IEJTQ19GRF9XUklURTsKKwl9IGVsc2UgeworCQlsb2dwX2lwYmNfdWlkKERJTlAsIExPR0xfSU5GTywgaXBiYywgYmZkLT5wcml2X25yID4+IDgpOworCQlMT0dQQyhESU5QLCBMT0dMX0lORk8sICJEcm9wcGluZyBwYWNrZXQgZnJvbSAlcywgIgorCQkgICAgICJzaW5jZSByZW1vdGUgY29ubmVjdGlvbiBpcyBkZWFkXG4iLCBidHNic2MpOworCQltc2diX2ZyZWUobXNnKTsKKwl9CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBhIFRDUCBzb2NrZXQgaXMgcmVhZHkgdG8gYmUgd3JpdHRlbiB0byAqLworc3RhdGljIGludCBoYW5kbGVfdGNwX3dyaXRlKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmlwYyA9IGJmZC0+ZGF0YTsKKwlzdHJ1Y3QgaXBhX2J0c19jb25uICppcGJjID0gaXBjLT5idHNfY29ubjsKKwlzdHJ1Y3QgbGxpc3RfaGVhZCAqbGg7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwljaGFyICpidHNic2M7CisJaW50IHJldDsKKworCWlmICgoYmZkLT5wcml2X25yICYgMHhmZikgPD0gMikKKwkJYnRzYnNjID0gIkJUUyI7CisJZWxzZQorCQlidHNic2MgPSAiQlNDIjsKKworCisJLyogZ2V0IHRoZSBuZXh0IG1zZyBmb3IgdGhpcyB0aW1lc2xvdCAqLworCWlmIChsbGlzdF9lbXB0eSgmaXBjLT50eF9xdWV1ZSkpIHsKKwkJYmZkLT53aGVuICY9IH5CU0NfRkRfV1JJVEU7CisJCXJldHVybiAwOworCX0KKwlsaCA9IGlwYy0+dHhfcXVldWUubmV4dDsKKwlsbGlzdF9kZWwobGgpOworCW1zZyA9IGxsaXN0X2VudHJ5KGxoLCBzdHJ1Y3QgbXNnYiwgbGlzdCk7CisKKwlsb2dwX2lwYmNfdWlkKERNSSwgTE9HTF9ERUJVRywgaXBiYywgYmZkLT5wcml2X25yID4+IDgpOworCURFQlVHUEMoRE1JLCAiVFggJTA0eDogJXNcbiIsIGJmZC0+cHJpdl9uciwKKwkJaGV4ZHVtcChtc2ctPmRhdGEsIG1zZy0+bGVuKSk7CisKKwlyZXQgPSBzZW5kKGJmZC0+ZmQsIG1zZy0+ZGF0YSwgbXNnLT5sZW4sIDApOworCW1zZ2JfZnJlZShtc2cpOworCisJaWYgKHJldCA9PSAwKSB7CisJCWxvZ3BfaXBiY191aWQoRElOUCwgTE9HTF9OT1RJQ0UsIGlwYmMsIGJmZC0+cHJpdl9uciA+PiA4KTsKKwkJTE9HUChESU5QLCBMT0dMX05PVElDRSwgIiVzIGRpc2FwcGVhcmVkLCBkZWFkIHNvY2tldFxuIiwgYnRzYnNjKTsKKwkJaGFuZGxlX2RlYWRfc29ja2V0KGJmZCk7CisJfQorCisJcmV0dXJuIHJldDsKK30KKworLyogY2FsbGJhY2sgZnJvbSBzZWxlY3QuYyBpbiBjYXNlIG9uZSBvZiB0aGUgZmQncyBjYW4gYmUgcmVhZC93cml0dGVuICovCitzdGF0aWMgaW50IGlwYWNjZXNzX2ZkX2NiKHN0cnVjdCBic2NfZmQgKmJmZCwgdW5zaWduZWQgaW50IHdoYXQpCit7CisJaW50IHJjID0gMDsKKworCWlmICh3aGF0ICYgQlNDX0ZEX1JFQUQpIHsKKwkJcmMgPSBoYW5kbGVfdGNwX3JlYWQoYmZkKTsKKwkJaWYgKHJjIDwgMCkKKwkJCXJldHVybiByYzsKKwl9CisJaWYgKHdoYXQgJiBCU0NfRkRfV1JJVEUpCisJCXJjID0gaGFuZGxlX3RjcF93cml0ZShiZmQpOworCisJcmV0dXJuIHJjOworfQorCisvKiBjYWxsYmFjayBvZiB0aGUgbGlzdGVuaW5nIGZpbGVkZXNjcmlwdG9yICovCitzdGF0aWMgaW50IGxpc3Rlbl9mZF9jYihzdHJ1Y3QgYnNjX2ZkICpsaXN0ZW5fYmZkLCB1bnNpZ25lZCBpbnQgd2hhdCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqaXBjOworCXN0cnVjdCBic2NfZmQgKmJmZDsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gc2E7CisJc29ja2xlbl90IHNhX2xlbiA9IHNpemVvZihzYSk7CisKKwlpZiAoISh3aGF0ICYgQlNDX0ZEX1JFQUQpKQorCQlyZXR1cm4gMDsKKworCXJldCA9IGFjY2VwdChsaXN0ZW5fYmZkLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmc2EsICZzYV9sZW4pOworCWlmIChyZXQgPCAwKSB7CisJCXBlcnJvcigiYWNjZXB0Iik7CisJCXJldHVybiByZXQ7CisJfQorCURFQlVHUChESU5QLCAiYWNjZXB0KCllZCBuZXcgJXMgbGluayBmcm9tICVzXG4iLCAKKwkJKGxpc3Rlbl9iZmQtPnByaXZfbnIgJiAweGZmKSA9PSBPTUxfRlJPTV9CVFMgPyAiT01MIiA6ICJSU0wiLAorCQlpbmV0X250b2Eoc2Euc2luX2FkZHIpKTsKKworCWlwYyA9IGFsbG9jX2Nvbm4oKTsKKwlpZiAoIWlwYykgeworCQljbG9zZShyZXQpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwliZmQgPSAmaXBjLT5mZDsKKwliZmQtPmZkID0gcmV0OworCWJmZC0+ZGF0YSA9IGlwYzsKKwliZmQtPnByaXZfbnIgPSBsaXN0ZW5fYmZkLT5wcml2X25yOworCWJmZC0+Y2IgPSBpcGFjY2Vzc19mZF9jYjsKKwliZmQtPndoZW4gPSBCU0NfRkRfUkVBRDsKKwlyZXQgPSBic2NfcmVnaXN0ZXJfZmQoYmZkKTsKKwlpZiAocmV0IDwgMCkgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJjb3VsZCBub3QgcmVnaXN0ZXIgRkRcbiIpOworCQljbG9zZShiZmQtPmZkKTsKKwkJdGFsbG9jX2ZyZWUoaXBjKTsKKwkJcmV0dXJuIHJldDsKKwl9CisKKwkvKiBSZXF1ZXN0IElELiBGSVhNRTogcmVxdWVzdCBMT0NBVElPTiwgSFcvU1cgVkVyc2lvbiwgVW5pdCBOYW1lLCBTZXJubyAqLworCXJldCA9IHdyaXRlKGJmZC0+ZmQsIGlkX3JlcSwgc2l6ZW9mKGlkX3JlcSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbWFrZV9saXN0ZW5fc29jayhzdHJ1Y3QgYnNjX2ZkICpiZmQsIHVfaW50MTZfdCBwb3J0LCBpbnQgcHJpdl9uciwKKwkJICAgICBpbnQgKCpjYikoc3RydWN0IGJzY19mZCAqZmQsIHVuc2lnbmVkIGludCB3aGF0KSkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKwlpbnQgcmV0LCBvbiA9IDE7CisKKwliZmQtPmZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCk7CisJYmZkLT5jYiA9IGNiOworCWJmZC0+d2hlbiA9IEJTQ19GRF9SRUFEOworCWJmZC0+cHJpdl9uciA9IHByaXZfbnI7CisKKwltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisJYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlhZGRyLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisJaWYgKCFsaXN0ZW5faXBhZGRyKQorCQlhZGRyLnNpbl9hZGRyLnNfYWRkciA9IElOQUREUl9BTlk7CisJZWxzZQorCQlpbmV0X2F0b24obGlzdGVuX2lwYWRkciwgJmFkZHIuc2luX2FkZHIpOworCisJc2V0c29ja29wdChiZmQtPmZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZvbiwgc2l6ZW9mKG9uKSk7CisKKwlyZXQgPSBiaW5kKGJmZC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSk7CisJaWYgKHJldCA8IDApIHsKKwkJTE9HUChESU5QLCBMT0dMX0VSUk9SLCAiY291bGQgbm90IGJpbmQgbGlzdGVuIHNvY2tldCAlc1xuIiwKKwkJCXN0cmVycm9yKGVycm5vKSk7CisJCXJldHVybiAtRUlPOworCX0KKworCXJldCA9IGxpc3RlbihiZmQtPmZkLCAxKTsKKwlpZiAocmV0IDwgMCkgeworCQlwZXJyb3IoImxpc3RlbiIpOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldCA9IGJzY19yZWdpc3Rlcl9mZChiZmQpOworCWlmIChyZXQgPCAwKSB7CisJCXBlcnJvcigicmVnaXN0ZXJfbGlzdGVuX2ZkIik7CisJCXJldHVybiByZXQ7CisJfQorCXJldHVybiAwOworfQorCisvKiBBY3RpdmVseSBjb25uZWN0IHRvIGEgQlNDLiAgKi8KK3N0YXRpYyBzdHJ1Y3QgaXBhX3Byb3h5X2Nvbm4gKmNvbm5lY3RfYnNjKHN0cnVjdCBzb2NrYWRkcl9pbiAqc2EsIGludCBwcml2X25yLCB2b2lkICpkYXRhKQoreworCXN0cnVjdCBpcGFfcHJveHlfY29ubiAqaXBjOworCXN0cnVjdCBic2NfZmQgKmJmZDsKKwlpbnQgcmV0LCBvbiA9IDE7CisKKwlpcGMgPSBhbGxvY19jb25uKCk7CisJaWYgKCFpcGMpCisJCXJldHVybiBOVUxMOworCisJaXBjLT5idHNfY29ubiA9IGRhdGE7CisKKwliZmQgPSAmaXBjLT5mZDsKKwliZmQtPmZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfU1RSRUFNLCBJUFBST1RPX1RDUCk7CisJYmZkLT5jYiA9IGlwYWNjZXNzX2ZkX2NiOworCWJmZC0+d2hlbiA9IEJTQ19GRF9SRUFEIHwgQlNDX0ZEX1dSSVRFOworCWJmZC0+ZGF0YSA9IGlwYzsKKwliZmQtPnByaXZfbnIgPSBwcml2X25yOworCisJc2V0c29ja29wdChiZmQtPmZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZvbiwgc2l6ZW9mKG9uKSk7CisKKwlyZXQgPSBjb25uZWN0KGJmZC0+ZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgc2EsIHNpemVvZigqc2EpKTsKKwlpZiAocmV0IDwgMCkgeworCQlMT0dQKERJTlAsIExPR0xfRVJST1IsICJjb3VsZCBub3QgY29ubmVjdCBzb2NrZXRcbiIpOworCQljbG9zZShiZmQtPmZkKTsKKwkJdGFsbG9jX2ZyZWUoaXBjKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJLyogcHJlLWZpbGwgdHhfcXVldWUgd2l0aCBpZGVudGl0eSByZXF1ZXN0ICovCisJcmV0ID0gYnNjX3JlZ2lzdGVyX2ZkKGJmZCk7CisJaWYgKHJldCA8IDApIHsKKwkJY2xvc2UoYmZkLT5mZCk7CisJCXRhbGxvY19mcmVlKGlwYyk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiBpcGM7Cit9CisKK3N0YXRpYyBpbnQgaXBhY2Nlc3NfcHJveHlfc2V0dXAodm9pZCkKK3sKKwlpbnQgcmV0OworCisJaXBwID0gdGFsbG9jX3plcm8odGFsbF9ic2NfY3R4LCBzdHJ1Y3QgaXBhX3Byb3h5KTsKKwlpZiAoIWlwcCkKKwkJcmV0dXJuIC1FTk9NRU07CisJSU5JVF9MTElTVF9IRUFEKCZpcHAtPmJ0c19saXN0KTsKKwlpcHAtPnJlY29ubl90aW1lci5jYiA9IHJlY29ubl90bXJfY2I7CisJaXBwLT5yZWNvbm5fdGltZXIuZGF0YSA9IGlwcDsKKworCS8qIExpc3RlbiBmb3IgT01MIGNvbm5lY3Rpb25zICovCisJcmV0ID0gbWFrZV9saXN0ZW5fc29jaygmaXBwLT5vbWxfbGlzdGVuX2ZkLCBJUEFfVENQX1BPUlRfT01MLAorCQkJCU9NTF9GUk9NX0JUUywgbGlzdGVuX2ZkX2NiKTsKKwlpZiAocmV0IDwgMCkKKwkJcmV0dXJuIHJldDsKKworCS8qIExpc3RlbiBmb3IgUlNMIGNvbm5lY3Rpb25zICovCisJcmV0ID0gbWFrZV9saXN0ZW5fc29jaygmaXBwLT5yc2xfbGlzdGVuX2ZkLCBJUEFfVENQX1BPUlRfUlNMLAorCQkJCVJTTF9GUk9NX0JUUywgbGlzdGVuX2ZkX2NiKTsKKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyB2b2lkIHNpZ25hbF9oYW5kbGVyKGludCBzaWduYWwpCit7CisJZnByaW50ZihzdGRvdXQsICJzaWduYWwgJXUgcmVjZWl2ZWRcbiIsIHNpZ25hbCk7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU0lHQUJSVDoKKwkJLyogaW4gY2FzZSBvZiBhYm9ydCwgd2Ugd2FudCB0byBvYnRhaW4gYSB0YWxsb2MgcmVwb3J0CisJCSAqIGFuZCB0aGVuIHJldHVybiB0byB0aGUgY2FsbGVyLCB3aG8gd2lsbCBhYm9ydCB0aGUgcHJvY2VzcyAqLworCWNhc2UgU0lHVVNSMToKKwkJdGFsbG9jX3JlcG9ydF9mdWxsKHRhbGxfYnNjX2N0eCwgc3RkZXJyKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKmFyZ3YpCit7CisJaW50IHJjOworCisJbGlzdGVuX2lwYWRkciA9ICIxOTIuMTY4LjEwMC4xMSI7CisJYnNjX2lwYWRkciA9ICIxOTIuMTY4LjEwMC4yMzkiOworCisJdGFsbF9ic2NfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KE5VTEwsIDEsICJpcGFjY2Vzcy1wcm94eSIpOworCisJZGVidWdfaW5pdCgpOworCXN0ZGVycl90YXJnZXQgPSBkZWJ1Z190YXJnZXRfY3JlYXRlX3N0ZGVycigpOworCWRlYnVnX2FkZF90YXJnZXQoc3RkZXJyX3RhcmdldCk7CisJZGVidWdfc2V0X2FsbF9maWx0ZXIoc3RkZXJyX3RhcmdldCwgMSk7CisJZGVidWdfcGFyc2VfY2F0ZWdvcnlfbWFzayhzdGRlcnJfdGFyZ2V0LCAiRElOUDpETUkiKTsKKworCXJjID0gaXBhY2Nlc3NfcHJveHlfc2V0dXAoKTsKKwlpZiAocmMgPCAwKQorCQlleGl0KDEpOworCisJc2lnbmFsKFNJR1VTUjEsICZzaWduYWxfaGFuZGxlcik7CisJc2lnbmFsKFNJR0FCUlQsICZzaWduYWxfaGFuZGxlcik7CisKKwl3aGlsZSAoMSkgeworCQlic2Nfc2VsZWN0X21haW4oMCk7CisJfQorfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvaXNkbnN5bmMuYyBiL29wZW5ic2Mvc3JjL2lzZG5zeW5jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDg4MTlhYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL2lzZG5zeW5jLmMKQEAgLTAsMCArMSwxOTIgQEAKKy8qIGlzZG5zeW5jLmMKKyAqCisgKiBBdXRob3IgICAgICAgQW5kcmVhcyBFdmVyc2JlcmcgPGpvbGx5QGV2ZXJzYmVyZy5ldT4KKyAqCisgKiBBbGwgcmlnaHRzIHJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN5cy9pb2N0bC5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlICJtSVNETmlmLmgiCisjZGVmaW5lIE1JU0ROX09MRF9BRl9DT01QQVRJQklMSVRZCisjZGVmaW5lIEFGX0NPTVBBVElCSUxJVFlfRlVOQworI2luY2x1ZGUgImNvbXBhdF9hZl9pc2RuLmgiCisKK2ludCBjYXJkID0gMDsKK2ludCBzb2NrID0gLTE7CisKK2ludCBtSVNETl9vcGVuKHZvaWQpCit7CisJaW50CQkJZmQsIHJldDsKKwlzdHJ1Y3QgbUlTRE5fZGV2aW5mbwlkZXZpbmZvOworCXN0cnVjdCBzb2NrYWRkcl9tSVNETglsMmFkZHI7CisKKwlmZCA9IHNvY2tldChQRl9JU0ROLCBTT0NLX1JBVywgSVNETl9QX0JBU0UpOworCWlmIChmZCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3Qgb3BlbiBzb2NrZXQgKCVzKVxuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIGZkOworCX0KKwlkZXZpbmZvLmlkID0gY2FyZDsKKwlyZXQgPSBpb2N0bChmZCwgSU1HRVRERVZJTkZPLCAmZGV2aW5mbyk7CisJaWYgKHJldCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsImNvdWxkIG5vdCBzZW5kIElPQ1RMIElNR0VUQ09VTlQgKCVzKVxuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gcmV0OworCX0KKwljbG9zZShmZCk7CisJaWYgKCEoZGV2aW5mby5EcHJvdG9jb2xzICYgKDEgPDwgSVNETl9QX1RFX1MwKSkKKwkgJiYgIShkZXZpbmZvLkRwcm90b2NvbHMgJiAoMSA8PCBJU0ROX1BfVEVfRTEpKSkgeworCQlmcHJpbnRmKHN0ZGVyciwiSW50ZXJmYWNlIGRvZXMgbm90IHN1cHBvcnQgVEUgbW9kZSAoJXMpXG4iLCBzdHJlcnJvcihlcnJubykpOworCQljbG9zZShmZCk7CisJCXJldHVybiByZXQ7CisJfQorCWZkID0gc29ja2V0KFBGX0lTRE4sIFNPQ0tfREdSQU0sIElTRE5fUF9MQVBEX1RFKTsKKwlpZiAoZmQgPCAwKSB7CisJCWZwcmludGYoc3RkZXJyLCJjb3VsZCBub3Qgb3BlbiBJU0ROX1BfTEFQRF9URSBzb2NrZXQgKCVzKVxuIiwgc3RyZXJyb3IoZXJybm8pKTsKKwkJcmV0dXJuIGZkOworCX0KKwlsMmFkZHIuZmFtaWx5ID0gQUZfSVNETjsKKwlsMmFkZHIuZGV2ID0gY2FyZDsKKwlsMmFkZHIuY2hhbm5lbCA9IDA7CisJbDJhZGRyLnNhcGkgPSAwOworCWwyYWRkci50ZWkgPSAwOworCXJldCA9IGJpbmQoZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikmbDJhZGRyLCBzaXplb2YobDJhZGRyKSk7CisJaWYgKHJldCA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsImNvdWxkIG5vdCBiaW5kIHNvY2tldCBmb3IgY2FyZCAlZCAoJXMpXG4iLCBjYXJkLCBzdHJlcnJvcihlcnJubykpOworCQljbG9zZShmZCk7CisJCXJldHVybiByZXQ7CisJfQorCXNvY2sgPSBmZDsKKworCXJldHVybiBzb2NrOworfQorCisKK3ZvaWQgbUlTRE5faGFuZGxlKHZvaWQpCit7CisJaW50IHJldDsKKwlmZF9zZXQgcmZkOworCXN0cnVjdCB0aW1ldmFsIHR2OworCXN0cnVjdCBzb2NrYWRkcl9tSVNETiBhZGRyOworCXNvY2tsZW5fdCBhbGVuOworCXVuc2lnbmVkIGNoYXIgYnVmZmVyWzIwNDhdOworCXN0cnVjdCBtSVNETmhlYWQgKmhoID0gKHN0cnVjdCBtSVNETmhlYWQgKilidWZmZXI7CisJaW50IGwxID0gMCwgbDIgPSAwLCB0ZWkgPSAwOworCisJd2hpbGUoMSkgeworYWdhaW46CisJCUZEX1pFUk8oJnJmZCk7CisJCUZEX1NFVChzb2NrLCAmcmZkKTsKKwkJdHYudHZfc2VjID0gMjsKKwkJdHYudHZfdXNlYyA9IDA7CisJCXJldCA9IHNlbGVjdChzb2NrKzEsICZyZmQsIE5VTEwsIE5VTEwsICZ0dik7CisJCWlmIChyZXQgPCAwKSB7CisJCQlpZiAoZXJybm8gPT0gRUlOVFIpCisJCQkJY29udGludWU7CisJCQlmcHJpbnRmKHN0ZGVyciwgIiVzIGFib3J0ZWQ6ICVzXG4iLCBfX0ZVTkNUSU9OX18sIHN0cmVycm9yKGVycm5vKSk7CisJCQlicmVhazsKKwkJfQorCQlpZiAoRkRfSVNTRVQoc29jaywgJnJmZCkpIHsKKwkJCWFsZW4gPSBzaXplb2YoYWRkcik7CisJCQlyZXQgPSByZWN2ZnJvbShzb2NrLCBidWZmZXIsIHNpemVvZihidWZmZXIpLCAwLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCAmYWxlbik7CisJCQlpZiAocmV0IDwgMCkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiJXMgcmVhZCBzb2NrZXQgZXJyb3IgJXNcbiIsIF9fRlVOQ1RJT05fXywgc3RyZXJyb3IoZXJybm8pKTsKKwkJCX0gZWxzZSBpZiAocmV0IDwgTUlTRE5fSEVBREVSX0xFTikgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIiVzIHJlYWQgc29ja2V0IHNob3IgZnJhbWVcbiIsIF9fRlVOQ1RJT05fXyk7CisJCQl9IGVsc2UgeworCQkJCXN3aXRjaChoaC0+cHJpbSkgeworCQkJCQljYXNlIE1QSF9BQ1RJVkFURV9JTkQ6CisJCQkJCWNhc2UgUEhfQUNUSVZBVEVfSU5EOgorCQkJCQkJaWYgKCFsMSkgeworCQkJCQkJCXByaW50ZigiUEhfQUNUSVZBVEVcbiIpOworCQkJCQkJCXByaW50ZigiKioqIFN5bmMgYXZhaWxhYmxlIGZyb20gaW50ZXJmYWNlIDotKVxuIik7CisJCQkJCQkJbDEgPSAxOworCQkJCQkJfQorCQkJCQkJZ290byBhZ2FpbjsKKwkJCQkJYnJlYWs7CisJCQkJCWNhc2UgTVBIX0RFQUNUSVZBVEVfSU5EOgorCQkJCQljYXNlIFBIX0RFQUNUSVZBVEVfSU5EOgorCQkJCQkJaWYgKGwxKSB7CisJCQkJCQkJcHJpbnRmKCJQSF9ERUFDVElWQVRFXG4iKTsKKwkJCQkJCQlwcmludGYoIioqKiBMb3N0IHN5bmMgb24gaW50ZXJmYWNlICAgICAgICA6LShcbiIpOworCQkJCQkJCWwxID0gMDsKKwkJCQkJCX0KKwkJCQkJCWdvdG8gYWdhaW47CisJCQkJCWJyZWFrOworCQkJCQljYXNlIERMX0VTVEFCTElTSF9JTkQ6CisJCQkJCWNhc2UgRExfRVNUQUJMSVNIX0NORjoKKwkJCQkJCXByaW50ZigiRExfRVNUQUJMSVNIXG4iKTsKKwkJCQkJCWwyID0gMTsKKwkJCQkJCWdvdG8gYWdhaW47CisJCQkJCWJyZWFrOworCQkJCQljYXNlIERMX1JFTEVBU0VfSU5EOgorCQkJCQljYXNlIERMX1JFTEVBU0VfQ05GOgorCQkJCQkJcHJpbnRmKCJETF9SRUxFQVNFXG4iKTsKKwkJCQkJCWwyID0gMDsKKwkJCQkJCWdvdG8gYWdhaW47CisJCQkJCWJyZWFrOworCQkJCQljYXNlIERMX0lORk9STUFUSU9OX0lORDoKKwkJCQkJCXByaW50ZigiRExfSU5GT1JNQVRJT04gKHRlaSAlZCBzYXBpICVkKVxuIiwgYWRkci50ZWksIGFkZHIuc2FwaSk7CisJCQkJCQl0ZWkgPSAxOworCQkJCQlicmVhazsKKwkJCQkJZGVmYXVsdDoKKy8vCQkJCQkJcHJpbnRmKCJwcmltICV4XG4iLCBoaC0+cHJpbSk7CisJCQkJCQlnb3RvIGFnYWluOworCQkJCX0KKwkJCX0KKwkJfQorCQlpZiAodGVpICYmICFsMikgeworCQkJaGgtPnByaW0gPSBETF9FU1RBQkxJU0hfUkVROworCQkJcHJpbnRmKCItPiBhY3RpdmF0aW5nIGxheWVyIDJcbiIpOworCQkJc2VuZHRvKHNvY2ssIGJ1ZmZlciwgTUlTRE5fSEVBREVSX0xFTiwgMCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgYWxlbik7CisJCX0KKwl9Cit9CisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICphcmd2W10pCit7CisJaW50IHJldDsKKworCWlmIChhcmdjIDw9IDEpCisJeworCQlwcmludGYoIlVzYWdlOiAlcyA8Y2FyZD5cblxuIiwgYXJndlswXSk7CisJCXByaW50ZigiT3BlbnMgZ2l2ZW4gY2FyZCBudW1iZXIgaW4gVEUtbW9kZSBQVFAgYW5kIHRyaWVzIHRvIGtlZXAgbGF5ZXIgMiBlc3RhYmxpc2hlZC5cbiIpOworCQlwcmludGYoIlRoaXMga2VlcHMgbGF5ZXIgMSBhY3RpdmF0ZWQgdG8gcmV0cmlldmUgYSBzdGVhZHkgc3luYyBzaWduYWwgZnJvbSBuZXR3b3JrLlxuIik7CisJCXJldHVybigwKTsKKwl9CisKKwljYXJkID0gYXRvaShhcmd2WzFdKTsKKworCWluaXRfYWZfaXNkbigpOworCisJaWYgKChyZXQgPSBtSVNETl9vcGVuKCkgPCAwKSkKKwkJcmV0dXJuKHJldCk7CisKKwltSVNETl9oYW5kbGUoKTsKKworCWNsb3NlKHNvY2spOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9tZWFzX3JlcC5jIGIvb3BlbmJzYy9zcmMvbWVhc19yZXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjljYzFhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvbWVhc19yZXAuYwpAQCAtMCwwICsxLDExNCBAQAorLyogTWVhc3VyZW1lbnQgUmVwb3J0IFByb2Nlc3NpbmcgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvbWVhc19yZXAuaD4KKworc3RhdGljIGludCBnZXRfZmllbGQoY29uc3Qgc3RydWN0IGdzbV9tZWFzX3JlcCAqcmVwLAorCQkgICAgIGVudW0gbWVhc19yZXBfZmllbGQgZmllbGQpCit7CisJc3dpdGNoIChmaWVsZCkgeworCWNhc2UgTUVBU19SRVBfRExfUlhMRVZfRlVMTDoKKwkJcmV0dXJuIHJlcC0+ZGwuZnVsbC5yeF9sZXY7CisJY2FzZSBNRUFTX1JFUF9ETF9SWExFVl9TVUI6CisJCXJldHVybiByZXAtPmRsLnN1Yi5yeF9sZXY7CisJY2FzZSBNRUFTX1JFUF9ETF9SWFFVQUxfRlVMTDoKKwkJcmV0dXJuIHJlcC0+ZGwuZnVsbC5yeF9xdWFsOworCWNhc2UgTUVBU19SRVBfRExfUlhRVUFMX1NVQjoKKwkJcmV0dXJuIHJlcC0+ZGwuc3ViLnJ4X3F1YWw7CisJY2FzZSBNRUFTX1JFUF9VTF9SWExFVl9GVUxMOgorCQlyZXR1cm4gcmVwLT51bC5mdWxsLnJ4X2xldjsKKwljYXNlIE1FQVNfUkVQX1VMX1JYTEVWX1NVQjoKKwkJcmV0dXJuIHJlcC0+dWwuc3ViLnJ4X2xldjsKKwljYXNlIE1FQVNfUkVQX1VMX1JYUVVBTF9GVUxMOgorCQlyZXR1cm4gcmVwLT51bC5mdWxsLnJ4X3F1YWw7CisJY2FzZSBNRUFTX1JFUF9VTF9SWFFVQUxfU1VCOgorCQlyZXR1cm4gcmVwLT51bC5zdWIucnhfcXVhbDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworCit1bnNpZ25lZCBpbnQgY2FsY19pbml0aWFsX2lkeCh1bnNpZ25lZCBpbnQgYXJyYXlfc2l6ZSwKKwkJCSAgICAgIHVuc2lnbmVkIGludCBtZWFzX3JlcF9pZHgsCisJCQkgICAgICB1bnNpZ25lZCBpbnQgbnVtX3ZhbHVlcykKK3sKKwlpbnQgb2ZmcywgaWR4OworCisJLyogZnJvbSB3aGljaCBlbGVtZW50IGRvIHdlIG5lZWQgdG8gc3RhcnQgaWYgd2UncmUgaW50ZXJlc3RlZAorCSAqIGluIGFuIGF2ZXJhZ2Ugb2YgJ251bScgZWxlbWVudHMgKi8KKwlvZmZzID0gbWVhc19yZXBfaWR4IC0gbnVtX3ZhbHVlczsKKworCWlmIChvZmZzIDwgMCkKKwkJaWR4ID0gYXJyYXlfc2l6ZSArIG9mZnM7CisJZWxzZQorCQlpZHggPSBvZmZzOworCisJcmV0dXJuIGlkeDsKK30KKworLyogb2J0YWluIGFuIGF2ZXJhZ2Ugb3ZlciB0aGUgbGFzdCAnbnVtJyBmaWVsZHMgaW4gdGhlIG1lYXMgcmVwcyAqLworaW50IGdldF9tZWFzX3JlcF9hdmcoY29uc3Qgc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4sCisJCSAgICAgZW51bSBtZWFzX3JlcF9maWVsZCBmaWVsZCwgdW5zaWduZWQgaW50IG51bSkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgaWR4OworCWludCBhdmcgPSAwOworCisJaWR4ID0gY2FsY19pbml0aWFsX2lkeChBUlJBWV9TSVpFKGxjaGFuLT5tZWFzX3JlcCksCisJCQkJbGNoYW4tPm1lYXNfcmVwX2lkeCwgbnVtKTsKKworCWZvciAoaSA9IDA7IGkgPCBudW07IGkrKykgeworCQlpbnQgaiA9IChpZHgraSkgJSBBUlJBWV9TSVpFKGxjaGFuLT5tZWFzX3JlcCk7CisKKwkJYXZnICs9IGdldF9maWVsZCgmbGNoYW4tPm1lYXNfcmVwW2pdLCBmaWVsZCk7CisJfQorCisJcmV0dXJuIGF2ZyAvIG51bTsKK30KKworLyogQ2hlY2sgaWYgTiBvdXQgb2YgTSBsYXN0IHZhbHVlcyBmb3IgRklFTEQgYXJlID49IGJkICovCitpbnQgbWVhc19yZXBfbl9vdXRfb2ZfbV9iZShjb25zdCBzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwKKwkJCWVudW0gbWVhc19yZXBfZmllbGQgZmllbGQsCisJCQl1bnNpZ25lZCBpbnQgbiwgdW5zaWduZWQgaW50IG0sIGludCBiZSkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgaWR4OworCWludCBjb3VudCA9IDA7CisKKwlpZHggPSBjYWxjX2luaXRpYWxfaWR4KEFSUkFZX1NJWkUobGNoYW4tPm1lYXNfcmVwKSwKKwkJCQlsY2hhbi0+bWVhc19yZXBfaWR4LCBtKTsKKworCWZvciAoaSA9IDA7IGkgPCBtOyBpKyspIHsKKwkJaW50IGogPSAoaWR4ICsgaSkgJSBBUlJBWV9TSVpFKGxjaGFuLT5tZWFzX3JlcCk7CisJCWludCB2YWwgPSBnZXRfZmllbGQoJmxjaGFuLT5tZWFzX3JlcFtqXSwgZmllbGQpOworCisJCWlmICh2YWwgPj0gYmUpCisJCQljb3VudCsrOworCisJCWlmIChjb3VudCA+PSBuKQorCQkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9tZ2NwLmNmZyBiL29wZW5ic2Mvc3JjL21nY3AuY2ZnCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY3OGY1NDYKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9tZ2NwLmNmZwpAQCAtMCwwICsxLDE5IEBACishCishIE1HQ1AgY29uZmlndXJhdGlvbiBoYW5kIGVkaXRlZAorISAgICEKK3Bhc3N3b3JkIGZvbworIQorbGluZSB2dHkKKyBubyBsb2dpbgorIQorbWdjcAorISAgbG9jYWwgaXAgMjEzLjE2Ny4xMzQuMTQKKyAgYnRzIGlwIDE3Mi4xNi4yNTIuNDMKKyAgYmluZCBpcCAyMTMuMTY3LjEzNC4xNDEKKyAgYmluZCBwb3J0IDI0MjcKKyAgYmluZCBlYXJseSAxCisgIHJ0cCBiYXNlIDQwMDAKKyAgc2RwIGF1ZGlvIHBheWxvYWQgbnVtYmVyIDk4CisgIHNkcCBhdWRpbyBwYXlsb2FkIG5hbWUgQU1SLzgwMDAKKyAgbnVtYmVyIGVuZHBvaW50cyAzMQorICBsb29wIDEKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL21nY3AvbWdjcF9tYWluLmMgYi9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNlYTBiYTQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfbWFpbi5jCkBAIC0wLDAgKzEsMjE2IEBACisvKiBBIE1lZGlhIEdhdGV3YXkgQ29udHJvbCBQcm90b2NvbCBNZWRpYSBHYXRld2F5OiBSRkMgMzQzNSAqLworLyogVGhlIG1haW4gbWV0aG9kIHRvIGRyaXZlIGl0IGFzIGEgc3RhbmRhbG9uZSBwcm9jZXNzICAgICAgKi8KKworLyoKKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIChDKSAyMDA5IGJ5IE9uLVdhdmVzCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21nY3AuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RlbG5ldF9pbnRlcmZhY2UuaD4KKworLyogdGhpcyBpcyBoZXJlIGZvciB0aGUgdnR5Li4uIGl0IHdpbGwgbmV2ZXIgYmUgY2FsbGVkICovCit2b2lkIHN1YnNjcl9wdXQoKSB7IGFib3J0KCk7IH0KKworI2RlZmluZSBfR05VX1NPVVJDRQorI2luY2x1ZGUgPGdldG9wdC5oPgorCisjd2FybmluZyAiTWFrZSB1c2Ugb2YgdGhlIHJ0cCBwcm94eSBjb2RlIgorCitzdGF0aWMgc3RydWN0IGJzY19mZCBiZmQ7CitzdGF0aWMgaW50IGZpcnN0X3JlcXVlc3QgPSAxOworc3RhdGljIHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnOworCitzdGF0aWMgY2hhciAqY29uZmlnX2ZpbGUgPSAibWdjcC5jZmciOworCisvKiB1c2VkIGJ5IG1zZ2IgYW5kIG1nY3AgKi8KK3ZvaWQgKnRhbGxfYnNjX2N0eCA9IE5VTEw7CisKK3N0YXRpYyB2b2lkIHByaW50X2hlbHAoKQoreworCXByaW50ZigiU29tZSB1c2VmdWwgaGVscC4uLlxuIik7CisJcHJpbnRmKCIgLWggLS1oZWxwIGlzIHByaW50aW5nIHRoaXMgdGV4dC5cbiIpOworCXByaW50ZigiIC1jIC0tY29uZmlnLWZpbGUgZmlsZW5hbWUgVGhlIGNvbmZpZyBmaWxlIHRvIHVzZS5cbiIpOworfQorCitzdGF0aWMgdm9pZCBoYW5kbGVfb3B0aW9ucyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisJd2hpbGUgKDEpIHsKKwkJaW50IG9wdGlvbl9pbmRleCA9IDAsIGM7CisJCXN0YXRpYyBzdHJ1Y3Qgb3B0aW9uIGxvbmdfb3B0aW9uc1tdID0geworCQkJeyJoZWxwIiwgMCwgMCwgJ2gnfSwKKwkJCXsiY29uZmlnLWZpbGUiLCAxLCAwLCAnYyd9LAorCQkJezAsIDAsIDAsIDB9LAorCQl9OworCisJCWMgPSBnZXRvcHRfbG9uZyhhcmdjLCBhcmd2LCAiaGM6IiwgbG9uZ19vcHRpb25zLCAmb3B0aW9uX2luZGV4KTsKKworCQlpZiAoYyA9PSAtMSkKKwkJCWJyZWFrOworCisJCXN3aXRjaChjKSB7CisJCWNhc2UgJ2gnOgorCQkJcHJpbnRfaGVscCgpOworCQkJZXhpdCgwKTsKKwkJCWJyZWFrOworCQljYXNlICdjJzoKKwkJCWNvbmZpZ19maWxlID0gdGFsbG9jX3N0cmR1cCh0YWxsX2JzY19jdHgsIG9wdGFyZyk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCS8qIGlnbm9yZSAqLworCQkJYnJlYWs7CisJCX07CisJfQorfQorCitzdGF0aWMgaW50IHJlYWRfY2FsbF9hZ2VudChzdHJ1Y3QgYnNjX2ZkICpmZCwgdW5zaWduZWQgaW50IHdoYXQpCit7CisJc3RydWN0IHNvY2thZGRyX2luIGFkZHI7CisJc29ja2xlbl90IHNsZW4gPSBzaXplb2YoYWRkcik7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlzdHJ1Y3QgbXNnYiAqcmVzcDsKKworCW1zZyA9IChzdHJ1Y3QgbXNnYiAqKSBmZC0+ZGF0YTsKKworCS8qIHJlYWQgb25lIGxlc3Mgc28gd2UgY2FuIHVzZSBpdCBhcyBhIFwwICovCisJaW50IHJjID0gcmVjdmZyb20oYmZkLmZkLCBtc2ctPmRhdGEsIG1zZy0+ZGF0YV9sZW4gLSAxLCAwLAorCQkoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCAmc2xlbik7CisJaWYgKHJjIDwgMCkgeworCQlwZXJyb3IoIkdhdGV3YXkgZmFpbGVkIHRvIHJlYWQiKTsKKwkJcmV0dXJuIC0xOworCX0gZWxzZSBpZiAoc2xlbiA+IHNpemVvZihhZGRyKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIkdhdGV3YXkgcmVjZWl2ZWQgbWVzc2FnZSBmcm9tIG91dGVyc3BhY2U6ICVkICVkXG4iLAorCQkJc2xlbiwgc2l6ZW9mKGFkZHIpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChmaXJzdF9yZXF1ZXN0KSB7CisJCWZpcnN0X3JlcXVlc3QgPSAwOworCQlyZXNwID0gbWdjcF9jcmVhdGVfcnNpcCgpOworCisJCWlmIChyZXNwKSB7CisJCQlzZW5kdG8oYmZkLmZkLCByZXNwLT5sMmgsIG1zZ2JfbDJsZW4ocmVzcCksIDAsCisJCQkJKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgc2l6ZW9mKGFkZHIpKTsKKwkJCW1zZ2JfZnJlZShyZXNwKTsKKwkJfQorCQlyZXR1cm4gMDsKKyAgICAgICAgfQorCisJLyogaGFuZGxlIG1lc3NhZ2Ugbm93ICovCisJbXNnLT5sMmggPSBtc2diX3B1dChtc2csIHJjKTsKKwlyZXNwID0gbWdjcF9oYW5kbGVfbWVzc2FnZShjZmcsIG1zZyk7CisJbXNnYl9yZXNldChtc2cpOworCisJaWYgKHJlc3ApIHsKKwkJc2VuZHRvKGJmZC5mZCwgcmVzcC0+bDJoLCBtc2diX2wybGVuKHJlc3ApLCAwLCAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCBzaXplb2YoYWRkcikpOworCQltc2diX2ZyZWUocmVzcCk7CisJfQorCXJldHVybiAwOworfQorCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgZHVtbXlfbmV0d29yazsKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKwlpbnQgb24gPSAxLCByYzsKKwlzdHJ1Y3QgZGVidWdfdGFyZ2V0ICpzdGRlcnJfdGFyZ2V0OworCisJdGFsbF9ic2NfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KE5VTEwsIDEsICJtZ2NwLWNhbGxhZ2VudCIpOworCisJZGVidWdfaW5pdCgpOworCXN0ZGVycl90YXJnZXQgPSBkZWJ1Z190YXJnZXRfY3JlYXRlX3N0ZGVycigpOworCWRlYnVnX2FkZF90YXJnZXQoc3RkZXJyX3RhcmdldCk7CisJZGVidWdfc2V0X2FsbF9maWx0ZXIoc3RkZXJyX3RhcmdldCwgMSk7CisKKwljZmcgPSBtZ2NwX2NvbmZpZ19hbGxvYygpOworCWlmICghY2ZnKQorCQlyZXR1cm4gLTE7CisKKwloYW5kbGVfb3B0aW9ucyhhcmdjLCBhcmd2KTsKKworCXRlbG5ldF9pbml0KCZkdW1teV9uZXR3b3JrLCA0MjQzKTsKKyAgICAgICAgcmMgPSBtZ2NwX3BhcnNlX2NvbmZpZyhjb25maWdfZmlsZSwgY2ZnKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKworICAgICAgICAvKiB3ZSBuZWVkIHRvIGJpbmQgYSBzb2NrZXQgKi8KKyAgICAgICAgaWYgKHJjID09IDApIHsKKwkJYmZkLndoZW4gPSBCU0NfRkRfUkVBRDsKKwkJYmZkLmNiID0gcmVhZF9jYWxsX2FnZW50OworCQliZmQuZmQgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgMCk7CisJCWlmIChiZmQuZmQgPCAwKSB7CisJCQlwZXJyb3IoIkdhdGV3YXkgZmFpbGVkIHRvIGxpc3RlbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJc2V0c29ja29wdChiZmQuZmQsIFNPTF9TT0NLRVQsIFNPX1JFVVNFQUREUiwgJm9uLCBzaXplb2Yob24pKTsKKworCQltZW1zZXQoJmFkZHIsIDAsIHNpemVvZihhZGRyKSk7CisJCWFkZHIuc2luX2ZhbWlseSA9IEFGX0lORVQ7CisJCWFkZHIuc2luX3BvcnQgPSBodG9ucyhjZmctPnNvdXJjZV9wb3J0KTsKKwkJaW5ldF9hdG9uKGNmZy0+c291cmNlX2FkZHIsICZhZGRyLnNpbl9hZGRyKTsKKworCQlpZiAoYmluZChiZmQuZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJmFkZHIsIHNpemVvZihhZGRyKSkgPCAwKSB7CisJCQlwZXJyb3IoIkdhdGV3YXkgZmFpbGVkIHRvIGJpbmQiKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCisJCWJmZC5kYXRhID0gbXNnYl9hbGxvYyg0MDk2LCAibWdjcC1tc2ciKTsKKwkJaWYgKCFiZmQuZGF0YSkgeworCQkJZnByaW50ZihzdGRlcnIsICJHYXRld2F5IG1lbW9yeSBlcnJvci5cbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKworCQlpZiAoYnNjX3JlZ2lzdGVyX2ZkKCZiZmQpICE9IDApIHsKKwkJCURFQlVHUChETUdDUCwgIkZhaWxlZCB0byByZWdpc3RlciB0aGUgZmRcbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJREVCVUdQKERNR0NQLCAiQ29uZmlndXJlZCBmb3IgTUdDUC5cbiIpOworCX0KKworCS8qIGluaXRpYWxpc2F0aW9uICovCisJc3JhbmQodGltZShOVUxMKSk7CisKKwkvKiBtYWluIGxvb3AgKi8KKwl3aGlsZSAoMSkgeworCQlic2Nfc2VsZWN0X21haW4oMCk7CisJfQorCisKKwlyZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL21nY3AvbWdjcF9uZXR3b3JrLmMgYi9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfbmV0d29yay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NmNhNDcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfbmV0d29yay5jCkBAIC0wLDAgKzEsMjU1IEBACisvKiBBIE1lZGlhIEdhdGV3YXkgQ29udHJvbCBQcm90b2NvbCBNZWRpYSBHYXRld2F5OiBSRkMgMzQzNSAqLworLyogVGhlIHByb3RvY29sIGltcGxlbWVudGF0aW9uICovCisKKy8qCisgKiAoQykgMjAwOS0yMDEwIGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIChDKSAyMDA5LTIwMTAgYnkgT24tV2F2ZXMKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZW5kaWFuLmg+CisKKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tZ2NwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tZ2NwX2ludGVybmFsLmg+CisKKyN3YXJuaW5nICJNYWtlIHVzZSBvZiB0aGUgcnRwIHByb3h5IGNvZGUiCisKKy8qIGFjY29yZGluZyB0byBydHBfcHJveHkuYyBSRkMgMzU1MCAqLworc3RydWN0IHJ0cF9oZHIgeworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKwl1X2ludDhfdCAgY3NyY19jb3VudDo0LAorCQkgIGV4dGVuc2lvbjoxLAorCQkgIHBhZGRpbmc6MSwKKwkJICB2ZXJzaW9uOjI7CisJdV9pbnQ4X3QgIHBheWxvYWRfdHlwZTo3LAorCQkgIG1hcmtlcjoxOworI2VsaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCXVfaW50OF90ICB2ZXJzaW9uOjIsCisJCSAgcGFkZGluZzoxLAorCQkgIGV4dGVuc2lvbjoxLAorCQkgIGNzcmNfY291bnQ6NDsKKwl1X2ludDhfdCAgbWFya2VyOjEsCisJCSAgcGF5bG9hZF90eXBlOjc7CisjZW5kaWYKKwl1X2ludDE2X3Qgc2VxdWVuY2U7CisJdV9pbnQzMl90IHRpbWVzdGFtcDsKKwl1X2ludDMyX3Qgc3NyYzsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworZW51bSB7CisJREVTVF9ORVRXT1JLID0gMCwKKwlERVNUX0JUUyA9IDEsCit9OworCitlbnVtIHsKKwlQUk9UT19SVFAsCisJUFJPVE9fUlRDUCwKK307CisKKworc3RhdGljIGludCB1ZHBfc2VuZChpbnQgZmQsIHN0cnVjdCBpbl9hZGRyICphZGRyLCBpbnQgcG9ydCwgY2hhciAqYnVmLCBpbnQgbGVuKQoreworCXN0cnVjdCBzb2NrYWRkcl9pbiBvdXQ7CisJb3V0LnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCW91dC5zaW5fcG9ydCA9IHBvcnQ7CisJbWVtY3B5KCZvdXQuc2luX2FkZHIsIGFkZHIsIHNpemVvZigqYWRkcikpOworCisJcmV0dXJuIHNlbmR0byhmZCwgYnVmLCBsZW4sIDAsIChzdHJ1Y3Qgc29ja2FkZHIgKikmb3V0LCBzaXplb2Yob3V0KSk7Cit9CisKK3N0YXRpYyB2b2lkIHBhdGNoX3BheWxvYWQoaW50IHBheWxvYWQsIGNoYXIgKmRhdGEsIGludCBsZW4pCit7CisJc3RydWN0IHJ0cF9oZHIgKnJ0cF9oZHI7CisKKwlpZiAobGVuIDwgc2l6ZW9mKCpydHBfaGRyKSkKKwkJcmV0dXJuOworCisJcnRwX2hkciA9IChzdHJ1Y3QgcnRwX2hkciAqKSBkYXRhOworCXJ0cF9oZHItPnBheWxvYWRfdHlwZSA9IHBheWxvYWQ7Cit9CisKKy8qCisgKiBUaGVyZSBpcyBkYXRhIGNvbWluZy4gV2Ugd2lsbCBoYXZlIHRvIGZpZ3VyZSBvdXQgaWYgaXQKKyAqIGNhbWUgZnJvbSB0aGUgQlRTIG9yIHRoZSBNZWRpYUdhdGV3YXkgb2YgdGhlIE1TQy4gT24gdG9wCisgKiBvZiB0aGF0IHdlIG5lZWQgdG8gZmlndXJlIG91dCBpZiBpdCB3YXMgUlRQIG9yIFJUQ1AuCisgKgorICogQ3VycmVudGx5IHdlIGRvIG5vdCBjb21tdW5pY2F0ZSB3aXRoIHRoZSBCU0Mgc28gd2UgaGF2ZQorICogbm8gaWRlYSB3aGVyZSB0aGUgQlRTIGlzIGxpc3RlbmluZyBmb3IgUlRQIGFuZCBuZWVkIHRvCisgKiBkbyB0aGUgY2xhc3NpYyByb3V0aW5nIHRyaWNrLiBXYWl0IGZvciB0aGUgZmlyc3QgcGFja2V0CisgKiBmcm9tIHRoZSBCVFMgYW5kIHRoZW4gZ28gYWhlYWQuCisgKi8KK3N0YXRpYyBpbnQgcnRwX2RhdGFfY2Ioc3RydWN0IGJzY19mZCAqZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCWNoYXIgYnVmWzQwOTZdOworCXN0cnVjdCBzb2NrYWRkcl9pbiBhZGRyOworCXNvY2tsZW5fdCBzbGVuID0gc2l6ZW9mKGFkZHIpOworCXN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwOworCXN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnOworCWludCByYywgZGVzdCwgcHJvdG87CisKKwllbmRwID0gKHN0cnVjdCBtZ2NwX2VuZHBvaW50ICopIGZkLT5kYXRhOworCWNmZyA9IGVuZHAtPmNmZzsKKworCXJjID0gcmVjdmZyb20oZmQtPmZkLCAmYnVmLCBzaXplb2YoYnVmKSwgMCwKKwkJCSAgICAoc3RydWN0IHNvY2thZGRyICopICZhZGRyLCAmc2xlbik7CisJaWYgKHJjIDwgMCkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIHJlY2VpdmUgbWVzc2FnZSBvbjogMHgleFxuIiwKKwkJCUVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBkbyBub3QgZm9yd2FyZCBheW50aGluZy4uLiBtYXliZSB0aGVyZSBpcyBhIHBhY2tldCBmcm9tIHRoZSBidHMgKi8KKwlpZiAoZW5kcC0+Y2kgPT0gQ0lfVU5VU0VEKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJVbmtub3duIG1lc3NhZ2Ugb24gZW5kcG9pbnQ6IDB4JXhcbiIsIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIEZpZ3VyZSBvdXQgd2hlcmUgdG8gZm9yd2FyZCBpdCB0by4gVGhpcyBjb2RlIGFzc3VtZXMgdGhhdCB3ZQorCSAqIGhhdmUgcmVjZWl2ZWQgdGhlIENvbm5lY3Rpb24gTW9kaWZ5IGFuZCBrbm93IHdobyBpcyBhIGxlZ2l0aW1hdGUKKwkgKiBwYXJ0bmVyLiBBY2NvcmRpbmcgdG8gdGhlIHNwZWMgd2UgY291bGQgYXR0ZW1wdCB0byBmb3J3YXJkIGV2ZW4KKwkgKiBhZnRlciB0aGUgQ3JlYXRlIENvbm5lY3Rpb24gYnV0IHdlIHdpbGwgbm90IGFzIHdlIGFyZSBub3QgcmVhbGx5CisJICogYWJsZSB0byB0ZWxsIGlmIHRoaXMgaXMgbGVnaXRpbWF0ZS4KKwkgKi8KKwkjd2FybmluZyAiU2xpZ2h0IHNwZWMgdmlvbGF0aW9uLiBXaXRoIGNvbm5lY3Rpb24gbW9kZSByZWN2b25seSB3ZSBzaG91bGQgYXR0ZW1wdCB0byBmb3J3YXJkLiIKKwlkZXN0ID0gbWVtY21wKCZhZGRyLnNpbl9hZGRyLCAmZW5kcC0+cmVtb3RlLCBzaXplb2YoYWRkci5zaW5fYWRkcikpID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgKGVuZHAtPm5ldF9ydHAgPT0gYWRkci5zaW5fcG9ydCB8fCBlbmRwLT5uZXRfcnRjcCA9PSBhZGRyLnNpbl9wb3J0KQorCQkJPyBERVNUX0JUUyA6IERFU1RfTkVUV09SSzsKKwlwcm90byA9IGZkID09ICZlbmRwLT5sb2NhbF9ydHAgPyBQUk9UT19SVFAgOiBQUk9UT19SVENQOworCisJLyogV2UgaGF2ZSBubyBpZGVhIHdobyBjYWxsZWQgdXMsIG1heWJlIGl0IGlzIHRoZSBCVFMuICovCisJaWYgKGRlc3QgPT0gREVTVF9ORVRXT1JLICYmIChlbmRwLT5idHNfcnRwID09IDAgfHwgY2ZnLT5mb3J3YXJkX2lwKSkgeworCQkvKiBpdCB3YXMgdGhlIEJUUy4uLiAqLworCQlpZiAoIWNmZy0+YnRzX2lwIHx8IG1lbWNtcCgmYWRkci5zaW5fYWRkciwgJmNmZy0+YnRzX2luLCBzaXplb2YoY2ZnLT5idHNfaW4pKSA9PSAwKSB7CisJCQlpZiAoZmQgPT0gJmVuZHAtPmxvY2FsX3J0cCkgeworCQkJCWVuZHAtPmJ0c19ydHAgPSBhZGRyLnNpbl9wb3J0OworCQkJfSBlbHNlIHsKKwkJCQllbmRwLT5idHNfcnRjcCA9IGFkZHIuc2luX3BvcnQ7CisJCQl9CisKKwkJCWVuZHAtPmJ0cyA9IGFkZHIuc2luX2FkZHI7CisJCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIkZvdW5kIEJUUyBmb3IgZW5kcG9pbnQ6IDB4JXggb24gcG9ydDogJWQvJWRcbiIsCisJCQkJRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBudG9ocyhlbmRwLT5idHNfcnRwKSwgbnRvaHMoZW5kcC0+YnRzX3J0Y3ApKTsKKwkJfQorCX0KKworCS8qIGRpc3BhdGNoICovCisJaWYgKGNmZy0+YXVkaW9fbG9vcCkKKwkJZGVzdCA9ICFkZXN0OworCisJaWYgKGRlc3QgPT0gREVTVF9ORVRXT1JLKSB7CisJCXBhdGNoX3BheWxvYWQoZW5kcC0+bmV0X3BheWxvYWRfdHlwZSwgYnVmLCByYyk7CisJCXJldHVybiB1ZHBfc2VuZChmZC0+ZmQsICZlbmRwLT5yZW1vdGUsCisJCQkgICAgIHByb3RvID09IFBST1RPX1JUUCA/IGVuZHAtPm5ldF9ydHAgOiBlbmRwLT5uZXRfcnRjcCwKKwkJCSAgICAgYnVmLCByYyk7CisJfSBlbHNlIHsKKwkJcGF0Y2hfcGF5bG9hZChlbmRwLT5idHNfcGF5bG9hZF90eXBlLCBidWYsIHJjKTsKKwkJcmV0dXJuIHVkcF9zZW5kKGZkLT5mZCwgJmVuZHAtPmJ0cywKKwkJCSAgICAgcHJvdG8gPT0gUFJPVE9fUlRQID8gZW5kcC0+YnRzX3J0cCA6IGVuZHAtPmJ0c19ydGNwLAorCQkJICAgICBidWYsIHJjKTsKKwl9Cit9CisKK3N0YXRpYyBpbnQgY3JlYXRlX2JpbmQoY29uc3QgY2hhciAqc291cmNlX2FkZHIsIHN0cnVjdCBic2NfZmQgKmZkLCBpbnQgcG9ydCkKK3sKKwlzdHJ1Y3Qgc29ja2FkZHJfaW4gYWRkcjsKKwlpbnQgb24gPSAxOworCisJZmQtPmZkID0gc29ja2V0KEFGX0lORVQsIFNPQ0tfREdSQU0sIDApOworCWlmIChmZC0+ZmQgPCAwKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIFVEUCBwb3J0LlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlzZXRzb2Nrb3B0KGZkLT5mZCwgU09MX1NPQ0tFVCwgU09fUkVVU0VBRERSLCAmb24sIHNpemVvZihvbikpOworCW1lbXNldCgmYWRkciwgMCwgc2l6ZW9mKGFkZHIpKTsKKwlhZGRyLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCWFkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKwlpbmV0X2F0b24oc291cmNlX2FkZHIsICZhZGRyLnNpbl9hZGRyKTsKKworCWlmIChiaW5kKGZkLT5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSAmYWRkciwgc2l6ZW9mKGFkZHIpKSA8IDApIHsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGJpbmRfcnRwKHN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwKQoreworCXN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnID0gZW5kcC0+Y2ZnOworCisJaWYgKGNyZWF0ZV9iaW5kKGNmZy0+c291cmNlX2FkZHIsICZlbmRwLT5sb2NhbF9ydHAsIGVuZHAtPnJ0cF9wb3J0KSAhPSAwKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gY3JlYXRlIFJUUCBwb3J0OiAlczolZCBvbiAweCV4XG4iLAorCQkgICAgICAgY2ZnLT5zb3VyY2VfYWRkciwgZW5kcC0+cnRwX3BvcnQsIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCWdvdG8gY2xlYW51cDA7CisJfQorCisJaWYgKGNyZWF0ZV9iaW5kKGNmZy0+c291cmNlX2FkZHIsICZlbmRwLT5sb2NhbF9ydGNwLCBlbmRwLT5ydHBfcG9ydCArIDEpICE9IDApIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBjcmVhdGUgUlRDUCBwb3J0OiAlczolZCBvbiAweCV4XG4iLAorCQkgICAgICAgY2ZnLT5zb3VyY2VfYWRkciwgZW5kcC0+cnRwX3BvcnQgKyAxLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQlnb3RvIGNsZWFudXAxOworCX0KKworCWVuZHAtPmxvY2FsX3J0cC5jYiA9IHJ0cF9kYXRhX2NiOworCWVuZHAtPmxvY2FsX3J0cC5kYXRhID0gZW5kcDsKKwllbmRwLT5sb2NhbF9ydHAud2hlbiA9IEJTQ19GRF9SRUFEOworCWlmIChic2NfcmVnaXN0ZXJfZmQoJmVuZHAtPmxvY2FsX3J0cCkgIT0gMCkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiRmFpbGVkIHRvIHJlZ2lzdGVyIFJUUCBwb3J0ICVkIG9uIDB4JXhcbiIsCisJCQllbmRwLT5ydHBfcG9ydCwgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJZ290byBjbGVhbnVwMjsKKwl9CisKKwllbmRwLT5sb2NhbF9ydGNwLmNiID0gcnRwX2RhdGFfY2I7CisJZW5kcC0+bG9jYWxfcnRjcC5kYXRhID0gZW5kcDsKKwllbmRwLT5sb2NhbF9ydGNwLndoZW4gPSBCU0NfRkRfUkVBRDsKKwlpZiAoYnNjX3JlZ2lzdGVyX2ZkKCZlbmRwLT5sb2NhbF9ydGNwKSAhPSAwKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJGYWlsZWQgdG8gcmVnaXN0ZXIgUlRDUCBwb3J0ICVkIG9uIDB4JXhcbiIsCisJCQllbmRwLT5ydHBfcG9ydCArIDEsIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCWdvdG8gY2xlYW51cDM7CisJfQorCisJcmV0dXJuIDA7CisKK2NsZWFudXAzOgorCWJzY191bnJlZ2lzdGVyX2ZkKCZlbmRwLT5sb2NhbF9ydHApOworY2xlYW51cDI6CisJY2xvc2UoZW5kcC0+bG9jYWxfcnRjcC5mZCk7CisJZW5kcC0+bG9jYWxfcnRjcC5mZCA9IC0xOworY2xlYW51cDE6CisJY2xvc2UoZW5kcC0+bG9jYWxfcnRwLmZkKTsKKwllbmRwLT5sb2NhbF9ydHAuZmQgPSAtMTsKK2NsZWFudXAwOgorCXJldHVybiAtMTsKK30KKworaW50IG1nY3BfYmluZF9ydHBfcG9ydChzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcCwgaW50IHJ0cF9wb3J0KQoreworCWVuZHAtPnJ0cF9wb3J0ID0gcnRwX3BvcnQ7CisJcmV0dXJuIGJpbmRfcnRwKGVuZHApOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX3Byb3RvY29sLmMgYi9vcGVuYnNjL3NyYy9tZ2NwL21nY3BfcHJvdG9jb2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mN2VmNTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX3Byb3RvY29sLmMKQEAgLTAsMCArMSw3NDUgQEAKKy8qIEEgTWVkaWEgR2F0ZXdheSBDb250cm9sIFByb3RvY29sIE1lZGlhIEdhdGV3YXk6IFJGQyAzNDM1ICovCisvKiBUaGUgcHJvdG9jb2wgaW1wbGVtZW50YXRpb24gKi8KKworLyoKKyAqIChDKSAyMDA5LTIwMTAgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogKEMpIDIwMDktMjAxMCBieSBPbi1XYXZlcworICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tZ2NwLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tZ2NwX2ludGVybmFsLmg+CisKK2VudW0gbWdjcF9jb25uZWN0aW9uX21vZGUgeworCU1HQ1BfQ09OTl9OT05FID0gMCwKKwlNR0NQX0NPTk5fUkVDVl9PTkxZID0gMSwKKwlNR0NQX0NPTk5fU0VORF9PTkxZID0gMiwKKwlNR0NQX0NPTk5fUkVDVl9TRU5EID0gTUdDUF9DT05OX1JFQ1ZfT05MWSB8IE1HQ1BfQ09OTl9TRU5EX09OTFksCit9OworCisvKioKKyAqIE1hY3JvIGZvciB0b2tlbml6aW5nIE1HQ1AgbWVzc2FnZXMgYW5kIFNEUCBpbiBvbmUgZ28uCisgKgorICovCisjZGVmaW5lIE1TR19UT0tFTklaRV9TVEFSVCBcCisJbGluZV9zdGFydCA9IDA7CQkJCQkJXAorCWZvciAoaSA9IDA7IGkgPCBtc2diX2wzbGVuKG1zZyk7ICsraSkgewkJCVwKKwkJLyogd2UgaGF2ZSBhIGxpbmUgZW5kICovCQkJXAorCQlpZiAobXNnLT5sM2hbaV0gPT0gJ1xuJykgewkJCVwKKwkJCS8qIHNraXAgdGhlIGZpcnN0IGxpbmUgKi8JCVwKKwkJCWlmIChsaW5lX3N0YXJ0ID09IDApIHsJCQlcCisJCQkJbGluZV9zdGFydCA9IGkgKyAxOwkJXAorCQkJCWNvbnRpbnVlOwkJCVwKKwkJCX0JCQkJCVwKKwkJCQkJCQkJXAorCQkJLyogY2hlY2sgaWYgd2UgaGF2ZSBhIHByb3BlciBwYXJhbSAqLwlcCisJCQlpZiAoaSAtIGxpbmVfc3RhcnQgPT0gMSAmJiBtc2ctPmwzaFtsaW5lX3N0YXJ0XSA9PSAnXHInKSB7IFwKKwkJCX0gZWxzZSBpZiAoaSAtIGxpbmVfc3RhcnQgPiAyCQlcCisJCQkgICAgJiYgaXNsb3dlcihtc2ctPmwzaFtsaW5lX3N0YXJ0XSkJXAorCQkJICAgICYmIG1zZy0+bDNoW2xpbmVfc3RhcnQgKyAxXSA9PSAnPScpIHsgXAorCQkJfSBlbHNlIGlmIChpIC0gbGluZV9zdGFydCA8IDMJCVwKKwkJCSAgICB8fCBtc2ctPmwzaFtsaW5lX3N0YXJ0ICsgMV0gIT0gJzonCVwKKwkJCSAgICB8fCBtc2ctPmwzaFtsaW5lX3N0YXJ0ICsgMl0gIT0gJyAnKQlcCisJCQkJZ290byBlcnJvcjsJCQlcCisJCQkJCQkJCVwKKwkJCW1zZy0+bDNoW2ldID0gJ1wwJzsJCQlcCisJCQlpZiAobXNnLT5sM2hbaS0xXSA9PSAnXHInKQkJXAorCQkJCW1zZy0+bDNoW2ktMV0gPSAnXDAnOworCisjZGVmaW5lIE1TR19UT0tFTklaRV9FTkQgXAorCQkJbGluZV9zdGFydCA9IGkgKyAxOyBcCisJCX0JCQkgICAgXAorCX0KKworCitzdHJ1Y3QgbWdjcF9tc2dfcHRyIHsKKwl1bnNpZ25lZCBpbnQgc3RhcnQ7CisJdW5zaWduZWQgaW50IGxlbmd0aDsKK307CisKK3N0cnVjdCBtZ2NwX3JlcXVlc3QgeworCWNoYXIgKm5hbWU7CisJc3RydWN0IG1zZ2IgKigqaGFuZGxlX3JlcXVlc3QpIChzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZyk7CisJY2hhciAqZGVidWdfbmFtZTsKK307CisKKyNkZWZpbmUgTUdDUF9SRVFVRVNUKE5BTUUsIFJFUSwgREVCVUdfTkFNRSkgXAorCXsgLm5hbWUgPSBOQU1FLCAuaGFuZGxlX3JlcXVlc3QgPSBSRVEsIC5kZWJ1Z19uYW1lID0gREVCVUdfTkFNRSB9LAorCitzdGF0aWMgc3RydWN0IG1zZ2IgKmhhbmRsZV9hdWRpdF9lbmRwb2ludChzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZyk7CitzdGF0aWMgc3RydWN0IG1zZ2IgKmhhbmRsZV9jcmVhdGVfY29uKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKTsKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqaGFuZGxlX2RlbGV0ZV9jb24oc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2cpOworc3RhdGljIHN0cnVjdCBtc2diICpoYW5kbGVfbW9kaWZ5X2NvbihzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZyk7CisKK3N0YXRpYyBpbnQgZ2VuZXJhdGVfY2FsbF9pZChzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZykKK3sKKwlpbnQgaTsKKworCS8qIHVzZSB0aGUgY2FsbCBpZCAqLworCSsrY2ZnLT5sYXN0X2NhbGxfaWQ7CisKKwkvKiBoYW5kbGUgd3JhcCBhcm91bmQgKi8KKwlpZiAoY2ZnLT5sYXN0X2NhbGxfaWQgPT0gQ0lfVU5VU0VEKQorCQkrK2NmZy0+bGFzdF9jYWxsX2lkOworCisJLyogY2FsbHN0YWNrIGNhbiBvbmx5IGJlIG9mIHNpemUgbnVtYmVyX29mX2VuZHBvaW50cyAqLworCS8qIHZlcmlmeSB0aGF0IHRoZSBjYWxsIGlkIGlzIGZyZWUsIGUuZy4gaW4gY2FzZSBvZiBvdmVycnVuICovCisJZm9yIChpID0gMTsgaSA8IGNmZy0+bnVtYmVyX2VuZHBvaW50czsgKytpKQorCQlpZiAoY2ZnLT5lbmRwb2ludHNbaV0uY2kgPT0gY2ZnLT5sYXN0X2NhbGxfaWQpCisJCQlyZXR1cm4gZ2VuZXJhdGVfY2FsbF9pZChjZmcpOworCisJcmV0dXJuIGNmZy0+bGFzdF9jYWxsX2lkOworfQorCisvKiBGSVhJTUUvVE9ETzogbmVlZCB0byBoYXZlIGEgbGlzdCBvZiBwZW5kaW5nIHRyYW5zYWN0aW9ucyBhbmQgY2hlY2sgdGhhdCAqLworc3RhdGljIHVuc2lnbmVkIGludCBnZW5lcmF0ZV90cmFuc2FjdGlvbl9pZCgpCit7CisJcmV0dXJuIGFicyhyYW5kKCkpOworfQorCisvKgorICogYXJyYXkgb2YgZnVuY3Rpb24gcG9pbnRlcnMgZm9yIGhhbmRsaW5nIHZhcmlvdXMKKyAqIG1lc3NhZ2VzLiBJbiB0aGUgZnV0dXJlIHRoaXMgbWlnaHQgYmUgYmluYXJ5IHNvcnRlZAorICogZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnMuCisgKi8KK3N0YXRpYyBjb25zdCBzdHJ1Y3QgbWdjcF9yZXF1ZXN0IG1nY3BfcmVxdWVzdHMgW10gPSB7CisJTUdDUF9SRVFVRVNUKCJBVUVQIiwgaGFuZGxlX2F1ZGl0X2VuZHBvaW50LCAiQXVkaXRFbmRwb2ludCIpCisJTUdDUF9SRVFVRVNUKCJDUkNYIiwgaGFuZGxlX2NyZWF0ZV9jb24sICJDcmVhdGVDb25uZWN0aW9uIikKKwlNR0NQX1JFUVVFU1QoIkRMQ1giLCBoYW5kbGVfZGVsZXRlX2NvbiwgIkRlbGV0ZUNvbm5lY3Rpb24iKQorCU1HQ1BfUkVRVUVTVCgiTURDWCIsIGhhbmRsZV9tb2RpZnlfY29uLCAiTW9kaWZpeUNvbm5lY3Rpb24iKQorfTsKKworc3RhdGljIHN0cnVjdCBtc2diICptZ2NwX21zZ2JfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCW1zZyA9IG1zZ2JfYWxsb2NfaGVhZHJvb20oNDA5NiwgMTI4LCAiTUdDUCBtc2ciKTsKKwlpZiAoIW1zZykKKwkgICAgTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkZhaWxlZCB0byBtc2diIGZvciBNR0NQIGRhdGEuXG4iKTsKKworCXJldHVybiBtc2c7Cit9CisKK3N0cnVjdCBtc2diICptZ2NwX2NyZWF0ZV9yZXNwb25zZV93aXRoX2RhdGEoaW50IGNvZGUsIGNvbnN0IGNoYXIgKm1zZywgY29uc3QgY2hhciAqdHJhbnMsCisJCQkJICAgIGNvbnN0IGNoYXIgKmRhdGEpCit7CisJaW50IGxlbjsKKwlzdHJ1Y3QgbXNnYiAqcmVzOworCisJcmVzID0gbWdjcF9tc2diX2FsbG9jKCk7CisJaWYgKCFyZXMpCisJCXJldHVybiBOVUxMOworCisJaWYgKGRhdGEpIHsKKwkJbGVuID0gc25wcmludGYoKGNoYXIgKikgcmVzLT5kYXRhLCAyMDQ4LCAiJWQgJXNcbiVzIiwgY29kZSwgdHJhbnMsIGRhdGEpOworCX0gZWxzZSB7CisJCWxlbiA9IHNucHJpbnRmKChjaGFyICopIHJlcy0+ZGF0YSwgMjA0OCwgIiVkICVzXG4iLCBjb2RlLCB0cmFucyk7CisJfQorCisJcmVzLT5sMmggPSBtc2diX3B1dChyZXMsIGxlbik7CisJTE9HUChETUdDUCwgTE9HTF9ERUJVRywgIlNlbmRpbmcgcmVzcG9uc2U6IGNvZGU6ICVkIGZvciAnJXMnXG4iLCBjb2RlLCByZXMtPmwyaCk7CisJcmV0dXJuIHJlczsKK30KKworc3RhdGljIHN0cnVjdCBtc2diICpjcmVhdGVfcmVzcG9uc2UoaW50IGNvZGUsIGNvbnN0IGNoYXIgKm1zZywgY29uc3QgY2hhciAqdHJhbnMpCit7CisJcmV0dXJuIG1nY3BfY3JlYXRlX3Jlc3BvbnNlX3dpdGhfZGF0YShjb2RlLCBtc2csIHRyYW5zLCBOVUxMKTsKK30KKworc3RhdGljIHN0cnVjdCBtc2diICpjcmVhdGVfcmVzcG9uc2Vfd2l0aF9zZHAoc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHAsCisJCQkJCSAgICAgY29uc3QgY2hhciAqbXNnLCBjb25zdCBjaGFyICp0cmFuc19pZCkKK3sKKwljb25zdCBjaGFyICphZGRyID0gZW5kcC0+Y2ZnLT5sb2NhbF9pcDsKKwljaGFyIHNkcF9yZWNvcmRbNDA5Nl07CisKKwlpZiAoIWFkZHIpCisJCWFkZHIgPSBlbmRwLT5jZmctPnNvdXJjZV9hZGRyOworCisJc25wcmludGYoc2RwX3JlY29yZCwgc2l6ZW9mKHNkcF9yZWNvcmQpIC0gMSwKKwkJCSJJOiAlZFxuXG4iCisJCQkidj0wXHJcbiIKKwkJCSJjPUlOIElQNCAlc1xyXG4iCisJCQkibT1hdWRpbyAlZCBSVFAvQVZQICVkXHJcbiIKKwkJCSJhPXJ0cG1hcDolZCAlc1xyXG4iLAorCQkJZW5kcC0+Y2ksIGFkZHIsIGVuZHAtPnJ0cF9wb3J0LAorCQkJZW5kcC0+YnRzX3BheWxvYWRfdHlwZSwgZW5kcC0+YnRzX3BheWxvYWRfdHlwZSwKKwkJICAgICAgICBlbmRwLT5jZmctPmF1ZGlvX25hbWUpOworCXJldHVybiBtZ2NwX2NyZWF0ZV9yZXNwb25zZV93aXRoX2RhdGEoMjAwLCBtc2csIHRyYW5zX2lkLCBzZHBfcmVjb3JkKTsKK30KKworLyogc2VuZCBhIHN0YXRpYyByZWNvcmQgKi8KK3N0cnVjdCBtc2diICptZ2NwX2NyZWF0ZV9yc2lwKHZvaWQpCit7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlpbnQgbGVuOworCisJbXNnID0gbWdjcF9tc2diX2FsbG9jKCk7CisJaWYgKCFtc2cpCisJCXJldHVybiBOVUxMOworCisJbGVuID0gc25wcmludGYoKGNoYXIgKikgbXNnLT5kYXRhLCAyMDQ4LAorCQkJIlJTSVAgJXUgKkBtZ3cgTUdDUCAxLjBcbiIKKwkJCSJSTTogcmVzdGFydFxuIiwgZ2VuZXJhdGVfdHJhbnNhY3Rpb25faWQoKSk7CisJbXNnLT5sMmggPSBtc2diX3B1dChtc2csIGxlbik7CisJcmV0dXJuIG1zZzsKK30KKworLyoKKyAqIGhhbmRsZSBpbmNvbWluZyBtZXNzYWdlczoKKyAqICAgLSB0aGlzIGNhbiBiZSBhIGNvbW1hbmQgKGZvdXIgbGV0dGVycywgc3BhY2UsIHRyYW5zYWN0aW9uIGlkKQorICogICAtIG9yIGEgcmVzcG9uc2UgKHRocmVlIG51bWJlcnMsIHNwYWNlLCB0cmFuc2FjdGlvbiBpZCkKKyAqLworc3RydWN0IG1zZ2IgKm1nY3BfaGFuZGxlX21lc3NhZ2Uoc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2cpCit7CisgICAgICAgIGludCBjb2RlOworCXN0cnVjdCBtc2diICpyZXNwID0gTlVMTDsKKworCWlmIChtc2ctPmxlbiA8IDQpIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIm1ncyB0b28gc2hvcnQ6ICVkXG4iLCBtc2ctPmxlbik7CisJCXJldHVybiBOVUxMOworCX0KKworICAgICAgICAvKiBhdHRlbXB0IHRvIHRyZWF0IGl0IGFzIGEgcmVzcG9uc2UgKi8KKyAgICAgICAgaWYgKHNzY2FuZigoY29uc3QgY2hhciAqKSZtc2ctPmRhdGFbMF0sICIlM2QgJSpzIiwgJmNvZGUpID09IDEpIHsKKwkJTE9HUChETUdDUCwgTE9HTF9ERUJVRywgIlJlc3BvbnNlOiBDb2RlOiAlZFxuIiwgY29kZSk7CisJfSBlbHNlIHsKKwkJaW50IGksIGhhbmRsZWQgPSAwOworCQltc2ctPmwzaCA9ICZtc2ctPmwyaFs0XTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUobWdjcF9yZXF1ZXN0cyk7ICsraSkKKwkJCWlmIChzdHJuY21wKG1nY3BfcmVxdWVzdHNbaV0ubmFtZSwgKGNvbnN0IGNoYXIgKikgJm1zZy0+ZGF0YVswXSwgNCkgPT0gMCkgeworCQkJCWhhbmRsZWQgPSAxOworCQkJCXJlc3AgPSBtZ2NwX3JlcXVlc3RzW2ldLmhhbmRsZV9yZXF1ZXN0KGNmZywgbXNnKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJaWYgKCFoYW5kbGVkKSB7CisJCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIk1TRyB3aXRoIHR5cGU6ICclLjRzJyBub3QgaGFuZGxlZFxuIiwgJm1zZy0+ZGF0YVswXSk7CisJCX0KKwl9CisKKwlyZXR1cm4gcmVzcDsKK30KKworLyogc3RyaW5nIHRva2VuaXplciBmb3IgdGhlIHBvb3IgKi8KK3N0YXRpYyBpbnQgZmluZF9tc2dfcG9pbnRlcnMoc3RydWN0IG1zZ2IgKm1zZywgc3RydWN0IG1nY3BfbXNnX3B0ciAqcHRycywgaW50IHB0cnNfbGVuZ3RoKQoreworCWludCBpLCBmb3VuZCA9IDA7CisKKwlpbnQgd2hpdGVzcGFjZSA9IDE7CisJZm9yIChpID0gMDsgaSA8IG1zZ2JfbDNsZW4obXNnKSAmJiBwdHJzX2xlbmd0aCA+IDA7ICsraSkgeworCQkvKiBpZiB3ZSBoYXZlIGEgc3BhY2Ugd2UgZm91bmQgYW4gZW5kICovCisJCWlmIChtc2ctPmwzaFtpXQk9PSAnICcgfHwgbXNnLT5sM2hbaV0gPT0gJ1xyJyB8fCBtc2ctPmwzaFtpXSA9PSAnXG4nKSB7CisJCQlpZiAoIXdoaXRlc3BhY2UpIHsKKwkJCQkrK2ZvdW5kOworCQkJCXdoaXRlc3BhY2UgPSAxOworCQkJCXB0cnMtPmxlbmd0aCA9IGkgLSBwdHJzLT5zdGFydCAtIDE7CisJCQkJKytwdHJzOworCQkJCS0tcHRyc19sZW5ndGg7CisJCQl9IGVsc2UgeworCQkJICAgIC8qIHNraXAgYW55IG51bWJlciBvZiB3aGl0ZXNwYWNlICovCisJCQl9CisKKwkJCS8qIGxpbmUgZW5kLi4uIHN0b3AgKi8KKwkJCWlmIChtc2ctPmwzaFtpXSA9PSAnXHInIHx8IG1zZy0+bDNoW2ldID09ICdcbicpCisJCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAobXNnLT5sM2hbaV0gPT0gJ1xyJyB8fCBtc2ctPmwzaFtpXSA9PSAnXG4nKSB7CisJCQkvKiBsaW5lIGVuZCwgYmUgZG9uZSAqLworCQkJYnJlYWs7CisJCX0gZWxzZSBpZiAod2hpdGVzcGFjZSkgeworCQkJd2hpdGVzcGFjZSA9IDA7CisJCQlwdHJzLT5zdGFydCA9IGk7CisJCX0KKwl9CisKKwlpZiAocHRyc19sZW5ndGggPT0gMCkKKwkJcmV0dXJuIC0xOworCXJldHVybiBmb3VuZDsKK30KKworc3RhdGljIHN0cnVjdCBtZ2NwX2VuZHBvaW50ICpmaW5kX2VuZHBvaW50KHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBjb25zdCBjaGFyICptZ2NwKQoreworCWNoYXIgKmVuZHB0ciA9IE5VTEw7CisJdW5zaWduZWQgaW50IGd3ID0gSU5UX01BWDsKKworCWd3ID0gc3RydG91bChtZ2NwLCAmZW5kcHRyLCAxNik7CisJaWYgKGd3ID09IDAgfHwgZ3cgPj0gY2ZnLT5udW1iZXJfZW5kcG9pbnRzIHx8IHN0cmNtcChlbmRwdHIsICJAbWd3IikgIT0gMCkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiTm90IGFibGUgdG8gZmluZCBlbmRwb2ludDogJyVzJ1xuIiwgbWdjcCk7CisJCXJldHVybiBOVUxMOworCX0KKworCXJldHVybiAmY2ZnLT5lbmRwb2ludHNbZ3ddOworfQorCitzdGF0aWMgaW50IGFuYWx5emVfaGVhZGVyKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnLAorCQkJICBzdHJ1Y3QgbWdjcF9tc2dfcHRyICpwdHIsIGludCBzaXplLAorCQkJICBjb25zdCBjaGFyICoqdHJhbnNhY3Rpb25faWQsIHN0cnVjdCBtZ2NwX2VuZHBvaW50ICoqZW5kcCkKK3sKKwlpbnQgZm91bmQ7CisKKwkqdHJhbnNhY3Rpb25faWQgPSAiMDAwMDAwIjsKKworCWlmIChzaXplIDwgMykgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiTm90IGVub3VnaCBzcGFjZSBpbiBwdHJcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZm91bmQgPSBmaW5kX21zZ19wb2ludGVycyhtc2csIHB0ciwgc2l6ZSk7CisKKwlpZiAoZm91bmQgPD0gMykgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiR2F0ZXdheTogTm90IGVub3VnaCBwYXJhbXMuIEZvdW5kOiAlZFxuIiwgZm91bmQpOworCQlyZXR1cm4gLTE7CisJfQorCisJLyoKKwkgKiByZXBsYWNlIHRoZSBzcGFjZSB3aXRoIFwwLiB0aGUgbWFpbiBtZXRob2QgZ3VyYW50ZXNzIHRoYXQKKwkgKiB3ZSBzdGlsbCBoYXZlICsgMSBmb3IgbnVsbCB0ZXJtaW5hdGlvbgorCSAqLworCW1zZy0+bDNoW3B0clszXS5zdGFydCArIHB0clszXS5sZW5ndGggKyAxXSA9ICdcMCc7CisJbXNnLT5sM2hbcHRyWzJdLnN0YXJ0ICsgcHRyWzJdLmxlbmd0aCArIDFdID0gJ1wwJzsKKwltc2ctPmwzaFtwdHJbMV0uc3RhcnQgKyBwdHJbMV0ubGVuZ3RoICsgMV0gPSAnXDAnOworCW1zZy0+bDNoW3B0clswXS5zdGFydCArIHB0clswXS5sZW5ndGggKyAxXSA9ICdcMCc7CisKKwlpZiAoc3RybmNtcCgiMS4wIiwgKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbcHRyWzNdLnN0YXJ0XSwgMykgIT0gMAorCSAgICB8fCBzdHJuY21wKCJNR0NQIiwgKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbcHRyWzJdLnN0YXJ0XSwgNCkgIT0gMCkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiV3JvbmcgTUdDUCB2ZXJzaW9uLiBOb3QgaGFuZGxpbmc6ICclcycgJyVzJ1xuIiwKKwkJCShjb25zdCBjaGFyICopJm1zZy0+bDNoW3B0clszXS5zdGFydF0sCisJCQkoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtwdHJbMl0uc3RhcnRdKTsKKwkJcmV0dXJuIC0xOworCX0KKworCSp0cmFuc2FjdGlvbl9pZCA9IChjb25zdCBjaGFyICopJm1zZy0+bDNoW3B0clswXS5zdGFydF07CisJKmVuZHAgPSBmaW5kX2VuZHBvaW50KGNmZywgKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbcHRyWzFdLnN0YXJ0XSk7CisJcmV0dXJuICplbmRwID09IE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgdmVyaWZ5X2NhbGxfaWQoY29uc3Qgc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHAsCisJCQkgIGNvbnN0IGNoYXIgKmNhbGxpZCkKK3sKKwlpZiAoc3RyY21wKGVuZHAtPmNhbGxpZCwgY2FsbGlkKSAhPSAwKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJDYWxsSURzIGRvZXMgbm90IG1hdGNoIG9uIDB4JXguICclcycgIT0gJyVzJ1xuIiwKKwkJCUVORFBPSU5UX05VTUJFUihlbmRwKSwgZW5kcC0+Y2FsbGlkLCBjYWxsaWQpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgdmVyaWZ5X2NpKGNvbnN0IHN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwLAorCQkgICAgIGNvbnN0IGNoYXIgKmNpKQoreworCWlmIChhdG9pKGNpKSAhPSBlbmRwLT5jaSkgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiQ29ubmVjdGlvbklkZW50aWZpZXJzIGRvIG5vdCBtYXRjaCBvbiAweCV4LiAlZCAhPSAlc1xuIiwKKwkJCUVORFBPSU5UX05VTUJFUihlbmRwKSwgZW5kcC0+Y2ksIGNpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IG1zZ2IgKmhhbmRsZV9hdWRpdF9lbmRwb2ludChzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgbWdjcF9tc2dfcHRyIGRhdGFfcHRyc1s2XTsKKwlpbnQgZm91bmQsIHJlc3BvbnNlOworCWNvbnN0IGNoYXIgKnRyYW5zX2lkOworCXN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwOworCisJZm91bmQgPSBhbmFseXplX2hlYWRlcihjZmcsIG1zZywgZGF0YV9wdHJzLCBBUlJBWV9TSVpFKGRhdGFfcHRycyksICZ0cmFuc19pZCwgJmVuZHApOworCWlmIChmb3VuZCAhPSAwKQorCSAgICByZXNwb25zZSA9IDUwMDsKKwllbHNlCisJICAgIHJlc3BvbnNlID0gMjAwOworCisJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZShyZXNwb25zZSwgIkFVRVAiLCB0cmFuc19pZCk7Cit9CisKK3N0YXRpYyBpbnQgcGFyc2VfY29ubl9tb2RlKGNvbnN0IGNoYXIqIG1zZywgaW50ICpjb25uX21vZGUpCit7CisJaW50IHJldCA9IDA7CisJaWYgKHN0cmNtcChtc2csICJyZWN2b25seSIpID09IDApCisJCSpjb25uX21vZGUgPSBNR0NQX0NPTk5fUkVDVl9PTkxZOworCWVsc2UgaWYgKHN0cmNtcChtc2csICJzZW5kcmVjdiIpID09IDApCisJCSpjb25uX21vZGUgPSBNR0NQX0NPTk5fUkVDVl9TRU5EOworCWVsc2UgeworCQlMT0dQKERNR0NQLCBMT0dMX0VSUk9SLCAiVW5rbm93biBjb25uZWN0aW9uIG1vZGU6ICclcydcbiIsIG1zZyk7CisJCXJldCA9IC0xOworCX0KKworCXJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgbXNnYiAqaGFuZGxlX2NyZWF0ZV9jb24oc3RydWN0IG1nY3BfY29uZmlnICpjZmcsIHN0cnVjdCBtc2diICptc2cpCit7CisJc3RydWN0IG1nY3BfbXNnX3B0ciBkYXRhX3B0cnNbNl07CisJaW50IGZvdW5kLCBpLCBsaW5lX3N0YXJ0OworCWNvbnN0IGNoYXIgKnRyYW5zX2lkOworCXN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwOworCWludCBlcnJvcl9jb2RlID0gNTAwOworCWludCBwb3J0OworCisJZm91bmQgPSBhbmFseXplX2hlYWRlcihjZmcsIG1zZywgZGF0YV9wdHJzLCBBUlJBWV9TSVpFKGRhdGFfcHRycyksICZ0cmFuc19pZCwgJmVuZHApOworCWlmIChmb3VuZCAhPSAwKQorCQlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKDUwMCwgIkNSQ1giLCB0cmFuc19pZCk7CisKKwlpZiAoZW5kcC0+Y2kgIT0gQ0lfVU5VU0VEKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJFbmRwb2ludCBpcyBhbHJlYWR5IHVzZWQuIDB4JXhcbiIsIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoNTAwLCAiQ1JDWCIsIHRyYW5zX2lkKTsKKwl9CisKKwkvKiBwYXJzZSBDYWxsSUQgQzogYW5kIExvY2FsUGFyYW1ldGVycyBMOiAqLworCU1TR19UT0tFTklaRV9TVEFSVAorCXN3aXRjaCAobXNnLT5sM2hbbGluZV9zdGFydF0pIHsKKwljYXNlICdMJzoKKwkJZW5kcC0+bG9jYWxfb3B0aW9ucyA9IHRhbGxvY19zdHJkdXAoY2ZnLT5lbmRwb2ludHMsCisJCQkoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtsaW5lX3N0YXJ0ICsgM10pOworCQlicmVhazsKKwljYXNlICdDJzoKKwkJZW5kcC0+Y2FsbGlkID0gdGFsbG9jX3N0cmR1cChjZmctPmVuZHBvaW50cywKKwkJCShjb25zdCBjaGFyICopJm1zZy0+bDNoW2xpbmVfc3RhcnQgKyAzXSk7CisJCWJyZWFrOworCWNhc2UgJ00nOgorCQlpZiAocGFyc2VfY29ubl9tb2RlKChjb25zdCBjaGFyICopJm1zZy0+bDNoW2xpbmVfc3RhcnQgKyAzXSwKKwkJCSAgICAmZW5kcC0+Y29ubl9tb2RlKSAhPSAwKSB7CisJCSAgICBlcnJvcl9jb2RlID0gNTE3OworCQkgICAgZ290byBlcnJvcjI7CisJCX0KKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJVbmhhbmRsZWQgb3B0aW9uOiAnJWMnLyVkIG9uIDB4JXhcbiIsCisJCQltc2ctPmwzaFtsaW5lX3N0YXJ0XSwgbXNnLT5sM2hbbGluZV9zdGFydF0sCisJCQlFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQlicmVhazsKKwl9CisJTVNHX1RPS0VOSVpFX0VORAorCisJLyogaW5pdGlhbGl6ZSAqLworCWVuZHAtPm5ldF9ydHAgPSBlbmRwLT5uZXRfcnRjcCA9IGVuZHAtPmJ0c19ydHAgPSBlbmRwLT5idHNfcnRjcCA9IDA7CisKKwkvKiBzZXQgdG8gemVybyB1bnRpbCB3ZSBnZXQgdGhlIGluZm8gKi8KKwltZW1zZXQoJmVuZHAtPnJlbW90ZSwgMCwgc2l6ZW9mKGVuZHAtPnJlbW90ZSkpOworCisJLyogYmluZCB0byB0aGUgcG9ydCBub3cgKi8KKwlwb3J0ID0gcnRwX2NhbGN1bGF0ZV9wb3J0KEVORFBPSU5UX05VTUJFUihlbmRwKSwgY2ZnLT5ydHBfYmFzZV9wb3J0KTsKKwlpZiAoY2ZnLT5lYXJseV9iaW5kKQorCQllbmRwLT5ydHBfcG9ydCA9IHBvcnQ7CisJZWxzZSBpZiAobWdjcF9iaW5kX3J0cF9wb3J0KGVuZHAsIHBvcnQpICE9IDApCisJCWdvdG8gZXJyb3IyOworCisJLyogYXNzaWduIGEgbG9jYWwgY2FsbCBpZGVudGlmaWVyIG9yIGZhaWwgKi8KKwllbmRwLT5jaSA9IGdlbmVyYXRlX2NhbGxfaWQoY2ZnKTsKKwlpZiAoZW5kcC0+Y2kgPT0gQ0lfVU5VU0VEKQorCQlnb3RvIGVycm9yMjsKKworCWVuZHAtPmJ0c19wYXlsb2FkX3R5cGUgPSBjZmctPmF1ZGlvX3BheWxvYWQ7CisKKwkvKiBwb2xpY3kgQ0IgKi8KKwlpZiAoY2ZnLT5wb2xpY3lfY2IpIHsKKwkJc3dpdGNoIChjZmctPnBvbGljeV9jYihjZmcsIEVORFBPSU5UX05VTUJFUihlbmRwKSwgTUdDUF9FTkRQX0NSQ1gsIHRyYW5zX2lkKSkgeworCQljYXNlIE1HQ1BfUE9MSUNZX1JFSkVDVDoKKwkJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiQ1JDWCByZWplY3RlZCBieSBwb2xpY3kgb24gMHgleFxuIiwKKwkJCSAgICAgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJCW1nY3BfZnJlZV9lbmRwKGVuZHApOworCQkJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZSg1MDAsICJDUkNYIiwgdHJhbnNfaWQpOworCQkJYnJlYWs7CisJCWNhc2UgTUdDUF9QT0xJQ1lfREVGRVI6CisJCQkvKiBzdG9wIHByb2Nlc3NpbmcgKi8KKwkJCXJldHVybiBOVUxMOworCQkJYnJlYWs7CisJCWNhc2UgTUdDUF9QT0xJQ1lfQ09OVDoKKwkJCS8qIGp1c3QgY29udGludWUgKi8KKwkJCWJyZWFrOworCQl9CisJfQorCisJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJDcmVhdGluZyBlbmRwb2ludCBvbjogMHgleCBDSTogJXUgcG9ydDogJXVcbiIsCisJCUVORFBPSU5UX05VTUJFUihlbmRwKSwgZW5kcC0+Y2ksIGVuZHAtPnJ0cF9wb3J0KTsKKwlpZiAoY2ZnLT5jaGFuZ2VfY2IpCisJCWNmZy0+Y2hhbmdlX2NiKGNmZywgRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBNR0NQX0VORFBfQ1JDWCwgZW5kcC0+cnRwX3BvcnQpOworCisJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZV93aXRoX3NkcChlbmRwLCAiQ1JDWCIsIHRyYW5zX2lkKTsKK2Vycm9yOgorCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJNYWxmb3JtZWQgbGluZTogJXMgb24gMHgleCB3aXRoOiBsaW5lX3N0YXJ0OiAlZCAlZFxuIiwKKwkJICAgIGhleGR1bXAobXNnLT5sM2gsIG1zZ2JfbDNsZW4obXNnKSksCisJCSAgICBFTkRQT0lOVF9OVU1CRVIoZW5kcCksIGxpbmVfc3RhcnQsIGkpOworCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoZXJyb3JfY29kZSwgIkNSQ1giLCB0cmFuc19pZCk7CisKK2Vycm9yMjoKKwlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIlJlc291cmNlIGVycm9yIG9uIDB4JXhcbiIsIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZShlcnJvcl9jb2RlLCAiQ1JDWCIsIHRyYW5zX2lkKTsKK30KKworc3RhdGljIHN0cnVjdCBtc2diICpoYW5kbGVfbW9kaWZ5X2NvbihzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZywgc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3QgbWdjcF9tc2dfcHRyIGRhdGFfcHRyc1s2XTsKKwlpbnQgZm91bmQsIGksIGxpbmVfc3RhcnQ7CisJY29uc3QgY2hhciAqdHJhbnNfaWQ7CisJc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHA7CisJaW50IGVycm9yX2NvZGUgPSA1MDA7CisKKwlmb3VuZCA9IGFuYWx5emVfaGVhZGVyKGNmZywgbXNnLCBkYXRhX3B0cnMsIEFSUkFZX1NJWkUoZGF0YV9wdHJzKSwgJnRyYW5zX2lkLCAmZW5kcCk7CisJaWYgKGZvdW5kICE9IDApCisJCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoZXJyb3JfY29kZSwgIk1EQ1giLCB0cmFuc19pZCk7CisKKwlpZiAoZW5kcC0+Y2kgPT0gQ0lfVU5VU0VEKSB7CisJCUxPR1AoRE1HQ1AsIExPR0xfRVJST1IsICJFbmRwb2ludCBpcyBub3QgaG9sZGluZyBhIGNvbm5lY3Rpb24uIDB4JXhcbiIsIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoZXJyb3JfY29kZSwgIk1EQ1giLCB0cmFuc19pZCk7CisJfQorCisJTVNHX1RPS0VOSVpFX1NUQVJUCisJc3dpdGNoIChtc2ctPmwzaFtsaW5lX3N0YXJ0XSkgeworCWNhc2UgJ0MnOiB7CisJCWlmICh2ZXJpZnlfY2FsbF9pZChlbmRwLCAoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtsaW5lX3N0YXJ0ICsgM10pICE9IDApCisJCQlnb3RvIGVycm9yMzsKKwkJYnJlYWs7CisJfQorCWNhc2UgJ0knOiB7CisJCWlmICh2ZXJpZnlfY2koZW5kcCwgKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbbGluZV9zdGFydCArIDNdKSAhPSAwKQorCQkJZ290byBlcnJvcjM7CisJCWJyZWFrOworCX0KKwljYXNlICdMJzoKKwkJLyogc2tpcCAqLworCQlicmVhazsKKwljYXNlICdNJzoKKwkJaWYgKHBhcnNlX2Nvbm5fbW9kZSgoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtsaW5lX3N0YXJ0ICsgM10sCisJCQkgICAgJmVuZHAtPmNvbm5fbW9kZSkgIT0gMCkgeworCQkgICAgZXJyb3JfY29kZSA9IDUxNzsKKwkJICAgIGdvdG8gZXJyb3IzOworCQl9CisJCWJyZWFrOworCWNhc2UgJ1wwJzoKKwkJLyogU0RQIGZpbGUgYmVnaW5zICovCisJCWJyZWFrOworCWNhc2UgJ2EnOgorCWNhc2UgJ28nOgorCWNhc2UgJ3MnOgorCWNhc2UgJ3QnOgorCWNhc2UgJ3YnOgorCQkvKiBza2lwIHRoZXNlIFNEUCBhdHRyaWJ1dGVzICovCisJCWJyZWFrOworCWNhc2UgJ20nOiB7CisJCWludCBwb3J0OworCQlpbnQgcGF5bG9hZDsKKwkJY29uc3QgY2hhciAqcGFyYW0gPSAoY29uc3QgY2hhciAqKSZtc2ctPmwzaFtsaW5lX3N0YXJ0XTsKKworCQlpZiAoc3NjYW5mKHBhcmFtLCAibT1hdWRpbyAlZCBSVFAvQVZQICVkIiwgJnBvcnQsICZwYXlsb2FkKSA9PSAyKSB7CisJCQllbmRwLT5uZXRfcnRwID0gaHRvbnMocG9ydCk7CisJCQllbmRwLT5uZXRfcnRjcCA9IGh0b25zKHBvcnQgKyAxKTsKKwkJCWVuZHAtPm5ldF9wYXlsb2FkX3R5cGUgPSBwYXlsb2FkOworCQl9CisJCWJyZWFrOworCX0KKwljYXNlICdjJzogeworCQljaGFyIGlwdjRbMTZdOworCQljb25zdCBjaGFyICpwYXJhbSA9IChjb25zdCBjaGFyICopJm1zZy0+bDNoW2xpbmVfc3RhcnRdOworCisJCWlmIChzc2NhbmYocGFyYW0sICJjPUlOIElQNCAlMTVzIiwgaXB2NCkgPT0gMSkgeworCQkJaW5ldF9hdG9uKGlwdjQsICZlbmRwLT5yZW1vdGUpOworCQl9CisJCWJyZWFrOworCX0KKwlkZWZhdWx0OgorCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIlVuaGFuZGxlZCBvcHRpb246ICclYycvJWQgb24gMHgleFxuIiwKKwkJCW1zZy0+bDNoW2xpbmVfc3RhcnRdLCBtc2ctPmwzaFtsaW5lX3N0YXJ0XSwKKwkJCUVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCWJyZWFrOworCX0KKwlNU0dfVE9LRU5JWkVfRU5ECisKKwkvKiBwb2xpY3kgQ0IgKi8KKwlpZiAoY2ZnLT5wb2xpY3lfY2IpIHsKKwkJc3dpdGNoIChjZmctPnBvbGljeV9jYihjZmcsIEVORFBPSU5UX05VTUJFUihlbmRwKSwgTUdDUF9FTkRQX01EQ1gsIHRyYW5zX2lkKSkgeworCQljYXNlIE1HQ1BfUE9MSUNZX1JFSkVDVDoKKwkJCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiTURDWCByZWplY3RlZCBieSBwb2xpY3kgb24gMHgleFxuIiwKKwkJCSAgICAgRU5EUE9JTlRfTlVNQkVSKGVuZHApKTsKKwkJCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoNTAwLCAiTURDWCIsIHRyYW5zX2lkKTsKKwkJCWJyZWFrOworCQljYXNlIE1HQ1BfUE9MSUNZX0RFRkVSOgorCQkJLyogc3RvcCBwcm9jZXNzaW5nICovCisJCQlyZXR1cm4gTlVMTDsKKwkJCWJyZWFrOworCQljYXNlIE1HQ1BfUE9MSUNZX0NPTlQ6CisJCQkvKiBqdXN0IGNvbnRpbnVlICovCisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIG1vZGlmeSAqLworCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiTW9kaWZpZWQgZW5kcG9pbnQgb246IDB4JXggU2VydmVyOiAlczoldVxuIiwKKwkJRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBpbmV0X250b2EoZW5kcC0+cmVtb3RlKSwgbnRvaHMoZW5kcC0+bmV0X3J0cCkpOworCWlmIChjZmctPmNoYW5nZV9jYikKKwkJY2ZnLT5jaGFuZ2VfY2IoY2ZnLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCksIE1HQ1BfRU5EUF9NRENYLCBlbmRwLT5ydHBfcG9ydCk7CisJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZV93aXRoX3NkcChlbmRwLCAiTURDWCIsIHRyYW5zX2lkKTsKKworZXJyb3I6CisJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIk1hbGZvcm1lZCBsaW5lOiAlcyBvbiAweCV4IHdpdGg6IGxpbmVfc3RhcnQ6ICVkICVkICVkXG4iLAorCQkgICAgaGV4ZHVtcChtc2ctPmwzaCwgbXNnYl9sM2xlbihtc2cpKSwKKwkJICAgIEVORFBPSU5UX05VTUJFUihlbmRwKSwgbGluZV9zdGFydCwgaSwgbXNnLT5sM2hbbGluZV9zdGFydF0pOworCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoZXJyb3JfY29kZSwgIk1EQ1giLCB0cmFuc19pZCk7CisKK2Vycm9yMzoKKwlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKGVycm9yX2NvZGUsICJNRENYIiwgdHJhbnNfaWQpOworfQorCitzdGF0aWMgc3RydWN0IG1zZ2IgKmhhbmRsZV9kZWxldGVfY29uKHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBtZ2NwX21zZ19wdHIgZGF0YV9wdHJzWzZdOworCWludCBmb3VuZCwgaSwgbGluZV9zdGFydDsKKwljb25zdCBjaGFyICp0cmFuc19pZDsKKwlzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcDsKKwlpbnQgZXJyb3JfY29kZSA9IDUwMDsKKworCWZvdW5kID0gYW5hbHl6ZV9oZWFkZXIoY2ZnLCBtc2csIGRhdGFfcHRycywgQVJSQVlfU0laRShkYXRhX3B0cnMpLCAmdHJhbnNfaWQsICZlbmRwKTsKKwlpZiAoZm91bmQgIT0gMCkKKwkJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZShlcnJvcl9jb2RlLCAiRExDWCIsIHRyYW5zX2lkKTsKKworCWlmIChlbmRwLT5jaSA9PSBDSV9VTlVTRUQpIHsKKwkJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIkVuZHBvaW50IGlzIG5vdCB1c2VkLiAweCV4XG4iLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKGVycm9yX2NvZGUsICJETENYIiwgdHJhbnNfaWQpOworCX0KKworCU1TR19UT0tFTklaRV9TVEFSVAorCXN3aXRjaCAobXNnLT5sM2hbbGluZV9zdGFydF0pIHsKKwljYXNlICdDJzogeworCQlpZiAodmVyaWZ5X2NhbGxfaWQoZW5kcCwgKGNvbnN0IGNoYXIgKikmbXNnLT5sM2hbbGluZV9zdGFydCArIDNdKSAhPSAwKQorCQkJZ290byBlcnJvcjM7CisJCWJyZWFrOworCX0KKwljYXNlICdJJzogeworCQlpZiAodmVyaWZ5X2NpKGVuZHAsIChjb25zdCBjaGFyICopJm1zZy0+bDNoW2xpbmVfc3RhcnQgKyAzXSkgIT0gMCkKKwkJCWdvdG8gZXJyb3IzOworCQlicmVhazsKKwl9CisJZGVmYXVsdDoKKwkJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJVbmhhbmRsZWQgb3B0aW9uOiAnJWMnLyVkIG9uIDB4JXhcbiIsCisJCQltc2ctPmwzaFtsaW5lX3N0YXJ0XSwgbXNnLT5sM2hbbGluZV9zdGFydF0sCisJCQlFTkRQT0lOVF9OVU1CRVIoZW5kcCkpOworCQlicmVhazsKKwl9CisJTVNHX1RPS0VOSVpFX0VORAorCisJLyogcG9saWN5IENCICovCisJaWYgKGNmZy0+cG9saWN5X2NiKSB7CisJCXN3aXRjaCAoY2ZnLT5wb2xpY3lfY2IoY2ZnLCBFTkRQT0lOVF9OVU1CRVIoZW5kcCksIE1HQ1BfRU5EUF9ETENYLCB0cmFuc19pZCkpIHsKKwkJY2FzZSBNR0NQX1BPTElDWV9SRUpFQ1Q6CisJCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIkRMQ1ggcmVqZWN0ZWQgYnkgcG9saWN5IG9uIDB4JXhcbiIsCisJCQkgICAgIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJCQlyZXR1cm4gY3JlYXRlX3Jlc3BvbnNlKDUwMCwgIkRMQ1giLCB0cmFuc19pZCk7CisJCQlicmVhazsKKwkJY2FzZSBNR0NQX1BPTElDWV9ERUZFUjoKKwkJCS8qIHN0b3AgcHJvY2Vzc2luZyAqLworCQkJcmV0dXJuIE5VTEw7CisJCQlicmVhazsKKwkJY2FzZSBNR0NQX1BPTElDWV9DT05UOgorCQkJLyoganVzdCBjb250aW51ZSAqLworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBmcmVlIHRoZSBjb25uZWN0aW9uICovCisJbWdjcF9mcmVlX2VuZHAoZW5kcCk7CisJaWYgKGNmZy0+Y2hhbmdlX2NiKQorCQljZmctPmNoYW5nZV9jYihjZmcsIEVORFBPSU5UX05VTUJFUihlbmRwKSwgTUdDUF9FTkRQX0RMQ1gsIGVuZHAtPnJ0cF9wb3J0KTsKKworCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoMjUwLCAiRExDWCIsIHRyYW5zX2lkKTsKKworZXJyb3I6CisJTE9HUChETUdDUCwgTE9HTF9FUlJPUiwgIk1hbGZvcm1lZCBsaW5lOiAlcyBvbiAweCV4IHdpdGg6IGxpbmVfc3RhcnQ6ICVkICVkXG4iLAorCQkgICAgaGV4ZHVtcChtc2ctPmwzaCwgbXNnYl9sM2xlbihtc2cpKSwKKwkJICAgIEVORFBPSU5UX05VTUJFUihlbmRwKSwgbGluZV9zdGFydCwgaSk7CisJcmV0dXJuIGNyZWF0ZV9yZXNwb25zZShlcnJvcl9jb2RlLCAiRExDWCIsIHRyYW5zX2lkKTsKKworZXJyb3IzOgorCXJldHVybiBjcmVhdGVfcmVzcG9uc2UoZXJyb3JfY29kZSwgIkRMQ1giLCB0cmFuc19pZCk7Cit9CisKK3N0cnVjdCBtZ2NwX2NvbmZpZyAqbWdjcF9jb25maWdfYWxsb2Modm9pZCkKK3sKKwlzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZzsKKworCWNmZyA9IHRhbGxvY196ZXJvKE5VTEwsIHN0cnVjdCBtZ2NwX2NvbmZpZyk7CisJaWYgKCFjZmcpIHsKKwkJTE9HUChETUdDUCwgTE9HTF9GQVRBTCwgIkZhaWxlZCB0byBhbGxvY2F0ZSBjb25maWcuXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJY2ZnLT5zb3VyY2VfcG9ydCA9IDI0Mjc7CisJY2ZnLT5zb3VyY2VfYWRkciA9IHRhbGxvY19zdHJkdXAoY2ZnLCAiMC4wLjAuMCIpOworCWNmZy0+YXVkaW9fbmFtZSA9IHRhbGxvY19zdHJkdXAoY2ZnLCAiR1NNLUVGUi84MDAwIik7CisJY2ZnLT5hdWRpb19wYXlsb2FkID0gOTc7CisJY2ZnLT5ydHBfYmFzZV9wb3J0ID0gUlRQX1BPUlRfREVGQVVMVDsKKworCXJldHVybiBjZmc7Cit9CisKK2ludCBtZ2NwX2VuZHBvaW50c19hbGxvY2F0ZShzdHJ1Y3QgbWdjcF9jb25maWcgKmNmZykKK3sKKwlpbnQgaTsKKworCS8qIEluaXRpYWxpemUgYWxsIGVuZHBvaW50cyAqLworCWNmZy0+ZW5kcG9pbnRzID0gX3RhbGxvY196ZXJvX2FycmF5KGNmZywKKwkJCQkgICAgICAgc2l6ZW9mKHN0cnVjdCBtZ2NwX2VuZHBvaW50KSwKKwkJCQkgICAgICAgY2ZnLT5udW1iZXJfZW5kcG9pbnRzLCAiZW5kcG9pbnRzIik7CisJaWYgKCFjZmctPmVuZHBvaW50cykKKwkJcmV0dXJuIC0xOworCisJZm9yIChpID0gMDsgaSA8IGNmZy0+bnVtYmVyX2VuZHBvaW50czsgKytpKSB7CisJCWNmZy0+ZW5kcG9pbnRzW2ldLmxvY2FsX3J0cC5mZCA9IC0xOworCQljZmctPmVuZHBvaW50c1tpXS5sb2NhbF9ydGNwLmZkID0gLTE7CisJCWNmZy0+ZW5kcG9pbnRzW2ldLmNpID0gQ0lfVU5VU0VEOworCQljZmctPmVuZHBvaW50c1tpXS5jZmcgPSBjZmc7CisJCWNmZy0+ZW5kcG9pbnRzW2ldLm5ldF9wYXlsb2FkX3R5cGUgPSAtMTsKKwkJY2ZnLT5lbmRwb2ludHNbaV0uYnRzX3BheWxvYWRfdHlwZSA9IC0xOworCX0KKworCXJldHVybiAwOworfQorCit2b2lkIG1nY3BfZnJlZV9lbmRwKHN0cnVjdCBtZ2NwX2VuZHBvaW50ICplbmRwKQoreworCUxPR1AoRE1HQ1AsIExPR0xfTk9USUNFLCAiRGVsZXRpbmcgZW5kcG9pbnQgb246IDB4JXhcbiIsIEVORFBPSU5UX05VTUJFUihlbmRwKSk7CisJZW5kcC0+Y2k9IENJX1VOVVNFRDsKKworCWlmIChlbmRwLT5jYWxsaWQpIHsKKwkJdGFsbG9jX2ZyZWUoZW5kcC0+Y2FsbGlkKTsKKwkJZW5kcC0+Y2FsbGlkID0gTlVMTDsKKwl9CisKKwlpZiAoZW5kcC0+bG9jYWxfb3B0aW9ucykgeworCQl0YWxsb2NfZnJlZShlbmRwLT5sb2NhbF9vcHRpb25zKTsKKwkJZW5kcC0+Y2FsbGlkID0gTlVMTDsKKwl9CisKKwlpZiAoIWVuZHAtPmNmZy0+ZWFybHlfYmluZCkgeworCQlic2NfdW5yZWdpc3Rlcl9mZCgmZW5kcC0+bG9jYWxfcnRwKTsKKwkJYnNjX3VucmVnaXN0ZXJfZmQoJmVuZHAtPmxvY2FsX3J0Y3ApOworCX0KKworCWVuZHAtPm5ldF9ydHAgPSBlbmRwLT5uZXRfcnRjcCA9IGVuZHAtPmJ0c19ydHAgPSBlbmRwLT5idHNfcnRjcCA9IDA7CisJZW5kcC0+bmV0X3BheWxvYWRfdHlwZSA9IGVuZHAtPmJ0c19wYXlsb2FkX3R5cGUgPSAtMTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL21nY3AvbWdjcF92dHkuYyBiL29wZW5ic2Mvc3JjL21nY3AvbWdjcF92dHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTNiM2NmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvbWdjcC9tZ2NwX3Z0eS5jCkBAIC0wLDAgKzEsMzM5IEBACisvKiBBIE1lZGlhIEdhdGV3YXkgQ29udHJvbCBQcm90b2NvbCBNZWRpYSBHYXRld2F5OiBSRkMgMzQzNSAqLworLyogVGhlIHByb3RvY29sIGltcGxlbWVudGF0aW9uICovCisKKy8qCisgKiAoQykgMjAwOS0yMDEwIGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIChDKSAyMDA5LTIwMTAgYnkgT24tV2F2ZXMKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21nY3AuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21nY3BfaW50ZXJuYWwuaD4KKworI2luY2x1ZGUgPHZ0eS9jb21tYW5kLmg+CisjaW5jbHVkZSA8dnR5L3Z0eS5oPgorCitzdGF0aWMgc3RydWN0IG1nY3BfY29uZmlnICpnX2NmZyA9IE5VTEw7CisKKy8qCisgKiB2dHkgY29kZSBmb3IgbWdjcCBiZWxvdworICovCitzdHJ1Y3QgY21kX25vZGUgbWdjcF9ub2RlID0geworCU1HQ1BfTk9ERSwKKwkiJXMobWdjcCkjIiwKKwkxLAorfTsKKworc3RhdGljIGludCBjb25maWdfd3JpdGVfbWdjcChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdnR5X291dCh2dHksICJtZ2NwJXMiLCBWVFlfTkVXTElORSk7CisJaWYgKGdfY2ZnLT5sb2NhbF9pcCkKKwkJdnR5X291dCh2dHksICIgbG9jYWwgaXAgJXMlcyIsIGdfY2ZnLT5sb2NhbF9pcCwgVlRZX05FV0xJTkUpOworCWlmIChnX2NmZy0+YnRzX2lwKQorCQl2dHlfb3V0KHZ0eSwgIiAgYnRzIGlwICVzJXMiLCBnX2NmZy0+YnRzX2lwLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIGJpbmQgaXAgJXMlcyIsIGdfY2ZnLT5zb3VyY2VfYWRkciwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBiaW5kIHBvcnQgJXUlcyIsIGdfY2ZnLT5zb3VyY2VfcG9ydCwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBiaW5kIGVhcmx5ICV1JXMiLCAhIWdfY2ZnLT5lYXJseV9iaW5kLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIHJ0cCBiYXNlICV1JXMiLCBnX2NmZy0+cnRwX2Jhc2VfcG9ydCwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBzZHAgYXVkaW8gcGF5bG9hZCBudW1iZXIgJXUlcyIsIGdfY2ZnLT5hdWRpb19wYXlsb2FkLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIHNkcCBhdWRpbyBwYXlsb2FkIG5hbWUgJXMlcyIsIGdfY2ZnLT5hdWRpb19uYW1lLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIGxvb3AgJXUlcyIsICEhZ19jZmctPmF1ZGlvX2xvb3AsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgZW5kcG9pbnRzICV1JXMiLCBnX2NmZy0+bnVtYmVyX2VuZHBvaW50cywgVlRZX05FV0xJTkUpOworCWlmIChnX2NmZy0+Zm9yd2FyZF9pcCkKKwkJdnR5X291dCh2dHksICIgZm9yd2FyZCBhdWRpbyBpcCAlcyVzIiwgZ19jZmctPmZvcndhcmRfaXAsIFZUWV9ORVdMSU5FKTsKKwlpZiAoZ19jZmctPmZvcndhcmRfcG9ydCAhPSAwKQorCQl2dHlfb3V0KHZ0eSwgIiBmb3J3YXJkIGF1ZGlvIHBvcnQgJWQlcyIsIGdfY2ZnLT5mb3J3YXJkX3BvcnQsIFZUWV9ORVdMSU5FKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oc2hvd19tY2dwLCBzaG93X21nY3BfY21kLCAic2hvdyBtZ2NwIiwKKyAgICAgIFNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IHRoZSBNR0NQIE1lZGlhIEdhdGV3YXkiKQoreworCWludCBpOworCisJdnR5X291dCh2dHksICJNR0NQIGlzIHVwIGFuZCBydW5uaW5nIHdpdGggJXUgZW5kcG9pbnRzOiVzIiwgZ19jZmctPm51bWJlcl9lbmRwb2ludHMgLSAxLCBWVFlfTkVXTElORSk7CisJZm9yIChpID0gMTsgaSA8IGdfY2ZnLT5udW1iZXJfZW5kcG9pbnRzOyArK2kpIHsKKwkJc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHAgPSAmZ19jZmctPmVuZHBvaW50c1tpXTsKKwkJdnR5X291dCh2dHksICIgRW5kcG9pbnQgMHglLjJ4OiBDSTogJWQgbmV0OiAldS8ldSBidHM6ICV1LyV1JXMiLAorCQkJaSwgZW5kcC0+Y2ksCisJCQludG9ocyhlbmRwLT5uZXRfcnRwKSwgbnRvaHMoZW5kcC0+bmV0X3J0Y3ApLAorCQkJbnRvaHMoZW5kcC0+YnRzX3J0cCksIG50b2hzKGVuZHAtPmJ0c19ydGNwKSwgVlRZX05FV0xJTkUpOworCX0KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3AsCisgICAgICBjZmdfbWdjcF9jbWQsCisgICAgICAibWdjcCIsCisgICAgICAiQ29uZmlndXJlIHRoZSBNR0NQIikKK3sKKwl2dHktPm5vZGUgPSBNR0NQX05PREU7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcF9sb2NhbF9pcCwKKyAgICAgIGNmZ19tZ2NwX2xvY2FsX2lwX2NtZCwKKyAgICAgICJsb2NhbCBpcCBJUCIsCisgICAgICAiU2V0IHRoZSBJUCB0byBiZSB1c2VkIGluIFNEUCByZWNvcmRzIikKK3sKKwlpZiAoZ19jZmctPmxvY2FsX2lwKQorCQl0YWxsb2NfZnJlZShnX2NmZy0+bG9jYWxfaXApOworCWdfY2ZnLT5sb2NhbF9pcCA9IHRhbGxvY19zdHJkdXAoZ19jZmcsIGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3BfYnRzX2lwLAorICAgICAgY2ZnX21nY3BfYnRzX2lwX2NtZCwKKyAgICAgICJidHMgaXAgSVAiLAorICAgICAgIlNldCB0aGUgSVAgb2YgdGhlIEJUUyBmb3IgUlRQIGZvcndhcmRpbmciKQoreworCWlmIChnX2NmZy0+YnRzX2lwKQorCQl0YWxsb2NfZnJlZShnX2NmZy0+YnRzX2lwKTsKKwlnX2NmZy0+YnRzX2lwID0gdGFsbG9jX3N0cmR1cChnX2NmZywgYXJndlswXSk7CisJaW5ldF9hdG9uKGdfY2ZnLT5idHNfaXAsICZnX2NmZy0+YnRzX2luKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX2JpbmRfaXAsCisgICAgICBjZmdfbWdjcF9iaW5kX2lwX2NtZCwKKyAgICAgICJiaW5kIGlwIElQIiwKKyAgICAgICJCaW5kIHRoZSBNR0NQIHRvIHRoaXMgbG9jYWwgYWRkciIpCit7CisJaWYgKGdfY2ZnLT5zb3VyY2VfYWRkcikKKwkJdGFsbG9jX2ZyZWUoZ19jZmctPnNvdXJjZV9hZGRyKTsKKwlnX2NmZy0+c291cmNlX2FkZHIgPSB0YWxsb2Nfc3RyZHVwKGdfY2ZnLCBhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX2JpbmRfcG9ydCwKKyAgICAgIGNmZ19tZ2NwX2JpbmRfcG9ydF9jbWQsCisgICAgICAiYmluZCBwb3J0IDwwLTY1NTM0PiIsCisgICAgICAiQmluZCB0aGUgTUdDUCB0byB0aGlzIHBvcnQiKQoreworCXVuc2lnbmVkIGludCBwb3J0ID0gYXRvaShhcmd2WzBdKTsKKwlpZiAocG9ydCA+IDY1NTM0KSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgd3JvbmcgYmluZCBwb3J0ICclcyclcyIsIGFyZ3ZbMF0sIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWdfY2ZnLT5zb3VyY2VfcG9ydCA9IHBvcnQ7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcF9iaW5kX2Vhcmx5LAorICAgICAgY2ZnX21nY3BfYmluZF9lYXJseV9jbWQsCisgICAgICAiYmluZCBlYXJseSAoMHwxKSIsCisgICAgICAiQmluZCBhbGwgUlRQIHBvcnRzIGVhcmx5IikKK3sKKwl1bnNpZ25lZCBpbnQgYmluZCA9IGF0b2koYXJndlswXSk7CisJaWYgKGJpbmQgIT0gMCAmJiBiaW5kICE9IDEpIHsKKwkJdnR5X291dCh2dHksICIlJSBwYXJhbSBtdXN0IGJlIDAgb3IgMS4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWdfY2ZnLT5lYXJseV9iaW5kID0gYmluZCA9PSAxOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3BfcnRwX2Jhc2VfcG9ydCwKKyAgICAgIGNmZ19tZ2NwX3J0cF9iYXNlX3BvcnRfY21kLAorICAgICAgInJ0cCBiYXNlIDwwLTY1NTM0PiIsCisgICAgICAiQmFzZSBwb3J0IHRvIHVzZSIpCit7CisJdW5zaWduZWQgaW50IHBvcnQgPSBhdG9pKGFyZ3ZbMF0pOworCWlmIChwb3J0ID4gNjU1MzQpIHsKKwkJdnR5X291dCh2dHksICIlJSB3cm9uZyBiYXNlIHBvcnQgJyVzJyVzIiwgYXJndlswXSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJZ19jZmctPnJ0cF9iYXNlX3BvcnQgPSBwb3J0OworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3Bfc2RwX3BheWxvYWRfbnVtYmVyLAorICAgICAgY2ZnX21nY3Bfc2RwX3BheWxvYWRfbnVtYmVyX2NtZCwKKyAgICAgICJzZHAgYXVkaW8gcGF5bG9hZCBudW1iZXIgPDEtMjU1PiIsCisgICAgICAiU2V0IHRoZSBhdWRpbyBjb2RlYyB0byB1c2UiKQoreworCXVuc2lnbmVkIGludCBwYXlsb2FkID0gYXRvaShhcmd2WzBdKTsKKwlpZiAocGF5bG9hZCA+IDI1NSkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIHdyb25nIHBheWxvYWQgbnVtYmVyICclcyclcyIsIGFyZ3ZbMF0sIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWdfY2ZnLT5hdWRpb19wYXlsb2FkID0gcGF5bG9hZDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX3NkcF9wYXlsb2FkX25hbWUsCisgICAgICBjZmdfbWdjcF9zZHBfcGF5bG9hZF9uYW1lX2NtZCwKKyAgICAgICJzZHAgYXVkaW8gcGF5bG9hZCBuYW1lIE5BTUUiLAorICAgICAgIlNldCB0aGUgYXVkaW8gbmFtZSB0byB1c2UiKQoreworCWlmIChnX2NmZy0+YXVkaW9fbmFtZSkKKwkJdGFsbG9jX2ZyZWUoZ19jZmctPmF1ZGlvX25hbWUpOworCWdfY2ZnLT5hdWRpb19uYW1lID0gdGFsbG9jX3N0cmR1cChnX2NmZywgYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbWdjcF9sb29wLAorICAgICAgY2ZnX21nY3BfbG9vcF9jbWQsCisgICAgICAibG9vcCAoMHwxKSIsCisgICAgICAiTG9vcCB0aGUgYXVkaW8iKQoreworCWdfY2ZnLT5hdWRpb19sb29wID0gYXRvaShhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX251bWJlcl9lbmRwLAorICAgICAgY2ZnX21nY3BfbnVtYmVyX2VuZHBfY21kLAorICAgICAgIm51bWJlciBlbmRwb2ludHMgPDAtNjU1MzQ+IiwKKyAgICAgICJUaGUgbnVtYmVyIG9mIGVuZHBvaW50cyB0byBhbGxvY2F0ZS4gVGhpcyBpcyBub3QgZHluYW1pYy4iKQoreworCS8qICsgMSBhcyB3ZSBzdGFydCBjb3VudGluZyBhdCBvbmUgKi8KKwlnX2NmZy0+bnVtYmVyX2VuZHBvaW50cyA9IGF0b2koYXJndlswXSkgKyAxOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX21nY3BfZm9yd2FyZF9pcCwKKyAgICAgIGNmZ19tZ2NwX2ZvcndhcmRfaXBfY21kLAorICAgICAgImZvcndhcmQgYXVkaW8gaXAgSVAiLAorICAgICAgIkZvcndhcmQgcGFja2V0cyBmcm9tIGFuZCB0byB0aGUgSVAuIFRoaXMgZGlzYWJsZXMgbW9zdCBvZiB0aGUgTUdDUCBmZWF0dXJlLiIpCit7CisJaWYgKGdfY2ZnLT5mb3J3YXJkX2lwKQorCQl0YWxsb2NfZnJlZShnX2NmZy0+Zm9yd2FyZF9pcCk7CisJZ19jZmctPmZvcndhcmRfaXAgPSB0YWxsb2Nfc3RyZHVwKGdfY2ZnLCBhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19tZ2NwX2ZvcndhcmRfcG9ydCwKKyAgICAgIGNmZ19tZ2NwX2ZvcndhcmRfcG9ydF9jbWQsCisgICAgICAiZm9yd2FyZCBhdWRpbyBwb3J0IDwxLTE1MDAwPiIsCisgICAgICAiRm9yd2FyZCBwYWNrZXRzIGZyb20gYW5kIHRvIHRoZSBwb3J0LiBUaGlzIGRpc2FibGVzIG1vc3Qgb2YgdGhlIE1HQ1AgZmVhdHVyZS4iKQoreworCWdfY2ZnLT5mb3J3YXJkX3BvcnQgPSBhdG9pKGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworaW50IG1nY3BfdnR5X2luaXQodm9pZCkKK3sKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc2hvd19tZ2NwX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZjZmdfbWdjcF9jbWQpOworCWluc3RhbGxfbm9kZSgmbWdjcF9ub2RlLCBjb25maWdfd3JpdGVfbWdjcCk7CisJaW5zdGFsbF9kZWZhdWx0KE1HQ1BfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX2xvY2FsX2lwX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX2J0c19pcF9jbWQpOworCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZjZmdfbWdjcF9iaW5kX2lwX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX2JpbmRfcG9ydF9jbWQpOworCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZjZmdfbWdjcF9iaW5kX2Vhcmx5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX3J0cF9iYXNlX3BvcnRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3Bfc2RwX3BheWxvYWRfbnVtYmVyX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX3NkcF9wYXlsb2FkX25hbWVfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoTUdDUF9OT0RFLCAmY2ZnX21nY3BfbG9vcF9jbWQpOworCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZjZmdfbWdjcF9udW1iZXJfZW5kcF9jbWQpOworCWluc3RhbGxfZWxlbWVudChNR0NQX05PREUsICZjZmdfbWdjcF9mb3J3YXJkX2lwX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KE1HQ1BfTk9ERSwgJmNmZ19tZ2NwX2ZvcndhcmRfcG9ydF9jbWQpOworCXJldHVybiAwOworfQorCitpbnQgbWdjcF9wYXJzZV9jb25maWcoY29uc3QgY2hhciAqY29uZmlnX2ZpbGUsIHN0cnVjdCBtZ2NwX2NvbmZpZyAqY2ZnKQoreworCWludCBpLCByYzsKKworCWdfY2ZnID0gY2ZnOworCXJjID0gdnR5X3JlYWRfY29uZmlnX2ZpbGUoY29uZmlnX2ZpbGUpOworCWlmIChyYyA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gcGFyc2UgdGhlIGNvbmZpZyBmaWxlOiAnJXMnXG4iLCBjb25maWdfZmlsZSk7CisJCXJldHVybiByYzsKKwl9CisKKworCWlmICghZ19jZmctPmJ0c19pcCkKKwkJZnByaW50ZihzdGRlcnIsICJObyBCVFMgaXAgYWRkcmVzcyBzcGVjaWZpZWQuIFRoaXMgd2lsbCBhbGxvdyBldmVyeW9uZSB0byBjb25uZWN0LlxuIik7CisKKwlpZiAobWdjcF9lbmRwb2ludHNfYWxsb2NhdGUoZ19jZmcpICE9IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJGYWlsZWQgdG8gYWxsb2NhdGUgZW5kcG9pbnRzOiAlZC4gUXVpdHRpbmcuXG4iLCBnX2NmZy0+bnVtYmVyX2VuZHBvaW50cyk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIFRoaXMgYXBwbGljYXRpb24gc3VwcG9ydHMgdHdvIG1vZGVzLgorICAgICAgICAgKiAgICAxLikgYSB0cnVlIE1HQ1AgZ2F0ZXdheSB3aXRoIHN1cHBvcnQgZm9yIEFVRVAsIENSQ1gsIE1EQ1gsIERMQ1gKKyAgICAgICAgICogICAgMi4pIHBsYWluIGZvcndhcmRpbmcgb2YgUlRQIHBhY2tldHMgb24gdGhlIGVuZHBvaW50cy4KKwkgKiBib3RoIG1vZGVzIGFyZSBtdXR1YWwgZXhjbHVzaXZlCisJICovCisJaWYgKGdfY2ZnLT5mb3J3YXJkX2lwKSB7CisJCWludCBwb3J0ID0gZ19jZmctPnJ0cF9iYXNlX3BvcnQ7CisJCWlmIChnX2NmZy0+Zm9yd2FyZF9wb3J0ICE9IDApCisJCQlwb3J0ID0gZ19jZmctPmZvcndhcmRfcG9ydDsKKworCQlpZiAoIWdfY2ZnLT5lYXJseV9iaW5kKSB7CisJCQlMT0dQKERNR0NQLCBMT0dMX05PVElDRSwgIkZvcndhcmRpbmcgcmVxdWlyZXMgZWFybHkgYmluZC5cbiIpOworCQkJcmV0dXJuIC0xOworCQl9CisKKwkJLyoKKwkJICogU3RvcmUgdGhlIGZvcndhcmQgSVAgYW5kIGFzc2lnbiBhIGNpLiBGb3IgZWFybHkgYmluZAorCQkgKiB0aGUgc29ja2V0cyB3aWxsIGJlIGNyZWF0ZWQgYWZ0ZXIgdGhpcy4KKwkJICovCisJCWZvciAoaSA9IDE7IGkgPCBnX2NmZy0+bnVtYmVyX2VuZHBvaW50czsgKytpKSB7CisJCQlzdHJ1Y3QgbWdjcF9lbmRwb2ludCAqZW5kcCA9ICZnX2NmZy0+ZW5kcG9pbnRzW2ldOworCQkJaW5ldF9hdG9uKGdfY2ZnLT5mb3J3YXJkX2lwLCAmZW5kcC0+cmVtb3RlKTsKKwkJCWVuZHAtPmNpID0gQ0lfVU5VU0VEICsgMjM7CisJCQllbmRwLT5uZXRfcnRwID0gaHRvbnMocnRwX2NhbGN1bGF0ZV9wb3J0KEVORFBPSU5UX05VTUJFUihlbmRwKSwgcG9ydCkpOworCQkJZW5kcC0+bmV0X3J0Y3AgPSBodG9ucyhydHBfY2FsY3VsYXRlX3BvcnQoRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBwb3J0KSArIDEpOworCQl9CisKKwkJTE9HUChETUdDUCwgTE9HTF9OT1RJQ0UsICJDb25maWd1cmVkIGZvciBBdWRpbyBGb3J3YXJkaW5nLlxuIik7CisJfQorCisJLyogZWFybHkgYmluZCAqLworCWlmIChnX2NmZy0+ZWFybHlfYmluZCkgeworCQlmb3IgKGkgPSAxOyBpIDwgZ19jZmctPm51bWJlcl9lbmRwb2ludHM7ICsraSkgeworCQkJc3RydWN0IG1nY3BfZW5kcG9pbnQgKmVuZHAgPSAmZ19jZmctPmVuZHBvaW50c1tpXTsKKwkJCWludCBydHBfcG9ydDsKKworCQkJcnRwX3BvcnQgPSBydHBfY2FsY3VsYXRlX3BvcnQoRU5EUE9JTlRfTlVNQkVSKGVuZHApLCBnX2NmZy0+cnRwX2Jhc2VfcG9ydCk7CisJCQlpZiAobWdjcF9iaW5kX3J0cF9wb3J0KGVuZHAsIHJ0cF9wb3J0KSAhPSAwKSB7CisJCQkJTE9HUChETUdDUCwgTE9HTF9GQVRBTCwgIkZhaWxlZCB0byBiaW5kOiAlZFxuIiwgcnRwX3BvcnQpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiAhIWdfY2ZnLT5mb3J3YXJkX2lwOworfQorCitzdHJ1Y3QgZ3NtX25ldHdvcms7CitpbnQgYnNjX3Z0eV9pbml0KHN0cnVjdCBnc21fbmV0d29yayAqZHVtbXkpCit7CisJY21kX2luaXQoMSk7CisJdnR5X2luaXQoKTsKKworICAgICAgICBtZ2NwX3Z0eV9pbml0KCk7CisJcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL21uY2MuYyBiL29wZW5ic2Mvc3JjL21uY2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMWQ1OWFhCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvbW5jYy5jCkBAIC0wLDAgKzEsNDY4IEBACisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOSBieSBBbmRyZWFzIEV2ZXJzYmVyZyA8QW5kcmVhcy5FdmVyc2JlcmdAdmVyc2F0ZWwuZGU+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tbmNjLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhbnNhY3Rpb24uaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3J0cF9wcm94eS5oPgorCit2b2lkICp0YWxsX2NhbGxfY3R4OworCitzdGF0aWMgc3RydWN0IG1uY2NfbmFtZXMgeworCWNoYXIgKm5hbWU7CisJaW50IHZhbHVlOworfSBtbmNjX25hbWVzW10gPSB7CisJeyJNTkNDX1NFVFVQX1JFUSIsCTB4MDEwMX0sCisJeyJNTkNDX1NFVFVQX0lORCIsCTB4MDEwMn0sCisJeyJNTkNDX1NFVFVQX1JTUCIsCTB4MDEwM30sCisJeyJNTkNDX1NFVFVQX0NORiIsCTB4MDEwNH0sCisJeyJNTkNDX1NFVFVQX0NPTVBMX1JFUSIsMHgwMTA1fSwKKwl7Ik1OQ0NfU0VUVVBfQ09NUExfSU5EIiwweDAxMDZ9LAorCXsiTU5DQ19DQUxMX0NPTkZfSU5EIiwJMHgwMTA3fSwKKwl7Ik1OQ0NfQ0FMTF9QUk9DX1JFUSIsCTB4MDEwOH0sCisJeyJNTkNDX1BST0dSRVNTX1JFUSIsCTB4MDEwOX0sCisJeyJNTkNDX0FMRVJUX1JFUSIsCTB4MDEwYX0sCisJeyJNTkNDX0FMRVJUX0lORCIsCTB4MDEwYn0sCisJeyJNTkNDX05PVElGWV9SRVEiLAkweDAxMGN9LAorCXsiTU5DQ19OT1RJRllfSU5EIiwJMHgwMTBkfSwKKwl7Ik1OQ0NfRElTQ19SRVEiLAkweDAxMGV9LAorCXsiTU5DQ19ESVNDX0lORCIsCTB4MDEwZn0sCisJeyJNTkNDX1JFTF9SRVEiLAkweDAxMTB9LAorCXsiTU5DQ19SRUxfSU5EIiwJMHgwMTExfSwKKwl7Ik1OQ0NfUkVMX0NORiIsCTB4MDExMn0sCisJeyJNTkNDX0ZBQ0lMSVRZX1JFUSIsCTB4MDExM30sCisJeyJNTkNDX0ZBQ0lMSVRZX0lORCIsCTB4MDExNH0sCisJeyJNTkNDX1NUQVJUX0RUTUZfSU5EIiwJMHgwMTE1fSwKKwl7Ik1OQ0NfU1RBUlRfRFRNRl9SU1AiLAkweDAxMTZ9LAorCXsiTU5DQ19TVEFSVF9EVE1GX1JFSiIsCTB4MDExN30sCisJeyJNTkNDX1NUT1BfRFRNRl9JTkQiLAkweDAxMTh9LAorCXsiTU5DQ19TVE9QX0RUTUZfUlNQIiwJMHgwMTE5fSwKKwl7Ik1OQ0NfTU9ESUZZX1JFUSIsCTB4MDExYX0sCisJeyJNTkNDX01PRElGWV9JTkQiLAkweDAxMWJ9LAorCXsiTU5DQ19NT0RJRllfUlNQIiwJMHgwMTFjfSwKKwl7Ik1OQ0NfTU9ESUZZX0NORiIsCTB4MDExZH0sCisJeyJNTkNDX01PRElGWV9SRUoiLAkweDAxMWV9LAorCXsiTU5DQ19IT0xEX0lORCIsCTB4MDExZn0sCisJeyJNTkNDX0hPTERfQ05GIiwJMHgwMTIwfSwKKwl7Ik1OQ0NfSE9MRF9SRUoiLAkweDAxMjF9LAorCXsiTU5DQ19SRVRSSUVWRV9JTkQiLAkweDAxMjJ9LAorCXsiTU5DQ19SRVRSSUVWRV9DTkYiLAkweDAxMjN9LAorCXsiTU5DQ19SRVRSSUVWRV9SRUoiLAkweDAxMjR9LAorCXsiTU5DQ19VU0VSSU5GT19SRVEiLAkweDAxMjV9LAorCXsiTU5DQ19VU0VSSU5GT19JTkQiLAkweDAxMjZ9LAorCXsiTU5DQ19SRUpfUkVRIiwJMHgwMTI3fSwKKwl7Ik1OQ0NfUkVKX0lORCIsCTB4MDEyOH0sCisKKwl7Ik1OQ0NfQlJJREdFIiwJCTB4MDIwMH0sCisJeyJNTkNDX0ZSQU1FX1JFQ1YiLAkweDAyMDF9LAorCXsiTU5DQ19GUkFNRV9EUk9QIiwJMHgwMjAyfSwKKwl7Ik1OQ0NfTENIQU5fTU9ESUZZIiwJMHgwMjAzfSwKKworCXsiR1NNX1RDSF9GUkFNRSIsCTB4MDMwMH0sCisKKwl7TlVMTCwgMH0gfTsKKworc3RhdGljIExMSVNUX0hFQUQoY2FsbF9saXN0KTsKKworc3RhdGljIHVfaW50MzJfdCBuZXdfY2FsbHJlZiA9IDB4MDAwMDAwMDE7CisKK2NoYXIgKmdldF9tbmNjX25hbWUoaW50IHZhbHVlKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgbW5jY19uYW1lc1tpXS5uYW1lOyBpKyspIHsKKwkJaWYgKG1uY2NfbmFtZXNbaV0udmFsdWUgPT0gdmFsdWUpCisJCQlyZXR1cm4gbW5jY19uYW1lc1tpXS5uYW1lOworCX0KKworCXJldHVybiAiTU5DQ19Vbmtub3duIjsKK30KKworc3RhdGljIHZvaWQgZnJlZV9jYWxsKHN0cnVjdCBnc21fY2FsbCAqY2FsbCkKK3sKKwlsbGlzdF9kZWwoJmNhbGwtPmVudHJ5KTsKKwlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgQ2FsbCByZW1vdmVkLlxuIiwgY2FsbC0+Y2FsbHJlZik7CisJdGFsbG9jX2ZyZWUoY2FsbCk7Cit9CisKKworc3RydWN0IGdzbV9jYWxsICpnZXRfY2FsbF9yZWYodV9pbnQzMl90IGNhbGxyZWYpCit7CisJc3RydWN0IGdzbV9jYWxsICpjYWxsdDsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhbGx0LCAmY2FsbF9saXN0LCBlbnRyeSkgeworCQlpZiAoY2FsbHQtPmNhbGxyZWYgPT0gY2FsbHJlZikKKwkJCXJldHVybiBjYWxsdDsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKK3ZvaWQgbW5jY19zZXRfY2F1c2Uoc3RydWN0IGdzbV9tbmNjICpkYXRhLCBpbnQgbG9jLCBpbnQgdmFsKQoreworCWRhdGEtPmZpZWxkcyB8PSBNTkNDX0ZfQ0FVU0U7CisJZGF0YS0+Y2F1c2UubG9jYXRpb24gPSBsb2M7CisJZGF0YS0+Y2F1c2UudmFsdWUgPSB2YWw7Cit9CisKKy8qIG9uIGluY29taW5nIGNhbGwsIGxvb2sgdXAgZGF0YWJhc2UgYW5kIHNlbmQgc2V0dXAgdG8gcmVtb3RlIHN1YnNjci4gKi8KK3N0YXRpYyBpbnQgbW5jY19zZXR1cF9pbmQoc3RydWN0IGdzbV9jYWxsICpjYWxsLCBpbnQgbXNnX3R5cGUsCisJCQkgIHN0cnVjdCBnc21fbW5jYyAqc2V0dXApCit7CisJc3RydWN0IGdzbV9tbmNjIG1uY2M7CisJc3RydWN0IGdzbV9jYWxsICpyZW1vdGU7CisKKwltZW1zZXQoJm1uY2MsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwltbmNjLmNhbGxyZWYgPSBjYWxsLT5jYWxscmVmOworCisJLyogYWxyZWFkeSBoYXZlIHJlbW90ZSBjYWxsICovCisJaWYgKGNhbGwtPnJlbW90ZV9yZWYpCisJCXJldHVybiAwOworCQorCS8qIHRyYW5zZmVyIG1vZGUgMSB3b3VsZCBiZSBwYWNrZXQgbW9kZSwgd2hpY2ggd2FzIG5ldmVyIHNwZWNpZmllZCAqLworCWlmIChzZXR1cC0+YmVhcmVyX2NhcC5tb2RlICE9IDApIHsKKwkJTE9HUChETU5DQywgTE9HTF9OT1RJQ0UsICIoY2FsbCAleCkgV2UgZG9uJ3Qgc3VwcG9ydCAiCisJCQkicGFja2V0IG1vZGVcbiIsIGNhbGwtPmNhbGxyZWYpOworCQltbmNjX3NldF9jYXVzZSgmbW5jYywgR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCQkJCUdTTTQ4X0NDX0NBVVNFX0JFQVJFUl9DQV9VTkFWQUlMKTsKKwkJZ290byBvdXRfcmVqZWN0OworCX0KKworCS8qIHdlIGN1cnJlbnRseSBvbmx5IGRvIHNwZWVjaCAqLworCWlmIChzZXR1cC0+YmVhcmVyX2NhcC50cmFuc2ZlciAhPSBHU01fTU5DQ19CQ0FQX1NQRUVDSCkgeworCQlMT0dQKERNTkNDLCBMT0dMX05PVElDRSwgIihjYWxsICV4KSBXZSBvbmx5IHN1cHBvcnQgIgorCQkJInZvaWNlIGNhbGxzXG4iLCBjYWxsLT5jYWxscmVmKTsKKwkJbW5jY19zZXRfY2F1c2UoJm1uY2MsIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQlHU000OF9DQ19DQVVTRV9CRUFSRVJfQ0FfVU5BVkFJTCk7CisJCWdvdG8gb3V0X3JlamVjdDsKKwl9CisKKwkvKiBjcmVhdGUgcmVtb3RlIGNhbGwgKi8KKwlpZiAoIShyZW1vdGUgPSB0YWxsb2ModGFsbF9jYWxsX2N0eCwgc3RydWN0IGdzbV9jYWxsKSkpIHsKKwkJbW5jY19zZXRfY2F1c2UoJm1uY2MsIEdTTTQ4X0NBVVNFX0xPQ19QUk5fU19MVSwKKwkJCQlHU000OF9DQ19DQVVTRV9SRVNPVVJDRV9VTkFWQUlMKTsKKwkJZ290byBvdXRfcmVqZWN0OworCX0KKwlsbGlzdF9hZGRfdGFpbCgmcmVtb3RlLT5lbnRyeSwgJmNhbGxfbGlzdCk7CisJcmVtb3RlLT5uZXQgPSBjYWxsLT5uZXQ7CisJcmVtb3RlLT5jYWxscmVmID0gbmV3X2NhbGxyZWYrKzsKKwlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgQ3JlYXRpbmcgbmV3IHJlbW90ZSBpbnN0YW5jZSAleC5cbiIsCisJCWNhbGwtPmNhbGxyZWYsIHJlbW90ZS0+Y2FsbHJlZik7CisKKwkvKiBsaW5rIHJlbW90ZSBjYWxsICovCisJY2FsbC0+cmVtb3RlX3JlZiA9IHJlbW90ZS0+Y2FsbHJlZjsKKwlyZW1vdGUtPnJlbW90ZV9yZWYgPSBjYWxsLT5jYWxscmVmOworCisJLyogbW9kaWZ5IG1vZGUgKi8KKwltZW1zZXQoJm1uY2MsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwltbmNjLmNhbGxyZWYgPSBjYWxsLT5jYWxscmVmOworCW1uY2MubGNoYW5fbW9kZSA9IEdTTTQ4X0NNT0RFX1NQRUVDSF9FRlI7CisJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIE1vZGlmeSBjaGFubmVsIG1vZGUuXG4iLCBjYWxsLT5jYWxscmVmKTsKKwltbmNjX3NlbmQoY2FsbC0+bmV0LCBNTkNDX0xDSEFOX01PRElGWSwgJm1uY2MpOworCisJLyogc2VuZCBjYWxsIHByb2NlZWRpbmcgKi8KKwltZW1zZXQoJm1uY2MsIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwltbmNjLmNhbGxyZWYgPSBjYWxsLT5jYWxscmVmOworCURFQlVHUChETU5DQywgIihjYWxsICV4KSBBY2NlcHRpbmcgY2FsbC5cbiIsIGNhbGwtPmNhbGxyZWYpOworCW1uY2Nfc2VuZChjYWxsLT5uZXQsIE1OQ0NfQ0FMTF9QUk9DX1JFUSwgJm1uY2MpOworCisJLyogc2VuZCBzZXR1cCB0byByZW1vdGUgKi8KKy8vCXNldHVwLT5maWVsZHMgfD0gTU5DQ19GX1NJR05BTDsKKy8vCXNldHVwLT5zaWduYWwgPSBHU000OF9TSUdOQUxfRElBTFRPTkU7CisJc2V0dXAtPmNhbGxyZWYgPSByZW1vdGUtPmNhbGxyZWY7CisJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIEZvcndhcmRpbmcgU0VUVVAgdG8gcmVtb3RlLlxuIiwgY2FsbC0+Y2FsbHJlZik7CisJcmV0dXJuIG1uY2Nfc2VuZChyZW1vdGUtPm5ldCwgTU5DQ19TRVRVUF9SRVEsIHNldHVwKTsKKworb3V0X3JlamVjdDoKKwltbmNjX3NlbmQoY2FsbC0+bmV0LCBNTkNDX1JFSl9SRVEsICZtbmNjKTsKKwlmcmVlX2NhbGwoY2FsbCk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW5jY19hbGVydF9pbmQoc3RydWN0IGdzbV9jYWxsICpjYWxsLCBpbnQgbXNnX3R5cGUsCisJCQkgIHN0cnVjdCBnc21fbW5jYyAqYWxlcnQpCit7CisJc3RydWN0IGdzbV9jYWxsICpyZW1vdGU7CisKKwkvKiBzZW5kIGFsZXJ0aW5nIHRvIHJlbW90ZSAqLworCWlmICghKHJlbW90ZSA9IGdldF9jYWxsX3JlZihjYWxsLT5yZW1vdGVfcmVmKSkpCisJCXJldHVybiAwOworCWFsZXJ0LT5jYWxscmVmID0gcmVtb3RlLT5jYWxscmVmOworCURFQlVHUChETU5DQywgIihjYWxsICV4KSBGb3J3YXJkaW5nIEFMRVJUIHRvIHJlbW90ZS5cbiIsIGNhbGwtPmNhbGxyZWYpOworCXJldHVybiBtbmNjX3NlbmQocmVtb3RlLT5uZXQsIE1OQ0NfQUxFUlRfUkVRLCBhbGVydCk7Cit9CisKK3N0YXRpYyBpbnQgbW5jY19ub3RpZnlfaW5kKHN0cnVjdCBnc21fY2FsbCAqY2FsbCwgaW50IG1zZ190eXBlLAorCQkJICAgc3RydWN0IGdzbV9tbmNjICpub3RpZnkpCit7CisJc3RydWN0IGdzbV9jYWxsICpyZW1vdGU7CisKKwkvKiBzZW5kIG5vdGlmeSB0byByZW1vdGUgKi8KKwlpZiAoIShyZW1vdGUgPSBnZXRfY2FsbF9yZWYoY2FsbC0+cmVtb3RlX3JlZikpKQorCQlyZXR1cm4gMDsKKwlub3RpZnktPmNhbGxyZWYgPSByZW1vdGUtPmNhbGxyZWY7CisJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIEZvcndhcmRpbmcgTk9USUYgdG8gcmVtb3RlLlxuIiwgY2FsbC0+Y2FsbHJlZik7CisJcmV0dXJuIG1uY2Nfc2VuZChyZW1vdGUtPm5ldCwgTU5DQ19OT1RJRllfUkVRLCBub3RpZnkpOworfQorCitzdGF0aWMgaW50IG1uY2Nfc2V0dXBfY25mKHN0cnVjdCBnc21fY2FsbCAqY2FsbCwgaW50IG1zZ190eXBlLAorCQkJICBzdHJ1Y3QgZ3NtX21uY2MgKmNvbm5lY3QpCit7CisJc3RydWN0IGdzbV9tbmNjIGNvbm5lY3RfYWNrLCBmcmFtZV9yZWN2OworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gY2FsbC0+bmV0OworCXN0cnVjdCBnc21fY2FsbCAqcmVtb3RlOworCXVfaW50MzJfdCByZWZzWzJdOworCisJLyogYWNrbm93bGVkZ2UgY29ubmVjdCAqLworCW1lbXNldCgmY29ubmVjdF9hY2ssIDAsIHNpemVvZihzdHJ1Y3QgZ3NtX21uY2MpKTsKKwljb25uZWN0X2Fjay5jYWxscmVmID0gY2FsbC0+Y2FsbHJlZjsKKwlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgQWNrbm93bGVkZ2UgU0VUVVAuXG4iLCBjYWxsLT5jYWxscmVmKTsKKwltbmNjX3NlbmQoY2FsbC0+bmV0LCBNTkNDX1NFVFVQX0NPTVBMX1JFUSwgJmNvbm5lY3RfYWNrKTsKKworCS8qIHNlbmQgY29ubmVjdCBtZXNzYWdlIHRvIHJlbW90ZSAqLworCWlmICghKHJlbW90ZSA9IGdldF9jYWxsX3JlZihjYWxsLT5yZW1vdGVfcmVmKSkpCisJCXJldHVybiAwOworCWNvbm5lY3QtPmNhbGxyZWYgPSByZW1vdGUtPmNhbGxyZWY7CisJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIFNlbmRpbmcgQ09OTkVDVCB0byByZW1vdGUuXG4iLCBjYWxsLT5jYWxscmVmKTsKKwltbmNjX3NlbmQocmVtb3RlLT5uZXQsIE1OQ0NfU0VUVVBfUlNQLCBjb25uZWN0KTsKKworCS8qIGJyaWRnZSB0Y2ggKi8KKwlyZWZzWzBdID0gY2FsbC0+Y2FsbHJlZjsKKwlyZWZzWzFdID0gY2FsbC0+cmVtb3RlX3JlZjsKKwlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgQnJpZGdpbmcgd2l0aCByZW1vdGUuXG4iLCBjYWxsLT5jYWxscmVmKTsKKworCS8qIGluIGRpcmVjdCBtb2RlLCB3ZSBhbHdheXMgaGF2ZSB0byBicmlkZ2UgdGhlIGNoYW5uZWxzICovCisJaWYgKGlwYWNjX3J0cF9kaXJlY3QpCisJCXJldHVybiBtbmNjX3NlbmQoY2FsbC0+bmV0LCBNTkNDX0JSSURHRSwgcmVmcyk7CisKKwkvKiBwcm94eSBtb2RlICovCisJaWYgKCFuZXQtPmhhbmRvdmVyLmFjdGl2ZSkgeworCQkvKiBpbiB0aGUgbm8taGFuZG92ZXIgY2FzZSwgd2UgY2FuIGJyaWRnZSwgaS5lLiB1c2UKKwkJICogdGhlIG9sZCBSVFAgcHJveHkgY29kZSAqLworCQlyZXR1cm4gbW5jY19zZW5kKGNhbGwtPm5ldCwgTU5DQ19CUklER0UsIHJlZnMpOworCX0gZWxzZSB7CisJCS8qIGluIGNhc2Ugb2YgaGFuZG92ZXIsIHdlIG5lZWQgdG8gcmUtd3JpdGUgdGhlIFJUUAorCQkgKiBTU1JDLCBzZXF1ZW5jZSBhbmQgdGltZXN0YW1wIHZhbHVlcyBhbmQgdGh1cworCQkgKiBuZWVkIHRvIGVuYWJsZSBSVFAgcmVjZWl2ZSBmb3IgYm90aCBkaXJlY3Rpb25zICovCisJCW1lbXNldCgmZnJhbWVfcmVjdiwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCQlmcmFtZV9yZWN2LmNhbGxyZWYgPSBjYWxsLT5jYWxscmVmOworCQltbmNjX3NlbmQoY2FsbC0+bmV0LCBNTkNDX0ZSQU1FX1JFQ1YsICZmcmFtZV9yZWN2KTsKKwkJZnJhbWVfcmVjdi5jYWxscmVmID0gY2FsbC0+cmVtb3RlX3JlZjsKKwkJcmV0dXJuIG1uY2Nfc2VuZChjYWxsLT5uZXQsIE1OQ0NfRlJBTUVfUkVDViwgJmZyYW1lX3JlY3YpOworCX0KK30KKworc3RhdGljIGludCBtbmNjX2Rpc2NfaW5kKHN0cnVjdCBnc21fY2FsbCAqY2FsbCwgaW50IG1zZ190eXBlLAorCQkJIHN0cnVjdCBnc21fbW5jYyAqZGlzYykKK3sKKwlzdHJ1Y3QgZ3NtX2NhbGwgKnJlbW90ZTsKKworCS8qIHNlbmQgcmVsZWFzZSAqLworCURFQlVHUChETU5DQywgIihjYWxsICV4KSBSZWxlYXNpbmcgY2FsbCB3aXRoIGNhdXNlICVkXG4iLAorCQljYWxsLT5jYWxscmVmLCBkaXNjLT5jYXVzZS52YWx1ZSk7CisJbW5jY19zZW5kKGNhbGwtPm5ldCwgTU5DQ19SRUxfUkVRLCBkaXNjKTsKKworCS8qIHNlbmQgZGlzYyB0byByZW1vdGUgKi8KKwlpZiAoIShyZW1vdGUgPSBnZXRfY2FsbF9yZWYoY2FsbC0+cmVtb3RlX3JlZikpKSB7CisJCXJldHVybiAwOworCX0KKwlkaXNjLT5jYWxscmVmID0gcmVtb3RlLT5jYWxscmVmOworCURFQlVHUChETU5DQywgIihjYWxsICV4KSBEaXNjb25uZWN0aW5nIHJlbW90ZSB3aXRoIGNhdXNlICVkXG4iLAorCQlyZW1vdGUtPmNhbGxyZWYsIGRpc2MtPmNhdXNlLnZhbHVlKTsKKwlyZXR1cm4gbW5jY19zZW5kKHJlbW90ZS0+bmV0LCBNTkNDX0RJU0NfUkVRLCBkaXNjKTsKK30KKworc3RhdGljIGludCBtbmNjX3JlbF9pbmQoc3RydWN0IGdzbV9jYWxsICpjYWxsLCBpbnQgbXNnX3R5cGUsIHN0cnVjdCBnc21fbW5jYyAqcmVsKQoreworCXN0cnVjdCBnc21fY2FsbCAqcmVtb3RlOworCisJLyogc2VuZCByZWxlYXNlIHRvIHJlbW90ZSAqLworCWlmICghKHJlbW90ZSA9IGdldF9jYWxsX3JlZihjYWxsLT5yZW1vdGVfcmVmKSkpIHsKKwkJZnJlZV9jYWxsKGNhbGwpOworCQlyZXR1cm4gMDsKKwl9CisJcmVsLT5jYWxscmVmID0gcmVtb3RlLT5jYWxscmVmOworCURFQlVHUChETU5DQywgIihjYWxsICV4KSBSZWxlYXNpbmcgcmVtb3RlIHdpdGggY2F1c2UgJWRcbiIsCisJCWNhbGwtPmNhbGxyZWYsIHJlbC0+Y2F1c2UudmFsdWUpOworCW1uY2Nfc2VuZChyZW1vdGUtPm5ldCwgTU5DQ19SRUxfUkVRLCByZWwpOworCisJZnJlZV9jYWxsKGNhbGwpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgbW5jY19yZWxfY25mKHN0cnVjdCBnc21fY2FsbCAqY2FsbCwgaW50IG1zZ190eXBlLCBzdHJ1Y3QgZ3NtX21uY2MgKnJlbCkKK3sKKwlmcmVlX2NhbGwoY2FsbCk7CisJcmV0dXJuIDA7Cit9CisKKy8qIHJlY2VpdmluZyBhIFRDSC9GIGZyYW1lIGZyb20gdGhlIEJTQyBjb2RlICovCitzdGF0aWMgaW50IG1uY2NfcmN2X3RjaGYoc3RydWN0IGdzbV9jYWxsICpjYWxsLCBpbnQgbXNnX3R5cGUsCisJCQkgc3RydWN0IGdzbV9kYXRhX2ZyYW1lICpkZnIpCit7CisJc3RydWN0IGdzbV90cmFucyAqcmVtb3RlX3RyYW5zOworCisJcmVtb3RlX3RyYW5zID0gdHJhbnNfZmluZF9ieV9jYWxscmVmKGNhbGwtPm5ldCwgY2FsbC0+cmVtb3RlX3JlZik7CisKKwkvKiB0aGlzIHNob3VsZG4ndCByZWFsbHkgaGFwcGVuICovCisJaWYgKCFyZW1vdGVfdHJhbnMgfHwgIXJlbW90ZV90cmFucy0+bGNoYW4pIHsKKwkJTE9HUChETU5DQywgTE9HTF9FUlJPUiwgIk5vIHRyYW5zYWN0aW9uIG9yIHRyYW5zYWN0aW9uIHdpdGhvdXQgbGNoYW4/IT9cbiIpOworCQlyZXR1cm4gLUVJTzsKKwl9CisKKwkvKiBSVFAgc29ja2V0IG9mIHJlbW90ZSBlbmQgaGFzIG1lYW53aGlsZSBkaWVkICovCisJaWYgKCFyZW1vdGVfdHJhbnMtPmxjaGFuLT5hYmlzX2lwLnJ0cF9zb2NrZXQpCisJCXJldHVybiAtRUlPOworCisJcmV0dXJuIHJ0cF9zZW5kX2ZyYW1lKHJlbW90ZV90cmFucy0+bGNoYW4tPmFiaXNfaXAucnRwX3NvY2tldCwgZGZyKTsKK30KKworCitpbnQgbW5jY19yZWN2KHN0cnVjdCBnc21fbmV0d29yayAqbmV0LCBpbnQgbXNnX3R5cGUsIHZvaWQgKmFyZykKK3sKKwlzdHJ1Y3QgZ3NtX21uY2MgKmRhdGEgPSBhcmc7CisJaW50IGNhbGxyZWY7CisJc3RydWN0IGdzbV9jYWxsICpjYWxsID0gTlVMTCwgKmNhbGx0OworCWludCByYyA9IDA7CisKKwkvKiBTcGVjaWFsIG1lc3NhZ2VzICovCisJc3dpdGNoKG1zZ190eXBlKSB7CisJfQorCQorCS8qIGZpbmQgY2FsbHJlZiAqLworCWNhbGxyZWYgPSBkYXRhLT5jYWxscmVmOworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGNhbGx0LCAmY2FsbF9saXN0LCBlbnRyeSkgeworCQlpZiAoY2FsbHQtPmNhbGxyZWYgPT0gY2FsbHJlZikgeworCQkJY2FsbCA9IGNhbGx0OworCQkJYnJlYWs7CisJCX0KKwl9CisKKwkvKiBjcmVhdGUgY2FsbHJlZiwgaWYgc2V0dXAgaXMgcmVjZWl2ZWQgKi8KKwlpZiAoIWNhbGwpIHsKKwkJaWYgKG1zZ190eXBlICE9IE1OQ0NfU0VUVVBfSU5EKQorCQkJcmV0dXJuIDA7IC8qIGRyb3AgKi8KKwkJLyogY3JlYXRlIGNhbGwgKi8KKwkJaWYgKCEoY2FsbCA9IHRhbGxvY196ZXJvKHRhbGxfY2FsbF9jdHgsIHN0cnVjdCBnc21fY2FsbCkpKSB7CisJCQlzdHJ1Y3QgZ3NtX21uY2MgcmVsOworCQkJCisJCQltZW1zZXQoJnJlbCwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fbW5jYykpOworCQkJcmVsLmNhbGxyZWYgPSBjYWxscmVmOworCQkJbW5jY19zZXRfY2F1c2UoJnJlbCwgR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCQkJCSAgICAgICBHU000OF9DQ19DQVVTRV9SRVNPVVJDRV9VTkFWQUlMKTsKKwkJCW1uY2Nfc2VuZChuZXQsIE1OQ0NfUkVMX1JFUSwgJnJlbCk7CisJCQlyZXR1cm4gMDsKKwkJfQorCQlsbGlzdF9hZGRfdGFpbCgmY2FsbC0+ZW50cnksICZjYWxsX2xpc3QpOworCQljYWxsLT5uZXQgPSBuZXQ7CisJCWNhbGwtPmNhbGxyZWYgPSBjYWxscmVmOworCQlERUJVR1AoRE1OQ0MsICIoY2FsbCAleCkgQ2FsbCBjcmVhdGVkLlxuIiwgY2FsbC0+Y2FsbHJlZik7CisJfQorCisJc3dpdGNoIChtc2dfdHlwZSkgeworCWNhc2UgR1NNX1RDSEZfRlJBTUU6CisJY2FzZSBHU01fVENIRl9GUkFNRV9FRlI6CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUChETU5DQywgIihjYWxsICV4KSBSZWNlaXZlZCBtZXNzYWdlICVzXG4iLCBjYWxsLT5jYWxscmVmLAorCQkJZ2V0X21uY2NfbmFtZShtc2dfdHlwZSkpOworCQlicmVhazsKKwl9CisKKwlzd2l0Y2gobXNnX3R5cGUpIHsKKwljYXNlIE1OQ0NfU0VUVVBfSU5EOgorCQlyYyA9IG1uY2Nfc2V0dXBfaW5kKGNhbGwsIG1zZ190eXBlLCBhcmcpOworCQlicmVhazsKKwljYXNlIE1OQ0NfU0VUVVBfQ05GOgorCQlyYyA9IG1uY2Nfc2V0dXBfY25mKGNhbGwsIG1zZ190eXBlLCBhcmcpOworCQlicmVhazsKKwljYXNlIE1OQ0NfU0VUVVBfQ09NUExfSU5EOgorCQlicmVhazsKKwljYXNlIE1OQ0NfQ0FMTF9DT05GX0lORDoKKwkJLyogd2Ugbm93IG5lZWQgdG8gTU9ESUZZIHRoZSBjaGFubmVsICovCisJCWRhdGEtPmxjaGFuX21vZGUgPSBHU000OF9DTU9ERV9TUEVFQ0hfRUZSOworCQltbmNjX3NlbmQoY2FsbC0+bmV0LCBNTkNDX0xDSEFOX01PRElGWSwgZGF0YSk7CisJCWJyZWFrOworCWNhc2UgTU5DQ19BTEVSVF9JTkQ6CisJCXJjID0gbW5jY19hbGVydF9pbmQoY2FsbCwgbXNnX3R5cGUsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgTU5DQ19OT1RJRllfSU5EOgorCQlyYyA9IG1uY2Nfbm90aWZ5X2luZChjYWxsLCBtc2dfdHlwZSwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBNTkNDX0RJU0NfSU5EOgorCQlyYyA9IG1uY2NfZGlzY19pbmQoY2FsbCwgbXNnX3R5cGUsIGFyZyk7CisJCWJyZWFrOworCWNhc2UgTU5DQ19SRUxfSU5EOgorCWNhc2UgTU5DQ19SRUpfSU5EOgorCQlyYyA9IG1uY2NfcmVsX2luZChjYWxsLCBtc2dfdHlwZSwgYXJnKTsKKwkJYnJlYWs7CisJY2FzZSBNTkNDX1JFTF9DTkY6CisJCXJjID0gbW5jY19yZWxfY25mKGNhbGwsIG1zZ190eXBlLCBhcmcpOworCQlicmVhazsKKwljYXNlIE1OQ0NfRkFDSUxJVFlfSU5EOgorCQlicmVhazsKKwljYXNlIE1OQ0NfU1RBUlRfRFRNRl9JTkQ6CisJCWJyZWFrOworCWNhc2UgTU5DQ19TVE9QX0RUTUZfSU5EOgorCQlicmVhazsKKwljYXNlIE1OQ0NfTU9ESUZZX0lORDoKKwkJbW5jY19zZXRfY2F1c2UoZGF0YSwgR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCQkJCUdTTTQ4X0NDX0NBVVNFX1NFUlZfT1BUX1VOSU1QTCk7CisJCURFQlVHUChETU5DQywgIihjYWxsICV4KSBSZWplY3RpbmcgTU9ESUZZIHdpdGggY2F1c2UgJWRcbiIsCisJCQljYWxsLT5jYWxscmVmLCBkYXRhLT5jYXVzZS52YWx1ZSk7CisJCXJjID0gbW5jY19zZW5kKG5ldCwgTU5DQ19NT0RJRllfUkVKLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBNTkNDX01PRElGWV9DTkY6CisJCWJyZWFrOworCWNhc2UgTU5DQ19IT0xEX0lORDoKKwkJbW5jY19zZXRfY2F1c2UoZGF0YSwgR1NNNDhfQ0FVU0VfTE9DX1BSTl9TX0xVLAorCQkJCUdTTTQ4X0NDX0NBVVNFX1NFUlZfT1BUX1VOSU1QTCk7CisJCURFQlVHUChETU5DQywgIihjYWxsICV4KSBSZWplY3RpbmcgSE9MRCB3aXRoIGNhdXNlICVkXG4iLAorCQkJY2FsbC0+Y2FsbHJlZiwgZGF0YS0+Y2F1c2UudmFsdWUpOworCQlyYyA9IG1uY2Nfc2VuZChuZXQsIE1OQ0NfSE9MRF9SRUosIGRhdGEpOworCQlicmVhazsKKwljYXNlIE1OQ0NfUkVUUklFVkVfSU5EOgorCQltbmNjX3NldF9jYXVzZShkYXRhLCBHU000OF9DQVVTRV9MT0NfUFJOX1NfTFUsCisJCQkJR1NNNDhfQ0NfQ0FVU0VfU0VSVl9PUFRfVU5JTVBMKTsKKwkJREVCVUdQKERNTkNDLCAiKGNhbGwgJXgpIFJlamVjdGluZyBSRVRSSUVWRSB3aXRoIGNhdXNlICVkXG4iLAorCQkJY2FsbC0+Y2FsbHJlZiwgZGF0YS0+Y2F1c2UudmFsdWUpOworCQlyYyA9IG1uY2Nfc2VuZChuZXQsIE1OQ0NfUkVUUklFVkVfUkVKLCBkYXRhKTsKKwkJYnJlYWs7CisJY2FzZSBHU01fVENIRl9GUkFNRToKKwljYXNlIEdTTV9UQ0hGX0ZSQU1FX0VGUjoKKwkJcmMgPSBtbmNjX3Jjdl90Y2hmKGNhbGwsIG1zZ190eXBlLCBhcmcpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERNTkNDLCBMT0dMX05PVElDRSwgIihjYWxsICV4KSBNZXNzYWdlIHVuaGFuZGxlZFxuIiwgY2FsbHJlZik7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLjEtMSBiL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLjEtMQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMjU4MDRmCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcuMS0xCkBAIC0wLDAgKzEsNTQgQEAKKyEKKyEgT3BlbkJTQyBjb25maWd1cmF0aW9uIHNhdmVkIGZyb20gdnR5CishICAgIQorcGFzc3dvcmQgZm9vCishCitsaW5lIHZ0eQorIG5vIGxvZ2luCishCituZXR3b3JrCisgbmV0d29yayBjb3VudHJ5IGNvZGUgMQorIG1vYmlsZSBuZXR3b3JrIGNvZGUgMQorIHNob3J0IG5hbWUgT3BlbkJTQworIGxvbmcgbmFtZSBPcGVuQlNDCisgdGltZXIgdDMxMDEgMTAKKyB0aW1lciB0MzExMyA2MAorIGJ0cyAwCisgIHR5cGUgYnMxMQorICBiYW5kIEdTTTkwMAorICBjZWxsX2lkZW50aXR5IDEKKyAgbG9jYXRpb25fYXJlYV9jb2RlIDEKKyAgdHJhaW5pbmdfc2VxdWVuY2VfY29kZSA3CisgIGJhc2Vfc3RhdGlvbl9pZF9jb2RlIDYzCisgIG9tbCBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgIG9tbCBlMSB0ZWkgMjUKKyAgdHJ4IDAKKyAgIGFyZmNuIDEyMQorICAgbWF4X3Bvd2VyX3JlZCAwCisgICByc2wgZTEgbGluZSAwIHRpbWVzbG90IDEgc3ViLXNsb3QgZnVsbAorICAgcnNsIGUxIHRlaSAxCisgICAgdGltZXNsb3QgMAorICAgICBwaHlzX2NoYW5fY29uZmlnIENDQ0grU0RDQ0g0CisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAxIHN1Yi1zbG90IGZ1bGwKKyAgICB0aW1lc2xvdCAxCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDIgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDIKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMiBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgMworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAyIHN1Yi1zbG90IDMKKyAgICB0aW1lc2xvdCA0CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMAorICAgIHRpbWVzbG90IDUKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgNgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCA3CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMworCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy4xLTIgYi9vcGVuYnNjL3NyYy9vcGVuYnNjLmNmZy4xLTIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODRkNTBjNwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLjEtMgpAQCAtMCwwICsxLDgyIEBACishCishIE9wZW5CU0MgY29uZmlndXJhdGlvbiBzYXZlZCBmcm9tIHZ0eQorISAgICEKK3Bhc3N3b3JkIGZvbworIQorbGluZSB2dHkKKyBubyBsb2dpbgorIQorbmV0d29yaworIG5ldHdvcmsgY291bnRyeSBjb2RlIDEKKyBtb2JpbGUgbmV0d29yayBjb2RlIDEKKyBzaG9ydCBuYW1lIE9wZW5CU0MKKyBsb25nIG5hbWUgT3BlbkJTQworIHRpbWVyIHQzMTAxIDEwCisgdGltZXIgdDMxMTMgNjAKKyBidHMgMAorICB0eXBlIGJzMTEKKyAgYmFuZCBHU005MDAKKyAgY2VsbF9pZGVudGl0eSAxCisgIGxvY2F0aW9uX2FyZWFfY29kZSAxCisgIHRyYWluaW5nX3NlcXVlbmNlX2NvZGUgNworICBiYXNlX3N0YXRpb25faWRfY29kZSA2MworICBvbWwgZTEgbGluZSAwIHRpbWVzbG90IDEgc3ViLXNsb3QgZnVsbAorICBvbWwgZTEgdGVpIDI1CisgIHRyeCAwCisgICBhcmZjbiAxMjEKKyAgIG1heF9wb3dlcl9yZWQgMAorICAgcnNsIGUxIGxpbmUgMCB0aW1lc2xvdCAxIHN1Yi1zbG90IGZ1bGwKKyAgIHJzbCBlMSB0ZWkgMQorICAgIHRpbWVzbG90IDAKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBDQ0NIK1NEQ0NINAorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgICAgdGltZXNsb3QgMQorICAgICBwaHlzX2NoYW5fY29uZmlnIFNEQ0NIOAorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMiBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgMgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAyIHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCAzCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDIgc3ViLXNsb3QgMworICAgIHRpbWVzbG90IDQKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgNQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCA2CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDcKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAzCisgIHRyeCAxCisgICBhcmZjbiAxMjMKKyAgIG1heF9wb3dlcl9yZWQgMAorICAgcnNsIGUxIGxpbmUgMCB0aW1lc2xvdCAxIHN1Yi1zbG90IGZ1bGwKKyAgIHJzbCBlMSB0ZWkgMgorICAgIHRpbWVzbG90IDAKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNCBzdWItc2xvdCAwCisgICAgdGltZXNsb3QgMQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA0IHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCAyCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDQgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDMKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNCBzdWItc2xvdCAzCisgICAgdGltZXNsb3QgNAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA1IHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCA1CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDUgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDYKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNSBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgNworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA1IHN1Yi1zbG90IDMKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLjItMiBiL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLjItMgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YWU4MDAzCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcuMi0yCkBAIC0wLDAgKzEsMTQ4IEBACishCishIE9wZW5CU0MgY29uZmlndXJhdGlvbiBzYXZlZCBmcm9tIHZ0eQorISAgICEKK3Bhc3N3b3JkIGZvbworIQorbGluZSB2dHkKKyBubyBsb2dpbgorIQorbmV0d29yaworIG5ldHdvcmsgY291bnRyeSBjb2RlIDEKKyBtb2JpbGUgbmV0d29yayBjb2RlIDEKKyBzaG9ydCBuYW1lIE9wZW5CU0MKKyBsb25nIG5hbWUgT3BlbkJTQworIHRpbWVyIHQzMTAxIDEwCisgdGltZXIgdDMxMTMgNjAKKyBidHMgMAorICB0eXBlIGJzMTEKKyAgYmFuZCBHU005MDAKKyAgY2VsbF9pZGVudGl0eSAxCisgIGxvY2F0aW9uX2FyZWFfY29kZSAxCisgIHRyYWluaW5nX3NlcXVlbmNlX2NvZGUgNworICBiYXNlX3N0YXRpb25faWRfY29kZSA2MworICBvbWwgZTEgbGluZSAwIHRpbWVzbG90IDEgc3ViLXNsb3QgZnVsbAorICBvbWwgZTEgdGVpIDI1CisgIHRyeCAwCisgICBhcmZjbiAxMjEKKyAgIG1heF9wb3dlcl9yZWQgMAorICAgcnNsIGUxIGxpbmUgMCB0aW1lc2xvdCAxIHN1Yi1zbG90IGZ1bGwKKyAgIHJzbCBlMSB0ZWkgMQorICAgIHRpbWVzbG90IDAKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBDQ0NIK1NEQ0NINAorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMSBzdWItc2xvdCBmdWxsCisgICAgdGltZXNsb3QgMQorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAyIHN1Yi1zbG90IDEKKyAgICB0aW1lc2xvdCAyCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDIgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDMKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMiBzdWItc2xvdCAzCisgICAgdGltZXNsb3QgNAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCA1CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDMgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDYKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgMyBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgNworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCAzIHN1Yi1zbG90IDMKKyAgdHJ4IDEKKyAgIGFyZmNuIDEyMworICAgbWF4X3Bvd2VyX3JlZCAwCisgICByc2wgZTEgbGluZSAwIHRpbWVzbG90IDEgc3ViLXNsb3QgZnVsbAorICAgcnNsIGUxIHRlaSAyCisgICAgdGltZXNsb3QgMAorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA0IHN1Yi1zbG90IDAKKyAgICB0aW1lc2xvdCAxCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDQgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDIKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNCBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgMworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA0IHN1Yi1zbG90IDMKKyAgICB0aW1lc2xvdCA0CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDUgc3ViLXNsb3QgMAorICAgIHRpbWVzbG90IDUKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDAgdGltZXNsb3QgNSBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgNgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMCB0aW1lc2xvdCA1IHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCA3CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAwIHRpbWVzbG90IDUgc3ViLXNsb3QgMworIGJ0cyAxCisgIHR5cGUgYnMxMQorICBiYW5kIEdTTTkwMAorICBsb2NhdGlvbl9hcmVhX2NvZGUgMgorICB0cmFpbmluZ19zZXF1ZW5jZV9jb2RlIDcKKyAgYmFzZV9zdGF0aW9uX2lkX2NvZGUgNjMKKyAgb21sIGUxIGxpbmUgMSB0aW1lc2xvdCA2IHN1Yi1zbG90IGZ1bGwKKyAgb21sIGUxIHRlaSAyNQorICB0cnggMAorICAgYXJmY24gMTIyCisgICBtYXhfcG93ZXJfcmVkIDAKKyAgIHJzbCBlMSBsaW5lIDEgdGltZXNsb3QgNiBzdWItc2xvdCBmdWxsCisgICByc2wgZTEgdGVpIDEKKyAgICB0aW1lc2xvdCAwCisgICAgIHBoeXNfY2hhbl9jb25maWcgQ0NDSCtTRENDSDQKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDcgc3ViLXNsb3QgMAorICAgIHRpbWVzbG90IDEKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBTRENDSDgKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDcgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDIKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgNyBzdWItc2xvdCAyCisgICAgdGltZXNsb3QgMworICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA3IHN1Yi1zbG90IDMKKyAgICB0aW1lc2xvdCA0CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDggc3ViLXNsb3QgMAorICAgIHRpbWVzbG90IDUKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgOCBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgNgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA4IHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCA3CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDggc3ViLXNsb3QgMworICB0cnggMQorICAgYXJmY24gMTI0CisgICBtYXhfcG93ZXJfcmVkIDAKKyAgIHJzbCBlMSBsaW5lIDEgdGltZXNsb3QgNiBzdWItc2xvdCBmdWxsCisgICByc2wgZTEgdGVpIDIKKyAgICB0aW1lc2xvdCAwCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDkgc3ViLXNsb3QgMAorICAgIHRpbWVzbG90IDEKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgOSBzdWItc2xvdCAxCisgICAgdGltZXNsb3QgMgorICAgICBwaHlzX2NoYW5fY29uZmlnIFRDSC9GCisgICAgIGUxIGxpbmUgMSB0aW1lc2xvdCA5IHN1Yi1zbG90IDIKKyAgICB0aW1lc2xvdCAzCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICAgZTEgbGluZSAxIHRpbWVzbG90IDkgc3ViLXNsb3QgMworICAgIHRpbWVzbG90IDQKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgMTAgc3ViLXNsb3QgMAorICAgIHRpbWVzbG90IDUKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgMTAgc3ViLXNsb3QgMQorICAgIHRpbWVzbG90IDYKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgMTAgc3ViLXNsb3QgMgorICAgIHRpbWVzbG90IDcKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBUQ0gvRgorICAgICBlMSBsaW5lIDEgdGltZXNsb3QgMTAgc3ViLXNsb3QgMwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvb3BlbmJzYy5jZmcubmFub2J0cyBiL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLm5hbm9idHMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFjZWFlYwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL29wZW5ic2MuY2ZnLm5hbm9idHMKQEAgLTAsMCArMSw0MCBAQAorIQorISBPcGVuQlNDIGNvbmZpZ3VyYXRpb24gc2F2ZWQgZnJvbSB2dHkKKyEKK3Bhc3N3b3JkIGZvbworIQorbGluZSB2dHkKKyBubyBsb2dpbgorIQorbmV0d29yaworIG5ldHdvcmsgY291bnRyeSBjb2RlIDEKKyBtb2JpbGUgbmV0d29yayBjb2RlIDEKKyBzaG9ydCBuYW1lIE9wZW5CU0MKKyBsb25nIG5hbWUgT3BlbkJTQworIHRpbWVyIHQzMTAxIDEwCisgdGltZXIgdDMxMTMgNjAKKyBidHMgMAorICB0eXBlIG5hbm9idHMKKyAgaXAuYWNjZXNzIHVuaXRfaWQgMTgwMSAwCisgIGJhbmQgR1NNMTgwMAorICBsb2NhdGlvbl9hcmVhX2NvZGUgMQorICB0cmFpbmluZ19zZXF1ZW5jZV9jb2RlIDcKKyAgYmFzZV9zdGF0aW9uX2lkX2NvZGUgNjMKKyAgdHJ4IDAKKyAgIGFyZmNuIDUxNAorICAgIHRpbWVzbG90IDAKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBDQ0NIK1NEQ0NINAorICAgIHRpbWVzbG90IDEKKyAgICAgcGh5c19jaGFuX2NvbmZpZyBTRENDSDgKKyAgICB0aW1lc2xvdCAyCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICB0aW1lc2xvdCAzCisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICB0aW1lc2xvdCA0CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICB0aW1lc2xvdCA1CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICB0aW1lc2xvdCA2CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKKyAgICB0aW1lc2xvdCA3CisgICAgIHBoeXNfY2hhbl9jb25maWcgVENIL0YKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3BhZ2luZy5jIGIvb3BlbmJzYy9zcmMvcGFnaW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MzNzUwZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3BhZ2luZy5jCkBAIC0wLDAgKzEsMzM5IEBACisvKiBQYWdpbmcgaGVscGVyIGFuZCBtYW5hZ2VyLi4uLiAqLworLyogKEMpIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKy8qCisgKiBSZWxldmFudCBzcGVjczoKKyAqICAgICAxMi4yMToKKyAqICAgICAgIC0gOS40LjEyIGZvciBDQ0NIIExvY2FsIFRocmVzaG9sZAorICoKKyAqICAgICAwNS41ODoKKyAqICAgICAgIC0gOC41LjIgQ0NDSCBMb2FkIGluZGljYXRpb24KKyAqICAgICAgIC0gOS4zLjE1IFBhZ2luZyBMb2FkCisgKgorICogQXBwcm9hY2g6CisgKiAgICAgICAtIFNlbmQgcGFnaW5nIGNvbW1hbmQgdG8gc3Vic2NyaWJlcgorICogICAgICAgLSBPbiBDaGFubmVsIFJlcXVlc3Qgd2Ugd2lsbCByZW1lbWJlciB0aGUgcmVhc29uCisgKiAgICAgICAtIEFmdGVyIHRoZSBBQ0sgd2Ugd2lsbCByZXF1ZXN0IHRoZSBpZGVudGl0eQorICoJIC0gVGhlbiB3ZSB3aWxsIHNlbmQgYXNzaWduIHRoZSBnc21fc3Vic2NyaWJlciBhbmQKKyAqCSAtIGFuZCBjYWxsIGEgY2FsbGJhY2sKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvcGFnaW5nLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKwordm9pZCAqdGFsbF9wYWdpbmdfY3R4OworCitzdGF0aWMgdW5zaWduZWQgaW50IGNhbGN1bGF0ZV9ncm91cChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlpbnQgY2NjaF9jb25mOworCWludCBic19jY19jaGFuczsKKwlpbnQgYmxvY2tzOworCXVuc2lnbmVkIGludCBncm91cDsKKwkKKwljY2NoX2NvbmYgPSBidHMtPnNpX2NvbW1vbi5jaGFuX2Rlc2MuY2NjaF9jb25mOworCWJzX2NjX2NoYW5zID0gcnNsX2NjY2hfY29uZl90b19ic19jY19jaGFucyhjY2NoX2NvbmYpOworCS8qIGNvZGUgd29yZCArIDIsIGFzIDIgY2hhbm5lbHMgZXF1YWxzIDB4MCAqLworCWJsb2NrcyA9IHJzbF9udW1iZXJfb2ZfcGFnaW5nX3N1YmNoYW5uZWxzKGJ0cyk7CisJZ3JvdXAgPSBnZXRfcGFnaW5nX2dyb3VwKHN0cl90b19pbXNpKHN1YnNjci0+aW1zaSksCisJCQkJCWJzX2NjX2NoYW5zLCBibG9ja3MpOworCXJldHVybiBncm91cDsKK30KKworLyoKKyAqIEtpbGwgb25lIHBhZ2luZyByZXF1ZXN0IHVwZGF0ZSB0aGUgaW50ZXJuYWwgbGlzdC4uLgorICovCitzdGF0aWMgdm9pZCBwYWdpbmdfcmVtb3ZlX3JlcXVlc3Qoc3RydWN0IGdzbV9idHNfcGFnaW5nX3N0YXRlICpwYWdpbmdfYnRzLAorCQkJCXN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKnRvX2JlX2RlbGV0ZWQpCit7CisJLyogVXBkYXRlIHRoZSBsYXN0X3JlcXVlc3QgaWYgdGhhdCBpcyBuZWNlc3NhcnkgKi8KKwlpZiAodG9fYmVfZGVsZXRlZCA9PSBwYWdpbmdfYnRzLT5sYXN0X3JlcXVlc3QpIHsKKwkJcGFnaW5nX2J0cy0+bGFzdF9yZXF1ZXN0ID0KKwkJCShzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICopcGFnaW5nX2J0cy0+bGFzdF9yZXF1ZXN0LT5lbnRyeS5uZXh0OworCQlpZiAoJnRvX2JlX2RlbGV0ZWQtPmVudHJ5ID09ICZwYWdpbmdfYnRzLT5wZW5kaW5nX3JlcXVlc3RzKQorCQkJcGFnaW5nX2J0cy0+bGFzdF9yZXF1ZXN0ID0gTlVMTDsKKwl9CisKKwlic2NfZGVsX3RpbWVyKCZ0b19iZV9kZWxldGVkLT5UMzExMyk7CisJbGxpc3RfZGVsKCZ0b19iZV9kZWxldGVkLT5lbnRyeSk7CisJc3Vic2NyX3B1dCh0b19iZV9kZWxldGVkLT5zdWJzY3IpOworCXRhbGxvY19mcmVlKHRvX2JlX2RlbGV0ZWQpOworfQorCitzdGF0aWMgdm9pZCBwYWdlX21zKHN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKnJlcXVlc3QpCit7CisJdV9pbnQ4X3QgbWlbMTI4XTsKKwl1bnNpZ25lZCBpbnQgbWlfbGVuOworCXVuc2lnbmVkIGludCBwYWdlX2dyb3VwOworCisJREVCVUdQKERQQUcsICJHb2luZyB0byBzZW5kIHBhZ2luZyBjb21tYW5kczogaW1zaTogJyVzJyB0bXNpOiAnMHgleCdcbiIsCisJCXJlcXVlc3QtPnN1YnNjci0+aW1zaSwgcmVxdWVzdC0+c3Vic2NyLT50bXNpKTsKKworCWlmIChyZXF1ZXN0LT5zdWJzY3ItPnRtc2kgPT0gR1NNX1JFU0VSVkVEX1RNU0kpCisJCW1pX2xlbiA9IGdzbTQ4X2dlbmVyYXRlX21pZF9mcm9tX2ltc2kobWksIHJlcXVlc3QtPnN1YnNjci0+aW1zaSk7CisJZWxzZQorCQltaV9sZW4gPSBnc200OF9nZW5lcmF0ZV9taWRfZnJvbV90bXNpKG1pLCByZXF1ZXN0LT5zdWJzY3ItPnRtc2kpOworCisJcGFnZV9ncm91cCA9IGNhbGN1bGF0ZV9ncm91cChyZXF1ZXN0LT5idHMsIHJlcXVlc3QtPnN1YnNjcik7CisJcnNsX3BhZ2luZ19jbWQocmVxdWVzdC0+YnRzLCBwYWdlX2dyb3VwLCBtaV9sZW4sIG1pLAorCQkJcmVxdWVzdC0+Y2hhbl90eXBlKTsKK30KKworc3RhdGljIHZvaWQgcGFnaW5nX21vdmVfdG9fbmV4dChzdHJ1Y3QgZ3NtX2J0c19wYWdpbmdfc3RhdGUgKnBhZ2luZ19idHMpCit7CisJcGFnaW5nX2J0cy0+bGFzdF9yZXF1ZXN0ID0KKwkJKHN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKilwYWdpbmdfYnRzLT5sYXN0X3JlcXVlc3QtPmVudHJ5Lm5leHQ7CisJaWYgKCZwYWdpbmdfYnRzLT5sYXN0X3JlcXVlc3QtPmVudHJ5ID09ICZwYWdpbmdfYnRzLT5wZW5kaW5nX3JlcXVlc3RzKQorCQlwYWdpbmdfYnRzLT5sYXN0X3JlcXVlc3QgPSBOVUxMOworfQorCisvKgorICogVGhpcyBpcyBraWNrZWQgYnkgdGhlIHBlcmlvZGljIFBBR0lORyBMT0FEIEluZGljYXRvcgorICogY29taW5nIGZyb20gYWJpc19yc2wuYworICoKKyAqIFdlIGF0dGVtcHQgdG8gaXRlcmF0ZSBvbmNlIG92ZXIgdGhlIGxpc3Qgb2YgaXRlbXMgYnV0CisgKiBvbmx5IHVwdG8gYXZhaWxhYmxlX3Nsb3RzLgorICovCitzdGF0aWMgdm9pZCBwYWdpbmdfaGFuZGxlX3BlbmRpbmdfcmVxdWVzdHMoc3RydWN0IGdzbV9idHNfcGFnaW5nX3N0YXRlICpwYWdpbmdfYnRzKQoreworCXN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKmluaXRpYWxfcmVxdWVzdCA9IE5VTEw7CisJc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqY3VycmVudF9yZXF1ZXN0ID0gTlVMTDsKKworCS8qCisJICogRGV0ZXJtaW5lIGlmIHRoZSBwZW5kaW5nX3JlcXVlc3RzIGxpc3QgaXMgZW1wdHkgYW5kCisJICogcmV0dXJuIHRoZW4uCisJICovCisJaWYgKGxsaXN0X2VtcHR5KCZwYWdpbmdfYnRzLT5wZW5kaW5nX3JlcXVlc3RzKSkgeworCQlwYWdpbmdfYnRzLT5sYXN0X3JlcXVlc3QgPSBOVUxMOworCQkvKiBzaW5jZSB0aGUgbGlzdCBpcyBlbXB0eSwgbm8gbmVlZCB0byByZXNjaGVkdWxlIHRoZSB0aW1lciAqLworCQlyZXR1cm47CisJfQorCisJaWYgKCFwYWdpbmdfYnRzLT5sYXN0X3JlcXVlc3QpCisJCXBhZ2luZ19idHMtPmxhc3RfcmVxdWVzdCA9CisJCQkoc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqKXBhZ2luZ19idHMtPnBlbmRpbmdfcmVxdWVzdHMubmV4dDsKKworCWFzc2VydChwYWdpbmdfYnRzLT5sYXN0X3JlcXVlc3QpOworCWluaXRpYWxfcmVxdWVzdCA9IHBhZ2luZ19idHMtPmxhc3RfcmVxdWVzdDsKKwljdXJyZW50X3JlcXVlc3QgPSBpbml0aWFsX3JlcXVlc3Q7CisKKwlkbyB7CisJCS8qIGhhbmRsZSB0aGUgcGFnaW5nIHJlcXVlc3Qgbm93ICovCisJCXBhZ2VfbXMoY3VycmVudF9yZXF1ZXN0KTsKKwkJcGFnaW5nX2J0cy0+YXZhaWxhYmxlX3Nsb3RzLS07CisKKwkJLyoKKwkJICogbW92ZSB0byB0aGUgbmV4dCBpdGVtLiBXZSBtaWdodCB3cmFwIGFyb3VuZAorCQkgKiB0aGlzIG1lYW5zIGxhc3RfcmVxdWVzdCB3aWxsIGJlIE5VTEwgYW5kIHdlIGp1c3QKKwkJICogY2FsbCBwYWdpbmdfcGFnZV90b19uZXh0IGFnYWluLiBJdCBpdCBndXJhbnRlZWQKKwkJICogdGhhdCB0aGUgbGlzdCBpcyBub3QgZW1wdHkuCisJCSAqLworCQlwYWdpbmdfbW92ZV90b19uZXh0KHBhZ2luZ19idHMpOworCQlpZiAoIXBhZ2luZ19idHMtPmxhc3RfcmVxdWVzdCkKKwkJCXBhZ2luZ19idHMtPmxhc3RfcmVxdWVzdCA9CisJCQkJKHN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKilwYWdpbmdfYnRzLT5wZW5kaW5nX3JlcXVlc3RzLm5leHQ7CisJCWN1cnJlbnRfcmVxdWVzdCA9IHBhZ2luZ19idHMtPmxhc3RfcmVxdWVzdDsKKwl9IHdoaWxlIChwYWdpbmdfYnRzLT5hdmFpbGFibGVfc2xvdHMgPiAwCisJCSAgICAmJiAgaW5pdGlhbF9yZXF1ZXN0ICE9IGN1cnJlbnRfcmVxdWVzdCk7CisKKwlic2Nfc2NoZWR1bGVfdGltZXIoJnBhZ2luZ19idHMtPndvcmtfdGltZXIsIDEsIDApOworfQorCitzdGF0aWMgdm9pZCBwYWdpbmdfd29ya2VyKHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGdzbV9idHNfcGFnaW5nX3N0YXRlICpwYWdpbmdfYnRzID0gZGF0YTsKKworCXBhZ2luZ19oYW5kbGVfcGVuZGluZ19yZXF1ZXN0cyhwYWdpbmdfYnRzKTsKK30KKwordm9pZCBwYWdpbmdfaW5pdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCWJ0cy0+cGFnaW5nLmJ0cyA9IGJ0czsKKwlJTklUX0xMSVNUX0hFQUQoJmJ0cy0+cGFnaW5nLnBlbmRpbmdfcmVxdWVzdHMpOworCWJ0cy0+cGFnaW5nLndvcmtfdGltZXIuY2IgPSBwYWdpbmdfd29ya2VyOworCWJ0cy0+cGFnaW5nLndvcmtfdGltZXIuZGF0YSA9ICZidHMtPnBhZ2luZzsKKworCS8qIExhcmdlIG51bWJlciwgdW50aWwgd2UgZ2V0IGEgcHJvcGVyIG1lc3NhZ2UgKi8KKwlidHMtPnBhZ2luZy5hdmFpbGFibGVfc2xvdHMgPSAxMDA7Cit9CisKK3N0YXRpYyBpbnQgcGFnaW5nX3BlbmRpbmdfcmVxdWVzdChzdHJ1Y3QgZ3NtX2J0c19wYWdpbmdfc3RhdGUgKmJ0cywKKwkJCQlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikgeworCXN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKnJlcTsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHJlcSwgJmJ0cy0+cGVuZGluZ19yZXF1ZXN0cywgZW50cnkpIHsKKwkJaWYgKHN1YnNjciA9PSByZXEtPnN1YnNjcikKKwkJCXJldHVybiAxOworCX0KKworCXJldHVybiAwOwkKK30KKworc3RhdGljIHZvaWQgcGFnaW5nX1QzMTEzX2V4cGlyZWQodm9pZCAqZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICpyZXEgPSAoc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqKWRhdGE7CisJc3RydWN0IHBhZ2luZ19zaWduYWxfZGF0YSBzaWdfZGF0YTsKKwl2b2lkICpjYmZuX3BhcmFtOworCWdzbV9jYmZuICpjYmZuOworCisJREVCVUdQKERQQUcsICJUMzExMyBleHBpcmVkIGZvciByZXF1ZXN0ICVwICglcylcbiIsCisJCXJlcSwgcmVxLT5zdWJzY3ItPmltc2kpOworCQorCXNpZ19kYXRhLnN1YnNjciA9IHJlcS0+c3Vic2NyOworCXNpZ19kYXRhLmJ0cwk9IHJlcS0+YnRzOworCXNpZ19kYXRhLmxjaGFuCT0gTlVMTDsKKworCS8qIG11c3QgYmUgZGVzdHJveWVkIGJlZm9yZSBjYWxsaW5nIGNiZm4sIHRvIHByZXZlbnQgZG91YmxlIGZyZWUgKi8KKwljYmZuX3BhcmFtID0gcmVxLT5jYmZuX3BhcmFtOworCWNiZm4gPSByZXEtPmNiZm47CisJcGFnaW5nX3JlbW92ZV9yZXF1ZXN0KCZyZXEtPmJ0cy0+cGFnaW5nLCByZXEpOworCisJY291bnRlcl9pbmMocmVxLT5idHMtPm5ldHdvcmstPnN0YXRzLnBhZ2luZy5leHBpcmVkKTsKKworCWRpc3BhdGNoX3NpZ25hbChTU19QQUdJTkcsIFNfUEFHSU5HX0VYUElSRUQsICZzaWdfZGF0YSk7CisJaWYgKGNiZm4pCisJCWNiZm4oR1NNX0hPT0tfUlJfUEFHSU5HLCBHU01fUEFHSU5HX0VYUElSRUQsIE5VTEwsIE5VTEwsCisJCQkgIGNiZm5fcGFyYW0pOworfQorCitzdGF0aWMgaW50IF9wYWdpbmdfcmVxdWVzdChzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKwkJCSAgICBpbnQgdHlwZSwgZ3NtX2NiZm4gKmNiZm4sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGdzbV9idHNfcGFnaW5nX3N0YXRlICpidHNfZW50cnkgPSAmYnRzLT5wYWdpbmc7CisJc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCAqcmVxOworCisJaWYgKHBhZ2luZ19wZW5kaW5nX3JlcXVlc3QoYnRzX2VudHJ5LCBzdWJzY3IpKSB7CisJCURFQlVHUChEUEFHLCAiUGFnaW5nIHJlcXVlc3QgYWxyZWFkeSBwZW5kaW5nXG4iKTsKKwkJcmV0dXJuIC1FRVhJU1Q7CisJfQorCisJREVCVUdQKERQQUcsICJTdGFydCBwYWdpbmcgb2Ygc3Vic2NyaWJlciAlbGx1IG9uIGJ0cyAlZC5cbiIsCisJCXN1YnNjci0+aWQsIGJ0cy0+bnIpOworCXJlcSA9IHRhbGxvY196ZXJvKHRhbGxfcGFnaW5nX2N0eCwgc3RydWN0IGdzbV9wYWdpbmdfcmVxdWVzdCk7CisJcmVxLT5zdWJzY3IgPSBzdWJzY3JfZ2V0KHN1YnNjcik7CisJcmVxLT5idHMgPSBidHM7CisJcmVxLT5jaGFuX3R5cGUgPSB0eXBlOworCXJlcS0+Y2JmbiA9IGNiZm47CisJcmVxLT5jYmZuX3BhcmFtID0gZGF0YTsKKwlyZXEtPlQzMTEzLmNiID0gcGFnaW5nX1QzMTEzX2V4cGlyZWQ7CisJcmVxLT5UMzExMy5kYXRhID0gcmVxOworCWJzY19zY2hlZHVsZV90aW1lcigmcmVxLT5UMzExMywgYnRzLT5uZXR3b3JrLT5UMzExMywgMCk7CisJbGxpc3RfYWRkX3RhaWwoJnJlcS0+ZW50cnksICZidHNfZW50cnktPnBlbmRpbmdfcmVxdWVzdHMpOworCisJaWYgKCFic2NfdGltZXJfcGVuZGluZygmYnRzX2VudHJ5LT53b3JrX3RpbWVyKSkKKwkJYnNjX3NjaGVkdWxlX3RpbWVyKCZidHNfZW50cnktPndvcmtfdGltZXIsIDEsIDApOworCisJcmV0dXJuIDA7Cit9CisKK2ludCBwYWdpbmdfcmVxdWVzdChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldHdvcmssIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkgICBpbnQgdHlwZSwgZ3NtX2NiZm4gKmNiZm4sIHZvaWQgKmRhdGEpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IE5VTEw7CisJaW50IG51bV9wYWdlcyA9IDA7CisKKwljb3VudGVyX2luYyhuZXR3b3JrLT5zdGF0cy5wYWdpbmcuYXR0ZW1wdGVkKTsKKworCS8qIHN0YXJ0IHBhZ2luZyBzdWJzY3JpYmVyIG9uIGFsbCBCVFMgd2l0aGluIExvY2F0aW9uIEFyZWEgKi8KKwlkbyB7CisJCWludCByYzsKKworCQlidHMgPSBnc21fYnRzX2J5X2xhYyhuZXR3b3JrLCBzdWJzY3ItPmxhYywgYnRzKTsKKwkJaWYgKCFidHMpCisJCQlicmVhazsKKworCQkvKiBza2lwIGFsbCBjdXJyZW50bHkgaW5hY3RpdmUgVFJYICovCisJCWlmICghdHJ4X2lzX3VzYWJsZShidHMtPmMwKSkKKwkJCWNvbnRpbnVlOworCisJCW51bV9wYWdlcysrOworCisJCS8qIFRyaWdnZXIgcGFnaW5nLCBwYXNzIGFueSBlcnJvciB0byBjYWxsZXIgKi8KKwkJcmMgPSBfcGFnaW5nX3JlcXVlc3QoYnRzLCBzdWJzY3IsIHR5cGUsIGNiZm4sIGRhdGEpOworCQlpZiAocmMgPCAwKQorCQkJcmV0dXJuIHJjOworCX0gd2hpbGUgKDEpOworCisJaWYgKG51bV9wYWdlcyA9PSAwKQorCQljb3VudGVyX2luYyhuZXR3b3JrLT5zdGF0cy5wYWdpbmcuZGV0YWNoZWQpOworCisJcmV0dXJuIG51bV9wYWdlczsKK30KKworCisvKiB3ZSBjb25zY2lvdXNseSBpZ25vcmUgdGhlIHR5cGUgb2YgdGhlIHJlcXVlc3QgaGVyZSAqLworc3RhdGljIHZvaWQgX3BhZ2luZ19yZXF1ZXN0X3N0b3Aoc3RydWN0IGdzbV9idHMgKmJ0cywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkJIHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBnc21fYnRzX3BhZ2luZ19zdGF0ZSAqYnRzX2VudHJ5ID0gJmJ0cy0+cGFnaW5nOworCXN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKnJlcSwgKnJlcTI7CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHJlcSwgcmVxMiwgJmJ0c19lbnRyeS0+cGVuZGluZ19yZXF1ZXN0cywKKwkJCQkgZW50cnkpIHsKKwkJaWYgKHJlcS0+c3Vic2NyID09IHN1YnNjcikgeworCQkJaWYgKGxjaGFuICYmIHJlcS0+Y2JmbikgeworCQkJCURFQlVHUChEUEFHLCAiU3RvcCBwYWdpbmcgb24gYnRzICVkLCBjYWxsaW5nIGNiZm4uXG4iLCBidHMtPm5yKTsKKwkJCQlyZXEtPmNiZm4oR1NNX0hPT0tfUlJfUEFHSU5HLCBHU01fUEFHSU5HX1NVQ0NFRURFRCwKKwkJCQkJICBOVUxMLCBsY2hhbiwgcmVxLT5jYmZuX3BhcmFtKTsKKwkJCX0gZWxzZQorCQkJCURFQlVHUChEUEFHLCAiU3RvcCBwYWdpbmcgb24gYnRzICVkIHNpbGVudGx5LlxuIiwgYnRzLT5ucik7CisJCQlwYWdpbmdfcmVtb3ZlX3JlcXVlc3QoJmJ0cy0+cGFnaW5nLCByZXEpOworCQkJYnJlYWs7CisJCX0KKwl9Cit9CisKKy8qIFN0b3AgcGFnaW5nIG9uIGFsbCBvdGhlciBidHMnICovCit2b2lkIHBhZ2luZ19yZXF1ZXN0X3N0b3Aoc3RydWN0IGdzbV9idHMgKl9idHMsIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJIHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSBOVUxMOworCisJaWYgKF9idHMpCisJCV9wYWdpbmdfcmVxdWVzdF9zdG9wKF9idHMsIHN1YnNjciwgbGNoYW4pOworCisJZG8geworCQkvKgorCQkgKiBGSVhNRTogRG9uJ3QgdXNlIHRoZSBsYWMgb2YgdGhlIHN1YnNjcmliZXIuLi4KKwkJICogYXMgaXQgbWlnaHQgaGF2ZSBtYWdpY2FsbHkgY2hhbmdlZCB0aGUgbGFjLi4gdXNlIHRoZQorCQkgKiBsb2NhdGlvbiBhcmVhIG9mIHRoZSBfYnRzIGFzIHJlY29uZmlndXJhdGlvbiBvZiB0aGUKKwkJICogbmV0d29yayBpcyBwcm9iYWJseSBoYXBwZW5pbmcgbGVzcyBvZnRlbi4KKwkJICovCisJCWJ0cyA9IGdzbV9idHNfYnlfbGFjKHN1YnNjci0+bmV0LCBzdWJzY3ItPmxhYywgYnRzKTsKKwkJaWYgKCFidHMpCisJCQlicmVhazsKKworCQkvKiBTdG9wIHBhZ2luZyAqLworICAgICAgICAgICAgICAgIGlmIChidHMgIT0gX2J0cykKKwkJCV9wYWdpbmdfcmVxdWVzdF9zdG9wKGJ0cywgc3Vic2NyLCBOVUxMKTsKKwl9IHdoaWxlICgxKTsKK30KKwordm9pZCBwYWdpbmdfdXBkYXRlX2J1ZmZlcl9zcGFjZShzdHJ1Y3QgZ3NtX2J0cyAqYnRzLCB1X2ludDE2X3QgZnJlZV9zbG90cykKK3sKKwlidHMtPnBhZ2luZy5hdmFpbGFibGVfc2xvdHMgPSBmcmVlX3Nsb3RzOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvcmVzdF9vY3RldHMuYyBiL29wZW5ic2Mvc3JjL3Jlc3Rfb2N0ZXRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTY5OTZjZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3Jlc3Rfb2N0ZXRzLmMKQEAgLTAsMCArMSwzOTYgQEAKKy8qIEdTTSBNb2JpbGUgUmFkaW8gSW50ZXJmYWNlIExheWVyIDMgbWVzc2FnZXMgb24gdGhlIEEtYmlzIGludGVyZmFjZSwKKyAqIHJlc3Qgb2N0ZXQgaGFuZGxpbmcgYWNjb3JkaW5nIHRvCisgKiAzR1BQIFRTIDA0LjA4IHZlcnNpb24gNy4yMS4wIFJlbGVhc2UgMTk5OCAvIEVUU0kgVFMgMTAwIDk0MCBWNy4yMS4wICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL2JpdHZlYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvcmVzdF9vY3RldHMuaD4KKworLyogZ2VuZXJhdGUgU0kxIHJlc3Qgb2N0ZXRzICovCitpbnQgcmVzdF9vY3RldHNfc2kxKHVfaW50OF90ICpkYXRhLCB1X2ludDhfdCAqbmNoX3BvcykKK3sKKwlzdHJ1Y3QgYml0dmVjIGJ2OworCisJbWVtc2V0KCZidiwgMCwgc2l6ZW9mKGJ2KSk7CisJYnYuZGF0YSA9IGRhdGE7CisJYnYuZGF0YV9sZW4gPSAxOworCisJaWYgKG5jaF9wb3MpIHsKKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBIKTsKKwkJYml0dmVjX3NldF91aW50KCZidiwgKm5jaF9wb3MsIDUpOworCX0gZWxzZQorCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEwpOworCisJYml0dmVjX3NwYXJlX3BhZGRpbmcoJmJ2LCA3KTsKKwlyZXR1cm4gYnYuZGF0YV9sZW47Cit9CisKKy8qIEFwcGVuZCBzZWxlY3Rpb24gcGFyYW1ldGVycyB0byBiaXR2ZWMgKi8KK3N0YXRpYyB2b2lkIGFwcGVuZF9zZWxlY3Rpb25fcGFyYW1zKHN0cnVjdCBiaXR2ZWMgKmJ2LAorCQkJCSAgICBjb25zdCBzdHJ1Y3QgZ3NtNDhfc2lfc2VsZWN0aW9uX3BhcmFtcyAqc3ApCit7CisJaWYgKHNwLT5wcmVzZW50KSB7CisJCWJpdHZlY19zZXRfYml0KGJ2LCBIKTsKKwkJYml0dmVjX3NldF9iaXQoYnYsIHNwLT5jYnEpOworCQliaXR2ZWNfc2V0X3VpbnQoYnYsIHNwLT5jZWxsX3Jlc2VsX29mZiwgNik7CisJCWJpdHZlY19zZXRfdWludChidiwgc3AtPnRlbXBfb2ZmcywgMyk7CisJCWJpdHZlY19zZXRfdWludChidiwgc3AtPnBlbmFsdHlfdGltZSwgNSk7CisJfSBlbHNlCisJCWJpdHZlY19zZXRfYml0KGJ2LCBMKTsKK30KKworLyogQXBwZW5kIHBvd2VyIG9mZnNldCB0byBiaXR2ZWMgKi8KK3N0YXRpYyB2b2lkIGFwcGVuZF9wb3dlcl9vZmZzZXQoc3RydWN0IGJpdHZlYyAqYnYsCisJCQkJY29uc3Qgc3RydWN0IGdzbTQ4X3NpX3Bvd2VyX29mZnNldCAqcG8pCit7CisJaWYgKHBvLT5wcmVzZW50KSB7CisJCWJpdHZlY19zZXRfYml0KGJ2LCBIKTsKKwkJYml0dmVjX3NldF91aW50KGJ2LCBwby0+cG93ZXJfb2Zmc2V0LCAyKTsKKwl9IGVsc2UKKwkJYml0dmVjX3NldF9iaXQoYnYsIEwpOworfQorCisvKiBBcHBlbmQgR1BSUyBpbmRpY2F0b3IgdG8gYml0dmVjICovCitzdGF0aWMgdm9pZCBhcHBlbmRfZ3Byc19pbmQoc3RydWN0IGJpdHZlYyAqYnYsCisJCQkgICAgY29uc3Qgc3RydWN0IGdzbTQ4X3NpM19ncHJzX2luZCAqZ2kpCit7CisJaWYgKGdpLT5wcmVzZW50KSB7CisJCWJpdHZlY19zZXRfYml0KGJ2LCBIKTsKKwkJYml0dmVjX3NldF91aW50KGJ2LCBnaS0+cmFfY29sb3VyLCAzKTsKKwkJLyogMCA9PSBTSTEzIGluIEJDQ0ggTm9ybSwgMSA9PSBTSTEzIHNlbnQgb24gQkNDSCBFeHQgKi8KKwkJYml0dmVjX3NldF9iaXQoYnYsIGdpLT5zaTEzX3Bvc2l0aW9uKTsKKwl9IGVsc2UKKwkJYml0dmVjX3NldF9iaXQoYnYsIEwpOworfQorCisKKy8qIEdlbmVyYXRlIFNJMyBSZXN0IE9jdGVzdHMgKENoYXB0ZXIgMTAuNS4yLjM0IC8gVGFibGUgMTAuNC43MikgKi8KK2ludCByZXN0X29jdGV0c19zaTModV9pbnQ4X3QgKmRhdGEsIGNvbnN0IHN0cnVjdCBnc200OF9zaV9yb19pbmZvICpzaTMpCit7CisJc3RydWN0IGJpdHZlYyBidjsKKworCW1lbXNldCgmYnYsIDAsIHNpemVvZihidikpOworCWJ2LmRhdGEgPSBkYXRhOworCWJ2LmRhdGFfbGVuID0gNDsKKworCS8qIE9wdGlvbmFsIFNlbGVjdGlvbiBQYXJhbWV0ZXJzICovCisJYXBwZW5kX3NlbGVjdGlvbl9wYXJhbXMoJmJ2LCAmc2kzLT5zZWxlY3Rpb25fcGFyYW1zKTsKKworCS8qIE9wdGlvbmFsIFBvd2VyIE9mZnNldCAqLworCWFwcGVuZF9wb3dlcl9vZmZzZXQoJmJ2LCAmc2kzLT5wb3dlcl9vZmZzZXQpOworCisJLyogRG8gd2UgaGF2ZSBhIFNJMnRlciBvbiB0aGUgQkNDSD8gKi8KKwlpZiAoc2kzLT5zaTJ0ZXJfaW5kaWNhdG9yKQorCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEgpOworCWVsc2UKKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBMKTsKKworCS8qIEVhcmx5IENsYXNzbWFyayBTZW5kaW5nIENvbnRyb2wgKi8KKwlpZiAoc2kzLT5lYXJseV9jbV9jdHJsKQorCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEgpOworCWVsc2UKKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBMKTsKKworCS8qIERvIHdlIGhhdmUgYSBTSSBUeXBlIDkgb24gdGhlIEJDQ0g/ICovCisJaWYgKHNpMy0+c2NoZWR1bGluZy5wcmVzZW50KSB7CisJCWJpdHZlY19zZXRfYml0KCZidiwgSCk7CisJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMy0+c2NoZWR1bGluZy53aGVyZSwgMyk7CisJfSBlbHNlCisJCWJpdHZlY19zZXRfYml0KCZidiwgTCk7CisKKwkvKiBHUFJTIEluZGljYXRvciAqLworCWFwcGVuZF9ncHJzX2luZCgmYnYsICZzaTMtPmdwcnNfaW5kKTsKKworCWJpdHZlY19zcGFyZV9wYWRkaW5nKCZidiwgKGJ2LmRhdGFfbGVuKjgpLTEpOworCXJldHVybiBidi5kYXRhX2xlbjsKK30KKworc3RhdGljIGludCBhcHBlbmRfbHNhX3BhcmFtcyhzdHJ1Y3QgYml0dmVjICpidiwKKwkJCSAgICAgY29uc3Qgc3RydWN0IGdzbTQ4X2xzYV9wYXJhbXMgKmxzYV9wYXJhbXMpCit7CisJLyogRklYTUUgKi8KK30KKworLyogR2VuZXJhdGUgU0k0IFJlc3QgT2N0ZXRzIChDaGFwdGVyIDEwLjUuMi4zNSkgKi8KK2ludCByZXN0X29jdGV0c19zaTQodV9pbnQ4X3QgKmRhdGEsIGNvbnN0IHN0cnVjdCBnc200OF9zaV9yb19pbmZvICpzaTQpCit7CisJc3RydWN0IGJpdHZlYyBidjsKKworCW1lbXNldCgmYnYsIDAsIHNpemVvZihidikpOworCWJ2LmRhdGEgPSBkYXRhOworCWJ2LmRhdGFfbGVuID0gMTA7IC8qIEZJWE1FOiB1cCB0byA/ICovCisKKwkvKiBTSTQgUmVzdCBPY3RldHMgTyAqLworCWFwcGVuZF9zZWxlY3Rpb25fcGFyYW1zKCZidiwgJnNpNC0+c2VsZWN0aW9uX3BhcmFtcyk7CisJYXBwZW5kX3Bvd2VyX29mZnNldCgmYnYsICZzaTQtPnBvd2VyX29mZnNldCk7CisJYXBwZW5kX2dwcnNfaW5kKCZidiwgJnNpNC0+Z3Byc19pbmQpOworCisJaWYgKDAgLyogRklYTUUgKi8pIHsKKwkJLyogSCBhbmQgU0k0IFJlc3QgT2N0ZXRzIFMgKi8KKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBIKTsKKworCQkvKiBMU0EgUGFyYW1ldGVycyAqLworCQlpZiAoc2k0LT5sc2FfcGFyYW1zLnByZXNlbnQpIHsKKwkJCWJpdHZlY19zZXRfYml0KCZidiwgSCk7CisJCQlhcHBlbmRfbHNhX3BhcmFtcygmYnYsICZzaTQtPmxzYV9wYXJhbXMpOworCQl9IGVsc2UKKwkJCWJpdHZlY19zZXRfYml0KCZidiwgTCk7CisKKwkJLyogQ2VsbCBJZGVudGl0eSAqLworCQlpZiAoMSkgeworCQkJYml0dmVjX3NldF9iaXQoJmJ2LCBIKTsKKwkJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpNC0+Y2VsbF9pZCwgMTYpOworCQl9IGVsc2UKKwkJCWJpdHZlY19zZXRfYml0KCZidiwgTCk7CisKKwkJLyogTFNBIElEIEluZm9ybWF0aW9uICovCisJCWlmICgwKSB7CisJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEgpOworCQkJLyogRklYTUUgKi8KKwkJfSBlbHNlCisJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEwpOworCX0gZWxzZSB7CisJCS8qIEwgYW5kIGJyZWFrIGluZGljYXRvciAqLworCQliaXR2ZWNfc2V0X2JpdCgmYnYsIEwpOworCQliaXR2ZWNfc2V0X2JpdCgmYnYsIHNpNC0+YnJlYWtfaW5kID8gSCA6IEwpOworCX0KKworCXJldHVybiBidi5kYXRhX2xlbjsKK30KKworLyogR1BSUyBNb2JpbGUgQWxsb2NhdGlvbiBhcyBwZXIgVFMgMDQuNjAgQ2hhcHRlciAxMi4xMGE6CisgICA8IEdQUlMgTW9iaWxlIEFsbG9jYXRpb24gSUUgPiA6Oj0KKyAgICAgPCBIU04gOiBiaXQgKDYpID4KKyAgICAgeyAwIHwgMSA8IFJGTCBudW1iZXIgbGlzdCA6IDwgUkZMIG51bWJlciBsaXN0IHN0cnVjdCA+ID4gfQorICAgICB7IDAgPCBNQV9MRU5HVEggOiBiaXQgKDYpID4KKyAgICAgICAgIDwgTUFfQklUTUFQOiBiaXQgKHZhbChNQV9MRU5HVEgpICsgMSkgPgorICAgICB8IDEgeyAwIHwgMSA8QVJGQ04gaW5kZXggbGlzdCA6IDwgQVJGQ04gaW5kZXggbGlzdCBzdHJ1Y3QgPiA+IH0gfSA7CisKKyAgICAgPCBSRkwgbnVtYmVyIGxpc3Qgc3RydWN0ID4gOjogPQorICAgICAgIDwgUkZMX05VTUJFUiA6IGJpdCAoNCkgPgorICAgICAgIHsgMCB8IDEgPCBSRkwgbnVtYmVyIGxpc3Qgc3RydWN0ID4gfSA7CisgICAgIDwgQVJGQ04gaW5kZXggbGlzdCBzdHJ1Y3QgPiA6Oj0KKyAgICAgICA8IEFSRkNOX0lOREVYIDogYml0KDYpID4KKyAgICAgICB7IDAgfCAxIDwgQVJGQ04gaW5kZXggbGlzdCBzdHJ1Y3QgPiB9IDsKKyAqLworc3RhdGljIGludCBhcHBlbmRfZ3Byc19tb2JpbGVfYWxsb2Moc3RydWN0IGJpdHZlYyAqYnYpCit7CisJLyogSG9wcGluZyBTZXF1ZW5jZSBOdW1iZXIgKi8KKwliaXR2ZWNfc2V0X3VpbnQoYnYsIDAsIDYpOworCisJaWYgKDApIHsKKwkJLyogV2Ugd2FudCB0byB1c2UgYSBSRkwgbnVtYmVyIGxpc3QgKi8KKwkJYml0dmVjX3NldF9iaXQoYnYsIDEpOworCQkvKiBGSVhNRTogUkZMIG51bWJlciBsaXN0ICovCisJfSBlbHNlCisJCWJpdHZlY19zZXRfYml0KGJ2LCAwKTsKKworCWlmICgwKSB7CisJCS8qIFdlIHdhbnQgdG8gdXNlIGEgTUFfQklUTUFQICovCisJCWJpdHZlY19zZXRfYml0KGJ2LCAwKTsKKwkJLyogRklYTUU6IE1BX0xFTkdUSCwgTUFfQklUTUFQLCAuLi4gKi8KKwl9IGVsc2UgeworCQliaXR2ZWNfc2V0X2JpdChidiwgMSk7CisJCWlmICgwKSB7CisJCQkvKiBXZSB3YW50IHRvIHByb3ZpZGUgYW4gQVJGQ04gaW5kZXggbGlzdCAqLworCQkJYml0dmVjX3NldF9iaXQoYnYsIDEpOworCQkJLyogRklYTUUgKi8KKwkJfSBlbHNlCisJCQliaXR2ZWNfc2V0X2JpdChidiwgMCk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGVuY29kZV90MzE5Mih1bnNpZ25lZCBpbnQgdDMxOTIpCit7CisJaWYgKHQzMTkyID09IDApCisJCXJldHVybiAzOworCWVsc2UgaWYgKHQzMTkyIDw9IDgwKQorCQlyZXR1cm4gNDsKKwllbHNlIGlmICh0MzE5MiA8PSAxMjApCisJCXJldHVybiA1OworCWVsc2UgaWYgKHQzMTkyIDw9IDE2MCkKKwkJcmV0dXJuIDY7CisJZWxzZSBpZiAodDMxOTIgPD0gMjAwKQorCQlyZXR1cm4gNzsKKwllbHNlIGlmICh0MzE5MiA8PSA1MDApCisJCXJldHVybiAwOworCWVsc2UgaWYgKHQzMTkyIDw9IDEwMDApCisJCXJldHVybiAxOworCWVsc2UgaWYgKHQzMTkyIDw9IDE1MDApCisJCXJldHVybiAyOworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7Cit9CisKK3N0YXRpYyBpbnQgZW5jb2RlX2RyeF90aW1lcih1bnNpZ25lZCBpbnQgZHJ4KQoreworCWlmIChkcnggPT0gMCkKKwkJcmV0dXJuIDA7CisJZWxzZSBpZiAoZHJ4ID09IDEpCisJCXJldHVybiAxOworCWVsc2UgaWYgKGRyeCA9PSAyKQorCQlyZXR1cm4gMjsKKwllbHNlIGlmIChkcnggPD0gNCkKKwkJcmV0dXJuIDM7CisJZWxzZSBpZiAoZHJ4IDw9IDgpCisJCXJldHVybiA0OworCWVsc2UgaWYgKGRyeCA8PSAxNikKKwkJcmV0dXJuIDU7CisJZWxzZSBpZiAoZHJ4IDw9IDMyKQorCQlyZXR1cm4gNjsKKwllbHNlIGlmIChkcnggPD0gNjQpCisJCXJldHVybiA3OworCWVsc2UKKwkJcmV0dXJuIC1FSU5WQUw7Cit9CisKKy8qIEdQUlMgQ2VsbCBPcHRpb25zIGFzIHBlciBUUyAwNC42MCBDaGFwdGVyIDEyLjI0CisJPCBHUFJTIENlbGwgT3B0aW9ucyBJRSA+IDo6PQorCQk8IE5NTyA6IGJpdCgyKSA+CisJCTwgVDMxNjggOiBiaXQoMykgPgorCQk8IFQzMTkyIDogYml0KDMpID4KKwkJPCBEUlhfVElNRVJfTUFYOiBiaXQoMykgPgorCQk8IEFDQ0VTU19CVVJTVF9UWVBFOiBiaXQgPgorCQk8IENPTlRST0xfQUNLX1RZUEUgOiBiaXQgPgorCQk8IEJTX0NWX01BWDogYml0KDQpID4KKwkJeyAwIHwgMSA8IFBBTl9ERUMgOiBiaXQoMykgPgorCQkJPCBQQU5fSU5DIDogYml0KDMpID4KKwkJCTwgUEFOX01BWCA6IGJpdCgzKSA+CisJCXsgMCB8IDEgPCBFeHRlbnNpb24gTGVuZ3RoIDogYml0KDYpID4KKwkJCTwgYml0ICh2YWwoRXh0ZW5zaW9uIExlbmd0aCkgKyAxCisJCQkmIHsgPCBFeHRlbnNpb24gSW5mb3JtYXRpb24gPiAhIHsgYml0ICoqID0gPG5vIHN0cmluZz4gfSB9IDsKKwk8IEV4dGVuc2lvbiBJbmZvcm1hdGlvbiA+IDo6PQorCQl7IDAgfCAxIDwgRUdQUlNfUEFDS0VUX0NIQU5ORUxfUkVRVUVTVCA6IGJpdCA+CisJCQk8IEJFUF9QRVJJT0QgOiBiaXQoNCkgPiB9CisJCTwgUEZDX0ZFQVRVUkVfTU9ERSA6IGJpdCA+CisJCTwgRFRNX1NVUFBPUlQgOiBiaXQgPgorCQk8QlNTX1BBR0lOR19DT09SRElOQVRJT046IGJpdCA+CisJCTxzcGFyZSBiaXQgPiAqKiA7CisgKi8KK3N0YXRpYyBpbnQgYXBwZW5kX2dwcnNfY2VsbF9vcHQoc3RydWN0IGJpdHZlYyAqYnYsCisJCQkJY29uc3Qgc3RydWN0IGdwcnNfY2VsbF9vcHRpb25zICpnY28pCit7CisJaW50IHQzMTkyLCBkcnhfdGltZXJfbWF4OworCisJdDMxOTIgPSBlbmNvZGVfdDMxOTIoZ2NvLT50MzE5Mik7CisJaWYgKHQzMTkyIDwgMCkKKwkJcmV0dXJuIHQzMTkyOworCisJZHJ4X3RpbWVyX21heCA9IGVuY29kZV9kcnhfdGltZXIoZ2NvLT5kcnhfdGltZXJfbWF4KTsKKwlpZiAoZHJ4X3RpbWVyX21heCA8IDApCisJCXJldHVybiBkcnhfdGltZXJfbWF4OworCisJYml0dmVjX3NldF91aW50KGJ2LCBnY28tPm5tbywgMik7CisJYml0dmVjX3NldF91aW50KGJ2LCBnY28tPnQzMTY4IC8gNTAwLCAzKTsKKwliaXR2ZWNfc2V0X3VpbnQoYnYsIHQzMTkyLCAzKTsKKwliaXR2ZWNfc2V0X3VpbnQoYnYsIGRyeF90aW1lcl9tYXgsIDMpOworCS8qIEFDQ0VTU19CVVJTVF9UWVBFOiBIYXJkLWNvZGUgOGJpdCAqLworCWJpdHZlY19zZXRfYml0KGJ2LCAwKTsKKwkvKiBDT05UUk9MX0FDS19UWVBFOiBIYXJkLWNvZGUgdG8gUkxDL01BQyBjb250cm9sIGJsb2NrICovCisJYml0dmVjX3NldF9iaXQoYnYsIDEpOworCWJpdHZlY19zZXRfdWludChidiwgZ2NvLT5ic19jdl9tYXgsIDQpOworCisJLyogaGFyZC1jb2RlIG5vIFBBTl97REVDLElOQyxNQVh9ICovCisJYml0dmVjX3NldF9iaXQoYnYsIDApOworCisJLyogbm8gZXh0ZW5zaW9uIGluZm9ybWF0aW9uIChFREdFKSAqLworCWJpdHZlY19zZXRfYml0KGJ2LCAwKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhcHBlbmRfZ3Byc19wd3JfY3RybF9wYXJzKHN0cnVjdCBiaXR2ZWMgKmJ2LAorCQkJCSAgICAgIGNvbnN0IHN0cnVjdCBncHJzX3Bvd2VyX2N0cmxfcGFycyAqcGNwKQoreworCWJpdHZlY19zZXRfdWludChidiwgcGNwLT5hbHBoYSwgNCk7CisJYml0dmVjX3NldF91aW50KGJ2LCBwY3AtPnRfYXZnX3csIDUpOworCWJpdHZlY19zZXRfdWludChidiwgcGNwLT50X2F2Z190LCA1KTsKKwliaXR2ZWNfc2V0X3VpbnQoYnYsIHBjcC0+cGNfbWVhc19jaGFuLCAxKTsKKwliaXR2ZWNfc2V0X3VpbnQoYnYsIHBjcC0+bl9hdmdfaSwgNCk7Cit9CisKKy8qIEdlbmVyYXRlIFNJMTMgUmVzdCBPY3Rlc3RzIChDaGFwdGVyIDEwLjUuMi4zN2IpICovCitpbnQgcmVzdF9vY3RldHNfc2kxMyh1X2ludDhfdCAqZGF0YSwgY29uc3Qgc3RydWN0IGdzbTQ4X3NpMTNfaW5mbyAqc2kxMykKK3sKKwlzdHJ1Y3QgYml0dmVjIGJ2OworCisJbWVtc2V0KCZidiwgMCwgc2l6ZW9mKGJ2KSk7CisJYnYuZGF0YSA9IGRhdGE7CisJYnYuZGF0YV9sZW4gPSAyMDsKKworCWlmICgwKSB7CisJCS8qIE5vIHJlc3Qgb2N0ZXRzICovCisJCWJpdHZlY19zZXRfYml0KCZidiwgTCk7CisJfSBlbHNlIHsKKwkJYml0dmVjX3NldF9iaXQoJmJ2LCBIKTsKKwkJYml0dmVjX3NldF91aW50KCZidiwgc2kxMy0+YmNjaF9jaGFuZ2VfbWFyaywgMyk7CisJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPnNpX2NoYW5nZV9maWVsZCwgNCk7CisJCWlmICgxKSB7CisJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIDApOworCQl9IGVsc2UgeworCQkJYml0dmVjX3NldF9iaXQoJmJ2LCAxKTsKKwkJCWJpdHZlY19zZXRfdWludCgmYnYsIHNpMTMtPmJjY2hfY2hhbmdlX21hcmssIDIpOworCQkJYXBwZW5kX2dwcnNfbW9iaWxlX2FsbG9jKCZidik7CisJCX0KKwkJaWYgKCFzaTEzLT5wYmNjaF9wcmVzZW50KSB7CisJCQkvKiBQQkNDSCBub3QgcHJlc2VudCBpbiBjZWxsICovCisJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIDApOworCQkJYml0dmVjX3NldF91aW50KCZidiwgc2kxMy0+bm9fcGJjY2gucmFjLCA4KTsKKwkJCWJpdHZlY19zZXRfYml0KCZidiwgc2kxMy0+bm9fcGJjY2guc3BnY19jY2NoX3N1cCk7CisJCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTEzLT5ub19wYmNjaC5wcmlvX2FjY190aHIsIDMpOworCQkJYml0dmVjX3NldF91aW50KCZidiwgc2kxMy0+bm9fcGJjY2gubmV0X2N0cmxfb3JkLCAyKTsKKwkJCWFwcGVuZF9ncHJzX2NlbGxfb3B0KCZidiwgJnNpMTMtPmNlbGxfb3B0cyk7CisJCQlhcHBlbmRfZ3Byc19wd3JfY3RybF9wYXJzKCZidiwgJnNpMTMtPnB3cl9jdHJsX3BhcnMpOworCQl9IGVsc2UgeworCQkJLyogUEJDQ0ggcHJlc2VudCBpbiBjZWxsICovCisJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIDEpOworCQkJYml0dmVjX3NldF91aW50KCZidiwgc2kxMy0+cGJjY2gucHNpMV9yZXBfcGVyLCA0KTsKKwkJCS8qIFBCQ0NIIERlc2NyaXBpdG9uICovCisJCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTEzLT5wYmNjaC5wYiwgNCk7CisJCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTEzLT5wYmNjaC50c2MsIDMpOworCQkJYml0dmVjX3NldF91aW50KCZidiwgc2kxMy0+cGJjY2gudG4sIDMpOworCQkJc3dpdGNoIChzaTEzLT5wYmNjaC5jYXJyaWVyX3R5cGUpIHsKKwkJCWNhc2UgUEJDQ0hfQkNDSDoKKwkJCQliaXR2ZWNfc2V0X2JpdCgmYnYsIDApOworCQkJCWJpdHZlY19zZXRfYml0KCZidiwgMCk7CisJCQkJYnJlYWs7CisJCQljYXNlIFBCQ0NIX0FSRkNOOgorCQkJCWJpdHZlY19zZXRfYml0KCZidiwgMCk7CisJCQkJYml0dmVjX3NldF9iaXQoJmJ2LCAxKTsKKwkJCQliaXR2ZWNfc2V0X3VpbnQoJmJ2LCBzaTEzLT5wYmNjaC5hcmZjbiwgMTApOworCQkJCWJyZWFrOworCQkJY2FzZSBQQkNDSF9NQUlPOgorCQkJCWJpdHZlY19zZXRfYml0KCZidiwgMSk7CisJCQkJYml0dmVjX3NldF91aW50KCZidiwgc2kxMy0+cGJjY2gubWFpbywgNik7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisJYml0dmVjX3NwYXJlX3BhZGRpbmcoJmJ2LCAoYnYuZGF0YV9sZW4qOCktMSk7CisJcmV0dXJuIGJ2LmRhdGFfbGVuOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvcnJscC5jIGIvb3BlbmJzYy9zcmMvcnJscC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM1MDQ0NTEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9ycmxwLmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qIFJhZGlvIFJlc291cmNlIExDUyAoTG9jYXRpb24pIFByb3RvY29sLCBHTVMgVFMgMDQuMzEgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqCisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvY2hhbl9hbGxvYy5oPgorCisvKiBSUkxQIG1zUG9zaXRpb25SZXEsIG5zQmFzZWQsCisgKglBY2N1cmFjeT02MCwgTWV0aG9kPWdwcywgUmVzcG9uc2VUaW1lPTIsIG9uZVNldCAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IG1zX2Jhc2VkX3Bvc19yZXFbXSA9IHsgMHg0MCwgMHgwMSwgMHg3OCwgMHhhOCB9OworCisvKiBSUkxQIG1zUG9zaXRpb25SZXEsIG1zQmFzZWRQcmVmLAorCUFjY3VyYWN5PTYwLCBNZXRob2Q9Z3BzT3JFT1RELCBSZXNwb25zZVRpbWU9NSwgbXVsdGlwbGVTZXRzICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgbXNfcHJlZl9wb3NfcmVxW10gID0geyAweDQwLCAweDAyLCAweDc5LCAweDUwIH07CisKKy8qIFJSTFAgbXNQb3NpdGlvblJlcSwgbXNBc3Npc3RlZFByZWYsCisJQWNjdXJhY3k9NjAsIE1ldGhvZD1ncHNPckVPVEQsIFJlc3BvbnNlVGltZT01LCBtdWx0aXBsZVNldHMgKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBhc3NfcHJlZl9wb3NfcmVxW10gPSB7IDB4NDAsIDB4MDMsIDB4NzksIDB4NTAgfTsKKworc3RhdGljIGludCBzZW5kX3JybHBfcmVxKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gbGNoYW4tPnRzLT50cngtPmJ0cy0+bmV0d29yazsKKwljb25zdCB1X2ludDhfdCAqcmVxOworCisJc3dpdGNoIChuZXQtPnJybHAubW9kZSkgeworCWNhc2UgUlJMUF9NT0RFX01TX0JBU0VEOgorCQlyZXEgPSBtc19iYXNlZF9wb3NfcmVxOworCQlicmVhazsKKwljYXNlIFJSTFBfTU9ERV9NU19QUkVGOgorCQlyZXEgPSBtc19wcmVmX3Bvc19yZXE7CisJCWJyZWFrOworCWNhc2UgUlJMUF9NT0RFX0FTU19QUkVGOgorCQlyZXEgPSBhc3NfcHJlZl9wb3NfcmVxOworCQlicmVhazsKKwljYXNlIFJSTFBfTU9ERV9OT05FOgorCWRlZmF1bHQ6CisJCXJldHVybiAwOworCX0KKworCXJldHVybiBnc200OF9zZW5kX3JyX2FwcF9pbmZvKGxjaGFuLCAweDAwLAorCQkJCSAgICAgIHNpemVvZihtc19iYXNlZF9wb3NfcmVxKSwgcmVxKTsKK30KKworc3RhdGljIGludCBzdWJzY3Jfc2lnX2NiKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsCisJCQkgdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKworCXN3aXRjaCAoc2lnbmFsKSB7CisJY2FzZSBTX1NVQlNDUl9BVFRBQ0hFRDoKKwkJLyogQSBzdWJzY3JpYmVyIGhhcyBhdHRhY2hlZC4gKi8KKwkJc3Vic2NyID0gc2lnbmFsX2RhdGE7CisJCWxjaGFuID0gbGNoYW5fZm9yX3N1YnNjcihzdWJzY3IpOworCQlpZiAoIWxjaGFuKQorCQkJYnJlYWs7CisJCXNlbmRfcnJscF9yZXEobGNoYW4pOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgcGFnaW5nX3NpZ19jYih1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkJIHZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpCit7CisJc3RydWN0IHBhZ2luZ19zaWduYWxfZGF0YSAqcHNpZ19kYXRhID0gc2lnbmFsX2RhdGE7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU19QQUdJTkdfU1VDQ0VFREVEOgorCQkvKiBBIHN1YnNjcmliZXIgaGFzIGF0dGFjaGVkLiAqLworCQlzZW5kX3JybHBfcmVxKHBzaWdfZGF0YS0+bGNoYW4pOworCQlicmVhazsKKwljYXNlIFNfUEFHSU5HX0VYUElSRUQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gMDsKK30KKwordm9pZCBvbl9kc29fbG9hZF9ycmxwKHZvaWQpCit7CisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfU1VCU0NSLCBzdWJzY3Jfc2lnX2NiLCBOVUxMKTsKKwlyZWdpc3Rlcl9zaWduYWxfaGFuZGxlcihTU19QQUdJTkcsIHBhZ2luZ19zaWdfY2IsIE5VTEwpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvcnMyMzIuYyBiL29wZW5ic2Mvc3JjL3JzMjMyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzZhZjU5YwotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3JzMjMyLmMKQEAgLTAsMCArMSwyNDkgQEAKKy8qIE9wZW5CU0MgQlMtMTEgVC1MaW5rIGludGVyZmFjZSB1c2luZyBQT1NJWCBzZXJpYWwgcG9ydCAqLworCisvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8dGVybWlvcy5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlIDxvc21vY29yZS9zZWxlY3QuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3JzMjMyLmg+CisKKy8qIGFkYXB0aW9uIGxheWVyIGZyb20gR1NNIDA4LjU5ICsgMTIuMjEgdG8gUlMyMzIgKi8KKworc3RydWN0IHNlcmlhbF9oYW5kbGUgeworCXN0cnVjdCBic2NfZmQgZmQ7CisJc3RydWN0IGxsaXN0X2hlYWQgdHhfcXVldWU7CisKKwlzdHJ1Y3QgbXNnYiAqcnhfbXNnOworCXVuc2lnbmVkIGludCByeG1zZ19ieXRlc19taXNzaW5nOworCisJdW5zaWduZWQgaW50IGRlbGF5X21zOworCXN0cnVjdCBnc21fYnRzICpidHM7Cit9OworCisvKiBGSVhNRTogdGhpcyBuZWVkcyB0byBnbyAqLworc3RhdGljIHN0cnVjdCBzZXJpYWxfaGFuZGxlIF9zZXJfaGFuZGxlLCAqc2VyX2hhbmRsZSA9ICZfc2VyX2hhbmRsZTsKKworI2RlZmluZSBMQVBEX0hEUl9MRU4JMTAKKworc3RhdGljIGludCBoYW5kbGVfc2VyX3dyaXRlKHN0cnVjdCBic2NfZmQgKmJmZCk7CisKKy8qIGNhbGxiYWNrIGZyb20gYWJpc19ubSAqLworaW50IF9hYmlzX25tX3NlbmRtc2coc3RydWN0IG1zZ2IgKm1zZykKK3sKKwlzdHJ1Y3Qgc2VyaWFsX2hhbmRsZSAqc2ggPSBzZXJfaGFuZGxlOworCXVfaW50OF90ICpsYXBkOworCXVuc2lnbmVkIGludCBsZW47CisKKwltc2ctPmwyaCA9IG1zZy0+ZGF0YTsKKworCS8qIHByZXBlbmQgTEFQRCBoZWFkZXIgKi8KKwlsYXBkID0gbXNnYl9wdXNoKG1zZywgTEFQRF9IRFJfTEVOKTsKKworCWxlbiA9IG1zZy0+bGVuIC0gMjsKKworCWxhcGRbMF0gPSAobGVuID4+IDgpICYgMHhmZjsKKwlsYXBkWzFdID0gbGVuICYgMHhmZjsgLyogbGVuZ3RoIG9mIGJ5dGVzIHN0YXJ0aWduIGF0IGxhcGRbMl0gKi8KKwlsYXBkWzJdID0gMHgwMDsKKwlsYXBkWzNdID0gMHgwNzsKKwlsYXBkWzRdID0gMHgwMTsKKwlsYXBkWzVdID0gMHgzZTsKKwlsYXBkWzZdID0gMHgwMDsKKwlsYXBkWzddID0gMHgwMDsKKwlsYXBkWzhdID0gbXNnLT5sZW4gLSAxMDsgLyogbGVuZ3RoIG9mIGJ5dGVzIHN0YXJ0aW5nIGF0IGxhcGRbMTBdICovCisJbGFwZFs5XSA9IGxhcGRbOF0gXiAweDM4OworCisJbXNnYl9lbnF1ZXVlKCZzaC0+dHhfcXVldWUsIG1zZyk7CisJc2gtPmZkLndoZW4gfD0gQlNDX0ZEX1dSSVRFOworCisJLyogd2UgdHJ5IHRvIGltbWVkaWF0ZWx5IHNlbmQgKi8KKwloYW5kbGVfc2VyX3dyaXRlKCZzaC0+ZmQpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHNlbGVjdC5jIGNhbGxiYWNrIGluIGNhc2Ugd2UgY2FuIHdyaXRlIHRvIHRoZSBSUzIzMiAqLworc3RhdGljIGludCBoYW5kbGVfc2VyX3dyaXRlKHN0cnVjdCBic2NfZmQgKmJmZCkKK3sKKwlzdHJ1Y3Qgc2VyaWFsX2hhbmRsZSAqc2ggPSBiZmQtPmRhdGE7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlpbnQgd3JpdHRlbjsKKworCW1zZyA9IG1zZ2JfZGVxdWV1ZSgmc2gtPnR4X3F1ZXVlKTsKKwlpZiAoIW1zZykgeworCQliZmQtPndoZW4gJj0gfkJTQ19GRF9XUklURTsKKwkJcmV0dXJuIDA7CisJfQorCisJREVCVUdQKERNSSwgIlJTMjMyIFRYOiAlc1xuIiwgaGV4ZHVtcChtc2ctPmRhdGEsIG1zZy0+bGVuKSk7CisKKwkvKiBzZW5kIG92ZXIgc2VyaWFsIGxpbmUgKi8KKwl3cml0dGVuID0gd3JpdGUoYmZkLT5mZCwgbXNnLT5kYXRhLCBtc2ctPmxlbik7CisJaWYgKHdyaXR0ZW4gPCBtc2ctPmxlbikgeworCQlwZXJyb3IoInNob3J0IHdyaXRlOiIpOworCQltc2diX2ZyZWUobXNnKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW1zZ2JfZnJlZShtc2cpOworCXVzbGVlcChzaC0+ZGVsYXlfbXMqMTAwMCk7CisKKwlyZXR1cm4gMDsKK30KKworI2RlZmluZSBTRVJJQUxfQUxMT0NfU0laRQkzMDAKKworLyogc2VsZWN0LmMgY2FsbGJhY2sgaW4gY2FzZSB3ZSBjYW4gcmVhZCBmcm9tIHRoZSBSUzIzMiAqLworc3RhdGljIGludCBoYW5kbGVfc2VyX3JlYWQoc3RydWN0IGJzY19mZCAqYmZkKQoreworCXN0cnVjdCBzZXJpYWxfaGFuZGxlICpzaCA9IGJmZC0+ZGF0YTsKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCWludCByYyA9IDA7CisKKwlpZiAoIXNoLT5yeF9tc2cpIHsKKwkJc2gtPnJ4X21zZyA9IG1zZ2JfYWxsb2MoU0VSSUFMX0FMTE9DX1NJWkUsICJSUzIzMiBSeCIpOworCQlzaC0+cnhfbXNnLT5sMmggPSBOVUxMOworCQlzaC0+cnhfbXNnLT50cnggPSBzaC0+YnRzLT5jMDsKKwl9CisJbXNnID0gc2gtPnJ4X21zZzsKKworCS8qIGZpcnN0IHJlYWQgdHdvIGJ5ZXMgdG8gb2J0YWluIGxlbmd0aCAqLworCWlmIChtc2ctPmxlbiA8IDIpIHsKKwkJcmMgPSByZWFkKHNoLT5mZC5mZCwgbXNnLT50YWlsLCAyIC0gbXNnLT5sZW4pOworCQlpZiAocmMgPCAwKSB7CisJCQlwZXJyb3IoIkVSUk9SIHJlYWRpbmcgZnJvbSBzZXJpYWwgcG9ydCIpOworCQkJbXNnYl9mcmVlKG1zZyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwkJbXNnYl9wdXQobXNnLCByYyk7CisKKwkJaWYgKG1zZy0+bGVuID49IDIpIHsKKwkJCS8qIHBhcnNlIExBUEQgcGF5bG9hZCBsZW5ndGggKi8KKwkJCWlmIChtc2ctPmRhdGFbMF0gIT0gMCkKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIlN1c3BpY2lvdXMgaGVhZGVyIGJ5dGUgMDogMHglMDJ4XG4iLAorCQkJCQltc2ctPmRhdGFbMF0pOworCisJCQlzaC0+cnhtc2dfYnl0ZXNfbWlzc2luZyA9IG1zZy0+ZGF0YVswXSA8PCA4OworCQkJc2gtPnJ4bXNnX2J5dGVzX21pc3NpbmcgKz0gbXNnLT5kYXRhWzFdOworCisJCQlpZiAoc2gtPnJ4bXNnX2J5dGVzX21pc3NpbmcgPCBMQVBEX0hEUl9MRU4gLTIpCisJCQkJZnByaW50ZihzdGRlcnIsICJJbnZhbGlkIGxlbmd0aCBpbiBoZHI6ICV1XG4iLAorCQkJCQlzaC0+cnhtc2dfYnl0ZXNfbWlzc2luZyk7CisJCX0KKwl9IGVsc2UgeyAKKwkJLyogdHJ5IHRvIHJlYWQgYXMgbWFueSBvZiB0aGUgbWlzc2luZyBieXRlcyBhcyBhcmUgYXZhaWxhYmxlICovCisJCXJjID0gcmVhZChzaC0+ZmQuZmQsIG1zZy0+dGFpbCwgc2gtPnJ4bXNnX2J5dGVzX21pc3NpbmcpOworCQlpZiAocmMgPCAwKSB7CisJCQlwZXJyb3IoIkVSUk9SIHJlYWRpbmcgZnJvbSBzZXJpYWwgcG9ydCIpOworCQkJbXNnYl9mcmVlKG1zZyk7CisJCQlyZXR1cm4gcmM7CisJCX0KKwkJbXNnYl9wdXQobXNnLCByYyk7CisJCXNoLT5yeG1zZ19ieXRlc19taXNzaW5nIC09IHJjOworCisJCWlmIChzaC0+cnhtc2dfYnl0ZXNfbWlzc2luZyA9PSAwKSB7CisJCQkvKiB3ZSBoYXZlIG9uZSBjb21wbGV0ZSBtZXNzYWdlIG5vdyAqLworCQkJc2gtPnJ4X21zZyA9IE5VTEw7CisKKwkJCWlmIChtc2ctPmxlbiA+IExBUERfSERSX0xFTikKKwkJCQltc2ctPmwyaCA9IG1zZy0+ZGF0YSArIExBUERfSERSX0xFTjsKKworCQkJREVCVUdQKERNSSwgIlJTMjMyIFJYOiAlc1xuIiwgaGV4ZHVtcChtc2ctPmRhdGEsIG1zZy0+bGVuKSk7CisJCQlyYyA9IGhhbmRsZV9zZXJpYWxfbXNnKG1zZyk7CisJCX0KKwl9CisKKwlyZXR1cm4gcmM7Cit9CisKKy8qIHNlbGVjdC5jIGNhbGxiYWNrICovCitzdGF0aWMgaW50IHNlcmlhbF9mZF9jYihzdHJ1Y3QgYnNjX2ZkICpiZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCWludCByYyA9IDA7CisKKwlpZiAod2hhdCAmIEJTQ19GRF9SRUFEKQorCQlyYyA9IGhhbmRsZV9zZXJfcmVhZChiZmQpOworCisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJaWYgKHdoYXQgJiBCU0NfRkRfV1JJVEUpCisJCXJjID0gaGFuZGxlX3Nlcl93cml0ZShiZmQpOworCisJcmV0dXJuIHJjOworfQorCitpbnQgcnMyMzJfc2V0dXAoY29uc3QgY2hhciAqc2VyaWFsX3BvcnQsIHVuc2lnbmVkIGludCBkZWxheV9tcywKKwkJc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlpbnQgcmMsIHNlcmlhbF9mZDsKKwlzdHJ1Y3QgdGVybWlvcyB0aW87CisKKwlzZXJpYWxfZmQgPSBvcGVuKHNlcmlhbF9wb3J0LCBPX1JEV1IpOworCWlmIChzZXJpYWxfZmQgPCAwKSB7CisJCXBlcnJvcigiY2Fubm90IG9wZW4gc2VyaWFsIHBvcnQ6Iik7CisJCXJldHVybiBzZXJpYWxfZmQ7CisJfQorCisJLyogc2V0IGJhdWRyYXRlICovCisJcmMgPSB0Y2dldGF0dHIoc2VyaWFsX2ZkLCAmdGlvKTsKKwlpZiAocmMgPCAwKSB7CisJCXBlcnJvcigidGNnZXRhdHRyKCkiKTsKKwkJcmV0dXJuIHJjOworCX0KKwljZnNldGlzcGVlZCgmdGlvLCBCMTkyMDApOworCWNmc2V0b3NwZWVkKCZ0aW8sIEIxOTIwMCk7CisJdGlvLmNfY2ZsYWcgfD0gIChDUkVBRCB8IENMT0NBTCB8IENTOCk7CisJdGlvLmNfY2ZsYWcgJj0gfihQQVJFTkIgfCBDU1RPUEIgfCBDU0laRSB8IENSVFNDVFMpOworCXRpby5jX2xmbGFnICY9IH4oSUNBTk9OIHwgRUNITyB8IEVDSE9FIHwgSVNJRyk7CisJdGlvLmNfaWZsYWcgfD0gIChJTlBDSyB8IElTVFJJUCk7CisJdGlvLmNfaWZsYWcgJj0gfihJU1RSSVAgfCBJWE9OIHwgSVhPRkYgfCBJR05CUksgfCBJTkxDUiB8IElDUk5MIHwgSUdOQ1IpOworCXRpby5jX29mbGFnICY9IH4oT1BPU1QpOworCXJjID0gdGNzZXRhdHRyKHNlcmlhbF9mZCwgVENTQURSQUlOLCAmdGlvKTsKKwlpZiAocmMgPCAwKSB7CisJCXBlcnJvcigidGNzZXRhdHRyKCkiKTsKKwkJcmV0dXJuIHJjOworCX0KKworCUlOSVRfTExJU1RfSEVBRCgmc2VyX2hhbmRsZS0+dHhfcXVldWUpOworCXNlcl9oYW5kbGUtPmZkLmZkID0gc2VyaWFsX2ZkOworCXNlcl9oYW5kbGUtPmZkLndoZW4gPSBCU0NfRkRfUkVBRDsKKwlzZXJfaGFuZGxlLT5mZC5jYiA9IHNlcmlhbF9mZF9jYjsKKwlzZXJfaGFuZGxlLT5mZC5kYXRhID0gc2VyX2hhbmRsZTsKKwlzZXJfaGFuZGxlLT5kZWxheV9tcyA9IGRlbGF5X21zOworCXNlcl9oYW5kbGUtPmJ0cyA9IGJ0czsKKwlyYyA9IGJzY19yZWdpc3Rlcl9mZCgmc2VyX2hhbmRsZS0+ZmQpOworCWlmIChyYyA8IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJjb3VsZCBub3QgcmVnaXN0ZXIgRkQ6ICVzXG4iLAorCQkJc3RyZXJyb3IocmMpKTsKKwkJcmV0dXJuIHJjOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvcnRwX3Byb3h5LmMgYi9vcGVuYnNjL3NyYy9ydHBfcHJveHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjJlMmZkCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvcnRwX3Byb3h5LmMKQEAgLTAsMCArMSw3MjQgQEAKKy8qIFJUUCBwcm94eSBoYW5kbGluZyBmb3IgaXAuYWNjZXNzIG5hbm9CVFMgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8ZW5kaWFuLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgorI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+ICAgIC8qIGdldHRpbWVvZmRheSgpICovCisjaW5jbHVkZSA8dW5pc3RkLmg+ICAgICAgLyogZ2V0Li4oKSAqLworI2luY2x1ZGUgPHRpbWUuaD4gICAgICAgIC8qIGNsb2NrKCkgKi8KKyNpbmNsdWRlIDxzeXMvdXRzbmFtZS5oPiAvKiB1bmFtZSgpICovCisKKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9kYXRhLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3NlbGVjdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3J0cF9wcm94eS5oPgorCitzdGF0aWMgTExJU1RfSEVBRChydHBfc29ja2V0cyk7CisKKy8qIHNob3VsZCB3ZSBtYW5nbGUgdGhlIENOQU1FIGluc2lkZSBTREVTIG9mIFJUQ1AgcGFja2V0cz8gV2UgZGlzYWJsZQorICogdGhpcyBieSBkZWZhdWx0LCBhcyBpdCBzZWVtcyB0byBiZSBub3QgbmVlZGVkICovCitzdGF0aWMgaW50IG1hbmdsZV9ydGNwX2NuYW1lID0gMDsKKworZW51bSBydHBfYmZkX3ByaXYgeworCVJUUF9QUklWX05PTkUsCisJUlRQX1BSSVZfUlRQLAorCVJUUF9QUklWX1JUQ1AKK307CisKKyNkZWZpbmUgUlRQX0FMTE9DX1NJWkUJMTUwMAorCisvKiBhY2NvcmRpbmcgdG8gUkZDIDE4ODkgKi8KK3N0cnVjdCBydGNwX2hkciB7CisJdV9pbnQ4X3QgYnl0ZTA7CisJdV9pbnQ4X3QgdHlwZTsKKwl1X2ludDE2X3QgbGVuZ3RoOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworI2RlZmluZSBSVENQX1RZUEVfU0RFUwkyMDIKKwkKKyNkZWZpbmUgUlRDUF9JRV9DTkFNRQkxCisKKy8qIGFjY29yZGluZyB0byBSRkMgMzU1MCAqLworc3RydWN0IHJ0cF9oZHIgeworI2lmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4KKwl1X2ludDhfdCAgY3NyY19jb3VudDo0LAorCQkgIGV4dGVuc2lvbjoxLAorCQkgIHBhZGRpbmc6MSwKKwkJICB2ZXJzaW9uOjI7CisJdV9pbnQ4X3QgIHBheWxvYWRfdHlwZTo3LAorCQkgIG1hcmtlcjoxOworI2VsaWYgX19CWVRFX09SREVSID09IF9fQklHX0VORElBTgorCXVfaW50OF90ICB2ZXJzaW9uOjIsCisJCSAgcGFkZGluZzoxLAorCQkgIGV4dGVuc2lvbjoxLAorCQkgIGNzcmNfY291bnQ6NDsKKwl1X2ludDhfdCAgbWFya2VyOjEsCisJCSAgcGF5bG9hZF90eXBlOjc7CisjZW5kaWYKKwl1X2ludDE2X3Qgc2VxdWVuY2U7CisJdV9pbnQzMl90IHRpbWVzdGFtcDsKKwl1X2ludDMyX3Qgc3NyYzsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCBydHBfeF9oZHIgeworCXVfaW50MTZfdCBieV9wcm9maWxlOworCXVfaW50MTZfdCBsZW5ndGg7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCisjZGVmaW5lIFJUUF9WRVJTSU9OCTIKKworI2RlZmluZSBSVFBfUFRfR1NNX0ZVTEwJMworI2RlZmluZSBSVFBfUFRfR1NNX0VGUgk5NworCisvKiBkZWNvZGUgYW4gcnRwIGZyYW1lIGFuZCBjcmVhdGUgYSBuZXcgYnVmZmVyIHdpdGggcGF5bG9hZCAqLworc3RhdGljIGludCBydHBfZGVjb2RlKHN0cnVjdCBtc2diICptc2csIHVfaW50MzJfdCBjYWxscmVmLCBzdHJ1Y3QgbXNnYiAqKmRhdGEpCit7CisJc3RydWN0IG1zZ2IgKm5ld19tc2c7CisJc3RydWN0IGdzbV9kYXRhX2ZyYW1lICpmcmFtZTsKKwlzdHJ1Y3QgcnRwX2hkciAqcnRwaCA9IChzdHJ1Y3QgcnRwX2hkciAqKW1zZy0+ZGF0YTsKKwlzdHJ1Y3QgcnRwX3hfaGRyICpydHB4aDsKKwl1X2ludDhfdCAqcGF5bG9hZDsKKwlpbnQgcGF5bG9hZF9sZW47CisJaW50IG1zZ190eXBlOworCWludCB4X2xlbjsKKworCWlmIChtc2ctPmxlbiA8IDEyKSB7CisJCURFQlVHUEMoRE1VWCwgInJlY2VpdmVkIFJUUCBmcmFtZSB0b28gc2hvcnQgKGxlbiA9ICVkKVxuIiwKKwkJCW1zZy0+bGVuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChydHBoLT52ZXJzaW9uICE9IFJUUF9WRVJTSU9OKSB7CisJCURFQlVHUEMoRE1VWCwgInJlY2VpdmVkIFJUUCB2ZXJzaW9uICVkIG5vdCBzdXBwb3J0ZWQuXG4iLAorCQkJcnRwaC0+dmVyc2lvbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlwYXlsb2FkID0gbXNnLT5kYXRhICsgc2l6ZW9mKHN0cnVjdCBydHBfaGRyKSArIChydHBoLT5jc3JjX2NvdW50IDw8IDIpOworCXBheWxvYWRfbGVuID0gbXNnLT5sZW4gLSBzaXplb2Yoc3RydWN0IHJ0cF9oZHIpIC0gKHJ0cGgtPmNzcmNfY291bnQgPDwgMik7CisJaWYgKHBheWxvYWRfbGVuIDwgMCkgeworCQlERUJVR1BDKERNVVgsICJyZWNlaXZlZCBSVFAgZnJhbWUgdG9vIHNob3J0IChsZW4gPSAlZCwgIgorCQkJImNzcmMgY291bnQgPSAlZClcbiIsIG1zZy0+bGVuLCBydHBoLT5jc3JjX2NvdW50KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCWlmIChydHBoLT5leHRlbnNpb24pIHsKKwkJaWYgKHBheWxvYWRfbGVuIDwgc2l6ZW9mKHN0cnVjdCBydHBfeF9oZHIpKSB7CisJCQlERUJVR1BDKERNVVgsICJyZWNlaXZlZCBSVFAgZnJhbWUgdG9vIHNob3J0IGZvciAiCisJCQkJImV4dGVuc2lvbiBoZWFkZXJcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcnRweGggPSAoc3RydWN0IHJ0cF94X2hkciAqKXBheWxvYWQ7CisJCXhfbGVuID0gbnRvaHMocnRweGgtPmxlbmd0aCkgKiA0ICsgc2l6ZW9mKHN0cnVjdCBydHBfeF9oZHIpOworCQlwYXlsb2FkICs9IHhfbGVuOworCQlwYXlsb2FkX2xlbiAtPSB4X2xlbjsKKwkJaWYgKHBheWxvYWRfbGVuIDwgMCkgeworCQkJREVCVUdQQyhETVVYLCAicmVjZWl2ZWQgUlRQIGZyYW1lIHRvbyBzaG9ydCwgIgorCQkJCSJleHRlbnNpb24gaGVhZGVyIGV4Y2VlZHMgZnJhbWUgbGVuZ3RoXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJfQorCWlmIChydHBoLT5wYWRkaW5nKSB7CisJCWlmIChwYXlsb2FkX2xlbiA8IDApIHsKKwkJCURFQlVHUEMoRE1VWCwgInJlY2VpdmVkIFJUUCBmcmFtZSB0b28gc2hvcnQgZm9yICIKKwkJCQkicGFkZGluZyBsZW5ndGhcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJcGF5bG9hZF9sZW4gLT0gcGF5bG9hZFtwYXlsb2FkX2xlbiAtIDFdOworCQlpZiAocGF5bG9hZF9sZW4gPCAwKSB7CisJCQlERUJVR1BDKERNVVgsICJyZWNlaXZlZCBSVFAgZnJhbWUgd2l0aCBwYWRkaW5nICIKKwkJCQkiZ3JlYXRlciB0aGFuIHBheWxvYWRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwl9CisKKwlzd2l0Y2ggKHJ0cGgtPnBheWxvYWRfdHlwZSkgeworCWNhc2UgUlRQX1BUX0dTTV9GVUxMOgorCQltc2dfdHlwZSA9IEdTTV9UQ0hGX0ZSQU1FOworCQlpZiAocGF5bG9hZF9sZW4gIT0gMzMpIHsKKwkJCURFQlVHUEMoRE1VWCwgInJlY2VpdmVkIFJUUCBmdWxsIHJhdGUgZnJhbWUgd2l0aCAiCisJCQkJInBheWxvYWQgbGVuZ3RoICE9IDMyIChsZW4gPSAlZClcbiIsCisJCQkJcGF5bG9hZF9sZW4pOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJYnJlYWs7CisJY2FzZSBSVFBfUFRfR1NNX0VGUjoKKwkJbXNnX3R5cGUgPSBHU01fVENIRl9GUkFNRV9FRlI7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUEMoRE1VWCwgInJlY2VpdmVkIFJUUCBmcmFtZSB3aXRoIHVua25vd24gcGF5bG9hZCAiCisJCQkidHlwZSAlZFxuIiwgcnRwaC0+cGF5bG9hZF90eXBlKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJbmV3X21zZyA9IG1zZ2JfYWxsb2Moc2l6ZW9mKHN0cnVjdCBnc21fZGF0YV9mcmFtZSkgKyBwYXlsb2FkX2xlbiwKKwkJCQkiR1NNLURBVEEiKTsKKwlpZiAoIW5ld19tc2cpCisJCXJldHVybiAtRU5PTUVNOworCWZyYW1lID0gKHN0cnVjdCBnc21fZGF0YV9mcmFtZSAqKShuZXdfbXNnLT5kYXRhKTsKKwlmcmFtZS0+bXNnX3R5cGUgPSBtc2dfdHlwZTsKKwlmcmFtZS0+Y2FsbHJlZiA9IGNhbGxyZWY7CisJbWVtY3B5KGZyYW1lLT5kYXRhLCBwYXlsb2FkLCBwYXlsb2FkX2xlbik7CisJbXNnYl9wdXQobmV3X21zZywgc2l6ZW9mKHN0cnVjdCBnc21fZGF0YV9mcmFtZSkgKyBwYXlsb2FkX2xlbik7CisKKwkqZGF0YSA9IG5ld19tc2c7CisJcmV0dXJuIDA7Cit9CisKKy8qICJ0byAtIGZyb20iICovCitzdGF0aWMgdm9pZCB0dl9kaWZmZXJlbmNlKHN0cnVjdCB0aW1ldmFsICpkaWZmLCBjb25zdCBzdHJ1Y3QgdGltZXZhbCAqZnJvbSwKKwkJCSAgY29uc3Qgc3RydWN0IHRpbWV2YWwgKl9fdG8pCit7CisJc3RydWN0IHRpbWV2YWwgX3RvID0gKl9fdG8sICp0byA9ICZfdG87CisKKwlpZiAodG8tPnR2X3VzZWMgPCBmcm9tLT50dl91c2VjKSB7CisJCXRvLT50dl9zZWMgLT0gMTsKKwkJdG8tPnR2X3VzZWMgKz0gMTAwMDAwMDsKKwl9CisKKwlkaWZmLT50dl91c2VjID0gdG8tPnR2X3VzZWMgLSBmcm9tLT50dl91c2VjOworCWRpZmYtPnR2X3NlYyA9IHRvLT50dl9zZWMgLSBmcm9tLT50dl9zZWM7Cit9CisKKy8qIGVuY29kZSBhbmQgc2VuZCBhIHJ0cCBmcmFtZSAqLworaW50IHJ0cF9zZW5kX2ZyYW1lKHN0cnVjdCBydHBfc29ja2V0ICpycywgc3RydWN0IGdzbV9kYXRhX2ZyYW1lICpmcmFtZSkKK3sKKwlzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgKnJzcyA9ICZycy0+cnRwOworCXN0cnVjdCBtc2diICptc2c7CisJc3RydWN0IHJ0cF9oZHIgKnJ0cGg7CisJaW50IHBheWxvYWRfdHlwZTsKKwlpbnQgcGF5bG9hZF9sZW47CisJaW50IGR1cmF0aW9uOyAvKiBpbiBzYW1wbGVzICovCisKKwlpZiAocnMtPnR4X2FjdGlvbiAhPSBSVFBfU0VORF9ET1dOU1RSRUFNKSB7CisJCS8qIGluaXRpYWxpemUgc2VxdWVuY2VzICovCisJCXJzLT50eF9hY3Rpb24gPSBSVFBfU0VORF9ET1dOU1RSRUFNOworCQlycy0+dHJhbnNtaXQuc3NyYyA9IHJhbmQoKTsKKwkJcnMtPnRyYW5zbWl0LnNlcXVlbmNlID0gcmFuZG9tKCk7CisJCXJzLT50cmFuc21pdC50aW1lc3RhbXAgPSByYW5kb20oKTsKKwl9CisKKwlzd2l0Y2ggKGZyYW1lLT5tc2dfdHlwZSkgeworCWNhc2UgR1NNX1RDSEZfRlJBTUU6CisJCXBheWxvYWRfdHlwZSA9IFJUUF9QVF9HU01fRlVMTDsKKwkJcGF5bG9hZF9sZW4gPSAzMzsKKwkJZHVyYXRpb24gPSAxNjA7CisJCWJyZWFrOworCWNhc2UgR1NNX1RDSEZfRlJBTUVfRUZSOgorCQlwYXlsb2FkX3R5cGUgPSBSVFBfUFRfR1NNX0VGUjsKKwkJcGF5bG9hZF9sZW4gPSAzMTsKKwkJZHVyYXRpb24gPSAxNjA7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCURFQlVHUEMoRE1VWCwgInVuc3VwcG9ydGVkIG1lc3NhZ2UgdHlwZSAlZFxuIiwKKwkJCWZyYW1lLT5tc2dfdHlwZSk7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXsKKwkJc3RydWN0IHRpbWV2YWwgdHYsIHR2X2RpZmY7CisJCWxvbmcgaW50IHVzZWNfZGlmZiwgZnJhbWVfZGlmZjsKKworCQlnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKKwkJdHZfZGlmZmVyZW5jZSgmdHZfZGlmZiwgJnJzLT50cmFuc21pdC5sYXN0X3R2LCAmdHYpOworCQlycy0+dHJhbnNtaXQubGFzdF90diA9IHR2OworCisJCXVzZWNfZGlmZiA9IHR2X2RpZmYudHZfc2VjICogMTAwMDAwMCArIHR2X2RpZmYudHZfdXNlYzsKKwkJZnJhbWVfZGlmZiA9ICh1c2VjX2RpZmYgLyAyMDAwMCk7CisKKwkJaWYgKGFicyhmcmFtZV9kaWZmKSA+IDEpIHsKKwkJCWxvbmcgaW50IGZyYW1lX2RpZmZfZXhjZXNzID0gZnJhbWVfZGlmZiAtIDE7CisKKwkJCUxPR1AoRE1VWCwgTE9HTF9OT1RJQ0UsCisJCQkJIkNvcnJlY3RpbmcgZnJhbWUgZGlmZmVyZW5jZSBvZiAlbGQgZnJhbWVzXG4iLCBmcmFtZV9kaWZmX2V4Y2Vzcyk7CisJCQlycy0+dHJhbnNtaXQuc2VxdWVuY2UgKz0gZnJhbWVfZGlmZl9leGNlc3M7CisJCQlycy0+dHJhbnNtaXQudGltZXN0YW1wICs9IGZyYW1lX2RpZmZfZXhjZXNzICogZHVyYXRpb247CisJCX0KKwl9CisKKwltc2cgPSBtc2diX2FsbG9jKHNpemVvZihzdHJ1Y3QgcnRwX2hkcikgKyBwYXlsb2FkX2xlbiwgIlJUUC1HU00tRlVMTCIpOworCWlmICghbXNnKQorCQlyZXR1cm4gLUVOT01FTTsKKwlydHBoID0gKHN0cnVjdCBydHBfaGRyICopbXNnLT5kYXRhOworCXJ0cGgtPnZlcnNpb24gPSBSVFBfVkVSU0lPTjsKKwlydHBoLT5wYWRkaW5nID0gMDsKKwlydHBoLT5leHRlbnNpb24gPSAwOworCXJ0cGgtPmNzcmNfY291bnQgPSAwOworCXJ0cGgtPm1hcmtlciA9IDA7CisJcnRwaC0+cGF5bG9hZF90eXBlID0gcGF5bG9hZF90eXBlOworCXJ0cGgtPnNlcXVlbmNlID0gaHRvbnMocnMtPnRyYW5zbWl0LnNlcXVlbmNlKyspOworCXJ0cGgtPnRpbWVzdGFtcCA9IGh0b25sKHJzLT50cmFuc21pdC50aW1lc3RhbXApOworCXJzLT50cmFuc21pdC50aW1lc3RhbXAgKz0gZHVyYXRpb247CisJcnRwaC0+c3NyYyA9IGh0b25sKHJzLT50cmFuc21pdC5zc3JjKTsKKwltZW1jcHkobXNnLT5kYXRhICsgc2l6ZW9mKHN0cnVjdCBydHBfaGRyKSwgZnJhbWUtPmRhdGEsIHBheWxvYWRfbGVuKTsKKwltc2diX3B1dChtc2csIHNpemVvZihzdHJ1Y3QgcnRwX2hkcikgKyBwYXlsb2FkX2xlbik7CisJbXNnYl9lbnF1ZXVlKCZyc3MtPnR4X3F1ZXVlLCBtc2cpOworCXJzcy0+YmZkLndoZW4gfD0gQlNDX0ZEX1dSSVRFOworCisJcmV0dXJuIDA7Cit9CisKKy8qIGl0ZXJhdGUgb3ZlciBhbGwgY2h1bmtzIGluIG9uZSBSVENQIG1lc3NhZ2UsIGxvb2sgZm9yIENOQU1FIElFcyBhbmQKKyAqIHJlcGxhY2UgYWxsIG9mIHRob3NlIHdpdGggJ25ld19jbmFtZScgKi8KK3N0YXRpYyBpbnQgcnRjcF9zZGVzX2NuYW1lX21hbmdsZShzdHJ1Y3QgbXNnYiAqbXNnLCBzdHJ1Y3QgcnRjcF9oZHIgKnJoLAorCQkJCSAgdV9pbnQxNl90ICpydGNwX2xlbiwgY29uc3QgY2hhciAqbmV3X2NuYW1lKQoreworCXVfaW50OF90ICpydGNwX2VuZDsKKwl1X2ludDhfdCAqY3VyID0gKHVfaW50OF90ICopIHJoOworCXVfaW50OF90IHRhZywgbGVuID0gMDsKKworCXJ0Y3BfZW5kID0gY3VyICsgKnJ0Y3BfbGVuOworCS8qIG1vdmUgY3VyIHRvIGVuZCBvZiBSVFAgaGVhZGVyICovCisJY3VyICs9IHNpemVvZigqcmgpOworCisJLyogaXRlcmF0ZSBvdmVyIENodW5rcyAqLworCXdoaWxlIChjdXIrNCA8IHJ0Y3BfZW5kKSB7CisJCS8qIHNraXAgZm91ciBieXRlcyBTU1JDL0NTUkMgKi8KKwkJY3VyICs9IDQ7CisJCisJCS8qIGl0ZXJhdGUgb3ZlciBJRSdzIGluc2lkZSB0aGUgY2h1bmsgKi8KKwkJd2hpbGUgKGN1cisxIDwgcnRjcF9lbmQpIHsKKwkJCXRhZyA9ICpjdXIrKzsKKwkJCWlmICh0YWcgPT0gMCkgeworCQkJCS8qIGVuZCBvZiBjaHVuaywgc2tpcCBhZGRpdGlvbmFsIHplcm8gKi8KKwkJCQl3aGlsZSAoKmN1cisrID09IDApIHsgfQorCQkJCWJyZWFrOworCQkJfQorCQkJbGVuID0gKmN1cisrOworCQorCQkJaWYgKHRhZyA9PSBSVENQX0lFX0NOQU1FKSB7CisJCQkJLyogd2UndmUgZm91bmQgdGhlIENOQU1FLCBsZXRzIG1hbmdsZSBpdCAqLworCQkJCWlmIChsZW4gPCBzdHJsZW4obmV3X2NuYW1lKSkgeworCQkJCQkvKiB3ZSBuZWVkIHRvIG1ha2UgbW9yZSBzcGFjZSAqLworCQkJCQlpbnQgaW5jcmVhc2UgPSBzdHJsZW4obmV3X2NuYW1lKSAtIGxlbjsKKworCQkJCQltc2diX3B1c2gobXNnLCBpbmNyZWFzZSk7CisJCQkJCW1lbW1vdmUoY3VyK2xlbitpbmNyZWFzZSwgY3VyK2xlbiwKKwkJCQkJCXJ0Y3BfZW5kIC0gKGN1citsZW4pKTsKKwkJCQkJLyogRklYTUU6IHdlIGhhdmUgdG8gcmVzcGVjdCBSVENQCisJCQkJCSAqIHBhZGRpbmcvYWxpZ25tZW50IHJ1bGVzISAqLworCQkJCQlsZW4gKz0gaW5jcmVhc2U7CisJCQkJCSooY3VyLTEpICs9IGluY3JlYXNlOworCQkJCQlydGNwX2VuZCArPSBpbmNyZWFzZTsKKwkJCQkJKnJ0Y3BfbGVuICs9IGluY3JlYXNlOworCQkJCX0KKwkJCQkvKiBjb3B5IG5ldyBDTkFNRSBpbnRvIG1lc3NhZ2UgKi8KKwkJCQltZW1jcHkoY3VyLCBuZXdfY25hbWUsIHN0cmxlbihuZXdfY25hbWUpKTsKKwkJCQkvKiBGSVhNRTogemVybyB0aGUgcGFkZGluZyBpbiBjYXNlIG5ldyBDTkFNRQorCQkJCSAqIGlzIHNtYWxsZXIgdGhhbiBvbGQgb25lICEhISAqLworCQkJfQorCQkJY3VyICs9IGxlbjsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHJ0Y3BfbWFuZ2xlKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBydHBfc29ja2V0ICpycykKK3sKKwlzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgKnJzcyA9ICZycy0+cnRjcDsKKwlzdHJ1Y3QgcnRjcF9oZHIgKnJ0cGg7CisJdV9pbnQxNl90IG9sZF9sZW47CisJaW50IHJjOworCisJaWYgKCFtYW5nbGVfcnRjcF9jbmFtZSkKKwkJcmV0dXJuIDA7CisKKwlwcmludGYoIlJUQ1BcbiIpOworCS8qIGl0ZXJhdGUgb3ZlciBsaXN0IG9mIFJUQ1AgbWVzc2FnZXMgKi8KKwlydHBoID0gKHN0cnVjdCBydGNwX2hkciAqKW1zZy0+ZGF0YTsKKwl3aGlsZSAoKHZvaWQgKilydHBoICsgc2l6ZW9mKCpydHBoKSA8PSAodm9pZCAqKW1zZy0+ZGF0YSArIG1zZy0+bGVuKSB7CisJCW9sZF9sZW4gPSAobnRvaHMocnRwaC0+bGVuZ3RoKSArIDEpICogNDsKKwkJaWYgKCh2b2lkICopcnRwaCArIG9sZF9sZW4gPiAodm9pZCAqKW1zZy0+ZGF0YSArIG1zZy0+bGVuKSB7CisJCQlERUJVR1BDKERNVVgsICJyZWNlaXZlZCBSVENQIHBhY2tldCB0b28gc2hvcnQgZm9yICIKKwkJCQkibGVuZ3RoIGVsZW1lbnRcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKHJ0cGgtPnR5cGUgPT0gUlRDUF9UWVBFX1NERVMpIHsKKwkJCWNoYXIgbmV3X2NuYW1lWzI1NV07CisJCQlzdHJuY3B5KG5ld19jbmFtZSwgaW5ldF9udG9hKHJzcy0+c2luX2xvY2FsLnNpbl9hZGRyKSwKKwkJCQlzaXplb2YobmV3X2NuYW1lKSk7CisJCQluZXdfY25hbWVbc2l6ZW9mKG5ld19jbmFtZSktMV0gPSAnXDAnOworCQkJcmMgPSBydGNwX3NkZXNfY25hbWVfbWFuZ2xlKG1zZywgcnRwaCwgJm9sZF9sZW4sCisJCQkJCQkgICAgbmV3X2NuYW1lKTsKKwkJCWlmIChyYyA8IDApCisJCQkJcmV0dXJuIHJjOworCQl9CisJCXJ0cGggPSAodm9pZCAqKXJ0cGggKyBvbGRfbGVuOworCX0KKworCXJldHVybiAwOworfQorCisvKiByZWFkIGZyb20gaW5jb21pbmcgUlRQL1JUQ1Agc29ja2V0ICovCitzdGF0aWMgaW50IHJ0cF9zb2NrZXRfcmVhZChzdHJ1Y3QgcnRwX3NvY2tldCAqcnMsIHN0cnVjdCBydHBfc3ViX3NvY2tldCAqcnNzKQoreworCWludCByYzsKKwlzdHJ1Y3QgbXNnYiAqbXNnID0gbXNnYl9hbGxvYyhSVFBfQUxMT0NfU0laRSwgIlJUUC9SVENQIik7CisJc3RydWN0IG1zZ2IgKm5ld19tc2c7CisJc3RydWN0IHJ0cF9zdWJfc29ja2V0ICpvdGhlcl9yc3M7CisKKwlpZiAoIW1zZykKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlyYyA9IHJlYWQocnNzLT5iZmQuZmQsIG1zZy0+ZGF0YSwgUlRQX0FMTE9DX1NJWkUpOworCWlmIChyYyA8PSAwKSB7CisJCXJzcy0+YmZkLndoZW4gJj0gfkJTQ19GRF9SRUFEOworCQlyZXR1cm4gcmM7CisJfQorCisJbXNnYl9wdXQobXNnLCByYyk7CisKKwlzd2l0Y2ggKHJzLT5yeF9hY3Rpb24pIHsKKwljYXNlIFJUUF9QUk9YWToKKwkJaWYgKCFycy0+cHJveHkub3RoZXJfc29jaykgeworCQkJcmMgPSAtRUlPOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCQlpZiAocnNzLT5iZmQucHJpdl9uciA9PSBSVFBfUFJJVl9SVFApCisJCQlvdGhlcl9yc3MgPSAmcnMtPnByb3h5Lm90aGVyX3NvY2stPnJ0cDsKKwkJZWxzZSBpZiAocnNzLT5iZmQucHJpdl9uciA9PSBSVFBfUFJJVl9SVENQKSB7CisJCQlvdGhlcl9yc3MgPSAmcnMtPnByb3h5Lm90aGVyX3NvY2stPnJ0Y3A7CisJCQkvKiBtb2RpZnkgUlRDUCBTREVTIENOQU1FICovCisJCQlyYyA9IHJ0Y3BfbWFuZ2xlKG1zZywgcnMpOworCQkJaWYgKHJjIDwgMCkKKwkJCQlnb3RvIG91dF9mcmVlOworCQl9IGVsc2UgeworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCQltc2diX2VucXVldWUoJm90aGVyX3Jzcy0+dHhfcXVldWUsIG1zZyk7CisJCW90aGVyX3Jzcy0+YmZkLndoZW4gfD0gQlNDX0ZEX1dSSVRFOworCQlicmVhazsKKworCWNhc2UgUlRQX1JFQ1ZfVVBTVFJFQU06CisJCWlmICghcnMtPnJlY2VpdmUuY2FsbHJlZiB8fCAhcnMtPnJlY2VpdmUubmV0KSB7CisJCQlyYyA9IC1FSU87CisJCQlnb3RvIG91dF9mcmVlOworCQl9CisJCWlmIChyc3MtPmJmZC5wcml2X25yID09IFJUUF9QUklWX1JUQ1ApIHsKKwkJCWlmICghbWFuZ2xlX3J0Y3BfY25hbWUpIHsKKwkJCQltc2diX2ZyZWUobXNnKTsKKwkJCQlicmVhazsKKwkJCX0KKwkJCS8qIG1vZGlmeSBSVENQIFNERVMgQ05BTUUgKi8KKwkJCXJjID0gcnRjcF9tYW5nbGUobXNnLCBycyk7CisJCQlpZiAocmMgPCAwKQorCQkJCWdvdG8gb3V0X2ZyZWU7CisJCQltc2diX2VucXVldWUoJnJzcy0+dHhfcXVldWUsIG1zZyk7CisJCQlyc3MtPmJmZC53aGVuIHw9IEJTQ19GRF9XUklURTsKKwkJCWJyZWFrOworCQl9CisJCWlmIChyc3MtPmJmZC5wcml2X25yICE9IFJUUF9QUklWX1JUUCkgeworCQkJcmMgPSAtRUlOVkFMOworCQkJZ290byBvdXRfZnJlZTsKKwkJfQorCQlyYyA9IHJ0cF9kZWNvZGUobXNnLCBycy0+cmVjZWl2ZS5jYWxscmVmLCAmbmV3X21zZyk7CisJCWlmIChyYyA8IDApCisJCQlnb3RvIG91dF9mcmVlOworCQltc2diX2ZyZWUobXNnKTsKKwkJbXNnYl9lbnF1ZXVlKCZycy0+cmVjZWl2ZS5uZXQtPnVwcXVldWUsIG5ld19tc2cpOworCQlicmVhazsKKworCWNhc2UgUlRQX05PTkU6IC8qIGlmIHNvY2tldCBleGlzdHMsIGJ1dCBkaXNhYmxlZCBieSBhcHAgKi8KKwkJbXNnYl9mcmVlKG1zZyk7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworCitvdXRfZnJlZToKKwltc2diX2ZyZWUobXNnKTsKKwlyZXR1cm4gcmM7Cit9CisKKy8qIHdyaXRlIGZyb20gdHhfcXVldWUgdG8gUlRQL1JUQ1Agc29ja2V0ICovCitzdGF0aWMgaW50IHJ0cF9zb2NrZXRfd3JpdGUoc3RydWN0IHJ0cF9zb2NrZXQgKnJzLCBzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgKnJzcykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCWludCB3cml0dGVuOworCisJbXNnID0gbXNnYl9kZXF1ZXVlKCZyc3MtPnR4X3F1ZXVlKTsKKwlpZiAoIW1zZykgeworCQlyc3MtPmJmZC53aGVuICY9IH5CU0NfRkRfV1JJVEU7CisJCXJldHVybiAwOworCX0KKworCXdyaXR0ZW4gPSB3cml0ZShyc3MtPmJmZC5mZCwgbXNnLT5kYXRhLCBtc2ctPmxlbik7CisJaWYgKHdyaXR0ZW4gPCBtc2ctPmxlbikgeworCQlMT0dQKERNSUIsIExPR0xfRVJST1IsICJzaG9ydCB3cml0ZSIpOworCQltc2diX2ZyZWUobXNnKTsKKwkJcmV0dXJuIC1FSU87CisJfQorCisJbXNnYl9mcmVlKG1zZyk7CisKKwlyZXR1cm4gMDsKK30KKworCisvKiBjYWxsYmFjayBmb3IgdGhlIHNlbGVjdC5jOmJmZF8qIGxheWVyICovCitzdGF0aWMgaW50IHJ0cF9iZmRfY2Ioc3RydWN0IGJzY19mZCAqYmZkLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHJ0cF9zb2NrZXQgKnJzID0gYmZkLT5kYXRhOworCXN0cnVjdCBydHBfc3ViX3NvY2tldCAqcnNzOworCisJc3dpdGNoIChiZmQtPnByaXZfbnIpIHsKKwljYXNlIFJUUF9QUklWX1JUUDoKKwkJcnNzID0gJnJzLT5ydHA7CisJCWJyZWFrOworCWNhc2UgUlRQX1BSSVZfUlRDUDoKKwkJcnNzID0gJnJzLT5ydGNwOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwlpZiAoZmxhZ3MgJiBCU0NfRkRfUkVBRCkKKwkJcnRwX3NvY2tldF9yZWFkKHJzLCByc3MpOworCisJaWYgKGZsYWdzICYgQlNDX0ZEX1dSSVRFKQorCQlydHBfc29ja2V0X3dyaXRlKHJzLCByc3MpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIGluaXRfcnNzKHN0cnVjdCBydHBfc3ViX3NvY2tldCAqcnNzLCAKKwkJICAgICBzdHJ1Y3QgcnRwX3NvY2tldCAqcnMsIGludCBmZCwgaW50IHByaXZfbnIpCit7CisJLyogaW5pdGlhbGl6ZSBiZmQgKi8KKwlyc3MtPmJmZC5mZCA9IGZkOworCXJzcy0+YmZkLmRhdGEgPSByczsKKwlyc3MtPmJmZC5wcml2X25yID0gcHJpdl9ucjsKKwlyc3MtPmJmZC5jYiA9IHJ0cF9iZmRfY2I7Cit9CisKK3N0cnVjdCBydHBfc29ja2V0ICpydHBfc29ja2V0X2NyZWF0ZSh2b2lkKQoreworCWludCByYzsKKwlzdHJ1Y3QgcnRwX3NvY2tldCAqcnM7CisKKwlERUJVR1AoRE1VWCwgInJ0cF9zb2NrZXRfY3JlYXRlKCk6ICIpOworCisJcnMgPSB0YWxsb2NfemVybyh0YWxsX2JzY19jdHgsIHN0cnVjdCBydHBfc29ja2V0KTsKKwlpZiAoIXJzKQorCQlyZXR1cm4gTlVMTDsKKworCUlOSVRfTExJU1RfSEVBRCgmcnMtPnJ0cC50eF9xdWV1ZSk7CisJSU5JVF9MTElTVF9IRUFEKCZycy0+cnRjcC50eF9xdWV1ZSk7CisKKwlyYyA9IHNvY2tldChBRl9JTkVULCBTT0NLX0RHUkFNLCBJUFBST1RPX1VEUCk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBvdXRfZnJlZTsKKworCWluaXRfcnNzKCZycy0+cnRwLCBycywgcmMsIFJUUF9QUklWX1JUUCk7CisJcmMgPSBic2NfcmVnaXN0ZXJfZmQoJnJzLT5ydHAuYmZkKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIG91dF9ydHBfc29ja2V0OworCisJcmMgPSBzb2NrZXQoQUZfSU5FVCwgU09DS19ER1JBTSwgSVBQUk9UT19VRFApOworCWlmIChyYyA8IDApCisJCWdvdG8gb3V0X3J0cF9iZmQ7CisKKwlpbml0X3JzcygmcnMtPnJ0Y3AsIHJzLCByYywgUlRQX1BSSVZfUlRDUCk7CisJcmMgPSBic2NfcmVnaXN0ZXJfZmQoJnJzLT5ydGNwLmJmZCk7CisJaWYgKHJjIDwgMCkKKwkJZ290byBvdXRfcnRjcF9zb2NrZXQ7CisKKwlERUJVR1BDKERNVVgsICJzdWNjZXNzXG4iKTsKKworCXJjID0gcnRwX3NvY2tldF9iaW5kKHJzLCBJTkFERFJfQU5ZKTsKKwlpZiAocmMgPCAwKQorCQlnb3RvIG91dF9ydGNwX2JmZDsKKworCXJldHVybiByczsKKworb3V0X3J0Y3BfYmZkOgorCWJzY191bnJlZ2lzdGVyX2ZkKCZycy0+cnRjcC5iZmQpOworb3V0X3J0Y3Bfc29ja2V0OgorCWNsb3NlKHJzLT5ydGNwLmJmZC5mZCk7CitvdXRfcnRwX2JmZDoKKwlic2NfdW5yZWdpc3Rlcl9mZCgmcnMtPnJ0cC5iZmQpOworb3V0X3J0cF9zb2NrZXQ6CisJY2xvc2UocnMtPnJ0cC5iZmQuZmQpOworb3V0X2ZyZWU6CisJdGFsbG9jX2ZyZWUocnMpOworCURFQlVHUEMoRE1VWCwgImZhaWxlZFxuIik7CisJcmV0dXJuIE5VTEw7Cit9CisKK3N0YXRpYyBpbnQgcnRwX3N1Yl9zb2NrZXRfYmluZChzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgKnJzcywgdV9pbnQzMl90IGlwLAorCQkJCXVfaW50MTZfdCBwb3J0KQoreworCWludCByYzsKKwlzb2NrbGVuX3QgYWxlbiA9IHNpemVvZihyc3MtPnNpbl9sb2NhbCk7CisKKwlyc3MtPnNpbl9sb2NhbC5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlyc3MtPnNpbl9sb2NhbC5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChpcCk7CisJcnNzLT5zaW5fbG9jYWwuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKwlyc3MtPmJmZC53aGVuIHw9IEJTQ19GRF9SRUFEOworCisJcmMgPSBiaW5kKHJzcy0+YmZkLmZkLCAoc3RydWN0IHNvY2thZGRyICopJnJzcy0+c2luX2xvY2FsLAorCQkgIHNpemVvZihyc3MtPnNpbl9sb2NhbCkpOworCWlmIChyYyA8IDApCisJCXJldHVybiByYzsKKworCS8qIHJldHJpZXZlIHRoZSBhZGRyZXNzIHdlIGFjdHVhbGx5IGJvdW5kIHRvLCBpbiBjYXNlIHdlCisJICogcGFzc2VkIElOQUREUl9BTlkgYXMgSVAgYWRkcmVzcyAqLworCXJldHVybiBnZXRzb2NrbmFtZShyc3MtPmJmZC5mZCwgKHN0cnVjdCBzb2NrYWRkciAqKSZyc3MtPnNpbl9sb2NhbCwKKwkJCSAgICZhbGVuKTsKK30KKworI2RlZmluZSBSVFBfUE9SVF9CQVNFCTMwMDAwCitzdGF0aWMgdW5zaWduZWQgaW50IG5leHRfdWRwX3BvcnQgPSBSVFBfUE9SVF9CQVNFOworCisvKiBiaW5kIGEgUlRQIHNvY2tldCB0byBhIGxvY2FsIGFkZHJlc3MgKi8KK2ludCBydHBfc29ja2V0X2JpbmQoc3RydWN0IHJ0cF9zb2NrZXQgKnJzLCB1X2ludDMyX3QgaXApCit7CisJaW50IHJjID0gLUVJTzsKKwlzdHJ1Y3QgaW5fYWRkciBpYTsKKworCWlhLnNfYWRkciA9IGh0b25sKGlwKTsKKwlERUJVR1AoRE1VWCwgInJ0cF9zb2NrZXRfYmluZChycz0lcCwgSVA9JXMpOiAiLCBycywKKwkJaW5ldF9udG9hKGlhKSk7CisKKwkvKiB0cnkgdG8gYmluZCB0byBhIGNvbnNlY3V0aXZlIHBhaXIgb2YgcG9ydHMgKi8KKwlmb3IgKG5leHRfdWRwX3BvcnQgPSBuZXh0X3VkcF9wb3J0ICUgMHhmZmZmOworCSAgICAgbmV4dF91ZHBfcG9ydCA8IDB4ZmZmZjsgbmV4dF91ZHBfcG9ydCArPSAyKSB7CisJCXJjID0gcnRwX3N1Yl9zb2NrZXRfYmluZCgmcnMtPnJ0cCwgaXAsIG5leHRfdWRwX3BvcnQpOworCQlpZiAocmMgIT0gMCkKKwkJCWNvbnRpbnVlOworCisJCXJjID0gcnRwX3N1Yl9zb2NrZXRfYmluZCgmcnMtPnJ0Y3AsIGlwLCBuZXh0X3VkcF9wb3J0KzEpOworCQlpZiAocmMgPT0gMCkKKwkJCWJyZWFrOworCX0KKwlpZiAocmMgPCAwKSB7CisJCURFQlVHUEMoRE1VWCwgImZhaWxlZFxuIik7CisJCXJldHVybiByYzsKKwl9CisKKwlpYS5zX2FkZHIgPSBycy0+cnRwLnNpbl9sb2NhbC5zaW5fYWRkci5zX2FkZHI7CisJREVCVUdQQyhETVVYLCAiQk9VTkRfSVA9JXMsIEJPVU5EX1BPUlQ9JXVcbiIsCisJCWluZXRfbnRvYShpYSksIG50b2hzKHJzLT5ydHAuc2luX2xvY2FsLnNpbl9wb3J0KSk7CisJcmV0dXJuIG50b2hzKHJzLT5ydHAuc2luX2xvY2FsLnNpbl9wb3J0KTsKK30KKworc3RhdGljIGludCBydHBfc3ViX3NvY2tldF9jb25uZWN0KHN0cnVjdCBydHBfc3ViX3NvY2tldCAqcnNzLAorCQkJCSAgdV9pbnQzMl90IGlwLCB1X2ludDE2X3QgcG9ydCkKK3sKKwlpbnQgcmM7CisJc29ja2xlbl90IGFsZW4gPSBzaXplb2YocnNzLT5zaW5fbG9jYWwpOworCisJcnNzLT5zaW5fcmVtb3RlLnNpbl9mYW1pbHkgPSBBRl9JTkVUOworCXJzcy0+c2luX3JlbW90ZS5zaW5fYWRkci5zX2FkZHIgPSBodG9ubChpcCk7CisJcnNzLT5zaW5fcmVtb3RlLnNpbl9wb3J0ID0gaHRvbnMocG9ydCk7CisKKwlyYyA9IGNvbm5lY3QocnNzLT5iZmQuZmQsIChzdHJ1Y3Qgc29ja2FkZHIgKikgJnJzcy0+c2luX3JlbW90ZSwKKwkJICAgICBzaXplb2YocnNzLT5zaW5fcmVtb3RlKSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJcmV0dXJuIGdldHNvY2tuYW1lKHJzcy0+YmZkLmZkLCAoc3RydWN0IHNvY2thZGRyICopJnJzcy0+c2luX2xvY2FsLAorCQkJICAgJmFsZW4pOworfQorCisvKiAnY29ubmVjdCcgYSBSVFAgc29ja2V0IHRvIGEgcmVtb3RlIHBlZXIgKi8KK2ludCBydHBfc29ja2V0X2Nvbm5lY3Qoc3RydWN0IHJ0cF9zb2NrZXQgKnJzLCB1X2ludDMyX3QgaXAsIHVfaW50MTZfdCBwb3J0KQoreworCWludCByYzsKKwlzdHJ1Y3QgaW5fYWRkciBpYTsKKworCWlhLnNfYWRkciA9IGh0b25sKGlwKTsKKwlERUJVR1AoRE1VWCwgInJ0cF9zb2NrZXRfY29ubmVjdChycz0lcCwgaXA9JXMsIHBvcnQ9JXUpXG4iLAorCQlycywgaW5ldF9udG9hKGlhKSwgcG9ydCk7CisKKwlyYyA9IHJ0cF9zdWJfc29ja2V0X2Nvbm5lY3QoJnJzLT5ydHAsIGlwLCBwb3J0KTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlyZXR1cm4gcnRwX3N1Yl9zb2NrZXRfY29ubmVjdCgmcnMtPnJ0Y3AsIGlwLCBwb3J0KzEpOworfQorCisvKiBiaW5kIHR3byBSVFAvUlRDUCBzb2NrZXRzIHRvZ2V0aGVyICovCitpbnQgcnRwX3NvY2tldF9wcm94eShzdHJ1Y3QgcnRwX3NvY2tldCAqdGhpcywgc3RydWN0IHJ0cF9zb2NrZXQgKm90aGVyKQoreworCURFQlVHUChETVVYLCAicnRwX3NvY2tldF9wcm94eSh0aGlzPSVwLCBvdGhlcj0lcClcbiIsCisJCXRoaXMsIG90aGVyKTsKKworCXRoaXMtPnJ4X2FjdGlvbiA9IFJUUF9QUk9YWTsKKwl0aGlzLT5wcm94eS5vdGhlcl9zb2NrID0gb3RoZXI7CisKKwlvdGhlci0+cnhfYWN0aW9uID0gUlRQX1BST1hZOworCW90aGVyLT5wcm94eS5vdGhlcl9zb2NrID0gdGhpczsKKworCXJldHVybiAwOworfQorCisvKiBiaW5kIFJUUC9SVENQIHNvY2tldCB0byBhcHBsaWNhdGlvbiAqLworaW50IHJ0cF9zb2NrZXRfdXBzdHJlYW0oc3RydWN0IHJ0cF9zb2NrZXQgKnRoaXMsIHN0cnVjdCBnc21fbmV0d29yayAqbmV0LAorCQkJdV9pbnQzMl90IGNhbGxyZWYpCit7CisJREVCVUdQKERNVVgsICJydHBfc29ja2V0X3Byb3h5KHRoaXM9JXAsIGNhbGxyZWY9JXUpXG4iLAorCQl0aGlzLCBjYWxscmVmKTsKKworCWlmIChjYWxscmVmKSB7CisJCXRoaXMtPnJ4X2FjdGlvbiA9IFJUUF9SRUNWX1VQU1RSRUFNOworCQl0aGlzLT5yZWNlaXZlLm5ldCA9IG5ldDsKKwkJdGhpcy0+cmVjZWl2ZS5jYWxscmVmID0gY2FsbHJlZjsKKwl9IGVsc2UKKwkJdGhpcy0+cnhfYWN0aW9uID0gUlRQX05PTkU7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgZnJlZV90eF9xdWV1ZShzdHJ1Y3QgcnRwX3N1Yl9zb2NrZXQgKnJzcykKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnOworCQorCXdoaWxlICgobXNnID0gbXNnYl9kZXF1ZXVlKCZyc3MtPnR4X3F1ZXVlKSkpCisJCW1zZ2JfZnJlZShtc2cpOworfQorCitpbnQgcnRwX3NvY2tldF9mcmVlKHN0cnVjdCBydHBfc29ja2V0ICpycykKK3sKKwlERUJVR1AoRE1VWCwgInJ0cF9zb2NrZXRfZnJlZShycz0lcClcbiIsIHJzKTsKKworCS8qIG1ha2Ugc3VyZSB3ZSBkb24ndCBsZWF2ZSByZWZlcmVuY2VzIGRhbmdsaW5nIHRvIHVzICovCisJaWYgKHJzLT5yeF9hY3Rpb24gPT0gUlRQX1BST1hZICYmCisJICAgIHJzLT5wcm94eS5vdGhlcl9zb2NrKQorCQlycy0+cHJveHkub3RoZXJfc29jay0+cHJveHkub3RoZXJfc29jayA9IE5VTEw7CisKKwlic2NfdW5yZWdpc3Rlcl9mZCgmcnMtPnJ0cC5iZmQpOworCWNsb3NlKHJzLT5ydHAuYmZkLmZkKTsKKwlmcmVlX3R4X3F1ZXVlKCZycy0+cnRwKTsKKworCWJzY191bnJlZ2lzdGVyX2ZkKCZycy0+cnRjcC5iZmQpOworCWNsb3NlKHJzLT5ydGNwLmJmZC5mZCk7CisJZnJlZV90eF9xdWV1ZSgmcnMtPnJ0Y3ApOworCisJdGFsbG9jX2ZyZWUocnMpOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9zY2NwL3NjY3AuYyBiL29wZW5ic2Mvc3JjL3NjY3Avc2NjcC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxZGEyYzcKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy9zY2NwL3NjY3AuYwpAQCAtMCwwICsxLDEzNDYgQEAKKy8qCisgKiBTQ0NQIG1hbmFnZW1lbnQgY29kZQorICoKKyAqIChDKSAyMDA5LCAyMDEwIGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIChDKSAyMDA5LCAyMDEwIGJ5IE9uLVdhdmVzCisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKKyNpbmNsdWRlIDxzY2NwL3NjY3AuaD4KKworCitzdGF0aWMgdm9pZCAqdGFsbF9zY2NwX2N0eDsKK3N0YXRpYyBMTElTVF9IRUFEKHNjY3BfY29ubmVjdGlvbnMpOworCisjZGVmaW5lIFNDQ1BfTVNHX1NJWkUgNDA5NgorI2RlZmluZSBTQ0NQX01TR19IRUFEUk9PTSAxMjgKKworLyogZ2xvYmFsIGRhdGEgKi8KK2NvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwIHNjY3Bfc3NuX2Jzc2FwID0geworCS5zY2NwX2ZhbWlseQk9IDAsCisJLnNjY3Bfc3NuCT0gU0NDUF9TU05fQlNTQVAsCit9OworCitzdHJ1Y3Qgc2NjcF9zeXN0ZW0geworCS8qIGxheWVyMyAtPiBsYXllcjIgKi8KKwlpbnQgKCp3cml0ZV9kYXRhKShzdHJ1Y3QgbXNnYiAqZGF0YSwgdm9pZCAqY29udGV4dCk7CisJdm9pZCAqd3JpdGVfY29udGV4dDsKK307CisKKworc3RhdGljIHN0cnVjdCBzY2NwX3N5c3RlbSBzY2NwX3N5c3RlbSA9IHsKKwkud3JpdGVfZGF0YSA9IE5VTEwsCit9OworCitzdHJ1Y3Qgc2NjcF9kYXRhX2NhbGxiYWNrIHsKKwkvKiBjb25uZWN0aW9uIGJhc2VkICovCisJaW50ICgqYWNjZXB0X2NiKShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICosIHZvaWQgKik7CisJdm9pZCAqYWNjZXB0X2NvbnRleHQ7CisKKwkvKiBjb25uZWN0aW9uIGxlc3MgKi8KKwlpbnQgKCpyZWFkX2NiKShzdHJ1Y3QgbXNnYiAqLCB1bnNpZ25lZCBpbnQsIHZvaWQgKik7CisJdm9pZCAqcmVhZF9jb250ZXh0OworCisJdV9pbnQ4X3Qgc3NuOworCXN0cnVjdCBsbGlzdF9oZWFkIGNhbGxiYWNrOworfTsKKworc3RhdGljIExMSVNUX0hFQUQoc2NjcF9jYWxsYmFja3MpOworCitzdGF0aWMgc3RydWN0IHNjY3BfZGF0YV9jYWxsYmFjayAqX2ZpbmRfc3NuKHVfaW50OF90IHNzbikKK3sKKwlzdHJ1Y3Qgc2NjcF9kYXRhX2NhbGxiYWNrICpjYjsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGNiLCAmc2NjcF9jYWxsYmFja3MsIGNhbGxiYWNrKSB7CisJCWlmIChjYi0+c3NuID09IHNzbikKKwkJCXJldHVybiBjYjsKKwl9CisKKwkvKiBuZWVkIHRvIGFkZCBvbmUgKi8KKwljYiA9IHRhbGxvY196ZXJvKHRhbGxfc2NjcF9jdHgsIHN0cnVjdCBzY2NwX2RhdGFfY2FsbGJhY2spOworCWlmICghY2IpIHsKKwkJREVCVUdQKERTQ0NQLCAiRmFpbGVkIHRvIGFsbG9jYXRlIHNjY3AgY2FsbGJhY2suXG4iKTsKKwkJcmV0dXJuIE5VTEw7CisJfQorCisJY2ItPnNzbiA9IHNzbjsKKwlsbGlzdF9hZGRfdGFpbCgmY2ItPmNhbGxiYWNrLCAmc2NjcF9jYWxsYmFja3MpOworCXJldHVybiBjYjsKK30KKworCitzdGF0aWMgaW50IF9zZW5kX21zZyhzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXJldHVybiBzY2NwX3N5c3RlbS53cml0ZV9kYXRhKG1zZywgc2NjcF9zeXN0ZW0ud3JpdGVfY29udGV4dCk7Cit9CisKKy8qCisgKiBwYXJzaW5nIHJvdXRpbmVzCisgKi8KK3N0YXRpYyBpbnQgY29weV9hZGRyZXNzKHN0cnVjdCBzY2NwX2FkZHJlc3MgKmFkZHIsIHVfaW50OF90IG9mZnNldCwgc3RydWN0IG1zZ2IgKm1zZ2IpCit7CisJc3RydWN0IHNjY3BfY2FsbGVkX3BhcnR5X2FkZHJlc3MgKnBhcnR5OworCisJaW50IHJvb20gPSBtc2diX2wybGVuKG1zZ2IpIC0gb2Zmc2V0OworCXVfaW50OF90IHJlYWQgPSAwOworCXVfaW50OF90IGxlbmd0aDsKKworCWlmIChyb29tIDw9IDApIHsKKwkJREVCVUdQKERTQ0NQLCAiTm90IGVub3VnaCByb29tIGZvciBhbiBhZGRyZXNzOiAldVxuIiwgcm9vbSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlsZW5ndGggPSBtc2diLT5sMmhbb2Zmc2V0XTsKKwlpZiAocm9vbSA8PSBsZW5ndGgpIHsKKwkJREVCVUdQKERTQ0NQLCAiTm90IGVub3VnaCByb29tIGZvciBvcHRpb25hbCBkYXRhICV1ICV1XG4iLCByb29tLCBsZW5ndGgpOworCQlyZXR1cm4gLTE7CisJfQorCisKKwlwYXJ0eSA9IChzdHJ1Y3Qgc2NjcF9jYWxsZWRfcGFydHlfYWRkcmVzcyAqKShtc2diLT5sMmggKyBvZmZzZXQgKyAxKTsKKwlpZiAocGFydHktPnBvaW50X2NvZGVfaW5kaWNhdG9yKSB7CisJCWlmIChsZW5ndGggPD0gcmVhZCArIDIpIHsKKwkJICAgIERFQlVHUChEU0NDUCwgIlBPSSBkb2VzIG5vdCBmaXQgJXVcbiIsIGxlbmd0aCk7CisJCSAgICByZXR1cm4gLTE7CisJCX0KKworCisJCW1lbWNweSgmYWRkci0+cG9pLCAmcGFydHktPmRhdGFbcmVhZF0sIDIpOworCQlyZWFkICs9IDI7CisJfQorCisJaWYgKHBhcnR5LT5zc25faW5kaWNhdG9yKSB7CisJCWlmIChsZW5ndGggPD0gcmVhZCArIDEpIHsKKwkJICAgIERFQlVHUChEU0NDUCwgIlNTTiBkb2VzIG5vdCBmaXQgJXVcbiIsIGxlbmd0aCk7CisJCSAgICByZXR1cm4gLTE7CisJCX0KKworCQlhZGRyLT5zc24gPSBwYXJ0eS0+ZGF0YVtyZWFkXTsKKwkJcmVhZCArPSAxOworCX0KKworCWlmIChwYXJ0eS0+Z2xvYmFsX3RpdGxlX2luZGljYXRvcikgeworCQlERUJVR1AoRFNDQ1AsICJHVEkgbm90IHN1cHBvcnRlZCAldVxuIiwgKih1X2ludDhfdCAqKXBhcnR5KTsKKwkJcmV0dXJuIC0xOworCX0KKworCWFkZHItPmFkZHJlc3MgPSAqcGFydHk7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2hlY2tfYWRkcmVzcyhzdHJ1Y3Qgc2NjcF9hZGRyZXNzICphZGRyKQoreworCS8qIGlnbm9yZSBwb2ludF9jb2RlX2luZGljYXRvci4uLiBpdCBzaG91bGQgYmUgemVyby4uLiBidXQgKi8KKwlpZiAoYWRkci0+YWRkcmVzcy5zc25faW5kaWNhdG9yICE9IDEKKwkgICAgfHwgYWRkci0+YWRkcmVzcy5nbG9iYWxfdGl0bGVfaW5kaWNhdG9yID09IDEKKwkgICAgfHwgYWRkci0+YWRkcmVzcy5yb3V0aW5nX2luZGljYXRvciAhPSAxKSB7CisJCURFQlVHUChEU0NDUCwgIkludmFsaWQgY2FsbGVkIGFkZHJlc3MgYWNjb3JkaW5nIHRvIDA4LjA2OiAweCV4IDB4JXhcbiIsCisJCQkqKHVfaW50OF90ICopJmFkZHItPmFkZHJlc3MsIGFkZHItPnNzbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfc2NjcF9wYXJzZV9vcHRpb25hbF9kYXRhKGNvbnN0IGludCBvZmZzZXQsCisJCQkJICAgICBzdHJ1Y3QgbXNnYiAqbXNnYiwgc3RydWN0IHNjY3Bfb3B0aW9uYWxfZGF0YSAqZGF0YSkKK3sKKwl1X2ludDE2X3Qgcm9vbSA9IG1zZ2JfbDJsZW4obXNnYikgLSBvZmZzZXQ7CisJdV9pbnQxNl90IHJlYWQgPSAwOworCisJd2hpbGUgKHJvb20gPiByZWFkKSB7CisJCXVfaW50OF90IHR5cGUgPSBtc2diLT5sMmhbb2Zmc2V0ICsgcmVhZF07CisJCWlmICh0eXBlID09IFNDQ1BfUE5DX0VORF9PRl9PUFRJT05BTCkKKwkJCXJldHVybiAwOworCisJCWlmIChyZWFkICsgMSA+PSByb29tKSB7CisJCQlERUJVR1AoRFNDQ1AsICJubyBwbGFjZSBmb3IgbGVuZ3RoXG4iKTsKKwkJCXJldHVybiAwOworCQl9CisKKwkJdV9pbnQ4X3QgbGVuZ3RoID0gbXNnYi0+bDJoW29mZnNldCArIHJlYWQgKyAxXTsKKwkJcmVhZCArPSAyICsgbGVuZ3RoOworCisKKwkJaWYgKHJvb20gPD0gcmVhZCkgeworCQkJREVCVUdQKERTQ0NQLCAibm8gc3BhY2UgZm9yIHRoZSBkYXRhOiB0eXBlOiAlZCByZWFkOiAlZCByb29tOiAlZCBsMjogJWRcbiIsCisJCQkgICAgICAgdHlwZSwgcmVhZCwgcm9vbSwgbXNnYl9sMmxlbihtc2diKSk7CisJCQlyZXR1cm4gMDsKKwkJfQorCisJCWlmICh0eXBlID09IFNDQ1BfUE5DX0RBVEEpIHsKKwkJCWRhdGEtPmRhdGFfbGVuID0gbGVuZ3RoOworCQkJZGF0YS0+ZGF0YV9zdGFydCA9IG9mZnNldCArIHJlYWQgLSBsZW5ndGg7CisJCX0KKworCX0KKworCXJldHVybiAtMTsKK30KKworaW50IF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fcmVxdWVzdChzdHJ1Y3QgbXNnYiAqbXNnYiwgc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0ICpyZXN1bHQpCit7CisJc3RhdGljIGNvbnN0IHVfaW50MzJfdCBoZWFkZXJfc2l6ZSA9CisJCQlzaXplb2Yoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZXF1ZXN0KTsKKwlzdGF0aWMgY29uc3QgdV9pbnQzMl90IG9wdGlvbmFsX29mZnNldCA9CisJCQlvZmZzZXRvZihzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlcXVlc3QsIG9wdGlvbmFsX3N0YXJ0KTsKKwlzdGF0aWMgY29uc3QgdV9pbnQzMl90IGNhbGxlZF9vZmZzZXQgPQorCQkJb2Zmc2V0b2Yoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZXF1ZXN0LCB2YXJpYWJsZV9jYWxsZWQpOworCisJc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZXF1ZXN0ICpyZXEgPSAoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZXF1ZXN0ICopbXNnYi0+bDJoOworCXN0cnVjdCBzY2NwX29wdGlvbmFsX2RhdGEgb3B0aW9uYWxfZGF0YTsKKworCS8qIGhlYWRlciBjaGVjayAqLworCWlmIChtc2diX2wybGVuKG1zZ2IpIDwgaGVhZGVyX3NpemUpIHsKKwkJREVCVUdQKERTQ0NQLCAibXNnYiA8IGhlYWRlcl9zaXplICV1ICV1XG4iLAorCQkgICAgICAgIG1zZ2JfbDJsZW4obXNnYiksIGhlYWRlcl9zaXplKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGNvcHkgb3V0IHRoZSBjYWxsaW5nIGFuZCBjYWxsZWQgYWRkcmVzcy4gQWRkIHRoZSBvZmZzZXQgKi8KKwlpZiAoY29weV9hZGRyZXNzKCZyZXN1bHQtPmNhbGxlZCwgY2FsbGVkX29mZnNldCArIHJlcS0+dmFyaWFibGVfY2FsbGVkLCBtc2diKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoY2hlY2tfYWRkcmVzcygmcmVzdWx0LT5jYWxsZWQpICE9IDApIHsKKwkJREVCVUdQKERTQ0NQLCAiSW52YWxpZCBjYWxsZWQgYWRkcmVzcyBhY2NvcmRpbmcgdG8gMDguMDY6IDB4JXggMHgleFxuIiwKKwkJCSoodV9pbnQ4X3QgKikmcmVzdWx0LT5jYWxsZWQuYWRkcmVzcywgcmVzdWx0LT5jYWxsZWQuc3NuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJlc3VsdC0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSA9ICZyZXEtPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisKKwkvKgorCSAqIHBhcnNlIG9wdGlvbmFsIGRhdGEuCisJICovCisJbWVtc2V0KCZvcHRpb25hbF9kYXRhLCAwLCBzaXplb2Yob3B0aW9uYWxfZGF0YSkpOworCWlmIChfc2NjcF9wYXJzZV9vcHRpb25hbF9kYXRhKG9wdGlvbmFsX29mZnNldCArIHJlcS0+b3B0aW9uYWxfc3RhcnQsIG1zZ2IsICZvcHRpb25hbF9kYXRhKSAhPSAwKSB7CisJCURFQlVHUChEU0NDUCwgInBhcnNpbmcgb2Ygb3B0aW9uYWwgZGF0YSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChvcHRpb25hbF9kYXRhLmRhdGFfbGVuICE9IDApIHsKKwkJbXNnYi0+bDNoID0gJm1zZ2ItPmwyaFtvcHRpb25hbF9kYXRhLmRhdGFfc3RhcnRdOworCQlyZXN1bHQtPmRhdGFfbGVuID0gb3B0aW9uYWxfZGF0YS5kYXRhX2xlbjsKKwl9IGVsc2UgeworCQlyZXN1bHQtPmRhdGFfbGVuID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fcmVsZWFzZWQoc3RydWN0IG1zZ2IgKm1zZ2IsIHN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCAqcmVzdWx0KQoreworCXN0YXRpYyBpbnQgaGVhZGVyX3NpemUgPSBzaXplb2Yoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlZCk7CisJc3RhdGljIGludCBvcHRpb25hbF9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlbGVhc2VkLCBvcHRpb25hbF9zdGFydCk7CisKKwlzdHJ1Y3Qgc2NjcF9vcHRpb25hbF9kYXRhIG9wdGlvbmFsX2RhdGE7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlZCAqcmxzID0gKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZWQgKikgbXNnYi0+bDJoOworCisJLyogd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggc2l6ZSBmb3IgdGhlIHN0cnVjdCAqLworCWlmIChtc2diX2wybGVuKG1zZ2IpIDwgaGVhZGVyX3NpemUpIHsKKwkJREVCVUdQKERTQ0NQLCAibXNnYiA+IGhlYWRlcl9zaXplICV1ICV1XG4iLAorCQkgICAgICAgIG1zZ2JfbDJsZW4obXNnYiksIGhlYWRlcl9zaXplKTsKKwkJcmV0dXJuIC0xOworCX0KKworCW1lbXNldCgmb3B0aW9uYWxfZGF0YSwgMCwgc2l6ZW9mKG9wdGlvbmFsX2RhdGEpKTsKKwlpZiAoX3NjY3BfcGFyc2Vfb3B0aW9uYWxfZGF0YShvcHRpb25hbF9vZmZzZXQgKyBybHMtPm9wdGlvbmFsX3N0YXJ0LCBtc2diLCAmb3B0aW9uYWxfZGF0YSkgIT0gMCkgeworCQlERUJVR1AoRFNDQ1AsICJwYXJzaW5nIG9mIG9wdGlvbmFsIGRhdGEgZmFpbGVkLlxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXN1bHQtPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UgPSAmcmxzLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCXJlc3VsdC0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlID0gJnJscy0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCisJaWYgKG9wdGlvbmFsX2RhdGEuZGF0YV9sZW4gIT0gMCkgeworCQltc2diLT5sM2ggPSAmbXNnYi0+bDJoW29wdGlvbmFsX2RhdGEuZGF0YV9zdGFydF07CisJCXJlc3VsdC0+ZGF0YV9sZW4gPSBvcHRpb25hbF9kYXRhLmRhdGFfbGVuOworCX0gZWxzZSB7CisJCXJlc3VsdC0+ZGF0YV9sZW4gPSAwOworCX0KKworCXJldHVybiAwOworfQorCitpbnQgX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9yZWZ1c2VkKHN0cnVjdCBtc2diICptc2diLCBzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgKnJlc3VsdCkKK3sKKwlzdGF0aWMgY29uc3QgdV9pbnQzMl90IGhlYWRlcl9zaXplID0KKwkJCXNpemVvZihzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlZnVzZWQpOworCXN0YXRpYyBpbnQgb3B0aW9uYWxfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWZ1c2VkLCBvcHRpb25hbF9zdGFydCk7CisKKwlzdHJ1Y3Qgc2NjcF9vcHRpb25hbF9kYXRhIG9wdGlvbmFsX2RhdGE7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWZ1c2VkICpyZWY7CisKKwkvKiBoZWFkZXIgY2hlY2sgKi8KKwlpZiAobXNnYl9sMmxlbihtc2diKSA8IGhlYWRlcl9zaXplKSB7CisJCURFQlVHUChEU0NDUCwgIm1zZ2IgPCBoZWFkZXJfc2l6ZSAldSAldVxuIiwKKwkJICAgICAgICBtc2diX2wybGVuKG1zZ2IpLCBoZWFkZXJfc2l6ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZWYgPSAoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWZ1c2VkICopIG1zZ2ItPmwyaDsKKworCXJlc3VsdC0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlID0gJnJlZi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlOworCisJbWVtc2V0KCZvcHRpb25hbF9kYXRhLCAwLCBzaXplb2Yob3B0aW9uYWxfZGF0YSkpOworCWlmIChfc2NjcF9wYXJzZV9vcHRpb25hbF9kYXRhKG9wdGlvbmFsX29mZnNldCArIHJlZi0+b3B0aW9uYWxfc3RhcnQsIG1zZ2IsICZvcHRpb25hbF9kYXRhKSAhPSAwKSB7CisJCURFQlVHUChEU0NDUCwgInBhcnNpbmcgb2Ygb3B0aW9uYWwgZGF0YSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIG9wdGlvbmFsIGRhdGEgKi8KKwlpZiAob3B0aW9uYWxfZGF0YS5kYXRhX2xlbiAhPSAwKSB7CisJCW1zZ2ItPmwzaCA9ICZtc2diLT5sMmhbb3B0aW9uYWxfZGF0YS5kYXRhX3N0YXJ0XTsKKwkJcmVzdWx0LT5kYXRhX2xlbiA9IG9wdGlvbmFsX2RhdGEuZGF0YV9sZW47CisJfSBlbHNlIHsKKwkJcmVzdWx0LT5kYXRhX2xlbiA9IDA7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBfc2NjcF9wYXJzZV9jb25uZWN0aW9uX2NvbmZpcm0oc3RydWN0IG1zZ2IgKm1zZ2IsIHN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCAqcmVzdWx0KQoreworCXN0YXRpYyB1X2ludDMyX3QgaGVhZGVyX3NpemUgPQorCQkgICAgc2l6ZW9mKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fY29uZmlybSk7CisJc3RhdGljIGNvbnN0IHVfaW50MzJfdCBvcHRpb25hbF9vZmZzZXQgPQorCQkJb2Zmc2V0b2Yoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9jb25maXJtLCBvcHRpb25hbF9zdGFydCk7CisKKwlzdHJ1Y3Qgc2NjcF9vcHRpb25hbF9kYXRhIG9wdGlvbmFsX2RhdGE7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbl9jb25maXJtICpjb247CisKKwkvKiBoZWFkZXIgY2hlY2sgKi8KKwlpZiAobXNnYl9sMmxlbihtc2diKSA8IGhlYWRlcl9zaXplKSB7CisJCURFQlVHUChEU0NDUCwgIm1zZ2IgPCBoZWFkZXJfc2l6ZSAldSAldVxuIiwKKwkJICAgICAgICBtc2diX2wybGVuKG1zZ2IpLCBoZWFkZXJfc2l6ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwljb24gPSAoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9jb25maXJtICopIG1zZ2ItPmwyaDsKKwlyZXN1bHQtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSA9ICZjb24tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKwlyZXN1bHQtPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UgPSAmY29uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCisJbWVtc2V0KCZvcHRpb25hbF9kYXRhLCAwLCBzaXplb2Yob3B0aW9uYWxfZGF0YSkpOworCWlmIChfc2NjcF9wYXJzZV9vcHRpb25hbF9kYXRhKG9wdGlvbmFsX29mZnNldCArIGNvbi0+b3B0aW9uYWxfc3RhcnQsIG1zZ2IsICZvcHRpb25hbF9kYXRhKSAhPSAwKSB7CisJCURFQlVHUChEU0NDUCwgInBhcnNpbmcgb2Ygb3B0aW9uYWwgZGF0YSBmYWlsZWQuXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChvcHRpb25hbF9kYXRhLmRhdGFfbGVuICE9IDApIHsKKwkJbXNnYi0+bDNoID0gJm1zZ2ItPmwyaFtvcHRpb25hbF9kYXRhLmRhdGFfc3RhcnRdOworCQlyZXN1bHQtPmRhdGFfbGVuID0gb3B0aW9uYWxfZGF0YS5kYXRhX2xlbjsKKwl9IGVsc2UgeworCQlyZXN1bHQtPmRhdGFfbGVuID0gMDsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworaW50IF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZShzdHJ1Y3QgbXNnYiAqbXNnYiwgc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0ICpyZXN1bHQpCit7CisJc3RhdGljIGludCBoZWFkZXJfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUpOworCisJc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlX2NvbXBsZXRlICpjbXBsOworCisJLyogaGVhZGVyIGNoZWNrICovCisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCBoZWFkZXJfc2l6ZSkgeworCQlERUJVR1AoRFNDQ1AsICJtc2diIDwgaGVhZGVyX3NpemUgJXUgJXVcbiIsCisJCSAgICAgICAgbXNnYl9sMmxlbihtc2diKSwgaGVhZGVyX3NpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisJY21wbCA9IChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUgKikgbXNnYi0+bDJoOworCXJlc3VsdC0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSA9ICZjbXBsLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCXJlc3VsdC0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlID0gJmNtcGwtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZTsKKworCXJldHVybiAwOworfQorCitpbnQgX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9kdDEoc3RydWN0IG1zZ2IgKm1zZ2IsIHN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCAqcmVzdWx0KQoreworCXN0YXRpYyBpbnQgaGVhZGVyX3NpemUgPSBzaXplb2Yoc3RydWN0IHNjY3BfZGF0YV9mb3JtMSk7CisJc3RhdGljIGludCB2YXJpYWJsZV9vZmZzZXQgPSBvZmZzZXRvZihzdHJ1Y3Qgc2NjcF9kYXRhX2Zvcm0xLCB2YXJpYWJsZV9zdGFydCk7CisKKwlzdHJ1Y3Qgc2NjcF9kYXRhX2Zvcm0xICpkdDEgPSAoc3RydWN0IHNjY3BfZGF0YV9mb3JtMSAqKW1zZ2ItPmwyaDsKKworCS8qIHdlIGRvbid0IGhhdmUgZW5vdWdoIHNpemUgZm9yIHRoZSBzdHJ1Y3QgKi8KKwlpZiAobXNnYl9sMmxlbihtc2diKSA8IGhlYWRlcl9zaXplKSB7CisJCURFQlVHUChEU0NDUCwgIm1zZ2IgPiBoZWFkZXJfc2l6ZSAldSAldVxuIiwKKwkJICAgICAgICBtc2diX2wybGVuKG1zZ2IpLCBoZWFkZXJfc2l6ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoZHQxLT5zZWdtZW50aW5nICE9IDApIHsKKwkJREVCVUdQKERTQ0NQLCAiVGhpcyBwYWNrZXQgaGFzIHNlZ21lbnRpbmcsIG5vdCBzdXBwb3J0ZWQ6ICVkXG4iLCBkdDEtPnNlZ21lbnRpbmcpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmVzdWx0LT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UgPSAmZHQxLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisKKwkvKiBzb21lIG1vcmUgIHNpemUgY2hlY2tzIGluIGhlcmUgKi8KKwlpZiAobXNnYl9sMmxlbihtc2diKSA8IHZhcmlhYmxlX29mZnNldCArIGR0MS0+dmFyaWFibGVfc3RhcnQgKyAxKSB7CisJCURFQlVHUChEU0NDUCwgIk5vdCBlbm91Z2ggc3BhY2UgZm9yIHZhcmlhYmxlIHN0YXJ0OiAldSAldVxuIiwKKwkJCW1zZ2JfbDJsZW4obXNnYiksIGR0MS0+dmFyaWFibGVfc3RhcnQpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmVzdWx0LT5kYXRhX2xlbiA9IG1zZ2ItPmwyaFt2YXJpYWJsZV9vZmZzZXQgKyBkdDEtPnZhcmlhYmxlX3N0YXJ0XTsKKwltc2diLT5sM2ggPSAmbXNnYi0+bDJoW2R0MS0+dmFyaWFibGVfc3RhcnQgKyB2YXJpYWJsZV9vZmZzZXQgKyAxXTsKKworCWlmIChtc2diX2wzbGVuKG1zZ2IpIDwgcmVzdWx0LT5kYXRhX2xlbikgeworCQlERUJVR1AoRFNDQ1AsICJOb3QgZW5vdWdoIHJvb20gZm9yIHRoZSBwYXlsb2FkOiAldSAldVxuIiwKKwkJCW1zZ2JfbDNsZW4obXNnYiksIHJlc3VsdC0+ZGF0YV9sZW4pOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK2ludCBfc2NjcF9wYXJzZV91ZHQoc3RydWN0IG1zZ2IgKm1zZ2IsIHN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCAqcmVzdWx0KQoreworCXN0YXRpYyBjb25zdCB1X2ludDMyX3QgaGVhZGVyX3NpemUgPSBzaXplb2Yoc3RydWN0IHNjY3BfZGF0YV91bml0ZGF0YSk7CisJc3RhdGljIGNvbnN0IHVfaW50MzJfdCBjYWxsZWRfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNjY3BfZGF0YV91bml0ZGF0YSwgdmFyaWFibGVfY2FsbGVkKTsKKwlzdGF0aWMgY29uc3QgdV9pbnQzMl90IGNhbGxpbmdfb2Zmc2V0ID0gb2Zmc2V0b2Yoc3RydWN0IHNjY3BfZGF0YV91bml0ZGF0YSwgdmFyaWFibGVfY2FsbGluZyk7CisJc3RhdGljIGNvbnN0IHVfaW50MzJfdCBkYXRhX29mZnNldCA9IG9mZnNldG9mKHN0cnVjdCBzY2NwX2RhdGFfdW5pdGRhdGEsIHZhcmlhYmxlX2RhdGEpOworCisJc3RydWN0IHNjY3BfZGF0YV91bml0ZGF0YSAqdWR0ID0gKHN0cnVjdCBzY2NwX2RhdGFfdW5pdGRhdGEgKiltc2diLT5sMmg7CisKKwlpZiAobXNnYl9sMmxlbihtc2diKSA8IGhlYWRlcl9zaXplKSB7CisJCURFQlVHUChEU0NDUCwgIm1zZ2IgPCBoZWFkZXJfc2l6ZSAldSAldVxuIiwKKwkJICAgICAgICBtc2diX2wybGVuKG1zZ2IpLCBoZWFkZXJfc2l6ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBjb3B5IG91dCB0aGUgY2FsbGluZyBhbmQgY2FsbGVkIGFkZHJlc3MuIEFkZCB0aGUgb2ZmICovCisJaWYgKGNvcHlfYWRkcmVzcygmcmVzdWx0LT5jYWxsZWQsIGNhbGxlZF9vZmZzZXQgKyB1ZHQtPnZhcmlhYmxlX2NhbGxlZCwgbXNnYikgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJaWYgKGNoZWNrX2FkZHJlc3MoJnJlc3VsdC0+Y2FsbGVkKSAhPSAwKSB7CisJCURFQlVHUChEU0NDUCwgIkludmFsaWQgY2FsbGVkIGFkZHJlc3MgYWNjb3JkaW5nIHRvIDA4LjA2OiAweCV4IDB4JXhcbiIsCisJCQkqKHVfaW50OF90ICopJnJlc3VsdC0+Y2FsbGVkLmFkZHJlc3MsIHJlc3VsdC0+Y2FsbGVkLnNzbik7CisJCXJldHVybiAtMTsKKwl9CisKKwlpZiAoY29weV9hZGRyZXNzKCZyZXN1bHQtPmNhbGxpbmcsIGNhbGxpbmdfb2Zmc2V0ICsgdWR0LT52YXJpYWJsZV9jYWxsaW5nLCBtc2diKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwlpZiAoY2hlY2tfYWRkcmVzcygmcmVzdWx0LT5jYWxsaW5nKSAhPSAwKSB7CisJCURFQlVHUChEU0NDUCwgIkludmFsaWQgY2FsbGVkIGFkZHJlc3MgYWNjb3JkaW5nIHRvIDA4LjA2OiAweCV4IDB4JXhcbiIsCisJCQkqKHVfaW50OF90ICopJnJlc3VsdC0+Y2FsbGVkLmFkZHJlc3MsIHJlc3VsdC0+Y2FsbGVkLnNzbik7CisJfQorCisJLyogd2UgZG9uJ3QgaGF2ZSBlbm91Z2ggc2l6ZSBmb3IgdGhlIGRhdGEgKi8KKwlpZiAobXNnYl9sMmxlbihtc2diKSA8IGRhdGFfb2Zmc2V0ICsgdWR0LT52YXJpYWJsZV9kYXRhICsgMSkgeworCQlERUJVR1AoRFNDQ1AsICJtc2diIDwgaGVhZGVyICsgb2Zmc2V0ICV1ICV1ICV1XG4iLAorCQkJbXNnYl9sMmxlbihtc2diKSwgaGVhZGVyX3NpemUsIHVkdC0+dmFyaWFibGVfZGF0YSk7CisJCXJldHVybiAtMTsKKwl9CisKKworCW1zZ2ItPmwzaCA9ICZ1ZHQtPmRhdGFbdWR0LT52YXJpYWJsZV9kYXRhXTsKKwlyZXN1bHQtPmRhdGFfbGVuID0gbXNnYl9sM2xlbihtc2diKTsKKworCWlmIChtc2diX2wzbGVuKG1zZ2IpICE9ICBtc2diLT5sM2hbLTFdKSB7CisJCURFQlVHUChEU0NDUCwgIm1zZ2IgaXMgdHJ1bmNhdGVkIGlzOiAldSBzaG91bGQ6ICV1XG4iLAorCQkJbXNnYl9sM2xlbihtc2diKSwgbXNnYi0+bDNoWy0xXSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBfc2NjcF9wYXJzZV9pdChzdHJ1Y3QgbXNnYiAqbXNnYiwgc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0ICpyZXN1bHQpCit7CisJc3RhdGljIGNvbnN0IHVfaW50MzJfdCBoZWFkZXJfc2l6ZSA9IHNpemVvZihzdHJ1Y3Qgc2NjcF9kYXRhX2l0KTsKKworCXN0cnVjdCBzY2NwX2RhdGFfaXQgKml0OworCisJaWYgKG1zZ2JfbDJsZW4obXNnYikgPCBoZWFkZXJfc2l6ZSkgeworCQlERUJVR1AoRFNDQ1AsICJtc2diIDwgaGVhZGVyX3NpemUgJXUgJXVcbiIsCisJCSAgICAgICAgbXNnYl9sMmxlbihtc2diKSwgaGVhZGVyX3NpemUpOworCQlyZXR1cm4gLTE7CisJfQorCisJaXQgPSAoc3RydWN0IHNjY3BfZGF0YV9pdCAqKSBtc2diLT5sMmg7CisJcmVzdWx0LT5kYXRhX2xlbiA9IDA7CisJcmVzdWx0LT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlID0gJml0LT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCXJlc3VsdC0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlID0gJml0LT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2U7CisJcmV0dXJuIDA7Cit9CisKKworLyoKKyAqIFNlbmQgVURULiBDdXJyZW50bHkgd2UgaGF2ZSBhIGZpeGVkIGFkZHJlc3MuLi4KKyAqLworc3RhdGljIGludCBfc2NjcF9zZW5kX2RhdGEoaW50IGNsYXNzLCBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqaW4sCisJCQkgICBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqb3V0LCBzdHJ1Y3QgbXNnYiAqcGF5bG9hZCkKK3sKKwlzdHJ1Y3Qgc2NjcF9kYXRhX3VuaXRkYXRhICp1ZHQ7CisJdV9pbnQ4X3QgKmRhdGE7CisJaW50IHJldDsKKworCWlmIChtc2diX2wzbGVuKHBheWxvYWQpID4gMjU2KSB7CisJCURFQlVHUChEU0NDUCwgIlRoZSBwYXlsb2FkIGlzIHRvbyBiaWcgZm9yIG9uZSB1ZHRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2NfaGVhZHJvb20oU0NDUF9NU0dfU0laRSwKKwkJCQkJICAgICAgIFNDQ1BfTVNHX0hFQURST09NLCAic2NjcDogdWR0Iik7CisJbXNnLT5sMmggPSAmbXNnLT5kYXRhWzBdOworCXVkdCA9IChzdHJ1Y3Qgc2NjcF9kYXRhX3VuaXRkYXRhICopbXNnYl9wdXQobXNnLCBzaXplb2YoKnVkdCkpOworCisJdWR0LT50eXBlID0gU0NDUF9NU0dfVFlQRV9VRFQ7CisJdWR0LT5wcm90b19jbGFzcyA9IGNsYXNzOworCXVkdC0+dmFyaWFibGVfY2FsbGVkID0gMzsKKwl1ZHQtPnZhcmlhYmxlX2NhbGxpbmcgPSA1OworCXVkdC0+dmFyaWFibGVfZGF0YSA9IDc7CisKKwkvKiBmb3IgdmFyaWFibGUgZGF0YSB3ZSBzdGFydCB3aXRoIGEgc2l6ZSBhbmQgdGhlIGRhdGEgKi8KKwlkYXRhID0gbXNnYl9wdXQobXNnLCAxICsgMik7CisJZGF0YVswXSA9IDI7CisJZGF0YVsxXSA9IDB4NDI7CisJZGF0YVsyXSA9IG91dC0+c2NjcF9zc247CisKKwlkYXRhID0gbXNnYl9wdXQobXNnLCAxICsgMik7CisJZGF0YVswXSA9IDI7CisJZGF0YVsxXSA9IDB4NDI7CisJZGF0YVsyXSA9IGluLT5zY2NwX3NzbjsKKworCS8qIGNvcHkgdGhlIHBheWxvYWQgKi8KKwlkYXRhID0gbXNnYl9wdXQobXNnLCAxICsgbXNnYl9sM2xlbihwYXlsb2FkKSk7CisJZGF0YVswXSA9IG1zZ2JfbDNsZW4ocGF5bG9hZCk7CisJbWVtY3B5KCZkYXRhWzFdLCBwYXlsb2FkLT5sM2gsIG1zZ2JfbDNsZW4ocGF5bG9hZCkpOworCisJcmV0ID0gX3NlbmRfbXNnKG1zZyk7CisJbXNnYl9mcmVlKG1zZyk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9zY2NwX2hhbmRsZV9yZWFkKHN0cnVjdCBtc2diICptc2diKQoreworCXN0cnVjdCBzY2NwX2RhdGFfY2FsbGJhY2sgKmNiOworCXN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCByZXN1bHQ7CisKKwlpZiAoX3NjY3BfcGFyc2VfdWR0KG1zZ2IsICZyZXN1bHQpICE9IDApCisJCXJldHVybiAtMTsKKworCWNiID0gX2ZpbmRfc3NuKHJlc3VsdC5jYWxsZWQuc3NuKTsKKwlpZiAoIWNiIHx8ICFjYi0+cmVhZF9jYikgeworCQlERUJVR1AoRFNDQ1AsICJObyByb3V0aW5nIGZvciBVRFQgZm9yIGNhbGxlZCBTU046ICV1XG4iLCByZXN1bHQuY2FsbGVkLnNzbik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKiBzYW5pdHkgY2hlY2sgKi8KKwlyZXR1cm4gY2ItPnJlYWRfY2IobXNnYiwgbXNnYl9sM2xlbihtc2diKSwgY2ItPnJlYWRfY29udGV4dCk7Cit9CisKKy8qCisgKiBoYW5kbGUgY29ubmVjdGlvbiBvcmllbnRhdGVkIG1ldGhvZHMKKyAqLworc3RhdGljIGludCBzb3VyY2VfbG9jYWxfcmVmZXJlbmNlX2lzX2ZyZWUoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSAqcmVmZXJlbmNlKQoreworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb247CisKKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uZWN0aW9uLCAmc2NjcF9jb25uZWN0aW9ucywgbGlzdCkgeworCQlpZiAobWVtY21wKHJlZmVyZW5jZSwgJmNvbm5lY3Rpb24tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsIHNpemVvZigqcmVmZXJlbmNlKSkgPT0gMCkKKwkJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludCBkZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2VfaXNfZnJlZShzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlICpyZWZlcmVuY2UpCit7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbjsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm5lY3Rpb24sICZzY2NwX2Nvbm5lY3Rpb25zLCBsaXN0KSB7CisJCWlmIChtZW1jbXAocmVmZXJlbmNlLCAmY29ubmVjdGlvbi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLCBzaXplb2YoKnJlZmVyZW5jZSkpID09IDApCisJCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYXNzaWduX3NvdXJjZV9sb2NhbF9yZWZlcmVuY2Uoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbikKK3sKKwlzdGF0aWMgdV9pbnQzMl90IGxhc3RfcmVmID0gMHgzMDAwMDsKKwlpbnQgd3JhcHBlZCA9IDA7CisKKwlkbyB7CisJCXN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UgcmVmZXJlbmNlOworCQlyZWZlcmVuY2Uub2N0ZXQxID0gKGxhc3RfcmVmID4+ICAwKSAmIDB4ZmY7CisJCXJlZmVyZW5jZS5vY3RldDIgPSAobGFzdF9yZWYgPj4gIDgpICYgMHhmZjsKKwkJcmVmZXJlbmNlLm9jdGV0MyA9IChsYXN0X3JlZiA+PiAxNikgJiAweGZmOworCisJCSsrbGFzdF9yZWY7CisJCS8qIGRvIG5vdCB1c2UgdGhlIHJldmVyc2VkIHdvcmQgYW5kIHdyYXAgYXJvdW5kICovCisJCWlmICgobGFzdF9yZWYgJiAweDAwRkZGRkZGKSA9PSAweDAwRkZGRkZGKSB7CisJCQlERUJVR1AoRFNDQ1AsICJXcmFwcGVkIHNlYXJjaGluZyBmb3IgYSBmcmVlIGNvZGVcbiIpOworCQkJbGFzdF9yZWYgPSAwOworCQkJKyt3cmFwcGVkOworCQl9CisKKwkJaWYgKHNvdXJjZV9sb2NhbF9yZWZlcmVuY2VfaXNfZnJlZSgmcmVmZXJlbmNlKSA9PSAwKSB7CisJCQljb25uZWN0aW9uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlID0gcmVmZXJlbmNlOworCQkJcmV0dXJuIDA7CisJCX0KKwl9IHdoaWxlICh3cmFwcGVkICE9IDIpOworCisJREVCVUdQKERTQ0NQLCAiRmluZGluZyBhIGZyZWUgcmVmZXJlbmNlIGZhaWxlZFxuIik7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgdm9pZCBfc2NjcF9zZXRfY29ubmVjdGlvbl9zdGF0ZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBpbnQgbmV3X3N0YXRlKQoreworCWludCBvbGRfc3RhdGUgPSBjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlOworCisJY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSA9IG5ld19zdGF0ZTsKKwlpZiAoY29ubmVjdGlvbi0+c3RhdGVfY2IpCisJCWNvbm5lY3Rpb24tPnN0YXRlX2NiKGNvbm5lY3Rpb24sIG9sZF9zdGF0ZSk7Cit9CisKK3N0YXRpYyBpbnQgX3NjY3Bfc2VuZF9yZWZ1c2Uoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSAqc3JjX3JlZiwgaW50IGNhdXNlKQoreworCXN0cnVjdCBtc2diICptc2diOworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVmdXNlZCAqcmVmOworCXVfaW50OF90ICpkYXRhOworCWludCByZXQ7CisKKwltc2diID0gbXNnYl9hbGxvY19oZWFkcm9vbShTQ0NQX01TR19TSVpFLAorCQkJCSAgIFNDQ1BfTVNHX0hFQURST09NLCAic2NjcCByZWYiKTsKKwltc2diLT5sMmggPSAmbXNnYi0+ZGF0YVswXTsKKworCXJlZiA9IChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlZnVzZWQgKikgbXNnYl9wdXQobXNnYiwgc2l6ZW9mKCpyZWYpKTsKKwlyZWYtPnR5cGUgPSBTQ0NQX01TR19UWVBFX0NSRUY7CisJbWVtY3B5KCZyZWYtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwgc3JjX3JlZiwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UpKTsKKwlyZWYtPmNhdXNlID0gY2F1c2U7CisJcmVmLT5vcHRpb25hbF9zdGFydCA9IDE7CisKKwlkYXRhID0gbXNnYl9wdXQobXNnYiwgMSk7CisJZGF0YVswXSA9IFNDQ1BfUE5DX0VORF9PRl9PUFRJT05BTDsKKworCXJldCA9IF9zZW5kX21zZyhtc2diKTsKKwltc2diX2ZyZWUobXNnYik7CisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfc2NjcF9zZW5kX2Nvbm5lY3Rpb25fY29uZmlybShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uKQoreworCXN0cnVjdCBtc2diICpyZXNwb25zZTsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX2NvbmZpcm0gKmNvbmZpcm07CisJdV9pbnQ4X3QgKm9wdGlvbmFsX2RhdGE7CisJaW50IHJldDsKKworCWlmIChhc3NpZ25fc291cmNlX2xvY2FsX3JlZmVyZW5jZShjb25uZWN0aW9uKSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwlyZXNwb25zZSA9IG1zZ2JfYWxsb2NfaGVhZHJvb20oU0NDUF9NU0dfU0laRSwKKwkJCQkgICAgICAgU0NDUF9NU0dfSEVBRFJPT00sICJzY2NwIGNvbmZpcm0iKTsKKwlyZXNwb25zZS0+bDJoID0gJnJlc3BvbnNlLT5kYXRhWzBdOworCisJY29uZmlybSA9IChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX2NvbmZpcm0gKikgbXNnYl9wdXQocmVzcG9uc2UsIHNpemVvZigqY29uZmlybSkpOworCisJY29uZmlybS0+dHlwZSA9IFNDQ1BfTVNHX1RZUEVfQ0M7CisJbWVtY3B5KCZjb25maXJtLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJICAgICAgICZjb25uZWN0aW9uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJICAgICAgIHNpemVvZihjb25uZWN0aW9uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UpKTsKKwltZW1jcHkoJmNvbmZpcm0tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJICAgICAgICZjb25uZWN0aW9uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCSAgICAgICBzaXplb2YoY29ubmVjdGlvbi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSkpOworCWNvbmZpcm0tPnByb3RvX2NsYXNzID0gMjsKKwljb25maXJtLT5vcHRpb25hbF9zdGFydCA9IDE7CisKKwlvcHRpb25hbF9kYXRhID0gKHVfaW50OF90ICopIG1zZ2JfcHV0KHJlc3BvbnNlLCAxKTsKKwlvcHRpb25hbF9kYXRhWzBdID0gU0NDUF9QTkNfRU5EX09GX09QVElPTkFMOworCisJcmV0ID0gX3NlbmRfbXNnKHJlc3BvbnNlKTsKKwltc2diX2ZyZWUocmVzcG9uc2UpOworCisJX3NjY3Bfc2V0X2Nvbm5lY3Rpb25fc3RhdGUoY29ubmVjdGlvbiwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX0VTVEFCTElTSEVEKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9zY2NwX3NlbmRfY29ubmVjdGlvbl9yZXF1ZXN0KHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sCisJCQkJCSBjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqY2FsbGVkLCBzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBtc2diICpyZXF1ZXN0OworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVxdWVzdCAqcmVxOworCXVfaW50OF90ICpkYXRhOworCXVfaW50OF90IGV4dHJhX3NpemUgPSAzICsgMTsKKwlpbnQgcmV0OworCisKKwlpZiAobXNnICYmIChtc2diX2wzbGVuKG1zZykgPCAzIHx8IG1zZ2JfbDNsZW4obXNnKSA+IDEzMCkpIHsKKwkJREVCVUdQKERTQ0NQLCAiSW52YWxpZCBhbW91bnQgb2YgZGF0YS4uLiAlZFxuIiwgbXNnYl9sM2xlbihtc2cpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIHRyeSB0byBmaW5kIGEgaWQgKi8KKwlpZiAoYXNzaWduX3NvdXJjZV9sb2NhbF9yZWZlcmVuY2UoY29ubmVjdGlvbikgIT0gMCkgeworCQlERUJVR1AoRFNDQ1AsICJBc3NpZ25pbmcgYSBsb2NhbCByZWZlcmVuY2UgZmFpbGVkLlxuIik7CisJCV9zY2NwX3NldF9jb25uZWN0aW9uX3N0YXRlKGNvbm5lY3Rpb24sIFNDQ1BfQ09OTkVDVElPTl9TVEFURV9TRVRVUF9FUlJPUik7CisJCXJldHVybiAtMTsKKwl9CisKKworCWlmIChtc2cpCisJCWV4dHJhX3NpemUgKz0gMiArIG1zZ2JfbDNsZW4obXNnKTsKKwlyZXF1ZXN0ID0gbXNnYl9hbGxvY19oZWFkcm9vbShTQ0NQX01TR19TSVpFLAorCQkJCSAgICAgIFNDQ1BfTVNHX0hFQURST09NLCAic2NjcCBjb25uZWN0aW9uIHJlcXVlc3QiKTsKKwlyZXF1ZXN0LT5sMmggPSAmcmVxdWVzdC0+ZGF0YVswXTsKKwlyZXEgPSAoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZXF1ZXN0ICopIG1zZ2JfcHV0KHJlcXVlc3QsIHNpemVvZigqcmVxKSk7CisKKwlyZXEtPnR5cGUgPSBTQ0NQX01TR19UWVBFX0NSOworCW1lbWNweSgmcmVxLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLCAmY29ubmVjdGlvbi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkgICAgICAgc2l6ZW9mKGNvbm5lY3Rpb24tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UpKTsKKwlyZXEtPnByb3RvX2NsYXNzID0gMjsKKwlyZXEtPnZhcmlhYmxlX2NhbGxlZCA9IDI7CisJcmVxLT5vcHRpb25hbF9zdGFydCA9IDQ7CisKKwkvKiB3cml0ZSB0aGUgY2FsbGVkIHBhcnR5IGFkZHJlc3MgKi8KKwlkYXRhID0gbXNnYl9wdXQocmVxdWVzdCwgMSArIDIpOworCWRhdGFbMF0gPSAyOworCWRhdGFbMV0gPSAweDQyOworCWRhdGFbMl0gPSBjYWxsZWQtPnNjY3Bfc3NuOworCisJLyogd3JpdGUgdGhlIHBheWxvYWQgKi8KKwlpZiAobXNnKSB7CisJICAgIGRhdGEgPSBtc2diX3B1dChyZXF1ZXN0LCAyICsgbXNnYl9sM2xlbihtc2cpKTsKKwkgICAgZGF0YVswXSA9IFNDQ1BfUE5DX0RBVEE7CisJICAgIGRhdGFbMV0gPSBtc2diX2wzbGVuKG1zZyk7CisJICAgIG1lbWNweSgmZGF0YVsyXSwgbXNnLT5sM2gsIG1zZ2JfbDNsZW4obXNnKSk7CisJfQorCisJZGF0YSA9IG1zZ2JfcHV0KHJlcXVlc3QsIDEpOworCWRhdGFbMF0gPSBTQ0NQX1BOQ19FTkRfT0ZfT1BUSU9OQUw7CisKKwlsbGlzdF9hZGRfdGFpbCgmY29ubmVjdGlvbi0+bGlzdCwgJnNjY3BfY29ubmVjdGlvbnMpOworCV9zY2NwX3NldF9jb25uZWN0aW9uX3N0YXRlKGNvbm5lY3Rpb24sIFNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRVFVRVNUKTsKKworCXJldCA9IF9zZW5kX21zZyhyZXF1ZXN0KTsKKwltc2diX2ZyZWUocmVxdWVzdCk7CisKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9zY2NwX3NlbmRfY29ubmVjdGlvbl9kYXRhKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4sIHN0cnVjdCBtc2diICpfZGF0YSkKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnYjsKKwlzdHJ1Y3Qgc2NjcF9kYXRhX2Zvcm0xICpkdDE7CisJdV9pbnQ4X3QgKmRhdGE7CisJaW50IGV4dHJhX3NpemU7CisJaW50IHJldDsKKworCWlmIChtc2diX2wzbGVuKF9kYXRhKSA8IDIgfHwgbXNnYl9sM2xlbihfZGF0YSkgPiAyNTYpIHsKKwkJREVCVUdQKERTQ0NQLCAiZGF0YSBzaXplIHRvbyBiaWcsIHNlZ21lbnRpbmcgdW5pbXBsZW1lbnRlZC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJZXh0cmFfc2l6ZSA9IDEgKyBtc2diX2wzbGVuKF9kYXRhKTsKKwltc2diID0gbXNnYl9hbGxvY19oZWFkcm9vbShTQ0NQX01TR19TSVpFLAorCQkJCSAgIFNDQ1BfTVNHX0hFQURST09NLCAic2NjcCBkdDEiKTsKKwltc2diLT5sMmggPSAmbXNnYi0+ZGF0YVswXTsKKworCWR0MSA9IChzdHJ1Y3Qgc2NjcF9kYXRhX2Zvcm0xICopIG1zZ2JfcHV0KG1zZ2IsIHNpemVvZigqZHQxKSk7CisJZHQxLT50eXBlID0gU0NDUF9NU0dfVFlQRV9EVDE7CisJbWVtY3B5KCZkdDEtPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwgJmNvbm4tPmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UpKTsKKwlkdDEtPnNlZ21lbnRpbmcgPSAwOworCisJLyogY29weSB0aGUgZGF0YSAqLworCWR0MS0+dmFyaWFibGVfc3RhcnQgPSAxOworCWRhdGEgPSBtc2diX3B1dChtc2diLCBleHRyYV9zaXplKTsKKwlkYXRhWzBdID0gZXh0cmFfc2l6ZSAtIDE7CisJbWVtY3B5KCZkYXRhWzFdLCBfZGF0YS0+bDNoLCBleHRyYV9zaXplIC0gMSk7CisKKwlyZXQgPSBfc2VuZF9tc2cobXNnYik7CisJbXNnYl9mcmVlKG1zZ2IpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGludCBfc2NjcF9zZW5kX2Nvbm5lY3Rpb25faXQoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubikKK3sKKwlzdHJ1Y3QgbXNnYiAqbXNnYjsKKwlzdHJ1Y3Qgc2NjcF9kYXRhX2l0ICppdDsKKwlpbnQgcmV0OworCisJbXNnYiA9IG1zZ2JfYWxsb2NfaGVhZHJvb20oU0NDUF9NU0dfU0laRSwKKwkJCQkgICBTQ0NQX01TR19IRUFEUk9PTSwgInNjY3AgaXQiKTsKKwltc2diLT5sMmggPSAmbXNnYi0+ZGF0YVswXTsKKwlpdCA9IChzdHJ1Y3Qgc2NjcF9kYXRhX2l0ICopIG1zZ2JfcHV0KG1zZ2IsIHNpemVvZigqaXQpKTsKKwlpdC0+dHlwZSA9IFNDQ1BfTVNHX1RZUEVfSVQ7CisJbWVtY3B5KCZpdC0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLCAmY29ubi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCQlzaXplb2Yoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSkpOworCW1lbWNweSgmaXQtPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsICZjb25uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCQlzaXplb2Yoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSkpOworCisJaXQtPnByb3RvX2NsYXNzID0gMHgyOworCWl0LT5zZXF1ZW5jaW5nWzBdID0gaXQtPnNlcXVlbmNpbmdbMV0gPSAwOworCWl0LT5jcmVkaXQgPSAwOworCisJcmV0ID0gX3NlbmRfbXNnKG1zZ2IpOworCW1zZ2JfZnJlZShtc2diKTsKKwlyZXR1cm4gcmV0OworfQorCitzdGF0aWMgaW50IF9zY2NwX3NlbmRfY29ubmVjdGlvbl9yZWxlYXNlZChzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uLCBpbnQgY2F1c2UpCit7CisJc3RydWN0IG1zZ2IgKm1zZzsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uX3JlbGVhc2VkICpyZWw7CisJdV9pbnQ4X3QgKmRhdGE7CisJaW50IHJldDsKKworCW1zZyA9IG1zZ2JfYWxsb2NfaGVhZHJvb20oU0NDUF9NU0dfU0laRSwgU0NDUF9NU0dfSEVBRFJPT00sCisJCQkJICAic2NjcDogY29ubmVjdGlvbiByZWxlYXNlZCIpOworCW1zZy0+bDJoID0gJm1zZy0+ZGF0YVswXTsKKwlyZWwgPSAoc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlZCAqKSBtc2diX3B1dChtc2csIHNpemVvZigqcmVsKSk7CisJcmVsLT50eXBlID0gU0NDUF9NU0dfVFlQRV9STFNEOworCXJlbC0+cmVsZWFzZV9jYXVzZSA9IGNhdXNlOworCisJLyogY29weSB0aGUgc291cmNlIHJlZmVyZW5jZXMgKi8KKwltZW1jcHkoJnJlbC0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLCAmY29ubi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCSAgICAgICBzaXplb2Yoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSkpOworCW1lbWNweSgmcmVsLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLCAmY29ubi0+c291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkgICAgICAgc2l6ZW9mKHN0cnVjdCBzY2NwX3NvdXJjZV9yZWZlcmVuY2UpKTsKKworCWRhdGEgPSBtc2diX3B1dChtc2csIDEpOworCWRhdGFbMF0gPSBTQ0NQX1BOQ19FTkRfT0ZfT1BUSU9OQUw7CisKKwlfc2NjcF9zZXRfY29ubmVjdGlvbl9zdGF0ZShjb25uLCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVMRUFTRSk7CisJcmV0ID0gX3NlbmRfbXNnKG1zZyk7CisJbXNnYl9mcmVlKG1zZyk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKgorICogT3BlbiBhIGNvbm5lY3Rpb24uIFRoZSBmb2xsb3dpbmcgaXMgZ29pbmcgdG8gaGFwcGVuOgorICoKKyAqCS0gVmVyaWZ5IHRoZSBwYWNrZXQsIGUuZy4gdGhhdCB3ZSBoYXZlIG5vIG90aGVyIGNvbm5lY3Rpb24KKyAqCSAgdGhhdCBpZC4KKyAqICAgICAgLSBBc2sgdGhlIHVzZXIgaWYgaGUgd2FudHMgdG8gYWNjZXB0IHRoZSBjb25uZWN0aW9uCisgKiAgICAgIC0gVHJ5IHRvIG9wZW4gdGhlIGNvbm5lY3Rpb24gYnkgYXNzaWduaW5nIGEgc291cmNlIGxvY2FsIHJlZmVyZW5jZQorICogICAgICAgIGFuZCBzZW5kaW5nIHRoZSBwYWNrZXQKKyAqLworc3RhdGljIGludCBfc2NjcF9oYW5kbGVfY29ubmVjdGlvbl9yZXF1ZXN0KHN0cnVjdCBtc2diICptc2diKQoreworCXN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCByZXN1bHQ7CisKKwlzdHJ1Y3Qgc2NjcF9kYXRhX2NhbGxiYWNrICpjYjsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCisJaWYgKF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fcmVxdWVzdChtc2diLCAmcmVzdWx0KSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwljYiA9IF9maW5kX3NzbihyZXN1bHQuY2FsbGVkLnNzbik7CisJaWYgKCFjYiB8fCAhY2ItPmFjY2VwdF9jYikgeworCQlERUJVR1AoRFNDQ1AsICJObyByb3V0aW5nIGZvciBDUiBmb3IgY2FsbGVkIFNTTjogJXVcbiIsIHJlc3VsdC5jYWxsZWQuc3NuKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIGNoZWNrIGlmIHRoZSBzeXN0ZW0gd2FudHMgdGhpcyBjb25uZWN0aW9uICovCisJY29ubmVjdGlvbiA9IHRhbGxvY196ZXJvKHRhbGxfc2NjcF9jdHgsIHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24pOworCWlmICghY29ubmVjdGlvbikgeworCQlERUJVR1AoRFNDQ1AsICJBbGxvY2F0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybiAtMTsKKwl9CisKKwkvKgorCSAqIHNhbml0eSBjaGVja3M6CisJICoJLSBJcyB0aGUgc291cmNlX2xvY2FsX3JlZmVyZW5jZSBpbiBhbnkgb3RoZXIgY29ubmVjdGlvbj8KKwkgKiB0aGVuIHdpbGwgY2FsbCBhY2NlcHQsIGFzc2lnbiBhICJkZXN0aW5hdGlvbiIgbG9jYWwgcmVmZXJlbmNlCisJICogYW5kIHNlbmQgYSBjb25uZWN0aW9uIGNvbmZpcm0sIG90aGVyd2lzZSB3ZSB3aWxsIHNlbmQgYSByZWZ1c2VlZAorCSAqIG9uZS4uLi4KKwkgKi8KKwlpZiAoZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlX2lzX2ZyZWUocmVzdWx0LnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UpICE9IDApIHsKKwkJREVCVUdQKERTQ0NQLCAiTmVlZCB0byByZWplY3QgY29ubmVjdGlvbiB3aXRoIGV4aXN0aW5nIHJlZmVyZW5jZVxuIik7CisJCV9zY2NwX3NlbmRfcmVmdXNlKHJlc3VsdC5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLCBTQ0NQX1JFRlVTQUxfU0NDUF9GQUlMVVJFKTsKKwkJdGFsbG9jX2ZyZWUoY29ubmVjdGlvbik7CisJCXJldHVybiAtMTsKKwl9CisKKwljb25uZWN0aW9uLT5pbmNvbWluZyA9IDE7CisJY29ubmVjdGlvbi0+ZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlID0gKnJlc3VsdC5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlOworCisJaWYgKGNiLT5hY2NlcHRfY2IoY29ubmVjdGlvbiwgY2ItPmFjY2VwdF9jb250ZXh0KSAhPSAwKSB7CisJCV9zY2NwX3NlbmRfcmVmdXNlKHJlc3VsdC5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLCBTQ0NQX1JFRlVTQUxfRU5EX1VTRVJfT1JJR0lOQVRFRCk7CisJCV9zY2NwX3NldF9jb25uZWN0aW9uX3N0YXRlKGNvbm5lY3Rpb24sIFNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUZVU0VEKTsKKwkJdGFsbG9jX2ZyZWUoY29ubmVjdGlvbik7CisJCXJldHVybiAwOworCX0KKworCisJbGxpc3RfYWRkX3RhaWwoJmNvbm5lY3Rpb24tPmxpc3QsICZzY2NwX2Nvbm5lY3Rpb25zKTsKKworCWlmIChfc2NjcF9zZW5kX2Nvbm5lY3Rpb25fY29uZmlybShjb25uZWN0aW9uKSAhPSAwKSB7CisJCURFQlVHUChEU0NDUCwgIlNlbmRpbmcgY29uZmlybSBmYWlsZWQuLi4gbm8gYXZhaWxhYmxlIHNvdXJjZSByZWZlcmVuY2U/XG4iKTsKKworCQlfc2NjcF9zZW5kX3JlZnVzZShyZXN1bHQuc291cmNlX2xvY2FsX3JlZmVyZW5jZSwgU0NDUF9SRUZVU0FMX1NDQ1BfRkFJTFVSRSk7CisJCV9zY2NwX3NldF9jb25uZWN0aW9uX3N0YXRlKGNvbm5lY3Rpb24sIFNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUZVU0VEKTsKKwkJbGxpc3RfZGVsKCZjb25uZWN0aW9uLT5saXN0KTsKKwkJdGFsbG9jX2ZyZWUoY29ubmVjdGlvbik7CisKKwkJcmV0dXJuIC0xOworCX0KKworCS8qCisJICogSWYgd2UgaGF2ZSBkYXRhIGxldCB1cyBmb3J3YXJkIHRoaW5ncy4KKwkgKi8KKwlpZiAocmVzdWx0LmRhdGFfbGVuICE9IDAgJiYgY29ubmVjdGlvbi0+ZGF0YV9jYikgeworCQljb25uZWN0aW9uLT5kYXRhX2NiKGNvbm5lY3Rpb24sIG1zZ2IsIHJlc3VsdC5kYXRhX2xlbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIEhhbmRsZSB0aGUgcmVsZWFzZSBjb25maXJtZWQgKi8KK3N0YXRpYyBpbnQgX3NjY3BfaGFuZGxlX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZShzdHJ1Y3QgbXNnYiAqbXNnYikKK3sKKwlzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgcmVzdWx0OworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm47CisKKwlpZiAoX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9yZWxlYXNlX2NvbXBsZXRlKG1zZ2IsICZyZXN1bHQpICE9IDApCisJCXJldHVybiAtMTsKKworCS8qIGZpbmQgdGhlIGNvbm5lY3Rpb24gKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uLCAmc2NjcF9jb25uZWN0aW9ucywgbGlzdCkgeworCQlpZiAoY29ubi0+ZGF0YV9jYgorCQkgICAgJiYgbWVtY21wKCZjb25uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgcmVzdWx0LmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHNpemVvZihjb25uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlKSkgPT0gMAorCQkgICAgJiYgbWVtY21wKCZjb25uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICByZXN1bHQuc291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHNpemVvZihjb25uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UpKSA9PSAwKSB7CisJCSAgICBnb3RvIGZvdW5kOworCQl9CisJfQorCisKKwlERUJVR1AoRFNDQ1AsICJSZWxlYXNlIGNvbXBsZXRlIG9mIHVua25vd24gY29ubmVjdGlvblxuIik7CisJcmV0dXJuIC0xOworCitmb3VuZDoKKwlsbGlzdF9kZWwoJmNvbm4tPmxpc3QpOworCV9zY2NwX3NldF9jb25uZWN0aW9uX3N0YXRlKGNvbm4sIFNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFX0NPTVBMRVRFKTsKKwlyZXR1cm4gMDsKK30KKworLyogSGFuZGxlIHRoZSBEYXRhIEZvcm0gMSBtZXNzYWdlICovCitzdGF0aWMgaW50IF9zY2NwX2hhbmRsZV9jb25uZWN0aW9uX2R0MShzdHJ1Y3QgbXNnYiAqbXNnYikKK3sKKwlzdHJ1Y3Qgc2NjcF9wYXJzZV9yZXN1bHQgcmVzdWx0OworCXN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm47CisKKwlpZiAoX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9kdDEobXNnYiwgJnJlc3VsdCkgIT0gMCkKKwkJcmV0dXJuIC0xOworCisJLyogbG9va3VwIGlmIHdlIGhhdmUgYSBjb25uZWN0aW9uIHdpdGggdGhlIGdpdmVuIHJlZmVyZW5jZSAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGNvbm4sICZzY2NwX2Nvbm5lY3Rpb25zLCBsaXN0KSB7CisJCWlmIChjb25uLT5kYXRhX2NiCisJCSAgICAmJiBtZW1jbXAoJmNvbm4tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICByZXN1bHQuZGVzdGluYXRpb25fbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgc2l6ZW9mKGNvbm4tPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UpKSA9PSAwKSB7CisJCQlnb3RvIGZvdW5kOworCQl9CisJfQorCisJREVCVUdQKERTQ0NQLCAiTm8gY29ubmVjdGlvbiBmb3VuZCBmb3IgZHQxIGRhdGFcbiIpOworCXJldHVybiAtMTsKKworZm91bmQ6CisJY29ubi0+ZGF0YV9jYihjb25uLCBtc2diLCByZXN1bHQuZGF0YV9sZW4pOworCXJldHVybiAwOworfQorCisvKiBjb25maXJtIGEgY29ubmVjdGlvbiByZWxlYXNlICovCitzdGF0aWMgaW50IF9zY2NwX3NlbmRfY29ubmVjdGlvbl9yZWxlYXNlX2NvbXBsZXRlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJc3RydWN0IG1zZ2IgKm1zZ2I7CisJc3RydWN0IHNjY3BfY29ubmVjdGlvbl9yZWxlYXNlX2NvbXBsZXRlICpybGM7CisJaW50IHJldDsKKworCW1zZ2IgPSBtc2diX2FsbG9jX2hlYWRyb29tKFNDQ1BfTVNHX1NJWkUsCisJCQkJICAgU0NDUF9NU0dfSEVBRFJPT00sICJzY2NwIHJsYyIpOworCW1zZ2ItPmwyaCA9ICZtc2diLT5kYXRhWzBdOworCisJcmxjID0gKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZSAqKSBtc2diX3B1dChtc2diLCBzaXplb2YoKnJsYykpOworCXJsYy0+dHlwZSA9IFNDQ1BfTVNHX1RZUEVfUkxDOworCW1lbWNweSgmcmxjLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJICAgICAgICZjb25uZWN0aW9uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsIHNpemVvZihzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlKSk7CisJbWVtY3B5KCZybGMtPnNvdXJjZV9sb2NhbF9yZWZlcmVuY2UsCisJICAgICAgICZjb25uZWN0aW9uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLCBzaXplb2Yoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSkpOworCisJcmV0ID0gX3NlbmRfbXNnKG1zZ2IpOworCW1zZ2JfZnJlZShtc2diKTsKKworCS8qCisJICogUmVtb3ZlIGZyb20gdGhlIGxpc3Qgb2YgYWN0aXZlIGNvbm5lY3Rpb25zIGFuZCBzZXQgdGhlIHN0YXRlLiBVc2VyIGNvZGUKKwkgKiBzaG91bGQgbm93IGZyZWUgdGhlIGVudHJ5LgorCSAqLworCWxsaXN0X2RlbCgmY29ubmVjdGlvbi0+bGlzdCk7CisJX3NjY3Bfc2V0X2Nvbm5lY3Rpb25fc3RhdGUoY29ubmVjdGlvbiwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFTEVBU0VfQ09NUExFVEUpOworCisJcmV0dXJuIHJldDsKK30KKworLyogY29ubmVjdGlvbiByZWxlYXNlZCwgc2VuZCBhIHJlbGVhc2VkIGNvbmZpcm0gKi8KK3N0YXRpYyBpbnQgX3NjY3BfaGFuZGxlX2Nvbm5lY3Rpb25fcmVsZWFzZWQoc3RydWN0IG1zZ2IgKm1zZ2IpCit7CisJc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0IHJlc3VsdDsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uOworCisJaWYgKF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fcmVsZWFzZWQobXNnYiwgJnJlc3VsdCkgPT0gLTEpCisJCXJldHVybiAtMTsKKworCS8qIGxvb2t1cCBpZiB3ZSBoYXZlIGEgY29ubmVjdGlvbiB3aXRoIHRoZSBnaXZlbiByZWZlcmVuY2UgKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeShjb25uLCAmc2NjcF9jb25uZWN0aW9ucywgbGlzdCkgeworCQlpZiAoY29ubi0+ZGF0YV9jYgorCQkgICAgJiYgbWVtY21wKCZjb25uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgcmVzdWx0LmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHNpemVvZihjb25uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlKSkgPT0gMAorCQkgICAgJiYgbWVtY21wKCZjb25uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJCQkgICAgICByZXN1bHQuc291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHNpemVvZihjb25uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UpKSA9PSAwKSB7CisJCSAgICBnb3RvIGZvdW5kOworCQl9CisJfQorCisKKwlERUJVR1AoRFNDQ1AsICJVbmtub3duIGNvbm5lY3Rpb24gd2FzIHJlbGVhc2VkLlxuIik7CisJcmV0dXJuIC0xOworCisJLyogd2UgaGF2ZSBmb3VuZCBhIGNvbm5lY3Rpb24gKi8KK2ZvdW5kOgorCS8qIG9wdGlvbmFsIGRhdGEgKi8KKwlpZiAocmVzdWx0LmRhdGFfbGVuICE9IDAgJiYgY29ubi0+ZGF0YV9jYikgeworCQljb25uLT5kYXRhX2NiKGNvbm4sIG1zZ2IsIHJlc3VsdC5kYXRhX2xlbik7CisJfQorCisJLyogZ2VuZXJhdGUgYSByZXNwb25zZSAqLworCWlmIChfc2NjcF9zZW5kX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZShjb25uKSAhPSAwKSB7CisJCURFQlVHUChEU0NDUCwgIlNlbmRpbmcgcmVsZWFzZSBjb25maXJtZWQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9zY2NwX2hhbmRsZV9jb25uZWN0aW9uX3JlZnVzZWQoc3RydWN0IG1zZ2IgKm1zZ2IpCit7CisJc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0IHJlc3VsdDsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uOworCisJaWYgKF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fcmVmdXNlZChtc2diLCAmcmVzdWx0KSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwkvKiBsb29rdXAgaWYgd2UgaGF2ZSBhIGNvbm5lY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gcmVmZXJlbmNlICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY29ubiwgJnNjY3BfY29ubmVjdGlvbnMsIGxpc3QpIHsKKwkJaWYgKGNvbm4tPmluY29taW5nID09IDAgJiYgY29ubi0+ZGF0YV9jYgorCQkgICAgJiYgbWVtY21wKCZjb25uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgcmVzdWx0LmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHNpemVvZihjb25uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlKSkgPT0gMCkgeworCQkgICAgZ290byBmb3VuZDsKKwkJfQorCX0KKworCURFQlVHUChEU0NDUCwgIlJlZnVzZWQgYnV0IG5vIGNvbm5lY3Rpb24gZm91bmRcbiIpOworCXJldHVybiAtMTsKKworZm91bmQ6CisJLyogb3B0aW9uYWwgZGF0YSAqLworCWlmIChyZXN1bHQuZGF0YV9sZW4gIT0gMCAmJiBjb25uLT5kYXRhX2NiKSB7CisJCWNvbm4tPmRhdGFfY2IoY29ubiwgbXNnYiwgcmVzdWx0LmRhdGFfbGVuKTsKKwl9CisKKworCWxsaXN0X2RlbCgmY29ubi0+bGlzdCk7CisJX3NjY3Bfc2V0X2Nvbm5lY3Rpb25fc3RhdGUoY29ubiwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFRlVTRUQpOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IF9zY2NwX2hhbmRsZV9jb25uZWN0aW9uX2NvbmZpcm0oc3RydWN0IG1zZ2IgKm1zZ2IpCit7CisJc3RydWN0IHNjY3BfcGFyc2VfcmVzdWx0IHJlc3VsdDsKKwlzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uOworCisJaWYgKF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fY29uZmlybShtc2diLCAmcmVzdWx0KSAhPSAwKQorCQlyZXR1cm4gLTE7CisKKwkvKiBsb29rdXAgaWYgd2UgaGF2ZSBhIGNvbm5lY3Rpb24gd2l0aCB0aGUgZ2l2ZW4gcmVmZXJlbmNlICovCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoY29ubiwgJnNjY3BfY29ubmVjdGlvbnMsIGxpc3QpIHsKKwkJaWYgKGNvbm4tPmluY29taW5nID09IDAgJiYgY29ubi0+ZGF0YV9jYgorCQkgICAgJiYgbWVtY21wKCZjb25uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlLAorCQkJICAgICAgcmVzdWx0LmRlc3RpbmF0aW9uX2xvY2FsX3JlZmVyZW5jZSwKKwkJCSAgICAgIHNpemVvZihjb25uLT5zb3VyY2VfbG9jYWxfcmVmZXJlbmNlKSkgPT0gMCkgeworCQkgICAgZ290byBmb3VuZDsKKwkJfQorCX0KKworCURFQlVHUChEU0NDUCwgIkNvbmZpcm1lZCBidXQgbm8gY29ubmVjdGlvbiBmb3VuZFxuIik7CisJcmV0dXJuIC0xOworCitmb3VuZDoKKwkvKiBjb3B5IHRoZSBhZGRyZXNzZXMgb2YgdGhlIGNvbm5lY3Rpb24gKi8KKwljb25uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UgPSAqcmVzdWx0LnNvdXJjZV9sb2NhbF9yZWZlcmVuY2U7CisJX3NjY3Bfc2V0X2Nvbm5lY3Rpb25fc3RhdGUoY29ubiwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX0VTVEFCTElTSEVEKTsKKworCS8qIG9wdGlvbmFsIGRhdGEgKi8KKwlpZiAocmVzdWx0LmRhdGFfbGVuICE9IDAgJiYgY29ubi0+ZGF0YV9jYikgeworCQljb25uLT5kYXRhX2NiKGNvbm4sIG1zZ2IsIHJlc3VsdC5kYXRhX2xlbik7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKworaW50IHNjY3Bfc3lzdGVtX2luaXQoaW50ICgqb3V0Z29pbmcpKHN0cnVjdCBtc2diICpkYXRhLCB2b2lkICpjdHgpLCB2b2lkICpjdHgpCit7CisJc2NjcF9zeXN0ZW0ud3JpdGVfZGF0YSA9IG91dGdvaW5nOworCXNjY3Bfc3lzdGVtLndyaXRlX2NvbnRleHQgPSBjdHg7CisKKwlyZXR1cm4gMDsKK30KKworLyogb2ggbXkgZ29kIGEgcmVhbCBTQ0NQIHBhY2tldC4gbmVlZCB0byBkaXNwYXRjaCBpdCBub3cgKi8KK2ludCBzY2NwX3N5c3RlbV9pbmNvbWluZyhzdHJ1Y3QgbXNnYiAqbXNnYikKK3sKKwlpZiAobXNnYl9sMmxlbihtc2diKSA8IDEgKSB7CisJCURFQlVHUChEU0NDUCwgIlRvbyBzaG9ydCBwYWNrZXRcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaW50IHR5cGUgPSBtc2diLT5sMmhbMF07CisKKwlzd2l0Y2godHlwZSkgeworCWNhc2UgU0NDUF9NU0dfVFlQRV9DUjoKKwkJcmV0dXJuIF9zY2NwX2hhbmRsZV9jb25uZWN0aW9uX3JlcXVlc3QobXNnYik7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9STFNEOgorCQlyZXR1cm4gX3NjY3BfaGFuZGxlX2Nvbm5lY3Rpb25fcmVsZWFzZWQobXNnYik7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9DUkVGOgorCQlyZXR1cm4gX3NjY3BfaGFuZGxlX2Nvbm5lY3Rpb25fcmVmdXNlZChtc2diKTsKKwkJYnJlYWs7CisJY2FzZSBTQ0NQX01TR19UWVBFX0NDOgorCQlyZXR1cm4gX3NjY3BfaGFuZGxlX2Nvbm5lY3Rpb25fY29uZmlybShtc2diKTsKKwkJYnJlYWs7CisJY2FzZSBTQ0NQX01TR19UWVBFX1JMQzoKKwkJcmV0dXJuIF9zY2NwX2hhbmRsZV9jb25uZWN0aW9uX3JlbGVhc2VfY29tcGxldGUobXNnYik7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9EVDE6CisJCXJldHVybiBfc2NjcF9oYW5kbGVfY29ubmVjdGlvbl9kdDEobXNnYik7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9VRFQ6CisJCXJldHVybiBfc2NjcF9oYW5kbGVfcmVhZChtc2diKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJREVCVUdQKERTQ0NQLCAidW5pbXBsZW1lbnRlZCBtc2cgdHlwZTogJWRcbiIsIHR5cGUpOworCX07CisKKwlyZXR1cm4gLTE7Cit9CisKKy8qIGNyZWF0ZSBhIHBhY2tldCBmcm9tIHRoZSBkYXRhICovCitpbnQgc2NjcF9jb25uZWN0aW9uX3dyaXRlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHN0cnVjdCBtc2diICpkYXRhKQoreworCWlmIChjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlIDwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX0NPTkZJUk0KKwkgICAgfHwgY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSA+IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9FU1RBQkxJU0hFRCkgeworCQlERUJVR1AoRFNDQ1AsICJzY2NwX2Nvbm5lY3Rpb25fd3JpdGU6IFdyb25nIGNvbm5lY3Rpb24gc3RhdGU6ICVwICVkXG4iLAorCQkgICAgICAgY29ubmVjdGlvbiwgY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gX3NjY3Bfc2VuZF9jb25uZWN0aW9uX2RhdGEoY29ubmVjdGlvbiwgZGF0YSk7Cit9CisKKy8qCisgKiBTZW5kIGEgSW5hY3Rpdml0eSBUZXN0IG1lc3NhZ2UuIFRoZSBvd25lciBvZiB0aGUgY29ubmVjdGlvbgorICogc2hvdWxkIHN0YXJ0IGEgdGltZXIgYW5kIGNhbGwgdGhpcyBtZXRob2QgcmVndWxhcmlseS4gQ2FsbGluZworICogdGhpcyBldmVyeSA2MCBzZWNvbmRzIHNob3VsZCBiZSBnb29kIGVub3VnaC4KKyAqLworaW50IHNjY3BfY29ubmVjdGlvbl9zZW5kX2l0KHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJaWYgKGNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUgPCBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfQ09ORklSTQorCSAgICB8fCBjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlID4gU0NDUF9DT05ORUNUSU9OX1NUQVRFX0VTVEFCTElTSEVEKSB7CisJCURFQlVHUChEU0NDUCwgInNjY3BfY29ubmVjdGlvbl93cml0ZTogV3JvbmcgY29ubmVjdGlvbiBzdGF0ZTogJXAgJWRcbiIsCisJCSAgICAgICBjb25uZWN0aW9uLCBjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJldHVybiBfc2NjcF9zZW5kX2Nvbm5lY3Rpb25faXQoY29ubmVjdGlvbik7Cit9CisKKy8qIHNlbmQgYSBjb25uZWN0aW9uIHJlbGVhc2UgYW5kIHdhaXQgZm9yIHRoZSBjb25uZWN0aW9uIHJlbGVhc2VkICovCitpbnQgc2NjcF9jb25uZWN0aW9uX2Nsb3NlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIGludCBjYXVzZSkKK3sKKwlpZiAoY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSA8IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9DT05GSVJNCisJICAgIHx8IGNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUgPiBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfRVNUQUJMSVNIRUQpIHsKKwkJREVCVUdQQyhEU0NDUCwgIkNhbiBub3QgY2xvc2UgdGhlIGNvbm5lY3Rpb24uIEl0IHdhcyBuZXZlciBvcGVuZWQ6ICVwICVkXG4iLAorCQkJY29ubmVjdGlvbiwgY29ubmVjdGlvbi0+Y29ubmVjdGlvbl9zdGF0ZSk7CisJCXJldHVybiAtMTsKKwl9CisKKwlyZXR1cm4gX3NjY3Bfc2VuZF9jb25uZWN0aW9uX3JlbGVhc2VkKGNvbm5lY3Rpb24sIGNhdXNlKTsKK30KKworaW50IHNjY3BfY29ubmVjdGlvbl9mcmVlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24pCit7CisJaWYgKGNvbm5lY3Rpb24tPmNvbm5lY3Rpb25fc3RhdGUgPiBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfTk9ORQorCSAgICAmJiBjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlIDwgU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFTEVBU0VfQ09NUExFVEUpIHsKKwkJREVCVUdQKERTQ0NQLCAiVGhlIGNvbm5lY3Rpb24gbmVlZHMgdG8gYmUgcmVsZWFzZWQgYmVmb3JlIGl0IGlzIGZyZWVkIik7CisJCXJldHVybiAtMTsKKwl9CisKKwl0YWxsb2NfZnJlZShjb25uZWN0aW9uKTsKKwlyZXR1cm4gMDsKK30KKworc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqc2NjcF9jb25uZWN0aW9uX3NvY2tldCh2b2lkKQoreworCXJldHVybiB0YWxsb2NfemVybyh0YWxsX3NjY3BfY3R4LCBzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uKTsKK30KKworaW50IHNjY3BfY29ubmVjdGlvbl9jb25uZWN0KHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4sCisJCQkgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKmxvY2FsLAorCQkJICAgIHN0cnVjdCBtc2diICpkYXRhKQoreworCXJldHVybiBfc2NjcF9zZW5kX2Nvbm5lY3Rpb25fcmVxdWVzdChjb25uLCBsb2NhbCwgZGF0YSk7Cit9CisKK2ludCBzY2NwX2Nvbm5lY3Rpb25fc2V0X2luY29taW5nKGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICpzb2NrLAorCQkJCSBpbnQgKCphY2NlcHRfY2IpKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKiwgdm9pZCAqKSwgdm9pZCAqY29udGV4dCkKK3sKKwlzdHJ1Y3Qgc2NjcF9kYXRhX2NhbGxiYWNrICpjYjsKKworCWlmICghc29jaykKKwkJcmV0dXJuIC0yOworCisJY2IgPSBfZmluZF9zc24oc29jay0+c2NjcF9zc24pOworCWlmICghY2IpCisJCXJldHVybiAtMTsKKworCWNiLT5hY2NlcHRfY2IgPSBhY2NlcHRfY2I7CisJY2ItPmFjY2VwdF9jb250ZXh0ID0gY29udGV4dDsKKwlyZXR1cm4gMDsKK30KKworaW50IHNjY3Bfd3JpdGUoc3RydWN0IG1zZ2IgKmRhdGEsIGNvbnN0IHN0cnVjdCBzb2NrYWRkcl9zY2NwICppbiwKKwkgICAgICAgY29uc3Qgc3RydWN0IHNvY2thZGRyX3NjY3AgKm91dCwgaW50IGNsYXNzKQoreworCXJldHVybiBfc2NjcF9zZW5kX2RhdGEoY2xhc3MsIGluLCBvdXQsIGRhdGEpOworfQorCitpbnQgc2NjcF9zZXRfcmVhZChjb25zdCBzdHJ1Y3Qgc29ja2FkZHJfc2NjcCAqc29jaywKKwkJICBpbnQgKCpyZWFkX2NiKShzdHJ1Y3QgbXNnYiAqLCB1bnNpZ25lZCBpbnQsIHZvaWQgKiksIHZvaWQgKmNvbnRleHQpCit7CisJc3RydWN0IHNjY3BfZGF0YV9jYWxsYmFjayAqY2I7CisKKwlpZiAoIXNvY2spCisJCXJldHVybiAtMjsKKworCWNiICA9IF9maW5kX3Nzbihzb2NrLT5zY2NwX3Nzbik7CisJaWYgKCFjYikKKwkJcmV0dXJuIC0xOworCisJY2ItPnJlYWRfY2IgPSByZWFkX2NiOworCWNiLT5yZWFkX2NvbnRleHQgPSBjb250ZXh0OworCXJldHVybiAwOworfQorCitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlKSA8PSBzaXplb2YodV9pbnQzMl90KSwgZW5vdWdoX3NwYWNlKTsKKwordV9pbnQzMl90IHNjY3Bfc3JjX3JlZl90b19pbnQoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSAqcmVmKQoreworCXVfaW50MzJfdCBzcmNfcmVmID0gMDsKKwltZW1jcHkoJnNyY19yZWYsIHJlZiwgc2l6ZW9mKCpyZWYpKTsKKwlyZXR1cm4gc3JjX3JlZjsKK30KKworc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSBzY2NwX3NyY19yZWZfZnJvbV9pbnQodV9pbnQzMl90IGludF9yZWYpCit7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSByZWY7CisJbWVtY3B5KCZyZWYsICZpbnRfcmVmLCBzaXplb2YocmVmKSk7CisJcmV0dXJuIHJlZjsKK30KKworaW50IHNjY3BfZGV0ZXJtaW5lX21zZ190eXBlKHN0cnVjdCBtc2diICptc2cpCit7CisJaWYgKG1zZ2JfbDJsZW4obXNnKSA8IDEpCisJCXJldHVybiAtMTsKKworCXJldHVybiBtc2ctPmwyaFswXTsKK30KKworaW50IHNjY3BfcGFyc2VfaGVhZGVyKHN0cnVjdCBtc2diICptc2csIHN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCAqcmVzdWx0KQoreworCWludCB0eXBlOworCisJaWYgKG1zZ2JfbDJsZW4obXNnKSA8IDEpCisJCXJldHVybiAtMTsKKworCXR5cGUgPSBtc2ctPmwyaFswXTsKKwlzd2l0Y2godHlwZSkgeworCWNhc2UgU0NDUF9NU0dfVFlQRV9DUjoKKwkJcmV0dXJuIF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fcmVxdWVzdChtc2csIHJlc3VsdCk7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9STFNEOgorCQlyZXR1cm4gX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9yZWxlYXNlZChtc2csIHJlc3VsdCk7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9DUkVGOgorCQlyZXR1cm4gX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9yZWZ1c2VkKG1zZywgcmVzdWx0KTsKKwkJYnJlYWs7CisJY2FzZSBTQ0NQX01TR19UWVBFX0NDOgorCQlyZXR1cm4gX3NjY3BfcGFyc2VfY29ubmVjdGlvbl9jb25maXJtKG1zZywgcmVzdWx0KTsKKwkJYnJlYWs7CisJY2FzZSBTQ0NQX01TR19UWVBFX1JMQzoKKwkJcmV0dXJuIF9zY2NwX3BhcnNlX2Nvbm5lY3Rpb25fcmVsZWFzZV9jb21wbGV0ZShtc2csIHJlc3VsdCk7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9EVDE6CisJCXJldHVybiBfc2NjcF9wYXJzZV9jb25uZWN0aW9uX2R0MShtc2csIHJlc3VsdCk7CisJCWJyZWFrOworCWNhc2UgU0NDUF9NU0dfVFlQRV9VRFQ6CisJCXJldHVybiBfc2NjcF9wYXJzZV91ZHQobXNnLCByZXN1bHQpOworCQlicmVhazsKKwljYXNlIFNDQ1BfTVNHX1RZUEVfSVQ6CisJCXJldHVybiBfc2NjcF9wYXJzZV9pdChtc2csIHJlc3VsdCk7CisJCWJyZWFrOworCX07CisKKwlMT0dQKERTQ0NQLCBMT0dMX0VSUk9SLCAiVW5pbXBsZW1lbnRlZCBNU0cgVHlwZTogMHgleFxuIiwgdHlwZSk7CisJcmV0dXJuIC0xOworfQorCitzdGF0aWMgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSB2b2lkIG9uX2Rzb19sb2FkKHZvaWQpCit7CisJdGFsbF9zY2NwX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdChOVUxMLCAxLCAic2NjcCIpOworfQorCitzdGF0aWMgX19hdHRyaWJ1dGVfXygoZGVzdHJ1Y3RvcikpIHZvaWQgb25fZHNvX3VubG9hZCh2b2lkKQoreworCXRhbGxvY19yZXBvcnRfZnVsbCh0YWxsX3NjY3BfY3R4LCBzdGRlcnIpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvc2lsZW50X2NhbGwuYyBiL29wZW5ic2Mvc3JjL3NpbGVudF9jYWxsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2FkYTI0ZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3NpbGVudF9jYWxsLmMKQEAgLTAsMCArMSwxNDEgQEAKKy8qIEdTTSBzaWxlbnQgY2FsbCBmZWF0dXJlICovCisKKy8qCisgKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL21zZ2IuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpZ25hbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3BhZ2luZy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX3JzbC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvY2hhbl9hbGxvYy5oPgorCisvKiBwYWdpbmcgb2YgdGhlIHJlcXVlc3RlZCBzdWJzY3JpYmVyIGhhcyBjb21wbGV0ZWQgKi8KK3N0YXRpYyBpbnQgcGFnaW5nX2NiX3NpbGVudCh1bnNpZ25lZCBpbnQgaG9va251bSwgdW5zaWduZWQgaW50IGV2ZW50LAorCQkJICAgIHN0cnVjdCBtc2diICptc2csIHZvaWQgKl9sY2hhbiwgdm9pZCAqX2RhdGEpCit7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW4gPSBfbGNoYW47CisJc3RydWN0IHNjYWxsX3NpZ25hbF9kYXRhIHNpZ2RhdGE7CisJaW50IHJjOworCisJaWYgKGhvb2tudW0gIT0gR1NNX0hPT0tfUlJfUEFHSU5HKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCURFQlVHUChEU01TLCAicGFnaW5nX2NiX3NpbGVudDogIik7CisKKwlzaWdkYXRhLmxjaGFuID0gbGNoYW47CisJc2lnZGF0YS5kYXRhID0gX2RhdGE7CisKKwlzd2l0Y2ggKGV2ZW50KSB7CisJY2FzZSBHU01fUEFHSU5HX1NVQ0NFRURFRDoKKwkJREVCVUdQQyhEU01TLCAic3VjY2VzcywgdXNpbmcgVGltZXNsb3QgJXUgb24gQVJGQ04gJXVcbiIsCisJCQlsY2hhbi0+dHMtPm5yLCBsY2hhbi0+dHMtPnRyeC0+YXJmY24pOworCQlsY2hhbi0+c2lsZW50X2NhbGwgPSAxOworCQkvKiBpbmNyZW1lbnQgbGNoYW4gcmVmZXJlbmNlIGNvdW50ICovCisJCWRpc3BhdGNoX3NpZ25hbChTU19TQ0FMTCwgU19TQ0FMTF9TVUNDRVNTLCAmc2lnZGF0YSk7CisJCXVzZV9sY2hhbihsY2hhbik7CisJCWJyZWFrOworCWNhc2UgR1NNX1BBR0lOR19FWFBJUkVEOgorCQlERUJVR1AoRFNNUywgImV4cGlyZWRcbiIpOworCQlkaXNwYXRjaF9zaWduYWwoU1NfU0NBTEwsIFNfU0NBTExfRVhQSVJFRCwgJnNpZ2RhdGEpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlyYyA9IC1FSU5WQUw7CisJCWJyZWFrOworCX0KKworCXJldHVybiByYzsKK30KKworLyogcmVjZWl2ZSBhIGxheWVyIDMgbWVzc2FnZSBmcm9tIGEgc2lsZW50IGNhbGwgKi8KK2ludCBzaWxlbnRfY2FsbF9yeChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCS8qIEZJWE1FOiBkbyBzb21ldGhpbmcgbGlrZSBzZW5kaW5nIGl0IHRocm91Z2ggYSBVRFAgcG9ydCAqLworCXJldHVybiAwOworfQorCitzdHJ1Y3QgbXNnX21hdGNoIHsKKwl1X2ludDhfdCBwZGlzYzsKKwl1X2ludDhfdCBtc2dfdHlwZTsKK307CisKKy8qIGxpc3Qgb2YgbWVzc2FnZXMgdGhhdCBhcmUgaGFuZGxlZCBpbnNpZGUgT3BlbkJTQywgZXZlbiBpbiBhIHNpbGVudCBjYWxsICovCitzdGF0aWMgY29uc3Qgc3RydWN0IG1zZ19tYXRjaCBzaWxlbnRfY2FsbF9hY2NlcHRbXSA9IHsKKwl7IEdTTTQ4X1BESVNDX01NLCBHU000OF9NVF9NTV9MT0NfVVBEX1JFUVVFU1QgfSwKKwl7IEdTTTQ4X1BESVNDX01NLCBHU000OF9NVF9NTV9DTV9TRVJWX1JFUSB9LAorfTsKKworLyogZGVjaWRlIGlmIHdlIG5lZWQgdG8gcmVyb3V0ZSBhIG1lc3NhZ2UgYXMgcGFydCBvZiBhIHNpbGVudCBjYWxsICovCitpbnQgc2lsZW50X2NhbGxfcmVyb3V0ZShzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCBnc200OF9oZHIgKmdoID0gbXNnYl9sMyhtc2cpOworCXVfaW50OF90IHBkaXNjID0gZ2gtPnByb3RvX2Rpc2NyICYgMHgwZjsKKwlpbnQgaTsKKworCS8qIGlmIHdlJ3JlIG5vdCBwYXJ0IG9mIGEgc2lsZW50IGNhbGwsIG5ldmVyIHJlcm91dGUgKi8KKwlpZiAoIW1zZy0+bGNoYW4tPnNpbGVudF9jYWxsKQorCQlyZXR1cm4gMDsKKworCS8qIGNoZWNrIGlmIHdlIGFyZSBhIHNwZWNpYWwgbWVzc2FnZSB0aGF0IGlzIGhhbmRsZWQgaW4gb3BlbmJzYyAqLworCWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKHNpbGVudF9jYWxsX2FjY2VwdCk7IGkrKykgeworCQlpZiAoc2lsZW50X2NhbGxfYWNjZXB0W2ldLnBkaXNjID09IHBkaXNjICYmCisJCSAgICBzaWxlbnRfY2FsbF9hY2NlcHRbaV0ubXNnX3R5cGUgPT0gZ2gtPm1zZ190eXBlKQorCQkJcmV0dXJuIDA7CisJfQorCisJLyogb3RoZXJ3aXNlLCByZXJvdXRlICovCisJcmV0dXJuIDE7Cit9CisKKworLyogaW5pdGlhdGUgYSBzaWxlbnQgY2FsbCB3aXRoIGEgZ2l2ZW4gc3Vic2NyaWJlciAqLworaW50IGdzbV9zaWxlbnRfY2FsbF9zdGFydChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwgdm9pZCAqZGF0YSwgaW50IHR5cGUpCit7CisJaW50IHJjOworCisJcmMgPSBwYWdpbmdfcmVxdWVzdChzdWJzY3ItPm5ldCwgc3Vic2NyLCB0eXBlLAorCQkJICAgIHBhZ2luZ19jYl9zaWxlbnQsIGRhdGEpOworCXJldHVybiByYzsKK30KKworLyogZW5kIGEgc2lsZW50IGNhbGwgd2l0aCBhIGdpdmVuIHN1YnNjcmliZXIgKi8KK2ludCBnc21fc2lsZW50X2NhbGxfc3RvcChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcikKK3sKKwlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbjsKKworCWxjaGFuID0gbGNoYW5fZm9yX3N1YnNjcihzdWJzY3IpOworCWlmICghbGNoYW4pCisJCXJldHVybiAtRUlOVkFMOworCisJLyogZGlkIHdlIGFjdHVhbGx5IGVzdGFibGlzaCBhIHNpbGVudCBjYWxsIGZvciB0aGlzIGd1eT8gKi8KKwlpZiAoIWxjaGFuLT5zaWxlbnRfY2FsbCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlwdXRfbGNoYW4obGNoYW4pOworCisJcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy9zdWJjaGFuX2RlbXV4LmMgYi9vcGVuYnNjL3NyYy9zdWJjaGFuX2RlbXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGQ2YzFmZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3N1YmNoYW5fZGVtdXguYwpAQCAtMCwwICsxLDMyMiBAQAorLyogQSBFMSBzdWItY2hhbm5lbCAoZGUpbXVsdGlwbGV4ZXIgd2l0aCBUUkFVIGZyYW1lIHN5bmMgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9zdWJjaGFuX2RlbXV4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy90cmF1X2ZyYW1lLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKwordm9pZCAqdGFsbF90cWVfY3R4OworCitzdGF0aWMgaW5saW5lIHZvaWQgYXBwZW5kX2JpdChzdHJ1Y3QgZGVtdXhfc3ViY2ggKnNjaCwgdV9pbnQ4X3QgYml0KQoreworCXNjaC0+b3V0X2JpdGJ1ZltzY2gtPm91dF9pZHgrK10gPSBiaXQ7Cit9CisKKyNkZWZpbmUgU1lOQ19IRFJfQklUUwkxNgorc3RhdGljIGNvbnN0IHVfaW50OF90IG51bGxieXRlc1tTWU5DX0hEUl9CSVRTXTsKKworLyogY2hlY2sgaWYgd2UgaGF2ZSBqdXN0IGNvbXBsZXRlZCB0aGUgMTYgYml0IHplcm8gc3luYyBoZWFkZXIsCisgKiBpbiBhY2NvcmRhbmNlIHdpdGggR1NNIFRTIDA4LjYwIENoYXB0ZXIgNC44LjEgKi8KK3N0YXRpYyBpbnQgc3luY19oZHJfY29tcGxldGUoc3RydWN0IGRlbXV4X3N1YmNoICpzY2gsIHVfaW50OF90IGJpdCkKK3sKKwlpZiAoYml0ID09IDApCisJCXNjaC0+Y29uc2VjdXRpdmVfemVyb3MrKzsKKwllbHNlCisJCXNjaC0+Y29uc2VjdXRpdmVfemVyb3MgPSAwOworCisJaWYgKHNjaC0+Y29uc2VjdXRpdmVfemVyb3MgPj0gU1lOQ19IRFJfQklUUykgeworCQlzY2gtPmNvbnNlY3V0aXZlX3plcm9zID0gMDsKKwkJcmV0dXJuIDE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIHJlc3luY2hyb25pemUgdG8gY3VycmVudCBsb2NhdGlvbiAqLworc3RhdGljIHZvaWQgcmVzeW5jX3RvX2hlcmUoc3RydWN0IGRlbXV4X3N1YmNoICpzY2gpCit7CisJbWVtc2V0KHNjaC0+b3V0X2JpdGJ1ZiwgMCwgU1lOQ19IRFJfQklUUyk7CisKKwkvKiBzZXQgaW5kZXggaW4gYSB3YXkgdGhhdCB3ZSBjYW4gY29udGludWUgcmVjZWl2aW5nIGJpdHMgYWZ0ZXIKKwkgKiB0aGUgZW5kIG9mIHRoZSBTWU5DIGhlYWRlciAqLworCXNjaC0+b3V0X2lkeCA9IFNZTkNfSERSX0JJVFM7CisJc2NoLT5pbl9zeW5jID0gMTsKK30KKworaW50IHN1YmNoX2RlbXV4X2luaXQoc3RydWN0IHN1YmNoX2RlbXV4ICpkbXgpCit7CisJaW50IGk7CisKKwlkbXgtPmNoYW5fYWN0aXYgPSAwOworCWZvciAoaSA9IDA7IGkgPCBOUl9TVUJDSDsgaSsrKSB7CisJCXN0cnVjdCBkZW11eF9zdWJjaCAqc2NoID0gJmRteC0+c3ViY2hbaV07CisJCXNjaC0+b3V0X2lkeCA9IDA7CisJCW1lbXNldChzY2gtPm91dF9iaXRidWYsIDB4ZmYsIHNpemVvZihzY2gtPm91dF9iaXRidWYpKTsKKwl9CisJcmV0dXJuIDA7Cit9CisKKy8qIGlucHV0IHNvbWUgYXJiaXRyYXJ5IChtb2R1bG8gNCkgbnVtYmVyIG9mIGJ5dGVzIG9mIGEgNjRrIEUxIGNoYW5uZWwsCisgKiBzcGxpdCBpdCBpbnRvIHRoZSAxNmsgc3ViY2hhbm5lbHMgKi8KK2ludCBzdWJjaF9kZW11eF9pbihzdHJ1Y3Qgc3ViY2hfZGVtdXggKmRteCwgdV9pbnQ4X3QgKmRhdGEsIGludCBsZW4pCit7CisJaW50IGksIGM7CisKKwkvKiB3ZSBhdm9pZCBwYXJ0aWFsbHkgZmlsbGVkIGJ5dGVzIGluIG91dGJ1ZiAqLworCWlmIChsZW4gJSA0KQorCQlyZXR1cm4gLUVJTlZBTDsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQl1X2ludDhfdCBpbmJ5dGUgPSBkYXRhW2ldOworCisJCWZvciAoYyA9IDA7IGMgPCBOUl9TVUJDSDsgYysrKSB7CisJCQlzdHJ1Y3QgZGVtdXhfc3ViY2ggKnNjaCA9ICZkbXgtPnN1YmNoW2NdOworCQkJdV9pbnQ4X3QgaW5iaXRzOworCQkJdV9pbnQ4X3QgYml0OworCisJCQkvKiBpZ25vcmUgaW5hY3RpdmUgc3ViY2hhbm5lbHMgKi8KKwkJCWlmICghKGRteC0+Y2hhbl9hY3RpdiAmICgxIDw8IGMpKSkKKwkJCQljb250aW51ZTsKKworCQkJaW5iaXRzID0gaW5ieXRlID4+IChjIDw8IDEpOworCisJCQkvKiB0d28gYml0cyBmb3IgZWFjaCBzdWJjaGFubmVsICovCisJCQlpZiAoaW5iaXRzICYgMHgwMSkKKwkJCQliaXQgPSAxOworCQkJZWxzZQorCQkJCWJpdCA9IDA7CisJCQlhcHBlbmRfYml0KHNjaCwgYml0KTsKKworCQkJaWYgKHN5bmNfaGRyX2NvbXBsZXRlKHNjaCwgYml0KSkKKwkJCQlyZXN5bmNfdG9faGVyZShzY2gpOworCisJCQlpZiAoaW5iaXRzICYgMHgwMikKKwkJCQliaXQgPSAxOworCQkJZWxzZQorCQkJCWJpdCA9IDA7CisJCQlhcHBlbmRfYml0KHNjaCwgYml0KTsKKworCQkJaWYgKHN5bmNfaGRyX2NvbXBsZXRlKHNjaCwgYml0KSkKKwkJCQlyZXN5bmNfdG9faGVyZShzY2gpOworCisJCQkvKiBGSVhNRTogdmVyaWZ5IHRoZSBmaXJzdCBiaXQgaW4gb2N0ZXQgMiwgNCwgNiwgLi4uCisJCQkgKiBhY2NvcmRpbmcgdG8gVFMgMDguNjAgNC44LjEgKi8KKworCQkJLyogb25jZSB3ZSBoYXZlIHJlYWNoZWQgVFJBVV9GUkFNRV9CSVRTLCBjYWxsCisJCQkgKiB0aGUgVFJBVSBmcmFtZSBoYW5kbGVyIGNhbGxiYWNrIGZ1bmN0aW9uICovCisJCQlpZiAoc2NoLT5vdXRfaWR4ID49IFRSQVVfRlJBTUVfQklUUykgeworCQkJCWlmIChzY2gtPmluX3N5bmMpIHsKKwkJCQkJZG14LT5vdXRfY2IoZG14LCBjLCBzY2gtPm91dF9iaXRidWYsCisJCQkJCSAgICBzY2gtPm91dF9pZHgsIGRteC0+ZGF0YSk7CisJCQkJCXNjaC0+aW5fc3luYyA9IDA7CisJCQkJfQorCQkJCXNjaC0+b3V0X2lkeCA9IDA7CisJCQl9CisJCX0KKwl9CisJcmV0dXJuIGk7Cit9CisKK2ludCBzdWJjaF9kZW11eF9hY3RpdmF0ZShzdHJ1Y3Qgc3ViY2hfZGVtdXggKmRteCwgaW50IHN1YmNoKQoreworCWlmIChzdWJjaCA+PSBOUl9TVUJDSCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkbXgtPmNoYW5fYWN0aXYgfD0gKDEgPDwgc3ViY2gpOworCXJldHVybiAwOworfQorCitpbnQgc3ViY2hfZGVtdXhfZGVhY3RpdmF0ZShzdHJ1Y3Qgc3ViY2hfZGVtdXggKmRteCwgaW50IHN1YmNoKQoreworCWlmIChzdWJjaCA+PSBOUl9TVUJDSCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlkbXgtPmNoYW5fYWN0aXYgJj0gfigxIDw8IHN1YmNoKTsKKwlyZXR1cm4gMDsKK30KKworLyogTVVMVElQTEVYRVIgKi8KKworc3RhdGljIGludCBhbGxvY19hZGRfaWRsZV9mcmFtZShzdHJ1Y3Qgc3ViY2hfbXV4ICpteCwgaW50IHNjaF9ucikKK3sKKwkvKiBhbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSB3aXRoIGlkbGUgcGF0dGVybiAqLworCXJldHVybiBzdWJjaGFuX211eF9lbnF1ZXVlKG14LCBzY2hfbnIsIHRyYXVfaWRsZV9mcmFtZSgpLAorCQkJCSAgIFRSQVVfRlJBTUVfQklUUyk7Cit9CisKKy8qIHJldHVybiB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiBiaXRzIGZyb20gdGhlIHNwZWNpZmllZCBzdWJjaGFubmVsICovCitzdGF0aWMgaW50IGdldF9zdWJjaF9iaXRzKHN0cnVjdCBzdWJjaF9tdXggKm14LCBpbnQgc3ViY2gsCisJCQkgIHVfaW50OF90ICpiaXRzLCBpbnQgbnVtX3JlcXVlc3RlZCkKK3sKKwlzdHJ1Y3QgbXV4X3N1YmNoICpzY2ggPSAmbXgtPnN1YmNoW3N1YmNoXTsKKwlpbnQgbnVtX2JpdHMgPSAwOworCisJd2hpbGUgKG51bV9iaXRzIDwgbnVtX3JlcXVlc3RlZCkgeworCQlzdHJ1Y3Qgc3ViY2hfdHhxX2VudHJ5ICp0eGU7CisJCWludCBudW1fYml0c19sZWZ0OworCQlpbnQgbnVtX2JpdHNfdGhpc3RpbWU7CisKKwkJLyogbWFrZSBzdXJlIHdlIGhhdmUgYSB2YWxpZCBlbnRyeSBhdCB0b3Agb2YgdHggcXVldWUuCisJCSAqIGlmIG5vdCwgYWRkIGFuIGlkbGUgZnJhbWUgKi8KKwkJaWYgKGxsaXN0X2VtcHR5KCZzY2gtPnR4X3F1ZXVlKSkKKwkJCWFsbG9jX2FkZF9pZGxlX2ZyYW1lKG14LCBzdWJjaCk7CisJCisJCWlmIChsbGlzdF9lbXB0eSgmc2NoLT50eF9xdWV1ZSkpCisJCQlyZXR1cm4gLUVJTzsKKworCQl0eGUgPSBsbGlzdF9lbnRyeShzY2gtPnR4X3F1ZXVlLm5leHQsIHN0cnVjdCBzdWJjaF90eHFfZW50cnksIGxpc3QpOworCQludW1fYml0c19sZWZ0ID0gdHhlLT5iaXRfbGVuIC0gdHhlLT5uZXh0X2JpdDsKKworCQlpZiAobnVtX2JpdHNfbGVmdCA8IG51bV9yZXF1ZXN0ZWQpCisJCQludW1fYml0c190aGlzdGltZSA9IG51bV9iaXRzX2xlZnQ7CisJCWVsc2UKKwkJCW51bV9iaXRzX3RoaXN0aW1lID0gbnVtX3JlcXVlc3RlZDsKKworCQkvKiBwdWxsIHRoZSBiaXRzIGZyb20gdGhlIHR4ZSAqLworCQltZW1jcHkoYml0cyArIG51bV9iaXRzLCB0eGUtPmJpdHMgKyB0eGUtPm5leHRfYml0LCBudW1fYml0c190aGlzdGltZSk7CisJCXR4ZS0+bmV4dF9iaXQgKz0gbnVtX2JpdHNfdGhpc3RpbWU7CisKKwkJLyogZnJlZSB0aGUgdHhfcXVldWUgZW50cnkgaWYgaXQgaXMgZnVsbHkgY29uc3VtZWQgKi8KKwkJaWYgKHR4ZS0+bmV4dF9iaXQgPj0gdHhlLT5iaXRfbGVuKSB7CisJCQlsbGlzdF9kZWwoJnR4ZS0+bGlzdCk7CisJCQl0YWxsb2NfZnJlZSh0eGUpOworCQl9CisKKwkJLyogaW5jcmVtZW50IGdsb2JhbCBudW1iZXIgb2YgYml0cyBkZXF1ZXVlZCAqLworCQludW1fYml0cyArPSBudW1fYml0c190aGlzdGltZTsKKwl9CisKKwlyZXR1cm4gbnVtX3JlcXVlc3RlZDsKK30KKworLyogY29tcGFjdCBhbiBhcnJheSBvZiA4IHNpbmdsZS1iaXQgYnl0ZXMgaW50byBvbmUgYnl0ZSBvZiA4IGJpdHMgKi8KK3N0YXRpYyB1X2ludDhfdCBjb21wYWN0X2JpdHMoY29uc3QgdV9pbnQ4X3QgKmJpdHMpCit7CisJdV9pbnQ4X3QgcmV0ID0gMDsKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspCisJCXJldCB8PSAoYml0c1tpXSA/IDEgOiAwKSA8PCBpOworCisJcmV0dXJuIHJldDsKK30KKworLyogb2J0YWluIGEgc2luZ2xlIG91dHB1dCBieXRlIGZyb20gdGhlIHN1YmNoYW5uZWwgbXV4ZXIgKi8KK3N0YXRpYyBpbnQgbXV4X291dHB1dF9ieXRlKHN0cnVjdCBzdWJjaF9tdXggKm14LCB1X2ludDhfdCAqYnl0ZSkKK3sKKwl1X2ludDhfdCBiaXRzWzhdOworCWludCByYzsKKworCS8qIGNvbWJpbmUgdHdvIGJpdHMgb2YgZXZlcnkgc3ViY2hhbiAqLworCXJjID0gZ2V0X3N1YmNoX2JpdHMobXgsIDAsICZiaXRzWzBdLCAyKTsKKwlyYyA9IGdldF9zdWJjaF9iaXRzKG14LCAxLCAmYml0c1syXSwgMik7CisJcmMgPSBnZXRfc3ViY2hfYml0cyhteCwgMiwgJmJpdHNbNF0sIDIpOworCXJjID0gZ2V0X3N1YmNoX2JpdHMobXgsIDMsICZiaXRzWzZdLCAyKTsKKworCSpieXRlID0gY29tcGFjdF9iaXRzKGJpdHMpOworCisJcmV0dXJuIHJjOworfQorCisvKiBSZXF1ZXN0IHRoZSBvdXRwdXQgb2Ygc29tZSBtdXhlZCBieXRlcyBmcm9tIHRoZSBzdWJjaGFuIG11eGVyICovCitpbnQgc3ViY2hhbl9tdXhfb3V0KHN0cnVjdCBzdWJjaF9tdXggKm14LCB1X2ludDhfdCAqZGF0YSwgaW50IGxlbikKK3sKKwlpbnQgaTsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykgeworCQlpbnQgcmM7CisJCXJjID0gbXV4X291dHB1dF9ieXRlKG14LCAmZGF0YVtpXSk7CisJCWlmIChyYyA8IDApCisJCQlicmVhazsKKwl9CisJcmV0dXJuIGk7Cit9CisKK3N0YXRpYyBpbnQgbGxpc3RfbGVuKHN0cnVjdCBsbGlzdF9oZWFkICpoZWFkKQoreworCXN0cnVjdCBsbGlzdF9oZWFkICplbnRyeTsKKwlpbnQgaSA9IDA7CisKKwlsbGlzdF9mb3JfZWFjaChlbnRyeSwgaGVhZCkKKwkJaSsrOworCisJcmV0dXJuIGk7Cit9CisKKy8qIGV2aWN0IHRoZSAnbnVtX2V2aWN0JyBudW1iZXIgb2Ygb2xkZXN0IGVudHJpZXMgaW4gdGhlIHF1ZXVlICovCitzdGF0aWMgdm9pZCB0eF9xdWV1ZV9ldmljdChzdHJ1Y3QgbXV4X3N1YmNoICpzY2gsIGludCBudW1fZXZpY3QpCit7CisJc3RydWN0IHN1YmNoX3R4cV9lbnRyeSAqdHFlOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IG51bV9ldmljdDsgaSsrKSB7CisJCWlmIChsbGlzdF9lbXB0eSgmc2NoLT50eF9xdWV1ZSkpCisJCQlyZXR1cm47CisKKwkJdHFlID0gbGxpc3RfZW50cnkoc2NoLT50eF9xdWV1ZS5uZXh0LCBzdHJ1Y3Qgc3ViY2hfdHhxX2VudHJ5LCBsaXN0KTsKKwkJbGxpc3RfZGVsKCZ0cWUtPmxpc3QpOworCQl0YWxsb2NfZnJlZSh0cWUpOworCX0KK30KKworLyogZW5xdWV1ZSBzb21lIGRhdGEgaW50byB0aGUgdHhfcXVldWUgb2YgYSBnaXZlbiBzdWJjaGFubmVsICovCitpbnQgc3ViY2hhbl9tdXhfZW5xdWV1ZShzdHJ1Y3Qgc3ViY2hfbXV4ICpteCwgaW50IHNfbnIsIGNvbnN0IHVfaW50OF90ICpkYXRhLAorCQkJaW50IGxlbikKK3sKKwlzdHJ1Y3QgbXV4X3N1YmNoICpzY2ggPSAmbXgtPnN1YmNoW3NfbnJdOworCWludCBsaXN0X2xlbiA9IGxsaXN0X2xlbigmc2NoLT50eF9xdWV1ZSk7CisJc3RydWN0IHN1YmNoX3R4cV9lbnRyeSAqdHFlID0gdGFsbG9jX3plcm9fc2l6ZSh0YWxsX3RxZV9jdHgsCisJCQkJCQkJc2l6ZW9mKCp0cWUpICsgbGVuKTsKKwlpZiAoIXRxZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwl0cWUtPmJpdF9sZW4gPSBsZW47CisJbWVtY3B5KHRxZS0+Yml0cywgZGF0YSwgbGVuKTsKKworCWlmIChsaXN0X2xlbiA+IDIpCisJCXR4X3F1ZXVlX2V2aWN0KHNjaCwgbGlzdF9sZW4tMik7CisKKwlsbGlzdF9hZGRfdGFpbCgmdHFlLT5saXN0LCAmc2NoLT50eF9xdWV1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworLyogaW5pdGlhbGl6ZSBvbmUgc3ViY2hhbm5lbCBtdXhlciBpbnN0YW5jZSAqLworaW50IHN1YmNoYW5fbXV4X2luaXQoc3RydWN0IHN1YmNoX211eCAqbXgpCit7CisJaW50IGk7CisKKwltZW1zZXQobXgsIDAsIHNpemVvZigqbXgpKTsKKwlmb3IgKGkgPSAwOyBpIDwgTlJfU1VCQ0g7IGkrKykgeworCQlzdHJ1Y3QgbXV4X3N1YmNoICpzY2ggPSAmbXgtPnN1YmNoW2ldOworCQlJTklUX0xMSVNUX0hFQUQoJnNjaC0+dHhfcXVldWUpOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvc3lzdGVtX2luZm9ybWF0aW9uLmMgYi9vcGVuYnNjL3NyYy9zeXN0ZW1faW5mb3JtYXRpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjlkNjA5Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvc3lzdGVtX2luZm9ybWF0aW9uLmMKQEAgLTAsMCArMSw0NzMgQEAKKy8qIEdTTSAwNC4wOCBTeXN0ZW0gSW5mb3JtYXRpb24gKFNJKSBlbmNvZGluZyBhbmQgZGVjb2RpbmcKKyAqIDNHUFAgVFMgMDQuMDggdmVyc2lvbiA3LjIxLjAgUmVsZWFzZSAxOTk4IC8gRVRTSSBUUyAxMDAgOTQwIFY3LjIxLjAgKi8KKworLyogKEMpIDIwMDgtMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorI2luY2x1ZGUgPG5ldGluZXQvaW4uaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3Jlc3Rfb2N0ZXRzLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvYml0dmVjLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorCisjZGVmaW5lIEdTTTQ4X0NFTExfQ0hBTl9ERVNDX1NJWkUJMTYKKyNkZWZpbmUgR1NNX01BQ0JMT0NLX0xFTiAJCTIzCisjZGVmaW5lIEdTTV9NQUNCTE9DS19QQURESU5HCQkweDJiCisKKy8qIHZlcmlmeSB0aGUgc2l6ZXMgb2YgdGhlIHN5c3RlbSBpbmZvcm1hdGlvbiB0eXBlIHN0cnVjdHMgKi8KKworLyogcmVzdCBvY3RldHMgYXJlIG5vdCBwYXJ0IG9mIHRoZSBzdHJ1Y3QgKi8KK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV9oZWFkZXIpID09IDMsIF9zaV9oZWFkZXJfc2l6ZSk7CitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgZ3NtNDhfcmFjaF9jb250cm9sKSA9PSAzLCBfc2lfcmFjaF9jb250cm9sKTsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8xKSA9PSAyMiwgX3NpMV9zaXplKTsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8yKSA9PSAyMywgX3NpMl9zaXplKTsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8zKSA9PSAxOSwgX3NpM19zaXplKTsKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV80KSA9PSAxMywgX3NpNF9zaXplKTsKKworLyogYnMxMSBmb3Jnb3QgdGhlIGwyIGxlbiwgMC02IHJlc3Qgb2N0ZXRzICovCitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfNSkgPT0gMTgsIF9zaTVfc2l6ZSk7CitzdGF0aWNfYXNzZXJ0KHNpemVvZihzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfNikgPT0gMTEsIF9zaTZfc2l6ZSk7CisKK3N0YXRpY19hc3NlcnQoc2l6ZW9mKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8xMykgPT0gMywgX3NpMTNfc2l6ZSk7CisKKy8qIEZyZXF1ZW5jeSBMaXN0cyBhcyBwZXIgVFMgMDQuMDggMTAuNS4yLjEzICovCisKKy8qIDEwLjUuMi4xMy4yOiBCaXQgbWFwIDAgZm9ybWF0ICovCitzdGF0aWMgaW50IGZyZXFfbGlzdF9ibTBfc2V0X2FyZmNuKHVfaW50OF90ICpjaGFuX2xpc3QsIHVuc2lnbmVkIGludCBhcmZjbikKK3sKKwl1bnNpZ25lZCBpbnQgYnl0ZSwgYml0OworCisJaWYgKGFyZmNuID4gMTI0IHx8IGFyZmNuIDwgMSkgeworCQlMT0dQKERSUiwgTE9HTF9FUlJPUiwgIkJpdG1hcCAwIG9ubHkgc3VwcG9ydHMgQVJGQ04gMS4uLjEyNFxuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qIHRoZSBiaXRtYXNrIGlzIGZyb20gMS4uMTI0LCBub3QgZnJvbSAwLi4xMjMgKi8KKwlhcmZjbi0tOworCisJYnl0ZSA9IGFyZmNuIC8gODsKKwliaXQgPSBhcmZjbiAlIDg7CisKKwljaGFuX2xpc3RbR1NNNDhfQ0VMTF9DSEFOX0RFU0NfU0laRS0xLWJ5dGVdIHw9ICgxIDw8IGJpdCk7CisKKwlyZXR1cm4gMDsKK30KKworLyogMTAuNS4yLjEzLjc6IFZhcmlhYmxlIGJpdCBtYXAgZm9ybWF0ICovCitzdGF0aWMgaW50IGZyZXFfbGlzdF9ibXJlbF9zZXRfYXJmY24odV9pbnQ4X3QgKmNoYW5fbGlzdCwgdW5zaWduZWQgaW50IGFyZmNuKQoreworCXVuc2lnbmVkIGludCBieXRlLCBiaXQ7CisJdW5zaWduZWQgaW50IG1pbl9hcmZjbjsKKwl1bnNpZ25lZCBpbnQgYml0bm87CisKKwltaW5fYXJmY24gPSAoY2hhbl9saXN0WzBdICYgMSkgPDwgOTsKKwltaW5fYXJmY24gfD0gY2hhbl9saXN0WzFdIDw8IDE7CisJbWluX2FyZmNuIHw9IChjaGFuX2xpc3RbMl0gPj4gNykgJiAxOworCisJLyogVGhlIGxvd2VyIGVuZCBvZiBvdXIgYml0bWFrcyBpcyBhbHdheXMgaW1wbGljaXRseSBpbmNsdWRlZCAqLworCWlmIChhcmZjbiA9PSBtaW5fYXJmY24pCisJCXJldHVybiAwOworCisJaWYgKGFyZmNuIDwgbWluX2FyZmNuKSB7CisJCUxPR1AoRFJSLCBMT0dMX0VSUk9SLCAiYXJmY24oJXUpIDwgbWluKCV1KVxuIiwgYXJmY24sIG1pbl9hcmZjbik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKwlpZiAoYXJmY24gPiBtaW5fYXJmY24gKyAxMTEpIHsKKwkJTE9HUChEUlIsIExPR0xfRVJST1IsICJhcmZjbigldSkgPiBtaW4oJXUpICsgMTExXG4iLCBhcmZjbiwgbWluX2FyZmNuKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJYml0bm8gPSAoYXJmY24gLSBtaW5fYXJmY24pOworCWJ5dGUgPSBiaXRubyAvIDg7CisJYml0ID0gYml0bm8gJSA4OworCisJY2hhbl9saXN0WzIgKyBieXRlXSB8PSAxIDw8ICg3IC0gYml0KTsKKworCXJldHVybiAwOworfQorCisvKiBnZW5lcmF0ZSBhIGNlbGwgY2hhbm5lbCBsaXN0IGFzIHBlciBTZWN0aW9uIDEwLjUuMi4xYiBvZiAwNC4wOCAqLworc3RhdGljIGludCBiaXR2ZWMyZnJlcV9saXN0KHVfaW50OF90ICpjaGFuX2xpc3QsIHN0cnVjdCBiaXR2ZWMgKmJ2LAorCQkJICAgIGNvbnN0IHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJaW50IGksIHJjLCBtaW4gPSAxMDI0LCBtYXggPSAtMTsKKworCW1lbXNldChjaGFuX2xpc3QsIDAsIDE2KTsKKworCS8qIEdTTTkwMC1vbmx5IGhhbmRzZXRzIG9ubHkgc3VwcG9ydCAnYml0IG1hcCAwIGZvcm1hdCcgKi8KKwlpZiAoYnRzLT5iYW5kID09IEdTTV9CQU5EXzkwMCkgeworCQljaGFuX2xpc3RbMF0gPSAwOworCisJCWZvciAoaSA9IDA7IGkgPCBidi0+ZGF0YV9sZW4qODsgaSsrKSB7CisJCQlpZiAoYml0dmVjX2dldF9iaXRfcG9zKGJ2LCBpKSkgeworCQkJCXJjID0gZnJlcV9saXN0X2JtMF9zZXRfYXJmY24oY2hhbl9saXN0LCBpKTsKKwkJCQlpZiAocmMgPCAwKQorCQkJCQlyZXR1cm4gcmM7CisJCQl9CisJCX0KKwkJcmV0dXJuIDA7CisJfQorCisJLyogV2UgY3VycmVudGx5IG9ubHkgc3VwcG9ydCB0aGUgJ1ZhcmlhYmxlIGJpdG1hcCBmb3JtYXQnICovCisJY2hhbl9saXN0WzBdID0gMHg4ZTsKKworCWZvciAoaSA9IDA7IGkgPCBidi0+ZGF0YV9sZW4qODsgaSsrKSB7CisJCWlmIChiaXR2ZWNfZ2V0X2JpdF9wb3MoYnYsIGkpKSB7CisJCQlpZiAoaSA8IG1pbikKKwkJCQltaW4gPSBpOworCQkJaWYgKGkgPiBtYXgpCisJCQkJbWF4ID0gaTsKKwkJfQorCX0KKworCWlmIChtYXggPT0gLTEpIHsKKwkJLyogRW1wdHkgc2V0LCB1c2UgJ2JpdCBtYXAgMCBmb3JtYXQnICovCisJCWNoYW5fbGlzdFswXSA9IDA7CisJCXJldHVybiAwOworCX0KKworCWlmICgobWF4IC0gbWluKSA+IDExMSkgeworCQlMT0dQKERSUiwgTE9HTF9FUlJPUiwgIm1pbl9hcmZjbj0ldSwgbWF4X2FyZmNuPSV1LCAiCisJCQkiZGlzdGFuY2UgPiAxMTFcbiIsIG1pbiwgbWF4KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJY2hhbl9saXN0WzBdIHw9IChtaW4gPj4gOSkgJiAxOworCWNoYW5fbGlzdFsxXSA9IChtaW4gPj4gMSk7CisJY2hhbl9saXN0WzJdID0gKG1pbiAmIDEpIDw8IDc7CisKKwlmb3IgKGkgPSAwOyBpIDwgYnYtPmRhdGFfbGVuKjg7IGkrKykgeworCQlpZiAoYml0dmVjX2dldF9iaXRfcG9zKGJ2LCBpKSkgeworCQkJcmMgPSBmcmVxX2xpc3RfYm1yZWxfc2V0X2FyZmNuKGNoYW5fbGlzdCwgaSk7CisJCQlpZiAocmMgPCAwKQorCQkJCXJldHVybiByYzsKKwkJfQorCX0KKworCXJldHVybiAwOworfQorCisvKiBnZW5lcmF0ZSBhIGNlbGwgY2hhbm5lbCBsaXN0IGFzIHBlciBTZWN0aW9uIDEwLjUuMi4xYiBvZiAwNC4wOCAqLworc3RhdGljIGludCBnZW5lcmF0ZV9jZWxsX2NoYW5fbGlzdCh1X2ludDhfdCAqY2hhbl9saXN0LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCXN0cnVjdCBiaXR2ZWMgKmJ2ID0gJmJ0cy0+c2lfY29tbW9uLmNlbGxfYWxsb2M7CisKKwkvKiBmaXJzdCB3ZSBnZW5lcmF0ZSBhIGJpdHZlYyBvZiBhbGwgVFJYIEFSRkNOJ3MgaW4gb3VyIEJUUyAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyeCwgJmJ0cy0+dHJ4X2xpc3QsIGxpc3QpCisJCWJpdHZlY19zZXRfYml0X3BvcyhidiwgdHJ4LT5hcmZjbiwgMSk7CisKKwkvKiB0aGVuIHdlIGdlbmVyYXRlIGEgR1NNIDA0LjA4IGZyZXF1ZW5jeSBsaXN0IGZyb20gdGhlIGJpdHZlYyAqLworCXJldHVybiBiaXR2ZWMyZnJlcV9saXN0KGNoYW5fbGlzdCwgYnYsIGJ0cyk7Cit9CisKKy8qIGdlbmVyYXRlIGEgY2VsbCBjaGFubmVsIGxpc3QgYXMgcGVyIFNlY3Rpb24gMTAuNS4yLjFiIG9mIDA0LjA4ICovCitzdGF0aWMgaW50IGdlbmVyYXRlX2JjY2hfY2hhbl9saXN0KHVfaW50OF90ICpjaGFuX2xpc3QsIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IGdzbV9idHMgKmN1cl9idHM7CisJc3RydWN0IGJpdHZlYyAqYnYgPSAmYnRzLT5zaV9jb21tb24ubmVpZ2hfbGlzdDsKKworCS8qIGZpcnN0IHdlIGdlbmVyYXRlIGEgYml0dmVjIG9mIHRoZSBCQ0NIIEFSRkNOJ3MgaW4gb3VyIEJTQyAqLworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGN1cl9idHMsICZidHMtPm5ldHdvcmstPmJ0c19saXN0LCBsaXN0KSB7CisJCWlmIChjdXJfYnRzID09IGJ0cykKKwkJCWNvbnRpbnVlOworCQliaXR2ZWNfc2V0X2JpdF9wb3MoYnYsIGN1cl9idHMtPmMwLT5hcmZjbiwgMSk7CisJfQorCisJLyogdGhlbiB3ZSBnZW5lcmF0ZSBhIEdTTSAwNC4wOCBmcmVxdWVuY3kgbGlzdCBmcm9tIHRoZSBiaXR2ZWMgKi8KKwlyZXR1cm4gYml0dmVjMmZyZXFfbGlzdChjaGFuX2xpc3QsIGJ2LCBidHMpOworfQorCitzdGF0aWMgaW50IGdlbmVyYXRlX3NpMSh1X2ludDhfdCAqb3V0cHV0LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCWludCByYzsKKwlzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfMSAqc2kxID0KKwkJKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8xICopIG91dHB1dDsKKworCW1lbXNldChzaTEsIEdTTV9NQUNCTE9DS19QQURESU5HLCBHU01fTUFDQkxPQ0tfTEVOKTsKKworCXNpMS0+aGVhZGVyLmwyX3BsZW4gPSAoMjEgPDwgMikgfCAxOworCXNpMS0+aGVhZGVyLnJyX3Byb3RvY29sX2Rpc2NyaW1pbmF0b3IgPSBHU000OF9QRElTQ19SUjsKKwlzaTEtPmhlYWRlci5za2lwX2luZGljYXRvciA9IDA7CisJc2kxLT5oZWFkZXIuc3lzdGVtX2luZm9ybWF0aW9uID0gR1NNNDhfTVRfUlJfU1lTSU5GT18xOworCisJcmMgPSBnZW5lcmF0ZV9jZWxsX2NoYW5fbGlzdChzaTEtPmNlbGxfY2hhbm5lbF9kZXNjcmlwdGlvbiwgYnRzKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwlzaTEtPnJhY2hfY29udHJvbCA9IGJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbDsKKworCS8qIFNJMSBSZXN0IE9jdGV0cyAoMTAuNS4yLjMyKSwgY29udGFpbnMgTkNIIHBvc2l0aW9uICovCisJcmMgPSByZXN0X29jdGV0c19zaTEoc2kxLT5yZXN0X29jdGV0cywgTlVMTCk7CisJcmV0dXJuIHNpemVvZigqc2kxKSArIHJjOworfQorCitzdGF0aWMgaW50IGdlbmVyYXRlX3NpMih1X2ludDhfdCAqb3V0cHV0LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCWludCByYzsKKwlzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfMiAqc2kyID0KKwkJKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV8yICopIG91dHB1dDsKKworCW1lbXNldChzaTIsIEdTTV9NQUNCTE9DS19QQURESU5HLCBHU01fTUFDQkxPQ0tfTEVOKTsKKworCXNpMi0+aGVhZGVyLmwyX3BsZW4gPSAoMjIgPDwgMikgfCAxOworCXNpMi0+aGVhZGVyLnJyX3Byb3RvY29sX2Rpc2NyaW1pbmF0b3IgPSBHU000OF9QRElTQ19SUjsKKwlzaTItPmhlYWRlci5za2lwX2luZGljYXRvciA9IDA7CisJc2kyLT5oZWFkZXIuc3lzdGVtX2luZm9ybWF0aW9uID0gR1NNNDhfTVRfUlJfU1lTSU5GT18yOworCisJcmMgPSBnZW5lcmF0ZV9iY2NoX2NoYW5fbGlzdChzaTItPmJjY2hfZnJlcXVlbmN5X2xpc3QsIGJ0cyk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIHJjOworCisJc2kyLT5uY2NfcGVybWl0dGVkID0gYnRzLT5zaV9jb21tb24ubmNjX3Blcm1pdHRlZDsKKwlzaTItPnJhY2hfY29udHJvbCA9IGJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbDsKKworCXJldHVybiBzaXplb2YoKnNpMik7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtNDhfc2lfcm9faW5mbyBzaV9pbmZvID0geworCS5zZWxlY3Rpb25fcGFyYW1zID0geworCQkucHJlc2VudCA9IDAsCisJfSwKKwkucG93ZXJfb2Zmc2V0ID0geworCQkucHJlc2VudCA9IDAsCisJfSwKKwkuc2kydGVyX2luZGljYXRvciA9IDAsCisJLmVhcmx5X2NtX2N0cmwgPSAxLAorCS5zY2hlZHVsaW5nID0geworCQkucHJlc2VudCA9IDAsCisJfSwKKwkuZ3Byc19pbmQgPSB7CisJCS5zaTEzX3Bvc2l0aW9uID0gMCwKKwkJLnJhX2NvbG91ciA9IDAsCisJCS5wcmVzZW50ID0gMSwKKwl9LAorCS5sc2FfcGFyYW1zID0geworCQkucHJlc2VudCA9IDAsCisJfSwKKwkuY2VsbF9pZCA9IDAsCS8qIEZJWE1FOiBkb2Vzbid0IHRoZSBidHMgaGF2ZSB0aGlzPyAqLworCS5icmVha19pbmQgPSAwLAorfTsKKworc3RhdGljIGludCBnZW5lcmF0ZV9zaTModV9pbnQ4X3QgKm91dHB1dCwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlpbnQgcmM7CisJc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzMgKnNpMyA9CisJCShzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfMyAqKSBvdXRwdXQ7CisKKwltZW1zZXQoc2kzLCBHU01fTUFDQkxPQ0tfUEFERElORywgR1NNX01BQ0JMT0NLX0xFTik7CisKKwlzaTMtPmhlYWRlci5sMl9wbGVuID0gKDE4IDw8IDIpIHwgMTsKKwlzaTMtPmhlYWRlci5ycl9wcm90b2NvbF9kaXNjcmltaW5hdG9yID0gR1NNNDhfUERJU0NfUlI7CisJc2kzLT5oZWFkZXIuc2tpcF9pbmRpY2F0b3IgPSAwOworCXNpMy0+aGVhZGVyLnN5c3RlbV9pbmZvcm1hdGlvbiA9IEdTTTQ4X01UX1JSX1NZU0lORk9fMzsKKworCXNpMy0+Y2VsbF9pZGVudGl0eSA9IGh0b25zKGJ0cy0+Y2VsbF9pZGVudGl0eSk7CisJZ3NtNDhfZ2VuZXJhdGVfbGFpKCZzaTMtPmxhaSwgYnRzLT5uZXR3b3JrLT5jb3VudHJ5X2NvZGUsCisJCQkgICBidHMtPm5ldHdvcmstPm5ldHdvcmtfY29kZSwKKwkJCSAgIGJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlKTsKKwlzaTMtPmNvbnRyb2xfY2hhbm5lbF9kZXNjID0gYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjOworCXNpMy0+Y2VsbF9vcHRpb25zID0gYnRzLT5zaV9jb21tb24uY2VsbF9vcHRpb25zOworCXNpMy0+Y2VsbF9zZWxfcGFyID0gYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyOworCXNpMy0+cmFjaF9jb250cm9sID0gYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sOworCisJLyogU0kzIFJlc3QgT2N0ZXRzICgxMC41LjIuMzQpLCBjb250YWluaW5nCisJCUNCUSwgQ0VMTF9SRVNFTEVDVF9PRkZTRVQsIFRFTVBPUkFSWV9PRkZTRVQsIFBFTkFMVFlfVElNRQorCQlQb3dlciBPZmZzZXQsIDJ0ZXIgSW5kaWNhdG9yLCBFYXJseSBDbGFzc21hcmsgU2VuZGluZywKKwkJU2NoZWR1bGluZyBpZiBhbmQgV0hFUkUsIEdQUlMgSW5kaWNhdG9yLCBTSTEzIHBvc2l0aW9uICovCisJcmMgPSByZXN0X29jdGV0c19zaTMoc2kzLT5yZXN0X29jdGV0cywgJnNpX2luZm8pOworCisJcmV0dXJuIHNpemVvZigqc2kzKSArIHJjOworfQorCitzdGF0aWMgaW50IGdlbmVyYXRlX3NpNCh1X2ludDhfdCAqb3V0cHV0LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCWludCByYzsKKwlzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfNCAqc2k0ID0KKwkJKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV80ICopIG91dHB1dDsKKworCS8qIGxlbmd0aCBvZiBhbGwgSUVzIHByZXNlbnQgZXhjZXB0IFNJNCByZXN0IG9jdGV0cyBhbmQgbDJfcGxlbiAqLworCWludCBsMl9wbGVuID0gc2l6ZW9mKCpzaTQpIC0gMTsKKworCW1lbXNldChzaTQsIEdTTV9NQUNCTE9DS19QQURESU5HLCBHU01fTUFDQkxPQ0tfTEVOKTsKKworCXNpNC0+aGVhZGVyLnJyX3Byb3RvY29sX2Rpc2NyaW1pbmF0b3IgPSBHU000OF9QRElTQ19SUjsKKwlzaTQtPmhlYWRlci5za2lwX2luZGljYXRvciA9IDA7CisJc2k0LT5oZWFkZXIuc3lzdGVtX2luZm9ybWF0aW9uID0gR1NNNDhfTVRfUlJfU1lTSU5GT180OworCisJZ3NtNDhfZ2VuZXJhdGVfbGFpKCZzaTQtPmxhaSwgYnRzLT5uZXR3b3JrLT5jb3VudHJ5X2NvZGUsCisJCQkgICBidHMtPm5ldHdvcmstPm5ldHdvcmtfY29kZSwKKwkJCSAgIGJ0cy0+bG9jYXRpb25fYXJlYV9jb2RlKTsKKwlzaTQtPmNlbGxfc2VsX3BhciA9IGJ0cy0+c2lfY29tbW9uLmNlbGxfc2VsX3BhcjsKKwlzaTQtPnJhY2hfY29udHJvbCA9IGJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbDsKKworCS8qIE9wdGlvbmFsOiBDQkNIIENoYW5uZWwgRGVzY3JpcHRpb24gKyBDQkNIIE1vYmlsZSBBbGxvY2F0aW9uICovCisKKwlzaTQtPmhlYWRlci5sMl9wbGVuID0gKGwyX3BsZW4gPDwgMikgfCAxOworCisJLyogU0k0IFJlc3QgT2N0ZXRzICgxMC41LjIuMzUpLCBjb250YWluaW5nCisJCU9wdGlvbmFsIFBvd2VyIG9mZnNldCwgR1BSUyBJbmRpY2F0b3IsCisJCUNlbGwgSWRlbnRpdHksIExTQSBJRCwgU2VsZWN0aW9uIFBhcmFtZXRlciAqLworCXJjID0gcmVzdF9vY3RldHNfc2k0KHNpNC0+ZGF0YSwgJnNpX2luZm8pOworCisJcmV0dXJuIHNpemVvZigqc2k0KSArIHJjOworfQorCitzdGF0aWMgaW50IGdlbmVyYXRlX3NpNSh1X2ludDhfdCAqb3V0cHV0LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV81ICpzaTU7CisJaW50IHJjLCBsMl9wbGVuID0gMTg7CisKKwltZW1zZXQob3V0cHV0LCBHU01fTUFDQkxPQ0tfUEFERElORywgR1NNX01BQ0JMT0NLX0xFTik7CisKKwkvKiBpcC5hY2Nlc3MgbmFub0JUUyBuZWVkcyBsMl9wbGVuISEgKi8KKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKGJ0cykpIHsKKwkJKm91dHB1dCsrID0gKGwyX3BsZW4gPDwgMikgfCAxOworCQlsMl9wbGVuKys7CisJfQorCisJc2k1ID0gKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV81ICopIG91dHB1dDsKKworCS8qIGwyIHBzZXVkbyBsZW5ndGgsIG5vdCBwYXJ0IG9mIG1zZzogMTggKi8KKwlzaTUtPnJyX3Byb3RvY29sX2Rpc2NyaW1pbmF0b3IgPSBHU000OF9QRElTQ19SUjsKKwlzaTUtPnNraXBfaW5kaWNhdG9yID0gMDsKKwlzaTUtPnN5c3RlbV9pbmZvcm1hdGlvbiA9IEdTTTQ4X01UX1JSX1NZU0lORk9fNTsKKwlyYyA9IGdlbmVyYXRlX2JjY2hfY2hhbl9saXN0KHNpNS0+YmNjaF9mcmVxdWVuY3lfbGlzdCwgYnRzKTsKKwlpZiAocmMgPCAwKQorCQlyZXR1cm4gcmM7CisKKwkvKiAwNC4wOCA5LjEuMzc6IEwyIFBzZXVkbyBMZW5ndGggb2YgMTggKi8KKwlyZXR1cm4gbDJfcGxlbjsKK30KKworc3RhdGljIGludCBnZW5lcmF0ZV9zaTYodV9pbnQ4X3QgKm91dHB1dCwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfNiAqc2k2OworCWludCBsMl9wbGVuID0gMTE7CisKKwltZW1zZXQob3V0cHV0LCBHU01fTUFDQkxPQ0tfUEFERElORywgR1NNX01BQ0JMT0NLX0xFTik7CisKKwkvKiBpcC5hY2Nlc3MgbmFub0JUUyBuZWVkcyBsMl9wbGVuISEgKi8KKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKGJ0cykpIHsKKwkJKm91dHB1dCsrID0gKGwyX3BsZW4gPDwgMikgfCAxOworCQlsMl9wbGVuKys7CisJfQorCisJc2k2ID0gKHN0cnVjdCBnc200OF9zeXN0ZW1faW5mb3JtYXRpb25fdHlwZV82ICopIG91dHB1dDsKKworCS8qIGwyIHBzZXVkbyBsZW5ndGgsIG5vdCBwYXJ0IG9mIG1zZzogMTEgKi8KKwlzaTYtPnJyX3Byb3RvY29sX2Rpc2NyaW1pbmF0b3IgPSBHU000OF9QRElTQ19SUjsKKwlzaTYtPnNraXBfaW5kaWNhdG9yID0gMDsKKwlzaTYtPnN5c3RlbV9pbmZvcm1hdGlvbiA9IEdTTTQ4X01UX1JSX1NZU0lORk9fNjsKKwlzaTYtPmNlbGxfaWRlbnRpdHkgPSBodG9ucyhidHMtPmNlbGxfaWRlbnRpdHkpOworCWdzbTQ4X2dlbmVyYXRlX2xhaSgmc2k2LT5sYWksIGJ0cy0+bmV0d29yay0+Y291bnRyeV9jb2RlLAorCQkJICAgYnRzLT5uZXR3b3JrLT5uZXR3b3JrX2NvZGUsCisJCQkgICBidHMtPmxvY2F0aW9uX2FyZWFfY29kZSk7CisJc2k2LT5jZWxsX29wdGlvbnMgPSBidHMtPnNpX2NvbW1vbi5jZWxsX29wdGlvbnM7CisJc2k2LT5uY2NfcGVybWl0dGVkID0gYnRzLT5zaV9jb21tb24ubmNjX3Blcm1pdHRlZDsKKworCS8qIFNJNiBSZXN0IE9jdGV0czogMTAuNS4yLjM1YTogUENIIC8gTkNIIGluZm8sIFZCUy9WR0NTIG9wdGlvbnMgKi8KKworCXJldHVybiBsMl9wbGVuOworfQorCitzdGF0aWMgc3RydWN0IGdzbTQ4X3NpMTNfaW5mbyBzaTEzX2RlZmF1bHQgPSB7CisJLmNlbGxfb3B0cyA9IHsKKwkJLm5tbyAJCT0gR1BSU19OTU9fSUlJLAorCQkudDMxNjgJCT0gMTUwMCwKKwkJLnQzMTkyCQk9IDUwMCwKKwkJLmRyeF90aW1lcl9tYXgJPSAzLAorCQkuYnNfY3ZfbWF4CT0gMTUsCisJfSwKKwkucHdyX2N0cmxfcGFycyA9IHsKKwkJLmFscGhhCQk9IDEwLAkvKiBhID0gMS4wICovCisJCS50X2F2Z193CT0gMjUsCisJCS50X2F2Z190CT0gMjUsCisJCS5wY19tZWFzX2NoYW4JPSAwLCAJLyogZG93bmxpbmcgbWVhc3VyZWQgb24gQ0NDSCAqLworCQkubl9hdmdfaQk9IDE1LAorCX0sCisJLmJjY2hfY2hhbmdlX21hcmsJPSAxLAorCS5zaV9jaGFuZ2VfZmllbGQJPSAwLAorCS5wYmNjaF9wcmVzZW50CQk9IDAsCisJeworCQkubm9fcGJjY2ggPSB7CisJCQkucmFjCQk9IDAsCS8qIG5lZWRzIHRvIGJlIHBhdGNoZWQgKi8KKwkJCS5zcGdjX2NjY2hfc3VwIAk9IDAsCisJCQkubmV0X2N0cmxfb3JkCT0gMCwKKwkJCS5wcmlvX2FjY190aHIJPSA2LAorCQl9LAorCX0sCit9OworCitzdGF0aWMgaW50IGdlbmVyYXRlX3NpMTModV9pbnQ4X3QgKm91dHB1dCwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3NtNDhfc3lzdGVtX2luZm9ybWF0aW9uX3R5cGVfMTMgKnNpMTMgPQorCQkoc3RydWN0IGdzbTQ4X3N5c3RlbV9pbmZvcm1hdGlvbl90eXBlXzEzICopIG91dHB1dDsKKwlpbnQgcmV0OworCisJbWVtc2V0KHNpMTMsIEdTTV9NQUNCTE9DS19QQURESU5HLCBHU01fTUFDQkxPQ0tfTEVOKTsKKworCXNpMTMtPmhlYWRlci5ycl9wcm90b2NvbF9kaXNjcmltaW5hdG9yID0gR1NNNDhfUERJU0NfUlI7CisJc2kxMy0+aGVhZGVyLnNraXBfaW5kaWNhdG9yID0gMDsKKwlzaTEzLT5oZWFkZXIuc3lzdGVtX2luZm9ybWF0aW9uID0gR1NNNDhfTVRfUlJfU1lTSU5GT18xMzsKKworCXNpMTNfZGVmYXVsdC5ub19wYmNjaC5yYWMgPSBidHMtPmdwcnMucmFjOworCisJcmV0ID0gcmVzdF9vY3RldHNfc2kxMyhzaTEzLT5yZXN0X29jdGV0cywgJnNpMTNfZGVmYXVsdCk7CisJaWYgKHJldCA8IDApCisJCXJldHVybiByZXQ7CisKKwlzaTEzLT5oZWFkZXIubDJfcGxlbiA9IHJldCAmIDB4ZmY7CisKKwlyZXR1cm4gc2l6ZW9mICgqc2kxMykgKyByZXQ7Cit9CisKK2ludCBnc21fZ2VuZXJhdGVfc2kodV9pbnQ4X3QgKm91dHB1dCwgc3RydWN0IGdzbV9idHMgKmJ0cywgaW50IHR5cGUpCit7CisJc2lfaW5mby5ncHJzX2luZC5wcmVzZW50ID0gYnRzLT5ncHJzLmVuYWJsZWQ7CisKKwlzd2l0Y2ggKHR5cGUpIHsKKwljYXNlIFJTTF9TWVNURU1fSU5GT18xOgorCQlyZXR1cm4gZ2VuZXJhdGVfc2kxKG91dHB1dCwgYnRzKTsKKwljYXNlIFJTTF9TWVNURU1fSU5GT18yOgorCQlyZXR1cm4gZ2VuZXJhdGVfc2kyKG91dHB1dCwgYnRzKTsKKwljYXNlIFJTTF9TWVNURU1fSU5GT18zOgorCQlyZXR1cm4gZ2VuZXJhdGVfc2kzKG91dHB1dCwgYnRzKTsKKwljYXNlIFJTTF9TWVNURU1fSU5GT180OgorCQlyZXR1cm4gZ2VuZXJhdGVfc2k0KG91dHB1dCwgYnRzKTsKKwljYXNlIFJTTF9TWVNURU1fSU5GT181OgorCQlyZXR1cm4gZ2VuZXJhdGVfc2k1KG91dHB1dCwgYnRzKTsKKwljYXNlIFJTTF9TWVNURU1fSU5GT182OgorCQlyZXR1cm4gZ2VuZXJhdGVfc2k2KG91dHB1dCwgYnRzKTsKKwljYXNlIFJTTF9TWVNURU1fSU5GT18xMzoKKwkJcmV0dXJuIGdlbmVyYXRlX3NpMTMob3V0cHV0LCBidHMpOworCWRlZmF1bHQ6CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvdGFsbG9jX2N0eC5jIGIvb3BlbmJzYy9zcmMvdGFsbG9jX2N0eC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNzllMTMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy90YWxsb2NfY3R4LmMKQEAgLTAsMCArMSwzNiBAQAorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKworZXh0ZXJuIHZvaWQgKnRhbGxfbXNnYl9jdHg7CitleHRlcm4gdm9pZCAqdGFsbF9mbGVfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfbG9jb3BfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfZ3Ntc19jdHg7CitleHRlcm4gdm9pZCAqdGFsbF9zdWJzY3JfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfc3ViX3JlcV9jdHg7CitleHRlcm4gdm9pZCAqdGFsbF9jYWxsX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX3BhZ2luZ19jdHg7CitleHRlcm4gdm9pZCAqdGFsbF9zaWdoX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX3RxZV9jdHg7CitleHRlcm4gdm9pZCAqdGFsbF90cmFuc19jdHg7CitleHRlcm4gdm9pZCAqdGFsbF9tYXBfY3R4OworZXh0ZXJuIHZvaWQgKnRhbGxfdXBxX2N0eDsKK2V4dGVybiB2b2lkICp0YWxsX2N0cl9jdHg7CisKK3ZvaWQgdGFsbG9jX2N0eF9pbml0KHZvaWQpCit7CisJdGFsbF9tc2diX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJtc2diIik7CisJdGFsbF9mbGVfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgCisJCQkJCSAgImJzMTFfZmlsZV9saXN0X2VudHJ5Iik7CisJdGFsbF9sb2NvcF9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAibG9jX3VwZGF0aW5nX29wZXIiKTsKKwl0YWxsX2dzbXNfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgInNtcyIpOworCXRhbGxfc3Vic2NyX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJzdWJzY3JpYmVyIik7CisJdGFsbF9zdWJfcmVxX2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDAsICJzdWJzY3JfcmVxdWVzdCIpOworCXRhbGxfY2FsbF9jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAiZ3NtX2NhbGwiKTsKKwl0YWxsX3BhZ2luZ19jdHggPSB0YWxsb2NfbmFtZWRfY29uc3QodGFsbF9ic2NfY3R4LCAwLCAicGFnaW5nX3JlcXVlc3QiKTsKKwl0YWxsX3NpZ2hfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgInNpZ25hbF9oYW5kbGVyIik7CisJdGFsbF90cWVfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgInN1YmNoX3R4cV9lbnRyeSIpOworCXRhbGxfdHJhbnNfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgInRyYW5zYWN0aW9uIik7CisJdGFsbF9tYXBfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgInRyYXVfbWFwX2VudHJ5Iik7CisJdGFsbF91cHFfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgInRyYXVfdXBxX2VudHJ5Iik7CisJdGFsbF9jdHJfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfYnNjX2N0eCwgMCwgImNvdW50ZXIiKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3RlbG5ldF9pbnRlcmZhY2UuYyBiL29wZW5ic2Mvc3JjL3RlbG5ldF9pbnRlcmZhY2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDVkZDEyCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdGVsbmV0X2ludGVyZmFjZS5jCkBAIC0wLDAgKzEsMjE0IEBACisvKiBtaW5pbWFsaXN0aWMgdGVsbmV0L25ldHdvcmsgaW50ZXJmYWNlIGl0IG1pZ2h0IHR1cm4gaW50byBhIHdpcmUgaW50ZXJmYWNlICovCisvKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRlIDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvdGVsbmV0X2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2NoYW5fYWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF8wOC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzExLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvbXNnYi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3BhZ2luZy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorCisjaW5jbHVkZSA8dnR5L2J1ZmZlci5oPgorCisjZGVmaW5lIFdSSVRFX0NPTk5FQ1RJT04oZmQsIG1zZy4uLikgXAorCWludCByZXQ7IFwKKwljaGFyIGJ1Zls0MDk2XTsgXAorCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksIG1zZyk7IFwKKwlyZXQgPSB3cml0ZShmZCwgYnVmLCBzdHJsZW4oYnVmKSk7CisKKworLyogcGVyIGNvbm5lY3Rpb24gZGF0YSAqLworTExJU1RfSEVBRChhY3RpdmVfY29ubmVjdGlvbnMpOworCitzdGF0aWMgdm9pZCAqdGFsbF90ZWxuZXRfY3R4OworCisvKiBwZXIgbmV0d29yayBkYXRhICovCitzdGF0aWMgaW50IHRlbG5ldF9uZXdfY29ubmVjdGlvbihzdHJ1Y3QgYnNjX2ZkICpmZCwgdW5zaWduZWQgaW50IHdoYXQpOworCitzdGF0aWMgc3RydWN0IGJzY19mZCBzZXJ2ZXJfc29ja2V0ID0geworCS53aGVuCSAgICA9IEJTQ19GRF9SRUFELAorCS5jYgkgICAgPSB0ZWxuZXRfbmV3X2Nvbm5lY3Rpb24sCisJLnByaXZfbnIgICAgPSAwLAorfTsKKwordm9pZCB0ZWxuZXRfaW5pdChzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldHdvcmssIGludCBwb3J0KSB7CisJc3RydWN0IHNvY2thZGRyX2luIHNvY2tfYWRkcjsKKwlpbnQgZmQsIG9uID0gMTsKKworCXRhbGxfdGVsbmV0X2N0eCA9IHRhbGxvY19uYW1lZF9jb25zdCh0YWxsX2JzY19jdHgsIDEsCisJCQkJCSAgICAgInRlbG5ldF9jb25uZWN0aW9uIik7CisKKwlic2NfdnR5X2luaXQobmV0d29yayk7CisKKwlmZCA9IHNvY2tldChQRl9JTkVULCBTT0NLX1NUUkVBTSwgSVBQUk9UT19UQ1ApOworCisJaWYgKGZkIDwgMCkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgIlRlbG5ldCBpbnRlcmZhY2Ugc29ja2V0IGNyZWF0aW9uIGZhaWxlZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlzZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBTT19SRVVTRUFERFIsICZvbiwgc2l6ZW9mKG9uKSk7CisKKwltZW1zZXQoJnNvY2tfYWRkciwgMCwgc2l6ZW9mKHNvY2tfYWRkcikpOworCXNvY2tfYWRkci5zaW5fZmFtaWx5ID0gQUZfSU5FVDsKKwlzb2NrX2FkZHIuc2luX3BvcnQgPSBodG9ucyhwb3J0KTsKKwlzb2NrX2FkZHIuc2luX2FkZHIuc19hZGRyID0gaHRvbmwoSU5BRERSX0xPT1BCQUNLKTsKKworCWlmIChiaW5kKGZkLCAoc3RydWN0IHNvY2thZGRyKikmc29ja19hZGRyLCBzaXplb2Yoc29ja19hZGRyKSkgPCAwKSB7CisJCUxPR1AoRE5NLCBMT0dMX0VSUk9SLCAiVGVsbmV0IGludGVyZmFjZSBmYWlsZWQgdG8gYmluZFxuIik7CisJCXJldHVybjsKKwl9CisKKwlpZiAobGlzdGVuKGZkLCAwKSA8IDApIHsKKwkJTE9HUChETk0sIExPR0xfRVJST1IsICJUZWxuZXQgaW50ZXJmYWNlIGZhaWxlZCB0byBsaXN0ZW5cbiIpOworCQlyZXR1cm47CisJfQorCisJc2VydmVyX3NvY2tldC5kYXRhID0gbmV0d29yazsKKwlzZXJ2ZXJfc29ja2V0LmZkID0gZmQ7CisJYnNjX3JlZ2lzdGVyX2ZkKCZzZXJ2ZXJfc29ja2V0KTsKK30KKworc3RhdGljIHZvaWQgcHJpbnRfd2VsY29tZShpbnQgZmQpIHsKKwlpbnQgcmV0OworCXN0YXRpYyBjaGFyICptc2cgPQorCQkiV2VsY29tZSB0byB0aGUgT3BlbkJTQyBDb250cm9sIGludGVyZmFjZVxuIgorCQkiQ29weXJpZ2h0IChDKSAyMDA4LTIwMTAgSGFyYWxkIFdlbHRlXG4iCisJCSJDb250cmlidXRpb25zIGJ5IERhbmllbCBXaWxsbWFubiwgSmFuIEzDvGJiZSwgIgorCQkiU3RlZmFuIFNjaG1pZHQsIEhvbGdlciBGcmV5dGhlciwgQW5kcmVhcyBFdmVyc2JlcmdcblxuIgorCQkiTGljZW5zZSBHUEx2Mis6IEdOVSBHUEwgdmVyc2lvbiAyIG9yIGxhdGVyICIKKwkJIjxodHRwOi8vZ251Lm9yZy9saWNlbnNlcy9ncGwuaHRtbD5cbiIKKwkJIlRoaXMgaXMgZnJlZSBzb2Z0d2FyZTogeW91IGFyZSBmcmVlIHRvIGNoYW5nZSAiCisJCSJhbmQgcmVkaXN0cmlidXRlIGl0LlxuIgorCQkiVGhlcmUgaXMgTk8gV0FSUkFOVFksIHRvIHRoZSBleHRlbnQgcGVybWl0dGVkICIKKwkJImJ5IGxhdy5cblR5cGUgXCJoZWxwXCIgdG8gZ2V0IGEgc2hvcnQgaW50cm9kdWN0aW9uLlxuIjsKKworCXJldCA9IHdyaXRlKGZkLCBtc2csIHN0cmxlbihtc2cpKTsKK30KKworaW50IHRlbG5ldF9jbG9zZV9jbGllbnQoc3RydWN0IGJzY19mZCAqZmQpIHsKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm4gPSAoc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uKilmZC0+ZGF0YTsKKworCWNsb3NlKGZkLT5mZCk7CisJYnNjX3VucmVnaXN0ZXJfZmQoZmQpOworCisJaWYgKGNvbm4tPmRiZykgeworCQlkZWJ1Z19kZWxfdGFyZ2V0KGNvbm4tPmRiZyk7CisJCXRhbGxvY19mcmVlKGNvbm4tPmRiZyk7CisJfQorCisJbGxpc3RfZGVsKCZjb25uLT5lbnRyeSk7CisJdGFsbG9jX2ZyZWUoY29ubik7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY2xpZW50X2RhdGEoc3RydWN0IGJzY19mZCAqZmQsIHVuc2lnbmVkIGludCB3aGF0KQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubiA9IGZkLT5kYXRhOworCWludCByYyA9IDA7CisKKwlpZiAod2hhdCAmIEJTQ19GRF9SRUFEKSB7CisJCWNvbm4tPmZkLndoZW4gJj0gfkJTQ19GRF9SRUFEOworCQlyYyA9IHZ0eV9yZWFkKGNvbm4tPnZ0eSk7CisJfQorCisJLyogdnR5IG1pZ2h0IGhhdmUgYmVlbiBjbG9zZWQgZnJvbSB2aXRoaW4gdnR5X3JlYWQoKSAqLworCWlmICghY29ubi0+dnR5KQorCQlyZXR1cm4gcmM7CisKKwlpZiAod2hhdCAmIEJTQ19GRF9XUklURSkgeworCQlyYyA9IGJ1ZmZlcl9mbHVzaF9hbGwoY29ubi0+dnR5LT5vYnVmLCBmZC0+ZmQpOworCQlpZiAocmMgPT0gQlVGRkVSX0VNUFRZKQorCQkJY29ubi0+ZmQud2hlbiAmPSB+QlNDX0ZEX1dSSVRFOworCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB0ZWxuZXRfbmV3X2Nvbm5lY3Rpb24oc3RydWN0IGJzY19mZCAqZmQsIHVuc2lnbmVkIGludCB3aGF0KSB7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uZWN0aW9uOworCXN0cnVjdCBzb2NrYWRkcl9pbiBzb2NrYWRkcjsKKwlzb2NrbGVuX3QgbGVuID0gc2l6ZW9mKHNvY2thZGRyKTsKKwlpbnQgbmV3X2Nvbm5lY3Rpb24gPSBhY2NlcHQoZmQtPmZkLCAoc3RydWN0IHNvY2thZGRyKikmc29ja2FkZHIsICZsZW4pOworCisJaWYgKG5ld19jb25uZWN0aW9uIDwgMCkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgInRlbG5ldCBhY2NlcHQgZmFpbGVkXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCisJY29ubmVjdGlvbiA9IHRhbGxvY196ZXJvKHRhbGxfdGVsbmV0X2N0eCwgc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uKTsKKwljb25uZWN0aW9uLT5uZXR3b3JrID0gKHN0cnVjdCBnc21fbmV0d29yayopZmQtPmRhdGE7CisJY29ubmVjdGlvbi0+ZmQuZGF0YSA9IGNvbm5lY3Rpb247CisJY29ubmVjdGlvbi0+ZmQuZmQgPSBuZXdfY29ubmVjdGlvbjsKKwljb25uZWN0aW9uLT5mZC53aGVuID0gQlNDX0ZEX1JFQUQ7CisJY29ubmVjdGlvbi0+ZmQuY2IgPSBjbGllbnRfZGF0YTsKKwlic2NfcmVnaXN0ZXJfZmQoJmNvbm5lY3Rpb24tPmZkKTsKKwlsbGlzdF9hZGRfdGFpbCgmY29ubmVjdGlvbi0+ZW50cnksICZhY3RpdmVfY29ubmVjdGlvbnMpOworCisJcHJpbnRfd2VsY29tZShuZXdfY29ubmVjdGlvbik7CisKKwljb25uZWN0aW9uLT52dHkgPSB2dHlfY3JlYXRlKG5ld19jb25uZWN0aW9uLCBjb25uZWN0aW9uKTsKKwlpZiAoIWNvbm5lY3Rpb24tPnZ0eSkgeworCQlMT0dQKEROTSwgTE9HTF9FUlJPUiwgImNvdWxkbid0IGNyZWF0ZSBWVFlcbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJcmV0dXJuIDA7Cit9CisKKy8qIGNhbGxiYWNrIGZyb20gVlRZIGNvZGUgKi8KK3ZvaWQgdnR5X2V2ZW50KGVudW0gZXZlbnQgZXZlbnQsIGludCBzb2NrLCBzdHJ1Y3QgdnR5ICp2dHkpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uZWN0aW9uID0gdnR5LT5wcml2OworCXN0cnVjdCBic2NfZmQgKmJmZCA9ICZjb25uZWN0aW9uLT5mZDsKKworCWlmICh2dHktPnR5cGUgIT0gVlRZX1RFUk0pCisJCXJldHVybjsKKworCXN3aXRjaCAoZXZlbnQpIHsKKwljYXNlIFZUWV9SRUFEOgorCQliZmQtPndoZW4gfD0gQlNDX0ZEX1JFQUQ7CisJCWJyZWFrOworCWNhc2UgVlRZX1dSSVRFOgorCQliZmQtPndoZW4gfD0gQlNDX0ZEX1dSSVRFOworCQlicmVhazsKKwljYXNlIFZUWV9DTE9TRUQ6CisJCS8qIHZ0eSBsYXllciBpcyBhYm91dCB0byBmcmVlKCkgdnR5ICovCisJCWNvbm5lY3Rpb24tPnZ0eSA9IE5VTEw7CisJCXRlbG5ldF9jbG9zZV9jbGllbnQoYmZkKTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorfQorCmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy90b2tlbl9hdXRoLmMgYi9vcGVuYnNjL3NyYy90b2tlbl9hdXRoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2ZlZmVhNQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3Rva2VuX2F1dGguYwpAQCAtMCwwICsxLDE1NiBAQAorLyogU01TIGJhc2VkIHRva2VuIGF1dGhlbnRpY2F0aW9uIGZvciBhZC1ob2MgR1NNIG5ldHdvcmtzICovCisKKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzExLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMDguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kYi5oPgorCisjZGVmaW5lIFRPS0VOX1NNU19URVhUICJIQVIgMjAwOSBHU00uICBSZWdpc3RlciBhdCBodHRwOi8vaGFyMjAwOS5nbnVtb25rcy5vcmcvICIgXAorCQkJIllvdXIgSU1TSSBpcyAlcywgYXV0aCB0b2tlbiBpcyAlMDhYLCBwaG9uZSBubyBpcyAlcy4iCisKK2V4dGVybiBzdHJ1Y3QgZ3NtX3NtcyAqc21zX2Zyb21fdGV4dChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnJlY2VpdmVyLAorCQkJCSAgICAgY29uc3QgY2hhciAqdGV4dCk7CisKK3N0YXRpYyBjaGFyICpidWlsZF9zbXNfc3RyaW5nKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLCB1X2ludDMyX3QgdG9rZW4pCit7CisJY2hhciAqc21zX3N0cjsKKwl1bnNpZ25lZCBpbnQgbGVuOworCisJbGVuID0gc3RybGVuKHN1YnNjci0+aW1zaSkgKyA4ICsgc3RybGVuKFRPS0VOX1NNU19URVhUKTsKKwlzbXNfc3RyID0gdGFsbG9jX3NpemUodGFsbF9ic2NfY3R4LCBsZW4pOworCWlmICghc21zX3N0cikKKwkJcmV0dXJuIE5VTEw7CisKKwlzbnByaW50ZihzbXNfc3RyLCBsZW4sIFRPS0VOX1NNU19URVhULCBzdWJzY3ItPmltc2ksIHRva2VuLAorCQkgc3Vic2NyLT5leHRlbnNpb24pOworCXNtc19zdHJbbGVuLTFdID0gJ1wwJzsKKworCXJldHVybiBzbXNfc3RyOworfQorCitzdGF0aWMgaW50IHRva2VuX3N1YnNjcl9jYih1bnNpZ25lZCBpbnQgc3Vic3lzLCB1bnNpZ25lZCBpbnQgc2lnbmFsLAorCQkJdm9pZCAqaGFuZGxlcl9kYXRhLCB2b2lkICpzaWduYWxfZGF0YSkKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IHNpZ25hbF9kYXRhOworCXN0cnVjdCBnc21fc21zICpzbXM7CisJaW50IHJjID0gMDsKKworCWlmIChzaWduYWwgIT0gU19TVUJTQ1JfQVRUQUNIRUQpCisJCXJldHVybiAwOworCisJaWYgKHN1YnNjci0+bmV0LT5hdXRoX3BvbGljeSAhPSBHU01fQVVUSF9QT0xJQ1lfVE9LRU4pCisJCXJldHVybiAwOworCisJaWYgKHN1YnNjci0+ZmxhZ3MgJiBHU01fU1VCU0NSSUJFUl9GSVJTVF9DT05UQUNUKSB7CisJCXVfaW50MzJfdCB0b2tlbjsKKwkJY2hhciAqc21zX3N0cjsKKworCQkvKiB3ZSd2ZSBzZWVuIHRoaXMgc3Vic2NyaWJlciBmb3IgdGhlIGZpcnN0IHRpbWUuICovCisJCXJjID0gZGJfc3Vic2NyaWJlcl9hbGxvY190b2tlbihzdWJzY3IsICZ0b2tlbik7CisJCWlmIChyYyAhPSAwKSB7CisJCQlyYyA9IC1FSU87CisJCQlnb3RvIHVuYXV0aDsKKwkJfQorCisJCXNtc19zdHIgPSBidWlsZF9zbXNfc3RyaW5nKHN1YnNjciwgdG9rZW4pOworCQlpZiAoIXNtc19zdHIpIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gdW5hdXRoOworCQl9CisKKwkJc21zID0gc21zX2Zyb21fdGV4dChzdWJzY3IsIHNtc19zdHIpOworCQl0YWxsb2NfZnJlZShzbXNfc3RyKTsKKwkJaWYgKCFzbXMpIHsKKwkJCXJjID0gLUVOT01FTTsKKwkJCWdvdG8gdW5hdXRoOworCQl9CisKKwkJcmMgPSBnc200MTFfc2VuZF9zbXNfc3Vic2NyKHN1YnNjciwgc21zKTsKKworCQkvKiBGSVhNRTogZWxzZSwgZGVsZXRlIHRoZSBzdWJzY2lyYmVyIGZyb20gZGF0YWJhc2UgKi8KK3VuYXV0aDoKKworCQkvKiBtYWtlIHN1cmUgd2UgZG9uJ3QgYWxsb3cgaGltIGluIGFnYWluIHVubGVzcyBoZSBjbGlja3MgdGhlIHdlYiBVSSAqLworCQlzdWJzY3ItPmF1dGhvcml6ZWQgPSAwOworCQlkYl9zeW5jX3N1YnNjcmliZXIoc3Vic2NyKTsKKwkJaWYgKHJjKSB7CisJCQlzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiA9IGxjaGFuX2Zvcl9zdWJzY3Ioc3Vic2NyKTsKKwkJCWlmIChsY2hhbikgeworCQkJCXVfaW50OF90IGF1dGhfcmFuZFsxNl07CisJCQkJLyoga2ljayB0aGUgc3Vic2NyaWJlciBvZmYgdGhlIG5ldHdvcmsgKi8KKwkJCQlnc200OF90eF9tbV9hdXRoX3JlcShsY2hhbiwgYXV0aF9yYW5kLCAwKTsKKwkJCQlnc200OF90eF9tbV9hdXRoX3JlaihsY2hhbik7CisJCQkJLyogRklYTUU6IGNsb3NlIHRoZSBjaGFubmVsIGVhcmx5ID8qLworCQkJCS8vZ3NtNDhfc2VuZF9ycl9SZWxlYXNlKGxjaGFuKTsKKwkJCX0KKwkJfQorCX0KKworCXJldHVybiByYzsKK30KKworc3RhdGljIGludCB0b2tlbl9zbXNfY2IodW5zaWduZWQgaW50IHN1YnN5cywgdW5zaWduZWQgaW50IHNpZ25hbCwKKwkJCXZvaWQgKmhhbmRsZXJfZGF0YSwgdm9pZCAqc2lnbmFsX2RhdGEpCit7CisJc3RydWN0IGdzbV9zbXMgKnNtcyA9IHNpZ25hbF9kYXRhOworCXN0cnVjdCBnc21fbGNoYW4gKmxjaGFuOworCXVfaW50OF90IGF1dGhfcmFuZFsxNl07CisKKworCWlmIChzaWduYWwgIT0gU19TTVNfREVMSVZFUkVEKQorCQlyZXR1cm4gMDsKKworCisJLyogdGhlc2UgYXJlIG5vdCB0aGUgZHJvaWRzIHdlJ3ZlIGJlZW4gbG9va2luZyBmb3IgKi8KKwlpZiAoIXNtcy0+cmVjZWl2ZXIgfHwKKwkgICAgIShzbXMtPnJlY2VpdmVyLT5mbGFncyAmIEdTTV9TVUJTQ1JJQkVSX0ZJUlNUX0NPTlRBQ1QpKQorCQlyZXR1cm4gMDsKKworCisJaWYgKHNtcy0+cmVjZWl2ZXItPm5ldC0+YXV0aF9wb2xpY3kgIT0gR1NNX0FVVEhfUE9MSUNZX1RPS0VOKQorCQlyZXR1cm4gMDsKKworCisJbGNoYW4gPSBsY2hhbl9mb3Jfc3Vic2NyKHNtcy0+cmVjZWl2ZXIpOworCWlmIChsY2hhbikgeworCQkvKiBraWNrIHRoZSBzdWJzY3JpYmVyIG9mZiB0aGUgbmV0d29yayAqLworCQlnc200OF90eF9tbV9hdXRoX3JlcShsY2hhbiwgYXV0aF9yYW5kLCAwKTsKKwkJZ3NtNDhfdHhfbW1fYXV0aF9yZWoobGNoYW4pOworCQkvKiBGSVhNRTogY2xvc2UgdGhlIGNoYW5uZWwgZWFybHkgPyovCisJCS8vZ3NtNDhfc2VuZF9ycl9SZWxlYXNlKGxjaGFuKTsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworLy9zdGF0aWMgX19hdHRyaWJ1dGVfXygoY29uc3RydWN0b3IpKSB2b2lkIG9uX2Rzb19sb2FkX3Rva2VuKHZvaWQpCit2b2lkIG9uX2Rzb19sb2FkX3Rva2VuKHZvaWQpCit7CisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfU1VCU0NSLCB0b2tlbl9zdWJzY3JfY2IsIE5VTEwpOworCXJlZ2lzdGVyX3NpZ25hbF9oYW5kbGVyKFNTX1NNUywgdG9rZW5fc21zX2NiLCBOVUxMKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3RyYW5zYWN0aW9uLmMgYi9vcGVuYnNjL3NyYy90cmFuc2FjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YTI3OWQKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy90cmFuc2FjdGlvbi5jCkBAIC0wLDAgKzEsMTcxIEBACisvKiBHU00gMDQuMDcgVHJhbnNhY3Rpb24gaGFuZGxpbmcgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8b3BlbmJzYy90cmFuc2FjdGlvbi5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL21uY2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tbmNjLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9wYWdpbmcuaD4KKwordm9pZCAqdGFsbF90cmFuc19jdHg7CisKK3ZvaWQgX2dzbTQ4X2NjX3RyYW5zX2ZyZWUoc3RydWN0IGdzbV90cmFucyAqdHJhbnMpOworCitzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuc19maW5kX2J5X2lkKHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyLAorCQkJCSAgIHVfaW50OF90IHByb3RvLCB1X2ludDhfdCB0cmFuc19pZCkKK3sKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuczsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IHN1YnNjci0+bmV0OworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJhbnMsICZuZXQtPnRyYW5zX2xpc3QsIGVudHJ5KSB7CisJCWlmICh0cmFucy0+c3Vic2NyID09IHN1YnNjciAmJgorCQkgICAgdHJhbnMtPnByb3RvY29sID09IHByb3RvICYmCisJCSAgICB0cmFucy0+dHJhbnNhY3Rpb25faWQgPT0gdHJhbnNfaWQpCisJCQlyZXR1cm4gdHJhbnM7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuc19maW5kX2J5X2NhbGxyZWYoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQsCisJCQkJCXVfaW50MzJfdCBjYWxscmVmKQoreworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJhbnMsICZuZXQtPnRyYW5zX2xpc3QsIGVudHJ5KSB7CisJCWlmICh0cmFucy0+Y2FsbHJlZiA9PSBjYWxscmVmKQorCQkJcmV0dXJuIHRyYW5zOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RydWN0IGdzbV90cmFucyAqdHJhbnNfYWxsb2Moc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IsCisJCQkgICAgICB1X2ludDhfdCBwcm90b2NvbCwgdV9pbnQ4X3QgdHJhbnNfaWQsCisJCQkgICAgICB1X2ludDMyX3QgY2FsbHJlZikKK3sKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuczsKKworCURFQlVHUChEQ0MsICJzdWJzY3I9JXAsIHN1YnNjci0+bmV0PSVwXG4iLCBzdWJzY3IsIHN1YnNjci0+bmV0KTsKKworCXRyYW5zID0gdGFsbG9jX3plcm8odGFsbF90cmFuc19jdHgsIHN0cnVjdCBnc21fdHJhbnMpOworCWlmICghdHJhbnMpCisJCXJldHVybiBOVUxMOworCisJdHJhbnMtPnN1YnNjciA9IHN1YnNjcjsKKwlzdWJzY3JfZ2V0KHRyYW5zLT5zdWJzY3IpOworCisJdHJhbnMtPnByb3RvY29sID0gcHJvdG9jb2w7CisJdHJhbnMtPnRyYW5zYWN0aW9uX2lkID0gdHJhbnNfaWQ7CisJdHJhbnMtPmNhbGxyZWYgPSBjYWxscmVmOworCisJbGxpc3RfYWRkX3RhaWwoJnRyYW5zLT5lbnRyeSwgJnN1YnNjci0+bmV0LT50cmFuc19saXN0KTsKKworCXJldHVybiB0cmFuczsKK30KKwordm9pZCB0cmFuc19mcmVlKHN0cnVjdCBnc21fdHJhbnMgKnRyYW5zKQoreworCXN3aXRjaCAodHJhbnMtPnByb3RvY29sKSB7CisJY2FzZSBHU000OF9QRElTQ19DQzoKKwkJX2dzbTQ4X2NjX3RyYW5zX2ZyZWUodHJhbnMpOworCQlicmVhazsKKwljYXNlIEdTTTQ4X1BESVNDX1NNUzoKKwkJX2dzbTQxMV9zbXNfdHJhbnNfZnJlZSh0cmFucyk7CisJCWJyZWFrOworCX0KKworCWlmICh0cmFucy0+bGNoYW4pCisJCXB1dF9sY2hhbih0cmFucy0+bGNoYW4pOworCisJaWYgKCF0cmFucy0+bGNoYW4gJiYgdHJhbnMtPnN1YnNjciAmJiB0cmFucy0+c3Vic2NyLT5uZXQpIHsKKwkJLyogU3RvcCBwYWdpbmcgb24gYWxsIGJ0cycgKi8KKwkJcGFnaW5nX3JlcXVlc3Rfc3RvcChOVUxMLCB0cmFucy0+c3Vic2NyLCBOVUxMKTsKKwl9CisKKwlpZiAodHJhbnMtPnN1YnNjcikKKwkJc3Vic2NyX3B1dCh0cmFucy0+c3Vic2NyKTsKKworCWxsaXN0X2RlbCgmdHJhbnMtPmVudHJ5KTsKKworCXRhbGxvY19mcmVlKHRyYW5zKTsKK30KKworLyogYWxsb2NhdGUgYW4gdW51c2VkIHRyYW5zYWN0aW9uIElEIGZvciB0aGUgZ2l2ZW4gc3Vic2NyaWJlcgorICogaW4gdGhlIGdpdmVuIHByb3RvY29sIHVzaW5nIHRoZSB0aV9mbGFnIHNwZWNpZmllZCAqLworaW50IHRyYW5zX2Fzc2lnbl90cmFuc19pZChzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciwKKwkJCSAgdV9pbnQ4X3QgcHJvdG9jb2wsIHVfaW50OF90IHRpX2ZsYWcpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBzdWJzY3ItPm5ldDsKKwlzdHJ1Y3QgZ3NtX3RyYW5zICp0cmFuczsKKwl1bnNpZ25lZCBpbnQgdXNlZF90aWRfYml0bWFzayA9IDA7CisJaW50IGksIGosIGg7CisKKwlpZiAodGlfZmxhZykKKwkJdGlfZmxhZyA9IDB4ODsKKworCS8qIGdlbmVyYXRlIGJpdG1hc2sgb2YgYWxyZWFkeS11c2VkIFRJRHMgZm9yIHRoaXMgKHN1YnNjcixwcm90bykgKi8KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeSh0cmFucywgJm5ldC0+dHJhbnNfbGlzdCwgZW50cnkpIHsKKwkJaWYgKHRyYW5zLT5zdWJzY3IgIT0gc3Vic2NyIHx8CisJCSAgICB0cmFucy0+cHJvdG9jb2wgIT0gcHJvdG9jb2wgfHwKKwkJICAgIHRyYW5zLT50cmFuc2FjdGlvbl9pZCA9PSAweGZmKQorCQkJY29udGludWU7CisJCXVzZWRfdGlkX2JpdG1hc2sgfD0gKDEgPDwgdHJhbnMtPnRyYW5zYWN0aW9uX2lkKTsKKwl9CisKKwkvKiBmaW5kIGEgbmV3IG9uZSwgdHJ5aW5nIHRvIGdvIGluIGEgJ2NpcmN1bGFyJyBwYXR0ZXJuICovCisJZm9yIChoID0gNjsgaCA+IDA7IGgtLSkKKwkJaWYgKHVzZWRfdGlkX2JpdG1hc2sgJiAoMSA8PCAoaCB8IHRpX2ZsYWcpKSkKKwkJCWJyZWFrOworCWZvciAoaSA9IDA7IGkgPCA3OyBpKyspIHsKKwkJaiA9ICgoaCArIGkpICUgNykgfCB0aV9mbGFnOworCQlpZiAoKHVzZWRfdGlkX2JpdG1hc2sgJiAoMSA8PCBqKSkgPT0gMCkKKwkJCXJldHVybiBqOworCX0KKworCXJldHVybiAtMTsKK30KKworLyogdXBkYXRlIGFsbCB0cmFuc2FjdGlvbnMgdG8gdXNlIGEgZGlmZmVyZW50IExDSEFOLCBlLmcuCisgKiBhZnRlciBoYW5kb3ZlciBoYXMgc3VjY2VlZGVkICovCitpbnQgdHJhbnNfbGNoYW5fY2hhbmdlKHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuX29sZCwKKwkJICAgICAgIHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuX25ldykKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGxjaGFuX29sZC0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrOworCXN0cnVjdCBnc21fdHJhbnMgKnRyYW5zOworCWludCBudW0gPSAwOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkodHJhbnMsICZuZXQtPnRyYW5zX2xpc3QsIGVudHJ5KSB7CisJCWlmICh0cmFucy0+bGNoYW4gPT0gbGNoYW5fb2xkKSB7CisJCQkvKiBkcm9wIG9sZCBjaGFubmVsIHVzZSBjb3VuZCAqLworCQkJcHV0X2xjaGFuKHRyYW5zLT5sY2hhbik7CisJCQkvKiBhc3NpZ24gbmV3IGNoYW5uZWwgKi8KKwkJCXRyYW5zLT5sY2hhbiA9IGxjaGFuX25ldzsKKwkJCS8qIGJ1bXAgbmV3IGNoYW5uZWwgdXNlIGNvdW50ICovCisJCQl1c2VfbGNoYW4odHJhbnMtPmxjaGFuKTsKKwkJCW51bSsrOworCQl9CisJfQorCisJcmV0dXJuIG51bTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3RyYXVfZnJhbWUuYyBiL29wZW5ic2Mvc3JjL3RyYXVfZnJhbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmM2MWE1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdHJhdV9mcmFtZS5jCkBAIC0wLDAgKzEsMjYxIEBACisvKiBUUkFVIGZyYW1lIGhhbmRsaW5nIGFjY29yZGluZyB0byBHU00gVFMgMDguNjAgKi8KKworLyogKEMpIDIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy90cmF1X2ZyYW1lLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9zdWJjaGFuX2RlbXV4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorCitzdGF0aWMgdV9pbnQzMl90IGdldF9iaXRzKGNvbnN0IHVfaW50OF90ICpiaXRidWYsIGludCBvZmZzZXQsIGludCBudW0pCit7CisJaW50IGk7CisJdV9pbnQzMl90IHJldCA9IDA7CisKKwlmb3IgKGkgPSBvZmZzZXQ7IGkgPCBvZmZzZXQgKyBudW07IGkrKykgeworCQlyZXQgPSByZXQgPDwgMTsKKwkJaWYgKGJpdGJ1ZltpXSkKKwkJCXJldCB8PSAxOworCX0KKwlyZXR1cm4gcmV0OworfQorCisvKiBEZWNvZGUgYWNjb3JkaW5nIHRvIDMuMS4xICovCitzdGF0aWMgdm9pZCBkZWNvZGVfZnIoc3RydWN0IGRlY29kZWRfdHJhdV9mcmFtZSAqZnIsIGNvbnN0IHVfaW50OF90ICp0cmF1X2JpdHMpCit7CisJaW50IGk7CisJaW50IGRfaWR4ID0gMDsKKworCS8qIEMxIC4uIEMxNSAqLworCW1lbWNweShmci0+Y19iaXRzKzAsIHRyYXVfYml0cysxNywgMTUpOworCS8qIEMxNiAuLiBDMjEgKi8KKwltZW1jcHkoZnItPmNfYml0cysxNSwgdHJhdV9iaXRzKzMxMCwgNik7CisJLyogVDEgLi4gVDQgKi8KKwltZW1jcHkoZnItPnRfYml0cyswLCB0cmF1X2JpdHMrMzE2LCA0KTsKKwkvKiBEMSAuLiBEMjU1ICovCisJZm9yIChpID0gMzI7IGkgPCAzMDQ7IGkrPSAxNikgeworCQltZW1jcHkoZnItPmRfYml0cyArIGRfaWR4LCB0cmF1X2JpdHMraSsxLCAxNSk7CisJCWRfaWR4ICs9IDE1OworCX0KKwkvKiBEMjU2IC4uIEQyNjAgKi8KKwltZW1jcHkoZnItPmRfYml0cyArIGRfaWR4LCB0cmF1X2JpdHMgKyAzMDUsIDUpOworfQorCisvKiBEZWNvZGUgYWNjb3JkaW5nIHRvIDMuMS4yICovCitzdGF0aWMgdm9pZCBkZWNvZGVfYW1yKHN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgKmZyLCBjb25zdCB1X2ludDhfdCAqdHJhdV9iaXRzKQoreworCWludCBpOworCWludCBkX2lkeCA9IDA7CisKKwkvKiBDMSAuLiBDMTUgKi8KKwltZW1jcHkoZnItPmNfYml0cyswLCB0cmF1X2JpdHMrMTcsIDE1KTsKKwkvKiBDMTYgLi4gQzI1ICovCisJbWVtY3B5KGZyLT5jX2JpdHMrMTUsIHRyYXVfYml0cyszMywgMTApOworCS8qIFQxIC4uIFQ0ICovCisJbWVtY3B5KGZyLT50X2JpdHMrMCwgdHJhdV9iaXRzKzMxNiwgNCk7CisJLyogRDEgLi4gRDUgKi8KKwltZW1jcHkoZnItPmRfYml0cywgdHJhdV9iaXRzKzQzLCA1KTsKKwkvKiBENiAuLiBEMjQ1ICovCisJZm9yIChpID0gNDg7IGkgPCAzMDQ7IGkgKz0gMTYpIHsKKwkJbWVtY3B5KGZyLT5kX2JpdHMgKyBkX2lkeCwgdHJhdV9iaXRzK2krMSwgMTUpOworCQlkX2lkeCArPSAxNTsKKwl9CisJLyogRDI0NiAuLiBEMjU2ICovCisJbWVtY3B5KGZyLT5kX2JpdHMgKyBkX2lkeCwgdHJhdV9iaXRzICsgMzA1LCAxMSk7Cit9CisKK2ludCBkZWNvZGVfdHJhdV9mcmFtZShzdHJ1Y3QgZGVjb2RlZF90cmF1X2ZyYW1lICpmciwgY29uc3QgdV9pbnQ4X3QgKnRyYXVfYml0cykKK3sKKwl1X2ludDhfdCBjYml0czUgPSBnZXRfYml0cyh0cmF1X2JpdHMsIDE3LCA1KTsKKworCXN3aXRjaCAoY2JpdHM1KSB7CisJY2FzZSBUUkFVX0ZUX0ZSX1VQOgorCWNhc2UgVFJBVV9GVF9GUl9ET1dOOgorCWNhc2UgVFJBVV9GVF9JRExFX1VQOgorCWNhc2UgVFJBVV9GVF9JRExFX0RPV046CisJY2FzZSBUUkFVX0ZUX0VGUjoKKwkJZGVjb2RlX2ZyKGZyLCB0cmF1X2JpdHMpOworCQlicmVhazsKKwljYXNlIFRSQVVfRlRfQU1SOgorCQlkZWNvZGVfYW1yKGZyLCB0cmF1X2JpdHMpOworCQlicmVhazsKKwljYXNlIFRSQVVfRlRfT01fVVA6CisJY2FzZSBUUkFVX0ZUX09NX0RPV046CisJY2FzZSBUUkFVX0ZUX0RBVEFfVVA6CisJY2FzZSBUUkFVX0ZUX0RBVEFfRE9XTjoKKwljYXNlIFRSQVVfRlRfRDE0NV9TWU5DOgorCWNhc2UgVFJBVV9GVF9FREFUQToKKwkJTE9HUChETVVYLCBMT0dMX05PVElDRSwgImNhbid0IGRlY29kZSB1bmltcGxlbWVudGVkIFRSQVUgIgorCQkJIkZyYW1lIFR5cGUgMHglMDJ4XG4iLCBjYml0czUpOworCQlyZXR1cm4gLTE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE1VWCwgTE9HTF9OT1RJQ0UsICJjYW4ndCBkZWNvZGUgdW5rbm93biBUUkFVICIKKwkJCSJGcmFtZSBUeXBlIDB4JTAyeFxuIiwgY2JpdHM1KTsKKwkJcmV0dXJuIC0xOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKK30KKworY29uc3QgdV9pbnQ4X3QgZnRfZnJfZG93bl9iaXRzW10gPSB7IDEsIDEsIDEsIDAsIDAgfTsKK2NvbnN0IHVfaW50OF90IGZ0X2lkbGVfZG93bl9iaXRzW10gPSB7IDAsIDEsIDEsIDEsIDAgfTsKKworLyogbW9kaWZ5IGFuIHVwbGluayBUUkFVIGZyYW1lIHNvIHdlIGNhbiBzZW5kIGl0IGRvd25saW5rICovCitpbnQgdHJhdV9mcmFtZV91cDJkb3duKHN0cnVjdCBkZWNvZGVkX3RyYXVfZnJhbWUgKmZyKQoreworCXVfaW50OF90IGNiaXRzNSA9IGdldF9iaXRzKGZyLT5jX2JpdHMsIDAsIDUpOworCisJc3dpdGNoIChjYml0czUpIHsKKwljYXNlIFRSQVVfRlRfRlJfVVA6CisJCW1lbWNweShmci0+Y19iaXRzLCBmdF9mcl9kb3duX2JpdHMsIDUpOworCQkvKiBjbGVhciB0aW1lIGFsaWdubWVudCAqLworCQltZW1zZXQoZnItPmNfYml0cys1LCAwLCA2KTsKKwkJLyogRklYTUU6IFNQIC8gQkZJIGluIGNhc2Ugb2YgRFR4ICovCisJCS8qIEMxMiAuLiBDMjEgYXJlIHNwYXJlIGFuZCBjb2RlZCBhcyAnMScgKi8KKwkJbWVtc2V0KGZyLT5jX2JpdHMrMTEsIDB4MDEsIDEwKTsKKwkJYnJlYWs7CisJY2FzZSBUUkFVX0ZUX0VGUjoKKwkJLyogY2xlYXIgdGltZSBhbGlnbm1lbnQgKi8KKwkJbWVtc2V0KGZyLT5jX2JpdHMrNSwgMCwgNik7CisJCS8qIEZJWE1FOiBzZXQgVUZFIGFwcHJvcHJpYXRlbHkgKi8KKwkJLyogRklYTUU6IFNQIC8gQkZJIGluIGNhc2Ugb2YgRFR4ICovCisJCWJyZWFrOworCWNhc2UgVFJBVV9GVF9JRExFX1VQOgorCQltZW1jcHkoZnItPmNfYml0cywgZnRfaWRsZV9kb3duX2JpdHMsIDUpOworCQkvKiBjbGVhciB0aW1lIGFsaWdubWVudCAqLworCQltZW1zZXQoZnItPmNfYml0cys1LCAwLCA2KTsKKwkJLyogRklYTUU6IFNQIC8gQkZJIGluIGNhc2Ugb2YgRFR4ICovCisJCS8qIEMxMiAuLiBDMjEgYXJlIHNwYXJlIGFuZCBjb2RlZCBhcyAnMScgKi8KKwkJbWVtc2V0KGZyLT5jX2JpdHMrMTEsIDB4MDEsIDEwKTsKKwkJYnJlYWs7CisJY2FzZSBUUkFVX0ZUX0ZSX0RPV046CisJY2FzZSBUUkFVX0ZUX0lETEVfRE9XTjoKKwljYXNlIFRSQVVfRlRfT01fRE9XTjoKKwljYXNlIFRSQVVfRlRfREFUQV9ET1dOOgorCQkvKiB3ZSBjYW5ub3QgY29udmVydCBhIGRvd25saW5rIHRvIGEgZG93bmxpbmsgZnJhbWUgKi8KKwkJcmV0dXJuIC1FSU5WQUw7CisJCWJyZWFrOworCWNhc2UgVFJBVV9GVF9BTVI6CisJY2FzZSBUUkFVX0ZUX09NX1VQOgorCWNhc2UgVFJBVV9GVF9EQVRBX1VQOgorCWNhc2UgVFJBVV9GVF9EMTQ1X1NZTkM6CisJY2FzZSBUUkFVX0ZUX0VEQVRBOgorCQlMT0dQKERNVVgsIExPR0xfTk9USUNFLCAidW5pbXBsZW1lbnRlZCBUUkFVIEZyYW1lIFR5cGUgIgorCQkJIjB4JTAyeFxuIiwgY2JpdHM1KTsKKwkJcmV0dXJuIC0xOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlMT0dQKERNVVgsIExPR0xfTk9USUNFLCAidW5rbm93biBUUkFVIEZyYW1lIFR5cGUgIgorCQkJIjB4JTAyeFxuIiwgY2JpdHM1KTsKKwkJcmV0dXJuIC0xOworCQlicmVhazsKKwl9CisKKwlyZXR1cm4gMDsKKworfQorCitzdGF0aWMgdm9pZCBlbmNvZGVfZnIodV9pbnQ4X3QgKnRyYXVfYml0cywgY29uc3Qgc3RydWN0IGRlY29kZWRfdHJhdV9mcmFtZSAqZnIpCit7CisJaW50IGk7CisJaW50IGRfaWR4ID0gMDsKKworCXRyYXVfYml0c1sxNl0gPSAxOworCS8qIEMxIC4uIEMxNSAqLworCW1lbWNweSh0cmF1X2JpdHMrMTcsIGZyLT5jX2JpdHMrMCwgMTUpOworCS8qIEQxIC4uIEQyNTUgKi8KKwlmb3IgKGkgPSAzMjsgaSA8IDMwNDsgaSs9IDE2KSB7CisJCXRyYXVfYml0c1tpXSA9IDE7CisJCW1lbWNweSh0cmF1X2JpdHMraSsxLCBmci0+ZF9iaXRzICsgZF9pZHgsIDE1KTsKKwkJZF9pZHggKz0gMTU7CisJfQorCS8qIEQyNTYgLi4gRDI2MCAqLworCXRyYXVfYml0c1szMDRdID0gMTsKKwltZW1jcHkodHJhdV9iaXRzICsgMzA1LCBmci0+ZF9iaXRzICsgZF9pZHgsIDUpOworCS8qIEMxNiAuLiBDMjEgKi8KKwltZW1jcHkodHJhdV9iaXRzKzMxMCwgZnItPmNfYml0cysxNSwgNik7CisKKwkvKiBGSVhNRTogaGFuZGxlIHRpbWluZyBhZGp1c3RtZW50ICovCisKKwkvKiBUMSAuLiBUNCAqLworCW1lbWNweSh0cmF1X2JpdHMrMzE2LCBmci0+dF9iaXRzKzAsIDQpOworfQorCisKK2ludCBlbmNvZGVfdHJhdV9mcmFtZSh1X2ludDhfdCAqdHJhdV9iaXRzLCBjb25zdCBzdHJ1Y3QgZGVjb2RlZF90cmF1X2ZyYW1lICpmcikKK3sKKwl1X2ludDhfdCBjYml0czUgPSBnZXRfYml0cyhmci0+Y19iaXRzLCAwLCA1KTsKKwkKKwkvKiAxNiBiaXRzIG9mIHN5bmMgaGVhZGVyICovCisJbWVtc2V0KHRyYXVfYml0cywgMCwgMTYpOworCisJc3dpdGNoIChjYml0czUpIHsKKwljYXNlIFRSQVVfRlRfRlJfVVA6CisJY2FzZSBUUkFVX0ZUX0ZSX0RPV046CisJY2FzZSBUUkFVX0ZUX0lETEVfVVA6CisJY2FzZSBUUkFVX0ZUX0lETEVfRE9XTjoKKwljYXNlIFRSQVVfRlRfRUZSOgorCQllbmNvZGVfZnIodHJhdV9iaXRzLCBmcik7CisJCWJyZWFrOworCWNhc2UgVFJBVV9GVF9BTVI6CisJY2FzZSBUUkFVX0ZUX09NX1VQOgorCWNhc2UgVFJBVV9GVF9PTV9ET1dOOgorCWNhc2UgVFJBVV9GVF9EQVRBX1VQOgorCWNhc2UgVFJBVV9GVF9EQVRBX0RPV046CisJY2FzZSBUUkFVX0ZUX0QxNDVfU1lOQzoKKwljYXNlIFRSQVVfRlRfRURBVEE6CisJCUxPR1AoRE1VWCwgTE9HTF9OT1RJQ0UsICJ1bmltcGxlbWVudGVkIFRSQVUgRnJhbWUgVHlwZSAiCisJCQkiMHglMDJ4XG4iLCBjYml0czUpOworCQlyZXR1cm4gLTE7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCUxPR1AoRE1VWCwgTE9HTF9OT1RJQ0UsICJ1bmtub3duIFRSQVUgRnJhbWUgVHlwZSAiCisJCQkiMHglMDJ4XG4iLCBjYml0czUpOworCQlyZXR1cm4gLTE7CisJCWJyZWFrOworCX0KKworCXJldHVybiAwOworfQorCitzdGF0aWMgc3RydWN0IGRlY29kZWRfdHJhdV9mcmFtZSBmcl9pZGxlX2ZyYW1lID0geworCS5jX2JpdHMgPSB7IDAsIDEsIDEsIDEsIDAgfSwJLyogSURMRSBET1dOTElOSyAzLjUuNSAqLworCS50X2JpdHMgPSB7IDEsIDEsIDEsIDEgfSwKK307CitzdGF0aWMgdV9pbnQ4X3QgZW5jb2RlZF9pZGxlX2ZyYW1lW1RSQVVfRlJBTUVfQklUU107CitzdGF0aWMgaW50IGRiaXRzX2luaXR0ZWQ7CisKK3VfaW50OF90ICp0cmF1X2lkbGVfZnJhbWUodm9pZCkKK3sKKwkvKiBvbmx5IGluaXRpYWxpemUgZHVyaW5nIHRoZSBmaXJzdCBjYWxsICovCisJaWYgKCFkYml0c19pbml0dGVkKSB7CisJCS8qIHNldCBhbGwgRC1iaXRzIHRvIDEgKi8KKwkJbWVtc2V0KCZmcl9pZGxlX2ZyYW1lLmRfYml0cywgMHgwMSwgMjYwKTsKKwkJZW5jb2RlX2ZyKGVuY29kZWRfaWRsZV9mcmFtZSwgJmZyX2lkbGVfZnJhbWUpOworCX0KKwlyZXR1cm4gZW5jb2RlZF9pZGxlX2ZyYW1lOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvdHJhdV9tdXguYyBiL29wZW5ic2Mvc3JjL3RyYXVfbXV4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjJmYTVjMAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3RyYXVfbXV4LmMKQEAgLTAsMCArMSwzMTMgQEAKKy8qIFNpbXBsZSBUUkFVIGZyYW1lIHJlZmxlY3RvciB0byByb3V0ZSB2b2ljZSBjYWxscyAqLworCisvKiAoQykgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPHN5cy90eXBlcy5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhdV9mcmFtZS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvdHJhdV9tdXguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3N1YmNoYW5fZGVtdXguaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2UxX2lucHV0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorCit1X2ludDhfdCBnc21fZnJfbWFwW10gPSB7CisJNiwgNiwgNSwgNSwgNCwgNCwgMywgMywKKwk3LCAyLCAyLCA2LCAzLCAzLCAzLCAzLAorCTMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisJMywgNywgMiwgMiwgNiwgMywgMywgMywKKwkzLCAzLCAzLCAzLCAzLCAzLCAzLCAzLAorCTMsIDMsIDcsIDIsIDIsIDYsIDMsIDMsCisJMywgMywgMywgMywgMywgMywgMywgMywKKwkzLCAzLCAzLCA3LCAyLCAyLCA2LCAzLAorCTMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisJMywgMywgMywgMworfTsKKworc3RydWN0IG1hcF9lbnRyeSB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3Qgc3JjLCBkc3Q7Cit9OworCitzdHJ1Y3QgdXBxdWV1ZV9lbnRyeSB7CisJc3RydWN0IGxsaXN0X2hlYWQgbGlzdDsKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldDsKKwlzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3Qgc3JjOworCXVfaW50MzJfdCBjYWxscmVmOworfTsKKworc3RhdGljIExMSVNUX0hFQUQoc3NfbWFwKTsKK3N0YXRpYyBMTElTVF9IRUFEKHNzX3VwcXVldWUpOworCit2b2lkICp0YWxsX21hcF9jdHgsICp0YWxsX3VwcV9jdHg7CisKKy8qIG1hcCBvbmUgcGFydGljdWxhciBzdWJzbG90IHRvIGFub3RoZXIgc3Vic2xvdCAqLworaW50IHRyYXVfbXV4X21hcChjb25zdCBzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKnNyYywKKwkJIGNvbnN0IHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqZHN0KQoreworCXN0cnVjdCBtYXBfZW50cnkgKm1lOworCisJbWUgPSB0YWxsb2ModGFsbF9tYXBfY3R4LCBzdHJ1Y3QgbWFwX2VudHJ5KTsKKwlpZiAoIW1lKSB7CisJCUxPR1AoRE1JQiwgTE9HTF9GQVRBTCwgIk91dCBvZiBtZW1vcnlcbiIpOworCQlyZXR1cm4gLUVOT01FTTsKKwl9CisKKwlERUJVR1AoRENDLCAiU2V0dGluZyB1cCBUUkFVIG11eCBtYXAgYmV0d2VlbiAoZTE9JXUsdHM9JXUsc3M9JXUpICIKKwkJImFuZCAoZTE9JXUsdHM9JXUsc3M9JXUpXG4iLAorCQlzcmMtPmUxX25yLCBzcmMtPmUxX3RzLCBzcmMtPmUxX3RzX3NzLAorCQlkc3QtPmUxX25yLCBkc3QtPmUxX3RzLCBkc3QtPmUxX3RzX3NzKTsKKworCS8qIG1ha2Ugc3VyZSB0byBnZXQgcmlkIG9mIGFueSBzdGFsZSBvbGQgbWFwcGluZ3MgKi8KKwl0cmF1X211eF91bm1hcChzcmMsIDApOworCXRyYXVfbXV4X3VubWFwKGRzdCwgMCk7CisKKwltZW1jcHkoJm1lLT5zcmMsIHNyYywgc2l6ZW9mKG1lLT5zcmMpKTsKKwltZW1jcHkoJm1lLT5kc3QsIGRzdCwgc2l6ZW9mKG1lLT5kc3QpKTsKKwlsbGlzdF9hZGQoJm1lLT5saXN0LCAmc3NfbWFwKTsKKworCXJldHVybiAwOworfQorCitpbnQgdHJhdV9tdXhfbWFwX2xjaGFuKGNvbnN0IHN0cnVjdCBnc21fbGNoYW4gKnNyYywJCisJCQljb25zdCBzdHJ1Y3QgZ3NtX2xjaGFuICpkc3QpCit7CisJc3RydWN0IGdzbV9lMV9zdWJzbG90ICpzcmNfc3MsICpkc3Rfc3M7CisKKwlzcmNfc3MgPSAmc3JjLT50cy0+ZTFfbGluazsKKwlkc3Rfc3MgPSAmZHN0LT50cy0+ZTFfbGluazsKKworCXJldHVybiB0cmF1X211eF9tYXAoc3JjX3NzLCBkc3Rfc3MpOworfQorCisKKy8qIHVubWFwIG9uZSBwYXJ0aWN1bGFyIHN1YnNsb3QgZnJvbSBhbm90aGVyIHN1YnNsb3QgKi8KK2ludCB0cmF1X211eF91bm1hcChjb25zdCBzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKnNzLCB1X2ludDMyX3QgY2FsbHJlZikKK3sKKwlzdHJ1Y3QgbWFwX2VudHJ5ICptZSwgKm1lMjsKKwlzdHJ1Y3QgdXBxdWV1ZV9lbnRyeSAqdWUsICp1ZTI7CisKKwlpZiAoc3MpCisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUobWUsIG1lMiwgJnNzX21hcCwgbGlzdCkgeworCQkJaWYgKCFtZW1jbXAoJm1lLT5zcmMsIHNzLCBzaXplb2YoKnNzKSkgfHwKKwkJCSAgICAhbWVtY21wKCZtZS0+ZHN0LCBzcywgc2l6ZW9mKCpzcykpKSB7CisJCQkJbGxpc3RfZGVsKCZtZS0+bGlzdCk7CisJCQkJcmV0dXJuIDA7CisJCQl9CisJCX0KKwlsbGlzdF9mb3JfZWFjaF9lbnRyeV9zYWZlKHVlLCB1ZTIsICZzc191cHF1ZXVlLCBsaXN0KSB7CisJCWlmICh1ZS0+Y2FsbHJlZiA9PSBjYWxscmVmKSB7CisJCQlsbGlzdF9kZWwoJnVlLT5saXN0KTsKKwkJCXJldHVybiAwOworCQl9CisJCWlmIChzcyAmJiAhbWVtY21wKCZ1ZS0+c3JjLCBzcywgc2l6ZW9mKCpzcykpKSB7CisJCQlsbGlzdF9kZWwoJnVlLT5saXN0KTsKKwkJCXJldHVybiAwOworCQl9CisJfQorCXJldHVybiAtRU5PRU5UOworfQorCisvKiBsb29rLXVwIGFuIGVudHkgaW4gdGhlIFRSQVUgbXV4IG1hcCAqLworc3RhdGljIHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqCitsb29rdXBfdHJhdV9tdXhfbWFwKGNvbnN0IHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqc3JjKQoreworCXN0cnVjdCBtYXBfZW50cnkgKm1lOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkobWUsICZzc19tYXAsIGxpc3QpIHsKKwkJaWYgKCFtZW1jbXAoJm1lLT5zcmMsIHNyYywgc2l6ZW9mKCpzcmMpKSkKKwkJCXJldHVybiAmbWUtPmRzdDsKKwkJaWYgKCFtZW1jbXAoJm1lLT5kc3QsIHNyYywgc2l6ZW9mKCpzcmMpKSkKKwkJCXJldHVybiAmbWUtPnNyYzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKy8qIGxvb2stdXAgYW4gZW50eSBpbiB0aGUgVFJBVSB1cHF1ZXVlICovCitzdHJ1Y3QgdXBxdWV1ZV9lbnRyeSAqCitsb29rdXBfdHJhdV91cHF1ZXVlKGNvbnN0IHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqc3JjKQoreworCXN0cnVjdCB1cHF1ZXVlX2VudHJ5ICp1ZTsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHVlLCAmc3NfdXBxdWV1ZSwgbGlzdCkgeworCQlpZiAoIW1lbWNtcCgmdWUtPnNyYywgc3JjLCBzaXplb2YoKnNyYykpKQorCQkJcmV0dXJuIHVlOworCX0KKwlyZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IHVfaW50OF90IGNfYml0c19jaGVja1tdID0geyAwLCAwLCAwLCAxLCAwIH07CisKKy8qIHdlIGdldCBjYWxsZWQgYnkgc3ViY2hhbl9kZW11eCAqLworaW50IHRyYXVfbXV4X2lucHV0KHN0cnVjdCBnc21fZTFfc3Vic2xvdCAqc3JjX2UxX3NzLAorCQkgICBjb25zdCB1X2ludDhfdCAqdHJhdV9iaXRzLCBpbnQgbnVtX2JpdHMpCit7CisJc3RydWN0IGRlY29kZWRfdHJhdV9mcmFtZSB0ZjsKKwl1X2ludDhfdCB0cmF1X2JpdHNfb3V0W1RSQVVfRlJBTUVfQklUU107CisJc3RydWN0IGdzbV9lMV9zdWJzbG90ICpkc3RfZTFfc3MgPSBsb29rdXBfdHJhdV9tdXhfbWFwKHNyY19lMV9zcyk7CisJc3RydWN0IHN1YmNoX211eCAqbXg7CisJc3RydWN0IHVwcXVldWVfZW50cnkgKnVlOworCWludCByYzsKKworCS8qIGRlY29kZSBUUkFVLCBjaGFuZ2UgaXQgdG8gZG93bmxpbmssIHJlLWVuY29kZSAqLworCXJjID0gZGVjb2RlX3RyYXVfZnJhbWUoJnRmLCB0cmF1X2JpdHMpOworCWlmIChyYykKKwkJcmV0dXJuIHJjOworCisJaWYgKCFkc3RfZTFfc3MpIHsKKwkJc3RydWN0IG1zZ2IgKm1zZzsKKwkJc3RydWN0IGdzbV9kYXRhX2ZyYW1lICpmcmFtZTsKKwkJdW5zaWduZWQgY2hhciAqZGF0YTsKKwkJaW50IGksIGosIGssIGwsIG87CisJCS8qIGZyYW1lIHNoYWxsIGJlIHNlbnQgdG8gdXBxdWV1ZSAqLworCQlpZiAoISh1ZSA9IGxvb2t1cF90cmF1X3VwcXVldWUoc3JjX2UxX3NzKSkpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJaWYgKCF1ZS0+Y2FsbHJlZikKKwkJCXJldHVybiAtRUlOVkFMOworCQlpZiAobWVtY21wKHRmLmNfYml0cywgY19iaXRzX2NoZWNrLCBzaXplb2YoY19iaXRzX2NoZWNrKSkpCisJCQlERUJVR1BDKERNVVgsICJpbGxlZ2FsIHRyYXUgKEMxLUM1KSAlc1xuIiwKKwkJCQloZXhkdW1wKHRmLmNfYml0cywgc2l6ZW9mKGNfYml0c19jaGVjaykpKTsKKwkJbXNnID0gbXNnYl9hbGxvYyhzaXplb2Yoc3RydWN0IGdzbV9kYXRhX2ZyYW1lKSArIDMzLAorCQkJCSAiR1NNLURBVEEiKTsKKwkJaWYgKCFtc2cpCisJCQlyZXR1cm4gLUVOT01FTTsKKworCQlmcmFtZSA9IChzdHJ1Y3QgZ3NtX2RhdGFfZnJhbWUgKiltc2ctPmRhdGE7CisJCW1lbXNldChmcmFtZSwgMCwgc2l6ZW9mKHN0cnVjdCBnc21fZGF0YV9mcmFtZSkpOworCQlkYXRhID0gZnJhbWUtPmRhdGE7CisJCWRhdGFbMF0gPSAweGQgPDwgNDsKKwkJLyogcmVhc3NlbWJsZSBkLWJpdHMgKi8KKwkJaSA9IDA7IC8qIGNvdW50cyBiaXRzICovCisJCWogPSA0OyAvKiBjb3VudHMgb3V0cHV0IGJpdHMgKi8KKwkJayA9IGdzbV9mcl9tYXBbMF0tMTsgLyogY3VycmVudCBudW1iZXIgYml0IGluIGVsZW1lbnQgKi8KKwkJbCA9IDA7IC8qIGNvdW50cyBlbGVtZW50IGJpdHMgKi8KKwkJbyA9IDA7IC8qIG9mZnNldCBpbnB1dCBiaXRzICovCisJCXdoaWxlIChpIDwgMjYwKSB7CisJCQlkYXRhW2ovOF0gfD0gKHRmLmRfYml0c1trK29dIDw8ICg3LShqJTgpKSk7CisJCQlpZiAoLS1rIDwgMCkgeworCQkJCW8gKz0gZ3NtX2ZyX21hcFtsXTsKKwkJCQlrID0gZ3NtX2ZyX21hcFsrK2xdLTE7CisJCQl9CisJCQlpKys7CisJCQlqKys7CisJCX0KKwkJZnJhbWUtPm1zZ190eXBlID0gR1NNX1RDSEZfRlJBTUU7CisJCWZyYW1lLT5jYWxscmVmID0gdWUtPmNhbGxyZWY7CisJCW1zZ2JfZW5xdWV1ZSgmdWUtPm5ldC0+dXBxdWV1ZSwgbXNnKTsKKworCQlyZXR1cm4gMDsKKwl9CisKKwlteCA9IGUxaW5wX2dldF9tdXgoZHN0X2UxX3NzLT5lMV9uciwgZHN0X2UxX3NzLT5lMV90cyk7CisJaWYgKCFteCkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwl0cmF1X2ZyYW1lX3VwMmRvd24oJnRmKTsKKwllbmNvZGVfdHJhdV9mcmFtZSh0cmF1X2JpdHNfb3V0LCAmdGYpOworCisJLyogYW5kIHNlbmQgaXQgdG8gdGhlIG11eGVyICovCisJcmV0dXJuIHN1YmNoYW5fbXV4X2VucXVldWUobXgsIGRzdF9lMV9zcy0+ZTFfdHNfc3MsIHRyYXVfYml0c19vdXQsCisJCQkJICAgVFJBVV9GUkFNRV9CSVRTKTsKK30KKworLyogYWRkIHJlY2VpdmVyIGluc3RhbmNlIGZvciBsY2hhbiBhbmQgY2FsbHJlZiAqLworaW50IHRyYXVfcmVjdl9sY2hhbihzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgdV9pbnQzMl90IGNhbGxyZWYpCit7CisJc3RydWN0IGdzbV9lMV9zdWJzbG90ICpzcmNfc3M7CisJc3RydWN0IHVwcXVldWVfZW50cnkgKnVlOworCisJdWUgPSB0YWxsb2ModGFsbF91cHFfY3R4LCBzdHJ1Y3QgdXBxdWV1ZV9lbnRyeSk7CisJaWYgKCF1ZSkKKwkJcmV0dXJuIC1FTk9NRU07CisKKwlzcmNfc3MgPSAmbGNoYW4tPnRzLT5lMV9saW5rOworCisJREVCVUdQKERDQywgIlNldHRpbmcgdXAgVFJBVSByZWNlaXZlciAoZTE9JXUsdHM9JXUsc3M9JXUpICIKKwkJImFuZCAoY2FsbHJlZiAweCV4KVxuIiwKKwkJc3JjX3NzLT5lMV9uciwgc3JjX3NzLT5lMV90cywgc3JjX3NzLT5lMV90c19zcywKKwkJY2FsbHJlZik7CisKKwkvKiBtYWtlIHN1cmUgdG8gZ2V0IHJpZCBvZiBhbnkgc3RhbGUgb2xkIG1hcHBpbmdzICovCisJdHJhdV9tdXhfdW5tYXAoc3JjX3NzLCBjYWxscmVmKTsKKworCW1lbWNweSgmdWUtPnNyYywgc3JjX3NzLCBzaXplb2YodWUtPnNyYykpOworCXVlLT5uZXQgPSBsY2hhbi0+dHMtPnRyeC0+YnRzLT5uZXR3b3JrOworCXVlLT5jYWxscmVmID0gY2FsbHJlZjsKKwlsbGlzdF9hZGQoJnVlLT5saXN0LCAmc3NfdXBxdWV1ZSk7CisKKwlyZXR1cm4gMDsKK30KKworaW50IHRyYXVfc2VuZF9mcmFtZShzdHJ1Y3QgZ3NtX2xjaGFuICpsY2hhbiwgc3RydWN0IGdzbV9kYXRhX2ZyYW1lICpmcmFtZSkKK3sKKwl1X2ludDhfdCB0cmF1X2JpdHNfb3V0W1RSQVVfRlJBTUVfQklUU107CisJc3RydWN0IGdzbV9lMV9zdWJzbG90ICpkc3RfZTFfc3MgPSAmbGNoYW4tPnRzLT5lMV9saW5rOworCXN0cnVjdCBzdWJjaF9tdXggKm14OworCWludCBpLCBqLCBrLCBsLCBvOworCXVuc2lnbmVkIGNoYXIgKmRhdGEgPSBmcmFtZS0+ZGF0YTsKKwlzdHJ1Y3QgZGVjb2RlZF90cmF1X2ZyYW1lIHRmOworCisJbXggPSBlMWlucF9nZXRfbXV4KGRzdF9lMV9zcy0+ZTFfbnIsIGRzdF9lMV9zcy0+ZTFfdHMpOworCWlmICghbXgpCisJCXJldHVybiAtRUlOVkFMOworCisJc3dpdGNoIChmcmFtZS0+bXNnX3R5cGUpIHsKKwljYXNlIEdTTV9UQ0hGX0ZSQU1FOgorCQkvKiBzZXQgYy1iaXRzIGFuZCB0LWJpdHMgKi8KKwkJdGYuY19iaXRzWzBdID0gMTsKKwkJdGYuY19iaXRzWzFdID0gMTsKKwkJdGYuY19iaXRzWzJdID0gMTsKKwkJdGYuY19iaXRzWzNdID0gMDsKKwkJdGYuY19iaXRzWzRdID0gMDsKKwkJbWVtc2V0KCZ0Zi5jX2JpdHNbNV0sIDAsIDYpOworCQltZW1zZXQoJnRmLmNfYml0c1sxMV0sIDEsIDEwKTsKKwkJbWVtc2V0KCZ0Zi50X2JpdHNbMF0sIDEsIDQpOworCQkvKiByZWFzc2VtYmxlIGQtYml0cyAqLworCQlpID0gMDsgLyogY291bnRzIGJpdHMgKi8KKwkJaiA9IDQ7IC8qIGNvdW50cyBpbnB1dCBiaXRzICovCisJCWsgPSBnc21fZnJfbWFwWzBdLTE7IC8qIGN1cnJlbnQgbnVtYmVyIGJpdCBpbiBlbGVtZW50ICovCisJCWwgPSAwOyAvKiBjb3VudHMgZWxlbWVudCBiaXRzICovCisJCW8gPSAwOyAvKiBvZmZzZXQgb3V0cHV0IGJpdHMgKi8KKwkJd2hpbGUgKGkgPCAyNjApIHsKKwkJCXRmLmRfYml0c1trK29dID0gKGRhdGFbai84XSA+PiAoNy0oaiU4KSkpICYgMTsKKwkJCWlmICgtLWsgPCAwKSB7CisJCQkJbyArPSBnc21fZnJfbWFwW2xdOworCQkJCWsgPSBnc21fZnJfbWFwWysrbF0tMTsKKwkJCX0KKwkJCWkrKzsKKwkJCWorKzsKKwkJfQorCQlicmVhazsKKwlkZWZhdWx0OgorCQlERUJVR1BDKERNVVgsICJ1bnN1cHBvcnRlZCBtZXNzYWdlIHR5cGUgJWRcbiIsCisJCQlmcmFtZS0+bXNnX3R5cGUpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwllbmNvZGVfdHJhdV9mcmFtZSh0cmF1X2JpdHNfb3V0LCAmdGYpOworCisJLyogYW5kIHNlbmQgaXQgdG8gdGhlIG11eGVyICovCisJcmV0dXJuIHN1YmNoYW5fbXV4X2VucXVldWUobXgsIGRzdF9lMV9zcy0+ZTFfdHNfc3MsIHRyYXVfYml0c19vdXQsCisJCQkJICAgVFJBVV9GUkFNRV9CSVRTKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3Vzc2QuYyBiL29wZW5ic2Mvc3JjL3Vzc2QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2QxMWYwCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdXNzZC5jCkBAIC0wLDAgKzEsNzEgQEAKKy8qIE5ldHdvcmstc3BlY2lmaWMgaGFuZGxpbmcgb2YgbW9iaWxlLW9yaWdpbmF0ZWQgVVNTRHMuICovCisKKy8qIChDKSAyMDA4LTIwMDkgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIChDKSAyMDA4LCAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIChDKSAyMDA5IGJ5IE1pa2UgSGFiZW4gPG1pY2hhZWwuaGFiZW5AYnRpbnRlcm5ldC5jb20+CisgKgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKy8qIFRoaXMgbW9kdWxlIGRlZmluZXMgdGhlIG5ldHdvcmstc3BlY2lmaWMgaGFuZGxpbmcgb2YgbW9iaWxlLW9yaWdpbmF0ZWQKKyAgIFVTU0QgbWVzc2FnZXMuICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV8wNF84MC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisKKy8qIERlY2xhcmF0aW9ucyBvZiBVU1NEIHN0cmluZ3MgdG8gYmUgcmVjb2duaXNlZCAqLworY29uc3QgY2hhciBVU1NEX1RFWFRfT1dOX05VTUJFUltdID0gIiojMTAwIyI7CisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zIG9mIG5ldHdvcmstc3BlY2lmaWMgaGFuZGxlciBmdW5jdGlvbnMgKi8KK3N0YXRpYyBpbnQgc2VuZF9vd25fbnVtYmVyKGNvbnN0IHN0cnVjdCBtc2diICptc2csIGNvbnN0IHN0cnVjdCB1c3NkX3JlcXVlc3QgKnJlcSk7CisKKworLyogRW50cnlwb2ludCAtIGhhbmRsZXIgZnVuY3Rpb24gY29tbW9uIHRvIGFsbCBtb2JpbGUtb3JpZ2luYXRlZCBVU1NEcyAqLworaW50IGhhbmRsZV9yY3ZfdXNzZChzdHJ1Y3QgbXNnYiAqbXNnKQoreworCXN0cnVjdCB1c3NkX3JlcXVlc3QgcmVxOworCisJZ3NtMDQ4MF9kZWNvZGVfdXNzZF9yZXF1ZXN0KG1zZywgJnJlcSk7CisJaWYgKHJlcS50ZXh0WzBdID09IDB4RkYpICAvKiBSZWxlYXNlLUNvbXBsZXRlICovCisJCXJldHVybiAwOworCisJaWYgKHN0cnN0cihVU1NEX1RFWFRfT1dOX05VTUJFUiwgcmVxLnRleHQpICE9IE5VTEwpIHsKKwkJREVCVUdQKERNTSwgIlVTU0Q6IE93biBudW1iZXIgcmVxdWVzdGVkXG4iKTsKKwkJcmV0dXJuIHNlbmRfb3duX251bWJlcihtc2csICZyZXEpOworCX0gZWxzZSB7CisJCURFQlVHUChETU0sICJVbmhhbmRsZWQgVVNTRCAlc1xuIiwgcmVxLnRleHQpOworCQlyZXR1cm4gZ3NtMDQ4MF9zZW5kX3Vzc2RfcmVqZWN0KG1zZywgJnJlcSk7CisJfQorfQorCisvKiBBIG5ldHdvcmstc3BlY2lmaWMgaGFuZGxlciBmdW5jdGlvbiAqLworc3RhdGljIGludCBzZW5kX293bl9udW1iZXIoY29uc3Qgc3RydWN0IG1zZ2IgKm1zZywgY29uc3Qgc3RydWN0IHVzc2RfcmVxdWVzdCAqcmVxKQoreworCWNoYXIgKm93bl9udW1iZXIgPSBtc2ctPmxjaGFuLT5zdWJzY3ItPmV4dGVuc2lvbjsKKwljaGFyIHJlc3BvbnNlX3N0cmluZ1tHU01fRVhURU5TSU9OX0xFTkdUSCArIDIwXTsKKworCS8qIE5lZWQgdHJhaWxpbmcgQ1IgYXMgRU9UIGNoYXJhY3RlciAqLworCXNucHJpbnRmKHJlc3BvbnNlX3N0cmluZywgc2l6ZW9mKHJlc3BvbnNlX3N0cmluZyksICJZb3VyIGV4dGVuc2lvbiBpcyAlc1xyIiwgb3duX251bWJlcik7CisJcmV0dXJuIGdzbTA0ODBfc2VuZF91c3NkX3Jlc3BvbnNlKG1zZywgcmVzcG9uc2Vfc3RyaW5nLCByZXEpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvdnR5L2J1ZmZlci5jIGIvb3BlbmJzYy9zcmMvdnR5L2J1ZmZlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5NWQwNjIKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy92dHkvYnVmZmVyLmMKQEAgLTAsMCArMSw0NjMgQEAKKy8qCisgKiBCdWZmZXJpbmcgb2Ygb3V0cHV0IGFuZCBpbnB1dC4KKyAqIENvcHlyaWdodCAoQykgMTk5OCBLdW5paGlybyBJc2hpZ3VybworICoKKyAqIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIEdOVSBaZWJyYS4KKyAqCisgKiBHTlUgWmVicmEgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQKKyAqIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIsIG9yIChhdCB5b3VyCisgKiBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIEdOVSBaZWJyYSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKKyAqIFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCisgKiBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggR05VIFplYnJhOyBzZWUgdGhlIGZpbGUgQ09QWUlORy4gIElmIG5vdCwgd3JpdGUgdG8gdGhlCisgKiBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSAtIFN1aXRlIDMzMCwKKyAqIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8c3lzL3Vpby5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisjaW5jbHVkZSA8dnR5L2J1ZmZlci5oPgorI2luY2x1ZGUgPHZ0eS92dHkuaD4KKworLyogQnVmZmVyIG1hc3Rlci4gKi8KK3N0cnVjdCBidWZmZXIgeworCS8qIERhdGEgbGlzdC4gKi8KKwlzdHJ1Y3QgYnVmZmVyX2RhdGEgKmhlYWQ7CisJc3RydWN0IGJ1ZmZlcl9kYXRhICp0YWlsOworCisJLyogU2l6ZSBvZiBlYWNoIGJ1ZmZlcl9kYXRhIGNodW5rLiAqLworCXNpemVfdCBzaXplOworfTsKKworLyogRGF0YSBjb250YWluZXIuICovCitzdHJ1Y3QgYnVmZmVyX2RhdGEgeworCXN0cnVjdCBidWZmZXJfZGF0YSAqbmV4dDsKKworCS8qIExvY2F0aW9uIHRvIGFkZCBuZXcgZGF0YS4gKi8KKwlzaXplX3QgY3A7CisKKwkvKiBQb2ludGVyIHRvIGRhdGEgbm90IHlldCBmbHVzaGVkLiAqLworCXNpemVfdCBzcDsKKworCS8qIEFjdHVhbCBkYXRhIHN0cmVhbSAodmFyaWFibGUgbGVuZ3RoKS4gKi8KKwl1bnNpZ25lZCBjaGFyIGRhdGFbMF07CS8qIHJlYWwgZGltZW5zaW9uIGlzIGJ1ZmZlci0+c2l6ZSAqLworfTsKKworLyogSXQgc2hvdWxkIGFsd2F5cyBiZSB0cnVlIHRoYXQ6IDAgPD0gc3AgPD0gY3AgPD0gc2l6ZSAqLworCisvKiBEZWZhdWx0IGJ1ZmZlciBzaXplICh1c2VkIGlmIG5vbmUgc3BlY2lmaWVkKS4gIEl0IGlzIHJvdW5kZWQgdXAgdG8gdGhlCisgICBuZXh0IHBhZ2UgYm91bmRlcnkuICovCisjZGVmaW5lIEJVRkZFUl9TSVpFX0RFRkFVTFQJCTQwOTYKKworI2RlZmluZSBCVUZGRVJfREFUQV9GUkVFKEQpIHRhbGxvY19mcmVlKChEKSkKKworLyogTWFrZSBuZXcgYnVmZmVyLiAqLworc3RydWN0IGJ1ZmZlciAqYnVmZmVyX25ldyhzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyICpiOworCisJYiA9IHRhbGxvY196ZXJvKHRhbGxfdnR5X2N0eCwgc3RydWN0IGJ1ZmZlcik7CisKKwlpZiAoc2l6ZSkKKwkJYi0+c2l6ZSA9IHNpemU7CisJZWxzZSB7CisJCXN0YXRpYyBzaXplX3QgZGVmYXVsdF9zaXplOworCQlpZiAoIWRlZmF1bHRfc2l6ZSkgeworCQkJbG9uZyBwZ3N6ID0gc3lzY29uZihfU0NfUEFHRVNJWkUpOworCQkJZGVmYXVsdF9zaXplID0KKwkJCSAgICAoKCgoQlVGRkVSX1NJWkVfREVGQVVMVCAtIDEpIC8gcGdzeikgKyAxKSAqIHBnc3opOworCQl9CisJCWItPnNpemUgPSBkZWZhdWx0X3NpemU7CisJfQorCisJcmV0dXJuIGI7Cit9CisKKy8qIEZyZWUgYnVmZmVyLiAqLwordm9pZCBidWZmZXJfZnJlZShzdHJ1Y3QgYnVmZmVyICpiKQoreworCWJ1ZmZlcl9yZXNldChiKTsKKwl0YWxsb2NfZnJlZShiKTsKK30KKworLyogTWFrZSBzdHJpbmcgY2xvbmUuICovCitjaGFyICpidWZmZXJfZ2V0c3RyKHN0cnVjdCBidWZmZXIgKmIpCit7CisJc2l6ZV90IHRvdGxlbiA9IDA7CisJc3RydWN0IGJ1ZmZlcl9kYXRhICpkYXRhOworCWNoYXIgKnM7CisJY2hhciAqcDsKKworCWZvciAoZGF0YSA9IGItPmhlYWQ7IGRhdGE7IGRhdGEgPSBkYXRhLT5uZXh0KQorCQl0b3RsZW4gKz0gZGF0YS0+Y3AgLSBkYXRhLT5zcDsKKwlpZiAoIShzID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X2N0eCwgKHRvdGxlbiArIDEpLCAiYnVmZmVyX2dldHN0ciIpKSkKKwkJcmV0dXJuIE5VTEw7CisJcCA9IHM7CisJZm9yIChkYXRhID0gYi0+aGVhZDsgZGF0YTsgZGF0YSA9IGRhdGEtPm5leHQpIHsKKwkJbWVtY3B5KHAsIGRhdGEtPmRhdGEgKyBkYXRhLT5zcCwgZGF0YS0+Y3AgLSBkYXRhLT5zcCk7CisJCXAgKz0gZGF0YS0+Y3AgLSBkYXRhLT5zcDsKKwl9CisJKnAgPSAnXDAnOworCXJldHVybiBzOworfQorCisvKiBSZXR1cm4gMSBpZiBidWZmZXIgaXMgZW1wdHkuICovCitpbnQgYnVmZmVyX2VtcHR5KHN0cnVjdCBidWZmZXIgKmIpCit7CisJcmV0dXJuIChiLT5oZWFkID09IE5VTEwpOworfQorCisvKiBDbGVhciBhbmQgZnJlZSBhbGwgYWxsb2NhdGVkIGRhdGEuICovCit2b2lkIGJ1ZmZlcl9yZXNldChzdHJ1Y3QgYnVmZmVyICpiKQoreworCXN0cnVjdCBidWZmZXJfZGF0YSAqZGF0YTsKKwlzdHJ1Y3QgYnVmZmVyX2RhdGEgKm5leHQ7CisKKwlmb3IgKGRhdGEgPSBiLT5oZWFkOyBkYXRhOyBkYXRhID0gbmV4dCkgeworCQluZXh0ID0gZGF0YS0+bmV4dDsKKwkJQlVGRkVSX0RBVEFfRlJFRShkYXRhKTsKKwl9CisJYi0+aGVhZCA9IGItPnRhaWwgPSBOVUxMOworfQorCisvKiBBZGQgYnVmZmVyX2RhdGEgdG8gdGhlIGVuZCBvZiBidWZmZXIuICovCitzdGF0aWMgc3RydWN0IGJ1ZmZlcl9kYXRhICpidWZmZXJfYWRkKHN0cnVjdCBidWZmZXIgKmIpCit7CisJc3RydWN0IGJ1ZmZlcl9kYXRhICpkOworCisJZCA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jdHgsCisJCQkgb2Zmc2V0b2Yoc3RydWN0IGJ1ZmZlcl9kYXRhLCBkYXRhW2ItPnNpemVdKSwKKwkJCSAiYnVmZmVyX2FkZCIpOworCWlmICghZCkKKwkJcmV0dXJuIE5VTEw7CisJZC0+Y3AgPSBkLT5zcCA9IDA7CisJZC0+bmV4dCA9IE5VTEw7CisKKwlpZiAoYi0+dGFpbCkKKwkJYi0+dGFpbC0+bmV4dCA9IGQ7CisJZWxzZQorCQliLT5oZWFkID0gZDsKKwliLT50YWlsID0gZDsKKworCXJldHVybiBkOworfQorCisvKiBXcml0ZSBkYXRhIHRvIGJ1ZmZlci4gKi8KK3ZvaWQgYnVmZmVyX3B1dChzdHJ1Y3QgYnVmZmVyICpiLCBjb25zdCB2b2lkICpwLCBzaXplX3Qgc2l6ZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyX2RhdGEgKmRhdGEgPSBiLT50YWlsOworCWNvbnN0IGNoYXIgKnB0ciA9IHA7CisKKwkvKiBXZSB1c2UgZXZlbiBsYXN0IG9uZSBieXRlIG9mIGRhdGEgYnVmZmVyLiAqLworCXdoaWxlIChzaXplKSB7CisJCXNpemVfdCBjaHVuazsKKworCQkvKiBJZiB0aGVyZSBpcyBubyBkYXRhIGJ1ZmZlciBhZGQgaXQuICovCisJCWlmIChkYXRhID09IE5VTEwgfHwgZGF0YS0+Y3AgPT0gYi0+c2l6ZSkKKwkJCWRhdGEgPSBidWZmZXJfYWRkKGIpOworCisJCWNodW5rID0KKwkJICAgICgoc2l6ZSA8PQorCQkgICAgICAoYi0+c2l6ZSAtIGRhdGEtPmNwKSkgPyBzaXplIDogKGItPnNpemUgLSBkYXRhLT5jcCkpOworCQltZW1jcHkoKGRhdGEtPmRhdGEgKyBkYXRhLT5jcCksIHB0ciwgY2h1bmspOworCQlzaXplIC09IGNodW5rOworCQlwdHIgKz0gY2h1bms7CisJCWRhdGEtPmNwICs9IGNodW5rOworCX0KK30KKworLyogSW5zZXJ0IGNoYXJhY3RlciBpbnRvIHRoZSBidWZmZXIuICovCit2b2lkIGJ1ZmZlcl9wdXRjKHN0cnVjdCBidWZmZXIgKmIsIHVfY2hhciBjKQoreworCWJ1ZmZlcl9wdXQoYiwgJmMsIDEpOworfQorCisvKiBQdXQgc3RyaW5nIHRvIHRoZSBidWZmZXIuICovCit2b2lkIGJ1ZmZlcl9wdXRzdHIoc3RydWN0IGJ1ZmZlciAqYiwgY29uc3QgY2hhciAqYykKK3sKKwlidWZmZXJfcHV0KGIsIGMsIHN0cmxlbihjKSk7Cit9CisKKy8qIEtlZXAgZmx1c2hpbmcgZGF0YSB0byB0aGUgZmQgdW50aWwgdGhlIGJ1ZmZlciBpcyBlbXB0eSBvciBhbiBlcnJvciBpcworICAgZW5jb3VudGVyZWQgb3IgdGhlIG9wZXJhdGlvbiB3b3VsZCBibG9jay4gKi8KK2J1ZmZlcl9zdGF0dXNfdCBidWZmZXJfZmx1c2hfYWxsKHN0cnVjdCBidWZmZXIgKmIsIGludCBmZCkKK3sKKwlidWZmZXJfc3RhdHVzX3QgcmV0OworCXN0cnVjdCBidWZmZXJfZGF0YSAqaGVhZDsKKwlzaXplX3QgaGVhZF9zcDsKKworCWlmICghYi0+aGVhZCkKKwkJcmV0dXJuIEJVRkZFUl9FTVBUWTsKKwloZWFkX3NwID0gKGhlYWQgPSBiLT5oZWFkKS0+c3A7CisJLyogRmx1c2ggYWxsIGRhdGEuICovCisJd2hpbGUgKChyZXQgPSBidWZmZXJfZmx1c2hfYXZhaWxhYmxlKGIsIGZkKSkgPT0gQlVGRkVSX1BFTkRJTkcpIHsKKwkJaWYgKChiLT5oZWFkID09IGhlYWQpICYmIChoZWFkX3NwID09IGhlYWQtPnNwKQorCQkgICAgJiYgKGVycm5vICE9IEVJTlRSKSkKKwkJCS8qIE5vIGRhdGEgd2FzIGZsdXNoZWQsIHNvIGtlcm5lbCBidWZmZXIgbXVzdCBiZSBmdWxsLiAqLworCQkJcmV0dXJuIHJldDsKKwkJaGVhZF9zcCA9IChoZWFkID0gYi0+aGVhZCktPnNwOworCX0KKworCXJldHVybiByZXQ7Cit9CisKKyNpZiAwCisvKiBGbHVzaCBlbm91Z2ggZGF0YSB0byBmaWxsIGEgdGVybWluYWwgd2luZG93IG9mIHRoZSBnaXZlbiBzY2VuZSAodXNlZCBvbmx5CisgICBieSB2dHkgdGVsbmV0IGludGVyZmFjZSkuICovCitidWZmZXJfc3RhdHVzX3QKK2J1ZmZlcl9mbHVzaF93aW5kb3coc3RydWN0IGJ1ZmZlciAqIGIsIGludCBmZCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorCQkgICAgaW50IGVyYXNlX2ZsYWcsIGludCBub19tb3JlX2ZsYWcpCit7CisJaW50IG5ieXRlczsKKwlpbnQgaW92X2FsbG9jOworCWludCBpb3ZfaW5kZXg7CisJc3RydWN0IGlvdmVjICppb3Y7CisJc3RydWN0IGlvdmVjIHNtYWxsX2lvdlszXTsKKwljaGFyIG1vcmVbXSA9ICIgLS1Nb3JlLS0gIjsKKwljaGFyIGVyYXNlW10gPQorCSAgICB7IDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsIDB4MDgsCisJCScgJywgJyAnLCAnICcsICcgJywgJyAnLCAnICcsICcgJywgJyAnLCAnICcsICcgJywKKwkJMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOCwgMHgwOAorCX07CisJc3RydWN0IGJ1ZmZlcl9kYXRhICpkYXRhOworCWludCBjb2x1bW47CisKKwlpZiAoIWItPmhlYWQpCisJCXJldHVybiBCVUZGRVJfRU1QVFk7CisKKwlpZiAoaGVpZ2h0IDwgMSkgeworCQl6bG9nX3dhcm4KKwkJICAgICgiJXMgY2FsbGVkIHdpdGggbm9uLXBvc2l0aXZlIHdpbmRvdyBoZWlnaHQgJWQsIGZvcmNpbmcgdG8gMSIsCisJCSAgICAgX19mdW5jX18sIGhlaWdodCk7CisJCWhlaWdodCA9IDE7CisJfSBlbHNlIGlmIChoZWlnaHQgPj0gMikKKwkJaGVpZ2h0LS07CisJaWYgKHdpZHRoIDwgMSkgeworCQl6bG9nX3dhcm4KKwkJICAgICgiJXMgY2FsbGVkIHdpdGggbm9uLXBvc2l0aXZlIHdpbmRvdyB3aWR0aCAlZCwgZm9yY2luZyB0byAxIiwKKwkJICAgICBfX2Z1bmNfXywgd2lkdGgpOworCQl3aWR0aCA9IDE7CisJfQorCisJLyogRm9yIGVyYXNlIGFuZCBtb3JlIGRhdGEgYWRkIHR3byB0byBiJ3MgYnVmZmVyX2RhdGEgY291bnQuICovCisJaWYgKGItPmhlYWQtPm5leHQgPT0gTlVMTCkgeworCQlpb3ZfYWxsb2MgPSBzaXplb2Yoc21hbGxfaW92KSAvIHNpemVvZihzbWFsbF9pb3ZbMF0pOworCQlpb3YgPSBzbWFsbF9pb3Y7CisJfSBlbHNlIHsKKwkJaW92X2FsbG9jID0gKChoZWlnaHQgKiAod2lkdGggKyAyKSkgLyBiLT5zaXplKSArIDEwOworCQlpb3YgPSBYTUFMTE9DKE1UWVBFX1RNUCwgaW92X2FsbG9jICogc2l6ZW9mKCppb3YpKTsKKwl9CisJaW92X2luZGV4ID0gMDsKKworCS8qIFByZXZpb3VzbHkgcHJpbnQgb3V0IGlzIHBlcmZvcm1lZC4gKi8KKwlpZiAoZXJhc2VfZmxhZykgeworCQlpb3ZbaW92X2luZGV4XS5pb3ZfYmFzZSA9IGVyYXNlOworCQlpb3ZbaW92X2luZGV4XS5pb3ZfbGVuID0gc2l6ZW9mIGVyYXNlOworCQlpb3ZfaW5kZXgrKzsKKwl9CisKKwkvKiBPdXRwdXQgZGF0YS4gKi8KKwljb2x1bW4gPSAxOwkJLyogQ29sdW1uIHBvc2l0aW9uIG9mIG5leHQgY2hhcmFjdGVyIGRpc3BsYXllZC4gKi8KKwlmb3IgKGRhdGEgPSBiLT5oZWFkOyBkYXRhICYmIChoZWlnaHQgPiAwKTsgZGF0YSA9IGRhdGEtPm5leHQpIHsKKwkJc2l6ZV90IGNwOworCisJCWNwID0gZGF0YS0+c3A7CisJCXdoaWxlICgoY3AgPCBkYXRhLT5jcCkgJiYgKGhlaWdodCA+IDApKSB7CisJCQkvKiBDYWxjdWxhdGUgbGluZXMgcmVtYWluaW5nIGFuZCBjb2x1bW4gcG9zaXRpb24gYWZ0ZXIgZGlzcGxheWluZworCQkJICAgdGhpcyBjaGFyYWN0ZXIuICovCisJCQlpZiAoZGF0YS0+ZGF0YVtjcF0gPT0gJ1xyJykKKwkJCQljb2x1bW4gPSAxOworCQkJZWxzZSBpZiAoKGRhdGEtPmRhdGFbY3BdID09ICdcbicpIHx8IChjb2x1bW4gPT0gd2lkdGgpKSB7CisJCQkJY29sdW1uID0gMTsKKwkJCQloZWlnaHQtLTsKKwkJCX0gZWxzZQorCQkJCWNvbHVtbisrOworCQkJY3ArKzsKKwkJfQorCQlpb3ZbaW92X2luZGV4XS5pb3ZfYmFzZSA9IChjaGFyICopKGRhdGEtPmRhdGEgKyBkYXRhLT5zcCk7CisJCWlvdltpb3ZfaW5kZXgrK10uaW92X2xlbiA9IGNwIC0gZGF0YS0+c3A7CisJCWRhdGEtPnNwID0gY3A7CisKKwkJaWYgKGlvdl9pbmRleCA9PSBpb3ZfYWxsb2MpCisJCQkvKiBUaGlzIHNob3VsZCBub3Qgb3JkaW5hcmlseSBoYXBwZW4uICovCisJCXsKKwkJCWlvdl9hbGxvYyAqPSAyOworCQkJaWYgKGlvdiAhPSBzbWFsbF9pb3YpIHsKKwkJCQl6bG9nX3dhcm4oIiVzOiBncm93aW5nIGlvdiBhcnJheSB0byAlZDsgIgorCQkJCQkgICJ3aWR0aCAlZCwgaGVpZ2h0ICVkLCBzaXplICVsdSIsCisJCQkJCSAgX19mdW5jX18sIGlvdl9hbGxvYywgd2lkdGgsIGhlaWdodCwKKwkJCQkJICAodV9sb25nKSBiLT5zaXplKTsKKwkJCQlpb3YgPQorCQkJCSAgICBYUkVBTExPQyhNVFlQRV9UTVAsIGlvdiwKKwkJCQkJICAgICBpb3ZfYWxsb2MgKiBzaXplb2YoKmlvdikpOworCQkJfSBlbHNlIHsKKwkJCQkvKiBUaGlzIHNob3VsZCBhYnNvbHV0ZWx5IG5ldmVyIG9jY3VyLiAqLworCQkJCXpsb2dfZXJyCisJCQkJICAgICgiJXM6IGNvcnJ1cHRpb24gZGV0ZWN0ZWQ6IGlvdl9zbWFsbCBvdmVyZmxvd2VkOyAiCisJCQkJICAgICAiaGVhZCAlcCwgdGFpbCAlcCwgaGVhZC0+bmV4dCAlcCIsCisJCQkJICAgICBfX2Z1bmNfXywgYi0+aGVhZCwgYi0+dGFpbCwgYi0+aGVhZC0+bmV4dCk7CisJCQkJaW92ID0KKwkJCQkgICAgWE1BTExPQyhNVFlQRV9UTVAsCisJCQkJCSAgICBpb3ZfYWxsb2MgKiBzaXplb2YoKmlvdikpOworCQkJCW1lbWNweShpb3YsIHNtYWxsX2lvdiwgc2l6ZW9mKHNtYWxsX2lvdikpOworCQkJfQorCQl9CisJfQorCisJLyogSW4gY2FzZSBvZiBgbW9yZScgZGlzcGxheSBuZWVkLiAqLworCWlmIChiLT50YWlsICYmIChiLT50YWlsLT5zcCA8IGItPnRhaWwtPmNwKSAmJiAhbm9fbW9yZV9mbGFnKSB7CisJCWlvdltpb3ZfaW5kZXhdLmlvdl9iYXNlID0gbW9yZTsKKwkJaW92W2lvdl9pbmRleF0uaW92X2xlbiA9IHNpemVvZiBtb3JlOworCQlpb3ZfaW5kZXgrKzsKKwl9CisjaWZkZWYgSU9WX01BWAorCS8qIElPVl9NQVggYXJlIG5vcm1hbGx5IGRlZmluZWQgaW4gPHN5cy91aW8uaD4gLCBQb3NpeC4xZy4KKwkgICBleGFtcGxlOiBTb2xhcmlzMi42IGFyZSBkZWZpbmVkIElPVl9NQVggc2l6ZSBhdCAxNi4gICAgICovCisJeworCQlzdHJ1Y3QgaW92ZWMgKmNfaW92ID0gaW92OworCQluYnl0ZXMgPSAwOwkvKiBNYWtlIHN1cmUgaXQncyBpbml0aWFsaXplZC4gKi8KKworCQl3aGlsZSAoaW92X2luZGV4ID4gMCkgeworCQkJaW50IGlvdl9zaXplOworCisJCQlpb3Zfc2l6ZSA9CisJCQkgICAgKChpb3ZfaW5kZXggPiBJT1ZfTUFYKSA/IElPVl9NQVggOiBpb3ZfaW5kZXgpOworCQkJaWYgKChuYnl0ZXMgPSB3cml0ZXYoZmQsIGNfaW92LCBpb3Zfc2l6ZSkpIDwgMCkgeworCQkJCXpsb2dfd2FybigiJXM6IHdyaXRldiB0byBmZCAlZCBmYWlsZWQ6ICVzIiwKKwkJCQkJICBfX2Z1bmNfXywgZmQsIHNhZmVfc3RyZXJyb3IoZXJybm8pKTsKKwkJCQlicmVhazsKKwkJCX0KKworCQkJLyogbW92ZSBwb2ludGVyIGlvLXZlY3RvciAqLworCQkJY19pb3YgKz0gaW92X3NpemU7CisJCQlpb3ZfaW5kZXggLT0gaW92X3NpemU7CisJCX0KKwl9CisjZWxzZQkJCQkvKiBJT1ZfTUFYICovCisJaWYgKChuYnl0ZXMgPSB3cml0ZXYoZmQsIGlvdiwgaW92X2luZGV4KSkgPCAwKQorCQl6bG9nX3dhcm4oIiVzOiB3cml0ZXYgdG8gZmQgJWQgZmFpbGVkOiAlcyIsCisJCQkgIF9fZnVuY19fLCBmZCwgc2FmZV9zdHJlcnJvcihlcnJubykpOworI2VuZGlmCQkJCS8qIElPVl9NQVggKi8KKworCS8qIEZyZWUgcHJpbnRlZCBidWZmZXIgZGF0YS4gKi8KKwl3aGlsZSAoYi0+aGVhZCAmJiAoYi0+aGVhZC0+c3AgPT0gYi0+aGVhZC0+Y3ApKSB7CisJCXN0cnVjdCBidWZmZXJfZGF0YSAqZGVsOworCQlpZiAoIShiLT5oZWFkID0gKGRlbCA9IGItPmhlYWQpLT5uZXh0KSkKKwkJCWItPnRhaWwgPSBOVUxMOworCQlCVUZGRVJfREFUQV9GUkVFKGRlbCk7CisJfQorCisJaWYgKGlvdiAhPSBzbWFsbF9pb3YpCisJCVhGUkVFKE1UWVBFX1RNUCwgaW92KTsKKworCXJldHVybiAobmJ5dGVzIDwgMCkgPyBCVUZGRVJfRVJST1IgOgorCSAgICAoYi0+aGVhZCA/IEJVRkZFUl9QRU5ESU5HIDogQlVGRkVSX0VNUFRZKTsKK30KKyNlbmRpZgorCisvKiBUaGlzIGZ1bmN0aW9uICh1bmxpa2Ugb3RoZXIgYnVmZmVyX2ZsdXNoKiBmdW5jdGlvbnMgYWJvdmUpIGlzIGRlc2lnbmVkCit0byB3b3JrIHdpdGggbm9uLWJsb2NraW5nIHNvY2tldHMuICBJdCBkb2VzIG5vdCBhdHRlbXB0IHRvIHdyaXRlIG91dAorYWxsIG9mIHRoZSBxdWV1ZWQgZGF0YSwganVzdCBhICJiaWciIGNodW5rLiAgSXQgcmV0dXJucyAwIGlmIGl0IHdhcworYWJsZSB0byBlbXB0eSBvdXQgdGhlIGJ1ZmZlcnMgY29tcGxldGVseSwgMSBpZiBtb3JlIGZsdXNoaW5nIGlzCityZXF1aXJlZCBsYXRlciwgb3IgLTEgb24gYSBmYXRhbCB3cml0ZSBlcnJvci4gKi8KK2J1ZmZlcl9zdGF0dXNfdCBidWZmZXJfZmx1c2hfYXZhaWxhYmxlKHN0cnVjdCBidWZmZXIgKiBiLCBpbnQgZmQpCit7CisKKy8qIFRoZXNlIGFyZSBqdXN0IHJlYXNvbmFibGUgdmFsdWVzIHRvIG1ha2Ugc3VyZSBhIHNpZ25pZmljYW50IGFtb3VudCBvZgorZGF0YSBpcyB3cml0dGVuLiAgVGhlcmUncyBubyBuZWVkIHRvIGdvIGNyYXp5IGFuZCB0cnkgdG8gd3JpdGUgaXQgYWxsCitpbiBvbmUgc2hvdC4gKi8KKyNpZmRlZiBJT1ZfTUFYCisjZGVmaW5lIE1BWF9DSFVOS1MgKChJT1ZfTUFYID49IDE2KSA/IDE2IDogSU9WX01BWCkKKyNlbHNlCisjZGVmaW5lIE1BWF9DSFVOS1MgMTYKKyNlbmRpZgorI2RlZmluZSBNQVhfRkxVU0ggMTMxMDcyCisKKwlzdHJ1Y3QgYnVmZmVyX2RhdGEgKmQ7CisJc2l6ZV90IHdyaXR0ZW47CisJc3RydWN0IGlvdmVjIGlvdltNQVhfQ0hVTktTXTsKKwlzaXplX3QgaW92Y250ID0gMDsKKwlzaXplX3QgbmJ5dGUgPSAwOworCisJZm9yIChkID0gYi0+aGVhZDsgZCAmJiAoaW92Y250IDwgTUFYX0NIVU5LUykgJiYgKG5ieXRlIDwgTUFYX0ZMVVNIKTsKKwkgICAgIGQgPSBkLT5uZXh0LCBpb3ZjbnQrKykgeworCQlpb3ZbaW92Y250XS5pb3ZfYmFzZSA9IGQtPmRhdGEgKyBkLT5zcDsKKwkJbmJ5dGUgKz0gKGlvdltpb3ZjbnRdLmlvdl9sZW4gPSBkLT5jcCAtIGQtPnNwKTsKKwl9CisKKwlpZiAoIW5ieXRlKQorCQkvKiBObyBkYXRhIHRvIGZsdXNoOiBzaG91bGQgd2UgaXNzdWUgYSB3YXJuaW5nIG1lc3NhZ2U/ICovCisJCXJldHVybiBCVUZGRVJfRU1QVFk7CisKKwkvKiBvbmx5IHBsYWNlIHdoZXJlIHdyaXR0ZW4gc2hvdWxkIGJlIHNpZ24gY29tcGFyZWQgKi8KKwlpZiAoKHNzaXplX3QpICh3cml0dGVuID0gd3JpdGV2KGZkLCBpb3YsIGlvdmNudCkpIDwgMCkgeworCQlpZiAoRVJSTk9fSU9fUkVUUlkoZXJybm8pKQorCQkJLyogQ2FsbGluZyBjb2RlIHNob3VsZCB0cnkgYWdhaW4gbGF0ZXIuICovCisJCQlyZXR1cm4gQlVGRkVSX1BFTkRJTkc7CisJCXJldHVybiBCVUZGRVJfRVJST1I7CisJfQorCisJLyogRnJlZSBwcmludGVkIGJ1ZmZlciBkYXRhLiAqLworCXdoaWxlICh3cml0dGVuID4gMCkgeworCQlzdHJ1Y3QgYnVmZmVyX2RhdGEgKmQ7CisJCWlmICghKGQgPSBiLT5oZWFkKSkKKwkJCWJyZWFrOworCQlpZiAod3JpdHRlbiA8IGQtPmNwIC0gZC0+c3ApIHsKKwkJCWQtPnNwICs9IHdyaXR0ZW47CisJCQlyZXR1cm4gQlVGRkVSX1BFTkRJTkc7CisJCX0KKworCQl3cml0dGVuIC09IChkLT5jcCAtIGQtPnNwKTsKKwkJaWYgKCEoYi0+aGVhZCA9IGQtPm5leHQpKQorCQkJYi0+dGFpbCA9IE5VTEw7CisJCUJVRkZFUl9EQVRBX0ZSRUUoZCk7CisJfQorCisJcmV0dXJuIGItPmhlYWQgPyBCVUZGRVJfUEVORElORyA6IEJVRkZFUl9FTVBUWTsKKworI3VuZGVmIE1BWF9DSFVOS1MKKyN1bmRlZiBNQVhfRkxVU0gKK30KKworYnVmZmVyX3N0YXR1c190CitidWZmZXJfd3JpdGUoc3RydWN0IGJ1ZmZlciAqIGIsIGludCBmZCwgY29uc3Qgdm9pZCAqcCwgc2l6ZV90IHNpemUpCit7CisJc3NpemVfdCBuYnl0ZXM7CisKKyNpZiAwCisJLyogU2hvdWxkIHdlIGF0dGVtcHQgdG8gZHJhaW4gYW55IHByZXZpb3VzbHkgYnVmZmVyZWQgZGF0YT8gIFRoaXMgY291bGQgaGVscCByZWR1Y2UgbGF0ZW5jeSBpbiBwdXNoaW5nIG91dCB0aGUgZGF0YSBpZiB3ZSBhcmUgc3R1Y2sgaW4gYSBsb25nLXJ1bm5pbmcgdGhyZWFkIHRoYXQgaXMgcHJldmVudGluZyB0aGUgbWFpbiBzZWxlY3QgbG9vcCBmcm9tIGNhbGxpbmcgdGhlIGZsdXNoIHRocmVhZC4uLiAqLworCisJaWYgKGItPmhlYWQgJiYgKGJ1ZmZlcl9mbHVzaF9hdmFpbGFibGUoYiwgZmQpID09IEJVRkZFUl9FUlJPUikpCisJCXJldHVybiBCVUZGRVJfRVJST1I7CisjZW5kaWYKKwlpZiAoYi0+aGVhZCkKKwkJLyogQnVmZmVyIGlzIG5vdCBlbXB0eSwgc28gZG8gbm90IGF0dGVtcHQgdG8gd3JpdGUgdGhlIG5ldyBkYXRhLiAqLworCQluYnl0ZXMgPSAwOworCWVsc2UgaWYgKChuYnl0ZXMgPSB3cml0ZShmZCwgcCwgc2l6ZSkpIDwgMCkgeworCQlpZiAoRVJSTk9fSU9fUkVUUlkoZXJybm8pKQorCQkJbmJ5dGVzID0gMDsKKwkJZWxzZQorCQkJcmV0dXJuIEJVRkZFUl9FUlJPUjsKKwl9CisJLyogQWRkIGFueSByZW1haW5pbmcgZGF0YSB0byB0aGUgYnVmZmVyLiAqLworCXsKKwkJc2l6ZV90IHdyaXR0ZW4gPSBuYnl0ZXM7CisJCWlmICh3cml0dGVuIDwgc2l6ZSkKKwkJCWJ1ZmZlcl9wdXQoYiwgKChjb25zdCBjaGFyICopcCkgKyB3cml0dGVuLAorCQkJCSAgIHNpemUgLSB3cml0dGVuKTsKKwl9CisJcmV0dXJuIGItPmhlYWQgPyBCVUZGRVJfUEVORElORyA6IEJVRkZFUl9FTVBUWTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3Z0eS9jYXJkc2hlbGwuaCBiL29wZW5ic2Mvc3JjL3Z0eS9jYXJkc2hlbGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOTYzYTM4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdnR5L2NhcmRzaGVsbC5oCkBAIC0wLDAgKzEsNSBAQAorI2RlZmluZSBRVUFHR0FfUFJPR05BTUUJIk9wZW5CU0MiCisjZGVmaW5lIFFVQUdHQV9WRVJTSU9OCSIwLjAxIgorI2RlZmluZSBRVUFHR0FfQ09QWVJJR0hUICJIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPiIKKyNkZWZpbmUgQ09ORklHRklMRV9NQVNLIDAyMgorI2RlZmluZSBTWVNDT05GRElSICIvdXNyL2xvY2FsL2V0YyIKZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3Z0eS9jb21tYW5kLmMgYi9vcGVuYnNjL3NyYy92dHkvY29tbWFuZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYWVkMzUKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3NyYy92dHkvY29tbWFuZC5jCkBAIC0wLDAgKzEsMzQxMSBAQAorLyoKKyAgICRJZDogY29tbWFuZC5jLHYgMS40NyAyMDA1LzA0LzI1IDE2OjI2OjQyIHBhdWwgRXhwICQKKworICAgQ29tbWFuZCBpbnRlcnByZXRlciByb3V0aW5lIGZvciB2aXJ0dWFsIHRlcm1pbmFsIFtha2EgVGVsZXRZcGVdCisgICBDb3B5cmlnaHQgKEMpIDE5OTcsIDk4LCA5OSBLdW5paGlybyBJc2hpZ3VybworCitUaGlzIGZpbGUgaXMgcGFydCBvZiBHTlUgWmVicmEuCisKK0dOVSBaZWJyYSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CitpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZAorYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIKK29wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisKK0dOVSBaZWJyYSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQKK1dJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKK01FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCitHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisKK1lvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCithbG9uZyB3aXRoIEdOVSBaZWJyYTsgc2VlIHRoZSBmaWxlIENPUFlJTkcuICBJZiBub3QsIHdyaXRlIHRvIHRoZQorRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsCitCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4gICovCisKKyNpbmNsdWRlICJjYXJkc2hlbGwuaCIKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzbG9nLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNkZWZpbmUgX1hPUEVOX1NPVVJDRQorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8dGltZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKworLy8jaW5jbHVkZSAibWVtb3J5LmgiCisvLyNpbmNsdWRlICJsb2cuaCIKKy8vI2luY2x1ZGUgPGxpYi92ZXJzaW9uLmg+CisvLyNpbmNsdWRlICJ0aHJlYWQuaCIKKyNpbmNsdWRlIDx2dHkvdmVjdG9yLmg+CisjaW5jbHVkZSA8dnR5L3Z0eS5oPgorI2luY2x1ZGUgPHZ0eS9jb21tYW5kLmg+CisvLyNpbmNsdWRlICJ3b3JrcXVldWUuaCIKKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2dzbV9zdWJzY3JpYmVyLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKK3ZvaWQgKnRhbGxfdnR5X2NtZF9jdHg7CisKKy8qIENvbW1hbmQgdmVjdG9yIHdoaWNoIGluY2x1ZGVzIHNvbWUgbGV2ZWwgb2YgY29tbWFuZCBsaXN0cy4gTm9ybWFsbHkKKyAgIGVhY2ggZGFlbW9uIG1haW50YWlucyBlYWNoIG93biBjbWR2ZWMuICovCit2ZWN0b3IgY21kdmVjOworCisvKiBIb3N0IGluZm9ybWF0aW9uIHN0cnVjdHVyZS4gKi8KK3N0cnVjdCBob3N0IGhvc3Q7CisKKy8qIFN0YW5kYXJkIGNvbW1hbmQgbm9kZSBzdHJ1Y3R1cmVzLiAqLworc3RydWN0IGNtZF9ub2RlIGF1dGhfbm9kZSA9IHsKKwlBVVRIX05PREUsCisJIlBhc3N3b3JkOiAiLAorfTsKKworc3RydWN0IGNtZF9ub2RlIHZpZXdfbm9kZSA9IHsKKwlWSUVXX05PREUsCisJIiVzPiAiLAorfTsKKworc3RydWN0IGNtZF9ub2RlIGF1dGhfZW5hYmxlX25vZGUgPSB7CisJQVVUSF9FTkFCTEVfTk9ERSwKKwkiUGFzc3dvcmQ6ICIsCit9OworCitzdHJ1Y3QgY21kX25vZGUgZW5hYmxlX25vZGUgPSB7CisJRU5BQkxFX05PREUsCisJIiVzIyAiLAorfTsKKworc3RydWN0IGNtZF9ub2RlIGNvbmZpZ19ub2RlID0geworCUNPTkZJR19OT0RFLAorCSIlcyhjb25maWcpIyAiLAorCTEKK307CisKKy8qIERlZmF1bHQgbW90ZCBzdHJpbmcuICovCitjb25zdCBjaGFyICpkZWZhdWx0X21vdGQgPSAiXHJcblwKK0hlbGxvLCB0aGlzIGlzICIgUVVBR0dBX1BST0dOQU1FICIgKHZlcnNpb24gIiBRVUFHR0FfVkVSU0lPTiAiKS5cclxuXAorIiBRVUFHR0FfQ09QWVJJR0hUICJcclxuXAorXHJcbiI7CisKKyNpZiAwCitzdGF0aWMgc3RydWN0IGZhY2lsaXR5X21hcCB7CisJaW50IGZhY2lsaXR5OworCWNvbnN0IGNoYXIgKm5hbWU7CisJc2l6ZV90IG1hdGNoOworfSBzeXNsb2dfZmFjaWxpdGllc1tdID0geworCXsKKwlMT0dfS0VSTiwgImtlcm4iLCAxfSwgeworCUxPR19VU0VSLCAidXNlciIsIDJ9LCB7CisJTE9HX01BSUwsICJtYWlsIiwgMX0sIHsKKwlMT0dfREFFTU9OLCAiZGFlbW9uIiwgMX0sIHsKKwlMT0dfQVVUSCwgImF1dGgiLCAxfSwgeworCUxPR19TWVNMT0csICJzeXNsb2ciLCAxfSwgeworCUxPR19MUFIsICJscHIiLCAyfSwgeworCUxPR19ORVdTLCAibmV3cyIsIDF9LCB7CisJTE9HX1VVQ1AsICJ1dWNwIiwgMn0sIHsKKwlMT0dfQ1JPTiwgImNyb24iLCAxfSwKKyNpZmRlZiBMT0dfRlRQCisJeworCUxPR19GVFAsICJmdHAiLCAxfSwKKyNlbmRpZgorCXsKKwlMT0dfTE9DQUwwLCAibG9jYWwwIiwgNn0sIHsKKwlMT0dfTE9DQUwxLCAibG9jYWwxIiwgNn0sIHsKKwlMT0dfTE9DQUwyLCAibG9jYWwyIiwgNn0sIHsKKwlMT0dfTE9DQUwzLCAibG9jYWwzIiwgNn0sIHsKKwlMT0dfTE9DQUw0LCAibG9jYWw0IiwgNn0sIHsKKwlMT0dfTE9DQUw1LCAibG9jYWw1IiwgNn0sIHsKKwlMT0dfTE9DQUw2LCAibG9jYWw2IiwgNn0sIHsKKwlMT0dfTE9DQUw3LCAibG9jYWw3IiwgNn0sIHsKKzAsIE5VTEwsIDB9LH07CisKK3N0YXRpYyBjb25zdCBjaGFyICpmYWNpbGl0eV9uYW1lKGludCBmYWNpbGl0eSkKK3sKKwlzdHJ1Y3QgZmFjaWxpdHlfbWFwICpmbTsKKworCWZvciAoZm0gPSBzeXNsb2dfZmFjaWxpdGllczsgZm0tPm5hbWU7IGZtKyspCisJCWlmIChmbS0+ZmFjaWxpdHkgPT0gZmFjaWxpdHkpCisJCQlyZXR1cm4gZm0tPm5hbWU7CisJcmV0dXJuICIiOworfQorCitzdGF0aWMgaW50IGZhY2lsaXR5X21hdGNoKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlzdHJ1Y3QgZmFjaWxpdHlfbWFwICpmbTsKKworCWZvciAoZm0gPSBzeXNsb2dfZmFjaWxpdGllczsgZm0tPm5hbWU7IGZtKyspCisJCWlmICghc3RybmNtcChzdHIsIGZtLT5uYW1lLCBmbS0+bWF0Y2gpKQorCQkJcmV0dXJuIGZtLT5mYWNpbGl0eTsKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBpbnQgbGV2ZWxfbWF0Y2goY29uc3QgY2hhciAqcykKK3sKKwlpbnQgbGV2ZWw7CisKKwlmb3IgKGxldmVsID0gMDsgemxvZ19wcmlvcml0eVtsZXZlbF0gIT0gTlVMTDsgbGV2ZWwrKykKKwkJaWYgKCFzdHJuY21wKHMsIHpsb2dfcHJpb3JpdHlbbGV2ZWxdLCAyKSkKKwkJCXJldHVybiBsZXZlbDsKKwlyZXR1cm4gWkxPR19ESVNBQkxFRDsKK30KKyNlbmRpZgorCisvKiBUaGlzIGlzIGNhbGxlZCBmcm9tIG1haW4gd2hlbiBhIGRhZW1vbiBpcyBpbnZva2VkIHdpdGggLXYgb3IgLS12ZXJzaW9uLiAqLwordm9pZCBwcmludF92ZXJzaW9uKGNvbnN0IGNoYXIgKnByb2duYW1lKQoreworCXByaW50ZigiJXMgdmVyc2lvbiAlc1xuIiwgcHJvZ25hbWUsIFFVQUdHQV9WRVJTSU9OKTsKKwlwcmludGYoIiVzXG4iLCBRVUFHR0FfQ09QWVJJR0hUKTsKK30KKwwKKy8qIFV0aWxpdHkgZnVuY3Rpb24gdG8gY29uY2F0ZW5hdGUgYXJndiBhcmd1bWVudCBpbnRvIGEgc2luZ2xlIHN0cmluZworICAgd2l0aCBpbnNlcnRpbmcgJyAnIGNoYXJhY3RlciBiZXR3ZWVuIGVhY2ggYXJndW1lbnQuICAqLworY2hhciAqYXJndl9jb25jYXQoY29uc3QgY2hhciAqKmFyZ3YsIGludCBhcmdjLCBpbnQgc2hpZnQpCit7CisJaW50IGk7CisJc2l6ZV90IGxlbjsKKwljaGFyICpzdHI7CisJY2hhciAqcDsKKworCWxlbiA9IDA7CisJZm9yIChpID0gc2hpZnQ7IGkgPCBhcmdjOyBpKyspCisJCWxlbiArPSBzdHJsZW4oYXJndltpXSkgKyAxOworCWlmICghbGVuKQorCQlyZXR1cm4gTlVMTDsKKwlwID0gc3RyID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X2NtZF9jdHgsIGxlbiwgImFydmdfY29uY2F0Iik7CisJZm9yIChpID0gc2hpZnQ7IGkgPCBhcmdjOyBpKyspIHsKKwkJc2l6ZV90IGFyZ2xlbjsKKwkJbWVtY3B5KHAsIGFyZ3ZbaV0sIChhcmdsZW4gPSBzdHJsZW4oYXJndltpXSkpKTsKKwkJcCArPSBhcmdsZW47CisJCSpwKysgPSAnICc7CisJfQorCSoocCAtIDEpID0gJ1wwJzsKKwlyZXR1cm4gc3RyOworfQorCisvKiBJbnN0YWxsIHRvcCBub2RlIG9mIGNvbW1hbmQgdmVjdG9yLiAqLwordm9pZCBpbnN0YWxsX25vZGUoc3RydWN0IGNtZF9ub2RlICpub2RlLCBpbnQgKCpmdW5jKSAoc3RydWN0IHZ0eSAqKSkKK3sKKwl2ZWN0b3Jfc2V0X2luZGV4KGNtZHZlYywgbm9kZS0+bm9kZSwgbm9kZSk7CisJbm9kZS0+ZnVuYyA9IGZ1bmM7CisJbm9kZS0+Y21kX3ZlY3RvciA9IHZlY3Rvcl9pbml0KFZFQ1RPUl9NSU5fU0laRSk7Cit9CisKKy8qIENvbXBhcmUgdHdvIGNvbW1hbmQncyBzdHJpbmcuICBVc2VkIGluIHNvcnRfbm9kZSAoKS4gKi8KK3N0YXRpYyBpbnQgY21wX25vZGUoY29uc3Qgdm9pZCAqcCwgY29uc3Qgdm9pZCAqcSkKK3sKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmEgPSAqKHN0cnVjdCBjbWRfZWxlbWVudCAqKilwOworCXN0cnVjdCBjbWRfZWxlbWVudCAqYiA9ICooc3RydWN0IGNtZF9lbGVtZW50ICoqKXE7CisKKwlyZXR1cm4gc3RyY21wKGEtPnN0cmluZywgYi0+c3RyaW5nKTsKK30KKworc3RhdGljIGludCBjbXBfZGVzYyhjb25zdCB2b2lkICpwLCBjb25zdCB2b2lkICpxKQoreworCXN0cnVjdCBkZXNjICphID0gKihzdHJ1Y3QgZGVzYyAqKilwOworCXN0cnVjdCBkZXNjICpiID0gKihzdHJ1Y3QgZGVzYyAqKilxOworCisJcmV0dXJuIHN0cmNtcChhLT5jbWQsIGItPmNtZCk7Cit9CisKKy8qIFNvcnQgZWFjaCBub2RlJ3MgY29tbWFuZCBlbGVtZW50IGFjY29yZGluZyB0byBjb21tYW5kIHN0cmluZy4gKi8KK3ZvaWQgc29ydF9ub2RlKCkKK3sKKwl1bnNpZ25lZCBpbnQgaSwgajsKKwlzdHJ1Y3QgY21kX25vZGUgKmNub2RlOworCXZlY3RvciBkZXNjdmVjOworCXN0cnVjdCBjbWRfZWxlbWVudCAqY21kX2VsZW1lbnQ7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWR2ZWMpOyBpKyspCisJCWlmICgoY25vZGUgPSB2ZWN0b3Jfc2xvdChjbWR2ZWMsIGkpKSAhPSBOVUxMKSB7CisJCQl2ZWN0b3IgY21kX3ZlY3RvciA9IGNub2RlLT5jbWRfdmVjdG9yOworCQkJcXNvcnQoY21kX3ZlY3Rvci0+aW5kZXgsIHZlY3Rvcl9hY3RpdmUoY21kX3ZlY3RvciksCisJCQkgICAgICBzaXplb2Yodm9pZCAqKSwgY21wX25vZGUpOworCisJCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShjbWRfdmVjdG9yKTsgaisrKQorCQkJCWlmICgoY21kX2VsZW1lbnQgPQorCQkJCSAgICAgdmVjdG9yX3Nsb3QoY21kX3ZlY3RvciwgaikpICE9IE5VTEwKKwkJCQkgICAgJiYgdmVjdG9yX2FjdGl2ZShjbWRfZWxlbWVudC0+c3RydmVjKSkgeworCQkJCQlkZXNjdmVjID0KKwkJCQkJICAgIHZlY3Rvcl9zbG90KGNtZF9lbGVtZW50LT5zdHJ2ZWMsCisJCQkJCQkJdmVjdG9yX2FjdGl2ZQorCQkJCQkJCShjbWRfZWxlbWVudC0+c3RydmVjKSAtCisJCQkJCQkJMSk7CisJCQkJCXFzb3J0KGRlc2N2ZWMtPmluZGV4LAorCQkJCQkgICAgICB2ZWN0b3JfYWN0aXZlKGRlc2N2ZWMpLAorCQkJCQkgICAgICBzaXplb2Yodm9pZCAqKSwgY21wX2Rlc2MpOworCQkJCX0KKwkJfQorfQorCisvKiBCcmVha2luZyB1cCBzdHJpbmcgaW50byBlYWNoIGNvbW1hbmQgcGllY2UuIEkgYXNzdW1lIGdpdmVuCisgICBjaGFyYWN0ZXIgaXMgc2VwYXJhdGVkIGJ5IGEgc3BhY2UgY2hhcmFjdGVyLiBSZXR1cm4gdmFsdWUgaXMgYQorICAgdmVjdG9yIHdoaWNoIGluY2x1ZGVzIGNoYXIgKiogZGF0YSBlbGVtZW50LiAqLwordmVjdG9yIGNtZF9tYWtlX3N0cnZlYyhjb25zdCBjaGFyICpzdHJpbmcpCit7CisJY29uc3QgY2hhciAqY3AsICpzdGFydDsKKwljaGFyICp0b2tlbjsKKwlpbnQgc3RybGVuOworCXZlY3RvciBzdHJ2ZWM7CisKKwlpZiAoc3RyaW5nID09IE5VTEwpCisJCXJldHVybiBOVUxMOworCisJY3AgPSBzdHJpbmc7CisKKwkvKiBTa2lwIHdoaXRlIHNwYWNlcy4gKi8KKwl3aGlsZSAoaXNzcGFjZSgoaW50KSpjcCkgJiYgKmNwICE9ICdcMCcpCisJCWNwKys7CisKKwkvKiBSZXR1cm4gaWYgdGhlcmUgaXMgb25seSB3aGl0ZSBzcGFjZXMgKi8KKwlpZiAoKmNwID09ICdcMCcpCisJCXJldHVybiBOVUxMOworCisJaWYgKCpjcCA9PSAnIScgfHwgKmNwID09ICcjJykKKwkJcmV0dXJuIE5VTEw7CisKKwkvKiBQcmVwYXJlIHJldHVybiB2ZWN0b3IuICovCisJc3RydmVjID0gdmVjdG9yX2luaXQoVkVDVE9SX01JTl9TSVpFKTsKKworCS8qIENvcHkgZWFjaCBjb21tYW5kIHBpZWNlIGFuZCBzZXQgaW50byB2ZWN0b3IuICovCisJd2hpbGUgKDEpIHsKKwkJc3RhcnQgPSBjcDsKKwkJd2hpbGUgKCEoaXNzcGFjZSgoaW50KSpjcCkgfHwgKmNwID09ICdccicgfHwgKmNwID09ICdcbicpICYmCisJCSAgICAgICAqY3AgIT0gJ1wwJykKKwkJCWNwKys7CisJCXN0cmxlbiA9IGNwIC0gc3RhcnQ7CisJCXRva2VuID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X2NtZF9jdHgsIHN0cmxlbiArIDEsICJtYWtlX3N0cnZlYyIpOworCQltZW1jcHkodG9rZW4sIHN0YXJ0LCBzdHJsZW4pOworCQkqKHRva2VuICsgc3RybGVuKSA9ICdcMCc7CisJCXZlY3Rvcl9zZXQoc3RydmVjLCB0b2tlbik7CisKKwkJd2hpbGUgKChpc3NwYWNlKChpbnQpKmNwKSB8fCAqY3AgPT0gJ1xuJyB8fCAqY3AgPT0gJ1xyJykgJiYKKwkJICAgICAgICpjcCAhPSAnXDAnKQorCQkJY3ArKzsKKworCQlpZiAoKmNwID09ICdcMCcpCisJCQlyZXR1cm4gc3RydmVjOworCX0KK30KKworLyogRnJlZSBhbGxvY2F0ZWQgc3RyaW5nIHZlY3Rvci4gKi8KK3ZvaWQgY21kX2ZyZWVfc3RydmVjKHZlY3RvciB2KQoreworCXVuc2lnbmVkIGludCBpOworCWNoYXIgKmNwOworCisJaWYgKCF2KQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2KTsgaSsrKQorCQlpZiAoKGNwID0gdmVjdG9yX3Nsb3QodiwgaSkpICE9IE5VTEwpCisJCQl0YWxsb2NfZnJlZShjcCk7CisKKwl2ZWN0b3JfZnJlZSh2KTsKK30KKworLyogRmV0Y2ggbmV4dCBkZXNjcmlwdGlvbi4gIFVzZWQgaW4gY21kX21ha2VfZGVzY3ZlYygpLiAqLworc3RhdGljIGNoYXIgKmNtZF9kZXNjX3N0cihjb25zdCBjaGFyICoqc3RyaW5nKQoreworCWNvbnN0IGNoYXIgKmNwLCAqc3RhcnQ7CisJY2hhciAqdG9rZW47CisJaW50IHN0cmxlbjsKKworCWNwID0gKnN0cmluZzsKKworCWlmIChjcCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCS8qIFNraXAgd2hpdGUgc3BhY2VzLiAqLworCXdoaWxlIChpc3NwYWNlKChpbnQpKmNwKSAmJiAqY3AgIT0gJ1wwJykKKwkJY3ArKzsKKworCS8qIFJldHVybiBpZiB0aGVyZSBpcyBvbmx5IHdoaXRlIHNwYWNlcyAqLworCWlmICgqY3AgPT0gJ1wwJykKKwkJcmV0dXJuIE5VTEw7CisKKwlzdGFydCA9IGNwOworCisJd2hpbGUgKCEoKmNwID09ICdccicgfHwgKmNwID09ICdcbicpICYmICpjcCAhPSAnXDAnKQorCQljcCsrOworCisJc3RybGVuID0gY3AgLSBzdGFydDsKKwl0b2tlbiA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jbWRfY3R4LCBzdHJsZW4gKyAxLCAiY21kX2Rlc2Nfc3RyIik7CisJbWVtY3B5KHRva2VuLCBzdGFydCwgc3RybGVuKTsKKwkqKHRva2VuICsgc3RybGVuKSA9ICdcMCc7CisKKwkqc3RyaW5nID0gY3A7CisKKwlyZXR1cm4gdG9rZW47Cit9CisKKy8qIE5ldyBzdHJpbmcgdmVjdG9yLiAqLworc3RhdGljIHZlY3RvciBjbWRfbWFrZV9kZXNjdmVjKGNvbnN0IGNoYXIgKnN0cmluZywgY29uc3QgY2hhciAqZGVzY3N0cikKK3sKKwlpbnQgbXVsdGlwbGUgPSAwOworCWNvbnN0IGNoYXIgKnNwOworCWNoYXIgKnRva2VuOworCWludCBsZW47CisJY29uc3QgY2hhciAqY3A7CisJY29uc3QgY2hhciAqZHA7CisJdmVjdG9yIGFsbHZlYzsKKwl2ZWN0b3Igc3RydmVjID0gTlVMTDsKKwlzdHJ1Y3QgZGVzYyAqZGVzYzsKKworCWNwID0gc3RyaW5nOworCWRwID0gZGVzY3N0cjsKKworCWlmIChjcCA9PSBOVUxMKQorCQlyZXR1cm4gTlVMTDsKKworCWFsbHZlYyA9IHZlY3Rvcl9pbml0KFZFQ1RPUl9NSU5fU0laRSk7CisKKwl3aGlsZSAoMSkgeworCQl3aGlsZSAoaXNzcGFjZSgoaW50KSpjcCkgJiYgKmNwICE9ICdcMCcpCisJCQljcCsrOworCisJCWlmICgqY3AgPT0gJygnKSB7CisJCQltdWx0aXBsZSA9IDE7CisJCQljcCsrOworCQl9CisJCWlmICgqY3AgPT0gJyknKSB7CisJCQltdWx0aXBsZSA9IDA7CisJCQljcCsrOworCQl9CisJCWlmICgqY3AgPT0gJ3wnKSB7CisJCQlpZiAoIW11bHRpcGxlKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJDb21tYW5kIHBhcnNlIGVycm9yITogJXNcbiIsCisJCQkJCXN0cmluZyk7CisJCQkJZXhpdCgxKTsKKwkJCX0KKwkJCWNwKys7CisJCX0KKworCQl3aGlsZSAoaXNzcGFjZSgoaW50KSpjcCkgJiYgKmNwICE9ICdcMCcpCisJCQljcCsrOworCisJCWlmICgqY3AgPT0gJygnKSB7CisJCQltdWx0aXBsZSA9IDE7CisJCQljcCsrOworCQl9CisKKwkJaWYgKCpjcCA9PSAnXDAnKQorCQkJcmV0dXJuIGFsbHZlYzsKKworCQlzcCA9IGNwOworCisJCXdoaWxlICghCisJCSAgICAgICAoaXNzcGFjZSgoaW50KSpjcCkgfHwgKmNwID09ICdccicgfHwgKmNwID09ICdcbicKKwkJCXx8ICpjcCA9PSAnKScgfHwgKmNwID09ICd8JykgJiYgKmNwICE9ICdcMCcpCisJCQljcCsrOworCisJCWxlbiA9IGNwIC0gc3A7CisKKwkJdG9rZW4gPSBfdGFsbG9jX3plcm8odGFsbF92dHlfY21kX2N0eCwgbGVuICsgMSwgImNtZF9tYWtlX2Rlc2N2ZWMiKTsKKwkJbWVtY3B5KHRva2VuLCBzcCwgbGVuKTsKKwkJKih0b2tlbiArIGxlbikgPSAnXDAnOworCisJCWRlc2MgPSB0YWxsb2NfemVybyh0YWxsX3Z0eV9jbWRfY3R4LCBzdHJ1Y3QgZGVzYyk7CisJCWRlc2MtPmNtZCA9IHRva2VuOworCQlkZXNjLT5zdHIgPSBjbWRfZGVzY19zdHIoJmRwKTsKKworCQlpZiAobXVsdGlwbGUpIHsKKwkJCWlmIChtdWx0aXBsZSA9PSAxKSB7CisJCQkJc3RydmVjID0gdmVjdG9yX2luaXQoVkVDVE9SX01JTl9TSVpFKTsKKwkJCQl2ZWN0b3Jfc2V0KGFsbHZlYywgc3RydmVjKTsKKwkJCX0KKwkJCW11bHRpcGxlKys7CisJCX0gZWxzZSB7CisJCQlzdHJ2ZWMgPSB2ZWN0b3JfaW5pdChWRUNUT1JfTUlOX1NJWkUpOworCQkJdmVjdG9yX3NldChhbGx2ZWMsIHN0cnZlYyk7CisJCX0KKwkJdmVjdG9yX3NldChzdHJ2ZWMsIGRlc2MpOworCX0KK30KKworLyogQ291bnQgbWFuZGFudG9yeSBzdHJpbmcgdmVjdG9yIHNpemUuICBUaGlzIGlzIHRvIGRldGVybWluZSBpbnB1dGVkCisgICBjb21tYW5kIGhhcyBlbm91Z2ggY29tbWFuZCBsZW5ndGguICovCitzdGF0aWMgaW50IGNtZF9jbWRzaXplKHZlY3RvciBzdHJ2ZWMpCit7CisJdW5zaWduZWQgaW50IGk7CisJaW50IHNpemUgPSAwOworCXZlY3RvciBkZXNjdmVjOworCXN0cnVjdCBkZXNjICpkZXNjOworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoc3RydmVjKTsgaSsrKQorCQlpZiAoKGRlc2N2ZWMgPSB2ZWN0b3Jfc2xvdChzdHJ2ZWMsIGkpKSAhPSBOVUxMKSB7CisJCQlpZiAoKHZlY3Rvcl9hY3RpdmUoZGVzY3ZlYykpID09IDEKKwkJCSAgICAmJiAoZGVzYyA9IHZlY3Rvcl9zbG90KGRlc2N2ZWMsIDApKSAhPSBOVUxMKSB7CisJCQkJaWYgKGRlc2MtPmNtZCA9PSBOVUxMIHx8IENNRF9PUFRJT04oZGVzYy0+Y21kKSkKKwkJCQkJcmV0dXJuIHNpemU7CisJCQkJZWxzZQorCQkJCQlzaXplKys7CisJCQl9IGVsc2UKKwkJCQlzaXplKys7CisJCX0KKwlyZXR1cm4gc2l6ZTsKK30KKworLyogUmV0dXJuIHByb21wdCBjaGFyYWN0ZXIgb2Ygc3BlY2lmaWVkIG5vZGUuICovCitjb25zdCBjaGFyICpjbWRfcHJvbXB0KGVudW0gbm9kZV90eXBlIG5vZGUpCit7CisJc3RydWN0IGNtZF9ub2RlICpjbm9kZTsKKworCWNub2RlID0gdmVjdG9yX3Nsb3QoY21kdmVjLCBub2RlKTsKKwlyZXR1cm4gY25vZGUtPnByb21wdDsKK30KKworLyogSW5zdGFsbCBhIGNvbW1hbmQgaW50byBhIG5vZGUuICovCit2b2lkIGluc3RhbGxfZWxlbWVudChlbnVtIG5vZGVfdHlwZSBudHlwZSwgc3RydWN0IGNtZF9lbGVtZW50ICpjbWQpCit7CisJc3RydWN0IGNtZF9ub2RlICpjbm9kZTsKKworCWNub2RlID0gdmVjdG9yX3Nsb3QoY21kdmVjLCBudHlwZSk7CisKKwlpZiAoY25vZGUgPT0gTlVMTCkgeworCQlmcHJpbnRmKHN0ZGVyciwKKwkJCSJDb21tYW5kIG5vZGUgJWQgZG9lc24ndCBleGlzdCwgcGxlYXNlIGNoZWNrIGl0XG4iLAorCQkJbnR5cGUpOworCQlleGl0KDEpOworCX0KKworCXZlY3Rvcl9zZXQoY25vZGUtPmNtZF92ZWN0b3IsIGNtZCk7CisKKwljbWQtPnN0cnZlYyA9IGNtZF9tYWtlX2Rlc2N2ZWMoY21kLT5zdHJpbmcsIGNtZC0+ZG9jKTsKKwljbWQtPmNtZHNpemUgPSBjbWRfY21kc2l6ZShjbWQtPnN0cnZlYyk7Cit9CisKKyNpZmRlZiBWVFlfQ1JZUFRfUFcKK3N0YXRpYyB1bnNpZ25lZCBjaGFyIGl0b2E2NFtdID0KKyAgICAiLi8wMTIzNDU2Nzg5QUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7CisKK3N0YXRpYyB2b2lkIHRvNjQoY2hhciAqcywgbG9uZyB2LCBpbnQgbikKK3sKKwl3aGlsZSAoLS1uID49IDApIHsKKwkJKnMrKyA9IGl0b2E2NFt2ICYgMHgzZl07CisJCXYgPj49IDY7CisJfQorfQorCitzdGF0aWMgY2hhciAqemVuY3J5cHQoY29uc3QgY2hhciAqcGFzc3dkKQoreworCWNoYXIgc2FsdFs2XTsKKwlzdHJ1Y3QgdGltZXZhbCB0djsKKwljaGFyICpjcnlwdChjb25zdCBjaGFyICosIGNvbnN0IGNoYXIgKik7CisKKwlnZXR0aW1lb2ZkYXkoJnR2LCAwKTsKKworCXRvNjQoJnNhbHRbMF0sIHJhbmRvbSgpLCAzKTsKKwl0bzY0KCZzYWx0WzNdLCB0di50dl91c2VjLCAzKTsKKwlzYWx0WzVdID0gJ1wwJzsKKworCXJldHVybiBjcnlwdChwYXNzd2QsIHNhbHQpOworfQorI2VuZGlmCisKKy8qIFRoaXMgZnVuY3Rpb24gd3JpdGUgY29uZmlndXJhdGlvbiBvZiB0aGlzIGhvc3QuICovCitzdGF0aWMgaW50IGNvbmZpZ193cml0ZV9ob3N0KHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpZiAoaG9zdC5uYW1lKQorCQl2dHlfb3V0KHZ0eSwgImhvc3RuYW1lICVzJXMiLCBob3N0Lm5hbWUsIFZUWV9ORVdMSU5FKTsKKworCWlmIChob3N0LmVuY3J5cHQpIHsKKwkJaWYgKGhvc3QucGFzc3dvcmRfZW5jcnlwdCkKKwkJCXZ0eV9vdXQodnR5LCAicGFzc3dvcmQgOCAlcyVzIiwgaG9zdC5wYXNzd29yZF9lbmNyeXB0LAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJaWYgKGhvc3QuZW5hYmxlX2VuY3J5cHQpCisJCQl2dHlfb3V0KHZ0eSwgImVuYWJsZSBwYXNzd29yZCA4ICVzJXMiLAorCQkJCWhvc3QuZW5hYmxlX2VuY3J5cHQsIFZUWV9ORVdMSU5FKTsKKwl9IGVsc2UgeworCQlpZiAoaG9zdC5wYXNzd29yZCkKKwkJCXZ0eV9vdXQodnR5LCAicGFzc3dvcmQgJXMlcyIsIGhvc3QucGFzc3dvcmQsCisJCQkJVlRZX05FV0xJTkUpOworCQlpZiAoaG9zdC5lbmFibGUpCisJCQl2dHlfb3V0KHZ0eSwgImVuYWJsZSBwYXNzd29yZCAlcyVzIiwgaG9zdC5lbmFibGUsCisJCQkJVlRZX05FV0xJTkUpOworCX0KKworI2lmIDAKKwlpZiAoemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCAhPSBMT0dfREVCVUcpIHsKKwkJdnR5X291dCh2dHksICIhIE4uQi4gVGhlICdsb2cgdHJhcCcgY29tbWFuZCBpcyBkZXByZWNhdGVkLiVzIiwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICJsb2cgdHJhcCAlcyVzIiwKKwkJCXpsb2dfcHJpb3JpdHlbemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bF0sIFZUWV9ORVdMSU5FKTsKKwl9CisKKwlpZiAoaG9zdC5sb2dmaWxlCisJICAgICYmICh6bG9nX2RlZmF1bHQtPm1heGx2bFtaTE9HX0RFU1RfRklMRV0gIT0gWkxPR19ESVNBQkxFRCkpIHsKKwkJdnR5X291dCh2dHksICJsb2cgZmlsZSAlcyIsIGhvc3QubG9nZmlsZSk7CisJCWlmICh6bG9nX2RlZmF1bHQtPm1heGx2bFtaTE9HX0RFU1RfRklMRV0gIT0KKwkJICAgIHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwpCisJCQl2dHlfb3V0KHZ0eSwgIiAlcyIsCisJCQkJemxvZ19wcmlvcml0eVt6bG9nX2RlZmF1bHQtPgorCQkJCQkgICAgICBtYXhsdmxbWkxPR19ERVNUX0ZJTEVdXSk7CisJCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisJfQorCisJaWYgKHpsb2dfZGVmYXVsdC0+bWF4bHZsW1pMT0dfREVTVF9TVERPVVRdICE9IFpMT0dfRElTQUJMRUQpIHsKKwkJdnR5X291dCh2dHksICJsb2cgc3Rkb3V0Iik7CisJCWlmICh6bG9nX2RlZmF1bHQtPm1heGx2bFtaTE9HX0RFU1RfU1RET1VUXSAhPQorCQkgICAgemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCkKKwkJCXZ0eV9vdXQodnR5LCAiICVzIiwKKwkJCQl6bG9nX3ByaW9yaXR5W3psb2dfZGVmYXVsdC0+CisJCQkJCSAgICAgIG1heGx2bFtaTE9HX0RFU1RfU1RET1VUXV0pOworCQl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCX0KKworCWlmICh6bG9nX2RlZmF1bHQtPm1heGx2bFtaTE9HX0RFU1RfTU9OSVRPUl0gPT0gWkxPR19ESVNBQkxFRCkKKwkJdnR5X291dCh2dHksICJubyBsb2cgbW9uaXRvciVzIiwgVlRZX05FV0xJTkUpOworCWVsc2UgaWYgKHpsb2dfZGVmYXVsdC0+bWF4bHZsW1pMT0dfREVTVF9NT05JVE9SXSAhPQorCQkgemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCkKKwkJdnR5X291dCh2dHksICJsb2cgbW9uaXRvciAlcyVzIiwKKwkJCXpsb2dfcHJpb3JpdHlbemxvZ19kZWZhdWx0LT5tYXhsdmxbWkxPR19ERVNUX01PTklUT1JdXSwKKwkJCVZUWV9ORVdMSU5FKTsKKworCWlmICh6bG9nX2RlZmF1bHQtPm1heGx2bFtaTE9HX0RFU1RfU1lTTE9HXSAhPSBaTE9HX0RJU0FCTEVEKSB7CisJCXZ0eV9vdXQodnR5LCAibG9nIHN5c2xvZyIpOworCQlpZiAoemxvZ19kZWZhdWx0LT5tYXhsdmxbWkxPR19ERVNUX1NZU0xPR10gIT0KKwkJICAgIHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwpCisJCQl2dHlfb3V0KHZ0eSwgIiAlcyIsCisJCQkJemxvZ19wcmlvcml0eVt6bG9nX2RlZmF1bHQtPgorCQkJCQkgICAgICBtYXhsdmxbWkxPR19ERVNUX1NZU0xPR11dKTsKKwkJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKwl9CisKKwlpZiAoemxvZ19kZWZhdWx0LT5mYWNpbGl0eSAhPSBMT0dfREFFTU9OKQorCQl2dHlfb3V0KHZ0eSwgImxvZyBmYWNpbGl0eSAlcyVzIiwKKwkJCWZhY2lsaXR5X25hbWUoemxvZ19kZWZhdWx0LT5mYWNpbGl0eSksIFZUWV9ORVdMSU5FKTsKKworCWlmICh6bG9nX2RlZmF1bHQtPnJlY29yZF9wcmlvcml0eSA9PSAxKQorCQl2dHlfb3V0KHZ0eSwgImxvZyByZWNvcmQtcHJpb3JpdHklcyIsIFZUWV9ORVdMSU5FKTsKKyNlbmRpZgorCWlmIChob3N0LmFkdmFuY2VkKQorCQl2dHlfb3V0KHZ0eSwgInNlcnZpY2UgYWR2YW5jZWQtdnR5JXMiLCBWVFlfTkVXTElORSk7CisKKwlpZiAoaG9zdC5lbmNyeXB0KQorCQl2dHlfb3V0KHZ0eSwgInNlcnZpY2UgcGFzc3dvcmQtZW5jcnlwdGlvbiVzIiwgVlRZX05FV0xJTkUpOworCisJaWYgKGhvc3QubGluZXMgPj0gMCkKKwkJdnR5X291dCh2dHksICJzZXJ2aWNlIHRlcm1pbmFsLWxlbmd0aCAlZCVzIiwgaG9zdC5saW5lcywKKwkJCVZUWV9ORVdMSU5FKTsKKworCWlmIChob3N0Lm1vdGRmaWxlKQorCQl2dHlfb3V0KHZ0eSwgImJhbm5lciBtb3RkIGZpbGUgJXMlcyIsIGhvc3QubW90ZGZpbGUsCisJCQlWVFlfTkVXTElORSk7CisJZWxzZSBpZiAoIWhvc3QubW90ZCkKKwkJdnR5X291dCh2dHksICJubyBiYW5uZXIgbW90ZCVzIiwgVlRZX05FV0xJTkUpOworCisJcmV0dXJuIDE7Cit9CisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gZm9yIGdldHRpbmcgY29tbWFuZCB2ZWN0b3IuICovCitzdGF0aWMgdmVjdG9yIGNtZF9ub2RlX3ZlY3Rvcih2ZWN0b3IgdiwgZW51bSBub2RlX3R5cGUgbnR5cGUpCit7CisJc3RydWN0IGNtZF9ub2RlICpjbm9kZSA9IHZlY3Rvcl9zbG90KHYsIG50eXBlKTsKKwlyZXR1cm4gY25vZGUtPmNtZF92ZWN0b3I7Cit9CisKKyNpZiAwCisvKiBGaWx0ZXIgY29tbWFuZCB2ZWN0b3IgYnkgc3ltYm9sLiAgVGhpcyBmdW5jdGlvbiBpcyBub3QgYWN0dWFsbHkgdXNlZDsKKyAqIHNob3VsZCBpdCBiZSBkZWxldGVkPyAqLworc3RhdGljIGludCBjbWRfZmlsdGVyX2J5X3N5bWJvbChjaGFyICpjb21tYW5kLCBjaGFyICpzeW1ib2wpCit7CisJaW50IGksIGxpbTsKKworCWlmIChzdHJjbXAoc3ltYm9sLCAiSVBWNF9BRERSRVNTIikgPT0gMCkgeworCQlpID0gMDsKKwkJbGltID0gc3RybGVuKGNvbW1hbmQpOworCQl3aGlsZSAoaSA8IGxpbSkgeworCQkJaWYgKCEKKwkJCSAgICAoaXNkaWdpdCgoaW50KWNvbW1hbmRbaV0pIHx8IGNvbW1hbmRbaV0gPT0gJy4nCisJCQkgICAgIHx8IGNvbW1hbmRbaV0gPT0gJy8nKSkKKwkJCQlyZXR1cm4gMTsKKwkJCWkrKzsKKwkJfQorCQlyZXR1cm4gMDsKKwl9CisJaWYgKHN0cmNtcChzeW1ib2wsICJTVFJJTkciKSA9PSAwKSB7CisJCWkgPSAwOworCQlsaW0gPSBzdHJsZW4oY29tbWFuZCk7CisJCXdoaWxlIChpIDwgbGltKSB7CisJCQlpZiAoIQorCQkJICAgIChpc2FscGhhKChpbnQpY29tbWFuZFtpXSkgfHwgY29tbWFuZFtpXSA9PSAnXycKKwkJCSAgICAgfHwgY29tbWFuZFtpXSA9PSAnLScpKQorCQkJCXJldHVybiAxOworCQkJaSsrOworCQl9CisJCXJldHVybiAwOworCX0KKwlpZiAoc3RyY21wKHN5bWJvbCwgIklGTkFNRSIpID09IDApIHsKKwkJaSA9IDA7CisJCWxpbSA9IHN0cmxlbihjb21tYW5kKTsKKwkJd2hpbGUgKGkgPCBsaW0pIHsKKwkJCWlmICghaXNhbG51bSgoaW50KWNvbW1hbmRbaV0pKQorCQkJCXJldHVybiAxOworCQkJaSsrOworCQl9CisJCXJldHVybiAwOworCX0KKwlyZXR1cm4gMDsKK30KKyNlbmRpZgorCisvKiBDb21wbGV0aW9uIG1hdGNoIHR5cGVzLiAqLworZW51bSBtYXRjaF90eXBlIHsKKwlub19tYXRjaCwKKwlleHRlbmRfbWF0Y2gsCisJaXB2NF9wcmVmaXhfbWF0Y2gsCisJaXB2NF9tYXRjaCwKKwlpcHY2X3ByZWZpeF9tYXRjaCwKKwlpcHY2X21hdGNoLAorCXJhbmdlX21hdGNoLAorCXZhcmFyZ19tYXRjaCwKKwlwYXJ0bHlfbWF0Y2gsCisJZXhhY3RfbWF0Y2gKK307CisKK3N0YXRpYyBlbnVtIG1hdGNoX3R5cGUgY21kX2lwdjRfbWF0Y2goY29uc3QgY2hhciAqc3RyKQoreworCWNvbnN0IGNoYXIgKnNwOworCWludCBkb3RzID0gMCwgbnVtcyA9IDA7CisJY2hhciBidWZbNF07CisKKwlpZiAoc3RyID09IE5VTEwpCisJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisKKwlmb3IgKDs7KSB7CisJCW1lbXNldChidWYsIDAsIHNpemVvZihidWYpKTsKKwkJc3AgPSBzdHI7CisJCXdoaWxlICgqc3RyICE9ICdcMCcpIHsKKwkJCWlmICgqc3RyID09ICcuJykgeworCQkJCWlmIChkb3RzID49IDMpCisJCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJCWlmICgqKHN0ciArIDEpID09ICcuJykKKwkJCQkJcmV0dXJuIG5vX21hdGNoOworCisJCQkJaWYgKCooc3RyICsgMSkgPT0gJ1wwJykKKwkJCQkJcmV0dXJuIHBhcnRseV9tYXRjaDsKKworCQkJCWRvdHMrKzsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWlmICghaXNkaWdpdCgoaW50KSpzdHIpKQorCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJc3RyKys7CisJCX0KKworCQlpZiAoc3RyIC0gc3AgPiAzKQorCQkJcmV0dXJuIG5vX21hdGNoOworCisJCXN0cm5jcHkoYnVmLCBzcCwgc3RyIC0gc3ApOworCQlpZiAoYXRvaShidWYpID4gMjU1KQorCQkJcmV0dXJuIG5vX21hdGNoOworCisJCW51bXMrKzsKKworCQlpZiAoKnN0ciA9PSAnXDAnKQorCQkJYnJlYWs7CisKKwkJc3RyKys7CisJfQorCisJaWYgKG51bXMgPCA0KQorCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJcmV0dXJuIGV4YWN0X21hdGNoOworfQorCitzdGF0aWMgZW51bSBtYXRjaF90eXBlIGNtZF9pcHY0X3ByZWZpeF9tYXRjaChjb25zdCBjaGFyICpzdHIpCit7CisJY29uc3QgY2hhciAqc3A7CisJaW50IGRvdHMgPSAwOworCWNoYXIgYnVmWzRdOworCisJaWYgKHN0ciA9PSBOVUxMKQorCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJZm9yICg7OykgeworCQltZW1zZXQoYnVmLCAwLCBzaXplb2YoYnVmKSk7CisJCXNwID0gc3RyOworCQl3aGlsZSAoKnN0ciAhPSAnXDAnICYmICpzdHIgIT0gJy8nKSB7CisJCQlpZiAoKnN0ciA9PSAnLicpIHsKKwkJCQlpZiAoZG90cyA9PSAzKQorCQkJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJCQlpZiAoKihzdHIgKyAxKSA9PSAnLicgfHwgKihzdHIgKyAxKSA9PSAnLycpCisJCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJCWlmICgqKHN0ciArIDEpID09ICdcMCcpCisJCQkJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisKKwkJCQlkb3RzKys7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWlmICghaXNkaWdpdCgoaW50KSpzdHIpKQorCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJc3RyKys7CisJCX0KKworCQlpZiAoc3RyIC0gc3AgPiAzKQorCQkJcmV0dXJuIG5vX21hdGNoOworCisJCXN0cm5jcHkoYnVmLCBzcCwgc3RyIC0gc3ApOworCQlpZiAoYXRvaShidWYpID4gMjU1KQorCQkJcmV0dXJuIG5vX21hdGNoOworCisJCWlmIChkb3RzID09IDMpIHsKKwkJCWlmICgqc3RyID09ICcvJykgeworCQkJCWlmICgqKHN0ciArIDEpID09ICdcMCcpCisJCQkJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisKKwkJCQlzdHIrKzsKKwkJCQlicmVhazsKKwkJCX0gZWxzZSBpZiAoKnN0ciA9PSAnXDAnKQorCQkJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisJCX0KKworCQlpZiAoKnN0ciA9PSAnXDAnKQorCQkJcmV0dXJuIHBhcnRseV9tYXRjaDsKKworCQlzdHIrKzsKKwl9CisKKwlzcCA9IHN0cjsKKwl3aGlsZSAoKnN0ciAhPSAnXDAnKSB7CisJCWlmICghaXNkaWdpdCgoaW50KSpzdHIpKQorCQkJcmV0dXJuIG5vX21hdGNoOworCisJCXN0cisrOworCX0KKworCWlmIChhdG9pKHNwKSA+IDMyKQorCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwlyZXR1cm4gZXhhY3RfbWF0Y2g7Cit9CisKKyNkZWZpbmUgSVBWNl9BRERSX1NUUgkJIjAxMjM0NTY3ODlhYmNkZWZBQkNERUY6LiUiCisjZGVmaW5lIElQVjZfUFJFRklYX1NUUgkJIjAxMjM0NTY3ODlhYmNkZWZBQkNERUY6LiUvIgorI2RlZmluZSBTVEFURV9TVEFSVAkJMQorI2RlZmluZSBTVEFURV9DT0xPTgkJMgorI2RlZmluZSBTVEFURV9ET1VCTEUJCTMKKyNkZWZpbmUgU1RBVEVfQUREUgkJNAorI2RlZmluZSBTVEFURV9ET1QgICAgICAgICAgICAgICA1CisjZGVmaW5lIFNUQVRFX1NMQVNICQk2CisjZGVmaW5lIFNUQVRFX01BU0sJCTcKKworI2lmZGVmIEhBVkVfSVBWNgorCitzdGF0aWMgZW51bSBtYXRjaF90eXBlIGNtZF9pcHY2X21hdGNoKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpbnQgc3RhdGUgPSBTVEFURV9TVEFSVDsKKwlpbnQgY29sb25zID0gMCwgbnVtcyA9IDAsIGRvdWJsZV9jb2xvbiA9IDA7CisJY29uc3QgY2hhciAqc3AgPSBOVUxMOworCXN0cnVjdCBzb2NrYWRkcl9pbjYgc2luNl9kdW1teTsKKwlpbnQgcmV0OworCisJaWYgKHN0ciA9PSBOVUxMKQorCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJaWYgKHN0cnNwbihzdHIsIElQVjZfQUREUl9TVFIpICE9IHN0cmxlbihzdHIpKQorCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkvKiB1c2UgaW5ldF9wdG9uIHRoYXQgaGFzIGEgYmV0dGVyIHN1cHBvcnQsCisJICogZm9yIGV4YW1wbGUgaW5ldF9wdG9uIGNhbiBzdXBwb3J0IHRoZSBhdXRvbWF0aWMgYWRkcmVzc2VzOgorCSAqICA6OjEuMi4zLjQKKwkgKi8KKwlyZXQgPSBpbmV0X3B0b24oQUZfSU5FVDYsIHN0ciwgJnNpbjZfZHVtbXkuc2luNl9hZGRyKTsKKworCWlmIChyZXQgPT0gMSkKKwkJcmV0dXJuIGV4YWN0X21hdGNoOworCisJd2hpbGUgKCpzdHIgIT0gJ1wwJykgeworCQlzd2l0Y2ggKHN0YXRlKSB7CisJCWNhc2UgU1RBVEVfU1RBUlQ6CisJCQlpZiAoKnN0ciA9PSAnOicpIHsKKwkJCQlpZiAoKihzdHIgKyAxKSAhPSAnOicgJiYgKihzdHIgKyAxKSAhPSAnXDAnKQorCQkJCQlyZXR1cm4gbm9fbWF0Y2g7CisJCQkJY29sb25zLS07CisJCQkJc3RhdGUgPSBTVEFURV9DT0xPTjsKKwkJCX0gZWxzZSB7CisJCQkJc3AgPSBzdHI7CisJCQkJc3RhdGUgPSBTVEFURV9BRERSOworCQkJfQorCisJCQljb250aW51ZTsKKwkJY2FzZSBTVEFURV9DT0xPTjoKKwkJCWNvbG9ucysrOworCQkJaWYgKCooc3RyICsgMSkgPT0gJzonKQorCQkJCXN0YXRlID0gU1RBVEVfRE9VQkxFOworCQkJZWxzZSB7CisJCQkJc3AgPSBzdHIgKyAxOworCQkJCXN0YXRlID0gU1RBVEVfQUREUjsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNUQVRFX0RPVUJMRToKKwkJCWlmIChkb3VibGVfY29sb24pCisJCQkJcmV0dXJuIG5vX21hdGNoOworCisJCQlpZiAoKihzdHIgKyAxKSA9PSAnOicpCisJCQkJcmV0dXJuIG5vX21hdGNoOworCQkJZWxzZSB7CisJCQkJaWYgKCooc3RyICsgMSkgIT0gJ1wwJykKKwkJCQkJY29sb25zKys7CisJCQkJc3AgPSBzdHIgKyAxOworCQkJCXN0YXRlID0gU1RBVEVfQUREUjsKKwkJCX0KKworCQkJZG91YmxlX2NvbG9uKys7CisJCQludW1zKys7CisJCQlicmVhazsKKwkJY2FzZSBTVEFURV9BRERSOgorCQkJaWYgKCooc3RyICsgMSkgPT0gJzonIHx8ICooc3RyICsgMSkgPT0gJ1wwJykgeworCQkJCWlmIChzdHIgLSBzcCA+IDMpCisJCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJCW51bXMrKzsKKwkJCQlzdGF0ZSA9IFNUQVRFX0NPTE9OOworCQkJfQorCQkJaWYgKCooc3RyICsgMSkgPT0gJy4nKQorCQkJCXN0YXRlID0gU1RBVEVfRE9UOworCQkJYnJlYWs7CisJCWNhc2UgU1RBVEVfRE9UOgorCQkJc3RhdGUgPSBTVEFURV9BRERSOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlicmVhazsKKwkJfQorCisJCWlmIChudW1zID4gOCkKKwkJCXJldHVybiBub19tYXRjaDsKKworCQlpZiAoY29sb25zID4gNykKKwkJCXJldHVybiBub19tYXRjaDsKKworCQlzdHIrKzsKKwl9CisKKyNpZiAwCisJaWYgKG51bXMgPCAxMSkKKwkJcmV0dXJuIHBhcnRseV9tYXRjaDsKKyNlbmRpZgkJCQkvKiAwICovCisKKwlyZXR1cm4gZXhhY3RfbWF0Y2g7Cit9CisKK3N0YXRpYyBlbnVtIG1hdGNoX3R5cGUgY21kX2lwdjZfcHJlZml4X21hdGNoKGNvbnN0IGNoYXIgKnN0cikKK3sKKwlpbnQgc3RhdGUgPSBTVEFURV9TVEFSVDsKKwlpbnQgY29sb25zID0gMCwgbnVtcyA9IDAsIGRvdWJsZV9jb2xvbiA9IDA7CisJaW50IG1hc2s7CisJY29uc3QgY2hhciAqc3AgPSBOVUxMOworCWNoYXIgKmVuZHB0ciA9IE5VTEw7CisKKwlpZiAoc3RyID09IE5VTEwpCisJCXJldHVybiBwYXJ0bHlfbWF0Y2g7CisKKwlpZiAoc3Ryc3BuKHN0ciwgSVBWNl9QUkVGSVhfU1RSKSAhPSBzdHJsZW4oc3RyKSkKKwkJcmV0dXJuIG5vX21hdGNoOworCisJd2hpbGUgKCpzdHIgIT0gJ1wwJyAmJiBzdGF0ZSAhPSBTVEFURV9NQVNLKSB7CisJCXN3aXRjaCAoc3RhdGUpIHsKKwkJY2FzZSBTVEFURV9TVEFSVDoKKwkJCWlmICgqc3RyID09ICc6JykgeworCQkJCWlmICgqKHN0ciArIDEpICE9ICc6JyAmJiAqKHN0ciArIDEpICE9ICdcMCcpCisJCQkJCXJldHVybiBub19tYXRjaDsKKwkJCQljb2xvbnMtLTsKKwkJCQlzdGF0ZSA9IFNUQVRFX0NPTE9OOworCQkJfSBlbHNlIHsKKwkJCQlzcCA9IHN0cjsKKwkJCQlzdGF0ZSA9IFNUQVRFX0FERFI7CisJCQl9CisKKwkJCWNvbnRpbnVlOworCQljYXNlIFNUQVRFX0NPTE9OOgorCQkJY29sb25zKys7CisJCQlpZiAoKihzdHIgKyAxKSA9PSAnLycpCisJCQkJcmV0dXJuIG5vX21hdGNoOworCQkJZWxzZSBpZiAoKihzdHIgKyAxKSA9PSAnOicpCisJCQkJc3RhdGUgPSBTVEFURV9ET1VCTEU7CisJCQllbHNlIHsKKwkJCQlzcCA9IHN0ciArIDE7CisJCQkJc3RhdGUgPSBTVEFURV9BRERSOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgU1RBVEVfRE9VQkxFOgorCQkJaWYgKGRvdWJsZV9jb2xvbikKKwkJCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwkJCWlmICgqKHN0ciArIDEpID09ICc6JykKKwkJCQlyZXR1cm4gbm9fbWF0Y2g7CisJCQllbHNlIHsKKwkJCQlpZiAoKihzdHIgKyAxKSAhPSAnXDAnICYmICooc3RyICsgMSkgIT0gJy8nKQorCQkJCQljb2xvbnMrKzsKKwkJCQlzcCA9IHN0ciArIDE7CisKKwkJCQlpZiAoKihzdHIgKyAxKSA9PSAnLycpCisJCQkJCXN0YXRlID0gU1RBVEVfU0xBU0g7CisJCQkJZWxzZQorCQkJCQlzdGF0ZSA9IFNUQVRFX0FERFI7CisJCQl9CisKKwkJCWRvdWJsZV9jb2xvbisrOworCQkJbnVtcyArPSAxOworCQkJYnJlYWs7CisJCWNhc2UgU1RBVEVfQUREUjoKKwkJCWlmICgqKHN0ciArIDEpID09ICc6JyB8fCAqKHN0ciArIDEpID09ICcuJworCQkJICAgIHx8ICooc3RyICsgMSkgPT0gJ1wwJyB8fCAqKHN0ciArIDEpID09ICcvJykgeworCQkJCWlmIChzdHIgLSBzcCA+IDMpCisJCQkJCXJldHVybiBub19tYXRjaDsKKworCQkJCWZvciAoOyBzcCA8PSBzdHI7IHNwKyspCisJCQkJCWlmICgqc3AgPT0gJy8nKQorCQkJCQkJcmV0dXJuIG5vX21hdGNoOworCisJCQkJbnVtcysrOworCisJCQkJaWYgKCooc3RyICsgMSkgPT0gJzonKQorCQkJCQlzdGF0ZSA9IFNUQVRFX0NPTE9OOworCQkJCWVsc2UgaWYgKCooc3RyICsgMSkgPT0gJy4nKQorCQkJCQlzdGF0ZSA9IFNUQVRFX0RPVDsKKwkJCQllbHNlIGlmICgqKHN0ciArIDEpID09ICcvJykKKwkJCQkJc3RhdGUgPSBTVEFURV9TTEFTSDsKKwkJCX0KKwkJCWJyZWFrOworCQljYXNlIFNUQVRFX0RPVDoKKwkJCXN0YXRlID0gU1RBVEVfQUREUjsKKwkJCWJyZWFrOworCQljYXNlIFNUQVRFX1NMQVNIOgorCQkJaWYgKCooc3RyICsgMSkgPT0gJ1wwJykKKwkJCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJCQlzdGF0ZSA9IFNUQVRFX01BU0s7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWJyZWFrOworCQl9CisKKwkJaWYgKG51bXMgPiAxMSkKKwkJCXJldHVybiBub19tYXRjaDsKKworCQlpZiAoY29sb25zID4gNykKKwkJCXJldHVybiBub19tYXRjaDsKKworCQlzdHIrKzsKKwl9CisKKwlpZiAoc3RhdGUgPCBTVEFURV9NQVNLKQorCQlyZXR1cm4gcGFydGx5X21hdGNoOworCisJbWFzayA9IHN0cnRvbChzdHIsICZlbmRwdHIsIDEwKTsKKwlpZiAoKmVuZHB0ciAhPSAnXDAnKQorCQlyZXR1cm4gbm9fbWF0Y2g7CisKKwlpZiAobWFzayA8IDAgfHwgbWFzayA+IDEyOCkKKwkJcmV0dXJuIG5vX21hdGNoOworCisvKiBJIGRvbid0IGtub3cgd2h5IG1hc2sgPCAxMyBtYWtlcyBjb21tYW5kIG1hdGNoIHBhcnRseS4KKyAgIEZvcmdpdmUgbWUgdG8gbWFrZSB0aGlzIGNvbW1lbnRzLiBJIFdhbnQgdG8gc2V0IHN0YXRpYyBkZWZhdWx0IHJvdXRlCisgICBiZWNhdXNlIG9mIGxhY2sgb2YgZnVuY3Rpb24gdG8gb3JpZ2luYXRlIGRlZmF1bHQgaW4gb3NwZjZkOyBzb3JyeQorICAgICAgIHlhc3UKKyAgaWYgKG1hc2sgPCAxMykKKyAgICByZXR1cm4gcGFydGx5X21hdGNoOworKi8KKworCXJldHVybiBleGFjdF9tYXRjaDsKK30KKworI2VuZGlmCQkJCS8qIEhBVkVfSVBWNiAgKi8KKworI2RlZmluZSBERUNJTUFMX1NUUkxFTl9NQVggMTAKKworc3RhdGljIGludCBjbWRfcmFuZ2VfbWF0Y2goY29uc3QgY2hhciAqcmFuZ2UsIGNvbnN0IGNoYXIgKnN0cikKK3sKKwljaGFyICpwOworCWNoYXIgYnVmW0RFQ0lNQUxfU1RSTEVOX01BWCArIDFdOworCWNoYXIgKmVuZHB0ciA9IE5VTEw7CisJdW5zaWduZWQgbG9uZyBtaW4sIG1heCwgdmFsOworCisJaWYgKHN0ciA9PSBOVUxMKQorCQlyZXR1cm4gMTsKKworCXZhbCA9IHN0cnRvdWwoc3RyLCAmZW5kcHRyLCAxMCk7CisJaWYgKCplbmRwdHIgIT0gJ1wwJykKKwkJcmV0dXJuIDA7CisKKwlyYW5nZSsrOworCXAgPSBzdHJjaHIocmFuZ2UsICctJyk7CisJaWYgKHAgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisJaWYgKHAgLSByYW5nZSA+IERFQ0lNQUxfU1RSTEVOX01BWCkKKwkJcmV0dXJuIDA7CisJc3RybmNweShidWYsIHJhbmdlLCBwIC0gcmFuZ2UpOworCWJ1ZltwIC0gcmFuZ2VdID0gJ1wwJzsKKwltaW4gPSBzdHJ0b3VsKGJ1ZiwgJmVuZHB0ciwgMTApOworCWlmICgqZW5kcHRyICE9ICdcMCcpCisJCXJldHVybiAwOworCisJcmFuZ2UgPSBwICsgMTsKKwlwID0gc3RyY2hyKHJhbmdlLCAnPicpOworCWlmIChwID09IE5VTEwpCisJCXJldHVybiAwOworCWlmIChwIC0gcmFuZ2UgPiBERUNJTUFMX1NUUkxFTl9NQVgpCisJCXJldHVybiAwOworCXN0cm5jcHkoYnVmLCByYW5nZSwgcCAtIHJhbmdlKTsKKwlidWZbcCAtIHJhbmdlXSA9ICdcMCc7CisJbWF4ID0gc3RydG91bChidWYsICZlbmRwdHIsIDEwKTsKKwlpZiAoKmVuZHB0ciAhPSAnXDAnKQorCQlyZXR1cm4gMDsKKworCWlmICh2YWwgPCBtaW4gfHwgdmFsID4gbWF4KQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCisvKiBNYWtlIGNvbXBsZXRpb24gbWF0Y2ggYW5kIHJldHVybiBtYXRjaCB0eXBlIGZsYWcuICovCitzdGF0aWMgZW51bSBtYXRjaF90eXBlCitjbWRfZmlsdGVyX2J5X2NvbXBsZXRpb24oY2hhciAqY29tbWFuZCwgdmVjdG9yIHYsIHVuc2lnbmVkIGludCBpbmRleCkKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwljb25zdCBjaGFyICpzdHI7CisJc3RydWN0IGNtZF9lbGVtZW50ICpjbWRfZWxlbWVudDsKKwllbnVtIG1hdGNoX3R5cGUgbWF0Y2hfdHlwZTsKKwl2ZWN0b3IgZGVzY3ZlYzsKKwlzdHJ1Y3QgZGVzYyAqZGVzYzsKKworCW1hdGNoX3R5cGUgPSBub19tYXRjaDsKKworCS8qIElmIGNvbW1hbmQgYW5kIGNtZF9lbGVtZW50IHN0cmluZyBkb2VzIG5vdCBtYXRjaCBzZXQgTlVMTCB0byB2ZWN0b3IgKi8KKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2KTsgaSsrKQorCQlpZiAoKGNtZF9lbGVtZW50ID0gdmVjdG9yX3Nsb3QodiwgaSkpICE9IE5VTEwpIHsKKwkJCWlmIChpbmRleCA+PSB2ZWN0b3JfYWN0aXZlKGNtZF9lbGVtZW50LT5zdHJ2ZWMpKQorCQkJCXZlY3Rvcl9zbG90KHYsIGkpID0gTlVMTDsKKwkJCWVsc2UgeworCQkJCXVuc2lnbmVkIGludCBqOworCQkJCWludCBtYXRjaGVkID0gMDsKKworCQkJCWRlc2N2ZWMgPQorCQkJCSAgICB2ZWN0b3Jfc2xvdChjbWRfZWxlbWVudC0+c3RydmVjLCBpbmRleCk7CisKKwkJCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShkZXNjdmVjKTsgaisrKQorCQkJCQlpZiAoKGRlc2MgPSB2ZWN0b3Jfc2xvdChkZXNjdmVjLCBqKSkpIHsKKwkJCQkJCXN0ciA9IGRlc2MtPmNtZDsKKworCQkJCQkJaWYgKENNRF9WQVJBUkcoc3RyKSkgeworCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkgICAgdmFyYXJnX21hdGNoKQorCQkJCQkJCQltYXRjaF90eXBlID0KKwkJCQkJCQkJICAgIHZhcmFyZ19tYXRjaDsKKwkJCQkJCQltYXRjaGVkKys7CisJCQkJCQl9IGVsc2UgaWYgKENNRF9SQU5HRShzdHIpKSB7CisJCQkJCQkJaWYgKGNtZF9yYW5nZV9tYXRjaAorCQkJCQkJCSAgICAoc3RyLCBjb21tYW5kKSkgeworCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJCSAgICByYW5nZV9tYXRjaCkKKwkJCQkJCQkJCW1hdGNoX3R5cGUKKwkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkgICAgcmFuZ2VfbWF0Y2g7CisKKwkJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJCX0KKwkJCQkJCX0KKyNpZmRlZiBIQVZFX0lQVjYKKwkJCQkJCWVsc2UgaWYgKENNRF9JUFY2KHN0cikpIHsKKwkJCQkJCQlpZiAoY21kX2lwdjZfbWF0Y2gKKwkJCQkJCQkgICAgKGNvbW1hbmQpKSB7CisJCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkJICAgIGlwdjZfbWF0Y2gpCisJCQkJCQkJCQltYXRjaF90eXBlCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIGlwdjZfbWF0Y2g7CisKKwkJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSBpZiAoQ01EX0lQVjZfUFJFRklYKHN0cikpIHsKKwkJCQkJCQlpZiAoY21kX2lwdjZfcHJlZml4X21hdGNoKGNvbW1hbmQpKSB7CisJCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkJICAgIGlwdjZfcHJlZml4X21hdGNoKQorCQkJCQkJCQkJbWF0Y2hfdHlwZQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBpcHY2X3ByZWZpeF9tYXRjaDsKKworCQkJCQkJCQltYXRjaGVkKys7CisJCQkJCQkJfQorCQkJCQkJfQorI2VuZGlmCQkJCS8qIEhBVkVfSVBWNiAgKi8KKwkJCQkJCWVsc2UgaWYgKENNRF9JUFY0KHN0cikpIHsKKwkJCQkJCQlpZiAoY21kX2lwdjRfbWF0Y2gKKwkJCQkJCQkgICAgKGNvbW1hbmQpKSB7CisJCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkJICAgIGlwdjRfbWF0Y2gpCisJCQkJCQkJCQltYXRjaF90eXBlCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIGlwdjRfbWF0Y2g7CisKKwkJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZSBpZiAoQ01EX0lQVjRfUFJFRklYKHN0cikpIHsKKwkJCQkJCQlpZiAoY21kX2lwdjRfcHJlZml4X21hdGNoKGNvbW1hbmQpKSB7CisJCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkJICAgIGlwdjRfcHJlZml4X21hdGNoKQorCQkJCQkJCQkJbWF0Y2hfdHlwZQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBpcHY0X3ByZWZpeF9tYXRjaDsKKwkJCQkJCQkJbWF0Y2hlZCsrOworCQkJCQkJCX0KKwkJCQkJCX0gZWxzZQorCQkJCQkJCS8qIENoZWNrIGlzIHRoaXMgcG9pbnQncyBhcmd1bWVudCBvcHRpb25hbCA/ICovCisJCQkJCQlpZiAoQ01EX09QVElPTihzdHIpCisJCQkJCQkJICAgIHx8CisJCQkJCQkJICAgIENNRF9WQVJJQUJMRShzdHIpKSB7CisJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAorCQkJCQkJCSAgICBleHRlbmRfbWF0Y2gpCisJCQkJCQkJCW1hdGNoX3R5cGUgPQorCQkJCQkJCQkgICAgZXh0ZW5kX21hdGNoOworCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCX0gZWxzZQorCQkJCQkJICAgIGlmIChzdHJuY21wCisJCQkJCQkJKGNvbW1hbmQsIHN0ciwKKwkJCQkJCQkgc3RybGVuKGNvbW1hbmQpKSA9PQorCQkJCQkJCTApIHsKKwkJCQkJCQlpZiAoc3RyY21wKGNvbW1hbmQsIHN0cikKKwkJCQkJCQkgICAgPT0gMCkKKwkJCQkJCQkJbWF0Y2hfdHlwZSA9CisJCQkJCQkJCSAgICBleGFjdF9tYXRjaDsKKwkJCQkJCQllbHNlIHsKKwkJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAorCQkJCQkJCQkgICAgcGFydGx5X21hdGNoKQorCQkJCQkJCQkJbWF0Y2hfdHlwZQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBwYXJ0bHlfbWF0Y2g7CisJCQkJCQkJfQorCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCWlmICghbWF0Y2hlZCkKKwkJCQkJdmVjdG9yX3Nsb3QodiwgaSkgPSBOVUxMOworCQkJfQorCQl9CisJcmV0dXJuIG1hdGNoX3R5cGU7Cit9CisKKy8qIEZpbHRlciB2ZWN0b3IgYnkgY29tbWFuZCBjaGFyYWN0ZXIgd2l0aCBpbmRleC4gKi8KK3N0YXRpYyBlbnVtIG1hdGNoX3R5cGUKK2NtZF9maWx0ZXJfYnlfc3RyaW5nKGNoYXIgKmNvbW1hbmQsIHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgaW5kZXgpCit7CisJdW5zaWduZWQgaW50IGk7CisJY29uc3QgY2hhciAqc3RyOworCXN0cnVjdCBjbWRfZWxlbWVudCAqY21kX2VsZW1lbnQ7CisJZW51bSBtYXRjaF90eXBlIG1hdGNoX3R5cGU7CisJdmVjdG9yIGRlc2N2ZWM7CisJc3RydWN0IGRlc2MgKmRlc2M7CisKKwltYXRjaF90eXBlID0gbm9fbWF0Y2g7CisKKwkvKiBJZiBjb21tYW5kIGFuZCBjbWRfZWxlbWVudCBzdHJpbmcgZG9lcyBub3QgbWF0Y2ggc2V0IE5VTEwgdG8gdmVjdG9yICovCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodik7IGkrKykKKwkJaWYgKChjbWRfZWxlbWVudCA9IHZlY3Rvcl9zbG90KHYsIGkpKSAhPSBOVUxMKSB7CisJCQkvKiBJZiBnaXZlbiBpbmRleCBpcyBiaWdnZXIgdGhhbiBtYXggc3RyaW5nIHZlY3RvciBvZiBjb21tYW5kLAorCQkJICAgc2V0IE5VTEwgKi8KKwkJCWlmIChpbmRleCA+PSB2ZWN0b3JfYWN0aXZlKGNtZF9lbGVtZW50LT5zdHJ2ZWMpKQorCQkJCXZlY3Rvcl9zbG90KHYsIGkpID0gTlVMTDsKKwkJCWVsc2UgeworCQkJCXVuc2lnbmVkIGludCBqOworCQkJCWludCBtYXRjaGVkID0gMDsKKworCQkJCWRlc2N2ZWMgPQorCQkJCSAgICB2ZWN0b3Jfc2xvdChjbWRfZWxlbWVudC0+c3RydmVjLCBpbmRleCk7CisKKwkJCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShkZXNjdmVjKTsgaisrKQorCQkJCQlpZiAoKGRlc2MgPSB2ZWN0b3Jfc2xvdChkZXNjdmVjLCBqKSkpIHsKKwkJCQkJCXN0ciA9IGRlc2MtPmNtZDsKKworCQkJCQkJaWYgKENNRF9WQVJBUkcoc3RyKSkgeworCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkgICAgdmFyYXJnX21hdGNoKQorCQkJCQkJCQltYXRjaF90eXBlID0KKwkJCQkJCQkJICAgIHZhcmFyZ19tYXRjaDsKKwkJCQkJCQltYXRjaGVkKys7CisJCQkJCQl9IGVsc2UgaWYgKENNRF9SQU5HRShzdHIpKSB7CisJCQkJCQkJaWYgKGNtZF9yYW5nZV9tYXRjaAorCQkJCQkJCSAgICAoc3RyLCBjb21tYW5kKSkgeworCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJCSAgICByYW5nZV9tYXRjaCkKKwkJCQkJCQkJCW1hdGNoX3R5cGUKKwkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkgICAgcmFuZ2VfbWF0Y2g7CisJCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCQl9CisJCQkJCQl9CisjaWZkZWYgSEFWRV9JUFY2CisJCQkJCQllbHNlIGlmIChDTURfSVBWNihzdHIpKSB7CisJCQkJCQkJaWYgKGNtZF9pcHY2X21hdGNoCisJCQkJCQkJICAgIChjb21tYW5kKSA9PQorCQkJCQkJCSAgICBleGFjdF9tYXRjaCkgeworCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJCSAgICBpcHY2X21hdGNoKQorCQkJCQkJCQkJbWF0Y2hfdHlwZQorCQkJCQkJCQkJICAgID0KKwkJCQkJCQkJCSAgICBpcHY2X21hdGNoOworCQkJCQkJCQltYXRjaGVkKys7CisJCQkJCQkJfQorCQkJCQkJfSBlbHNlIGlmIChDTURfSVBWNl9QUkVGSVgoc3RyKSkgeworCQkJCQkJCWlmIChjbWRfaXB2Nl9wcmVmaXhfbWF0Y2goY29tbWFuZCkgPT0gZXhhY3RfbWF0Y2gpIHsKKwkJCQkJCQkJaWYgKG1hdGNoX3R5cGUgPAorCQkJCQkJCQkgICAgaXB2Nl9wcmVmaXhfbWF0Y2gpCisJCQkJCQkJCQltYXRjaF90eXBlCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIGlwdjZfcHJlZml4X21hdGNoOworCQkJCQkJCQltYXRjaGVkKys7CisJCQkJCQkJfQorCQkJCQkJfQorI2VuZGlmCQkJCS8qIEhBVkVfSVBWNiAgKi8KKwkJCQkJCWVsc2UgaWYgKENNRF9JUFY0KHN0cikpIHsKKwkJCQkJCQlpZiAoY21kX2lwdjRfbWF0Y2gKKwkJCQkJCQkgICAgKGNvbW1hbmQpID09CisJCQkJCQkJICAgIGV4YWN0X21hdGNoKSB7CisJCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkJICAgIGlwdjRfbWF0Y2gpCisJCQkJCQkJCQltYXRjaF90eXBlCisJCQkJCQkJCQkgICAgPQorCQkJCQkJCQkJICAgIGlwdjRfbWF0Y2g7CisJCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgaWYgKENNRF9JUFY0X1BSRUZJWChzdHIpKSB7CisJCQkJCQkJaWYgKGNtZF9pcHY0X3ByZWZpeF9tYXRjaChjb21tYW5kKSA9PSBleGFjdF9tYXRjaCkgeworCQkJCQkJCQlpZiAobWF0Y2hfdHlwZSA8CisJCQkJCQkJCSAgICBpcHY0X3ByZWZpeF9tYXRjaCkKKwkJCQkJCQkJCW1hdGNoX3R5cGUKKwkJCQkJCQkJCSAgICA9CisJCQkJCQkJCQkgICAgaXB2NF9wcmVmaXhfbWF0Y2g7CisJCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCQl9CisJCQkJCQl9IGVsc2UgaWYgKENNRF9PUFRJT04oc3RyKQorCQkJCQkJCSAgIHx8IENNRF9WQVJJQUJMRShzdHIpKQorCQkJCQkJeworCQkJCQkJCWlmIChtYXRjaF90eXBlIDwKKwkJCQkJCQkgICAgZXh0ZW5kX21hdGNoKQorCQkJCQkJCQltYXRjaF90eXBlID0KKwkJCQkJCQkJICAgIGV4dGVuZF9tYXRjaDsKKwkJCQkJCQltYXRjaGVkKys7CisJCQkJCQl9IGVsc2UgeworCQkJCQkJCWlmIChzdHJjbXAoY29tbWFuZCwgc3RyKQorCQkJCQkJCSAgICA9PSAwKSB7CisJCQkJCQkJCW1hdGNoX3R5cGUgPQorCQkJCQkJCQkgICAgZXhhY3RfbWF0Y2g7CisJCQkJCQkJCW1hdGNoZWQrKzsKKwkJCQkJCQl9CisJCQkJCQl9CisJCQkJCX0KKwkJCQlpZiAoIW1hdGNoZWQpCisJCQkJCXZlY3Rvcl9zbG90KHYsIGkpID0gTlVMTDsKKwkJCX0KKwkJfQorCXJldHVybiBtYXRjaF90eXBlOworfQorCisvKiBDaGVjayBhbWJpZ3VvdXMgbWF0Y2ggKi8KK3N0YXRpYyBpbnQKK2lzX2NtZF9hbWJpZ3VvdXMoY2hhciAqY29tbWFuZCwgdmVjdG9yIHYsIGludCBpbmRleCwgZW51bSBtYXRjaF90eXBlIHR5cGUpCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IGo7CisJY29uc3QgY2hhciAqc3RyID0gTlVMTDsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZF9lbGVtZW50OworCWNvbnN0IGNoYXIgKm1hdGNoZWQgPSBOVUxMOworCXZlY3RvciBkZXNjdmVjOworCXN0cnVjdCBkZXNjICpkZXNjOworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodik7IGkrKykKKwkJaWYgKChjbWRfZWxlbWVudCA9IHZlY3Rvcl9zbG90KHYsIGkpKSAhPSBOVUxMKSB7CisJCQlpbnQgbWF0Y2ggPSAwOworCisJCQlkZXNjdmVjID0gdmVjdG9yX3Nsb3QoY21kX2VsZW1lbnQtPnN0cnZlYywgaW5kZXgpOworCisJCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShkZXNjdmVjKTsgaisrKQorCQkJCWlmICgoZGVzYyA9IHZlY3Rvcl9zbG90KGRlc2N2ZWMsIGopKSkgeworCQkJCQllbnVtIG1hdGNoX3R5cGUgcmV0OworCisJCQkJCXN0ciA9IGRlc2MtPmNtZDsKKworCQkJCQlzd2l0Y2ggKHR5cGUpIHsKKwkJCQkJY2FzZSBleGFjdF9tYXRjaDoKKwkJCQkJCWlmICghCisJCQkJCQkgICAgKENNRF9PUFRJT04oc3RyKQorCQkJCQkJICAgICB8fCBDTURfVkFSSUFCTEUoc3RyKSkKKyYmIHN0cmNtcChjb21tYW5kLCBzdHIpID09IDApCisJCQkJCQkJbWF0Y2grKzsKKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIHBhcnRseV9tYXRjaDoKKwkJCQkJCWlmICghCisJCQkJCQkgICAgKENNRF9PUFRJT04oc3RyKQorCQkJCQkJICAgICB8fCBDTURfVkFSSUFCTEUoc3RyKSkKKyYmIHN0cm5jbXAoY29tbWFuZCwgc3RyLCBzdHJsZW4oY29tbWFuZCkpID09IDApIHsKKwkJCQkJCQlpZiAobWF0Y2hlZAorCQkJCQkJCSAgICAmJiBzdHJjbXAobWF0Y2hlZCwKKwkJCQkJCQkJICAgICAgc3RyKSAhPSAwKQorCQkJCQkJCQlyZXR1cm4gMTsJLyogVGhlcmUgaXMgYW1iaWd1b3VzIG1hdGNoLiAqLworCQkJCQkJCWVsc2UKKwkJCQkJCQkJbWF0Y2hlZCA9IHN0cjsKKwkJCQkJCQltYXRjaCsrOworCQkJCQkJfQorCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgcmFuZ2VfbWF0Y2g6CisJCQkJCQlpZiAoY21kX3JhbmdlX21hdGNoCisJCQkJCQkgICAgKHN0ciwgY29tbWFuZCkpIHsKKwkJCQkJCQlpZiAobWF0Y2hlZAorCQkJCQkJCSAgICAmJiBzdHJjbXAobWF0Y2hlZCwKKwkJCQkJCQkJICAgICAgc3RyKSAhPSAwKQorCQkJCQkJCQlyZXR1cm4gMTsKKwkJCQkJCQllbHNlCisJCQkJCQkJCW1hdGNoZWQgPSBzdHI7CisJCQkJCQkJbWF0Y2grKzsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworI2lmZGVmIEhBVkVfSVBWNgorCQkJCQljYXNlIGlwdjZfbWF0Y2g6CisJCQkJCQlpZiAoQ01EX0lQVjYoc3RyKSkKKwkJCQkJCQltYXRjaCsrOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgaXB2Nl9wcmVmaXhfbWF0Y2g6CisJCQkJCQlpZiAoKHJldCA9CisJCQkJCQkgICAgIGNtZF9pcHY2X3ByZWZpeF9tYXRjaAorCQkJCQkJICAgICAoY29tbWFuZCkpICE9IG5vX21hdGNoKSB7CisJCQkJCQkJaWYgKHJldCA9PSBwYXJ0bHlfbWF0Y2gpCisJCQkJCQkJCXJldHVybiAyOwkvKiBUaGVyZSBpcyBpbmNvbXBsZXRlIG1hdGNoLiAqLworCisJCQkJCQkJbWF0Y2grKzsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworI2VuZGlmCQkJCS8qIEhBVkVfSVBWNiAqLworCQkJCQljYXNlIGlwdjRfbWF0Y2g6CisJCQkJCQlpZiAoQ01EX0lQVjQoc3RyKSkKKwkJCQkJCQltYXRjaCsrOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2UgaXB2NF9wcmVmaXhfbWF0Y2g6CisJCQkJCQlpZiAoKHJldCA9CisJCQkJCQkgICAgIGNtZF9pcHY0X3ByZWZpeF9tYXRjaAorCQkJCQkJICAgICAoY29tbWFuZCkpICE9IG5vX21hdGNoKSB7CisJCQkJCQkJaWYgKHJldCA9PSBwYXJ0bHlfbWF0Y2gpCisJCQkJCQkJCXJldHVybiAyOwkvKiBUaGVyZSBpcyBpbmNvbXBsZXRlIG1hdGNoLiAqLworCisJCQkJCQkJbWF0Y2grKzsKKwkJCQkJCX0KKwkJCQkJCWJyZWFrOworCQkJCQljYXNlIGV4dGVuZF9tYXRjaDoKKwkJCQkJCWlmIChDTURfT1BUSU9OKHN0cikKKwkJCQkJCSAgICB8fCBDTURfVkFSSUFCTEUoc3RyKSkKKwkJCQkJCQltYXRjaCsrOworCQkJCQkJYnJlYWs7CisJCQkJCWNhc2Ugbm9fbWF0Y2g6CisJCQkJCWRlZmF1bHQ6CisJCQkJCQlicmVhazsKKwkJCQkJfQorCQkJCX0KKwkJCWlmICghbWF0Y2gpCisJCQkJdmVjdG9yX3Nsb3QodiwgaSkgPSBOVUxMOworCQl9CisJcmV0dXJuIDA7Cit9CisKKy8qIElmIHNyYyBtYXRjaGVzIGRzdCByZXR1cm4gZHN0IHN0cmluZywgb3RoZXJ3aXNlIHJldHVybiBOVUxMICovCitzdGF0aWMgY29uc3QgY2hhciAqY21kX2VudHJ5X2Z1bmN0aW9uKGNvbnN0IGNoYXIgKnNyYywgY29uc3QgY2hhciAqZHN0KQoreworCS8qIFNraXAgdmFyaWFibGUgYXJndW1lbnRzLiAqLworCWlmIChDTURfT1BUSU9OKGRzdCkgfHwgQ01EX1ZBUklBQkxFKGRzdCkgfHwgQ01EX1ZBUkFSRyhkc3QpIHx8CisJICAgIENNRF9JUFY0KGRzdCkgfHwgQ01EX0lQVjRfUFJFRklYKGRzdCkgfHwgQ01EX1JBTkdFKGRzdCkpCisJCXJldHVybiBOVUxMOworCisJLyogSW4gY2FzZSBvZiAnY29tbWFuZCBcdCcsIGdpdmVuIHNyYyBpcyBOVUxMIHN0cmluZy4gKi8KKwlpZiAoc3JjID09IE5VTEwpCisJCXJldHVybiBkc3Q7CisKKwkvKiBNYXRjaGVkIHdpdGggaW5wdXQgc3RyaW5nLiAqLworCWlmIChzdHJuY21wKHNyYywgZHN0LCBzdHJsZW4oc3JjKSkgPT0gMCkKKwkJcmV0dXJuIGRzdDsKKworCXJldHVybiBOVUxMOworfQorCisvKiBJZiBzcmMgbWF0Y2hlcyBkc3QgcmV0dXJuIGRzdCBzdHJpbmcsIG90aGVyd2lzZSByZXR1cm4gTlVMTCAqLworLyogVGhpcyB2ZXJzaW9uIHdpbGwgcmV0dXJuIHRoZSBkc3Qgc3RyaW5nIGFsd2F5cyBpZiBpdCBpcworICAgQ01EX1ZBUklBQkxFIGZvciAnPycga2V5IHByb2Nlc3NpbmcgKi8KK3N0YXRpYyBjb25zdCBjaGFyICpjbWRfZW50cnlfZnVuY3Rpb25fZGVzYyhjb25zdCBjaGFyICpzcmMsIGNvbnN0IGNoYXIgKmRzdCkKK3sKKwlpZiAoQ01EX1ZBUkFSRyhkc3QpKQorCQlyZXR1cm4gZHN0OworCisJaWYgKENNRF9SQU5HRShkc3QpKSB7CisJCWlmIChjbWRfcmFuZ2VfbWF0Y2goZHN0LCBzcmMpKQorCQkJcmV0dXJuIGRzdDsKKwkJZWxzZQorCQkJcmV0dXJuIE5VTEw7CisJfQorI2lmZGVmIEhBVkVfSVBWNgorCWlmIChDTURfSVBWNihkc3QpKSB7CisJCWlmIChjbWRfaXB2Nl9tYXRjaChzcmMpKQorCQkJcmV0dXJuIGRzdDsKKwkJZWxzZQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKENNRF9JUFY2X1BSRUZJWChkc3QpKSB7CisJCWlmIChjbWRfaXB2Nl9wcmVmaXhfbWF0Y2goc3JjKSkKKwkJCXJldHVybiBkc3Q7CisJCWVsc2UKKwkJCXJldHVybiBOVUxMOworCX0KKyNlbmRpZgkJCQkvKiBIQVZFX0lQVjYgKi8KKworCWlmIChDTURfSVBWNChkc3QpKSB7CisJCWlmIChjbWRfaXB2NF9tYXRjaChzcmMpKQorCQkJcmV0dXJuIGRzdDsKKwkJZWxzZQorCQkJcmV0dXJuIE5VTEw7CisJfQorCisJaWYgKENNRF9JUFY0X1BSRUZJWChkc3QpKSB7CisJCWlmIChjbWRfaXB2NF9wcmVmaXhfbWF0Y2goc3JjKSkKKwkJCXJldHVybiBkc3Q7CisJCWVsc2UKKwkJCXJldHVybiBOVUxMOworCX0KKworCS8qIE9wdGlvbmFsIG9yIHZhcmlhYmxlIGNvbW1hbmRzIGFsd2F5cyBtYXRjaCBvbiAnPycgKi8KKwlpZiAoQ01EX09QVElPTihkc3QpIHx8IENNRF9WQVJJQUJMRShkc3QpKQorCQlyZXR1cm4gZHN0OworCisJLyogSW4gY2FzZSBvZiAnY29tbWFuZCBcdCcsIGdpdmVuIHNyYyBpcyBOVUxMIHN0cmluZy4gKi8KKwlpZiAoc3JjID09IE5VTEwpCisJCXJldHVybiBkc3Q7CisKKwlpZiAoc3RybmNtcChzcmMsIGRzdCwgc3RybGVuKHNyYykpID09IDApCisJCXJldHVybiBkc3Q7CisJZWxzZQorCQlyZXR1cm4gTlVMTDsKK30KKworLyogQ2hlY2sgc2FtZSBzdHJpbmcgZWxlbWVudCBleGlzdGVuY2UuICBJZiBpdCBpc24ndCB0aGVyZSByZXR1cm4KKyAgICAxLiAqLworc3RhdGljIGludCBjbWRfdW5pcXVlX3N0cmluZyh2ZWN0b3IgdiwgY29uc3QgY2hhciAqc3RyKQoreworCXVuc2lnbmVkIGludCBpOworCWNoYXIgKm1hdGNoOworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUodik7IGkrKykKKwkJaWYgKChtYXRjaCA9IHZlY3Rvcl9zbG90KHYsIGkpKSAhPSBOVUxMKQorCQkJaWYgKHN0cmNtcChtYXRjaCwgc3RyKSA9PSAwKQorCQkJCXJldHVybiAwOworCXJldHVybiAxOworfQorCisvKiBDb21wYXJlIHN0cmluZyB0byBkZXNjcmlwdGlvbiB2ZWN0b3IuICBJZiB0aGVyZSBpcyBzYW1lIHN0cmluZworICAgcmV0dXJuIDEgZWxzZSByZXR1cm4gMC4gKi8KK3N0YXRpYyBpbnQgZGVzY191bmlxdWVfc3RyaW5nKHZlY3RvciB2LCBjb25zdCBjaGFyICpzdHIpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGRlc2MgKmRlc2M7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2KTsgaSsrKQorCQlpZiAoKGRlc2MgPSB2ZWN0b3Jfc2xvdCh2LCBpKSkgIT0gTlVMTCkKKwkJCWlmIChzdHJjbXAoZGVzYy0+Y21kLCBzdHIpID09IDApCisJCQkJcmV0dXJuIDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgY21kX3RyeV9kb19zaG9ydGN1dChlbnVtIG5vZGVfdHlwZSBub2RlLCBjaGFyICpmaXJzdF93b3JkKQoreworCWlmIChmaXJzdF93b3JkICE9IE5VTEwgJiYKKwkgICAgbm9kZSAhPSBBVVRIX05PREUgJiYKKwkgICAgbm9kZSAhPSBWSUVXX05PREUgJiYKKwkgICAgbm9kZSAhPSBBVVRIX0VOQUJMRV9OT0RFICYmCisJICAgIG5vZGUgIT0gRU5BQkxFX05PREUgJiYgMCA9PSBzdHJjbXAoImRvIiwgZmlyc3Rfd29yZCkpCisJCXJldHVybiAxOworCXJldHVybiAwOworfQorCisvKiAnPycgZGVzY3JpYmUgY29tbWFuZCBzdXBwb3J0LiAqLworc3RhdGljIHZlY3RvcgorY21kX2Rlc2NyaWJlX2NvbW1hbmRfcmVhbCh2ZWN0b3IgdmxpbmUsIHN0cnVjdCB2dHkgKnZ0eSwgaW50ICpzdGF0dXMpCit7CisJdW5zaWduZWQgaW50IGk7CisJdmVjdG9yIGNtZF92ZWN0b3I7CisjZGVmaW5lIElOSVRfTUFUQ0hWRUNfU0laRSAxMAorCXZlY3RvciBtYXRjaHZlYzsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZF9lbGVtZW50OworCXVuc2lnbmVkIGludCBpbmRleDsKKwlpbnQgcmV0OworCWVudW0gbWF0Y2hfdHlwZSBtYXRjaDsKKwljaGFyICpjb21tYW5kOworCXN0YXRpYyBzdHJ1Y3QgZGVzYyBkZXNjX2NyID0geyAiPGNyPiIsICIiIH07CisKKwkvKiBTZXQgaW5kZXguICovCisJaWYgKHZlY3Rvcl9hY3RpdmUodmxpbmUpID09IDApIHsKKwkJKnN0YXR1cyA9IENNRF9FUlJfTk9fTUFUQ0g7CisJCXJldHVybiBOVUxMOworCX0gZWxzZQorCQlpbmRleCA9IHZlY3Rvcl9hY3RpdmUodmxpbmUpIC0gMTsKKworCS8qIE1ha2UgY29weSB2ZWN0b3Igb2YgY3VycmVudCBub2RlJ3MgY29tbWFuZCB2ZWN0b3IuICovCisJY21kX3ZlY3RvciA9IHZlY3Rvcl9jb3B5KGNtZF9ub2RlX3ZlY3RvcihjbWR2ZWMsIHZ0eS0+bm9kZSkpOworCisJLyogUHJlcGFyZSBtYXRjaCB2ZWN0b3IgKi8KKwltYXRjaHZlYyA9IHZlY3Rvcl9pbml0KElOSVRfTUFUQ0hWRUNfU0laRSk7CisKKwkvKiBGaWx0ZXIgY29tbWFuZHMuICovCisJLyogT25seSB3b3JkcyBwcmVjZWRlcyBjdXJyZW50IHdvcmQgd2lsbCBiZSBjaGVja2VkIGluIHRoaXMgbG9vcC4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW5kZXg7IGkrKykKKwkJaWYgKChjb21tYW5kID0gdmVjdG9yX3Nsb3QodmxpbmUsIGkpKSkgeworCQkJbWF0Y2ggPQorCQkJICAgIGNtZF9maWx0ZXJfYnlfY29tcGxldGlvbihjb21tYW5kLCBjbWRfdmVjdG9yLCBpKTsKKworCQkJaWYgKG1hdGNoID09IHZhcmFyZ19tYXRjaCkgeworCQkJCXN0cnVjdCBjbWRfZWxlbWVudCAqY21kX2VsZW1lbnQ7CisJCQkJdmVjdG9yIGRlc2N2ZWM7CisJCQkJdW5zaWduZWQgaW50IGosIGs7CisKKwkJCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShjbWRfdmVjdG9yKTsgaisrKQorCQkJCQlpZiAoKGNtZF9lbGVtZW50ID0KKwkJCQkJICAgICB2ZWN0b3Jfc2xvdChjbWRfdmVjdG9yLCBqKSkgIT0gTlVMTAorCQkJCQkgICAgJiYKKwkJCQkJICAgICh2ZWN0b3JfYWN0aXZlCisJCQkJCSAgICAgKGNtZF9lbGVtZW50LT5zdHJ2ZWMpKSkgeworCQkJCQkJZGVzY3ZlYyA9CisJCQkJCQkgICAgdmVjdG9yX3Nsb3QoY21kX2VsZW1lbnQtPgorCQkJCQkJCQlzdHJ2ZWMsCisJCQkJCQkJCXZlY3Rvcl9hY3RpdmUKKwkJCQkJCQkJKGNtZF9lbGVtZW50LT4KKwkJCQkJCQkJIHN0cnZlYykgLSAxKTsKKwkJCQkJCWZvciAoayA9IDA7CisJCQkJCQkgICAgIGsgPCB2ZWN0b3JfYWN0aXZlKGRlc2N2ZWMpOworCQkJCQkJICAgICBrKyspIHsKKwkJCQkJCQlzdHJ1Y3QgZGVzYyAqZGVzYyA9CisJCQkJCQkJICAgIHZlY3Rvcl9zbG90KGRlc2N2ZWMsCisJCQkJCQkJCQlrKTsKKwkJCQkJCQl2ZWN0b3Jfc2V0KG1hdGNodmVjLAorCQkJCQkJCQkgICBkZXNjKTsKKwkJCQkJCX0KKwkJCQkJfQorCisJCQkJdmVjdG9yX3NldChtYXRjaHZlYywgJmRlc2NfY3IpOworCQkJCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCisJCQkJcmV0dXJuIG1hdGNodmVjOworCQkJfQorCisJCQlpZiAoKHJldCA9CisJCQkgICAgIGlzX2NtZF9hbWJpZ3VvdXMoY29tbWFuZCwgY21kX3ZlY3RvciwgaSwKKwkJCQkJICAgICAgbWF0Y2gpKSA9PSAxKSB7CisJCQkJdmVjdG9yX2ZyZWUoY21kX3ZlY3Rvcik7CisJCQkJKnN0YXR1cyA9IENNRF9FUlJfQU1CSUdVT1VTOworCQkJCXJldHVybiBOVUxMOworCQkJfSBlbHNlIGlmIChyZXQgPT0gMikgeworCQkJCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCQkJCSpzdGF0dXMgPSBDTURfRVJSX05PX01BVENIOworCQkJCXJldHVybiBOVUxMOworCQkJfQorCQl9CisKKwkvKiBQcmVwYXJlIG1hdGNoIHZlY3RvciAqLworCS8qICBtYXRjaHZlYyA9IHZlY3Rvcl9pbml0IChJTklUX01BVENIVkVDX1NJWkUpOyAqLworCisJLyogTWFrZSBzdXJlIHRoYXQgY21kX3ZlY3RvciBpcyBmaWx0ZXJlZCBiYXNlZCBvbiBjdXJyZW50IHdvcmQgKi8KKwljb21tYW5kID0gdmVjdG9yX3Nsb3QodmxpbmUsIGluZGV4KTsKKwlpZiAoY29tbWFuZCkKKwkJbWF0Y2ggPSBjbWRfZmlsdGVyX2J5X2NvbXBsZXRpb24oY29tbWFuZCwgY21kX3ZlY3RvciwgaW5kZXgpOworCisJLyogTWFrZSBkZXNjcmlwdGlvbiB2ZWN0b3IuICovCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoY21kX3ZlY3Rvcik7IGkrKykKKwkJaWYgKChjbWRfZWxlbWVudCA9IHZlY3Rvcl9zbG90KGNtZF92ZWN0b3IsIGkpKSAhPSBOVUxMKSB7CisJCQljb25zdCBjaGFyICpzdHJpbmcgPSBOVUxMOworCQkJdmVjdG9yIHN0cnZlYyA9IGNtZF9lbGVtZW50LT5zdHJ2ZWM7CisKKwkJCS8qIGlmIGNvbW1hbmQgaXMgTlVMTCwgaW5kZXggbWF5IGJlIGVxdWFsIHRvIHZlY3Rvcl9hY3RpdmUgKi8KKwkJCWlmIChjb21tYW5kICYmIGluZGV4ID49IHZlY3Rvcl9hY3RpdmUoc3RydmVjKSkKKwkJCQl2ZWN0b3Jfc2xvdChjbWRfdmVjdG9yLCBpKSA9IE5VTEw7CisJCQllbHNlIHsKKwkJCQkvKiBDaGVjayBpZiBjb21tYW5kIGlzIGNvbXBsZXRlZC4gKi8KKwkJCQlpZiAoY29tbWFuZCA9PSBOVUxMCisJCQkJICAgICYmIGluZGV4ID09IHZlY3Rvcl9hY3RpdmUoc3RydmVjKSkgeworCQkJCQlzdHJpbmcgPSAiPGNyPiI7CisJCQkJCWlmICghZGVzY191bmlxdWVfc3RyaW5nCisJCQkJCSAgICAobWF0Y2h2ZWMsIHN0cmluZykpCisJCQkJCQl2ZWN0b3Jfc2V0KG1hdGNodmVjLCAmZGVzY19jcik7CisJCQkJfSBlbHNlIHsKKwkJCQkJdW5zaWduZWQgaW50IGo7CisJCQkJCXZlY3RvciBkZXNjdmVjID0KKwkJCQkJICAgIHZlY3Rvcl9zbG90KHN0cnZlYywgaW5kZXgpOworCQkJCQlzdHJ1Y3QgZGVzYyAqZGVzYzsKKworCQkJCQlmb3IgKGogPSAwOyBqIDwgdmVjdG9yX2FjdGl2ZShkZXNjdmVjKTsKKwkJCQkJICAgICBqKyspCisJCQkJCQlpZiAoKGRlc2MgPQorCQkJCQkJICAgICB2ZWN0b3Jfc2xvdChkZXNjdmVjLCBqKSkpIHsKKwkJCQkJCQlzdHJpbmcgPQorCQkJCQkJCSAgICBjbWRfZW50cnlfZnVuY3Rpb25fZGVzYworCQkJCQkJCSAgICAoY29tbWFuZCwKKwkJCQkJCQkgICAgIGRlc2MtPmNtZCk7CisJCQkJCQkJaWYgKHN0cmluZykgeworCQkJCQkJCQkvKiBVbmlxdWVuZXNzIGNoZWNrICovCisJCQkJCQkJCWlmICghZGVzY191bmlxdWVfc3RyaW5nKG1hdGNodmVjLCBzdHJpbmcpKQorCQkJCQkJCQkJdmVjdG9yX3NldAorCQkJCQkJCQkJICAgIChtYXRjaHZlYywKKwkJCQkJCQkJCSAgICAgZGVzYyk7CisJCQkJCQkJfQorCQkJCQkJfQorCQkJCX0KKwkJCX0KKwkJfQorCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCisJaWYgKHZlY3Rvcl9zbG90KG1hdGNodmVjLCAwKSA9PSBOVUxMKSB7CisJCXZlY3Rvcl9mcmVlKG1hdGNodmVjKTsKKwkJKnN0YXR1cyA9IENNRF9FUlJfTk9fTUFUQ0g7CisJfSBlbHNlCisJCSpzdGF0dXMgPSBDTURfU1VDQ0VTUzsKKworCXJldHVybiBtYXRjaHZlYzsKK30KKwordmVjdG9yIGNtZF9kZXNjcmliZV9jb21tYW5kKHZlY3RvciB2bGluZSwgc3RydWN0IHZ0eSAqIHZ0eSwgaW50ICpzdGF0dXMpCit7CisJdmVjdG9yIHJldDsKKworCWlmIChjbWRfdHJ5X2RvX3Nob3J0Y3V0KHZ0eS0+bm9kZSwgdmVjdG9yX3Nsb3QodmxpbmUsIDApKSkgeworCQllbnVtIG5vZGVfdHlwZSBvbm9kZTsKKwkJdmVjdG9yIHNoaWZ0ZWRfdmxpbmU7CisJCXVuc2lnbmVkIGludCBpbmRleDsKKworCQlvbm9kZSA9IHZ0eS0+bm9kZTsKKwkJdnR5LT5ub2RlID0gRU5BQkxFX05PREU7CisJCS8qIFdlIGNhbiB0cnkgaXQgb24gZW5hYmxlIG5vZGUsIGNvcycgdGhlIHZ0eSBpcyBhdXRoZW50aWNhdGVkICovCisKKwkJc2hpZnRlZF92bGluZSA9IHZlY3Rvcl9pbml0KHZlY3Rvcl9jb3VudCh2bGluZSkpOworCQkvKiB1c2UgbWVtY3B5PyAqLworCQlmb3IgKGluZGV4ID0gMTsgaW5kZXggPCB2ZWN0b3JfYWN0aXZlKHZsaW5lKTsgaW5kZXgrKykgeworCQkJdmVjdG9yX3NldF9pbmRleChzaGlmdGVkX3ZsaW5lLCBpbmRleCAtIDEsCisJCQkJCSB2ZWN0b3JfbG9va3VwKHZsaW5lLCBpbmRleCkpOworCQl9CisKKwkJcmV0ID0gY21kX2Rlc2NyaWJlX2NvbW1hbmRfcmVhbChzaGlmdGVkX3ZsaW5lLCB2dHksIHN0YXR1cyk7CisKKwkJdmVjdG9yX2ZyZWUoc2hpZnRlZF92bGluZSk7CisJCXZ0eS0+bm9kZSA9IG9ub2RlOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBjbWRfZGVzY3JpYmVfY29tbWFuZF9yZWFsKHZsaW5lLCB2dHksIHN0YXR1cyk7Cit9CisKKy8qIENoZWNrIExDRCBvZiBtYXRjaGVkIGNvbW1hbmQuICovCitzdGF0aWMgaW50IGNtZF9sY2QoY2hhciAqKm1hdGNoZWQpCit7CisJaW50IGk7CisJaW50IGo7CisJaW50IGxjZCA9IC0xOworCWNoYXIgKnMxLCAqczI7CisJY2hhciBjMSwgYzI7CisKKwlpZiAobWF0Y2hlZFswXSA9PSBOVUxMIHx8IG1hdGNoZWRbMV0gPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlmb3IgKGkgPSAxOyBtYXRjaGVkW2ldICE9IE5VTEw7IGkrKykgeworCQlzMSA9IG1hdGNoZWRbaSAtIDFdOworCQlzMiA9IG1hdGNoZWRbaV07CisKKwkJZm9yIChqID0gMDsgKGMxID0gczFbal0pICYmIChjMiA9IHMyW2pdKTsgaisrKQorCQkJaWYgKGMxICE9IGMyKQorCQkJCWJyZWFrOworCisJCWlmIChsY2QgPCAwKQorCQkJbGNkID0gajsKKwkJZWxzZSB7CisJCQlpZiAobGNkID4gaikKKwkJCQlsY2QgPSBqOworCQl9CisJfQorCXJldHVybiBsY2Q7Cit9CisKKy8qIENvbW1hbmQgbGluZSBjb21wbGV0aW9uIHN1cHBvcnQuICovCitzdGF0aWMgY2hhciAqKmNtZF9jb21wbGV0ZV9jb21tYW5kX3JlYWwodmVjdG9yIHZsaW5lLCBzdHJ1Y3QgdnR5ICp2dHksCisJCQkJCWludCAqc3RhdHVzKQoreworCXVuc2lnbmVkIGludCBpOworCXZlY3RvciBjbWRfdmVjdG9yID0gdmVjdG9yX2NvcHkoY21kX25vZGVfdmVjdG9yKGNtZHZlYywgdnR5LT5ub2RlKSk7CisjZGVmaW5lIElOSVRfTUFUQ0hWRUNfU0laRSAxMAorCXZlY3RvciBtYXRjaHZlYzsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZF9lbGVtZW50OworCXVuc2lnbmVkIGludCBpbmRleDsKKwljaGFyICoqbWF0Y2hfc3RyOworCXN0cnVjdCBkZXNjICpkZXNjOworCXZlY3RvciBkZXNjdmVjOworCWNoYXIgKmNvbW1hbmQ7CisJaW50IGxjZDsKKworCWlmICh2ZWN0b3JfYWN0aXZlKHZsaW5lKSA9PSAwKSB7CisJCSpzdGF0dXMgPSBDTURfRVJSX05PX01BVENIOworCQlyZXR1cm4gTlVMTDsKKwl9IGVsc2UKKwkJaW5kZXggPSB2ZWN0b3JfYWN0aXZlKHZsaW5lKSAtIDE7CisKKwkvKiBGaXJzdCwgZmlsdGVyIGJ5IHByZWNlZWRpbmcgY29tbWFuZCBzdHJpbmcgKi8KKwlmb3IgKGkgPSAwOyBpIDwgaW5kZXg7IGkrKykKKwkJaWYgKChjb21tYW5kID0gdmVjdG9yX3Nsb3QodmxpbmUsIGkpKSkgeworCQkJZW51bSBtYXRjaF90eXBlIG1hdGNoOworCQkJaW50IHJldDsKKworCQkJLyogRmlyc3QgdHJ5IGNvbXBsZXRpb24gbWF0Y2gsIGlmIHRoZXJlIGlzIGV4YWN0bHkgbWF0Y2ggcmV0dXJuIDEgKi8KKwkJCW1hdGNoID0KKwkJCSAgICBjbWRfZmlsdGVyX2J5X2NvbXBsZXRpb24oY29tbWFuZCwgY21kX3ZlY3RvciwgaSk7CisKKwkJCS8qIElmIHRoZXJlIGlzIGV4YWN0IG1hdGNoIHRoZW4gZmlsdGVyIGFtYmlndW91cyBtYXRjaCBlbHNlIGNoZWNrCisJCQkgICBhbWJpZ3VvdXNuZXNzLiAqLworCQkJaWYgKChyZXQgPQorCQkJICAgICBpc19jbWRfYW1iaWd1b3VzKGNvbW1hbmQsIGNtZF92ZWN0b3IsIGksCisJCQkJCSAgICAgIG1hdGNoKSkgPT0gMSkgeworCQkJCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCQkJCSpzdGF0dXMgPSBDTURfRVJSX0FNQklHVU9VUzsKKwkJCQlyZXR1cm4gTlVMTDsKKwkJCX0KKwkJCS8qCisJCQkgICBlbHNlIGlmIChyZXQgPT0gMikKKwkJCSAgIHsKKwkJCSAgIHZlY3Rvcl9mcmVlIChjbWRfdmVjdG9yKTsKKwkJCSAgICpzdGF0dXMgPSBDTURfRVJSX05PX01BVENIOworCQkJICAgcmV0dXJuIE5VTEw7CisJCQkgICB9CisJCQkgKi8KKwkJfQorCisJLyogUHJlcGFyZSBtYXRjaCB2ZWN0b3IuICovCisJbWF0Y2h2ZWMgPSB2ZWN0b3JfaW5pdChJTklUX01BVENIVkVDX1NJWkUpOworCisJLyogTm93IHdlIGdvdCBpbnRvIGNvbXBsZXRpb24gKi8KKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWRfdmVjdG9yKTsgaSsrKQorCQlpZiAoKGNtZF9lbGVtZW50ID0gdmVjdG9yX3Nsb3QoY21kX3ZlY3RvciwgaSkpKSB7CisJCQljb25zdCBjaGFyICpzdHJpbmc7CisJCQl2ZWN0b3Igc3RydmVjID0gY21kX2VsZW1lbnQtPnN0cnZlYzsKKworCQkJLyogQ2hlY2sgZmllbGQgbGVuZ3RoICovCisJCQlpZiAoaW5kZXggPj0gdmVjdG9yX2FjdGl2ZShzdHJ2ZWMpKQorCQkJCXZlY3Rvcl9zbG90KGNtZF92ZWN0b3IsIGkpID0gTlVMTDsKKwkJCWVsc2UgeworCQkJCXVuc2lnbmVkIGludCBqOworCisJCQkJZGVzY3ZlYyA9IHZlY3Rvcl9zbG90KHN0cnZlYywgaW5kZXgpOworCQkJCWZvciAoaiA9IDA7IGogPCB2ZWN0b3JfYWN0aXZlKGRlc2N2ZWMpOyBqKyspCisJCQkJCWlmICgoZGVzYyA9IHZlY3Rvcl9zbG90KGRlc2N2ZWMsIGopKSkgeworCQkJCQkJaWYgKChzdHJpbmcgPSBjbWRfZW50cnlfZnVuY3Rpb24odmVjdG9yX3Nsb3QodmxpbmUsIGluZGV4KSwgZGVzYy0+Y21kKSkpCisJCQkJCQkJaWYgKGNtZF91bmlxdWVfc3RyaW5nIChtYXRjaHZlYywgc3RyaW5nKSkKKwkJCQkJCQkJdmVjdG9yX3NldCAobWF0Y2h2ZWMsIHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgc3RyaW5nKSk7CisJCQkJCX0KKwkJCX0KKwkJfQorCisJLyogV2UgZG9uJ3QgbmVlZCBjbWRfdmVjdG9yIGFueSBtb3JlLiAqLworCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCisJLyogTm8gbWF0Y2hlZCBjb21tYW5kICovCisJaWYgKHZlY3Rvcl9zbG90KG1hdGNodmVjLCAwKSA9PSBOVUxMKSB7CisJCXZlY3Rvcl9mcmVlKG1hdGNodmVjKTsKKworCQkvKiBJbiBjYXNlIG9mICdjb21tYW5kIFx0JyBwYXR0ZXJuLiAgRG8geW91IG5lZWQgJz8nIGNvbW1hbmQgYXQKKwkJICAgdGhlIGVuZCBvZiB0aGUgbGluZS4gKi8KKwkJaWYgKHZlY3Rvcl9zbG90KHZsaW5lLCBpbmRleCkgPT0gJ1wwJykKKwkJCSpzdGF0dXMgPSBDTURfRVJSX05PVEhJTkdfVE9ETzsKKwkJZWxzZQorCQkJKnN0YXR1cyA9IENNRF9FUlJfTk9fTUFUQ0g7CisJCXJldHVybiBOVUxMOworCX0KKworCS8qIE9ubHkgb25lIG1hdGNoZWQgKi8KKwlpZiAodmVjdG9yX3Nsb3QobWF0Y2h2ZWMsIDEpID09IE5VTEwpIHsKKwkJbWF0Y2hfc3RyID0gKGNoYXIgKiopbWF0Y2h2ZWMtPmluZGV4OworCQl2ZWN0b3Jfb25seV93cmFwcGVyX2ZyZWUobWF0Y2h2ZWMpOworCQkqc3RhdHVzID0gQ01EX0NPTVBMRVRFX0ZVTExfTUFUQ0g7CisJCXJldHVybiBtYXRjaF9zdHI7CisJfQorCS8qIE1ha2UgaXQgc3VyZSBsYXN0IGVsZW1lbnQgaXMgTlVMTC4gKi8KKwl2ZWN0b3Jfc2V0KG1hdGNodmVjLCBOVUxMKTsKKworCS8qIENoZWNrIExDRCBvZiBtYXRjaGVkIHN0cmluZ3MuICovCisJaWYgKHZlY3Rvcl9zbG90KHZsaW5lLCBpbmRleCkgIT0gTlVMTCkgeworCQlsY2QgPSBjbWRfbGNkKChjaGFyICoqKW1hdGNodmVjLT5pbmRleCk7CisKKwkJaWYgKGxjZCkgeworCQkJaW50IGxlbiA9IHN0cmxlbih2ZWN0b3Jfc2xvdCh2bGluZSwgaW5kZXgpKTsKKworCQkJaWYgKGxlbiA8IGxjZCkgeworCQkJCWNoYXIgKmxjZHN0cjsKKworCQkJCWxjZHN0ciA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jbWRfY3R4LCBsY2QgKyAxLAorCQkJCQkJICAgICAgImNvbXBsZXRlLWxjZHN0ciIpOworCQkJCW1lbWNweShsY2RzdHIsIG1hdGNodmVjLT5pbmRleFswXSwgbGNkKTsKKwkJCQlsY2RzdHJbbGNkXSA9ICdcMCc7CisKKwkJCQkvKiBtYXRjaF9zdHIgPSAoY2hhciAqKikgJmxjZHN0cjsgKi8KKworCQkJCS8qIEZyZWUgbWF0Y2h2ZWMuICovCisJCQkJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUobWF0Y2h2ZWMpOyBpKyspIHsKKwkJCQkJaWYgKHZlY3Rvcl9zbG90KG1hdGNodmVjLCBpKSkKKwkJCQkJCXRhbGxvY19mcmVlKHZlY3Rvcl9zbG90KG1hdGNodmVjLCBpKSk7CisJCQkJfQorCQkJCXZlY3Rvcl9mcmVlKG1hdGNodmVjKTsKKworCQkJCS8qIE1ha2UgbmV3IG1hdGNodmVjLiAqLworCQkJCW1hdGNodmVjID0gdmVjdG9yX2luaXQoSU5JVF9NQVRDSFZFQ19TSVpFKTsKKwkJCQl2ZWN0b3Jfc2V0KG1hdGNodmVjLCBsY2RzdHIpOworCQkJCW1hdGNoX3N0ciA9IChjaGFyICoqKW1hdGNodmVjLT5pbmRleDsKKwkJCQl2ZWN0b3Jfb25seV93cmFwcGVyX2ZyZWUobWF0Y2h2ZWMpOworCisJCQkJKnN0YXR1cyA9IENNRF9DT01QTEVURV9NQVRDSDsKKwkJCQlyZXR1cm4gbWF0Y2hfc3RyOworCQkJfQorCQl9CisJfQorCisJbWF0Y2hfc3RyID0gKGNoYXIgKiopbWF0Y2h2ZWMtPmluZGV4OworCXZlY3Rvcl9vbmx5X3dyYXBwZXJfZnJlZShtYXRjaHZlYyk7CisJKnN0YXR1cyA9IENNRF9DT01QTEVURV9MSVNUX01BVENIOworCXJldHVybiBtYXRjaF9zdHI7Cit9CisKK2NoYXIgKipjbWRfY29tcGxldGVfY29tbWFuZCh2ZWN0b3IgdmxpbmUsIHN0cnVjdCB2dHkgKnZ0eSwgaW50ICpzdGF0dXMpCit7CisJY2hhciAqKnJldDsKKworCWlmIChjbWRfdHJ5X2RvX3Nob3J0Y3V0KHZ0eS0+bm9kZSwgdmVjdG9yX3Nsb3QodmxpbmUsIDApKSkgeworCQllbnVtIG5vZGVfdHlwZSBvbm9kZTsKKwkJdmVjdG9yIHNoaWZ0ZWRfdmxpbmU7CisJCXVuc2lnbmVkIGludCBpbmRleDsKKworCQlvbm9kZSA9IHZ0eS0+bm9kZTsKKwkJdnR5LT5ub2RlID0gRU5BQkxFX05PREU7CisJCS8qIFdlIGNhbiB0cnkgaXQgb24gZW5hYmxlIG5vZGUsIGNvcycgdGhlIHZ0eSBpcyBhdXRoZW50aWNhdGVkICovCisKKwkJc2hpZnRlZF92bGluZSA9IHZlY3Rvcl9pbml0KHZlY3Rvcl9jb3VudCh2bGluZSkpOworCQkvKiB1c2UgbWVtY3B5PyAqLworCQlmb3IgKGluZGV4ID0gMTsgaW5kZXggPCB2ZWN0b3JfYWN0aXZlKHZsaW5lKTsgaW5kZXgrKykgeworCQkJdmVjdG9yX3NldF9pbmRleChzaGlmdGVkX3ZsaW5lLCBpbmRleCAtIDEsCisJCQkJCSB2ZWN0b3JfbG9va3VwKHZsaW5lLCBpbmRleCkpOworCQl9CisKKwkJcmV0ID0gY21kX2NvbXBsZXRlX2NvbW1hbmRfcmVhbChzaGlmdGVkX3ZsaW5lLCB2dHksIHN0YXR1cyk7CisKKwkJdmVjdG9yX2ZyZWUoc2hpZnRlZF92bGluZSk7CisJCXZ0eS0+bm9kZSA9IG9ub2RlOworCQlyZXR1cm4gcmV0OworCX0KKworCXJldHVybiBjbWRfY29tcGxldGVfY29tbWFuZF9yZWFsKHZsaW5lLCB2dHksIHN0YXR1cyk7Cit9CisKKy8qIHJldHVybiBwYXJlbnQgbm9kZSAqLworLyogTVVTVCBldmVudHVhbGx5IGNvbnZlcmdlIG9uIENPTkZJR19OT0RFICovCitlbnVtIG5vZGVfdHlwZSB2dHlfZ29fcGFyZW50KHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlhc3NlcnQodnR5LT5ub2RlID4gQ09ORklHX05PREUpOworCisJc3dpdGNoICh2dHktPm5vZGUpIHsKKwljYXNlIEdTTU5FVF9OT0RFOgorCQl2dHktPm5vZGUgPSBDT05GSUdfTk9ERTsKKwkJdnR5LT5pbmRleCA9IE5VTEw7CisJCWJyZWFrOworCWNhc2UgQlRTX05PREU6CisJCXZ0eS0+bm9kZSA9IEdTTU5FVF9OT0RFOworCQl7CisJCQkvKiBzZXQgdnR5LT5pbmRleCBjb3JyZWN0bHkgISAqLworCQkJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJCQl2dHktPmluZGV4ID0gYnRzLT5uZXR3b3JrOworCQl9CisJCWJyZWFrOworCWNhc2UgVFJYX05PREU6CisJCXZ0eS0+bm9kZSA9IEJUU19OT0RFOworCQl7CisJCQkvKiBzZXQgdnR5LT5pbmRleCBjb3JyZWN0bHkgISAqLworCQkJc3RydWN0IGdzbV9idHNfdHJ4ICp0cnggPSB2dHktPmluZGV4OworCQkJdnR5LT5pbmRleCA9IHRyeC0+YnRzOworCQl9CisJCWJyZWFrOworCWNhc2UgVFNfTk9ERToKKwkJdnR5LT5ub2RlID0gVFJYX05PREU7CisJCXsKKwkJCS8qIHNldCB2dHktPmluZGV4IGNvcnJlY3RseSAhICovCisJCQlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gdnR5LT5pbmRleDsKKwkJCXZ0eS0+aW5kZXggPSB0cy0+dHJ4OworCQl9CisJCWJyZWFrOworCWNhc2UgU1VCU0NSX05PREU6CisJCXZ0eS0+bm9kZSA9IFZJRVdfTk9ERTsKKwkJc3Vic2NyX3B1dCh2dHktPmluZGV4KTsKKwkJdnR5LT5pbmRleCA9IE5VTEw7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXZ0eS0+bm9kZSA9IENPTkZJR19OT0RFOworCX0KKworCXJldHVybiB2dHktPm5vZGU7Cit9CisKKy8qIEV4ZWN1dGUgY29tbWFuZCBieSBhcmd1bWVudCB2bGluZSB2ZWN0b3IuICovCitzdGF0aWMgaW50CitjbWRfZXhlY3V0ZV9jb21tYW5kX3JlYWwodmVjdG9yIHZsaW5lLCBzdHJ1Y3QgdnR5ICp2dHksCisJCQkgc3RydWN0IGNtZF9lbGVtZW50ICoqY21kKQoreworCXVuc2lnbmVkIGludCBpOworCXVuc2lnbmVkIGludCBpbmRleDsKKwl2ZWN0b3IgY21kX3ZlY3RvcjsKKwlzdHJ1Y3QgY21kX2VsZW1lbnQgKmNtZF9lbGVtZW50OworCXN0cnVjdCBjbWRfZWxlbWVudCAqbWF0Y2hlZF9lbGVtZW50OworCXVuc2lnbmVkIGludCBtYXRjaGVkX2NvdW50LCBpbmNvbXBsZXRlX2NvdW50OworCWludCBhcmdjOworCWNvbnN0IGNoYXIgKmFyZ3ZbQ01EX0FSR0NfTUFYXTsKKwllbnVtIG1hdGNoX3R5cGUgbWF0Y2ggPSAwOworCWludCB2YXJmbGFnOworCWNoYXIgKmNvbW1hbmQ7CisKKwkvKiBNYWtlIGNvcHkgb2YgY29tbWFuZCBlbGVtZW50cy4gKi8KKwljbWRfdmVjdG9yID0gdmVjdG9yX2NvcHkoY21kX25vZGVfdmVjdG9yKGNtZHZlYywgdnR5LT5ub2RlKSk7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB2ZWN0b3JfYWN0aXZlKHZsaW5lKTsgaW5kZXgrKykKKwkJaWYgKChjb21tYW5kID0gdmVjdG9yX3Nsb3QodmxpbmUsIGluZGV4KSkpIHsKKwkJCWludCByZXQ7CisKKwkJCW1hdGNoID0KKwkJCSAgICBjbWRfZmlsdGVyX2J5X2NvbXBsZXRpb24oY29tbWFuZCwgY21kX3ZlY3RvciwKKwkJCQkJCSAgICAgaW5kZXgpOworCisJCQlpZiAobWF0Y2ggPT0gdmFyYXJnX21hdGNoKQorCQkJCWJyZWFrOworCisJCQlyZXQgPQorCQkJICAgIGlzX2NtZF9hbWJpZ3VvdXMoY29tbWFuZCwgY21kX3ZlY3RvciwgaW5kZXgsIG1hdGNoKTsKKworCQkJaWYgKHJldCA9PSAxKSB7CisJCQkJdmVjdG9yX2ZyZWUoY21kX3ZlY3Rvcik7CisJCQkJcmV0dXJuIENNRF9FUlJfQU1CSUdVT1VTOworCQkJfSBlbHNlIGlmIChyZXQgPT0gMikgeworCQkJCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCQkJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCQkJfQorCQl9CisKKwkvKiBDaGVjayBtYXRjaGVkIGNvdW50LiAqLworCW1hdGNoZWRfZWxlbWVudCA9IE5VTEw7CisJbWF0Y2hlZF9jb3VudCA9IDA7CisJaW5jb21wbGV0ZV9jb3VudCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWRfdmVjdG9yKTsgaSsrKQorCQlpZiAoKGNtZF9lbGVtZW50ID0gdmVjdG9yX3Nsb3QoY21kX3ZlY3RvciwgaSkpKSB7CisJCQlpZiAobWF0Y2ggPT0gdmFyYXJnX21hdGNoCisJCQkgICAgfHwgaW5kZXggPj0gY21kX2VsZW1lbnQtPmNtZHNpemUpIHsKKwkJCQltYXRjaGVkX2VsZW1lbnQgPSBjbWRfZWxlbWVudDsKKyNpZiAwCisJCQkJcHJpbnRmKCJERUJVRzogJXNcbiIsIGNtZF9lbGVtZW50LT5zdHJpbmcpOworI2VuZGlmCisJCQkJbWF0Y2hlZF9jb3VudCsrOworCQkJfSBlbHNlIHsKKwkJCQlpbmNvbXBsZXRlX2NvdW50Kys7CisJCQl9CisJCX0KKworCS8qIEZpbmlzaCBvZiB1c2luZyBjbWRfdmVjdG9yLiAqLworCXZlY3Rvcl9mcmVlKGNtZF92ZWN0b3IpOworCisJLyogVG8gZXhlY3V0ZSBjb21tYW5kLCBtYXRjaGVkX2NvdW50IG11c3QgYmUgMS4gKi8KKwlpZiAobWF0Y2hlZF9jb3VudCA9PSAwKSB7CisJCWlmIChpbmNvbXBsZXRlX2NvdW50KQorCQkJcmV0dXJuIENNRF9FUlJfSU5DT01QTEVURTsKKwkJZWxzZQorCQkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisJfQorCisJaWYgKG1hdGNoZWRfY291bnQgPiAxKQorCQlyZXR1cm4gQ01EX0VSUl9BTUJJR1VPVVM7CisKKwkvKiBBcmd1bWVudCB0cmVhdG1lbnQgKi8KKwl2YXJmbGFnID0gMDsKKwlhcmdjID0gMDsKKworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKHZsaW5lKTsgaSsrKSB7CisJCWlmICh2YXJmbGFnKQorCQkJYXJndlthcmdjKytdID0gdmVjdG9yX3Nsb3QodmxpbmUsIGkpOworCQllbHNlIHsKKwkJCXZlY3RvciBkZXNjdmVjID0KKwkJCSAgICB2ZWN0b3Jfc2xvdChtYXRjaGVkX2VsZW1lbnQtPnN0cnZlYywgaSk7CisKKwkJCWlmICh2ZWN0b3JfYWN0aXZlKGRlc2N2ZWMpID09IDEpIHsKKwkJCQlzdHJ1Y3QgZGVzYyAqZGVzYyA9IHZlY3Rvcl9zbG90KGRlc2N2ZWMsIDApOworCisJCQkJaWYgKENNRF9WQVJBUkcoZGVzYy0+Y21kKSkKKwkJCQkJdmFyZmxhZyA9IDE7CisKKwkJCQlpZiAodmFyZmxhZyB8fCBDTURfVkFSSUFCTEUoZGVzYy0+Y21kKQorCQkJCSAgICB8fCBDTURfT1BUSU9OKGRlc2MtPmNtZCkpCisJCQkJCWFyZ3ZbYXJnYysrXSA9IHZlY3Rvcl9zbG90KHZsaW5lLCBpKTsKKwkJCX0gZWxzZQorCQkJCWFyZ3ZbYXJnYysrXSA9IHZlY3Rvcl9zbG90KHZsaW5lLCBpKTsKKwkJfQorCisJCWlmIChhcmdjID49IENNRF9BUkdDX01BWCkKKwkJCXJldHVybiBDTURfRVJSX0VYRUVEX0FSR0NfTUFYOworCX0KKworCS8qIEZvciB2dHlzaCBleGVjdXRpb24uICovCisJaWYgKGNtZCkKKwkJKmNtZCA9IG1hdGNoZWRfZWxlbWVudDsKKworCWlmIChtYXRjaGVkX2VsZW1lbnQtPmRhZW1vbikKKwkJcmV0dXJuIENNRF9TVUNDRVNTX0RBRU1PTjsKKworCS8qIEV4ZWN1dGUgbWF0Y2hlZCBjb21tYW5kLiAqLworCXJldHVybiAoKm1hdGNoZWRfZWxlbWVudC0+ZnVuYykgKG1hdGNoZWRfZWxlbWVudCwgdnR5LCBhcmdjLCBhcmd2KTsKK30KKworaW50CitjbWRfZXhlY3V0ZV9jb21tYW5kKHZlY3RvciB2bGluZSwgc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgY21kX2VsZW1lbnQgKipjbWQsCisJCSAgICBpbnQgdnR5c2gpCit7CisJaW50IHJldCwgc2F2ZWRfcmV0LCB0cmllZCA9IDA7CisJZW51bSBub2RlX3R5cGUgb25vZGU7CisJdm9pZCAqb2luZGV4OworCisJb25vZGUgPSB2dHktPm5vZGU7CisJb2luZGV4ID0gdnR5LT5pbmRleDsKKworCWlmIChjbWRfdHJ5X2RvX3Nob3J0Y3V0KHZ0eS0+bm9kZSwgdmVjdG9yX3Nsb3QodmxpbmUsIDApKSkgeworCQl2ZWN0b3Igc2hpZnRlZF92bGluZTsKKwkJdW5zaWduZWQgaW50IGluZGV4OworCisJCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOworCQkvKiBXZSBjYW4gdHJ5IGl0IG9uIGVuYWJsZSBub2RlLCBjb3MnIHRoZSB2dHkgaXMgYXV0aGVudGljYXRlZCAqLworCisJCXNoaWZ0ZWRfdmxpbmUgPSB2ZWN0b3JfaW5pdCh2ZWN0b3JfY291bnQodmxpbmUpKTsKKwkJLyogdXNlIG1lbWNweT8gKi8KKwkJZm9yIChpbmRleCA9IDE7IGluZGV4IDwgdmVjdG9yX2FjdGl2ZSh2bGluZSk7IGluZGV4KyspIHsKKwkJCXZlY3Rvcl9zZXRfaW5kZXgoc2hpZnRlZF92bGluZSwgaW5kZXggLSAxLAorCQkJCQkgdmVjdG9yX2xvb2t1cCh2bGluZSwgaW5kZXgpKTsKKwkJfQorCisJCXJldCA9IGNtZF9leGVjdXRlX2NvbW1hbmRfcmVhbChzaGlmdGVkX3ZsaW5lLCB2dHksIGNtZCk7CisKKwkJdmVjdG9yX2ZyZWUoc2hpZnRlZF92bGluZSk7CisJCXZ0eS0+bm9kZSA9IG9ub2RlOworCQlyZXR1cm4gcmV0OworCX0KKworCXNhdmVkX3JldCA9IHJldCA9IGNtZF9leGVjdXRlX2NvbW1hbmRfcmVhbCh2bGluZSwgdnR5LCBjbWQpOworCisJaWYgKHZ0eXNoKQorCQlyZXR1cm4gc2F2ZWRfcmV0OworCisJLyogVGhpcyBhc3N1bWVzIGFsbCBub2RlcyBhYm92ZSBDT05GSUdfTk9ERSBhcmUgY2hpbGRzIG9mIENPTkZJR19OT0RFICovCisJd2hpbGUgKHJldCAhPSBDTURfU1VDQ0VTUyAmJiByZXQgIT0gQ01EX1dBUk5JTkcKKwkgICAgICAgJiYgdnR5LT5ub2RlID4gQ09ORklHX05PREUpIHsKKwkJdnR5X2dvX3BhcmVudCh2dHkpOworCQlyZXQgPSBjbWRfZXhlY3V0ZV9jb21tYW5kX3JlYWwodmxpbmUsIHZ0eSwgY21kKTsKKwkJdHJpZWQgPSAxOworCQlpZiAocmV0ID09IENNRF9TVUNDRVNTIHx8IHJldCA9PSBDTURfV0FSTklORykgeworCQkJLyogc3VjY2VzZnVsbCBjb21tYW5kLCBsZWF2ZSB0aGUgbm9kZSBhcyBpcyAqLworCQkJcmV0dXJuIHJldDsKKwkJfQorCX0KKwkvKiBubyBjb21tYW5kIHN1Y2NlZWRlZCwgcmVzZXQgdGhlIHZ0eSB0byB0aGUgb3JpZ2luYWwgbm9kZSBhbmQKKwkgICByZXR1cm4gdGhlIGVycm9yIGZvciB0aGlzIG5vZGUgKi8KKwlpZiAodHJpZWQpIHsKKwkJdnR5LT5ub2RlID0gb25vZGU7CisJCXZ0eS0+aW5kZXggPSBvaW5kZXg7CisJfQorCXJldHVybiBzYXZlZF9yZXQ7Cit9CisKKy8qIEV4ZWN1dGUgY29tbWFuZCBieSBhcmd1bWVudCByZWFkbGluZS4gKi8KK2ludAorY21kX2V4ZWN1dGVfY29tbWFuZF9zdHJpY3QodmVjdG9yIHZsaW5lLCBzdHJ1Y3QgdnR5ICp2dHksCisJCQkgICBzdHJ1Y3QgY21kX2VsZW1lbnQgKipjbWQpCit7CisJdW5zaWduZWQgaW50IGk7CisJdW5zaWduZWQgaW50IGluZGV4OworCXZlY3RvciBjbWRfdmVjdG9yOworCXN0cnVjdCBjbWRfZWxlbWVudCAqY21kX2VsZW1lbnQ7CisJc3RydWN0IGNtZF9lbGVtZW50ICptYXRjaGVkX2VsZW1lbnQ7CisJdW5zaWduZWQgaW50IG1hdGNoZWRfY291bnQsIGluY29tcGxldGVfY291bnQ7CisJaW50IGFyZ2M7CisJY29uc3QgY2hhciAqYXJndltDTURfQVJHQ19NQVhdOworCWludCB2YXJmbGFnOworCWVudW0gbWF0Y2hfdHlwZSBtYXRjaCA9IDA7CisJY2hhciAqY29tbWFuZDsKKworCS8qIE1ha2UgY29weSBvZiBjb21tYW5kIGVsZW1lbnQgKi8KKwljbWRfdmVjdG9yID0gdmVjdG9yX2NvcHkoY21kX25vZGVfdmVjdG9yKGNtZHZlYywgdnR5LT5ub2RlKSk7CisKKwlmb3IgKGluZGV4ID0gMDsgaW5kZXggPCB2ZWN0b3JfYWN0aXZlKHZsaW5lKTsgaW5kZXgrKykKKwkJaWYgKChjb21tYW5kID0gdmVjdG9yX3Nsb3QodmxpbmUsIGluZGV4KSkpIHsKKwkJCWludCByZXQ7CisKKwkJCW1hdGNoID0gY21kX2ZpbHRlcl9ieV9zdHJpbmcodmVjdG9yX3Nsb3QodmxpbmUsIGluZGV4KSwKKwkJCQkJCSAgICAgY21kX3ZlY3RvciwgaW5kZXgpOworCisJCQkvKiBJZiBjb21tYW5kIG1lZXRzICcuVkFSQVJHJyB0aGVuIGZpbmlzaCBtYXRjaGluZy4gKi8KKwkJCWlmIChtYXRjaCA9PSB2YXJhcmdfbWF0Y2gpCisJCQkJYnJlYWs7CisKKwkJCXJldCA9CisJCQkgICAgaXNfY21kX2FtYmlndW91cyhjb21tYW5kLCBjbWRfdmVjdG9yLCBpbmRleCwgbWF0Y2gpOworCQkJaWYgKHJldCA9PSAxKSB7CisJCQkJdmVjdG9yX2ZyZWUoY21kX3ZlY3Rvcik7CisJCQkJcmV0dXJuIENNRF9FUlJfQU1CSUdVT1VTOworCQkJfQorCQkJaWYgKHJldCA9PSAyKSB7CisJCQkJdmVjdG9yX2ZyZWUoY21kX3ZlY3Rvcik7CisJCQkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisJCQl9CisJCX0KKworCS8qIENoZWNrIG1hdGNoZWQgY291bnQuICovCisJbWF0Y2hlZF9lbGVtZW50ID0gTlVMTDsKKwltYXRjaGVkX2NvdW50ID0gMDsKKwlpbmNvbXBsZXRlX2NvdW50ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWRfdmVjdG9yKTsgaSsrKQorCQlpZiAodmVjdG9yX3Nsb3QoY21kX3ZlY3RvciwgaSkgIT0gTlVMTCkgeworCQkJY21kX2VsZW1lbnQgPSB2ZWN0b3Jfc2xvdChjbWRfdmVjdG9yLCBpKTsKKworCQkJaWYgKG1hdGNoID09IHZhcmFyZ19tYXRjaAorCQkJICAgIHx8IGluZGV4ID49IGNtZF9lbGVtZW50LT5jbWRzaXplKSB7CisJCQkJbWF0Y2hlZF9lbGVtZW50ID0gY21kX2VsZW1lbnQ7CisJCQkJbWF0Y2hlZF9jb3VudCsrOworCQkJfSBlbHNlCisJCQkJaW5jb21wbGV0ZV9jb3VudCsrOworCQl9CisKKwkvKiBGaW5pc2ggb2YgdXNpbmcgY21kX3ZlY3Rvci4gKi8KKwl2ZWN0b3JfZnJlZShjbWRfdmVjdG9yKTsKKworCS8qIFRvIGV4ZWN1dGUgY29tbWFuZCwgbWF0Y2hlZF9jb3VudCBtdXN0IGJlIDEuICovCisJaWYgKG1hdGNoZWRfY291bnQgPT0gMCkgeworCQlpZiAoaW5jb21wbGV0ZV9jb3VudCkKKwkJCXJldHVybiBDTURfRVJSX0lOQ09NUExFVEU7CisJCWVsc2UKKwkJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCX0KKworCWlmIChtYXRjaGVkX2NvdW50ID4gMSkKKwkJcmV0dXJuIENNRF9FUlJfQU1CSUdVT1VTOworCisJLyogQXJndW1lbnQgdHJlYXRtZW50ICovCisJdmFyZmxhZyA9IDA7CisJYXJnYyA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2bGluZSk7IGkrKykgeworCQlpZiAodmFyZmxhZykKKwkJCWFyZ3ZbYXJnYysrXSA9IHZlY3Rvcl9zbG90KHZsaW5lLCBpKTsKKwkJZWxzZSB7CisJCQl2ZWN0b3IgZGVzY3ZlYyA9CisJCQkgICAgdmVjdG9yX3Nsb3QobWF0Y2hlZF9lbGVtZW50LT5zdHJ2ZWMsIGkpOworCisJCQlpZiAodmVjdG9yX2FjdGl2ZShkZXNjdmVjKSA9PSAxKSB7CisJCQkJc3RydWN0IGRlc2MgKmRlc2MgPSB2ZWN0b3Jfc2xvdChkZXNjdmVjLCAwKTsKKworCQkJCWlmIChDTURfVkFSQVJHKGRlc2MtPmNtZCkpCisJCQkJCXZhcmZsYWcgPSAxOworCisJCQkJaWYgKHZhcmZsYWcgfHwgQ01EX1ZBUklBQkxFKGRlc2MtPmNtZCkKKwkJCQkgICAgfHwgQ01EX09QVElPTihkZXNjLT5jbWQpKQorCQkJCQlhcmd2W2FyZ2MrK10gPSB2ZWN0b3Jfc2xvdCh2bGluZSwgaSk7CisJCQl9IGVsc2UKKwkJCQlhcmd2W2FyZ2MrK10gPSB2ZWN0b3Jfc2xvdCh2bGluZSwgaSk7CisJCX0KKworCQlpZiAoYXJnYyA+PSBDTURfQVJHQ19NQVgpCisJCQlyZXR1cm4gQ01EX0VSUl9FWEVFRF9BUkdDX01BWDsKKwl9CisKKwkvKiBGb3IgdnR5c2ggZXhlY3V0aW9uLiAqLworCWlmIChjbWQpCisJCSpjbWQgPSBtYXRjaGVkX2VsZW1lbnQ7CisKKwlpZiAobWF0Y2hlZF9lbGVtZW50LT5kYWVtb24pCisJCXJldHVybiBDTURfU1VDQ0VTU19EQUVNT047CisKKwkvKiBOb3cgZXhlY3V0ZSBtYXRjaGVkIGNvbW1hbmQgKi8KKwlyZXR1cm4gKCptYXRjaGVkX2VsZW1lbnQtPmZ1bmMpIChtYXRjaGVkX2VsZW1lbnQsIHZ0eSwgYXJnYywgYXJndik7Cit9CisKKy8qIENvbmZpZ3JhdGlvbiBtYWtlIGZyb20gZmlsZS4gKi8KK2ludCBjb25maWdfZnJvbV9maWxlKHN0cnVjdCB2dHkgKnZ0eSwgRklMRSAqIGZwKQoreworCWludCByZXQ7CisJdmVjdG9yIHZsaW5lOworCisJd2hpbGUgKGZnZXRzKHZ0eS0+YnVmLCBWVFlfQlVGU0laLCBmcCkpIHsKKwkJdmxpbmUgPSBjbWRfbWFrZV9zdHJ2ZWModnR5LT5idWYpOworCisJCS8qIEluIGNhc2Ugb2YgY29tbWVudCBsaW5lICovCisJCWlmICh2bGluZSA9PSBOVUxMKQorCQkJY29udGludWU7CisJCS8qIEV4ZWN1dGUgY29uZmlndXJhdGlvbiBjb21tYW5kIDogdGhpcyBpcyBzdHJpY3QgbWF0Y2ggKi8KKwkJcmV0ID0gY21kX2V4ZWN1dGVfY29tbWFuZF9zdHJpY3QodmxpbmUsIHZ0eSwgTlVMTCk7CisKKwkJLyogVHJ5IGFnYWluIHdpdGggc2V0dGluZyBub2RlIHRvIENPTkZJR19OT0RFICovCisJCXdoaWxlIChyZXQgIT0gQ01EX1NVQ0NFU1MgJiYgcmV0ICE9IENNRF9XQVJOSU5HCisJCSAgICAgICAmJiByZXQgIT0gQ01EX0VSUl9OT1RISU5HX1RPRE8KKwkJICAgICAgICYmIHZ0eS0+bm9kZSAhPSBDT05GSUdfTk9ERSkgeworCQkJdnR5X2dvX3BhcmVudCh2dHkpOworCQkJcmV0ID0gY21kX2V4ZWN1dGVfY29tbWFuZF9zdHJpY3QodmxpbmUsIHZ0eSwgTlVMTCk7CisJCX0KKworCQljbWRfZnJlZV9zdHJ2ZWModmxpbmUpOworCisJCWlmIChyZXQgIT0gQ01EX1NVQ0NFU1MgJiYgcmV0ICE9IENNRF9XQVJOSU5HCisJCSAgICAmJiByZXQgIT0gQ01EX0VSUl9OT1RISU5HX1RPRE8pCisJCQlyZXR1cm4gcmV0OworCX0KKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIENvbmZpZ3JhdGlvbiBmcm9tIHRlcm1pbmFsICovCitERUZVTihjb25maWdfdGVybWluYWwsCisgICAgICBjb25maWdfdGVybWluYWxfY21kLAorICAgICAgImNvbmZpZ3VyZSB0ZXJtaW5hbCIsCisgICAgICAiQ29uZmlndXJhdGlvbiBmcm9tIHZ0eSBpbnRlcmZhY2VcbiIgIkNvbmZpZ3VyYXRpb24gdGVybWluYWxcbiIpCit7CisJaWYgKHZ0eV9jb25maWdfbG9jayh2dHkpKQorCQl2dHktPm5vZGUgPSBDT05GSUdfTk9ERTsKKwllbHNlIHsKKwkJdnR5X291dCh2dHksICJWVFkgY29uZmlndXJhdGlvbiBpcyBsb2NrZWQgYnkgb3RoZXIgVlRZJXMiLAorCQkJVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogRW5hYmxlIGNvbW1hbmQgKi8KK0RFRlVOKGVuYWJsZSwgY29uZmlnX2VuYWJsZV9jbWQsICJlbmFibGUiLCAiVHVybiBvbiBwcml2aWxlZ2VkIG1vZGUgY29tbWFuZFxuIikKK3sKKwkvKiBJZiBlbmFibGUgcGFzc3dvcmQgaXMgTlVMTCwgY2hhbmdlIHRvIEVOQUJMRV9OT0RFICovCisJaWYgKChob3N0LmVuYWJsZSA9PSBOVUxMICYmIGhvc3QuZW5hYmxlX2VuY3J5cHQgPT0gTlVMTCkgfHwKKwkgICAgdnR5LT50eXBlID09IFZUWV9TSEVMTF9TRVJWKQorCQl2dHktPm5vZGUgPSBFTkFCTEVfTk9ERTsKKwllbHNlCisJCXZ0eS0+bm9kZSA9IEFVVEhfRU5BQkxFX05PREU7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIERpc2FibGUgY29tbWFuZCAqLworREVGVU4oZGlzYWJsZSwKKyAgICAgIGNvbmZpZ19kaXNhYmxlX2NtZCwgImRpc2FibGUiLCAiVHVybiBvZmYgcHJpdmlsZWdlZCBtb2RlIGNvbW1hbmRcbiIpCit7CisJaWYgKHZ0eS0+bm9kZSA9PSBFTkFCTEVfTk9ERSkKKwkJdnR5LT5ub2RlID0gVklFV19OT0RFOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogRG93biB2dHkgbm9kZSBsZXZlbC4gKi8KK0RFRlVOKGNvbmZpZ19leGl0LAorICAgICAgY29uZmlnX2V4aXRfY21kLCAiZXhpdCIsICJFeGl0IGN1cnJlbnQgbW9kZSBhbmQgZG93biB0byBwcmV2aW91cyBtb2RlXG4iKQoreworCXN3aXRjaCAodnR5LT5ub2RlKSB7CisJY2FzZSBHU01ORVRfTk9ERToKKwkJdnR5LT5ub2RlID0gQ09ORklHX05PREU7CisJCXZ0eS0+aW5kZXggPSBOVUxMOworCQlicmVhazsKKwljYXNlIEJUU19OT0RFOgorCQl2dHktPm5vZGUgPSBHU01ORVRfTk9ERTsKKwkJeworCQkJLyogc2V0IHZ0eS0+aW5kZXggY29ycmVjdGx5ICEgKi8KKwkJCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCQkJdnR5LT5pbmRleCA9IGJ0cy0+bmV0d29yazsKKwkJfQorCQlicmVhazsKKwljYXNlIFRSWF9OT0RFOgorCQl2dHktPm5vZGUgPSBCVFNfTk9ERTsKKwkJeworCQkJLyogc2V0IHZ0eS0+aW5kZXggY29ycmVjdGx5ICEgKi8KKwkJCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKwkJCXZ0eS0+aW5kZXggPSB0cngtPmJ0czsKKwkJfQorCQlicmVhazsKKwljYXNlIFRTX05PREU6CisJCXZ0eS0+bm9kZSA9IFRSWF9OT0RFOworCQl7CisJCQkvKiBzZXQgdnR5LT5pbmRleCBjb3JyZWN0bHkgISAqLworCQkJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9IHZ0eS0+aW5kZXg7CisJCQl2dHktPmluZGV4ID0gdHMtPnRyeDsKKwkJfQorCQlicmVhazsKKwljYXNlIFNVQlNDUl9OT0RFOgorCQl2dHktPm5vZGUgPSBWSUVXX05PREU7CisJCXN1YnNjcl9wdXQodnR5LT5pbmRleCk7CisJCXZ0eS0+aW5kZXggPSBOVUxMOworCQlicmVhazsKKwljYXNlIFZJRVdfTk9ERToKKwljYXNlIEVOQUJMRV9OT0RFOgorCQlpZiAoMCkJCS8vdnR5X3NoZWxsICh2dHkpKQorCQkJZXhpdCgwKTsKKwkJZWxzZQorCQkJdnR5LT5zdGF0dXMgPSBWVFlfQ0xPU0U7CisJCWJyZWFrOworCWNhc2UgQ09ORklHX05PREU6CisJCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOworCQl2dHlfY29uZmlnX3VubG9jayh2dHkpOworCQlicmVhazsKKwljYXNlIFZUWV9OT0RFOgorCQl2dHktPm5vZGUgPSBDT05GSUdfTk9ERTsKKwkJYnJlYWs7CisJZGVmYXVsdDoKKwkJYnJlYWs7CisJfQorCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogcXVpdCBpcyBhbGlhcyBvZiBleGl0LiAqLworQUxJQVMoY29uZmlnX2V4aXQsCisgICAgICBjb25maWdfcXVpdF9jbWQsICJxdWl0IiwgIkV4aXQgY3VycmVudCBtb2RlIGFuZCBkb3duIHRvIHByZXZpb3VzIG1vZGVcbiIpCisKKy8qIEVuZCBvZiBjb25maWd1cmF0aW9uLiAqLworICAgIERFRlVOKGNvbmZpZ19lbmQsCisgICAgICBjb25maWdfZW5kX2NtZCwgImVuZCIsICJFbmQgY3VycmVudCBtb2RlIGFuZCBjaGFuZ2UgdG8gZW5hYmxlIG1vZGUuIikKK3sKKwlzd2l0Y2ggKHZ0eS0+bm9kZSkgeworCWNhc2UgVklFV19OT0RFOgorCWNhc2UgRU5BQkxFX05PREU6CisJCS8qIE5vdGhpbmcgdG8gZG8uICovCisJCWJyZWFrOworCWNhc2UgQ09ORklHX05PREU6CisJY2FzZSBWVFlfTk9ERToKKwkJdnR5X2NvbmZpZ191bmxvY2sodnR5KTsKKwkJdnR5LT5ub2RlID0gRU5BQkxFX05PREU7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCWJyZWFrOworCX0KKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIFNob3cgdmVyc2lvbi4gKi8KK0RFRlVOKHNob3dfdmVyc2lvbiwKKyAgICAgIHNob3dfdmVyc2lvbl9jbWQsICJzaG93IHZlcnNpb24iLCBTSE9XX1NUUiAiRGlzcGxheXMgcHJvZ3JhbSB2ZXJzaW9uXG4iKQoreworCXZ0eV9vdXQodnR5LCAiJXMgJXMgKCVzKS4lcyIsIFFVQUdHQV9QUk9HTkFNRSwgUVVBR0dBX1ZFUlNJT04sCisJCWhvc3QubmFtZSA/IGhvc3QubmFtZSA6ICIiLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIlcyVzIiwgUVVBR0dBX0NPUFlSSUdIVCwgVlRZX05FV0xJTkUpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBIZWxwIGRpc3BsYXkgZnVuY3Rpb24gZm9yIGFsbCBub2RlLiAqLworREVGVU4oY29uZmlnX2hlbHAsCisgICAgICBjb25maWdfaGVscF9jbWQsICJoZWxwIiwgIkRlc2NyaXB0aW9uIG9mIHRoZSBpbnRlcmFjdGl2ZSBoZWxwIHN5c3RlbVxuIikKK3sKKwl2dHlfb3V0KHZ0eSwKKwkJIlRoaXMgVlRZIHByb3ZpZGVzIGFkdmFuY2VkIGhlbHAgZmVhdHVyZXMuICBXaGVuIHlvdSBuZWVkIGhlbHAsJXNcCithbnl0aW1lIGF0IHRoZSBjb21tYW5kIGxpbmUgcGxlYXNlIHByZXNzICc/Jy4lc1wKKyVzXAorSWYgbm90aGluZyBtYXRjaGVzLCB0aGUgaGVscCBsaXN0IHdpbGwgYmUgZW1wdHkgYW5kIHlvdSBtdXN0IGJhY2t1cCVzXAorIHVudGlsIGVudGVyaW5nIGEgJz8nIHNob3dzIHRoZSBhdmFpbGFibGUgb3B0aW9ucy4lc1wKK1R3byBzdHlsZXMgb2YgaGVscCBhcmUgcHJvdmlkZWQ6JXNcCisxLiBGdWxsIGhlbHAgaXMgYXZhaWxhYmxlIHdoZW4geW91IGFyZSByZWFkeSB0byBlbnRlciBhJXNcCitjb21tYW5kIGFyZ3VtZW50IChlLmcuICdzaG93ID8nKSBhbmQgZGVzY3JpYmVzIGVhY2ggcG9zc2libGUlc1wKK2FyZ3VtZW50LiVzXAorMi4gUGFydGlhbCBoZWxwIGlzIHByb3ZpZGVkIHdoZW4gYW4gYWJicmV2aWF0ZWQgYXJndW1lbnQgaXMgZW50ZXJlZCVzXAorICAgYW5kIHlvdSB3YW50IHRvIGtub3cgd2hhdCBhcmd1bWVudHMgbWF0Y2ggdGhlIGlucHV0JXNcCisgICAoZS5nLiAnc2hvdyBtZT8nLiklcyVzIiwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwKKwkJVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSwgVlRZX05FV0xJTkUpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogSGVscCBkaXNwbGF5IGZ1bmN0aW9uIGZvciBhbGwgbm9kZS4gKi8KK0RFRlVOKGNvbmZpZ19saXN0LCBjb25maWdfbGlzdF9jbWQsICJsaXN0IiwgIlByaW50IGNvbW1hbmQgbGlzdFxuIikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwlzdHJ1Y3QgY21kX25vZGUgKmNub2RlID0gdmVjdG9yX3Nsb3QoY21kdmVjLCB2dHktPm5vZGUpOworCXN0cnVjdCBjbWRfZWxlbWVudCAqY21kOworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoY25vZGUtPmNtZF92ZWN0b3IpOyBpKyspCisJCWlmICgoY21kID0gdmVjdG9yX3Nsb3QoY25vZGUtPmNtZF92ZWN0b3IsIGkpKSAhPSBOVUxMCisJCSAgICAmJiAhKGNtZC0+YXR0ciA9PSBDTURfQVRUUl9ERVBSRUNBVEVECisJCQkgfHwgY21kLT5hdHRyID09IENNRF9BVFRSX0hJRERFTikpCisJCQl2dHlfb3V0KHZ0eSwgIiAgJXMlcyIsIGNtZC0+c3RyaW5nLCBWVFlfTkVXTElORSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBXcml0ZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gaW50byBmaWxlLiAqLworREVGVU4oY29uZmlnX3dyaXRlX2ZpbGUsCisgICAgICBjb25maWdfd3JpdGVfZmlsZV9jbWQsCisgICAgICAid3JpdGUgZmlsZSIsCisgICAgICAiV3JpdGUgcnVubmluZyBjb25maWd1cmF0aW9uIHRvIG1lbW9yeSwgbmV0d29yaywgb3IgdGVybWluYWxcbiIKKyAgICAgICJXcml0ZSB0byBjb25maWd1cmF0aW9uIGZpbGVcbiIpCit7CisJdW5zaWduZWQgaW50IGk7CisJaW50IGZkOworCXN0cnVjdCBjbWRfbm9kZSAqbm9kZTsKKwljaGFyICpjb25maWdfZmlsZTsKKwljaGFyICpjb25maWdfZmlsZV90bXAgPSBOVUxMOworCWNoYXIgKmNvbmZpZ19maWxlX3NhdiA9IE5VTEw7CisJc3RydWN0IHZ0eSAqZmlsZV92dHk7CisKKwkvKiBDaGVjayBhbmQgc2VlIGlmIHdlIGFyZSBvcGVyYXRpbmcgdW5kZXIgdnR5c2ggY29uZmlndXJhdGlvbiAqLworCWlmIChob3N0LmNvbmZpZyA9PSBOVUxMKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2FuJ3Qgc2F2ZSB0byBjb25maWd1cmF0aW9uIGZpbGUsIHVzaW5nIHZ0eXNoLiVzIiwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCS8qIEdldCBmaWxlbmFtZS4gKi8KKwljb25maWdfZmlsZSA9IGhvc3QuY29uZmlnOworCisJY29uZmlnX2ZpbGVfc2F2ID0KKwkgICAgX3RhbGxvY196ZXJvKHRhbGxfdnR5X2NtZF9jdHgsCisJCQkgc3RybGVuKGNvbmZpZ19maWxlKSArIHN0cmxlbihDT05GX0JBQ0tVUF9FWFQpICsgMSwKKwkJCSAiY29uZmlnX2ZpbGVfc2F2Iik7CisJc3RyY3B5KGNvbmZpZ19maWxlX3NhdiwgY29uZmlnX2ZpbGUpOworCXN0cmNhdChjb25maWdfZmlsZV9zYXYsIENPTkZfQkFDS1VQX0VYVCk7CisKKwljb25maWdfZmlsZV90bXAgPSBfdGFsbG9jX3plcm8odGFsbF92dHlfY21kX2N0eCwgc3RybGVuKGNvbmZpZ19maWxlKSArIDgsCisJCQkJCSJjb25maWdfZmlsZV90bXAiKTsKKwlzcHJpbnRmKGNvbmZpZ19maWxlX3RtcCwgIiVzLlhYWFhYWCIsIGNvbmZpZ19maWxlKTsKKworCS8qIE9wZW4gZmlsZSB0byBjb25maWd1cmF0aW9uIHdyaXRlLiAqLworCWZkID0gbWtzdGVtcChjb25maWdfZmlsZV90bXApOworCWlmIChmZCA8IDApIHsKKwkJdnR5X291dCh2dHksICJDYW4ndCBvcGVuIGNvbmZpZ3VyYXRpb24gZmlsZSAlcy4lcyIsCisJCQljb25maWdfZmlsZV90bXAsIFZUWV9ORVdMSU5FKTsKKwkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfdG1wKTsKKwkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfc2F2KTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCS8qIE1ha2UgdnR5IGZvciBjb25maWd1cmF0aW9uIGZpbGUuICovCisJZmlsZV92dHkgPSB2dHlfbmV3KCk7CisJZmlsZV92dHktPmZkID0gZmQ7CisJZmlsZV92dHktPnR5cGUgPSBWVFlfRklMRTsKKworCS8qIENvbmZpZyBmaWxlIGhlYWRlciBwcmludC4gKi8KKwl2dHlfb3V0KGZpbGVfdnR5LCAiIVxuISBPcGVuQlNDIGNvbmZpZ3VyYXRpb24gc2F2ZWQgZnJvbSB2dHlcbiEgICAiKTsKKwkvL3Z0eV90aW1lX3ByaW50IChmaWxlX3Z0eSwgMSk7CisJdnR5X291dChmaWxlX3Z0eSwgIiFcbiIpOworCisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoY21kdmVjKTsgaSsrKQorCQlpZiAoKG5vZGUgPSB2ZWN0b3Jfc2xvdChjbWR2ZWMsIGkpKSAmJiBub2RlLT5mdW5jKSB7CisJCQlpZiAoKCpub2RlLT5mdW5jKSAoZmlsZV92dHkpKQorCQkJCXZ0eV9vdXQoZmlsZV92dHksICIhXG4iKTsKKwkJfQorCXZ0eV9jbG9zZShmaWxlX3Z0eSk7CisKKwlpZiAodW5saW5rKGNvbmZpZ19maWxlX3NhdikgIT0gMCkKKwkJaWYgKGVycm5vICE9IEVOT0VOVCkgeworCQkJdnR5X291dCh2dHksCisJCQkJIkNhbid0IHVubGluayBiYWNrdXAgY29uZmlndXJhdGlvbiBmaWxlICVzLiVzIiwKKwkJCQljb25maWdfZmlsZV9zYXYsIFZUWV9ORVdMSU5FKTsKKwkJCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3Nhdik7CisJCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV90bXApOworCQkJdW5saW5rKGNvbmZpZ19maWxlX3RtcCk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwlpZiAobGluayhjb25maWdfZmlsZSwgY29uZmlnX2ZpbGVfc2F2KSAhPSAwKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2FuJ3QgYmFja3VwIG9sZCBjb25maWd1cmF0aW9uIGZpbGUgJXMuJXMiLAorCQkJY29uZmlnX2ZpbGVfc2F2LCBWVFlfTkVXTElORSk7CisJCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3Nhdik7CisJCXRhbGxvY19mcmVlKGNvbmZpZ19maWxlX3RtcCk7CisJCXVubGluayhjb25maWdfZmlsZV90bXApOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCXN5bmMoKTsKKwlpZiAodW5saW5rKGNvbmZpZ19maWxlKSAhPSAwKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2FuJ3QgdW5saW5rIGNvbmZpZ3VyYXRpb24gZmlsZSAlcy4lcyIsCisJCQljb25maWdfZmlsZSwgVlRZX05FV0xJTkUpOworCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV9zYXYpOworCQl0YWxsb2NfZnJlZShjb25maWdfZmlsZV90bXApOworCQl1bmxpbmsoY29uZmlnX2ZpbGVfdG1wKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwlpZiAobGluayhjb25maWdfZmlsZV90bXAsIGNvbmZpZ19maWxlKSAhPSAwKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2FuJ3Qgc2F2ZSBjb25maWd1cmF0aW9uIGZpbGUgJXMuJXMiLCBjb25maWdfZmlsZSwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfc2F2KTsKKwkJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfdG1wKTsKKwkJdW5saW5rKGNvbmZpZ19maWxlX3RtcCk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisJdW5saW5rKGNvbmZpZ19maWxlX3RtcCk7CisJc3luYygpOworCisJdGFsbG9jX2ZyZWUoY29uZmlnX2ZpbGVfc2F2KTsKKwl0YWxsb2NfZnJlZShjb25maWdfZmlsZV90bXApOworCisJaWYgKGNobW9kKGNvbmZpZ19maWxlLCAwNjY2ICYgfkNPTkZJR0ZJTEVfTUFTSykgIT0gMCkgeworCQl2dHlfb3V0KHZ0eSwgIkNhbid0IGNobW9kIGNvbmZpZ3VyYXRpb24gZmlsZSAlczogJXMgKCVkKS4lcyIsCisJCQljb25maWdfZmlsZSwgc3RyZXJyb3IoZXJybm8pLCBlcnJubywgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJdnR5X291dCh2dHksICJDb25maWd1cmF0aW9uIHNhdmVkIHRvICVzJXMiLCBjb25maWdfZmlsZSwgVlRZX05FV0xJTkUpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworQUxJQVMoY29uZmlnX3dyaXRlX2ZpbGUsCisgICAgICBjb25maWdfd3JpdGVfY21kLAorICAgICAgIndyaXRlIiwgIldyaXRlIHJ1bm5pbmcgY29uZmlndXJhdGlvbiB0byBtZW1vcnksIG5ldHdvcmssIG9yIHRlcm1pbmFsXG4iKQorCisgICAgQUxJQVMoY29uZmlnX3dyaXRlX2ZpbGUsCisgICAgICBjb25maWdfd3JpdGVfbWVtb3J5X2NtZCwKKyAgICAgICJ3cml0ZSBtZW1vcnkiLAorICAgICAgIldyaXRlIHJ1bm5pbmcgY29uZmlndXJhdGlvbiB0byBtZW1vcnksIG5ldHdvcmssIG9yIHRlcm1pbmFsXG4iCisgICAgICAiV3JpdGUgY29uZmlndXJhdGlvbiB0byB0aGUgZmlsZSAoc2FtZSBhcyB3cml0ZSBmaWxlKVxuIikKKworICAgIEFMSUFTKGNvbmZpZ193cml0ZV9maWxlLAorICAgICAgY29weV9ydW5uaW5nY29uZmlnX3N0YXJ0dXBjb25maWdfY21kLAorICAgICAgImNvcHkgcnVubmluZy1jb25maWcgc3RhcnR1cC1jb25maWciLAorICAgICAgIkNvcHkgY29uZmlndXJhdGlvblxuIgorICAgICAgIkNvcHkgcnVubmluZyBjb25maWcgdG8uLi4gXG4iCisgICAgICAiQ29weSBydW5uaW5nIGNvbmZpZyB0byBzdGFydHVwIGNvbmZpZyAoc2FtZSBhcyB3cml0ZSBmaWxlKVxuIikKKworLyogV3JpdGUgY3VycmVudCBjb25maWd1cmF0aW9uIGludG8gdGhlIHRlcm1pbmFsLiAqLworICAgIERFRlVOKGNvbmZpZ193cml0ZV90ZXJtaW5hbCwKKyAgICAgIGNvbmZpZ193cml0ZV90ZXJtaW5hbF9jbWQsCisgICAgICAid3JpdGUgdGVybWluYWwiLAorICAgICAgIldyaXRlIHJ1bm5pbmcgY29uZmlndXJhdGlvbiB0byBtZW1vcnksIG5ldHdvcmssIG9yIHRlcm1pbmFsXG4iCisgICAgICAiV3JpdGUgdG8gdGVybWluYWxcbiIpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IGNtZF9ub2RlICpub2RlOworCisJaWYgKHZ0eS0+dHlwZSA9PSBWVFlfU0hFTExfU0VSVikgeworCQlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWR2ZWMpOyBpKyspCisJCQlpZiAoKG5vZGUgPSB2ZWN0b3Jfc2xvdChjbWR2ZWMsIGkpKSAmJiBub2RlLT5mdW5jCisJCQkgICAgJiYgbm9kZS0+dnR5c2gpIHsKKwkJCQlpZiAoKCpub2RlLT5mdW5jKSAodnR5KSkKKwkJCQkJdnR5X291dCh2dHksICIhJXMiLCBWVFlfTkVXTElORSk7CisJCQl9CisJfSBlbHNlIHsKKwkJdnR5X291dCh2dHksICIlc0N1cnJlbnQgY29uZmlndXJhdGlvbjolcyIsIFZUWV9ORVdMSU5FLAorCQkJVlRZX05FV0xJTkUpOworCQl2dHlfb3V0KHZ0eSwgIiElcyIsIFZUWV9ORVdMSU5FKTsKKworCQlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShjbWR2ZWMpOyBpKyspCisJCQlpZiAoKG5vZGUgPSB2ZWN0b3Jfc2xvdChjbWR2ZWMsIGkpKSAmJiBub2RlLT5mdW5jKSB7CisJCQkJaWYgKCgqbm9kZS0+ZnVuYykgKHZ0eSkpCisJCQkJCXZ0eV9vdXQodnR5LCAiISVzIiwgVlRZX05FV0xJTkUpOworCQkJfQorCQl2dHlfb3V0KHZ0eSwgImVuZCVzIiwgVlRZX05FV0xJTkUpOworCX0KKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIFdyaXRlIGN1cnJlbnQgY29uZmlndXJhdGlvbiBpbnRvIHRoZSB0ZXJtaW5hbC4gKi8KK0FMSUFTKGNvbmZpZ193cml0ZV90ZXJtaW5hbCwKKyAgICAgIHNob3dfcnVubmluZ19jb25maWdfY21kLAorICAgICAgInNob3cgcnVubmluZy1jb25maWciLCBTSE9XX1NUUiAicnVubmluZyBjb25maWd1cmF0aW9uXG4iKQorCisvKiBXcml0ZSBzdGFydHVwIGNvbmZpZ3VyYXRpb24gaW50byB0aGUgdGVybWluYWwuICovCisgICAgREVGVU4oc2hvd19zdGFydHVwX2NvbmZpZywKKyAgICAgIHNob3dfc3RhcnR1cF9jb25maWdfY21kLAorICAgICAgInNob3cgc3RhcnR1cC1jb25maWciLCBTSE9XX1NUUiAiQ29udGVudGVzIG9mIHN0YXJ0dXAgY29uZmlndXJhdGlvblxuIikKK3sKKwljaGFyIGJ1ZltCVUZTSVpdOworCUZJTEUgKmNvbmZwOworCisJY29uZnAgPSBmb3Blbihob3N0LmNvbmZpZywgInIiKTsKKwlpZiAoY29uZnAgPT0gTlVMTCkgeworCQl2dHlfb3V0KHZ0eSwgIkNhbid0IG9wZW4gY29uZmlndXJhdGlvbiBmaWxlIFslc10lcyIsCisJCQlob3N0LmNvbmZpZywgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJd2hpbGUgKGZnZXRzKGJ1ZiwgQlVGU0laLCBjb25mcCkpIHsKKwkJY2hhciAqY3AgPSBidWY7CisKKwkJd2hpbGUgKCpjcCAhPSAnXHInICYmICpjcCAhPSAnXG4nICYmICpjcCAhPSAnXDAnKQorCQkJY3ArKzsKKwkJKmNwID0gJ1wwJzsKKworCQl2dHlfb3V0KHZ0eSwgIiVzJXMiLCBidWYsIFZUWV9ORVdMSU5FKTsKKwl9CisKKwlmY2xvc2UoY29uZnApOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBIb3N0bmFtZSBjb25maWd1cmF0aW9uICovCitERUZVTihjb25maWdfaG9zdG5hbWUsCisgICAgICBob3N0bmFtZV9jbWQsCisgICAgICAiaG9zdG5hbWUgV09SRCIsCisgICAgICAiU2V0IHN5c3RlbSdzIG5ldHdvcmsgbmFtZVxuIiAiVGhpcyBzeXN0ZW0ncyBuZXR3b3JrIG5hbWVcbiIpCit7CisJaWYgKCFpc2FscGhhKChpbnQpKmFyZ3ZbMF0pKSB7CisJCXZ0eV9vdXQodnR5LCAiUGxlYXNlIHNwZWNpZnkgc3RyaW5nIHN0YXJ0aW5nIHdpdGggYWxwaGFiZXQlcyIsCisJCQlWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAoaG9zdC5uYW1lKQorCQl0YWxsb2NfZnJlZShob3N0Lm5hbWUpOworCisJaG9zdC5uYW1lID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCBhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNvbmZpZ19ub19ob3N0bmFtZSwKKyAgICAgIG5vX2hvc3RuYW1lX2NtZCwKKyAgICAgICJubyBob3N0bmFtZSBbSE9TVE5BTUVdIiwKKyAgICAgIE5PX1NUUiAiUmVzZXQgc3lzdGVtJ3MgbmV0d29yayBuYW1lXG4iICJIb3N0IG5hbWUgb2YgdGhpcyByb3V0ZXJcbiIpCit7CisJaWYgKGhvc3QubmFtZSkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5uYW1lKTsKKwlob3N0Lm5hbWUgPSBOVUxMOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogVlRZIGludGVyZmFjZSBwYXNzd29yZCBzZXQuICovCitERUZVTihjb25maWdfcGFzc3dvcmQsIHBhc3N3b3JkX2NtZCwKKyAgICAgICJwYXNzd29yZCAoOHwpIFdPUkQiLAorICAgICAgIkFzc2lnbiB0aGUgdGVybWluYWwgY29ubmVjdGlvbiBwYXNzd29yZFxuIgorICAgICAgIlNwZWNpZmllcyBhIEhJRERFTiBwYXNzd29yZCB3aWxsIGZvbGxvd1xuIgorICAgICAgImR1bW15IHN0cmluZyBcbiIgIlRoZSBISURERU4gbGluZSBwYXNzd29yZCBzdHJpbmdcbiIpCit7CisJLyogQXJndW1lbnQgY2hlY2suICovCisJaWYgKGFyZ2MgPT0gMCkgeworCQl2dHlfb3V0KHZ0eSwgIlBsZWFzZSBzcGVjaWZ5IHBhc3N3b3JkLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKGFyZ2MgPT0gMikgeworCQlpZiAoKmFyZ3ZbMF0gPT0gJzgnKSB7CisJCQlpZiAoaG9zdC5wYXNzd29yZCkKKwkJCQl0YWxsb2NfZnJlZShob3N0LnBhc3N3b3JkKTsKKwkJCWhvc3QucGFzc3dvcmQgPSBOVUxMOworCQkJaWYgKGhvc3QucGFzc3dvcmRfZW5jcnlwdCkKKwkJCQl0YWxsb2NfZnJlZShob3N0LnBhc3N3b3JkX2VuY3J5cHQpOworCQkJaG9zdC5wYXNzd29yZF9lbmNyeXB0ID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCBhcmd2WzFdKTsKKwkJCXJldHVybiBDTURfU1VDQ0VTUzsKKwkJfSBlbHNlIHsKKwkJCXZ0eV9vdXQodnR5LCAiVW5rbm93biBlbmNyeXB0aW9uIHR5cGUuJXMiLCBWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwl9CisKKwlpZiAoIWlzYWxudW0oKGludCkqYXJndlswXSkpIHsKKwkJdnR5X291dCh2dHksCisJCQkiUGxlYXNlIHNwZWNpZnkgc3RyaW5nIHN0YXJ0aW5nIHdpdGggYWxwaGFudW1lcmljJXMiLAorCQkJVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKGhvc3QucGFzc3dvcmQpCisJCXRhbGxvY19mcmVlKGhvc3QucGFzc3dvcmQpOworCWhvc3QucGFzc3dvcmQgPSBOVUxMOworCisjaWZkZWYgVlRZX0NSWVBUX1BXCisJaWYgKGhvc3QuZW5jcnlwdCkgeworCQlpZiAoaG9zdC5wYXNzd29yZF9lbmNyeXB0KQorCQkJdGFsbG9jX2ZyZWUoaG9zdC5wYXNzd29yZF9lbmNyeXB0KTsKKwkJaG9zdC5wYXNzd29yZF9lbmNyeXB0ID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCB6ZW5jcnlwdChhcmd2WzBdKSk7CisJfSBlbHNlCisjZW5kaWYKKwkJaG9zdC5wYXNzd29yZCA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0FMSUFTKGNvbmZpZ19wYXNzd29yZCwgcGFzc3dvcmRfdGV4dF9jbWQsCisgICAgICAicGFzc3dvcmQgTElORSIsCisgICAgICAiQXNzaWduIHRoZSB0ZXJtaW5hbCBjb25uZWN0aW9uIHBhc3N3b3JkXG4iCisgICAgICAiVGhlIFVORU5DUllQVEVEIChjbGVhcnRleHQpIGxpbmUgcGFzc3dvcmRcbiIpCisKKy8qIFZUWSBlbmFibGUgcGFzc3dvcmQgc2V0LiAqLworICAgIERFRlVOKGNvbmZpZ19lbmFibGVfcGFzc3dvcmQsIGVuYWJsZV9wYXNzd29yZF9jbWQsCisgICAgICAiZW5hYmxlIHBhc3N3b3JkICg4fCkgV09SRCIsCisgICAgICAiTW9kaWZ5IGVuYWJsZSBwYXNzd29yZCBwYXJhbWV0ZXJzXG4iCisgICAgICAiQXNzaWduIHRoZSBwcml2aWxlZ2VkIGxldmVsIHBhc3N3b3JkXG4iCisgICAgICAiU3BlY2lmaWVzIGEgSElEREVOIHBhc3N3b3JkIHdpbGwgZm9sbG93XG4iCisgICAgICAiZHVtbXkgc3RyaW5nIFxuIiAiVGhlIEhJRERFTiAnZW5hYmxlJyBwYXNzd29yZCBzdHJpbmdcbiIpCit7CisJLyogQXJndW1lbnQgY2hlY2suICovCisJaWYgKGFyZ2MgPT0gMCkgeworCQl2dHlfb3V0KHZ0eSwgIlBsZWFzZSBzcGVjaWZ5IHBhc3N3b3JkLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJLyogQ3J5cHQgdHlwZSBpcyBzcGVjaWZpZWQuICovCisJaWYgKGFyZ2MgPT0gMikgeworCQlpZiAoKmFyZ3ZbMF0gPT0gJzgnKSB7CisJCQlpZiAoaG9zdC5lbmFibGUpCisJCQkJdGFsbG9jX2ZyZWUoaG9zdC5lbmFibGUpOworCQkJaG9zdC5lbmFibGUgPSBOVUxMOworCisJCQlpZiAoaG9zdC5lbmFibGVfZW5jcnlwdCkKKwkJCQl0YWxsb2NfZnJlZShob3N0LmVuYWJsZV9lbmNyeXB0KTsKKwkJCWhvc3QuZW5hYmxlX2VuY3J5cHQgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIGFyZ3ZbMV0pOworCisJCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJCX0gZWxzZSB7CisJCQl2dHlfb3V0KHZ0eSwgIlVua25vd24gZW5jcnlwdGlvbiB0eXBlLiVzIiwgVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJfQorCisJaWYgKCFpc2FsbnVtKChpbnQpKmFyZ3ZbMF0pKSB7CisJCXZ0eV9vdXQodnR5LAorCQkJIlBsZWFzZSBzcGVjaWZ5IHN0cmluZyBzdGFydGluZyB3aXRoIGFscGhhbnVtZXJpYyVzIiwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWlmIChob3N0LmVuYWJsZSkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5lbmFibGUpOworCWhvc3QuZW5hYmxlID0gTlVMTDsKKworCS8qIFBsYWluIHBhc3N3b3JkIGlucHV0LiAqLworI2lmZGVmIFZUWV9DUllQVF9QVworCWlmIChob3N0LmVuY3J5cHQpIHsKKwkJaWYgKGhvc3QuZW5hYmxlX2VuY3J5cHQpCisJCQl0YWxsb2NfZnJlZShob3N0LmVuYWJsZV9lbmNyeXB0KTsKKwkJaG9zdC5lbmFibGVfZW5jcnlwdCA9IHRhbGxvY19zdHJkdXAodGFsbF92dHlfY21kX2N0eCwgemVuY3J5cHQoYXJndlswXSkpOworCX0gZWxzZQorI2VuZGlmCisJCWhvc3QuZW5hYmxlID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCBhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworQUxJQVMoY29uZmlnX2VuYWJsZV9wYXNzd29yZCwKKyAgICAgIGVuYWJsZV9wYXNzd29yZF90ZXh0X2NtZCwKKyAgICAgICJlbmFibGUgcGFzc3dvcmQgTElORSIsCisgICAgICAiTW9kaWZ5IGVuYWJsZSBwYXNzd29yZCBwYXJhbWV0ZXJzXG4iCisgICAgICAiQXNzaWduIHRoZSBwcml2aWxlZ2VkIGxldmVsIHBhc3N3b3JkXG4iCisgICAgICAiVGhlIFVORU5DUllQVEVEIChjbGVhcnRleHQpICdlbmFibGUnIHBhc3N3b3JkXG4iKQorCisvKiBWVFkgZW5hYmxlIHBhc3N3b3JkIGRlbGV0ZS4gKi8KKyAgICBERUZVTihub19jb25maWdfZW5hYmxlX3Bhc3N3b3JkLCBub19lbmFibGVfcGFzc3dvcmRfY21kLAorICAgICAgIm5vIGVuYWJsZSBwYXNzd29yZCIsCisgICAgICBOT19TVFIKKyAgICAgICJNb2RpZnkgZW5hYmxlIHBhc3N3b3JkIHBhcmFtZXRlcnNcbiIKKyAgICAgICJBc3NpZ24gdGhlIHByaXZpbGVnZWQgbGV2ZWwgcGFzc3dvcmRcbiIpCit7CisJaWYgKGhvc3QuZW5hYmxlKQorCQl0YWxsb2NfZnJlZShob3N0LmVuYWJsZSk7CisJaG9zdC5lbmFibGUgPSBOVUxMOworCisJaWYgKGhvc3QuZW5hYmxlX2VuY3J5cHQpCisJCXRhbGxvY19mcmVlKGhvc3QuZW5hYmxlX2VuY3J5cHQpOworCWhvc3QuZW5hYmxlX2VuY3J5cHQgPSBOVUxMOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisjaWZkZWYgVlRZX0NSWVBUX1BXCitERUZVTihzZXJ2aWNlX3Bhc3N3b3JkX2VuY3J5cHQsCisgICAgICBzZXJ2aWNlX3Bhc3N3b3JkX2VuY3J5cHRfY21kLAorICAgICAgInNlcnZpY2UgcGFzc3dvcmQtZW5jcnlwdGlvbiIsCisgICAgICAiU2V0IHVwIG1pc2NlbGxhbmVvdXMgc2VydmljZVxuIiAiRW5hYmxlIGVuY3J5cHRlZCBwYXNzd29yZHNcbiIpCit7CisJaWYgKGhvc3QuZW5jcnlwdCkKKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCisJaG9zdC5lbmNyeXB0ID0gMTsKKworCWlmIChob3N0LnBhc3N3b3JkKSB7CisJCWlmIChob3N0LnBhc3N3b3JkX2VuY3J5cHQpCisJCQl0YWxsb2NfZnJlZShob3N0LnBhc3N3b3JkX2VuY3J5cHQpOworCQlob3N0LnBhc3N3b3JkX2VuY3J5cHQgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIHplbmNyeXB0KGhvc3QucGFzc3dvcmQpKTsKKwl9CisJaWYgKGhvc3QuZW5hYmxlKSB7CisJCWlmIChob3N0LmVuYWJsZV9lbmNyeXB0KQorCQkJdGFsbG9jX2ZyZWUoaG9zdC5lbmFibGVfZW5jcnlwdCk7CisJCWhvc3QuZW5hYmxlX2VuY3J5cHQgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIHplbmNyeXB0KGhvc3QuZW5hYmxlKSk7CisJfQorCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihub19zZXJ2aWNlX3Bhc3N3b3JkX2VuY3J5cHQsCisgICAgICBub19zZXJ2aWNlX3Bhc3N3b3JkX2VuY3J5cHRfY21kLAorICAgICAgIm5vIHNlcnZpY2UgcGFzc3dvcmQtZW5jcnlwdGlvbiIsCisgICAgICBOT19TVFIgIlNldCB1cCBtaXNjZWxsYW5lb3VzIHNlcnZpY2VcbiIgIkVuYWJsZSBlbmNyeXB0ZWQgcGFzc3dvcmRzXG4iKQoreworCWlmICghaG9zdC5lbmNyeXB0KQorCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisKKwlob3N0LmVuY3J5cHQgPSAwOworCisJaWYgKGhvc3QucGFzc3dvcmRfZW5jcnlwdCkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5wYXNzd29yZF9lbmNyeXB0KTsKKwlob3N0LnBhc3N3b3JkX2VuY3J5cHQgPSBOVUxMOworCisJaWYgKGhvc3QuZW5hYmxlX2VuY3J5cHQpCisJCXRhbGxvY19mcmVlKGhvc3QuZW5hYmxlX2VuY3J5cHQpOworCWhvc3QuZW5hYmxlX2VuY3J5cHQgPSBOVUxMOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorI2VuZGlmCisKK0RFRlVOKGNvbmZpZ190ZXJtaW5hbF9sZW5ndGgsIGNvbmZpZ190ZXJtaW5hbF9sZW5ndGhfY21kLAorICAgICAgInRlcm1pbmFsIGxlbmd0aCA8MC01MTI+IiwKKyAgICAgICJTZXQgdGVybWluYWwgbGluZSBwYXJhbWV0ZXJzXG4iCisgICAgICAiU2V0IG51bWJlciBvZiBsaW5lcyBvbiBhIHNjcmVlblxuIgorICAgICAgIk51bWJlciBvZiBsaW5lcyBvbiBzY3JlZW4gKDAgZm9yIG5vIHBhdXNpbmcpXG4iKQoreworCWludCBsaW5lczsKKwljaGFyICplbmRwdHIgPSBOVUxMOworCisJbGluZXMgPSBzdHJ0b2woYXJndlswXSwgJmVuZHB0ciwgMTApOworCWlmIChsaW5lcyA8IDAgfHwgbGluZXMgPiA1MTIgfHwgKmVuZHB0ciAhPSAnXDAnKSB7CisJCXZ0eV9vdXQodnR5LCAibGVuZ3RoIGlzIG1hbGZvcm1lZCVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCXZ0eS0+bGluZXMgPSBsaW5lczsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY29uZmlnX3Rlcm1pbmFsX25vX2xlbmd0aCwgY29uZmlnX3Rlcm1pbmFsX25vX2xlbmd0aF9jbWQsCisgICAgICAidGVybWluYWwgbm8gbGVuZ3RoIiwKKyAgICAgICJTZXQgdGVybWluYWwgbGluZSBwYXJhbWV0ZXJzXG4iCisgICAgICBOT19TVFIgIlNldCBudW1iZXIgb2YgbGluZXMgb24gYSBzY3JlZW5cbiIpCit7CisJdnR5LT5saW5lcyA9IC0xOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oc2VydmljZV90ZXJtaW5hbF9sZW5ndGgsIHNlcnZpY2VfdGVybWluYWxfbGVuZ3RoX2NtZCwKKyAgICAgICJzZXJ2aWNlIHRlcm1pbmFsLWxlbmd0aCA8MC01MTI+IiwKKyAgICAgICJTZXQgdXAgbWlzY2VsbGFuZW91cyBzZXJ2aWNlXG4iCisgICAgICAiU3lzdGVtIHdpZGUgdGVybWluYWwgbGVuZ3RoIGNvbmZpZ3VyYXRpb25cbiIKKyAgICAgICJOdW1iZXIgb2YgbGluZXMgb2YgVlRZICgwIG1lYW5zIG5vIGxpbmUgY29udHJvbClcbiIpCit7CisJaW50IGxpbmVzOworCWNoYXIgKmVuZHB0ciA9IE5VTEw7CisKKwlsaW5lcyA9IHN0cnRvbChhcmd2WzBdLCAmZW5kcHRyLCAxMCk7CisJaWYgKGxpbmVzIDwgMCB8fCBsaW5lcyA+IDUxMiB8fCAqZW5kcHRyICE9ICdcMCcpIHsKKwkJdnR5X291dCh2dHksICJsZW5ndGggaXMgbWFsZm9ybWVkJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisJaG9zdC5saW5lcyA9IGxpbmVzOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihub19zZXJ2aWNlX3Rlcm1pbmFsX2xlbmd0aCwgbm9fc2VydmljZV90ZXJtaW5hbF9sZW5ndGhfY21kLAorICAgICAgIm5vIHNlcnZpY2UgdGVybWluYWwtbGVuZ3RoIFs8MC01MTI+XSIsCisgICAgICBOT19TVFIKKyAgICAgICJTZXQgdXAgbWlzY2VsbGFuZW91cyBzZXJ2aWNlXG4iCisgICAgICAiU3lzdGVtIHdpZGUgdGVybWluYWwgbGVuZ3RoIGNvbmZpZ3VyYXRpb25cbiIKKyAgICAgICJOdW1iZXIgb2YgbGluZXMgb2YgVlRZICgwIG1lYW5zIG5vIGxpbmUgY29udHJvbClcbiIpCit7CisJaG9zdC5saW5lcyA9IC0xOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU5fSElEREVOKGRvX2VjaG8sCisJICAgICBlY2hvX2NtZCwKKwkgICAgICJlY2hvIC5NRVNTQUdFIiwKKwkgICAgICJFY2hvIGEgbWVzc2FnZSBiYWNrIHRvIHRoZSB2dHlcbiIgIlRoZSBtZXNzYWdlIHRvIGVjaG9cbiIpCit7CisJY2hhciAqbWVzc2FnZTsKKworCXZ0eV9vdXQodnR5LCAiJXMlcyIsCisJCSgobWVzc2FnZSA9CisJCSAgYXJndl9jb25jYXQoYXJndiwgYXJnYywgMCkpID8gbWVzc2FnZSA6ICIiKSwgVlRZX05FV0xJTkUpOworCWlmIChtZXNzYWdlKQorCQl0YWxsb2NfZnJlZShtZXNzYWdlKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKyNpZiAwCitERUZVTihjb25maWdfbG9nbXNnLAorICAgICAgY29uZmlnX2xvZ21zZ19jbWQsCisgICAgICAibG9nbXNnICIgTE9HX0xFVkVMUyAiIC5NRVNTQUdFIiwKKyAgICAgICJTZW5kIGEgbWVzc2FnZSB0byBlbmFibGVkIGxvZ2dpbmcgZGVzdGluYXRpb25zXG4iCisgICAgICBMT0dfTEVWRUxfREVTQyAiVGhlIG1lc3NhZ2UgdG8gc2VuZFxuIikKK3sKKwlpbnQgbGV2ZWw7CisJY2hhciAqbWVzc2FnZTsKKworCWlmICgobGV2ZWwgPSBsZXZlbF9tYXRjaChhcmd2WzBdKSkgPT0gWkxPR19ESVNBQkxFRCkKKwkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisKKwl6bG9nKE5VTEwsIGxldmVsLAorCSAgICAgKChtZXNzYWdlID0gYXJndl9jb25jYXQoYXJndiwgYXJnYywgMSkpID8gbWVzc2FnZSA6ICIiKSk7CisJaWYgKG1lc3NhZ2UpCisJCXRhbGxvY19mcmVlKG1lc3NhZ2UpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oc2hvd19sb2dnaW5nLAorICAgICAgc2hvd19sb2dnaW5nX2NtZCwKKyAgICAgICJzaG93IGxvZ2dpbmciLCBTSE9XX1NUUiAiU2hvdyBjdXJyZW50IGxvZ2dpbmcgY29uZmlndXJhdGlvblxuIikKK3sKKwlzdHJ1Y3QgemxvZyAqemwgPSB6bG9nX2RlZmF1bHQ7CisKKwl2dHlfb3V0KHZ0eSwgIlN5c2xvZyBsb2dnaW5nOiAiKTsKKwlpZiAoemwtPm1heGx2bFtaTE9HX0RFU1RfU1lTTE9HXSA9PSBaTE9HX0RJU0FCTEVEKQorCQl2dHlfb3V0KHZ0eSwgImRpc2FibGVkIik7CisJZWxzZQorCQl2dHlfb3V0KHZ0eSwgImxldmVsICVzLCBmYWNpbGl0eSAlcywgaWRlbnQgJXMiLAorCQkJemxvZ19wcmlvcml0eVt6bC0+bWF4bHZsW1pMT0dfREVTVF9TWVNMT0ddXSwKKwkJCWZhY2lsaXR5X25hbWUoemwtPmZhY2lsaXR5KSwgemwtPmlkZW50KTsKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCisJdnR5X291dCh2dHksICJTdGRvdXQgbG9nZ2luZzogIik7CisJaWYgKHpsLT5tYXhsdmxbWkxPR19ERVNUX1NURE9VVF0gPT0gWkxPR19ESVNBQkxFRCkKKwkJdnR5X291dCh2dHksICJkaXNhYmxlZCIpOworCWVsc2UKKwkJdnR5X291dCh2dHksICJsZXZlbCAlcyIsCisJCQl6bG9nX3ByaW9yaXR5W3psLT5tYXhsdmxbWkxPR19ERVNUX1NURE9VVF1dKTsKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCisJdnR5X291dCh2dHksICJNb25pdG9yIGxvZ2dpbmc6ICIpOworCWlmICh6bC0+bWF4bHZsW1pMT0dfREVTVF9NT05JVE9SXSA9PSBaTE9HX0RJU0FCTEVEKQorCQl2dHlfb3V0KHZ0eSwgImRpc2FibGVkIik7CisJZWxzZQorCQl2dHlfb3V0KHZ0eSwgImxldmVsICVzIiwKKwkJCXpsb2dfcHJpb3JpdHlbemwtPm1heGx2bFtaTE9HX0RFU1RfTU9OSVRPUl1dKTsKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCisJdnR5X291dCh2dHksICJGaWxlIGxvZ2dpbmc6ICIpOworCWlmICgoemwtPm1heGx2bFtaTE9HX0RFU1RfRklMRV0gPT0gWkxPR19ESVNBQkxFRCkgfHwgIXpsLT5mcCkKKwkJdnR5X291dCh2dHksICJkaXNhYmxlZCIpOworCWVsc2UKKwkJdnR5X291dCh2dHksICJsZXZlbCAlcywgZmlsZW5hbWUgJXMiLAorCQkJemxvZ19wcmlvcml0eVt6bC0+bWF4bHZsW1pMT0dfREVTVF9GSUxFXV0sCisJCQl6bC0+ZmlsZW5hbWUpOworCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisKKwl2dHlfb3V0KHZ0eSwgIlByb3RvY29sIG5hbWU6ICVzJXMiLAorCQl6bG9nX3Byb3RvX25hbWVzW3psLT5wcm90b2NvbF0sIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIlJlY29yZCBwcmlvcml0eTogJXMlcyIsCisJCSh6bC0+cmVjb3JkX3ByaW9yaXR5ID8gImVuYWJsZWQiIDogImRpc2FibGVkIiksIFZUWV9ORVdMSU5FKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY29uZmlnX2xvZ19zdGRvdXQsCisgICAgICBjb25maWdfbG9nX3N0ZG91dF9jbWQsCisgICAgICAibG9nIHN0ZG91dCIsICJMb2dnaW5nIGNvbnRyb2xcbiIgIlNldCBzdGRvdXQgbG9nZ2luZyBsZXZlbFxuIikKK3sKKwl6bG9nX3NldF9sZXZlbChOVUxMLCBaTE9HX0RFU1RfU1RET1VULCB6bG9nX2RlZmF1bHQtPmRlZmF1bHRfbHZsKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNvbmZpZ19sb2dfc3Rkb3V0X2xldmVsLAorICAgICAgY29uZmlnX2xvZ19zdGRvdXRfbGV2ZWxfY21kLAorICAgICAgImxvZyBzdGRvdXQgIiBMT0dfTEVWRUxTLAorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIiAiU2V0IHN0ZG91dCBsb2dnaW5nIGxldmVsXG4iIExPR19MRVZFTF9ERVNDKQoreworCWludCBsZXZlbDsKKworCWlmICgobGV2ZWwgPSBsZXZlbF9tYXRjaChhcmd2WzBdKSkgPT0gWkxPR19ESVNBQkxFRCkKKwkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisJemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX1NURE9VVCwgbGV2ZWwpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obm9fY29uZmlnX2xvZ19zdGRvdXQsCisgICAgICBub19jb25maWdfbG9nX3N0ZG91dF9jbWQsCisgICAgICAibm8gbG9nIHN0ZG91dCBbTEVWRUxdIiwKKyAgICAgIE5PX1NUUiAiTG9nZ2luZyBjb250cm9sXG4iICJDYW5jZWwgbG9nZ2luZyB0byBzdGRvdXRcbiIgIkxvZ2dpbmcgbGV2ZWxcbiIpCit7CisJemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX1NURE9VVCwgWkxPR19ESVNBQkxFRCk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjb25maWdfbG9nX21vbml0b3IsCisgICAgICBjb25maWdfbG9nX21vbml0b3JfY21kLAorICAgICAgImxvZyBtb25pdG9yIiwKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIgIlNldCB0ZXJtaW5hbCBsaW5lIChtb25pdG9yKSBsb2dnaW5nIGxldmVsXG4iKQoreworCXpsb2dfc2V0X2xldmVsKE5VTEwsIFpMT0dfREVTVF9NT05JVE9SLCB6bG9nX2RlZmF1bHQtPmRlZmF1bHRfbHZsKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNvbmZpZ19sb2dfbW9uaXRvcl9sZXZlbCwKKyAgICAgIGNvbmZpZ19sb2dfbW9uaXRvcl9sZXZlbF9jbWQsCisgICAgICAibG9nIG1vbml0b3IgIiBMT0dfTEVWRUxTLAorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIgorICAgICAgIlNldCB0ZXJtaW5hbCBsaW5lIChtb25pdG9yKSBsb2dnaW5nIGxldmVsXG4iIExPR19MRVZFTF9ERVNDKQoreworCWludCBsZXZlbDsKKworCWlmICgobGV2ZWwgPSBsZXZlbF9tYXRjaChhcmd2WzBdKSkgPT0gWkxPR19ESVNBQkxFRCkKKwkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisJemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX01PTklUT1IsIGxldmVsKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX2NvbmZpZ19sb2dfbW9uaXRvciwKKyAgICAgIG5vX2NvbmZpZ19sb2dfbW9uaXRvcl9jbWQsCisgICAgICAibm8gbG9nIG1vbml0b3IgW0xFVkVMXSIsCisgICAgICBOT19TVFIKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIKKyAgICAgICJEaXNhYmxlIHRlcm1pbmFsIGxpbmUgKG1vbml0b3IpIGxvZ2dpbmdcbiIgIkxvZ2dpbmcgbGV2ZWxcbiIpCit7CisJemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX01PTklUT1IsIFpMT0dfRElTQUJMRUQpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBzZXRfbG9nX2ZpbGUoc3RydWN0IHZ0eSAqdnR5LCBjb25zdCBjaGFyICpmbmFtZSwgaW50IGxvZ2xldmVsKQoreworCWludCByZXQ7CisJY2hhciAqcCA9IE5VTEw7CisJY29uc3QgY2hhciAqZnVsbHBhdGg7CisKKwkvKiBQYXRoIGRldGVjdGlvbi4gKi8KKwlpZiAoIUlTX0RJUkVDVE9SWV9TRVAoKmZuYW1lKSkgeworCQljaGFyIGN3ZFtNQVhQQVRITEVOICsgMV07CisJCWN3ZFtNQVhQQVRITEVOXSA9ICdcMCc7CisKKwkJaWYgKGdldGN3ZChjd2QsIE1BWFBBVEhMRU4pID09IE5VTEwpIHsKKwkJCXpsb2dfZXJyKCJjb25maWdfbG9nX2ZpbGU6IFVuYWJsZSB0byBhbGxvYyBtZW0hIik7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKworCQlpZiAoKHAgPSBfdGFsbG9jX3plcm8odGFsbF92Y21kX2N0eCwKKwkJCQkgICAgICBzdHJsZW4oY3dkKSArIHN0cmxlbihmbmFtZSkgKyAyKSwKKwkJCQkgICAgICAic2V0X2xvZ19maWxlIikKKwkJICAgID09IE5VTEwpIHsKKwkJCXpsb2dfZXJyKCJjb25maWdfbG9nX2ZpbGU6IFVuYWJsZSB0byBhbGxvYyBtZW0hIik7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJc3ByaW50ZihwLCAiJXMvJXMiLCBjd2QsIGZuYW1lKTsKKwkJZnVsbHBhdGggPSBwOworCX0gZWxzZQorCQlmdWxscGF0aCA9IGZuYW1lOworCisJcmV0ID0gemxvZ19zZXRfZmlsZShOVUxMLCBmdWxscGF0aCwgbG9nbGV2ZWwpOworCisJaWYgKHApCisJCXRhbGxvY19mcmVlKHApOworCisJaWYgKCFyZXQpIHsKKwkJdnR5X291dCh2dHksICJjYW4ndCBvcGVuIGxvZ2ZpbGUgJXNcbiIsIGZuYW1lKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWlmIChob3N0LmxvZ2ZpbGUpCisJCXRhbGxvY19mcmVlKGhvc3QubG9nZmlsZSk7CisKKwlob3N0LmxvZ2ZpbGUgPSB0YWxsb2Nfc3RyZHVwKHRhbGxfdnR5X2NtZF9jdHgsIGZuYW1lKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY29uZmlnX2xvZ19maWxlLAorICAgICAgY29uZmlnX2xvZ19maWxlX2NtZCwKKyAgICAgICJsb2cgZmlsZSBGSUxFTkFNRSIsCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iICJMb2dnaW5nIHRvIGZpbGVcbiIgIkxvZ2dpbmcgZmlsZW5hbWVcbiIpCit7CisJcmV0dXJuIHNldF9sb2dfZmlsZSh2dHksIGFyZ3ZbMF0sIHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwpOworfQorCitERUZVTihjb25maWdfbG9nX2ZpbGVfbGV2ZWwsCisgICAgICBjb25maWdfbG9nX2ZpbGVfbGV2ZWxfY21kLAorICAgICAgImxvZyBmaWxlIEZJTEVOQU1FICIgTE9HX0xFVkVMUywKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIKKyAgICAgICJMb2dnaW5nIHRvIGZpbGVcbiIgIkxvZ2dpbmcgZmlsZW5hbWVcbiIgTE9HX0xFVkVMX0RFU0MpCit7CisJaW50IGxldmVsOworCisJaWYgKChsZXZlbCA9IGxldmVsX21hdGNoKGFyZ3ZbMV0pKSA9PSBaTE9HX0RJU0FCTEVEKQorCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKKwlyZXR1cm4gc2V0X2xvZ19maWxlKHZ0eSwgYXJndlswXSwgbGV2ZWwpOworfQorCitERUZVTihub19jb25maWdfbG9nX2ZpbGUsCisgICAgICBub19jb25maWdfbG9nX2ZpbGVfY21kLAorICAgICAgIm5vIGxvZyBmaWxlIFtGSUxFTkFNRV0iLAorICAgICAgTk9fU1RSCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iICJDYW5jZWwgbG9nZ2luZyB0byBmaWxlXG4iICJMb2dnaW5nIGZpbGUgbmFtZVxuIikKK3sKKwl6bG9nX3Jlc2V0X2ZpbGUoTlVMTCk7CisKKwlpZiAoaG9zdC5sb2dmaWxlKQorCQl0YWxsb2NfZnJlZShob3N0LmxvZ2ZpbGUpOworCisJaG9zdC5sb2dmaWxlID0gTlVMTDsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworQUxJQVMobm9fY29uZmlnX2xvZ19maWxlLAorICAgICAgbm9fY29uZmlnX2xvZ19maWxlX2xldmVsX2NtZCwKKyAgICAgICJubyBsb2cgZmlsZSBGSUxFTkFNRSBMRVZFTCIsCisgICAgICBOT19TVFIKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIKKyAgICAgICJDYW5jZWwgbG9nZ2luZyB0byBmaWxlXG4iICJMb2dnaW5nIGZpbGUgbmFtZVxuIiAiTG9nZ2luZyBsZXZlbFxuIikKKworICAgIERFRlVOKGNvbmZpZ19sb2dfc3lzbG9nLAorICAgICAgY29uZmlnX2xvZ19zeXNsb2dfY21kLAorICAgICAgImxvZyBzeXNsb2ciLCAiTG9nZ2luZyBjb250cm9sXG4iICJTZXQgc3lzbG9nIGxvZ2dpbmcgbGV2ZWxcbiIpCit7CisJemxvZ19zZXRfbGV2ZWwoTlVMTCwgWkxPR19ERVNUX1NZU0xPRywgemxvZ19kZWZhdWx0LT5kZWZhdWx0X2x2bCk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjb25maWdfbG9nX3N5c2xvZ19sZXZlbCwKKyAgICAgIGNvbmZpZ19sb2dfc3lzbG9nX2xldmVsX2NtZCwKKyAgICAgICJsb2cgc3lzbG9nICIgTE9HX0xFVkVMUywKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIgIlNldCBzeXNsb2cgbG9nZ2luZyBsZXZlbFxuIiBMT0dfTEVWRUxfREVTQykKK3sKKwlpbnQgbGV2ZWw7CisKKwlpZiAoKGxldmVsID0gbGV2ZWxfbWF0Y2goYXJndlswXSkpID09IFpMT0dfRElTQUJMRUQpCisJCXJldHVybiBDTURfRVJSX05PX01BVENIOworCXpsb2dfc2V0X2xldmVsKE5VTEwsIFpMT0dfREVTVF9TWVNMT0csIGxldmVsKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOX0RFUFJFQ0FURUQoY29uZmlnX2xvZ19zeXNsb2dfZmFjaWxpdHksCisJCSBjb25maWdfbG9nX3N5c2xvZ19mYWNpbGl0eV9jbWQsCisJCSAibG9nIHN5c2xvZyBmYWNpbGl0eSAiIExPR19GQUNJTElUSUVTLAorCQkgIkxvZ2dpbmcgY29udHJvbFxuIgorCQkgIkxvZ2dpbmcgZ29lcyB0byBzeXNsb2dcbiIKKwkJICIoRGVwcmVjYXRlZCkgRmFjaWxpdHkgcGFyYW1ldGVyIGZvciBzeXNsb2cgbWVzc2FnZXNcbiIKKwkJIExPR19GQUNJTElUWV9ERVNDKQoreworCWludCBmYWNpbGl0eTsKKworCWlmICgoZmFjaWxpdHkgPSBmYWNpbGl0eV9tYXRjaChhcmd2WzBdKSkgPCAwKQorCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKKworCXpsb2dfc2V0X2xldmVsKE5VTEwsIFpMT0dfREVTVF9TWVNMT0csIHpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwpOworCXpsb2dfZGVmYXVsdC0+ZmFjaWxpdHkgPSBmYWNpbGl0eTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX2NvbmZpZ19sb2dfc3lzbG9nLAorICAgICAgbm9fY29uZmlnX2xvZ19zeXNsb2dfY21kLAorICAgICAgIm5vIGxvZyBzeXNsb2cgW0xFVkVMXSIsCisgICAgICBOT19TVFIgIkxvZ2dpbmcgY29udHJvbFxuIiAiQ2FuY2VsIGxvZ2dpbmcgdG8gc3lzbG9nXG4iICJMb2dnaW5nIGxldmVsXG4iKQoreworCXpsb2dfc2V0X2xldmVsKE5VTEwsIFpMT0dfREVTVF9TWVNMT0csIFpMT0dfRElTQUJMRUQpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworQUxJQVMobm9fY29uZmlnX2xvZ19zeXNsb2csCisgICAgICBub19jb25maWdfbG9nX3N5c2xvZ19mYWNpbGl0eV9jbWQsCisgICAgICAibm8gbG9nIHN5c2xvZyBmYWNpbGl0eSAiIExPR19GQUNJTElUSUVTLAorICAgICAgTk9fU1RSCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iCisgICAgICAiTG9nZ2luZyBnb2VzIHRvIHN5c2xvZ1xuIgorICAgICAgIkZhY2lsaXR5IHBhcmFtZXRlciBmb3Igc3lzbG9nIG1lc3NhZ2VzXG4iIExPR19GQUNJTElUWV9ERVNDKQorCisgICAgREVGVU4oY29uZmlnX2xvZ19mYWNpbGl0eSwKKyAgICAgIGNvbmZpZ19sb2dfZmFjaWxpdHlfY21kLAorICAgICAgImxvZyBmYWNpbGl0eSAiIExPR19GQUNJTElUSUVTLAorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIgorICAgICAgIkZhY2lsaXR5IHBhcmFtZXRlciBmb3Igc3lzbG9nIG1lc3NhZ2VzXG4iIExPR19GQUNJTElUWV9ERVNDKQoreworCWludCBmYWNpbGl0eTsKKworCWlmICgoZmFjaWxpdHkgPSBmYWNpbGl0eV9tYXRjaChhcmd2WzBdKSkgPCAwKQorCQlyZXR1cm4gQ01EX0VSUl9OT19NQVRDSDsKKwl6bG9nX2RlZmF1bHQtPmZhY2lsaXR5ID0gZmFjaWxpdHk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihub19jb25maWdfbG9nX2ZhY2lsaXR5LAorICAgICAgbm9fY29uZmlnX2xvZ19mYWNpbGl0eV9jbWQsCisgICAgICAibm8gbG9nIGZhY2lsaXR5IFtGQUNJTElUWV0iLAorICAgICAgTk9fU1RSCisgICAgICAiTG9nZ2luZyBjb250cm9sXG4iCisgICAgICAiUmVzZXQgc3lzbG9nIGZhY2lsaXR5IHRvIGRlZmF1bHQgKGRhZW1vbilcbiIgIlN5c2xvZyBmYWNpbGl0eVxuIikKK3sKKwl6bG9nX2RlZmF1bHQtPmZhY2lsaXR5ID0gTE9HX0RBRU1PTjsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOX0RFUFJFQ0FURUQoY29uZmlnX2xvZ190cmFwLAorCQkgY29uZmlnX2xvZ190cmFwX2NtZCwKKwkJICJsb2cgdHJhcCAiIExPR19MRVZFTFMsCisJCSAiTG9nZ2luZyBjb250cm9sXG4iCisJCSAiKERlcHJlY2F0ZWQpIFNldCBsb2dnaW5nIGxldmVsIGFuZCBkZWZhdWx0IGZvciBhbGwgZGVzdGluYXRpb25zXG4iCisJCSBMT0dfTEVWRUxfREVTQykKK3sKKwlpbnQgbmV3X2xldmVsOworCWludCBpOworCisJaWYgKChuZXdfbGV2ZWwgPSBsZXZlbF9tYXRjaChhcmd2WzBdKSkgPT0gWkxPR19ESVNBQkxFRCkKKwkJcmV0dXJuIENNRF9FUlJfTk9fTUFUQ0g7CisKKwl6bG9nX2RlZmF1bHQtPmRlZmF1bHRfbHZsID0gbmV3X2xldmVsOworCWZvciAoaSA9IDA7IGkgPCBaTE9HX05VTV9ERVNUUzsgaSsrKQorCQlpZiAoemxvZ19kZWZhdWx0LT5tYXhsdmxbaV0gIT0gWkxPR19ESVNBQkxFRCkKKwkJCXpsb2dfZGVmYXVsdC0+bWF4bHZsW2ldID0gbmV3X2xldmVsOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU5fREVQUkVDQVRFRChub19jb25maWdfbG9nX3RyYXAsCisJCSBub19jb25maWdfbG9nX3RyYXBfY21kLAorCQkgIm5vIGxvZyB0cmFwIFtMRVZFTF0iLAorCQkgTk9fU1RSCisJCSAiTG9nZ2luZyBjb250cm9sXG4iCisJCSAiUGVybWl0IGFsbCBsb2dnaW5nIGluZm9ybWF0aW9uXG4iICJMb2dnaW5nIGxldmVsXG4iKQoreworCXpsb2dfZGVmYXVsdC0+ZGVmYXVsdF9sdmwgPSBMT0dfREVCVUc7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjb25maWdfbG9nX3JlY29yZF9wcmlvcml0eSwKKyAgICAgIGNvbmZpZ19sb2dfcmVjb3JkX3ByaW9yaXR5X2NtZCwKKyAgICAgICJsb2cgcmVjb3JkLXByaW9yaXR5IiwKKyAgICAgICJMb2dnaW5nIGNvbnRyb2xcbiIKKyAgICAgICJMb2cgdGhlIHByaW9yaXR5IG9mIHRoZSBtZXNzYWdlIHdpdGhpbiB0aGUgbWVzc2FnZVxuIikKK3sKKwl6bG9nX2RlZmF1bHQtPnJlY29yZF9wcmlvcml0eSA9IDE7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihub19jb25maWdfbG9nX3JlY29yZF9wcmlvcml0eSwKKyAgICAgIG5vX2NvbmZpZ19sb2dfcmVjb3JkX3ByaW9yaXR5X2NtZCwKKyAgICAgICJubyBsb2cgcmVjb3JkLXByaW9yaXR5IiwKKyAgICAgIE5PX1NUUgorICAgICAgIkxvZ2dpbmcgY29udHJvbFxuIgorICAgICAgIkRvIG5vdCBsb2cgdGhlIHByaW9yaXR5IG9mIHRoZSBtZXNzYWdlIHdpdGhpbiB0aGUgbWVzc2FnZVxuIikKK3sKKwl6bG9nX2RlZmF1bHQtPnJlY29yZF9wcmlvcml0eSA9IDA7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorI2VuZGlmCisKK0RFRlVOKGJhbm5lcl9tb3RkX2ZpbGUsCisgICAgICBiYW5uZXJfbW90ZF9maWxlX2NtZCwKKyAgICAgICJiYW5uZXIgbW90ZCBmaWxlIFtGSUxFXSIsCisgICAgICAiU2V0IGJhbm5lclxuIiAiQmFubmVyIGZvciBtb3RkXG4iICJCYW5uZXIgZnJvbSBhIGZpbGVcbiIgIkZpbGVuYW1lXG4iKQoreworCWlmIChob3N0Lm1vdGRmaWxlKQorCQl0YWxsb2NfZnJlZShob3N0Lm1vdGRmaWxlKTsKKwlob3N0Lm1vdGRmaWxlID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCBhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oYmFubmVyX21vdGRfZGVmYXVsdCwKKyAgICAgIGJhbm5lcl9tb3RkX2RlZmF1bHRfY21kLAorICAgICAgImJhbm5lciBtb3RkIGRlZmF1bHQiLAorICAgICAgIlNldCBiYW5uZXIgc3RyaW5nXG4iICJTdHJpbmdzIGZvciBtb3RkXG4iICJEZWZhdWx0IHN0cmluZ1xuIikKK3sKKwlob3N0Lm1vdGQgPSBkZWZhdWx0X21vdGQ7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihub19iYW5uZXJfbW90ZCwKKyAgICAgIG5vX2Jhbm5lcl9tb3RkX2NtZCwKKyAgICAgICJubyBiYW5uZXIgbW90ZCIsIE5PX1NUUiAiU2V0IGJhbm5lciBzdHJpbmdcbiIgIlN0cmluZ3MgZm9yIG1vdGRcbiIpCit7CisJaG9zdC5tb3RkID0gTlVMTDsKKwlpZiAoaG9zdC5tb3RkZmlsZSkKKwkJdGFsbG9jX2ZyZWUoaG9zdC5tb3RkZmlsZSk7CisJaG9zdC5tb3RkZmlsZSA9IE5VTEw7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBTZXQgY29uZmlnIGZpbGVuYW1lLiAgQ2FsbGVkIGZyb20gdnR5LmMgKi8KK3ZvaWQgaG9zdF9jb25maWdfc2V0KGNvbnN0IGNoYXIgKmZpbGVuYW1lKQoreworCWhvc3QuY29uZmlnID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jbWRfY3R4LCBmaWxlbmFtZSk7Cit9CisKK3ZvaWQgaW5zdGFsbF9kZWZhdWx0KGVudW0gbm9kZV90eXBlIG5vZGUpCit7CisJaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfZXhpdF9jbWQpOworCWluc3RhbGxfZWxlbWVudChub2RlLCAmY29uZmlnX3F1aXRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJmNvbmZpZ19lbmRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJmNvbmZpZ19oZWxwX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfbGlzdF9jbWQpOworCisJaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfd3JpdGVfdGVybWluYWxfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJmNvbmZpZ193cml0ZV9maWxlX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfd3JpdGVfbWVtb3J5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KG5vZGUsICZjb25maWdfd3JpdGVfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQobm9kZSwgJnNob3dfcnVubmluZ19jb25maWdfY21kKTsKK30KKworLyogSW5pdGlhbGl6ZSBjb21tYW5kIGludGVyZmFjZS4gSW5zdGFsbCBiYXNpYyBub2RlcyBhbmQgY29tbWFuZHMuICovCit2b2lkIGNtZF9pbml0KGludCB0ZXJtaW5hbCkKK3sKKwkvKiBBbGxvY2F0ZSBpbml0aWFsIHRvcCB2ZWN0b3Igb2YgY29tbWFuZHMuICovCisJY21kdmVjID0gdmVjdG9yX2luaXQoVkVDVE9SX01JTl9TSVpFKTsKKworCS8qIERlZmF1bHQgaG9zdCB2YWx1ZSBzZXR0aW5ncy4gKi8KKwlob3N0Lm5hbWUgPSBOVUxMOworCWhvc3QucGFzc3dvcmQgPSBOVUxMOworCWhvc3QuZW5hYmxlID0gTlVMTDsKKwlob3N0LmxvZ2ZpbGUgPSBOVUxMOworCWhvc3QuY29uZmlnID0gTlVMTDsKKwlob3N0LmxpbmVzID0gLTE7CisJaG9zdC5tb3RkID0gZGVmYXVsdF9tb3RkOworCWhvc3QubW90ZGZpbGUgPSBOVUxMOworCisJLyogSW5zdGFsbCB0b3Agbm9kZXMuICovCisJaW5zdGFsbF9ub2RlKCZ2aWV3X25vZGUsIE5VTEwpOworCWluc3RhbGxfbm9kZSgmZW5hYmxlX25vZGUsIE5VTEwpOworCWluc3RhbGxfbm9kZSgmYXV0aF9ub2RlLCBOVUxMKTsKKwlpbnN0YWxsX25vZGUoJmF1dGhfZW5hYmxlX25vZGUsIE5VTEwpOworCWluc3RhbGxfbm9kZSgmY29uZmlnX25vZGUsIGNvbmZpZ193cml0ZV9ob3N0KTsKKworCS8qIEVhY2ggbm9kZSdzIGJhc2ljIGNvbW1hbmRzLiAqLworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X3ZlcnNpb25fY21kKTsKKwlpZiAodGVybWluYWwpIHsKKwkJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmNvbmZpZ19saXN0X2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZjb25maWdfZXhpdF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmY29uZmlnX3F1aXRfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmNvbmZpZ19oZWxwX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZjb25maWdfZW5hYmxlX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZjb25maWdfdGVybWluYWxfbGVuZ3RoX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZjb25maWdfdGVybWluYWxfbm9fbGVuZ3RoX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZlY2hvX2NtZCk7CisJfQorCisJaWYgKHRlcm1pbmFsKSB7CisJCWluc3RhbGxfZGVmYXVsdChFTkFCTEVfTk9ERSk7CisJCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJmNvbmZpZ19kaXNhYmxlX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJmNvbmZpZ190ZXJtaW5hbF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQgKEVOQUJMRV9OT0RFLCAmY29weV9ydW5uaW5nY29uZmlnX3N0YXJ0dXBjb25maWdfY21kKTsKKwl9CisJaW5zdGFsbF9lbGVtZW50IChFTkFCTEVfTk9ERSwgJnNob3dfc3RhcnR1cF9jb25maWdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZzaG93X3ZlcnNpb25fY21kKTsKKworCWlmICh0ZXJtaW5hbCkgeworCQlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZjb25maWdfdGVybWluYWxfbGVuZ3RoX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJmNvbmZpZ190ZXJtaW5hbF9ub19sZW5ndGhfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmZWNob19jbWQpOworCisJCWluc3RhbGxfZGVmYXVsdChDT05GSUdfTk9ERSk7CisJfQorCisJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmaG9zdG5hbWVfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZub19ob3N0bmFtZV9jbWQpOworCisJaWYgKHRlcm1pbmFsKSB7CisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJnBhc3N3b3JkX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJnBhc3N3b3JkX3RleHRfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmZW5hYmxlX3Bhc3N3b3JkX2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJmVuYWJsZV9wYXNzd29yZF90ZXh0X2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJm5vX2VuYWJsZV9wYXNzd29yZF9jbWQpOworCisjaWZkZWYgVlRZX0NSWVBUX1BXCisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJnNlcnZpY2VfcGFzc3dvcmRfZW5jcnlwdF9jbWQpOworCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZub19zZXJ2aWNlX3Bhc3N3b3JkX2VuY3J5cHRfY21kKTsKKyNlbmRpZgorCQlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZiYW5uZXJfbW90ZF9kZWZhdWx0X2NtZCk7CisJCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJmJhbm5lcl9tb3RkX2ZpbGVfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmbm9fYmFubmVyX21vdGRfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmc2VydmljZV90ZXJtaW5hbF9sZW5ndGhfY21kKTsKKwkJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmbm9fc2VydmljZV90ZXJtaW5hbF9sZW5ndGhfY21kKTsKKworCX0KKwlzcmFuZCh0aW1lKE5VTEwpKTsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3Z0eS92ZWN0b3IuYyBiL29wZW5ic2Mvc3JjL3Z0eS92ZWN0b3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjQ3YWU1Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdnR5L3ZlY3Rvci5jCkBAIC0wLDAgKzEsMTkyIEBACisvKiBHZW5lcmljIHZlY3RvciBpbnRlcmZhY2Ugcm91dGluZQorICogQ29weXJpZ2h0IChDKSAxOTk3IEt1bmloaXJvIElzaGlndXJvCisgKgorICogVGhpcyBmaWxlIGlzIHBhcnQgb2YgR05VIFplYnJhLgorICoKKyAqIEdOVSBaZWJyYSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0CisgKiB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUKKyAqIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkKKyAqIGxhdGVyIHZlcnNpb24uCisgKgorICogR05VIFplYnJhIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dAorICogV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKKyAqIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCBHTlUgWmVicmE7IHNlZSB0aGUgZmlsZSBDT1BZSU5HLiAgSWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQorICogU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BCisgKiAwMjExMS0xMzA3LCBVU0EuCisgKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSA8dnR5L3ZlY3Rvci5oPgorI2luY2x1ZGUgPHZ0eS92dHkuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxtZW1vcnkuaD4KKwordm9pZCAqdGFsbF92dHlfdmVjX2N0eDsKKworLyogSW5pdGlhbGl6ZSB2ZWN0b3IgOiBhbGxvY2F0ZSBtZW1vcnkgYW5kIHJldHVybiB2ZWN0b3IuICovCit2ZWN0b3IgdmVjdG9yX2luaXQodW5zaWduZWQgaW50IHNpemUpCit7CisJdmVjdG9yIHYgPSB0YWxsb2NfemVybyh0YWxsX3Z0eV92ZWNfY3R4LCBzdHJ1Y3QgX3ZlY3Rvcik7CisJaWYgKCF2KQorCQlyZXR1cm4gTlVMTDsKKworCS8qIGFsbG9jYXRlIGF0IGxlYXN0IG9uZSBzbG90ICovCisJaWYgKHNpemUgPT0gMCkKKwkJc2l6ZSA9IDE7CisKKwl2LT5hbGxvY2VkID0gc2l6ZTsKKwl2LT5hY3RpdmUgPSAwOworCXYtPmluZGV4ID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X3ZlY19jdHgsIHNpemVvZih2b2lkICopICogc2l6ZSwKKwkJCQkidmVjdG9yX2luaXQ6aW5kZXgiKTsKKwlpZiAoIXYtPmluZGV4KSB7CisJCXRhbGxvY19mcmVlKHYpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJcmV0dXJuIHY7Cit9CisKK3ZvaWQgdmVjdG9yX29ubHlfd3JhcHBlcl9mcmVlKHZlY3RvciB2KQoreworCXRhbGxvY19mcmVlKHYpOworfQorCit2b2lkIHZlY3Rvcl9vbmx5X2luZGV4X2ZyZWUodm9pZCAqaW5kZXgpCit7CisJdGFsbG9jX2ZyZWUoaW5kZXgpOworfQorCit2b2lkIHZlY3Rvcl9mcmVlKHZlY3RvciB2KQoreworCXRhbGxvY19mcmVlKHYtPmluZGV4KTsKKwl0YWxsb2NfZnJlZSh2KTsKK30KKwordmVjdG9yIHZlY3Rvcl9jb3B5KHZlY3RvciB2KQoreworCXVuc2lnbmVkIGludCBzaXplOworCXZlY3RvciBuZXcgPSB0YWxsb2NfemVybyh0YWxsX3Z0eV92ZWNfY3R4LCBzdHJ1Y3QgX3ZlY3Rvcik7CisJaWYgKCFuZXcpCisJCXJldHVybiBOVUxMOworCisJbmV3LT5hY3RpdmUgPSB2LT5hY3RpdmU7CisJbmV3LT5hbGxvY2VkID0gdi0+YWxsb2NlZDsKKworCXNpemUgPSBzaXplb2Yodm9pZCAqKSAqICh2LT5hbGxvY2VkKTsKKwluZXctPmluZGV4ID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X3ZlY19jdHgsIHNpemUsICJ2ZWN0b3JfY29weTppbmRleCIpOworCWlmICghbmV3LT5pbmRleCkgeworCQl0YWxsb2NfZnJlZShuZXcpOworCQlyZXR1cm4gTlVMTDsKKwl9CisJbWVtY3B5KG5ldy0+aW5kZXgsIHYtPmluZGV4LCBzaXplKTsKKworCXJldHVybiBuZXc7Cit9CisKKy8qIENoZWNrIGFzc2lnbmVkIGluZGV4LCBhbmQgaWYgaXQgcnVucyBzaG9ydCBkb3VibGUgaW5kZXggcG9pbnRlciAqLwordm9pZCB2ZWN0b3JfZW5zdXJlKHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgbnVtKQoreworCWlmICh2LT5hbGxvY2VkID4gbnVtKQorCQlyZXR1cm47CisKKwl2LT5pbmRleCA9IHRhbGxvY19yZWFsbG9jX3NpemUodGFsbF92dHlfdmVjX2N0eCwgdi0+aW5kZXgsCisJCQkJICAgICAgIHNpemVvZih2b2lkICopICogKHYtPmFsbG9jZWQgKiAyKSk7CisJbWVtc2V0KCZ2LT5pbmRleFt2LT5hbGxvY2VkXSwgMCwgc2l6ZW9mKHZvaWQgKikgKiB2LT5hbGxvY2VkKTsKKwl2LT5hbGxvY2VkICo9IDI7CisKKwlpZiAodi0+YWxsb2NlZCA8PSBudW0pCisJCXZlY3Rvcl9lbnN1cmUodiwgbnVtKTsKK30KKworLyogVGhpcyBmdW5jdGlvbiBvbmx5IHJldHVybnMgbmV4dCBlbXB0eSBzbG90IGluZGV4LiAgSXQgZG9zZSBub3QgbWVhbgorICAgdGhlIHNsb3QncyBpbmRleCBtZW1vcnkgaXMgYXNzaWduZWQsIHBsZWFzZSBjYWxsIHZlY3Rvcl9lbnN1cmUoKQorICAgYWZ0ZXIgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLiAqLworaW50IHZlY3Rvcl9lbXB0eV9zbG90KHZlY3RvciB2KQoreworCXVuc2lnbmVkIGludCBpOworCisJaWYgKHYtPmFjdGl2ZSA9PSAwKQorCQlyZXR1cm4gMDsKKworCWZvciAoaSA9IDA7IGkgPCB2LT5hY3RpdmU7IGkrKykKKwkJaWYgKHYtPmluZGV4W2ldID09IDApCisJCQlyZXR1cm4gaTsKKworCXJldHVybiBpOworfQorCisvKiBTZXQgdmFsdWUgdG8gdGhlIHNtYWxsZXN0IGVtcHR5IHNsb3QuICovCitpbnQgdmVjdG9yX3NldCh2ZWN0b3Igdiwgdm9pZCAqdmFsKQoreworCXVuc2lnbmVkIGludCBpOworCisJaSA9IHZlY3Rvcl9lbXB0eV9zbG90KHYpOworCXZlY3Rvcl9lbnN1cmUodiwgaSk7CisKKwl2LT5pbmRleFtpXSA9IHZhbDsKKworCWlmICh2LT5hY3RpdmUgPD0gaSkKKwkJdi0+YWN0aXZlID0gaSArIDE7CisKKwlyZXR1cm4gaTsKK30KKworLyogU2V0IHZhbHVlIHRvIHNwZWNpZmllZCBpbmRleCBzbG90LiAqLworaW50IHZlY3Rvcl9zZXRfaW5kZXgodmVjdG9yIHYsIHVuc2lnbmVkIGludCBpLCB2b2lkICp2YWwpCit7CisJdmVjdG9yX2Vuc3VyZSh2LCBpKTsKKworCXYtPmluZGV4W2ldID0gdmFsOworCisJaWYgKHYtPmFjdGl2ZSA8PSBpKQorCQl2LT5hY3RpdmUgPSBpICsgMTsKKworCXJldHVybiBpOworfQorCisvKiBMb29rIHVwIHZlY3Rvci4gICovCit2b2lkICp2ZWN0b3JfbG9va3VwKHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgaSkKK3sKKwlpZiAoaSA+PSB2LT5hY3RpdmUpCisJCXJldHVybiBOVUxMOworCXJldHVybiB2LT5pbmRleFtpXTsKK30KKworLyogTG9va3VwIHZlY3RvciwgZW5zdXJlIGl0LiAqLwordm9pZCAqdmVjdG9yX2xvb2t1cF9lbnN1cmUodmVjdG9yIHYsIHVuc2lnbmVkIGludCBpKQoreworCXZlY3Rvcl9lbnN1cmUodiwgaSk7CisJcmV0dXJuIHYtPmluZGV4W2ldOworfQorCisvKiBVbnNldCB2YWx1ZSBhdCBzcGVjaWZpZWQgaW5kZXggc2xvdC4gKi8KK3ZvaWQgdmVjdG9yX3Vuc2V0KHZlY3RvciB2LCB1bnNpZ25lZCBpbnQgaSkKK3sKKwlpZiAoaSA+PSB2LT5hbGxvY2VkKQorCQlyZXR1cm47CisKKwl2LT5pbmRleFtpXSA9IE5VTEw7CisKKwlpZiAoaSArIDEgPT0gdi0+YWN0aXZlKSB7CisJCXYtPmFjdGl2ZS0tOworCQl3aGlsZSAoaSAmJiB2LT5pbmRleFstLWldID09IE5VTEwgJiYgdi0+YWN0aXZlLS0pIDsJLyogSXMgdGhpcyB1Z2x5ID8gKi8KKwl9Cit9CisKKy8qIENvdW50IHRoZSBudW1iZXIgb2Ygbm90IGVtcGx0eSBzbG90LiAqLwordW5zaWduZWQgaW50IHZlY3Rvcl9jb3VudCh2ZWN0b3IgdikKK3sKKwl1bnNpZ25lZCBpbnQgaTsKKwl1bnNpZ25lZCBjb3VudCA9IDA7CisKKwlmb3IgKGkgPSAwOyBpIDwgdi0+YWN0aXZlOyBpKyspCisJCWlmICh2LT5pbmRleFtpXSAhPSBOVUxMKQorCQkJY291bnQrKzsKKworCXJldHVybiBjb3VudDsKK30KZGlmZiAtLWdpdCBhL29wZW5ic2Mvc3JjL3Z0eS92dHkuYyBiL29wZW5ic2Mvc3JjL3Z0eS92dHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMjYwZjM4Ci0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy9zcmMvdnR5L3Z0eS5jCkBAIC0wLDAgKzEsMTY3OCBAQAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGN0eXBlLmg+CisjaW5jbHVkZSA8dGVybWlvcy5oPgorCisjaW5jbHVkZSA8c3lzL3V0c25hbWUuaD4KKyNpbmNsdWRlIDxzeXMvcGFyYW0uaD4KKworI2luY2x1ZGUgPGFycGEvdGVsbmV0Lmg+CisKKyNpbmNsdWRlICJjYXJkc2hlbGwuaCIKKyNpbmNsdWRlIDx2dHkvdnR5Lmg+CisjaW5jbHVkZSA8dnR5L2NvbW1hbmQuaD4KKyNpbmNsdWRlIDx2dHkvYnVmZmVyLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvdGFsbG9jLmg+CisKKy8qIG91ciBjYWxsYmFjaywgbG9jYXRlZCBpbiB0ZWxuZXRfaW50ZXJmYWNlLmMgKi8KK3ZvaWQgdnR5X2V2ZW50KGVudW0gZXZlbnQgZXZlbnQsIGludCBzb2NrLCBzdHJ1Y3QgdnR5ICp2dHkpOworCitleHRlcm4gc3RydWN0IGhvc3QgaG9zdDsKKworLyogVmVjdG9yIHdoaWNoIHN0b3JlIGVhY2ggdnR5IHN0cnVjdHVyZS4gKi8KK3N0YXRpYyB2ZWN0b3IgdnR5dmVjOworCit2ZWN0b3IgVnZ0eV9zZXJ2X3RocmVhZDsKKworY2hhciAqdnR5X2N3ZCA9IE5VTEw7CisKKy8qIENvbmZpZ3VyZSBsb2NrLiAqLworc3RhdGljIGludCB2dHlfY29uZmlnOworCitzdGF0aWMgaW50IG5vX3Bhc3N3b3JkX2NoZWNrID0gMTsKKwordm9pZCAqdGFsbF92dHlfY3R4OworCitzdGF0aWMgdm9pZCB2dHlfY2xlYXJfYnVmKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwltZW1zZXQodnR5LT5idWYsIDAsIHZ0eS0+bWF4KTsKK30KKworLyogQWxsb2NhdGUgbmV3IHZ0eSBzdHJ1Y3QuICovCitzdHJ1Y3QgdnR5ICp2dHlfbmV3KCkKK3sKKwlzdHJ1Y3QgdnR5ICpuZXcgPSB0YWxsb2NfemVybyh0YWxsX3Z0eV9jdHgsIHN0cnVjdCB2dHkpOworCisJaWYgKCFuZXcpCisJCWdvdG8gb3V0OworCisJbmV3LT5vYnVmID0gYnVmZmVyX25ldygwKTsJLyogVXNlIGRlZmF1bHQgYnVmZmVyIHNpemUuICovCisJaWYgKCFuZXctPm9idWYpCisJCWdvdG8gb3V0X25ldzsKKwluZXctPmJ1ZiA9IF90YWxsb2NfemVybyh0YWxsX3Z0eV9jdHgsIFZUWV9CVUZTSVosICJ2dHlfbmV3LT5idWYiKTsKKwlpZiAoIW5ldy0+YnVmKQorCQlnb3RvIG91dF9vYnVmOworCisJbmV3LT5tYXggPSBWVFlfQlVGU0laOworCisJcmV0dXJuIG5ldzsKKworb3V0X29idWY6CisJYnVmZmVyX2ZyZWUobmV3LT5vYnVmKTsKK291dF9uZXc6CisJdGFsbG9jX2ZyZWUobmV3KTsKKwluZXcgPSBOVUxMOworb3V0OgorCXJldHVybiBuZXc7Cit9CisKKy8qIEF1dGhlbnRpY2F0aW9uIG9mIHZ0eSAqLworc3RhdGljIHZvaWQgdnR5X2F1dGgoc3RydWN0IHZ0eSAqdnR5LCBjaGFyICpidWYpCit7CisJY2hhciAqcGFzc3dkID0gTlVMTDsKKwllbnVtIG5vZGVfdHlwZSBuZXh0X25vZGUgPSAwOworCWludCBmYWlsOworCWNoYXIgKmNyeXB0KGNvbnN0IGNoYXIgKiwgY29uc3QgY2hhciAqKTsKKworCXN3aXRjaCAodnR5LT5ub2RlKSB7CisJY2FzZSBBVVRIX05PREU6CisjaWZkZWYgVlRZX0NSWVBUX1BXCisJCWlmIChob3N0LmVuY3J5cHQpCisJCQlwYXNzd2QgPSBob3N0LnBhc3N3b3JkX2VuY3J5cHQ7CisJCWVsc2UKKyNlbmRpZgorCQkJcGFzc3dkID0gaG9zdC5wYXNzd29yZDsKKwkJaWYgKGhvc3QuYWR2YW5jZWQpCisJCQluZXh0X25vZGUgPSBob3N0LmVuYWJsZSA/IFZJRVdfTk9ERSA6IEVOQUJMRV9OT0RFOworCQllbHNlCisJCQluZXh0X25vZGUgPSBWSUVXX05PREU7CisJCWJyZWFrOworCWNhc2UgQVVUSF9FTkFCTEVfTk9ERToKKyNpZmRlZiBWVFlfQ1JZUFRfUFcKKwkJaWYgKGhvc3QuZW5jcnlwdCkKKwkJCXBhc3N3ZCA9IGhvc3QuZW5hYmxlX2VuY3J5cHQ7CisJCWVsc2UKKyNlbmRpZgorCQkJcGFzc3dkID0gaG9zdC5lbmFibGU7CisJCW5leHRfbm9kZSA9IEVOQUJMRV9OT0RFOworCQlicmVhazsKKwl9CisKKwlpZiAocGFzc3dkKSB7CisjaWZkZWYgVlRZX0NSWVBUX1BXCisJCWlmIChob3N0LmVuY3J5cHQpCisJCQlmYWlsID0gc3RyY21wKGNyeXB0KGJ1ZiwgcGFzc3dkKSwgcGFzc3dkKTsKKwkJZWxzZQorI2VuZGlmCisJCQlmYWlsID0gc3RyY21wKGJ1ZiwgcGFzc3dkKTsKKwl9IGVsc2UKKwkJZmFpbCA9IDE7CisKKwlpZiAoIWZhaWwpIHsKKwkJdnR5LT5mYWlsID0gMDsKKwkJdnR5LT5ub2RlID0gbmV4dF9ub2RlOwkvKiBTdWNjZXNzICEgKi8KKwl9IGVsc2UgeworCQl2dHktPmZhaWwrKzsKKwkJaWYgKHZ0eS0+ZmFpbCA+PSAzKSB7CisJCQlpZiAodnR5LT5ub2RlID09IEFVVEhfTk9ERSkgeworCQkJCXZ0eV9vdXQodnR5LAorCQkJCQkiJSUgQmFkIHBhc3N3b3JkcywgdG9vIG1hbnkgZmFpbHVyZXMhJXMiLAorCQkJCQlWVFlfTkVXTElORSk7CisJCQkJdnR5LT5zdGF0dXMgPSBWVFlfQ0xPU0U7CisJCQl9IGVsc2UgeworCQkJCS8qIEFVVEhfRU5BQkxFX05PREUgKi8KKwkJCQl2dHktPmZhaWwgPSAwOworCQkJCXZ0eV9vdXQodnR5LAorCQkJCQkiJSUgQmFkIGVuYWJsZSBwYXNzd29yZHMsIHRvbyBtYW55IGZhaWx1cmVzISVzIiwKKwkJCQkJVlRZX05FV0xJTkUpOworCQkJCXZ0eS0+bm9kZSA9IFZJRVdfTk9ERTsKKwkJCX0KKwkJfQorCX0KK30KKworLyogQ2xvc2UgdnR5IGludGVyZmFjZS4gKi8KK3ZvaWQgdnR5X2Nsb3NlKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgaTsKKworCWlmICh2dHktPm9idWYpICB7CisJCS8qIEZsdXNoIGJ1ZmZlci4gKi8KKwkJYnVmZmVyX2ZsdXNoX2FsbCh2dHktPm9idWYsIHZ0eS0+ZmQpOworCisJCS8qIEZyZWUgaW5wdXQgYnVmZmVyLiAqLworCQlidWZmZXJfZnJlZSh2dHktPm9idWYpOworCQl2dHktPm9idWYgPSBOVUxMOworCX0KKworCS8qIEZyZWUgY29tbWFuZCBoaXN0b3J5LiAqLworCWZvciAoaSA9IDA7IGkgPCBWVFlfTUFYSElTVDsgaSsrKQorCQlpZiAodnR5LT5oaXN0W2ldKQorCQkJdGFsbG9jX2ZyZWUodnR5LT5oaXN0W2ldKTsKKworCS8qIFVuc2V0IHZlY3Rvci4gKi8KKwl2ZWN0b3JfdW5zZXQodnR5dmVjLCB2dHktPmZkKTsKKworCS8qIENsb3NlIHNvY2tldC4gKi8KKwlpZiAodnR5LT5mZCA+IDApCisJCWNsb3NlKHZ0eS0+ZmQpOworCisJaWYgKHZ0eS0+YnVmKSB7CisJCXRhbGxvY19mcmVlKHZ0eS0+YnVmKTsKKwkJdnR5LT5idWYgPSBOVUxMOworCX0KKworCS8qIENoZWNrIGNvbmZpZ3VyZS4gKi8KKwl2dHlfY29uZmlnX3VubG9jayh2dHkpOworCisJLyogRklYTUU6IG1lbW9yeSBsZWFrLiBXZSBuZWVkIHRvIGNhbGwgdGVsbmV0X2Nsb3NlX2NsaWVudCgpIGJ1dCBkb24ndAorCSAqIGhhdmUgYmZkICovCisJdnR5X2V2ZW50KFZUWV9DTE9TRUQsIHZ0eS0+ZmQsIHZ0eSk7CisKKwkvKiBPSyBmcmVlIHZ0eS4gKi8KKwl0YWxsb2NfZnJlZSh2dHkpOworfQorCitpbnQgdnR5X3NoZWxsKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlyZXR1cm4gdnR5LT50eXBlID09IFZUWV9TSEVMTCA/IDEgOiAwOworfQorCisKKy8qIFZUWSBzdGFuZGFyZCBvdXRwdXQgZnVuY3Rpb24uICovCitpbnQgdnR5X291dChzdHJ1Y3QgdnR5ICp2dHksIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uKQoreworCXZhX2xpc3QgYXJnczsKKwlpbnQgbGVuID0gMDsKKwlpbnQgc2l6ZSA9IDEwMjQ7CisJY2hhciBidWZbMTAyNF07CisJY2hhciAqcCA9IE5VTEw7CisKKwlpZiAodnR5X3NoZWxsKHZ0eSkpIHsKKwkJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKwkJdnByaW50Zihmb3JtYXQsIGFyZ3MpOworCQl2YV9lbmQoYXJncyk7CisJfSBlbHNlIHsKKwkJLyogVHJ5IHRvIHdyaXRlIHRvIGluaXRpYWwgYnVmZmVyLiAgKi8KKwkJdmFfc3RhcnQoYXJncywgZm9ybWF0KTsKKwkJbGVuID0gdnNucHJpbnRmKGJ1Ziwgc2l6ZW9mIGJ1ZiwgZm9ybWF0LCBhcmdzKTsKKwkJdmFfZW5kKGFyZ3MpOworCisJCS8qIEluaXRpYWwgYnVmZmVyIGlzIG5vdCBlbm91Z2guICAqLworCQlpZiAobGVuIDwgMCB8fCBsZW4gPj0gc2l6ZSkgeworCQkJd2hpbGUgKDEpIHsKKwkJCQlpZiAobGVuID4gLTEpCisJCQkJCXNpemUgPSBsZW4gKyAxOworCQkJCWVsc2UKKwkJCQkJc2l6ZSA9IHNpemUgKiAyOworCisJCQkJcCA9IHRhbGxvY19yZWFsbG9jX3NpemUodGFsbF92dHlfY3R4LCBwLCBzaXplKTsKKwkJCQlpZiAoIXApCisJCQkJCXJldHVybiAtMTsKKworCQkJCXZhX3N0YXJ0KGFyZ3MsIGZvcm1hdCk7CisJCQkJbGVuID0gdnNucHJpbnRmKHAsIHNpemUsIGZvcm1hdCwgYXJncyk7CisJCQkJdmFfZW5kKGFyZ3MpOworCisJCQkJaWYgKGxlbiA+IC0xICYmIGxlbiA8IHNpemUpCisJCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJLyogV2hlbiBpbml0aWFsIGJ1ZmZlciBpcyBlbm91Z2ggdG8gc3RvcmUgYWxsIG91dHB1dC4gICovCisJCWlmICghcCkKKwkJCXAgPSBidWY7CisKKwkJLyogUG9pbnRlciBwIG11c3QgcG9pbnQgb3V0IGJ1ZmZlci4gKi8KKwkJYnVmZmVyX3B1dCh2dHktPm9idWYsICh1X2NoYXIgKikgcCwgbGVuKTsKKworCQkvKiBJZiBwIGlzIG5vdCBkaWZmZXJlbnQgd2l0aCBidWYsIGl0IGlzIGFsbG9jYXRlZCBidWZmZXIuICAqLworCQlpZiAocCAhPSBidWYpCisJCQl0YWxsb2NfZnJlZShwKTsKKwl9CisKKwl2dHlfZXZlbnQoVlRZX1dSSVRFLCB2dHktPmZkLCB2dHkpOworCisJcmV0dXJuIGxlbjsKK30KKworaW50IHZ0eV9vdXRfbmV3bGluZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJY2hhciAqcCA9IHZ0eV9uZXdsaW5lKHZ0eSk7CisJYnVmZmVyX3B1dCh2dHktPm9idWYsIHAsIHN0cmxlbihwKSk7CisJcmV0dXJuIDA7Cit9CisKK2ludCB2dHlfY29uZmlnX2xvY2soc3RydWN0IHZ0eSAqdnR5KQoreworCWlmICh2dHlfY29uZmlnID09IDApIHsKKwkJdnR5LT5jb25maWcgPSAxOworCQl2dHlfY29uZmlnID0gMTsKKwl9CisJcmV0dXJuIHZ0eS0+Y29uZmlnOworfQorCitpbnQgdnR5X2NvbmZpZ191bmxvY2soc3RydWN0IHZ0eSAqdnR5KQoreworCWlmICh2dHlfY29uZmlnID09IDEgJiYgdnR5LT5jb25maWcgPT0gMSkgeworCQl2dHktPmNvbmZpZyA9IDA7CisJCXZ0eV9jb25maWcgPSAwOworCX0KKwlyZXR1cm4gdnR5LT5jb25maWc7Cit9CisKKy8qIFNheSBoZWxsbyB0byB2dHkgaW50ZXJmYWNlLiAqLwordm9pZCB2dHlfaGVsbG8oc3RydWN0IHZ0eSAqdnR5KQoreworCWlmIChob3N0Lm1vdGRmaWxlKSB7CisJCUZJTEUgKmY7CisJCWNoYXIgYnVmWzQwOTZdOworCisJCWYgPSBmb3Blbihob3N0Lm1vdGRmaWxlLCAiciIpOworCQlpZiAoZikgeworCQkJd2hpbGUgKGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGYpKSB7CisJCQkJY2hhciAqczsKKwkJCQkvKiB3b3JrIGJhY2t3YXJkcyB0byBpZ25vcmUgdHJhaWxsaW5nIGlzc3BhY2UoKSAqLworCQkJCWZvciAocyA9IGJ1ZiArIHN0cmxlbihidWYpOworCQkJCSAgICAgKHMgPiBidWYpICYmIGlzc3BhY2UoKihzIC0gMSkpOyBzLS0pIDsKKwkJCQkqcyA9ICdcMCc7CisJCQkJdnR5X291dCh2dHksICIlcyVzIiwgYnVmLCBWVFlfTkVXTElORSk7CisJCQl9CisJCQlmY2xvc2UoZik7CisJCX0gZWxzZQorCQkJdnR5X291dCh2dHksICJNT1REIGZpbGUgbm90IGZvdW5kJXMiLCBWVFlfTkVXTElORSk7CisJfSBlbHNlIGlmIChob3N0Lm1vdGQpCisJCXZ0eV9vdXQodnR5LCAiJXMiLCBob3N0Lm1vdGQpOworfQorCisvKiBQdXQgb3V0IHByb21wdCBhbmQgd2FpdCBpbnB1dCBmcm9tIHVzZXIuICovCitzdGF0aWMgdm9pZCB2dHlfcHJvbXB0KHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlzdHJ1Y3QgdXRzbmFtZSBuYW1lczsKKwljb25zdCBjaGFyICpob3N0bmFtZTsKKworCWlmICh2dHktPnR5cGUgPT0gVlRZX1RFUk0pIHsKKwkJaG9zdG5hbWUgPSBob3N0Lm5hbWU7CisJCWlmICghaG9zdG5hbWUpIHsKKwkJCXVuYW1lKCZuYW1lcyk7CisJCQlob3N0bmFtZSA9IG5hbWVzLm5vZGVuYW1lOworCQl9CisJCXZ0eV9vdXQodnR5LCBjbWRfcHJvbXB0KHZ0eS0+bm9kZSksIGhvc3RuYW1lKTsKKwl9Cit9CisKKy8qIENvbW1hbmQgZXhlY3V0aW9uIG92ZXIgdGhlIHZ0eSBpbnRlcmZhY2UuICovCitzdGF0aWMgaW50IHZ0eV9jb21tYW5kKHN0cnVjdCB2dHkgKnZ0eSwgY2hhciAqYnVmKQoreworCWludCByZXQ7CisJdmVjdG9yIHZsaW5lOworCisJLyogU3BsaXQgcmVhZGxpbmUgc3RyaW5nIHVwIGludG8gdGhlIHZlY3RvciAqLworCXZsaW5lID0gY21kX21ha2Vfc3RydmVjKGJ1Zik7CisKKwlpZiAodmxpbmUgPT0gTlVMTCkKKwkJcmV0dXJuIENNRF9TVUNDRVNTOworCisJcmV0ID0gY21kX2V4ZWN1dGVfY29tbWFuZCh2bGluZSwgdnR5LCBOVUxMLCAwKTsKKwlpZiAocmV0ICE9IENNRF9TVUNDRVNTKQorCQlzd2l0Y2ggKHJldCkgeworCQljYXNlIENNRF9XQVJOSU5HOgorCQkJaWYgKHZ0eS0+dHlwZSA9PSBWVFlfRklMRSkKKwkJCQl2dHlfb3V0KHZ0eSwgIldhcm5pbmcuLi4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJCWJyZWFrOworCQljYXNlIENNRF9FUlJfQU1CSUdVT1VTOgorCQkJdnR5X291dCh2dHksICIlJSBBbWJpZ3VvdXMgY29tbWFuZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJCWJyZWFrOworCQljYXNlIENNRF9FUlJfTk9fTUFUQ0g6CisJCQl2dHlfb3V0KHZ0eSwgIiUlIFVua25vd24gY29tbWFuZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJCWJyZWFrOworCQljYXNlIENNRF9FUlJfSU5DT01QTEVURToKKwkJCXZ0eV9vdXQodnR5LCAiJSUgQ29tbWFuZCBpbmNvbXBsZXRlLiVzIiwgVlRZX05FV0xJTkUpOworCQkJYnJlYWs7CisJCX0KKwljbWRfZnJlZV9zdHJ2ZWModmxpbmUpOworCisJcmV0dXJuIHJldDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgdGVsbmV0X2JhY2t3YXJkX2NoYXIgPSAweDA4Oworc3RhdGljIGNvbnN0IGNoYXIgdGVsbmV0X3NwYWNlX2NoYXIgPSAnICc7CisKKy8qIEJhc2ljIGZ1bmN0aW9uIHRvIHdyaXRlIGJ1ZmZlciB0byB2dHkuICovCitzdGF0aWMgdm9pZCB2dHlfd3JpdGUoc3RydWN0IHZ0eSAqdnR5LCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBuYnl0ZXMpCit7CisJaWYgKCh2dHktPm5vZGUgPT0gQVVUSF9OT0RFKSB8fCAodnR5LT5ub2RlID09IEFVVEhfRU5BQkxFX05PREUpKQorCQlyZXR1cm47CisKKwkvKiBTaG91bGQgd2UgZG8gYnVmZmVyaW5nIGhlcmUgPyAgQW5kIG1ha2UgdnR5X2ZsdXNoICh2dHkpID8gKi8KKwlidWZmZXJfcHV0KHZ0eS0+b2J1ZiwgYnVmLCBuYnl0ZXMpOworfQorCisvKiBFbnN1cmUgbGVuZ3RoIG9mIGlucHV0IGJ1ZmZlci4gIElzIGJ1ZmZlciBpcyBzaG9ydCwgZG91YmxlIGl0LiAqLworc3RhdGljIHZvaWQgdnR5X2Vuc3VyZShzdHJ1Y3QgdnR5ICp2dHksIGludCBsZW5ndGgpCit7CisJaWYgKHZ0eS0+bWF4IDw9IGxlbmd0aCkgeworCQl2dHktPm1heCAqPSAyOworCQl2dHktPmJ1ZiA9IHRhbGxvY19yZWFsbG9jX3NpemUodGFsbF92dHlfY3R4LCB2dHktPmJ1ZiwgdnR5LT5tYXgpOworCQkvLyBGSVhNRTogY2hlY2sgcmV0dXJuCisJfQorfQorCisvKiBCYXNpYyBmdW5jdGlvbiB0byBpbnNlcnQgY2hhcmFjdGVyIGludG8gdnR5LiAqLworc3RhdGljIHZvaWQgdnR5X3NlbGZfaW5zZXJ0KHN0cnVjdCB2dHkgKnZ0eSwgY2hhciBjKQoreworCWludCBpOworCWludCBsZW5ndGg7CisKKwl2dHlfZW5zdXJlKHZ0eSwgdnR5LT5sZW5ndGggKyAxKTsKKwlsZW5ndGggPSB2dHktPmxlbmd0aCAtIHZ0eS0+Y3A7CisJbWVtbW92ZSgmdnR5LT5idWZbdnR5LT5jcCArIDFdLCAmdnR5LT5idWZbdnR5LT5jcF0sIGxlbmd0aCk7CisJdnR5LT5idWZbdnR5LT5jcF0gPSBjOworCisJdnR5X3dyaXRlKHZ0eSwgJnZ0eS0+YnVmW3Z0eS0+Y3BdLCBsZW5ndGggKyAxKTsKKwlmb3IgKGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCisJCXZ0eV93cml0ZSh2dHksICZ0ZWxuZXRfYmFja3dhcmRfY2hhciwgMSk7CisKKwl2dHktPmNwKys7CisJdnR5LT5sZW5ndGgrKzsKK30KKworLyogU2VsZiBpbnNlcnQgY2hhcmFjdGVyICdjJyBpbiBvdmVyd3JpdGUgbW9kZS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9zZWxmX2luc2VydF9vdmVyd3JpdGUoc3RydWN0IHZ0eSAqdnR5LCBjaGFyIGMpCit7CisJdnR5X2Vuc3VyZSh2dHksIHZ0eS0+bGVuZ3RoICsgMSk7CisJdnR5LT5idWZbdnR5LT5jcCsrXSA9IGM7CisKKwlpZiAodnR5LT5jcCA+IHZ0eS0+bGVuZ3RoKQorCQl2dHktPmxlbmd0aCsrOworCisJaWYgKCh2dHktPm5vZGUgPT0gQVVUSF9OT0RFKSB8fCAodnR5LT5ub2RlID09IEFVVEhfRU5BQkxFX05PREUpKQorCQlyZXR1cm47CisKKwl2dHlfd3JpdGUodnR5LCAmYywgMSk7Cit9CisKKy8qIEluc2VydCBhIHdvcmQgaW50byB2dHkgaW50ZXJmYWNlIHdpdGggb3ZlcndyaXRlIG1vZGUuICovCitzdGF0aWMgdm9pZCB2dHlfaW5zZXJ0X3dvcmRfb3ZlcndyaXRlKHN0cnVjdCB2dHkgKnZ0eSwgY2hhciAqc3RyKQoreworCWludCBsZW4gPSBzdHJsZW4oc3RyKTsKKwl2dHlfd3JpdGUodnR5LCBzdHIsIGxlbik7CisJc3RyY3B5KCZ2dHktPmJ1Zlt2dHktPmNwXSwgc3RyKTsKKwl2dHktPmNwICs9IGxlbjsKKwl2dHktPmxlbmd0aCA9IHZ0eS0+Y3A7Cit9CisKKy8qIEZvcndhcmQgY2hhcmFjdGVyLiAqLworc3RhdGljIHZvaWQgdnR5X2ZvcndhcmRfY2hhcihzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaWYgKHZ0eS0+Y3AgPCB2dHktPmxlbmd0aCkgeworCQl2dHlfd3JpdGUodnR5LCAmdnR5LT5idWZbdnR5LT5jcF0sIDEpOworCQl2dHktPmNwKys7CisJfQorfQorCisvKiBCYWNrd2FyZCBjaGFyYWN0ZXIuICovCitzdGF0aWMgdm9pZCB2dHlfYmFja3dhcmRfY2hhcihzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaWYgKHZ0eS0+Y3AgPiAwKSB7CisJCXZ0eS0+Y3AtLTsKKwkJdnR5X3dyaXRlKHZ0eSwgJnRlbG5ldF9iYWNrd2FyZF9jaGFyLCAxKTsKKwl9Cit9CisKKy8qIE1vdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGluZS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9iZWdpbm5pbmdfb2ZfbGluZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJd2hpbGUgKHZ0eS0+Y3ApCisJCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7Cit9CisKKy8qIE1vdmUgdG8gdGhlIGVuZCBvZiB0aGUgbGluZS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9lbmRfb2ZfbGluZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJd2hpbGUgKHZ0eS0+Y3AgPCB2dHktPmxlbmd0aCkKKwkJdnR5X2ZvcndhcmRfY2hhcih2dHkpOworfQorCisvKiBBZGQgY3VycmVudCBjb21tYW5kIGxpbmUgdG8gdGhlIGhpc3RvcnkgYnVmZmVyLiAqLworc3RhdGljIHZvaWQgdnR5X2hpc3RfYWRkKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgaW5kZXg7CisKKwlpZiAodnR5LT5sZW5ndGggPT0gMCkKKwkJcmV0dXJuOworCisJaW5kZXggPSB2dHktPmhpbmRleCA/IHZ0eS0+aGluZGV4IC0gMSA6IFZUWV9NQVhISVNUIC0gMTsKKworCS8qIElnbm9yZSB0aGUgc2FtZSBzdHJpbmcgYXMgcHJldmlvdXMgb25lLiAqLworCWlmICh2dHktPmhpc3RbaW5kZXhdKQorCQlpZiAoc3RyY21wKHZ0eS0+YnVmLCB2dHktPmhpc3RbaW5kZXhdKSA9PSAwKSB7CisJCQl2dHktPmhwID0gdnR5LT5oaW5kZXg7CisJCQlyZXR1cm47CisJCX0KKworCS8qIEluc2VydCBoaXN0b3J5IGVudHJ5LiAqLworCWlmICh2dHktPmhpc3RbdnR5LT5oaW5kZXhdKQorCQl0YWxsb2NfZnJlZSh2dHktPmhpc3RbdnR5LT5oaW5kZXhdKTsKKwl2dHktPmhpc3RbdnR5LT5oaW5kZXhdID0gdGFsbG9jX3N0cmR1cCh0YWxsX3Z0eV9jdHgsIHZ0eS0+YnVmKTsKKworCS8qIEhpc3RvcnkgaW5kZXggcm90YXRpb24uICovCisJdnR5LT5oaW5kZXgrKzsKKwlpZiAodnR5LT5oaW5kZXggPT0gVlRZX01BWEhJU1QpCisJCXZ0eS0+aGluZGV4ID0gMDsKKworCXZ0eS0+aHAgPSB2dHktPmhpbmRleDsKK30KKworLyogR2V0IHRlbG5ldCB3aW5kb3cgc2l6ZS4gKi8KK3N0YXRpYyBpbnQKK3Z0eV90ZWxuZXRfb3B0aW9uIChzdHJ1Y3QgdnR5ICp2dHksIHVuc2lnbmVkIGNoYXIgKmJ1ZiwgaW50IG5ieXRlcykKK3sKKyNpZmRlZiBURUxORVRfT1BUSU9OX0RFQlVHCisgIGludCBpOworCisgIGZvciAoaSA9IDA7IGkgPCBuYnl0ZXM7IGkrKykKKyAgICB7CisgICAgICBzd2l0Y2ggKGJ1ZltpXSkKKwl7CisJY2FzZSBJQUM6CisJICB2dHlfb3V0ICh2dHksICJJQUMgIik7CisJICBicmVhazsKKwljYXNlIFdJTEw6CisJICB2dHlfb3V0ICh2dHksICJXSUxMICIpOworCSAgYnJlYWs7CisJY2FzZSBXT05UOgorCSAgdnR5X291dCAodnR5LCAiV09OVCAiKTsKKwkgIGJyZWFrOworCWNhc2UgRE86CisJICB2dHlfb3V0ICh2dHksICJETyAiKTsKKwkgIGJyZWFrOworCWNhc2UgRE9OVDoKKwkgIHZ0eV9vdXQgKHZ0eSwgIkRPTlQgIik7CisJICBicmVhazsKKwljYXNlIFNCOgorCSAgdnR5X291dCAodnR5LCAiU0IgIik7CisJICBicmVhazsKKwljYXNlIFNFOgorCSAgdnR5X291dCAodnR5LCAiU0UgIik7CisJICBicmVhazsKKwljYXNlIFRFTE9QVF9FQ0hPOgorCSAgdnR5X291dCAodnR5LCAiVEVMT1BUX0VDSE8gJXMiLCBWVFlfTkVXTElORSk7CisJICBicmVhazsKKwljYXNlIFRFTE9QVF9TR0E6CisJICB2dHlfb3V0ICh2dHksICJURUxPUFRfU0dBICVzIiwgVlRZX05FV0xJTkUpOworCSAgYnJlYWs7CisJY2FzZSBURUxPUFRfTkFXUzoKKwkgIHZ0eV9vdXQgKHZ0eSwgIlRFTE9QVF9OQVdTICVzIiwgVlRZX05FV0xJTkUpOworCSAgYnJlYWs7CisJZGVmYXVsdDoKKwkgIHZ0eV9vdXQgKHZ0eSwgIiV4ICIsIGJ1ZltpXSk7CisJICBicmVhazsKKwl9CisgICAgfQorICB2dHlfb3V0ICh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKworI2VuZGlmIC8qIFRFTE5FVF9PUFRJT05fREVCVUcgKi8KKworICBzd2l0Y2ggKGJ1ZlswXSkKKyAgICB7CisgICAgY2FzZSBTQjoKKyAgICAgIHZ0eS0+c2JfbGVuID0gMDsKKyAgICAgIHZ0eS0+aWFjX3NiX2luX3Byb2dyZXNzID0gMTsKKyAgICAgIHJldHVybiAwOworICAgICAgYnJlYWs7CisgICAgY2FzZSBTRTogCisgICAgICB7CisJaWYgKCF2dHktPmlhY19zYl9pbl9wcm9ncmVzcykKKwkgIHJldHVybiAwOworCisJaWYgKCh2dHktPnNiX2xlbiA9PSAwKSB8fCAodnR5LT5zYl9idWZbMF0gPT0gJ1wwJykpCisJICB7CisJICAgIHZ0eS0+aWFjX3NiX2luX3Byb2dyZXNzID0gMDsKKwkgICAgcmV0dXJuIDA7CisJICB9CisJc3dpdGNoICh2dHktPnNiX2J1ZlswXSkKKwkgIHsKKwkgIGNhc2UgVEVMT1BUX05BV1M6CisJICAgIGlmICh2dHktPnNiX2xlbiAhPSBURUxORVRfTkFXU19TQl9MRU4pCisJICAgICAgdnR5X291dCh2dHksIlJGQyAxMDczIHZpb2xhdGlvbiBkZXRlY3RlZDogdGVsbmV0IE5BV1Mgb3B0aW9uICIKKwkJCSJzaG91bGQgc2VuZCAlZCBjaGFyYWN0ZXJzLCBidXQgd2UgcmVjZWl2ZWQgJWx1IiwKKwkJCVRFTE5FVF9OQVdTX1NCX0xFTiwgKHVfbG9uZyl2dHktPnNiX2xlbik7CisJICAgIGVsc2UgaWYgKHNpemVvZih2dHktPnNiX2J1ZikgPCBURUxORVRfTkFXU19TQl9MRU4pCisJICAgICAgdnR5X291dCh2dHksICJCdWcgZGV0ZWN0ZWQ6IHNpemVvZih2dHktPnNiX2J1ZikgJWx1IDwgJWQsICIKKwkJICAgICAgICJ0b28gc21hbGwgdG8gaGFuZGxlIHRoZSB0ZWxuZXQgTkFXUyBvcHRpb24iLAorCQkgICAgICAgKHVfbG9uZylzaXplb2YodnR5LT5zYl9idWYpLCBURUxORVRfTkFXU19TQl9MRU4pOworCSAgICBlbHNlCisJICAgICAgeworCQl2dHktPndpZHRoID0gKCh2dHktPnNiX2J1ZlsxXSA8PCA4KXx2dHktPnNiX2J1ZlsyXSk7CisJCXZ0eS0+aGVpZ2h0ID0gKCh2dHktPnNiX2J1ZlszXSA8PCA4KXx2dHktPnNiX2J1Zls0XSk7CisjaWZkZWYgVEVMTkVUX09QVElPTl9ERUJVRworCQl2dHlfb3V0KHZ0eSwgIlRFTE5FVCBOQVdTIHdpbmRvdyBzaXplIG5lZ290aWF0aW9uIGNvbXBsZXRlZDogIgorCQkJICAgICAgIndpZHRoICVkLCBoZWlnaHQgJWQlcyIsCisJCQl2dHktPndpZHRoLCB2dHktPmhlaWdodCwgVlRZX05FV0xJTkUpOworI2VuZGlmCisJICAgICAgfQorCSAgICBicmVhazsKKwkgIH0KKwl2dHktPmlhY19zYl9pbl9wcm9ncmVzcyA9IDA7CisJcmV0dXJuIDA7CisJYnJlYWs7CisgICAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICAgIH0KKyAgcmV0dXJuIDE7Cit9CisKKy8qIEV4ZWN1dGUgY3VycmVudCBjb21tYW5kIGxpbmUuICovCitzdGF0aWMgaW50IHZ0eV9leGVjdXRlKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgcmV0OworCisJcmV0ID0gQ01EX1NVQ0NFU1M7CisKKwlzd2l0Y2ggKHZ0eS0+bm9kZSkgeworCWNhc2UgQVVUSF9OT0RFOgorCWNhc2UgQVVUSF9FTkFCTEVfTk9ERToKKwkJdnR5X2F1dGgodnR5LCB2dHktPmJ1Zik7CisJCWJyZWFrOworCWRlZmF1bHQ6CisJCXJldCA9IHZ0eV9jb21tYW5kKHZ0eSwgdnR5LT5idWYpOworCQlpZiAodnR5LT50eXBlID09IFZUWV9URVJNKQorCQkJdnR5X2hpc3RfYWRkKHZ0eSk7CisJCWJyZWFrOworCX0KKworCS8qIENsZWFyIGNvbW1hbmQgbGluZSBidWZmZXIuICovCisJdnR5LT5jcCA9IHZ0eS0+bGVuZ3RoID0gMDsKKwl2dHlfY2xlYXJfYnVmKHZ0eSk7CisKKwlpZiAodnR5LT5zdGF0dXMgIT0gVlRZX0NMT1NFKQorCQl2dHlfcHJvbXB0KHZ0eSk7CisKKwlyZXR1cm4gcmV0OworfQorCisvKiBTZW5kIFdJTEwgVEVMT1BUX0VDSE8gdG8gcmVtb3RlIHNlcnZlci4gKi8KK3N0YXRpYyB2b2lkCit2dHlfd2lsbF9lY2hvIChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdW5zaWduZWQgY2hhciBjbWRbXSA9IHsgSUFDLCBXSUxMLCBURUxPUFRfRUNITywgJ1wwJyB9OworCXZ0eV9vdXQgKHZ0eSwgIiVzIiwgY21kKTsKK30KKworLyogTWFrZSBzdXBwcmVzcyBHby1BaGVhZCB0ZWxuZXQgb3B0aW9uLiAqLworc3RhdGljIHZvaWQKK3Z0eV93aWxsX3N1cHByZXNzX2dvX2FoZWFkIChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdW5zaWduZWQgY2hhciBjbWRbXSA9IHsgSUFDLCBXSUxMLCBURUxPUFRfU0dBLCAnXDAnIH07CisJdnR5X291dCAodnR5LCAiJXMiLCBjbWQpOworfQorCisvKiBNYWtlIGRvbid0IHVzZSBsaW5lbW9kZSBvdmVyIHRlbG5ldC4gKi8KK3N0YXRpYyB2b2lkCit2dHlfZG9udF9saW5lbW9kZSAoc3RydWN0IHZ0eSAqdnR5KQoreworCXVuc2lnbmVkIGNoYXIgY21kW10gPSB7IElBQywgRE9OVCwgVEVMT1BUX0xJTkVNT0RFLCAnXDAnIH07CisJdnR5X291dCAodnR5LCAiJXMiLCBjbWQpOworfQorCisvKiBVc2Ugd2luZG93IHNpemUuICovCitzdGF0aWMgdm9pZAordnR5X2RvX3dpbmRvd19zaXplIChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdW5zaWduZWQgY2hhciBjbWRbXSA9IHsgSUFDLCBETywgVEVMT1BUX05BV1MsICdcMCcgfTsKKwl2dHlfb3V0ICh2dHksICIlcyIsIGNtZCk7Cit9CisKK3N0YXRpYyB2b2lkIHZ0eV9raWxsX2xpbmVfZnJvbV9iZWdpbm5pbmcoc3RydWN0IHZ0eSAqKTsKK3N0YXRpYyB2b2lkIHZ0eV9yZWRyYXdfbGluZShzdHJ1Y3QgdnR5ICopOworCisvKiBQcmludCBjb21tYW5kIGxpbmUgaGlzdG9yeS4gIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZyb20KKyAgIHZ0eV9uZXh0X2xpbmUgYW5kIHZ0eV9wcmV2aW91c19saW5lLiAqLworc3RhdGljIHZvaWQgdnR5X2hpc3RvcnlfcHJpbnQoc3RydWN0IHZ0eSAqdnR5KQoreworCWludCBsZW5ndGg7CisKKwl2dHlfa2lsbF9saW5lX2Zyb21fYmVnaW5uaW5nKHZ0eSk7CisKKwkvKiBHZXQgcHJldmlvdXMgbGluZSBmcm9tIGhpc3RvcnkgYnVmZmVyICovCisJbGVuZ3RoID0gc3RybGVuKHZ0eS0+aGlzdFt2dHktPmhwXSk7CisJbWVtY3B5KHZ0eS0+YnVmLCB2dHktPmhpc3RbdnR5LT5ocF0sIGxlbmd0aCk7CisJdnR5LT5jcCA9IHZ0eS0+bGVuZ3RoID0gbGVuZ3RoOworCisJLyogUmVkcmF3IGN1cnJlbnQgbGluZSAqLworCXZ0eV9yZWRyYXdfbGluZSh2dHkpOworfQorCisvKiBTaG93IG5leHQgY29tbWFuZCBsaW5lIGhpc3RvcnkuICovCitzdGF0aWMgdm9pZCB2dHlfbmV4dF9saW5lKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgdHJ5X2luZGV4OworCisJaWYgKHZ0eS0+aHAgPT0gdnR5LT5oaW5kZXgpCisJCXJldHVybjsKKworCS8qIFRyeSBpcyB0aGVyZSBoaXN0b3J5IGV4aXN0IG9yIG5vdC4gKi8KKwl0cnlfaW5kZXggPSB2dHktPmhwOworCWlmICh0cnlfaW5kZXggPT0gKFZUWV9NQVhISVNUIC0gMSkpCisJCXRyeV9pbmRleCA9IDA7CisJZWxzZQorCQl0cnlfaW5kZXgrKzsKKworCS8qIElmIHRoZXJlIGlzIG5vdCBoaXN0b3J5IHJldHVybi4gKi8KKwlpZiAodnR5LT5oaXN0W3RyeV9pbmRleF0gPT0gTlVMTCkKKwkJcmV0dXJuOworCWVsc2UKKwkJdnR5LT5ocCA9IHRyeV9pbmRleDsKKworCXZ0eV9oaXN0b3J5X3ByaW50KHZ0eSk7Cit9CisKKy8qIFNob3cgcHJldmlvdXMgY29tbWFuZCBsaW5lIGhpc3RvcnkuICovCitzdGF0aWMgdm9pZCB2dHlfcHJldmlvdXNfbGluZShzdHJ1Y3QgdnR5ICp2dHkpCit7CisJaW50IHRyeV9pbmRleDsKKworCXRyeV9pbmRleCA9IHZ0eS0+aHA7CisJaWYgKHRyeV9pbmRleCA9PSAwKQorCQl0cnlfaW5kZXggPSBWVFlfTUFYSElTVCAtIDE7CisJZWxzZQorCQl0cnlfaW5kZXgtLTsKKworCWlmICh2dHktPmhpc3RbdHJ5X2luZGV4XSA9PSBOVUxMKQorCQlyZXR1cm47CisJZWxzZQorCQl2dHktPmhwID0gdHJ5X2luZGV4OworCisJdnR5X2hpc3RvcnlfcHJpbnQodnR5KTsKK30KKworLyogVGhpcyBmdW5jdGlvbiByZWRyYXcgYWxsIG9mIHRoZSBjb21tYW5kIGxpbmUgY2hhcmFjdGVyLiAqLworc3RhdGljIHZvaWQgdnR5X3JlZHJhd19saW5lKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl2dHlfd3JpdGUodnR5LCB2dHktPmJ1ZiwgdnR5LT5sZW5ndGgpOworCXZ0eS0+Y3AgPSB2dHktPmxlbmd0aDsKK30KKworLyogRm9yd2FyZCB3b3JkLiAqLworc3RhdGljIHZvaWQgdnR5X2ZvcndhcmRfd29yZChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJd2hpbGUgKHZ0eS0+Y3AgIT0gdnR5LT5sZW5ndGggJiYgdnR5LT5idWZbdnR5LT5jcF0gIT0gJyAnKQorCQl2dHlfZm9yd2FyZF9jaGFyKHZ0eSk7CisKKwl3aGlsZSAodnR5LT5jcCAhPSB2dHktPmxlbmd0aCAmJiB2dHktPmJ1Zlt2dHktPmNwXSA9PSAnICcpCisJCXZ0eV9mb3J3YXJkX2NoYXIodnR5KTsKK30KKworLyogQmFja3dhcmQgd29yZCB3aXRob3V0IHNraXBwaW5nIHRyYWluaW5nIHNwYWNlLiAqLworc3RhdGljIHZvaWQgdnR5X2JhY2t3YXJkX3B1cmVfd29yZChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJd2hpbGUgKHZ0eS0+Y3AgPiAwICYmIHZ0eS0+YnVmW3Z0eS0+Y3AgLSAxXSAhPSAnICcpCisJCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7Cit9CisKKy8qIEJhY2t3YXJkIHdvcmQuICovCitzdGF0aWMgdm9pZCB2dHlfYmFja3dhcmRfd29yZChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJd2hpbGUgKHZ0eS0+Y3AgPiAwICYmIHZ0eS0+YnVmW3Z0eS0+Y3AgLSAxXSA9PSAnICcpCisJCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7CisKKwl3aGlsZSAodnR5LT5jcCA+IDAgJiYgdnR5LT5idWZbdnR5LT5jcCAtIDFdICE9ICcgJykKKwkJdnR5X2JhY2t3YXJkX2NoYXIodnR5KTsKK30KKworLyogV2hlbiAnXkQnIGlzIHR5cGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUgd2UgbW92ZSB0byB0aGUgZG93bgorICAgbGV2ZWwuICovCitzdGF0aWMgdm9pZCB2dHlfZG93bl9sZXZlbChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKwkoKmNvbmZpZ19leGl0X2NtZC5mdW5jKSAoTlVMTCwgdnR5LCAwLCBOVUxMKTsKKwl2dHlfcHJvbXB0KHZ0eSk7CisJdnR5LT5jcCA9IDA7Cit9CisKKy8qIFdoZW4gJ15aJyBpcyByZWNlaXZlZCBmcm9tIHZ0eSwgbW92ZSBkb3duIHRvIHRoZSBlbmFibGUgbW9kZS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9lbmRfY29uZmlnKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCisJc3dpdGNoICh2dHktPm5vZGUpIHsKKwljYXNlIFZJRVdfTk9ERToKKwljYXNlIEVOQUJMRV9OT0RFOgorCQkvKiBOb3RoaW5nIHRvIGRvLiAqLworCQlicmVhazsKKwljYXNlIENPTkZJR19OT0RFOgorCWNhc2UgVlRZX05PREU6CisJCXZ0eV9jb25maWdfdW5sb2NrKHZ0eSk7CisJCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBVbmtub3duIG5vZGUsIHdlIGhhdmUgdG8gaWdub3JlIGl0LiAqLworCQlicmVhazsKKwl9CisKKwl2dHlfcHJvbXB0KHZ0eSk7CisJdnR5LT5jcCA9IDA7Cit9CisKKy8qIERlbGV0ZSBhIGNoYXJjdGVyIGF0IHRoZSBjdXJyZW50IHBvaW50LiAqLworc3RhdGljIHZvaWQgdnR5X2RlbGV0ZV9jaGFyKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgaTsKKwlpbnQgc2l6ZTsKKworCWlmICh2dHktPm5vZGUgPT0gQVVUSF9OT0RFIHx8IHZ0eS0+bm9kZSA9PSBBVVRIX0VOQUJMRV9OT0RFKQorCQlyZXR1cm47CisKKwlpZiAodnR5LT5sZW5ndGggPT0gMCkgeworCQl2dHlfZG93bl9sZXZlbCh2dHkpOworCQlyZXR1cm47CisJfQorCisJaWYgKHZ0eS0+Y3AgPT0gdnR5LT5sZW5ndGgpCisJCXJldHVybjsJCS8qIGNvbXBsZXRpb24gbmVlZCBoZXJlPyAqLworCisJc2l6ZSA9IHZ0eS0+bGVuZ3RoIC0gdnR5LT5jcDsKKworCXZ0eS0+bGVuZ3RoLS07CisJbWVtbW92ZSgmdnR5LT5idWZbdnR5LT5jcF0sICZ2dHktPmJ1Zlt2dHktPmNwICsgMV0sIHNpemUgLSAxKTsKKwl2dHktPmJ1Zlt2dHktPmxlbmd0aF0gPSAnXDAnOworCisJdnR5X3dyaXRlKHZ0eSwgJnZ0eS0+YnVmW3Z0eS0+Y3BdLCBzaXplIC0gMSk7CisJdnR5X3dyaXRlKHZ0eSwgJnRlbG5ldF9zcGFjZV9jaGFyLCAxKTsKKworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCXZ0eV93cml0ZSh2dHksICZ0ZWxuZXRfYmFja3dhcmRfY2hhciwgMSk7Cit9CisKKy8qIERlbGV0ZSBhIGNoYXJhY3RlciBiZWZvcmUgdGhlIHBvaW50LiAqLworc3RhdGljIHZvaWQgdnR5X2RlbGV0ZV9iYWNrd2FyZF9jaGFyKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpZiAodnR5LT5jcCA9PSAwKQorCQlyZXR1cm47CisKKwl2dHlfYmFja3dhcmRfY2hhcih2dHkpOworCXZ0eV9kZWxldGVfY2hhcih2dHkpOworfQorCisvKiBLaWxsIHJlc3Qgb2YgbGluZSBmcm9tIGN1cnJlbnQgcG9pbnQuICovCitzdGF0aWMgdm9pZCB2dHlfa2lsbF9saW5lKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgaTsKKwlpbnQgc2l6ZTsKKworCXNpemUgPSB2dHktPmxlbmd0aCAtIHZ0eS0+Y3A7CisKKwlpZiAoc2l6ZSA9PSAwKQorCQlyZXR1cm47CisKKwlmb3IgKGkgPSAwOyBpIDwgc2l6ZTsgaSsrKQorCQl2dHlfd3JpdGUodnR5LCAmdGVsbmV0X3NwYWNlX2NoYXIsIDEpOworCWZvciAoaSA9IDA7IGkgPCBzaXplOyBpKyspCisJCXZ0eV93cml0ZSh2dHksICZ0ZWxuZXRfYmFja3dhcmRfY2hhciwgMSk7CisKKwltZW1zZXQoJnZ0eS0+YnVmW3Z0eS0+Y3BdLCAwLCBzaXplKTsKKwl2dHktPmxlbmd0aCA9IHZ0eS0+Y3A7Cit9CisKKy8qIEtpbGwgbGluZSBmcm9tIHRoZSBiZWdpbm5pbmcuICovCitzdGF0aWMgdm9pZCB2dHlfa2lsbF9saW5lX2Zyb21fYmVnaW5uaW5nKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl2dHlfYmVnaW5uaW5nX29mX2xpbmUodnR5KTsKKwl2dHlfa2lsbF9saW5lKHZ0eSk7Cit9CisKKy8qIERlbGV0ZSBhIHdvcmQgYmVmb3JlIHRoZSBwb2ludC4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9mb3J3YXJkX2tpbGxfd29yZChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJd2hpbGUgKHZ0eS0+Y3AgIT0gdnR5LT5sZW5ndGggJiYgdnR5LT5idWZbdnR5LT5jcF0gPT0gJyAnKQorCQl2dHlfZGVsZXRlX2NoYXIodnR5KTsKKwl3aGlsZSAodnR5LT5jcCAhPSB2dHktPmxlbmd0aCAmJiB2dHktPmJ1Zlt2dHktPmNwXSAhPSAnICcpCisJCXZ0eV9kZWxldGVfY2hhcih2dHkpOworfQorCisvKiBEZWxldGUgYSB3b3JkIGJlZm9yZSB0aGUgcG9pbnQuICovCitzdGF0aWMgdm9pZCB2dHlfYmFja3dhcmRfa2lsbF93b3JkKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl3aGlsZSAodnR5LT5jcCA+IDAgJiYgdnR5LT5idWZbdnR5LT5jcCAtIDFdID09ICcgJykKKwkJdnR5X2RlbGV0ZV9iYWNrd2FyZF9jaGFyKHZ0eSk7CisJd2hpbGUgKHZ0eS0+Y3AgPiAwICYmIHZ0eS0+YnVmW3Z0eS0+Y3AgLSAxXSAhPSAnICcpCisJCXZ0eV9kZWxldGVfYmFja3dhcmRfY2hhcih2dHkpOworfQorCisvKiBUcmFuc3Bvc2UgY2hhcnMgYmVmb3JlIG9yIGF0IHRoZSBwb2ludC4gKi8KK3N0YXRpYyB2b2lkIHZ0eV90cmFuc3Bvc2VfY2hhcnMoc3RydWN0IHZ0eSAqdnR5KQoreworCWNoYXIgYzEsIGMyOworCisJLyogSWYgbGVuZ3RoIGlzIHNob3J0IG9yIHBvaW50IGlzIG5lYXIgYnkgdGhlIGJlZ2lubmluZyBvZiBsaW5lIHRoZW4KKwkgICByZXR1cm4uICovCisJaWYgKHZ0eS0+bGVuZ3RoIDwgMiB8fCB2dHktPmNwIDwgMSkKKwkJcmV0dXJuOworCisJLyogSW4gY2FzZSBvZiBwb2ludCBpcyBsb2NhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGxpbmUuICovCisJaWYgKHZ0eS0+Y3AgPT0gdnR5LT5sZW5ndGgpIHsKKwkJYzEgPSB2dHktPmJ1Zlt2dHktPmNwIC0gMV07CisJCWMyID0gdnR5LT5idWZbdnR5LT5jcCAtIDJdOworCisJCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7CisJCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7CisJCXZ0eV9zZWxmX2luc2VydF9vdmVyd3JpdGUodnR5LCBjMSk7CisJCXZ0eV9zZWxmX2luc2VydF9vdmVyd3JpdGUodnR5LCBjMik7CisJfSBlbHNlIHsKKwkJYzEgPSB2dHktPmJ1Zlt2dHktPmNwXTsKKwkJYzIgPSB2dHktPmJ1Zlt2dHktPmNwIC0gMV07CisKKwkJdnR5X2JhY2t3YXJkX2NoYXIodnR5KTsKKwkJdnR5X3NlbGZfaW5zZXJ0X292ZXJ3cml0ZSh2dHksIGMxKTsKKwkJdnR5X3NlbGZfaW5zZXJ0X292ZXJ3cml0ZSh2dHksIGMyKTsKKwl9Cit9CisKKy8qIERvIGNvbXBsZXRpb24gYXQgdnR5IGludGVyZmFjZS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9jb21wbGV0ZV9jb21tYW5kKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgaTsKKwlpbnQgcmV0OworCWNoYXIgKiptYXRjaGVkID0gTlVMTDsKKwl2ZWN0b3IgdmxpbmU7CisKKwlpZiAodnR5LT5ub2RlID09IEFVVEhfTk9ERSB8fCB2dHktPm5vZGUgPT0gQVVUSF9FTkFCTEVfTk9ERSkKKwkJcmV0dXJuOworCisJdmxpbmUgPSBjbWRfbWFrZV9zdHJ2ZWModnR5LT5idWYpOworCWlmICh2bGluZSA9PSBOVUxMKQorCQlyZXR1cm47CisKKwkvKiBJbiBjYXNlIG9mICdoZWxwIFx0Jy4gKi8KKwlpZiAoaXNzcGFjZSgoaW50KXZ0eS0+YnVmW3Z0eS0+bGVuZ3RoIC0gMV0pKQorCQl2ZWN0b3Jfc2V0KHZsaW5lLCAnXDAnKTsKKworCW1hdGNoZWQgPSBjbWRfY29tcGxldGVfY29tbWFuZCh2bGluZSwgdnR5LCAmcmV0KTsKKworCWNtZF9mcmVlX3N0cnZlYyh2bGluZSk7CisKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCXN3aXRjaCAocmV0KSB7CisJY2FzZSBDTURfRVJSX0FNQklHVU9VUzoKKwkJdnR5X291dCh2dHksICIlJSBBbWJpZ3VvdXMgY29tbWFuZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJdnR5X3Byb21wdCh2dHkpOworCQl2dHlfcmVkcmF3X2xpbmUodnR5KTsKKwkJYnJlYWs7CisJY2FzZSBDTURfRVJSX05PX01BVENIOgorCQkvKiB2dHlfb3V0ICh2dHksICIlJSBUaGVyZSBpcyBubyBtYXRjaGVkIGNvbW1hbmQuJXMiLCBWVFlfTkVXTElORSk7ICovCisJCXZ0eV9wcm9tcHQodnR5KTsKKwkJdnR5X3JlZHJhd19saW5lKHZ0eSk7CisJCWJyZWFrOworCWNhc2UgQ01EX0NPTVBMRVRFX0ZVTExfTUFUQ0g6CisJCXZ0eV9wcm9tcHQodnR5KTsKKwkJdnR5X3JlZHJhd19saW5lKHZ0eSk7CisJCXZ0eV9iYWNrd2FyZF9wdXJlX3dvcmQodnR5KTsKKwkJdnR5X2luc2VydF93b3JkX292ZXJ3cml0ZSh2dHksIG1hdGNoZWRbMF0pOworCQl2dHlfc2VsZl9pbnNlcnQodnR5LCAnICcpOworCQkvL3RhbGxvY19mcmVlKG1hdGNoZWRbMF0pOworCQlicmVhazsKKwljYXNlIENNRF9DT01QTEVURV9NQVRDSDoKKwkJdnR5X3Byb21wdCh2dHkpOworCQl2dHlfcmVkcmF3X2xpbmUodnR5KTsKKwkJdnR5X2JhY2t3YXJkX3B1cmVfd29yZCh2dHkpOworCQl2dHlfaW5zZXJ0X3dvcmRfb3ZlcndyaXRlKHZ0eSwgbWF0Y2hlZFswXSk7CisJCXRhbGxvY19mcmVlKG1hdGNoZWRbMF0pOworCQl2ZWN0b3Jfb25seV9pbmRleF9mcmVlKG1hdGNoZWQpOworCQlyZXR1cm47CisJCWJyZWFrOworCWNhc2UgQ01EX0NPTVBMRVRFX0xJU1RfTUFUQ0g6CisJCWZvciAoaSA9IDA7IG1hdGNoZWRbaV0gIT0gTlVMTDsgaSsrKSB7CisJCQlpZiAoaSAhPSAwICYmICgoaSAlIDYpID09IDApKQorCQkJCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisJCQl2dHlfb3V0KHZ0eSwgIiUtMTBzICIsIG1hdGNoZWRbaV0pOworCQkJdGFsbG9jX2ZyZWUobWF0Y2hlZFtpXSk7CisJCX0KKwkJdnR5X291dCh2dHksICIlcyIsIFZUWV9ORVdMSU5FKTsKKworCQl2dHlfcHJvbXB0KHZ0eSk7CisJCXZ0eV9yZWRyYXdfbGluZSh2dHkpOworCQlicmVhazsKKwljYXNlIENNRF9FUlJfTk9USElOR19UT0RPOgorCQl2dHlfcHJvbXB0KHZ0eSk7CisJCXZ0eV9yZWRyYXdfbGluZSh2dHkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisJaWYgKG1hdGNoZWQpCisJCXZlY3Rvcl9vbmx5X2luZGV4X2ZyZWUobWF0Y2hlZCk7Cit9CisKK3N0YXRpYyB2b2lkCit2dHlfZGVzY3JpYmVfZm9sZChzdHJ1Y3QgdnR5ICp2dHksIGludCBjbWRfd2lkdGgsCisJCSAgdW5zaWduZWQgaW50IGRlc2Nfd2lkdGgsIHN0cnVjdCBkZXNjICpkZXNjKQoreworCWNoYXIgKmJ1ZjsKKwljb25zdCBjaGFyICpjbWQsICpwOworCWludCBwb3M7CisKKwljbWQgPSBkZXNjLT5jbWRbMF0gPT0gJy4nID8gZGVzYy0+Y21kICsgMSA6IGRlc2MtPmNtZDsKKworCWlmIChkZXNjX3dpZHRoIDw9IDApIHsKKwkJdnR5X291dCh2dHksICIgICUtKnMgICVzJXMiLCBjbWRfd2lkdGgsIGNtZCwgZGVzYy0+c3RyLAorCQkJVlRZX05FV0xJTkUpOworCQlyZXR1cm47CisJfQorCisJYnVmID0gX3RhbGxvY196ZXJvKHRhbGxfdnR5X2N0eCwgc3RybGVuKGRlc2MtPnN0cikgKyAxLCAiZGVzY3JpYmVfZm9sZCIpOworCWlmICghYnVmKQorCQlyZXR1cm47CisKKwlmb3IgKHAgPSBkZXNjLT5zdHI7IHN0cmxlbihwKSA+IGRlc2Nfd2lkdGg7IHAgKz0gcG9zICsgMSkgeworCQlmb3IgKHBvcyA9IGRlc2Nfd2lkdGg7IHBvcyA+IDA7IHBvcy0tKQorCQkJaWYgKCoocCArIHBvcykgPT0gJyAnKQorCQkJCWJyZWFrOworCisJCWlmIChwb3MgPT0gMCkKKwkJCWJyZWFrOworCisJCXN0cm5jcHkoYnVmLCBwLCBwb3MpOworCQlidWZbcG9zXSA9ICdcMCc7CisJCXZ0eV9vdXQodnR5LCAiICAlLSpzICAlcyVzIiwgY21kX3dpZHRoLCBjbWQsIGJ1ZiwgVlRZX05FV0xJTkUpOworCisJCWNtZCA9ICIiOworCX0KKworCXZ0eV9vdXQodnR5LCAiICAlLSpzICAlcyVzIiwgY21kX3dpZHRoLCBjbWQsIHAsIFZUWV9ORVdMSU5FKTsKKworCXRhbGxvY19mcmVlKGJ1Zik7Cit9CisKKy8qIERlc2NyaWJlIG1hdGNoZWQgY29tbWFuZCBmdW5jdGlvbi4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9kZXNjcmliZV9jb21tYW5kKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgcmV0OworCXZlY3RvciB2bGluZTsKKwl2ZWN0b3IgZGVzY3JpYmU7CisJdW5zaWduZWQgaW50IGksIHdpZHRoLCBkZXNjX3dpZHRoOworCXN0cnVjdCBkZXNjICpkZXNjLCAqZGVzY19jciA9IE5VTEw7CisKKwl2bGluZSA9IGNtZF9tYWtlX3N0cnZlYyh2dHktPmJ1Zik7CisKKwkvKiBJbiBjYXNlIG9mICc+ID8nLiAqLworCWlmICh2bGluZSA9PSBOVUxMKSB7CisJCXZsaW5lID0gdmVjdG9yX2luaXQoMSk7CisJCXZlY3Rvcl9zZXQodmxpbmUsICdcMCcpOworCX0gZWxzZSBpZiAoaXNzcGFjZSgoaW50KXZ0eS0+YnVmW3Z0eS0+bGVuZ3RoIC0gMV0pKQorCQl2ZWN0b3Jfc2V0KHZsaW5lLCAnXDAnKTsKKworCWRlc2NyaWJlID0gY21kX2Rlc2NyaWJlX2NvbW1hbmQodmxpbmUsIHZ0eSwgJnJldCk7CisKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCisJLyogQW1iaWd1b3VzIGVycm9yLiAqLworCXN3aXRjaCAocmV0KSB7CisJY2FzZSBDTURfRVJSX0FNQklHVU9VUzoKKwkJY21kX2ZyZWVfc3RydmVjKHZsaW5lKTsKKwkJdnR5X291dCh2dHksICIlJSBBbWJpZ3VvdXMgY29tbWFuZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJdnR5X3Byb21wdCh2dHkpOworCQl2dHlfcmVkcmF3X2xpbmUodnR5KTsKKwkJcmV0dXJuOworCQlicmVhazsKKwljYXNlIENNRF9FUlJfTk9fTUFUQ0g6CisJCWNtZF9mcmVlX3N0cnZlYyh2bGluZSk7CisJCXZ0eV9vdXQodnR5LCAiJSUgVGhlcmUgaXMgbm8gbWF0Y2hlZCBjb21tYW5kLiVzIiwgVlRZX05FV0xJTkUpOworCQl2dHlfcHJvbXB0KHZ0eSk7CisJCXZ0eV9yZWRyYXdfbGluZSh2dHkpOworCQlyZXR1cm47CisJCWJyZWFrOworCX0KKworCS8qIEdldCB3aWR0aCBvZiBjb21tYW5kIHN0cmluZy4gKi8KKwl3aWR0aCA9IDA7CisJZm9yIChpID0gMDsgaSA8IHZlY3Rvcl9hY3RpdmUoZGVzY3JpYmUpOyBpKyspCisJCWlmICgoZGVzYyA9IHZlY3Rvcl9zbG90KGRlc2NyaWJlLCBpKSkgIT0gTlVMTCkgeworCQkJdW5zaWduZWQgaW50IGxlbjsKKworCQkJaWYgKGRlc2MtPmNtZFswXSA9PSAnXDAnKQorCQkJCWNvbnRpbnVlOworCisJCQlsZW4gPSBzdHJsZW4oZGVzYy0+Y21kKTsKKwkJCWlmIChkZXNjLT5jbWRbMF0gPT0gJy4nKQorCQkJCWxlbi0tOworCisJCQlpZiAod2lkdGggPCBsZW4pCisJCQkJd2lkdGggPSBsZW47CisJCX0KKworCS8qIEdldCB3aWR0aCBvZiBkZXNjcmlwdGlvbiBzdHJpbmcuICovCisJZGVzY193aWR0aCA9IHZ0eS0+d2lkdGggLSAod2lkdGggKyA2KTsKKworCS8qIFByaW50IG91dCBkZXNjcmlwdGlvbi4gKi8KKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZShkZXNjcmliZSk7IGkrKykKKwkJaWYgKChkZXNjID0gdmVjdG9yX3Nsb3QoZGVzY3JpYmUsIGkpKSAhPSBOVUxMKSB7CisJCQlpZiAoZGVzYy0+Y21kWzBdID09ICdcMCcpCisJCQkJY29udGludWU7CisKKwkJCWlmIChzdHJjbXAoZGVzYy0+Y21kLCAiPGNyPiIpID09IDApIHsKKwkJCQlkZXNjX2NyID0gZGVzYzsKKwkJCQljb250aW51ZTsKKwkJCX0KKworCQkJaWYgKCFkZXNjLT5zdHIpCisJCQkJdnR5X291dCh2dHksICIgICUtcyVzIiwKKwkJCQkJZGVzYy0+Y21kWzBdID09CisJCQkJCScuJyA/IGRlc2MtPmNtZCArIDEgOiBkZXNjLT5jbWQsCisJCQkJCVZUWV9ORVdMSU5FKTsKKwkJCWVsc2UgaWYgKGRlc2Nfd2lkdGggPj0gc3RybGVuKGRlc2MtPnN0cikpCisJCQkJdnR5X291dCh2dHksICIgICUtKnMgICVzJXMiLCB3aWR0aCwKKwkJCQkJZGVzYy0+Y21kWzBdID09CisJCQkJCScuJyA/IGRlc2MtPmNtZCArIDEgOiBkZXNjLT5jbWQsCisJCQkJCWRlc2MtPnN0ciwgVlRZX05FV0xJTkUpOworCQkJZWxzZQorCQkJCXZ0eV9kZXNjcmliZV9mb2xkKHZ0eSwgd2lkdGgsIGRlc2Nfd2lkdGgsIGRlc2MpOworCisjaWYgMAorCQkJdnR5X291dCh2dHksICIgICUtKnMgJXMlcyIsIHdpZHRoCisJCQkJZGVzYy0+Y21kWzBdID09ICcuJyA/IGRlc2MtPmNtZCArIDEgOiBkZXNjLT5jbWQsCisJCQkJZGVzYy0+c3RyID8gZGVzYy0+c3RyIDogIiIsIFZUWV9ORVdMSU5FKTsKKyNlbmRpZgkJCQkvKiAwICovCisJCX0KKworCWlmICgoZGVzYyA9IGRlc2NfY3IpKSB7CisJCWlmICghZGVzYy0+c3RyKQorCQkJdnR5X291dCh2dHksICIgICUtcyVzIiwKKwkJCQlkZXNjLT5jbWRbMF0gPT0gJy4nID8gZGVzYy0+Y21kICsgMSA6IGRlc2MtPmNtZCwKKwkJCQlWVFlfTkVXTElORSk7CisJCWVsc2UgaWYgKGRlc2Nfd2lkdGggPj0gc3RybGVuKGRlc2MtPnN0cikpCisJCQl2dHlfb3V0KHZ0eSwgIiAgJS0qcyAgJXMlcyIsIHdpZHRoLAorCQkJCWRlc2MtPmNtZFswXSA9PSAnLicgPyBkZXNjLT5jbWQgKyAxIDogZGVzYy0+Y21kLAorCQkJCWRlc2MtPnN0ciwgVlRZX05FV0xJTkUpOworCQllbHNlCisJCQl2dHlfZGVzY3JpYmVfZm9sZCh2dHksIHdpZHRoLCBkZXNjX3dpZHRoLCBkZXNjKTsKKwl9CisKKwljbWRfZnJlZV9zdHJ2ZWModmxpbmUpOworCXZlY3Rvcl9mcmVlKGRlc2NyaWJlKTsKKworCXZ0eV9wcm9tcHQodnR5KTsKKwl2dHlfcmVkcmF3X2xpbmUodnR5KTsKK30KKworLyogXkMgc3RvcCBjdXJyZW50IGlucHV0IGFuZCBkbyBub3QgYWRkIGNvbW1hbmQgbGluZSB0byB0aGUgaGlzdG9yeS4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9zdG9wX2lucHV0KHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl2dHktPmNwID0gdnR5LT5sZW5ndGggPSAwOworCXZ0eV9jbGVhcl9idWYodnR5KTsKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgVlRZX05FV0xJTkUpOworCisJc3dpdGNoICh2dHktPm5vZGUpIHsKKwljYXNlIFZJRVdfTk9ERToKKwljYXNlIEVOQUJMRV9OT0RFOgorCQkvKiBOb3RoaW5nIHRvIGRvLiAqLworCQlicmVhazsKKwljYXNlIENPTkZJR19OT0RFOgorCWNhc2UgVlRZX05PREU6CisJCXZ0eV9jb25maWdfdW5sb2NrKHZ0eSk7CisJCXZ0eS0+bm9kZSA9IEVOQUJMRV9OT0RFOworCQlicmVhazsKKwlkZWZhdWx0OgorCQkvKiBVbmtub3duIG5vZGUsIHdlIGhhdmUgdG8gaWdub3JlIGl0LiAqLworCQlicmVhazsKKwl9CisJdnR5X3Byb21wdCh2dHkpOworCisJLyogU2V0IGhpc3RvcnkgcG9pbnRlciB0byB0aGUgbGF0ZXN0IG9uZS4gKi8KKwl2dHktPmhwID0gdnR5LT5oaW5kZXg7Cit9CisKKyNkZWZpbmUgQ09OVFJPTChYKSAgKChYKSAtICdAJykKKyNkZWZpbmUgVlRZX05PUk1BTCAgICAgMAorI2RlZmluZSBWVFlfUFJFX0VTQ0FQRSAxCisjZGVmaW5lIFZUWV9FU0NBUEUgICAgIDIKKworLyogRXNjYXBlIGNoYXJhY3RlciBjb21tYW5kIG1hcC4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9lc2NhcGVfbWFwKHVuc2lnbmVkIGNoYXIgYywgc3RydWN0IHZ0eSAqdnR5KQoreworCXN3aXRjaCAoYykgeworCWNhc2UgKCdBJyk6CisJCXZ0eV9wcmV2aW91c19saW5lKHZ0eSk7CisJCWJyZWFrOworCWNhc2UgKCdCJyk6CisJCXZ0eV9uZXh0X2xpbmUodnR5KTsKKwkJYnJlYWs7CisJY2FzZSAoJ0MnKToKKwkJdnR5X2ZvcndhcmRfY2hhcih2dHkpOworCQlicmVhazsKKwljYXNlICgnRCcpOgorCQl2dHlfYmFja3dhcmRfY2hhcih2dHkpOworCQlicmVhazsKKwlkZWZhdWx0OgorCQlicmVhazsKKwl9CisKKwkvKiBHbyBiYWNrIHRvIG5vcm1hbCBtb2RlLiAqLworCXZ0eS0+ZXNjYXBlID0gVlRZX05PUk1BTDsKK30KKworLyogUXVpdCBwcmludCBvdXQgdG8gdGhlIGJ1ZmZlci4gKi8KK3N0YXRpYyB2b2lkIHZ0eV9idWZmZXJfcmVzZXQoc3RydWN0IHZ0eSAqdnR5KQoreworCWJ1ZmZlcl9yZXNldCh2dHktPm9idWYpOworCXZ0eV9wcm9tcHQodnR5KTsKKwl2dHlfcmVkcmF3X2xpbmUodnR5KTsKK30KKworLyogUmVhZCBkYXRhIHZpYSB2dHkgc29ja2V0LiAqLworaW50IHZ0eV9yZWFkKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwlpbnQgaTsKKwlpbnQgbmJ5dGVzOworCXVuc2lnbmVkIGNoYXIgYnVmW1ZUWV9SRUFEX0JVRlNJWl07CisKKwlpbnQgdnR5X3NvY2sgPSB2dHktPmZkOworCisJLyogUmVhZCByYXcgZGF0YSBmcm9tIHNvY2tldCAqLworCWlmICgobmJ5dGVzID0gcmVhZCh2dHktPmZkLCBidWYsIFZUWV9SRUFEX0JVRlNJWikpIDw9IDApIHsKKwkJaWYgKG5ieXRlcyA8IDApIHsKKwkJCWlmIChFUlJOT19JT19SRVRSWShlcnJubykpIHsKKwkJCQl2dHlfZXZlbnQoVlRZX1JFQUQsIHZ0eV9zb2NrLCB2dHkpOworCQkJCXJldHVybiAwOworCQkJfQorCQl9CisJCWJ1ZmZlcl9yZXNldCh2dHktPm9idWYpOworCQl2dHktPnN0YXR1cyA9IFZUWV9DTE9TRTsKKwl9CisKKwlmb3IgKGkgPSAwOyBpIDwgbmJ5dGVzOyBpKyspIHsKKwkJaWYgKGJ1ZltpXSA9PSBJQUMpIHsKKwkJCWlmICghdnR5LT5pYWMpIHsKKwkJCQl2dHktPmlhYyA9IDE7CisJCQkJY29udGludWU7CisJCQl9IGVsc2UgeworCQkJCXZ0eS0+aWFjID0gMDsKKwkJCX0KKwkJfQorCisJCWlmICh2dHktPmlhY19zYl9pbl9wcm9ncmVzcyAmJiAhdnR5LT5pYWMpIHsKKwkJCWlmICh2dHktPnNiX2xlbiA8IHNpemVvZih2dHktPnNiX2J1ZikpCisJCQkJdnR5LT5zYl9idWZbdnR5LT5zYl9sZW5dID0gYnVmW2ldOworCQkJdnR5LT5zYl9sZW4rKzsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHZ0eS0+aWFjKSB7CisJCQkvKiBJbiBjYXNlIG9mIHRlbG5ldCBjb21tYW5kICovCisJCQlpbnQgcmV0ID0gMDsKKwkJCXJldCA9IHZ0eV90ZWxuZXRfb3B0aW9uKHZ0eSwgYnVmICsgaSwgbmJ5dGVzIC0gaSk7CisJCQl2dHktPmlhYyA9IDA7CisJCQlpICs9IHJldDsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJaWYgKHZ0eS0+c3RhdHVzID09IFZUWV9NT1JFKSB7CisJCQlzd2l0Y2ggKGJ1ZltpXSkgeworCQkJY2FzZSBDT05UUk9MKCdDJyk6CisJCQljYXNlICdxJzoKKwkJCWNhc2UgJ1EnOgorCQkJCXZ0eV9idWZmZXJfcmVzZXQodnR5KTsKKwkJCQlicmVhazsKKyNpZiAwCQkJCS8qIE1vcmUgbGluZSBkb2VzIG5vdCB3b3JrIGZvciAic2hvdyBpcCBiZ3AiLiAgKi8KKwkJCWNhc2UgJ1xuJzoKKwkJCWNhc2UgJ1xyJzoKKwkJCQl2dHktPnN0YXR1cyA9IFZUWV9NT1JFTElORTsKKwkJCQlicmVhazsKKyNlbmRpZgorCQkJZGVmYXVsdDoKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogRXNjYXBlIGNoYXJhY3Rlci4gKi8KKwkJaWYgKHZ0eS0+ZXNjYXBlID09IFZUWV9FU0NBUEUpIHsKKwkJCXZ0eV9lc2NhcGVfbWFwKGJ1ZltpXSwgdnR5KTsKKwkJCWNvbnRpbnVlOworCQl9CisKKwkJLyogUHJlLWVzY2FwZSBzdGF0dXMuICovCisJCWlmICh2dHktPmVzY2FwZSA9PSBWVFlfUFJFX0VTQ0FQRSkgeworCQkJc3dpdGNoIChidWZbaV0pIHsKKwkJCWNhc2UgJ1snOgorCQkJCXZ0eS0+ZXNjYXBlID0gVlRZX0VTQ0FQRTsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2InOgorCQkJCXZ0eV9iYWNrd2FyZF93b3JkKHZ0eSk7CisJCQkJdnR5LT5lc2NhcGUgPSBWVFlfTk9STUFMOworCQkJCWJyZWFrOworCQkJY2FzZSAnZic6CisJCQkJdnR5X2ZvcndhcmRfd29yZCh2dHkpOworCQkJCXZ0eS0+ZXNjYXBlID0gVlRZX05PUk1BTDsKKwkJCQlicmVhazsKKwkJCWNhc2UgJ2QnOgorCQkJCXZ0eV9mb3J3YXJkX2tpbGxfd29yZCh2dHkpOworCQkJCXZ0eS0+ZXNjYXBlID0gVlRZX05PUk1BTDsKKwkJCQlicmVhazsKKwkJCWNhc2UgQ09OVFJPTCgnSCcpOgorCQkJY2FzZSAweDdmOgorCQkJCXZ0eV9iYWNrd2FyZF9raWxsX3dvcmQodnR5KTsKKwkJCQl2dHktPmVzY2FwZSA9IFZUWV9OT1JNQUw7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCXZ0eS0+ZXNjYXBlID0gVlRZX05PUk1BTDsKKwkJCQlicmVhazsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9CisKKwkJc3dpdGNoIChidWZbaV0pIHsKKwkJY2FzZSBDT05UUk9MKCdBJyk6CisJCQl2dHlfYmVnaW5uaW5nX29mX2xpbmUodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ0InKToKKwkJCXZ0eV9iYWNrd2FyZF9jaGFyKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdDJyk6CisJCQl2dHlfc3RvcF9pbnB1dCh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnRCcpOgorCQkJdnR5X2RlbGV0ZV9jaGFyKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdFJyk6CisJCQl2dHlfZW5kX29mX2xpbmUodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ0YnKToKKwkJCXZ0eV9mb3J3YXJkX2NoYXIodnR5KTsKKwkJCWJyZWFrOworCQljYXNlIENPTlRST0woJ0gnKToKKwkJY2FzZSAweDdmOgorCQkJdnR5X2RlbGV0ZV9iYWNrd2FyZF9jaGFyKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdLJyk6CisJCQl2dHlfa2lsbF9saW5lKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdOJyk6CisJCQl2dHlfbmV4dF9saW5lKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSBDT05UUk9MKCdQJyk6CisJCQl2dHlfcHJldmlvdXNfbGluZSh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnVCcpOgorCQkJdnR5X3RyYW5zcG9zZV9jaGFycyh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnVScpOgorCQkJdnR5X2tpbGxfbGluZV9mcm9tX2JlZ2lubmluZyh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnVycpOgorCQkJdnR5X2JhY2t3YXJkX2tpbGxfd29yZCh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgQ09OVFJPTCgnWicpOgorCQkJdnR5X2VuZF9jb25maWcodnR5KTsKKwkJCWJyZWFrOworCQljYXNlICdcbic6CisJCWNhc2UgJ1xyJzoKKwkJCXZ0eV9vdXQodnR5LCAiJXMiLCBWVFlfTkVXTElORSk7CisJCQl2dHlfZXhlY3V0ZSh2dHkpOworCQkJYnJlYWs7CisJCWNhc2UgJ1x0JzoKKwkJCXZ0eV9jb21wbGV0ZV9jb21tYW5kKHZ0eSk7CisJCQlicmVhazsKKwkJY2FzZSAnPyc6CisJCQlpZiAodnR5LT5ub2RlID09IEFVVEhfTk9ERQorCQkJICAgIHx8IHZ0eS0+bm9kZSA9PSBBVVRIX0VOQUJMRV9OT0RFKQorCQkJCXZ0eV9zZWxmX2luc2VydCh2dHksIGJ1ZltpXSk7CisJCQllbHNlCisJCQkJdnR5X2Rlc2NyaWJlX2NvbW1hbmQodnR5KTsKKwkJCWJyZWFrOworCQljYXNlICdcMDMzJzoKKwkJCWlmIChpICsgMSA8IG5ieXRlcyAmJiBidWZbaSArIDFdID09ICdbJykgeworCQkJCXZ0eS0+ZXNjYXBlID0gVlRZX0VTQ0FQRTsKKwkJCQlpKys7CisJCQl9IGVsc2UKKwkJCQl2dHktPmVzY2FwZSA9IFZUWV9QUkVfRVNDQVBFOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlpZiAoYnVmW2ldID4gMzEgJiYgYnVmW2ldIDwgMTI3KQorCQkJCXZ0eV9zZWxmX2luc2VydCh2dHksIGJ1ZltpXSk7CisJCQlicmVhazsKKwkJfQorCX0KKworCS8qIENoZWNrIHN0YXR1cy4gKi8KKwlpZiAodnR5LT5zdGF0dXMgPT0gVlRZX0NMT1NFKQorCQl2dHlfY2xvc2UodnR5KTsKKwllbHNlIHsKKwkJdnR5X2V2ZW50KFZUWV9XUklURSwgdnR5X3NvY2ssIHZ0eSk7CisJCXZ0eV9ldmVudChWVFlfUkVBRCwgdnR5X3NvY2ssIHZ0eSk7CisJfQorCXJldHVybiAwOworfQorCisvKiBSZWFkIHVwIGNvbmZpZ3VyYXRpb24gZmlsZSAqLworc3RhdGljIGludAordnR5X3JlYWRfZmlsZShGSUxFICpjb25mcCkKK3sKKwlpbnQgcmV0OworCXN0cnVjdCB2dHkgKnZ0eTsKKworCXZ0eSA9IHZ0eV9uZXcoKTsKKwl2dHktPmZkID0gMDsKKwl2dHktPnR5cGUgPSBWVFlfRklMRTsKKwl2dHktPm5vZGUgPSBDT05GSUdfTk9ERTsKKworCXJldCA9IGNvbmZpZ19mcm9tX2ZpbGUodnR5LCBjb25mcCk7CisKKwlpZiAocmV0ICE9IENNRF9TVUNDRVNTKSB7CisJCXN3aXRjaCAocmV0KSB7CisJCWNhc2UgQ01EX0VSUl9BTUJJR1VPVVM6CisJCQlmcHJpbnRmKHN0ZGVyciwgIkFtYmlndW91cyBjb21tYW5kLlxuIik7CisJCQlicmVhazsKKwkJY2FzZSBDTURfRVJSX05PX01BVENIOgorCQkJZnByaW50ZihzdGRlcnIsICJUaGVyZSBpcyBubyBzdWNoIGNvbW1hbmQuXG4iKTsKKwkJCWJyZWFrOworCQl9CisJCWZwcmludGYoc3RkZXJyLCAiRXJyb3Igb2NjdXJyZWQgZHVyaW5nIHJlYWRpbmcgYmVsb3cgIgorCQkJImxpbmU6XG4lc1xuIiwgdnR5LT5idWYpOworCQl2dHlfY2xvc2UodnR5KTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJdnR5X2Nsb3NlKHZ0eSk7CisJcmV0dXJuIDA7Cit9CisKKy8qIENyZWF0ZSBuZXcgdnR5IHN0cnVjdHVyZS4gKi8KK3N0cnVjdCB2dHkgKgordnR5X2NyZWF0ZSAoaW50IHZ0eV9zb2NrLCB2b2lkICpwcml2KQoreworICBzdHJ1Y3QgdnR5ICp2dHk7CisKKwlzdHJ1Y3QgdGVybWlvcyB0OworCisJdGNnZXRhdHRyKHZ0eV9zb2NrLCAmdCk7CisJY2ZtYWtlcmF3KCZ0KTsKKwl0Y3NldGF0dHIodnR5X3NvY2ssIFRDU0FOT1csICZ0KTsKKworICAvKiBBbGxvY2F0ZSBuZXcgdnR5IHN0cnVjdHVyZSBhbmQgc2V0IHVwIGRlZmF1bHQgdmFsdWVzLiAqLworICB2dHkgPSB2dHlfbmV3ICgpOworICB2dHktPmZkID0gdnR5X3NvY2s7CisgIHZ0eS0+cHJpdiA9IHByaXY7CisgIHZ0eS0+dHlwZSA9IFZUWV9URVJNOworICBpZiAobm9fcGFzc3dvcmRfY2hlY2spCisgICAgeworICAgICAgaWYgKGhvc3QuYWR2YW5jZWQpCisJdnR5LT5ub2RlID0gRU5BQkxFX05PREU7CisgICAgICBlbHNlCisJdnR5LT5ub2RlID0gVklFV19OT0RFOworICAgIH0KKyAgZWxzZQorICAgIHZ0eS0+bm9kZSA9IEFVVEhfTk9ERTsKKyAgdnR5LT5mYWlsID0gMDsKKyAgdnR5LT5jcCA9IDA7CisgIHZ0eV9jbGVhcl9idWYgKHZ0eSk7CisgIHZ0eS0+bGVuZ3RoID0gMDsKKyAgbWVtc2V0ICh2dHktPmhpc3QsIDAsIHNpemVvZiAodnR5LT5oaXN0KSk7CisgIHZ0eS0+aHAgPSAwOworICB2dHktPmhpbmRleCA9IDA7CisgIHZlY3Rvcl9zZXRfaW5kZXggKHZ0eXZlYywgdnR5X3NvY2ssIHZ0eSk7CisgIHZ0eS0+c3RhdHVzID0gVlRZX05PUk1BTDsKKyAgaWYgKGhvc3QubGluZXMgPj0gMCkKKyAgICB2dHktPmxpbmVzID0gaG9zdC5saW5lczsKKyAgZWxzZQorICAgIHZ0eS0+bGluZXMgPSAtMTsKKworICBpZiAoISBub19wYXNzd29yZF9jaGVjaykKKyAgICB7CisgICAgICAvKiBWdHkgaXMgbm90IGF2YWlsYWJsZSBpZiBwYXNzd29yZCBpc24ndCBzZXQuICovCisgICAgICBpZiAoaG9zdC5wYXNzd29yZCA9PSBOVUxMICYmIGhvc3QucGFzc3dvcmRfZW5jcnlwdCA9PSBOVUxMKQorCXsKKwkgIHZ0eV9vdXQgKHZ0eSwgIlZ0eSBwYXNzd29yZCBpcyBub3Qgc2V0LiVzIiwgVlRZX05FV0xJTkUpOworCSAgdnR5LT5zdGF0dXMgPSBWVFlfQ0xPU0U7CisJICB2dHlfY2xvc2UgKHZ0eSk7CisJICByZXR1cm4gTlVMTDsKKwl9CisgICAgfQorCisgIC8qIFNheSBoZWxsbyB0byB0aGUgd29ybGQuICovCisgIHZ0eV9oZWxsbyAodnR5KTsKKyAgaWYgKCEgbm9fcGFzc3dvcmRfY2hlY2spCisgICAgdnR5X291dCAodnR5LCAiJXNVc2VyIEFjY2VzcyBWZXJpZmljYXRpb24lcyVzIiwgVlRZX05FV0xJTkUsIFZUWV9ORVdMSU5FLCBWVFlfTkVXTElORSk7CisKKyAgLyogU2V0dGluZyB1cCB0ZXJtaW5hbC4gKi8KKyAgdnR5X3dpbGxfZWNobyAodnR5KTsKKyAgdnR5X3dpbGxfc3VwcHJlc3NfZ29fYWhlYWQgKHZ0eSk7CisKKyAgdnR5X2RvbnRfbGluZW1vZGUgKHZ0eSk7CisgIHZ0eV9kb193aW5kb3dfc2l6ZSAodnR5KTsKKyAgLyogdnR5X2RvbnRfbGZsb3dfYWhlYWQgKHZ0eSk7ICovCisKKyAgdnR5X3Byb21wdCAodnR5KTsKKworICAvKiBBZGQgcmVhZC93cml0ZSB0aHJlYWQuICovCisgIHZ0eV9ldmVudCAoVlRZX1dSSVRFLCB2dHlfc29jaywgdnR5KTsKKyAgdnR5X2V2ZW50IChWVFlfUkVBRCwgdnR5X3NvY2ssIHZ0eSk7CisKKyAgcmV0dXJuIHZ0eTsKK30KKworREVGVU4oY29uZmlnX3dobywgY29uZmlnX3dob19jbWQsICJ3aG8iLCAiRGlzcGxheSB3aG8gaXMgb24gdnR5XG4iKQoreworCXVuc2lnbmVkIGludCBpOworCXN0cnVjdCB2dHkgKnY7CisKKwlmb3IgKGkgPSAwOyBpIDwgdmVjdG9yX2FjdGl2ZSh2dHl2ZWMpOyBpKyspCisJCWlmICgodiA9IHZlY3Rvcl9zbG90KHZ0eXZlYywgaSkpICE9IE5VTEwpCisJCQl2dHlfb3V0KHZ0eSwgIiVzdnR5WyVkXSAlcyIsCisJCQkJdi0+Y29uZmlnID8gIioiIDogIiAiLCBpLCBWVFlfTkVXTElORSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBNb3ZlIHRvIHZ0eSBjb25maWd1cmF0aW9uIG1vZGUuICovCitERUZVTihsaW5lX3Z0eSwKKyAgICAgIGxpbmVfdnR5X2NtZCwKKyAgICAgICJsaW5lIHZ0eSIsICJDb25maWd1cmUgYSB0ZXJtaW5hbCBsaW5lXG4iICJWaXJ0dWFsIHRlcm1pbmFsXG4iKQoreworCXZ0eS0+bm9kZSA9IFZUWV9OT0RFOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogdnR5IGxvZ2luLiAqLworREVGVU4odnR5X2xvZ2luLCB2dHlfbG9naW5fY21kLCAibG9naW4iLCAiRW5hYmxlIHBhc3N3b3JkIGNoZWNraW5nXG4iKQoreworCW5vX3Bhc3N3b3JkX2NoZWNrID0gMDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKG5vX3Z0eV9sb2dpbiwKKyAgICAgIG5vX3Z0eV9sb2dpbl9jbWQsICJubyBsb2dpbiIsIE5PX1NUUiAiRW5hYmxlIHBhc3N3b3JkIGNoZWNraW5nXG4iKQoreworCW5vX3Bhc3N3b3JkX2NoZWNrID0gMTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHNlcnZpY2VfYWR2YW5jZWRfdnR5LAorICAgICAgc2VydmljZV9hZHZhbmNlZF92dHlfY21kLAorICAgICAgInNlcnZpY2UgYWR2YW5jZWQtdnR5IiwKKyAgICAgICJTZXQgdXAgbWlzY2VsbGFuZW91cyBzZXJ2aWNlXG4iICJFbmFibGUgYWR2YW5jZWQgbW9kZSB2dHkgaW50ZXJmYWNlXG4iKQoreworCWhvc3QuYWR2YW5jZWQgPSAxOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obm9fc2VydmljZV9hZHZhbmNlZF92dHksCisgICAgICBub19zZXJ2aWNlX2FkdmFuY2VkX3Z0eV9jbWQsCisgICAgICAibm8gc2VydmljZSBhZHZhbmNlZC12dHkiLAorICAgICAgTk9fU1RSCisgICAgICAiU2V0IHVwIG1pc2NlbGxhbmVvdXMgc2VydmljZVxuIiAiRW5hYmxlIGFkdmFuY2VkIG1vZGUgdnR5IGludGVyZmFjZVxuIikKK3sKKwlob3N0LmFkdmFuY2VkID0gMDsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHRlcm1pbmFsX21vbml0b3IsCisgICAgICB0ZXJtaW5hbF9tb25pdG9yX2NtZCwKKyAgICAgICJ0ZXJtaW5hbCBtb25pdG9yIiwKKyAgICAgICJTZXQgdGVybWluYWwgbGluZSBwYXJhbWV0ZXJzXG4iCisgICAgICAiQ29weSBkZWJ1ZyBvdXRwdXQgdG8gdGhlIGN1cnJlbnQgdGVybWluYWwgbGluZVxuIikKK3sKKwl2dHktPm1vbml0b3IgPSAxOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4odGVybWluYWxfbm9fbW9uaXRvciwKKyAgICAgIHRlcm1pbmFsX25vX21vbml0b3JfY21kLAorICAgICAgInRlcm1pbmFsIG5vIG1vbml0b3IiLAorICAgICAgIlNldCB0ZXJtaW5hbCBsaW5lIHBhcmFtZXRlcnNcbiIKKyAgICAgIE5PX1NUUiAiQ29weSBkZWJ1ZyBvdXRwdXQgdG8gdGhlIGN1cnJlbnQgdGVybWluYWwgbGluZVxuIikKK3sKKwl2dHktPm1vbml0b3IgPSAwOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oc2hvd19oaXN0b3J5LAorICAgICAgc2hvd19oaXN0b3J5X2NtZCwKKyAgICAgICJzaG93IGhpc3RvcnkiLCBTSE9XX1NUUiAiRGlzcGxheSB0aGUgc2Vzc2lvbiBjb21tYW5kIGhpc3RvcnlcbiIpCit7CisJaW50IGluZGV4OworCisJZm9yIChpbmRleCA9IHZ0eS0+aGluZGV4ICsgMTsgaW5kZXggIT0gdnR5LT5oaW5kZXg7KSB7CisJCWlmIChpbmRleCA9PSBWVFlfTUFYSElTVCkgeworCQkJaW5kZXggPSAwOworCQkJY29udGludWU7CisJCX0KKworCQlpZiAodnR5LT5oaXN0W2luZGV4XSAhPSBOVUxMKQorCQkJdnR5X291dCh2dHksICIgICVzJXMiLCB2dHktPmhpc3RbaW5kZXhdLCBWVFlfTkVXTElORSk7CisKKwkJaW5kZXgrKzsKKwl9CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKy8qIERpc3BsYXkgY3VycmVudCBjb25maWd1cmF0aW9uLiAqLworc3RhdGljIGludCB2dHlfY29uZmlnX3dyaXRlKHN0cnVjdCB2dHkgKnZ0eSkKK3sKKwl2dHlfb3V0KHZ0eSwgImxpbmUgdnR5JXMiLCBWVFlfTkVXTElORSk7CisKKwkvKiBsb2dpbiAqLworCWlmIChub19wYXNzd29yZF9jaGVjaykKKwkJdnR5X291dCh2dHksICIgbm8gbG9naW4lcyIsIFZUWV9ORVdMSU5FKTsKKworCXZ0eV9vdXQodnR5LCAiISVzIiwgVlRZX05FV0xJTkUpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdHJ1Y3QgY21kX25vZGUgdnR5X25vZGUgPSB7CisJVlRZX05PREUsCisJIiVzKGNvbmZpZy1saW5lKSMgIiwKKwkxLAorfTsKKworLyogUmVzZXQgYWxsIFZUWSBzdGF0dXMuICovCit2b2lkIHZ0eV9yZXNldCgpCit7CisJdW5zaWduZWQgaW50IGk7CisJc3RydWN0IHZ0eSAqdnR5OworCXN0cnVjdCB0aHJlYWQgKnZ0eV9zZXJ2X3RocmVhZDsKKworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKHZ0eXZlYyk7IGkrKykKKwkJaWYgKCh2dHkgPSB2ZWN0b3Jfc2xvdCh2dHl2ZWMsIGkpKSAhPSBOVUxMKSB7CisJCQlidWZmZXJfcmVzZXQodnR5LT5vYnVmKTsKKwkJCXZ0eS0+c3RhdHVzID0gVlRZX0NMT1NFOworCQkJdnR5X2Nsb3NlKHZ0eSk7CisJCX0KKworCWZvciAoaSA9IDA7IGkgPCB2ZWN0b3JfYWN0aXZlKFZ2dHlfc2Vydl90aHJlYWQpOyBpKyspCisJCWlmICgodnR5X3NlcnZfdGhyZWFkID0KKwkJICAgICB2ZWN0b3Jfc2xvdChWdnR5X3NlcnZfdGhyZWFkLCBpKSkgIT0gTlVMTCkgeworCQkJLy90aHJlYWRfY2FuY2VsICh2dHlfc2Vydl90aHJlYWQpOworCQkJdmVjdG9yX3Nsb3QoVnZ0eV9zZXJ2X3RocmVhZCwgaSkgPSBOVUxMOworCQkJY2xvc2UoaSk7CisJCX0KK30KKworc3RhdGljIHZvaWQgdnR5X3NhdmVfY3dkKHZvaWQpCit7CisJY2hhciBjd2RbTUFYUEFUSExFTl07CisJY2hhciAqYyA7CisKKwljID0gZ2V0Y3dkKGN3ZCwgTUFYUEFUSExFTik7CisKKwlpZiAoIWMpIHsKKwkJaWYgKGNoZGlyKFNZU0NPTkZESVIpICE9IDApCisJCSAgICBwZXJyb3IoImNoZGlyIGZhaWxlZCIpOworCQlpZiAoZ2V0Y3dkKGN3ZCwgTUFYUEFUSExFTikgPT0gTlVMTCkKKwkJICAgIHBlcnJvcigiZ2V0Y3dkIGZhaWxlZCIpOworCX0KKworCXZ0eV9jd2QgPSBfdGFsbG9jX3plcm8odGFsbF92dHlfY3R4LCBzdHJsZW4oY3dkKSArIDEsICJzYXZlX2N3ZCIpOworCXN0cmNweSh2dHlfY3dkLCBjd2QpOworfQorCitjaGFyICp2dHlfZ2V0X2N3ZCgpCit7CisJcmV0dXJuIHZ0eV9jd2Q7Cit9CisKK2ludCB2dHlfc2hlbGxfc2VydihzdHJ1Y3QgdnR5ICp2dHkpCit7CisJcmV0dXJuIHZ0eS0+dHlwZSA9PSBWVFlfU0hFTExfU0VSViA/IDEgOiAwOworfQorCit2b2lkIHZ0eV9pbml0X3Z0eXNoKCkKK3sKKwl2dHl2ZWMgPSB2ZWN0b3JfaW5pdChWRUNUT1JfTUlOX1NJWkUpOworfQorCitleHRlcm4gdm9pZCAqdGFsbF9ic2NfY3R4OworLyogSW5zdGFsbCB2dHkncyBvd24gY29tbWFuZHMgbGlrZSBgd2hvJyBjb21tYW5kLiAqLwordm9pZCB2dHlfaW5pdCgpCit7CisJdGFsbF92dHlfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KE5VTEwsIDAsICJ2dHkiKTsKKwl0YWxsX3Z0eV92ZWNfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfdnR5X2N0eCwgMCwgInZ0eV92ZWN0b3IiKTsKKwl0YWxsX3Z0eV9jbWRfY3R4ID0gdGFsbG9jX25hbWVkX2NvbnN0KHRhbGxfdnR5X2N0eCwgMCwgInZ0eV9jb21tYW5kIik7CisKKwkvKiBGb3IgZnVydGhlciBjb25maWd1cmF0aW9uIHJlYWQsIHByZXNlcnZlIGN1cnJlbnQgZGlyZWN0b3J5LiAqLworCXZ0eV9zYXZlX2N3ZCgpOworCisJdnR5dmVjID0gdmVjdG9yX2luaXQoVkVDVE9SX01JTl9TSVpFKTsKKworCS8qIEluc3RhbGwgYmdwIHRvcCBub2RlLiAqLworCWluc3RhbGxfbm9kZSgmdnR5X25vZGUsIHZ0eV9jb25maWdfd3JpdGUpOworCisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmNvbmZpZ193aG9fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc2hvd19oaXN0b3J5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmY29uZmlnX3dob19jbWQpOworCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJmxpbmVfdnR5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KENPTkZJR19OT0RFLCAmc2VydmljZV9hZHZhbmNlZF92dHlfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZub19zZXJ2aWNlX2FkdmFuY2VkX3Z0eV9jbWQpOworCWluc3RhbGxfZWxlbWVudChDT05GSUdfTk9ERSwgJnNob3dfaGlzdG9yeV9jbWQpOworCWluc3RhbGxfZWxlbWVudChFTkFCTEVfTk9ERSwgJnRlcm1pbmFsX21vbml0b3JfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoRU5BQkxFX05PREUsICZ0ZXJtaW5hbF9ub19tb25pdG9yX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEVOQUJMRV9OT0RFLCAmc2hvd19oaXN0b3J5X2NtZCk7CisKKwlpbnN0YWxsX2RlZmF1bHQoVlRZX05PREUpOworCWluc3RhbGxfZWxlbWVudChWVFlfTk9ERSwgJnZ0eV9sb2dpbl9jbWQpOworCWluc3RhbGxfZWxlbWVudChWVFlfTk9ERSwgJm5vX3Z0eV9sb2dpbl9jbWQpOworfQorCitpbnQgdnR5X3JlYWRfY29uZmlnX2ZpbGUoY29uc3QgY2hhciAqZmlsZV9uYW1lKQoreworCUZJTEUgKmNmaWxlOworCWludCByYzsKKworCWNmaWxlID0gZm9wZW4oZmlsZV9uYW1lLCAiciIpOworCWlmICghY2ZpbGUpCisJCXJldHVybiAtRU5PRU5UOworCisJcmMgPSB2dHlfcmVhZF9maWxlKGNmaWxlKTsKKwlmY2xvc2UoY2ZpbGUpOworCisJaG9zdF9jb25maWdfc2V0KGZpbGVfbmFtZSk7CisKKwlyZXR1cm4gcmM7Cit9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3NyYy92dHlfaW50ZXJmYWNlLmMgYi9vcGVuYnNjL3NyYy92dHlfaW50ZXJmYWNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg5NDg2OQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3Z0eV9pbnRlcmZhY2UuYwpAQCAtMCwwICsxLDIwNTEgQEAKKy8qIE9wZW5CU0MgaW50ZXJmYWNlIHRvIHF1YWdnYSBWVFkgKi8KKy8qIChDKSAyMDA5LTIwMTAgYnkgSGFyYWxkIFdlbHRlIDxsYWZvcmdlQGdudW1vbmtzLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisKKyNpbmNsdWRlIDx2dHkvY29tbWFuZC5oPgorI2luY2x1ZGUgPHZ0eS9idWZmZXIuaD4KKyNpbmNsdWRlIDx2dHkvdnR5Lmg+CisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9zbW9jb3JlL2xpbnV4bGlzdC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX2RhdGEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2UxX2lucHV0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtX3V0aWxzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9jaGFuX2FsbG9jLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9tZWFzX3JlcC5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGIuaD4KKyNpbmNsdWRlIDxvc21vY29yZS90YWxsb2MuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3RlbG5ldF9pbnRlcmZhY2UuaD4KKworc3RhdGljIHN0cnVjdCBnc21fbmV0d29yayAqZ3NtbmV0OworCitzdHJ1Y3QgY21kX25vZGUgbmV0X25vZGUgPSB7CisJR1NNTkVUX05PREUsCisJIiVzKG5ldHdvcmspIyIsCisJMSwKK307CisKK3N0cnVjdCBjbWRfbm9kZSBidHNfbm9kZSA9IHsKKwlCVFNfTk9ERSwKKwkiJXMoYnRzKSMiLAorCTEsCit9OworCitzdHJ1Y3QgY21kX25vZGUgdHJ4X25vZGUgPSB7CisJVFJYX05PREUsCisJIiVzKHRyeCkjIiwKKwkxLAorfTsKKworc3RydWN0IGNtZF9ub2RlIHRzX25vZGUgPSB7CisJVFNfTk9ERSwKKwkiJXModHMpIyIsCisJMSwKK307CisKK3N0YXRpYyBpbnQgZHVtbXlfY29uZmlnX3dyaXRlKHN0cnVjdCB2dHkgKnYpCit7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBuZXRfZHVtcF9ubXN0YXRlKHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9ubV9zdGF0ZSAqbm1zKQoreworCXZ0eV9vdXQodnR5LCJPcGVyICclcycsIEFkbWluICV1LCBBdmFpbCAnJXMnJXMiLAorCQlubV9vcHN0YXRlX25hbWUobm1zLT5vcGVyYXRpb25hbCksIG5tcy0+YWRtaW5pc3RyYXRpdmUsCisJCW5tX2F2YWlsX25hbWUobm1zLT5hdmFpbGFiaWxpdHkpLCBWVFlfTkVXTElORSk7Cit9CisKK3N0YXRpYyB2b2lkIGR1bXBfcGNoYW5fbG9hZF92dHkoc3RydWN0IHZ0eSAqdnR5LCBjaGFyICpwcmVmaXgsCisJCQkJY29uc3Qgc3RydWN0IHBjaGFuX2xvYWQgKnBsKQoreworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUocGwtPnBjaGFuKTsgaSsrKSB7CisJCWNvbnN0IHN0cnVjdCBsb2FkX2NvdW50ZXIgKmxjID0gJnBsLT5wY2hhbltpXTsKKwkJdW5zaWduZWQgaW50IHBlcmNlbnQ7CisKKwkJaWYgKGxjLT50b3RhbCA9PSAwKQorCQkJY29udGludWU7CisKKwkJcGVyY2VudCA9IChsYy0+dXNlZCAqIDEwMCkgLyBsYy0+dG90YWw7CisKKwkJdnR5X291dCh2dHksICIlcyUyMHM6ICUzdSUlICgldS8ldSklcyIsIHByZWZpeCwKKwkJCWdzbV9wY2hhbl9uYW1lKGkpLCBwZXJjZW50LCBsYy0+dXNlZCwgbGMtPnRvdGFsLAorCQkJVlRZX05FV0xJTkUpOworCX0KK30KKworc3RhdGljIHZvaWQgbmV0X2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpCit7CisJc3RydWN0IHBjaGFuX2xvYWQgcGw7CisKKwl2dHlfb3V0KHZ0eSwgIkJTQyBpcyBvbiBDb3VudHJ5IENvZGUgJXUsIE5ldHdvcmsgQ29kZSAldSAiCisJCSJhbmQgaGFzICV1IEJUUyVzIiwgbmV0LT5jb3VudHJ5X2NvZGUsIG5ldC0+bmV0d29ya19jb2RlLAorCQluZXQtPm51bV9idHMsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgTG9uZyBuZXR3b3JrIG5hbWU6ICclcyclcyIsCisJCW5ldC0+bmFtZV9sb25nLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIFNob3J0IG5ldHdvcmsgbmFtZTogJyVzJyVzIiwKKwkJbmV0LT5uYW1lX3Nob3J0LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIEF1dGhlbnRpY2F0aW9uIHBvbGljeTogJXMlcyIsCisJCWdzbV9hdXRoX3BvbGljeV9uYW1lKG5ldC0+YXV0aF9wb2xpY3kpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIExvY2F0aW9uIHVwZGF0aW5nIHJlamVjdCBjYXVzZTogJXUlcyIsCisJCW5ldC0+cmVqZWN0X2NhdXNlLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIEVuY3J5cHRpb246IEE1LyV1JXMiLCBuZXQtPmE1X2VuY3J5cHRpb24sCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgTkVDSSAoVENIL0gpOiAldSVzIiwgbmV0LT5uZWNpLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIFJSTFAgTW9kZTogJXMlcyIsIHJybHBfbW9kZV9uYW1lKG5ldC0+cnJscC5tb2RlKSwKKwkJVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBNTSBJbmZvOiAlcyVzIiwgbmV0LT5zZW5kX21tX2luZm8gPyAiT24iIDogIk9mZiIsCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgSGFuZG92ZXI6ICVzJXMiLCBuZXQtPmhhbmRvdmVyLmFjdGl2ZSA/ICJPbiIgOiAiT2ZmIiwKKwkJVlRZX05FV0xJTkUpOworCW5ldHdvcmtfY2hhbl9sb2FkKCZwbCwgbmV0KTsKKwl2dHlfb3V0KHZ0eSwgIiAgQ3VycmVudCBDaGFubmVsIExvYWQ6JXMiLCBWVFlfTkVXTElORSk7CisJZHVtcF9wY2hhbl9sb2FkX3Z0eSh2dHksICIgICAgIiwgJnBsKTsKK30KKworREVGVU4oc2hvd19uZXQsIHNob3dfbmV0X2NtZCwgInNob3cgbmV0d29yayIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBHU00gTkVUV09SS1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGdzbW5ldDsKKwluZXRfZHVtcF92dHkodnR5LCBuZXQpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBlMWlzbF9kdW1wX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBlMWlucF9zaWduX2xpbmsgKmUxbCkKK3sKKwlzdHJ1Y3QgZTFpbnBfbGluZSAqbGluZTsKKworCWlmICghZTFsKSB7CisJCXZ0eV9vdXQodnR5LCAiICAgTm9uZSVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm47CisJfQorCisJbGluZSA9IGUxbC0+dHMtPmxpbmU7CisKKwl2dHlfb3V0KHZ0eSwgIiAgICBFMSBMaW5lICV1LCBUeXBlICVzOiBUaW1lc2xvdCAldSwgTW9kZSAlcyVzIiwKKwkJbGluZS0+bnVtLCBsaW5lLT5kcml2ZXItPm5hbWUsIGUxbC0+dHMtPm51bSwKKwkJZTFpbnBfc2lnbnR5cGVfbmFtZShlMWwtPnR5cGUpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgICAgRTEgVEVJICV1LCBTQVBJICV1JXMiLAorCQllMWwtPnRlaSwgZTFsLT5zYXBpLCBWVFlfTkVXTElORSk7Cit9CisKK3N0YXRpYyB2b2lkIGJ0c19kdW1wX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fYnRzICpidHMpCit7CisJc3RydWN0IHBjaGFuX2xvYWQgcGw7CisKKwl2dHlfb3V0KHZ0eSwgIkJUUyAldSBpcyBvZiAlcyB0eXBlIGluIGJhbmQgJXMsIGhhcyBDSSAldSBMQUMgJXUsICIKKwkJIkJTSUMgJXUsIFRTQyAldSBhbmQgJXUgVFJYJXMiLAorCQlidHMtPm5yLCBidHN0eXBlMnN0cihidHMtPnR5cGUpLCBnc21fYmFuZF9uYW1lKGJ0cy0+YmFuZCksCisJCWJ0cy0+Y2VsbF9pZGVudGl0eSwKKwkJYnRzLT5sb2NhdGlvbl9hcmVhX2NvZGUsIGJ0cy0+YnNpYywgYnRzLT50c2MsIAorCQlidHMtPm51bV90cngsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIk1TIE1heCBwb3dlcjogJXUgZEJtJXMiLCBidHMtPm1zX21heF9wb3dlciwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiTWluaW11bSBSeCBMZXZlbCBmb3IgQWNjZXNzOiAlaSBkQm0lcyIsCisJCXJ4bGV2MmRibShidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIucnhsZXZfYWNjX21pbiksCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIkNlbGwgUmVzZWxlY3Rpb24gSHlzdGVyZXNpczogJXUgZEJtJXMiLAorCQlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIuY2VsbF9yZXNlbF9oeXN0KjIsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIlJBQ0ggVFgtSW50ZWdlcjogJXUlcyIsIGJ0cy0+c2lfY29tbW9uLnJhY2hfY29udHJvbC50eF9pbnRlZ2VyLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJSQUNIIE1heCB0cmFuc21pc3Npb25zOiAldSVzIiwKKwkJcmFjaF9tYXhfdHJhbnNfcmF3MnZhbChidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wubWF4X3RyYW5zKSwKKwkJVlRZX05FV0xJTkUpOworCWlmIChidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wuY2VsbF9iYXIpCisJCXZ0eV9vdXQodnR5LCAiICBDRUxMIElTIEJBUlJFRCVzIiwgVlRZX05FV0xJTkUpOworCWlmIChpc19pcGFjY2Vzc19idHMoYnRzKSkKKwkJdnR5X291dCh2dHksICIgIFVuaXQgSUQ6ICV1LyV1LzAsIE9NTCBTdHJlYW0gSUQgMHglMDJ4JXMiLAorCQkJYnRzLT5pcF9hY2Nlc3Muc2l0ZV9pZCwgYnRzLT5pcF9hY2Nlc3MuYnRzX2lkLAorCQkJYnRzLT5vbWxfdGVpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIE5NIFN0YXRlOiAiKTsKKwluZXRfZHVtcF9ubXN0YXRlKHZ0eSwgJmJ0cy0+bm1fc3RhdGUpOworCXZ0eV9vdXQodnR5LCAiICBTaXRlIE1nciBOTSBTdGF0ZTogIik7CisJbmV0X2R1bXBfbm1zdGF0ZSh2dHksICZidHMtPnNpdGVfbWdyLm5tX3N0YXRlKTsKKwl2dHlfb3V0KHZ0eSwgIiAgUGFnaW5nOiBGSVhNRSBwZW5kaW5nIHJlcXVlc3RzLCAldSBmcmVlIHNsb3RzJXMiLAorCQlidHMtPnBhZ2luZy5hdmFpbGFibGVfc2xvdHMsIFZUWV9ORVdMSU5FKTsKKwlpZiAoIWlzX2lwYWNjZXNzX2J0cyhidHMpKSB7CisJCXZ0eV9vdXQodnR5LCAiICBFMSBTaWduYWxsaW5nIExpbms6JXMiLCBWVFlfTkVXTElORSk7CisJCWUxaXNsX2R1bXBfdnR5KHZ0eSwgYnRzLT5vbWxfbGluayk7CisJfQorCS8qIEZJWE1FOiBvbWxfbGluaywgY2hhbl9kZXNjICovCisJbWVtc2V0KCZwbCwgMCwgc2l6ZW9mKHBsKSk7CisJYnRzX2NoYW5fbG9hZCgmcGwsIGJ0cyk7CisJdnR5X291dCh2dHksICIgIEN1cnJlbnQgQ2hhbm5lbCBMb2FkOiVzIiwgVlRZX05FV0xJTkUpOworCWR1bXBfcGNoYW5fbG9hZF92dHkodnR5LCAiICAgICIsICZwbCk7Cit9CisKK0RFRlVOKHNob3dfYnRzLCBzaG93X2J0c19jbWQsICJzaG93IGJ0cyBbbnVtYmVyXSIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBCVFNcbiIKKwkJIkJUUyBudW1iZXIiKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gZ3NtbmV0OworCWludCBidHNfbnI7CisKKwlpZiAoYXJnYyAhPSAwKSB7CisJCS8qIHVzZSB0aGUgQlRTIG51bWJlciB0aGF0IHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgKi8KKwkJYnRzX25yID0gYXRvaShhcmd2WzBdKTsKKwkJaWYgKGJ0c19uciA+IG5ldC0+bnVtX2J0cykgeworCQkJdnR5X291dCh2dHksICIlJSBjYW4ndCBmaW5kIEJUUyAnJXMnJXMiLCBhcmd2WzBdLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQlidHNfZHVtcF92dHkodnR5LCBnc21fYnRzX251bShuZXQsIGJ0c19ucikpOworCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfQorCS8qIHByaW50IGFsbCBCVFMncyAqLworCWZvciAoYnRzX25yID0gMDsgYnRzX25yIDwgbmV0LT5udW1fYnRzOyBidHNfbnIrKykKKwkJYnRzX2R1bXBfdnR5KHZ0eSwgZ3NtX2J0c19udW0obmV0LCBidHNfbnIpKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogdXRpbGl0eSBmdW5jdGlvbnMgKi8KK3N0YXRpYyB2b2lkIHBhcnNlX2UxX2xpbmsoc3RydWN0IGdzbV9lMV9zdWJzbG90ICplMV9saW5rLCBjb25zdCBjaGFyICpsaW5lLAorCQkJICBjb25zdCBjaGFyICp0cywgY29uc3QgY2hhciAqc3MpCit7CisJZTFfbGluay0+ZTFfbnIgPSBhdG9pKGxpbmUpOworCWUxX2xpbmstPmUxX3RzID0gYXRvaSh0cyk7CisJaWYgKCFzdHJjbXAoc3MsICJmdWxsIikpCisJCWUxX2xpbmstPmUxX3RzX3NzID0gMjU1OworCWVsc2UKKwkJZTFfbGluay0+ZTFfdHNfc3MgPSBhdG9pKHNzKTsKK30KKworc3RhdGljIHZvaWQgY29uZmlnX3dyaXRlX2UxX2xpbmsoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2UxX3N1YnNsb3QgKmUxX2xpbmssCisJCQkJIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwlpZiAoIWUxX2xpbmstPmUxX3RzKQorCQlyZXR1cm47CisKKwlpZiAoZTFfbGluay0+ZTFfdHNfc3MgPT0gMjU1KQorCQl2dHlfb3V0KHZ0eSwgIiVzZTEgbGluZSAldSB0aW1lc2xvdCAldSBzdWItc2xvdCBmdWxsJXMiLAorCQkJcHJlZml4LCBlMV9saW5rLT5lMV9uciwgZTFfbGluay0+ZTFfdHMsIFZUWV9ORVdMSU5FKTsKKwllbHNlCisJCXZ0eV9vdXQodnR5LCAiJXNlMSBsaW5lICV1IHRpbWVzbG90ICV1IHN1Yi1zbG90ICV1JXMiLAorCQkJcHJlZml4LCBlMV9saW5rLT5lMV9uciwgZTFfbGluay0+ZTFfdHMsCisJCQllMV9saW5rLT5lMV90c19zcywgVlRZX05FV0xJTkUpOworfQorCisKK3N0YXRpYyB2b2lkIGNvbmZpZ193cml0ZV90c19zaW5nbGUoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzKQoreworCXZ0eV9vdXQodnR5LCAiICAgIHRpbWVzbG90ICV1JXMiLCB0cy0+bnIsIFZUWV9ORVdMSU5FKTsKKwlpZiAodHMtPnBjaGFuICE9IEdTTV9QQ0hBTl9OT05FKQorCQl2dHlfb3V0KHZ0eSwgIiAgICAgcGh5c19jaGFuX2NvbmZpZyAlcyVzIiwKKwkJCWdzbV9wY2hhbl9uYW1lKHRzLT5wY2hhbiksIFZUWV9ORVdMSU5FKTsKKwljb25maWdfd3JpdGVfZTFfbGluayh2dHksICZ0cy0+ZTFfbGluaywgIiAgICAgIik7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ193cml0ZV90cnhfc2luZ2xlKHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9idHNfdHJ4ICp0cngpCit7CisJaW50IGk7CisKKwl2dHlfb3V0KHZ0eSwgIiAgdHJ4ICV1JXMiLCB0cngtPm5yLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgICBhcmZjbiAldSVzIiwgdHJ4LT5hcmZjbiwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICAgbm9taW5hbCBwb3dlciAldSVzIiwgdHJ4LT5ub21pbmFsX3Bvd2VyLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgICBtYXhfcG93ZXJfcmVkICV1JXMiLCB0cngtPm1heF9wb3dlcl9yZWQsIFZUWV9ORVdMSU5FKTsKKwljb25maWdfd3JpdGVfZTFfbGluayh2dHksICZ0cngtPnJzbF9lMV9saW5rLCAiICAgcnNsICIpOworCXZ0eV9vdXQodnR5LCAiICAgcnNsIGUxIHRlaSAldSVzIiwgdHJ4LT5yc2xfdGVpLCBWVFlfTkVXTElORSk7CisKKwlmb3IgKGkgPSAwOyBpIDwgVFJYX05SX1RTOyBpKyspCisJCWNvbmZpZ193cml0ZV90c19zaW5nbGUodnR5LCAmdHJ4LT50c1tpXSk7Cit9CisKK3N0YXRpYyB2b2lkIGNvbmZpZ193cml0ZV9idHNfc2luZ2xlKHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9idHMgKmJ0cykKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeDsKKwlpbnQgaTsKKworCXZ0eV9vdXQodnR5LCAiIGJ0cyAldSVzIiwgYnRzLT5uciwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICB0eXBlICVzJXMiLCBidHN0eXBlMnN0cihidHMtPnR5cGUpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIGJhbmQgJXMlcyIsIGdzbV9iYW5kX25hbWUoYnRzLT5iYW5kKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBjZWxsX2lkZW50aXR5ICV1JXMiLCBidHMtPmNlbGxfaWRlbnRpdHksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgbG9jYXRpb25fYXJlYV9jb2RlICV1JXMiLCBidHMtPmxvY2F0aW9uX2FyZWFfY29kZSwKKwkJVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICB0cmFpbmluZ19zZXF1ZW5jZV9jb2RlICV1JXMiLCBidHMtPnRzYywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBiYXNlX3N0YXRpb25faWRfY29kZSAldSVzIiwgYnRzLT5ic2ljLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIG1zIG1heCBwb3dlciAldSVzIiwgYnRzLT5tc19tYXhfcG93ZXIsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgY2VsbCByZXNlbGVjdGlvbiBoeXN0ZXJlc2lzICV1JXMiLAorCQlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIuY2VsbF9yZXNlbF9oeXN0KjIsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgcnhsZXYgYWNjZXNzIG1pbiAldSVzIiwKKwkJYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLnJ4bGV2X2FjY19taW4sIFZUWV9ORVdMSU5FKTsKKwlpZiAoYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLnQzMjEyKQorCQl2dHlfb3V0KHZ0eSwgIiAgcGVyaW9kaWMgbG9jYXRpb24gdXBkYXRlICV1JXMiLAorCQkJYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLnQzMjEyICogMTAsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgY2hhbm5lbCBhbGxvY2F0b3IgJXMlcyIsCisJCWJ0cy0+Y2hhbl9hbGxvY19yZXZlcnNlID8gImRlc2NlbmRpbmciIDogImFzY2VuZGluZyIsCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgcmFjaCB0eCBpbnRlZ2VyICV1JXMiLAorCQlidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wudHhfaW50ZWdlciwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICByYWNoIG1heCB0cmFuc21pc3Npb24gJXUlcyIsCisJCXJhY2hfbWF4X3RyYW5zX3JhdzJ2YWwoYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLm1heF90cmFucyksCisJCVZUWV9ORVdMSU5FKTsKKwlpZiAoYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLmNlbGxfYmFyKQorCQl2dHlfb3V0KHZ0eSwgIiAgY2VsbCBiYXJyZWQgMSVzIiwgVlRZX05FV0xJTkUpOworCWlmIChpc19pcGFjY2Vzc19idHMoYnRzKSkgeworCQl2dHlfb3V0KHZ0eSwgIiAgaXAuYWNjZXNzIHVuaXRfaWQgJXUgJXUlcyIsCisJCQlidHMtPmlwX2FjY2Vzcy5zaXRlX2lkLCBidHMtPmlwX2FjY2Vzcy5idHNfaWQsIFZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICIgIG9tbCBpcC5hY2Nlc3Mgc3RyZWFtX2lkICV1JXMiLCBidHMtPm9tbF90ZWksIFZUWV9ORVdMSU5FKTsKKwl9IGVsc2UgeworCQljb25maWdfd3JpdGVfZTFfbGluayh2dHksICZidHMtPm9tbF9lMV9saW5rLCAiICBvbWwgIik7CisJCXZ0eV9vdXQodnR5LCAiICBvbWwgZTEgdGVpICV1JXMiLCBidHMtPm9tbF90ZWksIFZUWV9ORVdMSU5FKTsKKwl9CisJdnR5X291dCh2dHksICIgIGdwcnMgZW5hYmxlZCAldSVzIiwgYnRzLT5ncHJzLmVuYWJsZWQsIFZUWV9ORVdMSU5FKTsKKwlpZiAoYnRzLT5ncHJzLmVuYWJsZWQpIHsKKwkJdnR5X291dCh2dHksICIgIGdwcnMgcm91dGluZyBhcmVhICV1JXMiLCBidHMtPmdwcnMucmFjLAorCQkJVlRZX05FV0xJTkUpOworCQl2dHlfb3V0KHZ0eSwgIiAgZ3BycyBjZWxsIGJ2Y2kgJXUlcyIsIGJ0cy0+Z3Bycy5jZWxsLmJ2Y2ksCisJCQlWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiICBncHJzIG5zZWkgJXUlcyIsIGJ0cy0+Z3Bycy5uc2UubnNlaSwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoYnRzLT5ncHJzLm5zdmMpOyBpKyspIHsKKwkJCXN0cnVjdCBnc21fYnRzX2dwcnNfbnN2YyAqbnN2YyA9CisJCQkJCQkmYnRzLT5ncHJzLm5zdmNbaV07CisJCQlzdHJ1Y3QgaW5fYWRkciBpYTsKKworCQkJaWEuc19hZGRyID0gaHRvbmwobnN2Yy0+cmVtb3RlX2lwKTsKKwkJCXZ0eV9vdXQodnR5LCAiICBncHJzIG5zdmMgJXUgbnN2Y2kgJXUlcyIsIGksCisJCQkJbnN2Yy0+bnN2Y2ksIFZUWV9ORVdMSU5FKTsKKwkJCXZ0eV9vdXQodnR5LCAiICBncHJzIG5zdmMgJXUgbG9jYWwgdWRwIHBvcnQgJXUlcyIsIGksCisJCQkJbnN2Yy0+bG9jYWxfcG9ydCwgVlRZX05FV0xJTkUpOworCQkJdnR5X291dCh2dHksICIgIGdwcnMgbnN2YyAldSByZW1vdGUgdWRwIHBvcnQgJXUlcyIsIGksCisJCQkJbnN2Yy0+cmVtb3RlX3BvcnQsIFZUWV9ORVdMSU5FKTsKKwkJCXZ0eV9vdXQodnR5LCAiICBncHJzIG5zdmMgJXUgcmVtb3RlIGlwICVzJXMiLCBpLAorCQkJCWluZXRfbnRvYShpYSksIFZUWV9ORVdMSU5FKTsKKwkJfQorCX0KKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHRyeCwgJmJ0cy0+dHJ4X2xpc3QsIGxpc3QpCisJCWNvbmZpZ193cml0ZV90cnhfc2luZ2xlKHZ0eSwgdHJ4KTsKK30KKworc3RhdGljIGludCBjb25maWdfd3JpdGVfYnRzKHN0cnVjdCB2dHkgKnYpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGJ0cywgJmdzbW5ldC0+YnRzX2xpc3QsIGxpc3QpCisJCWNvbmZpZ193cml0ZV9idHNfc2luZ2xlKHYsIGJ0cyk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBpbnQgY29uZmlnX3dyaXRlX25ldChzdHJ1Y3QgdnR5ICp2dHkpCit7CisJdnR5X291dCh2dHksICJuZXR3b3JrJXMiLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgbmV0d29yayBjb3VudHJ5IGNvZGUgJXUlcyIsIGdzbW5ldC0+Y291bnRyeV9jb2RlLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgbW9iaWxlIG5ldHdvcmsgY29kZSAldSVzIiwgZ3NtbmV0LT5uZXR3b3JrX2NvZGUsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBzaG9ydCBuYW1lICVzJXMiLCBnc21uZXQtPm5hbWVfc2hvcnQsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBsb25nIG5hbWUgJXMlcyIsIGdzbW5ldC0+bmFtZV9sb25nLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgYXV0aCBwb2xpY3kgJXMlcyIsIGdzbV9hdXRoX3BvbGljeV9uYW1lKGdzbW5ldC0+YXV0aF9wb2xpY3kpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgbG9jYXRpb24gdXBkYXRpbmcgcmVqZWN0IGNhdXNlICV1JXMiLAorCQlnc21uZXQtPnJlamVjdF9jYXVzZSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIGVuY3J5cHRpb24gYTUgJXUlcyIsIGdzbW5ldC0+YTVfZW5jcnlwdGlvbiwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIG5lY2kgJXUlcyIsIGdzbW5ldC0+bmVjaSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIHJybHAgbW9kZSAlcyVzIiwgcnJscF9tb2RlX25hbWUoZ3NtbmV0LT5ycmxwLm1vZGUpLAorCQlWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgbW0gaW5mbyAldSVzIiwgZ3NtbmV0LT5zZW5kX21tX2luZm8sIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBoYW5kb3ZlciAldSVzIiwgZ3NtbmV0LT5oYW5kb3Zlci5hY3RpdmUsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBoYW5kb3ZlciB3aW5kb3cgcnhsZXYgYXZlcmFnaW5nICV1JXMiLAorCQlnc21uZXQtPmhhbmRvdmVyLndpbl9yeGxldl9hdmcsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBoYW5kb3ZlciB3aW5kb3cgcnhxdWFsIGF2ZXJhZ2luZyAldSVzIiwKKwkJZ3NtbmV0LT5oYW5kb3Zlci53aW5fcnhxdWFsX2F2ZywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIGhhbmRvdmVyIHdpbmRvdyByeGxldiBuZWlnaGJvciBhdmVyYWdpbmcgJXUlcyIsCisJCWdzbW5ldC0+aGFuZG92ZXIud2luX3J4bGV2X2F2Z19uZWlnaCwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIGhhbmRvdmVyIHBvd2VyIGJ1ZGdldCBpbnRlcnZhbCAldSVzIiwKKwkJZ3NtbmV0LT5oYW5kb3Zlci5wd3JfaW50ZXJ2YWwsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiBoYW5kb3ZlciBwb3dlciBidWRnZXQgaHlzdGVyZXNpcyAldSVzIiwKKwkJZ3NtbmV0LT5oYW5kb3Zlci5wd3JfaHlzdGVyZXNpcywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIGhhbmRvdmVyIG1heGltdW0gZGlzdGFuY2UgJXUlcyIsCisJCWdzbW5ldC0+aGFuZG92ZXIubWF4X2Rpc3RhbmNlLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgdGltZXIgdDMxMDEgJXUlcyIsIGdzbW5ldC0+VDMxMDEsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiB0aW1lciB0MzEwMyAldSVzIiwgZ3NtbmV0LT5UMzEwMywgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIHRpbWVyIHQzMTA1ICV1JXMiLCBnc21uZXQtPlQzMTA1LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgdGltZXIgdDMxMDcgJXUlcyIsIGdzbW5ldC0+VDMxMDcsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiB0aW1lciB0MzEwOSAldSVzIiwgZ3NtbmV0LT5UMzEwOSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIHRpbWVyIHQzMTExICV1JXMiLCBnc21uZXQtPlQzMTExLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgdGltZXIgdDMxMTMgJXUlcyIsIGdzbW5ldC0+VDMxMTMsIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiB0aW1lciB0MzExNSAldSVzIiwgZ3NtbmV0LT5UMzExNSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiIHRpbWVyIHQzMTE3ICV1JXMiLCBnc21uZXQtPlQzMTE3LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgdGltZXIgdDMxMTkgJXUlcyIsIGdzbW5ldC0+VDMxMTksIFZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiB0aW1lciB0MzE0MSAldSVzIiwgZ3NtbmV0LT5UMzE0MSwgVlRZX05FV0xJTkUpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCB0cnhfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCkKK3sKKwl2dHlfb3V0KHZ0eSwgIlRSWCAldSBvZiBCVFMgJXUgaXMgb24gQVJGQ04gJXUlcyIsCisJCXRyeC0+bnIsIHRyeC0+YnRzLT5uciwgdHJ4LT5hcmZjbiwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBSRiBOb21pbmFsIFBvd2VyOiAlZCBkQm0sIHJlZHVjZWQgYnkgJXUgZEIsICIKKwkJInJlc3VsdGluZyBCUyBwb3dlcjogJWQgZEJtJXMiLAorCQl0cngtPm5vbWluYWxfcG93ZXIsIHRyeC0+bWF4X3Bvd2VyX3JlZCwKKwkJdHJ4LT5ub21pbmFsX3Bvd2VyIC0gdHJ4LT5tYXhfcG93ZXJfcmVkLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIE5NIFN0YXRlOiAiKTsKKwluZXRfZHVtcF9ubXN0YXRlKHZ0eSwgJnRyeC0+bm1fc3RhdGUpOworCXZ0eV9vdXQodnR5LCAiICBCYXNlYmFuZCBUcmFuc2NlaXZlciBOTSBTdGF0ZTogIik7CisJbmV0X2R1bXBfbm1zdGF0ZSh2dHksICZ0cngtPmJiX3RyYW5zYy5ubV9zdGF0ZSk7CisJaWYgKGlzX2lwYWNjZXNzX2J0cyh0cngtPmJ0cykpIHsKKwkJdnR5X291dCh2dHksICIgIGlwLmFjY2VzcyBzdHJlYW0gSUQ6IDB4JTAyeCVzIiwKKwkJCXRyeC0+cnNsX3RlaSwgVlRZX05FV0xJTkUpOworCX0gZWxzZSB7CisJCXZ0eV9vdXQodnR5LCAiICBFMSBTaWduYWxsaW5nIExpbms6JXMiLCBWVFlfTkVXTElORSk7CisJCWUxaXNsX2R1bXBfdnR5KHZ0eSwgdHJ4LT5yc2xfbGluayk7CisJfQorfQorCitERUZVTihzaG93X3RyeCwKKyAgICAgIHNob3dfdHJ4X2NtZCwKKyAgICAgICJzaG93IHRyeCBbYnRzX25yXSBbdHJ4X25yXSIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBUUlhcbiIpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXQgPSBnc21uZXQ7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IE5VTEw7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisJaW50IGJ0c19uciwgdHJ4X25yOworCisJaWYgKGFyZ2MgPj0gMSkgeworCQkvKiB1c2UgdGhlIEJUUyBudW1iZXIgdGhhdCB0aGUgdXNlciBoYXMgc3BlY2lmaWVkICovCisJCWJ0c19uciA9IGF0b2koYXJndlswXSk7CisJCWlmIChidHNfbnIgPj0gbmV0LT5udW1fYnRzKSB7CisJCQl2dHlfb3V0KHZ0eSwgIiUlIGNhbid0IGZpbmQgQlRTICclcyclcyIsIGFyZ3ZbMF0sCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCWJ0cyA9IGdzbV9idHNfbnVtKG5ldCwgYnRzX25yKTsKKwl9CisJaWYgKGFyZ2MgPj0gMikgeworCQl0cnhfbnIgPSBhdG9pKGFyZ3ZbMV0pOworCQlpZiAodHJ4X25yID49IGJ0cy0+bnVtX3RyeCkgeworCQkJdnR5X291dCh2dHksICIlJSBjYW4ndCBmaW5kIFRSWCAnJXMnJXMiLCBhcmd2WzFdLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCB0cnhfbnIpOworCQl0cnhfZHVtcF92dHkodnR5LCB0cngpOworCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfQorCWlmIChidHMpIHsKKwkJLyogcHJpbnQgYWxsIFRSWCBpbiB0aGlzIEJUUyAqLworCQlmb3IgKHRyeF9uciA9IDA7IHRyeF9uciA8IGJ0cy0+bnVtX3RyeDsgdHJ4X25yKyspIHsKKwkJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIHRyeF9ucik7CisJCQl0cnhfZHVtcF92dHkodnR5LCB0cngpOworCQl9CisJCXJldHVybiBDTURfU1VDQ0VTUzsKKwl9CisKKwlmb3IgKGJ0c19uciA9IDA7IGJ0c19uciA8IG5ldC0+bnVtX2J0czsgYnRzX25yKyspIHsKKwkJYnRzID0gZ3NtX2J0c19udW0obmV0LCBidHNfbnIpOworCQlmb3IgKHRyeF9uciA9IDA7IHRyeF9uciA8IGJ0cy0+bnVtX3RyeDsgdHJ4X25yKyspIHsKKwkJCXRyeCA9IGdzbV9idHNfdHJ4X251bShidHMsIHRyeF9ucik7CisJCQl0cnhfZHVtcF92dHkodnR5LCB0cngpOworCQl9CisJfQorCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisKK3N0YXRpYyB2b2lkIHRzX2R1bXBfdnR5KHN0cnVjdCB2dHkgKnZ0eSwgc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cykKK3sKKwl2dHlfb3V0KHZ0eSwgIlRpbWVzbG90ICV1IG9mIFRSWCAldSBpbiBCVFMgJXUsIHBoeXMgY2ZnICVzJXMiLAorCQl0cy0+bnIsIHRzLT50cngtPm5yLCB0cy0+dHJ4LT5idHMtPm5yLAorCQlnc21fcGNoYW5fbmFtZSh0cy0+cGNoYW4pLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIgIE5NIFN0YXRlOiAiKTsKKwluZXRfZHVtcF9ubXN0YXRlKHZ0eSwgJnRzLT5ubV9zdGF0ZSk7CisJaWYgKCFpc19pcGFjY2Vzc19idHModHMtPnRyeC0+YnRzKSkKKwkJdnR5X291dCh2dHksICIgIEUxIExpbmUgJXUsIFRpbWVzbG90ICV1LCBTdWJzbG90ICV1JXMiLAorCQkJdHMtPmUxX2xpbmsuZTFfbnIsIHRzLT5lMV9saW5rLmUxX3RzLAorCQkJdHMtPmUxX2xpbmsuZTFfdHNfc3MsIFZUWV9ORVdMSU5FKTsKK30KKworREVGVU4oc2hvd190cywKKyAgICAgIHNob3dfdHNfY21kLAorICAgICAgInNob3cgdGltZXNsb3QgW2J0c19ucl0gW3RyeF9ucl0gW3RzX25yXSIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBUU1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGdzbW5ldDsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHM7CisJaW50IGJ0c19uciwgdHJ4X25yLCB0c19ucjsKKworCWlmIChhcmdjID49IDEpIHsKKwkJLyogdXNlIHRoZSBCVFMgbnVtYmVyIHRoYXQgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCAqLworCQlidHNfbnIgPSBhdG9pKGFyZ3ZbMF0pOworCQlpZiAoYnRzX25yID49IG5ldC0+bnVtX2J0cykgeworCQkJdnR5X291dCh2dHksICIlJSBjYW4ndCBmaW5kIEJUUyAnJXMnJXMiLCBhcmd2WzBdLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQlidHMgPSBnc21fYnRzX251bShuZXQsIGJ0c19ucik7CisJfQorCWlmIChhcmdjID49IDIpIHsKKwkJdHJ4X25yID0gYXRvaShhcmd2WzFdKTsKKwkJaWYgKHRyeF9uciA+PSBidHMtPm51bV90cngpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBUUlggJyVzJyVzIiwgYXJndlsxXSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X25yKTsKKwl9CisJaWYgKGFyZ2MgPj0gMykgeworCQl0c19uciA9IGF0b2koYXJndlsyXSk7CisJCWlmICh0c19uciA+PSBUUlhfTlJfVFMpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBUUyAnJXMnJXMiLCBhcmd2WzJdLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQl0cyA9ICZ0cngtPnRzW3RzX25yXTsKKwkJdHNfZHVtcF92dHkodnR5LCB0cyk7CisJCXJldHVybiBDTURfU1VDQ0VTUzsKKwl9CisJZm9yIChidHNfbnIgPSAwOyBidHNfbnIgPCBuZXQtPm51bV9idHM7IGJ0c19ucisrKSB7CisJCWJ0cyA9IGdzbV9idHNfbnVtKG5ldCwgYnRzX25yKTsKKwkJZm9yICh0cnhfbnIgPSAwOyB0cnhfbnIgPCBidHMtPm51bV90cng7IHRyeF9ucisrKSB7CisJCQl0cnggPSBnc21fYnRzX3RyeF9udW0oYnRzLCB0cnhfbnIpOworCQkJZm9yICh0c19uciA9IDA7IHRzX25yIDwgVFJYX05SX1RTOyB0c19ucisrKSB7CisJCQkJdHMgPSAmdHJ4LT50c1t0c19ucl07CisJCQkJdHNfZHVtcF92dHkodnR5LCB0cyk7CisJCQl9CisJCX0KKwl9CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIHN1YnNjcl9kdW1wX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWludCByYzsKKwlzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyBhaW5mbzsKKwlzdHJ1Y3QgZ3NtX2F1dGhfdHVwbGUgYXR1cGxlOworCisJdnR5X291dCh2dHksICIgICAgSUQ6ICVsbHUsIEF1dGhvcml6ZWQ6ICVkJXMiLCBzdWJzY3ItPmlkLAorCQlzdWJzY3ItPmF1dGhvcml6ZWQsIFZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT5uYW1lKQorCQl2dHlfb3V0KHZ0eSwgIiAgICBOYW1lOiAnJXMnJXMiLCBzdWJzY3ItPm5hbWUsIFZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT5leHRlbnNpb24pCisJCXZ0eV9vdXQodnR5LCAiICAgIEV4dGVuc2lvbjogJXMlcyIsIHN1YnNjci0+ZXh0ZW5zaW9uLAorCQkJVlRZX05FV0xJTkUpOworCWlmIChzdWJzY3ItPmltc2kpCisJCXZ0eV9vdXQodnR5LCAiICAgIElNU0k6ICVzJXMiLCBzdWJzY3ItPmltc2ksIFZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT50bXNpICE9IEdTTV9SRVNFUlZFRF9UTVNJKQorCQl2dHlfb3V0KHZ0eSwgIiAgICBUTVNJOiAlMDhYJXMiLCBzdWJzY3ItPnRtc2ksCisJCQlWVFlfTkVXTElORSk7CisKKwl2dHlfb3V0KHZ0eSwgIiAgICBVc2UgY291bnQ6ICV1JXMiLCBzdWJzY3ItPnVzZV9jb3VudCwgVlRZX05FV0xJTkUpOworfQorCitzdGF0aWMgdm9pZCBtZWFzX3JlcF9kdW1wX3VuaV92dHkoc3RydWN0IHZ0eSAqdnR5LAorCQkJCSAgc3RydWN0IGdzbV9tZWFzX3JlcF91bmlkaXIgKm1ydSwKKwkJCQkgIGNvbnN0IGNoYXIgKnByZWZpeCwKKwkJCQkgIGNvbnN0IGNoYXIgKmRpcikKK3sKKwl2dHlfb3V0KHZ0eSwgIiVzICBSWEwtRlVMTC0lczogJTRkIGRCbSwgUlhMLVNVQi0lczogJTRkIGRCbSAiLAorCQlwcmVmaXgsIGRpciwgcnhsZXYyZGJtKG1ydS0+ZnVsbC5yeF9sZXYpLAorCQkJZGlyLCByeGxldjJkYm0obXJ1LT5zdWIucnhfbGV2KSk7CisJdnR5X291dCh2dHksICJSWFEtRlVMTC0lczogJWQsIFJYUS1TVUItJXM6ICVkJXMiLAorCQlkaXIsIG1ydS0+ZnVsbC5yeF9xdWFsLCBkaXIsIG1ydS0+c3ViLnJ4X3F1YWwsCisJCVZUWV9ORVdMSU5FKTsKK30KKworc3RhdGljIHZvaWQgbWVhc19yZXBfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX21lYXNfcmVwICptciwKKwkJCSAgICAgIGNvbnN0IGNoYXIgKnByZWZpeCkKK3sKKwl2dHlfb3V0KHZ0eSwgIiVzTWVhc3VyZW1lbnQgUmVwb3J0OiVzIiwgcHJlZml4LCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICIlcyAgRmxhZ3M6ICVzJXMlcyVzJXMiLCBwcmVmaXgsCisJCQltci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX1VMX0RUWCA/ICJEVFh1ICIgOiAiIiwKKwkJCW1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfRExfRFRYID8gIkRUWGQgIiA6ICIiLAorCQkJbXItPmZsYWdzICYgTUVBU19SRVBfRl9GUEMgPyAiRlBDICIgOiAiIiwKKwkJCW1yLT5mbGFncyAmIE1FQVNfUkVQX0ZfRExfVkFMSUQgPyAiICIgOiAiRExpbnZhbCAiLAorCQkJVlRZX05FV0xJTkUpOworCWlmIChtci0+ZmxhZ3MgJiBNRUFTX1JFUF9GX01TX1RPKQorCQl2dHlfb3V0KHZ0eSwgIiVzICBNUyBUaW1pbmcgT2Zmc2V0OiAldSVzIiwgcHJlZml4LAorCQkJbXItPm1zX3RpbWluZ19vZmZzZXQsIFZUWV9ORVdMSU5FKTsKKwlpZiAobXItPmZsYWdzICYgTUVBU19SRVBfRl9NU19MMSkKKwkJdnR5X291dCh2dHksICIlcyAgTDEgTVMgUG93ZXI6ICV1IGRCbSwgVGltaW5nIEFkdmFuY2U6ICV1JXMiLAorCQkJcHJlZml4LCBtci0+bXNfbDEucHdyLCBtci0+bXNfbDEudGEsIFZUWV9ORVdMSU5FKTsKKwlpZiAobXItPmZsYWdzICYgTUVBU19SRVBfRl9ETF9WQUxJRCkKKwkJbWVhc19yZXBfZHVtcF91bmlfdnR5KHZ0eSwgJm1yLT5kbCwgcHJlZml4LCAiZGwiKTsKKwltZWFzX3JlcF9kdW1wX3VuaV92dHkodnR5LCAmbXItPnVsLCBwcmVmaXgsICJ1bCIpOworfQorCitzdGF0aWMgdm9pZCBsY2hhbl9kdW1wX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fbGNoYW4gKmxjaGFuKQoreworCWludCBpZHg7CisKKwl2dHlfb3V0KHZ0eSwgIkxjaGFuICV1IGluIFRpbWVzbG90ICV1IG9mIFRSWCAldSBpbiBCVFMgJXUsIFR5cGUgJXMlcyIsCisJCWxjaGFuLT5uciwgbGNoYW4tPnRzLT5uciwgbGNoYW4tPnRzLT50cngtPm5yLCAKKwkJbGNoYW4tPnRzLT50cngtPmJ0cy0+bnIsIGdzbV9sY2hhbnRfbmFtZShsY2hhbi0+dHlwZSksCisJCVZUWV9ORVdMSU5FKTsKKwl2dHlfb3V0KHZ0eSwgIiAgVXNlIENvdW50OiAldSwgU3RhdGU6ICVzJXMiLCBsY2hhbi0+dXNlX2NvdW50LAorCQlnc21fbGNoYW5zX25hbWUobGNoYW4tPnN0YXRlKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiICBCUyBQb3dlcjogJXUgZEJtLCBNUyBQb3dlcjogJXUgZEJtJXMiLAorCQlsY2hhbi0+dHMtPnRyeC0+bm9taW5hbF9wb3dlciAtIGxjaGFuLT50cy0+dHJ4LT5tYXhfcG93ZXJfcmVkCisJCS0gbGNoYW4tPmJzX3Bvd2VyKjIsCisJCW1zX3B3cl9kYm0obGNoYW4tPnRzLT50cngtPmJ0cy0+YmFuZCwgbGNoYW4tPm1zX3Bvd2VyKSwKKwkJVlRZX05FV0xJTkUpOworCWlmIChsY2hhbi0+c3Vic2NyKSB7CisJCXZ0eV9vdXQodnR5LCAiICBTdWJzY3JpYmVyOiVzIiwgVlRZX05FV0xJTkUpOworCQlzdWJzY3JfZHVtcF92dHkodnR5LCBsY2hhbi0+c3Vic2NyKTsKKwl9IGVsc2UKKwkJdnR5X291dCh2dHksICIgIE5vIFN1YnNjcmliZXIlcyIsIFZUWV9ORVdMSU5FKTsKKwlpZiAoaXNfaXBhY2Nlc3NfYnRzKGxjaGFuLT50cy0+dHJ4LT5idHMpKSB7CisJCXN0cnVjdCBpbl9hZGRyIGlhOworCQlpYS5zX2FkZHIgPSBsY2hhbi0+YWJpc19pcC5ib3VuZF9pcDsKKwkJdnR5X291dCh2dHksICIgIEJvdW5kIElQOiAlcyBQb3J0ICV1IFJUUF9UWVBFMj0ldSBDT05OX0lEPSV1JXMiLAorCQkJaW5ldF9udG9hKGlhKSwgbGNoYW4tPmFiaXNfaXAuYm91bmRfcG9ydCwKKwkJCWxjaGFuLT5hYmlzX2lwLnJ0cF9wYXlsb2FkMiwgbGNoYW4tPmFiaXNfaXAuY29ubl9pZCwKKwkJCVZUWV9ORVdMSU5FKTsKKwl9CisKKwkvKiB3ZSB3YW50IHRvIHJlcG9ydCB0aGUgbGFzdCBtZWFzdXJlbWVudCByZXBvcnQgKi8KKwlpZHggPSBjYWxjX2luaXRpYWxfaWR4KEFSUkFZX1NJWkUobGNoYW4tPm1lYXNfcmVwKSwKKwkJCSAgICAgICBsY2hhbi0+bWVhc19yZXBfaWR4LCAxKTsKKwltZWFzX3JlcF9kdW1wX3Z0eSh2dHksICZsY2hhbi0+bWVhc19yZXBbaWR4XSwgIiAgIik7Cit9CisKKyNpZiAwCitUT0RPOiBjYWxscmVmIGFuZCByZW1vdGUgY2FsbHJlZiBvZiBjYWxsIG11c3QgYmUgcmVzb2x2ZWQgdG8gZ2V0IGdzbV90cmFucyBvYmplY3QKK3N0YXRpYyB2b2lkIGNhbGxfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2NhbGwgKmNhbGwpCit7CisJdnR5X291dCh2dHksICJDYWxsIFR5cGUgJXUsIFN0YXRlICV1LCBUcmFuc2FjdGlvbiBJRCAldSVzIiwKKwkJY2FsbC0+dHlwZSwgY2FsbC0+c3RhdGUsIGNhbGwtPnRyYW5zYWN0aW9uX2lkLCBWVFlfTkVXTElORSk7CisKKwlpZiAoY2FsbC0+bG9jYWxfbGNoYW4pIHsKKwkJdnR5X291dCh2dHksICJDYWxsIExvY2FsIENoYW5uZWw6JXMiLCBWVFlfTkVXTElORSk7CisJCWxjaGFuX2R1bXBfdnR5KHZ0eSwgY2FsbC0+bG9jYWxfbGNoYW4pOworCX0gZWxzZQorCQl2dHlfb3V0KHZ0eSwgIkNhbGwgaGFzIG5vIExvY2FsIENoYW5uZWwlcyIsIFZUWV9ORVdMSU5FKTsKKworCWlmIChjYWxsLT5yZW1vdGVfbGNoYW4pIHsKKwkJdnR5X291dCh2dHksICJDYWxsIFJlbW90ZSBDaGFubmVsOiVzIiwgVlRZX05FV0xJTkUpOworCQlsY2hhbl9kdW1wX3Z0eSh2dHksIGNhbGwtPnJlbW90ZV9sY2hhbik7CisJfSBlbHNlCisJCXZ0eV9vdXQodnR5LCAiQ2FsbCBoYXMgbm8gUmVtb3RlIENoYW5uZWwlcyIsIFZUWV9ORVdMSU5FKTsKKworCWlmIChjYWxsLT5jYWxsZWRfc3Vic2NyKSB7CisJCXZ0eV9vdXQodnR5LCAiQ2FsbGVkIFN1YnNjcmliZXI6JXMiLCBWVFlfTkVXTElORSk7CisJCXN1YnNjcl9kdW1wX3Z0eSh2dHksIGNhbGwtPmNhbGxlZF9zdWJzY3IpOworCX0gZWxzZQorCQl2dHlfb3V0KHZ0eSwgIkNhbGwgaGFzIG5vIENhbGxlZCBTdWJzY3JpYmVyJXMiLCBWVFlfTkVXTElORSk7Cit9CisjZW5kaWYKKworREVGVU4oc2hvd19sY2hhbiwKKyAgICAgIHNob3dfbGNoYW5fY21kLAorICAgICAgInNob3cgbGNoYW4gW2J0c19ucl0gW3RyeF9ucl0gW3RzX25yXSBbbGNoYW5fbnJdIiwKKwlTSE9XX1NUUiAiRGlzcGxheSBpbmZvcm1hdGlvbiBhYm91dCBhIGxvZ2ljYWwgY2hhbm5lbFxuIikKK3sKKwlzdHJ1Y3QgZ3NtX25ldHdvcmsgKm5ldCA9IGdzbW5ldDsKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4OworCXN0cnVjdCBnc21fYnRzX3RyeF90cyAqdHM7CisJc3RydWN0IGdzbV9sY2hhbiAqbGNoYW47CisJaW50IGJ0c19uciwgdHJ4X25yLCB0c19uciwgbGNoYW5fbnI7CisKKwlpZiAoYXJnYyA+PSAxKSB7CisJCS8qIHVzZSB0aGUgQlRTIG51bWJlciB0aGF0IHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgKi8KKwkJYnRzX25yID0gYXRvaShhcmd2WzBdKTsKKwkJaWYgKGJ0c19uciA+PSBuZXQtPm51bV9idHMpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBCVFMgJXMlcyIsIGFyZ3ZbMF0sCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCWJ0cyA9IGdzbV9idHNfbnVtKG5ldCwgYnRzX25yKTsKKwl9CisJaWYgKGFyZ2MgPj0gMikgeworCQl0cnhfbnIgPSBhdG9pKGFyZ3ZbMV0pOworCQlpZiAodHJ4X25yID49IGJ0cy0+bnVtX3RyeCkgeworCQkJdnR5X291dCh2dHksICIlJSBjYW4ndCBmaW5kIFRSWCAlcyVzIiwgYXJndlsxXSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X25yKTsKKwl9CisJaWYgKGFyZ2MgPj0gMykgeworCQl0c19uciA9IGF0b2koYXJndlsyXSk7CisJCWlmICh0c19uciA+PSBUUlhfTlJfVFMpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgY2FuJ3QgZmluZCBUUyAlcyVzIiwgYXJndlsyXSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJdHMgPSAmdHJ4LT50c1t0c19ucl07CisJfQorCWlmIChhcmdjID49IDQpIHsKKwkJbGNoYW5fbnIgPSBhdG9pKGFyZ3ZbM10pOworCQlpZiAobGNoYW5fbnIgPj0gVFNfTUFYX0xDSEFOKSB7CisJCQl2dHlfb3V0KHZ0eSwgIiUlIGNhbid0IGZpbmQgTENIQU4gJXMlcyIsIGFyZ3ZbM10sCisJCQkJVlRZX05FV0xJTkUpOworCQkJcmV0dXJuIENNRF9XQVJOSU5HOworCQl9CisJCWxjaGFuID0gJnRzLT5sY2hhbltsY2hhbl9ucl07CisJCWxjaGFuX2R1bXBfdnR5KHZ0eSwgbGNoYW4pOworCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfQorCWZvciAoYnRzX25yID0gMDsgYnRzX25yIDwgbmV0LT5udW1fYnRzOyBidHNfbnIrKykgeworCQlidHMgPSBnc21fYnRzX251bShuZXQsIGJ0c19ucik7CisJCWZvciAodHJ4X25yID0gMDsgdHJ4X25yIDwgYnRzLT5udW1fdHJ4OyB0cnhfbnIrKykgeworCQkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X25yKTsKKwkJCWZvciAodHNfbnIgPSAwOyB0c19uciA8IFRSWF9OUl9UUzsgdHNfbnIrKykgeworCQkJCXRzID0gJnRyeC0+dHNbdHNfbnJdOworCQkJCWZvciAobGNoYW5fbnIgPSAwOyBsY2hhbl9uciA8IFRTX01BWF9MQ0hBTjsKKwkJCQkgICAgIGxjaGFuX25yKyspIHsKKwkJCQkJbGNoYW4gPSAmdHMtPmxjaGFuW2xjaGFuX25yXTsKKwkJCQkJaWYgKGxjaGFuLT50eXBlID09IEdTTV9MQ0hBTl9OT05FKQorCQkJCQkJY29udGludWU7CisJCQkJCWxjaGFuX2R1bXBfdnR5KHZ0eSwgbGNoYW4pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIHZvaWQgZTFkcnZfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZTFpbnBfZHJpdmVyICpkcnYpCit7CisJdnR5X291dCh2dHksICJFMSBJbnB1dCBEcml2ZXIgJXMlcyIsIGRydi0+bmFtZSwgVlRZX05FV0xJTkUpOworfQorCitERUZVTihzaG93X2UxZHJ2LAorICAgICAgc2hvd19lMWRydl9jbWQsCisgICAgICAic2hvdyBlMV9kcml2ZXIiLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGF2YWlsYWJsZSBFMSBkcml2ZXJzXG4iKQoreworCXN0cnVjdCBlMWlucF9kcml2ZXIgKmRydjsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGRydiwgJmUxaW5wX2RyaXZlcl9saXN0LCBsaXN0KQorCQllMWRydl9kdW1wX3Z0eSh2dHksIGRydik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIGUxbGluZV9kdW1wX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBlMWlucF9saW5lICpsaW5lKQoreworCXZ0eV9vdXQodnR5LCAiRTEgTGluZSBOdW1iZXIgJXUsIE5hbWUgJXMsIERyaXZlciAlcyVzIiwKKwkJbGluZS0+bnVtLCBsaW5lLT5uYW1lID8gbGluZS0+bmFtZSA6ICIiLAorCQlsaW5lLT5kcml2ZXItPm5hbWUsIFZUWV9ORVdMSU5FKTsKK30KKworREVGVU4oc2hvd19lMWxpbmUsCisgICAgICBzaG93X2UxbGluZV9jbWQsCisgICAgICAic2hvdyBlMV9saW5lIFtsaW5lX25yXSIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBFMSBsaW5lXG4iKQoreworCXN0cnVjdCBlMWlucF9saW5lICpsaW5lOworCisJaWYgKGFyZ2MgPj0gMSkgeworCQlpbnQgbnVtID0gYXRvaShhcmd2WzBdKTsKKwkJbGxpc3RfZm9yX2VhY2hfZW50cnkobGluZSwgJmUxaW5wX2xpbmVfbGlzdCwgbGlzdCkgeworCQkJaWYgKGxpbmUtPm51bSA9PSBudW0pIHsKKwkJCQllMWxpbmVfZHVtcF92dHkodnR5LCBsaW5lKTsKKwkJCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJCQl9CisJCX0KKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0JCisJCisJbGxpc3RfZm9yX2VhY2hfZW50cnkobGluZSwgJmUxaW5wX2xpbmVfbGlzdCwgbGlzdCkKKwkJZTFsaW5lX2R1bXBfdnR5KHZ0eSwgbGluZSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyB2b2lkIGUxdHNfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZTFpbnBfdHMgKnRzKQoreworCWlmICh0cy0+dHlwZSA9PSBFMUlOUF9UU19UWVBFX05PTkUpCisJCXJldHVybjsKKwl2dHlfb3V0KHZ0eSwgIkUxIFRpbWVzbG90ICUydSBvZiBMaW5lICV1IGlzIFR5cGUgJXMlcyIsCisJCXRzLT5udW0sIHRzLT5saW5lLT5udW0sIGUxaW5wX3RzdHlwZV9uYW1lKHRzLT50eXBlKSwKKwkJVlRZX05FV0xJTkUpOworfQorCitERUZVTihzaG93X2UxdHMsCisgICAgICBzaG93X2UxdHNfY21kLAorICAgICAgInNob3cgZTFfdGltZXNsb3QgW2xpbmVfbnJdIFt0c19ucl0iLAorCVNIT1dfU1RSICJEaXNwbGF5IGluZm9ybWF0aW9uIGFib3V0IGEgRTEgdGltZXNsb3RcbiIpCit7CisJc3RydWN0IGUxaW5wX2xpbmUgKmxpbmUgPSBOVUxMOworCXN0cnVjdCBlMWlucF90cyAqdHM7CisJaW50IHRzX25yOworCisJaWYgKGFyZ2MgPT0gMCkgeworCQlsbGlzdF9mb3JfZWFjaF9lbnRyeShsaW5lLCAmZTFpbnBfbGluZV9saXN0LCBsaXN0KSB7CisJCQlmb3IgKHRzX25yID0gMDsgdHNfbnIgPCBOVU1fRTFfVFM7IHRzX25yKyspIHsKKwkJCQl0cyA9ICZsaW5lLT50c1t0c19ucl07CisJCQkJZTF0c19kdW1wX3Z0eSh2dHksIHRzKTsKKwkJCX0KKwkJfQorCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfQorCWlmIChhcmdjID49IDEpIHsKKwkJaW50IG51bSA9IGF0b2koYXJndlswXSk7CisJCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KGxpbmUsICZlMWlucF9saW5lX2xpc3QsIGxpc3QpIHsKKwkJCWlmIChsaW5lLT5udW0gPT0gbnVtKQorCQkJCWJyZWFrOworCQl9CisJCWlmICghbGluZSB8fCBsaW5lLT5udW0gIT0gbnVtKSB7CisJCQl2dHlfb3V0KHZ0eSwgIkUxIGxpbmUgJXMgaXMgaW52YWxpZCVzIiwKKwkJCQlhcmd2WzBdLCBWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwl9CQorCWlmIChhcmdjID49IDIpIHsKKwkJdHNfbnIgPSBhdG9pKGFyZ3ZbMV0pOworCQlpZiAodHNfbnIgPiBOVU1fRTFfVFMpIHsKKwkJCXZ0eV9vdXQodnR5LCAiRTEgdGltZXNsb3QgJXMgaXMgaW52YWxpZCVzIiwKKwkJCQlhcmd2WzFdLCBWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJdHMgPSAmbGluZS0+dHNbdHNfbnJdOworCQllMXRzX2R1bXBfdnR5KHZ0eSwgdHMpOworCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfSBlbHNlIHsKKwkJZm9yICh0c19uciA9IDA7IHRzX25yIDwgTlVNX0UxX1RTOyB0c19ucisrKSB7CisJCQl0cyA9ICZsaW5lLT50c1t0c19ucl07CisJCQllMXRzX2R1bXBfdnR5KHZ0eSwgdHMpOworCQl9CisJCXJldHVybiBDTURfU1VDQ0VTUzsKKwl9CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBwYWdpbmdfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX3BhZ2luZ19yZXF1ZXN0ICpwYWcpCit7CisJdnR5X291dCh2dHksICJQYWdpbmcgb24gQlRTICV1JXMiLCBwYWctPmJ0cy0+bnIsIFZUWV9ORVdMSU5FKTsKKwlzdWJzY3JfZHVtcF92dHkodnR5LCBwYWctPnN1YnNjcik7Cit9CisKK3N0YXRpYyB2b2lkIGJ0c19wYWdpbmdfZHVtcF92dHkoc3RydWN0IHZ0eSAqdnR5LCBzdHJ1Y3QgZ3NtX2J0cyAqYnRzKQoreworCXN0cnVjdCBnc21fcGFnaW5nX3JlcXVlc3QgKnBhZzsKKworCWxsaXN0X2Zvcl9lYWNoX2VudHJ5KHBhZywgJmJ0cy0+cGFnaW5nLnBlbmRpbmdfcmVxdWVzdHMsIGVudHJ5KQorCQlwYWdpbmdfZHVtcF92dHkodnR5LCBwYWcpOworfQorCitERUZVTihzaG93X3BhZ2luZywKKyAgICAgIHNob3dfcGFnaW5nX2NtZCwKKyAgICAgICJzaG93IHBhZ2luZyBbYnRzX25yXSIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgcGFnaW5nIHJldXFlc3RzIG9mIGEgQlRTXG4iKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gZ3NtbmV0OworCXN0cnVjdCBnc21fYnRzICpidHM7CisJaW50IGJ0c19ucjsKKworCWlmIChhcmdjID49IDEpIHsKKwkJLyogdXNlIHRoZSBCVFMgbnVtYmVyIHRoYXQgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCAqLworCQlidHNfbnIgPSBhdG9pKGFyZ3ZbMF0pOworCQlpZiAoYnRzX25yID49IG5ldC0+bnVtX2J0cykgeworCQkJdnR5X291dCh2dHksICIlJSBjYW4ndCBmaW5kIEJUUyAlcyVzIiwgYXJndlswXSwKKwkJCQlWVFlfTkVXTElORSk7CisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJCX0KKwkJYnRzID0gZ3NtX2J0c19udW0obmV0LCBidHNfbnIpOworCQlidHNfcGFnaW5nX2R1bXBfdnR5KHZ0eSwgYnRzKTsKKwkJCisJCXJldHVybiBDTURfU1VDQ0VTUzsKKwl9CisJZm9yIChidHNfbnIgPSAwOyBidHNfbnIgPCBuZXQtPm51bV9idHM7IGJ0c19ucisrKSB7CisJCWJ0cyA9IGdzbV9idHNfbnVtKG5ldCwgYnRzX25yKTsKKwkJYnRzX3BhZ2luZ19kdW1wX3Z0eSh2dHksIGJ0cyk7CisJfQorCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBfdnR5X291dHB1dChzdHJ1Y3QgZGVidWdfdGFyZ2V0ICp0Z3QsIGNvbnN0IGNoYXIgKmxpbmUpCit7CisJc3RydWN0IHZ0eSAqdnR5ID0gdGd0LT50Z3RfdnR5LnZ0eTsKKwl2dHlfb3V0KHZ0eSwgIiVzIiwgbGluZSk7CisJLyogVGhpcyBpcyBhbiB1Z2x5IGhhY2ssIGJ1dCB0aGVyZSBpcyBubyBlYXN5IHdheS4uLiAqLworCWlmIChzdHJjaHIobGluZSwgJ1xuJykpCisJCXZ0eV9vdXQodnR5LCAiXHIiKTsKK30KKworc3RydWN0IGRlYnVnX3RhcmdldCAqZGVidWdfdGFyZ2V0X2NyZWF0ZV92dHkoc3RydWN0IHZ0eSAqdnR5KQoreworCXN0cnVjdCBkZWJ1Z190YXJnZXQgKnRhcmdldDsKKworCXRhcmdldCA9IGRlYnVnX3RhcmdldF9jcmVhdGUoKTsKKwlpZiAoIXRhcmdldCkKKwkJcmV0dXJuIE5VTEw7CisKKwl0YXJnZXQtPnRndF92dHkudnR5ID0gdnR5OworCXRhcmdldC0+b3V0cHV0ID0gX3Z0eV9vdXRwdXQ7CisJcmV0dXJuIHRhcmdldDsKK30KKworREVGVU4oZW5hYmxlX2xvZ2dpbmcsCisgICAgICBlbmFibGVfbG9nZ2luZ19jbWQsCisgICAgICAibG9nZ2luZyBlbmFibGUiLAorICAgICAgIkVuYWJsZXMgbG9nZ2luZyB0byB0aGlzIHZ0eVxuIikKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm47CisKKwljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7CisJaWYgKGNvbm4tPmRiZykgeworCQl2dHlfb3V0KHZ0eSwgIkxvZ2dpbmcgYWxyZWFkeSBlbmFibGVkLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJY29ubi0+ZGJnID0gZGVidWdfdGFyZ2V0X2NyZWF0ZV92dHkodnR5KTsKKwlpZiAoIWNvbm4tPmRiZykKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCisJZGVidWdfYWRkX3RhcmdldChjb25uLT5kYmcpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obG9nZ2luZ19mbHRyX2ltc2ksCisgICAgICBsb2dnaW5nX2ZsdHJfaW1zaV9jbWQsCisgICAgICAibG9nZ2luZyBmaWx0ZXIgaW1zaSBJTVNJIiwKKyAgICAgICJQcmludCBhbGwgbWVzc2FnZXMgcmVsYXRlZCB0byBhIElNU0lcbiIpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOworCisJY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OworCWlmICghY29ubi0+ZGJnKSB7CisJCXZ0eV9vdXQodnR5LCAiTG9nZ2luZyB3YXMgbm90IGVuYWJsZWQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlkZWJ1Z19zZXRfaW1zaV9maWx0ZXIoY29ubi0+ZGJnLCBhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGxvZ2dpbmdfZmx0cl9hbGwsCisgICAgICBsb2dnaW5nX2ZsdHJfYWxsX2NtZCwKKyAgICAgICJsb2dnaW5nIGZpbHRlciBhbGwgPDAtMT4iLAorICAgICAgIlByaW50IGFsbCBtZXNzYWdlcyB0byB0aGUgY29uc29sZVxuIikKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm47CisKKwljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7CisJaWYgKCFjb25uLT5kYmcpIHsKKwkJdnR5X291dCh2dHksICJMb2dnaW5nIHdhcyBub3QgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWRlYnVnX3NldF9hbGxfZmlsdGVyKGNvbm4tPmRiZywgYXRvaShhcmd2WzBdKSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihsb2dnaW5nX3VzZV9jbHIsCisgICAgICBsb2dnaW5nX3VzZV9jbHJfY21kLAorICAgICAgImxvZ2dpbmcgY29sb3IgPDAtMT4iLAorICAgICAgIlVzZSBjb2xvciBmb3IgcHJpbnRpbmcgbWVzc2FnZXNcbiIpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOworCisJY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OworCWlmICghY29ubi0+ZGJnKSB7CisJCXZ0eV9vdXQodnR5LCAiTG9nZ2luZyB3YXMgbm90IGVuYWJsZWQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlkZWJ1Z19zZXRfdXNlX2NvbG9yKGNvbm4tPmRiZywgYXRvaShhcmd2WzBdKSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihsb2dnaW5nX3BybnRfdGltZXN0YW1wLAorICAgICAgbG9nZ2luZ19wcm50X3RpbWVzdGFtcF9jbWQsCisgICAgICAibG9nZ2luZyB0aW1lc3RhbXAgPDAtMT4iLAorICAgICAgIlByaW50IHRoZSB0aW1lc3RhbXAgb2YgZWFjaCBtZXNzYWdlXG4iKQoreworCXN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqY29ubjsKKworCWNvbm4gPSAoc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICopIHZ0eS0+cHJpdjsKKwlpZiAoIWNvbm4tPmRiZykgeworCQl2dHlfb3V0KHZ0eSwgIkxvZ2dpbmcgd2FzIG5vdCBlbmFibGVkLiVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJZGVidWdfc2V0X3ByaW50X3RpbWVzdGFtcChjb25uLT5kYmcsIGF0b2koYXJndlswXSkpOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworLyogRklYTUU6IHRob3NlIGhhdmUgdG8gYmUga2VwdCBpbiBzeW5jIHdpdGggdGhlIGxvZyBsZXZlbHMgYW5kIGNhdGVnb3JpZXMgKi8KKyNkZWZpbmUgVlRZX0RFQlVHX0NBVEVHT1JJRVMgIihybGx8Y2N8bW18cnJ8cnNsfG5tfHNtc3xwYWd8bW5jY3xpbnB8bWl8bWlifG11eHxtZWFzfHNjY3B8bXNjfG1nY3B8aG98ZGJ8cmVmKSIKKyNkZWZpbmUgVlRZX0RFQlVHX0xFVkVMUyAiKGV2ZXJ5dGhpbmd8ZGVidWd8aW5mb3xub3RpY2V8ZXJyb3J8ZmF0YWwpIgorREVGVU4obG9nZ2luZ19sZXZlbCwKKyAgICAgIGxvZ2dpbmdfbGV2ZWxfY21kLAorICAgICAgImxvZ2dpbmcgbGV2ZWwgIiBWVFlfREVCVUdfQ0FURUdPUklFUyAiICIgVlRZX0RFQlVHX0xFVkVMUywKKyAgICAgICJTZXQgdGhlIGxvZyBsZXZlbCBmb3IgYSBzcGVjaWZpZWQgY2F0ZWdvcnlcbiIpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOworCWludCBjYXRlZ29yeSA9IGRlYnVnX3BhcnNlX2NhdGVnb3J5KGFyZ3ZbMF0pOworCWludCBsZXZlbCA9IGRlYnVnX3BhcnNlX2xldmVsKGFyZ3ZbMV0pOworCisJY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OworCWlmICghY29ubi0+ZGJnKSB7CisJCXZ0eV9vdXQodnR5LCAiTG9nZ2luZyB3YXMgbm90IGVuYWJsZWQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAoY2F0ZWdvcnkgPCAwKSB7CisJCXZ0eV9vdXQodnR5LCAiSW52YWxpZCBjYXRlZ29yeSBgJXMnJXMiLCBhcmd2WzBdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAobGV2ZWwgPCAwKSB7CisJCXZ0eV9vdXQodnR5LCAiSW52YWxpZCBsZXZlbCBgJXMnJXMiLCBhcmd2WzFdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwljb25uLT5kYmctPmNhdGVnb3JpZXNbY2F0ZWdvcnldLmVuYWJsZWQgPSAxOworCWNvbm4tPmRiZy0+Y2F0ZWdvcmllc1tjYXRlZ29yeV0ubG9nbGV2ZWwgPSBsZXZlbDsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4obG9nZ2luZ19zZXRfY2F0ZWdvcnlfbWFzaywKKyAgICAgIGxvZ2dpbmdfc2V0X2NhdGVnb3J5X21hc2tfY21kLAorICAgICAgImxvZ2dpbmcgc2V0IGRlYnVnIG1hc2sgTUFTSyIsCisgICAgICAiRGVjaWRlIHdoaWNoIGNhdGVnb3JpZXMgdG8gb3V0cHV0LlxuIikKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm47CisKKwljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7CisJaWYgKCFjb25uLT5kYmcpIHsKKwkJdnR5X291dCh2dHksICJMb2dnaW5nIHdhcyBub3QgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWRlYnVnX3BhcnNlX2NhdGVnb3J5X21hc2soY29ubi0+ZGJnLCBhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGxvZ2dpbmdfc2V0X2xvZ19sZXZlbCwKKyAgICAgIGxvZ2dpbmdfc2V0X2xvZ19sZXZlbF9jbWQsCisgICAgICAibG9nZ2luZyBzZXQgbG9nIGxldmVsIDwwLTg+IiwKKyAgICAgICJTZXQgdGhlIGdsb2JhbCBsb2cgbGV2ZWwuIFRoZSB2YWx1ZSAwIGltcGxpZXMgbm8gZmlsdGVyaW5nLlxuIikKK3sKKwlzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKmNvbm47CisKKwljb25uID0gKHN0cnVjdCB0ZWxuZXRfY29ubmVjdGlvbiAqKSB2dHktPnByaXY7CisJaWYgKCFjb25uLT5kYmcpIHsKKwkJdnR5X291dCh2dHksICJMb2dnaW5nIHdhcyBub3QgZW5hYmxlZC4lcyIsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWRlYnVnX3NldF9sb2dfbGV2ZWwoY29ubi0+ZGJnLCBhdG9pKGFyZ3ZbMF0pKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGRpYWJsZV9sb2dnaW5nLAorICAgICAgZGlzYWJsZV9sb2dnaW5nX2NtZCwKKyAgICAgICJsb2dnaW5nIGRpc2FibGUiLAorICAgICAgIkRpc2FibGVzIGxvZ2dpbmcgdG8gdGhpcyB2dHlcbiIpCit7CisJc3RydWN0IHRlbG5ldF9jb25uZWN0aW9uICpjb25uOworCisJY29ubiA9IChzdHJ1Y3QgdGVsbmV0X2Nvbm5lY3Rpb24gKikgdnR5LT5wcml2OworCWlmICghY29ubi0+ZGJnKSB7CisJCXZ0eV9vdXQodnR5LCAiTG9nZ2luZyB3YXMgbm90IGVuYWJsZWQuJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlkZWJ1Z19kZWxfdGFyZ2V0KGNvbm4tPmRiZyk7CisJdGFsbG9jX2ZyZWUoY29ubi0+ZGJnKTsKKwljb25uLT5kYmcgPSBOVUxMOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oc2hvd19zdGF0cywKKyAgICAgIHNob3dfc3RhdHNfY21kLAorICAgICAgInNob3cgc3RhdGlzdGljcyIsCisJU0hPV19TVFIgIkRpc3BsYXkgbmV0d29yayBzdGF0aXN0aWNzXG4iKQoreworCXN0cnVjdCBnc21fbmV0d29yayAqbmV0ID0gZ3NtbmV0OworCisJdnR5X291dCh2dHksICJDaGFubmVsIFJlcXVlc3RzICAgICAgICA6ICVsdSB0b3RhbCwgJWx1IG5vIGNoYW5uZWwlcyIsCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuY2hyZXEudG90YWwpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmNocmVxLm5vX2NoYW5uZWwpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJMb2NhdGlvbiBVcGRhdGUgICAgICAgICA6ICVsdSBhdHRhY2gsICVsdSBub3JtYWwsICVsdSBwZXJpb2RpYyVzIiwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5sb2NfdXBkX3R5cGUuYXR0YWNoKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5sb2NfdXBkX3R5cGUubm9ybWFsKSwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5sb2NfdXBkX3R5cGUucGVyaW9kaWMpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJJTVNJIERldGFjaCBJbmRpY2F0aW9ucyA6ICVsdSVzIiwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5sb2NfdXBkX3R5cGUuZGV0YWNoKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiTG9jYXRpb24gVXBkYXRlIFJlc3BvbnNlOiAlbHUgYWNjZXB0LCAlbHUgcmVqZWN0JXMiLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmxvY191cGRfcmVzcC5hY2NlcHQpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmxvY191cGRfcmVzcC5yZWplY3QpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJQYWdpbmcgICAgICAgICAgICAgICAgICA6ICVsdSBhdHRlbXB0ZWQsICVsdSBjb21wbGV0ZSwgJWx1IGV4cGlyZWQlcyIsCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMucGFnaW5nLmF0dGVtcHRlZCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMucGFnaW5nLmNvbXBsZXRlZCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMucGFnaW5nLmV4cGlyZWQpLCBWVFlfTkVXTElORSk7CisJdnR5X291dCh2dHksICJIYW5kb3ZlciAgICAgICAgICAgICAgICA6ICVsdSBhdHRlbXB0ZWQsICVsdSBub19jaGFubmVsLCAlbHUgdGltZW91dCwgIgorCQkiJWx1IGNvbXBsZXRlZCwgJWx1IGZhaWxlZCVzIiwKKwkJY291bnRlcl9nZXQobmV0LT5zdGF0cy5oYW5kb3Zlci5hdHRlbXB0ZWQpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmhhbmRvdmVyLm5vX2NoYW5uZWwpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmhhbmRvdmVyLnRpbWVvdXQpLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLmhhbmRvdmVyLmNvbXBsZXRlZCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuaGFuZG92ZXIuZmFpbGVkKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiU01TIE1PICAgICAgICAgICAgICAgICAgOiAlbHUgc3VibWl0dGVkLCAlbHUgbm8gcmVjZWl2ZXIlcyIsCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuc21zLnN1Ym1pdHRlZCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuc21zLm5vX3JlY2VpdmVyKSwgVlRZX05FV0xJTkUpOworCXZ0eV9vdXQodnR5LCAiU01TIE1UICAgICAgICAgICAgICAgICAgOiAlbHUgZGVsaXZlcmVkLCAlbHUgbm8gbWVtb3J5LCAlbHUgb3RoZXIgZXJyb3IlcyIsCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuc21zLmRlbGl2ZXJlZCksCisJCWNvdW50ZXJfZ2V0KG5ldC0+c3RhdHMuc21zLnJwX2Vycl9tZW0pLAorCQljb3VudGVyX2dldChuZXQtPnN0YXRzLnNtcy5ycF9lcnJfb3RoZXIpLCBWVFlfTkVXTElORSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0LAorICAgICAgY2ZnX25ldF9jbWQsCisgICAgICAibmV0d29yayIsCisgICAgICAiQ29uZmlndXJlIHRoZSBHU00gbmV0d29yayIpCit7CisJdnR5LT5pbmRleCA9IGdzbW5ldDsKKwl2dHktPm5vZGUgPSBHU01ORVRfTk9ERTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworCitERUZVTihjZmdfbmV0X25jYywKKyAgICAgIGNmZ19uZXRfbmNjX2NtZCwKKyAgICAgICJuZXR3b3JrIGNvdW50cnkgY29kZSA8MS05OTk+IiwKKyAgICAgICJTZXQgdGhlIEdTTSBuZXR3b3JrIGNvdW50cnkgY29kZSIpCit7CisJZ3NtbmV0LT5jb3VudHJ5X2NvZGUgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X21uYywKKyAgICAgIGNmZ19uZXRfbW5jX2NtZCwKKyAgICAgICJtb2JpbGUgbmV0d29yayBjb2RlIDwxLTk5OT4iLAorICAgICAgIlNldCB0aGUgR1NNIG1vYmlsZSBuZXR3b3JrIGNvZGUiKQoreworCWdzbW5ldC0+bmV0d29ya19jb2RlID0gYXRvaShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9uYW1lX3Nob3J0LAorICAgICAgY2ZnX25ldF9uYW1lX3Nob3J0X2NtZCwKKyAgICAgICJzaG9ydCBuYW1lIE5BTUUiLAorICAgICAgIlNldCB0aGUgc2hvcnQgR1NNIG5ldHdvcmsgbmFtZSIpCit7CisJaWYgKGdzbW5ldC0+bmFtZV9zaG9ydCkKKwkJdGFsbG9jX2ZyZWUoZ3NtbmV0LT5uYW1lX3Nob3J0KTsKKworCWdzbW5ldC0+bmFtZV9zaG9ydCA9IHRhbGxvY19zdHJkdXAoZ3NtbmV0LCBhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9uYW1lX2xvbmcsCisgICAgICBjZmdfbmV0X25hbWVfbG9uZ19jbWQsCisgICAgICAibG9uZyBuYW1lIE5BTUUiLAorICAgICAgIlNldCB0aGUgbG9uZyBHU00gbmV0d29yayBuYW1lIikKK3sKKwlpZiAoZ3NtbmV0LT5uYW1lX2xvbmcpCisJCXRhbGxvY19mcmVlKGdzbW5ldC0+bmFtZV9sb25nKTsKKworCWdzbW5ldC0+bmFtZV9sb25nID0gdGFsbG9jX3N0cmR1cChnc21uZXQsIGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2F1dGhfcG9saWN5LAorICAgICAgY2ZnX25ldF9hdXRoX3BvbGljeV9jbWQsCisgICAgICAiYXV0aCBwb2xpY3kgKGNsb3NlZHxhY2NlcHQtYWxsfHRva2VuKSIsCisgICAgICAiU2V0IHRoZSBHU00gbmV0d29yayBhdXRoZW50aWNhdGlvbiBwb2xpY3lcbiIpCit7CisJZW51bSBnc21fYXV0aF9wb2xpY3kgcG9saWN5ID0gZ3NtX2F1dGhfcG9saWN5X3BhcnNlKGFyZ3ZbMF0pOworCisJZ3NtbmV0LT5hdXRoX3BvbGljeSA9IHBvbGljeTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9yZWplY3RfY2F1c2UsCisgICAgICBjZmdfbmV0X3JlamVjdF9jYXVzZV9jbWQsCisgICAgICAibG9jYXRpb24gdXBkYXRpbmcgcmVqZWN0IGNhdXNlIDwyLTExMT4iLAorICAgICAgIlNldCB0aGUgcmVqZWN0IGNhdXNlIG9mIGxvY2F0aW9uIHVwZGF0aW5nIHJlamVjdFxuIikKK3sKKwlnc21uZXQtPnJlamVjdF9jYXVzZSA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfZW5jcnlwdGlvbiwKKyAgICAgIGNmZ19uZXRfZW5jcnlwdGlvbl9jbWQsCisgICAgICAiZW5jcnlwdGlvbiBhNSAoMHwxfDIpIiwKKyAgICAgICJFbmFibGUgb3IgZGlzYWJsZSBlbmNyeXB0aW9uIChBNSkgZm9yIHRoaXMgbmV0d29ya1xuIikKK3sKKwlnc21uZXQtPmE1X2VuY3J5cHRpb249IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfbmVjaSwKKyAgICAgIGNmZ19uZXRfbmVjaV9jbWQsCisgICAgICAibmVjaSAoMHwxKSIsCisgICAgICAiU2V0IGlmIE5FQ0kgb2YgY2VsbCBzZWxlY3Rpb24gaXMgdG8gYmUgc2V0IikKK3sKKwlnc21uZXQtPm5lY2kgPSBhdG9pKGFyZ3ZbMF0pOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9ycmxwX21vZGUsIGNmZ19uZXRfcnJscF9tb2RlX2NtZCwKKyAgICAgICJycmxwIG1vZGUgKG5vbmV8bXMtYmFzZWR8bXMtcHJlZmVycmVkfGFzcy1wcmVmZXJyZWQpIiwKKwkiU2V0IHRoZSBSYWRpbyBSZXNvdXJjZSBMb2NhdGlvbiBQcm90b2NvbCBNb2RlIikKK3sKKwlnc21uZXQtPnJybHAubW9kZSA9IHJybHBfbW9kZV9wYXJzZShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX25ldF9tbV9pbmZvLCBjZmdfbmV0X21tX2luZm9fY21kLAorICAgICAgIm1tIGluZm8gKDB8MSkiLAorCSJXaGV0aGVyIHRvIHNlbmQgTU0gSU5GTyBhZnRlciBMT0MgVVBEIEFDQ0VQVCIpCit7CisJZ3NtbmV0LT5zZW5kX21tX2luZm8gPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2hhbmRvdmVyLCBjZmdfbmV0X2hhbmRvdmVyX2NtZCwKKyAgICAgICJoYW5kb3ZlciAoMHwxKSIsCisJIldoZXRoZXIgb3Igbm90IHRvIHVzZSBpbi1jYWxsIGhhbmRvdmVyIikKK3sKKwlpbnQgZW5hYmxlID0gYXRvaShhcmd2WzBdKTsKKworCWlmIChlbmFibGUgJiYgaXBhY2NfcnRwX2RpcmVjdCkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIENhbm5vdCBlbmFibGUgaGFuZG92ZXIgdW5sZXNzIFJUUCBQcm94eSBtb2RlICIKKwkJCSJpcyBlbmFibGVkIGJ5IHVzaW5nIHRoZSAtUCBjb21tYW5kIGxpbmUgb3B0aW9uJXMiLAorCQkJVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCWdzbW5ldC0+aGFuZG92ZXIuYWN0aXZlID0gZW5hYmxlOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2hvX3dpbl9yeGxldl9hdmcsIGNmZ19uZXRfaG9fd2luX3J4bGV2X2F2Z19jbWQsCisgICAgICAiaGFuZG92ZXIgd2luZG93IHJ4bGV2IGF2ZXJhZ2luZyA8MS0xMD4iLAorCSJIb3cgbWFueSBSeExldiBtZWFzdXJlbWVudHMgYXJlIHVzZWQgZm9yIGF2ZXJhZ2luZyIpCit7CisJZ3NtbmV0LT5oYW5kb3Zlci53aW5fcnhsZXZfYXZnID0gYXRvaShhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19uZXRfaG9fd2luX3J4cXVhbF9hdmcsIGNmZ19uZXRfaG9fd2luX3J4cXVhbF9hdmdfY21kLAorICAgICAgImhhbmRvdmVyIHdpbmRvdyByeHF1YWwgYXZlcmFnaW5nIDwxLTEwPiIsCisJIkhvdyBtYW55IFJ4UXVhbCBtZWFzdXJlbWVudHMgYXJlIHVzZWQgZm9yIGF2ZXJhZ2luZyIpCit7CisJZ3NtbmV0LT5oYW5kb3Zlci53aW5fcnhxdWFsX2F2ZyA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2hvX3dpbl9yeGxldl9uZWlnaF9hdmcsIGNmZ19uZXRfaG9fd2luX3J4bGV2X2F2Z19uZWlnaF9jbWQsCisgICAgICAiaGFuZG92ZXIgd2luZG93IHJ4bGV2IG5laWdoYm9yIGF2ZXJhZ2luZyA8MS0xMD4iLAorCSJIb3cgbWFueSBSeFF1YWwgbWVhc3VyZW1lbnRzIGFyZSB1c2VkIGZvciBhdmVyYWdpbmciKQoreworCWdzbW5ldC0+aGFuZG92ZXIud2luX3J4bGV2X2F2Z19uZWlnaCA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2hvX3B3cl9pbnRlcnZhbCwgY2ZnX25ldF9ob19wd3JfaW50ZXJ2YWxfY21kLAorICAgICAgImhhbmRvdmVyIHBvd2VyIGJ1ZGdldCBpbnRlcnZhbCA8MS05OT4iLAorCSJIb3cgb2Z0ZW4gdG8gY2hlY2sgaWYgd2UgaGF2ZSBhIGJldHRlciBjZWxsIChTQUNDSCBmcmFtZXMpIikKK3sKKwlnc21uZXQtPmhhbmRvdmVyLnB3cl9pbnRlcnZhbCA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2hvX3B3cl9oeXN0ZXJlc2lzLCBjZmdfbmV0X2hvX3B3cl9oeXN0ZXJlc2lzX2NtZCwKKyAgICAgICJoYW5kb3ZlciBwb3dlciBidWRnZXQgaHlzdGVyZXNpcyA8MC05OTk+IiwKKwkiSG93IG1hbnkgZEIgZG9lcyBhIG5laWdoYm9yIHRvIGJlIHN0cm9uZ2VyIHRvIGJlY29tZSBhIEhPIGNhbmRpZGF0ZSIpCit7CisJZ3NtbmV0LT5oYW5kb3Zlci5wd3JfaHlzdGVyZXNpcyA9IGF0b2koYXJndlswXSk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfbmV0X2hvX21heF9kaXN0YW5jZSwgY2ZnX25ldF9ob19tYXhfZGlzdGFuY2VfY21kLAorICAgICAgImhhbmRvdmVyIG1heGltdW0gZGlzdGFuY2UgPDAtOTk5OT4iLAorCSJIb3cgYmlnIGlzIHRoZSBtYXhpbXVtIHRpbWluZyBhZHZhbmNlIGJlZm9yZSBITyBpcyBmb3JjZWQiKQoreworCWdzbW5ldC0+aGFuZG92ZXIubWF4X2Rpc3RhbmNlID0gYXRvaShhcmd2WzBdKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKyNkZWZpbmUgREVDTEFSRV9USU1FUihudW1iZXIsIGRvYykgXAorICAgIERFRlVOKGNmZ19uZXRfVCMjbnVtYmVyLAkJCQkJXAorICAgICAgY2ZnX25ldF9UIyNudW1iZXIjI19jbWQsCQkJCQlcCisgICAgICAidGltZXIgdCIgI251bWJlciAgIiA8MC02NTUzNT4iLAkJCQlcCisgICAgICBkb2MpCQkJCQkJCVwKK3sJCQkJCQkJCVwKKwlpbnQgdmFsdWUgPSBhdG9pKGFyZ3ZbMF0pOwkJCQlcCisJCQkJCQkJCVwKKwlpZiAodmFsdWUgPCAwIHx8IHZhbHVlID4gNjU1MzUpIHsJCQlcCisJCXZ0eV9vdXQodnR5LCAiVGltZXIgdmFsdWUgJXMgb3V0IG9mIHJhbmdlLiVzIiwJXAorCQkgICAgICAgIGFyZ3ZbMF0sIFZUWV9ORVdMSU5FKTsJCQlcCisJCXJldHVybiBDTURfV0FSTklORzsJCQkJXAorCX0JCQkJCQkJXAorCQkJCQkJCQlcCisJZ3NtbmV0LT5UIyNudW1iZXIgPSB2YWx1ZTsJCQkJXAorCXJldHVybiBDTURfU1VDQ0VTUzsJCQkJCVwKK30KKworREVDTEFSRV9USU1FUigzMTAxLCAiU2V0IHRoZSB0aW1lb3V0IHZhbHVlIGZvciBJTU1FRElBVEUgQVNTSUdOTUVOVC4iKQorREVDTEFSRV9USU1FUigzMTAzLCAiU2V0IHRoZSB0aW1lb3V0IHZhbHVlIGZvciBIQU5ET1ZFUi4iKQorREVDTEFSRV9USU1FUigzMTA1LCAiQ3VycmVudGx5IG5vdCB1c2VkLiIpCitERUNMQVJFX1RJTUVSKDMxMDcsICJDdXJyZW50bHkgbm90IHVzZWQuIikKK0RFQ0xBUkVfVElNRVIoMzEwOSwgIkN1cnJlbnRseSBub3QgdXNlZC4iKQorREVDTEFSRV9USU1FUigzMTExLCAiQ3VycmVudGx5IG5vdCB1c2VkLiIpCitERUNMQVJFX1RJTUVSKDMxMTMsICJTZXQgdGhlIHRpbWUgdG8gdHJ5IHBhZ2luZyBhIHN1YnNjcmliZXIuIikKK0RFQ0xBUkVfVElNRVIoMzExNSwgIkN1cnJlbnRseSBub3QgdXNlZC4iKQorREVDTEFSRV9USU1FUigzMTE3LCAiQ3VycmVudGx5IG5vdCB1c2VkLiIpCitERUNMQVJFX1RJTUVSKDMxMTksICJDdXJyZW50bHkgbm90IHVzZWQuIikKK0RFQ0xBUkVfVElNRVIoMzE0MSwgIkN1cnJlbnRseSBub3QgdXNlZC4iKQorCisKKy8qIHBlci1CVFMgY29uZmlndXJhdGlvbiAqLworREVGVU4oY2ZnX2J0cywKKyAgICAgIGNmZ19idHNfY21kLAorICAgICAgImJ0cyBCVFNfTlIiLAorICAgICAgIlNlbGVjdCBhIEJUUyB0byBjb25maWd1cmVcbiIpCit7CisJaW50IGJ0c19uciA9IGF0b2koYXJndlswXSk7CisJc3RydWN0IGdzbV9idHMgKmJ0czsKKworCWlmIChidHNfbnIgPiBnc21uZXQtPm51bV9idHMpIHsKKwkJdnR5X291dCh2dHksICIlJSBUaGUgbmV4dCB1bnVzZWQgQlRTIG51bWJlciBpcyAldSVzIiwKKwkJCWdzbW5ldC0+bnVtX2J0cywgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfSBlbHNlIGlmIChidHNfbnIgPT0gZ3NtbmV0LT5udW1fYnRzKSB7CisJCS8qIGFsbG9jYXRlIGEgbmV3IG9uZSAqLworCQlidHMgPSBnc21fYnRzX2FsbG9jKGdzbW5ldCwgR1NNX0JUU19UWVBFX1VOS05PV04sCisJCQkJICAgIEhBUkRDT0RFRF9UU0MsIEhBUkRDT0RFRF9CU0lDKTsKKwl9IGVsc2UgCisJCWJ0cyA9IGdzbV9idHNfbnVtKGdzbW5ldCwgYnRzX25yKTsKKworCWlmICghYnRzKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgVW5hYmxlIHRvIGFsbG9jYXRlIEJUUyAldSVzIiwKKwkJCWdzbW5ldC0+bnVtX2J0cywgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJdnR5LT5pbmRleCA9IGJ0czsKKwl2dHktPm5vZGUgPSBCVFNfTk9ERTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c190eXBlLAorICAgICAgY2ZnX2J0c190eXBlX2NtZCwKKyAgICAgICJ0eXBlIFRZUEUiLAorICAgICAgIlNldCB0aGUgQlRTIHR5cGVcbiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IHJjOworCisJcmMgPSBnc21fc2V0X2J0c190eXBlKGJ0cywgcGFyc2VfYnRzdHlwZShhcmd2WzBdKSk7CisJaWYgKHJjIDwgMCkKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2JhbmQsCisgICAgICBjZmdfYnRzX2JhbmRfY21kLAorICAgICAgImJhbmQgQkFORCIsCisgICAgICAiU2V0IHRoZSBmcmVxdWVuY3kgYmFuZCBvZiB0aGlzIEJUU1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgYmFuZCA9IGdzbV9iYW5kX3BhcnNlKGFyZ3ZbMF0pOworCisJaWYgKGJhbmQgPCAwKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgQkFORCAlZCBpcyBub3QgYSB2YWxpZCBHU00gYmFuZCVzIiwKKwkJCWJhbmQsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWJ0cy0+YmFuZCA9IGJhbmQ7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfY2ksCisgICAgICBjZmdfYnRzX2NpX2NtZCwKKyAgICAgICJjZWxsX2lkZW50aXR5IDwwLTY1NTM1PiIsCisgICAgICAiU2V0IHRoZSBDZWxsIGlkZW50aXR5IG9mIHRoaXMgQlRTXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCBjaSA9IGF0b2koYXJndlswXSk7CisKKwlpZiAoY2kgPCAwIHx8IGNpID4gMHhmZmZmKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgQ0kgJWQgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSAoMC02NTUzNSklcyIsCisJCQljaSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCWJ0cy0+Y2VsbF9pZGVudGl0eSA9IGNpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2xhYywKKyAgICAgIGNmZ19idHNfbGFjX2NtZCwKKyAgICAgICJsb2NhdGlvbl9hcmVhX2NvZGUgPDAtNjU1MzU+IiwKKyAgICAgICJTZXQgdGhlIExvY2F0aW9uIEFyZWEgQ29kZSAoTEFDKSBvZiB0aGlzIEJUU1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgbGFjID0gYXRvaShhcmd2WzBdKTsKKworCWlmIChsYWMgPCAwIHx8IGxhYyA+IDB4ZmZmZikgeworCQl2dHlfb3V0KHZ0eSwgIiUlIExBQyAlZCBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlICgwLTY1NTM1KSVzIiwKKwkJCWxhYywgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJaWYgKGxhYyA9PSBHU01fTEFDX1JFU0VSVkVEX0RFVEFDSEVEIHx8IGxhYyA9PSBHU01fTEFDX1JFU0VSVkVEX0FMTF9CVFMpIHsKKwkJdnR5X291dCh2dHksICIlJSBMQUMgJWQgaXMgcmVzZXJ2ZWQgYnkgR1NNIDA0LjA4JXMiLAorCQkJbGFjLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlidHMtPmxvY2F0aW9uX2FyZWFfY29kZSA9IGxhYzsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworCitERUZVTihjZmdfYnRzX3RzYywKKyAgICAgIGNmZ19idHNfdHNjX2NtZCwKKyAgICAgICJ0cmFpbmluZ19zZXF1ZW5jZV9jb2RlIDwwLTI1NT4iLAorICAgICAgIlNldCB0aGUgVHJhaW5pbmcgU2VxdWVuY2UgQ29kZSAoVFNDKSBvZiB0aGlzIEJUU1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgdHNjID0gYXRvaShhcmd2WzBdKTsKKworCWlmICh0c2MgPCAwIHx8IHRzYyA+IDB4ZmYpIHsKKwkJdnR5X291dCh2dHksICIlJSBUU0MgJWQgaXMgbm90IGluIHRoZSB2YWxpZCByYW5nZSAoMC0yNTUpJXMiLAorCQkJdHNjLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisJYnRzLT50c2MgPSB0c2M7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfYnNpYywKKyAgICAgIGNmZ19idHNfYnNpY19jbWQsCisgICAgICAiYmFzZV9zdGF0aW9uX2lkX2NvZGUgPDAtNjM+IiwKKyAgICAgICJTZXQgdGhlIEJhc2UgU3RhdGlvbiBJZGVudGl0eSBDb2RlIChCU0lDKSBvZiB0aGlzIEJUU1xuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgYnNpYyA9IGF0b2koYXJndlswXSk7CisKKwlpZiAoYnNpYyA8IDAgfHwgYnNpYyA+IDB4M2YpIHsKKwkJdnR5X291dCh2dHksICIlJSBCU0lDICVkIGlzIG5vdCBpbiB0aGUgdmFsaWQgcmFuZ2UgKDAtMjU1KSVzIiwKKwkJCWJzaWMsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwlidHMtPmJzaWMgPSBic2ljOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisKK0RFRlVOKGNmZ19idHNfdW5pdF9pZCwKKyAgICAgIGNmZ19idHNfdW5pdF9pZF9jbWQsCisgICAgICAiaXAuYWNjZXNzIHVuaXRfaWQgPDAtNjU1MzQ+IDwwLTI1NT4iLAorICAgICAgIlNldCB0aGUgaXAuYWNjZXNzIEJUUyBVbml0IElEIG9mIHRoaXMgQlRTXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCWludCBzaXRlX2lkID0gYXRvaShhcmd2WzBdKTsKKwlpbnQgYnRzX2lkID0gYXRvaShhcmd2WzFdKTsKKworCWlmICghaXNfaXBhY2Nlc3NfYnRzKGJ0cykpIHsKKwkJdnR5X291dCh2dHksICIlJSBCVFMgaXMgbm90IG9mIGlwLmFjY2VzcyB0eXBlJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlidHMtPmlwX2FjY2Vzcy5zaXRlX2lkID0gc2l0ZV9pZDsKKwlidHMtPmlwX2FjY2Vzcy5idHNfaWQgPSBidHNfaWQ7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfc3RyZWFtX2lkLAorICAgICAgY2ZnX2J0c19zdHJlYW1faWRfY21kLAorICAgICAgIm9tbCBpcC5hY2Nlc3Mgc3RyZWFtX2lkIDwwLTI1NT4iLAorICAgICAgIlNldCB0aGUgaXAuYWNjZXNzIFN0cmVhbSBJRCBvZiB0aGUgT01MIGxpbmsgb2YgdGhpcyBCVFNcbiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IHN0cmVhbV9pZCA9IGF0b2koYXJndlswXSk7CisKKwlpZiAoIWlzX2lwYWNjZXNzX2J0cyhidHMpKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgQlRTIGlzIG5vdCBvZiBpcC5hY2Nlc3MgdHlwZSVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5vbWxfdGVpID0gc3RyZWFtX2lkOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisKK0RFRlVOKGNmZ19idHNfb21sX2UxLAorICAgICAgY2ZnX2J0c19vbWxfZTFfY21kLAorICAgICAgIm9tbCBlMSBsaW5lIEUxX0xJTkUgdGltZXNsb3QgPDEtMzE+IHN1Yi1zbG90ICgwfDF8MnwzfGZ1bGwpIiwKKyAgICAgICJFMSBpbnRlcmZhY2UgdG8gYmUgdXNlZCBmb3IgT01MXG4iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJcGFyc2VfZTFfbGluaygmYnRzLT5vbWxfZTFfbGluaywgYXJndlswXSwgYXJndlsxXSwgYXJndlsyXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKworREVGVU4oY2ZnX2J0c19vbWxfZTFfdGVpLAorICAgICAgY2ZnX2J0c19vbWxfZTFfdGVpX2NtZCwKKyAgICAgICJvbWwgZTEgdGVpIDwwLTYzPiIsCisgICAgICAiU2V0IHRoZSBURUkgdG8gYmUgdXNlZCBmb3IgT01MIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKworCWJ0cy0+b21sX3RlaSA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfY2hhbGxvYywgY2ZnX2J0c19jaGFsbG9jX2NtZCwKKyAgICAgICJjaGFubmVsIGFsbG9jYXRvciAoYXNjZW5kaW5nfGRlc2NlbmRpbmcpIiwKKyAgICAgICJTaG91bGQgdGhlIGNoYW5uZWwgYWxsb2NhdG9yIGFsbG9jYXRlIGluIHJldmVyc2UgVFJYIG9yZGVyPyIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlpZiAoIXN0cmNtcChhcmd2WzBdLCAiYXNjZW5kaW5nIikpCisJCWJ0cy0+Y2hhbl9hbGxvY19yZXZlcnNlID0gMDsKKwllbHNlCisJCWJ0cy0+Y2hhbl9hbGxvY19yZXZlcnNlID0gMTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19yYWNoX3R4X2ludGVnZXIsCisgICAgICBjZmdfYnRzX3JhY2hfdHhfaW50ZWdlcl9jbWQsCisgICAgICAicmFjaCB0eCBpbnRlZ2VyIDwwLTE1PiIsCisgICAgICAiU2V0IHRoZSByYXcgdHggaW50ZWdlciB2YWx1ZSBpbiBSQUNIIENvbnRyb2wgcGFyYW1ldGVycyBJRSIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLnR4X2ludGVnZXIgPSBhdG9pKGFyZ3ZbMF0pICYgMHhmOworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19yYWNoX21heF90cmFucywKKyAgICAgIGNmZ19idHNfcmFjaF9tYXhfdHJhbnNfY21kLAorICAgICAgInJhY2ggbWF4IHRyYW5zbWlzc2lvbiAoMXwyfDR8NykiLAorICAgICAgIlNldCB0aGUgbWF4aW11bSBudW1iZXIgb2YgUkFDSCBidXJzdCB0cmFuc21pc3Npb25zIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlidHMtPnNpX2NvbW1vbi5yYWNoX2NvbnRyb2wubWF4X3RyYW5zID0gcmFjaF9tYXhfdHJhbnNfdmFsMnJhdyhhdG9pKGFyZ3ZbMF0pKTsKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfY2VsbF9iYXJyZWQsIGNmZ19idHNfY2VsbF9iYXJyZWRfY21kLAorICAgICAgImNlbGwgYmFycmVkICgwfDEpIiwKKyAgICAgICJTaG91bGQgdGhpcyBjZWxsIGJlIGJhcnJlZCBmcm9tIGFjY2Vzcz8iKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJYnRzLT5zaV9jb21tb24ucmFjaF9jb250cm9sLmNlbGxfYmFyID0gYXRvaShhcmd2WzBdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19tc19tYXhfcG93ZXIsIGNmZ19idHNfbXNfbWF4X3Bvd2VyX2NtZCwKKyAgICAgICJtcyBtYXggcG93ZXIgPDAtNDA+IiwKKyAgICAgICJNYXhpbXVtIHRyYW5zbWl0IHBvd2VyIG9mIHRoZSBNUyIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlidHMtPm1zX21heF9wb3dlciA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfY2VsbF9yZXNlbF9oeXN0LCBjZmdfYnRzX2NlbGxfcmVzZWxfaHlzdF9jbWQsCisgICAgICAiY2VsbCByZXNlbGVjdGlvbiBoeXN0ZXJlc2lzIDwwLTE0PiIsCisgICAgICAiQ2VsbCBSZS1TZWxlY3Rpb24gSHlzdGVyZXNpcyBpbiBkQiIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlidHMtPnNpX2NvbW1vbi5jZWxsX3NlbF9wYXIuY2VsbF9yZXNlbF9oeXN0ID0gYXRvaShhcmd2WzBdKS8yOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX3J4bGV2X2FjY19taW4sIGNmZ19idHNfcnhsZXZfYWNjX21pbl9jbWQsCisgICAgICAicnhsZXYgYWNjZXNzIG1pbiA8MC02Mz4iLAorICAgICAgIk1pbmltdW0gUnhMZXYgbmVlZGVkIGZvciBjZWxsIGFjY2VzcyAoYmV0dGVyIHRoYW4gLTExMGRCbSkiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJYnRzLT5zaV9jb21tb24uY2VsbF9zZWxfcGFyLnJ4bGV2X2FjY19taW4gPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX3Blcl9sb2NfdXBkLCBjZmdfYnRzX3Blcl9sb2NfdXBkX2NtZCwKKyAgICAgICJwZXJpb2RpYyBsb2NhdGlvbiB1cGRhdGUgPDAtMTUzMD4iLAorICAgICAgIlBlcmlvZGljIExvY2F0aW9uIFVwZGF0aW5nIEludGVydmFsIGluIE1pbnV0ZXMiKQoreworCXN0cnVjdCBnc21fYnRzICpidHMgPSB2dHktPmluZGV4OworCisJYnRzLT5zaV9jb21tb24uY2hhbl9kZXNjLnQzMjEyID0gYXRvaShhcmd2WzBdKSAvIDEwOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX3Byc19idmNpLCBjZmdfYnRzX2dwcnNfYnZjaV9jbWQsCisJImdwcnMgY2VsbCBidmNpIDwwLTY1NTM1PiIsCisJIkdQUlMgQlNTR1AgVkMgSWRlbnRpZmllciIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlpZiAoIWJ0cy0+Z3Bycy5lbmFibGVkKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgR1BSUyBub3QgZW5hYmxlZCBvbiB0aGlzIEJUUyVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5ncHJzLmNlbGwuYnZjaSA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfZ3Byc19uc2VpLCBjZmdfYnRzX2dwcnNfbnNlaV9jbWQsCisJImdwcnMgbnNlaSA8MC02NTUzNT4iLAorCSJHUFJTIE5TIEVudGl0eSBJZGVudGlmaWVyIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKworCWlmICghYnRzLT5ncHJzLmVuYWJsZWQpIHsKKwkJdnR5X291dCh2dHksICIlJSBHUFJTIG5vdCBlbmFibGVkIG9uIHRoaXMgQlRTJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlidHMtPmdwcnMubnNlLm5zZWkgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisKK0RFRlVOKGNmZ19idHNfZ3Byc19uc3ZjaSwgY2ZnX2J0c19ncHJzX25zdmNpX2NtZCwKKwkiZ3BycyBuc3ZjIDwwLTE+IG5zdmNpIDwwLTY1NTM1PiIsCisJIkdQUlMgTlMgVkMgSWRlbnRpZmllciIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJaW50IGlkeCA9IGF0b2koYXJndlswXSk7CisKKwlpZiAoIWJ0cy0+Z3Bycy5lbmFibGVkKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgR1BSUyBub3QgZW5hYmxlZCBvbiB0aGlzIEJUUyVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5ncHJzLm5zdmNbaWR4XS5uc3ZjaSA9IGF0b2koYXJndlsxXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfZ3Byc19uc3ZjX2xwb3J0LCBjZmdfYnRzX2dwcnNfbnN2Y19scG9ydF9jbWQsCisJImdwcnMgbnN2YyA8MC0xPiBsb2NhbCB1ZHAgcG9ydCA8MC02NTUzNT4iLAorCSJHUFJTIE5TIExvY2FsIFVEUCBQb3J0IikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgaWR4ID0gYXRvaShhcmd2WzBdKTsKKworCWlmICghYnRzLT5ncHJzLmVuYWJsZWQpIHsKKwkJdnR5X291dCh2dHksICIlJSBHUFJTIG5vdCBlbmFibGVkIG9uIHRoaXMgQlRTJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlidHMtPmdwcnMubnN2Y1tpZHhdLmxvY2FsX3BvcnQgPSBhdG9pKGFyZ3ZbMV0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfYnRzX2dwcnNfbnN2Y19ycG9ydCwgY2ZnX2J0c19ncHJzX25zdmNfcnBvcnRfY21kLAorCSJncHJzIG5zdmMgPDAtMT4gcmVtb3RlIHVkcCBwb3J0IDwwLTY1NTM1PiIsCisJIkdQUlMgTlMgUmVtb3RlIFVEUCBQb3J0IikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgaWR4ID0gYXRvaShhcmd2WzBdKTsKKworCWlmICghYnRzLT5ncHJzLmVuYWJsZWQpIHsKKwkJdnR5X291dCh2dHksICIlJSBHUFJTIG5vdCBlbmFibGVkIG9uIHRoaXMgQlRTJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlidHMtPmdwcnMubnN2Y1tpZHhdLnJlbW90ZV9wb3J0ID0gYXRvaShhcmd2WzFdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX2J0c19ncHJzX25zdmNfcmlwLCBjZmdfYnRzX2dwcnNfbnN2Y19yaXBfY21kLAorCSJncHJzIG5zdmMgPDAtMT4gcmVtb3RlIGlwIEEuQi5DLkQiLAorCSJHUFJTIE5TIFJlbW90ZSBJUCBBZGRyZXNzIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0cyAqYnRzID0gdnR5LT5pbmRleDsKKwlpbnQgaWR4ID0gYXRvaShhcmd2WzBdKTsKKwlzdHJ1Y3QgaW5fYWRkciBpYTsKKworCWlmICghYnRzLT5ncHJzLmVuYWJsZWQpIHsKKwkJdnR5X291dCh2dHksICIlJSBHUFJTIG5vdCBlbmFibGVkIG9uIHRoaXMgQlRTJXMiLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpbmV0X2F0b24oYXJndlsxXSwgJmlhKTsKKwlidHMtPmdwcnMubnN2Y1tpZHhdLnJlbW90ZV9pcCA9IG50b2hsKGlhLnNfYWRkcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfZ3Byc19yYWMsIGNmZ19idHNfZ3Byc19yYWNfY21kLAorCSJncHJzIHJvdXRpbmcgYXJlYSA8MC0yNTU+IiwKKwkiR1BSUyBSb3V0aW5nIEFyZWEgQ29kZSIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlpZiAoIWJ0cy0+Z3Bycy5lbmFibGVkKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgR1BSUyBub3QgZW5hYmxlZCBvbiB0aGlzIEJUUyVzIiwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJYnRzLT5ncHJzLnJhYyA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19idHNfZ3Byc19lbmFibGVkLCBjZmdfYnRzX2dwcnNfZW5hYmxlZF9jbWQsCisJImdwcnMgZW5hYmxlZCA8MC0xPiIsCisJIkdQUlMgRW5hYmxlZCBvbiB0aGlzIEJUUyIpCit7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisKKwlidHMtPmdwcnMuZW5hYmxlZCA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKKworLyogcGVyIFRSWCBjb25maWd1cmF0aW9uICovCitERUZVTihjZmdfdHJ4LAorICAgICAgY2ZnX3RyeF9jbWQsCisgICAgICAidHJ4IFRSWF9OUiIsCisgICAgICAiU2VsZWN0IGEgVFJYIHRvIGNvbmZpZ3VyZSIpCit7CisJaW50IHRyeF9uciA9IGF0b2koYXJndlswXSk7CisJc3RydWN0IGdzbV9idHMgKmJ0cyA9IHZ0eS0+aW5kZXg7CisJc3RydWN0IGdzbV9idHNfdHJ4ICp0cng7CisKKwlpZiAodHJ4X25yID4gYnRzLT5udW1fdHJ4KSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgVGhlIG5leHQgdW51c2VkIFRSWCBudW1iZXIgaW4gdGhpcyBCVFMgaXMgJXUlcyIsCisJCQlidHMtPm51bV90cngsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0gZWxzZSBpZiAodHJ4X25yID09IGJ0cy0+bnVtX3RyeCkgeworCQkvKiB3ZSBuZWVkIHRvIGFsbG9jYXRlIGEgbmV3IG9uZSAqLworCQl0cnggPSBnc21fYnRzX3RyeF9hbGxvYyhidHMpOworCX0gZWxzZSAKKwkJdHJ4ID0gZ3NtX2J0c190cnhfbnVtKGJ0cywgdHJ4X25yKTsKKwkKKwlpZiAoIXRyeCkKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCisJdnR5LT5pbmRleCA9IHRyeDsKKwl2dHktPm5vZGUgPSBUUlhfTk9ERTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX3RyeF9hcmZjbiwKKyAgICAgIGNmZ190cnhfYXJmY25fY21kLAorICAgICAgImFyZmNuIDwxLTEwMjQ+IiwKKyAgICAgICJTZXQgdGhlIEFSRkNOIGZvciB0aGlzIFRSWFxuIikKK3sKKwlpbnQgYXJmY24gPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKworCS8qIEZJWE1FOiBjaGVjayBpZiB0aGlzIEFSRkNOIGlzIHN1cHBvcnRlZCBieSB0aGlzIFRSWCAqLworCisJdHJ4LT5hcmZjbiA9IGFyZmNuOworCisJLyogRklYTUU6IHBhdGNoIEFSRkNOIGludG8gU1lTVEVNIElORk9STUFUSU9OICovCisJLyogRklYTUU6IHVzZSBPTUwgbGF5ZXIgdG8gdXBkYXRlIHRoZSBBUkZDTiAqLworCS8qIEZJWE1FOiB1c2UgUlNMIGxheWVyIHRvIHVwZGF0ZSBTWVNURU0gSU5GT1JNQVRJT04gKi8KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX3RyeF9ub21pbmFsX3Bvd2VyLAorICAgICAgY2ZnX3RyeF9ub21pbmFsX3Bvd2VyX2NtZCwKKyAgICAgICJub21pbmFsIHBvd2VyIDwwLTEwMD4iLAorICAgICAgIk5vbWluYWwgVFJYIFJGIFBvd2VyIGluIGRCXG4iKQoreworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKworCXRyeC0+bm9taW5hbF9wb3dlciA9IGF0b2koYXJndlswXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ190cnhfbWF4X3Bvd2VyX3JlZCwKKyAgICAgIGNmZ190cnhfbWF4X3Bvd2VyX3JlZF9jbWQsCisgICAgICAibWF4X3Bvd2VyX3JlZCA8MC0xMDA+IiwKKyAgICAgICJSZWR1Y3Rpb24gb2YgbWF4aW11bSBCUyBSRiBQb3dlciBpbiBkQlxuIikKK3sKKwlpbnQgbWF4cHdyX3IgPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKwlpbnQgdXBwZXJfbGltaXQgPSAyNDsJLyogZGVmYXVsdCAxMi4yMSBtYXggcG93ZXIgcmVkLiAqLworCisJLyogRklYTUU6IGNoZWNrIGlmIG91ciBCVFMgdHlwZSBzdXBwb3J0cyBtb3JlIHRoYW4gMTIgKi8KKwlpZiAobWF4cHdyX3IgPCAwIHx8IG1heHB3cl9yID4gdXBwZXJfbGltaXQpIHsKKwkJdnR5X291dCh2dHksICIlJSBQb3dlciAlZCBkQiBpcyBub3QgaW4gdGhlIHZhbGlkIHJhbmdlJXMiLAorCQkJbWF4cHdyX3IsIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKwlpZiAobWF4cHdyX3IgJiAxKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgUG93ZXIgJWQgZEIgaXMgbm90IGFuIGV2ZW4gdmFsdWUlcyIsCisJCQltYXhwd3JfciwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJdHJ4LT5tYXhfcG93ZXJfcmVkID0gbWF4cHdyX3I7CisKKwkvKiBGSVhNRTogbWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGlzIHVzaW5nIE9NTCAqLworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfdHJ4X3JzbF9lMSwKKyAgICAgIGNmZ190cnhfcnNsX2UxX2NtZCwKKyAgICAgICJyc2wgZTEgbGluZSBFMV9MSU5FIHRpbWVzbG90IDwxLTMxPiBzdWItc2xvdCAoMHwxfDJ8M3xmdWxsKSIsCisgICAgICAiRTEgaW50ZXJmYWNlIHRvIGJlIHVzZWQgZm9yIFJTTFxuIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IHZ0eS0+aW5kZXg7CisKKwlwYXJzZV9lMV9saW5rKCZ0cngtPnJzbF9lMV9saW5rLCBhcmd2WzBdLCBhcmd2WzFdLCBhcmd2WzJdKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX3RyeF9yc2xfZTFfdGVpLAorICAgICAgY2ZnX3RyeF9yc2xfZTFfdGVpX2NtZCwKKyAgICAgICJyc2wgZTEgdGVpIDwwLTYzPiIsCisgICAgICAiU2V0IHRoZSBURUkgdG8gYmUgdXNlZCBmb3IgUlNMIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnggKnRyeCA9IHZ0eS0+aW5kZXg7CisKKwl0cngtPnJzbF90ZWkgPSBhdG9pKGFyZ3ZbMF0pOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitERUZVTihjZmdfdHJ4X3JmX2xvY2tlZCwKKyAgICAgIGNmZ190cnhfcmZfbG9ja2VkX2NtZCwKKyAgICAgICJyZl9sb2NrZWQgKDB8MSkiLAorICAgICAgIlR1cm4gb2ZmIFJGIG9mIHRoZSBUUlguXG4iKQoreworCWludCBsb2NrZWQgPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKworCWdzbV90cnhfbG9ja19yZih0cngsIGxvY2tlZCk7CisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisvKiBwZXIgVFMgY29uZmlndXJhdGlvbiAqLworREVGVU4oY2ZnX3RzLAorICAgICAgY2ZnX3RzX2NtZCwKKyAgICAgICJ0aW1lc2xvdCA8MC03PiIsCisgICAgICAiU2VsZWN0IGEgVGltZXNsb3QgdG8gY29uZmlndXJlIikKK3sKKwlpbnQgdHNfbnIgPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBnc21fYnRzX3RyeCAqdHJ4ID0gdnR5LT5pbmRleDsKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzOworCisJaWYgKHRzX25yID49IFRSWF9OUl9UUykgeworCQl2dHlfb3V0KHZ0eSwgIiUlIEEgR1NNIFRSWCBvbmx5IGhhcyAldSBUaW1lc2xvdHMgcGVyIFRSWCVzIiwKKwkJCVRSWF9OUl9UUywgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJdHMgPSAmdHJ4LT50c1t0c19ucl07CisKKwl2dHktPmluZGV4ID0gdHM7CisJdnR5LT5ub2RlID0gVFNfTk9ERTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX3RzX3BjaGFuLAorICAgICAgY2ZnX3RzX3BjaGFuX2NtZCwKKyAgICAgICJwaHlzX2NoYW5fY29uZmlnIFBDSEFOIiwKKyAgICAgICJQaHlzaWNhbCBDaGFubmVsIGNvbmZpZ3VyYXRpb24gKFRDSC9TRENDSC8uLi4pIikKK3sKKwlzdHJ1Y3QgZ3NtX2J0c190cnhfdHMgKnRzID0gdnR5LT5pbmRleDsKKwlpbnQgcGNoYW5jOworCisJcGNoYW5jID0gZ3NtX3BjaGFuX3BhcnNlKGFyZ3ZbMF0pOworCWlmIChwY2hhbmMgPCAwKQorCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisKKwl0cy0+cGNoYW4gPSBwY2hhbmM7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ190c19lMV9zdWJzbG90LAorICAgICAgY2ZnX3RzX2UxX3N1YnNsb3RfY21kLAorICAgICAgImUxIGxpbmUgRTFfTElORSB0aW1lc2xvdCA8MS0zMT4gc3ViLXNsb3QgKDB8MXwyfDN8ZnVsbCkiLAorICAgICAgIkUxIHN1Yi1zbG90IGNvbm5lY3RlZCB0byB0aGlzIG9uLWFpciB0aW1lc2xvdCIpCit7CisJc3RydWN0IGdzbV9idHNfdHJ4X3RzICp0cyA9IHZ0eS0+aW5kZXg7CisKKwlwYXJzZV9lMV9saW5rKCZ0cy0+ZTFfbGluaywgYXJndlswXSwgYXJndlsxXSwgYXJndlsyXSk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK2ludCBic2NfdnR5X2luaXQoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpCit7CisJZ3NtbmV0ID0gbmV0OworCisJY21kX2luaXQoMSk7CisJdnR5X2luaXQoKTsKKworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X25ldF9jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X2J0c19jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X3RyeF9jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X3RzX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfbGNoYW5fY21kKTsKKworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZzaG93X2UxZHJ2X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfZTFsaW5lX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfZTF0c19jbWQpOworCisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfcGFnaW5nX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfc3RhdHNfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZlbmFibGVfbG9nZ2luZ19jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZkaXNhYmxlX2xvZ2dpbmdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmbG9nZ2luZ19mbHRyX2ltc2lfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmbG9nZ2luZ19mbHRyX2FsbF9jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZsb2dnaW5nX3VzZV9jbHJfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmbG9nZ2luZ19wcm50X3RpbWVzdGFtcF9jbWQpOworCWluc3RhbGxfZWxlbWVudChWSUVXX05PREUsICZsb2dnaW5nX3NldF9jYXRlZ29yeV9tYXNrX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJmxvZ2dpbmdfbGV2ZWxfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmbG9nZ2luZ19zZXRfbG9nX2xldmVsX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZjZmdfbmV0X2NtZCk7CisJaW5zdGFsbF9ub2RlKCZuZXRfbm9kZSwgY29uZmlnX3dyaXRlX25ldCk7CisJaW5zdGFsbF9kZWZhdWx0KEdTTU5FVF9OT0RFKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X25jY19jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfbW5jX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9uYW1lX3Nob3J0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9uYW1lX2xvbmdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2F1dGhfcG9saWN5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9yZWplY3RfY2F1c2VfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2VuY3J5cHRpb25fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X25lY2lfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X3JybHBfbW9kZV9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfbW1faW5mb19jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfaGFuZG92ZXJfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2hvX3dpbl9yeGxldl9hdmdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2hvX3dpbl9yeHF1YWxfYXZnX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9ob193aW5fcnhsZXZfYXZnX25laWdoX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9ob19wd3JfaW50ZXJ2YWxfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X2hvX3B3cl9oeXN0ZXJlc2lzX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9ob19tYXhfZGlzdGFuY2VfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTAxX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzEwM19jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfVDMxMDVfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTA3X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzEwOV9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfVDMxMTFfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTEzX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzExNV9jbWQpOworCWluc3RhbGxfZWxlbWVudChHU01ORVRfTk9ERSwgJmNmZ19uZXRfVDMxMTdfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoR1NNTkVUX05PREUsICZjZmdfbmV0X1QzMTE5X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX25ldF9UMzE0MV9jbWQpOworCisJaW5zdGFsbF9lbGVtZW50KEdTTU5FVF9OT0RFLCAmY2ZnX2J0c19jbWQpOworCWluc3RhbGxfbm9kZSgmYnRzX25vZGUsIGNvbmZpZ193cml0ZV9idHMpOworCWluc3RhbGxfZGVmYXVsdChCVFNfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c190eXBlX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19iYW5kX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19jaV9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfbGFjX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c190c2NfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2JzaWNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3VuaXRfaWRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3N0cmVhbV9pZF9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfb21sX2UxX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19vbWxfZTFfdGVpX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19jaGFsbG9jX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19yYWNoX3R4X2ludGVnZXJfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX3JhY2hfbWF4X3RyYW5zX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19jZWxsX2JhcnJlZF9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfbXNfbWF4X3Bvd2VyX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19wZXJfbG9jX3VwZF9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfY2VsbF9yZXNlbF9oeXN0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19yeGxldl9hY2NfbWluX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19ncHJzX2VuYWJsZWRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2dwcnNfcmFjX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19ncHJzX2J2Y2lfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2dwcnNfbnNlaV9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfZ3Byc19uc3ZjaV9jbWQpOworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ19idHNfZ3Byc19uc3ZjX2xwb3J0X2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KEJUU19OT0RFLCAmY2ZnX2J0c19ncHJzX25zdmNfcnBvcnRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoQlRTX05PREUsICZjZmdfYnRzX2dwcnNfbnN2Y19yaXBfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChCVFNfTk9ERSwgJmNmZ190cnhfY21kKTsKKwlpbnN0YWxsX25vZGUoJnRyeF9ub2RlLCBkdW1teV9jb25maWdfd3JpdGUpOworCWluc3RhbGxfZGVmYXVsdChUUlhfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KFRSWF9OT0RFLCAmY2ZnX3RyeF9hcmZjbl9jbWQpOworCWluc3RhbGxfZWxlbWVudChUUlhfTk9ERSwgJmNmZ190cnhfbm9taW5hbF9wb3dlcl9jbWQpOworCWluc3RhbGxfZWxlbWVudChUUlhfTk9ERSwgJmNmZ190cnhfbWF4X3Bvd2VyX3JlZF9jbWQpOworCWluc3RhbGxfZWxlbWVudChUUlhfTk9ERSwgJmNmZ190cnhfcnNsX2UxX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFRSWF9OT0RFLCAmY2ZnX3RyeF9yc2xfZTFfdGVpX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFRSWF9OT0RFLCAmY2ZnX3RyeF9yZl9sb2NrZWRfY21kKTsKKworCWluc3RhbGxfZWxlbWVudChUUlhfTk9ERSwgJmNmZ190c19jbWQpOworCWluc3RhbGxfbm9kZSgmdHNfbm9kZSwgZHVtbXlfY29uZmlnX3dyaXRlKTsKKwlpbnN0YWxsX2RlZmF1bHQoVFNfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KFRTX05PREUsICZjZmdfdHNfcGNoYW5fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVFNfTk9ERSwgJmNmZ190c19lMV9zdWJzbG90X2NtZCk7CisKKwlic2NfdnR5X2luaXRfZXh0cmEobmV0KTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy9zcmMvdnR5X2ludGVyZmFjZV9sYXllcjMuYyBiL29wZW5ic2Mvc3JjL3Z0eV9pbnRlcmZhY2VfbGF5ZXIzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjgyNGMzZAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2Mvc3JjL3Z0eV9pbnRlcmZhY2VfbGF5ZXIzLmMKQEAgLTAsMCArMSw1MzEgQEAKKy8qIE9wZW5CU0MgaW50ZXJmYWNlIHRvIHF1YWdnYSBWVFkgKi8KKy8qIChDKSAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlcgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKworI2luY2x1ZGUgPHZ0eS9jb21tYW5kLmg+CisjaW5jbHVkZSA8dnR5L2J1ZmZlci5oPgorI2luY2x1ZGUgPHZ0eS92dHkuaD4KKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvbGludXhsaXN0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZ3NtX3N1YnNjcmliZXIuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL3NpbGVudF9jYWxsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fMDRfMTEuaD4KKyNpbmNsdWRlIDxvcGVuYnNjL2UxX2lucHV0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9hYmlzX25tLmg+CisjaW5jbHVkZSA8b3Ntb2NvcmUvZ3NtX3V0aWxzLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kYi5oPgorI2luY2x1ZGUgPG9zbW9jb3JlL3RhbGxvYy5oPgorI2luY2x1ZGUgPG9wZW5ic2Mvc2lnbmFsLmg+CisjaW5jbHVkZSA8b3BlbmJzYy9kZWJ1Zy5oPgorCitzdGF0aWMgc3RydWN0IGdzbV9uZXR3b3JrICpnc21uZXQ7CisKK3N0cnVjdCBjbWRfbm9kZSBzdWJzY3Jfbm9kZSA9IHsKKwlTVUJTQ1JfTk9ERSwKKwkiJXMoc3Vic2NyaWJlcikjIiwKKwkxLAorfTsKKworc3RhdGljIGludCBkdW1teV9jb25maWdfd3JpdGUoc3RydWN0IHZ0eSAqdikKK3sKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgYnVmZmVyICphcmd2X3RvX2J1ZmZlcihpbnQgYXJnYywgY29uc3QgY2hhciAqYXJndltdLCBpbnQgYmFzZSkKK3sKKwlzdHJ1Y3QgYnVmZmVyICpiID0gYnVmZmVyX25ldygxMDI0KTsKKwlpbnQgaTsKKworCWlmICghYikKKwkJcmV0dXJuIE5VTEw7CisKKwlmb3IgKGkgPSBiYXNlOyBpIDwgYXJnYzsgaSsrKSB7CisJCWJ1ZmZlcl9wdXRzdHIoYiwgYXJndltpXSk7CisJCWJ1ZmZlcl9wdXRjKGIsICcgJyk7CisJfQorCWJ1ZmZlcl9wdXRjKGIsICdcMCcpOworCisJcmV0dXJuIGI7Cit9CisKK3N0YXRpYyBpbnQgaGV4cGFyc2UoY29uc3QgY2hhciAqc3RyLCB1X2ludDhfdCAqYiwgaW50IG1heF9sZW4pCisKK3sKKwlpbnQgaSwgbCwgdjsKKworCWwgPSBzdHJsZW4oc3RyKTsKKwlpZiAoKGwmMSkgfHwgKChsPj4xKSA+IG1heF9sZW4pKQorCQlyZXR1cm4gLTE7CisKKwltZW1zZXQoYiwgMHgwMCwgbWF4X2xlbik7CisKKwlmb3IgKGk9MDsgaTxsOyBpKyspIHsKKwkJY2hhciBjID0gc3RyW2ldOworCQlpZiAoYyA+PSAnMCcgJiYgYyA8PSAnOScpCisJCQl2ID0gYyAtICcwJzsKKwkJZWxzZSBpZiAoYyA+PSAnYScgJiYgYyA8PSAnZicpCisJCQl2ID0gMTAgKyAoYyAtICdhJyk7CisJCWVsc2UgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKQorCQkJdiA9IDEwICsgKGMgLSAnYScpOworCQllbHNlCisJCQlyZXR1cm4gLTE7CisJCWJbaT4+MV0gfD0gdiA8PCAoaSYxID8gMCA6IDQpOworCX0KKworCXJldHVybiBpPj4xOworfQorCisvKiBwZXItc3Vic2NyaWJlciBjb25maWd1cmF0aW9uICovCitERUZVTihjZmdfc3Vic2NyLAorICAgICAgY2ZnX3N1YnNjcl9jbWQsCisgICAgICAic3Vic2NyaWJlciBJTVNJIiwKKyAgICAgICJTZWxlY3QgYSBTdWJzY3JpYmVyIHRvIGNvbmZpZ3VyZVxuIikKK3sKKwljb25zdCBjaGFyICppbXNpID0gYXJndlswXTsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjcjsKKworCXN1YnNjciA9IHN1YnNjcl9nZXRfYnlfaW1zaShnc21uZXQsIGltc2kpOworCWlmICghc3Vic2NyKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgTm8gc3Vic2NyaWJlciBmb3IgSU1TSSAlcyVzIiwKKwkJCWltc2ksIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCS8qIHZ0eV9nb19wYXJlbnQgc2hvdWxkIHB1dCB0aGlzIHN1YnNjcmliZXIgKi8KKwl2dHktPmluZGV4ID0gc3Vic2NyOworCXZ0eS0+bm9kZSA9IFNVQlNDUl9OT0RFOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCitzdGF0aWMgdm9pZCBzdWJzY3JfZHVtcF9mdWxsX3Z0eShzdHJ1Y3QgdnR5ICp2dHksIHN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyKQoreworCWludCByYzsKKwlzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyBhaW5mbzsKKwlzdHJ1Y3QgZ3NtX2F1dGhfdHVwbGUgYXR1cGxlOworCisJdnR5X291dCh2dHksICIgICAgSUQ6ICVsbHUsIEF1dGhvcml6ZWQ6ICVkJXMiLCBzdWJzY3ItPmlkLAorCQlzdWJzY3ItPmF1dGhvcml6ZWQsIFZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT5uYW1lKQorCQl2dHlfb3V0KHZ0eSwgIiAgICBOYW1lOiAnJXMnJXMiLCBzdWJzY3ItPm5hbWUsIFZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT5leHRlbnNpb24pCisJCXZ0eV9vdXQodnR5LCAiICAgIEV4dGVuc2lvbjogJXMlcyIsIHN1YnNjci0+ZXh0ZW5zaW9uLAorCQkJVlRZX05FV0xJTkUpOworCWlmIChzdWJzY3ItPmltc2kpCisJCXZ0eV9vdXQodnR5LCAiICAgIElNU0k6ICVzJXMiLCBzdWJzY3ItPmltc2ksIFZUWV9ORVdMSU5FKTsKKwlpZiAoc3Vic2NyLT50bXNpICE9IEdTTV9SRVNFUlZFRF9UTVNJKQorCQl2dHlfb3V0KHZ0eSwgIiAgICBUTVNJOiAlMDhYJXMiLCBzdWJzY3ItPnRtc2ksCisJCQlWVFlfTkVXTElORSk7CisKKwlyYyA9IGdldF9hdXRoaW5mb19ieV9zdWJzY3IoJmFpbmZvLCBzdWJzY3IpOworCWlmICghcmMpIHsKKwkJdnR5X291dCh2dHksICIgICAgQTNBOCBhbGdvcml0aG0gaWQ6ICVkJXMiLAorCQkJYWluZm8uYXV0aF9hbGdvLCBWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiICAgIEEzQTggS2k6ICVzJXMiLAorCQkJaGV4ZHVtcChhaW5mby5hM2E4X2tpLCBhaW5mby5hM2E4X2tpX2xlbiksCisJCQlWVFlfTkVXTElORSk7CisJfQorCisJcmMgPSBnZXRfYXV0aHR1cGxlX2J5X3N1YnNjcigmYXR1cGxlLCBzdWJzY3IpOworCWlmICghcmMpIHsKKwkJdnR5X291dCh2dHksICIgICAgQTNBOCBsYXN0IHR1cGxlICh1c2VkICVkIHRpbWVzKTolcyIsCisJCQlhdHVwbGUudXNlX2NvdW50LCBWVFlfTkVXTElORSk7CisJCXZ0eV9vdXQodnR5LCAiICAgICBzZXEgIyA6ICVkJXMiLAorCQkJYXR1cGxlLmtleV9zZXEsIFZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICIgICAgIFJBTkQgIDogJXMlcyIsCisJCQloZXhkdW1wKGF0dXBsZS5yYW5kLCBzaXplb2YoYXR1cGxlLnJhbmQpKSwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICIgICAgIFNSRVMgIDogJXMlcyIsCisJCQloZXhkdW1wKGF0dXBsZS5zcmVzLCBzaXplb2YoYXR1cGxlLnNyZXMpKSwKKwkJCVZUWV9ORVdMSU5FKTsKKwkJdnR5X291dCh2dHksICIgICAgIEtjICAgIDogJXMlcyIsCisJCQloZXhkdW1wKGF0dXBsZS5rYywgc2l6ZW9mKGF0dXBsZS5rYykpLAorCQkJVlRZX05FV0xJTkUpOworCX0KKworCXZ0eV9vdXQodnR5LCAiICAgIFVzZSBjb3VudDogJXUlcyIsIHN1YnNjci0+dXNlX2NvdW50LCBWVFlfTkVXTElORSk7Cit9CisKKworLyogU3Vic2NyaWJlciAqLworREVGVU4oc2hvd19zdWJzY3IsCisgICAgICBzaG93X3N1YnNjcl9jbWQsCisgICAgICAic2hvdyBzdWJzY3JpYmVyIFtJTVNJXSIsCisJU0hPV19TVFIgIkRpc3BsYXkgaW5mb3JtYXRpb24gYWJvdXQgYSBzdWJzY3JpYmVyXG4iKQoreworCWNvbnN0IGNoYXIgKmltc2k7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3I7CisKKwlpZiAoYXJnYyA+PSAxKSB7CisJCWltc2kgPSBhcmd2WzBdOworCQlzdWJzY3IgPSBzdWJzY3JfZ2V0X2J5X2ltc2koZ3NtbmV0LCBpbXNpKTsKKwkJaWYgKCFzdWJzY3IpIHsKKwkJCXZ0eV9vdXQodnR5LCAiJSUgdW5rbm93biBzdWJzY3JpYmVyJXMiLAorCQkJCVZUWV9ORVdMSU5FKTsKKwkJCXJldHVybiBDTURfV0FSTklORzsKKwkJfQorCQlzdWJzY3JfZHVtcF9mdWxsX3Z0eSh2dHksIHN1YnNjcik7CisJCXN1YnNjcl9wdXQoc3Vic2NyKTsKKworCQlyZXR1cm4gQ01EX1NVQ0NFU1M7CisJfQorCisJLyogRklYTUU6IGl0ZXJhdGUgb3ZlciBhbGwgc3Vic2NyaWJlcnMgPyAqLworCXJldHVybiBDTURfV0FSTklORzsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oc2hvd19zdWJzY3JfY2FjaGUsCisgICAgICBzaG93X3N1YnNjcl9jYWNoZV9jbWQsCisgICAgICAic2hvdyBzdWJzY3JpYmVyIGNhY2hlIiwKKwlTSE9XX1NUUiAiRGlzcGxheSBjb250ZW50cyBvZiBzdWJzY3JpYmVyIGNhY2hlXG4iKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyOworCisJbGxpc3RfZm9yX2VhY2hfZW50cnkoc3Vic2NyLCAmYWN0aXZlX3N1YnNjcmliZXJzLCBlbnRyeSkgeworCQl2dHlfb3V0KHZ0eSwgIiAgU3Vic2NyaWJlcjolcyIsIFZUWV9ORVdMSU5FKTsKKwkJc3Vic2NyX2R1bXBfZnVsbF92dHkodnR5LCBzdWJzY3IpOworCX0KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oc21zX3NlbmRfcGVuZCwKKyAgICAgIHNtc19zZW5kX3BlbmRfY21kLAorICAgICAgInNtcyBzZW5kIHBlbmRpbmciLAorICAgICAgIlNlbmQgYWxsIHBlbmRpbmcgU01TIikKK3sKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zOworCWludCBpZCA9IDA7CisKKwl3aGlsZSAoMSkgeworCQlzbXMgPSBkYl9zbXNfZ2V0X3Vuc2VudF9ieV9zdWJzY3IoZ3NtbmV0LCBpZCk7CisJCWlmICghc21zKQorCQkJYnJlYWs7CisKKwkJZ3NtNDExX3NlbmRfc21zX3N1YnNjcihzbXMtPnJlY2VpdmVyLCBzbXMpOworCisJCWlkID0gc21zLT5yZWNlaXZlci0+aWQgKyAxOworCX0KKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworc3RydWN0IGdzbV9zbXMgKnNtc19mcm9tX3RleHQoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpyZWNlaXZlciwgY29uc3QgY2hhciAqdGV4dCkKK3sKKwlzdHJ1Y3QgZ3NtX3NtcyAqc21zID0gc21zX2FsbG9jKCk7CisKKwlpZiAoIXNtcykKKwkJcmV0dXJuIE5VTEw7CisKKwlpZiAoIXJlY2VpdmVyLT5sYWMpIHsKKwkJLyogc3Vic2NyaWJlciBjdXJyZW50bHkgbm90IGF0dGFjaGVkLCBzdG9yZSBpbiBkYXRhYmFzZT8gKi8KKwkJcmV0dXJuIE5VTEw7CisJfQorCisJc21zLT5yZWNlaXZlciA9IHN1YnNjcl9nZXQocmVjZWl2ZXIpOworCXN0cm5jcHkoc21zLT50ZXh0LCB0ZXh0LCBzaXplb2Yoc21zLT50ZXh0KS0xKTsKKworCS8qIEZJWE1FOiBkb24ndCB1c2UgSUQgMSBzdGF0aWMgKi8KKwlzbXMtPnNlbmRlciA9IHN1YnNjcl9nZXRfYnlfaWQoZ3NtbmV0LCAxKTsKKwlzbXMtPnJlcGx5X3BhdGhfcmVxID0gMDsKKwlzbXMtPnN0YXR1c19yZXBfcmVxID0gMDsKKwlzbXMtPnVkX2hkcl9pbmQgPSAwOworCXNtcy0+cHJvdG9jb2xfaWQgPSAwOyAvKiBpbXBsaWNpdCAqLworCXNtcy0+ZGF0YV9jb2Rpbmdfc2NoZW1lID0gMDsgLyogZGVmYXVsdCA3Yml0ICovCisJc3RybmNweShzbXMtPmRlc3RfYWRkciwgcmVjZWl2ZXItPmV4dGVuc2lvbiwgc2l6ZW9mKHNtcy0+ZGVzdF9hZGRyKS0xKTsKKwkvKiBHZW5lcmF0ZSB1c2VyX2RhdGEgKi8KKwlzbXMtPnVzZXJfZGF0YV9sZW4gPSBnc21fN2JpdF9lbmNvZGUoc21zLT51c2VyX2RhdGEsIHNtcy0+dGV4dCk7CisKKwlyZXR1cm4gc21zOworfQorCitzdGF0aWMgaW50IF9zZW5kX3Ntc19idWZmZXIoc3RydWN0IGdzbV9zdWJzY3JpYmVyICpyZWNlaXZlciwKKwkJCSAgICAgc3RydWN0IGJ1ZmZlciAqYiwgdV9pbnQ4X3QgdHBfcGlkKQoreworCXN0cnVjdCBnc21fc21zICpzbXM7CisKKwlzbXMgPSBzbXNfZnJvbV90ZXh0KHJlY2VpdmVyLCBidWZmZXJfZ2V0c3RyKGIpKTsKKwlzbXMtPnByb3RvY29sX2lkID0gdHBfcGlkOworCWdzbTQxMV9zZW5kX3Ntc19zdWJzY3IocmVjZWl2ZXIsIHNtcyk7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK3N0YXRpYyBzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKmdldF9zdWJzY3JfYnlfYXJndihjb25zdCBjaGFyICp0eXBlLAorCQkJCQkJIGNvbnN0IGNoYXIgKmlkKQoreworCWlmICghc3RyY21wKHR5cGUsICJleHRlbnNpb24iKSkKKwkJcmV0dXJuIHN1YnNjcl9nZXRfYnlfZXh0ZW5zaW9uKGdzbW5ldCwgaWQpOworCWVsc2UgaWYgKCFzdHJjbXAodHlwZSwgImltc2kiKSkKKwkJcmV0dXJuIHN1YnNjcl9nZXRfYnlfaW1zaShnc21uZXQsIGlkKTsKKwllbHNlIGlmICghc3RyY21wKHR5cGUsICJ0bXNpIikpCisJCXJldHVybiBzdWJzY3JfZ2V0X2J5X3Rtc2koZ3NtbmV0LCBhdG9pKGlkKSk7CisJZWxzZSBpZiAoIXN0cmNtcCh0eXBlLCAiaWQiKSkKKwkJcmV0dXJuIHN1YnNjcl9nZXRfYnlfaWQoZ3NtbmV0LCBhdG9pKGlkKSk7CisKKwlyZXR1cm4gTlVMTDsKK30KKyNkZWZpbmUgU1VCU0NSX1RZUEVTICIoZXh0ZW5zaW9ufGltc2l8dG1zaXxpZCkiCisKK0RFRlVOKHN1YnNjcmliZXJfc2VuZF9zbXMsCisgICAgICBzdWJzY3JpYmVyX3NlbmRfc21zX2NtZCwKKyAgICAgICJzdWJzY3JpYmVyICIgU1VCU0NSX1RZUEVTICIgRVhURU4gc21zIHNlbmQgLkxJTkUiLAorICAgICAgIlNlbGVjdCBzdWJzY3JpYmVyIGJhc2VkIG9uIGV4dGVuc2lvbiIpCit7CisJc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3IgPSBnZXRfc3Vic2NyX2J5X2FyZ3YoYXJndlswXSwgYXJndlsxXSk7CisJc3RydWN0IGJ1ZmZlciAqYjsKKwlpbnQgcmM7CisKKwlpZiAoIXN1YnNjcikgeworCQl2dHlfb3V0KHZ0eSwgIiUlIE5vIHN1YnNjcmliZXIgZm91bmQgZm9yICVzICVzJXMiLAorCQkJYXJndlswXSwgYXJndlsxXSwgVlRZX05FV0xJTkUpOworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCWIgPSBhcmd2X3RvX2J1ZmZlcihhcmdjLCBhcmd2LCAyKTsKKwlyYyA9IF9zZW5kX3Ntc19idWZmZXIoc3Vic2NyLCBiLCAwKTsKKwlidWZmZXJfZnJlZShiKTsKKworCXN1YnNjcl9wdXQoc3Vic2NyKTsKKworCXJldHVybiByYzsKK30KKworREVGVU4oc3Vic2NyaWJlcl9zaWxlbnRfc21zLAorICAgICAgc3Vic2NyaWJlcl9zaWxlbnRfc21zX2NtZCwKKyAgICAgICJzdWJzY3JpYmVyICIgU1VCU0NSX1RZUEVTICIgRVhURU4gc2lsZW50IHNtcyBzZW5kIC5MSU5FIiwKKyAgICAgICJTZWxlY3Qgc3Vic2NyaWJlciBiYXNlZCBvbiBleHRlbnNpb24iKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gZ2V0X3N1YnNjcl9ieV9hcmd2KGFyZ3ZbMF0sIGFyZ3ZbMV0pOworCXN0cnVjdCBidWZmZXIgKmI7CisJaW50IHJjOworCisJaWYgKCFzdWJzY3IpIHsKKwkJdnR5X291dCh2dHksICIlJSBObyBzdWJzY3JpYmVyIGZvdW5kIGZvciAlcyAlcyVzIiwKKwkJCWFyZ3ZbMF0sIGFyZ3ZbMV0sIFZUWV9ORVdMSU5FKTsKKwkJcmV0dXJuIENNRF9XQVJOSU5HOworCX0KKworCWIgPSBhcmd2X3RvX2J1ZmZlcihhcmdjLCBhcmd2LCAyKTsKKwlyYyA9IF9zZW5kX3Ntc19idWZmZXIoc3Vic2NyLCBiLCA2NCk7CisJYnVmZmVyX2ZyZWUoYik7CisKKwlzdWJzY3JfcHV0KHN1YnNjcik7CisKKwlyZXR1cm4gcmM7Cit9CisKK0RFRlVOKHN1YnNjcmliZXJfc2lsZW50X2NhbGxfc3RhcnQsCisgICAgICBzdWJzY3JpYmVyX3NpbGVudF9jYWxsX3N0YXJ0X2NtZCwKKyAgICAgICJzdWJzY3JpYmVyICIgU1VCU0NSX1RZUEVTICIgRVhURU4gc2lsZW50IGNhbGwgc3RhcnQgKGFueXx0Y2gvZnx0Y2gvYW55fHNkY2NoKSIsCisgICAgICAiU3RhcnQgYSBzaWxlbnQgY2FsbCB0byBhIHN1YnNjcmliZXIiKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gZ2V0X3N1YnNjcl9ieV9hcmd2KGFyZ3ZbMF0sIGFyZ3ZbMV0pOworCWludCByYywgdHlwZTsKKworCWlmICghc3Vic2NyKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgTm8gc3Vic2NyaWJlciBmb3VuZCBmb3IgJXMgJXMlcyIsCisJCQlhcmd2WzBdLCBhcmd2WzFdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlpZiAoIXN0cmNtcChhcmd2WzJdLCAidGNoL2YiKSkKKwkJdHlwZSA9IFJTTF9DSEFOTkVFRF9UQ0hfRjsKKwllbHNlIGlmICghc3RyY21wKGFyZ3ZbMl0sICJ0Y2gvYW55IikpCisJCXR5cGUgPSBSU0xfQ0hBTk5FRURfVENIX0Zvckg7CisJZWxzZSBpZiAoIXN0cmNtcChhcmd2WzJdLCAic2RjY2giKSkKKwkJdHlwZSA9IFJTTF9DSEFOTkVFRF9TRENDSDsKKwllbHNlCisJCXR5cGUgPSBSU0xfQ0hBTk5FRURfQU5ZOwkvKiBEZWZhdWx0cyB0byBBTlkgKi8KKworCXJjID0gZ3NtX3NpbGVudF9jYWxsX3N0YXJ0KHN1YnNjciwgdnR5LCB0eXBlKTsKKwlpZiAocmMgPD0gMCkgeworCQl2dHlfb3V0KHZ0eSwgIiUlIFN1YnNjcmliZXIgbm90IGF0dGFjaGVkJXMiLAorCQkJVlRZX05FV0xJTkUpOworCQlzdWJzY3JfcHV0KHN1YnNjcik7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlzdWJzY3JfcHV0KHN1YnNjcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKHN1YnNjcmliZXJfc2lsZW50X2NhbGxfc3RvcCwKKyAgICAgIHN1YnNjcmliZXJfc2lsZW50X2NhbGxfc3RvcF9jbWQsCisgICAgICAic3Vic2NyaWJlciAiIFNVQlNDUl9UWVBFUyAiIEVYVEVOIHNpbGVudCBjYWxsIHN0b3AiLAorICAgICAgIlN0b3AgYSBzaWxlbnQgY2FsbCB0byBhIHN1YnNjcmliZXIiKQoreworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gZ2V0X3N1YnNjcl9ieV9hcmd2KGFyZ3ZbMF0sIGFyZ3ZbMV0pOworCWludCByYzsKKworCWlmICghc3Vic2NyKSB7CisJCXZ0eV9vdXQodnR5LCAiJSUgTm8gc3Vic2NyaWJlciBmb3VuZCBmb3IgJXMgJXMlcyIsCisJCQlhcmd2WzBdLCBhcmd2WzFdLCBWVFlfTkVXTElORSk7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlyYyA9IGdzbV9zaWxlbnRfY2FsbF9zdG9wKHN1YnNjcik7CisJaWYgKHJjIDwgMCkgeworCQlzdWJzY3JfcHV0KHN1YnNjcik7CisJCXJldHVybiBDTURfV0FSTklORzsKKwl9CisKKwlzdWJzY3JfcHV0KHN1YnNjcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19zdWJzY3JfbmFtZSwKKyAgICAgIGNmZ19zdWJzY3JfbmFtZV9jbWQsCisgICAgICAibmFtZSBOQU1FIiwKKyAgICAgICJTZXQgdGhlIG5hbWUgb2YgdGhlIHN1YnNjcmliZXIiKQoreworCWNvbnN0IGNoYXIgKm5hbWUgPSBhcmd2WzBdOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gdnR5LT5pbmRleDsKKworCXN0cm5jcHkoc3Vic2NyLT5uYW1lLCBuYW1lLCBzaXplb2Yoc3Vic2NyLT5uYW1lKSk7CisKKwlkYl9zeW5jX3N1YnNjcmliZXIoc3Vic2NyKTsKKworCXJldHVybiBDTURfU1VDQ0VTUzsKK30KKworREVGVU4oY2ZnX3N1YnNjcl9leHRlbnNpb24sCisgICAgICBjZmdfc3Vic2NyX2V4dGVuc2lvbl9jbWQsCisgICAgICAiZXh0ZW5zaW9uIEVYVEVOU0lPTiIsCisgICAgICAiU2V0IHRoZSBleHRlbnNpb24gb2YgdGhlIHN1YnNjcmliZXIiKQoreworCWNvbnN0IGNoYXIgKm5hbWUgPSBhcmd2WzBdOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gdnR5LT5pbmRleDsKKworCXN0cm5jcHkoc3Vic2NyLT5leHRlbnNpb24sIG5hbWUsIHNpemVvZihzdWJzY3ItPmV4dGVuc2lvbikpOworCisJZGJfc3luY19zdWJzY3JpYmVyKHN1YnNjcik7CisKKwlyZXR1cm4gQ01EX1NVQ0NFU1M7Cit9CisKK0RFRlVOKGNmZ19zdWJzY3JfYXV0aG9yaXplZCwKKyAgICAgIGNmZ19zdWJzY3JfYXV0aG9yaXplZF9jbWQsCisgICAgICAiYXV0aCA8MC0xPiIsCisgICAgICAiU2V0IHRoZSBhdXRob3JpemF0aW9uIHN0YXR1cyBvZiB0aGUgc3Vic2NyaWJlciIpCit7CisJaW50IGF1dGggPSBhdG9pKGFyZ3ZbMF0pOworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gdnR5LT5pbmRleDsKKworCWlmIChhdXRoKQorCQlzdWJzY3ItPmF1dGhvcml6ZWQgPSAxOworCWVsc2UKKwkJc3Vic2NyLT5hdXRob3JpemVkID0gMDsKKworCWRiX3N5bmNfc3Vic2NyaWJlcihzdWJzY3IpOworCisJcmV0dXJuIENNRF9TVUNDRVNTOworfQorCisjZGVmaW5lIEEzQThfQUxHX1RZUEVTICIobm9uZXxjb21wMTI4djEpIgorCitERUZVTihjZmdfc3Vic2NyX2EzYTgsCisgICAgICBjZmdfc3Vic2NyX2EzYThfY21kLAorICAgICAgImEzYTggIiBBM0E4X0FMR19UWVBFUyAiIFtLSV0iLAorICAgICAgIlNldCBhM2E4IHBhcmFtZXRlcnMgZm9yIHRoZSBzdWJzY3JpYmVyIikKK3sKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKnN1YnNjciA9IHZ0eS0+aW5kZXg7CisJY29uc3QgY2hhciAqYWxnX3N0ciA9IGFyZ3ZbMF07CisJY29uc3QgY2hhciAqa2lfc3RyID0gYXJndlsxXTsKKwlzdHJ1Y3QgZ3NtX2F1dGhfaW5mbyBhaW5mbzsKKwlpbnQgcmM7CisKKwlpZiAoIXN0cmNhc2VjbXAoYWxnX3N0ciwgIm5vbmUiKSkgeworCQkvKiBKdXN0IGVyYXNlICovCisJCXJjID0gc2V0X2F1dGhpbmZvX2Zvcl9zdWJzY3IoTlVMTCwgc3Vic2NyKTsKKwl9IGVsc2UgaWYgKCFzdHJjYXNlY21wKGFsZ19zdHIsICJjb21wMTI4djEiKSkgeworCQkvKiBQYXJzZSBoZXggc3RyaW5nIEtpICovCisJCXJjID0gaGV4cGFyc2Uoa2lfc3RyLCBhaW5mby5hM2E4X2tpLCBzaXplb2YoYWluZm8uYTNhOF9raSkpOworCQlpZiAocmMgIT0gMTYpCisJCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisKKwkJLyogU2V0IHRoZSBpbmZvcyAqLworCQlhaW5mby5hdXRoX2FsZ28gPSBBVVRIX0FMR09fQ09NUDEyOHYxOworCQlhaW5mby5hM2E4X2tpX2xlbiA9IHJjOworCQlyYyA9IHNldF9hdXRoaW5mb19mb3Jfc3Vic2NyKCZhaW5mbywgc3Vic2NyKTsKKwl9IGVsc2UgeworCQkvKiBVbmtub3duIG1ldGhvZCAqLworCQlyZXR1cm4gQ01EX1dBUk5JTkc7CisJfQorCisJcmV0dXJuIHJjID8gQ01EX1dBUk5JTkcgOiBDTURfU1VDQ0VTUzsKK30KKworc3RhdGljIGludCBzY2FsbF9jYmZuKHVuc2lnbmVkIGludCBzdWJzeXMsIHVuc2lnbmVkIGludCBzaWduYWwsCisJCQl2b2lkICpoYW5kbGVyX2RhdGEsIHZvaWQgKnNpZ25hbF9kYXRhKQoreworCXN0cnVjdCBzY2FsbF9zaWduYWxfZGF0YSAqc2lnZGF0YSA9IHNpZ25hbF9kYXRhOworCXN0cnVjdCB2dHkgKnZ0eSA9IHNpZ2RhdGEtPmRhdGE7CisKKwlzd2l0Y2ggKHNpZ25hbCkgeworCWNhc2UgU19TQ0FMTF9TVUNDRVNTOgorCQl2dHlfb3V0KHZ0eSwgIiUlIHNpbGVudCBjYWxsIG9uIEFSRkNOICV1IHRpbWVzbG90ICV1JXMiLAorCQkJc2lnZGF0YS0+bGNoYW4tPnRzLT50cngtPmFyZmNuLCBzaWdkYXRhLT5sY2hhbi0+dHMtPm5yLAorCQkJVlRZX05FV0xJTkUpOworCQlicmVhazsKKwljYXNlIFNfU0NBTExfRVhQSVJFRDoKKwkJdnR5X291dCh2dHksICIlJSBzaWxlbnQgY2FsbCBleHBpcmVkIHBhZ2luZyVzIiwgVlRZX05FV0xJTkUpOworCQlicmVhazsKKwl9CisJcmV0dXJuIDA7Cit9CisKK2ludCBic2NfdnR5X2luaXRfZXh0cmEoc3RydWN0IGdzbV9uZXR3b3JrICpuZXQpCit7CisJZ3NtbmV0ID0gbmV0OworCisJcmVnaXN0ZXJfc2lnbmFsX2hhbmRsZXIoU1NfU0NBTEwsIHNjYWxsX2NiZm4sIE5VTEwpOworCisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfc3Vic2NyX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnNob3dfc3Vic2NyX2NhY2hlX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc21zX3NlbmRfcGVuZF9jbWQpOworCisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnN1YnNjcmliZXJfc2VuZF9zbXNfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc3Vic2NyaWJlcl9zaWxlbnRfc21zX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFZJRVdfTk9ERSwgJnN1YnNjcmliZXJfc2lsZW50X2NhbGxfc3RhcnRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoVklFV19OT0RFLCAmc3Vic2NyaWJlcl9zaWxlbnRfY2FsbF9zdG9wX2NtZCk7CisKKwlpbnN0YWxsX2VsZW1lbnQoQ09ORklHX05PREUsICZjZmdfc3Vic2NyX2NtZCk7CisJaW5zdGFsbF9ub2RlKCZzdWJzY3Jfbm9kZSwgZHVtbXlfY29uZmlnX3dyaXRlKTsKKworCWluc3RhbGxfZGVmYXVsdChTVUJTQ1JfTk9ERSk7CisJaW5zdGFsbF9lbGVtZW50KFNVQlNDUl9OT0RFLCAmY2ZnX3N1YnNjcl9uYW1lX2NtZCk7CisJaW5zdGFsbF9lbGVtZW50KFNVQlNDUl9OT0RFLCAmY2ZnX3N1YnNjcl9leHRlbnNpb25fY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoU1VCU0NSX05PREUsICZjZmdfc3Vic2NyX2F1dGhvcml6ZWRfY21kKTsKKwlpbnN0YWxsX2VsZW1lbnQoU1VCU0NSX05PREUsICZjZmdfc3Vic2NyX2EzYThfY21kKTsKKworCXJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9NYWtlZmlsZS5hbSBiL29wZW5ic2MvdGVzdHMvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IxYjkzMQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSBAQAorU1VCRElSUyA9IGRlYnVnIGdzbTA0MDggZGIgY2hhbm5lbCBzY2NwCmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL2NoYW5uZWwvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL3Rlc3RzL2NoYW5uZWwvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzcyOTY1OQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvY2hhbm5lbC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDE1IEBACitJTkNMVURFUyA9ICQoYWxsX2luY2x1ZGVzKSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQorQU1fQ0ZMQUdTPS1XYWxsIC1nZ2RiMyAkKExJQk9TTU9DT1JFX0NGTEFHUykKKworbm9pbnN0X1BST0dSQU1TID0gY2hhbm5lbF90ZXN0CisKK2NoYW5uZWxfdGVzdF9TT1VSQ0VTID0gY2hhbm5lbF90ZXN0LmMgXAorCSQodG9wX3NyY2Rpcikvc3JjL2RiLmMgXAorCSQodG9wX3NyY2Rpcikvc3JjL2dzbV9zdWJzY3JpYmVyX2Jhc2UuYyBcCisJJCh0b3Bfc3JjZGlyKS9zcmMvZ3NtX3N1YnNjcmliZXIuYyBcCisJJCh0b3Bfc3JjZGlyKS9zcmMvZGVidWcuYyBcCisJJCh0b3Bfc3JjZGlyKS9zcmMvZ3NtX2RhdGEuYyBcCisJJCh0b3Bfc3JjZGlyKS9zcmMvYnRzX2lwYWNjZXNzX25hbm9idHMuYyBcCisJJCh0b3Bfc3JjZGlyKS9zcmMvYnRzX3NpZW1lbnNfYnMxMS5jCitjaGFubmVsX3Rlc3RfTERBREQgPSAtbGRsIC1sZGJpICQoTElCT1NNT0NPUkVfTElCUykKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9jaGFubmVsL2NoYW5uZWxfdGVzdC5jIGIvb3BlbmJzYy90ZXN0cy9jaGFubmVsL2NoYW5uZWxfdGVzdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1OTAwMWMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rlc3RzL2NoYW5uZWwvY2hhbm5lbF90ZXN0LmMKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2luY2x1ZGUgPGFzc2VydC5oPgorCisjaW5jbHVkZSA8b3Ntb2NvcmUvc2VsZWN0Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvYWJpc19yc2wuaD4KKworLyogb3VyIGhhbmRsZXIgKi8KK3N0YXRpYyBpbnQgc3Vic2NyX2NiKHVuc2lnbmVkIGludCBob29rLCB1bnNpZ25lZCBpbnQgZXZlbnQsIHN0cnVjdCBtc2diICptc2csIHZvaWQgKmRhdGEsIHZvaWQgKnBhcmFtKQoreworCWFzc2VydChob29rID09IDEwMSk7CisJYXNzZXJ0KGV2ZW50ID09IDIwMCk7CisJYXNzZXJ0KG1zZyA9PSAodm9pZCopMHgxMzIzTCk7CisJYXNzZXJ0KGRhdGEgPT0gKHZvaWQqKTB4NDI0MkwpOworCWFzc2VydChwYXJhbSA9PSAodm9pZCopMHgyMzQyTCk7CisJcHJpbnRmKCJSZWFjaGVkLCBkaWRuJ3QgY3Jhc2gsIHRlc3QgcGFzc2VkXG4iKTsKKwlyZXR1cm4gMDsKK30KKworLyogbW9jayBvYmplY3QgZm9yIHRlc3RpbmcsIGRpcmVjdGx5IGludm9rZSB0aGUgY2IuLi4gbWF5YmUgbGF0ZXIgdGhyb3VnaCB0aGUgdGltZXIgKi8KK3ZvaWQgcGFnaW5nX3JlcXVlc3Qoc3RydWN0IGdzbV9idHMgKmJ0cywgc3RydWN0IGdzbV9zdWJzY3JpYmVyICpzdWJzY3JpYmVyLCBpbnQgdHlwZSwgZ3NtX2NiZm4gKmNiZm4sIHZvaWQgKmRhdGEpCit7CisJY2JmbigxMDEsIDIwMCwgKHZvaWQqKTB4MTMyM0wsICh2b2lkKikweDQyNDJMLCBkYXRhKTsKK30KKworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisJc3RydWN0IGdzbV9uZXR3b3JrICpuZXR3b3JrOworCXN0cnVjdCBnc21fYnRzICpidHM7CisKKwlwcmludGYoIlRlc3RpbmcgdGhlIGdzbV9zdWJzY3JpYmVyIGNoYW4gbG9naWNcbiIpOworCisJLyogQ3JlYXRlIGEgZHVtbXkgbmV0d29yayAqLworCW5ldHdvcmsgPSBnc21fbmV0d29ya19pbml0KDEsIDEsIE5VTEwpOworCWlmICghbmV0d29yaykKKwkJZXhpdCgxKTsKKwlidHMgPSBnc21fYnRzX2FsbG9jKG5ldHdvcmssIEdTTV9CVFNfVFlQRV9CUzExLCAwLCAwKTsKKwlidHMtPmxvY2F0aW9uX2FyZWFfY29kZSA9IDIzOworCisJLyogQ3JlYXRlIGEgZHVtbXkgc3Vic2NyaWJlciAqLworCXN0cnVjdCBnc21fc3Vic2NyaWJlciAqc3Vic2NyID0gc3Vic2NyX2FsbG9jKCk7CisJc3Vic2NyLT5sYWMgPSAyMzsKKwlzdWJzY3ItPm5ldCA9IG5ldHdvcms7CisKKwkvKiBBc2sgZm9yIGEgY2hhbm5lbC4uLiAqLworCXN1YnNjcl9nZXRfY2hhbm5lbChzdWJzY3IsIFJTTF9DSEFOTkVFRF9UQ0hfRiwgc3Vic2NyX2NiLCAodm9pZCopMHgyMzQyTCk7CisKKwl3aGlsZSAoMSkgeworCQlic2Nfc2VsZWN0X21haW4oMCk7CisJfQorfQorCit2b2lkIG5tX3N0YXRlX2V2ZW50KCkge30KK3ZvaWQgaW5wdXRfZXZlbnQoKSB7fQordm9pZCBzbXNfYWxsb2MoKSB7fQorCitzdHJ1Y3QgdGx2X2RlZmluaXRpb24gbm1fYXR0X3RsdmRlZjsKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9kYi9NYWtlZmlsZS5hbSBiL29wZW5ic2MvdGVzdHMvZGIvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmViOTE4MAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvZGIvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw4IEBACitJTkNMVURFUyA9ICQoYWxsX2luY2x1ZGVzKSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQorQU1fQ0ZMQUdTPS1XYWxsIC1nZ2RiMyAkKExJQk9TTU9DT1JFX0NGTEFHUykKKworbm9pbnN0X1BST0dSQU1TID0gZGJfdGVzdAorCitkYl90ZXN0X1NPVVJDRVMgPSBkYl90ZXN0LmMKK2RiX3Rlc3RfTERBREQgPSAkKHRvcF9idWlsZGRpcikvc3JjL2xpYmJzYy5hICQodG9wX2J1aWxkZGlyKS9zcmMvbGlibXNjLmEgJCh0b3BfYnVpbGRkaXIpL3NyYy9saWJic2MuYSAkKExJQk9TTU9DT1JFX0xJQlMpIC1sZGwgLWxkYmkKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9kYi9kYl90ZXN0LmMgYi9vcGVuYnNjL3Rlc3RzL2RiL2RiX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMTY4YWNiCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90ZXN0cy9kYi9kYl90ZXN0LmMKQEAgLTAsMCArMSwxMDYgQEAKKy8qIChDKSAyMDA4IGJ5IEphbiBMdWViYmUgPGpsdWViYmVAZGViaWFuLm9yZz4KKyAqIChDKSAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8b3BlbmJzYy9kYi5oPgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2RlZmluZSBDT01QQVJFKG9yaWdpbmFsLCBjb3B5KSBcCisJaWYgKG9yaWdpbmFsLT5pZCAhPSBjb3B5LT5pZCkgXAorCQlmcHJpbnRmKHN0ZGVyciwgIklkcyBkbyBub3QgbWF0Y2ggaW4gJXM6JWQgJWxsdSAlbGx1XG4iLCBcCisJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBvcmlnaW5hbC0+aWQsIGNvcHktPmlkKTsgXAorCWlmIChvcmlnaW5hbC0+bGFjICE9IGNvcHktPmxhYykgXAorCQlmcHJpbnRmKHN0ZGVyciwgIkxBQyBkbyBub3QgbWF0Y2ggaW4gJXM6JWQgJWQgJWRcbiIsIFwKKwkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18sIG9yaWdpbmFsLT5sYWMsIGNvcHktPmxhYyk7IFwKKwlpZiAob3JpZ2luYWwtPmF1dGhvcml6ZWQgIT0gY29weS0+YXV0aG9yaXplZCkgXAorCQlmcHJpbnRmKHN0ZGVyciwgIkF1dGhvcml6ZSBkbyBub3QgbWF0Y2ggaW4gJXM6JWQgJWQgJWRcbiIsIFwKKwkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18sIG9yaWdpbmFsLT5hdXRob3JpemVkLCBcCisJCQljb3B5LT5hdXRob3JpemVkKTsgXAorCWlmIChzdHJjbXAob3JpZ2luYWwtPmltc2ksIGNvcHktPmltc2kpICE9IDApIFwKKwkJZnByaW50ZihzdGRlcnIsICJJTVNJcyBkbyBub3QgbWF0Y2ggaW4gJXM6JWQgJyVzJyAnJXMnXG4iLCBcCisJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBvcmlnaW5hbC0+aW1zaSwgY29weS0+aW1zaSk7IFwKKwlpZiAob3JpZ2luYWwtPnRtc2kgIT0gY29weS0+dG1zaSkgXAorCQlmcHJpbnRmKHN0ZGVyciwgIlRNU0lzIGRvIG5vdCBtYXRjaCBpbiAlczolZCAnJXUnICcldSdcbiIsIFwKKwkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18sIG9yaWdpbmFsLT50bXNpLCBjb3B5LT50bXNpKTsgXAorCWlmIChzdHJjbXAob3JpZ2luYWwtPm5hbWUsIGNvcHktPm5hbWUpICE9IDApIFwKKwkJZnByaW50ZihzdGRlcnIsICJuYW1lcyBkbyBub3QgbWF0Y2ggaW4gJXM6JWQgJyVzJyAnJXMnXG4iLCBcCisJCQlfX0ZVTkNUSU9OX18sIF9fTElORV9fLCBvcmlnaW5hbC0+bmFtZSwgY29weS0+bmFtZSk7IFwKKwlpZiAoc3RyY21wKG9yaWdpbmFsLT5leHRlbnNpb24sIGNvcHktPmV4dGVuc2lvbikgIT0gMCkgXAorCQlmcHJpbnRmKHN0ZGVyciwgIm5hbWVzIGRvIG5vdCBtYXRjaCBpbiAlczolZCAnJXMnICclcydcbiIsIFwKKwkJCV9fRlVOQ1RJT05fXywgX19MSU5FX18sIG9yaWdpbmFsLT5leHRlbnNpb24sIGNvcHktPmV4dGVuc2lvbik7IFwKKworaW50IG1haW4oKSB7CisKKwlpZiAoZGJfaW5pdCgiaGxyLnNxbGl0ZTMiKSkgeworCQlwcmludGYoIkRCOiBGYWlsZWQgdG8gaW5pdCBkYXRhYmFzZS4gUGxlYXNlIGNoZWNrIHRoZSBvcHRpb24gc2V0dGluZ3MuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQkgCisJcHJpbnRmKCJEQjogRGF0YWJhc2UgaW5pdGlhbGl6ZWQuXG4iKTsKKworCWlmIChkYl9wcmVwYXJlKCkpIHsKKwkJcHJpbnRmKCJEQjogRmFpbGVkIHRvIHByZXBhcmUgZGF0YWJhc2UuXG4iKTsKKwkJcmV0dXJuIDE7CisJfQorCXByaW50ZigiREI6IERhdGFiYXNlIHByZXBhcmVkLlxuIik7CisKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKmFsaWNlID0gTlVMTDsKKwlzdHJ1Y3QgZ3NtX3N1YnNjcmliZXIgKmFsaWNlX2RiOworCisJY2hhciAqYWxpY2VfaW1zaSA9ICIzMjQzMjQ1NDMyMzQ1IjsKKwlhbGljZSA9IGRiX2NyZWF0ZV9zdWJzY3JpYmVyKE5VTEwsIGFsaWNlX2ltc2kpOworCWRiX3N5bmNfc3Vic2NyaWJlcihhbGljZSk7CisJYWxpY2VfZGIgPSBkYl9nZXRfc3Vic2NyaWJlcihOVUxMLCBHU01fU1VCU0NSSUJFUl9JTVNJLCBhbGljZS0+aW1zaSk7CisJQ09NUEFSRShhbGljZSwgYWxpY2VfZGIpOworCXN1YnNjcl9wdXQoYWxpY2VfZGIpOworCXN1YnNjcl9wdXQoYWxpY2UpOworCisJYWxpY2VfaW1zaSA9ICIzNjkzMjQ1NDIzNDQ1IjsKKwlhbGljZSA9IGRiX2NyZWF0ZV9zdWJzY3JpYmVyKE5VTEwsIGFsaWNlX2ltc2kpOworCWRiX3N1YnNjcmliZXJfYXNzb2NfaW1laShhbGljZSwgIjEyMzQ1Njc4OTAiKTsKKwlkYl9zdWJzY3JpYmVyX2FsbG9jX3Rtc2koYWxpY2UpOworCWFsaWNlLT5sYWM9NDI7CisJZGJfc3luY19zdWJzY3JpYmVyKGFsaWNlKTsKKwlhbGljZV9kYiA9IGRiX2dldF9zdWJzY3JpYmVyKE5VTEwsIEdTTV9TVUJTQ1JJQkVSX0lNU0ksIGFsaWNlX2ltc2kpOworCUNPTVBBUkUoYWxpY2UsIGFsaWNlX2RiKTsKKwlzdWJzY3JfcHV0KGFsaWNlKTsKKwlzdWJzY3JfcHV0KGFsaWNlX2RiKTsKKworCWFsaWNlX2ltc2kgPSAiOTk5MzI0NTQyMzQ0NSI7CisJYWxpY2UgPSBkYl9jcmVhdGVfc3Vic2NyaWJlcihOVUxMLCBhbGljZV9pbXNpKTsKKwlkYl9zdWJzY3JpYmVyX2FsbG9jX3Rtc2koYWxpY2UpOworCWFsaWNlLT5sYWM9NDI7CisJZGJfc3luY19zdWJzY3JpYmVyKGFsaWNlKTsKKwlkYl9zdWJzY3JpYmVyX2Fzc29jX2ltZWkoYWxpY2UsICIxMjM0NTY3ODkwIik7CisJZGJfc3Vic2NyaWJlcl9hc3NvY19pbWVpKGFsaWNlLCAiNjU0MzU2MDkyMCIpOworCWFsaWNlX2RiID0gZGJfZ2V0X3N1YnNjcmliZXIoTlVMTCwgR1NNX1NVQlNDUklCRVJfSU1TSSwgYWxpY2VfaW1zaSk7CisJQ09NUEFSRShhbGljZSwgYWxpY2VfZGIpOworCXN1YnNjcl9wdXQoYWxpY2UpOworCXN1YnNjcl9wdXQoYWxpY2VfZGIpOworCisJZGJfZmluaSgpOworCisJcmV0dXJuIDA7Cit9CisKKy8qIHN0dWJzICovCit2b2lkIGlucHV0X2V2ZW50KHZvaWQpIHt9Cit2b2lkIG5tX3N0YXRlX2V2ZW50KHZvaWQpIHt9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL2RlYnVnL01ha2VmaWxlLmFtIGIvb3BlbmJzYy90ZXN0cy9kZWJ1Zy9NYWtlZmlsZS5hbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NDIzZmQxCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90ZXN0cy9kZWJ1Zy9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDYgQEAKK0lOQ0xVREVTID0gJChhbGxfaW5jbHVkZXMpIC1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlCitBTV9DRkxBR1M9LVdhbGwgJChMSUJPU01PQ09SRV9DRkxBR1MpCitub2luc3RfUFJPR1JBTVMgPSBkZWJ1Z190ZXN0CisKK2RlYnVnX3Rlc3RfU09VUkNFUyA9IGRlYnVnX3Rlc3QuYyAkKHRvcF9zcmNkaXIpL3NyYy9kZWJ1Zy5jIAorZGVidWdfdGVzdF9MREFERCA9ICQoTElCT1NNT0NPUkVfTElCUykKZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvZGVidWcvZGVidWdfdGVzdC5jIGIvb3BlbmJzYy90ZXN0cy9kZWJ1Zy9kZWJ1Z190ZXN0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGYwYzI4NAotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvZGVidWcvZGVidWdfdGVzdC5jCkBAIC0wLDAgKzEsNDEgQEAKKy8qIHNpbXBsZSB0ZXN0IGZvciB0aGUgZGVidWcgaW50ZXJmYWNlICovCisvKgorICogKEMpIDIwMDgsIDIwMDkgYnkgSG9sZ2VyIEhhbnMgUGV0ZXIgRnJleXRoZXIgPHplY2tlQHNlbGZpc2gub3JnPgorICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwKKyAqIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEgMDIxMTAtMTMwMSBVU0EuCisgKgorICovCisKKyNpbmNsdWRlIDxvcGVuYnNjL2RlYnVnLmg+CisKKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworCXN0cnVjdCBkZWJ1Z190YXJnZXQgKnN0ZGVycl90YXJnZXQ7CisKKwlkZWJ1Z19pbml0KCk7CisJc3RkZXJyX3RhcmdldCA9IGRlYnVnX3RhcmdldF9jcmVhdGVfc3RkZXJyKCk7CisJZGVidWdfYWRkX3RhcmdldChzdGRlcnJfdGFyZ2V0KTsKKwlkZWJ1Z19zZXRfYWxsX2ZpbHRlcihzdGRlcnJfdGFyZ2V0LCAxKTsKKworCWRlYnVnX3BhcnNlX2NhdGVnb3J5X21hc2soc3RkZXJyX3RhcmdldCwgIkRSTEwiKTsKKwlERUJVR1AoRENDLCAiWW91IHNob3VsZCBub3Qgc2VlIHRoaXNcbiIpOworCisJZGVidWdfcGFyc2VfY2F0ZWdvcnlfbWFzayhzdGRlcnJfdGFyZ2V0LCAiRFJMTDpEQ0MiKTsKKwlERUJVR1AoRFJMTCwgIllvdSBzaG91bGQgc2VlIHRoaXNcbiIpOworCURFQlVHUChEQ0MsICJZb3Ugc2hvdWxkIHNlZSB0aGlzXG4iKTsKKwlERUJVR1AoRE1NLCAiWW91IHNob3VsZCBub3Qgc2VlIHRoaXNcbiIpOworfQpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90ZXN0cy9nc20wNDA4L01ha2VmaWxlLmFtIGIvb3BlbmJzYy90ZXN0cy9nc20wNDA4L01ha2VmaWxlLmFtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY5OGM2NzMKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rlc3RzL2dzbTA0MDgvTWFrZWZpbGUuYW0KQEAgLTAsMCArMSw2IEBACitJTkNMVURFUyA9ICQoYWxsX2luY2x1ZGVzKSAtSSQodG9wX3NyY2RpcikvaW5jbHVkZQorQU1fQ0ZMQUdTPS1XYWxsICQoTElCT1NNT0NPUkVfQ0ZMQUdTKQorbm9pbnN0X1BST0dSQU1TID0gZ3NtMDQwOF90ZXN0CisKK2dzbTA0MDhfdGVzdF9TT1VSQ0VTID0gZ3NtMDQwOF90ZXN0LmMKK2dzbTA0MDhfdGVzdF9MREFERCA9ICQodG9wX2J1aWxkZGlyKS9zcmMvbGliYnNjLmEgJCh0b3BfYnVpbGRkaXIpL3NyYy9saWJtc2MuYSAkKHRvcF9idWlsZGRpcikvc3JjL2xpYmJzYy5hICQoTElCT1NNT0NPUkVfTElCUykgLWxkYmkKZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvZ3NtMDQwOC9nc20wNDA4X3Rlc3QuYyBiL29wZW5ic2MvdGVzdHMvZ3NtMDQwOC9nc20wNDA4X3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODdkNGVlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90ZXN0cy9nc20wNDA4L2dzbTA0MDhfdGVzdC5jCkBAIC0wLDAgKzEsMTEyIEBACisvKiBzaW1wbGUgdGVzdCBmb3IgdGhlIGdzbTA0MDggZm9ybWF0dGluZyBmdW5jdGlvbnMgKi8KKy8qCisgKiAoQykgMjAwOCBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiBBbGwgUmlnaHRzIFJlc2VydmVkCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nCisgKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLAorICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKyAqCisgKi8KKworI2luY2x1ZGUgPGFzc2VydC5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlIDxhcnBhL2luZXQuaD4KKworI2luY2x1ZGUgPG9wZW5ic2MvZ3NtXzA0XzA4Lmg+CisjaW5jbHVkZSA8b3BlbmJzYy9nc21fc3Vic2NyaWJlci5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKworI2RlZmluZSBDT01QQVJFKHJlc3VsdCwgb3AsIHZhbHVlKSBcCisgICAgaWYgKCEoKHJlc3VsdCkgb3AgKHZhbHVlKSkpIHtcCisJZnByaW50ZihzdGRlcnIsICJDb21wYXJlIGZhaWxlZC4gV2FzICV4IHNob3VsZCBiZSAleCBpbiAlczolZFxuIixyZXN1bHQsIHZhbHVlLCBfX0ZJTEVfXywgX19MSU5FX18pOyBcCisJZXhpdCgtMSk7IFwKKyAgICB9CisKKyNkZWZpbmUgQ09NUEFSRV9TVFIocmVzdWx0LCB2YWx1ZSkgXAorCWlmIChzdHJjbXAocmVzdWx0LCB2YWx1ZSkgIT0gMCkgeyBcCisJCWZwcmludGYoc3RkZXJyLCAiQ29tcGFyZSBmYWlsZWQuIFdhcyAlcyBzaG91bGQgYmUgJXMgaW4gJXM6JWRcbiIscmVzdWx0LCB2YWx1ZSwgX19GSUxFX18sIF9fTElORV9fKTsgXAorCQlleGl0KC0xKTsgXAorCX0KKworLyoKKyAqIFRlc3QgTG9jYXRpb24gQXJlYSBJZGVudGlmaWVyIGZvcm1hdHRpbmcuIFRhYmxlIDEwLjUuMyBvZiAwNC4wOAorICovCitzdGF0aWMgdm9pZCB0ZXN0X2xvY2F0aW9uX2FyZWFfaWRlbnRpZmllcih2b2lkKQoreworICAgIHN0cnVjdCBnc200OF9sb2NfYXJlYV9pZCBsYWk0ODsKKworICAgIHByaW50ZigiVGVzdGluZyB0ZXN0IGxvY2F0aW9uIGFyZWEgaWRlbnRpZmllclxuIik7CisKKyAgICAvKgorICAgICAqIFRlc3QgdGhlIGRlZmF1bHQvdGVzdCBzZXR1cC4gQ29taW5nIGZyb20KKyAgICAgKiBic2NfaGFjay5jIGR1bXBzCisgICAgICovCisgICAgZ3NtNDhfZ2VuZXJhdGVfbGFpKCZsYWk0OCwgMSwgMSwgMSk7CisgICAgQ09NUEFSRShsYWk0OC5kaWdpdHNbMF0sID09LCAweDAwKTsKKyAgICBDT01QQVJFKGxhaTQ4LmRpZ2l0c1sxXSwgPT0sIDB4RjEpOworICAgIENPTVBBUkUobGFpNDguZGlnaXRzWzJdLCA9PSwgMHgxMCk7CisgICAgQ09NUEFSRShsYWk0OC5sYWMsID09LCBodG9ucygweDAwMDEpKTsKKworICAgIGdzbTQ4X2dlbmVyYXRlX2xhaSgmbGFpNDgsIDYwMiwgMSwgMTUpOworICAgIENPTVBBUkUobGFpNDguZGlnaXRzWzBdLCA9PSwgMHgwNik7CisgICAgQ09NUEFSRShsYWk0OC5kaWdpdHNbMV0sID09LCAweEYyKTsKKyAgICBDT01QQVJFKGxhaTQ4LmRpZ2l0c1syXSwgPT0sIDB4MTApOworICAgIENPTVBBUkUobGFpNDgubGFjLCA9PSwgaHRvbnMoMHgwMDBmKSk7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3RfbWlfZnVuY3Rpb25hbGl0eSh2b2lkKQoreworCWNvbnN0IGNoYXIgKmltc2lfb2RkICA9ICI5ODc2NTQzMjEwOTg3NjMiOworCWNvbnN0IGNoYXIgKmltc2lfZXZlbiA9ICI5ODc2NTQzMjEwOTg3NjU0IjsKKwljb25zdCB1X2ludDMyX3QgdG1zaSA9IDB4ZmFiZWFjZDA7CisJdV9pbnQ4X3QgbWlbMTI4XTsKKwl1bnNpZ25lZCBpbnQgbWlfbGVuOworCWNoYXIgbWlfcGFyc2VkW0dTTTQ4X01JX1NJWkVdOworCisJcHJpbnRmKCJUZXN0aW5nIHBhcnNpbmcgYW5kIGdlbmVyYXRpbmcgVE1TSS9JTVNJXG4iKTsKKworCS8qIHRtc2kgY29kZSAqLworCW1pX2xlbiA9IGdzbTQ4X2dlbmVyYXRlX21pZF9mcm9tX3Rtc2kobWksIHRtc2kpOworCWdzbTQ4X21pX3RvX3N0cmluZyhtaV9wYXJzZWQsIHNpemVvZihtaV9wYXJzZWQpLCBtaSArIDIsIG1pX2xlbiAtIDIpOworCUNPTVBBUkUoKHVfaW50MzJfdClzdHJ0b3VsKG1pX3BhcnNlZCwgTlVMTCwgMTApLCA9PSwgdG1zaSk7CisKKwkvKiBpbXNpIGNvZGUgKi8KKwltaV9sZW4gPSBnc200OF9nZW5lcmF0ZV9taWRfZnJvbV9pbXNpKG1pLCBpbXNpX29kZCk7CisJZ3NtNDhfbWlfdG9fc3RyaW5nKG1pX3BhcnNlZCwgc2l6ZW9mKG1pX3BhcnNlZCksIG1pICsgMiwgbWlfbGVuIC0yKTsKKwlwcmludGYoImhleDogJXNcbiIsIGhleGR1bXAobWksIG1pX2xlbikpOworCUNPTVBBUkVfU1RSKG1pX3BhcnNlZCwgaW1zaV9vZGQpOworCisJbWlfbGVuID0gZ3NtNDhfZ2VuZXJhdGVfbWlkX2Zyb21faW1zaShtaSwgaW1zaV9ldmVuKTsKKwlnc200OF9taV90b19zdHJpbmcobWlfcGFyc2VkLCBzaXplb2YobWlfcGFyc2VkKSwgbWkgKyAyLCBtaV9sZW4gLTIpOworCXByaW50ZigiaGV4OiAlc1xuIiwgaGV4ZHVtcChtaSwgbWlfbGVuKSk7CisJQ09NUEFSRV9TVFIobWlfcGFyc2VkLCBpbXNpX2V2ZW4pOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisJdGVzdF9sb2NhdGlvbl9hcmVhX2lkZW50aWZpZXIoKTsKKwl0ZXN0X21pX2Z1bmN0aW9uYWxpdHkoKTsKKworCWV4aXQoMCk7Cit9CisKKworCisvKgorICogU3R1YnMgdG8gY29tcGlsZSBhbmQgbGluaworICovCit2b2lkIGlucHV0X2V2ZW50KHZvaWQpIHt9Cit2b2lkIG5tX3N0YXRlX2V2ZW50KHZvaWQpIHt9CmRpZmYgLS1naXQgYS9vcGVuYnNjL3Rlc3RzL3NjY3AvTWFrZWZpbGUuYW0gYi9vcGVuYnNjL3Rlc3RzL3NjY3AvTWFrZWZpbGUuYW0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM1NjkzZQotLS0gL2Rldi9udWxsCisrKyBiL29wZW5ic2MvdGVzdHMvc2NjcC9NYWtlZmlsZS5hbQpAQCAtMCwwICsxLDggQEAKK0lOQ0xVREVTID0gJChhbGxfaW5jbHVkZXMpIC1JJCh0b3Bfc3JjZGlyKS9pbmNsdWRlCitBTV9DRkxBR1M9LVdhbGwgLWdnZGIzICQoTElCT1NNT0NPUkVfQ0ZMQUdTKQorCitub2luc3RfUFJPR1JBTVMgPSBzY2NwX3Rlc3QKKworc2NjcF90ZXN0X1NPVVJDRVMgPSBzY2NwX3Rlc3QuYworc2NjcF90ZXN0X0xEQUREID0gJCh0b3BfYnVpbGRkaXIpL3NyYy9saWJzY2NwLmEgJCh0b3BfYnVpbGRkaXIpL3NyYy9saWJic2MuYSAkKExJQk9TTU9DT1JFX0xJQlMpCisKZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvc2NjcC9zY2NwX3Rlc3QuYyBiL29wZW5ic2MvdGVzdHMvc2NjcC9zY2NwX3Rlc3QuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lYjQxZDNlCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90ZXN0cy9zY2NwL3NjY3BfdGVzdC5jCkBAIC0wLDAgKzEsODI4IEBACisvKgorICogU0NDUCB0ZXN0aW5nIGNvZGUKKyAqCisgKiAoQykgMjAwOSBieSBIb2xnZXIgSGFucyBQZXRlciBGcmV5dGhlciA8emVja2VAc2VsZmlzaC5vcmc+CisgKiAoQykgMjAwOSBieSBPbi1XYXZlcworICoKKyAqIEFsbCBSaWdodHMgUmVzZXJ2ZWQKKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcKKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisgKiA1MSBGcmFua2xpbiBTdHJlZXQsIEZpZnRoIEZsb29yLCBCb3N0b24sIE1BIDAyMTEwLTEzMDEgVVNBLgorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgPGFycGEvaW5ldC5oPgorCisjaW5jbHVkZSA8b3BlbmJzYy9nc21fZGF0YS5oPgorI2luY2x1ZGUgPG9wZW5ic2MvZGVidWcuaD4KKyNpbmNsdWRlIDxvc21vY29yZS9tc2diLmg+CisKKyNpbmNsdWRlIDxzY2NwL3NjY3AuaD4KKworI2RlZmluZSBNSU4oeCwgeSkgKCh4KSA8ICh5KSA/ICh4KSA6ICh5KSkKKworLyogQlNDIC0+IE1TQyAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGJzc21hcF9yZXNldFtdID0geworCTB4MDksIDB4MDAsIDB4MDMsIDB4MDUsIDB4MDcsIDB4MDIsIDB4NDIsIDB4ZmUsCisJMHgwMiwgMHg0MiwgMHhmZSwgMHgwNiwgMHgwMCwgMHgwNCwgMHgzMCwgMHgwNCwKKwkweDAxLCAweDIwLAorfTsKKworLyogTVNDIC0+IEJTQyByZXNldCBhY2sgKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBic3NtYXBfcmVzZXRfYWNrW10gPSB7CisJMHgwOSwgMHgwMCwgMHgwMywgMHgwNywgMHgwYiwgMHgwNCwgMHg0MywgMHgwMSwKKwkweDAwLCAweGZlLCAweDA0LCAweDQzLCAweDVjLCAweDAwLCAweGZlLCAweDAzLAorCTB4MDAsIDB4MDEsIDB4MzEsCit9OworCisvKiBNU0MgLT4gQlNDIHBhZ2luZywgY29ubmVjdGlvbiBsZXNzICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYnNzbWFwX3BhZ2luZ1tdID0geworCTB4MDksIDB4MDAsIDB4MDMsIDB4MDcsIDB4MGIsIDB4MDQsIDB4NDMsIDB4MDEsCisJMHgwMCwgMHhmZSwgMHgwNCwgMHg0MywgMHg1YywgMHgwMCwgMHhmZSwgMHgxMCwKKwkweDAwLCAweDBlLCAweDUyLCAweDA4LCAweDA4LCAweDI5LCAweDQ3LCAweDEwLAorCTB4MDIsIDB4MDEsIDB4MzEsIDB4OTcsIDB4NjEsIDB4MWEsIDB4MDEsIDB4MDYsCit9OworCisvKiBNU0MgLT4gQlNDIHBhZ2luZywgVURUIHdpdGhvdXQgUEMgICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYnNzbWFwX3VkdFtdID0geworCTB4MDksIDB4MDAsIDB4MDMsIDB4MDUsIDB4MDcsIDB4MDIsIDB4NDIsIDB4ZmUsCisJMHgwMiwgMHg0MiwgMHhmZSwgMHgxMCwgMHgwMCwgMHgwZSwgMHg1MiwgMHgwOCwKKwkweDA4LCAweDI5LCAweDQ3LCAweDEwLCAweDAyLCAweDAxLCAweDMxLCAweDk3LAorCTB4NjEsIDB4MWEsIDB4MDEsIDB4MDYsCit9OworCisvKiBCU0MgLT4gTVNDIGNvbm5lY3Rpb24gb3BlbiAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGJzc21hcF9jcltdID0geworCTB4MDEsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDIsIDB4MDIsIDB4MDQsIDB4MDIsCisJMHg0MiwgMHhmZSwgMHgwZiwgMHgxZiwgMHgwMCwgMHgxZCwgMHg1NywgMHgwNSwKKwkweDA4LCAweDAwLCAweDcyLCAweGY0LCAweDgwLCAweDIwLCAweDEyLCAweGMzLAorCTB4NTAsIDB4MTcsIDB4MTAsIDB4MDUsIDB4MjQsIDB4MTEsIDB4MDMsIDB4MzMsCisJMHgxOSwgMHhhMiwgMHgwOCwgMHgyOSwgMHg0NywgMHgxMCwgMHgwMiwgMHgwMSwKKwkweDMxLCAweDk3LCAweDYxLCAweDAwCit9OworCisvKiBNU0MgLT4gQlNDIGNvbm5lY3Rpb24gY29uZmlybSAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGJzc21hcF9jY1tdID0geworCTB4MDIsIDB4MDEsIDB4MDIsIDB4MDMsIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDIsIDB4MDEsIDB4MDAsCit9OworCisvKiBNU0MgLT4gQlNDIERUQVAKKyAqCisgKiB3ZSBmYWtlIGEgYml0IGFuZCBtYWtlIGl0IEJTQyAtPiBNU0MuLi4gc28gdGhlCisgKiBwYXlsb2FkIGRvZXMgbm90IG1ha2UgYW55IHNlbnNlLi4KKyAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGJzc21hcF9kdGFwW10gPSB7CisJMHgwNiwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMCwgMHgwMSwgMHgwZiwgMHgwMSwgMHgwMCwgMHgwYywKKwkweDAzLCAweDA1LCAweDVjLCAweDA4LCAweDExLCAweDgxLCAweDMzLCAweDY2LCAweDAyLCAweDEzLAorCTB4NDUsIDB4ZjQsCit9OworCisvKiBNU0MgLT4gQlNDIGNsZWFyIGNvbW1hbmQgKi8KK3N0YXRpYyBjb25zdCB1X2ludDhfdCBic3NtYXBfY2xlYXJbXSA9IHsKKwkweDA2LCAweDAwLCAweDAwLCAweDAzLCAweDAwLCAweDAxLCAweDA2LCAweDAwLCAweDA0LCAweDIwLAorCTB4MDQsIDB4MDEsIDB4MDksCit9OworCisvKiBNU0MgLT4gQlNDIHJlbGVhc2VkICovCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgYnNzbWFwX3JlbGVhc2VkW10gPSB7CisJMHgwNCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMSwgMHgwMiwgMHgwMywgMHgwMCwgMHgwMSwgMHgwZiwKKwkweDAyLCAweDIzLCAweDQyLCAweDAwLAorfTsKKworLyogQlNDIC0+IE1TQyByZWxlYXNlZCAqLworc3RhdGljIGNvbnN0IHVfaW50OF90IGJzc21hcF9yZWxlYXNlX2NvbXBsZXRlW10gPSB7CisJMHgwNSwgMHgwMSwgMHgwMiwgMHgwMywgMHgwMCwgMHgwMCwgMHgwMworfTsKKworc3RydWN0IHRlc3RfZGF0YSB7CisJaW50IGxlbmd0aDsKKwljb25zdCB1X2ludDhfdCAqZGF0YTsKKwlpbnQgcGF5bG9hZF9zdGFydDsKKwlpbnQgcGF5bG9hZF9sZW5ndGg7CisJdV9pbnQ4X3QgZmlyc3RfYnl0ZTsKKworICAgICAgICAvKiBpbiBjYXNlIGl0IHNob3VsZCB0cmlnZ2VyIGEgc2NjcCByZXNwb25zZSAqLworCWludCB3cml0ZTsKKwljb25zdCB1X2ludDhfdCAgKnJlc3BvbnNlOworCWludCByZXNwb25zZV9sZW5ndGg7Cit9OworCitzdGF0aWMgY29uc3Qgc3RydWN0IHRlc3RfZGF0YSB0ZXN0X2RhdGFbXSA9IHsKKwl7CisJCS5sZW5ndGgJCT0gQVJSQVlfU0laRShic3NtYXBfcmVzZXQpLAorCQkuZGF0YQkJPSAmYnNzbWFwX3Jlc2V0WzBdLAorCQkucGF5bG9hZF9zdGFydAk9IDEyLAorCQkucGF5bG9hZF9sZW5ndGggPSBBUlJBWV9TSVpFKGJzc21hcF9yZXNldCkgLSAxMiwKKwkJLmZpcnN0X2J5dGUJPSAweDAsCisJfSwKKwl7CisJCS5sZW5ndGgJCT0gQVJSQVlfU0laRShic3NtYXBfcmVzZXRfYWNrKSwKKwkJLmRhdGEJCT0gJmJzc21hcF9yZXNldF9hY2tbMF0sCisJCS5wYXlsb2FkX3N0YXJ0CT0gMTYsCisJCS5wYXlsb2FkX2xlbmd0aCA9IEFSUkFZX1NJWkUoYnNzbWFwX3Jlc2V0X2FjaykgLSAxNiwKKwkJLmZpcnN0X2J5dGUJPSAweDAsCisJfSwKKwl7CisJCS5sZW5ndGgJCT0gQVJSQVlfU0laRShic3NtYXBfcGFnaW5nKSwKKwkJLmRhdGEJCT0gJmJzc21hcF9wYWdpbmdbMF0sCisJCS5wYXlsb2FkX3N0YXJ0CT0gMTYsCisJCS5wYXlsb2FkX2xlbmd0aCA9IEFSUkFZX1NJWkUoYnNzbWFwX3BhZ2luZykgLSAxNiwKKwkJLmZpcnN0X2J5dGUJPSAweDAsCisJfSwKKwl7CisJCS5sZW5ndGgJCT0gQVJSQVlfU0laRShic3NtYXBfY3IpLAorCQkuZGF0YQkJPSAmYnNzbWFwX2NyWzBdLAorCQkucGF5bG9hZF9zdGFydAk9IDEyLAorCQkvKiAweDAwIGlzIGVuZCBvZiBvcHRpb25hbCBkYXRhLCBzdWJ0cmFjdCB0aGlzIGJ5dGUgKi8KKwkJLnBheWxvYWRfbGVuZ3RoID0gMzEsCisJCS5maXJzdF9ieXRlCT0gMHgwLAorCisJCS8qIHRoZSBjb25uZWN0aW9uIHJlcXVlc3Qgc2hvdWxkIHRyaWdnZXIgYSBjb25uZWN0aW9uIGNvbmZpcm0gKi8KKwkJLndyaXRlCQk9IDEsCisJCS5yZXNwb25zZQk9ICZic3NtYXBfY2NbMF0sCisJCS5yZXNwb25zZV9sZW5ndGg9IEFSUkFZX1NJWkUoYnNzbWFwX2NjKSwKKwl9LAorCXsKKwkJLmxlbmd0aAkJPSBBUlJBWV9TSVpFKGJzc21hcF9kdGFwKSwKKwkJLmRhdGEJCT0gJmJzc21hcF9kdGFwWzBdLAorCQkucGF5bG9hZF9zdGFydAk9IDcsCisJCS5wYXlsb2FkX2xlbmd0aCA9IDE1LAorCQkuZmlyc3RfYnl0ZQk9IDB4MDEsCisJfSwKKwl7CisJCS5sZW5ndGgJCT0gQVJSQVlfU0laRShic3NtYXBfY2xlYXIpLAorCQkuZGF0YQkJPSAmYnNzbWFwX2NsZWFyWzBdLAorCQkucGF5bG9hZF9zdGFydAk9IDcsCisJCS5wYXlsb2FkX2xlbmd0aCA9IDYsCisJCS5maXJzdF9ieXRlCT0gMHgwMCwKKwl9LAorCXsKKwkJLmxlbmd0aAkJPSBBUlJBWV9TSVpFKGJzc21hcF9yZWxlYXNlZCksCisJCS5kYXRhCQk9ICZic3NtYXBfcmVsZWFzZWRbMF0sCisJCS5wYXlsb2FkX2xlbmd0aCA9IDIsCisJCS5wYXlsb2FkX3N0YXJ0ICA9IDExLAorCQkuZmlyc3RfYnl0ZQk9IDB4MjMsCisKKwkJLndyaXRlCQk9IDEsCisJCS5yZXNwb25zZQk9ICZic3NtYXBfcmVsZWFzZV9jb21wbGV0ZVswXSwKKwkJLnJlc3BvbnNlX2xlbmd0aD0gQVJSQVlfU0laRShic3NtYXBfcmVsZWFzZV9jb21wbGV0ZSksCisJfSwKK307CisKKy8qIHdlIHdpbGwgc2VuZCBVRFRzIGFuZCB2ZXJpZnkgdGhleSBsb29rIGxpa2UgdGhpcyAqLworc3RhdGljIGNvbnN0IHN0cnVjdCB0ZXN0X2RhdGEgc2VuZF9kYXRhW10gPSB7CisJeworCQkubGVuZ3RoCQk9IEFSUkFZX1NJWkUoYnNzbWFwX3VkdCksCisJCS5kYXRhCQk9ICZic3NtYXBfdWR0WzBdLAorCQkucGF5bG9hZF9zdGFydAk9IDEyLAorCQkucGF5bG9hZF9sZW5ndGggPSBBUlJBWV9TSVpFKGJzc21hcF91ZHQpIC0gMTIsCisJCS5maXJzdF9ieXRlCT0gMHgwLAorCX0sCisJeworCQkubGVuZ3RoCQk9IEFSUkFZX1NJWkUoYnNzbWFwX3Jlc2V0KSwKKwkJLmRhdGEJCT0gJmJzc21hcF9yZXNldFswXSwKKwkJLnBheWxvYWRfc3RhcnQJPSAxMiwKKwkJLnBheWxvYWRfbGVuZ3RoID0gQVJSQVlfU0laRShic3NtYXBfcmVzZXQpIC0gMTIsCisJCS5maXJzdF9ieXRlCT0gMHgwLAorCX0sCit9OworCitzdHJ1Y3QgY29ubmVjdGlvbl90ZXN0IHsKKwkvKiBzaG91bGQgdGhlIGNvbm5lY3Rpb24gYmUgcmVmdXNlZD8gKi8KKwlpbnQgcmVmdXNlOworCisJaW50IHdpdGhfZGF0YTsKKworCS8qIG9uIHdoaWNoIHNpZGUgdG8gY2xvc2UgdGhlIGNvbm5lY3Rpb24/ICovCisJaW50IGNsb3NlX3NpZGU7CisJaW50IGNsb3NlX2NhdXNlOworfTsKKworLyogc2NjcCBjb25uZWN0aW9uIGhhbmRsaW5nIHdlIHdhbnQgdG8gdGVzdCAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBjb25uZWN0aW9uX3Rlc3QgY29ubmVjdGlvbl90ZXN0c1tdID0geworCXsKKwkJLnJlZnVzZQk9IDEsCisJfSwKKwl7CisJCS5yZWZ1c2UJPSAxLAorCQkud2l0aF9kYXRhID0gMSwKKwl9LAorCXsKKwkJLnJlZnVzZSA9IDAsCisJCS5jbG9zZV9zaWRlID0gMCwKKwkJLmNsb3NlX2NhdXNlID0gNSwKKwl9LAorCXsKKwkJLnJlZnVzZSA9IDAsCisJCS5jbG9zZV9zaWRlID0gMCwKKwkJLmNsb3NlX2NhdXNlID0gNSwKKwkJLndpdGhfZGF0YSA9IDEsCisJfSwKKwl7CisJCS5yZWZ1c2UgPSAwLAorCQkuY2xvc2Vfc2lkZSA9IDEsCisJCS5jbG9zZV9jYXVzZSA9IDUsCisJfSwKKwl7CisJCS5yZWZ1c2UgPSAwLAorCQkuY2xvc2Vfc2lkZSA9IDEsCisJCS5jbG9zZV9jYXVzZSA9IDUsCisJCS53aXRoX2RhdGEgPSAxLAorCX0sCit9OworCitzdHJ1Y3Qgc2NjcF9wYXJzZV9oZWFkZXJfcmVzdWx0IHsKKwkvKiByZXN1bHRzICovCisJaW50IG1zZ190eXBlOworCWludCB3YW50ZWRfbGVuOworCWludCBzcmNfc3NuOworCWludCBkc3Rfc3NuOworCisJaW50IGhhc19zcmNfcmVmLCBoYXNfZHN0X3JlZjsKKwlzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlIHNyY19yZWY7CisJc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSBkc3RfcmVmOworCisJLyogdGhlIGlucHV0ICovCisJY29uc3QgdV9pbnQ4X3QgKmlucHV0OworCWludCBpbnB1dF9sZW47Cit9OworCitzdGF0aWMgY29uc3QgdV9pbnQ4X3QgaXRfdGVzdFtdID0geworMHgxMCwgMHgwMSwgMHgwNywgCisweDk0LCAweDAxLCAweDA0LCAweDAwLCAweDAyLCAweDAwLCAweDAwLCAweDAwIH07CisKK3N0YXRpYyBjb25zdCBzdHJ1Y3Qgc2NjcF9wYXJzZV9oZWFkZXJfcmVzdWx0IHBhcnNlX3Jlc3VsdFtdID0geworCXsKKwkJLm1zZ190eXBlCT0gU0NDUF9NU0dfVFlQRV9JVCwKKwkJLndhbnRlZF9sZW4JPSAwLAorCQkuc3JjX3Nzbgk9IC0xLAorCQkuZHN0X3Nzbgk9IC0xLAorCQkuaGFzX3NyY19yZWYJPSAxLAorCQkuaGFzX2RzdF9yZWYJPSAxLAorCisJCS5zcmNfcmVmCT0geworCQkJLm9jdGV0MSA9IDB4MDEsCisJCQkub2N0ZXQyID0gMHgwNCwKKwkJCS5vY3RldDMgPSAweDAwCisJCX0sCisJCS5kc3RfcmVmCT0geworCQkJLm9jdGV0MSA9IDB4MDEsCisJCQkub2N0ZXQyID0gMHgwNywKKwkJCS5vY3RldDMgPSAweDk0LAorCQl9LAorCisJCS5pbnB1dAkJPSBpdF90ZXN0LAorCQkuaW5wdXRfbGVuCT0gc2l6ZW9mKGl0X3Rlc3QpLAorCX0sCit9OworCisKKy8qIHRlc3RpbmcgcHJvY2VkdXJlOgorICoJLSB3ZSB3aWxsIHVzZSBzY2NwX3dyaXRlIGFuZCBzZWUgd2hhdCB3aWxsIGJlIHNldCBpbiB0aGUKKyAqCSAgb3V0Z29pbmcgY2FsbGJhY2sKKyAqCS0gd2Ugd2lsbCBjYWxsIHNjY3Bfc3lzdGVtX2luY29taW5nIGFuZCBzZWUgd2hpY2ggY2FsbHMKKyAqCSAgYXJlIG1hZGUuIEFuZCB0aGVuIGNvbXBhcmUgaXQgdG8gdGhlIG9uZXMgd2UgZXhwZWN0LiBXZQorICoJICB3YW50IHRoZSBwYXlsb2FkIHRvIGFycml2ZSwgb3IgY2FsbGJhY2tzIHRvIGJlIGNhbGxlZC4KKyAqCS0gd2Ugd2lsbCB1c2Ugc2NjcF9jb25uZWN0aW9uX3NvY2tldCBhbmQgc2NjcF9jb25uZWN0aW9uX3dyaXRlCisgKgkgIGFuZCB2ZXJpZnkgc3RhdGUgaGFuZGxpbmcgb2YgY29ubmVjdGlvbnMKKyAqLworCitzdGF0aWMgaW50IGN1cnJlbnRfdGVzdDsKKworLyoKKyAqIHRlc3Qgc3RhdGUuLi4KKyAqLworc3RhdGljIGludCBjYWxsZWQgID0gMDsKK3N0YXRpYyBpbnQgbWF0Y2hlZCA9IDA7CitzdGF0aWMgaW50IHdyaXRlX2NhbGxlZCA9IDA7CisKKyNkZWZpbmUgRkFJTCh4LCBhcmdzLi4uKSBwcmludGYoIkZBSUxVUkUgaW4gJXM6JWQ6ICIgeCwgX19GSUxFX18sIF9fTElORV9fLCAjIyBhcmdzKQorCisvKgorICogd3JpdGluZyB0aGVzZSBwYWNrZXRzIGFuZCBleHBlY3RpbmcgYSByZXN1bHQKKyAqLworaW50IHNjY3BfcmVhZF9jYihzdHJ1Y3QgbXNnYiAqZGF0YSwgdW5zaWduZWQgbGVuLCB2b2lkICpjb250ZXh0KQoreworCXVfaW50MTZfdCBwYXlsb2FkX2xlbmd0aCA9IHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLnBheWxvYWRfbGVuZ3RoOworCWNvbnN0IHVfaW50OF90ICpnb3QsICp3YW50ZWQ7CisJaW50IGk7CisKKwljYWxsZWQgPSAxOworCisJaWYgKG1zZ2JfbDNsZW4oZGF0YSkgPCBsZW4pIHsKKwkJLyogdGhpcyBzaG91bGQgbmV2ZXIgYmUgcmVhY2hlZCAqLworCQlGQUlMKCJTb21ldGhpbmcgaG9ycmlibGUgaGFwcGVuZWQuLiBpbnZhbGlkIHBhY2tldC4uXG4iKTsKKwkJZXhpdCgtMSk7CisJfQorCisJaWYgKGxlbiA9PSAwIHx8IGxlbiAhPSBwYXlsb2FkX2xlbmd0aCkgeworCQlGQUlMKCJsZW5ndGggbWlzbWF0Y2g6IGdvdDogJWQgd2FudGVkOiAlZFxuIiwgbXNnYl9sM2xlbihkYXRhKSwgcGF5bG9hZF9sZW5ndGgpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGRhdGEtPmwzaFswXSAhPSAgdGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0uZmlyc3RfYnl0ZSkgeworCQlGQUlMKCJUaGUgZmlyc3QgYnl0ZXMgb2YgbDMgZG8gbm90IG1hdGNoOiAweCV4IDB4JXhcbiIsCisJCQlkYXRhLT5sM2hbMF0sIHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLmZpcnN0X2J5dGUpOworCQlyZXR1cm4gLTE7CisJfQorCisJZ290ID0gJmRhdGEtPmwzaFswXTsKKwl3YW50ZWQgPSB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5kYXRhICsgdGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0ucGF5bG9hZF9zdGFydDsKKworCWZvciAoaSA9IDA7IGkgPCBsZW47ICsraSkgeworCQlpZiAoZ290W2ldICE9IHdhbnRlZFtpXSkgeworCQkJRkFJTCgiRmFpbGVkIHRvIGNvbXBhcmUgYnl0ZS4gR290OiAweCV4IFdhbnRlZDogMHgleCBhdCAlZFxuIiwKKwkJCSAgICAgZ290W2ldLCB3YW50ZWRbaV0sIGkpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJbWF0Y2hlZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK2ludCBzY2NwX3dyaXRlX2NiKHN0cnVjdCBtc2diICpkYXRhLCB2b2lkICpjdHgpCit7CisJaW50IGkgPSAwOworCWNvbnN0IHVfaW50OF90ICpnb3QsICp3YW50ZWQ7CisKKwlpZiAodGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0ucmVzcG9uc2UgPT0gTlVMTCkgeworCQlGQUlMKCJEaWRuJ3QgZXhwZWN0IHdyaXRlIGNhbGxiYWNrXG4iKTsKKwkJcmV0dXJuIC0xOworCX0gZWxzZSBpZiAodGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0ucmVzcG9uc2VfbGVuZ3RoICE9IG1zZ2JfbDJsZW4oZGF0YSkpIHsKKwkJRkFJTCgiU2l6ZSBkb2VzIG5vdCBtYXRjaC4gR290OiAlZCBXYW50ZWQ6ICVkXG4iLAorCQkgICAgIG1zZ2JfbDJsZW4oZGF0YSksIHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLnJlc3BvbnNlX2xlbmd0aCk7CisJfQorCisJZ290ID0gJmRhdGEtPmwyaFswXTsKKwl3YW50ZWQgPSB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5yZXNwb25zZTsKKworCWZvciAoaSA9IDA7IGkgPCBtc2diX2wybGVuKGRhdGEpOyArK2kpIHsKKwkJaWYgKGdvdFtpXSAhPSB3YW50ZWRbaV0pIHsKKwkJCUZBSUwoIkZhaWxlZCB0byBjb21wYXJlIGJ5dGUuIEdvdDogMHgleCBXYW50ZWQ6IDB4JXggYXQgJWRcbiIsCisJCQkgICAgIGdvdFtpXSwgd2FudGVkW2ldLCBpKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCX0KKworCXdyaXRlX2NhbGxlZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3ZvaWQgc2NjcF9jX3JlYWQoc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqY29ubmVjdGlvbiwgc3RydWN0IG1zZ2IgKm1zZ2IsIHVuc2lnbmVkIGludCBsZW4pCit7CisJc2NjcF9yZWFkX2NiKG1zZ2IsIGxlbiwgY29ubmVjdGlvbi0+ZGF0YV9jdHgpOworfQorCit2b2lkIHNjY3BfY19zdGF0ZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uZWN0aW9uLCBpbnQgb2xkX3N0YXRlKQoreworCWlmIChjb25uZWN0aW9uLT5jb25uZWN0aW9uX3N0YXRlID49IFNDQ1BfQ09OTkVDVElPTl9TVEFURV9SRUxFQVNFX0NPTVBMRVRFKQorCQlzY2NwX2Nvbm5lY3Rpb25fZnJlZShjb25uZWN0aW9uKTsKK30KKworaW50IHNjY3BfYWNjZXB0X2NiKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm5lY3Rpb24sIHZvaWQgKnVzZXJfZGF0YSkKK3sKKwljYWxsZWQgPSAxOworCXVuc2lnbmVkIGludCByZWYgPSAwOworCXJlZiB8PSBjb25uZWN0aW9uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2Uub2N0ZXQxIDw8IDI0OworCXJlZiB8PSBjb25uZWN0aW9uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2Uub2N0ZXQyIDw8IDE2OworCXJlZiB8PSBjb25uZWN0aW9uLT5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2Uub2N0ZXQzIDw8ICA4OworCXJlZiA9IG50b2hsKHJlZik7CisKKwljb25uZWN0aW9uLT5kYXRhX2NiID0gc2NjcF9jX3JlYWQ7CisJY29ubmVjdGlvbi0+c3RhdGVfY2IgPSBzY2NwX2Nfc3RhdGU7CisKKwkvKiBhY2NlcHQgdGhpcyAqLworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IHNjY3BfdWR0X3dyaXRlX2NiKHN0cnVjdCBtc2diICpkYXRhLCB2b2lkICpjb250ZXh0KQoreworCWNvbnN0IHVfaW50OF90ICpnb3QsICp3YW50ZWQ7CisJaW50IGk7CisKKwl3cml0ZV9jYWxsZWQgPSAxOworCisJaWYgKHNlbmRfZGF0YVtjdXJyZW50X3Rlc3RdLmxlbmd0aCAhPSBtc2diX2wybGVuKGRhdGEpKSB7CisJCUZBSUwoIlNpemUgZG9lcyBub3QgbWF0Y2guIEdvdDogJWQgV2FudGVkOiAlZFxuIiwKKwkJICAgICBtc2diX2wybGVuKGRhdGEpLCBzZW5kX2RhdGFbY3VycmVudF90ZXN0XS5sZW5ndGgpOworCQlyZXR1cm4gLTE7CisJfQorCisJZ290ID0gJmRhdGEtPmwyaFswXTsKKwl3YW50ZWQgPSBzZW5kX2RhdGFbY3VycmVudF90ZXN0XS5kYXRhOworCisJZm9yIChpID0gMDsgaSA8IG1zZ2JfbDJsZW4oZGF0YSk7ICsraSkgeworCQlpZiAoZ290W2ldICE9IHdhbnRlZFtpXSkgeworCQkJRkFJTCgiRmFpbGVkIHRvIGNvbXBhcmUgYnl0ZS4gR290OiAweCV4IFdhbnRlZDogMHgleCBhdCAlZFxuIiwKKwkJCSAgICAgZ290W2ldLCB3YW50ZWRbaV0sIGkpOworCQkJcmV0dXJuIC0xOworCQl9CisJfQorCisJbWF0Y2hlZCA9IDE7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfc2NjcF9zeXN0ZW0odm9pZCkKK3sKKwlzY2NwX3N5c3RlbV9pbml0KHNjY3Bfd3JpdGVfY2IsIE5VTEwpOworCXNjY3Bfc2V0X3JlYWQoJnNjY3Bfc3NuX2Jzc2FwLCBzY2NwX3JlYWRfY2IsIE5VTEwpOworCXNjY3BfY29ubmVjdGlvbl9zZXRfaW5jb21pbmcoJnNjY3Bfc3NuX2Jzc2FwLCBzY2NwX2FjY2VwdF9jYiwgTlVMTCk7CisKKwlmb3IgKGN1cnJlbnRfdGVzdCA9IDA7IGN1cnJlbnRfdGVzdCA8IEFSUkFZX1NJWkUodGVzdF9kYXRhKTsgKytjdXJyZW50X3Rlc3QpIHsKKwkJdW5zaWduZWQgaW50IGxlbmd0aCA9IHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLmxlbmd0aDsKKwkJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2NfaGVhZHJvb20obGVuZ3RoICsgMiwgMiwgX19mdW5jX18pOworCQltc2ctPmwyaCA9IG1zZ2JfcHV0KG1zZywgbGVuZ3RoKTsKKwkJbWVtY3B5KG1zZy0+bDJoLCB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5kYXRhLCBsZW5ndGgpOworCisJCWNhbGxlZCA9IG1hdGNoZWQgPSB3cml0ZV9jYWxsZWQgPSAwOworCQlwcmludGYoIlRlc3RpbmcgcGFja2V0OiAlZFxuIiwgY3VycmVudF90ZXN0KTsKKwkJc2NjcF9zeXN0ZW1faW5jb21pbmcobXNnKTsKKworCQlpZiAoIWNhbGxlZCB8fCAhbWF0Y2hlZCB8fCAodGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0ud3JpdGUgIT0gd3JpdGVfY2FsbGVkKSkKKwkJCUZBSUwoImN1cnJlbnQgdGVzdDogJWQgY2FsbGVkOiAlZCBtYXRjaGVkOiAlZCB3cml0ZTogJWRcbiIsCisJCQkgICAgIGN1cnJlbnRfdGVzdCwgY2FsbGVkLCBtYXRjaGVkLCB3cml0ZV9jYWxsZWQpOworCisJCW1zZ2JfZnJlZShtc2cpOworCX0KK30KKworLyogdGVzdCBzZW5kaW5nIG9mIHVkdCAqLworc3RhdGljIHZvaWQgdGVzdF9zY2NwX3NlbmRfdWR0KHZvaWQpCit7CisJc2NjcF9zeXN0ZW1faW5pdChzY2NwX3VkdF93cml0ZV9jYiwgTlVMTCk7CisJc2NjcF9zZXRfcmVhZChOVUxMLCBOVUxMLCBOVUxMKTsKKwlzY2NwX2Nvbm5lY3Rpb25fc2V0X2luY29taW5nKE5VTEwsIE5VTEwsIE5VTEwpOworCisJZm9yIChjdXJyZW50X3Rlc3QgPSAwOyBjdXJyZW50X3Rlc3QgPCBBUlJBWV9TSVpFKHNlbmRfZGF0YSk7ICsrY3VycmVudF90ZXN0KSB7CisJCWNvbnN0IHN0cnVjdCB0ZXN0X2RhdGEgKnRlc3QgPSAmc2VuZF9kYXRhW2N1cnJlbnRfdGVzdF07CisKKwkJc3RydWN0IG1zZ2IgKm1zZyA9IG1zZ2JfYWxsb2ModGVzdC0+cGF5bG9hZF9sZW5ndGgsIF9fZnVuY19fKTsKKwkJbXNnLT5sM2ggPSBtc2diX3B1dChtc2csIHRlc3QtPnBheWxvYWRfbGVuZ3RoKTsKKwkJbWVtY3B5KG1zZy0+bDNoLCB0ZXN0LT5kYXRhICsgdGVzdC0+cGF5bG9hZF9zdGFydCwgdGVzdC0+cGF5bG9hZF9sZW5ndGgpOworCisJCW1hdGNoZWQgPSB3cml0ZV9jYWxsZWQgPSAwOworCQlwcmludGYoIlRlc3RpbmcgcGFja2V0OiAlZFxuIiwgY3VycmVudF90ZXN0KTsKKwkJc2NjcF93cml0ZShtc2csICZzY2NwX3Nzbl9ic3NhcCwgJnNjY3Bfc3NuX2Jzc2FwLCAwKTsKKworCQlpZiAoIW1hdGNoZWQgfHwgIXdyaXRlX2NhbGxlZCkKKwkJCUZBSUwoImN1cnJlbnQgdGVzdDogJWQgbWF0Y2hlZDogJWQgd3JpdGU6ICVkXG4iLAorCQkJICAgICBjdXJyZW50X3Rlc3QsIG1hdGNoZWQsIHdyaXRlX2NhbGxlZCk7CisKKwkJbXNnYl9mcmVlKG1zZyk7CisJfQorfQorCisvKiBzZW5kIHVkdCBmcm9tIG9uZSBlbmQgdG8gYW5vdGhlciAqLworc3RhdGljIHVuc2lnbmVkIGludCB0ZXN0X3ZhbHVlID0gMHgyNDQyOworc3RhdGljIGludCBzY2NwX3VkdF9yZWFkKHN0cnVjdCBtc2diICpkYXRhLCB1bnNpZ25lZCBpbnQgbGVuLCB2b2lkICpjb250ZXh0KQoreworCXVuc2lnbmVkIGludCAqdmFsOworCisJaWYgKGxlbiAhPSA0KSB7CisJCUZBSUwoIldyb25nIHNpemU6ICVkXG4iLCBtc2diX2wzbGVuKGRhdGEpKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXZhbCA9ICh1bnNpZ25lZCBpbnQqKWRhdGEtPmwzaDsKKwltYXRjaGVkID0gdGVzdF92YWx1ZSA9PSAqdmFsOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgc2NjcF93cml0ZV9sb29wKHN0cnVjdCBtc2diICpkYXRhLCB2b2lkICpjb250ZXh0KQoreworCS8qIHNlbmQgaXQgYmFjayB0byB1cyAqLworCXNjY3Bfc3lzdGVtX2luY29taW5nKGRhdGEpOworCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCB0ZXN0X3NjY3BfdWR0X2NvbW11bmljYXRpb24odm9pZCkKK3sKKwlzdHJ1Y3QgbXNnYiAqZGF0YTsKKwl1bnNpZ25lZCBpbnQgKnZhbDsKKworCXNjY3Bfc3lzdGVtX2luaXQoc2NjcF93cml0ZV9sb29wLCBOVUxMKTsKKwlzY2NwX3NldF9yZWFkKCZzY2NwX3Nzbl9ic3NhcCwgc2NjcF91ZHRfcmVhZCwgTlVMTCk7CisJc2NjcF9jb25uZWN0aW9uX3NldF9pbmNvbWluZyhOVUxMLCBOVUxMLCBOVUxMKTsKKworCisJZGF0YSA9IG1zZ2JfYWxsb2MoNCwgInRlc3QgZGF0YSIpOworCWRhdGEtPmwzaCA9ICZkYXRhLT5kYXRhWzBdOworCXZhbCA9ICh1bnNpZ25lZCBpbnQgKiltc2diX3B1dChkYXRhLCA0KTsKKwkqdmFsID0gdGVzdF92YWx1ZTsKKworCW1hdGNoZWQgPSAwOworCXNjY3Bfd3JpdGUoZGF0YSwgJnNjY3Bfc3NuX2Jzc2FwLCAmc2NjcF9zc25fYnNzYXAsIDApOworCisJaWYgKCFtYXRjaGVkKQorCSAgICBGQUlMKCJUYWxraW5nIHdpdGggdXMgZGlkbid0IHdvcmtcbiIpOworCisJbXNnYl9mcmVlKGRhdGEpOworfQorCisKKy8qIGNvbm5lY3Rpb24gdGVzdGluZy4uLiBvcGVuLCBzZW5kLCBjbG9zZSAqLworc3RhdGljIGNvbnN0IHN0cnVjdCBjb25uZWN0aW9uX3Rlc3QgKmN1cnJlbnRfY29uX3Rlc3Q7CitzdGF0aWMgc3RydWN0IHNjY3BfY29ubmVjdGlvbiAqb3V0Z29pbmdfY29uOworc3RhdGljIHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmluY29taW5nX2NvbjsKK3N0YXRpYyBpbnQgb3V0Z29pbmdfZGF0YSwgaW5jb21pbmdfZGF0YSwgaW5jb21pbmdfc3RhdGUsIG91dGdvaW5nX3N0YXRlOworCitzdGF0aWMgc3RydWN0IG1zZ2IgKnRlc3RfZGF0YTEsICp0ZXN0X2RhdGEyLCAqdGVzdF9kYXRhMzsKKworc3RhdGljIHZvaWQgc2NjcF9jb25uX2luX3N0YXRlKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4sIGludCBvbGRfc3RhdGUpCit7CisJcHJpbnRmKCJcdGluY29tZTogJWQgLT4gJWRcbiIsIG9sZF9zdGF0ZSwgY29ubi0+Y29ubmVjdGlvbl9zdGF0ZSk7CisJaWYgKGNvbm4tPmNvbm5lY3Rpb25fc3RhdGUgPj0gU0NDUF9DT05ORUNUSU9OX1NUQVRFX1JFTEVBU0VfQ09NUExFVEUpIHsKKwkJaWYgKGNvbm4gPT0gaW5jb21pbmdfY29uKSB7CisJCQlzY2NwX2Nvbm5lY3Rpb25fZnJlZShjb25uKTsKKwkJCWluY29taW5nX2NvbiA9IE5VTEw7CisJCX0KKwl9Cit9CisKK3N0YXRpYyB2b2lkIHNjY3BfY29ubl9pbl9kYXRhKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4sIHN0cnVjdCBtc2diICptc2csIHVuc2lnbmVkIGludCBsZW4pCit7CisJLyogY29tcGFyZSB0aGUgZGF0YSAqLworCSsraW5jb21pbmdfZGF0YTsKKwlwcmludGYoIlx0aW5jb21pbmcgZGF0YTogJWRcbiIsIGxlbik7CisKKwkvKiBjb21wYXJlIHRoZSBkYXRhICovCisJaWYgKGxlbiAhPSA0KSB7CisJCUZBSUwoIkxlbmd0aCBvZiBwYWNrZXQgaXMgd3Jvbmc6ICV1ICV1XG4iLCBtc2diX2wzbGVuKG1zZyksIGxlbik7CisJCXJldHVybjsKKwl9CisKKwlpZiAoaW5jb21pbmdfZGF0YSA9PSAxKSB7CisJCWlmIChtZW1jbXAobXNnLT5sM2gsIHRlc3RfZGF0YTEtPmwzaCwgbGVuKSAhPSAwKSB7CisJCQlGQUlMKCJDb21wYXJpbmcgdGhlIGRhdGEgZmFpbGVkOiAlZFxuIiwgaW5jb21pbmdfZGF0YSk7CisJCQlpbmNvbWluZ19zdGF0ZSA9IDA7CisJCQlwcmludGYoIkdvdDogICAgJXNcbiIsIGhleGR1bXAobXNnLT5sM2gsIGxlbikpOworCQkJcHJpbnRmKCJXYW50ZWQ6ICVzXG4iLCBoZXhkdW1wKHRlc3RfZGF0YTEtPmwzaCwgbGVuKSk7CisKKwkJfQorCX0gZWxzZSBpZiAoaW5jb21pbmdfZGF0YSA9PSAyKSB7CisJCWlmIChtZW1jbXAobXNnLT5sM2gsIHRlc3RfZGF0YTItPmwzaCwgbGVuKSAhPSAwKSB7CisJCQlGQUlMKCJDb21wYXJpbmcgdGhlIGRhdGEgZmFpbGVkOiAlZFxuIiwgaW5jb21pbmdfZGF0YSk7CisJCQlpbmNvbWluZ19zdGF0ZSA9IDA7CisJCQlwcmludGYoIkdvdDogICAgJXNcbiIsIGhleGR1bXAobXNnLT5sM2gsIGxlbikpOworCQkJcHJpbnRmKCJXYW50ZWQ6ICVzXG4iLCBoZXhkdW1wKHRlc3RfZGF0YTItPmwzaCwgbGVuKSk7CisJCX0KKwl9CisKKwkvKiBzZW5kaW5nIG91dCBkYXRhICovCisJaWYgKGluY29taW5nX2RhdGEgPT0gMikgeworCQlwcmludGYoIlx0UmV0dXJuaW5nIGRhdGEzXG4iKTsKKwkJc2NjcF9jb25uZWN0aW9uX3dyaXRlKGNvbm4sIHRlc3RfZGF0YTMpOworCX0KK30KKworc3RhdGljIGludCBzY2NwX2Nvbm5fYWNjZXB0KHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4sIHZvaWQgKmN0eCkKK3sKKwlwcmludGYoIlx0YWNjZXB0OiAlcFxuIiwgY29ubik7CisJY29ubi0+c3RhdGVfY2IgPSBzY2NwX2Nvbm5faW5fc3RhdGU7CisJY29ubi0+ZGF0YV9jYiA9IHNjY3BfY29ubl9pbl9kYXRhOworCisJaWYgKGN1cnJlbnRfY29uX3Rlc3QtPnJlZnVzZSkKKwkJcmV0dXJuIC0xOworCisJaW5jb21pbmdfY29uID0gY29ubjsKKwlyZXR1cm4gMDsKK30KKworLyogY2FsbGJhY2tzIGZvciB0aGUgb3V0Z29pbmcgc2lkZSAqLworc3RhdGljIHZvaWQgc2NjcF9jb25uX291dF9zdGF0ZShzdHJ1Y3Qgc2NjcF9jb25uZWN0aW9uICpjb25uLCBpbnQgb2xkX3N0YXRlKQoreworCXByaW50ZigiXHRvdXRnb2luZzogJXAgJWQgLT4gJWRcbiIsIGNvbm4sIG9sZF9zdGF0ZSwgY29ubi0+Y29ubmVjdGlvbl9zdGF0ZSk7CisKKwlpZiAoY29ubi0+Y29ubmVjdGlvbl9zdGF0ZSA+PSBTQ0NQX0NPTk5FQ1RJT05fU1RBVEVfUkVMRUFTRV9DT01QTEVURSkgeworCQlpZiAoY29ubiA9PSBvdXRnb2luZ19jb24pIHsKKwkJCXNjY3BfY29ubmVjdGlvbl9mcmVlKGNvbm4pOworCQkJb3V0Z29pbmdfY29uID0gTlVMTDsKKwkJfQorCX0KK30KKworc3RhdGljIHZvaWQgc2NjcF9jb25uX291dF9kYXRhKHN0cnVjdCBzY2NwX2Nvbm5lY3Rpb24gKmNvbm4sIHN0cnVjdCBtc2diICptc2csIHVuc2lnbmVkIGludCBsZW4pCit7CisJKytvdXRnb2luZ19kYXRhOworCXByaW50ZigiXHRvdXRnb2luZyBkYXRhOiAlcCAlZFxuIiwgY29ubiwgbGVuKTsKKworCWlmIChsZW4gIT0gNCkKKwkJRkFJTCgiTGVuZ3RoIG9mIHBhY2tldCBpcyB3cm9uZzogJXUgJXVcbiIsIG1zZ2JfbDNsZW4obXNnKSwgbGVuKTsKKworCWlmIChvdXRnb2luZ19kYXRhID09IDEpIHsKKwkJaWYgKG1lbWNtcChtc2ctPmwzaCwgdGVzdF9kYXRhMy0+bDNoLCBsZW4pICE9IDApIHsKKwkJCUZBSUwoIkNvbXBhcmluZyB0aGUgZGF0YSBmYWlsZWRcbiIpOworCQkJb3V0Z29pbmdfc3RhdGUgPSAwOworCQl9CisJfQorfQorCitzdGF0aWMgdm9pZCBkb190ZXN0X3NjY3BfY29ubmVjdGlvbihjb25zdCBzdHJ1Y3QgY29ubmVjdGlvbl90ZXN0ICp0ZXN0KQoreworCWludCByZXQ7CisKKwljdXJyZW50X2Nvbl90ZXN0ID0gdGVzdDsKKwlvdXRnb2luZ19jb24gPSBpbmNvbWluZ19jb24gPSAwOworCisJb3V0Z29pbmdfY29uID0gc2NjcF9jb25uZWN0aW9uX3NvY2tldCgpOworCWlmICghb3V0Z29pbmdfY29uKSB7CisJCUZBSUwoIkNvbm5lY3Rpb24gaXMgTlVMTFxuIik7CisJCXJldHVybjsKKwl9CisKKwlvdXRnb2luZ19jb24tPnN0YXRlX2NiID0gc2NjcF9jb25uX291dF9zdGF0ZTsKKwlvdXRnb2luZ19jb24tPmRhdGFfY2IgPSBzY2NwX2Nvbm5fb3V0X2RhdGE7CisJb3V0Z29pbmdfZGF0YSA9IGluY29taW5nX2RhdGEgPSAwOworCWluY29taW5nX3N0YXRlID0gb3V0Z29pbmdfc3RhdGUgPSAxOworCisJLyogc3RhcnQgdGVzdGluZyAqLworCWlmICh0ZXN0LT53aXRoX2RhdGEpIHsKKwkJaWYgKHNjY3BfY29ubmVjdGlvbl9jb25uZWN0KG91dGdvaW5nX2NvbiwgJnNjY3Bfc3NuX2Jzc2FwLCB0ZXN0X2RhdGExKSAhPSAwKQorCQkJRkFJTCgiQmluZGluZyBmYWlsZWRcbiIpOworCX0gZWxzZSB7CisJCSsraW5jb21pbmdfZGF0YTsKKwkJaWYgKHNjY3BfY29ubmVjdGlvbl9jb25uZWN0KG91dGdvaW5nX2NvbiwgJnNjY3Bfc3NuX2Jzc2FwLCBOVUxMKSAhPSAwKQorCQkJRkFJTCgiQmluZGluZyBmYWlsZWRcbiIpOworCX0KKworCWlmICh0ZXN0LT5yZWZ1c2UpIHsKKwkJaWYgKG91dGdvaW5nX2NvbikKKwkJCUZBSUwoIk91dGdvaW5nIGNvbm5lY3Rpb24gc2hvdWxkIGhhdmUgYmVlbiByZWZ1c2VkLlxuIik7CisJfSBlbHNlIHsKKwkJaWYgKCFpbmNvbWluZ19jb24pCisJCQlGQUlMKCJDcmVhdGluZyBpbmNvbWluZyBkaWRuJ3Qgd29yay5cbiIpOworCisJCXByaW50ZigiXHRXcml0aW5nIHRlc3QgZGF0YTJcbiIpOworCQlzY2NwX2Nvbm5lY3Rpb25fd3JpdGUob3V0Z29pbmdfY29uLCB0ZXN0X2RhdGEyKTsKKwkJc2NjcF9jb25uZWN0aW9uX3NlbmRfaXQob3V0Z29pbmdfY29uKTsKKworCQkvKiBjbG9zaW5nIGNvbm5lY3Rpb24gKi8KKwkJaWYgKHRlc3QtPmNsb3NlX3NpZGUgPT0gMCkKKwkJCXJldCA9IHNjY3BfY29ubmVjdGlvbl9jbG9zZShvdXRnb2luZ19jb24sIDApOworCQllbHNlCisJCQlyZXQgPSBzY2NwX2Nvbm5lY3Rpb25fY2xvc2UoaW5jb21pbmdfY29uLCAwKTsKKworCQlpZiAocmV0ICE9IDApCisJCQlGQUlMKCJDbG9zaW5nIHRoZSBjb25uZWN0aW9uIGZhaWxlZFxuIik7CisJfQorCisJLyogb3V0Z29pbmcgc2hvdWxkIGJlIGdvbmUgbm93ICovCisJaWYgKG91dGdvaW5nX2NvbikKKwkJRkFJTCgiT3V0Z29pbmcgY29ubmVjdGlvbiB3YXMgbm90IHByb3Blcmx5IGNsb3NlZFxuIik7CisKKwlpZiAoaW5jb21pbmdfY29uKQorCQlGQUlMKCJJbmNvbWluZyBjb25uZWN0aW9uIHdhcyBub3QgcHJvcGVyeSBjbG9zZWQuXG4iKTsKKworCWlmICh0ZXN0LT5yZWZ1c2UgPT0gMCkgeworCQlpZiAob3V0Z29pbmdfZGF0YSAhPSAxIHx8IGluY29taW5nX2RhdGEgIT0gMikgeworCQkJRkFJTCgiRGF0YSBzZW5kaW5nIGZhaWxlZDogJWQvJWQgJWQvJWRcbiIsCisJCQkgICAgIG91dGdvaW5nX2RhdGEsIDEsCisJCQkgICAgIGluY29taW5nX2RhdGEsIDIpOworCQl9CisJfQorCisJaWYgKCFpbmNvbWluZ19zdGF0ZSB8fCAhb3V0Z29pbmdfc3RhdGUpCisJCUZBSUwoIkZhaWx1cmUgd2l0aCB0aGUgc3RhdGUgdHJhbnNpdGlvbi4gJWQgJWRcbiIsCisJCSAgICAgb3V0Z29pbmdfc3RhdGUsIGluY29taW5nX3N0YXRlKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9zY2NwX2Nvbm5lY3Rpb24odm9pZCkKK3sKKwlzY2NwX3N5c3RlbV9pbml0KHNjY3Bfd3JpdGVfbG9vcCwgTlVMTCk7CisJc2NjcF9zZXRfcmVhZChOVUxMLCBOVUxMLCBOVUxMKTsKKwlzY2NwX2Nvbm5lY3Rpb25fc2V0X2luY29taW5nKCZzY2NwX3Nzbl9ic3NhcCwgc2NjcF9jb25uX2FjY2VwdCwgTlVMTCk7CisKKwl0ZXN0X2RhdGExID0gbXNnYl9hbGxvYyg0LCAiZGF0YTEiKTsKKwl0ZXN0X2RhdGExLT5sM2ggPSBtc2diX3B1dCh0ZXN0X2RhdGExLCA0KTsKKwkqKCh1bnNpZ25lZCBpbnQqKXRlc3RfZGF0YTEtPmwzaCkgPSAweDIzNDIxMTIyOworCisJdGVzdF9kYXRhMiA9IG1zZ2JfYWxsb2MoNCwgImRhdGEyIik7CisJdGVzdF9kYXRhMi0+bDNoID0gbXNnYl9wdXQodGVzdF9kYXRhMiwgNCk7CisJKigodW5zaWduZWQgaW50Kil0ZXN0X2RhdGEyLT5sM2gpID0gMHg0MjIzMjIxMTsKKworCXRlc3RfZGF0YTMgPSBtc2diX2FsbG9jKDQsICJkYXRhMyIpOworCXRlc3RfZGF0YTMtPmwzaCA9IG1zZ2JfcHV0KHRlc3RfZGF0YTMsIDQpOworCSooKHVuc2lnbmVkIGludCopdGVzdF9kYXRhMy0+bDNoKSA9IDB4MjMyM2ZmNTU7CisKKworCWZvciAoY3VycmVudF90ZXN0ID0gMDsgY3VycmVudF90ZXN0IDwgQVJSQVlfU0laRShjb25uZWN0aW9uX3Rlc3RzKTsgKytjdXJyZW50X3Rlc3QpIHsKKwkJcHJpbnRmKCJUZXN0aW5nICVkIHJlZnVzZTogJWQgd2l0aF9kYXRhOiAlZFxuIiwKKwkJCWN1cnJlbnRfdGVzdCwgY29ubmVjdGlvbl90ZXN0c1tjdXJyZW50X3Rlc3RdLnJlZnVzZSwKKwkJCWNvbm5lY3Rpb25fdGVzdHNbY3VycmVudF90ZXN0XS53aXRoX2RhdGEpOworCQlkb190ZXN0X3NjY3BfY29ubmVjdGlvbigmY29ubmVjdGlvbl90ZXN0c1tjdXJyZW50X3Rlc3RdKTsKKwl9CisKKwltc2diX2ZyZWUodGVzdF9kYXRhMSk7CisJbXNnYl9mcmVlKHRlc3RfZGF0YTIpOworCW1zZ2JfZnJlZSh0ZXN0X2RhdGEzKTsKK30KKworLyogaW52YWxpZCBpbnB1dCAqLworc3RhdGljIHZvaWQgdGVzdF9zY2NwX3N5c3RlbV9jcmFzaCh2b2lkKQoreworCXByaW50ZigidHJ5aW5nIHRvIHByb3Zva2UgYSBjcmFzaCB3aXRoIGludmFsaWQgaW5wdXRcbiIpOworCXNjY3Bfc2V0X3JlYWQoJnNjY3Bfc3NuX2Jzc2FwLCBzY2NwX3JlYWRfY2IsIE5VTEwpOworCXNjY3BfY29ubmVjdGlvbl9zZXRfaW5jb21pbmcoJnNjY3Bfc3NuX2Jzc2FwLCBzY2NwX2FjY2VwdF9jYiwgTlVMTCk7CisKKwlmb3IgKGN1cnJlbnRfdGVzdCA9IDA7IGN1cnJlbnRfdGVzdCA8IEFSUkFZX1NJWkUodGVzdF9kYXRhKTsgKytjdXJyZW50X3Rlc3QpIHsKKwkJaW50IG9yaWdpbmFsX2xlbmd0aCA9IHRlc3RfZGF0YVtjdXJyZW50X3Rlc3RdLmxlbmd0aDsKKwkJaW50IGxlbmd0aCA9IG9yaWdpbmFsX2xlbmd0aCArIDI7CisJCWludCBpOworCisJCXByaW50ZigiVGVzdGluZyBwYWNrZXQ6ICVkXG4iLCBjdXJyZW50X3Rlc3QpOworCisJCWZvciAoaSA9IGxlbmd0aDsgaSA+PSAwOyAtLWkpIHsKKwkJCXVuc2lnbmVkIGludCBsZW5ndGggPSBNSU4odGVzdF9kYXRhW2N1cnJlbnRfdGVzdF0ubGVuZ3RoLCBpKTsKKwkJCXN0cnVjdCBtc2diICptc2cgPSBtc2diX2FsbG9jX2hlYWRyb29tKGxlbmd0aCArIDIsIDIsIF9fZnVuY19fKTsKKwkJCW1zZy0+bDJoID0gbXNnYl9wdXQobXNnLCBsZW5ndGgpOworCQkJbWVtY3B5KG1zZy0+bDJoLCB0ZXN0X2RhdGFbY3VycmVudF90ZXN0XS5kYXRhLCBsZW5ndGgpOworCQkJc2NjcF9zeXN0ZW1faW5jb21pbmcobXNnKTsKKwkJCW1zZ2JfZnJlZShtc2cpOworCQl9CisJfQorCisJcHJpbnRmKCJzdXJ2aXZlZFxuIik7Cit9CisKK3N0YXRpYyB2b2lkIHRlc3Rfc2NjcF9wYXJzaW5nKHZvaWQpCit7CisJZm9yIChjdXJyZW50X3Rlc3QgPSAwOyBjdXJyZW50X3Rlc3QgPCBBUlJBWV9TSVpFKHBhcnNlX3Jlc3VsdCk7ICsrY3VycmVudF90ZXN0KSB7CisJCXN0cnVjdCBtc2diICptc2c7CisJCXN0cnVjdCBzY2NwX3BhcnNlX3Jlc3VsdCByZXN1bHQ7CisKKwkJbXNnID0gbXNnYl9hbGxvY19oZWFkcm9vbSgxMDI0LCAxMjgsICJwYXJzZS10ZXN0Iik7CisJCW1zZ2JfcHV0KG1zZywgMSk7CisJCW1zZy0+bDJoID0gbXNnYl9wdXQobXNnLCBwYXJzZV9yZXN1bHRbY3VycmVudF90ZXN0XS5pbnB1dF9sZW4pOworCQltZW1jcHkobXNnLT5sMmgsIHBhcnNlX3Jlc3VsdFtjdXJyZW50X3Rlc3RdLmlucHV0LCBtc2diX2wybGVuKG1zZykpOworCisJCW1lbXNldCgmcmVzdWx0LCAwLCBzaXplb2YocmVzdWx0KSk7CisJCWlmIChzY2NwX3BhcnNlX2hlYWRlcihtc2csICZyZXN1bHQpICE9IDApIHsKKwkJCWZwcmludGYoc3RkZXJyLCAiRmFpbGVkIHRvIHBhcnNlIHRlc3Q6ICVkXG4iLCBjdXJyZW50X3Rlc3QpOworCQl9IGVsc2UgeworCQkJaWYgKHBhcnNlX3Jlc3VsdFtjdXJyZW50X3Rlc3RdLndhbnRlZF9sZW4gIT0gcmVzdWx0LmRhdGFfbGVuKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJVbmV4cGVjdGVkIGRhdGEgbGVuZ3RoLlxuIik7CisJCQkJYWJvcnQoKTsKKwkJCX0KKworCQkJaWYgKHBhcnNlX3Jlc3VsdFtjdXJyZW50X3Rlc3RdLmhhc19zcmNfcmVmKSB7CisJCQkJaWYgKG1lbWNtcChyZXN1bHQuc291cmNlX2xvY2FsX3JlZmVyZW5jZSwKKwkJCQkJICAgJnBhcnNlX3Jlc3VsdFtjdXJyZW50X3Rlc3RdLnNyY19yZWYsCisJCQkJCSAgIHNpemVvZihzdHJ1Y3Qgc2NjcF9zb3VyY2VfcmVmZXJlbmNlKSkgIT0gMCkgeworCQkJCQlmcHJpbnRmKHN0ZGVyciwgIlNSQyBSRUYgZGlkIG5vdCBtYXRjaFxuIik7CisJCQkJCWFib3J0KCk7CisJCQkJfQorCQkJfQorCisJCQlpZiAocGFyc2VfcmVzdWx0W2N1cnJlbnRfdGVzdF0uaGFzX2RzdF9yZWYpIHsKKwkJCQlpZiAobWVtY21wKHJlc3VsdC5kZXN0aW5hdGlvbl9sb2NhbF9yZWZlcmVuY2UsCisJCQkJCSAgICZwYXJzZV9yZXN1bHRbY3VycmVudF90ZXN0XS5kc3RfcmVmLAorCQkJCQkgICBzaXplb2Yoc3RydWN0IHNjY3Bfc291cmNlX3JlZmVyZW5jZSkpICE9IDApIHsKKwkJCQkJZnByaW50ZihzdGRlcnIsICJEU1QgUkVGIGRpZCBub3QgbWF0Y2hcbiIpOworCQkJCQlhYm9ydCgpOworCQkJCX0KKwkJCX0KKworCQkJaWYgKHBhcnNlX3Jlc3VsdFtjdXJyZW50X3Rlc3RdLnNyY19zc24gIT0gLTEpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIk5vdCBpbXBsZW1lbnRlZC5cbiIpOworCQkJCWFib3J0KCk7CisJCQl9CisKKwkJCWlmIChwYXJzZV9yZXN1bHRbY3VycmVudF90ZXN0XS5kc3Rfc3NuICE9IC0xKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJOb3QgaW1wbGVtZW50ZWQuXG4iKTsKKwkJCQlhYm9ydCgpOworCQkJfQorCQl9CisKKwkJbXNnYl9mcmVlKG1zZyk7CisJfQorfQorCisKK2ludCBtYWluKGludCBhcmdjLCBjaGFyICoqYXJndikKK3sKKwl0ZXN0X3NjY3Bfc3lzdGVtKCk7CisJdGVzdF9zY2NwX3NlbmRfdWR0KCk7CisJdGVzdF9zY2NwX3VkdF9jb21tdW5pY2F0aW9uKCk7CisJdGVzdF9zY2NwX2Nvbm5lY3Rpb24oKTsKKwl0ZXN0X3NjY3Bfc3lzdGVtX2NyYXNoKCk7CisJdGVzdF9zY2NwX3BhcnNpbmcoKTsKKwlyZXR1cm4gMDsKK30KKwordm9pZCBkYl9zdG9yZV9jb3VudGVyKCkge30KZGlmZiAtLWdpdCBhL29wZW5ic2MvdGVzdHMvc21zLnR4dCBiL29wZW5ic2MvdGVzdHMvc21zLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNmM4ODViCi0tLSAvZGV2L251bGwKKysrIGIvb3BlbmJzYy90ZXN0cy9zbXMudHh0CkBAIC0wLDAgKzEsNTAgQEAKKzAzIDAyIDAxIDBhIDAyIDQzIDBiIDAwIDFkIDM5IDAxIDFhIDAwIDAxIDAwIDA3IDkxIDU1IDExIDE4IDMxIDI4IDAwIDBlIDMxIDIwIDA0IDgxIDIxIDQzIDAwIDAwIGZmIDA0IGQ0IGYyIDljIDBlCisKKzAzIDAyIDAxIDBhIDAyIDQzIDBiIDAwIDFkIC0KKzM5IC0gVHJhbnNhY3Rpb25JRCAzLCBTTVMgbWVzc2FnZXMJOjogZ2gtPnByb3RvX2Rpc2NyCiswMSAtIENQLURBVEEJCQkJOjogZ2gtPm1zZ190eXBlCisxYSAtIExlbmd0aDogMjYJCQkJOjogZ2gtPmRhdGFbMF0KKzAwIC0gTVRJIDAgUlAtREFUQSAobXMtPm4pCiswMSAtIE1SIDEKKzAwIC0gUlAtT0EKKzA3IC0gUlAtREEgKFNNU0MgTGVuZ3RoKQorOTEgLSBJbnRlcm5hdGlvbmFsIE5vLCBOdW1iZXJpbmcgUGxhbgorNTUgMTEgMTggMzEgMjggMDAgLSA1NTExODExMzgyMDAKKzBlIC0gUlAtVUQgbGVuICgxNCkKKworVFBEVSAoMTQgYnl0ZSk6CiszMSAtIE1USSgwMSksIFZQRigyOnJlbGF0aXZlKSwgTU1TKDApLCBTUkkoMSksIFVESEkoMCksIFJQKDApCisyMCAtIE1lc3NhZ2UgUmVmZXJlbmNlCiswNCAtIERBIGxlbmd0aAorODEgLSBOdW1iZXJpbmcgUGxhbiwgTmF0aW9uYWwgbnVtYmVyCisyMSA0MyAtIERBIDEyMzQKKzAwIC0gUElECiswMCAtIERDUworZmYgLSBWYWxpZGl0eSBwZXJpb2QKKzA0IC0gVXNlciBEYXRhIGxlbmd0aCAoMDQpCitkNCBmMiA5YyAwZSAtIGdzbV9kZWZhdWx0IDdiaXQgZW5jb2RlZCAiVGVzdCIgKDQgYnl0ZSkKKworMDMgMDIgMDEgMGEgMDIgNDMgMGIgMDAgOWYgMDkgMDEgOWMgMDAgZGEgMDAgMDcgOTEgODggOTYgMTMgMDAgMDAgOTkgOTAgMTEgN2IgMDQgODEgMjIgMjIgMDAgMDggZmYgODYgNmMgMzggOGMgNTAgOTIgODAgODggNGMgMDAgNGQgMDAgNGQgMDAgNDEgNmEgMTkgNjcgMDMgNzQgMDYgOGMgYTEgN2QgYjIgMDAgMjAgMDAgMjAgNTEgNjggNzQgMDMgOTkgOTYgNTIgNzUgN2QgYjIgOGQgZWYgNmEgMTkgNjcgMDMgZmYgMGMgNmEgMTkgNjcgMDMgOTYgZjYgOTggYTggOTYgYWEgZmYgMDEgOGIgOTMgNjAgYTggODAgNzAgNjYgMGUgNTEgMzIgODQgYzQgZmYgMGMgOTcgNDggNmQgM2IgNjIgOTUgOGMgYzcgZmYgMDEgNzMgZmUgNTcgMjggNTIgYTAgNTEgNjUgOTAgMDEgOTYgNTAgOTEgY2YgNTkgMjcgODAgNmYgNzYgZGYgNmQgMGIgNTcgZmEgOTYgOGEgOTEgNzcgNWUgNjMgNTMgNjEgZmYgMGMgOGEgY2IgNGUgMGEgN2QgYjIgNjQgMWMgNWMgMGIgMzAgMGMgNmEgMTkgNjcgMDMgMzAgMGQKKworMDMgMDIgMDEgMGEgMDIgNDMgMGIgMDAgOWYgLSBsb3dlciBsZXZlbHMKKzA5IC0gVHJhbnNhY3Rpb25JRCAwLCBTTVMgbWVzc2FnZXMKKzAxIC0gQ1AtREFUQQorOWMgLSBMZW5ndGg6ICgxNTYpCiswMCAtIE1USSAwIFJQLURBVEEgKG1zLT5uKQorZGEgLSBNUiAoPykKKzAwIC0gUlAtT0EKKzA3IC0gUlAtREEgKFNNU0MgTGVuZ3RoKQorOTEgLSBJbnRlcm5hdGlvbmFsIE5vLgorODggOTYgMTMgMDAgMDAgOTkKKzkwIC0gUlAtVUQgbGVuICgxNDQpCisxMSAtCis3YiAtIE1lc3NhZ2UgUmVmZXJlbmNlCiswNCAtIERBIGxlbmd0aAorODEgLSBOdW1iZXJpbmcgUGxhbgorMjIgMjIgLSBBZGRyZXNzIDIyMjIKKzAwIC0gUElECiswOCAtIERDUyAoVUNTMiBjaGFyc2V0KQorZmYgLSBWYWxpZGl0eSBwZXJpb2QKKzg2IC0gVXNlciBEYXRhIGxlbmd0aCAoMTM0KQorNmMgMzggOGMgNTAgOTIgODAgODggNGMgMDAgNGQgMDAgNGQgMDAgNDEgNmEgMTkgNjcgMDMgNzQgMDYgOGMgYTEgN2QgYjIgMDAgMjAgMDAgMjAgNTEgNjggNzQgMDMgOTkgOTYgNTIgNzUgN2QgYjIgOGQgZWYgNmEgMTkgNjcgMDMgZmYgMGMgNmEgMTkgNjcgMDMgOTYgZjYgOTggYTggOTYgYWEgZmYgMDEgOGIgOTMgNjAgYTggODAgNzAgNjYgMGUgNTEgMzIgODQgYzQgZmYgMGMgOTcgNDggNmQgM2IgNjIgOTUgOGMgYzcgZmYgMDEgNzMgZmUgNTcgMjggNTIgYTAgNTEgNjUgOTAgMDEgOTYgNTAgOTEgY2YgNTkgMjcgODAgNmYgNzYgZGYgNmQgMGIgNTcgZmEgOTYgOGEgOTEgNzcgNWUgNjMgNTMgNjEgZmYgMGMgOGEgY2IgNGUgMGEgN2QgYjIgNjQgMWMgNWMgMGIgMzAgMGMgNmEgMTkgNjcgMDMgMzAgMGQKKwpkaWZmIC0tZ2l0IGEvb3BlbmJzYy90b29scy9obHJzdGF0LnBsIGIvb3BlbmJzYy90b29scy9obHJzdGF0LnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjY2OGZjOWEKLS0tIC9kZXYvbnVsbAorKysgYi9vcGVuYnNjL3Rvb2xzL2hscnN0YXQucGwKQEAgLTAsMCArMSw3MyBAQAorIyEvdXNyL2Jpbi9wZXJsCisKK3VzZSBzdHJpY3Q7Cit1c2UgREJJOworbXkgJGRiaCA9IERCSS0+Y29ubmVjdCgiZGJpOlNRTGl0ZTpkYm5hbWU9aGxyLnNxbGl0ZTMiLCIiLCIiKTsKKworCitteSAlbWNjX25hbWVzOworbXkgJW1jY19tbmNfbmFtZXM7CisKK3N1YiBnZXRfbWNjX21uY19uYW1lKCQpCit7CisJbXkgJG1jY19tbmMgPSBzaGlmdDsKKwlteSAkcmV0ID0gJG1jY19tbmM7CisKKwlpZiAoJG1jY19tbmNfbmFtZXN7JG1jY19tbmN9IG5lICcnKSB7CisJCSRyZXQgPSAkbWNjX21uY19uYW1lc3skbWNjX21uY307CisJfQorCisJcmV0dXJuICRyZXQ7Cit9CisKK3N1YiByZWFkX25ldHdvcmtzKCQpCit7CisJbXkgJGZpbGVuYW1lID0gc2hpZnQ7CisJbXkgJGN1cl9uYW1lOworCisJb3BlbihJTkZJTEUsICRmaWxlbmFtZSk7CisJd2hpbGUgKG15ICRsID0gPElORklMRT4pIHsKKwkJY2hvbXAoJGwpOworCQlpZiAoJGwgPX4gL14jLykgeworCQkJbmV4dDsKKwkJfQorCQlpZiAoJGwgPX4gL15cdC8pIHsKKwkJCW15ICgkbWNjLCAkbW5jLCAkYnJhbmQsICRyKSA9IHNwbGl0KCcgJywgJGwsIDQpOworCQkJI3ByaW50ZigiJXN8JXN8JXNcbiIsICRtY2MsICRtbmMsICRicmFuZCk7CisJCQkkbWNjX21uY19uYW1lc3siJG1jYy0kbW5jIn0gPSAkYnJhbmQ7CisJCQkkbWNjX25hbWVzeyRtY2N9ID0gJGN1cl9uYW1lOworCQl9IGVsc2lmICgkbCA9fiAvXihcd1x3KVx0KC4qKS8pIHsKKwkJCSNwcmludGYoIiVzfCVzXG4iLCAkMSwgJDIpOworCQkJJGN1cl9uYW1lID0gJDI7CisJCX0KKwl9CisJY2xvc2UoSU5GSUxFKTsKK30KKworcmVhZF9uZXR3b3JrcygibmV0d29ya3MudGFiIik7CisKK215ICVvcGVyX2NvdW50OworbXkgJWNvdW50cnlfY291bnQ7CisKKyNteSAkc3RoID0gJGRiaC0+cHJlcGFyZSgiU0VMRUNUIGltc2kgRlJPTSBzdWJzY3JpYmVyIHdoZXJlIGF1dGhvcml6ZWQ9MSIpOworbXkgJHN0aCA9ICRkYmgtPnByZXBhcmUoIlNFTEVDVCBpbXNpIEZST00gc3Vic2NyaWJlciIpOworCiskc3RoLT5leGVjdXRlKCk7CisKK3doaWxlIChteSAkaHJlZiA9ICRzdGgtPmZldGNocm93X2hhc2hyZWYpIHsKKwlteSAoJG1jYywgJG1uYykgPSAkJGhyZWZ7aW1zaX0gPX4gLyhcZHszfSkoXGR7Mn0pLiovOworCSNwcmludGYoIiVzICVzLSVzIFxuIiwgJCRocmVme2ltc2l9LCAkbWNjLCAkbW5jKTsKKwkkb3Blcl9jb3VudHsiJG1jYy0kbW5jIn0rKzsKKwkkY291bnRyeV9jb3VudHskbWNjfSsrOworfQorCisKK2ZvcmVhY2ggbXkgJGMgKHNvcnR7JGNvdW50cnlfY291bnR7JGJ9IDw9PiAkY291bnRyeV9jb3VudHskYX19IGtleXMgJWNvdW50cnlfY291bnQpIHsKKwlwcmludGYoIiVzOiAlZFxuIiwgJG1jY19uYW1lc3skY30sICRjb3VudHJ5X2NvdW50eyRjfSk7CisKKwlmb3JlYWNoIG15ICRrIChzb3J0eyRvcGVyX2NvdW50eyRifSA8PT4gJG9wZXJfY291bnR7JGF9fSBrZXlzICVvcGVyX2NvdW50KSB7CisJCWlmICgkayA9fiAvXiRjLS8pIHsKKwkJCXByaW50ZigiXHQlczogJWRcbiIsIGdldF9tY2NfbW5jX25hbWUoJGspLCAkb3Blcl9jb3VudHska30pOworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvLmdpdGlnbm9yZSBiL3JybHAtZXBoZW1lcmlzLy5naXRpZ25vcmUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODhiNDVlNAotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzLy5naXRpZ25vcmUKQEAgLTAsMCArMSw0IEBACithc24xX2dlbi8qCisqLm8KKyouYQorcnJscC10ZXN0CmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9DT1BZSU5HIGIvcnJscC1lcGhlbWVyaXMvQ09QWUlORwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZDcwODhlCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvQ09QWUlORwpAQCAtMCwwICsxLDIgQEAKK1NlZSB0aGUgaW5jbHVkZWQgZ3BsLTIuMC50eHQgb3IgZ3BsLTMuMC50eHQgZGVwZW5kaW5nIG9uIHlvdXIKK3ByZWZlcmVuY2VzLgpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvTWFrZWZpbGUgYi9ycmxwLWVwaGVtZXJpcy9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDJjYWM3Ci0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvTWFrZWZpbGUKQEAgLTAsMCArMSw0NCBAQAorCitBU04xQz0uLi8uLi8uLi90bXAvcnJscC9hc24xYy9hc24xYy9hc24xYworQVNOMV9JTkNMVURFPS9ob21lL3RudC90bXAvcnJscC9hc24xYy9za2VsZXRvbnMKK0NDPWdjYworQ0ZMQUdTPS1JJChBU04xX0lOQ0xVREUpIC1JYXNuMV9nZW4gLU8zIC1XYWxsCisKK0FTTjFfRklMRVM9JCh3aWxkY2FyZCBhc24xLyouYXNuKQorCisKK2FsbDogcnJscC10ZXN0CisKKworcnJscC10ZXN0OiBsaWJnc20tYXNuMS5hIGdwcy5vIHVieC5vIHVieC1wYXJzZS5vIHJybHAubyBtYWluLm8KKwkkKENDKSAtbyAkQCBncHMubyB1YngubyB1YngtcGFyc2UubyBycmxwLm8gbWFpbi5vIC1MLiAtbGdzbS1hc24xIC1sbQorCisKKyMKKyMgQVNOMSBmaWxlIGF1dG9nZW5lcmF0aW9uIChuZWVkIHJlY3Vyc2l2ZSBtYWtlZmlsZSBjYWxsKQorIworCitBU04xX1NPVVJDRVMgPSAkKHdpbGRjYXJkIGFzbjFfZ2VuLyouYykKK0FTTjFfT0JKRUNUUyA9ICQoQVNOMV9TT1VSQ0VTOi5jPS5vKQorCitsaWJnc20tYXNuMS5hOiAkKEFTTjFfRklMRVMpCisJbWtkaXIgLXAgYXNuMV9nZW4gJiYgXAorCWNkIGFzbjFfZ2VuICYmIFwKKwkkKEFTTjFDKSAtZnNrZWxldG9ucy1jb3B5IC1mbmF0aXZlLXR5cGVzIC1nZW4tUEVSICQoYWRkcHJlZml4IC4uLywkXikKKwlAcm0gYXNuMV9nZW4vY29udmVydGVyLXNhbXBsZS5jIGFzbjFfZ2VuL01ha2VmaWxlLmFtLnNhbXBsZQorCUAkKE1BS0UpIGxpYmdzbS1hc24xLmEuc3VibWFrZQorCitsaWJnc20tYXNuMS5hLnN1Ym1ha2U6ICQoQVNOMV9PQkpFQ1RTKQorCSQoQVIpIHJjcyBsaWJnc20tYXNuMS5hICReCisKKy5QSE9OWTogbGliZ3NtLWFzbjEuYS5zdWJtYWtlCisKKworIworIyBDbGVhbgorIworCitjbGVhbjoKKwlybSAtUmYgYXNuMV9nZW4KKwlybSAtZiBsaWJnc20tYXNuMS5hICoubyBycmxwLXRlc3QKKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtQlMtQ29kZS5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1CUy1Db2RlLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDI1MzY2Ci0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtQlMtQ29kZS5hc24KQEAgLTAsMCArMSwxMzEgQEAKKy0tICRJZDogTUFQLUJTLUNvZGUuYXNuIDI4MTQ5IDIwMDktMDQtMjUgMTc6NDU6MzRaIGV0eHJhYiAkCistLSAzR1BQIFRTIDI5LjAwMiBWOC45LjAgKDIwMDktMDQpIAorLS0gMTcuNy4xMAlCZWFyZXIgU2VydmljZSBDb2RlcworIAorTUFQLUJTLUNvZGUgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtQlMtQ29kZSAoMjApIHZlcnNpb24xMSAoMTEpfQorCitERUZJTklUSU9OUworCis6Oj0KKworQkVHSU4KKworQmVhcmVyU2VydmljZUNvZGUgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gVGhpcyB0eXBlIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBjb2RlIGlkZW50aWZ5aW5nIGEgc2luZ2xlCisJLS0gYmVhcmVyIHNlcnZpY2UsIGEgZ3JvdXAgb2YgYmVhcmVyIHNlcnZpY2VzLCBvciBhbGwgYmVhcmVyCisJLS0gc2VydmljZXMuIFRoZSBzZXJ2aWNlcyBhcmUgZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIyLjAwMiBbM10uCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisJLS0KKwktLSBwbG1uLXNwZWNpZmljIGJlYXJlciBzZXJ2aWNlczoKKwktLSBiaXRzIDg3NjU0MzIxOiBkZWZpbmVkIGJ5IHRoZSBIUExNTiBvcGVyYXRvcgorCisJLS0gcmVzdCBvZiBiZWFyZXIgc2VydmljZXM6CisJLS0gYml0IDg6IDAgKHVudXNlZCkKKwktLSBiaXRzIDc2NTQzMjE6IGdyb3VwIChiaXRzIDc2NTQpLCBhbmQgcmF0ZSwgaWYgYXBwbGljYWJsZQorCS0tIChiaXRzIDMyMSkKKworRXh0LUJlYXJlclNlcnZpY2VDb2RlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjUpKQorCS0tIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgY29kZSBpZGVudGlmeWluZyBhIHNpbmdsZQorCS0tIGJlYXJlciBzZXJ2aWNlLCBhIGdyb3VwIG9mIGJlYXJlciBzZXJ2aWNlcywgb3IgYWxsIGJlYXJlcgorCS0tIHNlcnZpY2VzLiBUaGUgc2VydmljZXMgYXJlIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMi4wMDIgWzNdLgorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCS0tCisJLS0gT0NURVQgMToKKwktLSBwbG1uLXNwZWNpZmljIGJlYXJlciBzZXJ2aWNlczoKKwktLSBiaXRzIDg3NjU0MzIxOiBkZWZpbmVkIGJ5IHRoZSBIUExNTiBvcGVyYXRvcgorCS0tCisJLS0gcmVzdCBvZiBiZWFyZXIgc2VydmljZXM6CisJLS0gYml0IDg6IDAgKHVudXNlZCkKKwktLSBiaXRzIDc2NTQzMjE6IGdyb3VwIChiaXRzIDc2NTQpLCBhbmQgcmF0ZSwgaWYgYXBwbGljYWJsZQorCS0tIChiaXRzIDMyMSkKKworCS0tIE9DVEVUUyAyLTU6IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiBJZiByZWNlaXZlZCB0aGUKKyAgICAtLSBFeHQtVGVsZXNlcnZpY2VDb2RlIHNoYWxsIGJlCisJLS0gdHJlYXRlZCBhY2NvcmRpbmcgdG8gdGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBkZWZpbmVkIGZvciB0aGUKKwktLSBvcGVyYXRpb24gdGhhdCB1c2VzIHRoaXMgdHlwZS4gCisKKworCS0tIEV4dC1CZWFyZXJTZXJ2aWNlQ29kZSBpbmNsdWRlcyBhbGwgdmFsdWVzIGRlZmluZWQgZm9yIEJlYXJlclNlcnZpY2VDb2RlLgorCithbGxCZWFyZXJTZXJ2aWNlcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDAwMDAwJ0IKKworYWxsRGF0YUNEQS1TZXJ2aWNlcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMDAwJ0IKK2RhdGFDREEtMzAwYnBzCQlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMDAxJ0IKK2RhdGFDREEtMTIwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMDEwJ0IKK2RhdGFDREEtMTIwMC03NWJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMDExJ0IKK2RhdGFDREEtMjQwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMTAwJ0IKK2RhdGFDREEtNDgwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMTAxJ0IKK2RhdGFDREEtOTYwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMTEwJ0IKK2dlbmVyYWwtZGF0YUNEQQlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMTExJ0IKKworYWxsRGF0YUNEUy1TZXJ2aWNlcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDExMDAwJ0IKK2RhdGFDRFMtMTIwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDExMDEwJ0IKK2RhdGFDRFMtMjQwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDExMTAwJ0IKK2RhdGFDRFMtNDgwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDExMTAxJ0IKK2RhdGFDRFMtOTYwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDExMTEwJ0IKK2dlbmVyYWwtZGF0YUNEUwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMDExMTExJ0IKKworYWxsUGFkQWNjZXNzQ0EtU2VydmljZXMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMDAwMCdCCitwYWRBY2Nlc3NDQS0zMDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMDAwMSdCCitwYWRBY2Nlc3NDQS0xMjAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDAwMTAnQgorcGFkQWNjZXNzQ0EtMTIwMC03NWJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTAwMDExJ0IKK3BhZEFjY2Vzc0NBLTI0MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMDEwMCdCCitwYWRBY2Nlc3NDQS00ODAwYnBzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMDAxMDEnQgorcGFkQWNjZXNzQ0EtOTYwMGJwcwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTAwMTEwJ0IKK2dlbmVyYWwtcGFkQWNjZXNzQ0EJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMDExMSdCCisKK2FsbERhdGFQRFMtU2VydmljZXMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMTAwMCdCCitkYXRhUERTLTI0MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMTEwMCdCCitkYXRhUERTLTQ4MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMTEwMSdCCitkYXRhUERTLTk2MDBicHMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMTExMCdCCitnZW5lcmFsLWRhdGFQRFMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMDEwMTExMSdCCisKK2FsbEFsdGVybmF0ZVNwZWVjaC1EYXRhQ0RBCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDAxMTAwMDAnQgorCithbGxBbHRlcm5hdGVTcGVlY2gtRGF0YUNEUwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAwMTExMDAwJ0IKKworYWxsU3BlZWNoRm9sbG93ZWRCeURhdGFDREEJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMTAwMDAwMCdCCisKK2FsbFNwZWVjaEZvbGxvd2VkQnlEYXRhQ0RTCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDEwMDEwMDAnQgorCistLSBUaGUgZm9sbG93aW5nIG5vbi1oaWVyYXJjaGljYWwgQ29tcG91bmQgQmVhcmVyIFNlcnZpY2UKKy0tIEdyb3VwcyBhcmUgZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIyLjAzMDoKK2FsbERhdGFDaXJjdWl0QXN5bmNocm9ub3VzCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMDEwMTAwMDAnQgorCS0tIGNvdmVycyAiYWxsRGF0YUNEQS1TZXJ2aWNlcyIsICJhbGxBbHRlcm5hdGVTcGVlY2gtRGF0YUNEQSIgYW5kCisJLS0gImFsbFNwZWVjaEZvbGxvd2VkQnlEYXRhQ0RBIgorYWxsQXN5bmNocm9ub3VzU2VydmljZXMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMTEwMDAwMCdCCisJLS0gY292ZXJzICJhbGxEYXRhQ0RBLVNlcnZpY2VzIiwgImFsbEFsdGVybmF0ZVNwZWVjaC1EYXRhQ0RBIiwKKwktLSAiYWxsU3BlZWNoRm9sbG93ZWRCeURhdGFDREEiIGFuZCAiYWxsUGFkQWNjZXNzQ0RBLVNlcnZpY2VzIgorYWxsRGF0YUNpcmN1aXRTeW5jaHJvbm91cwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzAxMDExMDAwJ0IKKwktLSBjb3ZlcnMgImFsbERhdGFDRFMtU2VydmljZXMiLCAiYWxsQWx0ZXJuYXRlU3BlZWNoLURhdGFDRFMiIGFuZAorCS0tICJhbGxTcGVlY2hGb2xsb3dlZEJ5RGF0YUNEUyIKK2FsbFN5bmNocm9ub3VzU2VydmljZXMJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcwMTEwMTAwMCdCCisJLS0gY292ZXJzICJhbGxEYXRhQ0RTLVNlcnZpY2VzIiwgImFsbEFsdGVybmF0ZVNwZWVjaC1EYXRhQ0RTIiwKKwktLSAiYWxsU3BlZWNoRm9sbG93ZWRCeURhdGFDRFMiIGFuZCAiYWxsRGF0YVBEUy1TZXJ2aWNlcyIKKy0tCistLSBDb21wb3VuZCBCZWFyZXIgU2VydmljZSBHcm91cCBDb2RlcyBhcmUgb25seSB1c2VkIGluIGNhbGwKKy0tIGluZGVwZW5kZW50IHN1cHBsZW1lbnRhcnkgc2VydmljZSBvcGVyYXRpb25zLCBpLmUuIHRoZXkKKy0tIGFyZSBub3QgdXNlZCBpbiBJbnNlcnRTdWJzY3JpYmVyRGF0YSBvciBpbgorLS0gRGVsZXRlU3Vic2NyaWJlckRhdGEgbWVzc2FnZXMuCisKK2FsbFBMTU4tc3BlY2lmaWNCUwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMDAwJ0IKK3BsbW4tc3BlY2lmaWNCUy0xCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTAwMDEnQgorcGxtbi1zcGVjaWZpY0JTLTIJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMDAxMCdCCitwbG1uLXNwZWNpZmljQlMtMwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMDExJ0IKK3BsbW4tc3BlY2lmaWNCUy00CUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTAxMDAnQgorcGxtbi1zcGVjaWZpY0JTLTUJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMDEwMSdCCitwbG1uLXNwZWNpZmljQlMtNglCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMTEwJ0IKK3BsbW4tc3BlY2lmaWNCUy03CUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTAxMTEnQgorcGxtbi1zcGVjaWZpY0JTLTgJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMTAwMCdCCitwbG1uLXNwZWNpZmljQlMtOQlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDExMDAxJ0IKK3BsbW4tc3BlY2lmaWNCUy1BCUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTEwMTAnQgorcGxtbi1zcGVjaWZpY0JTLUIJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMTAxMSdCCitwbG1uLXNwZWNpZmljQlMtQwlCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDExMTAwJ0IKK3BsbW4tc3BlY2lmaWNCUy1ECUJlYXJlclNlcnZpY2VDb2RlIDo6PSAnMTEwMTExMDEnQgorcGxtbi1zcGVjaWZpY0JTLUUJQmVhcmVyU2VydmljZUNvZGUgOjo9ICcxMTAxMTExMCdCCitwbG1uLXNwZWNpZmljQlMtRglCZWFyZXJTZXJ2aWNlQ29kZSA6Oj0gJzExMDExMTExJ0IKKworRU5ECisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUNvbW1vbkRhdGFUeXBlcy5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1Db21tb25EYXRhVHlwZXMuYXNuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzZDIwMmUKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1Db21tb25EYXRhVHlwZXMuYXNuCkBAIC0wLDAgKzEsNjMzIEBACistLSAkSWQ6IE1BUC1Db21tb25EYXRhVHlwZXMuYXNuIDMwNDcwIDIwMDktMTAtMTAgMTI6Mzc6NTZaIGtyaiAkCistLSAzR1BQIFRTIDI5LjAwMiBWOC45LjAgKDIwMDktMDQpCistLSAxNy43LjgJQ29tbW9uIGRhdGEgdHlwZXMKKworTUFQLUNvbW1vbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1Db21tb25EYXRhVHlwZXMgKDE4KSB2ZXJzaW9uMTEgKDExKX0KKworREVGSU5JVElPTlMKKworSU1QTElDSVQgVEFHUworCis6Oj0KKworQkVHSU4KKworRVhQT1JUUworCisJLS0gZ2VuZXJhbCBkYXRhIHR5cGVzIGFuZCB2YWx1ZXMKKwlBZGRyZXNzU3RyaW5nLAorCUlTRE4tQWRkcmVzc1N0cmluZywKKwltYXhJU0ROLUFkZHJlc3NMZW5ndGgsCisJRlROLUFkZHJlc3NTdHJpbmcsCisJSVNETi1TdWJhZGRyZXNzU3RyaW5nLAorCUV4dGVybmFsU2lnbmFsSW5mbywgCisJRXh0LUV4dGVybmFsU2lnbmFsSW5mbywgCitBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbywKKwlTaWduYWxJbmZvLAorCW1heFNpZ25hbEluZm9MZW5ndGgsCisJQWxlcnRpbmdQYXR0ZXJuLAorCVRCQ0QtU1RSSU5HLAorCisJLS0gZGF0YSB0eXBlcyBmb3IgbnVtYmVyaW5nIGFuZCBpZGVudGlmaWNhdGlvbgorCUlNU0ksCisJVE1TSSwgCisJSWRlbnRpdHksCisJU3Vic2NyaWJlcklkLAorCUlNRUksCisJSExSLUxpc3QsCisJTE1TSSwKKwlHbG9iYWxDZWxsSWQsCisJTmV0d29ya1Jlc291cmNlLAorCUFkZGl0aW9uYWxOZXR3b3JrUmVzb3VyY2UsCisJTkFFQS1QcmVmZXJyZWRDSSwgCisJTkFFQS1DSUMsIAorCUFTQ0ktQ2FsbFJlZmVyZW5jZSwKKwlTdWJzY3JpYmVySWRlbnRpdHksCisJUExNTi1JZCwKKworCS0tIGRhdGEgdHlwZXMgZm9yIENBTUVMCisJQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUksIAorCUNlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZEZpeGVkTGVuZ3RoLAorCUxBSUZpeGVkTGVuZ3RoLAorCisJLS0gZGF0YSB0eXBlcyBmb3Igc3Vic2NyaWJlciBtYW5hZ2VtZW50CisJQmFzaWNTZXJ2aWNlQ29kZSwKKwlFeHQtQmFzaWNTZXJ2aWNlQ29kZSwKKwlFTUxQUC1JbmZvLAorCUVNTFBQLVByaW9yaXR5LCAKKwlNQy1TUy1JbmZvLAorCU1heE1DLUJlYXJlcnMsCisJTUMtQmVhcmVycywKKwlFeHQtU1MtU3RhdHVzLAorCisJLS0gZGF0YSB0eXBlcyBmb3IgZ2VvZ3JhcGhpYyBsb2NhdGlvbgorCUFnZU9mTG9jYXRpb25JbmZvcm1hdGlvbiwKKwlMQ1NDbGllbnRFeHRlcm5hbElELAorCUxDU0NsaWVudEludGVybmFsSUQsCisJTENTU2VydmljZVR5cGVJRCwKKy0tLSBXUyBhZGRlZCBleHBvcnRzIG5lZWRlZCBieSBnc21fbWFwLmFzbiAoZXh0cmEgYXNuMSBmaWxlIHRvIGhhbmRsZSBvbGRlciBwcm90LiB2ZXIuKQorCVByb3RvY29sSWQsCisJTENTU2VydmljZVR5cGVJRAkKKzsKKworSU1QT1JUUworCVRlbGVzZXJ2aWNlQ29kZSwKKwlFeHQtVGVsZXNlcnZpY2VDb2RlCitGUk9NIE1BUC1UUy1Db2RlIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVRTLUNvZGUgKDE5KSB2ZXJzaW9uMTEgKDExKX0KKworCUJlYXJlclNlcnZpY2VDb2RlLAorCUV4dC1CZWFyZXJTZXJ2aWNlQ29kZQorRlJPTSBNQVAtQlMtQ29kZSB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1CUy1Db2RlICgyMCkgdmVyc2lvbjExICgxMSl9CisKKwlTUy1Db2RlCitGUk9NIE1BUC1TUy1Db2RlIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLVNTLUNvZGUgKDE1KSB2ZXJzaW9uMTEgKDExKX0KKworCUV4dGVuc2lvbkNvbnRhaW5lcgorRlJPTSBNQVAtRXh0ZW5zaW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUV4dGVuc2lvbkRhdGFUeXBlcyAoMjEpIHZlcnNpb24xMSAoMTEpfQorOworCisKKy0tIGdlbmVyYWwgZGF0YSB0eXBlcworCitUQkNELVNUUklORyA6Oj0gT0NURVQgU1RSSU5HCisJLS0gVGhpcyB0eXBlIChUZWxlcGhvbnkgQmluYXJ5IENvZGVkIERlY2ltYWwgU3RyaW5nKSBpcyB1c2VkIHRvCisJLS0gcmVwcmVzZW50IHNldmVyYWwgZGlnaXRzIGZyb20gMCB0aHJvdWdoIDksICosICMsIGEsIGIsIGMsIHR3bworCS0tIGRpZ2l0cyBwZXIgb2N0ZXQsIGVhY2ggZGlnaXQgZW5jb2RlZCAwMDAwIHRvIDEwMDEgKDAgdG8gOSksCisJLS0gMTAxMCAoKiksIDEwMTEgKCMpLCAxMTAwIChhKSwgMTEwMSAoYikgb3IgMTExMCAoYyk7IDExMTEgdXNlZAorCS0tIGFzIGZpbGxlciB3aGVuIHRoZXJlIGlzIGFuIG9kZCBudW1iZXIgb2YgZGlnaXRzLgorCisJLS0gYml0cyA4NzY1IG9mIG9jdGV0IG4gZW5jb2RpbmcgZGlnaXQgMm4KKwktLSBiaXRzIDQzMjEgb2Ygb2N0ZXQgbiBlbmNvZGluZyBkaWdpdCAyKG4tMSkgKzEKKworQWRkcmVzc1N0cmluZyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhBZGRyZXNzTGVuZ3RoKSkKKwktLSBUaGlzIHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgYSBudW1iZXIgZm9yIGFkZHJlc3NpbmcKKwktLSBwdXJwb3Nlcy4gSXQgaXMgY29tcG9zZWQgb2YKKwktLQlhKQlvbmUgb2N0ZXQgZm9yIG5hdHVyZSBvZiBhZGRyZXNzLCBhbmQgbnVtYmVyaW5nIHBsYW4KKwktLQkJaW5kaWNhdG9yLgorCS0tCWIpCWRpZ2l0cyBvZiBhbiBhZGRyZXNzIGVuY29kZWQgYXMgVEJDRC1TdHJpbmcuCisKKwktLSBhKQlUaGUgZmlyc3Qgb2N0ZXQgaW5jbHVkZXMgYSBvbmUgYml0IGV4dGVuc2lvbiBpbmRpY2F0b3IsIGEKKwktLQkJMyBiaXRzIG5hdHVyZSBvZiBhZGRyZXNzIGluZGljYXRvciBhbmQgYSA0IGJpdHMgbnVtYmVyaW5nCisJLS0JCXBsYW4gaW5kaWNhdG9yLCBlbmNvZGVkIGFzIGZvbGxvd3M6CisKKwktLSBiaXQgODogMSAgKG5vIGV4dGVuc2lvbikKKworCS0tIGJpdHMgNzY1OiBuYXR1cmUgb2YgYWRkcmVzcyBpbmRpY2F0b3IKKwktLQkwMDAgIHVua25vd24KKwktLQkwMDEgIGludGVybmF0aW9uYWwgbnVtYmVyCisJLS0JMDEwICBuYXRpb25hbCBzaWduaWZpY2FudCBudW1iZXIKKwktLQkwMTEgIG5ldHdvcmsgc3BlY2lmaWMgbnVtYmVyCisJLS0JMTAwICBzdWJzY3JpYmVyIG51bWJlcgorCS0tCTEwMSAgcmVzZXJ2ZWQKKwktLQkxMTAgIGFiYnJldmlhdGVkIG51bWJlcgorCS0tCTExMSAgcmVzZXJ2ZWQgZm9yIGV4dGVuc2lvbgorCisJLS0gYml0cyA0MzIxOiBudW1iZXJpbmcgcGxhbiBpbmRpY2F0b3IKKwktLQkwMDAwICB1bmtub3duCisJLS0JMDAwMSAgSVNETi9UZWxlcGhvbnkgTnVtYmVyaW5nIFBsYW4gKFJlYyBJVFUtVCBFLjE2NCkKKwktLQkwMDEwICBzcGFyZQorCS0tCTAwMTEgIGRhdGEgbnVtYmVyaW5nIHBsYW4gKElUVS1UIFJlYyBYLjEyMSkKKwktLQkwMTAwICB0ZWxleCBudW1iZXJpbmcgcGxhbiAoSVRVLVQgUmVjIEYuNjkpCisJLS0JMDEwMSAgc3BhcmUKKwktLQkwMTEwICBsYW5kIG1vYmlsZSBudW1iZXJpbmcgcGxhbiAoSVRVLVQgUmVjIEUuMjEyKQorCS0tCTAxMTEgIHNwYXJlCisJLS0JMTAwMCAgbmF0aW9uYWwgbnVtYmVyaW5nIHBsYW4KKwktLQkxMDAxICBwcml2YXRlIG51bWJlcmluZyBwbGFuCisJLS0JMTExMSAgcmVzZXJ2ZWQgZm9yIGV4dGVuc2lvbgorCisJLS0JYWxsIG90aGVyIHZhbHVlcyBhcmUgcmVzZXJ2ZWQuCisKKwktLSBiKQlUaGUgZm9sbG93aW5nIG9jdGV0cyByZXByZXNlbnRpbmcgZGlnaXRzIG9mIGFuIGFkZHJlc3MKKwktLQkJZW5jb2RlZCBhcyBhIFRCQ0QtU1RSSU5HLgorCittYXhBZGRyZXNzTGVuZ3RoICBJTlRFR0VSIDo6PSAyMAorCitJU0ROLUFkZHJlc3NTdHJpbmcgOjo9IAorCQkJQWRkcmVzc1N0cmluZyAoU0laRSAoMS4ubWF4SVNETi1BZGRyZXNzTGVuZ3RoKSkKKwktLSBUaGlzIHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgSVNETiBudW1iZXJzLgorCittYXhJU0ROLUFkZHJlc3NMZW5ndGggIElOVEVHRVIgOjo9IDkKKworRlROLUFkZHJlc3NTdHJpbmcgOjo9IAorCQkJQWRkcmVzc1N0cmluZyAoU0laRSAoMS4ubWF4RlROLUFkZHJlc3NMZW5ndGgpKQorCS0tIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHJlcHJlc2VudCBmb3J3YXJkZWQtdG8gbnVtYmVycy4gCisJLS0gSWYgTkFJID0gaW50ZXJuYXRpb25hbCB0aGUgZmlyc3QgZGlnaXRzIHJlcHJlc2VudCB0aGUgY291bnRyeSBjb2RlIChDQykKKwktLSBhbmQgdGhlIG5ldHdvcmsgZGVzdGluYXRpb24gY29kZSAoTkRDKSBhcyBmb3IgRS4xNjQuCisKK21heEZUTi1BZGRyZXNzTGVuZ3RoICBJTlRFR0VSIDo6PSAxNQorCitJU0ROLVN1YmFkZHJlc3NTdHJpbmcgOjo9IAorCQkJT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhJU0ROLVN1YmFkZHJlc3NMZW5ndGgpKQorCS0tIFRoaXMgdHlwZSBpcyB1c2VkIHRvIHJlcHJlc2VudCBJU0ROIHN1YmFkZHJlc3Nlcy4KKwktLSBJdCBpcyBjb21wb3NlZCBvZgorCS0tCWEpCW9uZSBvY3RldCBmb3IgdHlwZSBvZiBzdWJhZGRyZXNzIGFuZCBvZGQvZXZlbiBpbmRpY2F0b3IuCisJLS0JYikJMjAgb2N0ZXRzIGZvciBzdWJhZGRyZXNzIGluZm9ybWF0aW9uLgorCisJLS0JYSkJVGhlIGZpcnN0IG9jdGV0IGluY2x1ZGVzIGEgb25lIGJpdCBleHRlbnNpb24gaW5kaWNhdG9yLCBhCisJLS0JCTMgYml0cyB0eXBlIG9mIHN1YmFkZHJlc3MgYW5kIGEgb25lIGJpdCBvZGQvZXZlbiBpbmRpY2F0b3IsCisJLS0JCWVuY29kZWQgYXMgZm9sbG93czoKKworCS0tCWJpdCA4OiAxICAobm8gZXh0ZW5zaW9uKQorCisJLS0JYml0cyA3NjU6IHR5cGUgb2Ygc3ViYWRkcmVzcworCS0tCQkwMDAgIE5TQVAgKFguMjEzL0lTTyA4MzQ4IEFEMikKKwktLQkJMDEwICBVc2VyIFNwZWNpZmllZAorCS0tCQlBbGwgb3RoZXIgdmFsdWVzIGFyZSByZXNlcnZlZAorCisJLS0JYml0IDQ6IG9kZC9ldmVuIGluZGljYXRvcgorCS0tCQkwICBldmVuIG51bWJlciBvZiBhZGRyZXNzIHNpZ25hbHMKKwktLQkJMSAgb2RkIG51bWJlciBvZiBhZGRyZXNzIHNpZ25hbHMKKwktLQkJVGhlIG9kZC9ldmVuIGluZGljYXRvciBpcyB1c2VkIHdoZW4gdGhlIHR5cGUgb2Ygc3ViYWRkcmVzcworCS0tCQlpcyAidXNlciBzcGVjaWZpZWQiIGFuZCB0aGUgY29kaW5nIGlzIEJDRC4KKworCS0tCWJpdHMgMzIxOiAwMDAgKHVudXNlZCkKKworCS0tCWIpIFN1YmFkZHJlc3MgaW5mb3JtYXRpb24uCisJLS0JVGhlIE5TQVAgWC4yMTMvSVNPODM0OEFEMiBhZGRyZXNzIHNoYWxsIGJlIGZvcm1hdHRlZCBhcyBzcGVjaWZpZWQKKwktLQlieSBvY3RldCA0IHdoaWNoIGNvbnRhaW5zIHRoZSBBdXRob3JpdHkgYW5kIEZvcm1hdCBJZGVudGlmaWVyCisJLS0JKEFGSSkuIFRoZSBlbmNvZGluZyBpcyBtYWRlIGFjY29yZGluZyB0byB0aGUgInByZWZlcnJlZCBiaW5hcnkKKwktLQllbmNvZGluZyIgYXMgZGVmaW5lZCBpbiBYLjIxMy9JU084MzRBRDIuIEZvciB0aGUgZGVmaW5pdGlvbgorCS0tCW9mIHRoaXMgdHlwZSBvZiBzdWJhZGRyZXNzLCBzZWUgSVRVLVQgUmVjIEkuMzM0LgorCisJLS0JRm9yIFVzZXItc3BlY2lmaWMgc3ViYWRkcmVzcywgdGhpcyBmaWVsZCBpcyBlbmNvZGVkIGFjY29yZGluZworCS0tCXRvIHRoZSB1c2VyIHNwZWNpZmljYXRpb24sIHN1YmplY3QgdG8gYSBtYXhpbXVtIGxlbmd0aCBvZiAyMAorCS0tCW9jdGV0cy4gV2hlbiBpbnRlcndvcmtpbmcgd2l0aCBYLjI1IG5ldHdvcmtzIEJDRCBjb2Rpbmcgc2hvdWxkCisJLS0JYmUgYXBwbGllZC4KKworbWF4SVNETi1TdWJhZGRyZXNzTGVuZ3RoICBJTlRFR0VSIDo6PSAyMQorCitFeHRlcm5hbFNpZ25hbEluZm8gOjo9IFNFUVVFTkNFIHsKKwlwcm90b2NvbElkCVByb3RvY29sSWQsCisJc2lnbmFsSW5mbwlTaWduYWxJbmZvLAorCS0tIEluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZ2l2ZW4gaW4KKwktLSBjbGF1c2UgNy42LjkuCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwktLSBleHRlbnNpb25Db250YWluZXIgbXVzdCBub3QgYmUgdXNlZCBpbiB2ZXJzaW9uIDIKKwkuLi59CisKK1NpZ25hbEluZm8gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4ubWF4U2lnbmFsSW5mb0xlbmd0aCkpCisKK21heFNpZ25hbEluZm9MZW5ndGggIElOVEVHRVIgOjo9IDIwMAorCS0tIFRoaXMgTmFtZWRWYWx1ZSByZXByZXNlbnRzIHRoZSB0aGVvcmV0aWNhbCBtYXhpbXVtIG51bWJlciBvZiBvY3RldHMgd2hpY2ggaXMKKwktLSBhdmFpbGFibGUgdG8gY2FycnkgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlIFNpZ25hbEluZm8gZGF0YSB0eXBlLAorCS0tIHdpdGhvdXQgcmVxdWlyaW5nIHNlZ21lbnRhdGlvbiB0byBjb3BlIHdpdGggdGhlIG5ldHdvcmsgbGF5ZXIgc2VydmljZS4KKwktLSBIb3dldmVyLCB0aGUgYWN0dWFsIG1heGltdW0gc2l6ZSBhdmFpbGFibGUgZm9yIGFuIGluc3RhbmNlIG9mIHRoZSBkYXRhCisJLS0gdHlwZSBtYXkgYmUgbG93ZXIsIGVzcGVjaWFsbHkgd2hlbiBvdGhlciBpbmZvcm1hdGlvbiBlbGVtZW50cworCS0tIGhhdmUgdG8gYmUgaW5jbHVkZWQgaW4gdGhlIHNhbWUgY29tcG9uZW50LgorCitQcm90b2NvbElkIDo6PSBFTlVNRVJBVEVEIHsKKwlnc20tMDQwOCAgKDEpLAorCWdzbS0wODA2ICAoMiksCisJZ3NtLUJTU01BUCAgKDMpLAorCS0tIFZhbHVlIDMgaXMgcmVzZXJ2ZWQgYW5kIG11c3Qgbm90IGJlIHVzZWQKKwlldHMtMzAwMTAyLTEgICg0KX0KKworRXh0LUV4dGVybmFsU2lnbmFsSW5mbyA6Oj0gU0VRVUVOQ0UgeworCWV4dC1Qcm90b2NvbElkCUV4dC1Qcm90b2NvbElkLAorCXNpZ25hbEluZm8JU2lnbmFsSW5mbywKKwktLSBJbmZvcm1hdGlvbiBhYm91dCB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGdpdmVuIGluCisJLS0gY2xhdXNlIDcuNi45LjEwCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0V4dC1Qcm90b2NvbElkIDo6PSBFTlVNRVJBVEVEIHsKKwlldHMtMzAwMzU2ICAoMSksCisJLi4uIAorCSB9CistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSBGb3IgRXh0LUV4dGVybmFsU2lnbmFsSW5mbyBzZXF1ZW5jZXMgY29udGFpbmluZyB0aGlzIHBhcmFtZXRlciB3aXRoIGFueQorLS0gb3RoZXIgdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZSB0aGUgd2hvbGUgCistLSBFeHQtRXh0ZXJuYWxTaWduYWxJbmZvIHNlcXVlbmNlLgorCitBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbyA6Oj0gU0VRVUVOQ0UgeworCWFjY2Vzc05ldHdvcmtQcm90b2NvbElkCUFjY2Vzc05ldHdvcmtQcm90b2NvbElkLAorCXNpZ25hbEluZm8JTG9uZ1NpZ25hbEluZm8sCisJLS0gSW5mb3JtYXRpb24gYWJvdXQgdGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBnaXZlbiBpbiBjbGF1c2UgNy42LjkuMQorCQorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitMb25nU2lnbmFsSW5mbyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhMb25nU2lnbmFsSW5mb0xlbmd0aCkpCisKK21heExvbmdTaWduYWxJbmZvTGVuZ3RoICBJTlRFR0VSIDo6PSAyNTYwCisJLS0gVGhpcyBOYW1lZCBWYWx1ZSByZXByZXNlbnRzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBvY3RldHMgd2hpY2ggaXMgYXZhaWxhYmxlCisJLS0gdG8gY2FycnkgYSBzaW5nbGUgaW5zdGFuY2Ugb2YgdGhlIExvbmdTaWduYWxJbmZvIGRhdGEgdHlwZSB1c2luZworCS0tIFdoaXRlIEJvb2sgU0NDUCB3aXRoIHRoZSBtYXhpbXVtIG51bWJlciBvZiBzZWdtZW50cy4KKwktLSBJdCB0YWtlcyBhY2NvdW50IG9mIHRoZSBvY3RldHMgdXNlZCBieSB0aGUgbG93ZXIgbGF5ZXJzIG9mIHRoZSBwcm90b2NvbCwgYW5kCisJLS0gb3RoZXIgaW5mb3JtYXRpb24gZWxlbWVudHMgd2hpY2ggbWF5IGJlIGluY2x1ZGVkIGluIHRoZSBzYW1lIGNvbXBvbmVudC4KKworQWNjZXNzTmV0d29ya1Byb3RvY29sSWQgOjo9IEVOVU1FUkFURUQgeworCXRzM0ctNDgwMDYgICAoMSksCisJdHMzRy0yNTQxMyAoMiksCisJLi4ufQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLSBGb3IgQWNjZXNzTmV0d29ya1NpZ25hbEluZm8gc2VxdWVuY2VzIGNvbnRhaW5pbmcgdGhpcyBwYXJhbWV0ZXIgd2l0aCBhbnkKKwktLSBvdGhlciB2YWx1ZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCB0aGUgcmVjZWl2ZXIgc2hhbGwgaWdub3JlIHRoZSB3aG9sZSAKKwktLSBBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbyBzZXF1ZW5jZS4KKworQWxlcnRpbmdQYXR0ZXJuIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpICkKKwktLSBUaGlzIHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgQWxlcnRpbmcgUGF0dGVybgorCisJLS0JYml0cyA4NzY1IDogMDAwMCAodW51c2VkKQorCisJLS0JYml0cyA0MyA6IHR5cGUgb2YgUGF0dGVybgorCS0tCQkwMCBsZXZlbAorCS0tCQkwMSBjYXRlZ29yeQorCS0tCQkxMCBjYXRlZ29yeQorCS0tCQlhbGwgb3RoZXIgdmFsdWVzIGFyZSByZXNlcnZlZC4KKworCS0tCWJpdHMgMjEgOiB0eXBlIG9mIGFsZXJ0aW5nCisKK2FsZXJ0aW5nTGV2ZWwtMCAgIEFsZXJ0aW5nUGF0dGVybiA6Oj0gJzAwMDAwMDAwJ0IKK2FsZXJ0aW5nTGV2ZWwtMSAgIEFsZXJ0aW5nUGF0dGVybiA6Oj0gJzAwMDAwMDAxJ0IKK2FsZXJ0aW5nTGV2ZWwtMiAgIEFsZXJ0aW5nUGF0dGVybiA6Oj0gJzAwMDAwMDEwJ0IKKwktLSBhbGwgb3RoZXIgdmFsdWVzIG9mIEFsZXJ0aW5nIGxldmVsIGFyZSByZXNlcnZlZAorCS0tIEFsZXJ0aW5nIExldmVscyBhcmUgZGVmaW5lZCBpbiBHU00gMDIuMDcKKwkKK2FsZXJ0aW5nQ2F0ZWdvcnktMSAgIEFsZXJ0aW5nUGF0dGVybiA6Oj0gJzAwMDAwMTAwJ0IKK2FsZXJ0aW5nQ2F0ZWdvcnktMiAgIEFsZXJ0aW5nUGF0dGVybiA6Oj0gJzAwMDAwMTAxJ0IKK2FsZXJ0aW5nQ2F0ZWdvcnktMyAgIEFsZXJ0aW5nUGF0dGVybiA6Oj0gJzAwMDAwMTEwJ0IKK2FsZXJ0aW5nQ2F0ZWdvcnktNCAgIEFsZXJ0aW5nUGF0dGVybiA6Oj0gJzAwMDAwMTExJ0IKK2FsZXJ0aW5nQ2F0ZWdvcnktNSAgIEFsZXJ0aW5nUGF0dGVybiA6Oj0gJzAwMDAxMDAwJ0IKKwktLSBhbGwgb3RoZXIgdmFsdWVzIG9mIEFsZXJ0aW5nIENhdGVnb3J5IGFyZSByZXNlcnZlZAorCS0tIEFsZXJ0aW5nIGNhdGVnb3JpZXMgYXJlIGRlZmluZWQgaW4gR1NNIDAyLjA3CisKKy0tIGRhdGEgdHlwZXMgZm9yIG51bWJlcmluZyBhbmQgaWRlbnRpZmljYXRpb24KKworSU1TSSA6Oj0gVEJDRC1TVFJJTkcgKFNJWkUgKDMuLjgpKQorCS0tIGRpZ2l0cyBvZiBNQ0MsIE1OQywgTVNJTiBhcmUgY29uY2F0ZW5hdGVkIGluIHRoaXMgb3JkZXIuCisKK0lkZW50aXR5IDo6PSBDSE9JQ0UgeworCWltc2kJCQlJTVNJLAorCWltc2ktV2l0aExNU0kJSU1TSS1XaXRoTE1TSX0KKworSU1TSS1XaXRoTE1TSSA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlJTVNJLAorCWxtc2kJCQlMTVNJLAorCS0tIGEgc3BlY2lhbCB2YWx1ZSAwMDAwMDAwMCBpbmRpY2F0ZXMgdGhhdCB0aGUgTE1TSSBpcyBub3QgaW4gdXNlCisJLi4ufQorCitBU0NJLUNhbGxSZWZlcmVuY2UgOjo9IFRCQ0QtU1RSSU5HIChTSVpFICgxLi44KSkKKwktLSBkaWdpdHMgb2YgVkdDUy9WQlMtYXJlYSxHcm91cC1JRCBhcmUgY29uY2F0ZW5hdGVkIGluIHRoaXMgb3JkZXIgaWYgdGhlcmUgaXMgYQorCS0tIFZHQ1MvVkJTLWFyZWEuCisKK1RNU0kgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uNCkpCisKK1N1YnNjcmliZXJJZCA6Oj0gQ0hPSUNFIHsKKwlpbXNpCQkJWzBdIElNU0ksCisJdG1zaQkJCVsxXSBUTVNJfQorCitJTUVJIDo6PSBUQkNELVNUUklORyAoU0laRSAoOCkpCisJLS0JUmVmZXJzIHRvIEludGVybmF0aW9uYWwgTW9iaWxlIFN0YXRpb24gRXF1aXBtZW50IElkZW50aXR5CisJLS0JYW5kIFNvZnR3YXJlIFZlcnNpb24gTnVtYmVyIChTVk4pIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMy4wMDMgWzE3XS4KKwktLQlJZiB0aGUgU1ZOIGlzIG5vdCBwcmVzZW50IHRoZSBsYXN0IG9jdGV0IHNoYWxsIGNvbnRhaW4gdGhlCisJLS0JZGlnaXQgMCBhbmQgYSBmaWxsZXIuCisJLS0JSWYgcHJlc2VudCB0aGUgU1ZOIHNoYWxsIGJlIGluY2x1ZGVkIGluIHRoZSBsYXN0IG9jdGV0LgorCitITFItSWQgOjo9IElNU0kKKwktLSBsZWFkaW5nIGRpZ2l0cyBvZiBJTVNJLCBpLmUuIChNQ0MsIE1OQywgbGVhZGluZyBkaWdpdHMgb2YKKwktLSBNU0lOKSBmb3JtaW5nIEhMUiBJZCBkZWZpbmVkIGluIFRTIDNHUFAgVFMgMjMuMDAzIFsxN10uCisKK0hMUi1MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkhMUi1JZCkgT0YKKwkJCQlITFItSWQKKworbWF4TnVtT2ZITFItSWQgIElOVEVHRVIgOjo9IDUwCisKK0xNU0kgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNCkpCisKK0dsb2JhbENlbGxJZCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg1Li43KSkKKwktLSBSZWZlcnMgdG8gQ2VsbCBHbG9iYWwgSWRlbnRpZmljYXRpb24gZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIzLjAwMyBbMTddLgorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCS0tIG9jdGV0IDEgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgMXN0IGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIENvdW50cnkgQ29kZSAybmQgZGlnaXQKKwktLSBvY3RldCAyIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDNyZCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgM3JkIGRpZ2l0CisJLS0JCQlvciBmaWxsZXIgKDExMTEpIGZvciAyIGRpZ2l0IE1OQ3MKKwktLSBvY3RldCAzIGJpdHMgNDMyMQlNb2JpbGUgTmV0d29yayBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgMm5kIGRpZ2l0CisJLS0gb2N0ZXRzIDQgYW5kIDUJTG9jYXRpb24gQXJlYSBDb2RlIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDI0LjAwOCBbMzVdCisJLS0gb2N0ZXRzIDYgYW5kIDcJQ2VsbCBJZGVudGl0eSAoQ0kpIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDI0LjAwOCBbMzVdCisKK05ldHdvcmtSZXNvdXJjZSA6Oj0gRU5VTUVSQVRFRCB7CisJcGxtbiAgKDApLAorCWhsciAgKDEpLAorCXZsciAgKDIpLAorCXB2bHIgICgzKSwKKwljb250cm9sbGluZ01TQyAgKDQpLAorCXZtc2MgICg1KSwKKwllaXIgICg2KSwKKwlyc3MgICg3KX0KKworQWRkaXRpb25hbE5ldHdvcmtSZXNvdXJjZSA6Oj0gRU5VTUVSQVRFRCB7CisJc2dzbiAoMCksCisJZ2dzbiAoMSksCisJZ21sYyAoMiksCisJZ3NtU0NGICgzKSwKKwlucGxyICg0KSwKKwlhdWMgKDUpLAorCS4uLiAsCisJdWUgKDYpLAorCW1tZSAoNyl9CisJLS0gaWYgdW5rbm93biB2YWx1ZSBpcyByZWNlaXZlZCBpbiBBZGRpdGlvbmFsTmV0d29ya1Jlc291cmNlCisJLS0gaXQgc2hhbGwgYmUgaWdub3JlZC4KKworCitOQUVBLVByZWZlcnJlZENJIDo6PSBTRVFVRU5DRSB7CisJbmFlYS1QcmVmZXJyZWRDSUMJWzBdIE5BRUEtQ0lDLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTkFFQS1DSUMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMykpCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGJ5IHRoZSBDYXJyaWVyIElkZW50aWZpY2F0aW9uCisJLS0gcGFyYW1ldGVyIGluIEFOU0kgVDEuMTEzLjMuIENhcnJpZXIgY29kZXMgYmV0d2VlbiAiMDAwIiBhbmQgIjk5OSIgbWF5CisJLS0gYmUgZW5jb2RlZCBhcyAzIGRpZ2l0cyB1c2luZyAiMDAwIiB0byAiOTk5IiBvciBhcyA0IGRpZ2l0cyB1c2luZyAKKwktLSAiMDAwMCIgdG8gIjA5OTkiLiBDYXJyaWVyIGNvZGVzIGJldHdlZW4gIjEwMDAiIGFuZCAiOTk5OSIgYXJlIGVuY29kZWQKKwktLSB1c2luZyA0IGRpZ2l0cy4KKworU3Vic2NyaWJlcklkZW50aXR5IDo6PSBDSE9JQ0UgeworCWltc2kJCQlbMF0gSU1TSSwKKwltc2lzZG4JCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcKKwl9CisKK0xDU0NsaWVudEV4dGVybmFsSUQgOjo9IFNFUVVFTkNFIHsKKwlleHRlcm5hbEFkZHJlc3MJWzBdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitMQ1NDbGllbnRJbnRlcm5hbElEIDo6PSBFTlVNRVJBVEVEIHsKKwlicm9hZGNhc3RTZXJ2aWNlCSgwKSwKKwlvLWFuZE0tSFBMTU4JKDEpLAorCW8tYW5kTS1WUExNTgkoMiksCisJYW5vbnltb3VzTG9jYXRpb24JKDMpLAorCXRhcmdldE1Tc3Vic2NyaWJlZFNlcnZpY2UJKDQpLAorCS4uLiB9CistLSBmb3IgYSBDQU1FTCBwaGFzZSAzIFBMTU4gb3BlcmF0b3IgY2xpZW50LCB0aGUgdmFsdWUgdGFyZ2V0TVNzdWJzY3JpYmVkU2VydmljZSBzaGFsbCBiZSB1c2VkCisKK0xDU1NlcnZpY2VUeXBlSUQgOjo9IElOVEVHRVIgKDAuLjEyNykKKwktLSB0aGUgaW50ZWdlciB2YWx1ZXMgMC02MyBhcmUgcmVzZXJ2ZWQgZm9yIFN0YW5kYXJkIExDUyBzZXJ2aWNlIHR5cGVzCisJLS0gdGhlIGludGVnZXIgdmFsdWVzIDY0LTEyNyBhcmUgcmVzZXJ2ZWQgZm9yIE5vbiBTdGFuZGFyZCBMQ1Mgc2VydmljZSB0eXBlcworCistLSBTdGFuZGFyZCBMQ1MgU2VydmljZSBUeXBlcworZW1lcmdlbmN5U2VydmljZXMJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDAKK2VtZXJnZW5jeUFsZXJ0U2VydmljZXMJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEKK3BlcnNvblRyYWNraW5nCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMgorZmxlZXRNYW5hZ2VtZW50CQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAzCithc3NldE1hbmFnZW1lbnQJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDQKK3RyYWZmaWNDb25nZXN0aW9uUmVwb3J0aW5nCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA1Cityb2Fkc2lkZUFzc2lzdGFuY2UJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDYKK3JvdXRpbmdUb05lYXJlc3RDb21tZXJjaWFsRW50ZXJwcmlzZQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNworbmF2aWdhdGlvbgkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDgKKwktLXRoaXMgc2VydmljZSB0eXBlIGlzIHJlc2VydmVkIGZvciB1c2UgaW4gcHJldmlvdXMgcmVsZWFzZXMKK2NpdHlTaWdodHNlZWluZwkJTENTU2VydmljZVR5cGVJRCA6Oj0gOQorbG9jYWxpemVkQWR2ZXJ0aXNpbmcJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEwCittb2JpbGVZZWxsb3dQYWdlcwkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTEgCit0cmFmZmljQW5kUHVibGljVHJhbnNwb3J0YXRpb25JbmZvCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMgord2VhdGhlcgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMworYXNzZXRBbmRTZXJ2aWNlRmluZGluZwkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTQKK2dhbWluZwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxNQorZmluZFlvdXJGcmllbmQJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxNgorZGF0aW5nCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDE3CitjaGF0dGluZwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxOAorcm91dGVGaW5kaW5nCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTkKK3doZXJlQW1JCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDIwCisKKy0tIFRoZSB2YWx1ZXMgb2YgTENTU2VydmljZVR5cGVJRCBhcmUgZGVmaW5lZCBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyMi4wNzEuCisKKy0tIE5vbiBTdGFuZGFyZCBMQ1MgU2VydmljZSBUeXBlcworc2VydjY0CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDY0CitzZXJ2NjUJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNjUKK3NlcnY2NgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA2Ngorc2VydjY3CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDY3CitzZXJ2NjgJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNjgKK3NlcnY2OQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA2OQorc2VydjcwCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDcwCitzZXJ2NzEJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNzEKK3NlcnY3MgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA3Mgorc2VydjczCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDczCitzZXJ2NzQJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNzQKK3NlcnY3NQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA3NQorc2Vydjc2CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDc2CitzZXJ2NzcJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gNzcKK3NlcnY3OAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA3OAorc2Vydjc5CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDc5CitzZXJ2ODAJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gODAKK3NlcnY4MQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA4MQorc2VydjgyCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDgyCitzZXJ2ODMJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gODMKK3NlcnY4NAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA4NAorc2Vydjg1CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDg1CitzZXJ2ODYJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gODYKK3NlcnY4NwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA4Nworc2Vydjg4CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDg4CitzZXJ2ODkJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gODkKK3NlcnY5MAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA5MAorc2VydjkxCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDkxCitzZXJ2OTIJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gOTIKK3NlcnY5MwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA5Mworc2Vydjk0CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDk0CitzZXJ2OTUJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gOTUKK3NlcnY5NgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA5Ngorc2Vydjk3CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDk3CitzZXJ2OTgJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gOTgKK3NlcnY5OQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSA5OQorc2VydjEwMAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMDAKK3NlcnYxMDEJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTAxCitzZXJ2MTAyCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEwMgorc2VydjEwMwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMDMKK3NlcnYxMDQJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTA0CitzZXJ2MTA1CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEwNQorc2VydjEwNgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMDYKK3NlcnYxMDcJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTA3CitzZXJ2MTA4CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEwOAorc2VydjEwOQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMDkKK3NlcnYxMTAJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTEwCitzZXJ2MTExCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExMQorc2VydjExMgkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMTIKK3NlcnYxMTMJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTEzCitzZXJ2MTE0CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExNAorc2VydjExNQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMTUKK3NlcnYxMTYJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTE2CitzZXJ2MTE3CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDExNworc2VydjExOAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMTgKK3NlcnYxMTkJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTE5CitzZXJ2MTIwCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEyMAorc2VydjEyMQkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMjEKK3NlcnYxMjIJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTIyCitzZXJ2MTIzCQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEyMworc2VydjEyNAkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMjQKK3NlcnYxMjUJCQkJTENTU2VydmljZVR5cGVJRCA6Oj0gMTI1CitzZXJ2MTI2CQkJCUxDU1NlcnZpY2VUeXBlSUQgOjo9IDEyNgorc2VydjEyNwkJCQlMQ1NTZXJ2aWNlVHlwZUlEIDo6PSAxMjcKKworUExNTi1JZCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgzKSkKKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKwktLSBvY3RldCAxIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBDb3VudHJ5IENvZGUgMm5kIGRpZ2l0CisJLS0gb2N0ZXQgMiBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAzcmQgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgTmV0d29yayBDb2RlIDNyZCBkaWdpdAorCS0tCQkJb3IgZmlsbGVyICgxMTExKSBmb3IgMiBkaWdpdCBNTkNzCisJLS0gb2N0ZXQgMyBiaXRzIDQzMjEJTW9iaWxlIE5ldHdvcmsgQ29kZSAxc3QgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgTmV0d29yayBDb2RlIDJuZCBkaWdpdAorCistLSBkYXRhIHR5cGVzIGZvciBDQU1FTAorCitDZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRPckxBSSA6Oj0gQ0hPSUNFIHsKKwljZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRGaXhlZExlbmd0aAlbMF0gQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkRml4ZWRMZW5ndGgsCisJbGFpRml4ZWRMZW5ndGgJWzFdIExBSUZpeGVkTGVuZ3RofQorCitDZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRGaXhlZExlbmd0aCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg3KSkKKwktLSBSZWZlcnMgdG8gQ2VsbCBHbG9iYWwgSWRlbnRpZmljYXRpb24gb3IgU2VydmljZSBBcmUgSWRlbnRpZmljYXRpb24KKwktLSBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDAzLgorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCS0tIG9jdGV0IDEgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgMXN0IGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIENvdW50cnkgQ29kZSAybmQgZGlnaXQKKwktLSBvY3RldCAyIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDNyZCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgM3JkIGRpZ2l0CisJLS0JCQlvciBmaWxsZXIgKDExMTEpIGZvciAyIGRpZ2l0IE1OQ3MKKwktLSBvY3RldCAzIGJpdHMgNDMyMQlNb2JpbGUgTmV0d29yayBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBOZXR3b3JrIENvZGUgMm5kIGRpZ2l0CisJLS0gb2N0ZXRzIDQgYW5kIDUJTG9jYXRpb24gQXJlYSBDb2RlIGFjY29yZGluZyB0byAzR1BQIFRTIDI0LjAwOAorCS0tIG9jdGV0cyA2IGFuZCA3CUNlbGwgSWRlbnRpdHkgKENJKSB2YWx1ZSBvciAKKwktLSAJCQlTZXJ2aWNlIEFyZWEgQ29kZSAoU0FDKSB2YWx1ZSAKKwktLQkJCWFjY29yZGluZyB0byAzR1BQIFRTIDIzLjAwMworCitMQUlGaXhlZExlbmd0aCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg1KSkKKwktLSBSZWZlcnMgdG8gTG9jYXRpb24gQXJlYSBJZGVudGlmaWNhdGlvbiBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDAzIFsxN10uCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisJLS0gb2N0ZXQgMSBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAxc3QgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgQ291bnRyeSBDb2RlIDJuZCBkaWdpdAorCS0tIG9jdGV0IDIgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgM3JkIGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAzcmQgZGlnaXQKKwktLQkJCW9yIGZpbGxlciAoMTExMSkgZm9yIDIgZGlnaXQgTU5DcworCS0tIG9jdGV0IDMgYml0cyA0MzIxCU1vYmlsZSBOZXR3b3JrIENvZGUgMXN0IGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAybmQgZGlnaXQKKwktLSBvY3RldHMgNCBhbmQgNQlMb2NhdGlvbiBBcmVhIENvZGUgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjQuMDA4IFszNV0KKworLS0gZGF0YSB0eXBlcyBmb3Igc3Vic2NyaWJlciBtYW5hZ2VtZW50CisKK0Jhc2ljU2VydmljZUNvZGUgOjo9IENIT0lDRSB7CisJYmVhcmVyU2VydmljZQlbMl0gQmVhcmVyU2VydmljZUNvZGUsCisJdGVsZXNlcnZpY2UJWzNdIFRlbGVzZXJ2aWNlQ29kZX0KKworRXh0LUJhc2ljU2VydmljZUNvZGUgOjo9IENIT0lDRSB7CisJZXh0LUJlYXJlclNlcnZpY2UJWzJdIEV4dC1CZWFyZXJTZXJ2aWNlQ29kZSwKKwlleHQtVGVsZXNlcnZpY2UJWzNdIEV4dC1UZWxlc2VydmljZUNvZGV9CisKK0VNTFBQLUluZm8gOjo9IFNFUVVFTkNFIHsKKwltYXhpbXVtZW50aXRsZWRQcmlvcml0eQlFTUxQUC1Qcmlvcml0eSwKKwlkZWZhdWx0UHJpb3JpdHkJRU1MUFAtUHJpb3JpdHksCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0VNTFBQLVByaW9yaXR5IDo6PSBJTlRFR0VSICgwLi4xNSkKKwktLSBUaGUgbWFwcGluZyBmcm9tIHRoZSB2YWx1ZXMgQSxCLDAsMSwyLDMsNCB0byB0aGUgaW50ZWdlci12YWx1ZSBpcworCS0tIHNwZWNpZmllZCBhcyBmb2xsb3dzIHdoZXJlIEEgaXMgdGhlIGhpZ2hlc3QgYW5kIDQgaXMgdGhlIGxvd2VzdAorCS0tIHByaW9yaXR5IGxldmVsCisJLS0gdGhlIGludGVnZXIgdmFsdWVzIDctMTUgYXJlIHNwYXJlIGFuZCBzaGFsbCBiZSBtYXBwZWQgdG8gdmFsdWUgNAorCitwcmlvcml0eUxldmVsQQkJRU1MUFAtUHJpb3JpdHkgOjo9IDYKK3ByaW9yaXR5TGV2ZWxCCQlFTUxQUC1Qcmlvcml0eSA6Oj0gNQorcHJpb3JpdHlMZXZlbDAJCUVNTFBQLVByaW9yaXR5IDo6PSAwCitwcmlvcml0eUxldmVsMQkJRU1MUFAtUHJpb3JpdHkgOjo9IDEKK3ByaW9yaXR5TGV2ZWwyCQlFTUxQUC1Qcmlvcml0eSA6Oj0gMgorcHJpb3JpdHlMZXZlbDMJCUVNTFBQLVByaW9yaXR5IDo6PSAzCitwcmlvcml0eUxldmVsNAkJRU1MUFAtUHJpb3JpdHkgOjo9IDQKKworTUMtU1MtSW5mbyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVswXSBTUy1Db2RlLAorCXNzLVN0YXR1cwkJWzFdIEV4dC1TUy1TdGF0dXMsCisJbmJyU0IJCVsyXSBNYXhNQy1CZWFyZXJzLAorCW5iclVzZXIJCVszXSBNQy1CZWFyZXJzLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTWF4TUMtQmVhcmVycyA6Oj0gSU5URUdFUiAoMi4ubWF4TnVtT2ZNQy1CZWFyZXJzKQorCitNQy1CZWFyZXJzIDo6PSBJTlRFR0VSICgxLi5tYXhOdW1PZk1DLUJlYXJlcnMpCisKK21heE51bU9mTUMtQmVhcmVycyAgSU5URUdFUiA6Oj0gNworCitFeHQtU1MtU3RhdHVzIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjUpKQorCisJLS0gT0NURVQgMToKKwktLQorCS0tIGJpdHMgODc2NTogMDAwMCAodW51c2VkKQorCS0tIGJpdHMgNDMyMTogVXNlZCB0byBjb252ZXkgdGhlICJQIGJpdCIsIlIgYml0IiwiQSBiaXQiIGFuZCAiUSBiaXQiLAorCS0tCQkgICAgcmVwcmVzZW50aW5nIHN1cHBsZW1lbnRhcnkgc2VydmljZSBzdGF0ZSBpbmZvcm1hdGlvbgorCS0tCQkgICAgYXMgZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIzLjAxMSBbMjJdCisKKwktLSBiaXQgNDogIlEgYml0IgorCisJLS0gYml0IDM6ICJQIGJpdCIKKworCS0tIGJpdCAyOiAiUiBiaXQiCisKKwktLSBiaXQgMTogIkEgYml0IgorCisJLS0gT0NURVRTIDItNTogcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UuIFRoZXkgc2hhbGwgYmUgZGlzY2FyZGVkIGlmCisJLS0gcmVjZWl2ZWQgYW5kIG5vdCB1bmRlcnN0b29kLgorCisKKwktLSBkYXRhIHR5cGVzIGZvciBnZW9ncmFwaGljIGxvY2F0aW9uCisKK0FnZU9mTG9jYXRpb25JbmZvcm1hdGlvbiA6Oj0gSU5URUdFUiAoMC4uMzI3NjcpCistLSB0aGUgdmFsdWUgcmVwcmVzZW50cyB0aGUgZWxhcHNlZCB0aW1lIGluIG1pbnV0ZXMgc2luY2UgdGhlIGxhc3QKKy0tIG5ldHdvcmsgY29udGFjdCBvZiB0aGUgbW9iaWxlIHN0YXRpb24gKGkuZS4gdGhlIGFjdHVhbGl0eSBvZiB0aGUKKy0tIGxvY2F0aW9uIGluZm9ybWF0aW9uKS4KKy0tIHZhbHVlICIwIiBpbmRpY2F0ZXMgdGhhdCB0aGUgTVMgaXMgY3VycmVudGx5IGluIGNvbnRhY3Qgd2l0aCB0aGUKKy0tICAgICAgICAgICBuZXR3b3JrCistLSB2YWx1ZSAiMzI3NjciIGluZGljYXRlcyB0aGF0IHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiBpcyBhdCBsZWFzdAorLS0gICAgICAgICAgICAgICAzMjc2NyBtaW51dGVzIG9sZAorCitFTkQKKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtRVItRGF0YVR5cGVzLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUVSLURhdGFUeXBlcy5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBiOTBmYwotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUVSLURhdGFUeXBlcy5hc24KQEAgLTAsMCArMSw0MTUgQEAKKy0tICRJZDogTUFQLUVSLURhdGFUeXBlcy5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKKy0tIDNHUFAgVFMgMjkuMDAyIFY4LjkuMCAoMjAwOS0wNCkgCistLSAxNy43LjcJRXJyb3IgZGF0YSB0eXBlcworCitNQVAtRVItRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUVSLURhdGFUeXBlcyAoMTcpIHZlcnNpb24xMSAoMTEpfQorCitERUZJTklUSU9OUworCitJTVBMSUNJVCBUQUdTCisKKzo6PQorCitCRUdJTgorCitFWFBPUlRTCisJUm9hbWluZ05vdEFsbG93ZWRQYXJhbSwKKwlDYWxsQmFycmVkUGFyYW0sCisJQ1VHLVJlamVjdFBhcmFtLAorCVNTLUluY29tcGF0aWJpbGl0eUNhdXNlLAorCVBXLVJlZ2lzdHJhdGlvbkZhaWx1cmVDYXVzZSwKKwlTTS1EZWxpdmVyeUZhaWx1cmVDYXVzZSwKKwlTeXN0ZW1GYWlsdXJlUGFyYW0sCisJRGF0YU1pc3NpbmdQYXJhbSwKKwlVbmV4cGVjdGVkRGF0YVBhcmFtLAorCUZhY2lsaXR5Tm90U3VwUGFyYW0sCisJT1ItTm90QWxsb3dlZFBhcmFtLAorCVVua25vd25TdWJzY3JpYmVyUGFyYW0sCisJTnVtYmVyQ2hhbmdlZFBhcmFtLAorCVVuaWRlbnRpZmllZFN1YlBhcmFtLAorCUlsbGVnYWxTdWJzY3JpYmVyUGFyYW0sCisJSWxsZWdhbEVxdWlwbWVudFBhcmFtLAorCUJlYXJlclNlcnZOb3RQcm92UGFyYW0sCisJVGVsZXNlcnZOb3RQcm92UGFyYW0sCisJVHJhY2luZ0J1ZmZlckZ1bGxQYXJhbSwKKwlOb1JvYW1pbmdOYlBhcmFtLAorCUFic2VudFN1YnNjcmliZXJQYXJhbSwKKwlCdXN5U3Vic2NyaWJlclBhcmFtLAorCU5vU3Vic2NyaWJlclJlcGx5UGFyYW0sCisJRm9yd2FyZGluZ1Zpb2xhdGlvblBhcmFtLAorCUZvcndhcmRpbmdGYWlsZWRQYXJhbSwgCisJQVRJLU5vdEFsbG93ZWRQYXJhbSwKKwlTdWJCdXN5Rm9yTVQtU01TLVBhcmFtLAorCU1lc3NhZ2VXYWl0TGlzdEZ1bGxQYXJhbSwKKwlBYnNlbnRTdWJzY3JpYmVyU00tUGFyYW0sCisJQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSwKKwlSZXNvdXJjZUxpbWl0YXRpb25QYXJhbSwKKwlOb0dyb3VwQ2FsbE5iUGFyYW0sCisJSW5jb21wYXRpYmxlVGVybWluYWxQYXJhbSwKKwlTaG9ydFRlcm1EZW5pYWxQYXJhbSwKKwlMb25nVGVybURlbmlhbFBhcmFtLAorCVVuYXV0aG9yaXplZFJlcXVlc3RpbmdOZXR3b3JrLVBhcmFtLAorCVVuYXV0aG9yaXplZExDU0NsaWVudC1QYXJhbSwKKwlQb3NpdGlvbk1ldGhvZEZhaWx1cmUtUGFyYW0sCitVbmtub3duT3JVbnJlYWNoYWJsZUxDU0NsaWVudC1QYXJhbSwKKwlNTS1FdmVudE5vdFN1cHBvcnRlZC1QYXJhbSwKK0FUU0ktTm90QWxsb3dlZFBhcmFtLAorQVRNLU5vdEFsbG93ZWRQYXJhbSwKK0lsbGVnYWxTUy1PcGVyYXRpb25QYXJhbSwKK1NTLU5vdEF2YWlsYWJsZVBhcmFtLAorU1MtU3Vic2NyaXB0aW9uVmlvbGF0aW9uUGFyYW0sCitJbmZvcm1hdGlvbk5vdEF2YWlsYWJsZVBhcmFtLAorVGFyZ2V0Q2VsbE91dHNpZGVHQ0EtUGFyYW0sCitPbmdvaW5nR3JvdXBDYWxsUGFyYW0KKworOworCitJTVBPUlRTCisJU1MtU3RhdHVzCitGUk9NIE1BUC1TUy1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU1MtRGF0YVR5cGVzICgxNCkgdmVyc2lvbjExICgxMSl9CisKKwlTaWduYWxJbmZvLAorCUJhc2ljU2VydmljZUNvZGUsCisJTmV0d29ya1Jlc291cmNlLAorCUFkZGl0aW9uYWxOZXR3b3JrUmVzb3VyY2UKK0ZST00gTUFQLUNvbW1vbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1Db21tb25EYXRhVHlwZXMgKDE4KSB2ZXJzaW9uMTEgKDExKX0KKworCisJU1MtQ29kZQorRlJPTSBNQVAtU1MtQ29kZSB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1TUy1Db2RlICgxNSkgdmVyc2lvbjExICgxMSl9CisKKwlFeHRlbnNpb25Db250YWluZXIKK0ZST00gTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KKzsKKworUm9hbWluZ05vdEFsbG93ZWRQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCXJvYW1pbmdOb3RBbGxvd2VkQ2F1c2UJUm9hbWluZ05vdEFsbG93ZWRDYXVzZSwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlhZGRpdGlvbmFsUm9hbWluZ05vdEFsbG93ZWRDYXVzZQlbMF0gQWRkaXRpb25hbFJvYW1pbmdOb3RBbGxvd2VkQ2F1c2UgT1BUSU9OQUwgfQorCistLQlpZiB0aGUgYWRkaXRpb25hbFJvYW1pbmdOb3RhbGxvd2VkQ2F1c2UgaXMgcmVjZWl2ZWQgYnkgdGhlIE1TQy9WTFIgb3IgU0dTTiB0aGVuIHRoZSAKKy0tCXJvYW1pbmdOb3RBbGxvd2VkQ2F1c2Ugc2hhbGwgYmUgZGlzY2FyZGVkLgorCitBZGRpdGlvbmFsUm9hbWluZ05vdEFsbG93ZWRDYXVzZSA6Oj0gRU5VTUVSQVRFRCB7CisJc3VwcG9ydGVkUkFULVR5cGVzTm90QWxsb3dlZCAoMCksCisJLi4ufQorCitSb2FtaW5nTm90QWxsb3dlZENhdXNlIDo6PSBFTlVNRVJBVEVEIHsKKwlwbG1uUm9hbWluZ05vdEFsbG93ZWQgICgwKSwKKwlvcGVyYXRvckRldGVybWluZWRCYXJyaW5nICAoMyl9CisKK0NhbGxCYXJyZWRQYXJhbSA6Oj0gQ0hPSUNFIHsKKwljYWxsQmFycmluZ0NhdXNlCUNhbGxCYXJyaW5nQ2F1c2UsCisJLS0gY2FsbCBCYXJyaW5nQ2F1c2UgbXVzdCBub3QgYmUgdXNlZCBpbiB2ZXJzaW9uIDMgYW5kIGhpZ2hlcgorCWV4dGVuc2libGVDYWxsQmFycmVkUGFyYW0JRXh0ZW5zaWJsZUNhbGxCYXJyZWRQYXJhbQorCS0tIGV4dGVuc2libGVDYWxsQmFycmVkUGFyYW0gbXVzdCBub3QgYmUgdXNlZCBpbiB2ZXJzaW9uIDwzCisJfQorCitDYWxsQmFycmluZ0NhdXNlIDo6PSBFTlVNRVJBVEVEIHsKKwliYXJyaW5nU2VydmljZUFjdGl2ZSAgKDApLAorCW9wZXJhdG9yQmFycmluZyAgKDEpfQorCitFeHRlbnNpYmxlQ2FsbEJhcnJlZFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJY2FsbEJhcnJpbmdDYXVzZQlDYWxsQmFycmluZ0NhdXNlCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwl1bmF1dGhvcmlzZWRNZXNzYWdlT3JpZ2luYXRvcglbMV0gTlVMTAkJT1BUSU9OQUwgfQorCitDVUctUmVqZWN0UGFyYW0gOjo9IFNFUVVFTkNFIHsKKwljdWctUmVqZWN0Q2F1c2UJQ1VHLVJlamVjdENhdXNlCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitDVUctUmVqZWN0Q2F1c2UgOjo9IEVOVU1FUkFURUQgeworCWluY29taW5nQ2FsbHNCYXJyZWRXaXRoaW5DVUcgICgwKSwKKwlzdWJzY3JpYmVyTm90TWVtYmVyT2ZDVUcgICgxKSwKKwlyZXF1ZXN0ZWRCYXNpY1NlcnZpY2VWaW9sYXRlc0NVRy1Db25zdHJhaW50cyAgKDUpLAorCWNhbGxlZFBhcnR5U1MtSW50ZXJhY3Rpb25WaW9sYXRpb24gICg3KX0KKworU1MtSW5jb21wYXRpYmlsaXR5Q2F1c2UgOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlbMV0gU1MtQ29kZQlPUFRJT05BTCwKKwliYXNpY1NlcnZpY2UJQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKKwlzcy1TdGF0dXMJCVs0XSBTUy1TdGF0dXMJT1BUSU9OQUwsCisJLi4ufQorCitQVy1SZWdpc3RyYXRpb25GYWlsdXJlQ2F1c2UgOjo9IEVOVU1FUkFURUQgeworCXVuZGV0ZXJtaW5lZCAgKDApLAorCWludmFsaWRGb3JtYXQgICgxKSwKKwluZXdQYXNzd29yZHNNaXNtYXRjaCAgKDIpfQorCitTTS1FbnVtZXJhdGVkRGVsaXZlcnlGYWlsdXJlQ2F1c2UgOjo9IEVOVU1FUkFURUQgeworCW1lbW9yeUNhcGFjaXR5RXhjZWVkZWQgICgwKSwKKwllcXVpcG1lbnRQcm90b2NvbEVycm9yICAoMSksCisJZXF1aXBtZW50Tm90U00tRXF1aXBwZWQgICgyKSwKKwl1bmtub3duU2VydmljZUNlbnRyZSAgKDMpLAorCXNjLUNvbmdlc3Rpb24gICg0KSwKKwlpbnZhbGlkU01FLUFkZHJlc3MgICg1KSwKKwlzdWJzY3JpYmVyTm90U0MtU3Vic2NyaWJlciAgKDYpfQorCitTTS1EZWxpdmVyeUZhaWx1cmVDYXVzZSA6Oj0gU0VRVUVOQ0UgeworCXNtLUVudW1lcmF0ZWREZWxpdmVyeUZhaWx1cmVDYXVzZQlTTS1FbnVtZXJhdGVkRGVsaXZlcnlGYWlsdXJlQ2F1c2UsCisJZGlhZ25vc3RpY0luZm8JU2lnbmFsSW5mbwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQWJzZW50U3Vic2NyaWJlclNNLVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJYWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNCU9QVElPTkFMLAorCS0tIEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gY2FuIGJlIGVpdGhlciBmb3Igbm9uLUdQUlMgCisJLS0gb3IgZm9yIEdQUlMKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlhZGRpdGlvbmFsQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSAgCVswXSAJQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlPUFRJT05BTCB9CisJLS0gaWYgcmVjZWl2ZWQsIGFkZGl0aW9uYWxBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIAorCS0tIGlzIGZvciBHUFJTIGFuZCBhYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIGlzIAorCS0tIGZvciBub24tR1BSUworCitBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIDo6PSBJTlRFR0VSICgwLi4yNTUpCisJLS0gQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTSB2YWx1ZXMgYXJlIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wNDAKKworU3lzdGVtRmFpbHVyZVBhcmFtIDo6PSBDSE9JQ0UgeworCW5ldHdvcmtSZXNvdXJjZQlOZXR3b3JrUmVzb3VyY2UsCisJLS0gbmV0d29ya1Jlc291cmNlIG11c3Qgbm90IGJlIHVzZWQgaW4gdmVyc2lvbiAzCisJZXh0ZW5zaWJsZVN5c3RlbUZhaWx1cmVQYXJhbQlFeHRlbnNpYmxlU3lzdGVtRmFpbHVyZVBhcmFtCisJLS0gZXh0ZW5zaWJsZVN5c3RlbUZhaWx1cmVQYXJhbSBtdXN0IG5vdCBiZSB1c2VkIGluIHZlcnNpb24gPDMKKwl9CisKK0V4dGVuc2libGVTeXN0ZW1GYWlsdXJlUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwluZXR3b3JrUmVzb3VyY2UJTmV0d29ya1Jlc291cmNlCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWFkZGl0aW9uYWxOZXR3b3JrUmVzb3VyY2UJWzBdIEFkZGl0aW9uYWxOZXR3b3JrUmVzb3VyY2UJT1BUSU9OQUwsCisJZmFpbHVyZUNhdXNlUGFyYW0JWzFdIEZhaWx1cmVDYXVzZVBhcmFtCU9QVElPTkFMIH0KKworRmFpbHVyZUNhdXNlUGFyYW0gOjo9IEVOVU1FUkFURUQgeworCWxpbWl0UmVhY2hlZE9uTnVtYmVyT2ZDb25jdXJyZW50TG9jYXRpb25SZXF1ZXN0cyAoMCksCisJLi4uIH0KKwktLSBpZiB1bmtub3duIHZhbHVlIGlzIHJlY2VpdmVkIGluIEZhaWx1cmVDYXVzZVBhcmFtIGl0IHNoYWxsIGJlIGlnbm9yZWQKKworCitEYXRhTWlzc2luZ1BhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1VuZXhwZWN0ZWREYXRhUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworRmFjaWxpdHlOb3RTdXBQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCXNoYXBlT2ZMb2NhdGlvbkVzdGltYXRlTm90U3VwcG9ydGVkIFswXQlOVUxMCQlPUFRJT05BTCwKKwluZWVkZWRMY3NDYXBhYmlsaXR5Tm90U3VwcG9ydGVkSW5TZXJ2aW5nTm9kZSBbMV0gTlVMTAlPUFRJT05BTCB9CisKK09SLU5vdEFsbG93ZWRQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitVbmtub3duU3Vic2NyaWJlclBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJdW5rbm93blN1YnNjcmliZXJEaWFnbm9zdGljCVVua25vd25TdWJzY3JpYmVyRGlhZ25vc3RpYwlPUFRJT05BTH0KKworVW5rbm93blN1YnNjcmliZXJEaWFnbm9zdGljIDo6PSBFTlVNRVJBVEVEIHsKKwlpbXNpVW5rbm93biAgKDApLAorCWdwcnMtZXBzLVN1YnNjcmlwdGlvblVua25vd24gICgxKSwKKwkuLi4sCisJbnBkYk1pc21hdGNoICAoMil9CisJLS0gaWYgdW5rbm93biB2YWx1ZXMgYXJlIHJlY2VpdmVkIGluIAkKKwktLSBVbmtub3duU3Vic2NyaWJlckRpYWdub3N0aWMgdGhleSBzaGFsbCBiZSBkaXNjYXJkZWQKKworTnVtYmVyQ2hhbmdlZFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1VuaWRlbnRpZmllZFN1YlBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0lsbGVnYWxTdWJzY3JpYmVyUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworSWxsZWdhbEVxdWlwbWVudFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0JlYXJlclNlcnZOb3RQcm92UGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworVGVsZXNlcnZOb3RQcm92UGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworVHJhY2luZ0J1ZmZlckZ1bGxQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitOb1JvYW1pbmdOYlBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0Fic2VudFN1YnNjcmliZXJQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWFic2VudFN1YnNjcmliZXJSZWFzb24JWzBdIEFic2VudFN1YnNjcmliZXJSZWFzb24JT1BUSU9OQUx9CisKK0Fic2VudFN1YnNjcmliZXJSZWFzb24gOjo9IEVOVU1FUkFURUQgeworCWltc2lEZXRhY2ggKDApLAorCXJlc3RyaWN0ZWRBcmVhICgxKSwKKwlub1BhZ2VSZXNwb25zZSAoMiksCisJLi4uICwKKwlwdXJnZWRNUyAoMyl9CistLSBleGNlcHRpb24gaGFuZGxpbmc6IGF0IHJlY2VwdGlvbiBvZiBvdGhlciB2YWx1ZXMgdGhhbiB0aGUgb25lcyBsaXN0ZWQgdGhlIAorLS0gQWJzZW50U3Vic2NyaWJlclJlYXNvbiBzaGFsbCBiZSBpZ25vcmVkLiAKKy0tIFRoZSBBYnNlbnRTdWJzY3JpYmVyUmVhc29uOiBwdXJnZWRNUyBpcyBkZWZpbmVkIGZvciB0aGUgU3VwZXItQ2hhcmdlciBmZWF0dXJlIAorLS0gKHNlZSBUUyAyMy4xMTYpLiBJZiB0aGlzIHZhbHVlIGlzIHJlY2VpdmVkIGluIGEgUHJvdmlkZSBSb2FtaW5nIE51bWJlciByZXNwb25zZQorLS0gaXQgc2hhbGwgYmUgbWFwcGVkIHRvIHRoZSBBYnNlbnRTdWJzY3JpYmVyUmVhc29uOiBpbXNpRGV0YWNoIGluIHRoZSBTZW5kIFJvdXRlaW5nCistLSBJbmZvcm1hdGlvbiByZXNwb25zZQorCitCdXN5U3Vic2NyaWJlclBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJY2Nicy1Qb3NzaWJsZQlbMF0gTlVMTAkJT1BUSU9OQUwsCisJY2Nicy1CdXN5CQlbMV0gTlVMTAkJT1BUSU9OQUx9CisKK05vU3Vic2NyaWJlclJlcGx5UGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworRm9yd2FyZGluZ1Zpb2xhdGlvblBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0ZvcndhcmRpbmdGYWlsZWRQYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitBVEktTm90QWxsb3dlZFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0FUU0ktTm90QWxsb3dlZFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0FUTS1Ob3RBbGxvd2VkUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworSWxsZWdhbFNTLU9wZXJhdGlvblBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1NTLU5vdEF2YWlsYWJsZVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1NTLVN1YnNjcmlwdGlvblZpb2xhdGlvblBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0luZm9ybWF0aW9uTm90QXZhaWxhYmxlUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworU3ViQnVzeUZvck1ULVNNUy1QYXJhbSA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlncHJzQ29ubmVjdGlvblN1c3BlbmRlZAlOVUxMCQkJT1BUSU9OQUwgfQorCS0tIElmIEdwcnNDb25uZWN0aW9uU3VzcGVuZGVkIGlzIG5vdCB1bmRlcnN0b29kIGl0IHNoYWxsIAorCS0tIGJlIGRpc2NhcmRlZAorCitNZXNzYWdlV2FpdExpc3RGdWxsUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworUmVzb3VyY2VMaW1pdGF0aW9uUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTm9Hcm91cENhbGxOYlBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0luY29tcGF0aWJsZVRlcm1pbmFsUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworU2hvcnRUZXJtRGVuaWFsUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwkuLi59CisKK0xvbmdUZXJtRGVuaWFsUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwkuLi59CisKK1VuYXV0aG9yaXplZFJlcXVlc3RpbmdOZXR3b3JrLVBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1VuYXV0aG9yaXplZExDU0NsaWVudC1QYXJhbSA6Oj0gU0VRVUVOQ0UgeworCXVuYXV0aG9yaXplZExDU0NsaWVudC1EaWFnbm9zdGljCVswXSBVbmF1dGhvcml6ZWRMQ1NDbGllbnQtRGlhZ25vc3RpYwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcgkJCU9QVElPTkFMLAorCS4uLiB9CisKK1VuYXV0aG9yaXplZExDU0NsaWVudC1EaWFnbm9zdGljIDo6PSBFTlVNRVJBVEVEIHsKKwlub0FkZGl0aW9uYWxJbmZvcm1hdGlvbiAoMCksCisJY2xpZW50Tm90SW5NU1ByaXZhY3lFeGNlcHRpb25MaXN0ICgxKSwKKwljYWxsVG9DbGllbnROb3RTZXR1cCAoMiksCisJcHJpdmFjeU92ZXJyaWRlTm90QXBwbGljYWJsZSAoMyksCisJZGlzYWxsb3dlZEJ5TG9jYWxSZWd1bGF0b3J5UmVxdWlyZW1lbnRzICg0KSwKKwkuLi4sCisJdW5hdXRob3JpemVkUHJpdmFjeUNsYXNzICg1KSwKKwl1bmF1dGhvcml6ZWRDYWxsU2Vzc2lvblVucmVsYXRlZEV4dGVybmFsQ2xpZW50ICg2KSwKKwl1bmF1dGhvcml6ZWRDYWxsU2Vzc2lvblJlbGF0ZWRFeHRlcm5hbENsaWVudCAoNykgfQorLS0JZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0JYW55IHVucmVjb2duaXplZCB2YWx1ZSBzaGFsbCBiZSBpZ25vcmVkCisKK1Bvc2l0aW9uTWV0aG9kRmFpbHVyZS1QYXJhbSA6Oj0gU0VRVUVOQ0UgeworCXBvc2l0aW9uTWV0aG9kRmFpbHVyZS1EaWFnbm9zdGljCVswXSBQb3NpdGlvbk1ldGhvZEZhaWx1cmUtRGlhZ25vc3RpYwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcgkJCU9QVElPTkFMLAorCS4uLiB9CisKK1Bvc2l0aW9uTWV0aG9kRmFpbHVyZS1EaWFnbm9zdGljIDo6PSBFTlVNRVJBVEVEIHsKKwljb25nZXN0aW9uICAoMCksCisJaW5zdWZmaWNpZW50UmVzb3VyY2VzICAoMSksCisJaW5zdWZmaWNpZW50TWVhc3VyZW1lbnREYXRhICAoMiksCisJaW5jb25zaXN0ZW50TWVhc3VyZW1lbnREYXRhICAoMyksCisJbG9jYXRpb25Qcm9jZWR1cmVOb3RDb21wbGV0ZWQgICg0KSwKKwlsb2NhdGlvblByb2NlZHVyZU5vdFN1cHBvcnRlZEJ5VGFyZ2V0TVMgICg1KSwKKwlxb1NOb3RBdHRhaW5hYmxlICAoNiksCisJcG9zaXRpb25NZXRob2ROb3RBdmFpbGFibGVJbk5ldHdvcmsJKDcpLAorCXBvc2l0aW9uTWV0aG9kTm90QXZhaWxhYmxlSW5Mb2NhdGlvbkFyZWEJKDgpLAorCS4uLiB9CistLQlleGNlcHRpb24gaGFuZGxpbmc6CistLQlhbnkgdW5yZWNvZ25pemVkIHZhbHVlIHNoYWxsIGJlIGlnbm9yZWQKKworVW5rbm93bk9yVW5yZWFjaGFibGVMQ1NDbGllbnQtUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTU0tRXZlbnROb3RTdXBwb3J0ZWQtUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworVGFyZ2V0Q2VsbE91dHNpZGVHQ0EtUGFyYW0gOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworT25nb2luZ0dyb3VwQ2FsbFBhcmFtIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKKworRU5ECisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUV4dGVuc2lvbkRhdGFUeXBlcy5hc24gYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1FeHRlbnNpb25EYXRhVHlwZXMuYXNuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5NGMwNTcKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1FeHRlbnNpb25EYXRhVHlwZXMuYXNuCkBAIC0wLDAgKzEsNzQgQEAKKy0tICRJZDogTUFQLUV4dGVuc2lvbkRhdGFUeXBlcy5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKKy0tIE1BUC1FeHRlbnNpb25EYXRhVHlwZXMuYXNuCistLQorLS0gVGFrZW4gZnJvbSAzR1BQIFRTIDI5LjAwMiBWOC45LjAgKDIwMDktMDQpCistLQorLS0gMTcuNy4xMSBFeHRlbnNpb24gZGF0YSB0eXBlcworLS0KKworTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KKworREVGSU5JVElPTlMKKworSU1QTElDSVQgVEFHUworCis6Oj0KKworQkVHSU4KKworRVhQT1JUUworCisJUHJpdmF0ZUV4dGVuc2lvbiwKKwlFeHRlbnNpb25Db250YWluZXIsCisJU0xSLUFyZ0V4dGVuc2lvbkNvbnRhaW5lcjsKKworCistLSBJT0MgZm9yIHByaXZhdGUgTUFQIGV4dGVuc2lvbnMKKworCitNQVAtRVhURU5TSU9OICA6Oj0gQ0xBU1MgeworCSZFeHRlbnNpb25UeXBlCQkJCU9QVElPTkFMLAorCSZleHRlbnNpb25JZCAJT0JKRUNUIElERU5USUZJRVIgfQorCS0tIFRoZSBsZW5ndGggb2YgdGhlIE9iamVjdCBJZGVudGlmaWVyIHNoYWxsIG5vdCBleGNlZWQgMTYgb2N0ZXRzIGFuZCB0aGUKKwktLSBudW1iZXIgb2YgY29tcG9uZW50cyBvZiB0aGUgT2JqZWN0IElkZW50aWZpZXIgc2hhbGwgbm90IGV4Y2VlZCAxNgorCistLSBkYXRhIHR5cGVzCisKK0V4dGVuc2lvbkNvbnRhaW5lciA6Oj0gU0VRVUVOQ0UgeworCXByaXZhdGVFeHRlbnNpb25MaXN0CVswXVByaXZhdGVFeHRlbnNpb25MaXN0CU9QVElPTkFMLCAKKwlwY3MtRXh0ZW5zaW9ucwlbMV1QQ1MtRXh0ZW5zaW9ucwlPUFRJT05BTCwKKwkuLi59CisKK1NMUi1BcmdFeHRlbnNpb25Db250YWluZXIgOjo9IFNFUVVFTkNFIHsKKwlwcml2YXRlRXh0ZW5zaW9uTGlzdAlbMF1Qcml2YXRlRXh0ZW5zaW9uTGlzdAlPUFRJT05BTCwgCisJc2xyLUFyZy1QQ1MtRXh0ZW5zaW9ucwlbMV1TTFItQXJnLVBDUy1FeHRlbnNpb25zCU9QVElPTkFMLAorCS4uLn0KKworUHJpdmF0ZUV4dGVuc2lvbkxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mUHJpdmF0ZUV4dGVuc2lvbnMpIE9GCisJCQkJUHJpdmF0ZUV4dGVuc2lvbgorCitQcml2YXRlRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7CisJZXh0SWQJCU1BUC1FWFRFTlNJT04uJmV4dGVuc2lvbklkCisJCQkJKHtFeHRlbnNpb25TZXR9KSwKKwlleHRUeXBlCQlNQVAtRVhURU5TSU9OLiZFeHRlbnNpb25UeXBlCisJCQkJKHtFeHRlbnNpb25TZXR9e0BleHRJZH0pCU9QVElPTkFMfQorCittYXhOdW1PZlByaXZhdGVFeHRlbnNpb25zICBJTlRFR0VSIDo6PSAxMAorCitFeHRlbnNpb25TZXQJCU1BUC1FWFRFTlNJT04gOjo9CisJCXsuLi4KKwkJIC0tIEV4dGVuc2lvblNldCBpcyB0aGUgc2V0IG9mIGFsbCBkZWZpbmVkIHByaXZhdGUgZXh0ZW5zaW9ucworCX0KKwktLSBVbnN1cHBvcnRlZCBwcml2YXRlIGV4dGVuc2lvbnMgc2hhbGwgYmUgZGlzY2FyZGVkIGlmIHJlY2VpdmVkLgorCitQQ1MtRXh0ZW5zaW9ucyA6Oj0gU0VRVUVOQ0UgeworCS4uLn0KKworU0xSLUFyZy1QQ1MtRXh0ZW5zaW9ucyA6Oj0gU0VRVUVOQ0UgeworCS4uLiwKKwluYS1FU1JLLVJlcXVlc3QJWzBdCU5VTEwJCU9QVElPTkFMIH0KKworRU5ECisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUxDUy1EYXRhVHlwZXMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtTENTLURhdGFUeXBlcy5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQzNGI4OQotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLUxDUy1EYXRhVHlwZXMuYXNuCkBAIC0wLDAgKzEsNjU3IEBACistLSAkSWQ6IE1BUC1MQ1MtRGF0YVR5cGVzLmFzbiAyODE0OSAyMDA5LTA0LTI1IDE3OjQ1OjM0WiBldHhyYWIgJAorLS0gTUFQLUxDUy1EYXRhVHlwZXMuYXNuCistLQorLS0gVGFrZW4gZnJvbSAzR1BQIFRTIDI5LjAwMiAgVjguOS4wICgyMDA5LTA0KQorLS0KKy0tIDE3LjcuMTMgTG9jYXRpb24gc2VydmljZSBkYXRhIHR5cGVzCistLQorCitNQVAtTENTLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1MQ1MtRGF0YVR5cGVzICgyNSkgdmVyc2lvbjExICgxMSl9CisKK0RFRklOSVRJT05TCitJTVBMSUNJVCBUQUdTCis6Oj0KK0JFR0lOCisKK0VYUE9SVFMKKwlSb3V0aW5nSW5mb0ZvckxDUy1BcmcsCisJUm91dGluZ0luZm9Gb3JMQ1MtUmVzLAorCVByb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24tQXJnLAorCVByb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24tUmVzLAorCVN1YnNjcmliZXJMb2NhdGlvblJlcG9ydC1BcmcsCisJU3Vic2NyaWJlckxvY2F0aW9uUmVwb3J0LVJlcywKK0xvY2F0aW9uVHlwZSwgCitEZWZlcnJlZExvY2F0aW9uRXZlbnRUeXBlLAorTENTQ2xpZW50TmFtZSwKK0xDUy1Rb1MsCitIb3Jpem9udGFsLUFjY3VyYWN5LAorUmVzcG9uc2VUaW1lLAorRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uLCAKK1ZlbG9jaXR5RXN0aW1hdGUsCitTdXBwb3J0ZWRHQURTaGFwZXMsCitBZGQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24sCitMQ1NSZXF1ZXN0b3JJRCwgCitMQ1MtUmVmZXJlbmNlTnVtYmVyLAorTENTQ29kZXdvcmQsCitBcmVhRXZlbnRJbmZvLAorUmVwb3J0aW5nUExNTkxpc3QsCitQZXJpb2RpY0xEUkluZm8sCitTZXF1ZW5jZU51bWJlcgorOworCitJTVBPUlRTCisJQWRkcmVzc1N0cmluZywKKwlJU0ROLUFkZHJlc3NTdHJpbmcsCisJSU1FSSwKKwlJTVNJLAorCUxNU0ksCisJU3Vic2NyaWJlcklkZW50aXR5LAorCUFnZU9mTG9jYXRpb25JbmZvcm1hdGlvbiwKKwlMQ1NDbGllbnRFeHRlcm5hbElELAorCUxDU0NsaWVudEludGVybmFsSUQsCitMQ1NTZXJ2aWNlVHlwZUlELAorQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUksCitQTE1OLUlkCitGUk9NIE1BUC1Db21tb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtQ29tbW9uRGF0YVR5cGVzICgxOCkgdmVyc2lvbjExICgxMSl9CisKKwlFeHRlbnNpb25Db250YWluZXIsCisJU0xSLUFyZ0V4dGVuc2lvbkNvbnRhaW5lcgorRlJPTSBNQVAtRXh0ZW5zaW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUV4dGVuc2lvbkRhdGFUeXBlcyAoMjEpIHZlcnNpb24xMSAoMTEpfQorCisJVVNTRC1EYXRhQ29kaW5nU2NoZW1lLAorVVNTRC1TdHJpbmcKK0ZST00gTUFQLVNTLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKSBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykKKyAgIG1hcC1TUy1EYXRhVHlwZXMgKDE0KSB2ZXJzaW9uMTEgKDExKX0KKworCUFQTiwKKwlHU04tQWRkcmVzcywKKwlTdXBwb3J0ZWRMQ1MtQ2FwYWJpbGl0eVNldHMKK0ZST00gTUFQLU1TLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1NUy1EYXRhVHlwZXMgKDExKSB2ZXJzaW9uMTEgKDExKX0KKworCUFkZGl0aW9uYWwtTnVtYmVyCitGUk9NIE1BUC1TTS1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU00tRGF0YVR5cGVzICgxNikgdmVyc2lvbjExICgxMSl9Cis7CisKKworUm91dGluZ0luZm9Gb3JMQ1MtQXJnIDo6PSBTRVFVRU5DRSB7CisJbWxjTnVtYmVyCQlbMF0gSVNETi1BZGRyZXNzU3RyaW5nLAorCXRhcmdldE1TCQlbMV0gU3Vic2NyaWJlcklkZW50aXR5LAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworUm91dGluZ0luZm9Gb3JMQ1MtUmVzIDo6PSBTRVFVRU5DRSB7CisJdGFyZ2V0TVMJCVswXSBTdWJzY3JpYmVySWRlbnRpdHksCisJbGNzTG9jYXRpb25JbmZvCVsxXSBMQ1NMb2NhdGlvbkluZm8sCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCXYtZ21sYy1BZGRyZXNzCVszXQlHU04tQWRkcmVzcwlPUFRJT05BTCwKKwloLWdtbGMtQWRkcmVzcwlbNF0JR1NOLUFkZHJlc3MJT1BUSU9OQUwsCisJcHByLUFkZHJlc3MJWzVdCUdTTi1BZGRyZXNzCU9QVElPTkFMLAorCWFkZGl0aW9uYWwtdi1nbWxjLUFkZHJlc3MJWzZdCUdTTi1BZGRyZXNzCU9QVElPTkFMIH0KKworTENTTG9jYXRpb25JbmZvIDo6PSBTRVFVRU5DRSB7CisJbmV0d29ya05vZGUtTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZywKKwktLSBOZXR3b3JrTm9kZS1udW1iZXIgY2FuIGJlIGVpdGhlciBtc2MtbnVtYmVyIG9yIHNnc24tbnVtYmVyCisJbG1zaQkJCVswXSBMTVNJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCWdwcnNOb2RlSW5kaWNhdG9yIAlbMl0gTlVMTAkJT1BUSU9OQUwsCisJLS0gZ3Byc05vZGVJbmRpY2F0b3IgaXMgc2V0IG9ubHkgaWYgdGhlIFNHU04gbnVtYmVyIGlzIHNlbnQgYXMgdGhlIE5ldHdvcmsgTm9kZSBOdW1iZXIKKwlhZGRpdGlvbmFsLU51bWJlcglbM10gQWRkaXRpb25hbC1OdW1iZXIJT1BUSU9OQUwsCisJc3VwcG9ydGVkTENTLUNhcGFiaWxpdHlTZXRzCVs0XQlTdXBwb3J0ZWRMQ1MtQ2FwYWJpbGl0eVNldHMJT1BUSU9OQUwsCisJYWRkaXRpb25hbC1MQ1MtQ2FwYWJpbGl0eVNldHMJWzVdCVN1cHBvcnRlZExDUy1DYXBhYmlsaXR5U2V0cwlPUFRJT05BTAorCX0KKworUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbi1BcmcgOjo9IFNFUVVFTkNFIHsKKwlsb2NhdGlvblR5cGUJTG9jYXRpb25UeXBlLAorCW1sYy1OdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAorCWxjcy1DbGllbnRJRAlbMF0gTENTLUNsaWVudElECU9QVElPTkFMLAorCXByaXZhY3lPdmVycmlkZQlbMV0gTlVMTAkJT1BUSU9OQUwsCisJaW1zaQkJCVsyXSBJTVNJCQlPUFRJT05BTCwKKwltc2lzZG4JCVszXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJbG1zaQkJCVs0XSBMTVNJCQlPUFRJT05BTCwKKwlpbWVpCQkJWzVdIElNRUkJCU9QVElPTkFMLAorCWxjcy1Qcmlvcml0eQlbNl0gTENTLVByaW9yaXR5CU9QVElPTkFMLAorCWxjcy1Rb1MJCVs3XSBMQ1MtUW9TCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbOF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJc3VwcG9ydGVkR0FEU2hhcGVzCVs5XQlTdXBwb3J0ZWRHQURTaGFwZXMJT1BUSU9OQUwsCisJbGNzLVJlZmVyZW5jZU51bWJlcglbMTBdCUxDUy1SZWZlcmVuY2VOdW1iZXIJT1BUSU9OQUwsCisJbGNzU2VydmljZVR5cGVJRAlbMTFdCUxDU1NlcnZpY2VUeXBlSUQJT1BUSU9OQUwsCisJbGNzQ29kZXdvcmQJWzEyXQlMQ1NDb2Rld29yZAlPUFRJT05BTCwKKwlsY3MtUHJpdmFjeUNoZWNrCVsxM10JTENTLVByaXZhY3lDaGVjawlPUFRJT05BTCwKKwlhcmVhRXZlbnRJbmZvCVsxNF0JQXJlYUV2ZW50SW5mbwlPUFRJT05BTCwKKwloLWdtbGMtQWRkcmVzcwlbMTVdCUdTTi1BZGRyZXNzCU9QVElPTkFMLAorCW1vLWxyU2hvcnRDaXJjdWl0SW5kaWNhdG9yCVsxNl0gTlVMTAkJT1BUSU9OQUwsCisJcGVyaW9kaWNMRFJJbmZvCVsxN10gUGVyaW9kaWNMRFJJbmZvCU9QVElPTkFMLAorCXJlcG9ydGluZ1BMTU5MaXN0CVsxOF0gUmVwb3J0aW5nUExNTkxpc3QJT1BUSU9OQUwgfQorCisJLS0gb25lIG9mIGltc2kgb3IgbXNpc2RuIGlzIG1hbmRhdG9yeQorCS0tIElmIGEgbG9jYXRpb24gZXN0aW1hdGUgdHlwZSBpbmRpY2F0ZXMgYWN0aXZhdGUgZGVmZXJyZWQgbG9jYXRpb24gb3IgY2FuY2VsIGRlZmVycmVkIAorCS0tIGxvY2F0aW9uLCBhIGxjcy1SZWZlcmVuY2UgbnVtYmVyIHNoYWxsIGJlIGluY2x1ZGVkLgorCitMb2NhdGlvblR5cGUgOjo9IFNFUVVFTkNFIHsKKwlsb2NhdGlvbkVzdGltYXRlVHlwZQlbMF0gTG9jYXRpb25Fc3RpbWF0ZVR5cGUsCisJLi4uLAorCWRlZmVycmVkTG9jYXRpb25FdmVudFR5cGUJWzFdIERlZmVycmVkTG9jYXRpb25FdmVudFR5cGUJT1BUSU9OQUwgfQorCitMb2NhdGlvbkVzdGltYXRlVHlwZSA6Oj0gRU5VTUVSQVRFRCB7CisJY3VycmVudExvY2F0aW9uCSgwKSwKKwljdXJyZW50T3JMYXN0S25vd25Mb2NhdGlvbgkoMSksCisJaW5pdGlhbExvY2F0aW9uCSgyKSwKKwkuLi4sCisJYWN0aXZhdGVEZWZlcnJlZExvY2F0aW9uCSgzKSwKKwljYW5jZWxEZWZlcnJlZExvY2F0aW9uCSg0KSAsCisJbm90aWZpY2F0aW9uVmVyaWZpY2F0aW9uT25seQkoNSkgfQorLS0JZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0JYSBQcm92aWRlU3Vic2NyaWJlckxvY2F0aW9uLUFyZyBjb250YWluaW5nIGFuIHVucmVjb2duaXplZCBMb2NhdGlvbkVzdGltYXRlVHlwZQorLS0Jc2hhbGwgYmUgcmVqZWN0ZWQgYnkgdGhlIHJlY2VpdmVyIHdpdGggYSByZXR1cm4gZXJyb3IgY2F1c2Ugb2YgdW5leHBlY3RlZCBkYXRhIHZhbHVlCisKK0RlZmVycmVkTG9jYXRpb25FdmVudFR5cGUgOjo9IEJJVCBTVFJJTkcgeworCW1zQXZhaWxhYmxlCSgwKSAsCisJZW50ZXJpbmdJbnRvQXJlYQkoMSksCisJbGVhdmluZ0Zyb21BcmVhCSgyKSwKKwliZWluZ0luc2lkZUFyZWEJKDMpICwKKwlwZXJpb2RpY0xEUgkoNCkgIH0gKFNJWkUgKDEuLjE2KSkgCistLSBiZWluZ0luc2lkZUFyZWEgaXMgYWx3YXlzIHRyZWF0ZWQgYXMgb25lVGltZUV2ZW50IHJlZ2FyZGxlc3Mgb2YgdGhlIHBvc3NpYmxlIHZhbHVlCistLSBvZiBvY2N1cnJlbmNlSW5mbyBpbnNpZGUgYXJlYUV2ZW50SW5mby4KKy0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tIGEgUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbi1BcmcgY29udGFpbmluZyBvdGhlciB2YWx1ZXMgdGhhbiBsaXN0ZWQgYWJvdmUgaW4gCistLSBEZWZlcnJlZExvY2F0aW9uRXZlbnRUeXBlIHNoYWxsIGJlIHJlamVjdGVkIGJ5IHRoZSByZWNlaXZlciB3aXRoIGEgcmV0dXJuIGVycm9yIGNhdXNlIG9mIAorLS0gdW5leHBlY3RlZCBkYXRhIHZhbHVlLgorCitMQ1MtQ2xpZW50SUQgOjo9IFNFUVVFTkNFIHsKKwlsY3NDbGllbnRUeXBlCVswXSBMQ1NDbGllbnRUeXBlLAorCWxjc0NsaWVudEV4dGVybmFsSUQJWzFdIExDU0NsaWVudEV4dGVybmFsSUQJT1BUSU9OQUwsCisJbGNzQ2xpZW50RGlhbGVkQnlNUwlbMl0gQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlsY3NDbGllbnRJbnRlcm5hbElECVszXSBMQ1NDbGllbnRJbnRlcm5hbElECU9QVElPTkFMLAorCWxjc0NsaWVudE5hbWUJWzRdIExDU0NsaWVudE5hbWUJT1BUSU9OQUwsCisJLi4uLAorCWxjc0FQTgkJWzVdIEFQTgkJT1BUSU9OQUwsCisJbGNzUmVxdWVzdG9ySUQJWzZdIExDU1JlcXVlc3RvcklECU9QVElPTkFMIH0KKworTENTQ2xpZW50VHlwZSA6Oj0gRU5VTUVSQVRFRCB7CisJZW1lcmdlbmN5U2VydmljZXMJKDApLAorCXZhbHVlQWRkZWRTZXJ2aWNlcwkoMSksCisJcGxtbk9wZXJhdG9yU2VydmljZXMJKDIpLAorCWxhd2Z1bEludGVyY2VwdFNlcnZpY2VzCSgzKSwKKwkuLi4gfQorCS0tCWV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLQl1bnJlY29nbml6ZWQgdmFsdWVzIG1heSBiZSBpZ25vcmVkIGlmIHRoZSBMQ1MgY2xpZW50IHVzZXMgdGhlIHByaXZhY3kgb3ZlcnJpZGUKKwktLQlvdGhlcndpc2UsIGFuIHVucmVjb2duaXplZCB2YWx1ZSBzaGFsbCBiZSB0cmVhdGVkIGFzIHVuZXhwZWN0ZWQgZGF0YSBieSBhIHJlY2VpdmVyCisJLS0JYSByZXR1cm4gZXJyb3Igc2hhbGwgdGhlbiBiZSByZXR1cm5lZCBpZiByZWNlaXZlZCBpbiBhIE1BUCBpbnZva2UgCisKK0xDU0NsaWVudE5hbWUgOjo9IFNFUVVFTkNFIHsKKwlkYXRhQ29kaW5nU2NoZW1lCVswXSBVU1NELURhdGFDb2RpbmdTY2hlbWUsCisJbmFtZVN0cmluZwlbMl0gTmFtZVN0cmluZywKKwkuLi4sCisJbGNzLUZvcm1hdEluZGljYXRvcglbM10gTENTLUZvcm1hdEluZGljYXRvcglPUFRJT05BTCB9CisKKy0tIFRoZSBVU1NELURhdGFDb2RpbmdTY2hlbWUgc2hhbGwgaW5kaWNhdGUgdXNlIG9mIHRoZSBkZWZhdWx0IGFscGhhYmV0IHRocm91Z2ggdGhlCistLSBmb2xsb3dpbmcgZW5jb2RpbmcKKy0tCWJpdAk3IDYgNSA0IDMgMiAxIDAKKy0tCQkwIDAgMCAwIDEgMSAxIDEKKworTmFtZVN0cmluZyA6Oj0gVVNTRC1TdHJpbmcgKFNJWkUgKDEuLm1heE5hbWVTdHJpbmdMZW5ndGgpKQorCittYXhOYW1lU3RyaW5nTGVuZ3RoICBJTlRFR0VSIDo6PSA2MworCitMQ1NSZXF1ZXN0b3JJRCA6Oj0gU0VRVUVOQ0UgeworCWRhdGFDb2RpbmdTY2hlbWUJWzBdIFVTU0QtRGF0YUNvZGluZ1NjaGVtZSwKKwlyZXF1ZXN0b3JJRFN0cmluZwlbMV0gUmVxdWVzdG9ySURTdHJpbmcsCisJLi4uLAorCWxjcy1Gb3JtYXRJbmRpY2F0b3IJWzJdIExDUy1Gb3JtYXRJbmRpY2F0b3IJT1BUSU9OQUwgfQorCitSZXF1ZXN0b3JJRFN0cmluZyA6Oj0gVVNTRC1TdHJpbmcgKFNJWkUgKDEuLm1heFJlcXVlc3RvcklEU3RyaW5nTGVuZ3RoKSkKKworbWF4UmVxdWVzdG9ySURTdHJpbmdMZW5ndGggIElOVEVHRVIgOjo9IDYzCisKK0xDUy1Gb3JtYXRJbmRpY2F0b3IgOjo9IEVOVU1FUkFURUQgeworCWxvZ2ljYWxOYW1lCSgwKSwKKwllLW1haWxBZGRyZXNzCSgxKSwKKwltc2lzZG4JCSgyKSwKKwl1cmwJCQkoMyksCisJc2lwVXJsCQkoNCksCisJLi4uIH0KKworTENTLVByaW9yaXR5IDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIDAgPSBoaWdoZXN0IHByaW9yaXR5CisJLS0gMSA9IG5vcm1hbCBwcmlvcml0eQorCS0tIGFsbCBvdGhlciB2YWx1ZXMgdHJlYXRlZCBhcyAxIAorCitMQ1MtUW9TIDo6PSBTRVFVRU5DRSB7CisJaG9yaXpvbnRhbC1hY2N1cmFjeQlbMF0gSG9yaXpvbnRhbC1BY2N1cmFjeQlPUFRJT05BTCwKKwl2ZXJ0aWNhbENvb3JkaW5hdGVSZXF1ZXN0CVsxXSBOVUxMCQlPUFRJT05BTCwKKwl2ZXJ0aWNhbC1hY2N1cmFjeQlbMl0gVmVydGljYWwtQWNjdXJhY3kJT1BUSU9OQUwsCXJlc3BvbnNlVGltZQlbM10gUmVzcG9uc2VUaW1lCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwl2ZWxvY2l0eVJlcXVlc3QJWzVdIE5VTEwJCU9QVElPTkFMCit9CisKK0hvcml6b250YWwtQWNjdXJhY3kgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gYml0IDggPSAwCisJLS0gYml0cyA3LTEgPSA3IGJpdCBVbmNlcnRhaW50eSBDb2RlIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMzIuIFRoZSBob3Jpem9udGFsIGxvY2F0aW9uIAorCS0tIGVycm9yIHNob3VsZCBiZSBsZXNzIHRoYW4gdGhlIGVycm9yIGluZGljYXRlZCBieSB0aGUgdW5jZXJ0YWludHkgY29kZSB3aXRoIDY3JQorCS0tIGNvbmZpZGVuY2UuCisKK1ZlcnRpY2FsLUFjY3VyYWN5IDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIGJpdCA4ID0gMAorCS0tIGJpdHMgNy0xID0gNyBiaXQgVmVydGljYWwgVW5jZXJ0YWludHkgQ29kZSBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyLiAKKwktLSBUaGUgdmVydGljYWwgbG9jYXRpb24gZXJyb3Igc2hvdWxkIGJlIGxlc3MgdGhhbiB0aGUgZXJyb3IgaW5kaWNhdGVkIAorCS0tIGJ5IHRoZSB1bmNlcnRhaW50eSBjb2RlIHdpdGggNjclIGNvbmZpZGVuY2UuCisKK1Jlc3BvbnNlVGltZSA6Oj0gU0VRVUVOQ0UgeworCXJlc3BvbnNlVGltZUNhdGVnb3J5CVJlc3BvbnNlVGltZUNhdGVnb3J5LAorCS4uLn0KKy0tCW5vdGU6IGFuIGV4cGFuZGFibGUgU0VRVUVOQ0Ugc2ltcGxpZmllcyBsYXRlciBhZGRpdGlvbiBvZiBhIG51bWVyaWMgcmVzcG9uc2UgdGltZS4KKworUmVzcG9uc2VUaW1lQ2F0ZWdvcnkgOjo9IEVOVU1FUkFURUQgeworCWxvd2RlbGF5ICAoMCksCisJZGVsYXl0b2xlcmFudCAgKDEpLAorCS4uLiB9CistLQlleGNlcHRpb24gaGFuZGxpbmc6CistLQlhbiB1bnJlY29nbml6ZWQgdmFsdWUgc2hhbGwgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyB2YWx1ZSAxIChkZWxheXRvbGVyYW50KQorCitTdXBwb3J0ZWRHQURTaGFwZXMgOjo9IEJJVCBTVFJJTkcgeworCWVsbGlwc29pZFBvaW50ICAoMCksCisJZWxsaXBzb2lkUG9pbnRXaXRoVW5jZXJ0YWludHlDaXJjbGUgKDEpLAorCWVsbGlwc29pZFBvaW50V2l0aFVuY2VydGFpbnR5RWxsaXBzZSAoMiksCisJcG9seWdvbiAoMyksCisJZWxsaXBzb2lkUG9pbnRXaXRoQWx0aXR1ZGUgKDQpLAorCWVsbGlwc29pZFBvaW50V2l0aEFsdGl0dWRlQW5kVW5jZXJ0YWludHlFbGlwc29pZCAoNSksCisJZWxsaXBzb2lkQXJjICAoNikgfSAoU0laRSAoNy4uMTYpKQorLS0gQSBub2RlIHNoYWxsIG1hcmsgaW4gdGhlIEJJVCBTVFJJTkcgYWxsIFNoYXBlcyBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyIGl0IHN1cHBvcnRzLgorLS0gZXhjZXB0aW9uIGhhbmRsaW5nOiBiaXRzIDcgdG8gMTUgc2hhbGwgYmUgaWdub3JlZCBpZiByZWNlaXZlZC4KKworTENTLVJlZmVyZW5jZU51bWJlcjo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUoMSkpCisKK0xDU0NvZGV3b3JkIDo6PSBTRVFVRU5DRSB7CisJZGF0YUNvZGluZ1NjaGVtZQlbMF0gVVNTRC1EYXRhQ29kaW5nU2NoZW1lLAorCWxjc0NvZGV3b3JkU3RyaW5nCVsxXSBMQ1NDb2Rld29yZFN0cmluZywKKwkuLi59CisKK0xDU0NvZGV3b3JkU3RyaW5nIDo6PSBVU1NELVN0cmluZyAoU0laRSAoMS4ubWF4TENTQ29kZXdvcmRTdHJpbmdMZW5ndGgpKQorCittYXhMQ1NDb2Rld29yZFN0cmluZ0xlbmd0aCAgSU5URUdFUiA6Oj0gMjAKKworTENTLVByaXZhY3lDaGVjayA6Oj0gU0VRVUVOQ0UgeworCWNhbGxTZXNzaW9uVW5yZWxhdGVkCVswXSBQcml2YWN5Q2hlY2tSZWxhdGVkQWN0aW9uLAorCWNhbGxTZXNzaW9uUmVsYXRlZAlbMV0gUHJpdmFjeUNoZWNrUmVsYXRlZEFjdGlvbglPUFRJT05BTCwKKwkuLi59CisKK1ByaXZhY3lDaGVja1JlbGF0ZWRBY3Rpb24gOjo9IEVOVU1FUkFURUQgeworCWFsbG93ZWRXaXRob3V0Tm90aWZpY2F0aW9uICgwKSwKKwlhbGxvd2VkV2l0aE5vdGlmaWNhdGlvbiAoMSksCisJYWxsb3dlZElmTm9SZXNwb25zZSAoMiksCisJcmVzdHJpY3RlZElmTm9SZXNwb25zZSAoMyksCisJbm90QWxsb3dlZCAoNCksCisJLi4ufQorLS0JZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0JYSBQcm92aWRlU3Vic2NyaWJlckxvY2F0aW9uLUFyZyBjb250YWluaW5nIGFuIHVucmVjb2duaXplZCBQcml2YWN5Q2hlY2tSZWxhdGVkQWN0aW9uCistLQlzaGFsbCBiZSByZWplY3RlZCBieSB0aGUgcmVjZWl2ZXIgd2l0aCBhIHJldHVybiBlcnJvciBjYXVzZSBvZiB1bmV4cGVjdGVkIGRhdGEgdmFsdWUKKworQXJlYUV2ZW50SW5mbyA6Oj0gU0VRVUVOQ0UgeworCWFyZWFEZWZpbml0aW9uCVswXQlBcmVhRGVmaW5pdGlvbiwKKwlvY2N1cnJlbmNlSW5mbwlbMV0JT2NjdXJyZW5jZUluZm8JT1BUSU9OQUwsCisJaW50ZXJ2YWxUaW1lCVsyXQlJbnRlcnZhbFRpbWUJT1BUSU9OQUwsCisJLi4ufQorCitBcmVhRGVmaW5pdGlvbiA6Oj0gU0VRVUVOQ0UgeworCWFyZWFMaXN0CQlbMF0JQXJlYUxpc3QsCisJLi4ufQorCitBcmVhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZBcmVhcykgT0YgQXJlYQorCittYXhOdW1PZkFyZWFzICBJTlRFR0VSIDo6PSAxMAorCitBcmVhIDo6PSBTRVFVRU5DRSB7CisJYXJlYVR5cGUJCVswXQlBcmVhVHlwZSwKKwlhcmVhSWRlbnRpZmljYXRpb24JWzFdCUFyZWFJZGVudGlmaWNhdGlvbiwKKwkuLi59CisKK0FyZWFUeXBlIDo6PSBFTlVNRVJBVEVEIHsKKwljb3VudHJ5Q29kZQkoMCksCisJcGxtbklkCQkoMSksCisJbG9jYXRpb25BcmVhSWQJKDIpLAorCXJvdXRpbmdBcmVhSWQJKDMpLAorCWNlbGxHbG9iYWxJZAkoNCksCisJLi4uLAorCXV0cmFuQ2VsbElkCSg1KSB9CisKK0FyZWFJZGVudGlmaWNhdGlvbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgyLi43KSkKKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKwktLSBvY3RldCAxIGJpdHMgNDMyMQlNb2JpbGUgQ291bnRyeSBDb2RlIDFzdCBkaWdpdAorCS0tICAgICAgICAgYml0cyA4NzY1CU1vYmlsZSBDb3VudHJ5IENvZGUgMm5kIGRpZ2l0CisJLS0gb2N0ZXQgMiBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAzcmQgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgTmV0d29yayBDb2RlIDNyZCBkaWdpdCBpZiAzIGRpZ2l0IE1OQyBpbmNsdWRlZAorCS0tCQkJb3IgZmlsbGVyICgxMTExKQorCS0tIG9jdGV0IDMgYml0cyA0MzIxCU1vYmlsZSBOZXR3b3JrIENvZGUgMXN0IGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAybmQgZGlnaXQKKwktLSBvY3RldHMgNCBhbmQgNQlMb2NhdGlvbiBBcmVhIENvZGUgKExBQykgZm9yIExvY2FsIEFyZWEgSWQsCisJLS0JCQlSb3V0aW5nIEFyZWEgSWQgYW5kIENlbGwgR2xvYmFsIElkCisJLS0gb2N0ZXQgNglSb3V0aW5nIEFyZWEgQ29kZSAoUkFDKSBmb3IgUm91dGluZyBBcmVhIElkCisJLS0gb2N0ZXRzIDYgYW5kIDcJQ2VsbCBJZGVudGl0eSAoQ0kpIGZvciBDZWxsIEdsb2JhbCBJZAorCS0tIG9jdGV0cyA0IHVudGlsIDcJVXRyYW4gQ2VsbCBJZGVudGl0eSAoVUMtSWQpIGZvciBVdHJhbiBDZWxsIElkCisKK09jY3VycmVuY2VJbmZvIDo6PSBFTlVNRVJBVEVEIHsKKwlvbmVUaW1lRXZlbnQJKDApLAorCW11bHRpcGxlVGltZUV2ZW50CSgxKSwKKwkuLi59CisKK0ludGVydmFsVGltZSA6Oj0gSU5URUdFUiAoMS4uMzI3NjcpCisJLS0gbWluaW11bSBpbnRlcnZhbCB0aW1lIGJldHdlZW4gYXJlYSByZXBvcnRzIGluIHNlY29uZHMKKworUGVyaW9kaWNMRFJJbmZvIDo6PSBTRVFVRU5DRSB7CisJcmVwb3J0aW5nQW1vdW50CQlSZXBvcnRpbmdBbW91bnQsCisJcmVwb3J0aW5nSW50ZXJ2YWwJUmVwb3J0aW5nSW50ZXJ2YWwsCisJLi4ufQorLS0gcmVwb3J0aW5nSW50ZXJ2YWwgeCByZXBvcnRpbmdBbW91bnQgc2hhbGwgbm90IGV4Y2VlZCA4NjM5OTk5ICg5OSBkYXlzLCAyMyBob3VycywKKy0tIDU5IG1pbnV0ZXMgYW5kIDU5IHNlY29uZHMpIGZvciBjb21wYXRpYmlsaXR5IHdpdGggT01BIE1MUCBhbmQgUkxQCisKK1JlcG9ydGluZ0Ftb3VudCA6Oj0gSU5URUdFUiAoMS4ubWF4UmVwb3J0aW5nQW1vdW50KQorCittYXhSZXBvcnRpbmdBbW91bnQgSU5URUdFUiA6Oj0gODYzOTk5OQorCitSZXBvcnRpbmdJbnRlcnZhbCA6Oj0gSU5URUdFUiAoMS4ubWF4UmVwb3J0aW5nSW50ZXJ2YWwpCistLSBSZXBvcnRpbmdJbnRlcnZhbCBpcyBpbiBzZWNvbmRzCisKK21heFJlcG9ydGluZ0ludGVydmFsIElOVEVHRVIgOjo9IDg2Mzk5OTkKKworUmVwb3J0aW5nUExNTkxpc3Q6Oj0gU0VRVUVOQ0UgeworCXBsbW4tTGlzdFByaW9yaXRpemVkCQkJWzBdIE5VTEwJCQkJCU9QVElPTkFMLAorCXBsbW4tTGlzdCAJCQkJCQlbMV0gUExNTkxpc3QsCisJLi4ufQorCitQTE1OTGlzdDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlJlcG9ydGluZ1BMTU4pIE9GCisJCQkJUmVwb3J0aW5nUExNTgorCittYXhOdW1PZlJlcG9ydGluZ1BMTU4gSU5URUdFUiA6Oj0gMjAKKworUmVwb3J0aW5nUExNTjo6PSBTRVFVRU5DRSB7CisJcGxtbi1JZCAJCQkJCQlbMF0gUExNTi1JZCwKKwlyYW4tVGVjaG5vbG9neSAJCQkJCVsxXSBSQU4tVGVjaG5vbG9neQkJCU9QVElPTkFMLAorCXJhbi1QZXJpb2RpY0xvY2F0aW9uU3VwcG9ydAkJWzJdIE5VTEwJCQkJCU9QVElPTkFMLAorCS4uLn0KKworUkFOLVRlY2hub2xvZ3kgOjo9IEVOVU1FUkFURUQgeworCWdzbQkJCSgwKSwKKwl1bXRzCQkoMSksCisJLi4ufQorCitQcm92aWRlU3Vic2NyaWJlckxvY2F0aW9uLVJlcyA6Oj0gU0VRVUVOQ0UgeworCWxvY2F0aW9uRXN0aW1hdGUJRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uLAorCWFnZU9mTG9jYXRpb25Fc3RpbWF0ZQlbMF0gQWdlT2ZMb2NhdGlvbkluZm9ybWF0aW9uCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJYWRkLUxvY2F0aW9uRXN0aW1hdGUJWzJdIEFkZC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiAJT1BUSU9OQUwsCisJZGVmZXJyZWRtdC1sclJlc3BvbnNlSW5kaWNhdG9yCVszXSBOVUxMCQlPUFRJT05BTCwKKwlnZXJhblBvc2l0aW9uaW5nRGF0YQlbNF0gUG9zaXRpb25pbmdEYXRhSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJdXRyYW5Qb3NpdGlvbmluZ0RhdGEJWzVdIFV0cmFuUG9zaXRpb25pbmdEYXRhSW5mbwlPUFRJT05BTCwKKwljZWxsSWRPclNhaQlbNl0gQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUkJT1BUSU9OQUwsCisJc2FpLVByZXNlbnQJWzddIE5VTEwJCU9QVElPTkFMLAorCWFjY3VyYWN5RnVsZmlsbWVudEluZGljYXRvcglbOF0gQWNjdXJhY3lGdWxmaWxtZW50SW5kaWNhdG9yCQlPUFRJT05BTCwKKwl2ZWxvY2l0eUVzdGltYXRlCVs5XSBWZWxvY2l0eUVzdGltYXRlCU9QVElPTkFMLAorCW1vLWxyU2hvcnRDaXJjdWl0SW5kaWNhdG9yCVsxMF0gTlVMTAkJT1BUSU9OQUwgfQorCistLQlpZiBkZWZlcnJlZG10LWxyUmVzcG9uc2VJbmRpY2F0b3IgaXMgc2V0LCBsb2NhdGlvbkVzdGltYXRlIGlzIGlnbm9yZWQuCisKKy0tIHRoZSBhZGQtTG9jYXRpb25Fc3RpbWF0ZSBwYXJhbWV0ZXIgc2hhbGwgbm90IGJlIHNlbnQgdG8gYSBub2RlIHRoYXQgZGlkIG5vdCBpbmRpY2F0ZSB0aGUKKy0tIGdlb2dyYXBoaWMgc2hhcGVzIHN1cHBvcnRlZCBpbiB0aGUgUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbi1BcmcKKy0tIFRoZSBsb2NhdGlvbkVzdGltYXRlIGFuZCB0aGUgYWRkLWxvY2F0aW9uRXN0aW1hdGUgcGFyYW1ldGVycyBzaGFsbCBub3QgYmUgc2VudCBpZgorLS0gdGhlIHN1cHBvcnRlZEdBRFNoYXBlcyBwYXJhbWV0ZXIgaGFzIGJlZW4gcmVjZWl2ZWQgaW4gUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbi1BcmcKKy0tIGFuZCB0aGUgc2hhcGUgZW5jb2RlZCBpbiBsb2NhdGlvbkVzdGltYXRlIG9yIGFkZC1Mb2NhdGlvbkVzdGltYXRlIGlzIG5vdCBtYXJrZWQKKy0tIGFzIHN1cHBvcnRlZCBpbiBzdXBwb3J0ZWRHQURTaGFwZXMuIEluIHN1Y2ggYSBjYXNlIFByb3ZpZGVTdWJzY3JpYmVyTG9jYXRpb24KKy0tIHNoYWxsIGJlIHJlamVjdGVkIHdpdGggZXJyb3IgRmFjaWxpdHlOb3RTdXBwb3J0ZWQgd2l0aCBhZGRpdGlvbmFsIGluZGljYXRpb24KKy0tIHNoYXBlT2ZMb2NhdGlvbkVzdGltYXRlTm90U3VwcG9ydGVkLgorLS0gc2FpLVByZXNlbnQgaW5kaWNhdGVzIHRoYXQgdGhlIGNlbGxJZE9yU2FpIHBhcmFtZXRlciBjb250YWlucyBhIFNlcnZpY2UgQXJlYSBJZGVudGl0eS4KKworQWNjdXJhY3lGdWxmaWxtZW50SW5kaWNhdG9yIDo6PSBFTlVNRVJBVEVEIHsKKwlyZXF1ZXN0ZWRBY2N1cmFjeUZ1bGZpbGxlZCAgKDApLAorCXJlcXVlc3RlZEFjY3VyYWN5Tm90RnVsZmlsbGVkICAoMSksCisJLi4uCX0KKworRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heEV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbikpCisJLS0gUmVmZXJzIHRvIGdlb2dyYXBoaWNhbCBJbmZvcm1hdGlvbiBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyLgorCS0tIFRoaXMgaXMgY29tcG9zZWQgb2YgMSBvciBtb3JlIG9jdGV0cyB3aXRoIGFuIGludGVybmFsIHN0cnVjdHVyZSBhY2NvcmRpbmcgdG8KKwktLSAzR1BQIFRTIDIzLjAzMgorCS0tIE9jdGV0IDE6IFR5cGUgb2Ygc2hhcGUsIG9ubHkgdGhlIGZvbGxvd2luZyBzaGFwZXMgaW4gM0dQUCBUUyAyMy4wMzIgYXJlIGFsbG93ZWQ6CisJLS0JCShhKSBFbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBjaXJjbGUKKwktLQkJKGIpIEVsbGlwc29pZCBwb2ludCB3aXRoIHVuY2VydGFpbnR5IGVsbGlwc2UKKwktLQkJKGMpIEVsbGlwc29pZCBwb2ludCB3aXRoIGFsdGl0dWRlIGFuZCB1bmNlcnRhaW50eSBlbGxpcHNvaWQKKwktLQkJKGQpIEVsbGlwc29pZCBBcmMKKwktLQkJKGUpIEVsbGlwc29pZCBQb2ludAorCS0tIEFueSBvdGhlciB2YWx1ZSBpbiBvY3RldCAxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgaW52YWxpZAorCS0tIE9jdGV0cyAyIHRvIDggZm9yIGNhc2UgKGEpIJYgRWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgY2lyY2xlCisJLS0JCURlZ3JlZXMgb2YgTGF0aXR1ZGUJCQkJMyBvY3RldHMKKwktLQkJRGVncmVlcyBvZiBMb25naXR1ZGUJCQkJMyBvY3RldHMKKwktLQkJVW5jZXJ0YWludHkgY29kZQkJCQkxIG9jdGV0CisJLS0gT2N0ZXRzIDIgdG8gMTEgZm9yIGNhc2UgKGIpIJYgRWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgZWxsaXBzZToKKwktLQkJRGVncmVlcyBvZiBMYXRpdHVkZQkJCQkzIG9jdGV0cworCS0tCQlEZWdyZWVzIG9mIExvbmdpdHVkZQkJCQkzIG9jdGV0cworCS0tCQlVbmNlcnRhaW50eSBzZW1pLW1ham9yIGF4aXMJCQkJMSBvY3RldAorCS0tCQlVbmNlcnRhaW50eSBzZW1pLW1pbm9yIGF4aXMJCQkJMSBvY3RldAorCS0tCQlBbmdsZSBvZiBtYWpvciBheGlzCQkJCTEgb2N0ZXQKKwktLQkJQ29uZmlkZW5jZQkJCQkxIG9jdGV0CisJLS0gT2N0ZXRzIDIgdG8gMTQgZm9yIGNhc2UgKGMpIJYgRWxsaXBzb2lkIHBvaW50IHdpdGggYWx0aXR1ZGUgYW5kIHVuY2VydGFpbnR5IGVsbGlwc29pZAorCS0tCQlEZWdyZWVzIG9mIExhdGl0dWRlCQkJCTMgb2N0ZXRzCisJLS0JCURlZ3JlZXMgb2YgTG9uZ2l0dWRlCQkJCTMgb2N0ZXRzCisJLS0JCUFsdGl0dWRlCQkJCTIgb2N0ZXRzCisJLS0JCVVuY2VydGFpbnR5IHNlbWktbWFqb3IgYXhpcwkJCQkxIG9jdGV0CisJLS0JCVVuY2VydGFpbnR5IHNlbWktbWlub3IgYXhpcwkJCQkxIG9jdGV0CisJLS0JCUFuZ2xlIG9mIG1ham9yIGF4aXMJCQkJMSBvY3RldAorCS0tCQlVbmNlcnRhaW50eSBhbHRpdHVkZQkJCQkxIG9jdGV0CisJLS0JCUNvbmZpZGVuY2UJCQkJMSBvY3RldAorCS0tIE9jdGV0cyAyIHRvIDEzIGZvciBjYXNlIChkKSCWIEVsbGlwc29pZCBBcmMKKwktLQkJRGVncmVlcyBvZiBMYXRpdHVkZQkJCQkzIG9jdGV0cworCS0tCQlEZWdyZWVzIG9mIExvbmdpdHVkZQkJCQkzIG9jdGV0cworCS0tCQlJbm5lciByYWRpdXMJCQkJMiBvY3RldHMKKwktLQkJVW5jZXJ0YWludHkgcmFkaXVzCQkJCTEgb2N0ZXQKKwktLQkJT2Zmc2V0IGFuZ2xlCQkJCTEgb2N0ZXQKKwktLQkJSW5jbHVkZWQgYW5nbGUJCQkJMSBvY3RldAorCS0tCQlDb25maWRlbmNlCQkJCTEgb2N0ZXQKKwktLSBPY3RldHMgMiB0byA3IGZvciBjYXNlIChlKSCWIEVsbGlwc29pZCBQb2ludAorCS0tCQlEZWdyZWVzIG9mIExhdGl0dWRlCQkJCTMgb2N0ZXRzCisJLS0JCURlZ3JlZXMgb2YgTG9uZ2l0dWRlCQkJCTMgb2N0ZXRzCisKKwktLQorCS0tIEFuIEV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiBwYXJhbWV0ZXIgY29tcHJpc2luZyBtb3JlIHRoYW4gb25lIG9jdGV0IGFuZAorCS0tIGNvbnRhaW5pbmcgYW55IG90aGVyIHNoYXBlIG9yIGFuIGluY29ycmVjdCBudW1iZXIgb2Ygb2N0ZXRzIG9yIGNvZGluZyBhY2NvcmRpbmcKKwktLSB0byAzR1BQIFRTIDIzLjAzMiBzaGFsbCBiZSB0cmVhdGVkIGFzIGludmFsaWQgZGF0YSBieSBhIHJlY2VpdmVyLgorCS0tCisJLS0gQW4gRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIHBhcmFtZXRlciBjb21wcmlzaW5nIG9uZSBvY3RldCBzaGFsbCBiZSBkaXNjYXJkZWQKKwktLSBieSB0aGUgcmVjZWl2ZXIgaWYgYW4gQWRkLUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIHBhcmFtZXRlciBpcyByZWNlaXZlZCAKKwktLSBpbiB0aGUgc2FtZSBtZXNzYWdlLgorCS0tCisJLS0gQW4gRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIHBhcmFtZXRlciBjb21wcmlzaW5nIG9uZSBvY3RldCBzaGFsbCBiZSB0cmVhdGVkIGFzCisJLS0gaW52YWxpZCBkYXRhIGJ5IHRoZSByZWNlaXZlciBpZiBhbiBBZGQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gcGFyYW1ldGVyIGlzIG5vdAorCS0tIHJlY2VpdmVkIGluIHRoZSBzYW1lIG1lc3NhZ2UuCisKK21heEV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiAgSU5URUdFUiA6Oj0gMjAKKwktLSB0aGUgbWF4aW11bSBsZW5ndGggYWxsb3dzIGZvciBmdXJ0aGVyIHNoYXBlcyBpbiAzR1BQIFRTIDIzLjAzMiB0byBiZSBpbmNsdWRlZCBpbiBsYXRlciAKKwktLSB2ZXJzaW9ucyBvZiAzR1BQIFRTIDI5LjAwMgorCitWZWxvY2l0eUVzdGltYXRlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDQuLjcpKQorCS0tIFJlZmVycyB0byBWZWxvY2l0eSBkZXNjcmlwdGlvbiBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyLgorCS0tIFRoaXMgaXMgY29tcG9zZWQgb2YgNCBvciBtb3JlIG9jdGV0cyB3aXRoIGFuIGludGVybmFsIHN0cnVjdHVyZSBhY2NvcmRpbmcgdG8KKwktLSAzR1BQIFRTIDIzLjAzMgorCS0tIE9jdGV0IDE6IFR5cGUgb2YgdmVsb2NpdHksIG9ubHkgdGhlIGZvbGxvd2luZyB0eXBlcyBpbiAzR1BQIFRTIDIzLjAzMiBhcmUgYWxsb3dlZDoKKwktLQkJKGEpIEhvcml6b250YWwgVmVsb2NpdHkKKwktLQkJKGIpIEhvcml6b250YWwgd2l0aCBWZXJ0aWNhbCBWZWxvY2l0eQorCS0tCQkoYykgSG9yaXpvbnRhbCBWZWxvY2l0eSB3aXRoIFVuY2VydGFpbnR5CisJLS0JCShkKSBIb3Jpem9udGFsIHdpdGggVmVydGljYWwgVmVsb2NpdHkgYW5kIFVuY2VydGFpbnR5CisJLS0gRm9yIHR5cGVzIEhvcml6b250YWwgd2l0aCBWZXJ0aWNhbCBWZWxvY2l0eSBhbmQgSG9yaXpvbnRhbCB3aXRoIFZlcnRpY2FsIFZlbG9jaXR5CisJLS0gYW5kIFVuY2VydGFpbnR5LCB0aGUgZGlyZWN0aW9uIG9mIHRoZSBWZXJ0aWNhbCBTcGVlZCBpcyBhbHNvIGluY2x1ZGVkIGluIE9jdGV0IDEKKwktLSBBbnkgb3RoZXIgdmFsdWUgaW4gb2N0ZXQgMSBzaGFsbCBiZSB0cmVhdGVkIGFzIGludmFsaWQKKwktLSBPY3RldHMgMiB0byA0IGZvciBjYXNlIChhKSBIb3Jpem9udGFsIHZlbG9jaXR5OgorCS0tCQlCZWFyaW5nCQkJCTEgb2N0ZXQKKwktLQkJSG9yaXpvbnRhbCBTcGVlZAkJCQkyIG9jdGV0cworCS0tIE9jdGV0cyAyIHRvIDUgZm9yIGNhc2UgKGIpIJYgSG9yaXpvbnRhbCB3aXRoIFZlcnRpY2FsIFZlbG9jaXR5OgorCS0tCQlCZWFyaW5nCQkJCTEgb2N0ZXQKKwktLQkJSG9yaXpvbnRhbCBTcGVlZAkJCQkyIG9jdGV0cworCS0tCQlWZXJ0aWNhbCBTcGVlZAkJCQkxIG9jdGV0CisJLS0gT2N0ZXRzIDIgdG8gNSBmb3IgY2FzZSAoYykgliBIb3Jpem9udGFsIHZlbG9jaXR5IHdpdGggVW5jZXJ0YWludHk6CisJLS0JCUJlYXJpbmcJCQkJMSBvY3RldAorCS0tCQlIb3Jpem9udGFsIFNwZWVkCQkJCTIgb2N0ZXRzCisJLS0JCVVuY2VydGFpbnR5IFNwZWVkCQkJCTEgb2N0ZXQKKwktLSBPY3RldHMgMiB0byA3IGZvciBjYXNlIChkKSCWIEhvcml6b250YWwgd2l0aCBWZXJ0aWNhbCBWZWxvY2l0eSBhbmQgVW5jZXJ0YWludHk6CisJLS0JCUJlYXJpbmcJCQkJMSBvY3RldAorCS0tCQlIb3Jpem9udGFsIFNwZWVkCQkJCTIgb2N0ZXRzCisJLS0JCVZlcnRpY2FsIFNwZWVkCQkJCTEgb2N0ZXQKKwktLQkJSG9yaXpvbnRhbCBVbmNlcnRhaW50eSBTcGVlZAkJCTEgb2N0ZXQKKwktLQkJVmVydGljYWwgVW5jZXJ0YWludHkgU3BlZWQJCQkJMSBvY3RldAorCitQb3NpdGlvbmluZ0RhdGFJbmZvcm1hdGlvbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgyLi5tYXhQb3NpdGlvbmluZ0RhdGFJbmZvcm1hdGlvbikpCisJLS0gUmVmZXJzIHRvIHRoZSBQb3NpdGlvbmluZyBEYXRhIGRlZmluZWQgaW4gM0dQUCBUUyA0OS4wMzEuCisJLS0gVGhpcyBpcyBjb21wb3NlZCBvZiAyIG9yIG1vcmUgb2N0ZXRzIHdpdGggYW4gaW50ZXJuYWwgc3RydWN0dXJlIGFjY29yZGluZyB0bworCS0tIDNHUFAgVFMgNDkuMDMxLiAKKworbWF4UG9zaXRpb25pbmdEYXRhSW5mb3JtYXRpb24gSU5URUdFUiA6Oj0gMTAKKwktLSAKKworVXRyYW5Qb3NpdGlvbmluZ0RhdGFJbmZvIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDMuLm1heFV0cmFuUG9zaXRpb25pbmdEYXRhSW5mbykpCisJLS0gUmVmZXJzIHRvIHRoZSBQb3NpdGlvbiBEYXRhIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMuCisJLS0gVGhpcyBpcyBjb21wb3NlZCBvZiB0aGUgcG9zaXRpb25pbmdEYXRhRGlzY3JpbWluYXRvciBhbmQgdGhlIHBvc2l0aW9uaW5nRGF0YVNldAorCS0tIGluY2x1ZGVkIGluIHBvc2l0aW9uRGF0YSBhcyBkZWZpbmVkIGluIDNHUFAgVFMgMjUuNDEzLgorCittYXhVdHJhblBvc2l0aW9uaW5nRGF0YUluZm8gSU5URUdFUiA6Oj0gMTEKKwktLSAKKworQWRkLUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heEFkZC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbikpCisJLS0gUmVmZXJzIHRvIGdlb2dyYXBoaWNhbCBJbmZvcm1hdGlvbiBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyLgorCS0tIFRoaXMgaXMgY29tcG9zZWQgb2YgMSBvciBtb3JlIG9jdGV0cyB3aXRoIGFuIGludGVybmFsIHN0cnVjdHVyZSBhY2NvcmRpbmcgdG8gCisJLS0gM0dQUCBUUyAyMy4wMzIKKwktLSBPY3RldCAxOiBUeXBlIG9mIHNoYXBlLCBhbGwgdGhlIHNoYXBlcyBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyIGFyZSBhbGxvd2VkOgorCS0tIE9jdGV0cyAyIHRvIG4gKHdoZXJlIG4gaXMgdGhlIHRvdGFsIG51bWJlciBvZiBvY3RldHMgbmVjZXNzYXJ5IHRvIGVuY29kZSB0aGUgc2hhcGUKKwktLSBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyMy4wMzIpIGFyZSB1c2VkIHRvIGVuY29kZSB0aGUgc2hhcGUgaXRzZWxmIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUKKwktLSBlbmNvZGluZyBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyCisJLS0KKwktLSBBbiBBZGQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gcGFyYW1ldGVyLCB3aGV0aGVyIHZhbGlkIG9yIGludmFsaWQsIHJlY2VpdmVkIAorCS0tIHRvZ2V0aGVyIHdpdGggYSB2YWxpZCBFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gcGFyYW1ldGVyIGluIHRoZSBzYW1lIG1lc3NhZ2UgCisJLS0gc2hhbGwgYmUgZGlzY2FyZGVkLgorCS0tCisJLS0gQW4gQWRkLUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uIHBhcmFtZXRlciBjb250YWluaW5nIGFueSBzaGFwZSBub3QgZGVmaW5lZCBpbiAKKwktLSAzR1BQIFRTIDIzLjAzMiBvciBhbiBpbmNvcnJlY3QgbnVtYmVyIG9mIG9jdGV0cyBvciBjb2RpbmcgYWNjb3JkaW5nIHRvIAorCS0tIDNHUFAgVFMgMjMuMDMyIHNoYWxsIGJlIHRyZWF0ZWQgYXMgaW52YWxpZCBkYXRhIGJ5IGEgcmVjZWl2ZXIgaWYgbm90IHJlY2VpdmVkIAorCS0tIHRvZ2V0aGVyIHdpdGggYSB2YWxpZCBFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gcGFyYW1ldGVyIGluIHRoZSBzYW1lIG1lc3NhZ2UuCisKK21heEFkZC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiAgSU5URUdFUiA6Oj0gOTEKKwktLSB0aGUgbWF4aW11bSBsZW5ndGggYWxsb3dzIHN1cHBvcnQgZm9yIGFsbCB0aGUgc2hhcGVzIGN1cnJlbnRseSBkZWZpbmVkIGluIDNHUFAgVFMgMjMuMDMyCisKK1N1YnNjcmliZXJMb2NhdGlvblJlcG9ydC1BcmcgOjo9IFNFUVVFTkNFIHsKKwlsY3MtRXZlbnQJCUxDUy1FdmVudCwKKwlsY3MtQ2xpZW50SUQJTENTLUNsaWVudElELCAKKwlsY3NMb2NhdGlvbkluZm8JTENTTG9jYXRpb25JbmZvLAorCW1zaXNkbgkJWzBdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlpbXNpCQkJWzFdIElNU0kJCU9QVElPTkFMLAorCWltZWkJCQlbMl0gSU1FSQkJT1BUSU9OQUwsCisJbmEtRVNSRAkJWzNdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwluYS1FU1JLCQlbNF0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWxvY2F0aW9uRXN0aW1hdGUJWzVdIEV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbglPUFRJT05BTCwKKwlhZ2VPZkxvY2F0aW9uRXN0aW1hdGUJWzZdIEFnZU9mTG9jYXRpb25JbmZvcm1hdGlvbglPUFRJT05BTCwKKwlzbHItQXJnRXh0ZW5zaW9uQ29udGFpbmVyCVs3XSBTTFItQXJnRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJYWRkLUxvY2F0aW9uRXN0aW1hdGUJWzhdIEFkZC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbglPUFRJT05BTCwKKwlkZWZlcnJlZG10LWxyRGF0YQlbOV0gRGVmZXJyZWRtdC1sckRhdGEJT1BUSU9OQUwsIAorCWxjcy1SZWZlcmVuY2VOdW1iZXIJWzEwXSBMQ1MtUmVmZXJlbmNlTnVtYmVyCU9QVElPTkFMLAorCWdlcmFuUG9zaXRpb25pbmdEYXRhCVsxMV0gUG9zaXRpb25pbmdEYXRhSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJdXRyYW5Qb3NpdGlvbmluZ0RhdGEJWzEyXSBVdHJhblBvc2l0aW9uaW5nRGF0YUluZm8JT1BUSU9OQUwsCisJY2VsbElkT3JTYWkJWzEzXQlDZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRPckxBSQlPUFRJT05BTCwKKwloLWdtbGMtQWRkcmVzcwlbMTRdCUdTTi1BZGRyZXNzCU9QVElPTkFMLAorCWxjc1NlcnZpY2VUeXBlSUQJWzE1XQlMQ1NTZXJ2aWNlVHlwZUlECU9QVElPTkFMLAorCXNhaS1QcmVzZW50CVsxN10gTlVMTAkJT1BUSU9OQUwsCisJcHNldWRvbnltSW5kaWNhdG9yCVsxOF0gTlVMTAkJT1BUSU9OQUwsCisJYWNjdXJhY3lGdWxmaWxtZW50SW5kaWNhdG9yCVsxOV0gQWNjdXJhY3lGdWxmaWxtZW50SW5kaWNhdG9yCU9QVElPTkFMLAorCXZlbG9jaXR5RXN0aW1hdGUJWzIwXSBWZWxvY2l0eUVzdGltYXRlCU9QVElPTkFMLAorCXNlcXVlbmNlTnVtYmVyCVsyMV0gU2VxdWVuY2VOdW1iZXIJT1BUSU9OQUwsCisJcGVyaW9kaWNMRFJJbmZvCVsyMl0gUGVyaW9kaWNMRFJJbmZvCU9QVElPTkFMLAorCW1vLWxyU2hvcnRDaXJjdWl0SW5kaWNhdG9yCVsyM10gTlVMTAkJT1BUSU9OQUwgfQorCisJLS0gb25lIG9mIG1zaXNkbiBvciBpbXNpIGlzIG1hbmRhdG9yeQorCS0tIGEgbG9jYXRpb24gZXN0aW1hdGUgdGhhdCBpcyB2YWxpZCBmb3IgdGhlIGxvY2F0aW9uRXN0aW1hdGUgcGFyYW1ldGVyIHNob3VsZCAKKwktLSBiZSB0cmFuc2ZlcnJlZCBpbiB0aGlzIHBhcmFtZXRlciBpbiBwcmVmZXJlbmNlIHRvIHRoZSBhZGQtTG9jYXRpb25Fc3RpbWF0ZS4KKwktLSB0aGUgZGVmZXJyZWRtdC1sckRhdGEgcGFyYW1ldGVyIHNoYWxsIGJlIGluY2x1ZGVkIGlmIGFuZCBvbmx5IGlmIHRoZSBsY3MtRXZlbnQKKwktLSBpbmRpY2F0ZXMgYSBkZWZlcnJlZG10LWxyUmVzcG9uc2UuCisJLS0gaWYgdGhlIGxjcy1FdmVudCBpbmRpY2F0ZXMgYSBkZWZlcnJlZG10LWxyUmVzcG9uc2UgdGhlbiB0aGUgbG9jYXRpb25Fc3RpbWF0ZSAKKwktLSBhbmQgdGhlIGFkZC1sb2NhdGlvbkVzdGltYXRlIHBhcmFtZXRlcnMgc2hhbGwgbm90IGJlIHNlbnQgaWYgdGhlIAorCS0tIHN1cHBvcnRlZEdBRFNoYXBlcyBwYXJhbWV0ZXIgaGFkIGJlZW4gcmVjZWl2ZWQgaW4gUHJvdmlkZVN1YnNjcmliZXJMb2NhdGlvbi1BcmcKKwktLSBhbmQgdGhlIHNoYXBlIGVuY29kZWQgaW4gbG9jYXRpb25Fc3RpbWF0ZSBvciBhZGQtTG9jYXRpb25Fc3RpbWF0ZSB3YXMgbm90IG1hcmtlZAorCS0tIGFzIHN1cHBvcnRlZCBpbiBzdXBwb3J0ZWRHQURTaGFwZXMuIEluIHN1Y2ggYSBjYXNlIHRlcm1pbmF0aW9uQ2F1c2UgCisJLS0gaW4gZGVmZXJyZWRtdC1sckRhdGEgc2hhbGwgYmUgcHJlc2VudCB3aXRoIHZhbHVlIAorCS0tIHNoYXBlT2ZMb2NhdGlvbkVzdGltYXRlTm90U3VwcG9ydGVkLiAKKwktLSBJZiBhIGxjcyBldmVudCBpbmRpY2F0ZXMgZGVmZXJyZWQgbXQtbHIgcmVzcG9uc2UsIHRoZSBsY3MtUmVmZXJlbmNlIG51bWJlciBzaGFsbCBiZSAKKwktLSBpbmNsdWRlZC4gCisJLS0gc2FpLVByZXNlbnQgaW5kaWNhdGVzIHRoYXQgdGhlIGNlbGxJZE9yU2FpIHBhcmFtZXRlciBjb250YWlucyBhIFNlcnZpY2UgQXJlYSBJZGVudGl0eS4KKworRGVmZXJyZWRtdC1sckRhdGEgOjo9IFNFUVVFTkNFIHsKKwlkZWZlcnJlZExvY2F0aW9uRXZlbnRUeXBlCURlZmVycmVkTG9jYXRpb25FdmVudFR5cGUsCisJdGVybWluYXRpb25DYXVzZQlbMF0gVGVybWluYXRpb25DYXVzZQlPUFRJT05BTCwKKwlsY3NMb2NhdGlvbkluZm8JWzFdIExDU0xvY2F0aW9uSW5mbwlPUFRJT05BTCwKKwkuLi59CisJLS0gbGNzTG9jYXRpb25JbmZvIG1heSBiZSBpbmNsdWRlZCBvbmx5IGlmIGEgdGVybWluYXRpb25DYXVzZSBpcyBwcmVzZW50IAorCS0tIGluZGljYXRpbmcgbXQtbHJSZXN0YXJ0LgorCitMQ1MtRXZlbnQgOjo9IEVOVU1FUkFURUQgeworCWVtZXJnZW5jeUNhbGxPcmlnaW5hdGlvbiAgKDApLAorCWVtZXJnZW5jeUNhbGxSZWxlYXNlICAoMSksIAorCW1vLWxyICAoMiksCisJLi4uLAorCWRlZmVycmVkbXQtbHJSZXNwb25zZSAgKDMpICwKKwlkZWZlcnJlZG1vLWxyVFRUUEluaXRpYXRpb24gICg0KSAgfQorCS0tCWRlZmVycmVkbXQtbHJSZXNwb25zZSBpcyBhcHBsaWNhYmxlIHRvIHRoZSBkZWxpdmVyeSBvZiBhIGxvY2F0aW9uIGVzdGltYXRlIAorCS0tCWZvciBhbiBMRFIgaW5pdGlhdGVkIGVhcmxpZXIgYnkgZWl0aGVyIHRoZSBuZXR3b3JrICh2aWEgYW4gTVQtTFIgYWN0aXZhdGUgZGVmZXJyZWQgCisJLS0JbG9jYXRpb24pIG9yIHRoZSBVRSAodmlhIGEgZGVmZXJyZWQgTU8tTFIgVFRUUCBpbml0aWF0aW9uKQorCS0tCWV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLQlhIFN1YnNjcmliZXJMb2NhdGlvblJlcG9ydC1BcmcgY29udGFpbmluZyBhbiB1bnJlY29nbml6ZWQgTENTLUV2ZW50CisJLS0Jc2hhbGwgYmUgcmVqZWN0ZWQgYnkgYSByZWNlaXZlciB3aXRoIGEgcmV0dXJuIGVycm9yIGNhdXNlIG9mIHVuZXhwZWN0ZWQgZGF0YSB2YWx1ZQorCitUZXJtaW5hdGlvbkNhdXNlIDo6PSBFTlVNRVJBVEVEIHsKKwlub3JtYWwgICgwKSwKKwllcnJvcnVuZGVmaW5lZCAgKDEpLAorCWludGVybmFsVGltZW91dCAgKDIpLAorCWNvbmdlc3Rpb24gICgzKSwKKwltdC1sclJlc3RhcnQgICg0KSwKKwlwcml2YWN5VmlvbGF0aW9uICAoNSksCisJLi4uLAorCXNoYXBlT2ZMb2NhdGlvbkVzdGltYXRlTm90U3VwcG9ydGVkICg2KSAsCisJc3Vic2NyaWJlclRlcm1pbmF0aW9uICg3KSwKKwl1RVRlcm1pbmF0aW9uICg4KSwKKwluZXR3b3JrVGVybWluYXRpb24gKDkpICB9IAorLS0gbXQtbHJSZXN0YXJ0IHNoYWxsIGJlIHVzZWQgdG8gdHJpZ2dlciB0aGUgR01MQyB0byByZXN0YXJ0IHRoZSBsb2NhdGlvbiBwcm9jZWR1cmUsIAorLS0gZWl0aGVyIGJlY2F1c2UgdGhlIHNlbmRpbmcgbm9kZSBrbm93cyB0aGF0IHRoZSB0ZXJtaW5hbCBoYXMgbW92ZWQgdW5kZXIgY292ZXJhZ2UgCistLSBvZiBhbm90aGVyIE1TQyBvciBTR1NOIChlLmcuIFNlbmQgSWRlbnRpZmljYXRpb24gcmVjZWl2ZWQpLCBvciBiZWNhdXNlIHRoZSBzdWJzY3JpYmVyCistLSBoYXMgYmVlbiBkZXJlZ2lzdGVyZWQgZHVlIHRvIGEgQ2FuY2VsIExvY2F0aW9uIHJlY2VpdmVkIGZyb20gSExSLgorLS0KKy0tIGV4Y2VwdGlvbiBoYW5kbGluZworLS0gYW4gdW5yZWNvZ25pemVkIHZhbHVlIHNoYWxsIGJlIHRyZWF0ZWQgdGhlIHNhbWUgYXMgdmFsdWUgMSAoZXJyb3J1bmRlZmluZWQpIAorCitTZXF1ZW5jZU51bWJlciA6Oj0gSU5URUdFUiAoMS4ubWF4UmVwb3J0aW5nQW1vdW50KQorCitTdWJzY3JpYmVyTG9jYXRpb25SZXBvcnQtUmVzIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwgCisJLi4uLCAKKwluYS1FU1JLCQlbMF0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCW5hLUVTUkQJCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJaC1nbWxjLUFkZHJlc3MJWzJdCUdTTi1BZGRyZXNzCU9QVElPTkFMLAorCW1vLWxyU2hvcnRDaXJjdWl0SW5kaWNhdG9yCVszXSBOVUxMCQlPUFRJT05BTCwKKwlyZXBvcnRpbmdQTE1OTGlzdAlbNF0gUmVwb3J0aW5nUExNTkxpc3QJT1BUSU9OQUwsCisJbGNzLVJlZmVyZW5jZU51bWJlcglbNV0JTENTLVJlZmVyZW5jZU51bWJlcglPUFRJT05BTCB9CisKKy0tIG5hLUVTUksgYW5kIG5hLUVTUkQgYXJlIG11dHVhbGx5IGV4Y2x1c2l2ZQorLS0KKy0tIGV4Y2VwdGlvbiBoYW5kbGluZworLS0gcmVjZWlwdCBvZiBib3RoIG5hLUVTUksgYW5kIG5hLUVTUkQgc2hhbGwgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyBhIHJldHVybiBlcnJvcgorCisKK0VORAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1NUy1EYXRhVHlwZXMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtTVMtRGF0YVR5cGVzLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzEyYTAyCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtTVMtRGF0YVR5cGVzLmFzbgpAQCAtMCwwICsxLDI3ODAgQEAKKy0tICRJZDogTUFQLU1TLURhdGFUeXBlcy5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKKy0tIDNHUFAgVFMgMjkuMDAyIFY4LjkuMCAoMjAwOS0wNCkgCistLSAxNy43LjEJTW9iaWxlIFNlcnZpY2UgZGF0YSB0eXBlcworCitNQVAtTVMtRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLU1TLURhdGFUeXBlcyAoMTEpIHZlcnNpb24xMSAoMTEpfQorCitERUZJTklUSU9OUworCitJTVBMSUNJVCBUQUdTCisKKzo6PQorCitCRUdJTgorCitFWFBPUlRTCisKKwktLSBsb2NhdGlvbiByZWdpc3RyYXRpb24gdHlwZXMKKwlVcGRhdGVMb2NhdGlvbkFyZywKKwlVcGRhdGVMb2NhdGlvblJlcywKKwlDYW5jZWxMb2NhdGlvbkFyZywKKwlDYW5jZWxMb2NhdGlvblJlcywgCisJUHVyZ2VNUy1BcmcsIAorCVB1cmdlTVMtUmVzLAorCVNlbmRJZGVudGlmaWNhdGlvbkFyZywKKwlTZW5kSWRlbnRpZmljYXRpb25SZXMsIAorCVVwZGF0ZUdwcnNMb2NhdGlvbkFyZywKKwlVcGRhdGVHcHJzTG9jYXRpb25SZXMsCisJSVNULVN1cHBvcnRJbmRpY2F0b3IsIAorCVN1cHBvcnRlZExDUy1DYXBhYmlsaXR5U2V0cywKKworCS0tIGdwcnMgbG9jYXRpb24gcmVnaXN0cmF0aW9uIHR5cGVzCisJR1NOLUFkZHJlc3MsCisKKwktLSBoYW5kb3ZlciB0eXBlcworCUZvcndhcmRBY2Nlc3NTaWduYWxsaW5nLUFyZywKKwlQcmVwYXJlSE8tQXJnLAorCVByZXBhcmVITy1SZXMsCisJUHJlcGFyZVN1YnNlcXVlbnRITy1BcmcsIAorCVByZXBhcmVTdWJzZXF1ZW50SE8tUmVzLAorCVByb2Nlc3NBY2Nlc3NTaWduYWxsaW5nLUFyZywKKwlTZW5kRW5kU2lnbmFsLUFyZywKKwlTZW5kRW5kU2lnbmFsLVJlcywKKworCS0tIGF1dGhlbnRpY2F0aW9uIG1hbmFnZW1lbnQgdHlwZXMKKwlTZW5kQXV0aGVudGljYXRpb25JbmZvQXJnLAorCVNlbmRBdXRoZW50aWNhdGlvbkluZm9SZXMsIAorCUF1dGhlbnRpY2F0aW9uRmFpbHVyZVJlcG9ydEFyZywKK0F1dGhlbnRpY2F0aW9uRmFpbHVyZVJlcG9ydFJlcywKKworCS0tIHNlY3VyaXR5IG1hbmFnZW1lbnQgdHlwZXMKKwlLYywgCisJQ2tzbiwKKworCS0tIGVxdWlwbWVudCBtYW5hZ2VtZW50IHR5cGVzCisJQ2hlY2tJTUVJLUFyZywKKwlDaGVja0lNRUktUmVzLAorCisJLS0gc3Vic2NyaWJlciBtYW5hZ2VtZW50IHR5cGVzCisJSW5zZXJ0U3Vic2NyaWJlckRhdGFBcmcsCisJSW5zZXJ0U3Vic2NyaWJlckRhdGFSZXMsIAorCUxTQUlkZW50aXR5LAorCURlbGV0ZVN1YnNjcmliZXJEYXRhQXJnLAorCURlbGV0ZVN1YnNjcmliZXJEYXRhUmVzLAorCUV4dC1Rb1MtU3Vic2NyaWJlZCwKKwlFeHQyLVFvUy1TdWJzY3JpYmVkLCAKKwlFeHQzLVFvUy1TdWJzY3JpYmVkLAorCVN1YnNjcmliZXJEYXRhLAorCU9EQi1EYXRhLAorCVN1YnNjcmliZXJTdGF0dXMsCisJWm9uZUNvZGVMaXN0LAorCW1heE51bU9mWm9uZUNvZGVzLCAKKwlPLUNTSSwgCitELUNTSSwKKwlPLUJjc21DYW1lbFREUENyaXRlcmlhTGlzdCwgCisJVC1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QsCisJU1MtQ1NJLAorCVNlcnZpY2VLZXksCisJRGVmYXVsdENhbGxIYW5kbGluZywKKwlDYW1lbENhcGFiaWxpdHlIYW5kbGluZywKKwlCYXNpY1NlcnZpY2VDcml0ZXJpYSwKKwlTdXBwb3J0ZWRDYW1lbFBoYXNlcywKKwlPZmZlcmVkQ2FtZWw0Q1NJcywKKwlPZmZlcmVkQ2FtZWw0RnVuY3Rpb25hbGl0aWVzLAorCW1heE51bU9mQ2FtZWxURFBEYXRhLAorCUNVRy1JbmRleCwgCisJQ1VHLUluZm8sCisJQ1VHLUludGVybG9jaywKKwlJbnRlckNVRy1SZXN0cmljdGlvbnMsCisJSW50cmFDVUctT3B0aW9ucywKKwlOb3RpZmljYXRpb25Ub01TVXNlciwgCisJUW9TLVN1YnNjcmliZWQsCitJU1QtQWxlcnRUaW1lclZhbHVlLAorCVQtQ1NJLAorCVQtQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCwKK0FQTiwKK0FkZGl0aW9uYWxJbmZvLAorCisJLS0gZmF1bHQgcmVjb3ZlcnkgdHlwZXMKKwlSZXNldEFyZywKKwlSZXN0b3JlRGF0YUFyZywKKwlSZXN0b3JlRGF0YVJlcywKKworLS0gcHJvdmlkZSBzdWJzY3JpYmVyIGluZm8gdHlwZXMgCitHZW9ncmFwaGljYWxJbmZvcm1hdGlvbiwgCitNUy1DbGFzc21hcmsyLAorR1BSU01TQ2xhc3MsCisKKwktLSBzdWJzY3JpYmVyIGluZm9ybWF0aW9uIGVucXVpcnkgdHlwZXMKKwlQcm92aWRlU3Vic2NyaWJlckluZm9BcmcsCisJUHJvdmlkZVN1YnNjcmliZXJJbmZvUmVzLAorCVN1YnNjcmliZXJJbmZvLAorCUxvY2F0aW9uSW5mb3JtYXRpb24sCisJTG9jYXRpb25JbmZvcm1hdGlvbkdQUlMsCisJUkFJZGVudGl0eSwKKwlTdWJzY3JpYmVyU3RhdGUsCisJR1BSU0NoYXJnaW5nSUQsIAorTU5QSW5mb1JlcywKKwlSb3V0ZWluZ051bWJlciwKKworCS0tIGFueSB0aW1lIGluZm9ybWF0aW9uIGVucXVpcnkgdHlwZXMKKwlBbnlUaW1lSW50ZXJyb2dhdGlvbkFyZywKKwlBbnlUaW1lSW50ZXJyb2dhdGlvblJlcywKKworCS0tIGFueSB0aW1lIGluZm9ybWF0aW9uIGhhbmRsaW5nIHR5cGVzCisJQW55VGltZVN1YnNjcmlwdGlvbkludGVycm9nYXRpb25BcmcsCisJQW55VGltZVN1YnNjcmlwdGlvbkludGVycm9nYXRpb25SZXMsCisJQW55VGltZU1vZGlmaWNhdGlvbkFyZywKKwlBbnlUaW1lTW9kaWZpY2F0aW9uUmVzLAorCisJLS0gc3Vic2NyaWJlciBkYXRhIG1vZGlmaWNhdGlvbiBub3RpZmljYXRpb24gdHlwZXMKKwlOb3RlU3Vic2NyaWJlckRhdGFNb2RpZmllZEFyZywKKwlOb3RlU3Vic2NyaWJlckRhdGFNb2RpZmllZFJlcywKKworCS0tIGdwcnMgbG9jYXRpb24gaW5mb3JtYXRpb24gcmV0cmlldmFsIHR5cGVzCisJU2VuZFJvdXRpbmdJbmZvRm9yR3Byc0FyZywKKwlTZW5kUm91dGluZ0luZm9Gb3JHcHJzUmVzLAorCisJLS0gZmFpbHVyZSByZXBvcnRpbmcgdHlwZXMKKwlGYWlsdXJlUmVwb3J0QXJnLAorCUZhaWx1cmVSZXBvcnRSZXMsCisKKwktLSBncHJzIG5vdGlmaWNhdGlvbiB0eXBlcworCU5vdGVNc1ByZXNlbnRGb3JHcHJzQXJnLAorCU5vdGVNc1ByZXNlbnRGb3JHcHJzUmVzLAorCisJLS0gTW9iaWxpdHkgTWFuYWdlbWVudCB0eXBlcworTm90ZU1NLUV2ZW50QXJnLAorCU5vdGVNTS1FdmVudFJlcywKKwlOdW1iZXJQb3J0YWJpbGl0eVN0YXR1cywKKwlQYWdpbmdBcmVhLAorCisJLS0gVkdDUyAvIFZCUyB0eXBlcyB0eXBlcworR3JvdXBJZCwgCitMb25nLUdyb3VwSWQsCitBZGRpdGlvbmFsU3Vic2NyaXB0aW9ucworCis7CisKK0lNUE9SVFMKKwltYXhOdW1PZlNTLAorCVNTLVN1YnNjcmlwdGlvbk9wdGlvbiwKKwlTUy1MaXN0LAorCVNTLUZvckJTLUNvZGUsCisJUGFzc3dvcmQKK0ZST00gTUFQLVNTLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1TUy1EYXRhVHlwZXMgKDE0KSB2ZXJzaW9uMTEgKDExKX0KKworCVNTLUNvZGUKK0ZST00gTUFQLVNTLUNvZGUgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU1MtQ29kZSAoMTUpIHZlcnNpb24xMSAoMTEpfQorCisJRXh0LUJlYXJlclNlcnZpY2VDb2RlCitGUk9NIE1BUC1CUy1Db2RlIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUJTLUNvZGUgKDIwKSB2ZXJzaW9uMTEgKDExKX0KKworCUV4dC1UZWxlc2VydmljZUNvZGUKK0ZST00gTUFQLVRTLUNvZGUgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtVFMtQ29kZSAoMTkpIHZlcnNpb24xMSAoMTEpfQorCisJQWRkcmVzc1N0cmluZywKK0lTRE4tQWRkcmVzc1N0cmluZywgCisJSVNETi1TdWJhZGRyZXNzU3RyaW5nLCAKKwlGVE4tQWRkcmVzc1N0cmluZywKKwlBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbywKKwlJTVNJLCAKKwlJTUVJLAorCVRNU0ksCisJSExSLUxpc3QsCisJTE1TSSwKKwlJZGVudGl0eSwKKwlHbG9iYWxDZWxsSWQsCisJQ2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUksCisJRXh0LUJhc2ljU2VydmljZUNvZGUsCisJTkFFQS1QcmVmZXJyZWRDSSwKKwlFTUxQUC1JbmZvLCAKKwlNQy1TUy1JbmZvLAorCVN1YnNjcmliZXJJZGVudGl0eSwKKwlBZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24sCisJTENTQ2xpZW50RXh0ZXJuYWxJRCwKKwlMQ1NDbGllbnRJbnRlcm5hbElELAorCUV4dC1TUy1TdGF0dXMsCisJTENTU2VydmljZVR5cGVJRCwKKwlBU0NJLUNhbGxSZWZlcmVuY2UsCisJVEJDRC1TVFJJTkcsCisJTEFJRml4ZWRMZW5ndGgsCisJUExNTi1JZCwKK0VNTFBQLVByaW9yaXR5CitGUk9NIE1BUC1Db21tb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtQ29tbW9uRGF0YVR5cGVzICgxOCkgdmVyc2lvbjExICgxMSl9CisKKwlFeHRlbnNpb25Db250YWluZXIKK0ZST00gTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KKworCUFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00KK0ZST00gTUFQLUVSLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FUi1EYXRhVHlwZXMgKDE3KSB2ZXJzaW9uMTEgKDExKX0KKworCVRyYWNlUHJvcGFnYXRpb25MaXN0CitGUk9NIE1BUC1PTS1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtT00tRGF0YVR5cGVzICgxMikgdmVyc2lvbjExICgxMSl9CisKKzsKKworLS0gbG9jYXRpb24gcmVnaXN0cmF0aW9uIHR5cGVzCisKK1VwZGF0ZUxvY2F0aW9uQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCUlNU0ksCisJbXNjLU51bWJlcglbMV0gSVNETi1BZGRyZXNzU3RyaW5nLAorCXZsci1OdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAorCWxtc2kJCQlbMTBdIExNU0kJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwl2bHItQ2FwYWJpbGl0eQlbNl0gVkxSLUNhcGFiaWxpdHkJT1BUSU9OQUwsCisJaW5mb3JtUHJldmlvdXNOZXR3b3JrRW50aXR5CVsxMV0JTlVMTAkJT1BUSU9OQUwsCisJY3MtTENTLU5vdFN1cHBvcnRlZEJ5VUUJWzEyXQlOVUxMCQlPUFRJT05BTCwKKwl2LWdtbGMtQWRkcmVzcwlbMl0JR1NOLUFkZHJlc3MJT1BUSU9OQUwsCisJYWRkLWluZm8JCVsxM10gQURELUluZm8JT1BUSU9OQUwsCisJcGFnaW5nQXJlYQlbMTRdIFBhZ2luZ0FyZWEJT1BUSU9OQUwsCisJc2tpcFN1YnNjcmliZXJEYXRhVXBkYXRlCVsxNV0gTlVMTAkJT1BUSU9OQUwgCisJLS0gVGhlIHNraXBTdWJzY3JpYmVyRGF0YVVwZGF0ZSBwYXJhbWV0ZXIgaW4gdGhlIFVwZGF0ZUxvY2F0aW9uQXJnIGFuZCB0aGUgQURELUluZm8KKwktLSBzdHJ1Y3R1cmVzIGNhcnJ5IHRoZSBzYW1lIHNlbWFudGljLgorCSB9CisKK1ZMUi1DYXBhYmlsaXR5IDo6PSBTRVFVRU5DRXsKKwlzdXBwb3J0ZWRDYW1lbFBoYXNlcyAgCVswXSBTdXBwb3J0ZWRDYW1lbFBoYXNlcwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJc29sc2FTdXBwb3J0SW5kaWNhdG9yCVsyXSBOVUxMCQlPUFRJT05BTCwKKwlpc3RTdXBwb3J0SW5kaWNhdG9yCVsxXSBJU1QtU3VwcG9ydEluZGljYXRvcglPUFRJT05BTCwKKwlzdXBlckNoYXJnZXJTdXBwb3J0ZWRJblNlcnZpbmdOZXR3b3JrRW50aXR5CVszXSBTdXBlckNoYXJnZXJJbmZvCU9QVElPTkFMLAorCWxvbmdGVE4tU3VwcG9ydGVkCVs0XQlOVUxMCQlPUFRJT05BTCwKKwlzdXBwb3J0ZWRMQ1MtQ2FwYWJpbGl0eVNldHMJWzVdCVN1cHBvcnRlZExDUy1DYXBhYmlsaXR5U2V0cwlPUFRJT05BTCwKKwlvZmZlcmVkQ2FtZWw0Q1NJcwlbNl0gT2ZmZXJlZENhbWVsNENTSXMJT1BUSU9OQUwsCisJc3VwcG9ydGVkUkFULVR5cGVzSW5kaWNhdG9yCVs3XQlTdXBwb3J0ZWRSQVQtVHlwZXMJT1BUSU9OQUwsCisJbG9uZ0dyb3VwSUQtU3VwcG9ydGVkCVs4XQlOVUxMCQlPUFRJT05BTCB9CisKK1N1cHBvcnRlZFJBVC1UeXBlczo6PSBCSVQgU1RSSU5HIHsKKwl1dHJhbiAgKDApLAorCWdlcmFuICAoMSksCisJZ2FuICAgICgyKSwKKwlpLWhzcGEtZXZvbHV0aW9uICgzKSwKKwllLXV0cmFuCSg0KX0gKFNJWkUgKDIuLjgpKQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzogYml0cyA1IHRvIDcgc2hhbGwgYmUgaWdub3JlZCBpZiByZWNlaXZlZCBhbmQgbm90IHVuZGVyc3Rvb2QKKwkgCisKKworU3VwZXJDaGFyZ2VySW5mbyA6Oj0gQ0hPSUNFIHsKKwlzZW5kU3Vic2NyaWJlckRhdGEJWzBdIE5VTEwsCisJc3Vic2NyaWJlckRhdGFTdG9yZWQJWzFdIEFnZUluZGljYXRvciB9CisKK0FnZUluZGljYXRvciA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi42KSkKKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIG9mIHRoaXMgcGFyYW1ldGVyIGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljLgorCitJU1QtU3VwcG9ydEluZGljYXRvciA6Oj0gIEVOVU1FUkFURUQgeworCWJhc2ljSVNUU3VwcG9ydGVkCSgwKSwKKwlpc3RDb21tYW5kU3VwcG9ydGVkCSgxKSwKKwkuLi59CistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSByZWNlcHRpb24gb2YgdmFsdWVzID4gMSBzaGFsbCBiZSBtYXBwZWQgdG8gJyBpc3RDb21tYW5kU3VwcG9ydGVkICcKKworU3VwcG9ydGVkTENTLUNhcGFiaWxpdHlTZXRzIDo6PSBCSVQgU1RSSU5HIHsKKwlsY3NDYXBhYmlsaXR5U2V0MSAoMCksCisJbGNzQ2FwYWJpbGl0eVNldDIgKDEpLAorCWxjc0NhcGFiaWxpdHlTZXQzICgyKSwKKwlsY3NDYXBhYmlsaXR5U2V0NCAoMykgLAorCWxjc0NhcGFiaWxpdHlTZXQ1ICg0KSB9IChTSVpFICgyLi4xNikpIAorLS0gQ29yZSBuZXR3b3JrIHNpZ25hbGxpbmcgY2FwYWJpbGl0eSBzZXQxIGluZGljYXRlcyBMQ1MgUmVsZWFzZTk4IG9yIFJlbGVhc2U5OSB2ZXJzaW9uLgorLS0gQ29yZSBuZXR3b3JrIHNpZ25hbGxpbmcgY2FwYWJpbGl0eSBzZXQyIGluZGljYXRlcyBMQ1MgUmVsZWFzZTQuCistLSBDb3JlIG5ldHdvcmsgc2lnbmFsbGluZyBjYXBhYmlsaXR5IHNldDMgaW5kaWNhdGVzIExDUyBSZWxlYXNlNS4KKy0tIENvcmUgbmV0d29yayBzaWduYWxsaW5nIGNhcGFiaWxpdHkgc2V0NCBpbmRpY2F0ZXMgTENTIFJlbGVhc2U2LgorLS0gQ29yZSBuZXR3b3JrIHNpZ25hbGxpbmcgY2FwYWJpbGl0eSBzZXQ1IGluZGljYXRlcyBMQ1MgUmVsZWFzZTcgb3IgbGF0ZXIgdmVyc2lvbi4KKy0tIEEgbm9kZSBzaGFsbCBtYXJrIGluIHRoZSBCSVQgU1RSSU5HIGFsbCBMQ1MgY2FwYWJpbGl0eSBzZXRzIGl0IHN1cHBvcnRzLiAKKy0tIElmIG5vIGJpdCBpcyBzZXQgdGhlbiB0aGUgc2VuZGluZyBub2RlIGRvZXMgbm90IHN1cHBvcnQgTENTLgorLS0gSWYgdGhlIHBhcmFtZXRlciBpcyBub3Qgc2VudCBieSBhbiBWTFIgdGhlbiB0aGUgVkxSIG1heSBzdXBwb3J0IGF0IG1vc3QgY2FwYWJpbGl0eSBzZXQxLgorLS0gSWYgdGhlIHBhcmFtZXRlciBpcyBub3Qgc2VudCBieSBhbiBTR1NOIHRoZW4gbm8gc3VwcG9ydCBmb3IgTENTIGlzIGFzc3VtZWQuCistLSBBbiBTR1NOIGlzIG5vdCBhbGxvd2VkIHRvIGluZGljYXRlIHN1cHBvcnQgb2YgY2FwYWJpbGl0eSBzZXQxLgorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK1VwZGF0ZUxvY2F0aW9uUmVzIDo6PSBTRVFVRU5DRSB7CisJaGxyLU51bWJlcglJU0ROLUFkZHJlc3NTdHJpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJYWRkLUNhcGFiaWxpdHkJTlVMTAkJCU9QVElPTkFMLAorCXBhZ2luZ0FyZWEtQ2FwYWJpbGl0eQlbMF1OVUxMCQkJT1BUSU9OQUwgfQorCitBREQtSW5mbyA6Oj0gU0VRVUVOQ0UgeworCWltZWlzdgkJWzBdIElNRUksCisJc2tpcFN1YnNjcmliZXJEYXRhVXBkYXRlCVsxXSBOVUxMCQlPUFRJT05BTCwKKwktLSBUaGUgc2tpcFN1YnNjcmliZXJEYXRhVXBkYXRlIHBhcmFtZXRlciBpbiB0aGUgVXBkYXRlTG9jYXRpb25BcmcgYW5kIHRoZSBBREQtSW5mbworCS0tIHN0cnVjdHVyZXMgY2FycnkgdGhlIHNhbWUgc2VtYW50aWMuCisJLi4ufQorCisKK1BhZ2luZ0FyZWEgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLjUpIE9GIExvY2F0aW9uQXJlYSAKKworCitMb2NhdGlvbkFyZWEgOjo9IENIT0lDRSB7CisJbGFpRml4ZWRMZW5ndGgJWzBdIExBSUZpeGVkTGVuZ3RoLAorCWxhYwkJCVsxXSBMQUN9CisKKworTEFDIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDIpKQorCS0tIFJlZmVycyB0byBMb2NhdGlvbiBBcmVhIENvZGUgb2YgdGhlIExvY2F0aW9uIEFyZWEgSWRlbnRpZmljYXRpb24gZGVmaW5lZCBpbiAKKyAgICAgLS0gM0dQUCBUUyAyMy4wMDMgWzE3XS4KKwktLSBMb2NhdGlvbiBBcmVhIENvZGUgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjQuMDA4IFszNV0KKworQ2FuY2VsTG9jYXRpb25BcmcgOjo9IFszXSBTRVFVRU5DRSB7CisJaWRlbnRpdHkJCUlkZW50aXR5LAorCWNhbmNlbGxhdGlvblR5cGUJQ2FuY2VsbGF0aW9uVHlwZQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwl0eXBlT2ZVcGRhdGUJWzBdIFR5cGVPZlVwZGF0ZQlPUFRJT05BTCB9CisKK1R5cGVPZlVwZGF0ZSA6Oj0gRU5VTUVSQVRFRCB7CisJc2dzbi1jaGFuZ2UgKDApLAorCW1tZS1jaGFuZ2UgKDEpLAorCS4uLn0KKwktLSBUeXBlT2ZVcGRhdGUgc2hhbGwgYmUgYWJzZW50IGlmIENhbmNlbGxhdGlvblR5cGUgaXMgZGlmZmVyZW50IGZyb20gdXBkYXRlUHJvY2VkdXJlCisKK0NhbmNlbGxhdGlvblR5cGUgOjo9IEVOVU1FUkFURUQgeworCXVwZGF0ZVByb2NlZHVyZQkoMCksCisJc3Vic2NyaXB0aW9uV2l0aGRyYXcJKDEpLAorCS4uLn0KKwktLSBUaGUgSExSIHNoYWxsIG5vdCBzZW5kIHZhbHVlcyBvdGhlciB0aGFuIGxpc3RlZCBhYm92ZQorCitDYW5jZWxMb2NhdGlvblJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitQdXJnZU1TLUFyZyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwlpbXNpCQkJSU1TSSwKKwl2bHItTnVtYmVyCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJc2dzbi1OdW1iZXIJWzFdCUlTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworUHVyZ2VNUy1SZXMgOjo9IFNFUVVFTkNFIHsKKwlmcmVlemVUTVNJCVswXQlOVUxMCQlPUFRJT05BTCwKKwlmcmVlemVQLVRNU0kJWzFdCU5VTEwJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWZyZWV6ZU0tVE1TSQlbMl0JTlVMTAkJT1BUSU9OQUwgfQorCitTZW5kSWRlbnRpZmljYXRpb25BcmcgOjo9IFNFUVVFTkNFIHsKKwl0bXNpCQkJVE1TSSwKKwludW1iZXJPZlJlcXVlc3RlZFZlY3RvcnMJTnVtYmVyT2ZSZXF1ZXN0ZWRWZWN0b3JzIAlPUFRJT05BTCwKKwktLSB3aXRoaW4gYSBkaWFsb2d1ZSBudW1iZXJPZlJlcXVlc3RlZFZlY3RvcnMgc2hhbGwgYmUgcHJlc2VudCBpbiAKKwktLSB0aGUgZmlyc3Qgc2VydmljZSByZXF1ZXN0IGFuZCBzaGFsbCBub3QgYmUgcHJlc2VudCBpbiBzdWJzZXF1ZW50IHNlcnZpY2UgcmVxdWVzdHMuIAorCS0tIElmIHJlY2VpdmVkIGluIGEgc3Vic2VxdWVudCBzZXJ2aWNlIHJlcXVlc3QgaXQgc2hhbGwgYmUgZGlzY2FyZGVkLiAKKwlzZWdtZW50YXRpb25Qcm9oaWJpdGVkCU5VTEwJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwltc2MtTnVtYmVyCUlTRE4tQWRkcmVzc1N0cmluZyAJT1BUSU9OQUwsCisJcHJldmlvdXMtTEFJCVswXSBMQUlGaXhlZExlbmd0aAlPUFRJT05BTCwKKwlob3BDb3VudGVyCVsxXSBIb3BDb3VudGVyCU9QVElPTkFMIH0KKworSG9wQ291bnRlciA6Oj0gSU5URUdFUiAoMC4uMykKKworU2VuZElkZW50aWZpY2F0aW9uUmVzIDo6PSBbM10gU0VRVUVOQ0UgeworCWltc2kJCQlJTVNJCQkJT1BUSU9OQUwsCisJLS0gSU1TSSBzaGFsbCBiZSBwcmVzZW50IGluIHRoZSBmaXJzdCAob3Igb25seSkgc2VydmljZSByZXNwb25zZSBvZiBhIGRpYWxvZ3VlLgorCS0tIElmIG11bHRpcGxlIHNlcnZpY2UgcmVxdWVzdHMgYXJlIHByZXNlbnQgaW4gYSBkaWFsb2d1ZSB0aGVuIElNU0kKKwktLSBzaGFsbCBub3QgYmUgcHJlc2VudCBpbiBhbnkgc2VydmljZSByZXNwb25zZSBvdGhlciB0aGFuIHRoZSBmaXJzdCBvbmUuCisJYXV0aGVudGljYXRpb25TZXRMaXN0CUF1dGhlbnRpY2F0aW9uU2V0TGlzdAlPUFRJT05BTCwKKwljdXJyZW50U2VjdXJpdHlDb250ZXh0CVsyXUN1cnJlbnRTZWN1cml0eUNvbnRleHQJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCistLSBhdXRoZW50aWNhdGlvbiBtYW5hZ2VtZW50IHR5cGVzCisKK0F1dGhlbnRpY2F0aW9uU2V0TGlzdCA6Oj0gQ0hPSUNFIHsKKwl0cmlwbGV0TGlzdAlbMF0gVHJpcGxldExpc3QsCisJcXVpbnR1cGxldExpc3QJWzFdIFF1aW50dXBsZXRMaXN0IH0KKworVHJpcGxldExpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLjUpIE9GCisJCQkJQXV0aGVudGljYXRpb25UcmlwbGV0CisKK1F1aW50dXBsZXRMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi41KSBPRgorCQkJCUF1dGhlbnRpY2F0aW9uUXVpbnR1cGxldAorCitBdXRoZW50aWNhdGlvblRyaXBsZXQgOjo9IFNFUVVFTkNFIHsKKwlyYW5kCQkJUkFORCwKKwlzcmVzCQkJU1JFUywKKwlrYwkJCUtjLAorCS4uLn0KKworQXV0aGVudGljYXRpb25RdWludHVwbGV0IDo6PSBTRVFVRU5DRSB7CisJcmFuZAkJCVJBTkQsCisJeHJlcwkJCVhSRVMsCisJY2sJCQlDSywKKwlpawkJCUlLLAorCWF1dG4JCQlBVVROLAorCS4uLn0KKworQ3VycmVudFNlY3VyaXR5Q29udGV4dCA6Oj0gQ0hPSUNFIHsKKwlnc20tU2VjdXJpdHlDb250ZXh0RGF0YQlbMF0gR1NNLVNlY3VyaXR5Q29udGV4dERhdGEsCisJdW10cy1TZWN1cml0eUNvbnRleHREYXRhCVsxXSBVTVRTLVNlY3VyaXR5Q29udGV4dERhdGEgfQorCitHU00tU2VjdXJpdHlDb250ZXh0RGF0YSA6Oj0gU0VRVUVOQ0UgeworCWtjCQkJS2MsCisJY2tzbgkJCUNrc24sCisJLi4uIH0KKworVU1UUy1TZWN1cml0eUNvbnRleHREYXRhIDo6PSBTRVFVRU5DRSB7CisJY2sJCQlDSywKKwlpawkJCUlLLAorCWtzaQkJCUtTSSwKKwkuLi4gfQorCitSQU5EIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDE2KSkKKworU1JFUyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg0KSkKKworS2MgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoOCkpCisKK1hSRVMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNC4uMTYpKQorCitDSyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxNikpCisKK0lLIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDE2KSkKKworQVVUTiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxNikpCisKK0FVVFMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMTQpKQorCitDa3NuIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI0LjAwOAorCitLU0kgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGluIDNHUFAgVFMgMjQuMDA4CisKK0F1dGhlbnRpY2F0aW9uRmFpbHVyZVJlcG9ydEFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlJTVNJLAorCWZhaWx1cmVDYXVzZQlGYWlsdXJlQ2F1c2UsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCXJlLWF0dGVtcHQJQk9PTEVBTgkJT1BUSU9OQUwsCisJYWNjZXNzVHlwZQlBY2Nlc3NUeXBlCU9QVElPTkFMLAorCXJhbmQJCQlSQU5ECQkJT1BUSU9OQUwsCisJdmxyLU51bWJlcglbMF0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCXNnc24tTnVtYmVyCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwgfQorCitBY2Nlc3NUeXBlIDo6PSBFTlVNRVJBVEVEIHsKKwljYWxsICgwKSwKKwllbWVyZ2VuY3lDYWxsICgxKSwKKwlsb2NhdGlvblVwZGF0aW5nICgyKSwKKwlzdXBwbGVtZW50YXJ5U2VydmljZSAoMyksCisJc2hvcnRNZXNzYWdlICg0KSwKKwlncHJzQXR0YWNoICg1KSwKKwlyb3V0aW5nQXJlYVVwZGF0aW5nICg2KSwKKwlzZXJ2aWNlUmVxdWVzdCAoNyksCisJcGRwQ29udGV4dEFjdGl2YXRpb24gKDgpLAorCXBkcENvbnRleHREZWFjdGl2YXRpb24gKDkpLAorCS4uLiwKKwlncHJzRGV0YWNoICgxMCl9CisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorCS0tIHJlY2VpdmVkIHZhbHVlcyBncmVhdGVyIHRoYW4gMTAgc2hhbGwgYmUgaWdub3JlZC4KKworQXV0aGVudGljYXRpb25GYWlsdXJlUmVwb3J0UmVzIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0ZhaWx1cmVDYXVzZSA6Oj0gRU5VTUVSQVRFRCB7CisJd3JvbmdVc2VyUmVzcG9uc2UgICgwKSwKKwl3cm9uZ05ldHdvcmtTaWduYXR1cmUgICgxKX0KKworLS0gZ3BycyBsb2NhdGlvbiByZWdpc3RyYXRpb24gdHlwZXMKKworVXBkYXRlR3Byc0xvY2F0aW9uQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCUlNU0ksCisJc2dzbi1OdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAkKKwlzZ3NuLUFkZHJlc3MJR1NOLUFkZHJlc3MsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCXNnc24tQ2FwYWJpbGl0eQlbMF0gU0dTTi1DYXBhYmlsaXR5CU9QVElPTkFMLAorCWluZm9ybVByZXZpb3VzTmV0d29ya0VudGl0eQlbMV0JTlVMTAkJT1BUSU9OQUwsCisJcHMtTENTLU5vdFN1cHBvcnRlZEJ5VUUJWzJdCU5VTEwJCU9QVElPTkFMLAorCXYtZ21sYy1BZGRyZXNzCVszXQlHU04tQWRkcmVzcwlPUFRJT05BTCwKKwlhZGQtaW5mbwkJWzRdICBBREQtSW5mbwlPUFRJT05BTCwKKwllcHMtaW5mbwkJWzVdCUVQUy1JbmZvCU9QVElPTkFMLAorCXNlcnZpbmdOb2RlVHlwZUluZGljYXRvcglbNl0JTlVMTAkJT1BUSU9OQUwsCisJc2tpcFN1YnNjcmliZXJEYXRhVXBkYXRlCVs3XSBOVUxMCQlPUFRJT05BTCwKKwl1c2VkUkFULVR5cGUJWzhdIFVzZWQtUkFULVR5cGUJT1BUSU9OQUwgCisJIH0KKworVXNlZC1SQVQtVHlwZTo6PSBFTlVNRVJBVEVEIHsKKwl1dHJhbiAgKDApLAorCWdlcmFuICAoMSksCisJZ2FuICAgICgyKSwKKwlpLWhzcGEtZXZvbHV0aW9uICgzKSwKKwllLXV0cmFuCSg0KSwKKwkuLi59CisKK0VQUy1JbmZvIDo6PSBDSE9JQ0V7CisJcGRuLWd3LXVwZGF0ZQlbMF0gUEROLUdXLVVwZGF0ZSwKKwlpc3ItSW5mb3JtYXRpb24JWzFdIElTUi1JbmZvcm1hdGlvbiB9CisKK1BETi1HVy1VcGRhdGUgOjo9IFNFUVVFTkNFeworCWFwbgkJCVswXSBBUE4JCU9QVElPTkFMLAorCXBkbi1ndy1JZGVudGl0eQlbMV0gUEROLUdXLUlkZW50aXR5CU9QVElPTkFMLAorCWNvbnRleHRJZAkJWzJdIENvbnRleHRJZCAgICAgICAgICAgICAgICAgICAgIE9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CisKK0lTUi1JbmZvcm1hdGlvbjo6PSBCSVQgU1RSSU5HIHsKKwl1cGRhdGVNTUUgICgwKSwKKwljYW5jZWxTR1NOICAoMSl9IChTSVpFICgyLi44KSkKKwktLSBleGNlcHRpb24gaGFuZGxpbmc6IHJlY2VwdGlvbiBvZiB1bmtub3duIGJpdCBhc3NpZ25tZW50cyBpbiB0aGUKKwktLSBJU1ItSW5mb3JtYXRpb24gZGF0YSB0eXBlIHNoYWxsIGJlIGRpc2NhcmRlZCBieSB0aGUgcmVjZWl2ZXIgCisKK1NHU04tQ2FwYWJpbGl0eSA6Oj0gU0VRVUVOQ0V7CisJc29sc2FTdXBwb3J0SW5kaWNhdG9yCU5VTEwJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCXN1cGVyQ2hhcmdlclN1cHBvcnRlZEluU2VydmluZ05ldHdvcmtFbnRpdHkJWzJdIFN1cGVyQ2hhcmdlckluZm8JT1BUSU9OQUwgLAorCWdwcnNFbmhhbmNlbWVudHNTdXBwb3J0SW5kaWNhdG9yIAlbM10gTlVMTAkJT1BUSU9OQUwsCisJc3VwcG9ydGVkQ2FtZWxQaGFzZXMgIAlbNF0gU3VwcG9ydGVkQ2FtZWxQaGFzZXMJT1BUSU9OQUwsCisJc3VwcG9ydGVkTENTLUNhcGFiaWxpdHlTZXRzCVs1XSAgU3VwcG9ydGVkTENTLUNhcGFiaWxpdHlTZXRzCU9QVElPTkFMLAorCW9mZmVyZWRDYW1lbDRDU0lzCVs2XSBPZmZlcmVkQ2FtZWw0Q1NJcwlPUFRJT05BTCwKKwlzbXNDYWxsQmFycmluZ1N1cHBvcnRJbmRpY2F0b3IJWzddCU5VTEwJCU9QVElPTkFMLAlzdXBwb3J0ZWRSQVQtVHlwZXNJbmRpY2F0b3IJWzhdCVN1cHBvcnRlZFJBVC1UeXBlcwlPUFRJT05BTCwKKwlzdXBwb3J0ZWRGZWF0dXJlcwlbOV0gU3VwcG9ydGVkRmVhdHVyZXMJT1BUSU9OQUwgfQorCitTdXBwb3J0ZWRGZWF0dXJlczo6PSBCSVQgU1RSSU5HIHsKKwlvZGItYWxsICgwKSwKKwlvZGItSFBMTU4tQVBOICgxKSwKKwlvZGItVlBMTU4tQVBOICgyKSwKKwlyZWdTdWIgKDMpfSAoU0laRSAoNC4uOCkpCisKK0dTTi1BZGRyZXNzIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDUuLjE3KSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDIzLjAwMyBbMTddCisKK1VwZGF0ZUdwcnNMb2NhdGlvblJlcyA6Oj0gU0VRVUVOQ0UgeworCWhsci1OdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWFkZC1DYXBhYmlsaXR5CU5VTEwJCQlPUFRJT05BTCwKKwlzZ3NuLW1tZVNlcGFyYXRpb25TdXBwb3J0ZWQJWzBdIE5VTEwJCU9QVElPTkFMIH0KKworLS0gaGFuZG92ZXIgdHlwZXMKKworRm9yd2FyZEFjY2Vzc1NpZ25hbGxpbmctQXJnIDo6PSBbM10gU0VRVUVOQ0UgeworCWFuLUFQRFUJCUFjY2Vzc05ldHdvcmtTaWduYWxJbmZvLAorCWludGVncml0eVByb3RlY3Rpb25JbmZvCVswXSBJbnRlZ3JpdHlQcm90ZWN0aW9uSW5mb3JtYXRpb24JCU9QVElPTkFMLAorCWVuY3J5cHRpb25JbmZvCVsxXSBFbmNyeXB0aW9uSW5mb3JtYXRpb24JCU9QVElPTkFMLAorCWtleVN0YXR1cwkJWzJdCUtleVN0YXR1cwlPUFRJT05BTCwKKwlhbGxvd2VkR1NNLUFsZ29yaXRobXMJWzRdCUFsbG93ZWRHU00tQWxnb3JpdGhtcwlPUFRJT05BTCwKKwlhbGxvd2VkVU1UUy1BbGdvcml0aG1zCVs1XQlBbGxvd2VkVU1UUy1BbGdvcml0aG1zCU9QVElPTkFMLAorCXJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbglbNl0gUmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbM10JRXh0ZW5zaW9uQ29udGFpbmVyIAlPUFRJT05BTCwKKwkuLi4sCisJcmFkaW9SZXNvdXJjZUxpc3QJWzddCVJhZGlvUmVzb3VyY2VMaXN0CU9QVElPTkFMLAorCWJzc21hcC1TZXJ2aWNlSGFuZG92ZXIJWzldCUJTU01BUC1TZXJ2aWNlSGFuZG92ZXIJT1BUSU9OQUwsCisJcmFuYXAtU2VydmljZUhhbmRvdmVyCVs4XQlSQU5BUC1TZXJ2aWNlSGFuZG92ZXIJT1BUSU9OQUwsCisJYnNzbWFwLVNlcnZpY2VIYW5kb3Zlckxpc3QJWzEwXQlCU1NNQVAtU2VydmljZUhhbmRvdmVyTGlzdAlPUFRJT05BTCwKKwljdXJyZW50bHlVc2VkQ29kZWMJWzExXSBDb2RlYwlPUFRJT05BTCwKKwlpdVN1cHBvcnRlZENvZGVjc0xpc3QJWzEyXSBTdXBwb3J0ZWRDb2RlY3NMaXN0CU9QVElPTkFMLAorCXJhYi1Db25maWd1cmF0aW9uSW5kaWNhdG9yCVsxM10gTlVMTAkJT1BUSU9OQUwsCisJaXVTZWxlY3RlZENvZGVjCVsxNF0JQ29kZWMJT1BUSU9OQUwsCisJYWx0ZXJuYXRpdmVDaGFubmVsVHlwZQlbMTVdCVJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbglPUFRJT05BTCwKKwl0cmFjZVByb3BhZ2F0aW9uTGlzdAlbMTddCVRyYWNlUHJvcGFnYXRpb25MaXN0CU9QVElPTkFMIH0KKworQWxsb3dlZEdTTS1BbGdvcml0aG1zIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIGludGVybmFsIHN0cnVjdHVyZSBpcyBjb2RlZCBhcyBBbGdvcml0aG0gaWRlbnRpZmllciBvY3RldCBmcm9tCisJLS0gUGVybWl0dGVkIEFsZ29yaXRobXMgZGVmaW5lZCBpbiAzR1BQIFRTIDQ4LjAwOAorCS0tIEEgbm9kZSBzaGFsbCBtYXJrIGFsbCBHU00gYWxnb3JpdGhtcyB0aGF0IGFyZSBhbGxvd2VkIGluIE1TQy1CCisKK0FsbG93ZWRVTVRTLUFsZ29yaXRobXMgOjo9IFNFUVVFTkNFIHsKKwlpbnRlZ3JpdHlQcm90ZWN0aW9uQWxnb3JpdGhtcwlbMF0gCVBlcm1pdHRlZEludGVncml0eVByb3RlY3Rpb25BbGdvcml0aG1zCU9QVElPTkFMLAorCWVuY3J5cHRpb25BbGdvcml0aG1zCVsxXSAJUGVybWl0dGVkRW5jcnlwdGlvbkFsZ29yaXRobXMJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworUGVybWl0dGVkSW50ZWdyaXR5UHJvdGVjdGlvbkFsZ29yaXRobXMgOjo9CisJCU9DVEVUIFNUUklORyAoU0laRSAoMS4ubWF4UGVybWl0dGVkSW50ZWdyaXR5UHJvdGVjdGlvbkFsZ29yaXRobXNMZW5ndGgpKQorCS0tIE9jdGV0cyBjb250YWluIGEgY29tcGxldGUgUGVybWl0dGVkSW50ZWdyaXR5UHJvdGVjdGlvbkFsZ29yaXRobXMgZGF0YSB0eXBlIAorCS0tIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMsIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBzY2hlbWUgCisJLS0gbWFuZGF0ZWQgYnkgM0dQUCBUUyAyNS40MTMuIAorCS0tIFBhZGRpbmcgYml0cyBhcmUgaW5jbHVkZWQsIGlmIG5lZWRlZCwgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIAorCS0tIGxhc3Qgb2N0ZXQgb2YgdGhlIG9jdGV0IHN0cmluZy4gCisKKworbWF4UGVybWl0dGVkSW50ZWdyaXR5UHJvdGVjdGlvbkFsZ29yaXRobXNMZW5ndGggSU5URUdFUiA6Oj0gOQorCitQZXJtaXR0ZWRFbmNyeXB0aW9uQWxnb3JpdGhtcyA6Oj0KKwkJT0NURVQgU1RSSU5HIChTSVpFICgxLi5tYXhQZXJtaXR0ZWRFbmNyeXB0aW9uQWxnb3JpdGhtc0xlbmd0aCkpCisJLS0gT2N0ZXRzIGNvbnRhaW4gYSBjb21wbGV0ZSBQZXJtaXR0ZWRFbmNyeXB0aW9uQWxnb3JpdGhtcyBkYXRhIHR5cGUgCisJLS0gYXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI1LjQxMywgZW5jb2RlZCBhY2NvcmRpbmcgdG8gdGhlIGVuY29kaW5nIHNjaGVtZSAKKwktLSBtYW5kYXRlZCBieSAzR1BQIFRTIDI1LjQxMworCS0tIFBhZGRpbmcgYml0cyBhcmUgaW5jbHVkZWQsIGlmIG5lZWRlZCwgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIAorCS0tIGxhc3Qgb2N0ZXQgb2YgdGhlIG9jdGV0IHN0cmluZy4gCisKKworbWF4UGVybWl0dGVkRW5jcnlwdGlvbkFsZ29yaXRobXNMZW5ndGggSU5URUdFUiA6Oj0gOQorCitLZXlTdGF0dXMgOjo9IEVOVU1FUkFURUQgeworCW9sZCAgKDApLAorCW5ldyAgKDEpLAorCS4uLn0KKwktLSBleGNlcHRpb24gaGFuZGxpbmc6CisJLS0gcmVjZWl2ZWQgdmFsdWVzIGluIHJhbmdlIDItMzEgc2hhbGwgYmUgdHJlYXRlZCBhcyAib2xkIgorCS0tIHJlY2VpdmVkIHZhbHVlcyBncmVhdGVyIHRoYW4gMzEgc2hhbGwgYmUgdHJlYXRlZCBhcyAibmV3IgorCitQcmVwYXJlSE8tQXJnIDo6PSBbM10gU0VRVUVOQ0UgeworCXRhcmdldENlbGxJZAlbMF0gR2xvYmFsQ2VsbElkCU9QVElPTkFMLAorCWhvLU51bWJlck5vdFJlcXVpcmVkCU5VTEwJCQlPUFRJT05BTCwgCisJdGFyZ2V0Uk5DSWQJWzFdIFJOQ0lkCQlPUFRJT05BTCwKKwlhbi1BUERVCQlbMl0gQWNjZXNzTmV0d29ya1NpZ25hbEluZm8JT1BUSU9OQUwsCisJbXVsdGlwbGVCZWFyZXJSZXF1ZXN0ZWQJWzNdIE5VTEwJCU9QVElPTkFMLAorCWltc2kJCQlbNF0gSU1TSQkJT1BUSU9OQUwsCisJaW50ZWdyaXR5UHJvdGVjdGlvbkluZm8JWzVdIEludGVncml0eVByb3RlY3Rpb25JbmZvcm1hdGlvbgkJT1BUSU9OQUwsCisJZW5jcnlwdGlvbkluZm8JWzZdIEVuY3J5cHRpb25JbmZvcm1hdGlvbgkJT1BUSU9OQUwsCisJcmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uCVs3XSBSYWRpb1Jlc291cmNlSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJYWxsb3dlZEdTTS1BbGdvcml0aG1zCVs5XQlBbGxvd2VkR1NNLUFsZ29yaXRobXMJT1BUSU9OQUwsCisJYWxsb3dlZFVNVFMtQWxnb3JpdGhtcwlbMTBdCUFsbG93ZWRVTVRTLUFsZ29yaXRobXMJT1BUSU9OQUwsCisJcmFkaW9SZXNvdXJjZUxpc3QJWzExXSBSYWRpb1Jlc291cmNlTGlzdAlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzhdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCXJhYi1JZAkJWzEyXSBSQUItSWQJT1BUSU9OQUwsCisJYnNzbWFwLVNlcnZpY2VIYW5kb3ZlcglbMTNdCUJTU01BUC1TZXJ2aWNlSGFuZG92ZXIJT1BUSU9OQUwsCisJcmFuYXAtU2VydmljZUhhbmRvdmVyCVsxNF0JUkFOQVAtU2VydmljZUhhbmRvdmVyCU9QVElPTkFMLCAKKwlic3NtYXAtU2VydmljZUhhbmRvdmVyTGlzdAlbMTVdCUJTU01BUC1TZXJ2aWNlSGFuZG92ZXJMaXN0CU9QVElPTkFMLAorCWFzY2lDYWxsUmVmZXJlbmNlCVsyMF0JQVNDSS1DYWxsUmVmZXJlbmNlCU9QVElPTkFMLAorCWdlcmFuLWNsYXNzbWFyawlbMTZdIEdFUkFOLUNsYXNzbWFyawlPUFRJT05BTCwKKwlpdUN1cnJlbnRseVVzZWRDb2RlYwlbMTddIENvZGVjCU9QVElPTkFMLAorCWl1U3VwcG9ydGVkQ29kZWNzTGlzdAlbMThdIFN1cHBvcnRlZENvZGVjc0xpc3QJT1BUSU9OQUwsCisJcmFiLUNvbmZpZ3VyYXRpb25JbmRpY2F0b3IJWzE5XSBOVUxMCQlPUFRJT05BTCwKKwl1ZXNiaS1JdQkJWzIxXQlVRVNCSS1JdQlPUFRJT05BTCwKKwlpbWVpc3YJCVsyMl0JSU1FSQkJT1BUSU9OQUwsCisJYWx0ZXJuYXRpdmVDaGFubmVsVHlwZQlbMjNdCVJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbglPUFRJT05BTCwKKwl0cmFjZVByb3BhZ2F0aW9uTGlzdAlbMjVdCVRyYWNlUHJvcGFnYXRpb25MaXN0CU9QVElPTkFMCSB9CisKK0JTU01BUC1TZXJ2aWNlSGFuZG92ZXJMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi4gbWF4TnVtT2ZTZXJ2aWNlSGFuZG92ZXJzKSBPRgorCQkJCUJTU01BUC1TZXJ2aWNlSGFuZG92ZXJJbmZvCisKK0JTU01BUC1TZXJ2aWNlSGFuZG92ZXJJbmZvIDo6PSBTRVFVRU5DRSB7CisJYnNzbWFwLVNlcnZpY2VIYW5kb3ZlcglCU1NNQVAtU2VydmljZUhhbmRvdmVyLAorCXJhYi1JZAkJUkFCLUlkLAorCS0tIFJBQiBJZGVudGl0eSBpcyBuZWVkZWQgdG8gcmVsYXRlIHRoZSBzZXJ2aWNlIGhhbmRvdmVycyB3aXRoIHRoZSByYWRpbyBhY2Nlc3MgYmVhcmVycy4gCisJLi4ufQorCittYXhOdW1PZlNlcnZpY2VIYW5kb3ZlcnMgIElOVEVHRVIgOjo9IDcKKworQlNTTUFQLVNlcnZpY2VIYW5kb3ZlciA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0aGUgU2VydmljZSBIYW5kb3ZlciBpbmZvcm1hdGlvbiBlbGVtZW50IGluCisJLS0gM0dQUCBUUyA0OC4wMDguCisKK1JBTkFQLVNlcnZpY2VIYW5kb3ZlciA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBPY3RldCBjb250YWlucyBhIGNvbXBsZXRlIFNlcnZpY2UtSGFuZG92ZXIgZGF0YSB0eXBlIAorCS0tIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMsIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBzY2hlbWUgCisJLS0gbWFuZGF0ZWQgYnkgM0dQUCBUUyAyNS40MTMKKwktLSBQYWRkaW5nIGJpdHMgYXJlIGluY2x1ZGVkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzLiAKKworCitSYWRpb1Jlc291cmNlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4uIG1heE51bU9mUmFkaW9SZXNvdXJjZXMpIE9GCisJCQkJUmFkaW9SZXNvdXJjZQorCitSYWRpb1Jlc291cmNlIDo6PSBTRVFVRU5DRSB7CisJcmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uCVJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbiwKKwlyYWItSWQJCVJBQi1JZCwKKwktLSBSQUIgSWRlbnRpdHkgaXMgbmVlZGVkIHRvIHJlbGF0ZSB0aGUgcmFkaW8gcmVzb3VyY2VzIHdpdGggdGhlIHJhZGlvIGFjY2VzcyBiZWFyZXJzLiAKKwkuLi59CisKK21heE51bU9mUmFkaW9SZXNvdXJjZXMgIElOVEVHRVIgOjo9IDcKKworUHJlcGFyZUhPLVJlcyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwloYW5kb3Zlck51bWJlcglbMF0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCXJlbG9jYXRpb25OdW1iZXJMaXN0CVsxXQlSZWxvY2F0aW9uTnVtYmVyTGlzdAlPUFRJT05BTCwKKwlhbi1BUERVCQlbMl0JQWNjZXNzTmV0d29ya1NpZ25hbEluZm8JT1BUSU9OQUwsCisJbXVsdGljYWxsQmVhcmVySW5mbwlbM10JTXVsdGljYWxsQmVhcmVySW5mbwlPUFRJT05BTCwKKwltdWx0aXBsZUJlYXJlck5vdFN1cHBvcnRlZAlOVUxMCQkJT1BUSU9OQUwsCisJc2VsZWN0ZWRVTVRTLUFsZ29yaXRobXMJWzVdCVNlbGVjdGVkVU1UUy1BbGdvcml0aG1zCU9QVElPTkFMLAorCWNob3NlblJhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbglbNl0gQ2hvc2VuUmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uCSBPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzRdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJaXVTZWxlY3RlZENvZGVjCVs3XSBDb2RlYwkJT1BUSU9OQUwsCisJaXVBdmFpbGFibGVDb2RlY3NMaXN0CVs4XSBDb2RlY0xpc3QJT1BUSU9OQUwgfQorCitTZWxlY3RlZFVNVFMtQWxnb3JpdGhtcyA6Oj0gU0VRVUVOQ0UgeworCWludGVncml0eVByb3RlY3Rpb25BbGdvcml0aG0JWzBdIAlDaG9zZW5JbnRlZ3JpdHlQcm90ZWN0aW9uQWxnb3JpdGhtCU9QVElPTkFMLAorCWVuY3J5cHRpb25BbGdvcml0aG0JWzFdIAlDaG9zZW5FbmNyeXB0aW9uQWxnb3JpdGhtCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQ2hvc2VuSW50ZWdyaXR5UHJvdGVjdGlvbkFsZ29yaXRobSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBPY3RldCBjb250YWlucyBhIGNvbXBsZXRlIEludGVncml0eVByb3RlY3Rpb25BbGdvcml0aG0gZGF0YSB0eXBlIAorCS0tIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMsIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBzY2hlbWUgCisJLS0gbWFuZGF0ZWQgYnkgM0dQUCBUUyAyNS40MTMKKwktLSBQYWRkaW5nIGJpdHMgYXJlIGluY2x1ZGVkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzLiAKKworQ2hvc2VuRW5jcnlwdGlvbkFsZ29yaXRobSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBPY3RldCBjb250YWlucyBhIGNvbXBsZXRlIEVuY3J5cHRpb25BbGdvcml0aG0gZGF0YSB0eXBlIAorCS0tIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyNS40MTMsIGVuY29kZWQgYWNjb3JkaW5nIHRvIHRoZSBlbmNvZGluZyBzY2hlbWUgCisJLS0gbWFuZGF0ZWQgYnkgM0dQUCBUUyAyNS40MTMKKwktLSBQYWRkaW5nIGJpdHMgYXJlIGluY2x1ZGVkIGluIHRoZSBsZWFzdCBzaWduaWZpY2FudCBiaXRzLiAKKworQ2hvc2VuUmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uIDo6PSBTRVFVRU5DRSB7CisJY2hvc2VuQ2hhbm5lbEluZm8JWzBdIENob3NlbkNoYW5uZWxJbmZvCU9QVElPTkFMLAorCWNob3NlblNwZWVjaFZlcnNpb24JWzFdIENob3NlblNwZWVjaFZlcnNpb24JT1BUSU9OQUwsCisJLi4ufQorCitDaG9zZW5DaGFubmVsSW5mbyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0aGUgQ2hvc2VuIENoYW5uZWwgaW5mb3JtYXRpb24gZWxlbWVudCBpbiAzR1BQIFRTIDQ4LjAwOAorCitDaG9zZW5TcGVlY2hWZXJzaW9uIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIE9jdGV0cyBhcmUgY29kZWQgYWNjb3JkaW5nIHRoZSBTcGVlY2ggVmVyc2lvbiAoY2hvc2VuKSBpbmZvcm1hdGlvbiBlbGVtZW50IGluIDNHUFAgVFMKKwktLSA0OC4wMDggCisKK1ByZXBhcmVTdWJzZXF1ZW50SE8tQXJnIDo6PSBbM10gU0VRVUVOQ0UgeworCXRhcmdldENlbGxJZAlbMF0gR2xvYmFsQ2VsbElkCU9QVElPTkFMLAorCXRhcmdldE1TQy1OdW1iZXIJWzFdIElTRE4tQWRkcmVzc1N0cmluZywKKwl0YXJnZXRSTkNJZAlbMl0gUk5DSWQJCU9QVElPTkFMLAorCWFuLUFQRFUJCVszXQlBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbwlPUFRJT05BTCwKKwlzZWxlY3RlZFJhYi1JZAlbNF0JUkFCLUlkCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNV0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlnZXJhbi1jbGFzc21hcmsJWzZdIEdFUkFOLUNsYXNzbWFyawlPUFRJT05BTCwKKwlyYWItQ29uZmlndXJhdGlvbkluZGljYXRvcglbN10gTlVMTAkJT1BUSU9OQUwgfQorCitQcmVwYXJlU3Vic2VxdWVudEhPLVJlcyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwlhbi1BUERVCQlBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbywKKwlleHRlbnNpb25Db250YWluZXIJWzBdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK1Byb2Nlc3NBY2Nlc3NTaWduYWxsaW5nLUFyZyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwlhbi1BUERVCQlBY2Nlc3NOZXR3b3JrU2lnbmFsSW5mbywKKwlzZWxlY3RlZFVNVFMtQWxnb3JpdGhtcwlbMV0JU2VsZWN0ZWRVTVRTLUFsZ29yaXRobXMJT1BUSU9OQUwsCisJc2VsZWN0ZWRHU00tQWxnb3JpdGhtCVsyXQlTZWxlY3RlZEdTTS1BbGdvcml0aG0JT1BUSU9OQUwsCisJY2hvc2VuUmFkaW9SZXNvdXJjZUluZm9ybWF0aW9uCVszXSBDaG9zZW5SYWRpb1Jlc291cmNlSW5mb3JtYXRpb24gT1BUSU9OQUwsCisJc2VsZWN0ZWRSYWItSWQJWzRdIFJBQi1JZAlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzBdCUV4dGVuc2lvbkNvbnRhaW5lciAJT1BUSU9OQUwsCisJLi4uLAorCWlVU2VsZWN0ZWRDb2RlYwlbNV0gQ29kZWMJCU9QVElPTkFMLAorCWl1QXZhaWxhYmxlQ29kZWNzTGlzdAlbNl0gQ29kZWNMaXN0CU9QVElPTkFMIH0KKworU3VwcG9ydGVkQ29kZWNzTGlzdCA6Oj0gU0VRVUVOQ0UgeworCXV0cmFuQ29kZWNMaXN0CVswXSBDb2RlY0xpc3QJT1BUSU9OQUwsCisJZ2VyYW5Db2RlY0xpc3QJWzFdIENvZGVjTGlzdAlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0NvZGVjTGlzdCA6Oj0gU0VRVUVOQ0UgeworCWNvZGVjMQkJWzFdIENvZGVjLAorCWNvZGVjMgkJWzJdIENvZGVjCQlPUFRJT05BTCwKKwljb2RlYzMJCVszXSBDb2RlYwkJT1BUSU9OQUwsCisJY29kZWM0CQlbNF0gQ29kZWMJCU9QVElPTkFMLAorCWNvZGVjNQkJWzVdIENvZGVjCQlPUFRJT05BTCwKKwljb2RlYzYJCVs2XSBDb2RlYwkJT1BUSU9OQUwsCisJY29kZWM3CQlbN10gQ29kZWMJCU9QVElPTkFMLAorCWNvZGVjOAkJWzhdIENvZGVjCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzldIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisJLS0gQ29kZWNzIGFyZSBzZW50IGluIHByaW9yaXR5IG9yZGVyIHdoZXJlIGNvZGVjMSBoYXMgaGlnaGVzdCBwcmlvcml0eQorCitDb2RlYyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi40KSkKKworCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCS0tIG9jdGV0IDEJQ29kZWQgYXMgQ29kZWMgSWRlbnRpZmljYXRpb24gY29kZSBpbiAzR1BQIFRTIDI2LjEwMworCS0tIG9jdGV0cyAyLDMsNAlQYXJhbWV0ZXJzIGZvciB0aGUgQ29kZWMgYXMgZGVmaW5lZCBpbiAzR1BQIFRTCisJLS0JCQkyNi4xMDMsIGlmIGF2YWlsYWJsZSwgbGVuZ3RoIGRlcGVuZGluZyBvbiB0aGUgY29kZWMKKworR0VSQU4tQ2xhc3NtYXJrIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDIuLjg3KSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0aGUgR0VSQU4gQ2xhc3NtYXJrIGluZm9ybWF0aW9uIGVsZW1lbnQgaW4gM0dQUCBUUyA0OC4wMDgKKworU2VsZWN0ZWRHU00tQWxnb3JpdGhtIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIGludGVybmFsIHN0cnVjdHVyZSBpcyBjb2RlZCBhcyBBbGdvcml0aG0gaWRlbnRpZmllciBvY3RldCBmcm9tIENob3NlbiBFbmNyeXB0aW9uCisJLS0gQWxnb3JpdGhtIGRlZmluZWQgaW4gM0dQUCBUUyA0OC4wMDgKKwktLSBBIG5vZGUgc2hhbGwgbWFyayBvbmx5IHRoZSBzZWxlY3RlZCBHU00gYWxnb3JpdGhtCisKK1NlbmRFbmRTaWduYWwtQXJnIDo6PSBbM10gU0VRVUVOQ0UgeworCWFuLUFQRFUJCUFjY2Vzc05ldHdvcmtTaWduYWxJbmZvLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0JRXh0ZW5zaW9uQ29udGFpbmVyIAlPUFRJT05BTCwKKwkuLi59CisKK1NlbmRFbmRTaWduYWwtUmVzIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXQlFeHRlbnNpb25Db250YWluZXIgCU9QVElPTkFMLAorCS4uLn0KKworUk5DSWQgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNykpCisJLS0gVGhlIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6CisJLS0gb2N0ZXQgMSBiaXRzIDQzMjEJTW9iaWxlIENvdW50cnkgQ29kZSAxc3QgZGlnaXQKKwktLSAgICAgICAgIGJpdHMgODc2NQlNb2JpbGUgQ291bnRyeSBDb2RlIDJuZCBkaWdpdAorCS0tIG9jdGV0IDIgYml0cyA0MzIxCU1vYmlsZSBDb3VudHJ5IENvZGUgM3JkIGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAzcmQgZGlnaXQKKwktLQkJCW9yIGZpbGxlciAoMTExMSkgZm9yIDIgZGlnaXQgTU5DcworCS0tIG9jdGV0IDMgYml0cyA0MzIxCU1vYmlsZSBOZXR3b3JrIENvZGUgMXN0IGRpZ2l0CisJLS0gICAgICAgICBiaXRzIDg3NjUJTW9iaWxlIE5ldHdvcmsgQ29kZSAybmQgZGlnaXQKKwktLSBvY3RldHMgNCBhbmQgNQlMb2NhdGlvbiBBcmVhIENvZGUgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjQuMDA4CisJLS0gb2N0ZXRzIDYgYW5kIDcJUk5DIElkIHZhbHVlIGFjY29yZGluZyB0byAzR1BQIFRTIDI1LjQxMworCitSZWxvY2F0aW9uTnVtYmVyTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZSZWxvY2F0aW9uTnVtYmVyKSBPRgorCQkJCVJlbG9jYXRpb25OdW1iZXIKKworTXVsdGljYWxsQmVhcmVySW5mbyA6Oj0gSU5URUdFUiAoMS4ubWF4TnVtT2ZSZWxvY2F0aW9uTnVtYmVyKQorCitSZWxvY2F0aW9uTnVtYmVyIDo6PSBTRVFVRU5DRSB7CisJaGFuZG92ZXJOdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAorCXJhYi1JZAkJUkFCLUlkLAorCS0tIFJBQiBJZGVudGl0eSBpcyBuZWVkZWQgdG8gcmVsYXRlIHRoZSBjYWxscyB3aXRoIHRoZSByYWRpbyBhY2Nlc3MgYmVhcmVycy4gCisJLi4ufQorCitSQUItSWQgOjo9IElOVEVHRVIgKDEuLm1heE5yT2ZSQUJzKQorCittYXhOck9mUkFCcyBJTlRFR0VSIDo6PSAyNTUKKworbWF4TnVtT2ZSZWxvY2F0aW9uTnVtYmVyICBJTlRFR0VSIDo6PSA3CisKK1JhZGlvUmVzb3VyY2VJbmZvcm1hdGlvbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgzLi4xMykpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdGhlIENoYW5uZWwgVHlwZSBpbmZvcm1hdGlvbiBlbGVtZW50IGluIDNHUFAgVFMgNDguMDA4CisKK0ludGVncml0eVByb3RlY3Rpb25JbmZvcm1hdGlvbiA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxOC4ubWF4TnVtT2ZJbnRlZ3JpdHlJbmZvKSkKKwktLSBPY3RldHMgY29udGFpbiBhIGNvbXBsZXRlIEludGVncml0eVByb3RlY3Rpb25JbmZvcm1hdGlvbiBkYXRhIHR5cGUgCisJLS0gYXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI1LjQxMywgZW5jb2RlZCBhY2NvcmRpbmcgdG8gdGhlIGVuY29kaW5nIHNjaGVtZSAKKwktLSBtYW5kYXRlZCBieSAzR1BQIFRTIDI1LjQxMworCS0tIFBhZGRpbmcgYml0cyBhcmUgaW5jbHVkZWQsIGlmIG5lZWRlZCwgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIAorCS0tIGxhc3Qgb2N0ZXQgb2YgdGhlIG9jdGV0IHN0cmluZy4gCisKK21heE51bU9mSW50ZWdyaXR5SW5mbyBJTlRFR0VSIDo6PSAxMDAKKworRW5jcnlwdGlvbkluZm9ybWF0aW9uIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDE4Li5tYXhOdW1PZkVuY3J5cHRpb25JbmZvKSkKKwktLSBPY3RldHMgY29udGFpbiBhIGNvbXBsZXRlIEVuY3J5cHRpb25JbmZvcm1hdGlvbiBkYXRhIHR5cGUgCisJLS0gYXMgZGVmaW5lZCBpbiAzR1BQIFRTIDI1LjQxMywgZW5jb2RlZCBhY2NvcmRpbmcgdG8gdGhlIGVuY29kaW5nIHNjaGVtZSAKKwktLSBtYW5kYXRlZCBieSAzR1BQIFRTIDI1LjQxMworCS0tIFBhZGRpbmcgYml0cyBhcmUgaW5jbHVkZWQsIGlmIG5lZWRlZCwgaW4gdGhlIGxlYXN0IHNpZ25pZmljYW50IGJpdHMgb2YgdGhlIAorCS0tIGxhc3Qgb2N0ZXQgb2YgdGhlIG9jdGV0IHN0cmluZy4gCisKK21heE51bU9mRW5jcnlwdGlvbkluZm8gSU5URUdFUiA6Oj0gMTAwCisKKy0tIGF1dGhlbnRpY2F0aW9uIG1hbmFnZW1lbnQgdHlwZXMKKworU2VuZEF1dGhlbnRpY2F0aW9uSW5mb0FyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlbMF0gSU1TSSwKKwludW1iZXJPZlJlcXVlc3RlZFZlY3RvcnMJTnVtYmVyT2ZSZXF1ZXN0ZWRWZWN0b3JzLAorCXNlZ21lbnRhdGlvblByb2hpYml0ZWQJTlVMTAkJCU9QVElPTkFMLAorCWltbWVkaWF0ZVJlc3BvbnNlUHJlZmVycmVkCVsxXSBOVUxMCQkJT1BUSU9OQUwsCisJcmUtc3luY2hyb25pc2F0aW9uSW5mbwlSZS1zeW5jaHJvbmlzYXRpb25JbmZvCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlyZXF1ZXN0aW5nTm9kZVR5cGUJWzNdIFJlcXVlc3RpbmdOb2RlVHlwZQlPUFRJT05BTCwKKwlyZXF1ZXN0aW5nUExNTi1JZAlbNF0gUExNTi1JZAlPUFRJT05BTCwKKwludW1iZXJPZlJlcXVlc3RlZEFkZGl0aW9uYWwtVmVjdG9ycwlbNV0gTnVtYmVyT2ZSZXF1ZXN0ZWRWZWN0b3JzCU9QVElPTkFMLAorCWFkZGl0aW9uYWxWZWN0b3JzQXJlRm9yRVBTCVs2XSBOVUxMCQlPUFRJT05BTCB9CQorCisKK051bWJlck9mUmVxdWVzdGVkVmVjdG9ycyA6Oj0gSU5URUdFUiAoMS4uNSkKKworUmUtc3luY2hyb25pc2F0aW9uSW5mbyA6Oj0gU0VRVUVOQ0UgeworCXJhbmQJCQlSQU5ELAorCWF1dHMJCQlBVVRTLAorCS4uLn0KKworU2VuZEF1dGhlbnRpY2F0aW9uSW5mb1JlcyA6Oj0gWzNdIFNFUVVFTkNFIHsKKwlhdXRoZW50aWNhdGlvblNldExpc3QJQXV0aGVudGljYXRpb25TZXRMaXN0IAlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwllcHMtQXV0aGVudGljYXRpb25TZXRMaXN0CVsyXSBFUFMtQXV0aGVudGljYXRpb25TZXRMaXN0CU9QVElPTkFMIH0KKworRVBTLUF1dGhlbnRpY2F0aW9uU2V0TGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4uNSkgT0YKKwkJCQlFUEMtQVYKKworRVBDLUFWIDo6PSBTRVFVRU5DRSB7CisJcmFuZAkJCVJBTkQsCisJeHJlcwkJCVhSRVMsCisJYXV0bgkJCUFVVE4sCisJa2FzbWUJCUtBU01FLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitLQVNNRSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxNikpCisKK1JlcXVlc3RpbmdOb2RlVHlwZSA6Oj0gRU5VTUVSQVRFRCB7CisJdmxyICAoMCksCisJc2dzbiAgKDEpLAorCS4uLiwKKwlzLWNzY2YgICgyKSwKKwlic2YgICgzKSwKKwlnYW4tYWFhLXNlcnZlciAgKDQpLAorCXdsYW4tYWFhLXNlcnZlciAgKDUpLAorCW1tZQkJKDE2KSwKKwltbWUtc2dzbgkoMTcpCisJfQorCS0tIHRoZSB2YWx1ZXMgMiwgMywgNCBhbmQgNSBzaGFsbCBub3QgYmUgdXNlZCBvbiB0aGUgTUFQLUQgb3IgR3IgaW50ZXJmYWNlcworCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLSByZWNlaXZlZCB2YWx1ZXMgaW4gdGhlIHJhbmdlICg2LTE1KSBzaGFsbCBiZSB0cmVhdGVkIGFzICJ2bHIiCisJLS0gcmVjZWl2ZWQgdmFsdWVzIGdyZWF0ZXIgdGhhbiAxNyBzaGFsbCBiZSB0cmVhdGVkIGFzICJzZ3NuIgorCistLSBlcXVpcG1lbnQgbWFuYWdlbWVudCB0eXBlcworCitDaGVja0lNRUktQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1laQkJCUlNRUksCisJcmVxdWVzdGVkRXF1aXBtZW50SW5mbwlSZXF1ZXN0ZWRFcXVpcG1lbnRJbmZvLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitDaGVja0lNRUktUmVzIDo6PSBTRVFVRU5DRSB7CisJZXF1aXBtZW50U3RhdHVzCUVxdWlwbWVudFN0YXR1cwlPUFRJT05BTCwKKwlibXVlZgkJVUVTQkktSXUJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworUmVxdWVzdGVkRXF1aXBtZW50SW5mbzo6PSBCSVQgU1RSSU5HIHsKKwllcXVpcG1lbnRTdGF0dXMgICgwKSwKKwlibXVlZiAgKDEpfSAoU0laRSAoMi4uOCkpCisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOiByZWNlcHRpb24gb2YgdW5rbm93biBiaXQgYXNzaWdubWVudHMgaW4gdGhlCisJLS0gUmVxdWVzdGVkRXF1aXBtZW50SW5mbyBkYXRhIHR5cGUgc2hhbGwgYmUgZGlzY2FyZGVkIGJ5IHRoZSByZWNlaXZlciAKKworVUVTQkktSXUgOjo9IFNFUVVFTkNFIHsKKwl1ZXNiaS1JdUEJWzBdIFVFU0JJLUl1QQkJCQlPUFRJT05BTCwKKwl1ZXNiaS1JdUIJWzFdIFVFU0JJLUl1QgkJCQlPUFRJT05BTCwKKwkuLi59CisKK1VFU0JJLUl1QQkJCQk6Oj0gQklUIFNUUklORyAoU0laRSgxLi4xMjgpKQorLS0gU2VlIDNHUFAgVFMgMjUuNDEzCisKK1VFU0JJLUl1QgkJCQk6Oj0gQklUIFNUUklORyAoU0laRSgxLi4xMjgpKQorLS0gU2VlIDNHUFAgVFMgMjUuNDEzCisKK0VxdWlwbWVudFN0YXR1cyA6Oj0gRU5VTUVSQVRFRCB7CisJd2hpdGVMaXN0ZWQgICgwKSwKKwlibGFja0xpc3RlZCAgKDEpLAorCWdyZXlMaXN0ZWQgICgyKX0KKworLS0gc3Vic2NyaWJlciBtYW5hZ2VtZW50IHR5cGVzCisKK0luc2VydFN1YnNjcmliZXJEYXRhQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCVswXSBJTVNJCQlPUFRJT05BTCwKKwlDT01QT05FTlRTIE9GCVN1YnNjcmliZXJEYXRhLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMTRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAkKKwluYWVhLVByZWZlcnJlZENJCVsxNV0gTkFFQS1QcmVmZXJyZWRDSQlPUFRJT05BTCwKKwktLSBuYWVhLVByZWZlcnJlZENJIGlzIGluY2x1ZGVkIGF0IHRoZSBkaXNjcmV0aW9uIG9mIHRoZSBITFIgb3BlcmF0b3IuCisJZ3Byc1N1YnNjcmlwdGlvbkRhdGEJWzE2XSBHUFJTU3Vic2NyaXB0aW9uRGF0YQlPUFRJT05BTCwKKwlyb2FtaW5nUmVzdHJpY3RlZEluU2dzbkR1ZVRvVW5zdXBwb3J0ZWRGZWF0dXJlIFsyM10gCU5VTEwJCisJCQkJCQkJT1BUSU9OQUwsIAorCW5ldHdvcmtBY2Nlc3NNb2RlCVsyNF0gTmV0d29ya0FjY2Vzc01vZGUJT1BUSU9OQUwsCisJbHNhSW5mb3JtYXRpb24JWzI1XSBMU0FJbmZvcm1hdGlvbglPUFRJT05BTCwKKwlsbXUtSW5kaWNhdG9yCVsyMV0JTlVMTAkJT1BUSU9OQUwsCisJbGNzSW5mb3JtYXRpb24JWzIyXQlMQ1NJbmZvcm1hdGlvbglPUFRJT05BTCwKKwlpc3RBbGVydFRpbWVyCVsyNl0gSVNULUFsZXJ0VGltZXJWYWx1ZQlPUFRJT05BTCwKKwlzdXBlckNoYXJnZXJTdXBwb3J0ZWRJbkhMUglbMjddIEFnZUluZGljYXRvcglPUFRJT05BTCwKKwltYy1TUy1JbmZvCVsyOF0gTUMtU1MtSW5mbwlPUFRJT05BTCwKKwljcy1BbGxvY2F0aW9uUmV0ZW50aW9uUHJpb3JpdHkJWzI5XSBDUy1BbGxvY2F0aW9uUmV0ZW50aW9uUHJpb3JpdHkJCU9QVElPTkFMLAorCXNnc24tQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbwlbMTddIFNHU04tQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbwlPUFRJT05BTCwKKwljaGFyZ2luZ0NoYXJhY3RlcmlzdGljcyAJWzE4XQlDaGFyZ2luZ0NoYXJhY3RlcmlzdGljcyAJT1BUSU9OQUwsCisJYWNjZXNzUmVzdHJpY3Rpb25EYXRhCVsxOV0gQWNjZXNzUmVzdHJpY3Rpb25EYXRhCU9QVElPTkFMLAorCWljcy1JbmRpY2F0b3IJWzIwXQlCT09MRUFOCU9QVElPTkFMLAorCWVwcy1TdWJzY3JpcHRpb25EYXRhCVszMV0JRVBTLVN1YnNjcmlwdGlvbkRhdGEJT1BUSU9OQUwsCisJY3NnLVN1YnNjcmlwdGlvbkRhdGFMaXN0CVszMl0gQ1NHLVN1YnNjcmlwdGlvbkRhdGFMaXN0CU9QVElPTkFMIH0KKwktLSBJZiB0aGUgTmV0d29yayBBY2Nlc3MgTW9kZSBwYXJhbWV0ZXIgaXMgc2VudCwgaXQgc2hhbGwgYmUgcHJlc2VudCBvbmx5IGluIAorCS0tIHRoZSBmaXJzdCBzZXF1ZW5jZSBpZiBzZXFtZW50YXRpb24gaXMgdXNlZAorCitDU0ctU3Vic2NyaXB0aW9uRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLjUwKSBPRgorCQkJCUNTRy1TdWJzY3JpcHRpb25EYXRhCisKK0NTRy1TdWJzY3JpcHRpb25EYXRhIDo6PSBTRVFVRU5DRSB7CisJY3NnLUlkCSAJCUNTRy1JZCwKKwlleHBpcmF0aW9uRGF0ZQkJVGltZQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCQlFeHRlbnNpb25Db250YWluZXIgCU9QVElPTkFMLAorCS4uLn0KKworQ1NHLUlkIDo6PSBCSVQgU1RSSU5HIChTSVpFICgyNykpCisJLS0gY29kZWQgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjMuMDAzIFsxN10uCisKK1RpbWUgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoNCkpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gSUVURiBSRkMgMzU4OCBbMTM5XQorCisKK0VQUy1TdWJzY3JpcHRpb25EYXRhIDo6PSBTRVFVRU5DRSB7CisJYXBuLW9pLVJlcGxhY2VtZW50CVswXQlBUE4tT0ktUmVwbGFjZW1lbnQJT1BUSU9OQUwsCisJcmZzcC1pZAkJWzJdCVJGU1AtSUQJCU9QVElPTkFMLAorCWFtYnIJCQlbM10JQU1CUgkJT1BUSU9OQUwsCisJYXBuLUNvbmZpZ3VyYXRpb25Qcm9maWxlCVs0XQlBUE4tQ29uZmlndXJhdGlvblByb2ZpbGUJT1BUSU9OQUwsCisJc3RuLXNyCQlbNl0JSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNV0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CisKK0FQTi1PSS1SZXBsYWNlbWVudCA6Oj0gIE9DVEVUIFNUUklORyAoU0laRSAoOS4uMTAwKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFzIEFQTiBPcGVyYXRvciBJZGVudGlmaWVyIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDIzLjAwMyBbMTddIAorCitSRlNQLUlEIDo6PSAgSU5URUdFUiAoMS4uMjU2KQorCitBUE4tQ29uZmlndXJhdGlvblByb2ZpbGUgOjo9IFNFUVVFTkNFIHsKKwlkZWZhdWx0Q29udGV4dAlDb250ZXh0SWQsCisJY29tcGxldGVEYXRhTGlzdEluY2x1ZGVkCU5VTEwJCQlPUFRJT05BTCwKKwkJLS0gSWYgc2VnbWVudGF0aW9uIGlzIHVzZWQsIGNvbXBsZXRlRGF0YUxpc3RJbmNsdWRlZCBtYXkgb25seSBiZSBwcmVzZW50IGluIHRoZQorCQktLSBmaXJzdCBzZWdtZW50IG9mIEFQTi1Db25maWd1cmF0aW9uUHJvZmlsZS4KKwllcHNEYXRhTGlzdAlbMV0JRVBTLURhdGFMaXN0LAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CisKK0VQUy1EYXRhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZBUE4tQ29uZmlndXJhdGlvbnMpIE9GCisJCQkJQVBOLUNvbmZpZ3VyYXRpb24KKworCittYXhOdW1PZkFQTi1Db25maWd1cmF0aW9ucyAgSU5URUdFUiA6Oj0gNTAKKworCitBUE4tQ29uZmlndXJhdGlvbiA6Oj0gU0VRVUVOQ0UgeworCWNvbnRleHRJZAkJWzBdIENvbnRleHRJZCwKKwlzZXJ2ZWRQYXJ0eUlQLUFkZHJlc3MJWzFdIFBEUC1BZGRyZXNzCU9QVElPTkFMLAorCWFwbgkJCVsyXSBBUE4sCisJZXBzLXFvcy1TdWJzY3JpYmVkCVszXSBFUFMtUW9TLVN1YnNjcmliZWQsCisJcGRuLWd3LUlkZW50aXR5CVs0XSBQRE4tR1ctSWRlbnRpdHkJT1BUSU9OQUwsCisJcGRuLWd3LUFsbG9jYXRpb25UeXBlCVs1XSBQRE4tR1ctQWxsb2NhdGlvblR5cGUJT1BUSU9OQUwsCisJdnBsbW5BZGRyZXNzQWxsb3dlZAlbNl0gTlVMTAkJT1BUSU9OQUwsCisJY2hhcmdpbmdDaGFyYWN0ZXJpc3RpY3MJWzddIENoYXJnaW5nQ2hhcmFjdGVyaXN0aWNzCU9QVElPTkFMLAorCWFtYnIJCQlbOF0gQU1CUgkJT1BUSU9OQUwsCisJc3BlY2lmaWNBUE5JbmZvTGlzdAlbOV0gU3BlY2lmaWNBUE5JbmZvTGlzdAlPUFRJT05BTCwJZXh0ZW5zaW9uQ29udGFpbmVyCVsxMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CisKK0VQUy1Rb1MtU3Vic2NyaWJlZCA6Oj0gU0VRVUVOQ0UgeworCXFvcy1DbGFzcy1JZGVudGlmaWVyCVswXSBRb1MtQ2xhc3MtSWRlbnRpZmllciwKKwlhbGxvY2F0aW9uLVJldGVudGlvbi1Qcmlvcml0eQlbMV0gQWxsb2NhdGlvbi1SZXRlbnRpb24tUHJpb3JpdHksCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKworQU1CUiA6Oj0gU0VRVUVOQ0UgeworCW1heC1SZXF1ZXN0ZWRCYW5kd2lkdGgtVUwJWzBdIEJhbmR3aWR0aCwKKwltYXgtUmVxdWVzdGVkQmFuZHdpZHRoLURMCVsxXSBCYW5kd2lkdGgsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKworCitTcGVjaWZpY0FQTkluZm9MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlNwZWNpZmljQVBOSW5mb3MpIE9GCisJCQkJU3BlY2lmaWNBUE5JbmZvCisKK21heE51bU9mU3BlY2lmaWNBUE5JbmZvcyAgSU5URUdFUiA6Oj0gNTAKKworU3BlY2lmaWNBUE5JbmZvIDo6PSBTRVFVRU5DRSB7CisJYXBuCQkJWzBdIEFQTiwKKwlwZG4tZ3ctSWRlbnRpdHkJWzFdIFBETi1HVy1JZGVudGl0eSwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitCYW5kd2lkdGggOjo9IElOVEVHRVIgCisJLS0gYml0cyBwZXIgc2Vjb25kCisKK1FvUy1DbGFzcy1JZGVudGlmaWVyIDo6PSBJTlRFR0VSICgxLi45KQorCS0tIHZhbHVlcyBhcmUgZGVmaW5lZCBpbiAgM0dQUCBUUyAyOS4yMTIKKworCisKK0FsbG9jYXRpb24tUmV0ZW50aW9uLVByaW9yaXR5IDo6PSBTRVFVRU5DRSB7CisJcHJpb3JpdHktbGV2ZWwJWzBdIElOVEVHRVIsCisJcHJlLWVtcHRpb24tY2FwYWJpbGl0eQlbMV0gQk9PTEVBTglPUFRJT05BTCwKKwlwcmUtZW1wdGlvbi12dWxuZXJhYmlsaXR5CVsyXSBCT09MRUFOCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CisKK1BETi1HVy1JZGVudGl0eSA6Oj0gU0VRVUVOQ0UgeworCXBkbi1ndy1pcHY0LUFkZHJlc3MJWzBdIFBEUC1BZGRyZXNzCU9QVElPTkFMLAorCXBkbi1ndy1pcHY2LUFkZHJlc3MJWzFdIFBEUC1BZGRyZXNzCU9QVElPTkFMLAorCXBkbi1ndy1uYW1lCVsyXSBGUUROCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitGUUROIDo6PSAgT0NURVQgU1RSSU5HIChTSVpFICg5Li4xMDApKQorCisKK1BETi1HVy1BbGxvY2F0aW9uVHlwZSA6Oj0gRU5VTUVSQVRFRCB7CisJc3RhdGljCSgwKSwKKwlkeW5hbWljCSgxKX0KKworCitBY2Nlc3NSZXN0cmljdGlvbkRhdGEgOjo9IEJJVCBTVFJJTkcgeworCXV0cmFuTm90QWxsb3dlZCAoMCksCisJZ2VyYW5Ob3RBbGxvd2VkICgxKSwKKwlnYW5Ob3RBbGxvd2VkICAgKDIpLAorCWktaHNwYS1ldm9sdXRpb25Ob3RBbGxvd2VkICgzKSwKKwllLXV0cmFuTm90QWxsb3dlZCAoNCksCisJaG8tdG9Ob24zR1BQLUFjY2Vzc05vdEFsbG93ZWQgKDUpIH0gKFNJWkUgKDIuLjgpKQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzogCisJLS0gYWNjZXNzIHJlc3RyaWN0aW9uIGRhdGEgcmVsYXRlZCB0byBhbiBhY2Nlc3MgdHlwZSBub3Qgc3VwcG9ydGVkIGJ5IGEgbm9kZQorCS0tIHNoYWxsIGJlIGlnbm9yZWQKKwktLSBiaXRzIDYgdG8gNyBzaGFsbCBiZSBpZ25vcmVkIGlmIHJlY2VpdmVkIGFuZCBub3QgdW5kZXJzdG9vZAorCQorCitDUy1BbGxvY2F0aW9uUmV0ZW50aW9uUHJpb3JpdHkgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gVGhpcyBkYXRhIHR5cGUgZW5jb2RlcyBlYWNoIHByaW9yaXR5IGxldmVsIGRlZmluZWQgaW4gVFMgMjMuMTA3IGFzIHRoZSBiaW5hcnkgdmFsdWUKKwktLSBvZiB0aGUgcHJpb3JpdHkgbGV2ZWwuCisKK0lTVC1BbGVydFRpbWVyVmFsdWUgOjo9IElOVEVHRVIgKDE1Li4yNTUpCisKK0xDU0luZm9ybWF0aW9uIDo6PSBTRVFVRU5DRSB7CisJZ21sYy1MaXN0CVswXQlHTUxDLUxpc3QJT1BUSU9OQUwsCisJbGNzLVByaXZhY3lFeGNlcHRpb25MaXN0CVsxXQlMQ1MtUHJpdmFjeUV4Y2VwdGlvbkxpc3QJT1BUSU9OQUwsCisJbW9sci1MaXN0CQlbMl0JTU9MUi1MaXN0CU9QVElPTkFMLAorCS4uLiwKKwlhZGQtbGNzLVByaXZhY3lFeGNlcHRpb25MaXN0CVszXQlMQ1MtUHJpdmFjeUV4Y2VwdGlvbkxpc3QJT1BUSU9OQUwgfQorCS0tIGFkZC1sY3MtUHJpdmFjeUV4Y2VwdGlvbkxpc3QgbWF5IGJlIHNlbnQgb25seSBpZiBsY3MtUHJpdmFjeUV4Y2VwdGlvbkxpc3QgaXMKKwktLSBwcmVzZW50IGFuZCBjb250YWlucyBmb3VyIGluc3RhbmNlcyBvZiBMQ1MtUHJpdmFjeUNsYXNzLiBJZiB0aGUgbWVudGlvbmVkIGNvbmRpdGlvbgorCS0tIGlzIG5vdCBzYXRpc2ZpZWQgdGhlIHJlY2VpdmluZyBub2RlIHNoYWxsIGRpc2NhcmQgYWRkLWxjcy1Qcml2YWN5RXhjZXB0aW9uTGlzdC4KKwktLSBJZiBhbiBMQ1MtUHJpdmFjeUNsYXNzIGlzIHJlY2VpdmVkIGJvdGggaW4gbGNzLVByaXZhY3lFeGNlcHRpb25MaXN0IGFuZCBpbgorCS0tIGFkZC1sY3MtUHJpdmFjeUV4Y2VwdGlvbkxpc3Qgd2l0aCB0aGUgc2FtZSBTUy1Db2RlLCB0aGVuIHRoZSBlcnJvciB1bmV4cGVjdGVkIAorCS0tIGRhdGEgdmFsdWUgc2hhbGwgYmUgcmV0dXJuZWQuCisKK0dNTEMtTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZHTUxDKSBPRgorCQkJCUlTRE4tQWRkcmVzc1N0cmluZworCS0tIGlmIHNlZ21lbnRhdGlvbiBpcyB1c2VkLCB0aGUgY29tcGxldGUgR01MQy1MaXN0IHNoYWxsIGJlIHNlbnQgaW4gb25lIHNlZ21lbnQKKworbWF4TnVtT2ZHTUxDICBJTlRFR0VSIDo6PSA1CisKK05ldHdvcmtBY2Nlc3NNb2RlIDo6PSBFTlVNRVJBVEVEIHsKKwlwYWNrZXRBbmRDaXJjdWl0CSgwKSwKKwlvbmx5Q2lyY3VpdAkJKDEpLAorCW9ubHlQYWNrZXQJCSgyKSwKKwkuLi59CisJLS0gaWYgdW5rbm93biB2YWx1ZXMgYXJlIHJlY2VpdmVkIGluIE5ldHdvcmtBY2Nlc3NNb2RlCisJLS0gdGhleSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK0dQUlNEYXRhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZQRFAtQ29udGV4dHMpIE9GCisJCQkJUERQLUNvbnRleHQKKworbWF4TnVtT2ZQRFAtQ29udGV4dHMgIElOVEVHRVIgOjo9IDUwCisKK1BEUC1Db250ZXh0IDo6PSBTRVFVRU5DRSB7CisJcGRwLUNvbnRleHRJZAlDb250ZXh0SWQsCisJcGRwLVR5cGUJCVsxNl0gUERQLVR5cGUsCisJcGRwLUFkZHJlc3MJWzE3XSBQRFAtQWRkcmVzcwlPUFRJT05BTCwKKwlxb3MtU3Vic2NyaWJlZAlbMThdIFFvUy1TdWJzY3JpYmVkLAorCXZwbG1uQWRkcmVzc0FsbG93ZWQJWzE5XSBOVUxMCU9QVElPTkFMLAorCWFwbgkJCVsyMF0gQVBOLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMjFdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCWV4dC1Rb1MtU3Vic2NyaWJlZAlbMF0gRXh0LVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMLCAKKwlwZHAtQ2hhcmdpbmdDaGFyYWN0ZXJpc3RpY3MJWzFdIENoYXJnaW5nQ2hhcmFjdGVyaXN0aWNzCU9QVElPTkFMLAorCWV4dDItUW9TLVN1YnNjcmliZWQJWzJdIEV4dDItUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwsCisJLS0gZXh0Mi1Rb1MtU3Vic2NyaWJlZCBtYXkgYmUgcHJlc2VudCBvbmx5IGlmIGV4dC1Rb1MtU3Vic2NyaWJlZCBpcyBwcmVzZW50LgorCWV4dDMtUW9TLVN1YnNjcmliZWQJWzNdIEV4dDMtUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwKKwktLSBleHQzLVFvUy1TdWJzY3JpYmVkIG1heSBiZSBwcmVzZW50IG9ubHkgaWYgZXh0Mi1Rb1MtU3Vic2NyaWJlZCBpcyBwcmVzZW50LgorCSB9CisKK0NvbnRleHRJZCA6Oj0gSU5URUdFUiAoMS4ubWF4TnVtT2ZQRFAtQ29udGV4dHMpCisKK0dQUlNTdWJzY3JpcHRpb25EYXRhIDo6PSBTRVFVRU5DRSB7CisJY29tcGxldGVEYXRhTGlzdEluY2x1ZGVkCU5VTEwJCQlPUFRJT05BTCwKKwkJLS0gSWYgc2VnbWVudGF0aW9uIGlzIHVzZWQsIGNvbXBsZXRlRGF0YUxpc3RJbmNsdWRlZCBtYXkgb25seSBiZSBwcmVzZW50IGluIHRoZQorCQktLSBmaXJzdCBzZWdtZW50IG9mIEdQUlNTdWJzY3JpcHRpb25EYXRhLgorCWdwcnNEYXRhTGlzdAlbMV0JR1BSU0RhdGFMaXN0LAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiB9CisKK1NHU04tQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbyA6Oj0gU0VRVUVOQ0UgeworCWdwcnMtQ1NJCQlbMF0JR1BSUy1DU0kJT1BUSU9OQUwsCisJbW8tc21zLUNTSQlbMV0JU01TLUNTSQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJbXQtc21zLUNTSQlbM10JU01TLUNTSQlPUFRJT05BTCwKKwltdC1zbXNDQU1FTFREUC1Dcml0ZXJpYUxpc3QJWzRdCU1ULXNtc0NBTUVMVERQLUNyaXRlcmlhTGlzdAlPUFRJT05BTCwKKwltZy1jc2kJCVs1XQlNRy1DU0kJT1BUSU9OQUwKKwl9CisKK0dQUlMtQ1NJIDo6PSBTRVFVRU5DRSB7CisJZ3Bycy1DYW1lbFREUERhdGFMaXN0CVswXSBHUFJTLUNhbWVsVERQRGF0YUxpc3QJT1BUSU9OQUwsCisJY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcJWzFdIENhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCW5vdGlmaWNhdGlvblRvQ1NFCVszXQlOVUxMCQlPUFRJT05BTCwKKwljc2ktQWN0aXZlCVs0XQlOVUxMCQlPUFRJT05BTCwKKwkuLi59CistLQlub3RpZmljYXRpb25Ub0NTRSBhbmQgY3NpLUFjdGl2ZSBzaGFsbCBub3QgYmUgcHJlc2VudCB3aGVuIEdQUlMtQ1NJIGlzIHNlbnQgdG8gU0dTTi4KKy0tCVRoZXkgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gQVRTSS9BVE0gYWNrL05TREMgbWVzc2FnZS4gCistLQlHUFJTLUNhbWVsVERQRGF0YSBhbmQgIGNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nIHNoYWxsIGJlIHByZXNlbnQgaW4gCistLQl0aGUgR1BSUy1DU0kgc2VxdWVuY2UuCistLQlJZiBHUFJTLUNTSSBpcyBzZWdtZW50ZWQsIGdwcnMtQ2FtZWxURFBEYXRhTGlzdCBhbmQgY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcgc2hhbGwgYmUgCistLQlwcmVzZW50IGluIHRoZSBmaXJzdCBzZWdtZW50CisKK0dQUlMtQ2FtZWxURFBEYXRhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZDYW1lbFREUERhdGEpIE9GCisJR1BSUy1DYW1lbFREUERhdGEKKy0tCUdQUlMtQ2FtZWxURFBEYXRhTGlzdCBzaGFsbCBub3QgY29udGFpbiBtb3JlIHRoYW4gb25lIGluc3RhbmNlIG9mCistLQlHUFJTLUNhbWVsVERQRGF0YSBjb250YWluaW5nIHRoZSBzYW1lIHZhbHVlIGZvciBncHJzLVRyaWdnZXJEZXRlY3Rpb25Qb2ludC4KKworR1BSUy1DYW1lbFREUERhdGEgOjo9IFNFUVVFTkNFIHsKKwlncHJzLVRyaWdnZXJEZXRlY3Rpb25Qb2ludAlbMF0gR1BSUy1UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQsCisJc2VydmljZUtleQlbMV0gU2VydmljZUtleSwKKwlnc21TQ0YtQWRkcmVzcwlbMl0gSVNETi1BZGRyZXNzU3RyaW5nLAorCWRlZmF1bHRTZXNzaW9uSGFuZGxpbmcJWzNdIERlZmF1bHRHUFJTLUhhbmRsaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLgorCX0KKworRGVmYXVsdEdQUlMtSGFuZGxpbmcgOjo9IEVOVU1FUkFURUQgeworCWNvbnRpbnVlVHJhbnNhY3Rpb24gKDApICwKKwlyZWxlYXNlVHJhbnNhY3Rpb24gKDEpICwKKwkuLi59CistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSByZWNlcHRpb24gb2YgdmFsdWVzIGluIHJhbmdlIDItMzEgc2hhbGwgYmUgdHJlYXRlZCBhcyAiY29udGludWVUcmFuc2FjdGlvbiIKKy0tIHJlY2VwdGlvbiBvZiB2YWx1ZXMgZ3JlYXRlciB0aGFuIDMxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgInJlbGVhc2VUcmFuc2FjdGlvbiIKKworR1BSUy1UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQgOjo9IEVOVU1FUkFURUQgeworCWF0dGFjaCAJCQkoMSksCisJYXR0YWNoQ2hhbmdlT2ZQb3NpdGlvbiAJCSgyKSwKKwlwZHAtQ29udGV4dEVzdGFibGlzaG1lbnQgCQkoMTEpLAorCXBkcC1Db250ZXh0RXN0YWJsaXNobWVudEFja25vd2xlZGdlbWVudAkoMTIpLAorCXBkcC1Db250ZXh0Q2hhbmdlT2ZQb3NpdGlvbiAJCSgxNCksCisJLi4uIH0KKy0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tIEZvciBHUFJTLUNhbWVsVERQRGF0YSBzZXF1ZW5jZXMgY29udGFpbmluZyB0aGlzIHBhcmFtZXRlciB3aXRoIGFueQorLS0gb3RoZXIgdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZSB0aGUgd2hvbGUgCistLSBHUFJTLUNhbWVsVERQRGF0YXNlcXVlbmNlLgorCitBUE4gOjo9ICBPQ1RFVCBTVFJJTkcgKFNJWkUgKDIuLjYzKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDIzLjAwMyBbMTddIAorCitQRFAtVHlwZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgyKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDI5LjA2MCBbMTA1XQorCitQRFAtQWRkcmVzcyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi4xNikpCisJLS0gT2N0ZXRzIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gVFMgM0dQUCBUUyAyOS4wNjAgWzEwNV0KKworCS0tIFRoZSBwb3NzaWJsZSBzaXplIHZhbHVlcyBhcmU6CisJLS0gMS03IG9jdGV0cyAgWC4yNSBhZGRyZXNzIHR5cGUKKwktLSAgNCAgb2N0ZXRzICBJUHY0IGFkZHJlc3MgdHlwZQorCS0tIDE2ICBvY3RldHMgIElwdjYgYWRkcmVzcyB0eXBlCisKK1FvUy1TdWJzY3JpYmVkIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDMpKQorCS0tIE9jdGV0cyBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIFRTIDNHUFAgVFMgMjQuMDA4IFszNV0gUXVhbGl0eSBvZiBTZXJ2aWNlIE9jdGV0cyAKKwktLSAzLTUuCisKK0V4dC1Rb1MtU3Vic2NyaWJlZCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi45KSkKKwktLSBPQ1RFVCAxOiAKKwktLSAgQWxsb2NhdGlvbi9SZXRlbnRpb24gUHJpb3JpdHkgKFRoaXMgb2N0ZXQgZW5jb2RlcyBlYWNoIHByaW9yaXR5IGxldmVsIGRlZmluZWQgaW4KKwktLSAgICAgMjMuMTA3IGFzIHRoZSBiaW5hcnkgdmFsdWUgb2YgdGhlIHByaW9yaXR5IGxldmVsLCBkZWNsYXJhdGlvbiBpbiAyOS4wNjApCisJLS0gT2N0ZXRzIDItOSBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjQuMDA4IFszNV0gUXVhbGl0eSBvZiBTZXJ2aWNlIE9jdGV0cyAKKwktLSA2LTEzLgorCitFeHQyLVFvUy1TdWJzY3JpYmVkIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjMpKQorCS0tIE9jdGV0cyAxLTMgYXJlIGNvZGVkIGFjY29yZGluZyB0byAzR1BQIFRTIDI0LjAwOCBbMzVdIFF1YWxpdHkgb2YgU2VydmljZSBPY3RldHMgMTQtMTYuCisJLS0gSWYgUXVhbGl0eSBvZiBTZXJ2aWNlIGluZm9ybWF0aW9uIGlzIHN0cnVjdHVyZWQgd2l0aCAxNCBvY3RldCBsZW5ndGgsIHRoZW4KKwktLSBPY3RldCAxIGlzIGNvZGVkIGFjY29yZGluZyB0byAzR1BQIFRTIDI0LjAwOCBbMzVdIFF1YWxpdHkgb2YgU2VydmljZSBPY3RldCAxNC4KKworRXh0My1Rb1MtU3Vic2NyaWJlZCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi4yKSkKKwktLSBPY3RldHMgMS0yIGFyZSBjb2RlZCBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyNC4wMDggWzM1XSBRdWFsaXR5IG9mIFNlcnZpY2UgT2N0ZXRzIDE3LTE4LgorCitDaGFyZ2luZ0NoYXJhY3RlcmlzdGljcyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgyKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0byAzR1BQIFRTIDMyLjIxNS4KKworTFNBT25seUFjY2Vzc0luZGljYXRvciA6Oj0gRU5VTUVSQVRFRCB7CisJYWNjZXNzT3V0c2lkZUxTQXNBbGxvd2VkICAoMCksCisJYWNjZXNzT3V0c2lkZUxTQXNSZXN0cmljdGVkICgxKX0KKworTFNBRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mTFNBcykgT0YKKwkJCQlMU0FEYXRhCisKK21heE51bU9mTFNBcyAgSU5URUdFUiA6Oj0gMjAKKworTFNBRGF0YSA6Oj0gU0VRVUVOQ0UgeworCWxzYUlkZW50aXR5CVswXSBMU0FJZGVudGl0eSwKKwlsc2FBdHRyaWJ1dGVzCVsxXSBMU0FBdHRyaWJ1dGVzLAorCWxzYUFjdGl2ZU1vZGVJbmRpY2F0b3IJWzJdIE5VTEwJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTFNBSW5mb3JtYXRpb24gOjo9IFNFUVVFTkNFIHsKKwljb21wbGV0ZURhdGFMaXN0SW5jbHVkZWQJTlVMTAkJCU9QVElPTkFMLAorCisJCS0tIElmIHNlZ21lbnRhdGlvbiBpcyB1c2VkLCBjb21wbGV0ZURhdGFMaXN0SW5jbHVkZWQgbWF5IG9ubHkgYmUgcHJlc2VudCBpbiB0aGUKKwkJLS0gZmlyc3Qgc2VnbWVudC4KKwlsc2FPbmx5QWNjZXNzSW5kaWNhdG9yCVsxXQlMU0FPbmx5QWNjZXNzSW5kaWNhdG9yCU9QVElPTkFMLAorCWxzYURhdGFMaXN0CVsyXQlMU0FEYXRhTGlzdAlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0xTQUlkZW50aXR5IDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDMpKQorCS0tIE9jdGV0cyBhcmUgY29kZWQgYWNjb3JkaW5nIHRvIFRTIDNHUFAgVFMgMjMuMDAzIFsxN10KKworTFNBQXR0cmlidXRlcyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBPY3RldHMgYXJlIGNvZGVkIGFjY29yZGluZyB0byBUUyAzR1BQIFRTIDQ4LjAwOCBbNDldCisKK1N1YnNjcmliZXJEYXRhIDo6PSBTRVFVRU5DRSB7CisJbXNpc2RuCQlbMV0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWNhdGVnb3J5CQlbMl0gQ2F0ZWdvcnkJT1BUSU9OQUwsCisJc3Vic2NyaWJlclN0YXR1cwlbM10gU3Vic2NyaWJlclN0YXR1cwlPUFRJT05BTCwKKwliZWFyZXJTZXJ2aWNlTGlzdAlbNF0gQmVhcmVyU2VydmljZUxpc3QJT1BUSU9OQUwsCisJLS0gVGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBmb3IgcmVjZXB0aW9uIG9mIHVuc3VwcG9ydGVkIC8gbm90IGFsbG9jYXRlZAorCS0tIGJlYXJlclNlcnZpY2VDb2RlcyBpcyBkZWZpbmVkIGluIHNlY3Rpb24gOC44LjEKKwl0ZWxlc2VydmljZUxpc3QJWzZdIFRlbGVzZXJ2aWNlTGlzdAlPUFRJT05BTCwKKwktLSBUaGUgZXhjZXB0aW9uIGhhbmRsaW5nIGZvciByZWNlcHRpb24gb2YgdW5zdXBwb3J0ZWQgLyBub3QgYWxsb2NhdGVkCisJLS0gdGVsZXNlcnZpY2VDb2RlcyBpcyBkZWZpbmVkIGluIHNlY3Rpb24gOC44LjEKKwlwcm92aXNpb25lZFNTCVs3XSBFeHQtU1MtSW5mb0xpc3QJT1BUSU9OQUwsCisJb2RiLURhdGEJCVs4XSBPREItRGF0YQlPUFRJT05BTCwKKwlyb2FtaW5nUmVzdHJpY3Rpb25EdWVUb1Vuc3VwcG9ydGVkRmVhdHVyZSAgWzldIE5VTEwJT1BUSU9OQUwsCisJcmVnaW9uYWxTdWJzY3JpcHRpb25EYXRhCVsxMF0gWm9uZUNvZGVMaXN0CU9QVElPTkFMLAorCXZic1N1YnNjcmlwdGlvbkRhdGEJWzExXSBWQlNEYXRhTGlzdAlPUFRJT05BTCwKKwl2Z2NzU3Vic2NyaXB0aW9uRGF0YQlbMTJdIFZHQ1NEYXRhTGlzdAlPUFRJT05BTCwKKwl2bHJDYW1lbFN1YnNjcmlwdGlvbkluZm8JWzEzXSBWbHJDYW1lbFN1YnNjcmlwdGlvbkluZm8JT1BUSU9OQUwKKwl9CisKK0NhdGVnb3J5IDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiBJVFUtVCBSZWMgUS43NjMuCisKK1N1YnNjcmliZXJTdGF0dXMgOjo9IEVOVU1FUkFURUQgeworCXNlcnZpY2VHcmFudGVkICAoMCksCisJb3BlcmF0b3JEZXRlcm1pbmVkQmFycmluZyAgKDEpfQorCitCZWFyZXJTZXJ2aWNlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZCZWFyZXJTZXJ2aWNlcykgT0YKKwkJCQlFeHQtQmVhcmVyU2VydmljZUNvZGUKKworbWF4TnVtT2ZCZWFyZXJTZXJ2aWNlcyAgSU5URUdFUiA6Oj0gNTAKKworVGVsZXNlcnZpY2VMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlRlbGVzZXJ2aWNlcykgT0YKKwkJCQlFeHQtVGVsZXNlcnZpY2VDb2RlCisKK21heE51bU9mVGVsZXNlcnZpY2VzICBJTlRFR0VSIDo6PSAyMAorCitPREItRGF0YSA6Oj0gU0VRVUVOQ0UgeworCW9kYi1HZW5lcmFsRGF0YQlPREItR2VuZXJhbERhdGEsCisJb2RiLUhQTE1OLURhdGEJT0RCLUhQTE1OLURhdGEJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK09EQi1HZW5lcmFsRGF0YSA6Oj0gQklUIFNUUklORyB7CisJYWxsT0ctQ2FsbHNCYXJyZWQgICgwKSwKKwlpbnRlcm5hdGlvbmFsT0dDYWxsc0JhcnJlZCAgKDEpLAorCWludGVybmF0aW9uYWxPR0NhbGxzTm90VG9IUExNTi1Db3VudHJ5QmFycmVkICAoMiksCisJaW50ZXJ6b25hbE9HQ2FsbHNCYXJyZWQgKDYpLAorCWludGVyem9uYWxPR0NhbGxzTm90VG9IUExNTi1Db3VudHJ5QmFycmVkICg3KSwKKwlpbnRlcnpvbmFsT0dDYWxsc0FuZEludGVybmF0aW9uYWxPR0NhbGxzTm90VG9IUExNTi1Db3VudHJ5QmFycmVkICg4KSwKKwlwcmVtaXVtUmF0ZUluZm9ybWF0aW9uT0dDYWxsc0JhcnJlZCAgKDMpLAorCXByZW1pdW1SYXRlRW50ZXJ0YWluZW1lbnRPR0NhbGxzQmFycmVkICAoNCksCisJc3MtQWNjZXNzQmFycmVkICAoNSksCisJYWxsRUNULUJhcnJlZCAoOSksCisJY2hhcmdlYWJsZUVDVC1CYXJyZWQgKDEwKSwKKwlpbnRlcm5hdGlvbmFsRUNULUJhcnJlZCAoMTEpLAorCWludGVyem9uYWxFQ1QtQmFycmVkICgxMiksCisJZG91Ymx5Q2hhcmdlYWJsZUVDVC1CYXJyZWQgKDEzKSwKKwltdWx0aXBsZUVDVC1CYXJyZWQgKDE0KSwKKwlhbGxQYWNrZXRPcmllbnRlZFNlcnZpY2VzQmFycmVkICgxNSksCisJcm9hbWVyQWNjZXNzVG9IUExNTi1BUC1CYXJyZWQgICgxNiksCisJcm9hbWVyQWNjZXNzVG9WUExNTi1BUC1CYXJyZWQgICgxNyksCisJcm9hbWluZ091dHNpZGVQTE1OT0ctQ2FsbHNCYXJyZWQgICgxOCksCisJYWxsSUMtQ2FsbHNCYXJyZWQgICgxOSksCisJcm9hbWluZ091dHNpZGVQTE1OSUMtQ2FsbHNCYXJyZWQgICgyMCksCisJcm9hbWluZ091dHNpZGVQTE1OSUNvdW50cnlJQy1DYWxsc0JhcnJlZCAgKDIxKSwKKwlyb2FtaW5nT3V0c2lkZVBMTU4tQmFycmVkICAoMjIpLAorCXJvYW1pbmdPdXRzaWRlUExNTi1Db3VudHJ5QmFycmVkICAoMjMpLAorCXJlZ2lzdHJhdGlvbkFsbENGLUJhcnJlZCAgKDI0KSwKKwlyZWdpc3RyYXRpb25DRk5vdFRvSFBMTU4tQmFycmVkICAoMjUpLAorCXJlZ2lzdHJhdGlvbkludGVyem9uYWxDRi1CYXJyZWQgICgyNiksCisJcmVnaXN0cmF0aW9uSW50ZXJ6b25hbENGTm90VG9IUExNTi1CYXJyZWQgICgyNyksCisJcmVnaXN0cmF0aW9uSW50ZXJuYXRpb25hbENGLUJhcnJlZCAgKDI4KX0gKFNJWkUgKDE1Li4zMikpCisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOiByZWNlcHRpb24gb2YgdW5rbm93biBiaXQgYXNzaWdubWVudHMgaW4gdGhlCisJLS0gT0RCLUdlbmVyYWxEYXRhIHR5cGUgc2hhbGwgYmUgdHJlYXRlZCBsaWtlIHVuc3VwcG9ydGVkIE9EQi1HZW5lcmFsRGF0YQorCS0tIFdoZW4gdGhlIE9EQi1HZW5lcmFsRGF0YSB0eXBlIGlzIHJlbW92ZWQgZnJvbSB0aGUgSExSIGZvciBhIGdpdmVuIHN1YnNjcmliZXIsIAorCS0tIGluIE5vdGVTdWJzY3JpYmVyRGF0YU1vZGlmaWVkIG9wZXJhdGlvbiBzZW50IHRvd2FyZCB0aGUgZ3NtU0NGIAorCS0tIGFsbCBiaXRzIHNoYWxsIGJlIHNldCB0byAiTyIuCisKK09EQi1IUExNTi1EYXRhIDo6PSBCSVQgU1RSSU5HIHsKKwlwbG1uLVNwZWNpZmljQmFycmluZ1R5cGUxICAoMCksCisJcGxtbi1TcGVjaWZpY0JhcnJpbmdUeXBlMiAgKDEpLAorCXBsbW4tU3BlY2lmaWNCYXJyaW5nVHlwZTMgICgyKSwKKwlwbG1uLVNwZWNpZmljQmFycmluZ1R5cGU0ICAoMyl9IChTSVpFICg0Li4zMikpCisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOiByZWNlcHRpb24gb2YgdW5rbm93biBiaXQgYXNzaWdubWVudHMgaW4gdGhlCisJLS0gT0RCLUhQTE1OLURhdGEgdHlwZSBzaGFsbCBiZSB0cmVhdGVkIGxpa2UgdW5zdXBwb3J0ZWQgT0RCLUhQTE1OLURhdGEgCisJLS0gV2hlbiB0aGUgT0RCLUhQTE1OLURhdGEgdHlwZSBpcyByZW1vdmVkIGZyb20gdGhlIEhMUiBmb3IgYSBnaXZlbiBzdWJzY3JpYmVyLCAKKwktLSBpbiBOb3RlU3Vic2NyaWJlckRhdGFNb2RpZmllZCBvcGVyYXRpb24gc2VudCB0b3dhcmQgdGhlIGdzbVNDRgorCS0tIGFsbCBiaXRzIHNoYWxsIGJlIHNldCB0byAiTyIuCisKK0V4dC1TUy1JbmZvTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZTUykgT0YKKwkJCQlFeHQtU1MtSW5mbworCitFeHQtU1MtSW5mbyA6Oj0gQ0hPSUNFIHsKKwlmb3J3YXJkaW5nSW5mbwlbMF0gRXh0LUZvcndJbmZvLAorCWNhbGxCYXJyaW5nSW5mbwlbMV0gRXh0LUNhbGxCYXJJbmZvLAorCWN1Zy1JbmZvCQlbMl0gQ1VHLUluZm8sCisJc3MtRGF0YQkJWzNdIEV4dC1TUy1EYXRhLAorCWVtbHBwLUluZm8JWzRdIEVNTFBQLUluZm99CisKK0V4dC1Gb3J3SW5mbyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVNTLUNvZGUsCisJZm9yd2FyZGluZ0ZlYXR1cmVMaXN0CUV4dC1Gb3J3RmVhdHVyZUxpc3QsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitFeHQtRm9yd0ZlYXR1cmVMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkV4dC1CYXNpY1NlcnZpY2VHcm91cHMpIE9GCisJCQkJRXh0LUZvcndGZWF0dXJlCisKK0V4dC1Gb3J3RmVhdHVyZSA6Oj0gU0VRVUVOQ0UgeworCWJhc2ljU2VydmljZQlFeHQtQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKKwlzcy1TdGF0dXMJCVs0XSBFeHQtU1MtU3RhdHVzLAorCWZvcndhcmRlZFRvTnVtYmVyCVs1XSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJLS0gV2hlbiB0aGlzIGRhdGEgdHlwZSBpcyBzZW50IGZyb20gYW4gSExSIHdoaWNoIHN1cHBvcnRzIENBTUVMIFBoYXNlIDIKKwktLSB0byBhIFZMUiB0aGF0IHN1cHBvcnRzIENBTUVMIFBoYXNlIDIgdGhlIFZMUiBzaGFsbCBub3QgY2hlY2sgdGhlCisJLS0gZm9ybWF0IG9mIHRoZSBudW1iZXIKKwlmb3J3YXJkZWRUb1N1YmFkZHJlc3MJWzhdIElTRE4tU3ViYWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlmb3J3YXJkaW5nT3B0aW9ucwlbNl0gRXh0LUZvcndPcHRpb25zCU9QVElPTkFMLAorCW5vUmVwbHlDb25kaXRpb25UaW1lCVs3XSBFeHQtTm9SZXBDb25kVGltZQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzldIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJbG9uZ0ZvcndhcmRlZFRvTnVtYmVyCVsxMF0gRlROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwgfQorCitFeHQtRm9yd09wdGlvbnMgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uNSkpCisKKwktLSBPQ1RFVCAxOgorCisJLS0gIGJpdCA4OiBub3RpZmljYXRpb24gdG8gZm9yd2FyZGluZyBwYXJ0eQorCS0tCTAgIG5vIG5vdGlmaWNhdGlvbgorCS0tCTEgIG5vdGlmaWNhdGlvbgorCisJLS0gIGJpdCA3OiByZWRpcmVjdGluZyBwcmVzZW50YXRpb24KKwktLQkwIG5vIHByZXNlbnRhdGlvbiAgCisJLS0JMSAgcHJlc2VudGF0aW9uCisKKwktLSAgYml0IDY6IG5vdGlmaWNhdGlvbiB0byBjYWxsaW5nIHBhcnR5CisJLS0JMCAgbm8gbm90aWZpY2F0aW9uCisJLS0JMSAgbm90aWZpY2F0aW9uCisKKwktLSAgYml0IDU6IDAgKHVudXNlZCkKKworCS0tICBiaXRzIDQzOiBmb3J3YXJkaW5nIHJlYXNvbgorCS0tCTAwICBtcyBub3QgcmVhY2hhYmxlCisJLS0JMDEgIG1zIGJ1c3kKKwktLQkxMCAgbm8gcmVwbHkKKwktLQkxMSAgdW5jb25kaXRpb25hbAorCisJLS0gYml0cyAyMTogMDAgKHVudXNlZCkKKworCS0tIE9DVEVUUyAyLTU6IHJlc2VydmVkIGZvciBmdXR1cmUgdXNlLiBUaGV5IHNoYWxsIGJlIGRpc2NhcmRlZCBpZgorCS0tIHJlY2VpdmVkIGFuZCBub3QgdW5kZXJzdG9vZC4KKworRXh0LU5vUmVwQ29uZFRpbWUgOjo9IElOVEVHRVIgKDEuLjEwMCkKKwktLSBPbmx5IHZhbHVlcyA1LTMwIGFyZSB1c2VkLgorCS0tIFZhbHVlcyBpbiB0aGUgcmFuZ2VzIDEtNCBhbmQgMzEtMTAwIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZQorCS0tIElmIHJlY2VpdmVkOgorCS0tCQl2YWx1ZXMgMS00IHNoYWxsIGJlIG1hcHBlZCBvbiB0byB2YWx1ZSA1CisJLS0JCXZhbHVlcyAzMS0xMDAgc2hhbGwgYmUgbWFwcGVkIG9uIHRvIHZhbHVlIDMwCisKK0V4dC1DYWxsQmFySW5mbyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVNTLUNvZGUsCisJY2FsbEJhcnJpbmdGZWF0dXJlTGlzdAlFeHQtQ2FsbEJhckZlYXR1cmVMaXN0LAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitFeHQtQ2FsbEJhckZlYXR1cmVMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkV4dC1CYXNpY1NlcnZpY2VHcm91cHMpIE9GCisJCQkJRXh0LUNhbGxCYXJyaW5nRmVhdHVyZQorCitFeHQtQ2FsbEJhcnJpbmdGZWF0dXJlIDo6PSBTRVFVRU5DRSB7CisJYmFzaWNTZXJ2aWNlCUV4dC1CYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAorCXNzLVN0YXR1cwkJWzRdIEV4dC1TUy1TdGF0dXMsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0NVRy1JbmZvIDo6PSBTRVFVRU5DRSB7CisJY3VnLVN1YnNjcmlwdGlvbkxpc3QJQ1VHLVN1YnNjcmlwdGlvbkxpc3QsCisJY3VnLUZlYXR1cmVMaXN0CUNVRy1GZWF0dXJlTGlzdAlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzBdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0NVRy1TdWJzY3JpcHRpb25MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgwLi5tYXhOdW1PZkNVRykgT0YKKwkJCQlDVUctU3Vic2NyaXB0aW9uCisKK0NVRy1TdWJzY3JpcHRpb24gOjo9IFNFUVVFTkNFIHsKKwljdWctSW5kZXgJQ1VHLUluZGV4LAorCWN1Zy1JbnRlcmxvY2sJQ1VHLUludGVybG9jaywKKwlpbnRyYUNVRy1PcHRpb25zCUludHJhQ1VHLU9wdGlvbnMsCisJYmFzaWNTZXJ2aWNlR3JvdXBMaXN0CUV4dC1CYXNpY1NlcnZpY2VHcm91cExpc3QJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitDVUctSW5kZXggOjo9IElOVEVHRVIgKDAuLjMyNzY3KQorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBpbiBFVFMgMzAwIDEzOC4KKworQ1VHLUludGVybG9jayA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg0KSkKKworSW50cmFDVUctT3B0aW9ucyA6Oj0gRU5VTUVSQVRFRCB7CisJbm9DVUctUmVzdHJpY3Rpb25zICAoMCksCisJY3VnSUMtQ2FsbEJhcnJlZCAgKDEpLAorCWN1Z09HLUNhbGxCYXJyZWQgICgyKX0KKworbWF4TnVtT2ZDVUcgIElOVEVHRVIgOjo9IDEwCisKK0NVRy1GZWF0dXJlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZFeHQtQmFzaWNTZXJ2aWNlR3JvdXBzKSBPRgorCQkJCUNVRy1GZWF0dXJlCisKK0V4dC1CYXNpY1NlcnZpY2VHcm91cExpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mRXh0LUJhc2ljU2VydmljZUdyb3VwcykgT0YKKwkJCQlFeHQtQmFzaWNTZXJ2aWNlQ29kZQorCittYXhOdW1PZkV4dC1CYXNpY1NlcnZpY2VHcm91cHMgIElOVEVHRVIgOjo9IDMyCisKK0NVRy1GZWF0dXJlIDo6PSBTRVFVRU5DRSB7CisJYmFzaWNTZXJ2aWNlCUV4dC1CYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAorCXByZWZlcmVudGlhbENVRy1JbmRpY2F0b3IJQ1VHLUluZGV4CU9QVElPTkFMLAorCWludGVyQ1VHLVJlc3RyaWN0aW9ucwlJbnRlckNVRy1SZXN0cmljdGlvbnMsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0ludGVyQ1VHLVJlc3RyaWN0aW9ucyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKworCS0tIGJpdHMgODc2NTQzOiAwMDAwMDAgKHVudXNlZCkKKwktLSBFeGNlcHRpb24gaGFuZGxpbmc6CisJLS0gYml0cyA4NzY1NDMgc2hhbGwgYmUgaWdub3JlZCBpZiByZWNlaXZlZCBhbmQgbm90IHVuZGVyc3Rvb2QKKworCS0tIGJpdHMgMjEKKwktLQkwMCAgQ1VHIG9ubHkgZmFjaWxpdGllcworCS0tCTAxICBDVUcgd2l0aCBvdXRnb2luZyBhY2Nlc3MKKwktLQkxMCAgQ1VHIHdpdGggaW5jb21pbmcgYWNjZXNzCisJLS0JMTEgIENVRyB3aXRoIGJvdGggb3V0Z29pbmcgYW5kIGluY29taW5nIGFjY2VzcworCitFeHQtU1MtRGF0YSA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVNTLUNvZGUsCisJc3MtU3RhdHVzCVs0XSBFeHQtU1MtU3RhdHVzLAorCXNzLVN1YnNjcmlwdGlvbk9wdGlvbglTUy1TdWJzY3JpcHRpb25PcHRpb24JT1BUSU9OQUwsCisJYmFzaWNTZXJ2aWNlR3JvdXBMaXN0CUV4dC1CYXNpY1NlcnZpY2VHcm91cExpc3QJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs1XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitMQ1MtUHJpdmFjeUV4Y2VwdGlvbkxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mUHJpdmFjeUNsYXNzKSBPRgorCQkJCUxDUy1Qcml2YWN5Q2xhc3MKKworbWF4TnVtT2ZQcml2YWN5Q2xhc3MgIElOVEVHRVIgOjo9IDQKKworTENTLVByaXZhY3lDbGFzcyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVNTLUNvZGUsCisJc3MtU3RhdHVzCQlFeHQtU1MtU3RhdHVzLAorCW5vdGlmaWNhdGlvblRvTVNVc2VyCVswXSBOb3RpZmljYXRpb25Ub01TVXNlcglPUFRJT05BTCwKKwktLSBub3RpZmljYXRpb25Ub01TVXNlciBtYXkgYmUgc2VudCBvbmx5IGZvciBTUy1jb2RlcyBjYWxsU2Vzc2lvblJlbGF0ZWQKKwktLSBhbmQgY2FsbFNlc3Npb25VbnJlbGF0ZWQuIElmIG5vdCByZWNlaXZlZCBmb3IgU1MtY29kZXMgY2FsbFNlc3Npb25SZWxhdGVkCisJLS0gYW5kIGNhbGxTZXNzaW9uVW5yZWxhdGVkLAorCS0tIHRoZSBkZWZhdWx0IHZhbHVlcyBhY2NvcmRpbmcgdG8gM0dQUCBUUyAyMy4yNzEgc2hhbGwgYmUgYXNzdW1lZC4KKwlleHRlcm5hbENsaWVudExpc3QJWzFdIEV4dGVybmFsQ2xpZW50TGlzdAlPUFRJT05BTCwKKwktLSBleHRlcm5hbENsaWVudExpc3QgbWF5IGJlIHNlbnQgb25seSBmb3IgU1MtY29kZSBjYWxsU2Vzc2lvblVucmVsYXRlZCB0byBhCisJLS0gdmlzaXRlZCBub2RlIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBMQ1MgUmVsZWFzZSA0IG9yIGxhdGVyIHZlcnNpb25zLgorCS0tIGV4dGVybmFsQ2xpZW50TGlzdCBtYXkgYmUgc2VudCBvbmx5IGZvciBTUy1jb2RlcyBjYWxsU2Vzc2lvblVucmVsYXRlZCBhbmQKKwktLSBjYWxsU2Vzc2lvblJlbGF0ZWQgdG8gYSB2aXNpdGVkIG5vZGUgdGhhdCBzdXBwb3J0cyBMQ1MgUmVsZWFzZSA0IG9yIGxhdGVyIHZlcnNpb25zLgorCXBsbW5DbGllbnRMaXN0CVsyXSBQTE1OQ2xpZW50TGlzdAlPUFRJT05BTCwKKwktLSBwbG1uQ2xpZW50TGlzdCBtYXkgYmUgc2VudCBvbmx5IGZvciBTUy1jb2RlIHBsbW5vcGVyYXRvci4KKwlleHRlbnNpb25Db250YWluZXIJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJZXh0LWV4dGVybmFsQ2xpZW50TGlzdAlbNF0gRXh0LUV4dGVybmFsQ2xpZW50TGlzdAlPUFRJT05BTCwKKwktLSBFeHQtZXh0ZXJuYWxDbGllbnRMaXN0IG1heSBiZSBzZW50IG9ubHkgaWYgdGhlIHZpc2l0ZWQgbm9kZSBzdXBwb3J0cyBMQ1MgUmVsZWFzZSA0IG9yCisJLS0gbGF0ZXIgdmVyc2lvbnMsIHRoZSB1c2VyIGRpZCBzcGVjaWZ5IG1vcmUgdGhhbiA1IGNsaWVudHMsIGFuZCBXaGl0ZSBCb29rIFNDQ1AgaXMgdXNlZC4KKwlzZXJ2aWNlVHlwZUxpc3QJWzVdCVNlcnZpY2VUeXBlTGlzdAlPUFRJT05BTAorCS0tIHNlcnZpY2VUeXBlTGlzdCBtYXkgYmUgc2VudCBvbmx5IGZvciBTUy1jb2RlIHNlcnZpY2VUeXBlIGFuZCBpZiB0aGUgdmlzaXRlZCBub2RlCisJLS0gc3VwcG9ydHMgTENTIFJlbGVhc2UgNSBvciBsYXRlciB2ZXJzaW9ucy4KKwktLSAKKwktLSBpZiBzZWdtZW50YXRpb24gaXMgdXNlZCwgdGhlIGNvbXBsZXRlIExDUy1Qcml2YWN5Q2xhc3Mgc2hhbGwgYmUgc2VudCBpbiBvbmUgc2VnbWVudAorfQorCitFeHRlcm5hbENsaWVudExpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDAuLm1heE51bU9mRXh0ZXJuYWxDbGllbnQpIE9GCisJCQkJRXh0ZXJuYWxDbGllbnQKKworbWF4TnVtT2ZFeHRlcm5hbENsaWVudCAgSU5URUdFUiA6Oj0gNQorCitQTE1OQ2xpZW50TGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZQTE1OQ2xpZW50KSBPRgorCQkJCUxDU0NsaWVudEludGVybmFsSUQKKworbWF4TnVtT2ZQTE1OQ2xpZW50ICBJTlRFR0VSIDo6PSA1CisKK0V4dC1FeHRlcm5hbENsaWVudExpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mRXh0LUV4dGVybmFsQ2xpZW50KSBPRgorCQkJCUV4dGVybmFsQ2xpZW50CisKK21heE51bU9mRXh0LUV4dGVybmFsQ2xpZW50ICBJTlRFR0VSIDo6PSAzNQorCitFeHRlcm5hbENsaWVudCA6Oj0gU0VRVUVOQ0UgeworCWNsaWVudElkZW50aXR5CUxDU0NsaWVudEV4dGVybmFsSUQsCisJZ21sYy1SZXN0cmljdGlvbglbMF0gR01MQy1SZXN0cmljdGlvbglPUFRJT05BTCwKKwlub3RpZmljYXRpb25Ub01TVXNlcglbMV0gTm90aWZpY2F0aW9uVG9NU1VzZXIJT1BUSU9OQUwsCisJLS0gSWYgbm90aWZpY2F0aW9uVG9NU1VzZXIgaXMgbm90IHJlY2VpdmVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBhY2NvcmRpbmcgdG8gCisJLS0gM0dQUCBUUyAyMy4yNzEgc2hhbGwgYmUgYXNzdW1lZC4KKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitHTUxDLVJlc3RyaWN0aW9uIDo6PSBFTlVNRVJBVEVEIHsKKwlnbWxjLUxpc3QJCSgwKSwKKwlob21lLUNvdW50cnkJKDEpICwKKwkuLi4gfQorLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0gQXQgcmVjZXB0aW9uIG9mIGFueSBvdGhlciB2YWx1ZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCB0aGUgcmVjZWl2ZXIgc2hhbGwgaWdub3JlCistLSBHTUxDLVJlc3RyaWN0aW9uLgorCitOb3RpZmljYXRpb25Ub01TVXNlciA6Oj0gRU5VTUVSQVRFRCB7CisJbm90aWZ5TG9jYXRpb25BbGxvd2VkCSgwKSwKKwlub3RpZnlBbmRWZXJpZnktTG9jYXRpb25BbGxvd2VkSWZOb1Jlc3BvbnNlCSgxKSwKKwlub3RpZnlBbmRWZXJpZnktTG9jYXRpb25Ob3RBbGxvd2VkSWZOb1Jlc3BvbnNlCSgyKSwKKwkuLi4sCisJbG9jYXRpb25Ob3RBbGxvd2VkICgzKSB9CistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSBBdCByZWNlcHRpb24gb2YgYW55IG90aGVyIHZhbHVlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUKKy0tIE5vdGlmaWNhdGlvblRvTVNVc2VyLgorCitTZXJ2aWNlVHlwZUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mU2VydmljZVR5cGUpIE9GCisJCQkJU2VydmljZVR5cGUKKworbWF4TnVtT2ZTZXJ2aWNlVHlwZSAgSU5URUdFUiA6Oj0gMzIKKworU2VydmljZVR5cGUgOjo9IFNFUVVFTkNFIHsKKwlzZXJ2aWNlVHlwZUlkZW50aXR5CUxDU1NlcnZpY2VUeXBlSUQsCisJZ21sYy1SZXN0cmljdGlvbglbMF0gR01MQy1SZXN0cmljdGlvbglPUFRJT05BTCwKKwlub3RpZmljYXRpb25Ub01TVXNlcglbMV0gTm90aWZpY2F0aW9uVG9NU1VzZXIJT1BUSU9OQUwsCisJLS0gSWYgbm90aWZpY2F0aW9uVG9NU1VzZXIgaXMgbm90IHJlY2VpdmVkLCB0aGUgZGVmYXVsdCB2YWx1ZSBhY2NvcmRpbmcgdG8gCisJLS0gM0dQUCBUUyAyMy4yNzEgc2hhbGwgYmUgYXNzdW1lZC4KKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gfQorCitNT0xSLUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mTU9MUi1DbGFzcykgT0YKKwkJCQlNT0xSLUNsYXNzCisKK21heE51bU9mTU9MUi1DbGFzcyAgSU5URUdFUiA6Oj0gMworCitNT0xSLUNsYXNzIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJU1MtQ29kZSwKKwlzcy1TdGF0dXMJCUV4dC1TUy1TdGF0dXMsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitab25lQ29kZUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mWm9uZUNvZGVzKQorCQkJCU9GIFpvbmVDb2RlCisKK1pvbmVDb2RlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDIpKQorCS0tIGludGVybmFsIHN0cnVjdHVyZSBpcyBkZWZpbmVkIGluIFRTIDNHUFAgVFMgMjMuMDAzIFsxN10KKworbWF4TnVtT2Zab25lQ29kZXMgIElOVEVHRVIgOjo9IDEwCisKK0luc2VydFN1YnNjcmliZXJEYXRhUmVzIDo6PSBTRVFVRU5DRSB7CisJdGVsZXNlcnZpY2VMaXN0CVsxXSBUZWxlc2VydmljZUxpc3QJT1BUSU9OQUwsCisJYmVhcmVyU2VydmljZUxpc3QJWzJdIEJlYXJlclNlcnZpY2VMaXN0CU9QVElPTkFMLAorCXNzLUxpc3QJCVszXSBTUy1MaXN0CU9QVElPTkFMLAorCW9kYi1HZW5lcmFsRGF0YQlbNF0gT0RCLUdlbmVyYWxEYXRhCU9QVElPTkFMLAorCXJlZ2lvbmFsU3Vic2NyaXB0aW9uUmVzcG9uc2UJWzVdIFJlZ2lvbmFsU3Vic2NyaXB0aW9uUmVzcG9uc2UJT1BUSU9OQUwsCisJc3VwcG9ydGVkQ2FtZWxQaGFzZXMJWzZdIFN1cHBvcnRlZENhbWVsUGhhc2VzCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbN10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJb2ZmZXJlZENhbWVsNENTSXMJWzhdIE9mZmVyZWRDYW1lbDRDU0lzCU9QVElPTkFMLAorCXN1cHBvcnRlZEZlYXR1cmVzCVs5XSBTdXBwb3J0ZWRGZWF0dXJlcwlPUFRJT05BTCB9CisKK1JlZ2lvbmFsU3Vic2NyaXB0aW9uUmVzcG9uc2UgOjo9IEVOVU1FUkFURUQgeworCW5ldHdvcmtOb2RlLUFyZWFSZXN0cmljdGVkCSgwKSwKKwl0b29NYW55Wm9uZUNvZGVzCSgxKSwKKwl6b25lQ29kZXNDb25mbGljdAkoMiksCisJcmVnaW9uYWxTdWJzY05vdFN1cHBvcnRlZAkoMyl9CisKK0RlbGV0ZVN1YnNjcmliZXJEYXRhQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCVswXSBJTVNJLAorCWJhc2ljU2VydmljZUxpc3QJWzFdIEJhc2ljU2VydmljZUxpc3QJT1BUSU9OQUwsCisJLS0gVGhlIGV4Y2VwdGlvbiBoYW5kbGluZyBmb3IgcmVjZXB0aW9uIG9mIHVuc3VwcG9ydGVkL25vdCBhbGxvY2F0ZWQKKwktLSBiYXNpY1NlcnZpY2VDb2RlcyBpcyBkZWZpbmVkIGluIHNlY3Rpb24gNi44LjIKKwlzcy1MaXN0CQlbMl0gU1MtTGlzdAlPUFRJT05BTCwKKwlyb2FtaW5nUmVzdHJpY3Rpb25EdWVUb1Vuc3VwcG9ydGVkRmVhdHVyZSBbNF0gTlVMTAlPUFRJT05BTCwKKwlyZWdpb25hbFN1YnNjcmlwdGlvbklkZW50aWZpZXIJWzVdIFpvbmVDb2RlCU9QVElPTkFMLAorCXZic0dyb3VwSW5kaWNhdGlvbglbN10gTlVMTAkJT1BUSU9OQUwsCisJdmdjc0dyb3VwSW5kaWNhdGlvbglbOF0gTlVMTAkgCU9QVElPTkFMLAorCWNhbWVsU3Vic2NyaXB0aW9uSW5mb1dpdGhkcmF3CVs5XSBOVUxMCSAJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs2XSBFeHRlbnNpb25Db250YWluZXIgCU9QVElPTkFMLAorCS4uLiwKKwlncHJzU3Vic2NyaXB0aW9uRGF0YVdpdGhkcmF3CVsxMF0gR1BSU1N1YnNjcmlwdGlvbkRhdGFXaXRoZHJhdwlPUFRJT05BTCwKKwlyb2FtaW5nUmVzdHJpY3RlZEluU2dzbkR1ZVRvVW5zdXBwcG9ydGVkRmVhdHVyZSBbMTFdIE5VTEwJT1BUSU9OQUwsCisJbHNhSW5mb3JtYXRpb25XaXRoZHJhdwlbMTJdIExTQUluZm9ybWF0aW9uV2l0aGRyYXcJT1BUSU9OQUwsCisJZ21sYy1MaXN0V2l0aGRyYXcgCVsxM10JTlVMTAkJT1BUSU9OQUwsCisJaXN0SW5mb3JtYXRpb25XaXRoZHJhdwlbMTRdIE5VTEwJCU9QVElPTkFMLAorCXNwZWNpZmljQ1NJLVdpdGhkcmF3CVsxNV0gU3BlY2lmaWNDU0ktV2l0aGRyYXcJT1BUSU9OQUwsCisJY2hhcmdpbmdDaGFyYWN0ZXJpc3RpY3NXaXRoZHJhdwlbMTZdIE5VTEwJCU9QVElPTkFMLAorCXN0bi1zcldpdGhkcmF3CVsxN10gTlVMTAkJT1BUSU9OQUwsCisJZXBzU3Vic2NyaXB0aW9uRGF0YVdpdGhkcmF3CVsxOF0gRVBTLVN1YnNjcmlwdGlvbkRhdGFXaXRoZHJhdwlPUFRJT05BTCwKKwlhcG4tb2ktcmVwbGFjZW1lbnRXaXRoZHJhdwlbMTldIE5VTEwJCU9QVElPTkFMLAorCWNzZy1TdWJzY3JpcHRpb25EZWxldGVkCVsyMF0JTlVMTAkJT1BUSU9OQUwgfQorCitTcGVjaWZpY0NTSS1XaXRoZHJhdyA6Oj0gQklUIFNUUklORyB7CisJby1jc2kgKDApLAorCXNzLWNzaSAoMSksCisJdGlmLWNzaSAoMiksCisJZC1jc2kgKDMpLAorCXZ0LWNzaSAoNCksCisJbW8tc21zLWNzaSAoNSksCisJbS1jc2kgKDYpLAorCWdwcnMtY3NpICg3KSwKKwl0LWNzaSAoOCksCisJbXQtc21zLWNzaSAoOSksCisJbWctY3NpICgxMCksCisJby1JTS1DU0kgKDExKSwgCisJZC1JTS1DU0kgKDEyKSwKKwl2dC1JTS1DU0kgKDEzKSB9IChTSVpFKDguLjMyKSkgCistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSBiaXRzIDExIHRvIDMxIHNoYWxsIGJlIGlnbm9yZWQgaWYgcmVjZWl2ZWQgYnkgYSBub24tSVAgTXVsdGltZWRpYSBDb3JlIE5ldHdvcmsgZW50aXR5LgorLS0gYml0cyAwLTEwIGFuZCAxNC0zMSBzaGFsbCBiZSBpZ25vcmVkIGlmIHJlY2VpdmVkIGJ5IGFuIElQIE11bHRpbWVkaWEgQ29yZSBOZXR3b3JrIGVudGl0eS4KKy0tIGJpdHMgMTEtMTMgYXJlIG9ubHkgYXBwbGljYWJsZSBpbiBhbiBJUCBNdWx0aW1lZGlhIENvcmUgTmV0d29yay4KKy0tIEJpdCA4IGFuZCBiaXRzIDExLTEzIGFyZSBvbmx5IGFwcGxpY2FibGUgZm9yIHRoZSBOb3RlU3Vic2NyaWJlckRhdGFNb2RpZmllZCBvcGVyYXRpb24uCisKK0dQUlNTdWJzY3JpcHRpb25EYXRhV2l0aGRyYXcgOjo9IENIT0lDRSB7CisJYWxsR1BSU0RhdGEJTlVMTCwKKwljb250ZXh0SWRMaXN0CUNvbnRleHRJZExpc3R9CisKK0VQUy1TdWJzY3JpcHRpb25EYXRhV2l0aGRyYXcgOjo9IENIT0lDRSB7CisJYWxsRVBTLURhdGEJTlVMTCwKKwljb250ZXh0SWRMaXN0CUNvbnRleHRJZExpc3R9CisKK0NvbnRleHRJZExpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mUERQLUNvbnRleHRzKSBPRgorCQkJCUNvbnRleHRJZAorCitMU0FJbmZvcm1hdGlvbldpdGhkcmF3IDo6PSBDSE9JQ0UgeworCWFsbExTQURhdGEJTlVMTCwKKwlsc2FJZGVudGl0eUxpc3QJTFNBSWRlbnRpdHlMaXN0IH0KKworTFNBSWRlbnRpdHlMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkxTQXMpIE9GCisJCQkJTFNBSWRlbnRpdHkKKworQmFzaWNTZXJ2aWNlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZCYXNpY1NlcnZpY2VzKSBPRgorCQkJCUV4dC1CYXNpY1NlcnZpY2VDb2RlCisKK21heE51bU9mQmFzaWNTZXJ2aWNlcyAgSU5URUdFUiA6Oj0gNzAKKworRGVsZXRlU3Vic2NyaWJlckRhdGFSZXMgOjo9IFNFUVVFTkNFIHsKKwlyZWdpb25hbFN1YnNjcmlwdGlvblJlc3BvbnNlCVswXSBSZWdpb25hbFN1YnNjcmlwdGlvblJlc3BvbnNlCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitWbHJDYW1lbFN1YnNjcmlwdGlvbkluZm8gOjo9IFNFUVVFTkNFIHsKKwlvLUNTSQkJWzBdIE8tQ1NJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzFdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJc3MtQ1NJCQlbMl0gU1MtQ1NJCU9QVElPTkFMLAorCW8tQmNzbUNhbWVsVERQLUNyaXRlcmlhTGlzdAlbNF0gTy1CY3NtQ2FtZWxURFBDcml0ZXJpYUxpc3QJT1BUSU9OQUwsCisJdGlmLUNTSQkJWzNdIE5VTEwJT1BUSU9OQUwsCisJbS1DU0kJCVs1XSBNLUNTSQlPUFRJT05BTCwKKwltby1zbXMtQ1NJCVs2XSBTTVMtQ1NJCU9QVElPTkFMLAorCXZ0LUNTSQkJWzddIFQtQ1NJCU9QVElPTkFMLAorCXQtQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWFMaXN0CVs4XSBULUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhTGlzdAlPUFRJT05BTCwKKwlkLUNTSQkJWzldIEQtQ1NJCU9QVElPTkFMLAorCW10LXNtcy1DU0kJWzEwXSBTTVMtQ1NJCU9QVElPTkFMLAorCW10LXNtc0NBTUVMVERQLUNyaXRlcmlhTGlzdAlbMTFdCU1ULXNtc0NBTUVMVERQLUNyaXRlcmlhTGlzdAlPUFRJT05BTAorCX0KKworTVQtc21zQ0FNRUxURFAtQ3JpdGVyaWFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi4gbWF4TnVtT2ZDYW1lbFREUERhdGEpIE9GCisJTVQtc21zQ0FNRUxURFAtQ3JpdGVyaWEKKworTVQtc21zQ0FNRUxURFAtQ3JpdGVyaWEgOjo9IFNFUVVFTkNFIHsKKwlzbXMtVHJpZ2dlckRldGVjdGlvblBvaW50CVNNUy1UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQsCisJdHBkdS1UeXBlQ3JpdGVyaW9uCVswXQlUUERVLVR5cGVDcml0ZXJpb24JCU9QVElPTkFMLAorCS4uLiB9CisKK1RQRFUtVHlwZUNyaXRlcmlvbiA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZUUERVVHlwZXMpIE9GCisJTVQtU01TLVRQRFUtVHlwZQorCisKK21heE51bU9mVFBEVVR5cGVzIElOVEVHRVIgOjo9IDUKKworTVQtU01TLVRQRFUtVHlwZSA6Oj0gRU5VTUVSQVRFRCB7CisJc21zLURFTElWRVIgCSgwKSwKKwlzbXMtU1VCTUlULVJFUE9SVCAJKDEpLAorCXNtcy1TVEFUVVMtUkVQT1JUIAkoMiksCisJLi4uIH0KKworLS0JZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0JRm9yIFRQRFUtVHlwZUNyaXRlcmlvbiBzZXF1ZW5jZXMgY29udGFpbmluZyB0aGlzIHBhcmFtZXRlciB3aXRoIGFueQorLS0Jb3RoZXIgdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgYWJvdmUgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZSAKKy0tCXRoZSB3aG9sZSBUUERVLVR5cGVDcml0ZXJpb24gc2VxdWVuY2UuCistLQlJbiBDQU1FTCBwaGFzZSA0LCBzbXMtU1VCTUlULVJFUE9SVCBzaGFsbCBub3QgYmUgdXNlZCBhbmQgYSByZWNlaXZlZCBUUERVLVR5cGVDcml0ZXJpb24KKy0tCXNlcXVlbmNlIGNvbnRhaW5pbmcgc21zLVNVQk1JVC1SRVBPUlQgc2hhbGwgYmUgd2hvbGx5IGlnbm9yZWQuCisKK0QtQ1NJIDo6PSBTRVFVRU5DRSB7CisJZHAtQW5hbHlzZWRJbmZvQ3JpdGVyaWFMaXN0CVswXSBEUC1BbmFseXNlZEluZm9Dcml0ZXJpYUxpc3QJT1BUSU9OQUwsCisJY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcJWzFdIENhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCW5vdGlmaWNhdGlvblRvQ1NFCVszXQlOVUxMCQlPUFRJT05BTCwKKwljc2ktQWN0aXZlCVs0XQlOVUxMCQlPUFRJT05BTCwKKwkuLi59IAorLS0Jbm90aWZpY2F0aW9uVG9DU0UgYW5kIGNzaS1BY3RpdmUgc2hhbGwgbm90IGJlIHByZXNlbnQgd2hlbiBELUNTSSBpcyBzZW50IHRvIFZMUi9HTVNDLgorLS0JVGhleSBtYXkgb25seSBiZSBpbmNsdWRlZCBpbiBBVFNJL0FUTSBhY2svTlNEQyBtZXNzYWdlLgorLS0JRFAtQW5hbHlzZWRJbmZvQ3JpdGVyaWEgYW5kICBjYW1lbENhcGFiaWxpdHlIYW5kbGluZyBzaGFsbCBiZSBwcmVzZW50IGluIAorLS0JdGhlIEQtQ1NJIHNlcXVlbmNlLgorLS0JSWYgRC1DU0kgaXMgc2VnbWVudGVkLCB0aGVuIHRoZSBmaXJzdCBzZWdtZW50IHNoYWxsIGNvbnRhaW4gZHAtQW5hbHlzZWRJbmZvQ3JpdGVyaWFMaXN0CistLQlhbmQgY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcuIFN1YnNlcXVlbnQgc2VnbWVudHMgc2hhbGwgbm90IGNvbnRhaW4KKy0tCWNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nLCBidXQgbWF5IGNvbnRhaW4gZHAtQW5hbHlzZWRJbmZvQ3JpdGVyaWFMaXN0LgorCitEUC1BbmFseXNlZEluZm9Dcml0ZXJpYUxpc3QgIDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkRQLUFuYWx5c2VkSW5mb0NyaXRlcmlhKSBPRgorCQkJCURQLUFuYWx5c2VkSW5mb0NyaXRlcml1bQorCittYXhOdW1PZkRQLUFuYWx5c2VkSW5mb0NyaXRlcmlhIElOVEVHRVIgOjo9IDEwCisKK0RQLUFuYWx5c2VkSW5mb0NyaXRlcml1bSA6Oj0gU0VRVUVOQ0UgeworCWRpYWxsZWROdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAorCXNlcnZpY2VLZXkJU2VydmljZUtleSwKKwlnc21TQ0YtQWRkcmVzcwlJU0ROLUFkZHJlc3NTdHJpbmcsCisJZGVmYXVsdENhbGxIYW5kbGluZwlEZWZhdWx0Q2FsbEhhbmRsaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitTUy1DU0kgOjo9IFNFUVVFTkNFIHsKKwlzcy1DYW1lbERhdGEJU1MtQ2FtZWxEYXRhLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCW5vdGlmaWNhdGlvblRvQ1NFCVswXQlOVUxMCQlPUFRJT05BTCwKKwljc2ktQWN0aXZlCVsxXQlOVUxMCQlPUFRJT05BTAorLS0Jbm90aWZpY2F0aW9uVG9DU0UgYW5kIGNzaS1BY3RpdmUgc2hhbGwgbm90IGJlIHByZXNlbnQgd2hlbiBTUy1DU0kgaXMgc2VudCB0byBWTFIuCistLQlUaGV5IG1heSBvbmx5IGJlIGluY2x1ZGVkIGluIEFUU0kvQVRNIGFjay9OU0RDIG1lc3NhZ2UuCit9CisKK1NTLUNhbWVsRGF0YSAgOjo9IFNFUVVFTkNFIHsKKwlzcy1FdmVudExpc3QJU1MtRXZlbnRMaXN0LAorCWdzbVNDRi1BZGRyZXNzCUlTRE4tQWRkcmVzc1N0cmluZywKKwlleHRlbnNpb25Db250YWluZXIJWzBdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwgCisJLi4ufQorCitTUy1FdmVudExpc3QgIDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkNhbWVsU1NFdmVudHMpIE9GIFNTLUNvZGUKKwktLSBBY3Rpb25zIGZvciB0aGUgZm9sbG93aW5nIFNTLUNvZGUgdmFsdWVzIGFyZSBkZWZpbmVkIGluIENBTUVMIFBoYXNlIDM6CisJLS0gZWN0CQlTUy1Db2RlIDo6PSAnMDAxMTAwMDEnQgorCS0tIG11bHRpUFRZCVNTLUNvZGUgOjo9ICcwMTAxMDAwMSdCCisJLS0gY2QJCVNTLUNvZGUgOjo9ICcwMDEwMDEwMCdCCisJLS0gY2NicwkJU1MtQ29kZSA6Oj0gJzAxMDAwMTAwJ0IKKwktLSBhbGwgb3RoZXIgU1MgY29kZXMgc2hhbGwgYmUgaWdub3JlZAorCS0tIFdoZW4gU1MtQ1NJIGlzIHNlbnQgdG8gdGhlIFZMUiwgaXQgc2hhbGwgbm90IGNvbnRhaW4gYSBtYXJraW5nIGZvciBjY2JzLgorCS0tIElmIHRoZSBWTFIgcmVjZWl2ZXMgU1MtQ1NJIGNvbnRhaW5pbmcgYSBtYXJraW5nIGZvciBjY2JzLCB0aGUgVkxSIHNoYWxsIGRpc2NhcmQgdGhlCisJLS0gY2NicyBtYXJraW5nIGluIFNTLUNTSS4KKworbWF4TnVtT2ZDYW1lbFNTRXZlbnRzIElOVEVHRVIgOjo9IDEwCisKK08tQ1NJIDo6PSBTRVFVRU5DRSB7CisJby1CY3NtQ2FtZWxURFBEYXRhTGlzdAlPLUJjc21DYW1lbFREUERhdGFMaXN0LAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCVswXSBDYW1lbENhcGFiaWxpdHlIYW5kbGluZwlPUFRJT05BTCwKKwlub3RpZmljYXRpb25Ub0NTRQlbMV0JTlVMTAkJT1BUSU9OQUwsCisJY3NpQWN0aXZlCQlbMl0JTlVMTAkJT1BUSU9OQUx9CistLQlub3RpZmljYXRpb250b0NTRSBhbmQgY3NpQWN0aXZlIHNoYWxsIG5vdCBiZSBwcmVzZW50IHdoZW4gTy1DU0kgaXMgc2VudCB0byBWTFIvR01TQy4KKy0tCVRoZXkgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gQVRTSS9BVE0gYWNrL05TREMgbWVzc2FnZS4KKy0tCU8tQ1NJIHNoYWxsIG5vdCBiZSBzZWdtZW50ZWQuCisKK08tQmNzbUNhbWVsVERQRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQ2FtZWxURFBEYXRhKSBPRgorCU8tQmNzbUNhbWVsVERQRGF0YQorCS0tIE8tQmNzbUNhbWVsVERQRGF0YUxpc3Qgc2hhbGwgbm90IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBpbnN0YW5jZSBvZgorCS0tIE8tQmNzbUNhbWVsVERQRGF0YSBjb250YWluaW5nIHRoZSBzYW1lIHZhbHVlIGZvciBvLUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQuCisJLS0gRm9yIENBTUVMIFBoYXNlIDIsIHRoaXMgbWVhbnMgdGhhdCBvbmx5IG9uZSBpbnN0YW5jZSBvZiBPLUJjc21DYW1lbFREUERhdGEgaXMgYWxsb3dlZAorCS0tIHdpdGggby1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50IGJlaW5nIGVxdWFsIHRvIERQMi4KKworbWF4TnVtT2ZDYW1lbFREUERhdGEgIElOVEVHRVIgOjo9IDEwCisKK08tQmNzbUNhbWVsVERQRGF0YSA6Oj0gU0VRVUVOQ0UgeworCW8tQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludAlPLUJjc21UcmlnZ2VyRGV0ZWN0aW9uUG9pbnQsCisJc2VydmljZUtleQlTZXJ2aWNlS2V5LAorCWdzbVNDRi1BZGRyZXNzCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJZGVmYXVsdENhbGxIYW5kbGluZwlbMV0gRGVmYXVsdENhbGxIYW5kbGluZywKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4KKwl9CisKK1NlcnZpY2VLZXkgOjo9IElOVEVHRVIgKDAuLjIxNDc0ODM2NDcpCisKK08tQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCA6Oj0gRU5VTUVSQVRFRCB7CisJY29sbGVjdGVkSW5mbyAoMiksCisJLi4uLAorCXJvdXRlU2VsZWN0RmFpbHVyZSAoNCkgfQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLSBGb3IgTy1CY3NtQ2FtZWxURFBEYXRhIHNlcXVlbmNlcyBjb250YWluaW5nIHRoaXMgcGFyYW1ldGVyIHdpdGggYW55CisJLS0gb3RoZXIgdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZSB0aGUgd2hvbGUgCisJLS0gTy1CY3NtQ2FtZWxURFBEYXRhc2VxdWVuY2UuIAorCS0tIEZvciBPLUJjc21DYW1lbFREUC1Dcml0ZXJpYSBzZXF1ZW5jZXMgY29udGFpbmluZyB0aGlzIHBhcmFtZXRlciB3aXRoIGFueQorCS0tIG90aGVyIHZhbHVlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUgdGhlIHdob2xlCisJLS0gTy1CY3NtQ2FtZWxURFAtQ3JpdGVyaWEgc2VxdWVuY2UuCisKK08tQmNzbUNhbWVsVERQQ3JpdGVyaWFMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkNhbWVsVERQRGF0YSkgT0YKKwlPLUJjc21DYW1lbFREUC1Dcml0ZXJpYSAKKworVC1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQ2FtZWxURFBEYXRhKSBPRgorCVQtQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWEgCisKK08tQmNzbUNhbWVsVERQLUNyaXRlcmlhIDo6PSBTRVFVRU5DRSB7CisJby1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50CU8tQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCwJCisJZGVzdGluYXRpb25OdW1iZXJDcml0ZXJpYSAJWzBdIERlc3RpbmF0aW9uTnVtYmVyQ3JpdGVyaWEJT1BUSU9OQUwsCisJYmFzaWNTZXJ2aWNlQ3JpdGVyaWEJWzFdIEJhc2ljU2VydmljZUNyaXRlcmlhCU9QVElPTkFMLAorCWNhbGxUeXBlQ3JpdGVyaWEJWzJdIENhbGxUeXBlQ3JpdGVyaWEJT1BUSU9OQUwsCisJLi4uLAorCW8tQ2F1c2VWYWx1ZUNyaXRlcmlhCVszXSBPLUNhdXNlVmFsdWVDcml0ZXJpYQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCB9CisKK1QtQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWEgOjo9IFNFUVVFTkNFIHsKKwl0LUJDU00tVHJpZ2dlckRldGVjdGlvblBvaW50CVQtQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCwJCisJYmFzaWNTZXJ2aWNlQ3JpdGVyaWEJWzBdIEJhc2ljU2VydmljZUNyaXRlcmlhCU9QVElPTkFMLAorCXQtQ2F1c2VWYWx1ZUNyaXRlcmlhCVsxXSBULUNhdXNlVmFsdWVDcml0ZXJpYQlPUFRJT05BTCwKKwkuLi4gfQorCitEZXN0aW5hdGlvbk51bWJlckNyaXRlcmlhICA6Oj0gU0VRVUVOQ0UgeworCW1hdGNoVHlwZQkJWzBdIE1hdGNoVHlwZSwKKwlkZXN0aW5hdGlvbk51bWJlckxpc3QgCVsxXSBEZXN0aW5hdGlvbk51bWJlckxpc3QJT1BUSU9OQUwsCisJZGVzdGluYXRpb25OdW1iZXJMZW5ndGhMaXN0CVsyXSBEZXN0aW5hdGlvbk51bWJlckxlbmd0aExpc3QJT1BUSU9OQUwsCisJLS0gb25lIG9yIGJvdGggb2YgZGVzdGluYXRpb25OdW1iZXJMaXN0IGFuZCBkZXN0aW5hdGlvbk51bWJlckxlbmd0aExpc3QgCisJLS0gc2hhbGwgYmUgcHJlc2VudAorCS4uLn0KKworRGVzdGluYXRpb25OdW1iZXJMaXN0ICA6Oj0gU0VRVUVOQ0UgU0laRQkoMS4ubWF4TnVtT2ZDYW1lbERlc3RpbmF0aW9uTnVtYmVycykgT0YKKwkJCQlJU0ROLUFkZHJlc3NTdHJpbmcKKwktLSBUaGUgcmVjZWl2aW5nIGVudGl0eSBzaGFsbCBub3QgY2hlY2sgdGhlIGZvcm1hdCBvZiBhIG51bWJlciBpbgorCS0tIHRoZSBkaWFsbGVkIG51bWJlciBsaXN0CisKK0Rlc3RpbmF0aW9uTnVtYmVyTGVuZ3RoTGlzdCAgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQ2FtZWxEZXN0aW5hdGlvbk51bWJlckxlbmd0aHMpIE9GIAorCQkJCQlJTlRFR0VSKDEuLm1heE51bU9mSVNETi1BZGRyZXNzRGlnaXRzKQorCitCYXNpY1NlcnZpY2VDcml0ZXJpYSAgIDo6PSBTRVFVRU5DRSBTSVpFKDEuLm1heE51bU9mQ2FtZWxCYXNpY1NlcnZpY2VDcml0ZXJpYSkgT0YKKwlFeHQtQmFzaWNTZXJ2aWNlQ29kZQorCittYXhOdW1PZklTRE4tQWRkcmVzc0RpZ2l0cyAgSU5URUdFUiA6Oj0gMTUKKworbWF4TnVtT2ZDYW1lbERlc3RpbmF0aW9uTnVtYmVycyAgSU5URUdFUiA6Oj0gMTAKKworbWF4TnVtT2ZDYW1lbERlc3RpbmF0aW9uTnVtYmVyTGVuZ3RocyAgSU5URUdFUiA6Oj0gMworCittYXhOdW1PZkNhbWVsQmFzaWNTZXJ2aWNlQ3JpdGVyaWEgIElOVEVHRVIgOjo9IDUKKworQ2FsbFR5cGVDcml0ZXJpYSAgICAgICA6Oj0gRU5VTUVSQVRFRCB7CisJZm9yd2FyZGVkIAkoMCksCisJbm90Rm9yd2FyZGVkCSgxKX0KKworTWF0Y2hUeXBlICAgICAgIDo6PSBFTlVNRVJBVEVEIHsKKwlpbmhpYml0aW5nIAkoMCksCisJZW5hYmxpbmcJCSgxKX0KKworTy1DYXVzZVZhbHVlQ3JpdGVyaWEgICA6Oj0gU0VRVUVOQ0UgU0laRSgxLi5tYXhOdW1PZkNBTUVMLU8tQ2F1c2VWYWx1ZUNyaXRlcmlhKSBPRgorCUNhdXNlVmFsdWUKKworVC1DYXVzZVZhbHVlQ3JpdGVyaWEgICA6Oj0gU0VRVUVOQ0UgU0laRSgxLi5tYXhOdW1PZkNBTUVMLVQtQ2F1c2VWYWx1ZUNyaXRlcmlhKSBPRgorCUNhdXNlVmFsdWUKKworbWF4TnVtT2ZDQU1FTC1PLUNhdXNlVmFsdWVDcml0ZXJpYSAgSU5URUdFUiA6Oj0gNQorCittYXhOdW1PZkNBTUVMLVQtQ2F1c2VWYWx1ZUNyaXRlcmlhICBJTlRFR0VSIDo6PSA1CisKK0NhdXNlVmFsdWUgOjo9IE9DVEVUIFNUUklORyAoU0laRSgxKSkKKy0tIFR5cGUgZXh0cmFjdGVkIGZyb20gQ2F1c2UgcGFyYW1ldGVyIGluIElUVS1UIFJlY29tbWVuZGF0aW9uIFEuNzYzLgorLS0gRm9yIHRoZSB1c2Ugb2YgY2F1c2UgdmFsdWUgcmVmZXIgdG8gSVRVLVQgUmVjb21tZW5kYXRpb24gUS44NTAuCisKK0RlZmF1bHRDYWxsSGFuZGxpbmcgOjo9IEVOVU1FUkFURUQgeworCWNvbnRpbnVlQ2FsbCAoMCkgLAorCXJlbGVhc2VDYWxsICgxKSAsCisJLi4ufQorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLSByZWNlcHRpb24gb2YgdmFsdWVzIGluIHJhbmdlIDItMzEgc2hhbGwgYmUgdHJlYXRlZCBhcyAiY29udGludWVDYWxsIgorCS0tIHJlY2VwdGlvbiBvZiB2YWx1ZXMgZ3JlYXRlciB0aGFuIDMxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgInJlbGVhc2VDYWxsIgorCitDYW1lbENhcGFiaWxpdHlIYW5kbGluZyA6Oj0gSU5URUdFUigxLi4xNikgCisJLS0gdmFsdWUgMSA9IENBTUVMIHBoYXNlIDEsCisJLS0gdmFsdWUgMiA9IENBTUVMIHBoYXNlIDIsCisJLS0gdmFsdWUgMyA9IENBTUVMIFBoYXNlIDMsCisJLS0gdmFsdWUgNCA9IENBTUVMIHBoYXNlIDQ6CisJLS0gcmVjZXB0aW9uIG9mIHZhbHVlcyBncmVhdGVyIHRoYW4gNCBzaGFsbCBiZSB0cmVhdGVkIGFzIENBTUVMIHBoYXNlIDQuCisKK1N1cHBvcnRlZENhbWVsUGhhc2VzIDo6PSBCSVQgU1RSSU5HIHsKKwlwaGFzZTEgKDApLAorCXBoYXNlMiAoMSksCisJcGhhc2UzICgyKSwKKwlwaGFzZTQgKDMpfSAoU0laRSAoMS4uMTYpKSAKKy0tIEEgbm9kZSBzaGFsbCBtYXJrIGluIHRoZSBCSVQgU1RSSU5HIGFsbCBDQU1FTCBQaGFzZXMgaXQgc3VwcG9ydHMuCistLSBPdGhlciB2YWx1ZXMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitPZmZlcmVkQ2FtZWw0Q1NJcyA6Oj0gQklUIFNUUklORyB7IAkKKwlvLWNzaQkJKDApLAorCWQtY3NpCQkoMSksCisJdnQtY3NpCQkoMiksCisJdC1jc2kJCSgzKSwKKwltdC1zbXMtY3NpCSg0KSwKKwltZy1jc2kJCSg1KSwKKwlwc2ktZW5oYW5jZW1lbnRzCSg2KSAKK30gKFNJWkUgKDcuLjE2KSkKKy0tIEEgbm9kZSBzdXBwb3J0aW5nIENhbWVsIHBoYXNlIDQgc2hhbGwgbWFyayBpbiB0aGUgQklUIFNUUklORyBhbGwgQ2FtZWw0IENTSXMgCistLSBpdCBvZmZlcnMuCistLSBPdGhlciB2YWx1ZXMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitPZmZlcmVkQ2FtZWw0RnVuY3Rpb25hbGl0aWVzIDo6PSBCSVQgU1RSSU5HIHsgCQorCWluaXRpYXRlQ2FsbEF0dGVtcHQJKDApLAorCXNwbGl0TGVnCQkoMSksCisJbW92ZUxlZwkJKDIpLAorCWRpc2Nvbm5lY3RMZWcJKDMpLAorCWVudGl0eVJlbGVhc2VkCSg0KSwKKwlkZmMtV2l0aEFyZ3VtZW50CSg1KSwKKwlwbGF5VG9uZQkJKDYpLAorCWR0bWYtTWlkQ2FsbAkoNyksCisJY2hhcmdpbmdJbmRpY2F0b3IJKDgpLAorCWFsZXJ0aW5nRFAJKDkpLAorCWxvY2F0aW9uQXRBbGVydGluZwkoMTApLAorCWNoYW5nZU9mUG9zaXRpb25EUAkoMTEpLAorCW9yLUludGVyYWN0aW9ucwkoMTIpLAorCXdhcm5pbmdUb25lRW5oYW5jZW1lbnRzCSgxMyksCisJY2YtRW5oYW5jZW1lbnRzCSgxNCksCisJc3Vic2NyaWJlZEVuaGFuY2VkRGlhbGxlZFNlcnZpY2VzIAkoMTUpLAorCXNlcnZpbmdOZXR3b3JrRW5oYW5jZWREaWFsbGVkU2VydmljZXMgKDE2KSwKKwljcml0ZXJpYUZvckNoYW5nZU9mUG9zaXRpb25EUAkoMTcpLAorCXNlcnZpY2VDaGFuZ2VEUAkoMTgpLAorCWNvbGxlY3RJbmZvcm1hdGlvbgkoMTkpCit9IChTSVpFICgxNS4uNjQpKQorLS0gQSBub2RlIHN1cHBvcnRpbmcgQ2FtZWwgcGhhc2UgNCBzaGFsbCBtYXJrIGluIHRoZSBCSVQgU1RSSU5HIGFsbCBDQU1FTDQgCistLSBmdW5jdGlvbmFsaXRpZXMgaXQgb2ZmZXJzLgorLS0gT3RoZXIgdmFsdWVzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworU01TLUNTSSA6Oj0gU0VRVUVOQ0UgeworCXNtcy1DQU1FTC1URFAtRGF0YUxpc3QJWzBdIFNNUy1DQU1FTC1URFAtRGF0YUxpc3QJT1BUSU9OQUwsCisJY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcJWzFdIENhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCW5vdGlmaWNhdGlvblRvQ1NFCVszXSBOVUxMCQlPUFRJT05BTCwKKwljc2ktQWN0aXZlCVs0XSBOVUxMCQlPUFRJT05BTCwKKwkuLi59CistLQlub3RpZmljYXRpb25Ub0NTRSBhbmQgY3NpLUFjdGl2ZSBzaGFsbCBub3QgYmUgcHJlc2VudAorLS0Jd2hlbiBNTy1TTVMtQ1NJIG9yIE1ULVNNUy1DU0kgaXMgc2VudCB0byBWTFIgb3IgU0dTTi4KKy0tCVRoZXkgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gQVRTSS9BVE0gYWNrL05TREMgbWVzc2FnZS4KKy0tCVNNUy1DQU1FTC1URFAtRGF0YSBhbmQgIGNhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nIHNoYWxsIGJlIHByZXNlbnQgaW4gCistLQl0aGUgU01TLUNTSSBzZXF1ZW5jZS4KKy0tCUlmIFNNUy1DU0kgaXMgc2VnbWVudGVkLCBzbXMtQ0FNRUwtVERQLURhdGFMaXN0IGFuZCBjYW1lbENhcGFiaWxpdHlIYW5kbGluZyBzaGFsbCBiZSAKKy0tCXByZXNlbnQgaW4gdGhlIGZpcnN0IHNlZ21lbnQKKworU01TLUNBTUVMLVREUC1EYXRhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZDYW1lbFREUERhdGEpIE9GCisJU01TLUNBTUVMLVREUC1EYXRhCistLQlTTVMtQ0FNRUwtVERQLURhdGFMaXN0IHNoYWxsIG5vdCBjb250YWluIG1vcmUgdGhhbiBvbmUgaW5zdGFuY2Ugb2YKKy0tCVNNUy1DQU1FTC1URFAtRGF0YSBjb250YWluaW5nIHRoZSBzYW1lIHZhbHVlIGZvciBzbXMtVHJpZ2dlckRldGVjdGlvblBvaW50LgorCitTTVMtQ0FNRUwtVERQLURhdGEgOjo9IFNFUVVFTkNFIHsKKwlzbXMtVHJpZ2dlckRldGVjdGlvblBvaW50CVswXSBTTVMtVHJpZ2dlckRldGVjdGlvblBvaW50LAorCXNlcnZpY2VLZXkJWzFdIFNlcnZpY2VLZXksCisJZ3NtU0NGLUFkZHJlc3MJWzJdIElTRE4tQWRkcmVzc1N0cmluZywKKwlkZWZhdWx0U01TLUhhbmRsaW5nCVszXSBEZWZhdWx0U01TLUhhbmRsaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLgorCX0KKworU01TLVRyaWdnZXJEZXRlY3Rpb25Qb2ludCA6Oj0gRU5VTUVSQVRFRCB7CisJc21zLUNvbGxlY3RlZEluZm8gKDEpLAorCS4uLiwKKwlzbXMtRGVsaXZlcnlSZXF1ZXN0ICgyKQorCX0KKy0tCWV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tCUZvciBTTVMtQ0FNRUwtVERQLURhdGEgYW5kIE1ULXNtc0NBTUVMVERQLUNyaXRlcmlhIHNlcXVlbmNlcyBjb250YWluaW5nIHRoaXMgCistLQlwYXJhbWV0ZXIgd2l0aCBhbnkgb3RoZXIgdmFsdWUgdGhhbiB0aGUgb25lcyBsaXN0ZWQgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZQorLS0JdGhlIHdob2xlIHNlcXVlbmNlLgorLS0KKy0tCUlmIHRoaXMgcGFyYW1ldGVyIGlzIHJlY2VpdmVkIHdpdGggYW55IG90aGVyIHZhbHVlIHRoYW4gc21zLUNvbGxlY3RlZEluZm8KKy0tCWluIGFuIFNNUy1DQU1FTC1URFAtRGF0YSBzZXF1ZW5jZSBjb250YWluZWQgaW4gbW8tc21zLUNTSSwgdGhlbiB0aGUgcmVjZWl2ZXIgc2hhbGwKKy0tCWlnbm9yZSB0aGUgd2hvbGUgU01TLUNBTUVMLVREUC1EYXRhIHNlcXVlbmNlLgorLS0KKy0tCUlmIHRoaXMgcGFyYW1ldGVyIGlzIHJlY2VpdmVkIHdpdGggYW55IG90aGVyIHZhbHVlIHRoYW4gc21zLURlbGl2ZXJ5UmVxdWVzdAorLS0JaW4gYW4gU01TLUNBTUVMLVREUC1EYXRhIHNlcXVlbmNlIGNvbnRhaW5lZCBpbiBtdC1zbXMtQ1NJIHRoZW4gdGhlIHJlY2VpdmVyIHNoYWxsCistLQlpZ25vcmUgdGhlIHdob2xlIFNNUy1DQU1FTC1URFAtRGF0YSBzZXF1ZW5jZS4KKy0tCistLQlJZiB0aGlzIHBhcmFtZXRlciBpcyByZWNlaXZlZCB3aXRoIGFueSBvdGhlciB2YWx1ZSB0aGFuIHNtcy1EZWxpdmVyeVJlcXVlc3QKKy0tCWluIGFuIE1ULXNtc0NBTUVMVERQLUNyaXRlcmlhIHNlcXVlbmNlIHRoZW4gdGhlIHJlY2VpdmVyIHNoYWxsCistLQlpZ25vcmUgdGhlIHdob2xlIE1ULXNtc0NBTUVMVERQLUNyaXRlcmlhIHNlcXVlbmNlLgorCitEZWZhdWx0U01TLUhhbmRsaW5nIDo6PSBFTlVNRVJBVEVEIHsKKwljb250aW51ZVRyYW5zYWN0aW9uICgwKSAsCisJcmVsZWFzZVRyYW5zYWN0aW9uICgxKSAsCisJLi4ufQorLS0JZXhjZXB0aW9uIGhhbmRsaW5nOgorLS0JcmVjZXB0aW9uIG9mIHZhbHVlcyBpbiByYW5nZSAyLTMxIHNoYWxsIGJlIHRyZWF0ZWQgYXMgImNvbnRpbnVlVHJhbnNhY3Rpb24iCistLQlyZWNlcHRpb24gb2YgdmFsdWVzIGdyZWF0ZXIgdGhhbiAzMSBzaGFsbCBiZSB0cmVhdGVkIGFzICJyZWxlYXNlVHJhbnNhY3Rpb24iCisKK00tQ1NJIDo6PSBTRVFVRU5DRSB7CisJbW9iaWxpdHlUcmlnZ2VycwlNb2JpbGl0eVRyaWdnZXJzLAorCXNlcnZpY2VLZXkJU2VydmljZUtleSwKKwlnc21TQ0YtQWRkcmVzcwlbMF0JSVNETi1BZGRyZXNzU3RyaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCW5vdGlmaWNhdGlvblRvQ1NFCVsyXSBOVUxMCQlPUFRJT05BTCwKKwljc2ktQWN0aXZlCVszXSBOVUxMCQlPUFRJT05BTCwKKwkuLi59CistLQlub3RpZmljYXRpb25Ub0NTRSBhbmQgY3NpLUFjdGl2ZSBzaGFsbCBub3QgYmUgcHJlc2VudCB3aGVuIE0tQ1NJIGlzIHNlbnQgdG8gVkxSLgorLS0JVGhleSBtYXkgb25seSBiZSBpbmNsdWRlZCBpbiBBVFNJL0FUTSBhY2svTlNEQyBtZXNzYWdlLgorCitNRy1DU0kgOjo9IFNFUVVFTkNFIHsKKwltb2JpbGl0eVRyaWdnZXJzCU1vYmlsaXR5VHJpZ2dlcnMsCisJc2VydmljZUtleQlTZXJ2aWNlS2V5LAorCWdzbVNDRi1BZGRyZXNzCVswXQlJU0ROLUFkZHJlc3NTdHJpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJbm90aWZpY2F0aW9uVG9DU0UJWzJdIE5VTEwJCU9QVElPTkFMLAorCWNzaS1BY3RpdmUJWzNdIE5VTEwJCU9QVElPTkFMLAorCS4uLn0KKy0tCW5vdGlmaWNhdGlvblRvQ1NFIGFuZCBjc2ktQWN0aXZlIHNoYWxsIG5vdCBiZSBwcmVzZW50IHdoZW4gTUctQ1NJIGlzIHNlbnQgdG8gU0dTTi4KKy0tCVRoZXkgbWF5IG9ubHkgYmUgaW5jbHVkZWQgaW4gQVRTSS9BVE0gYWNrL05TREMgbWVzc2FnZS4KKworTW9iaWxpdHlUcmlnZ2VycyAgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mTW9iaWxpdHlUcmlnZ2VycykgT0YKKwlNTS1Db2RlCisKK21heE51bU9mTW9iaWxpdHlUcmlnZ2VycyBJTlRFR0VSIDo6PSAxMAorCitNTS1Db2RlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorLS0JVGhpcyB0eXBlIGlzIHVzZWQgdG8gaW5kaWNhdGUgYSBNb2JpbGl0eSBNYW5hZ2VtZW50IGV2ZW50LgorLS0JQWN0aW9ucyBmb3IgdGhlIGZvbGxvd2luZyBNTS1Db2RlIHZhbHVlcyBhcmUgZGVmaW5lZCBpbiBDQU1FTCBQaGFzZSA0OgorLS0KKy0tCUNTIGRvbWFpbiBNTSBldmVudHM6CistLQlMb2NhdGlvbi11cGRhdGUtaW4tc2FtZS1WTFIJTU0tQ29kZSA6Oj0gJzAwMDAwMDAwJ0IKKy0tCUxvY2F0aW9uLXVwZGF0ZS10by1vdGhlci1WTFIJTU0tQ29kZSA6Oj0gJzAwMDAwMDAxJ0IKKy0tCUlNU0ktQXR0YWNoCU1NLUNvZGUgOjo9ICcwMDAwMDAxMCdCCistLQlNUy1pbml0aWF0ZWQtSU1TSS1EZXRhY2gJTU0tQ29kZSA6Oj0gJzAwMDAwMDExJ0IKKy0tCU5ldHdvcmstaW5pdGlhdGVkLUlNU0ktRGV0YWNoCU1NLUNvZGUgOjo9ICcwMDAwMDEwMCdCCistLQorLS0JUFMgZG9tYWluIE1NIGV2ZW50czoKKy0tCVJvdXRlaW5nLUFyZWEtdXBkYXRlLWluLXNhbWUtU0dTTglNTS1Db2RlIDo6PSAnMTAwMDAwMDAnQgorLS0JUm91dGVpbmctQXJlYS11cGRhdGUtdG8tb3RoZXItU0dTTi11cGRhdGUtZnJvbS1uZXctU0dTTgorLS0JCQkJTU0tQ29kZSA6Oj0gJzEwMDAwMDAxJ0IKKy0tCVJvdXRlaW5nLUFyZWEtdXBkYXRlLXRvLW90aGVyLVNHU04tZGlzY29ubmVjdC1ieS1kZXRhY2gKKy0tCQkJCU1NLUNvZGUgOjo9ICcxMDAwMDAxMCdCCistLQlHUFJTLUF0dGFjaAlNTS1Db2RlIDo6PSAnMTAwMDAwMTEnQgorLS0JTVMtaW5pdGlhdGVkLUdQUlMtRGV0YWNoCU1NLUNvZGUgOjo9ICcxMDAwMDEwMCdCCistLQlOZXR3b3JrLWluaXRpYXRlZC1HUFJTLURldGFjaAlNTS1Db2RlIDo6PSAnMTAwMDAxMDEnQiAKKy0tCU5ldHdvcmstaW5pdGlhdGVkLXRyYW5zZmVyLXRvLU1TLW5vdC1yZWFjaGFibGUtZm9yLXBhZ2luZworLS0JCQkJTU0tQ29kZSA6Oj0gJzEwMDAwMTEwJ0IKKy0tCistLQlJZiB0aGUgTVNDIHJlY2VpdmVzIGFueSBvdGhlciBNTS1jb2RlIHRoYW4gdGhlIG9uZXMgbGlzdGVkIGFib3ZlIGZvciB0aGUKKy0tCUNTIGRvbWFpbiwgdGhlbiB0aGUgTVNDIHNoYWxsIGlnbm9yZSB0aGF0IE1NLWNvZGUuCistLQlJZiB0aGUgU0dTTiByZWNlaXZlcyBhbnkgb3RoZXIgTU0tY29kZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCBhYm92ZSBmb3IgdGhlCistLQlQUyBkb21haW4sIHRoZW4gdGhlIFNHU04gc2hhbGwgaWdub3JlIHRoYXQgTU0tY29kZS4KKworVC1DU0kgOjo9IFNFUVVFTkNFIHsKKwl0LUJjc21DYW1lbFREUERhdGFMaXN0CVQtQmNzbUNhbWVsVERQRGF0YUxpc3QsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJY2FtZWxDYXBhYmlsaXR5SGFuZGxpbmcJWzBdIENhbWVsQ2FwYWJpbGl0eUhhbmRsaW5nCU9QVElPTkFMLAorCW5vdGlmaWNhdGlvblRvQ1NFCVsxXSBOVUxMCQlPUFRJT05BTCwKKwljc2ktQWN0aXZlCVsyXSBOVUxMCQlPUFRJT05BTH0KKy0tCW5vdGlmaWNhdGlvblRvQ1NFIGFuZCBjc2ktQWN0aXZlIHNoYWxsIG5vdCBiZSBwcmVzZW50IHdoZW4gVlQtQ1NJL1QtQ1NJIGlzIHNlbnQKKy0tCXRvIFZMUi9HTVNDLgorLS0JVGhleSBtYXkgb25seSBiZSBpbmNsdWRlZCBpbiBBVFNJL0FUTSBhY2svTlNEQyBtZXNzYWdlLgorLS0JVC1DU0kgc2hhbGwgbm90IGJlIHNlZ21lbnRlZC4KKworVC1CY3NtQ2FtZWxURFBEYXRhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZDYW1lbFREUERhdGEpIE9GCisJVC1CY3NtQ2FtZWxURFBEYXRhCisJLS0tIFQtQmNzbUNhbWVsVERQRGF0YUxpc3Qgc2hhbGwgbm90IGNvbnRhaW4gbW9yZSB0aGFuIG9uZSBpbnN0YW5jZSBvZgorCS0tLSBULUJjc21DYW1lbFREUERhdGEgY29udGFpbmluZyB0aGUgc2FtZSB2YWx1ZSBmb3IgdC1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50LgorCS0tLSBGb3IgQ0FNRUwgUGhhc2UgMiwgdGhpcyBtZWFucyB0aGF0IG9ubHkgb25lIGluc3RhbmNlIG9mIFQtQmNzbUNhbWVsVERQRGF0YSBpcyBhbGxvd2VkCisJLS0tIHdpdGggdC1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50IGJlaW5nIGVxdWFsIHRvIERQMTIuIAorCS0tLSBGb3IgQ0FNRUwgUGhhc2UgMywgbW9yZSBURFCScyBhcmUgYWxsb3dlZC4KKworVC1CY3NtQ2FtZWxURFBEYXRhIDo6PSBTRVFVRU5DRSB7CisJdC1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50CVQtQmNzbVRyaWdnZXJEZXRlY3Rpb25Qb2ludCwKKwlzZXJ2aWNlS2V5CVNlcnZpY2VLZXksCisJZ3NtU0NGLUFkZHJlc3MJWzBdIElTRE4tQWRkcmVzc1N0cmluZywKKwlkZWZhdWx0Q2FsbEhhbmRsaW5nCVsxXSBEZWZhdWx0Q2FsbEhhbmRsaW5nLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworVC1CY3NtVHJpZ2dlckRldGVjdGlvblBvaW50IDo6PSBFTlVNRVJBVEVEIHsKKwl0ZXJtQXR0ZW1wdEF1dGhvcml6ZWQgKDEyKSwKKwkuLi4gLAorCXRCdXN5ICgxMyksCisJdE5vQW5zd2VyICgxNCl9CisJLS0gZXhjZXB0aW9uIGhhbmRsaW5nOgorCS0tIEZvciBULUJjc21DYW1lbFREUERhdGEgc2VxdWVuY2VzIGNvbnRhaW5pbmcgdGhpcyBwYXJhbWV0ZXIgd2l0aCBhbnkgb3RoZXIKKwktLSB2YWx1ZSB0aGFuIHRoZSBvbmVzIGxpc3RlZCBhYm92ZSwgdGhlIHJlY2VpdmVyIHNoYWxsIGlnbm9yZSB0aGUgd2hvbGUKKwktLSBULUJjc21DYW1lbFREUERhdGEgc2VxdWVuY2UuCisKKy0tIGdwcnMgbG9jYXRpb24gaW5mb3JtYXRpb24gcmV0cmlldmFsIHR5cGVzCisKK1NlbmRSb3V0aW5nSW5mb0ZvckdwcnNBcmcgOjo9IFNFUVVFTkNFIHsKKwlpbXNpCQkJCVswXSBJTVNJLAorCWdnc24tQWRkcmVzcwkJWzFdIEdTTi1BZGRyZXNzCU9QVElPTkFMLCAKKwlnZ3NuLU51bWJlcgkJWzJdCUlTRE4tQWRkcmVzc1N0cmluZywKKwlleHRlbnNpb25Db250YWluZXIJCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitTZW5kUm91dGluZ0luZm9Gb3JHcHJzUmVzIDo6PSBTRVFVRU5DRSB7CisJc2dzbi1BZGRyZXNzCQlbMF0gR1NOLUFkZHJlc3MsCisJZ2dzbi1BZGRyZXNzCQlbMV0JR1NOLUFkZHJlc3MJT1BUSU9OQUwsCisJbW9iaWxlTm90UmVhY2hhYmxlUmVhc29uCQlbMl0JQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCQlbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworLS0gZmFpbHVyZSByZXBvcnQgdHlwZXMKKworRmFpbHVyZVJlcG9ydEFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQkJWzBdIElNU0ksCisJZ2dzbi1OdW1iZXIJCVsxXSBJU0ROLUFkZHJlc3NTdHJpbmcJLAorCWdnc24tQWRkcmVzcwkJWzJdIEdTTi1BZGRyZXNzCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcgkJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0ZhaWx1cmVSZXBvcnRSZXMgOjo9IFNFUVVFTkNFIHsKKwlnZ3NuLUFkZHJlc3MJCVswXSBHU04tQWRkcmVzcwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJCVsxXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCistLSBncHJzIG5vdGlmaWNhdGlvbiB0eXBlcworCitOb3RlTXNQcmVzZW50Rm9yR3Byc0FyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQkJWzBdIElNU0ksCisJc2dzbi1BZGRyZXNzCQlbMV0gR1NOLUFkZHJlc3MsCisJZ2dzbi1BZGRyZXNzCQlbMl0gR1NOLUFkZHJlc3MJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCQlbM10gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTm90ZU1zUHJlc2VudEZvckdwcnNSZXMgOjo9IFNFUVVFTkNFIHsKKwlleHRlbnNpb25Db250YWluZXIJCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCistLSBmYXVsdCByZWNvdmVyeSB0eXBlcworCitSZXNldEFyZyA6Oj0gU0VRVUVOQ0UgeworCWhsci1OdW1iZXIJSVNETi1BZGRyZXNzU3RyaW5nLAorCWhsci1MaXN0CQlITFItTGlzdAkJT1BUSU9OQUwsCisJLi4ufQorCitSZXN0b3JlRGF0YUFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlJTVNJLAorCWxtc2kJCQlMTVNJCQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCXZsci1DYXBhYmlsaXR5CVs2XSBWTFItQ2FwYWJpbGl0eQlPUFRJT05BTCB9CisKK1Jlc3RvcmVEYXRhUmVzIDo6PSBTRVFVRU5DRSB7CisJaGxyLU51bWJlcglJU0ROLUFkZHJlc3NTdHJpbmcsCisJbXNOb3RSZWFjaGFibGUJTlVMTAkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCistLSBWQlMvVkdDUyB0eXBlcworVkJTRGF0YUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mVkJTR3JvdXBJZHMpIE9GCisJCQkJVm9pY2VCcm9hZGNhc3REYXRhCisKK1ZHQ1NEYXRhTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZWR0NTR3JvdXBJZHMpIE9GCisJCQkJVm9pY2VHcm91cENhbGxEYXRhCisKK21heE51bU9mVkJTR3JvdXBJZHMgIElOVEVHRVIgOjo9IDUwCisKK21heE51bU9mVkdDU0dyb3VwSWRzICBJTlRFR0VSIDo6PSA1MAorCitWb2ljZUdyb3VwQ2FsbERhdGEgIDo6PSBTRVFVRU5DRSB7CisJZ3JvdXBJZAkJR3JvdXBJZCwgCisJLS0gZ3JvdXBJZCBzaGFsbCBiZSBmaWxsZWQgd2l0aCBzaXggVEJDRCBmaWxsZXJzICgxMTExKWlmIHRoZSBsb25nR3JvdXBJZCBpcyBwcmVzZW50ICAKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlhZGRpdGlvbmFsU3Vic2NyaXB0aW9ucwlBZGRpdGlvbmFsU3Vic2NyaXB0aW9ucwlPUFRJT05BTCwKKwlhZGRpdGlvbmFsSW5mbwlbMF0gQWRkaXRpb25hbEluZm8JT1BUSU9OQUwsCisJbG9uZ0dyb3VwSWQJWzFdIExvbmctR3JvdXBJZAlPUFRJT05BTCB9CisKKwktLSBWb2ljZUdyb3VwQ2FsbERhdGEgY29udGFpbmluZyBhIGxvbmdHcm91cElkIHNoYWxsIG5vdCBiZSBzZW50IHRvIFZMUnMgdGhhdCBkaWQgbm90CisJLS0gaW5kaWNhdGUgc3VwcG9ydCBvZiBsb25nIEdyb3VwIElEcyB3aXRoaW4gdGhlIFVwZGF0ZSBMb2NhdGlvbiBvciBSZXN0b3JlIERhdGEgCisJLS0gcmVxdWVzdCBtZXNzYWdlCisKK0FkZGl0aW9uYWxJbmZvIDo6PSBCSVQgU1RSSU5HIChTSVpFICgxLi4xMzYpKQorLS0JIFJlZmVycyB0byBBZGRpdGlvbmFsIEluZm8gYXMgc3BlY2lmaWVkIGluIDNHUFAgVFMgNDMuMDY4IAorCitBZGRpdGlvbmFsU3Vic2NyaXB0aW9ucyA6Oj0gQklUIFNUUklORyB7CisJcHJpdmlsZWdlZFVwbGlua1JlcXVlc3QgKDApLAorCWVtZXJnZW5jeVVwbGlua1JlcXVlc3QgKDEpLAorCWVtZXJnZW5jeVJlc2V0ICgyKX0gKFNJWkUgKDMuLjgpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK1ZvaWNlQnJvYWRjYXN0RGF0YSA6Oj0gU0VRVUVOQ0UgeworCWdyb3VwaWQJCUdyb3VwSWQsIAorCS0tIGdyb3VwSWQgc2hhbGwgYmUgZmlsbGVkIHdpdGggc2l4IFRCQ0QgZmlsbGVycyAoMTExMSlpZiB0aGUgbG9uZ0dyb3VwSWQgaXMgcHJlc2VudAorCWJyb2FkY2FzdEluaXRFbnRpdGxlbWVudAlOVUxMCQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJbG9uZ0dyb3VwSWQJWzBdIExvbmctR3JvdXBJZAlPUFRJT05BTCB9CisJCistLSBWb2ljZUJyb2FkY2FzdERhdGEgY29udGFpbmluZyBhIGxvbmdHcm91cElkIHNoYWxsIG5vdCBiZSBzZW50IHRvIFZMUnMgdGhhdCBkaWQgbm90CistLSBpbmRpY2F0ZSBzdXBwb3J0IG9mIGxvbmcgR3JvdXAgSURzIHdpdGhpbiB0aGUgVXBkYXRlIExvY2F0aW9uIG9yIFJlc3RvcmUgRGF0YSAKKwktLSByZXF1ZXN0IG1lc3NhZ2UKKworR3JvdXBJZCAgOjo9IFRCQ0QtU1RSSU5HIChTSVpFICgzKSkKKwktLSBXaGVuIEdyb3VwLUlkIGlzIGxlc3MgdGhhbiBzaXggY2hhcmFjdGVycyBpbiBsZW5ndGgsIHRoZSBUQkNEIGZpbGxlciAoMTExMSkKKwktLSBpcyB1c2VkIHRvIGZpbGwgdW51c2VkIGhhbGYgb2N0ZXRzLgorCS0tIFJlZmVycyB0byB0aGUgR3JvdXAgSWRlbnRpZmljYXRpb24gYXMgc3BlY2lmaWVkIGluIDNHUFAgVFMgMjMuMDAzIAorCS0tIGFuZCAzR1BQIFRTIDQzLjA2OC8gNDMuMDY5CisKK0xvbmctR3JvdXBJZCAgOjo9IFRCQ0QtU1RSSU5HIChTSVpFICg0KSkKKwktLSBXaGVuIExvbmctR3JvdXAtSWQgaXMgbGVzcyB0aGFuIGVpZ2h0IGNoYXJhY3RlcnMgaW4gbGVuZ3RoLCB0aGUgVEJDRCBmaWxsZXIgKDExMTEpCisJLS0gaXMgdXNlZCB0byBmaWxsIHVudXNlZCBoYWxmIG9jdGV0cy4KKwktLSBSZWZlcnMgdG8gdGhlIEdyb3VwIElkZW50aWZpY2F0aW9uIGFzIHNwZWNpZmllZCBpbiAzR1BQIFRTIDIzLjAwMyAKKwktLSBhbmQgM0dQUCBUUyA0My4wNjgvIDQzLjA2OQorCisKKy0tIHByb3ZpZGUgc3Vic2NyaWJlciBpbmZvIHR5cGVzCisKK1Byb3ZpZGVTdWJzY3JpYmVySW5mb0FyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCVswXSBJTVNJLAorCWxtc2kJCVsxXSBMTVNJCU9QVElPTkFMLAorCXJlcXVlc3RlZEluZm8JWzJdIFJlcXVlc3RlZEluZm8sCisJZXh0ZW5zaW9uQ29udGFpbmVyCVszXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWNhbGxQcmlvcml0eQlbNF0JRU1MUFAtUHJpb3JpdHkJT1BUSU9OQUwKKwl9CisKK1Byb3ZpZGVTdWJzY3JpYmVySW5mb1JlcyA6Oj0gU0VRVUVOQ0UgeworCXN1YnNjcmliZXJJbmZvCVN1YnNjcmliZXJJbmZvLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitTdWJzY3JpYmVySW5mbyA6Oj0gU0VRVUVOQ0UgeworCWxvY2F0aW9uSW5mb3JtYXRpb24JWzBdIExvY2F0aW9uSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJc3Vic2NyaWJlclN0YXRlCVsxXSBTdWJzY3JpYmVyU3RhdGUJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlsb2NhdGlvbkluZm9ybWF0aW9uR1BSUwlbM10gTG9jYXRpb25JbmZvcm1hdGlvbkdQUlMJT1BUSU9OQUwsCisJcHMtU3Vic2NyaWJlclN0YXRlCVs0XSBQUy1TdWJzY3JpYmVyU3RhdGUJT1BUSU9OQUwsCisJaW1laQkJCVs1XSBJTUVJCQlPUFRJT05BTCwKKwltcy1DbGFzc21hcmsyCVs2XSBNUy1DbGFzc21hcmsyCU9QVElPTkFMLAorCWdwcnMtTVMtQ2xhc3MJWzddIEdQUlNNU0NsYXNzCU9QVElPTkFMLAorCW1ucEluZm9SZXMJWzhdIE1OUEluZm9SZXMJT1BUSU9OQUwgfQorCistLQlJZiB0aGUgSExSIHJlY2VpdmVzIGxvY2F0aW9uSW5mb3JtYXRpb24sIHN1YnNjcmliZXJTdGF0ZSBvciBtcy1DbGFzc21hcmsyIGZyb20gYW4gU0dTTgorLS0JaXQgc2hhbGwgZGlzY2FyZCB0aGVtLgorLS0JSWYgdGhlIEhMUiByZWNlaXZlcyBsb2NhdGlvbkluZm9ybWF0aW9uR1BSUywgcHMtU3Vic2NyaWJlclN0YXRlIG9yIGdwcnMtTVMtQ2xhc3MgZnJvbQorLS0JYSBWTFIgaXQgc2hhbGwgZGlzY2FyZCB0aGVtLgorLS0JSWYgdGhlIEhMUiByZWNlaXZlcyBwYXJhbWV0ZXJzIHdoaWNoIGl0IGhhcyBub3QgcmVxdWVzdGVkLCBpdCBzaGFsbCBkaXNjYXJkIHRoZW0uCisKK01OUEluZm9SZXMgOjo9IFNFUVVFTkNFIHsKKwlyb3V0ZWluZ051bWJlcglbMF0gUm91dGVpbmdOdW1iZXIgCU9QVElPTkFMLAorCWltc2kJCQlbMV0gSU1TSQkJT1BUSU9OQUwsCisJbXNpc2RuCQlbMl0gSVNETi1BZGRyZXNzU3RyaW5nIAlPUFRJT05BTCwKKwludW1iZXJQb3J0YWJpbGl0eVN0YXR1cwlbM10gTnVtYmVyUG9ydGFiaWxpdHlTdGF0dXMJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs0XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uIH0KKy0tCVRoZSBJTVNJIHBhcmFtZXRlciBjb250YWlucyBhIGdlbmVyaWMgSU1TSSwgaS5lLiBpdCBpcyBub3QgdGllZCBuZWNlc3NhcmlseSB0byB0aGUgCistLQlTdWJzY3JpYmVyLiBNQ0MgYW5kIE1OQyB2YWx1ZXMgaW4gdGhpcyBJTVNJIHNoYWxsIHBvaW50IHRvIHRoZSBTdWJzY3JpcHRpb24gTmV0d29yayBvZiAKKy0tCXRoZSBTdWJzY3JpYmVyLiBTZWUgM0dQUCBUUyAyMy4wNjYgWzEwOF0uCisKK1JvdXRlaW5nTnVtYmVyIDo6PSBUQkNELVNUUklORyAoU0laRSAoMS4uNSkpCisKKworTnVtYmVyUG9ydGFiaWxpdHlTdGF0dXMgOjo9IEVOVU1FUkFURUQgeworCW5vdEtub3duVG9CZVBvcnRlZAkoMCksCisJb3duTnVtYmVyUG9ydGVkT3V0CSgxKSwKKwlmb3JlaWduTnVtYmVyUG9ydGVkVG9Gb3JlaWduTmV0d29yawkoMiksCisJLi4uLAorCW93bk51bWJlck5vdFBvcnRlZE91dAkoNCksCisJZm9yZWlnbk51bWJlclBvcnRlZEluCSg1KQorCX0KKwktLQlleGNlcHRpb24gaGFuZGxpbmc6IAorCS0tICByZWNlcHRpb24gb2Ygb3RoZXIgdmFsdWVzIHRoYW4gdGhlIG9uZXMgbGlzdGVkIHRoZSByZWNlaXZlciBzaGFsbCBpZ25vcmUgdGhlIAorCS0tICB3aG9sZSBOdW1iZXJQb3J0YWJpbGl0eVN0YXR1czsKKwktLSAgb3duTnVtYmVyTm90UG9ydGVkT3V0IG9yIGZvcmVpZ25OdW1iZXJQb3J0ZWRJbiBtYXkgb25seSBiZSBpbmNsdWRlZCBpbiBBbnkgVGltZSAKKwktLSAgSW50ZXJyb2dhdGlvbiBtZXNzYWdlLgorCitNUy1DbGFzc21hcmsyIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDMpKQorCS0tIFRoaXMgcGFyYW1ldGVyIGNhcnJpZXMgdGhlIHZhbHVlIHBhcnQgb2YgdGhlIE1TIENsYXNzbWFyayAyIElFIGRlZmluZWQgaW4gCisJLS0gM0dQUCBUUyAyNC4wMDggWzM1XS4KKworR1BSU01TQ2xhc3MgOjo9IFNFUVVFTkNFIHsKKwltU05ldHdvcmtDYXBhYmlsaXR5CVswXSBNU05ldHdvcmtDYXBhYmlsaXR5LAorCW1TUmFkaW9BY2Nlc3NDYXBhYmlsaXR5CVsxXSBNU1JhZGlvQWNjZXNzQ2FwYWJpbGl0eQlPUFRJT05BTAorCX0KKworTVNOZXR3b3JrQ2FwYWJpbGl0eSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi44KSkKKwktLSBUaGlzIHBhcmFtZXRlciBjYXJyaWVzIHRoZSB2YWx1ZSBwYXJ0IG9mIHRoZSBNUyBOZXR3b3JrIENhcGFiaWxpdHkgSUUgZGVmaW5lZCBpbiAKKwktLSAzR1BQIFRTIDI0LjAwOCBbMzVdLgorCQorTVNSYWRpb0FjY2Vzc0NhcGFiaWxpdHkgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMS4uNTApKQorCS0tIFRoaXMgcGFyYW1ldGVyIGNhcnJpZXMgdGhlIHZhbHVlIHBhcnQgb2YgdGhlIE1TIFJhZGlvIEFjY2VzcyBDYXBhYmlsaXR5IElFIGRlZmluZWQgaW4KKwktLSAzR1BQIFRTIDI0LjAwOCBbMzVdLgorCitSZXF1ZXN0ZWRJbmZvIDo6PSBTRVFVRU5DRSB7CisJbG9jYXRpb25JbmZvcm1hdGlvbglbMF0gTlVMTAkJT1BUSU9OQUwsCisJc3Vic2NyaWJlclN0YXRlCVsxXSBOVUxMCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzJdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sIAorCWN1cnJlbnRMb2NhdGlvbglbM10gTlVMTAkJT1BUSU9OQUwsCisJcmVxdWVzdGVkRG9tYWluCVs0XSBEb21haW5UeXBlCU9QVElPTkFMLAorCWltZWkJCQlbNl0gTlVMTAkJT1BUSU9OQUwsCisJbXMtY2xhc3NtYXJrCVs1XSBOVUxMCQlPUFRJT05BTCwKKwltbnBSZXF1ZXN0ZWRJbmZvCVs3XSBOVUxMIAkJT1BUSU9OQUwgfQorCistLQljdXJyZW50TG9jYXRpb24gc2hhbGwgYmUgYWJzZW50IGlmIGxvY2F0aW9uSW5mb3JtYXRpb24gaXMgYWJzZW50CisKK0RvbWFpblR5cGUgOjo9ICBFTlVNRVJBVEVEIHsKKwljcy1Eb21haW4JCSgwKSwKKwlwcy1Eb21haW4JCSgxKSwKKwkuLi59CistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSByZWNlcHRpb24gb2YgdmFsdWVzID4gMSBzaGFsbCBiZSBtYXBwZWQgdG8gJ2NzLURvbWFpbicKKworTG9jYXRpb25JbmZvcm1hdGlvbiA6Oj0gU0VRVUVOQ0UgeworCWFnZU9mTG9jYXRpb25JbmZvcm1hdGlvbglBZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJZ2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24JWzBdIEdlb2dyYXBoaWNhbEluZm9ybWF0aW9uCU9QVElPTkFMLAorCXZsci1udW1iZXIJWzFdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlsb2NhdGlvbk51bWJlcglbMl0gTG9jYXRpb25OdW1iZXIJT1BUSU9OQUwsCisJY2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUkJWzNdIENlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiAsCisJc2VsZWN0ZWRMU0EtSWQJWzVdIExTQUlkZW50aXR5CU9QVElPTkFMLAorCW1zYy1OdW1iZXIJWzZdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlnZW9kZXRpY0luZm9ybWF0aW9uCVs3XSBHZW9kZXRpY0luZm9ybWF0aW9uCU9QVElPTkFMLCAKKwljdXJyZW50TG9jYXRpb25SZXRyaWV2ZWQJWzhdIE5VTEwJCU9QVElPTkFMLAorCXNhaS1QcmVzZW50CVs5XSBOVUxMCQlPUFRJT05BTCB9CistLSBzYWktUHJlc2VudCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUkgcGFyYW1ldGVyIGNvbnRhaW5zCistLSBhIFNlcnZpY2UgQXJlYSBJZGVudGl0eS4KKy0tIGN1cnJlbnRMb2NhdGlvblJldHJpZXZlZCBzaGFsbCBiZSBwcmVzZW50IAorLS0gaWYgdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uIHdlcmUgcmV0cmlldmVkIGFmdGVyIGEgc3VjY2Vzc2Z1bGwgcGFnaW5nLgorCitMb2NhdGlvbkluZm9ybWF0aW9uR1BSUyA6Oj0gU0VRVUVOQ0UgeworCWNlbGxHbG9iYWxJZE9yU2VydmljZUFyZWFJZE9yTEFJCVswXSBDZWxsR2xvYmFsSWRPclNlcnZpY2VBcmVhSWRPckxBSSBPUFRJT05BTCwKKwlyb3V0ZWluZ0FyZWFJZGVudGl0eQlbMV0gUkFJZGVudGl0eQlPUFRJT05BTCwKKwlnZW9ncmFwaGljYWxJbmZvcm1hdGlvbglbMl0gR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJc2dzbi1OdW1iZXIJWzNdIElTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlzZWxlY3RlZExTQUlkZW50aXR5CVs0XSBMU0FJZGVudGl0eQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzVdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJc2FpLVByZXNlbnQJWzZdIE5VTEwJCU9QVElPTkFMLAorCWdlb2RldGljSW5mb3JtYXRpb24JWzddIEdlb2RldGljSW5mb3JtYXRpb24JT1BUSU9OQUwsCisJY3VycmVudExvY2F0aW9uUmV0cmlldmVkCVs4XSBOVUxMCQlPUFRJT05BTCwKKwlhZ2VPZkxvY2F0aW9uSW5mb3JtYXRpb24JWzldIEFnZU9mTG9jYXRpb25JbmZvcm1hdGlvbglPUFRJT05BTCB9CistLSBzYWktUHJlc2VudCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2VsbEdsb2JhbElkT3JTZXJ2aWNlQXJlYUlkT3JMQUkgcGFyYW1ldGVyIGNvbnRhaW5zCistLSBhIFNlcnZpY2UgQXJlYSBJZGVudGl0eS4KKy0tIGN1cnJlbnRMb2NhdGlvblJldHJpZXZlZCBzaGFsbCBiZSBwcmVzZW50IGlmIHRoZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorLS0gd2FzIHJldHJpZXZlZCBhZnRlciBzdWNjZXNzZnVsIHBhZ2luZy4KKworUkFJZGVudGl0eSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg2KSkKKy0tIFJvdXRpbmcgQXJlYSBJZGVudGl0eSBpcyBjb2RlZCBpbiBhY2NvcmRhbmNlIHdpdGggM0dQUCBUUyAyOS4wNjAgWzEwNV0uCistLSBJdCBzaGFsbCBjb250YWluIHRoZSB2YWx1ZSBwYXJ0IGRlZmluZWQgaW4gM0dQUCBUUyAyOS4wNjAgb25seS4gSS5lLiB0aGUgM0dQUCBUUyAyOS4wNjAKKy0tIHR5cGUgaWRlbnRpZmllciBvY3RldCBzaGFsbCBub3QgYmUgaW5jbHVkZWQuCisKKworR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoOCkpCistLQlSZWZlcnMgdG8gZ2VvZ3JhcGhpY2FsIEluZm9ybWF0aW9uIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wMzIuCistLQlPbmx5IHRoZSBkZXNjcmlwdGlvbiBvZiBhbiBlbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBjaXJjbGUKKy0tCWFzIHNwZWNpZmllZCBpbiAzR1BQIFRTIDIzLjAzMiBpcyBhbGxvd2VkIHRvIGJlIHVzZWQKKy0tCVRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgYWNjb3JkaW5nIHRvIDNHUFAgVFMgMjMuMDMyIGlzIGFzIGZvbGxvd3M6CistLQkJVHlwZSBvZiBzaGFwZSAoZWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgY2lyY2xlKQkxIG9jdGV0CistLQkJRGVncmVlcyBvZiBMYXRpdHVkZQkJCQkzIG9jdGV0cworLS0JCURlZ3JlZXMgb2YgTG9uZ2l0dWRlCQkJCTMgb2N0ZXRzCistLQkJVW5jZXJ0YWludHkgY29kZQkJCQkxIG9jdGV0CisKK0dlb2RldGljSW5mb3JtYXRpb24gOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMTApKQorLS0JUmVmZXJzIHRvIENhbGxpbmcgR2VvZGV0aWMgTG9jYXRpb24gZGVmaW5lZCBpbiBRLjc2MyAoMTk5OSkuCistLQlPbmx5IHRoZSBkZXNjcmlwdGlvbiBvZiBhbiBlbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBjaXJjbGUKKy0tCWFzIHNwZWNpZmllZCBpbiBRLjc2MyAoMTk5OSkgaXMgYWxsb3dlZCB0byBiZSB1c2VkCistLQlUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGFjY29yZGluZyB0byBRLjc2MyAoMTk5OSkgaXMgYXMgZm9sbG93czoKKy0tCQlTY3JlZW5pbmcgYW5kIHByZXNlbnRhdGlvbiBpbmRpY2F0b3JzCQkxIG9jdGV0CistLQkJVHlwZSBvZiBzaGFwZSAoZWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgY2lyY2xlKQkxIG9jdGV0CistLQkJRGVncmVlcyBvZiBMYXRpdHVkZQkJCQkzIG9jdGV0cworLS0JCURlZ3JlZXMgb2YgTG9uZ2l0dWRlCQkJCTMgb2N0ZXRzCistLQkJVW5jZXJ0YWludHkgY29kZQkJCQkxIG9jdGV0CistLQkJQ29uZmlkZW5jZQkJCQkxIG9jdGV0CisKK0xvY2F0aW9uTnVtYmVyIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDIuLjEwKSkKKwktLSB0aGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgaW4gSVRVLVQgUmVjIFEuNzYzCisKK1N1YnNjcmliZXJTdGF0ZSA6Oj0gQ0hPSUNFIHsKKwlhc3N1bWVkSWRsZQlbMF0gTlVMTCwKKwljYW1lbEJ1c3kJCVsxXSBOVUxMLAorCW5ldERldE5vdFJlYWNoYWJsZQlOb3RSZWFjaGFibGVSZWFzb24sCisJbm90UHJvdmlkZWRGcm9tVkxSCVsyXSBOVUxMfQorCitQUy1TdWJzY3JpYmVyU3RhdGUgOjo9IENIT0lDRSB7CisJbm90UHJvdmlkZWRGcm9tU0dTTglbMF0gTlVMTCwKKwlwcy1EZXRhY2hlZAlbMV0gTlVMTCwKKwlwcy1BdHRhY2hlZE5vdFJlYWNoYWJsZUZvclBhZ2luZwlbMl0gTlVMTCwKKwlwcy1BdHRhY2hlZFJlYWNoYWJsZUZvclBhZ2luZwlbM10gTlVMTCwKKwlwcy1QRFAtQWN0aXZlTm90UmVhY2hhYmxlRm9yUGFnaW5nCVs0XSBQRFAtQ29udGV4dEluZm9MaXN0LAorCXBzLVBEUC1BY3RpdmVSZWFjaGFibGVGb3JQYWdpbmcJWzVdIFBEUC1Db250ZXh0SW5mb0xpc3QsCisJbmV0RGV0Tm90UmVhY2hhYmxlCU5vdFJlYWNoYWJsZVJlYXNvbiB9CisKK1BEUC1Db250ZXh0SW5mb0xpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mUERQLUNvbnRleHRzKSBPRgorCQkJCVBEUC1Db250ZXh0SW5mbworCitQRFAtQ29udGV4dEluZm8gOjo9IFNFUVVFTkNFIHsKKwlwZHAtQ29udGV4dElkZW50aWZpZXIJWzBdIENvbnRleHRJZCwKKwlwZHAtQ29udGV4dEFjdGl2ZQlbMV0gTlVMTAkJT1BUSU9OQUwsCisJcGRwLVR5cGUJCVsyXSBQRFAtVHlwZSwKKwlwZHAtQWRkcmVzcwlbM10gUERQLUFkZHJlc3MJT1BUSU9OQUwsCisJYXBuLVN1YnNjcmliZWQJWzRdIEFQTgkJT1BUSU9OQUwsCisJYXBuLUluVXNlCQlbNV0gQVBOCQlPUFRJT05BTCwKKwluc2FwaQkJWzZdIE5TQVBJCQlPUFRJT05BTCwKKwl0cmFuc2FjdGlvbklkCVs3XSBUcmFuc2FjdGlvbklkCU9QVElPTkFMLAorCXRlaWQtRm9yR25BbmRHcAlbOF0gVEVJRAkJT1BUSU9OQUwsCisJdGVpZC1Gb3JJdQlbOV0gVEVJRAkJT1BUSU9OQUwsCisJZ2dzbi1BZGRyZXNzCVsxMF0gR1NOLUFkZHJlc3MgCU9QVElPTkFMLAorCXFvcy1TdWJzY3JpYmVkCVsxMV0gRXh0LVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMLAorCXFvcy1SZXF1ZXN0ZWQJWzEyXSBFeHQtUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwsCisJcW9zLU5lZ290aWF0ZWQJWzEzXSBFeHQtUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwsCisJY2hhcmdpbmdJZAlbMTRdIEdQUlNDaGFyZ2luZ0lECU9QVElPTkFMLAorCWNoYXJnaW5nQ2hhcmFjdGVyaXN0aWNzCVsxNV0gQ2hhcmdpbmdDaGFyYWN0ZXJpc3RpY3MJT1BUSU9OQUwsCisJcm5jLUFkZHJlc3MJWzE2XSBHU04tQWRkcmVzcwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzE3XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCXFvczItU3Vic2NyaWJlZAlbMThdIEV4dDItUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwsCisJLS0gcW9zMi1TdWJzY3JpYmVkIG1heSBiZSBwcmVzZW50IG9ubHkgaWYgcW9zLVN1YnNjcmliZWQgaXMgcHJlc2VudC4KKwlxb3MyLVJlcXVlc3RlZAlbMTldIEV4dDItUW9TLVN1YnNjcmliZWQJT1BUSU9OQUwsCisJLS0gcW9zMi1SZXF1ZXN0ZWQgbWF5IGJlIHByZXNlbnQgb25seSBpZiBxb3MtUmVxdWVzdGVkIGlzIHByZXNlbnQuCisJcW9zMi1OZWdvdGlhdGVkCVsyMF0gRXh0Mi1Rb1MtU3Vic2NyaWJlZAlPUFRJT05BTCwKKwktLSBxb3MyLU5lZ290aWF0ZWQgbWF5IGJlIHByZXNlbnQgb25seSBpZiBxb3MtTmVnb3RpYXRlZCBpcyBwcmVzZW50LgorCQlxb3MzLVN1YnNjcmliZWQJWzIxXSBFeHQzLVFvUy1TdWJzY3JpYmVkCU9QVElPTkFMLAorCS0tIHFvczMtU3Vic2NyaWJlZCBtYXkgYmUgcHJlc2VudCBvbmx5IGlmIHFvczItU3Vic2NyaWJlZCBpcyBwcmVzZW50LgorCXFvczMtUmVxdWVzdGVkCVsyMl0gRXh0My1Rb1MtU3Vic2NyaWJlZAlPUFRJT05BTCwKKwktLSBxb3MzLVJlcXVlc3RlZCBtYXkgYmUgcHJlc2VudCBvbmx5IGlmIHFvczItUmVxdWVzdGVkIGlzIHByZXNlbnQuCisJcW9zMy1OZWdvdGlhdGVkCVsyM10gRXh0My1Rb1MtU3Vic2NyaWJlZAlPUFRJT05BTAorCS0tIHFvczMtTmVnb3RpYXRlZCBtYXkgYmUgcHJlc2VudCBvbmx5IGlmIHFvczItTmVnb3RpYXRlZCBpcyBwcmVzZW50LgorfQorCitOU0FQSSA6Oj0gSU5URUdFUiAoMC4uMTUpCistLQlUaGlzIHR5cGUgaXMgdXNlZCB0byBpbmRpY2F0ZSB0aGUgTmV0d29yayBsYXllciBTZXJ2aWNlIEFjY2VzcyBQb2ludAorCitUcmFuc2FjdGlvbklkIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjIpKQorLS0JVGhpcyB0eXBlIGNhcnJpZXMgdGhlIHZhbHVlIHBhcnQgb2YgdGhlIHRyYW5zYWN0aW9uIGlkZW50aWZpZXIgd2hpY2ggaXMgdXNlZCBpbiB0aGUgCistLQlzZXNzaW9uIG1hbmFnZW1lbnQgbWVzc2FnZXMgb24gdGhlIGFjY2VzcyBpbnRlcmZhY2UuIFRoZSBlbmNvZGluZyBpcyBkZWZpbmVkIGluIAorLS0JM0dQUCBUUyAyNC4wMDgKKworVEVJRCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg0KSkKKy0tCVRoaXMgdHlwZSBjYXJyaWVzIHRoZSB2YWx1ZSBwYXJ0IG9mIHRoZSBUdW5uZWwgRW5kcG9pbnQgSWRlbnRpZmllciB3aGljaCBpcyB1c2VkIHRvIAorLS0JZGlzdGluZ3Vpc2ggYmV0d2VlbiBkaWZmZXJlbnQgdHVubmVscyBiZXR3ZWVuIHRoZSBzYW1lIHBhaXIgb2YgZW50aXRpZXMgd2hpY2ggY29tbXVuaWNhdGUgCistLQl1c2luZyB0aGUgR1BSUyBUdW5uZWxsaW5nIFByb3RvY29sIFRoZSBlbmNvZGluZyBpcyBkZWZpbmVkIGluIDNHUFAgVFMgMjkuMDYwLgorCitHUFJTQ2hhcmdpbmdJRCA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICg0KSkKKy0tCVRoZSBDaGFyZ2luZyBJRCBpcyBhIHVuaXF1ZSBmb3VyIG9jdGV0IHZhbHVlIGdlbmVyYXRlZCBieSB0aGUgR0dTTiB3aGVuIAorLS0JYSBQRFAgQ29udGV4dCBpcyBhY3RpdmF0ZWQuIEEgQ2hhcmdpbmcgSUQgaXMgZ2VuZXJhdGVkIGZvciBlYWNoIGFjdGl2YXRlZCBjb250ZXh0LgorLS0JVGhlIGVuY29kaW5nIGlzIGRlZmluZWQgaW4gM0dQUCBUUyAyOS4wNjAuCisKK05vdFJlYWNoYWJsZVJlYXNvbiA6Oj0gRU5VTUVSQVRFRCB7CisJbXNQdXJnZWQgKDApLAorCWltc2lEZXRhY2hlZCAoMSksCisJcmVzdHJpY3RlZEFyZWEgKDIpLAorCW5vdFJlZ2lzdGVyZWQgKDMpfQorCistLSBhbnkgdGltZSBpbnRlcnJvZ2F0aW9uIGluZm8gdHlwZXMKKworQW55VGltZUludGVycm9nYXRpb25BcmcgOjo9IFNFUVVFTkNFIHsKKwlzdWJzY3JpYmVySWRlbnRpdHkJWzBdIFN1YnNjcmliZXJJZGVudGl0eSwKKwlyZXF1ZXN0ZWRJbmZvCVsxXSBSZXF1ZXN0ZWRJbmZvLAorCWdzbVNDRi1BZGRyZXNzCVszXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitBbnlUaW1lSW50ZXJyb2dhdGlvblJlcyA6Oj0gU0VRVUVOQ0UgeworCXN1YnNjcmliZXJJbmZvCVN1YnNjcmliZXJJbmZvLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCistLSBhbnkgdGltZSBpbmZvcm1hdGlvbiBoYW5kbGluZyB0eXBlcworCitBbnlUaW1lU3Vic2NyaXB0aW9uSW50ZXJyb2dhdGlvbkFyZyA6Oj0gU0VRVUVOQ0UgeworCXN1YnNjcmliZXJJZGVudGl0eQlbMF0gU3Vic2NyaWJlcklkZW50aXR5LAorCXJlcXVlc3RlZFN1YnNjcmlwdGlvbkluZm8JWzFdIFJlcXVlc3RlZFN1YnNjcmlwdGlvbkluZm8sCisJZ3NtU0NGLUFkZHJlc3MJWzJdIElTRE4tQWRkcmVzc1N0cmluZywKKwlleHRlbnNpb25Db250YWluZXIJWzNdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwlsb25nRlROLVN1cHBvcnRlZAlbNF0JTlVMTAkJT1BUSU9OQUwsCisJLi4ufQorCitBbnlUaW1lU3Vic2NyaXB0aW9uSW50ZXJyb2dhdGlvblJlcyA6Oj0gU0VRVUVOQ0UgeworCWNhbGxGb3J3YXJkaW5nRGF0YQlbMV0gQ2FsbEZvcndhcmRpbmdEYXRhCU9QVElPTkFMLAorCWNhbGxCYXJyaW5nRGF0YQlbMl0gQ2FsbEJhcnJpbmdEYXRhCU9QVElPTkFMLAorCW9kYi1JbmZvCQlbM10gT0RCLUluZm8JT1BUSU9OQUwsCisJY2FtZWwtU3Vic2NyaXB0aW9uSW5mbwlbNF0gQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbwlPUFRJT05BTCwKKwlzdXBwb3J0ZWRWTFItQ0FNRUwtUGhhc2VzCVs1XSBTdXBwb3J0ZWRDYW1lbFBoYXNlcwlPUFRJT05BTCwKKwlzdXBwb3J0ZWRTR1NOLUNBTUVMLVBoYXNlcwlbNl0gU3VwcG9ydGVkQ2FtZWxQaGFzZXMJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs3XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlvZmZlcmVkQ2FtZWw0Q1NJc0luVkxSCVs4XSBPZmZlcmVkQ2FtZWw0Q1NJcwlPUFRJT05BTCwKKwlvZmZlcmVkQ2FtZWw0Q1NJc0luU0dTTglbOV0gT2ZmZXJlZENhbWVsNENTSXMJT1BUSU9OQUwsCisJbXNpc2RuLUJTLUxpc3QJWzEwXSBNU0lTRE4tQlMtTGlzdAlPUFRJT05BTCB9CisKK1JlcXVlc3RlZFN1YnNjcmlwdGlvbkluZm8gOjo9IFNFUVVFTkNFIHsKKwlyZXF1ZXN0ZWRTUy1JbmZvCVsxXSBTUy1Gb3JCUy1Db2RlCU9QVElPTkFMLAorCW9kYgkJCVsyXSBOVUxMCQlPUFRJT05BTCwKKwlyZXF1ZXN0ZWRDQU1FTC1TdWJzY3JpcHRpb25JbmZvCVszXSBSZXF1ZXN0ZWRDQU1FTC1TdWJzY3JpcHRpb25JbmZvCQlPUFRJT05BTCwKKwlzdXBwb3J0ZWRWTFItQ0FNRUwtUGhhc2VzCVs0XSBOVUxMCQlPUFRJT05BTCwKKwlzdXBwb3J0ZWRTR1NOLUNBTUVMLVBoYXNlcwlbNV0gTlVMTAkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVs2XSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWFkZGl0aW9uYWxSZXF1ZXN0ZWRDQU1FTC1TdWJzY3JpcHRpb25JbmZvCisJCQkJWzddIEFkZGl0aW9uYWxSZXF1ZXN0ZWRDQU1FTC1TdWJzY3JpcHRpb25JbmZvCisJCQkJCQkJT1BUSU9OQUwsCisJbXNpc2RuLUJTLUxpc3QJWzhdIE5VTEwJCU9QVElPTkFMIH0KKworTVNJU0ROLUJTLUxpc3QgOjo9IFNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mTVNJU0ROKSBPRgorCQkJCU1TSVNETi1CUworCittYXhOdW1PZk1TSVNETiAgSU5URUdFUiA6Oj0gNTAKKworCitNU0lTRE4tQlMgOjo9IFNFUVVFTkNFIHsKKwltc2lzZG4JCQlJU0ROLUFkZHJlc3NTdHJpbmcsCQorCWJhc2ljU2VydmljZUxpc3QJWzBdCUJhc2ljU2VydmljZUxpc3QJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsxXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitSZXF1ZXN0ZWRDQU1FTC1TdWJzY3JpcHRpb25JbmZvIDo6PSBFTlVNRVJBVEVEIHsKKwlvLUNTSQkJKDApLAorCXQtQ1NJCQkoMSksCisJdnQtQ1NJCQkoMiksCisJdGlmLUNTSQkJKDMpLAorCWdwcnMtQ1NJCQkoNCksCisJbW8tc21zLUNTSQkoNSksCisJc3MtQ1NJCQkoNiksCisJbS1DU0kJCSg3KSwKKwlkLWNzaQkJKDgpfQorCitBZGRpdGlvbmFsUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbyA6Oj0gRU5VTUVSQVRFRCB7CisJbXQtc21zLUNTSQkoMCksCisJbWctY3NpCQkoMSksCisJby1JTS1DU0kgCQkoMiksCisJZC1JTS1DU0kJCSgzKSwKKwl2dC1JTS1DU0kJIAkoNCksCisJLi4ufQorLS0JZXhjZXB0aW9uIGhhbmRsaW5nOiB1bmtub3duIHZhbHVlcyBzaGFsbCBiZSBkaXNjYXJkZWQgYnkgdGhlIHJlY2VpdmVyLgorCitDYWxsRm9yd2FyZGluZ0RhdGEgOjo9IFNFUVVFTkNFIHsKKwlmb3J3YXJkaW5nRmVhdHVyZUxpc3QJRXh0LUZvcndGZWF0dXJlTGlzdCwKKwlub3RpZmljYXRpb25Ub0NTRQlOVUxMCQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitDYWxsQmFycmluZ0RhdGEgOjo9IFNFUVVFTkNFIHsKKwljYWxsQmFycmluZ0ZlYXR1cmVMaXN0CUV4dC1DYWxsQmFyRmVhdHVyZUxpc3QsCisJcGFzc3dvcmQJCVBhc3N3b3JkCQlPUFRJT05BTCwKKwl3cm9uZ1Bhc3N3b3JkQXR0ZW1wdHNDb3VudGVyCVdyb25nUGFzc3dvcmRBdHRlbXB0c0NvdW50ZXIJT1BUSU9OQUwsCisJbm90aWZpY2F0aW9uVG9DU0UJTlVMTAkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitXcm9uZ1Bhc3N3b3JkQXR0ZW1wdHNDb3VudGVyIDo6PSBJTlRFR0VSICgwLi40KQorCitPREItSW5mbyA6Oj0gU0VRVUVOQ0UgeworCW9kYi1EYXRhCQlPREItRGF0YSwKKwlub3RpZmljYXRpb25Ub0NTRQlOVUxMCQkJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0NBTUVMLVN1YnNjcmlwdGlvbkluZm8gOjo9IFNFUVVFTkNFIHsKKwlvLUNTSQkJWzBdCU8tQ1NJCU9QVElPTkFMLAorCW8tQmNzbUNhbWVsVERQLUNyaXRlcmlhTGlzdAlbMV0JTy1CY3NtQ2FtZWxURFBDcml0ZXJpYUxpc3QJT1BUSU9OQUwsIAorCWQtQ1NJCQlbMl0JRC1DU0kJT1BUSU9OQUwsCisJdC1DU0kJCVszXQlULUNTSQlPUFRJT05BTCwKKwl0LUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhTGlzdAlbNF0JVC1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QJT1BUSU9OQUwsCisJdnQtQ1NJCQlbNV0JVC1DU0kJT1BUSU9OQUwsCisJdnQtQkNTTS1DQU1FTC1URFAtQ3JpdGVyaWFMaXN0CVs2XQlULUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhTGlzdAlPUFRJT05BTCwKKwl0aWYtQ1NJCQlbN10JTlVMTAkJT1BUSU9OQUwsCisJdGlmLUNTSS1Ob3RpZmljYXRpb25Ub0NTRQlbOF0JTlVMTAkJT1BUSU9OQUwsCisJZ3Bycy1DU0kJCVs5XQlHUFJTLUNTSQlPUFRJT05BTCwKKwltby1zbXMtQ1NJCVsxMF0JU01TLUNTSQlPUFRJT05BTCwKKwlzcy1DU0kJCVsxMV0JU1MtQ1NJCU9QVElPTkFMLAorCW0tQ1NJCQlbMTJdCU0tQ1NJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMTNdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJc3BlY2lmaWNDU0lEZWxldGVkTGlzdAlbMTRdCVNwZWNpZmljQ1NJLVdpdGhkcmF3CU9QVElPTkFMLAorCW10LXNtcy1DU0kJWzE1XQlTTVMtQ1NJCU9QVElPTkFMLAorCW10LXNtc0NBTUVMVERQLUNyaXRlcmlhTGlzdAlbMTZdCU1ULXNtc0NBTUVMVERQLUNyaXRlcmlhTGlzdAlPUFRJT05BTCwKKwltZy1jc2kJCVsxN10JTUctQ1NJCU9QVElPTkFMLAorCW8tSU0tQ1NJCQlbMThdIE8tQ1NJCU9QVElPTkFMLAorCW8tSU0tQmNzbUNhbWVsVERQLUNyaXRlcmlhTGlzdAlbMTldIE8tQmNzbUNhbWVsVERQQ3JpdGVyaWFMaXN0CU9QVElPTkFMLAorCWQtSU0tQ1NJCQlbMjBdIEQtQ1NJCU9QVElPTkFMLAorCXZ0LUlNLUNTSQkJWzIxXSBULUNTSQlPUFRJT05BTCwKKwl2dC1JTS1CQ1NNLUNBTUVMLVREUC1Dcml0ZXJpYUxpc3QJWzIyXQlULUJDU00tQ0FNRUwtVERQLUNyaXRlcmlhTGlzdAlPUFRJT05BTAorCX0KKworQW55VGltZU1vZGlmaWNhdGlvbkFyZyA6Oj0gU0VRVUVOQ0UgeworCXN1YnNjcmliZXJJZGVudGl0eQlbMF0JU3Vic2NyaWJlcklkZW50aXR5LAorCWdzbVNDRi1BZGRyZXNzCVsxXQlJU0ROLUFkZHJlc3NTdHJpbmcsCisJbW9kaWZpY2F0aW9uUmVxdWVzdEZvci1DRi1JbmZvCVsyXQlNb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUNGLUluZm8gT1BUSU9OQUwsCisJbW9kaWZpY2F0aW9uUmVxdWVzdEZvci1DQi1JbmZvCVszXQlNb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUNCLUluZm8gT1BUSU9OQUwsCisJbW9kaWZpY2F0aW9uUmVxdWVzdEZvci1DU0kJWzRdCU1vZGlmaWNhdGlvblJlcXVlc3RGb3ItQ1NJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNV0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCWxvbmdGVE4tU3VwcG9ydGVkCVs2XQlOVUxMCQlPUFRJT05BTCwKKwkuLi4sCisJbW9kaWZpY2F0aW9uUmVxdWVzdEZvci1PREItZGF0YQlbN10JTW9kaWZpY2F0aW9uUmVxdWVzdEZvci1PREItZGF0YSBPUFRJT05BTCwKKwltb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUlQLVNNLUdXLURhdGEJWzhdCU1vZGlmaWNhdGlvblJlcXVlc3RGb3ItSVAtU00tR1ctRGF0YSBPUFRJT05BTCB9CisKK0FueVRpbWVNb2RpZmljYXRpb25SZXMgOjo9IFNFUVVFTkNFIHsKKwlzcy1JbmZvRm9yLUNTRQlbMF0JRXh0LVNTLUluZm9Gb3ItQ1NFCU9QVElPTkFMLAorCWNhbWVsLVN1YnNjcmlwdGlvbkluZm8JWzFdCUNBTUVMLVN1YnNjcmlwdGlvbkluZm8JT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXQlFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCW9kYi1JbmZvCQlbM10JT0RCLUluZm8JT1BUSU9OQUwgfQorCitNb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUNGLUluZm8gOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlbMF0JU1MtQ29kZSwKKwliYXNpY1NlcnZpY2UJWzFdCUV4dC1CYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAorCXNzLVN0YXR1cwkJWzJdCUV4dC1TUy1TdGF0dXMJT1BUSU9OQUwsCisJZm9yd2FyZGVkVG9OdW1iZXIJWzNdCUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJZm9yd2FyZGVkVG9TdWJhZGRyZXNzCVs0XQlJU0ROLVN1YmFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJbm9SZXBseUNvbmRpdGlvblRpbWUJWzVdCUV4dC1Ob1JlcENvbmRUaW1lCU9QVElPTkFMLAorCW1vZGlmeU5vdGlmaWNhdGlvblRvQ1NFCVs2XQlNb2RpZmljYXRpb25JbnN0cnVjdGlvbglPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzddCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK01vZGlmaWNhdGlvblJlcXVlc3RGb3ItQ0ItSW5mbyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVswXQlTUy1Db2RlLAorCWJhc2ljU2VydmljZQlbMV0JRXh0LUJhc2ljU2VydmljZUNvZGUJT1BUSU9OQUwsCisJc3MtU3RhdHVzCQlbMl0JRXh0LVNTLVN0YXR1cwlPUFRJT05BTCwKKwlwYXNzd29yZAkJWzNdCVBhc3N3b3JkCU9QVElPTkFMLAorCXdyb25nUGFzc3dvcmRBdHRlbXB0c0NvdW50ZXIJWzRdCVdyb25nUGFzc3dvcmRBdHRlbXB0c0NvdW50ZXIJT1BUSU9OQUwsCisJbW9kaWZ5Tm90aWZpY2F0aW9uVG9DU0UJWzVdCU1vZGlmaWNhdGlvbkluc3RydWN0aW9uCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNl0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTW9kaWZpY2F0aW9uUmVxdWVzdEZvci1PREItZGF0YSA6Oj0gU0VRVUVOQ0UgeworCW9kYi1kYXRhCQlbMF0JT0RCLURhdGEJT1BUSU9OQUwsCisJbW9kaWZ5Tm90aWZpY2F0aW9uVG9DU0UJWzFdCU1vZGlmaWNhdGlvbkluc3RydWN0aW9uCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTW9kaWZpY2F0aW9uUmVxdWVzdEZvci1DU0kgOjo9IFNFUVVFTkNFIHsKKwlyZXF1ZXN0ZWRDYW1lbC1TdWJzY3JpcHRpb25JbmZvCVswXQlSZXF1ZXN0ZWRDQU1FTC1TdWJzY3JpcHRpb25JbmZvLAorCW1vZGlmeU5vdGlmaWNhdGlvblRvQ1NFCVsxXQlNb2RpZmljYXRpb25JbnN0cnVjdGlvbglPUFRJT05BTCwKKwltb2RpZnlDU0ktU3RhdGUJWzJdCU1vZGlmaWNhdGlvbkluc3RydWN0aW9uCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbM10JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlhZGRpdGlvbmFsUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbworCQkJCVs0XSBBZGRpdGlvbmFsUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbworCQkJCQkJCU9QVElPTkFMIH0KKy0tIHJlcXVlc3RlZENhbWVsLVN1YnNjcmlwdGlvbkluZm8gc2hhbGwgYmUgZGlzY2FyZGVkIGlmCistLSBhZGRpdGlvbmFsUmVxdWVzdGVkQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbyBpcyByZWNlaXZlZAorCitNb2RpZmljYXRpb25SZXF1ZXN0Rm9yLUlQLVNNLUdXLURhdGEgOjo9IFNFUVVFTkNFIHsKKwltb2RpZnlSZWdpc3RyYXRpb25TdGF0dXMJWzBdCU1vZGlmaWNhdGlvbkluc3RydWN0aW9uCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0JRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTW9kaWZpY2F0aW9uSW5zdHJ1Y3Rpb24gOjo9IEVOVU1FUkFURUQgeworCWRlYWN0aXZhdGUJKDApLAorCWFjdGl2YXRlCQkoMSl9CisKKy0tIHN1YnNjcmliZXIgZGF0YSBtb2RpZmljYXRpb24gbm90aWZpY2F0aW9uIHR5cGVzCisKK05vdGVTdWJzY3JpYmVyRGF0YU1vZGlmaWVkQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCUlNU0ksCisJbXNpc2RuCQlJU0ROLUFkZHJlc3NTdHJpbmcsCisJZm9yd2FyZGluZ0luZm9Gb3ItQ1NFCVswXSBFeHQtRm9yd2FyZGluZ0luZm9Gb3ItQ1NFCU9QVElPTkFMLAorCWNhbGxCYXJyaW5nSW5mb0Zvci1DU0UJWzFdIEV4dC1DYWxsQmFycmluZ0luZm9Gb3ItQ1NFCU9QVElPTkFMLAorCW9kYi1JbmZvCQlbMl0gT0RCLUluZm8JT1BUSU9OQUwsCisJY2FtZWwtU3Vic2NyaXB0aW9uSW5mbwlbM10gQ0FNRUwtU3Vic2NyaXB0aW9uSW5mbwlPUFRJT05BTCwKKwlhbGxJbmZvcm1hdGlvblNlbnQJWzRdIE5VTEwJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitOb3RlU3Vic2NyaWJlckRhdGFNb2RpZmllZFJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCistLSBtb2JpbGl0eSBtYW5hZ2VtZW50IGV2ZW50IG5vdGlmaWNhdGlvb24gaW5mbyB0eXBlcworCitOb3RlTU0tRXZlbnRBcmc6Oj0gU0VRVUVOQ0UgeworCXNlcnZpY2VLZXkJU2VydmljZUtleSwKKwlldmVudE1ldAkJWzBdCU1NLUNvZGUsCisJaW1zaQkJCVsxXQlJTVNJLAorCW1zaXNkbgkJWzJdCUlTRE4tQWRkcmVzc1N0cmluZywKKwlsb2NhdGlvbkluZm9ybWF0aW9uCVszXQlMb2NhdGlvbkluZm9ybWF0aW9uCU9QVElPTkFMLAorCXN1cHBvcnRlZENBTUVMUGhhc2VzCVs1XQlTdXBwb3J0ZWRDYW1lbFBoYXNlcwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzZdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJbG9jYXRpb25JbmZvcm1hdGlvbkdQUlMJWzddCUxvY2F0aW9uSW5mb3JtYXRpb25HUFJTCU9QVElPTkFMLAorCW9mZmVyZWRDYW1lbDRGdW5jdGlvbmFsaXRpZXMJWzhdIE9mZmVyZWRDYW1lbDRGdW5jdGlvbmFsaXRpZXMJT1BUSU9OQUwKK30KKworTm90ZU1NLUV2ZW50UmVzIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lciAJT1BUSU9OQUwsCisJLi4ufQorCitFeHQtU1MtSW5mb0Zvci1DU0UgOjo9IENIT0lDRSB7CisJZm9yd2FyZGluZ0luZm9Gb3ItQ1NFCVswXSBFeHQtRm9yd2FyZGluZ0luZm9Gb3ItQ1NFLAorCWNhbGxCYXJyaW5nSW5mb0Zvci1DU0UJWzFdIEV4dC1DYWxsQmFycmluZ0luZm9Gb3ItQ1NFCisJfQorCitFeHQtRm9yd2FyZGluZ0luZm9Gb3ItQ1NFIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJWzBdCVNTLUNvZGUsCisJZm9yd2FyZGluZ0ZlYXR1cmVMaXN0CVsxXQlFeHQtRm9yd0ZlYXR1cmVMaXN0LAorCW5vdGlmaWNhdGlvblRvQ1NFCVsyXQlOVUxMCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzNdCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0V4dC1DYWxsQmFycmluZ0luZm9Gb3ItQ1NFIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJWzBdCVNTLUNvZGUsCisJY2FsbEJhcnJpbmdGZWF0dXJlTGlzdAlbMV0JRXh0LUNhbGxCYXJGZWF0dXJlTGlzdCwKKwlwYXNzd29yZAkJWzJdCVBhc3N3b3JkCU9QVElPTkFMLAorCXdyb25nUGFzc3dvcmRBdHRlbXB0c0NvdW50ZXIJWzNdCVdyb25nUGFzc3dvcmRBdHRlbXB0c0NvdW50ZXIJT1BUSU9OQUwsCisJbm90aWZpY2F0aW9uVG9DU0UJWzRdCU5VTEwJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNV0JRXh0ZW5zaW9uQ29udGFpbmVyIAlPUFRJT05BTCwKKwkuLi59CisKK0VORAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1PTS1EYXRhVHlwZXMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtT00tRGF0YVR5cGVzLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjRkZDZmCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtT00tRGF0YVR5cGVzLmFzbgpAQCAtMCwwICsxLDIxNiBAQAorLS0gJElkOiBNQVAtT00tRGF0YVR5cGVzLmFzbiAyODE0OSAyMDA5LTA0LTI1IDE3OjQ1OjM0WiBldHhyYWIgJAorLS0gMTcuNy4yCU9wZXJhdGlvbiBhbmQgbWFpbnRlbmFuY2UgZGF0YSB0eXBlcworLS0gM0dQUCBUUyAyOS4wMDIgVjguOS4wICgyMDA5LTA0KQorIAorTUFQLU9NLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1PTS1EYXRhVHlwZXMgKDEyKSB2ZXJzaW9uMTEgKDExKX0KKworREVGSU5JVElPTlMKKworSU1QTElDSVQgVEFHUworCis6Oj0KKworQkVHSU4KKworRVhQT1JUUworCUFjdGl2YXRlVHJhY2VNb2RlQXJnLAorCUFjdGl2YXRlVHJhY2VNb2RlUmVzLAorCURlYWN0aXZhdGVUcmFjZU1vZGVBcmcsCisJRGVhY3RpdmF0ZVRyYWNlTW9kZVJlcywKKwlUcmFjZVByb3BhZ2F0aW9uTGlzdAorOworCitJTVBPUlRTCisJQWRkcmVzc1N0cmluZywKKwlJTVNJCitGUk9NIE1BUC1Db21tb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtQ29tbW9uRGF0YVR5cGVzICgxOCkgdmVyc2lvbjExICgxMSl9CisKKwlFeHRlbnNpb25Db250YWluZXIKK0ZST00gTUFQLUV4dGVuc2lvbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KKworOworCitBY3RpdmF0ZVRyYWNlTW9kZUFyZyA6Oj0gU0VRVUVOQ0UgeworCWltc2kJCQlbMF0gSU1TSQkJT1BUSU9OQUwsCisJdHJhY2VSZWZlcmVuY2UJWzFdIFRyYWNlUmVmZXJlbmNlLAorCXRyYWNlVHlwZQkJWzJdIFRyYWNlVHlwZSwKKwlvbWMtSWQJCVszXSBBZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwl0cmFjZVJlZmVyZW5jZTIJWzVdIFRyYWNlUmVmZXJlbmNlMglPUFRJT05BTCwKKwl0cmFjZURlcHRoTGlzdAlbNl0gVHJhY2VEZXB0aExpc3QJT1BUSU9OQUwsCisJdHJhY2VORS1UeXBlTGlzdAlbN10gVHJhY2VORS1UeXBlTGlzdAlPUFRJT05BTCwKKwl0cmFjZUludGVyZmFjZUxpc3QJWzhdIFRyYWNlSW50ZXJmYWNlTGlzdAlPUFRJT05BTCwKKwl0cmFjZUV2ZW50TGlzdAlbOV0gVHJhY2VFdmVudExpc3QJT1BUSU9OQUwKKwl9CisKK1RyYWNlUmVmZXJlbmNlIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLjIpKQorCitUcmFjZVJlZmVyZW5jZTIgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMykpCisKK1RyYWNlUmVjb3JkaW5nU2Vzc2lvblJlZmVyZW5jZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgyKSkKKworVHJhY2VUeXBlIDo6PSBJTlRFR0VSCisJKDAuLjI1NSkKKwktLSBUcmFjZSB0eXBlcyBhcmUgZnVsbHkgZGVmaW5lZCBpbiAgM0dQUCBUUyA1Mi4wMDguIFs2MV0KKworVHJhY2VEZXB0aExpc3QgOjo9IFNFUVVFTkNFIHsKKwltc2Mtcy1UcmFjZURlcHRoCVswXSBUcmFjZURlcHRoCU9QVElPTkFMLAorCW1ndy1UcmFjZURlcHRoCVsxXSBUcmFjZURlcHRoCU9QVElPTkFMLAorCXNnc24tVHJhY2VEZXB0aAlbMl0gVHJhY2VEZXB0aAlPUFRJT05BTCwKKwlnZ3NuLVRyYWNlRGVwdGgJWzNdIFRyYWNlRGVwdGgJT1BUSU9OQUwsCisJcm5jLVRyYWNlRGVwdGgJWzRdIFRyYWNlRGVwdGgJT1BUSU9OQUwsCisJYm1zYy1UcmFjZURlcHRoCVs1XSBUcmFjZURlcHRoCU9QVElPTkFMLAorCS4uLn0KKworVHJhY2VEZXB0aCA6Oj0gRU5VTUVSQVRFRCB7CisJbWluaW11bSAoMCksCisJbWVkaXVtICgxKSwKKwltYXhpbXVtICgyKSwKKwkuLi59CistLSBUaGUgdmFsdWUgbWVkaXVtIGlzIGFwcGxpY2FibGUgb25seSBmb3IgUk5DLiBGb3Igb3RoZXIgbmV0d29yayBlbGVtZW50cywgaWYgdmFsdWUgbWVkaXVtCistLSBpcyByZWNlaXZlZCwgdmFsdWUgbWluaW11bSBzaGFsbCBiZSBhcHBsaWVkLgorCitUcmFjZU5FLVR5cGVMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwltc2MtcyAoMCksCisJbWd3ICgxKSwKKwlzZ3NuICgyKSwKKwlnZ3NuICgzKSwKKwlybmMgKDQpLAorCWJtLXNjICg1KX0gKFNJWkUgKDYuLjE2KSkKKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitUcmFjZUludGVyZmFjZUxpc3QgOjo9IFNFUVVFTkNFIHsKKwltc2Mtcy1MaXN0CVswXSBNU0MtUy1JbnRlcmZhY2VMaXN0CU9QVElPTkFMLAorCW1ndy1MaXN0CQlbMV0gTUdXLUludGVyZmFjZUxpc3QJT1BUSU9OQUwsCisJc2dzbi1MaXN0CQlbMl0gU0dTTi1JbnRlcmZhY2VMaXN0CU9QVElPTkFMLAorCWdnc24tTGlzdAkJWzNdIEdHU04tSW50ZXJmYWNlTGlzdAlPUFRJT05BTCwKKwlybmMtTGlzdAkJWzRdIFJOQy1JbnRlcmZhY2VMaXN0CU9QVElPTkFMLAorCWJtc2MtTGlzdAkJWzVdIEJNU0MtSW50ZXJmYWNlTGlzdAlPUFRJT05BTCwKKwkuLi59CisKK01TQy1TLUludGVyZmFjZUxpc3QgOjo9IEJJVCBTVFJJTkcgeworCWEgKDApLAorCWl1ICgxKSwKKwltYyAoMiksCisJbWFwLWcgKDMpLAorCW1hcC1iICg0KSwKKwltYXAtZSAoNSksCisJbWFwLWYgKDYpLAorCWNhcCAoNyksCisJbWFwLWQgKDgpLAorCW1hcC1jICg5KX0gKFNJWkUgKDEwLi4xNikpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworTUdXLUludGVyZmFjZUxpc3QgOjo9IEJJVCBTVFJJTkcgeworCW1jICgwKSwKKwluYi11cCAoMSksCisJaXUtdXAgKDIpfSAoU0laRSAoMy4uOCkpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworU0dTTi1JbnRlcmZhY2VMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwlnYiAoMCksCisJaXUgKDEpLAorCWduICgyKSwKKwltYXAtZ3IgKDMpLAorCW1hcC1nZCAoNCksCisJbWFwLWdmICg1KSwKKwlncyAoNiksCisJZ2UgKDcpfSAoU0laRSAoOC4uMTYpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK0dHU04tSW50ZXJmYWNlTGlzdCA6Oj0gQklUIFNUUklORyB7CisJZ24gKDApLAorCWdpICgxKSwKKwlnbWIgKDIpfSAoU0laRSAoMy4uOCkpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworUk5DLUludGVyZmFjZUxpc3QgOjo9IEJJVCBTVFJJTkcgeworCWl1ICgwKSwKKwlpdXIgKDEpLAorCWl1YiAoMiksCisJdXUgKDMpfSAoU0laRSAoNC4uOCkpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworQk1TQy1JbnRlcmZhY2VMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwlnbWIgKDApfSAoU0laRSAoMS4uOCkpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworVHJhY2VFdmVudExpc3QgOjo9IFNFUVVFTkNFIHsKKwltc2Mtcy1MaXN0CVswXSBNU0MtUy1FdmVudExpc3QJT1BUSU9OQUwsCisJbWd3LUxpc3QJCVsxXSBNR1ctRXZlbnRMaXN0CU9QVElPTkFMLAorCXNnc24tTGlzdAkJWzJdIFNHU04tRXZlbnRMaXN0CU9QVElPTkFMLAorCWdnc24tTGlzdAkJWzNdIEdHU04tRXZlbnRMaXN0CU9QVElPTkFMLAorCWJtc2MtTGlzdAkJWzRdIEJNU0MtRXZlbnRMaXN0CU9QVElPTkFMLAorCS4uLn0KKworTVNDLVMtRXZlbnRMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwltby1tdENhbGwgKDApLAorCW1vLW10LXNtcyAoMSksCisJbHUtaW1zaUF0dGFjaC1pbXNpRGV0YWNoICgyKSwKKwloYW5kb3ZlcnMgKDMpLAorCXNzICg0KX0gKFNJWkUgKDUuLjE2KSkKKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitNR1ctRXZlbnRMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwljb250ZXh0ICgwKX0gKFNJWkUgKDEuLjgpKQorLS0gT3RoZXIgYml0cyB0aGFuIGxpc3RlZCBhYm92ZSBzaGFsbCBiZSBkaXNjYXJkZWQuCisKK1NHU04tRXZlbnRMaXN0IDo6PSBCSVQgU1RSSU5HIHsKKwlwZHBDb250ZXh0ICgwKSwKKwltby1tdC1zbXMgKDEpLAorCXJhdS1ncHJzQXR0YWNoLWdwcnNEZXRhY2ggKDIpLAorCW1ibXNDb250ZXh0ICgzKX0gKFNJWkUgKDQuLjE2KSkKKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCitHR1NOLUV2ZW50TGlzdCA6Oj0gQklUIFNUUklORyB7CisJcGRwQ29udGV4dCAoMCksCisJbWJtc0NvbnRleHQgKDEpfSAoU0laRSAoMi4uOCkpCistLSBPdGhlciBiaXRzIHRoYW4gbGlzdGVkIGFib3ZlIHNoYWxsIGJlIGRpc2NhcmRlZC4KKworQk1TQy1FdmVudExpc3QgOjo9IEJJVCBTVFJJTkcgeworCW1ibXNNdWx0aWNhc3RTZXJ2aWNlQWN0aXZhdGlvbiAoMCl9IChTSVpFICgxLi44KSkKKy0tIE90aGVyIGJpdHMgdGhhbiBsaXN0ZWQgYWJvdmUgc2hhbGwgYmUgZGlzY2FyZGVkLgorCisKK1RyYWNlUHJvcGFnYXRpb25MaXN0IDo6PSBTRVFVRU5DRSB7CisJdHJhY2VSZWZlcmVuY2UJWzBdIFRyYWNlUmVmZXJlbmNlCU9QVElPTkFMLAorCXRyYWNlVHlwZQkJWzFdIFRyYWNlVHlwZQlPUFRJT05BTCwKKwl0cmFjZVJlZmVyZW5jZTIJWzJdIFRyYWNlUmVmZXJlbmNlMglPUFRJT05BTCwKKwl0cmFjZVJlY29yZGluZ1Nlc3Npb25SZWZlcmVuY2UJWzNdIFRyYWNlUmVjb3JkaW5nU2Vzc2lvblJlZmVyZW5jZSBPUFRJT05BTCwKKwlybmMtVHJhY2VEZXB0aAlbNF0gVHJhY2VEZXB0aAlPUFRJT05BTCwKKwlybmMtSW50ZXJmYWNlTGlzdAlbNV0gUk5DLUludGVyZmFjZUxpc3QJT1BUSU9OQUwsCisJbXNjLXMtVHJhY2VEZXB0aAlbNl0gVHJhY2VEZXB0aAlPUFRJT05BTCwKKwltc2Mtcy1JbnRlcmZhY2VMaXN0CVs3XSBNU0MtUy1JbnRlcmZhY2VMaXN0CU9QVElPTkFMLAorCW1zYy1zLUV2ZW50TGlzdAlbOF0gTVNDLVMtRXZlbnRMaXN0CU9QVElPTkFMLAorCW1ndy1UcmFjZURlcHRoCVs5XSBUcmFjZURlcHRoCU9QVElPTkFMLAorCW1ndy1JbnRlcmZhY2VMaXN0CVsxMF0gTUdXLUludGVyZmFjZUxpc3QJT1BUSU9OQUwsCisJbWd3LUV2ZW50TGlzdAlbMTFdIE1HVy1FdmVudExpc3QJT1BUSU9OQUwsCisJLi4ufQorCitBY3RpdmF0ZVRyYWNlTW9kZVJlcyA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuc2lvbkNvbnRhaW5lcglbMF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwl0cmFjZVN1cHBvcnRJbmRpY2F0b3IJWzFdCU5VTEwJCU9QVElPTkFMCisJfQorCitEZWFjdGl2YXRlVHJhY2VNb2RlQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCVswXSBJTVNJCQlPUFRJT05BTCwKKwl0cmFjZVJlZmVyZW5jZQlbMV0gVHJhY2VSZWZlcmVuY2UsCisJZXh0ZW5zaW9uQ29udGFpbmVyCVsyXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCXRyYWNlUmVmZXJlbmNlMglbM10gVHJhY2VSZWZlcmVuY2UyCU9QVElPTkFMCisJfQorCitEZWFjdGl2YXRlVHJhY2VNb2RlUmVzIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCVswXSBFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitFTkQKKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtU00tRGF0YVR5cGVzLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVNNLURhdGFUeXBlcy5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVmOTQxZgotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVNNLURhdGFUeXBlcy5hc24KQEAgLTAsMCArMSwyNzAgQEAKKy0tICRJZDogTUFQLVNNLURhdGFUeXBlcy5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKKy0tIDNHUFAgVFMgMjkuMDAyICBWOC45LjAgKDIwMDktMDQpICAKKy0tIDE3LjcuNglTaG9ydCBtZXNzYWdlIGRhdGEgdHlwZXMKKworTUFQLVNNLURhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1TTS1EYXRhVHlwZXMgKDE2KSB2ZXJzaW9uMTEgKDExKX0KKworREVGSU5JVElPTlMKKworSU1QTElDSVQgVEFHUworCis6Oj0KKworQkVHSU4KKworRVhQT1JUUworCVJvdXRpbmdJbmZvRm9yU00tQXJnLAorCVJvdXRpbmdJbmZvRm9yU00tUmVzLAorCU1PLUZvcndhcmRTTS1BcmcsCisJTU8tRm9yd2FyZFNNLVJlcywKKwlNVC1Gb3J3YXJkU00tQXJnLAorCU1ULUZvcndhcmRTTS1SZXMsCisJUmVwb3J0U00tRGVsaXZlcnlTdGF0dXNBcmcsCisJUmVwb3J0U00tRGVsaXZlcnlTdGF0dXNSZXMsCisJQWxlcnRTZXJ2aWNlQ2VudHJlQXJnLAorCUluZm9ybVNlcnZpY2VDZW50cmVBcmcsCisJUmVhZHlGb3JTTS1BcmcsIAorCVJlYWR5Rm9yU00tUmVzLAorCVNNLURlbGl2ZXJ5T3V0Y29tZSwKKwlBbGVydFJlYXNvbiwKKwlBZGRpdGlvbmFsLU51bWJlciwKKwlNVC1Gb3J3YXJkU00tVkdDUy1BcmcsCisJTVQtRm9yd2FyZFNNLVZHQ1MtUmVzCis7CisKK0lNUE9SVFMKKwlBZGRyZXNzU3RyaW5nLAorCUlTRE4tQWRkcmVzc1N0cmluZywKKwlTaWduYWxJbmZvLAorCUlNU0ksCisJTE1TSSwKKwlBU0NJLUNhbGxSZWZlcmVuY2UKKworRlJPTSBNQVAtQ29tbW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUNvbW1vbkRhdGFUeXBlcyAoMTgpIHZlcnNpb24xMSAoMTEpfQorCisJQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQorRlJPTSBNQVAtRVItRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUVSLURhdGFUeXBlcyAoMTcpIHZlcnNpb24xMSAoMTEpfQorCisJRXh0ZW5zaW9uQ29udGFpbmVyCitGUk9NIE1BUC1FeHRlbnNpb25EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjExICgxMSl9Cis7CisKKworUm91dGluZ0luZm9Gb3JTTS1BcmcgOjo9IFNFUVVFTkNFIHsKKwltc2lzZG4JCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJc20tUlAtUFJJCQlbMV0gQk9PTEVBTiwKKwlzZXJ2aWNlQ2VudHJlQWRkcmVzcwlbMl0gQWRkcmVzc1N0cmluZywKKwlleHRlbnNpb25Db250YWluZXIJWzZdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCWdwcnNTdXBwb3J0SW5kaWNhdG9yCVs3XQlOVUxMCQlPUFRJT05BTCwKKwktLSBncHJzU3VwcG9ydEluZGljYXRvciBpcyBzZXQgb25seSBpZiB0aGUgU01TLUdNU0Mgc3VwcG9ydHMKKwktLSByZWNlaXZpbmcgb2YgdHdvIG51bWJlcnMgZnJvbSB0aGUgSExSCisJc20tUlAtTVRJCQlbOF0gU00tUlAtTVRJCU9QVElPTkFMLAorCXNtLVJQLVNNRUEJWzldIFNNLVJQLVNNRUEJT1BUSU9OQUwsCisJc20tZGVsaXZlcnlOb3RJbnRlbmRlZAlbMTBdIFNNLURlbGl2ZXJ5Tm90SW50ZW5kZWQJT1BUSU9OQUwgfQorCitTTS1EZWxpdmVyeU5vdEludGVuZGVkIDo6PSBFTlVNRVJBVEVEIHsKKwlvbmx5SU1TSS1yZXF1ZXN0ZWQgICgwKSwKKwlvbmx5TUNDLU1OQy1yZXF1ZXN0ZWQgICgxKSwKKwkuLi59CisKK1NNLVJQLU1USSA6Oj0gSU5URUdFUiAoMC4uMTApCisJLS0gMCBTTVMgRGVsaXZlciAKKwktLSAxIFNNUyBTdGF0dXMgUmVwb3J0CisJLS0gb3RoZXIgdmFsdWVzIGFyZSByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSBhbmQgc2hhbGwgYmUgZGlzY2FyZGVkIGlmCisJLS0gcmVjZWl2ZWQKKworU00tUlAtU01FQSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi4xMikpCisJLS0gdGhpcyBwYXJhbWV0ZXIgY29udGFpbnMgYW4gYWRkcmVzcyBmaWVsZCB3aGljaCBpcyBlbmNvZGVkIAorCS0tIGFzIGRlZmluZWQgaW4gM0dQUCBUUyAyMy4wNDAuIEFuIGFkZHJlc3MgZmllbGQgY29udGFpbnMgMyBlbGVtZW50cyA6CisJLS0gCQlhZGRyZXNzLWxlbmd0aAorCS0tIAkJdHlwZS1vZi1hZGRyZXNzCisJLS0gCQlhZGRyZXNzLXZhbHVlCisKK1JvdXRpbmdJbmZvRm9yU00tUmVzIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCUlNU0ksCisJbG9jYXRpb25JbmZvV2l0aExNU0kJWzBdIExvY2F0aW9uSW5mb1dpdGhMTVNJLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbNF0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTG9jYXRpb25JbmZvV2l0aExNU0kgOjo9IFNFUVVFTkNFIHsKKwluZXR3b3JrTm9kZS1OdW1iZXIJWzFdIElTRE4tQWRkcmVzc1N0cmluZywKKwlsbXNpCQkJTE1TSQkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWdwcnNOb2RlSW5kaWNhdG9yCVs1XQlOVUxMCQlPUFRJT05BTCwKKwktLSBncHJzTm9kZUluZGljYXRvciBpcyBzZXQgb25seSBpZiB0aGUgU0dTTiBudW1iZXIgaXMgc2VudCBhcyB0aGUgCisJLS0gTmV0d29yayBOb2RlIE51bWJlcgorCWFkZGl0aW9uYWwtTnVtYmVyCVs2XSBBZGRpdGlvbmFsLU51bWJlcglPUFRJT05BTCAKKwktLSBOZXR3b3JrTm9kZS1udW1iZXIgY2FuIGJlIGVpdGhlciBtc2MtbnVtYmVyIG9yIHNnc24tbnVtYmVyIG9yIElQLVNNLUdXCisJLS0gbnVtYmVyIG9yIFNNUyBSb3V0ZXIgbnVtYmVyCisJfQorCitBZGRpdGlvbmFsLU51bWJlciA6Oj0gQ0hPSUNFIHsKKwltc2MtTnVtYmVyCVswXSBJU0ROLUFkZHJlc3NTdHJpbmcsCisJc2dzbi1OdW1iZXIJWzFdIElTRE4tQWRkcmVzc1N0cmluZ30KKwktLSBhZGRpdGlvbmFsLW51bWJlciBjYW4gYmUgZWl0aGVyIG1zYy1udW1iZXIgb3Igc2dzbi1udW1iZXIKKwktLSBpZiByZWNlaXZlZCBuZXR3b3JrTm9kZS1udW1iZXIgaXMgbXNjLW51bWJlciB0aGVuIHRoZSAJCisJLS0gYWRkaXRpb25hbCBudW1iZXIgaXMgc2dzbi1udW1iZXIgCisJLS0gaWYgcmVjZWl2ZWQgbmV0d29ya05vZGUtbnVtYmVyIGlzIHNnc24tbnVtYmVyIHRoZW4gdGhlIAorCS0tIGFkZGl0aW9uYWwgbnVtYmVyIGlzIG1zYy1udW1iZXIgCisKK01PLUZvcndhcmRTTS1BcmcgOjo9IFNFUVVFTkNFIHsKKwlzbS1SUC1EQQkJU00tUlAtREEsCisJc20tUlAtT0EJCVNNLVJQLU9BLAorCXNtLVJQLVVJCQlTaWduYWxJbmZvLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uICwKKwlpbXNpCQkJSU1TSSAJCU9QVElPTkFMIH0KKworTU8tRm9yd2FyZFNNLVJlcyA6Oj0gU0VRVUVOQ0UgeworCXNtLVJQLVVJCQlTaWduYWxJbmZvIAlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTVQtRm9yd2FyZFNNLUFyZyA6Oj0gU0VRVUVOQ0UgeworCXNtLVJQLURBCQlTTS1SUC1EQSwKKwlzbS1SUC1PQQkJU00tUlAtT0EsCisJc20tUlAtVUkJCVNpZ25hbEluZm8sCisJbW9yZU1lc3NhZ2VzVG9TZW5kCU5VTEwJCQlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworTVQtRm9yd2FyZFNNLVJlcyA6Oj0gU0VRVUVOQ0UgeworCXNtLVJQLVVJCQlTaWduYWxJbmZvCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4ufQorCitTTS1SUC1EQSA6Oj0gQ0hPSUNFIHsKKwlpbXNpCQkJWzBdIElNU0ksCisJbG1zaQkJCVsxXSBMTVNJLAorCXNlcnZpY2VDZW50cmVBZGRyZXNzREEJWzRdIEFkZHJlc3NTdHJpbmcsCisJbm9TTS1SUC1EQQlbNV0gTlVMTH0KKworU00tUlAtT0EgOjo9IENIT0lDRSB7CisJbXNpc2RuCQlbMl0gSVNETi1BZGRyZXNzU3RyaW5nLAorCXNlcnZpY2VDZW50cmVBZGRyZXNzT0EJWzRdIEFkZHJlc3NTdHJpbmcsCisJbm9TTS1SUC1PQQlbNV0gTlVMTH0KKworUmVwb3J0U00tRGVsaXZlcnlTdGF0dXNBcmcgOjo9IFNFUVVFTkNFIHsKKwltc2lzZG4JCUlTRE4tQWRkcmVzc1N0cmluZywKKwlzZXJ2aWNlQ2VudHJlQWRkcmVzcwlBZGRyZXNzU3RyaW5nLAorCXNtLURlbGl2ZXJ5T3V0Y29tZQlTTS1EZWxpdmVyeU91dGNvbWUsCisJYWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlbMF0gQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQorCQkJCQkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMV0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLiwKKwlncHJzU3VwcG9ydEluZGljYXRvcglbMl0JTlVMTAkJT1BUSU9OQUwsCisJLS0gZ3Byc1N1cHBvcnRJbmRpY2F0b3IgaXMgc2V0IG9ubHkgaWYgdGhlIFNNUy1HTVNDIHN1cHBvcnRzIAorCS0tIGhhbmRsaW5nIG9mIHR3byBkZWxpdmVyeSBvdXRjb21lcworCWRlbGl2ZXJ5T3V0Y29tZUluZGljYXRvcglbM10gCU5VTEwJCU9QVElPTkFMLAorCS0tIERlbGl2ZXJ5T3V0Y29tZUluZGljYXRvciBpcyBzZXQgd2hlbiB0aGUgU00tRGVsaXZlcnlPdXRjb21lCisJLS0gaXMgZm9yIEdQUlMKKwlhZGRpdGlvbmFsU00tRGVsaXZlcnlPdXRjb21lCVs0XSAJU00tRGVsaXZlcnlPdXRjb21lIAlPUFRJT05BTCwKKwktLSBJZiByZWNlaXZlZCwgYWRkaXRpb25hbFNNLURlbGl2ZXJ5T3V0Y29tZSBpcyBmb3IgR1BSUworCS0tIElmIERlbGl2ZXJ5T3V0Y29tZUluZGljYXRvciBpcyBzZXQsIHRoZW4gQWRkaXRpb25hbFNNLURlbGl2ZXJ5T3V0Y29tZSBzaGFsbCBiZSBhYnNlbnQKKwlhZGRpdGlvbmFsQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlbNV0gCUFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gT1BUSU9OQUwsCisJLS0gSWYgcmVjZWl2ZWQgYWRkaXRpb25hbEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gaXMgZm9yIEdQUlMKKwktLSBJZiBEZWxpdmVyeU91dGNvbWVJbmRpY2F0b3IgaXMgc2V0LCB0aGVuIEFkZGl0aW9uYWxBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIAorCS0tIHNoYWxsIGJlIGFic2VudAorCWlwLXNtLWd3LUluZGljYXRvcglbNl0gCU5VTEwJCU9QVElPTkFMLAorCS0tIHRoZSBpcC1zbS1ndyBpbmRpY2F0b3IgaW5kaWNhdGVzIGJ5IGl0cyBwcmVzZW5jZSB0aGF0IHNtLWRlbGl2ZXJ5T3V0Y29tZQorCS0tIGlzIGZvciBkZWxpdmVyeSB2aWEgSU1TCisJLS0gSWYgcHJlc2VudCwgZGVsaXZlcnlPdXRjb21lSW5kaWNhdG9yIHNoYWxsIGJlIGFic2VudC4KKwlpcC1zbS1ndy1zbS1kZWxpdmVyeU91dGNvbWUJWzddIAlTTS1EZWxpdmVyeU91dGNvbWUJT1BUSU9OQUwsIAorCS0tIElmIHJlY2VpdmVkIGlwLXNtLWd3LXNtLWRlbGl2ZXJ5T3V0Y29tZSBpcyBmb3IgZGVsaXZlcnkgdmlhIElNUworCS0tIElmIGlwLXNtLWd3LUluZGljYXRvciBpcyBzZXQsIHRoZW4gaXAtc20tZ3ctc20tZGVsaXZlcnlPdXRjb21lIHNoYWxsIGJlIGFic2VudAorCWlwLXNtLWd3LWFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JWzhdCUFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JT1BUSU9OQUwKKwktLSBJZiByZWNlaXZlZCBpcC1zbS1ndy1zbS1hYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIGlzIGZvciBkZWxpdmVyeSB2aWEgSU1TCisJLS0gSWYgaXAtc20tZ3ctSW5kaWNhdG9yIGlzIHNldCwgdGhlbiBpcC1zbS1ndy1zbS1hYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIAorCS0tIHNoYWxsIGJlIGFic2VudAorfQorCitTTS1EZWxpdmVyeU91dGNvbWUgOjo9IEVOVU1FUkFURUQgeworCW1lbW9yeUNhcGFjaXR5RXhjZWVkZWQgICgwKSwKKwlhYnNlbnRTdWJzY3JpYmVyICAoMSksCisJc3VjY2Vzc2Z1bFRyYW5zZmVyICAoMil9CisKK1JlcG9ydFNNLURlbGl2ZXJ5U3RhdHVzUmVzIDo6PSBTRVFVRU5DRSB7CisJc3RvcmVkTVNJU0ROCUlTRE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworQWxlcnRTZXJ2aWNlQ2VudHJlQXJnIDo6PSBTRVFVRU5DRSB7CisJbXNpc2RuCQlJU0ROLUFkZHJlc3NTdHJpbmcsCisJc2VydmljZUNlbnRyZUFkZHJlc3MJQWRkcmVzc1N0cmluZywKKwkuLi59CisKK0luZm9ybVNlcnZpY2VDZW50cmVBcmcgOjo9IFNFUVVFTkNFIHsKKwlzdG9yZWRNU0lTRE4JSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCW13LVN0YXR1cwlNVy1TdGF0dXMJT1BUSU9OQUwsCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4gLAorCWFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00JQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlPUFRJT05BTCwKKwlhZGRpdGlvbmFsQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlbMF0JQWJzZW50U3Vic2NyaWJlckRpYWdub3N0aWNTTQlPUFRJT05BTCB9CisJLS0gYWRkaXRpb25hbEFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gbWF5IGJlIHByZXNlbnQgb25seSBpZiAKKwktLSBhYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIGlzIHByZXNlbnQuCisJLS0gaWYgaW5jbHVkZWQsIGFkZGl0aW9uYWxBYnNlbnRTdWJzY3JpYmVyRGlhZ25vc3RpY1NNIGlzIGZvciBHUFJTIGFuZAorCS0tIGFic2VudFN1YnNjcmliZXJEaWFnbm9zdGljU00gaXMgZm9yIG5vbi1HUFJTCisKK01XLVN0YXR1cyA6Oj0gQklUIFNUUklORyB7CisJc2MtQWRkcmVzc05vdEluY2x1ZGVkICAoMCksCisJbW5yZi1TZXQgICgxKSwKKwltY2VmLVNldCAgKDIpICwKKwltbnJnLVNldAkgICgzKX0gKFNJWkUgKDYuLjE2KSkKKwktLSBleGNlcHRpb24gaGFuZGxpbmc6CisJLS0gYml0cyA0IHRvIDE1IHNoYWxsIGJlIGlnbm9yZWQgaWYgcmVjZWl2ZWQgYW5kIG5vdCB1bmRlcnN0b29kCisKK1JlYWR5Rm9yU00tQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCVswXSBJTVNJLAorCWFsZXJ0UmVhc29uCUFsZXJ0UmVhc29uLAorCWFsZXJ0UmVhc29uSW5kaWNhdG9yCU5VTEwJCQlPUFRJT05BTCwKKwktLSBhbGVydFJlYXNvbkluZGljYXRvciBpcyBzZXQgb25seSB3aGVuIHRoZSBhbGVydFJlYXNvbiAKKwktLSBzZW50IHRvIEhMUiBpcyBmb3IgR1BSUworCWV4dGVuc2lvbkNvbnRhaW5lcglFeHRlbnNpb25Db250YWluZXIJT1BUSU9OQUwsCisJLi4uLAorCWFkZGl0aW9uYWxBbGVydFJlYXNvbkluZGljYXRvcglbMV0gTlVMTAkJT1BUSU9OQUwKKwktLSBhZGRpdGlvbmFsQWxlcnRSZWFzb25JbmRpY2F0b3IgaXMgc2V0IG9ubHkgd2hlbiB0aGUgYWxlcnRSZWFzb24KKwktLSBzZW50IHRvIEhMUiBpcyBmb3IgSVAtU00tR1cKKwl9CisKK1JlYWR5Rm9yU00tUmVzIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK0FsZXJ0UmVhc29uIDo6PSBFTlVNRVJBVEVEIHsKKwltcy1QcmVzZW50ICAoMCksCisJbWVtb3J5QXZhaWxhYmxlICAoMSl9CisKK01ULUZvcndhcmRTTS1WR0NTLUFyZyA6Oj0gU0VRVUVOQ0UgeworCWFzY2lDYWxsUmVmZXJlbmNlCUFTQ0ktQ2FsbFJlZmVyZW5jZSwKKwlzbS1SUC1PQQkJU00tUlAtT0EsCisJc20tUlAtVUkJCVNpZ25hbEluZm8sCisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi59CisKK01ULUZvcndhcmRTTS1WR0NTLVJlcyA6Oj0gU0VRVUVOQ0UgeworCXNtLVJQLVVJCQlbMF0gU2lnbmFsSW5mbwlPUFRJT05BTCwKKwlkaXNwYXRjaGVyTGlzdAlbMV0gRGlzcGF0Y2hlckxpc3QJT1BUSU9OQUwsCisJb25nb2luZ0NhbGwJTlVMTAkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcglbMl0gRXh0ZW5zaW9uQ29udGFpbmVyCU9QVElPTkFMLAorCS4uLn0KKworRGlzcGF0Y2hlckxpc3QgOjo9IAorCVNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mRGlzcGF0Y2hlcnMpIE9GCisJCQkJSVNETi1BZGRyZXNzU3RyaW5nCisKK21heE51bU9mRGlzcGF0Y2hlcnMgIElOVEVHRVIgOjo9IDUKKworCisKK0VORAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1TUy1Db2RlLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVNTLUNvZGUuYXNuCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2M2YyZGMKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1TUy1Db2RlLmFzbgpAQCAtMCwwICsxLDE5MCBAQAorLS0gJElkOiBNQVAtU1MtQ29kZS5hc24gMjgxNDkgMjAwOS0wNC0yNSAxNzo0NTozNFogZXR4cmFiICQKKy0tIDNHUFAgVFMgMjkuMDAyIFY4LjkuMCAoMjAwOS0wNCkKKy0tIDE3LjcuNQlTdXBwbGVtZW50YXJ5IHNlcnZpY2UgY29kZXMKKworTUFQLVNTLUNvZGUgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU1MtQ29kZSAoMTUpIHZlcnNpb24xMSAoMTEpfQorCitERUZJTklUSU9OUworCis6Oj0KKworQkVHSU4KKworU1MtQ29kZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKwktLSBUaGlzIHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIGNvZGUgaWRlbnRpZnlpbmcgYSBzaW5nbGUKKwktLSBzdXBwbGVtZW50YXJ5IHNlcnZpY2UsIGEgZ3JvdXAgb2Ygc3VwcGxlbWVudGFyeSBzZXJ2aWNlcywgb3IKKwktLSBhbGwgc3VwcGxlbWVudGFyeSBzZXJ2aWNlcy4gVGhlIHNlcnZpY2VzIGFuZCBhYmJyZXZpYXRpb25zCisJLS0gdXNlZCBhcmUgZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIyLjAwNCBbNV0uIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMKKwktLSBkZWZpbmVkIGFzIGZvbGxvd3M6CisJLS0KKwktLSBiaXRzIDg3NjU0MzIxOiBncm91cCAoYml0cyA4NzY1KSwgYW5kIHNwZWNpZmljIHNlcnZpY2UKKwktLSAoYml0cyA0MzIxKQorCithbGxTUwkJCVNTLUNvZGUgOjo9ICcwMDAwMDAwMCdCCisJLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UKKwktLSBhbGwgU1MKKworYWxsTGluZUlkZW50aWZpY2F0aW9uU1MJU1MtQ29kZSA6Oj0gJzAwMDEwMDAwJ0IKKwktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQorCS0tIGFsbCBsaW5lIGlkZW50aWZpY2F0aW9uIFNTCitjbGlwCQkJCVNTLUNvZGUgOjo9ICcwMDAxMDAwMSdCCisJLS0gY2FsbGluZyBsaW5lIGlkZW50aWZpY2F0aW9uIHByZXNlbnRhdGlvbgorY2xpcgkJCQlTUy1Db2RlIDo6PSAnMDAwMTAwMTAnQgorCS0tIGNhbGxpbmcgbGluZSBpZGVudGlmaWNhdGlvbiByZXN0cmljdGlvbgorY29scAkJCQlTUy1Db2RlIDo6PSAnMDAwMTAwMTEnQgorCS0tIGNvbm5lY3RlZCBsaW5lIGlkZW50aWZpY2F0aW9uIHByZXNlbnRhdGlvbgorY29scgkJCQlTUy1Db2RlIDo6PSAnMDAwMTAxMDAnQgorCS0tIGNvbm5lY3RlZCBsaW5lIGlkZW50aWZpY2F0aW9uIHJlc3RyaWN0aW9uCittY2kJCQkJU1MtQ29kZSA6Oj0gJzAwMDEwMTAxJ0IKKwktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQorCS0tIG1hbGljaW91cyBjYWxsIGlkZW50aWZpY2F0aW9uCisKK2FsbE5hbWVJZGVudGlmaWNhdGlvblNTCVNTLUNvZGUgOjo9ICcwMDAxMTAwMCdCCisJLS0gYWxsIG5hbWUgaWRlbnRpZmljYXRpb24gU1MKK2NuYXAJCQkJU1MtQ29kZSA6Oj0gJzAwMDExMDAxJ0IKKwktLSBjYWxsaW5nIG5hbWUgcHJlc2VudGF0aW9uCisKKwktLSBTUy1Db2RlcyAnMDAwMTEwMTAnQiB0byAnMDAwMTExMTEnQiBhcmUgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSAKKwktLSBOYW1lSWRlbnRpZmljYXRpb24gU3VwcGxlbWVudGFyeSBTZXJ2aWNlIHVzZS4KKworYWxsRm9yd2FyZGluZ1NTCVNTLUNvZGUgOjo9ICcwMDEwMDAwMCdCCisJLS0gYWxsIGZvcndhcmRpbmcgU1MKK2NmdQkJCQlTUy1Db2RlIDo6PSAnMDAxMDAwMDEnQgorCS0tIGNhbGwgZm9yd2FyZGluZyB1bmNvbmRpdGlvbmFsCithbGxDb25kRm9yd2FyZGluZ1NTCVNTLUNvZGUgOjo9ICcwMDEwMTAwMCdCCisJLS0gYWxsIGNvbmRpdGlvbmFsIGZvcndhcmRpbmcgU1MKK2NmYgkJCQlTUy1Db2RlIDo6PSAnMDAxMDEwMDEnQgorCS0tIGNhbGwgZm9yd2FyZGluZyBvbiBtb2JpbGUgc3Vic2NyaWJlciBidXN5CitjZm5yeQkJCVNTLUNvZGUgOjo9ICcwMDEwMTAxMCdCCisJLS0gY2FsbCBmb3J3YXJkaW5nIG9uIG5vIHJlcGx5CitjZm5yYwkJCVNTLUNvZGUgOjo9ICcwMDEwMTAxMSdCCisJLS0gY2FsbCBmb3J3YXJkaW5nIG9uIG1vYmlsZSBzdWJzY3JpYmVyIG5vdCByZWFjaGFibGUgCitjZAkJCQlTUy1Db2RlIDo6PSAnMDAxMDAxMDAnQgorCS0tIGNhbGwgZGVmbGVjdGlvbgorCithbGxDYWxsT2ZmZXJpbmdTUwlTUy1Db2RlIDo6PSAnMDAxMTAwMDAnQgorCS0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlCisJLS0gYWxsIGNhbGwgb2ZmZXJpbmcgU1MgaW5jbHVkZXMgYWxzbyBhbGwgZm9yd2FyZGluZyBTUworZWN0CQkJCVNTLUNvZGUgOjo9ICcwMDExMDAwMSdCCisJCS0tIGV4cGxpY2l0IGNhbGwgdHJhbnNmZXIKK21haAkJCQlTUy1Db2RlIDo6PSAnMDAxMTAwMTAnQgorCS0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlCisJLS0gbW9iaWxlIGFjY2VzcyBodW50aW5nCisKK2FsbENhbGxDb21wbGV0aW9uU1MJU1MtQ29kZSA6Oj0gJzAxMDAwMDAwJ0IKKwktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQorCS0tIGFsbCBDYWxsIGNvbXBsZXRpb24gU1MKK2N3CQkJCVNTLUNvZGUgOjo9ICcwMTAwMDAwMSdCCisJLS0gY2FsbCB3YWl0aW5nCitob2xkCQkJCVNTLUNvZGUgOjo9ICcwMTAwMDAxMCdCCisJLS0gY2FsbCBob2xkCitjY2JzLUEJCQlTUy1Db2RlIDo6PSAnMDEwMDAwMTEnQgorCS0tIGNvbXBsZXRpb24gb2YgY2FsbCB0byBidXN5IHN1YnNjcmliZXJzLCBvcmlnaW5hdGluZyBzaWRlCisJLS0gdGhpcyBTUy1Db2RlIGlzIHVzZWQgb25seSBpbiBJbnNlcnRTdWJzY3JpYmVyRGF0YSwgRGVsZXRlU3Vic2NyaWJlckRhdGEgCisJLS0gYW5kIEludGVycm9nYXRlU1MKK2NjYnMtQgkJCVNTLUNvZGUgOjo9ICcwMTAwMDEwMCdCCisJLS0gY29tcGxldGlvbiBvZiBjYWxsIHRvIGJ1c3kgc3Vic2NyaWJlcnMsIGRlc3RpbmF0aW9uIHNpZGUKKwktLSB0aGlzIFNTLUNvZGUgaXMgdXNlZCBvbmx5IGluIEluc2VydFN1YnNjcmliZXJEYXRhIGFuZCBEZWxldGVTdWJzY3JpYmVyRGF0YQorbWMJCQkJU1MtQ29kZSA6Oj0gJzAxMDAwMTAxJ0IKKwktLSBtdWx0aWNhbGwKKworYWxsTXVsdGlQYXJ0eVNTCVNTLUNvZGUgOjo9ICcwMTAxMDAwMCdCCisJLS0gcmVzZXJ2ZWQgZm9yIHBvc3NpYmxlIGZ1dHVyZSB1c2UKKwktLSBhbGwgbXVsdGlwYXJ0eSBTUworbXVsdGlQVFkJCQlTUy1Db2RlIDo6PSAnMDEwMTAwMDEnQgorCS0tIG11bHRpcGFydHkKKworYWxsQ29tbXVuaXR5T2ZJbnRlcmVzdC1TUwlTUy1Db2RlIDo6PSAnMDExMDAwMDAnQgorCS0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlCisJLS0gYWxsIGNvbW11bml0eSBvZiBpbnRlcmVzdCBTUworY3VnCQkJCVNTLUNvZGUgOjo9ICcwMTEwMDAwMSdCCisJLS0gY2xvc2VkIHVzZXIgZ3JvdXAKKworYWxsQ2hhcmdpbmdTUwkJU1MtQ29kZSA6Oj0gJzAxMTEwMDAwJ0IKKwktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQorCS0tIGFsbCBjaGFyZ2luZyBTUworYW9jaQkJCQlTUy1Db2RlIDo6PSAnMDExMTAwMDEnQgorCS0tIGFkdmljZSBvZiBjaGFyZ2UgaW5mb3JtYXRpb24KK2FvY2MJCQkJU1MtQ29kZSA6Oj0gJzAxMTEwMDEwJ0IKKwktLSBhZHZpY2Ugb2YgY2hhcmdlIGNoYXJnaW5nCisKK2FsbEFkZGl0aW9uYWxJbmZvVHJhbnNmZXJTUwlTUy1Db2RlIDo6PSAnMTAwMDAwMDAnQgorCS0tIHJlc2VydmVkIGZvciBwb3NzaWJsZSBmdXR1cmUgdXNlCisJLS0gYWxsIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gdHJhbnNmZXIgU1MKK3V1czEJCQkJU1MtQ29kZSA6Oj0gJzEwMDAwMDAxJ0IKKwktLSBVVVMxIHVzZXItdG8tdXNlciBzaWduYWxsaW5nIAordXVzMgkJCQlTUy1Db2RlIDo6PSAnMTAwMDAwMTAnQgorCS0tIFVVUzIgdXNlci10by11c2VyIHNpZ25hbGxpbmcKK3V1czMJCQkJU1MtQ29kZSA6Oj0gJzEwMDAwMDExJ0IKKwktLSBVVVMzIHVzZXItdG8tdXNlciBzaWduYWxsaW5nCisKK2FsbEJhcnJpbmdTUwkJU1MtQ29kZSA6Oj0gJzEwMDEwMDAwJ0IKKwktLSBhbGwgYmFycmluZyBTUworYmFycmluZ09mT3V0Z29pbmdDYWxscwlTUy1Db2RlIDo6PSAnMTAwMTAwMDEnQgorCS0tIGJhcnJpbmcgb2Ygb3V0Z29pbmcgY2FsbHMKK2Jhb2MJCQkJU1MtQ29kZSA6Oj0gJzEwMDEwMDEwJ0IKKwktLSBiYXJyaW5nIG9mIGFsbCBvdXRnb2luZyBjYWxscworYm9pYwkJCQlTUy1Db2RlIDo6PSAnMTAwMTAwMTEnQgorCS0tIGJhcnJpbmcgb2Ygb3V0Z29pbmcgaW50ZXJuYXRpb25hbCBjYWxscworYm9pY0V4SEMJCQlTUy1Db2RlIDo6PSAnMTAwMTAxMDAnQgorCS0tIGJhcnJpbmcgb2Ygb3V0Z29pbmcgaW50ZXJuYXRpb25hbCBjYWxscyBleGNlcHQgdGhvc2UgZGlyZWN0ZWQKKwktLSB0byB0aGUgaG9tZSBQTE1OIENvdW50cnkKK2JhcnJpbmdPZkluY29taW5nQ2FsbHMJU1MtQ29kZSA6Oj0gJzEwMDExMDAxJ0IKKwktLSBiYXJyaW5nIG9mIGluY29taW5nIGNhbGxzCitiYWljCQkJCVNTLUNvZGUgOjo9ICcxMDAxMTAxMCdCCisJLS0gYmFycmluZyBvZiBhbGwgaW5jb21pbmcgY2FsbHMKK2JpY1JvYW0JCQlTUy1Db2RlIDo6PSAnMTAwMTEwMTEnQgorCS0tIGJhcnJpbmcgb2YgaW5jb21pbmcgY2FsbHMgd2hlbiByb2FtaW5nIG91dHNpZGUgaG9tZSBQTE1OCisJLS0gQ291bnRyeQorCithbGxQTE1OLXNwZWNpZmljU1MJU1MtQ29kZSA6Oj0gJzExMTEwMDAwJ0IKK3BsbW4tc3BlY2lmaWNTUy0xCVNTLUNvZGUgOjo9ICcxMTExMDAwMSdCCitwbG1uLXNwZWNpZmljU1MtMglTUy1Db2RlIDo6PSAnMTExMTAwMTAnQgorcGxtbi1zcGVjaWZpY1NTLTMJU1MtQ29kZSA6Oj0gJzExMTEwMDExJ0IKK3BsbW4tc3BlY2lmaWNTUy00CVNTLUNvZGUgOjo9ICcxMTExMDEwMCdCCitwbG1uLXNwZWNpZmljU1MtNQlTUy1Db2RlIDo6PSAnMTExMTAxMDEnQgorcGxtbi1zcGVjaWZpY1NTLTYJU1MtQ29kZSA6Oj0gJzExMTEwMTEwJ0IKK3BsbW4tc3BlY2lmaWNTUy03CVNTLUNvZGUgOjo9ICcxMTExMDExMSdCCitwbG1uLXNwZWNpZmljU1MtOAlTUy1Db2RlIDo6PSAnMTExMTEwMDAnQgorcGxtbi1zcGVjaWZpY1NTLTkJU1MtQ29kZSA6Oj0gJzExMTExMDAxJ0IKK3BsbW4tc3BlY2lmaWNTUy1BCVNTLUNvZGUgOjo9ICcxMTExMTAxMCdCCitwbG1uLXNwZWNpZmljU1MtQglTUy1Db2RlIDo6PSAnMTExMTEwMTEnQgorcGxtbi1zcGVjaWZpY1NTLUMJU1MtQ29kZSA6Oj0gJzExMTExMTAwJ0IKK3BsbW4tc3BlY2lmaWNTUy1ECVNTLUNvZGUgOjo9ICcxMTExMTEwMSdCCitwbG1uLXNwZWNpZmljU1MtRQlTUy1Db2RlIDo6PSAnMTExMTExMTAnQgorcGxtbi1zcGVjaWZpY1NTLUYJU1MtQ29kZSA6Oj0gJzExMTExMTExJ0IKKworYWxsQ2FsbFByaW9yaXR5U1MJU1MtQ29kZSA6Oj0gJzEwMTAwMDAwJ0IKKwktLSByZXNlcnZlZCBmb3IgcG9zc2libGUgZnV0dXJlIHVzZQorCS0tIGFsbCBjYWxsIHByaW9yaXR5IFNTCitlbWxwcAkJCVNTLUNvZGUgOjo9ICcxMDEwMDAwMSdCCisJLS0gZW5oYW5jZWQgTXVsdGlsZXZlbCBQcmVjZWRlbmNlIFByZS1lbXB0aW9uIChFTUxQUCkgc2VydmljZQorCithbGxMQ1NQcml2YWN5RXhjZXB0aW9uCVNTLUNvZGUgOjo9ICcxMDExMDAwMCdCCisJLS0gYWxsIExDUyBQcml2YWN5IEV4Y2VwdGlvbiBDbGFzc2VzCit1bml2ZXJzYWwJCQlTUy1Db2RlIDo6PSAnMTAxMTAwMDEnQgorCS0tIGFsbG93IGxvY2F0aW9uIGJ5IGFueSBMQ1MgY2xpZW50CitjYWxsU2Vzc2lvblJlbGF0ZWQJU1MtQ29kZSA6Oj0gJzEwMTEwMDEwJ0IKKwktLSBhbGxvdyBsb2NhdGlvbiBieSBhbnkgdmFsdWUgYWRkZWQgTENTIGNsaWVudCB0byB3aGljaCBhIGNhbGwvc2Vzc2lvbiAKKwktLSBpcyBlc3RhYmxpc2hlZCBmcm9tIHRoZSB0YXJnZXQgTVMKK2NhbGxTZXNzaW9uVW5yZWxhdGVkCVNTLUNvZGUgOjo9ICcxMDExMDAxMSdCCisJLS0gYWxsb3cgbG9jYXRpb24gYnkgZGVzaWduYXRlZCBleHRlcm5hbCB2YWx1ZSBhZGRlZCBMQ1MgY2xpZW50cworcGxtbm9wZXJhdG9yCQlTUy1Db2RlIDo6PSAnMTAxMTAxMDAnQgorCS0tIGFsbG93IGxvY2F0aW9uIGJ5IGRlc2lnbmF0ZWQgUExNTiBvcGVyYXRvciBMQ1MgY2xpZW50cyAKK3NlcnZpY2VUeXBlCQlTUy1Db2RlIDo6PSAnMTAxMTAxMDEnQgorCS0tIGFsbG93IGxvY2F0aW9uIGJ5IExDUyBjbGllbnRzIG9mIGEgZGVzaWduYXRlZCBMQ1Mgc2VydmljZSB0eXBlCisKK2FsbE1PTFItU1MJCVNTLUNvZGUgOjo9ICcxMTAwMDAwMCdCCisJLS0gYWxsIE1vYmlsZSBPcmlnaW5hdGluZyBMb2NhdGlvbiBSZXF1ZXN0IENsYXNzZXMKK2Jhc2ljU2VsZkxvY2F0aW9uCVNTLUNvZGUgOjo9ICcxMTAwMDAwMSdCCisJLS0gYWxsb3cgYW4gTVMgdG8gcmVxdWVzdCBpdHMgb3duIGxvY2F0aW9uCithdXRvbm9tb3VzU2VsZkxvY2F0aW9uCVNTLUNvZGUgOjo9ICcxMTAwMDAxMCdCCisJLS0gYWxsb3cgYW4gTVMgdG8gcGVyZm9ybSBzZWxmIGxvY2F0aW9uIHdpdGhvdXQgaW50ZXJhY3Rpb24KKwktLSB3aXRoIHRoZSBQTE1OIGZvciBhIHByZWRldGVybWluZWQgcGVyaW9kIG9mIHRpbWUKK3RyYW5zZmVyVG9UaGlyZFBhcnR5CVNTLUNvZGUgOjo9ICcxMTAwMDAxMSdCCisJLS0gYWxsb3cgYW4gTVMgdG8gcmVxdWVzdCB0cmFuc2ZlciBvZiBpdHMgbG9jYXRpb24gdG8gYW5vdGhlciBMQ1MgY2xpZW50CisKK0VORAorCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL01BUC1TUy1EYXRhVHlwZXMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtU1MtRGF0YVR5cGVzLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNTNmN2YwCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtU1MtRGF0YVR5cGVzLmFzbgpAQCAtMCwwICsxLDM0MiBAQAorLS0gJElkOiBNQVAtU1MtRGF0YVR5cGVzLmFzbiAyODE0OSAyMDA5LTA0LTI1IDE3OjQ1OjM0WiBldHhyYWIgJAorLS0gM0dQUCBUUyAyOS4wMDIgVjguOS4wICgyMDA5LTA0KSAgCistLSAxNy43LjQJU3VwcGxlbWVudGFyeSBzZXJ2aWNlIGRhdGEgdHlwZXMKKyAKK01BUC1TUy1EYXRhVHlwZXMgeworICAgaXR1LXQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKyAgIGdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtU1MtRGF0YVR5cGVzICgxNCkgdmVyc2lvbjExICgxMSl9CisKK0RFRklOSVRJT05TCisKK0lNUExJQ0lUIFRBR1MKKworOjo9CisKK0JFR0lOCisKK0VYUE9SVFMKKwlSZWdpc3RlclNTLUFyZywKKwlTUy1JbmZvLAorCVNTLVN0YXR1cywKKwlTUy1TdWJzY3JpcHRpb25PcHRpb24sCisJU1MtRm9yQlMtQ29kZSwKKwlJbnRlcnJvZ2F0ZVNTLVJlcywKKwlVU1NELUFyZywKKwlVU1NELVJlcywgCisJVVNTRC1EYXRhQ29kaW5nU2NoZW1lLAorCVVTU0QtU3RyaW5nLAorCVBhc3N3b3JkLAorCUd1aWRhbmNlSW5mbywKKwlTUy1MaXN0LAorCVNTLUluZm9MaXN0LAorCU92ZXJyaWRlQ2F0ZWdvcnksCisJQ2xpUmVzdHJpY3Rpb25PcHRpb24sCisJTm9SZXBseUNvbmRpdGlvblRpbWUsCisJRm9yd2FyZGluZ09wdGlvbnMsCisJbWF4TnVtT2ZTUywKKwlTUy1EYXRhLAorCVNTLUludm9jYXRpb25Ob3RpZmljYXRpb25BcmcsCisJU1MtSW52b2NhdGlvbk5vdGlmaWNhdGlvblJlcywKKwlDQ0JTLUZlYXR1cmUsCisJUmVnaXN0ZXJDQy1FbnRyeUFyZywKKwlSZWdpc3RlckNDLUVudHJ5UmVzLAorCUVyYXNlQ0MtRW50cnlBcmcsCisJRXJhc2VDQy1FbnRyeVJlcworOworCitJTVBPUlRTCisJQWRkcmVzc1N0cmluZywKKwlJU0ROLUFkZHJlc3NTdHJpbmcsCisJSVNETi1TdWJhZGRyZXNzU3RyaW5nLAorCUZUTi1BZGRyZXNzU3RyaW5nLAorCUlNU0ksCisJQmFzaWNTZXJ2aWNlQ29kZSwKKwlBbGVydGluZ1BhdHRlcm4sCisJRU1MUFAtUHJpb3JpdHksIAorCU1heE1DLUJlYXJlcnMsCisJTUMtQmVhcmVycywKKwlFeHRlcm5hbFNpZ25hbEluZm8KK0ZST00gTUFQLUNvbW1vbkRhdGFUeXBlcyB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1Db21tb25EYXRhVHlwZXMgKDE4KSB2ZXJzaW9uMTEgKDExKX0KKworCUV4dGVuc2lvbkNvbnRhaW5lcgorRlJPTSBNQVAtRXh0ZW5zaW9uRGF0YVR5cGVzIHsKKyAgIGl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisgICBnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUV4dGVuc2lvbkRhdGFUeXBlcyAoMjEpIHZlcnNpb24xMSAoMTEpfQorCisJU1MtQ29kZQorRlJPTSBNQVAtU1MtQ29kZSB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1TUy1Db2RlICgxNSkgdmVyc2lvbjExICgxMSl9Cis7CisKKworUmVnaXN0ZXJTUy1BcmcgOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlTUy1Db2RlLAorCWJhc2ljU2VydmljZQlCYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAorCWZvcndhcmRlZFRvTnVtYmVyCVs0XSBBZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWZvcndhcmRlZFRvU3ViYWRkcmVzcwlbNl0gSVNETi1TdWJhZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCW5vUmVwbHlDb25kaXRpb25UaW1lCVs1XSBOb1JlcGx5Q29uZGl0aW9uVGltZQlPUFRJT05BTCwKKwkuLi4sCisJZGVmYXVsdFByaW9yaXR5CVs3XSBFTUxQUC1Qcmlvcml0eQlPUFRJT05BTCwKKwluYnJVc2VyCQlbOF0gTUMtQmVhcmVycwlPUFRJT05BTCwKKwlsb25nRlROLVN1cHBvcnRlZAlbOV0JTlVMTAkJT1BUSU9OQUwgfQorCitOb1JlcGx5Q29uZGl0aW9uVGltZSA6Oj0gSU5URUdFUiAoNS4uMzApCisKK1NTLUluZm8gOjo9IENIT0lDRSB7CisJZm9yd2FyZGluZ0luZm8JWzBdIEZvcndhcmRpbmdJbmZvLAorCWNhbGxCYXJyaW5nSW5mbwlbMV0gQ2FsbEJhcnJpbmdJbmZvLAorCXNzLURhdGEJCVszXSBTUy1EYXRhfQorCitGb3J3YXJkaW5nSW5mbyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVNTLUNvZGUJCU9QVElPTkFMLAorCWZvcndhcmRpbmdGZWF0dXJlTGlzdAlGb3J3YXJkaW5nRmVhdHVyZUxpc3QsCisJLi4ufQorCitGb3J3YXJkaW5nRmVhdHVyZUxpc3QgOjo9IAorCVNFUVVFTkNFIFNJWkUgKDEuLm1heE51bU9mQmFzaWNTZXJ2aWNlR3JvdXBzKSBPRgorCQkJCUZvcndhcmRpbmdGZWF0dXJlCisKK0ZvcndhcmRpbmdGZWF0dXJlIDo6PSBTRVFVRU5DRSB7CisJYmFzaWNTZXJ2aWNlCUJhc2ljU2VydmljZUNvZGUJT1BUSU9OQUwsCisJc3MtU3RhdHVzCQlbNF0gU1MtU3RhdHVzCU9QVElPTkFMLAorCWZvcndhcmRlZFRvTnVtYmVyCVs1XSBJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJZm9yd2FyZGVkVG9TdWJhZGRyZXNzCVs4XSBJU0ROLVN1YmFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJZm9yd2FyZGluZ09wdGlvbnMJWzZdIEZvcndhcmRpbmdPcHRpb25zCU9QVElPTkFMLAorCW5vUmVwbHlDb25kaXRpb25UaW1lCVs3XSBOb1JlcGx5Q29uZGl0aW9uVGltZQlPUFRJT05BTCwKKwkuLi4sCisJbG9uZ0ZvcndhcmRlZFRvTnVtYmVyCVs5XSBGVE4tQWRkcmVzc1N0cmluZwlPUFRJT05BTCB9CisKK1NTLVN0YXR1cyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKworCS0tIGJpdHMgODc2NTogMDAwMCAodW51c2VkKQorCS0tIGJpdHMgNDMyMTogVXNlZCB0byBjb252ZXkgdGhlICJQIGJpdCIsIlIgYml0IiwiQSBiaXQiIGFuZCAiUSBiaXQiLAorCS0tCQkgICAgcmVwcmVzZW50aW5nIHN1cHBsZW1lbnRhcnkgc2VydmljZSBzdGF0ZSBpbmZvcm1hdGlvbgorCS0tCQkgICAgYXMgZGVmaW5lZCBpbiBUUyAzR1BQIFRTIDIzLjAxMSBbMjJdCisKKwktLSBiaXQgNDogIlEgYml0IgorCisJLS0gYml0IDM6ICJQIGJpdCIKKworCS0tIGJpdCAyOiAiUiBiaXQiCisKKwktLSBiaXQgMTogIkEgYml0IgorCitGb3J3YXJkaW5nT3B0aW9ucyA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxKSkKKworCS0tIGJpdCA4OiBub3RpZmljYXRpb24gdG8gZm9yd2FyZGluZyBwYXJ0eQorCS0tCTAgIG5vIG5vdGlmaWNhdGlvbgorCS0tCTEgIG5vdGlmaWNhdGlvbgorCisJLS0gYml0IDc6IHJlZGlyZWN0aW5nIHByZXNlbnRhdGlvbgorCS0tCTAgbm8gcHJlc2VudGF0aW9uICAKKwktLQkxICBwcmVzZW50YXRpb24KKworCS0tIGJpdCA2OiBub3RpZmljYXRpb24gdG8gY2FsbGluZyBwYXJ0eQorCS0tCTAgIG5vIG5vdGlmaWNhdGlvbgorCS0tCTEgIG5vdGlmaWNhdGlvbgorCisJLS0gYml0IDU6IDAgKHVudXNlZCkKKworCS0tIGJpdHMgNDM6IGZvcndhcmRpbmcgcmVhc29uCisJLS0JMDAgIG1zIG5vdCByZWFjaGFibGUKKwktLQkwMSAgbXMgYnVzeQorCS0tCTEwICBubyByZXBseQorCS0tCTExICB1bmNvbmRpdGlvbmFsIHdoZW4gdXNlZCBpbiBhIFNSSSBSZXN1bHQsIAorCS0tCSAgICBvciBjYWxsIGRlZmxlY3Rpb24gd2hlbiB1c2VkIGluIGEgUkNIIEFyZ3VtZW50CisJLS0gYml0cyAyMTogMDAgKHVudXNlZCkKKworQ2FsbEJhcnJpbmdJbmZvIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJU1MtQ29kZQkJT1BUSU9OQUwsCisJY2FsbEJhcnJpbmdGZWF0dXJlTGlzdAlDYWxsQmFycmluZ0ZlYXR1cmVMaXN0LAorCS4uLn0KKworQ2FsbEJhcnJpbmdGZWF0dXJlTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZCYXNpY1NlcnZpY2VHcm91cHMpIE9GCisJCQkJQ2FsbEJhcnJpbmdGZWF0dXJlCisKK0NhbGxCYXJyaW5nRmVhdHVyZSA6Oj0gU0VRVUVOQ0UgeworCWJhc2ljU2VydmljZQlCYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAorCXNzLVN0YXR1cwlbNF0gU1MtU3RhdHVzCU9QVElPTkFMLAorCS4uLn0KKworU1MtRGF0YSA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVNTLUNvZGUJCU9QVElPTkFMLAorCXNzLVN0YXR1cwkJWzRdIFNTLVN0YXR1cwlPUFRJT05BTCwKKwlzcy1TdWJzY3JpcHRpb25PcHRpb24JU1MtU3Vic2NyaXB0aW9uT3B0aW9uCU9QVElPTkFMLAorCWJhc2ljU2VydmljZUdyb3VwTGlzdAlCYXNpY1NlcnZpY2VHcm91cExpc3QJT1BUSU9OQUwsCisJLi4uLAorCWRlZmF1bHRQcmlvcml0eQlFTUxQUC1Qcmlvcml0eQlPUFRJT05BTCwKKwluYnJVc2VyCQlbNV0gTUMtQmVhcmVycwlPUFRJT05BTAorCX0KKworU1MtU3Vic2NyaXB0aW9uT3B0aW9uIDo6PSBDSE9JQ0UgeworCWNsaVJlc3RyaWN0aW9uT3B0aW9uCVsyXSBDbGlSZXN0cmljdGlvbk9wdGlvbiwKKwlvdmVycmlkZUNhdGVnb3J5CVsxXSBPdmVycmlkZUNhdGVnb3J5fQorCitDbGlSZXN0cmljdGlvbk9wdGlvbiA6Oj0gRU5VTUVSQVRFRCB7CisJcGVybWFuZW50ICAoMCksCisJdGVtcG9yYXJ5RGVmYXVsdFJlc3RyaWN0ZWQgICgxKSwKKwl0ZW1wb3JhcnlEZWZhdWx0QWxsb3dlZCAgKDIpfQorCitPdmVycmlkZUNhdGVnb3J5IDo6PSBFTlVNRVJBVEVEIHsKKwlvdmVycmlkZUVuYWJsZWQgICgwKSwKKwlvdmVycmlkZURpc2FibGVkICAoMSl9CisKK1NTLUZvckJTLUNvZGUgOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlTUy1Db2RlLAorCWJhc2ljU2VydmljZQlCYXNpY1NlcnZpY2VDb2RlCU9QVElPTkFMLAorCS4uLiwKKwlsb25nRlROLVN1cHBvcnRlZAlbNF0JTlVMTAkJT1BUSU9OQUwgfQorCitHZW5lcmljU2VydmljZUluZm8gOjo9IFNFUVVFTkNFIHsKKwlzcy1TdGF0dXMJU1MtU3RhdHVzLAorCWNsaVJlc3RyaWN0aW9uT3B0aW9uCUNsaVJlc3RyaWN0aW9uT3B0aW9uCU9QVElPTkFMLAorCS4uLiwKKwltYXhpbXVtRW50aXRsZWRQcmlvcml0eQlbMF0gRU1MUFAtUHJpb3JpdHkJT1BUSU9OQUwsCisJZGVmYXVsdFByaW9yaXR5CVsxXSBFTUxQUC1Qcmlvcml0eQlPUFRJT05BTCwKKwljY2JzLUZlYXR1cmVMaXN0CVsyXSBDQ0JTLUZlYXR1cmVMaXN0CU9QVElPTkFMLAorCW5iclNCCQlbM10gTWF4TUMtQmVhcmVycwlPUFRJT05BTCwKKwluYnJVc2VyCQlbNF0gTUMtQmVhcmVycwlPUFRJT05BTCwKKwluYnJTTgkJWzVdIE1DLUJlYXJlcnMJT1BUSU9OQUwgfQorCitDQ0JTLUZlYXR1cmVMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkNDQlMtUmVxdWVzdHMpIE9GCisJCQkJQ0NCUy1GZWF0dXJlCisKK21heE51bU9mQ0NCUy1SZXF1ZXN0cyAgSU5URUdFUiA6Oj0gNQorCitDQ0JTLUZlYXR1cmUgOjo9IFNFUVVFTkNFIHsKKwljY2JzLUluZGV4CVswXSBDQ0JTLUluZGV4CU9QVElPTkFMLAorCWItc3Vic2NyaWJlck51bWJlcglbMV0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMLAorCWItc3Vic2NyaWJlclN1YmFkZHJlc3MJWzJdIElTRE4tU3ViYWRkcmVzc1N0cmluZwlPUFRJT05BTCwKKwliYXNpY1NlcnZpY2VHcm91cAlbM10gQmFzaWNTZXJ2aWNlQ29kZQlPUFRJT05BTCwKKwkuLi59CisKK0NDQlMtSW5kZXggIDo6PSBJTlRFR0VSICgxLi5tYXhOdW1PZkNDQlMtUmVxdWVzdHMpCisKK0ludGVycm9nYXRlU1MtUmVzIDo6PSBDSE9JQ0UgeworCXNzLVN0YXR1cwkJWzBdIFNTLVN0YXR1cywKKwliYXNpY1NlcnZpY2VHcm91cExpc3QJWzJdIEJhc2ljU2VydmljZUdyb3VwTGlzdCwKKwlmb3J3YXJkaW5nRmVhdHVyZUxpc3QJWzNdIEZvcndhcmRpbmdGZWF0dXJlTGlzdCwKKwlnZW5lcmljU2VydmljZUluZm8JWzRdCUdlbmVyaWNTZXJ2aWNlSW5mbyB9CisKK1VTU0QtQXJnIDo6PSBTRVFVRU5DRSB7CisJdXNzZC1EYXRhQ29kaW5nU2NoZW1lCVVTU0QtRGF0YUNvZGluZ1NjaGVtZSwKKwl1c3NkLVN0cmluZwlVU1NELVN0cmluZywKKwkuLi4gLAorCWFsZXJ0aW5nUGF0dGVybglBbGVydGluZ1BhdHRlcm4JT1BUSU9OQUwsCisJbXNpc2RuCQlbMF0gSVNETi1BZGRyZXNzU3RyaW5nCU9QVElPTkFMIH0KKworVVNTRC1SZXMgOjo9IFNFUVVFTkNFIHsKKwl1c3NkLURhdGFDb2RpbmdTY2hlbWUJVVNTRC1EYXRhQ29kaW5nU2NoZW1lLAorCXVzc2QtU3RyaW5nCVVTU0QtU3RyaW5nLAorCS4uLn0KKworVVNTRC1EYXRhQ29kaW5nU2NoZW1lIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEpKQorCS0tIFRoZSBzdHJ1Y3R1cmUgb2YgdGhlIFVTU0QtRGF0YUNvZGluZ1NjaGVtZSBpcyBkZWZpbmVkIGJ5CisJLS0gdGhlIENlbGwgQnJvYWRjYXN0IERhdGEgQ29kaW5nIFNjaGVtZSBhcyBkZXNjcmliZWQgaW4KKwktLSBUUyAzR1BQIFRTIDIzLjAzOCBbMjVdCisKK1VTU0QtU3RyaW5nIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heFVTU0QtU3RyaW5nTGVuZ3RoKSkKKwktLSBUaGUgc3RydWN0dXJlIG9mIHRoZSBjb250ZW50cyBvZiB0aGUgVVNTRC1TdHJpbmcgaXMgZGVwZW5kZW50CisJLS0gb24gdGhlIFVTU0QtRGF0YUNvZGluZ1NjaGVtZSBhcyBkZXNjcmliZWQgaW4gVFMgM0dQUCBUUyAyMy4wMzggWzI1XS4KKworbWF4VVNTRC1TdHJpbmdMZW5ndGggIElOVEVHRVIgOjo9IDE2MAorCitQYXNzd29yZCA6Oj0gTnVtZXJpY1N0cmluZworCShGUk9NICgiMCJ8IjEifCIyInwiMyJ8IjQifCI1InwiNiJ8IjcifCI4InwiOSIpKQorCShTSVpFICg0KSkKKworR3VpZGFuY2VJbmZvIDo6PSBFTlVNRVJBVEVEIHsKKwllbnRlclBXICAoMCksCisJZW50ZXJOZXdQVyAgKDEpLAorCWVudGVyTmV3UFctQWdhaW4gICgyKX0KKwktLSBIb3cgdGhpcyBpbmZvcm1hdGlvbiBpcyByZWFsbHkgZGVsaXZlcmVkIHRvIHRoZSBzdWJzY3JpYmVyCisJLS0gKGRpc3BsYXksIGFubm91bmNlbWVudCwgLi4uKSBpcyBub3QgcGFydCBvZiB0aGlzCisJLS0gc3BlY2lmaWNhdGlvbi4KKworU1MtTGlzdCA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4TnVtT2ZTUykgT0YKKwkJCQlTUy1Db2RlCisKK21heE51bU9mU1MgIElOVEVHRVIgOjo9IDMwCisKK1NTLUluZm9MaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZlNTKSBPRgorCQkJCVNTLUluZm8KKworQmFzaWNTZXJ2aWNlR3JvdXBMaXN0IDo6PSBTRVFVRU5DRSBTSVpFICgxLi5tYXhOdW1PZkJhc2ljU2VydmljZUdyb3VwcykgT0YKKwkJCQlCYXNpY1NlcnZpY2VDb2RlCisKK21heE51bU9mQmFzaWNTZXJ2aWNlR3JvdXBzICBJTlRFR0VSIDo6PSAxMworCitTUy1JbnZvY2F0aW9uTm90aWZpY2F0aW9uQXJnIDo6PSBTRVFVRU5DRSB7CisJaW1zaQkJCVswXSBJTVNJLAorCW1zaXNkbgkJWzFdIElTRE4tQWRkcmVzc1N0cmluZywKKwlzcy1FdmVudAkJWzJdIFNTLUNvZGUsCisJLS0gVGhlIGZvbGxvd2luZyBTUy1Db2RlIHZhbHVlcyBhcmUgYWxsb3dlZCA6CisJLS0gZWN0CQlTUy1Db2RlIDo6PSAnMDAxMTAwMDEnQgorCS0tIG11bHRpUFRZCVNTLUNvZGUgOjo9ICcwMTAxMDAwMSdCCisJLS0gY2QJCVNTLUNvZGUgOjo9ICcwMDEwMDEwMCdCCisJLS0gY2NicwkJU1MtQ29kZSA6Oj0gJzAxMDAwMTAwJ0IKKwlzcy1FdmVudFNwZWNpZmljYXRpb24JWzNdIFNTLUV2ZW50U3BlY2lmaWNhdGlvbglPUFRJT05BTCwKKwlleHRlbnNpb25Db250YWluZXIJWzRdIEV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4sCisJYi1zdWJzY3JpYmVyTnVtYmVyCVs1XQlJU0ROLUFkZHJlc3NTdHJpbmcJT1BUSU9OQUwsCisJY2Nicy1SZXF1ZXN0U3RhdGUJWzZdCUNDQlMtUmVxdWVzdFN0YXRlCU9QVElPTkFMCisJfQorCitDQ0JTLVJlcXVlc3RTdGF0ZSA6Oj0gRU5VTUVSQVRFRCB7CisJcmVxdWVzdCAgCSgwKSwKKwlyZWNhbGwgIAkoMSksCisJYWN0aXZlICAJKDIpLAorCWNvbXBsZXRlZAkoMyksCisJc3VzcGVuZGVkCSg0KSwKKwlmcm96ZW4JKDUpLAorCWRlbGV0ZWQJKDYpCisJfQorCitTUy1JbnZvY2F0aW9uTm90aWZpY2F0aW9uUmVzIDo6PSBTRVFVRU5DRSB7CisJZXh0ZW5zaW9uQ29udGFpbmVyCUV4dGVuc2lvbkNvbnRhaW5lcglPUFRJT05BTCwKKwkuLi4KKwl9CisKK1NTLUV2ZW50U3BlY2lmaWNhdGlvbiA6Oj0gU0VRVUVOQ0UgU0laRSAoMS4ubWF4RXZlbnRTcGVjaWZpY2F0aW9uKSBPRgorCQkJCUFkZHJlc3NTdHJpbmcKKworbWF4RXZlbnRTcGVjaWZpY2F0aW9uICBJTlRFR0VSIDo6PSAyCisKK1JlZ2lzdGVyQ0MtRW50cnlBcmcgOjo9IFNFUVVFTkNFIHsKKwlzcy1Db2RlCQlbMF0JU1MtQ29kZSwKKwljY2JzLURhdGEJCVsxXQlDQ0JTLURhdGEJT1BUSU9OQUwsCisJLi4ufQorCitDQ0JTLURhdGEgOjo9IFNFUVVFTkNFIHsKKwljY2JzLUZlYXR1cmUJWzBdCUNDQlMtRmVhdHVyZSwKKwl0cmFuc2xhdGVkQi1OdW1iZXIJWzFdCUlTRE4tQWRkcmVzc1N0cmluZywKKwlzZXJ2aWNlSW5kaWNhdG9yCVsyXQlTZXJ2aWNlSW5kaWNhdG9yCU9QVElPTkFMLAorCWNhbGxJbmZvCQlbM10JRXh0ZXJuYWxTaWduYWxJbmZvLAorCW5ldHdvcmtTaWduYWxJbmZvCVs0XQlFeHRlcm5hbFNpZ25hbEluZm8sCisJLi4ufQorCitTZXJ2aWNlSW5kaWNhdG9yIDo6PSBCSVQgU1RSSU5HIHsKKwljbGlyLWludm9rZWQgKDApLAorCWNhbWVsLWludm9rZWQgKDEpfSAoU0laRSgyLi4zMikpIAorCS0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKwktLSBiaXRzIDIgdG8gMzEgc2hhbGwgYmUgaWdub3JlZCBpZiByZWNlaXZlZCBhbmQgbm90IHVuZGVyc3Rvb2QKKworUmVnaXN0ZXJDQy1FbnRyeVJlcyA6Oj0gU0VRVUVOQ0UgeworCWNjYnMtRmVhdHVyZQlbMF0gQ0NCUy1GZWF0dXJlCU9QVElPTkFMLAorCS4uLn0KKworRXJhc2VDQy1FbnRyeUFyZyA6Oj0gU0VRVUVOQ0UgeworCXNzLUNvZGUJCVswXQlTUy1Db2RlLAorCWNjYnMtSW5kZXgJWzFdCUNDQlMtSW5kZXgJT1BUSU9OQUwsCisJLi4ufQorCitFcmFzZUNDLUVudHJ5UmVzIDo6PSBTRVFVRU5DRSB7CisJc3MtQ29kZQkJWzBdCVNTLUNvZGUsCisJc3MtU3RhdHVzCQlbMV0gU1MtU3RhdHVzCU9QVElPTkFMLAorCS4uLn0KKworRU5ECisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVRTLUNvZGUuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9NQVAtVFMtQ29kZS5hc24KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWFjMDBiZgotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2FzbjEvTUFQLVRTLUNvZGUuYXNuCkBAIC0wLDAgKzEsOTIgQEAKKy0tICRJZDogTUFQLVRTLUNvZGUuYXNuIDI4MTQ5IDIwMDktMDQtMjUgMTc6NDU6MzRaIGV0eHJhYiAkCistLSAzR1BQIFRTIDI5LjAwMiBWOC45LjAgKDIwMDktMDQpIAorLS0gMTcuNy45CVRlbGVzZXJ2aWNlIENvZGVzCisgCitNQVAtVFMtQ29kZSB7CisgICBpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorICAgZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1UUy1Db2RlICgxOSkgdmVyc2lvbjExICgxMSl9CisKK0RFRklOSVRJT05TCisKKzo6PQorCitCRUdJTgorCitUZWxlc2VydmljZUNvZGUgOjo9IE9DVEVUIFNUUklORyAoU0laRSAoMSkpCisJLS0gVGhpcyB0eXBlIGlzIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBjb2RlIGlkZW50aWZ5aW5nIGEgc2luZ2xlCisJLS0gdGVsZXNlcnZpY2UsIGEgZ3JvdXAgb2YgdGVsZXNlcnZpY2VzLCBvciBhbGwgdGVsZXNlcnZpY2VzLiBUaGUKKwktLSBzZXJ2aWNlcyBhcmUgZGVmaW5lZCBpbiBUUyBHU00gMjIuMDAzIFs0XS4KKwktLSBUaGUgaW50ZXJuYWwgc3RydWN0dXJlIGlzIGRlZmluZWQgYXMgZm9sbG93czoKKworCS0tIGJpdHMgODc2NTQzMjE6IGdyb3VwIChiaXRzIDg3NjUpIGFuZCBzcGVjaWZpYyBzZXJ2aWNlCisJLS0gKGJpdHMgNDMyMSkKKworRXh0LVRlbGVzZXJ2aWNlQ29kZSA6Oj0gT0NURVQgU1RSSU5HIChTSVpFICgxLi41KSkKKwktLSBUaGlzIHR5cGUgaXMgdXNlZCB0byByZXByZXNlbnQgdGhlIGNvZGUgaWRlbnRpZnlpbmcgYSBzaW5nbGUKKwktLSB0ZWxlc2VydmljZSwgYSBncm91cCBvZiB0ZWxlc2VydmljZXMsIG9yIGFsbCB0ZWxlc2VydmljZXMuIFRoZQorCS0tIHNlcnZpY2VzIGFyZSBkZWZpbmVkIGluIFRTIEdTTSAyMi4wMDMgWzRdLgorCS0tIFRoZSBpbnRlcm5hbCBzdHJ1Y3R1cmUgaXMgZGVmaW5lZCBhcyBmb2xsb3dzOgorCisJLS0gT0NURVQgMToKKwktLSBiaXRzIDg3NjU0MzIxOiBncm91cCAoYml0cyA4NzY1KSBhbmQgc3BlY2lmaWMgc2VydmljZQorCS0tIChiaXRzIDQzMjEpCisKKwktLSBPQ1RFVFMgMi01OiByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZS4gSWYgcmVjZWl2ZWQgdGhlCisgICAgLS0gRXh0LVRlbGVzZXJ2aWNlQ29kZSBzaGFsbCBiZQorIAktLSB0cmVhdGVkIGFjY29yZGluZyB0byB0aGUgZXhjZXB0aW9uIGhhbmRsaW5nIGRlZmluZWQgZm9yIHRoZQorCS0tIG9wZXJhdGlvbiB0aGF0IHVzZXMgdGhpcyB0eXBlLgorCisJLS0gRXh0LVRlbGVzZXJ2aWNlQ29kZSBpbmNsdWRlcyBhbGwgdmFsdWVzIGRlZmluZWQgZm9yIFRlbGVzZXJ2aWNlQ29kZS4KKworYWxsVGVsZXNlcnZpY2VzCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAwMDAwMDAwJ0IKKworYWxsU3BlZWNoVHJhbnNtaXNzaW9uU2VydmljZXMJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDAwMTAwMDAnQgordGVsZXBob255CQkJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDAwMTAwMDEnQgorZW1lcmdlbmN5Q2FsbHMJCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAwMDEwMDEwJ0IKKworYWxsU2hvcnRNZXNzYWdlU2VydmljZXMJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDAxMDAwMDAnQgorc2hvcnRNZXNzYWdlTVQtUFAJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDAxMDAwMDEnQgorc2hvcnRNZXNzYWdlTU8tUFAJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDAxMDAwMTAnQgorCithbGxGYWNzaW1pbGVUcmFuc21pc3Npb25TZXJ2aWNlcwlUZWxlc2VydmljZUNvZGUgOjo9ICcwMTEwMDAwMCdCCitmYWNzaW1pbGVHcm91cDNBbmRBbHRlclNwZWVjaAlUZWxlc2VydmljZUNvZGUgOjo9ICcwMTEwMDAwMSdCCithdXRvbWF0aWNGYWNzaW1pbGVHcm91cDMJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMDExMDAwMTAnQgorZmFjc2ltaWxlR3JvdXA0CVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAxMTAwMDExJ0IKKworLS0gVGhlIGZvbGxvd2luZyBub24taGllcmFyY2hpY2FsIENvbXBvdW5kIFRlbGVzZXJ2aWNlIEdyb3VwcworLS0gYXJlIGRlZmluZWQgaW4gVFMgM0dQUCBUUyAyMi4wMzA6CithbGxEYXRhVGVsZXNlcnZpY2VzCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzAxMTEwMDAwJ0IKKwktLSBjb3ZlcnMgVGVsZXNlcnZpY2UgR3JvdXBzICdhbGxGYWNzaW1pbGVUcmFuc21pc3Npb25TZXJ2aWNlcycKKwktLSBhbmQgJ2FsbFNob3J0TWVzc2FnZVNlcnZpY2VzJworYWxsVGVsZXNlcnZpY2VzLUV4ZXB0U01TCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzEwMDAwMDAwJ0IKKwktLSBjb3ZlcnMgVGVsZXNlcnZpY2UgR3JvdXBzICdhbGxTcGVlY2hUcmFuc21pc3Npb25TZXJ2aWNlcycgYW5kCisJLS0gJ2FsbEZhY3NpbWlsZVRyYW5zbWlzc2lvblNlcnZpY2VzJworLS0KKy0tIENvbXBvdW5kIFRlbGVzZXJ2aWNlIEdyb3VwIENvZGVzIGFyZSBvbmx5IHVzZWQgaW4gY2FsbAorLS0gaW5kZXBlbmRlbnQgc3VwcGxlbWVudGFyeSBzZXJ2aWNlIG9wZXJhdGlvbnMsIGkuZS4gdGhleQorLS0gYXJlIG5vdCB1c2VkIGluIEluc2VydFN1YnNjcmliZXJEYXRhIG9yIGluCistLSBEZWxldGVTdWJzY3JpYmVyRGF0YSBtZXNzYWdlcy4KKworYWxsVm9pY2VHcm91cENhbGxTZXJ2aWNlcwlUZWxlc2VydmljZUNvZGUgOjo9ICcxMDAxMDAwMCdCCit2b2ljZUdyb3VwQ2FsbAkJVGVsZXNlcnZpY2VDb2RlIDo6PSAnMTAwMTAwMDEnQgordm9pY2VCcm9hZGNhc3RDYWxsCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzEwMDEwMDEwJ0IKKworYWxsUExNTi1zcGVjaWZpY1RTCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMDAwJ0IKK3BsbW4tc3BlY2lmaWNUUy0xCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMDAxJ0IKK3BsbW4tc3BlY2lmaWNUUy0yCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMDEwJ0IKK3BsbW4tc3BlY2lmaWNUUy0zCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMDExJ0IKK3BsbW4tc3BlY2lmaWNUUy00CVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMTAwJ0IKK3BsbW4tc3BlY2lmaWNUUy01CVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMTAxJ0IKK3BsbW4tc3BlY2lmaWNUUy02CVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMTEwJ0IKK3BsbW4tc3BlY2lmaWNUUy03CVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDEwMTExJ0IKK3BsbW4tc3BlY2lmaWNUUy04CVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDExMDAwJ0IKK3BsbW4tc3BlY2lmaWNUUy05CVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDExMDAxJ0IKK3BsbW4tc3BlY2lmaWNUUy1BCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDExMDEwJ0IKK3BsbW4tc3BlY2lmaWNUUy1CCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDExMDExJ0IKK3BsbW4tc3BlY2lmaWNUUy1DCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDExMTAwJ0IKK3BsbW4tc3BlY2lmaWNUUy1ECVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDExMTAxJ0IKK3BsbW4tc3BlY2lmaWNUUy1FCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDExMTEwJ0IKK3BsbW4tc3BlY2lmaWNUUy1GCVRlbGVzZXJ2aWNlQ29kZSA6Oj0gJzExMDExMTExJ0IKKworRU5ECisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvUlJMUC1Db21wb25lbnRzLmFzbiBiL3JybHAtZXBoZW1lcmlzL2FzbjEvUlJMUC1Db21wb25lbnRzLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYmFkZTZhCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9SUkxQLUNvbXBvbmVudHMuYXNuCkBAIC0wLDAgKzEsMTQ4OCBAQAorLS0gUlJMUC1Db21wb25lbnRzLmFzbgorLS0gJElkJAorLS0gVGFrZW4gZnJvbSAzR1BQIFRTIDQ0LjAzMSBWNy40LjAgKDIwMDctMDMpCistLSBodHRwOi8vd3d3LjNncHAub3JnL2Z0cC9TcGVjcy9hcmNoaXZlLzQ0X3Nlcmllcy80NC4wMzEvNDQwMzEtNzQwLnppcC80NDAzMS03NDAuZG9jCistLQorLS0gNCBDb21wb25lbnRzCistLSA1IEVsZW1lbnRzIG9mIENvbXBvbmVudHMKKy0tCisKK1JSTFAtQ29tcG9uZW50cworLS0geyBSUkxQLUNvbXBvbmVudHMgfQorCitERUZJTklUSU9OUyBBVVRPTUFUSUMgVEFHUyA6Oj0KKworQkVHSU4KKworSU1QT1JUUworCUV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiwgVmVsb2NpdHlFc3RpbWF0ZQorRlJPTQorCU1BUC1MQ1MtRGF0YVR5cGVzIHsKKwlpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorCWdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtTENTLURhdGFUeXBlcyAoMjUpIHZlcnNpb24xMSAoMTEpfQorCisJRXh0ZW5zaW9uQ29udGFpbmVyCitGUk9NIE1BUC1FeHRlbnNpb25EYXRhVHlwZXMgeworCWl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisJZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uMTEgKDExKX0KKzsKKworCistLSBBZGQgaGVyZSBvdGhlciBBU04uMSBkZWZpbml0aW9ucyBwcmVzZW50ZWQgYmVsb3cKKy0tIGluIGNoYXB0ZXJzIDQgYW5kIDUuCisKKy0tIE1lYXN1cmVtZW50IFBvc2l0aW9uIHJlcXVlc3QgY29tcG9uZW50CitNc3JQb3NpdGlvbi1SZXEgOjo9IFNFUVVFTkNFIHsKKwlwb3NpdGlvbkluc3RydWN0CQlQb3NpdGlvbkluc3RydWN0LAorCXJlZmVyZW5jZUFzc2lzdERhdGEJCVJlZmVyZW5jZUFzc2lzdERhdGEJCU9QVElPTkFMLAorCW1zckFzc2lzdERhdGEJCQlNc3JBc3Npc3REYXRhCQkJT1BUSU9OQUwsCisJc3lzdGVtSW5mb0Fzc2lzdERhdGEJU3lzdGVtSW5mb0Fzc2lzdERhdGEJT1BUSU9OQUwsCisJZ3BzLUFzc2lzdERhdGEJCQlHUFMtQXNzaXN0RGF0YQkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcgkJRXh0ZW5zaW9uQ29udGFpbmVyCQlPUFRJT05BTCwKKwkuLi4sCisJLS0gUmVsZWFzZSA5OCBleHRlbnNpb24gZWxlbWVudAorcmVsOTgtTXNyUG9zaXRpb24tUmVxLWV4dGVuc2lvbgkJCVJlbDk4LU1zclBvc2l0aW9uLVJlcS1FeHRlbnNpb24JCQlPUFRJT05BTCwJCisJLS0gUmVsZWFzZSA1IGV4dGVuc2lvbiBlbGVtZW50CityZWw1LU1zclBvc2l0aW9uLVJlcS1leHRlbnNpb24JCQlSZWw1LU1zclBvc2l0aW9uLVJlcS1FeHRlbnNpb24JCQlPUFRJT05BTCwKKwktLSBSZWxlYXNlIDcgZXh0ZW5zaW9uIGVsZW1lbnQKK3JlbDctTXNyUG9zaXRpb24tUmVxLWV4dGVuc2lvbgkJCVJlbDctTXNyUG9zaXRpb24tUmVxLUV4dGVuc2lvbgkJCU9QVElPTkFMCit9CisKKy0tIE1lYXN1cmVtZW50IFBvc2l0aW9uIHJlc3BvbnNlIGNvbXBvbmVudAorTXNyUG9zaXRpb24tUnNwIDo6PSBTRVFVRU5DRSB7CisJbXVsdGlwbGVTZXRzCQkJTXVsdGlwbGVTZXRzCQkJT1BUSU9OQUwsCisJcmVmZXJlbmNlSWRlbnRpdHkJCVJlZmVyZW5jZUlkZW50aXR5CQlPUFRJT05BTCwKKwlvdGQtTWVhc3VyZUluZm8JCQlPVEQtTWVhc3VyZUluZm8JCQlPUFRJT05BTCwKKwlsb2NhdGlvbkluZm8JCQlMb2NhdGlvbkluZm8JCQlPUFRJT05BTCwKKwlncHMtTWVhc3VyZUluZm8JCQlHUFMtTWVhc3VyZUluZm8JCQlPUFRJT05BTCwKKwlsb2NhdGlvbkVycm9yCQkJTG9jYXRpb25FcnJvcgkJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcgkJRXh0ZW5zaW9uQ29udGFpbmVyCQlPUFRJT05BTCwKKwkuLi4sCQorCS0tIFJlbGVhc2UgZXh0ZW5zaW9uIGhlcmUKKwlyZWwtOTgtTXNyUG9zaXRpb24tUnNwLUV4dGVuc2lvbgkJCisJCQkJCQkJUmVsLTk4LU1zclBvc2l0aW9uLVJzcC1FeHRlbnNpb24JCU9QVElPTkFMLAorCXJlbC01LU1zclBvc2l0aW9uLVJzcC1FeHRlbnNpb24KKwkJCQkJCQlSZWwtNS1Nc3JQb3NpdGlvbi1Sc3AtRXh0ZW5zaW9uCQlPUFRJT05BTCwKKwktLSByZWwtNS1Nc3JQb3NpdGlvbi1Sc3AtRXh0ZW5zaW9uIGFuZCBvdGhlciBwb3NzaWJsZSBmdXR1cmUgZXh0ZW5zaW9ucworCS0tIGFyZSB0aGUgb25seSBpbmZvcm1hdGlvbiBlbGVtZW50cyB0aGF0IG1heSBiZSBpbmNsdWRlZCBpbiB0aGUgMm5kCisJLS0gTXNyUG9zaXRpb24tUnNwIGNvbXBvbmVudCB3aGVuIFJSTFAgcHNldWRvLXNlZ21lbnRhdGlvbiBpcyB1c2VkCisJcmVsLTctTXNyUG9zaXRpb24tUnNwLUV4dGVuc2lvbgorCQkJCQkJCVJlbC03LU1zclBvc2l0aW9uLVJzcC1FeHRlbnNpb24JCU9QVElPTkFMCit9CisKKy0tIEFzc2lzdGFuY2UgRGF0YSBjb21wb25lbnQKK0Fzc2lzdGFuY2VEYXRhIDo6PSBTRVFVRU5DRSB7CisJcmVmZXJlbmNlQXNzaXN0RGF0YQlSZWZlcmVuY2VBc3Npc3REYXRhCQkJT1BUSU9OQUwsCisJbXNyQXNzaXN0RGF0YQkJCU1zckFzc2lzdERhdGEJCQlPUFRJT05BTCwKKwlzeXN0ZW1JbmZvQXNzaXN0RGF0YQlTeXN0ZW1JbmZvQXNzaXN0RGF0YQlPUFRJT05BTCwKKwlncHMtQXNzaXN0RGF0YQkJCUdQUy1Bc3Npc3REYXRhCQkJT1BUSU9OQUwsCQorCW1vcmVBc3NEYXRhVG9CZVNlbnQJCU1vcmVBc3NEYXRhVG9CZVNlbnQJCU9QVElPTkFMLAktLSBJZiBub3QgcHJlc2VudCwgaW50ZXJwcmV0IGFzIG9ubHkKKwkJCQkJCQkJCQkJCQkJCQktLSBBc3Npc3RhbmNlIERhdGEgY29tcG9uZW50IHVzZWQgdG8KKwkJCQkJCQkJCQkJCQkJCQktLSBkZWxpdmVyIGVudGlyZSBzZXQgb2YgYXNzaXN0YW5jZQorCQkJCQkJCQkJCQkJCQkJCS0tIGRhdGEuCisJZXh0ZW5zaW9uQ29udGFpbmVyCQlFeHRlbnNpb25Db250YWluZXIJCU9QVElPTkFMLAorCS4uLiwKKwktLSBSZWxlYXNlIGV4dGVuc2lvbiBoZXJlCisJcmVsOTgtQXNzaXN0YW5jZURhdGEtRXh0ZW5zaW9uCVJlbDk4LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbglPUFRJT05BTCwKKwlyZWw1LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbglSZWw1LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbglPUFRJT05BTCwKKyByZWw3LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbiBSZWw3LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbiBPUFRJT05BTAkKK30KKworLS0gUHJvdG9jb2wgRXJyb3IgY29tcG9uZW50CitQcm90b2NvbEVycm9yIDo6PSBTRVFVRU5DRSB7CisJZXJyb3JDYXVzZQkJCQlFcnJvckNvZGVzLAkKKwlleHRlbnNpb25Db250YWluZXIJCUV4dGVuc2lvbkNvbnRhaW5lcgkJT1BUSU9OQUwsCisJLi4uLAorCS0tIFJlbGVhc2UgZXh0ZW5zaW9ucyBoZXJlCisJcmVsLTUtUHJvdG9jb2xFcnJvci1FeHRlbnNpb24gUmVsLTUtUHJvdG9jb2xFcnJvci1FeHRlbnNpb24JCU9QVElPTkFMCit9CisKKy0tIFBvc2l0aW9uIGluc3RydWN0aW9ucworUG9zaXRpb25JbnN0cnVjdCA6Oj0gU0VRVUVOQ0UgeworCS0tIE1ldGhvZCB0eXBlCisJbWV0aG9kVHlwZQkJCQlNZXRob2RUeXBlLAkKKwlwb3NpdGlvbk1ldGhvZAkJCVBvc2l0aW9uTWV0aG9kLAorCW1lYXN1cmVSZXNwb25zZVRpbWUJCU1lYXN1cmVSZXNwb25zZVRpbWUsCQkKKwl1c2VNdWx0aXBsZVNldHMJCQlVc2VNdWx0aXBsZVNldHMsCQkKKwllbnZpcm9ubWVudENoYXJhY3RlcglFbnZpcm9ubWVudENoYXJhY3RlcglPUFRJT05BTAkKK30KKworLS0KK01ldGhvZFR5cGUgOjo9IENIT0lDRSB7CisJbXNBc3Npc3RlZAkJQWNjdXJhY3lPcHQsCS0tIGFjY3VyYWN5IGlzIG9wdGlvbmFsCisJbXNCYXNlZAkJCUFjY3VyYWN5LAkJLS0gYWNjdXJhY3kgaXMgbWFuZGF0b3J5CisJbXNCYXNlZFByZWYJCUFjY3VyYWN5LAkJLS0gYWNjdXJhY3kgaXMgbWFuZGF0b3J5CisJbXNBc3Npc3RlZFByZWYJQWNjdXJhY3kgCQktLSBhY2N1cmFjeSBpcyBtYW5kYXRvcnkKK30KKworLS0gQWNjdXJhY3kgb2YgdGhlIGxvY2F0aW9uIGVzdGltYXRpb24KK0FjY3VyYWN5T3B0IDo6PSBTRVFVRU5DRSB7CisJYWNjdXJhY3kJCUFjY3VyYWN5CU9QVElPTkFMCit9CisKKy0tIFRoZSB2YWx1ZXMgb2YgdGhpcyBmaWVsZCBhcmUgZGVmaW5lZCBpbiAzR1BQIFRTIDIzLjAzMiAoVW5jZXJ0YWludHkgY29kZSkKK0FjY3VyYWN5IDo6PSBJTlRFR0VSICgwLi4xMjcpCisKKworLS0gUG9zaXRpb24gTWV0aG9kCitQb3NpdGlvbk1ldGhvZCA6Oj0gRU5VTUVSQVRFRCB7CisJZW90ZCAoMCksCisJZ3BzICgxKSwKKwlncHNPckVPVEQgKDIpCit9CisKKy0tIE1lYXN1cmVtZW50IHJlcXVlc3QgcmVzcG9uc2UgdGltZQorTWVhc3VyZVJlc3BvbnNlVGltZSA6Oj0gSU5URUdFUiAoMC4uNykKKworLS0gdXNlTXVsdGlwbGUgU2V0cywgRkZTIQorVXNlTXVsdGlwbGVTZXRzIDo6PSBFTlVNRVJBVEVEIHsKKwltdWx0aXBsZVNldHMgKDApLAkJLS0gbXVsdGlwbGUgc2V0cyBhcmUgYWxsb3dlZAorCW9uZVNldCAoMSkJCQkJLS0gc2VuZGluZyBvZiBtdWx0aXBsZSBpcyBub3QgYWxsb3dlZAorfQorCistLSBFbnZpcm9ubWVudCBjaGFyYWN0ZXJpemF0aW9uCitFbnZpcm9ubWVudENoYXJhY3RlciA6Oj0gRU5VTUVSQVRFRCB7CisJYmFkQXJlYSAoMCksCQktLSBiYWQgdXJiYW4gb3Igc3VidXJiYW4sIGhlYXZ5IG11bHRpcGF0aCBhbmQgTkxPUworCW5vdEJhZEFyZWEgKDEpLAkJLS0gbGlnaHQgbXVsdGlwYXRoIGFuZCBOTE9TCisJbWl4ZWRBcmVhICgyKSwJCS0tIG5vdCBkZWZpbmVkIG9yIG1peGVkIGVudmlyb25tZW50CisJLi4uCit9CisKKy0tIEUtT1REIHJlZmVyZW5jZSBCVFMgZm9yIEFzc2l0YW5jZSBkYXRhIElFCitSZWZlcmVuY2VBc3Npc3REYXRhIDo6PSBTRVFVRU5DRSB7CisJYmNjaENhcnJpZXIJCUJDQ0hDYXJyaWVyLAkJCQkJCS0tIEJDQ0ggY2FycmllcgorCWJzaWMJCQlCU0lDLAkJCQkJCQkJLS0gQlNJQworCXRpbWVTbG90U2NoZW1lCVRpbWVTbG90U2NoZW1lLCAJCQkJCS0tIFRpbWVzbG90IHNjaGVtZQorCWJ0c1Bvc2l0aW9uCQlCVFNQb3NpdGlvbgkJCU9QVElPTkFMCit9CisKKy0tIGVsbGlwc29pZCBwb2ludCBhbmQKKy0tIGVsbGlwc29pZCBwb2ludCB3aXRoIGFsdGl0dWRlIGFuZCB1bmNlcnRhaW50eSBlbGxpcHNvaWQgc2hhcGVzIGFyZSBzdXBwb3J0ZWQKK0JUU1Bvc2l0aW9uIDo6PSBFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24KKworLS0gUkYgY2hhbm5lbCBudW1iZXIgb2YgQkNDSAorQkNDSENhcnJpZXIgOjo9IElOVEVHRVIgKDAuLjEwMjMpCisKKy0tIEJhc2Ugc3RhdGlvbiBJZGVudGl0eSBDb2RlCitCU0lDIDo6PSBJTlRFR0VSICgwLi42MykKKworLS0gVGltZXNsb3Qgc2NoZW1lCitUaW1lU2xvdFNjaGVtZSA6Oj0gRU5VTUVSQVRFRCB7CisJZXF1YWxMZW5ndGggKDApLAorCXZhcmlvdXNMZW5ndGggKDEpCit9CisKKy0tIFRpbWUgc2xvdCAobW9kdWxvKQorTW9kdWxvVGltZVNsb3QgOjo9IElOVEVHRVIgKDAuLjMpCisKKy0tIEUtT1REIG1lYXN1cmVtZW50IGFzc2lzdGFuY2UgZGF0YSBJRQorLS0gVGhlIHRvdGFsIG51bWJlciBvZiBuZWlnaGJvcnMgaW4gdGhpcyBlbGVtZW50IChNc3JBc3Npc3REYXRhKQorLS0gYW5kIGluIFN5c3RlbUluZm9Bc3Npc3REYXRhIGVsZW1lbnQgKHByZXNlbnRlZCBuZWlnaGJvcnMKKy0tIGNhbiBiZSBhdCBhIG1heGltdW0gMTUhKQorTXNyQXNzaXN0RGF0YSA6Oj0gU0VRVUVOQ0UgeworCSBtc3JBc3Npc3RMaXN0IFNlcU9mTXNyQXNzaXN0QlRTCit9CitTZXFPZk1zckFzc2lzdEJUUyA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTUpKSBPRiBNc3JBc3Npc3RCVFMKKworTXNyQXNzaXN0QlRTIDo6PSBTRVFVRU5DRSB7CisJYmNjaENhcnJpZXIJCQlCQ0NIQ2FycmllciwJCS0tIEJDQ0ggY2FycmllcgorCWJzaWMJCQkJQlNJQywJCQkJLS0gQlNJQworCW11bHRpRnJhbWVPZmZzZXQJTXVsdGlGcmFtZU9mZnNldCwgCS0tIG11bHRpZnJhbWUgb2Zmc2V0CisJdGltZVNsb3RTY2hlbWUJCVRpbWVTbG90U2NoZW1lLAkJLS0gVGltZXNsb3Qgc2NoZW1lCisJcm91Z2hSVEQJCQlSb3VnaFJURCwJCQktLSByb3VnaCBSVEQgdmFsdWUKKworCS0tIExvY2F0aW9uIENhbGN1bGF0aW9uIEFzc2lzdGFuY2UgZGF0YSBpcyBtb3ZlZCBoZXJlCisJY2FsY0Fzc2lzdGFuY2VCVFMJQ2FsY0Fzc2lzdGFuY2VCVFMJT1BUSU9OQUwKK30KKworLS0gTXVsdGlmcmFtZSBvZmZzZXQKK011bHRpRnJhbWVPZmZzZXQgOjo9IElOVEVHRVIgKDAuLjUxKQorLS0gVGhlIE11bHRpZnJhbWUgT2Zmc2V0IHZhbHVlIDUxIHNoYWxsIG5vdCBiZSBlbmNvZGVkIGJ5IHRoZSB0cmFuc21pdHRpbmcgZW50aXR5IGFuZAorLS0gc2hhbGwgYmUgdHJlYXRlZCBieSB0aGUgcmVjZWl2aW5nIGVudGl0eSBhcyAwLgorCistLSBSb3VnaCBSVEQgdmFsdWUgYmV0d2VlbiBvbmUgYmFzZSBzdGF0aW9uIGFuZCByZWZlcmVuY2UgQlRTCitSb3VnaFJURCA6Oj0gSU5URUdFUiAoMC4uMTI1MCkKKy0tIFRoZSBSb3VnaFJURCB2YWx1ZSAxMjUwIHNoYWxsIG5vdCBiZSBlbmNvZGVkIGJ5IHRoZSB0cmFuc21pdHRpbmcgZW50aXR5IGFuZCBzaGFsbAorLS0gYmUgdHJlYXRlZCBieSB0aGUgcmVjZWl2aW5nIGVudGl0eSBhcyAwLgorCistLSBFLU9URCBNZWFzdXJlbWVudCBhc3Npc3RhbmNlIGRhdGEgZm9yIHN5c3RlbSBpbmZvcm1hdGlvbiBMaXN0IElFCistLSBUaGUgdG90YWwgbnVtYmVyIG9mIGJhc2Ugc3RhdGlvbnMgaW4gdGhpcyBlbGVtZW50IChTeXN0ZW1JbmZvQXNzaXN0RGF0YQorLS0gcHJlc2VudGVkIG5laWdoYm9ycykgYW5kIGluIE1zckFzc2lzdERhdGEgZWxlbWVudCBjYW4gYmUgYXQgYSBtYXhpbXVtIDE1LgorU3lzdGVtSW5mb0Fzc2lzdERhdGEgOjo9IFNFUVVFTkNFIHsKKwlzeXN0ZW1JbmZvQXNzaXN0TGlzdCAJU2VxT2ZTeXN0ZW1JbmZvQXNzaXN0QlRTCit9CitTZXFPZlN5c3RlbUluZm9Bc3Npc3RCVFM6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMzIpKSBPRiBTeXN0ZW1JbmZvQXNzaXN0QlRTCisKKy0tIHdoZXRoZXIgbi50aCBpcyBwcmVzZW50IG9yIG5vdCA/CitTeXN0ZW1JbmZvQXNzaXN0QlRTIDo6PSBDSE9JQ0UgeworCW5vdFByZXNlbnQJCU5VTEwsCisJcHJlc2VudAkJCUFzc2lzdEJUU0RhdGEKK30KKworLS0gQWN0dWFsIGFzc2lzdGFuY2UgZGF0YSBmb3Igc3lzdGVtIGluZm9ybWF0aW9uIGJhc2Ugc3RhdGlvbgorQXNzaXN0QlRTRGF0YSA6Oj0gU0VRVUVOQ0UgeworCWJzaWMJCQkJQlNJQywJCQkJLS0gQlNJQworCW11bHRpRnJhbWVPZmZzZXQJTXVsdGlGcmFtZU9mZnNldCwJLS0gbXVsdGlmcmFtZSBvZmZzZXQKKwl0aW1lU2xvdFNjaGVtZQkJVGltZVNsb3RTY2hlbWUsCQktLSBUaW1lc2xvdCBzY2hlbWUKKwlyb3VnaFJURAkJCVJvdWdoUlRELAkJCS0tIHJvdWdoIFJURCB2YWx1ZQorCisJLS0gTG9jYXRpb24gQ2FsY3VsYXRpb24gQXNzaXN0YW5jZSBkYXRhCisJY2FsY0Fzc2lzdGFuY2VCVFMJQ2FsY0Fzc2lzdGFuY2VCVFMJT1BUSU9OQUwKK30KKworLS0gRS1PVEQgTG9jYXRpb24gY2FsY3VsYXRpb24gYXNzaXN0YW5jZSBkYXRhLAorLS0gQ2FsY0Fzc2lzdGFuY2VCVFMgZWxlbWVudCBpcyBvcHRpb25hbCBub3Qgc3ViZmllbGRzCitDYWxjQXNzaXN0YW5jZUJUUyA6Oj0gU0VRVUVOQ0UgeworCWZpbmVSVEQJCQkJRmluZVJURCwJCS0tIGZpbmUgUlREIHZhbHVlIGJldHdlZW4gYmFzZSBzdGF0aW9ucworCXJlZmVyZW5jZVdHUzg0CQlSZWZlcmVuY2VXR1M4NAktLSByZWZlcmVuY2UgY29vcmRpbmF0ZXMKK30KKworLS0gQ29vcmRpbmF0ZXMgb2YgbmVpZ2hib3VyIEJUUywgV0dTLTg0IGVsbGlwc29pZAorUmVmZXJlbmNlV0dTODQgOjo9IFNFUVVFTkNFIHsKKwlyZWxhdGl2ZU5vcnRoCVJlbERpc3RhbmNlLAkJCQktLSByZWxhdGl2ZSBkaXN0YW5jZSAoc291dGggbmVnYXRpdmUpCisJcmVsYXRpdmVFYXN0CVJlbERpc3RhbmNlLAkJCQktLSByZWxhdGl2ZSBkaXN0YW5jZSAod2VzdCBuZWdhdGl2ZSkKKwktLSBSZWxhdGl2ZSBBbHRpdHVkZSBpcyBub3QgYWx3YXlzIGtub3duCisJcmVsYXRpdmVBbHQJCVJlbGF0aXZlQWx0CQlPUFRJT05BTAktLSByZWxhdGl2ZSBhbHRpdHVkZQorfQorCistLSBGaW5lIFJURCB2YWx1ZSBiZXR3ZWVuIHRoaXMgQlRTIGFuZCB0aGUgcmVmZXJlbmNlIEJUUwkKK0ZpbmVSVEQgOjo9IElOVEVHRVIgKDAuLjI1NSkKKworLS0gUmVsYXRpdmUgbm9ydGgvZWFzdCBkaXN0YW5jZQorUmVsRGlzdGFuY2UgOjo9IElOVEVHRVIgKC0yMDAwMDAuLjIwMDAwMCkKKworLS0gUmVsYXRpdmUgYWx0aXR1ZGUKK1JlbGF0aXZlQWx0IDo6PSBJTlRFR0VSICgtNDAwMC4uNDAwMCkKKworLS0gTWVhc3VyZSBwb3NpdGlvbiByZXNwb25zZSBJRXMKKy0tIFJlZmVyZW5jZSBJZGVudGl0eQorLS0gTXVsdGlwbGUgc2V0cworTXVsdGlwbGVTZXRzIDo6PSBTRVFVRU5DRSB7CisJLS0gbnVtYmVyIG9mIHJlZmVyZW5jZSBzZXRzCisJbmJyT2ZTZXRzCQkJSU5URUdFUiAoMi4uMyksCQkKKworCS0tIFRoaXMgZmllbGQgYWN0dWFsbHkgdGVsbHMgdGhlIG51bWJlciBvZiByZWZlcmVuY2UgQlRTcworCW5ick9mUmVmZXJlbmNlQlRTcwlJTlRFR0VSICgxLi4zKSwKKworCS0tIFRoaXMgZmllbGQgaXMgY29uZGl0aW9uYWwgYW5kIGluY2x1ZGVkIG9wdGlvbmFsbHkgb25seSBpZgorCS0tIG5ick9mU2V0cyBpcyAzIGFuZCBudW1iZXIgb2YgcmVmZXJlbmNlIEJUU3MgaXMgMi4KKwlyZWZlcmVuY2VSZWxhdGlvbgkJUmVmZXJlbmNlUmVsYXRpb24JCU9QVElPTkFMCit9CisKKy0tIFJlbGF0aW9uIGJldHdlZW4gcmVmZW5jZSBCVFNzIGFuZCBzZXRzCitSZWZlcmVuY2VSZWxhdGlvbiA6Oj0gRU5VTUVSQVRFRCB7CisJc2Vjb25kQlRTVGhpcmRTZXQgKDApLAktLSAxc3QgQlRTIHJlbGF0ZWQgdG8gMXN0IGFuZCAybmQgc2V0cworCXNlY29uZEJUU1NlY29uZFNldCAoMSksCS0tIDFzdCBCVFMgcmVsYXRlZCB0byAxc3QgYW5kIDNyZCBzZXRzCisJZmlyc3RCVFNGaXJzdFNldCAoMikJLS0gMXN0IEJUUyByZWxhdGVkIHRvIDFzdCBzZXQKK30KKworLS0gUmVmZXJlbmNlIEJUUyBJZGVudGl0eSwgdGhpcyBlbGVtZW50IGNvbnRhaW5zIG51bWJlciBvZgorLS0gQlRTcyB0b2xkIG5ick9mUmVmZXJlbmNlQlRTcyBmaWVsZCBpbiBNdWx0aXBsZSBzZXRzIGVsZW1lbnQpCitSZWZlcmVuY2VJZGVudGl0eSA6Oj0gU0VRVUVOQ0UgeworCS0tIFJlZmVyZW5jZSBCVFMgbGlzdAorCXJlZkJUU0xpc3QJCVNlcU9mUmVmZXJlbmNlSWRlbnRpdHlUeXBlCit9CitTZXFPZlJlZmVyZW5jZUlkZW50aXR5VHlwZSA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMykpIE9GIFJlZmVyZW5jZUlkZW50aXR5VHlwZQorCistLSBDZWxsIGlkZW50aXR5CitSZWZlcmVuY2VJZGVudGl0eVR5cGUgOjo9IENIT0lDRSB7CisJYnNpY0FuZENhcnJpZXIJQlNJQ0FuZENhcnJpZXIsCQktLSBCU0lDIGFuZCBDYXJyaWVyCisJY2kJCQkJQ2VsbElELAkJCQktLSBDZWxsIElELCBMQUMgbm90IG5lZWRlZAorCXJlcXVlc3RJbmRleAlSZXF1ZXN0SW5kZXgsCQktLSBJbmRleCB0byBSZXF1ZXN0ZWQgTmVpZ2hib3IgTGlzdAorCXN5c3RlbUluZm9JbmRleAlTeXN0ZW1JbmZvSW5kZXgsCS0tIEluZGV4IHRvIFN5c3RlbSBpbmZvIGxpc3QsIHRoaXMgdHlwZSBvZiByZWYuIGlkZW50aXR5CisJCQkJCQkJCQkJLS0gc2hhbGwgbm90IGJlIHVzZWQgYnkgdGhlIE1TIHVubGVzcyBpdCBoYXMgcmVjZWl2ZWQKKwkJCQkJCQkJCQktLSB0aGUgU3lzdGVtSW5mb0Fzc2lzdERhdGEgZnJvbSB0aGUgU01MQyBmb3IgdGhpcyBjZWxsLgorCWNpQW5kTEFDCQlDZWxsSURBbmRMQUMJCS0tIENJIGFuZCBMQUMKK30KKworQlNJQ0FuZENhcnJpZXIgOjo9IFNFUVVFTkNFIHsKKwljYXJyaWVyCUJDQ0hDYXJyaWVyLAorCWJzaWMJCUJTSUMKK30KKworUmVxdWVzdEluZGV4IDo6PSBJTlRFR0VSICgxLi4xNikKKworU3lzdGVtSW5mb0luZGV4IDo6PSBJTlRFR0VSICgxLi4zMikKKworQ2VsbElEQW5kTEFDIDo6PSBTRVFVRU5DRSB7CisJcmVmZXJlbmNlTEFDCUxBQ0lELAkJCQktLSBMb2NhdGlvbiBhcmVhIGNvZGUKKwlyZWZlcmVuY2VDSQkJQ2VsbElECQkJCS0tIENlbGwgaWRlbnRpdHkKK30KK0NlbGxJRCA6Oj0gSU5URUdFUiAoMC4uNjU1MzUpCitMQUNJRCA6Oj0gSU5URUdFUiAoMC4uNjU1MzUpCisKKy0tIE9URC1NZWFzdXJlSW5mbworT1RELU1lYXN1cmVJbmZvIDo6PSBTRVFVRU5DRSB7CisJLS0gTWVhc3VyZW1lbnQgaW5mbyBlbGVtZW50cywgT1RELU1zckVsZW1lbnQgaXMgcmVwZWF0ZWQgbnVtYmVyIG9mIHRpbWVzCisJLS0gdG9sZCBpbiBuYnJPZlJlZmVyZW5jZUJUU3MgaW4gTXVsdGlwbGVTZXRzLCBkZWZhdWx0IHZhbHVlIGlzIDEKKwlvdGRNc3JGaXJzdFNldHMJCU9URC1Nc3JFbGVtZW50Rmlyc3QsCisKKwktLSBpZiBtb3JlIHRoYW4gb25lIHNldHMgYXJlIHByZXNlbnQgdGhpcyBlbGVtZW50IGlzIHJlcGVhdGVkCisJLS0gTnVtYmVyT2ZTZXRzIC0gMSAoLTEgPSBmaXJzdCBzZXQpCisJb3RkTXNyUmVzdFNldHMJCVNlcU9mT1RELU1zckVsZW1lbnRSZXN0CQlPUFRJT05BTAorfQorCitTZXFPZk9URC1Nc3JFbGVtZW50UmVzdCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMikpIE9GIE9URC1Nc3JFbGVtZW50UmVzdAorCistLSBPVEQgbWVhc3VyZW50IGluZm9ybWF0aW9uIGZvciAxIHNldAorT1RELU1zckVsZW1lbnRGaXJzdCA6Oj0gU0VRVUVOQ0UgeworCXJlZkZyYW1lTnVtYmVyCQkJSU5URUdFUiAoMC4uNDI0MzEpLCAJCQkJLS0gRnJhbWUgbnVtYmVyIG1vZHVsbyA0MjQzMgorCXJlZmVyZW5jZVRpbWVTbG90CQlNb2R1bG9UaW1lU2xvdCwKKwl0b2FNZWFzdXJlbWVudHNPZlJlZglUT0EtTWVhc3VyZW1lbnRzT2ZSZWYJT1BUSU9OQUwsCisJc3RkUmVzb2x1dGlvbgkJCVN0ZFJlc29sdXRpb24sCisJdGFDb3JyZWN0aW9uCQkJSU5URUdFUiAoMC4uOTYwKQkJT1BUSU9OQUwsCS0tIFRBIGNvcnJlY3Rpb24KKworCS0tIG1lYXN1cmVkIG5laWdoYm9ycyBpbiBPVEQgbWVhc3VyZW1lbnRzCisJb3RkLUZpcnN0U2V0TXNycyAJCVNlcU9mT1RELUZpcnN0U2V0TXNycyAJT1BUSU9OQUwKK30KK1NlcU9mT1RELUZpcnN0U2V0TXNycyA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTApKSBPRiBPVEQtRmlyc3RTZXRNc3JzCisKKy0tIE9URCBtZWFzdXJlbnQgaW5mb3JtYXRpb24gMiBhbmQgMyBzZXRzIGlmIGV4aXN0CitPVEQtTXNyRWxlbWVudFJlc3QgOjo9IFNFUVVFTkNFIHsKKwlyZWZGcmFtZU51bWJlcgkJCUlOVEVHRVIgKDAuLjQyNDMxKSwgCQkJCQktLSBGcmFtZSBudW1iZXIgbW9kdWxvIDQyNDMyCisJcmVmZXJlbmNlVGltZVNsb3QJCU1vZHVsb1RpbWVTbG90LAorCXRvYU1lYXN1cmVtZW50c09mUmVmCVRPQS1NZWFzdXJlbWVudHNPZlJlZgkJT1BUSU9OQUwsCisJc3RkUmVzb2x1dGlvbgkJCVN0ZFJlc29sdXRpb24sCisJdGFDb3JyZWN0aW9uCQkJSU5URUdFUiAoMC4uOTYwKQkJCU9QVElPTkFMLAktLSBUQSBjb3JyZWN0aW9uCisKKwktLSBtZWFzdXJlZCBuZWlnaGJvcnMgaW4gT1REIG1lYXN1cmVtZW50cworCW90ZC1Nc3JzT2ZPdGhlclNldHMgCVNlcU9mT1RELU1zcnNPZk90aGVyU2V0cwlPUFRJT05BTAorfQorU2VxT2ZPVEQtTXNyc09mT3RoZXJTZXRzIDo6PSBTRVFVRU5DRSAoU0laRSgxLi4xMCkpIE9GIE9URC1Nc3JzT2ZPdGhlclNldHMKKworLS0gU3RhbmRhcmQgZGV2aWF0aW9uIG9mIHRoZSBUT0EgbWVhc3VyZW1lbnRzIGZyb20gdGhlIHJlZmVyZW5jZSBCVFMKK1RPQS1NZWFzdXJlbWVudHNPZlJlZiA6Oj0gU0VRVUVOQ0UgeworCXJlZlF1YWxpdHkJCQlSZWZRdWFsaXR5LAorCW51bU9mTWVhc3VyZW1lbnRzCU51bU9mTWVhc3VyZW1lbnRzCit9CisKK1JlZlF1YWxpdHkgOjo9IElOVEVHRVIgKDAuLjMxKQkJCS0tIFN0IERldiBvZiBUT0Egb2YgcmVmZXJlbmNlIGFzIGRlZmluZWQgaW4gYW5uZXgKK051bU9mTWVhc3VyZW1lbnRzIDo6PSBJTlRFR0VSICgwLi43KQktLSBOby4gb2YgbWVhc3VyZW1lbnRzIGZvciBSZWZRdWFsaXR5IGFzIGRlZmluZWQgaW4gYW5uZXgKK1N0ZFJlc29sdXRpb24gOjo9IElOVEVHRVIgKDAuLjMpCQktLSBWYWx1ZXMgb2YgcmVzb2x1dGlvbiBhcmUgZGVmaW5lZCBpbiBhbm5leAorCitPVEQtRmlyc3RTZXRNc3JzIDo6PSBPVEQtTWVhc3VyZW1lbnRXaXRoSUQKKworLS0gTmVpZ2hib3VyIGluZm8gaW4gT1REIG1lYXN1cmVtZW50cyAwLTEwIHRpbWVzIGluIFREIG1lYXN1cmVtZW50IGluZm8KK09URC1Nc3JzT2ZPdGhlclNldHMgOjo9IENIT0lDRSB7CisJaWRlbnRpdHlOb3RQcmVzZW50CU9URC1NZWFzdXJlbWVudCwJCisJaWRlbnRpdHlQcmVzZW50CQlPVEQtTWVhc3VyZW1lbnRXaXRoSUQKK30KKworLS0gRm9yIHRoaXMgT1REIG1lYXN1cmVtZW50IGlkZW50aXR5IGlzIHNhbWUgYXMgdGhlIGlkZW50aXR5IG9mIEJUUworLS0gaW4gdGhlIGZpcnN0IHNldCB3aXRoIHNhbWUgc2VxdWVuY2UgbnVtYmVyCitPVEQtTWVhc3VyZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwluYm9yVGltZVNsb3QJTW9kdWxvVGltZVNsb3QsCisJZW90ZFF1YWxpdHkJCUVPVERRdWFsaXR5LAorCW90ZFZhbHVlCQlPVERWYWx1ZQorfQorCistLSBUaGlzIG1lYXN1cmVtZW50IGNvbnRhaW5zIHRoZSBCVFMgaWRlbnRpdHkgYW5kIG1lYXN1cmVtZW50CitPVEQtTWVhc3VyZW1lbnRXaXRoSUQgOjo9U0VRVUVOQ0UgeworCW5laWdoYm9ySWRlbnRpdHkJTmVpZ2hib3JJZGVudGl0eSwKKwluYm9yVGltZVNsb3QJCU1vZHVsb1RpbWVTbG90LAorCWVvdGRRdWFsaXR5CQkJRU9URFF1YWxpdHksCisJb3RkVmFsdWUJCQlPVERWYWx1ZQorfQorCitFT1REUXVhbGl0eSA6Oj0gU0VRVUVOQ0UgeworCW5ick9mTWVhc3VyZW1lbnRzCUlOVEVHRVIJKDAuLjcpLAorCXN0ZE9mRU9URAkJCUlOVEVHRVIgKDAuLjMxKQorfQorCitOZWlnaGJvcklkZW50aXR5IDo6PSBDSE9JQ0UgeworCWJzaWNBbmRDYXJyaWVyCQlCU0lDQW5kQ2FycmllciwJCS0tIEJTSUMgYW5kIENhcnJpZXIKKwljaQkJCQkJQ2VsbElELAkJCQktLSBDZWxsIElELCBMQUMgbm90IG5lZWRlZAorCW11bHRpRnJhbWVDYXJyaWVyCU11bHRpRnJhbWVDYXJyaWVyLCAJLS0gTXVsdGlGcmFtZU9mZmVzdCBhbmQgQlNJQworCXJlcXVlc3RJbmRleAkJUmVxdWVzdEluZGV4LAkJLS0gSW5kZXggdG8gUmVxdWVzdGVkIE5laWdoYm9yIExpc3QKKwlzeXN0ZW1JbmZvSW5kZXgJCVN5c3RlbUluZm9JbmRleCwJLS0gSW5kZXggdG8gU3lzdGVtIGluZm8gbGlzdCwgdGhpcyB0eXBlIG9mIG5laWdoYm91cgorCQkJCQkJCQkJCQktLSBpZGVudGl0eSBzaGFsbCBub3QgYmUgdXNlZCBieSB0aGUgTVMgdW5sZXNzIGl0IGhhcworCQkJCQkJCQkJCQktLSByZWNlaXZlZCB0aGUgU3lzdGVtSW5mb0Fzc2lzdERhdGEgZnJvbSB0aGUgU01MQyBmb3IKKwkJCQkJCQkJCQkJLS0gdGhpcyBjZWxsLgorCWNpQW5kTEFDCQkJQ2VsbElEQW5kTEFDCQktLSBDSSBhbmQgTEFDCit9CisKKy0tIE11bHRpZnJhbWUgYW5kIGNhcnJpZXIKK011bHRpRnJhbWVDYXJyaWVyIDo6PSBTRVFVRU5DRSB7CisJYmNjaENhcnJpZXIJCQlCQ0NIQ2FycmllciwKKwltdWx0aUZyYW1lT2Zmc2V0CU11bHRpRnJhbWVPZmZzZXQKK30KKworLS0gT1REIG1lYXN1cmVtZW50IHZhbHVlIGZvciBuZWlnaGJvdXIKK09URFZhbHVlIDo6PSBJTlRFR0VSICgwLi4zOTk5OSkKKworLS0gTG9jYXRpb24gaW5mb3JtYXRpb24gSUUKK0xvY2F0aW9uSW5mbyA6Oj0gU0VRVUVOQ0UgeworCXJlZkZyYW1lCQlJTlRFR0VSICgwLi42NTUzNSksCQkJLS0gUmVmZXJlbmNlIEZyYW1lIG51bWJlcgorCS0tIElmIHJlZkZyYW1lIGlzIHdpdGhpbiAoNDI0MzIuLjY1NTM1KSwgaXQgc2hhbGwgYmUgaWdub3JlZCBieSB0aGUgcmVjZWl2ZXIKKwktLSBpbiB0aGF0IGNhc2UgdGhlIE1TIHNob3VsZCBwcm92aWRlIEdQUyBUT1cgaWYgYXZhaWxhYmxlCisJZ3BzVE9XCQkJSU5URUdFUiAoMC4uMTQzOTk5OTkpCU9QVElPTkFMLAktLSBHUFMgVE9XCisJZml4VHlwZQkJCUZpeFR5cGUsCisJLS0gTm90ZSB0aGF0IGFwcGxpY2FibGUgcmFuZ2UgZm9yIHJlZkZyYW1lIGlzIDAgLSA0MjQzMQorCS0tIFBvc3NpYmxlIHNoYXBlcyBjYXJyaWVkIGluIHBvc0VzdGltYXRlIGFyZQorCS0tIGVsbGlwc29pZCBwb2ludCwKKwktLSBlbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBjaXJjbGUKKwktLSBlbGxpcHNvaWQgcG9pbnQgd2l0aCB1bmNlcnRhaW50eSBlbGxpcHNlCisJLS0gZWxsaXBzb2lkIHBvaW50IHdpdGggYWx0aXR1ZGUgYW5kIHVuY2VydGFpbnR5IGVsbGlwc29pZAorCXBvc0VzdGltYXRlCQlFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24KK30KKworRml4VHlwZSA6Oj0gSU5URUdFUiB7CisJdHdvREZpeCAoMCksCisJdGhyZWVERml4ICgxKQorfSAoMC4uMSkKKworLS0gR1BTLU1lYXN1cmVtZW50IGluZm9ybWF0aW9uCitHUFMtTWVhc3VyZUluZm8gOjo9IFNFUVVFTkNFIHsKKwktLSBNZWFzdXJlbWVudCBpbmZvIGVsZW1lbnRzCisJLS0gdXNlciBoYXMgdG8gbWFrZSBzdXJlIHRoYXQgaW4gdGhpcyBlbGVtZW50IGlzIG51bWJlciBvZiBlbGVtZW50cworCS0tIGRlZmluZWQgaW4gcmVmZXJlbmNlIEJUUyBpZGVudGl0eQorCWdwc01zclNldExpc3QJU2VxT2ZHUFMtTXNyU2V0RWxlbWVudAkKK30KK1NlcU9mR1BTLU1zclNldEVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjMpKSBPRiBHUFMtTXNyU2V0RWxlbWVudAorCistLSBPVEQgbWVhc3VyZW50IGluZm9ybWF0aW9uIDEtMyB0aW1lcyBpbiBtZXNzYWdlCitHUFMtTXNyU2V0RWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCXJlZkZyYW1lCQlJTlRFR0VSICgwLi42NTUzNSkJT1BUSU9OQUwsIAktLSBSZWZlcmVuY2UgRnJhbWUgbnVtYmVyCisJZ3BzVE9XCQkJR1BTVE9XMjRiLAkJCQkJCS0tIEdQUyBUT1cKKwktLSBOb3RlIHRoYXQgYXBwbGljYWJsZSByYW5nZSBmb3IgcmVmRnJhbWUgaXMgMCAtIDQyNDMxCisKKy0tTl9TQVQgY2FuIGJlIHJlYWQgZnJvbSBudW1iZXIgb2YgZWxlbWVudHMgb2YgZ3BzLW1zckxpc3QKKworCWdwcy1tc3JMaXN0CQlTZXFPZkdQUy1Nc3JFbGVtZW50Cit9CisKKy0tIDI0IGJpdCBwcmVzZW50YXRpb24gZm9yIEdQU1RPVworR1BTVE9XMjRiIDo6PSBJTlRFR0VSICgwLi4xNDM5OTk5OSkKKworLS0gbWVhc3VyZWQgZWxlbWVudHMgaW4gbWVhc3VyZW1lbnQgcGFyYW1ldGVycyBmaWVsZAorU2VxT2ZHUFMtTXNyRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTYpKSBPRiBHUFMtTXNyRWxlbWVudAorCitHUFMtTXNyRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCXNhdGVsbGl0ZUlECQlTYXRlbGxpdGVJRCwJCQkJLS0gU2F0ZWxsaXRlIGlkZW50aWZpZXIKKwljTm8JCQkJSU5URUdFUiAoMC4uNjMpLAkJCS0tIGNhcnJpZXIgbm9pc2UgcmF0aW8KKwlkb3BwbGVyCQkJSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksIAktLSBkb3BwbGVyLCBtdWxsdGlwbHkgYnkgMC4yCisJd2hvbGVDaGlwcwkJSU5URUdFUiAoMC4uMTAyMiksCQkJLS0gd2hvbGUgdmFsdWUgb2YgdGhlIGNvZGUgcGhhc2UgbWVhc3VyZW1lbnQKKwlmcmFjQ2hpcHMJCUlOVEVHRVIgKDAuLjEwMjQpLAkJCS0tIGZyYWN0aW9uYWwgdmFsdWUgb2YgdGhlIGNvZGUgcGhhc2UgbWVhc3VyZW1lbnQKKwkJCQkJCQkJCQkJLS0gYSB2YWx1ZSBvZiAxMDI0IHNoYWxsIG5vdCBiZSBlbmNvZGVkIGJ5IHRoZSBzZW5kZXIKKwkJCQkJCQkJCQkJLS0gdGhlIHJlY2VpdmVyIHNoYWxsIGNvbnNpZGVyIGEgdmFsdWUgb2YgMTAyNCB0byBiZQorCQkJCQkJCQkJCQktLSBpbnZhbGlkIGRhdGEKKwltcGF0aEluZGljCQlNcGF0aEluZGljLAkJCQkJLS0gbXVsdGlwYXRoIGluZGljYXRvcgorCXBzZXVSYW5nZVJNU0VycglJTlRFR0VSICgwLi42MykJCQkJLS0gaW5kZXgJCQorfQorCistLSBNdWx0aXBhdGggaW5kaWNhdG9yCitNcGF0aEluZGljIDo6PSBFTlVNRVJBVEVEIHsKKwlub3RNZWFzdXJlZCAoMCksCisJbG93ICgxKSwKKwltZWRpdW0gKDIpLAorCWhpZ2ggKDMpCit9CisKKy0tIExvY2F0aW9uIGVycm9yIElFCitMb2NhdGlvbkVycm9yIDo6PSBTRVFVRU5DRSB7CisJbG9jRXJyb3JSZWFzb24JCQkJTG9jRXJyb3JSZWFzb24sCisJYWRkaXRpb25hbEFzc2lzdGFuY2VEYXRhCUFkZGl0aW9uYWxBc3Npc3RhbmNlRGF0YQlPUFRJT05BTCwKKwkuLi4KK30KKworTG9jRXJyb3JSZWFzb24gOjo9IEVOVU1FUkFURUQgeworCXVuRGVmaW5lZCAoMCksCQorCW5vdEVub3VnaEJUU3MgKDEpLAorCW5vdEVub3VnaFNhdHMgKDIpLAorCWVvdGRMb2NDYWxBc3NEYXRhTWlzc2luZyAoMyksCisJZW90ZEFzc0RhdGFNaXNzaW5nICg0KSwKKwlncHNMb2NDYWxBc3NEYXRhTWlzc2luZyAoNSksCisJZ3BzQXNzRGF0YU1pc3NpbmcgKDYpLAorCW1ldGhvZE5vdFN1cHBvcnRlZCAoNyksCisJbm90UHJvY2Vzc2VkICg4KSwKKwlyZWZCVFNGb3JHUFNOb3RTZXJ2aW5nQlRTICg5KSwKKwlyZWZCVFNGb3JFT1RETm90U2VydmluZ0JUUyAoMTApLAorCS4uLiwKKwlub3RFbm91Z2hHQU5TU1NhdHMgKDExKSwJCisgZ2Fuc3NBc3NEYXRhTWlzc2luZyAoMTIpLAorCXJlZkJUU0ZvckdBTlNTTm90U2VydmluZ0JUUyAoMTMpCit9CisKKy0tIGV4Y2VwdGlvbiBoYW5kbGluZzoKKy0tIGFuIHVucmVjb2duaXplZCB2YWx1ZSBzaGFsbCBiZSB0cmVhdGVkIHRoZSBzYW1lIGFzIHZhbHVlIDAKKworCistLSBkZWZpbmVzIGFkZGl0aW9uYWwgYXNzaXN0YW5jZSBkYXRhIG5lZWRlZCBmb3IgYW55IG5ldyBsb2NhdGlvbiBhdHRlbXB0CistLSBNUyBzaGFsbCByZXRhaW4gYW55IGFzc2lzdGFuY2UgZGF0YSBhbHJlYWR5IHJlY2VpdmVkCitBZGRpdGlvbmFsQXNzaXN0YW5jZURhdGEgOjo9IFNFUVVFTkNFIHsKKwlncHNBc3Npc3RhbmNlRGF0YQkJR1BTQXNzaXN0YW5jZURhdGEJCU9QVElPTkFMLAorCWV4dGVuc2lvbkNvbnRhaW5lcgkJRXh0ZW5zaW9uQ29udGFpbmVyCQlPUFRJT05BTCwKKwkuLi4sCisJZ2Fuc3NBc3Npc3RhbmNlRGF0YSBHQU5TU0Fzc2lzdGFuY2VEYXRhIE9QVElPTkFMCit9CisKK0dQU0Fzc2lzdGFuY2VEYXRhIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heEdQU0Fzc2lzdGFuY2VEYXRhKSkKKy0tIEdQU0Fzc2lzdGFuY2VEYXRhIGhhcyBpZGVudGljYWwgc3RydWN0dXJlIGFuZCBlbmNvZGluZyB0byBvY3RldHMgMyB0byBuIG9mIHRoZQorLS0gR1BTIEFzc2lzdGFuY2UgRGF0YSBJRSBpbiAzR1BQIFRTIDQ5LjAzMQorCittYXhHUFNBc3Npc3RhbmNlRGF0YQlJTlRFR0VSIDo6PSA0MAorCitHQU5TU0Fzc2lzdGFuY2VEYXRhIDo6PSBPQ1RFVCBTVFJJTkcgKFNJWkUgKDEuLm1heEdBTlNTQXNzaXN0YW5jZURhdGEpKQorLS0gR0FOU1NBc3Npc3RhbmNlRGF0YSBoYXMgaWRlbnRpY2FsIHN0cnVjdHVyZSBhbmQgZW5jb2RpbmcgdG8gb2N0ZXRzIDMgdG8gbiBvZiB0aGUKKy0tIEdBTlNTIEFzc2lzdGFuY2UgRGF0YSBJRSBpbiAzR1BQIFRTIDQ5LjAzMQorCittYXhHQU5TU0Fzc2lzdGFuY2VEYXRhCUlOVEVHRVIgOjo9IDQwCisKKworLS0gUHJvdG9jb2wgRXJyb3IgQ2F1c2VzCitFcnJvckNvZGVzIDo6PSBFTlVNRVJBVEVEIHsKKwl1bkRlZmluZWQgKDApLAorbWlzc2luZ0NvbXBvbmV0ICgxKSwJCQkKK2luY29ycmVjdERhdGEgKDIpLAkJCQorbWlzc2luZ0lFb3JDb21wb25lbnRFbGVtZW50ICgzKSwJCQorbWVzc2FnZVRvb1Nob3J0ICg0KSwJCQkKK3Vua25vd1JlZmVyZW5jZU51bWJlciAoNSksCQkKKy4uLgorfQorCistLSBleGNlcHRpb24gaGFuZGxpbmc6CistLSBhbiB1bnJlY29nbml6ZWQgdmFsdWUgc2hhbGwgYmUgdHJlYXRlZCB0aGUgc2FtZSBhcyB2YWx1ZSAwCisKKy0tIEdQUyBhc3Npc3RhbmNlIGRhdGEgSUUKK0dQUy1Bc3Npc3REYXRhIDo6PSBTRVFVRU5DRSB7CisJY29udHJvbEhlYWRlcgkJQ29udHJvbEhlYWRlcgorfQorCistLSBNb3JlIEFzc2lzdGFuY2UgRGF0YSBUbyBCZSBTZW50IElFCistLSBNb3JlIEFzc2lzdGFuY2UgRGF0YSBDb21wb25lbnRzIE9uIHRoZSBXYXkgaW5kaWNhdGlvbiBmb3IgZGVsaXZlcnkgb2YgYW4gZW50aXJlIHNldCBvZiBhc3Npc3RhbmNlCistLSBkYXRhIGluIG11bHRpcGxlIEFzc2lzdGFuY2UgRGF0YSBjb21wb25lbnRzLgorCitNb3JlQXNzRGF0YVRvQmVTZW50IDo6PSBFTlVNRVJBVEVEIHsKKwlub01vcmVNZXNzYWdlcyAoMCksCQkJLS0gVGhpcyBpcyB0aGUgb25seSBvciBsYXN0IEFzc2lzdGFuY2UgRGF0YSBtZXNzYWdlIHVzZWQgdG8gZGVsaXZlcgorCQkJCQkJCQktLSB0aGUgZW50aXJlIHNldCBvZiBhc3Npc3RhbmNlIGRhdGEuCisJbW9yZU1lc3NhZ2VzT25UaGVXYXkgKDEpCS0tIFRoZSBTTUxDIHdpbGwgc2VuZCBtb3JlIEFzc2lzdGFuY2UgRGF0YSBtZXNzYWdlcyBvciBhIGZpbmFsIFJSTFAKKwkJCQkJCQkJLS0gTWVhc3VyZSBQb3NpdGlvbiBSZXF1ZXN0IG1lc3NhZ2UgdG8gZGVsaXZlciB0aGUKKwkJCQkJCQkJLS0gdGhlIGVudGlyZSBzZXQgb2YgYXNzaXN0YW5jZSBkYXRhLgorfQorCistLSBDb250cm9sIGhlYWRlciBvZiB0aGUgR1BTIGFzc2lzdGFuY2UgZGF0YQorQ29udHJvbEhlYWRlciA6Oj0gU0VRVUVOQ0UgeworCisJLS0gRmllbGQgdHlwZSBQcmVzZW50IGluZm9ybWF0aW9uCisJcmVmZXJlbmNlVGltZQkJUmVmZXJlbmNlVGltZQkJT1BUSU9OQUwsCisJcmVmTG9jYXRpb24JCQlSZWZMb2NhdGlvbgkJCU9QVElPTkFMLAorCWRncHNDb3JyZWN0aW9ucwkJREdQU0NvcnJlY3Rpb25zCQlPUFRJT05BTCwKKwluYXZpZ2F0aW9uTW9kZWwJCU5hdmlnYXRpb25Nb2RlbAkJT1BUSU9OQUwsCisJaW9ub3NwaGVyaWNNb2RlbAkJSW9ub3NwaGVyaWNNb2RlbAkJT1BUSU9OQUwsCisJdXRjTW9kZWwJCQlVVENNb2RlbAkJCU9QVElPTkFMLAorCWFsbWFuYWMJCQlBbG1hbmFjCQkJT1BUSU9OQUwsCisJYWNxdWlzQXNzaXN0CQlBY3F1aXNBc3Npc3QJCU9QVElPTkFMLAorCXJlYWxUaW1lSW50ZWdyaXR5IFNlcU9mLUJhZFNhdGVsbGl0ZVNldCBPUFRJT05BTAorfQorCitSZWZlcmVuY2VUaW1lIDo6PSBTRVFVRU5DRSB7CisJZ3BzVGltZQkJCQlHUFNUaW1lLAorCWdzbVRpbWUJCQkJR1NNVGltZQkJCQlPUFRJT05BTCwKKwlncHNUb3dBc3Npc3QJCUdQU1RPV0Fzc2lzdAkJT1BUSU9OQUwKK30KKworLS0gR1BTIFRpbWUgaW5jbHVkZXMgd2VlayBudW1iZXIgYW5kIHRpbWUtb2Ytd2VlayAoVE9XKQorR1BTVGltZSA6Oj0gU0VRVUVOQ0UgeworCWdwc1RPVzIzYgkJCUdQU1RPVzIzYiwKKwlncHNXZWVrCQkJCUdQU1dlZWsKK30KKworLS0gR1BTVE9XLCByYW5nZSAwLTYwNDc5OS45MiwgcmVzb2x1dGlvbiAwLjA4IHNlYywgMjMtYml0IHByZXNlbnRhdGlvbgorR1BTVE9XMjNiIDo6PSBJTlRFR0VSICgwLi43NTU5OTk5KQorCistLSBHUFMgd2VlayBudW1iZXIKK0dQU1dlZWsgOjo9IElOVEVHRVIgKDAuLjEwMjMpCisKKy0tIEdQU1RPV0Fzc2lzdCBjb25zaXN0cyBvZiBUTE0gbWVzc2FnZSwgQW50aS1zcG9vZiBmbGFnLCBBbGVydCBmbGFnLCBhbmQgMiByZXNlcnZlZCBiaXRzIGluIFRMTSBXb3JkCistLSBmb3IgZWFjaCB2aXNpYmxlIHNhdGVsbGl0ZS4KKy0tIE5fU0FUIGNhbiBiZSByZWFkIGZyb20gbnVtYmVyIG9mIGVsZW1lbnRzIGluIEdQU1RPV0Fzc2lzdAorR1BTVE9XQXNzaXN0IDo6PSBTRVFVRU5DRSAoU0laRSgxLi4xMikpIE9GIEdQU1RPV0Fzc2lzdEVsZW1lbnQKKworR1BTVE9XQXNzaXN0RWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCXNhdGVsbGl0ZUlECQkJU2F0ZWxsaXRlSUQsCisJdGxtV29yZAkJCQlUTE1Xb3JkLAorCWFudGlTcG9vZgkJCUFudGlTcG9vZkZsYWcsCisJYWxlcnQJCQkJQWxlcnRGbGFnLAorCXRsbVJzdmRCaXRzCQkJVExNUmVzZXJ2ZWRCaXRzCit9CisKKy0tIFRMTSBXb3JkLCAxNCBiaXRzCitUTE1Xb3JkIDo6PSBJTlRFR0VSICgwLi4xNjM4MykKKworLS0gQW50aS1TcG9vZiBmbGFnCitBbnRpU3Bvb2ZGbGFnIDo6PSBJTlRFR0VSICgwLi4xKQorCistLSBBbGVydCBmbGFnCitBbGVydEZsYWcgOjo9IElOVEVHRVIgKDAuLjEpCisKKy0tIFJlc2VydmVkIGJpdHMgaW4gVExNIHdvcmQsIE1TQiBvY2N1cnMgZWFybGllciBpbiBUTE0gV29yZCB0cmFuc21pdHRlZCBieSBzYXRlbGxpdGUKK1RMTVJlc2VydmVkQml0cyA6Oj0gSU5URUdFUiAoMC4uMykKKworR1NNVGltZSA6Oj0gU0VRVUVOQ0UgeworCWJjY2hDYXJyaWVyCQlCQ0NIQ2FycmllciwJLS0gQkNDSCBjYXJyaWVyCisJYnNpYwkJCUJTSUMsCQkJLS0gQlNJQworCWZyYW1lTnVtYmVyCQlGcmFtZU51bWJlciwKKwl0aW1lU2xvdAkJVGltZVNsb3QsCisJYml0TnVtYmVyCQlCaXROdW1iZXIKK30KKworLS0gRnJhbWUgbnVtYmVyCitGcmFtZU51bWJlciA6Oj0gSU5URUdFUiAoMC4uMjA5NzE1MSkKKworLS0gVGltZSBzbG90IG51bWJlcgorVGltZVNsb3QgOjo9IElOVEVHRVIgKDAuLjcpCisKKy0tIEJpdCBudW1iZXIKK0JpdE51bWJlciA6Oj0gSU5URUdFUiAoMC4uMTU2KQorCisKKy0tIFJlZmVyZW5jZSBMb2NhdGlvbiBJRQorUmVmTG9jYXRpb24gOjo9IFNFUVVFTkNFIHsKKwl0aHJlZURMb2NhdGlvbgkJCUV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbgorfQorCistLSBER1BTIENvcnJlY3Rpb25zIElFCitER1BTQ29ycmVjdGlvbnMgOjo9IFNFUVVFTkNFIHsKKworCWdwc1RPVwkJSU5URUdFUiAoMC4uNjA0Nzk5KSwJLS0gREdQUyByZWZlcmVuY2UgdGltZQorCXN0YXR1cwkJSU5URUdFUiAoMC4uNyksCisJLS0gTl9TQVQgY2FuIGJlIHJlYWQgZnJvbSBudW1iZXIgb2YgZWxlbWVudHMgb2Ygc2F0TGlzdAorCXNhdExpc3QJCVNlcU9mU2F0RWxlbWVudCAJCit9CitTZXFPZlNhdEVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFICgxLi4xNikpIE9GIFNhdEVsZW1lbnQKKworLS0gbnVtYmVyIG9mIGNvcnJlY3Rpb24gZm9yIHNhdGVsbGl0ZXMKK1NhdEVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlzYXRlbGxpdGVJRAkJU2F0ZWxsaXRlSUQsCisKKworLS0tIFNlcXVlbmNlIG51bWJlciBmb3IgZXBoZW1lcmlzCisJaW9kZSAJCQlJTlRFR0VSICgwLi4yMzkpLAorCS0tIFVzZXIgRGlmZmVyZW50aWFsIFJhbmdlIEVycm9yCisJdWRyZQkJCUlOVEVHRVIgKDAuLjMpLAkJCisKKwktLSBQc2V1ZG8gUmFuZ2UgQ29ycmVjdGlvbiwgcmFuZ2UgaXMKKwktLSAtNjU1LjA0IC0gKzY1NS4wNCwKKwlwc2V1ZG9SYW5nZUNvcglJTlRFR0VSICgtMjA0Ny4uMjA0NyksIAkKKworCS0tIFBzZXVkbyBSYW5nZSBSYXRlIENvcnJlY3Rpb24sIHJhbmdlIGlzCisJLS0gLTQuMDY0IC0gKzQuMDY0LAorCXJhbmdlUmF0ZUNvcglJTlRFR0VSICgtMTI3Li4xMjcpLAorCistLSBEZWx0YSBQc2V1ZG8gUmFuZ2UgQ29ycmVjdGlvbiAyIAkKKwlkZWx0YVBzZXVkb1JhbmdlQ29yMiAJSU5URUdFUiAoLTEyNy4uMTI3KSwJLS0gVGhpcyBJRSBzaGFsbCBiZSBpZ25vcmVkIGJ5IHRoZSByZWNlaXZlciBhbmQKKwkJCQkJCQkJCQkJCQktLSBzZXQgdG8gemVybyBieSB0aGUgc2VuZGVyCisJLS0gRGVsdGEgUHNldWRvIFJhbmdlIENvcnJlY3Rpb24gMgkKKwlkZWx0YVJhbmdlUmF0ZUNvcjIJCUlOVEVHRVIgKC03Li43KSwJCS0tIFRoaXMgSUUgc2hhbGwgYmUgaWdub3JlZCBieSB0aGUgcmVjZWl2ZXIgYW5kCisJCQkJCQkJCQkJCQkJLS0gc2V0IHRvIHplcm8gYnkgdGhlIHNlbmRlcgorCS0tIERlbHRhIFBzZXVkbyBSYW5nZSBDb3JyZWN0aW9uIDMKKwlkZWx0YVBzZXVkb1JhbmdlQ29yMyAJSU5URUdFUiAoLTEyNy4uMTI3KSwJLS0gVGhpcyBJRSBzaGFsbCBiZSBpZ25vcmVkIGJ5IHRoZSByZWNlaXZlciBhbmQKKwkJCQkJCQkJCQkJCQktLSBzZXQgdG8gemVybyBieSB0aGUgc2VuZGVyCisJLS0gRGVsdGEgUHNldWRvIFJhbmdlIENvcnJlY3Rpb24gMworCWRlbHRhUmFuZ2VSYXRlQ29yMwkJSU5URUdFUiAoLTcuLjcpCQkJLS0gVGhpcyBJRSBzaGFsbCBiZSBpZ25vcmVkIGJ5IHRoZSByZWNlaXZlciBhbmQKKwkJCQkJCQkJCQkJCQktLSBzZXQgdG8gemVybyBieSB0aGUgc2VuZGVyCit9CisKK1NhdGVsbGl0ZUlEIDo6PSBJTlRFR0VSICgwLi42MykJLS0gaWRlbnRpZmllcyBzYXRlbGxpdGUKKworLS0gTmF2aWdhdGlvbiBNb2RlbCBJRQorTmF2aWdhdGlvbk1vZGVsIDo6PSBTRVFVRU5DRSB7CisJbmF2TW9kZWxMaXN0CVNlcU9mTmF2TW9kZWxFbGVtZW50CQorfQorCistLSBuYXZpZ2F0aW9uIG1vZGVsIHNhdGVsbGl0ZSBsaXN0CitTZXFPZk5hdk1vZGVsRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTYpKSBPRiBOYXZNb2RlbEVsZW1lbnQKKworTmF2TW9kZWxFbGVtZW50IDo6PSBTRVFVRU5DRSB7CisJc2F0ZWxsaXRlSUQJCVNhdGVsbGl0ZUlELAkJCQorCXNhdFN0YXR1cwkJU2F0U3RhdHVzCQktLSBzYXRlbGxpdGUgc3RhdHVzCit9CisKKy0tIHRoZSBTdGF0dXMgb2YgdGhlIG5hdmlnYXRpb24gbW9kZWwKK1NhdFN0YXR1cyA6Oj0gQ0hPSUNFIHsKKwktLSBOZXcgc2F0ZWxsaXRlLCBuZXcgTmF2aWdhdGlvbiBNb2RlbAorCW5ld1NhdGVsbGl0ZUFuZE1vZGVsVUMJVW5jb21wcmVzc2VkRXBoZW1lcmlzLAorCisJLS0gRXhpc3Rpbmcgc2F0ZWxsaXRlLCBFeGlzdGluZyBOYXZpZ2F0aW9uIE1vZGVsCisJb2xkU2F0ZWxsaXRlQW5kTW9kZWwJTlVMTCwKKworCS0tIEV4aXN0aW5nIHNhdGVsbGl0ZSwgbmV3IE5hdmlnYXRpb24gTW9kZWwKKwluZXdOYXZpTW9kZWxVQwkJCVVuY29tcHJlc3NlZEVwaGVtZXJpcywKKwkuLi4KK30KKworLS0gVW5jb21wcmVzc2VkIHNhdGVsbGl0ZSBlbWhlbWVyaXMgYW5kIGNsb2NrIGNvcnJlY3Rpb25zCitVbmNvbXByZXNzZWRFcGhlbWVyaXMgOjo9IFNFUVVFTkNFIHsKKwllcGhlbUNvZGVPbkwyCUlOVEVHRVIgKDAuLjMpLAorCWVwaGVtVVJBCQlJTlRFR0VSICgwLi4xNSksCisJZXBoZW1TVmhlYWx0aAlJTlRFR0VSICgwLi42MyksCisJZXBoZW1JT0RDCQlJTlRFR0VSCSgwLi4xMDIzKSwKKwllcGhlbUwyUGZsYWcJSU5URUdFUiAoMC4uMSksCisJZXBoZW1TRjFSc3ZkCUVwaGVtZXJpc1N1YmZyYW1lMVJlc2VydmVkLAorCWVwaGVtVGdkCQlJTlRFR0VSICgtMTI4Li4xMjcpLAorCWVwaGVtVG9jCQlJTlRFR0VSICgwLi4zNzc5OSksCisJZXBoZW1BRjIJCUlOVEVHRVIgKC0xMjguLjEyNyksCisJZXBoZW1BRjEJCUlOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWVwaGVtQUYwCQlJTlRFR0VSICgtMjA5NzE1Mi4uMjA5NzE1MSksCisJZXBoZW1DcnMJCUlOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWVwaGVtRGVsdGFOCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwllcGhlbU0wCQkJSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCWVwaGVtQ3VjCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwllcGhlbUUJCQlJTlRFR0VSICgwLi40Mjk0OTY3Mjk1KSwKKwllcGhlbUN1cwkJSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJZXBoZW1BUG93ZXJIYWxmCUlOVEVHRVIgKDAuLjQyOTQ5NjcyOTUpLAorCWVwaGVtVG9lCQlJTlRFR0VSICgwLi4zNzc5OSksCisJZXBoZW1GaXRGbGFnCUlOVEVHRVIgKDAuLjEpLAorCWVwaGVtQU9EQQkJSU5URUdFUiAoMC4uMzEpLAorCWVwaGVtQ2ljCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwllcGhlbU9tZWdhQTAJSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCWVwaGVtQ2lzCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwllcGhlbUkwCQkJSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCWVwaGVtQ3JjCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwllcGhlbVcJCQlJTlRFR0VSICgtMjE0NzQ4MzY0OC4uMjE0NzQ4MzY0NyksCisJZXBoZW1PbWVnYUFEb3QJSU5URUdFUiAoLTgzODg2MDguLjgzODg2MDcpLAorCWVwaGVtSURvdAkJSU5URUdFUiAoLTgxOTIuLjgxOTEpCit9CisKKy0tIFJlc2VydmVkIGJpdHMgaW4gc3ViZnJhbWUgMSBvZiBuYXZpZ2F0aW9uIG1lc3NhZ2UKK0VwaGVtZXJpc1N1YmZyYW1lMVJlc2VydmVkIDo6PSBTRVFVRU5DRSB7CisJcmVzZXJ2ZWQxCQlJTlRFR0VSICgwLi44Mzg4NjA3KSwJLS0gMjMtYml0IGZpZWxkCisJcmVzZXJ2ZWQyCQlJTlRFR0VSICgwLi4xNjc3NzIxNSksCS0tIDI0LWJpdCBmaWVsZAorCXJlc2VydmVkMwkJSU5URUdFUiAoMC4uMTY3NzcyMTUpLAktLSAyNC1iaXQgZmllbGQKKwlyZXNlcnZlZDQJCUlOVEVHRVIgKDAuLjY1NTM1KQkJLS0gMTYtYml0IGZpZWxkCit9CisKKy0tIElvbm9zcGhlcmljIE1vZGVsIElFCitJb25vc3BoZXJpY01vZGVsIDo6PSBTRVFVRU5DRSB7CisJYWxmYTAJCQlJTlRFR0VSICgtMTI4Li4xMjcpLAorCWFsZmExCQkJSU5URUdFUiAoLTEyOC4uMTI3KSwKKwlhbGZhMgkJCUlOVEVHRVIgKC0xMjguLjEyNyksCisJYWxmYTMJCQlJTlRFR0VSICgtMTI4Li4xMjcpLAorCWJldGEwCQkJSU5URUdFUiAoLTEyOC4uMTI3KSwKKwliZXRhMQkJCUlOVEVHRVIgKC0xMjguLjEyNyksCisJYmV0YTIJCQlJTlRFR0VSICgtMTI4Li4xMjcpLAorCWJldGEzCQkJSU5URUdFUiAoLTEyOC4uMTI3KQorfQorCistLSBVbml2ZXJzYWwgVGltZSBDb29yZGluYXRlIE1vZGVsCitVVENNb2RlbCA6Oj0gU0VRVUVOQ0UgeworCXV0Y0ExCQkJSU5URUdFUiAoLTgzODg2MDguLjgzODg2MDcpLAorCXV0Y0EwCQkJSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCXV0Y1RvdAkJCUlOVEVHRVIgKDAuLjI1NSksCisJdXRjV050CQkJSU5URUdFUiAoMC4uMjU1KSwKKwl1dGNEZWx0YVRscwkJSU5URUdFUiAoLTEyOC4uMTI3KSwKKwl1dGNXTmxzZgkJSU5URUdFUiAoMC4uMjU1KSwKKwl1dGNETgkJCUlOVEVHRVIgKC0xMjguLjEyNyksCisJdXRjRGVsdGFUbHNmCUlOVEVHRVIgKC0xMjguLjEyNykKK30KKworLS0gQWxtYW5hYywgTG9uZyB0ZXJtIG1vZGVsCistLSBOT1RFOiBUaGVzZSBhcmUgcGFyYW1ldGVycyBhcmUgc3Vic2V0IG9mIHRoZSBlcGhlbWVyaXMKKy0tIE5PVEU6IEJ1dCB3aXRoIHJlZHVjZWQgcmVzb2x1dGlvbiBhbmQgYWNjdXJhY3kKK0FsbWFuYWMgOjo9IFNFUVVFTkNFIHsKKwlhbGFtYW5hY1dOYQkJSU5URUdFUiAoMC4uMjU1KSwJLS0gT25jZSBwZXIgbWVzc2FnZQorCisJLS0gbmF2aWdhdGlvbiBtb2RlbCBzYXRlbGxpdGUgbGlzdC4KKwktLSBUaGUgc2l6ZSBvZiBhbG1hbmFjTGlzdCBpcyBhY3R1YWxseSBOdW1zX1NhdHNfVG90YWwgZmllbGQKKwlhbG1hbmFjTGlzdAkJU2VxT2ZBbG1hbmFjRWxlbWVudAkJCit9CitTZXFPZkFsbWFuYWNFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSgxLi42NCkpIE9GIEFsbWFuYWNFbGVtZW50CisKKy0tIEFsbWFuYWMgaW5mbyBvbmNlIHBlciBzYXRlbGxpdGUKK0FsbWFuYWNFbGVtZW50IDo6PSBTRVFVRU5DRSB7CisJc2F0ZWxsaXRlSUQJCQlTYXRlbGxpdGVJRCwKKwlhbG1hbmFjRQkJCUlOVEVHRVIgKDAuLjY1NTM1KSwKKwlhbGFtYW5hY1RvYQkJCUlOVEVHRVIgKDAuLjI1NSksCisJYWxtYW5hY0tzaWkJCQlJTlRFR0VSICgtMzI3NjguLjMyNzY3KSwKKwlhbG1hbmFjT21lZ2FEb3QJCUlOVEVHRVIgKC0zMjc2OC4uMzI3NjcpLAorCWFsbWFuYWNTVmhlYWx0aAkJSU5URUdFUiAoMC4uMjU1KSwKKwlhbG1hbmFjQVBvd2VySGFsZglJTlRFR0VSICgwLi4xNjc3NzIxNSksCisJYWxtYW5hY09tZWdhMAkJSU5URUdFUiAoLTgzODg2MDguLjgzODg2MDcpLAorCWFsbWFuYWNXCQkJSU5URUdFUiAoLTgzODg2MDguLjgzODg2MDcpLAorCWFsbWFuYWNNMAkJCUlOVEVHRVIgKC04Mzg4NjA4Li44Mzg4NjA3KSwKKwlhbG1hbmFjQUYwCQkJSU5URUdFUiAoLTEwMjQuLjEwMjMpLAorCWFsbWFuYWNBRjEJCQlJTlRFR0VSICgtMTAyNC4uMTAyMykKK30KKworLS0gQWNxdWlzaXRpb24gQXNzaXN0YW5jZQorQWNxdWlzQXNzaXN0IDo6PSBTRVFVRU5DRSB7CisKKwktLSBOdW1iZXIgb2YgU2F0ZWxsaXRlcyBjYW4gYmUgcmVhZCBmcm9tIGFjcXVpc3RMaXN0CisJdGltZVJlbGF0aW9uCVRpbWVSZWxhdGlvbiwKKworCS0tIEFjcXVpc2l0aW9uIGFzc2lzdGFuY2UgbGlzdAorCS0tIFRoZSBzaXplIG9mIE51bWJlciBvZiBTYXRlbGxpdGVzIGlzIGFjdHVhbGx5IE51bWJlciBvZiBTYXRlbGxpdGVzIGZpZWxkCisJYWNxdWlzTGlzdAkJU2VxT2ZBY3F1aXNFbGVtZW50CQkKK30KK1NlcU9mQWNxdWlzRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTYpKSBPRiBBY3F1aXNFbGVtZW50CisKKy0tIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBHUFMgdGltZSBhbmQgYWlyLWludGVyZmFjZSB0aW1pbmcKK1RpbWVSZWxhdGlvbiA6Oj0gU0VRVUVOQ0UgeworCS0tCisJZ3BzVE9XCQlHUFNUT1cyM2IsCQktLSAyM2IgcHJlc2VudGF0aW9uCisJZ3NtVGltZQkJR1NNVGltZQkJT1BUSU9OQUwKK30KKworLS0gZGF0YSBvY2N1cmluZyBwZXIgbnVtYmVyIG9mIHNhdGVsbGl0ZXMKK0FjcXVpc0VsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlzdmlkCQkJCQlTYXRlbGxpdGVJRCwKKworCS0tIERvcHBsZXIgMHRoIG9yZGVyIHRlcm0sCisJLS0gLTUxMjAuMCAtIDUxMTcuNSBIeiAoPSAtMjA0OCAtIDIwNDcgd2l0aCAyLjUgSHogcmVzb2x1dGlvbikKKwlkb3BwbGVyMAkJCQlJTlRFR0VSICgtMjA0OC4uMjA0NyksCQorCWFkZGlvbmFsRG9wcGxlcgkJCUFkZGlvbmFsRG9wcGxlckZpZWxkcwlPUFRJT05BTCwKKwljb2RlUGhhc2UJCQkJSU5URUdFUiAoMC4uMTAyMiksCS0tIENvZGUgUGhhc2UKKwlpbnRDb2RlUGhhc2UJCQlJTlRFR0VSICgwLi4xOSksCS0tIEludGVnZXIgQ29kZSBQaGFzZQorCWdwc0JpdE51bWJlcgkJCUlOVEVHRVIgKDAuLjMpLCAJLS0gR1BTIGJpdCBudW1iZXIKKwljb2RlUGhhc2VTZWFyY2hXaW5kb3cJSU5URUdFUiAoMC4uMTUpLAktLSBDb2RlIFBoYXNlIFNlYXJjaCBXaW5kb3cKKwlhZGRpb25hbEFuZ2xlCQkJQWRkaW9uYWxBbmdsZUZpZWxkcwkJT1BUSU9OQUwKK30KKworQWRkaW9uYWxEb3BwbGVyRmllbGRzIDo6PSBTRVFVRU5DRSB7CisJLS0gRG9wcGxlciAxc3Qgb3JkZXIgdGVybSwgLTEuMCAtICswLjUgSHovc2VjCisgLS0gKD0gLTQyICsgKDAgdG8gNjMpIHdpdGggMS80MiBIei9zZWMuIHJlc29sdXRpb24pCisJZG9wcGxlcjEJCQkJSU5URUdFUiAoMC4uNjMpLAorCWRvcHBsZXJVbmNlcnRhaW50eQkJSU5URUdFUiAoMC4uNykKKyAtLSBhIHNlbmRlciBzaGFsbCBub3QgZW5jb2RlIGFueSBEb3BwbGVyVW5jZXJ0YWludHkgdmFsdWUgaW4gdGhlIHJhbmdlIDUgdG8gNworIC0tIGEgcmVjZWl2ZXIgc2hhbGwgaWdub3JlIGFueSB2YWx1ZSBiZXR3ZWVuIDUgYW5kIDcuCit9CisKK0FkZGlvbmFsQW5nbGVGaWVsZHMJOjo9IFNFUVVFTkNFIHsKKwktLSBhemltdXRoIGFuZ2xlLCAwIC0gMzQ4Ljc1IGRlZyAoPSAwIC0gMzEgd2l0aCAxMS4yNSBkZWcgcmVzb2x1dGlvbikKKwlhemltdXRoCQkJCQlJTlRFR0VSICgwLi4zMSksCisJLS0gZWxldmF0aW9uIGFuZ2xlLCAwIC0gNzguNzUgZGVnICg9IDAgLSA3IHdpdGggMTEuMjUgZGVnIHJlc29sdXRpb24pCisJZWxldmF0aW9uCQkJCUlOVEVHRVIgKDAuLjcpCit9CisKKy0tIFJlYWwtVGltZSBJbnRlZ3JpdHkKKy0tIG51bWJlciBvZiBiYWQgc2F0ZWxsaXRlcyBjYW4gYmUgcmVhZCBmcm9tIHRoaXMgZWxlbWVudAorU2VxT2YtQmFkU2F0ZWxsaXRlU2V0IDo6PSBTRVFVRU5DRSAoU0laRSgxLi4xNikpIE9GIFNhdGVsbGl0ZUlECisKKy0tIEV4dGVuc2lvbiBFbGVtZW50cworCistLSBSZWxlYXNlIDk4IEV4dGVuc2lvbnMgaGVyZQorUmVsOTgtTXNyUG9zaXRpb24tUmVxLUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgeworCXJlbDk4LUV4dC1FeHBPVEQJCQlSZWw5OC1FeHQtRXhwT1RECQlPUFRJT05BTCwJLS0gRXhwZWN0ZWRPVEQgZXh0ZW5zaW9uCisJLi4uLCAKKyBncHNUaW1lQXNzaXN0YW5jZU1lYXN1cmVtZW50UmVxdWVzdCBOVUxMIE9QVElPTkFMLCAKKyBncHNSZWZlcmVuY2VUaW1lVW5jZXJ0YWludHkgR1BTUmVmZXJlbmNlVGltZVVuY2VydGFpbnR5IE9QVElPTkFMCisKKy0tIEZ1cnRoZXIgUjk4IGV4dGVuc2lvbnMgaGVyZQorfQorUmVsOTgtQXNzaXN0YW5jZURhdGEtRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7CisJcmVsOTgtRXh0LUV4cE9URAkJCVJlbDk4LUV4dC1FeHBPVEQJCU9QVElPTkFMLAktLSBFeHBlY3RlZE9URCBleHRlbnNpb24KKwkuLi4sIAorIGdwc1RpbWVBc3Npc3RhbmNlTWVhc3VyZW1lbnRSZXF1ZXN0IE5VTEwgT1BUSU9OQUwsCisgZ3BzUmVmZXJlbmNlVGltZVVuY2VydGFpbnR5IEdQU1JlZmVyZW5jZVRpbWVVbmNlcnRhaW50eSBPUFRJT05BTAorCistLSBGdXJ0aGVyIFI5OCBleHRlbnNpb25zIGhlcmUKK30KKworLS0gUmVsZWFzZSA5OCBFeHBPVEQgZXh0ZW5zaW9uCitSZWw5OC1FeHQtRXhwT1REIDo6PSBTRVFVRU5DRSB7CistLSBJZiBNc3JBc3Npc3RCVFMgaXMgaW5jbHVkZWQgaW4gbWVzc2FnZSwgbXNyQXNzaXN0RGF0YS1SOTgtRXhwT1REIHNoYWxsIGJlIGluY2x1ZGVkLgorCW1zckFzc2lzdERhdGEtUjk4LUV4cE9URAkJCU1zckFzc2lzdERhdGEtUjk4LUV4cE9URAkJCU9QVElPTkFMLAorCistLSBJZiBTeXN0ZW1JbmZvQXNzaXN0YURhdGEgaXMgaW5jbHVkZWQgaW4gbWVzc2FnZSwgc3lzdGVtSW5mb0Fzc2lzdERhdGEtUjk4LUV4cE9URCBzaGFsbCBiZQorLS0gaW5jbHVkZWQuCisJc3lzdGVtSW5mb0Fzc2lzdERhdGEtUjk4LUV4cE9URAlTeXN0ZW1JbmZvQXNzaXN0RGF0YS1SOTgtRXhwT1RECU9QVElPTkFMCit9CisKKy0tIE1zckFzc2lzdERhdGEgUjk4IGV4dGVuc2lvbgorTXNyQXNzaXN0RGF0YS1SOTgtRXhwT1REIDo6PSBTRVFVRU5DRSB7CisJIG1zckFzc2lzdExpc3QtUjk4LUV4cE9URAkJCSBTZXFPZk1zckFzc2lzdEJUUy1SOTgtRXhwT1RECit9CisKKy0tIEluZGV4ZXMgaW4gU2VxT2ZNc3JBc3Npc3RCVFMtUjk4LUV4cE9URCByZWZlciB0byBTZXFPZk1zckFzc2lzdEJUUworLS0gSWYgdGhlIGluZGV4IGV4Y2VlZHMgdGhlIFNlZ09mTXNyQXNzaXN0QlRTIHJhbmdlIG9yIGlmIHRoZXJlIGlzIG90aGVyCistLSBpbmNvbnNpc3RlbmNpZXMgYmV0d2VlbiB0aGUgQlRTIGluZGljZXMsIHRoZSBNUyBzaGFsbCBhcHBseSBwcm90b2NvbAorLS0gZXJyb3IgY2F1c2UgaW5jb3JyZWN0RGF0YQorU2VxT2ZNc3JBc3Npc3RCVFMtUjk4LUV4cE9URCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTUpKSBPRiBNc3JBc3Npc3RCVFMtUjk4LUV4cE9URAorCistLSBUaGlzIGVsZW1lbnQgY29tcGxldGVzIE1zckFzc2lzdEJUUyBJRQorTXNyQXNzaXN0QlRTLVI5OC1FeHBPVEQgOjo9IFNFUVVFTkNFIHsKKwlleHBlY3RlZE9URAkJCQlFeHBlY3RlZE9URCwKKwlleHBPVERVbmNlcnRhaW50eQkJRXhwT1REVW5jZXJ0YWludHkKK30KKworLS0gU3lzdGVtSW5mb0Fzc2lzdERhdGEgUjk4IGV4dGVuc2lvbgorU3lzdGVtSW5mb0Fzc2lzdERhdGEtUjk4LUV4cE9URCA6Oj0gU0VRVUVOQ0UgeworCXN5c3RlbUluZm9Bc3Npc3RMaXN0Ujk4LUV4cE9URCAJU2VxT2ZTeXN0ZW1JbmZvQXNzaXN0QlRTLVI5OC1FeHBPVEQKK30KKworLS0gU2VxT2ZTeXN0ZW1JbmZvQXNzaXN0QlRTLVI5OC1FeHBPVEQgaW5kZXggcmVmZXIgdG8gU2VxT2ZTeXN0ZW1JbmZvQXNzaXN0QlRTCistLSBJZiB0aGUgaW5kZXggZXhjZWVkcyB0aGUgU2VnT2ZTeXN0ZW1JbmZvQXNzaXN0QlRTIHJhbmdlIG9yIGlmIHRoZXJlIGlzIG90aGVyCistLSBpbmNvbnNpc3RlbmNpZXMgYmV0d2VlbiB0aGUgQlRTIGluZGljZXMsIHRoZSBNUyBzaGFsbCBhcHBseSBwcm90b2NvbAorLS0gZXJyb3IgY2F1c2UgaW5jb3JyZWN0RGF0YQorU2VxT2ZTeXN0ZW1JbmZvQXNzaXN0QlRTLVI5OC1FeHBPVEQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjMyKSkgT0YgU3lzdGVtSW5mb0Fzc2lzdEJUUy1SOTgtRXhwT1RECisKKy0tIHdoZXRoZXIgbi50aCBpcyBwcmVzZW50IG9yIG5vdCA/CitTeXN0ZW1JbmZvQXNzaXN0QlRTLVI5OC1FeHBPVEQgOjo9IENIT0lDRSB7CisJbm90UHJlc2VudAkJTlVMTCwKKwlwcmVzZW50CQkJQXNzaXN0QlRTRGF0YS1SOTgtRXhwT1RECit9CisKKy0tIFRoaXMgZWxlbWVudCBjb21wbGV0ZXMgQXNzaXN0QlRTRGF0YSBJRQorQXNzaXN0QlRTRGF0YS1SOTgtRXhwT1REIDo6PSBTRVFVRU5DRSB7CisJZXhwZWN0ZWRPVEQJCQkJRXhwZWN0ZWRPVEQsCisJZXhwT1REdW5jZXJ0YWludHkJCUV4cE9URFVuY2VydGFpbnR5CS0tIFVuY2VydGFpbnR5IG9mIGV4cGVjdGVkIE9URAorfQorCistLSBFeHBlY3RlZCBPVEQgdmFsdWUgYmV0d2VlbiBuYm9yIGJhc2Ugc3RhdGlvbiBhbmQgcmVmZXJlbmNlIEJUUworLS0gYXQgTVMncyBjdXJyZW50IGVzdGltYXRlZCBsb2NhdGlvbi4KK0V4cGVjdGVkT1REIDo6PSBJTlRFR0VSICgwLi4xMjUwKQorLS0gVGhlIEV4cGVjdGVkT1REIHZhbHVlIDEyNTAgc2hhbGwgbm90IGJlIGVuY29kZWQgYnkgdGhlIHRyYW5zbWl0dGluZyBlbnRpdHkgYW5kCistLSBzaGFsbCBiZSB0cmVhdGVkIGJ5IHRoZSByZWNlaXZpbmcgZW50aXR5IGFzIDAuCistLSBVbmNlcnRhaW50eSBvZiBFeHB0ZWN0ZWQgT1REIGluIGJpdHMKK0V4cE9URFVuY2VydGFpbnR5IDo6PSBJTlRFR0VSKDAuLjcpCisKKy0tIFJlbGVhc2UgOTggZXh0ZW5zaW9ucworCitHUFNSZWZlcmVuY2VUaW1lVW5jZXJ0YWludHkgOjo9IElOVEVHRVIgKDAgLi4gMTI3KSAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisKK0dQU1RpbWVBc3Npc3RhbmNlTWVhc3VyZW1lbnRzIDo6PSBTRVFVRU5DRSB7CisgcmVmZXJlbmNlRnJhbWVNU0IgSU5URUdFUiAoMCAuLiA2MyksIC0tIE1TQiBvZiBmcmFtZSBudW1iZXIKKyBncHNUb3dTdWJtcyBJTlRFR0VSICgwIC4uIDk5OTkpIE9QVElPTkFMLCAtLSBpbiB1bml0cyBvZiAxMDBucywgZm9yIE1TIGJhc2VkIEFHUFMKKyBkZWx0YVRvdyBJTlRFR0VSICgwIC4uIDEyNykgT1BUSU9OQUwsIC0tIGZvciBNUyBhc3Npc3RlZCBBR1BTCisgZ3BzUmVmZXJlbmNlVGltZVVuY2VydGFpbnR5IEdQU1JlZmVyZW5jZVRpbWVVbmNlcnRhaW50eSBPUFRJT05BTAorfQorCitSZWwtOTgtTXNyUG9zaXRpb24tUnNwLUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgeworCisJLS0gRmlyc3QgZXh0ZW5zaW9uIHRvIFJlbGVhc2UgOTgKKwlyZWwtOTgtRXh0LU1lYXN1cmVJbmZvCVNFUVVFTkNFIHsKKwkJb3RkLU1lYXN1cmVJbmZvLVI5OC1FeHQJT1RELU1lYXN1cmVJbmZvLVI5OC1FeHQJCU9QVElPTkFMCisJfSwKKwkuLi4sIAorIHRpbWVBc3Npc3RhbmNlTWVhc3VyZW1lbnRzIEdQU1RpbWVBc3Npc3RhbmNlTWVhc3VyZW1lbnRzIE9QVElPTkFMIAorIC0tIEZ1cnRoZXIgUjk4IGV4dGVuc2lvbnMgaGVyZQorfQorCistLSBUaGlzIGlzIGFuIGFkZGl0aW9uIHRvIE9URC1NZWFzdXJlSW5mbyBlbGVtZW50IGRlZmluZWQgaW4gb3JpZ2luYWwgbWVzc2FnZSwKKy0tIElmIE9URC1NZWFzdXJlSW5mbyBpcyBhYnNlbnQsIG9yIGlmIG9uZSBvciBtb3JlIE9URC1Nc3JFbGVtZW50UmVzdCBhcmUgcHJlc2VudAorLS0gT1RELU1lYXN1cmVJbmZvLVI5OC1FeHQgc2hhbGwgYmUgYWJzZW50LgorLS0gT1RELU1lYXN1cmVJbmZvLVI5OC1FeHQKK09URC1NZWFzdXJlSW5mby1SOTgtRXh0IDo6PSBTRVFVRU5DRSB7CisJLS0gTWVhc3VyZW1lbnQgaW5mbyBlbGVtZW50cworCW90ZE1zckZpcnN0U2V0cy1SOTgtRXh0CQlPVEQtTXNyRWxlbWVudEZpcnN0LVI5OC1FeHQKK30KKworLS0gT1REIG1lYXN1cmVtZW50IGluZm9ybWF0aW9uIEV4dCBmb3IgdGhlIGZpcnN0IHNldCBvbmx5CitPVEQtTXNyRWxlbWVudEZpcnN0LVI5OC1FeHQgOjo9IFNFUVVFTkNFIHsKKwktLSBhZGRpdGlvbmFsIG1lYXN1cmVkIG5laWdoYm9ycyBpbiBPVEQgbWVhc3VyZW1lbnRzCisJb3RkLUZpcnN0U2V0TXNycy1SOTgtRXh0IAlTZXFPZk9URC1GaXJzdFNldE1zcnMtUjk4LUV4dCAJT1BUSU9OQUwKK30KK1NlcU9mT1RELUZpcnN0U2V0TXNycy1SOTgtRXh0IDo6PSBTRVFVRU5DRSAoU0laRSgxLi41KSkgT0YgT1RELUZpcnN0U2V0TXNycworCitSZWwtNS1Nc3JQb3NpdGlvbi1Sc3AtRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7CisKKwlleHRlbmRlZC1yZWZlcmVuY2UJRXh0ZW5kZWQtcmVmZXJlbmNlIAlPUFRJT05BTCwKKwktLSBUaGUgZXh0ZW5kZWQtcmVmZXJlbmNlIHNoYWxsIGJlIGluY2x1ZGVkIGJ5IHRoZSBNUyBpZiBhbmQgb25seSBpZiBwcmV2aW91c2x5CisJLS0gcmVjZWl2ZWQgZnJvbSB0aGUgU01MQyBpbiBhIE1lYXN1cmUgUG9zaXRpb24gUmVxdWVzdC4gV2hlbiBpbmNsdWRlZCwgdGhlIHZhbHVlIHNlbnQKKwktLSBieSB0aGUgTVMgc2hhbGwgZXF1YWwgdGhlIHZhbHVlIHJlY2VpdmVkIGZyb20gdGhlIFNNTEMuCisKKwktLSBleHRlbnNpb24gdG8gUmVsZWFzZSA1LCBmb3IgUlJMUCBwc2V1ZG8tc2VnbWVudGF0aW9uIGhlcmUKKwlvdGQtTWVhc3VyZUluZm8tNS1FeHQJT1RELU1lYXN1cmVJbmZvLTUtRXh0CU9QVElPTkFMLAorCXVsUHNldWRvU2VnSW5kCQkJVWxQc2V1ZG9TZWdJbmQJCQlPUFRJT05BTCwJLS0gSW5jbHVkZWQgd2hlbiB1cGxpbmsgUlJMUAorCS0tIFBzZXVkby1zZWdtZW50YXRpb24gaXMgdXNlZCwgbm90IGluY2x1ZGVkIHdoZW4gbm8gdXBsaW5rIHBzZXVkby1zZWdtZW50YXRpb24gaXMgdXNlZAorCS4uLgorCQkJCQktLSBQb3NzaWJseSBtb3JlIGV4dGVuc2lvbnMgZm9yIFJlbGVhc2UgNSBoZXJlIGxhdGVyCit9CisKK0V4dGVuZGVkLXJlZmVyZW5jZSA6Oj0gU0VRVUVOQ0UgeworCXNtbGMtY29kZQkJCUlOVEVHRVIgKDAuLjYzKSwKKwl0cmFuc2FjdGlvbi1JRAkJSU5URUdFUiAoMC4uMjYyMTQzKQorfQorCitPVEQtTWVhc3VyZUluZm8tNS1FeHQgOjo9IFNlcU9mT1RELU1zckVsZW1lbnRSZXN0CisJLS0gaWYgbW9yZSB0aGFuIG9uZSBtZWFzdXJlbWVudCBzZXRzIGFyZSBwcmVzZW50IHRoaXMgZWxlbWVudCBpcyByZXBlYXRlZAorCS0tIE51bWJlck9mU2V0cyAtIDEgKC0xID0gZmlyc3Qgc2V0KSBjb21iaW5lZCBpbiBPVEQtTWVhc3VyZUluZm8tNS1FeHQgYW5kCisJLS0gT1RELU1lYXN1cmVJbmZvIChlLmcuIGlmIE51bWJlck9mU2V0cyBpcyAzLCB0aGVuIG9uZSBvdGRNc3JSZXN0U2V0cyBtYXkKKwktLSBiZSBzZW50IGluIE9URC1NZWFzdXJlSW5mby01LUV4dCBhbmQgb25lIGluIE9URC1NZWFzdXJlSW5mbykKKworLS0gRmlyc3QgcGFydCBvZiBVcGxpbmsgUlJMUCBQc2V1ZG8tc2VnbWVudGF0aW9uIGluZGljYXRpb24sIHBvc3NpYmx5IG1vcmUgbWF5IGJlIGRlZmluZWQKKy0tIGluIHRoZSBmdXR1cmUgZm9yIHNlZ21lbnRhdGlvbiB3aXRoIG1vcmUgdGhhbiB0d28gc2VnbWVudHMuCitVbFBzZXVkb1NlZ0luZCA6Oj0gRU5VTUVSQVRFRCB7CisJZmlyc3RPZk1hbnkgKDApLAorCXNlY29uZE9mTWFueSgxKQorfQorCitSZWw1LU1zclBvc2l0aW9uLVJlcS1FeHRlbnNpb24gOjo9IFNFUVVFTkNFIHsKKwlleHRlbmRlZC1yZWZlcmVuY2UJCQlFeHRlbmRlZC1yZWZlcmVuY2UsCisJLi4uCisJLS0gUG9zc2libHkgbW9yZSBleHRlbnNpb25zIGZvciBSZWxlYXNlIDUgaGVyZSBsYXRlcgorfQorCitSZWw1LUFzc2lzdGFuY2VEYXRhLUV4dGVuc2lvbiA6Oj0gU0VRVUVOQ0UgeworCWV4dGVuZGVkLXJlZmVyZW5jZQkJCUV4dGVuZGVkLXJlZmVyZW5jZSwKKwkuLi4KKworLS0gUG9zc2libHkgbW9yZSBleHRlbnNpb25zIGZvciBSZWxlYXNlIDUgaGVyZSBsYXRlcgorfQorCitSZWwtNS1Qcm90b2NvbEVycm9yLUV4dGVuc2lvbjo6PSBTRVFVRU5DRSB7CisJZXh0ZW5kZWQtcmVmZXJlbmNlCQkJRXh0ZW5kZWQtcmVmZXJlbmNlIAlPUFRJT05BTCwKKwktLSBUaGUgZXh0ZW5kZWQtcmVmZXJlbmNlIHNoYWxsIGJlIGluY2x1ZGVkIGJ5IHRoZSBNUyBpZiBhbmQgb25seSBpZiBwcmV2aW91c2x5CisJLS0gcmVjZWl2ZWQgZnJvbSB0aGUgU01MQy4KKwktLSBXaGVuIGluY2x1ZGVkLCB0aGUgdmFsdWUgc2VudCBieSB0aGUgTVMgc2hhbGwgZXF1YWwgdGhlIHZhbHVlIHJlY2VpdmVkIGZyb20gdGhlIFNNTEMuCisJLi4uCisKKwktLSBQb3NzaWJseSBtb3JlIGV4dGVuc2lvbnMgZm9yIFJlbGVhc2UgNSBoZXJlIGxhdGVyCit9CisKKy0tIFJlbGVhc2UgNyBFeHRlbnNpb25zIGhlcmUKKworUmVsNy1Nc3JQb3NpdGlvbi1SZXEtRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7Cit2ZWxvY2l0eVJlcXVlc3RlZAkJIE5VTEwJCSBPUFRJT05BTCwKKyBnYW5zc1Bvc2l0aW9uTWV0aG9kIEdBTlNTUG9zaXRpb25pbmdNZXRob2QgT1BUSU9OQUwsCisgZ2Fuc3MtQXNzaXN0RGF0YSBHQU5TUy1Bc3Npc3REYXRhIE9QVElPTkFMLAorIGdhbnNzQ2FycmllclBoYXNlTWVhc3VyZW1lbnRSZXF1ZXN0IE5VTEwgT1BUSU9OQUwsCisgZ2Fuc3NUT0RHU01UaW1lQXNzb2NpYXRpb25NZWFzdXJlbWVudFJlcXVlc3QgTlVMTCBPUFRJT05BTCwKK3JlcXVpcmVkUmVzcG9uc2VUaW1lCVJlcXVpcmVkUmVzcG9uc2VUaW1lCU9QVElPTkFMLAorCS4uLgorCS0tIEZ1cnRoZXIgUmVsZWFzZSA3IGV4dGVudGlvbnMgaGVyZQorfQorCistLSBhZGRpdGlvbmFsIHNhdGVsbGl0ZSBzeXN0ZW1zIG1heSBiZSBhZGRlZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlIHByb3RvY29sCitHQU5TU1Bvc2l0aW9uaW5nTWV0aG9kIDo6PSBCSVQgU1RSSU5HIHsKKwlncHMgKDApLAorCWdhbGlsZW8gKDEpfSAoU0laRSAoMi4uMTYpKQorCitHQU5TUy1Bc3Npc3REYXRhIDo6PSBTRVFVRU5DRSB7CisJZ2Fuc3MtY29udHJvbEhlYWRlcglHQU5TUy1Db250cm9sSGVhZGVyCit9CisKK0dBTlNTLUNvbnRyb2xIZWFkZXIgOjo9IFNFUVVFTkNFIHsKKyBnYW5zc0NvbW1vbkFzc2lzdERhdGEgR0FOU1NDb21tb25Bc3Npc3REYXRhIE9QVElPTkFMLAorIGdhbnNzR2VuZXJpY0Fzc2lzdERhdGFMaXN0IFNlcU9mR0FOU1NHZW5lcmljQXNzaXN0RGF0YUVsZW1lbnQgT1BUSU9OQUwKK30KKworLS0gR0FOU1MgQ29tbW9uIEFzc2lzdGFuY2UgRGF0YSBFbGVtZW50cworR0FOU1NDb21tb25Bc3Npc3REYXRhIDo6PSBTRVFVRU5DRSB7CisJZ2Fuc3NSZWZlcmVuY2VUaW1lCQkgR0FOU1NSZWZlcmVuY2VUaW1lCQkgT1BUSU9OQUwsCisJZ2Fuc3NSZWZMb2NhdGlvbgkJCUdBTlNTUmVmTG9jYXRpb24JCSBPUFRJT05BTCwKKwlnYW5zc0lvbm9zcGhlcmljTW9kZWwJCUdBTlNTSW9ub3NwaGVyaWNNb2RlbAkgT1BUSU9OQUwsCisJLi4uCit9CisKKy0tIExpc3Qgb2YgR0FOU1MgR2VuZXJpYyBBc3Npc3RhbmNlIERhdGEgRWxlbWVudHMsIHVwIHRvIDggR0FOU1MKK1NlcU9mR0FOU1NHZW5lcmljQXNzaXN0RGF0YUVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFICgxLi44KSkgT0YgR0FOU1NHZW5lcmljQXNzaXN0RGF0YUVsZW1lbnQKKworLS0gR0FOU1MgR2VuZXJpYyBBc3Npc3RhbmNlIERhdGEgRWxlbWVudHMKK0dBTlNTR2VuZXJpY0Fzc2lzdERhdGFFbGVtZW50IDo6PSBTRVFVRU5DRSB7CisgZ2Fuc3NJRCBJTlRFR0VSICgwLi43KSBPUFRJT05BTCwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorIGdhbnNzVGltZU1vZGVsIFNlcU9mR0FOU1NUaW1lTW9kZWwgT1BUSU9OQUwsCisJZ2Fuc3NEaWZmQ29ycmVjdGlvbnMJCSBHQU5TU0RpZmZDb3JyZWN0aW9ucwkgT1BUSU9OQUwsCisJZ2Fuc3NOYXZpZ2F0aW9uTW9kZWwJCSBHQU5TU05hdk1vZGVsIE9QVElPTkFMLAorCWdhbnNzUmVhbFRpbWVJbnRlZ3JpdHkJIEdBTlNTUmVhbFRpbWVJbnRlZ3JpdHkJIE9QVElPTkFMLAorCWdhbnNzRGF0YUJpdEFzc2lzdAkJCSBHQU5TU0RhdGFCaXRBc3Npc3QJCSBPUFRJT05BTCwKKwlnYW5zc1JlZk1lYXN1cmVtZW50QXNzaXN0CSBHQU5TU1JlZk1lYXN1cmVtZW50QXNzaXN0IE9QVElPTkFMLAorIGdhbnNzQWxtYW5hY01vZGVsIEdBTlNTQWxtYW5hY01vZGVsIE9QVElPTkFMLAorIGdhbnNzVVRDTW9kZWwgR0FOU1NVVENNb2RlbCBPUFRJT05BTCwKKwkuLi4KK30KKworLS0gR0FOU1MgQ09NTU9OIEFTU0lTVEFOQ0UgREFUQSBFTEVNRU5UUworCistLSBHQU5TUyBSZWZlcmVuY2UgVGltZSBJRQorR0FOU1NSZWZlcmVuY2VUaW1lIDo6PSBTRVFVRU5DRSB7CisJZ2Fuc3NSZWZUaW1lSW5mbwkJCSBHQU5TU1JlZlRpbWVJbmZvLAorCWdhbnNzVE9ELUdTTVRpbWVBc3NvY2lhdGlvbiBHQU5TU1RPRC1HU01UaW1lQXNzb2NpYXRpb24gT1BUSU9OQUwKK30KKworLS0gR0FOU1MgUmVmZXJlbmNlIFRpbWUgaW5jbHVkZXMgR0FOU1MgVE9ELCBHQU5TUyBEYXksIHVuY2VydGFpbnR5CitHQU5TU1JlZlRpbWVJbmZvIDo6PSBTRVFVRU5DRSB7CisJZ2Fuc3NEYXkJCQkgSU5URUdFUigwIC4uIDgxOTEpIE9QVElPTkFMLAorIGdhbnNzVE9EIEdBTlNTVE9ELAorCWdhbnNzVE9EVW5jZXJ0YWludHkJIEdBTlNTVE9EVW5jZXJ0YWludHkgT1BUSU9OQUwsCisgZ2Fuc3NUaW1lSUQgSU5URUdFUiAoMCAuLiA3KSBPUFRJT05BTAorfQorCistLSBHQU5TUyBUT0QgaW50ZWdlciBzZWNvbmRzCitHQU5TU1RPRCA6Oj0gSU5URUdFUiAoMCAuLiA4NjM5OSkKKworLS0gR0FOU1MgVE9EIHVuY2VydGFpbnR5CitHQU5TU1RPRFVuY2VydGFpbnR5IDo6PSBJTlRFR0VSICgwIC4uIDEyNykgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorCistLSBHQU5TUyBUT0QtR1NNIFRpbWUgYXNzb2NpYXRpb24gCitHQU5TU1RPRC1HU01UaW1lQXNzb2NpYXRpb24gOjo9IFNFUVVFTkNFIHsKKwliY2NoQ2FycmllcgkJQkNDSENhcnJpZXIsCS0tIEJDQ0ggY2FycmllcgorCWJzaWMJCQlCU0lDLAkJCS0tIEJTSUMKKwlmcmFtZU51bWJlcgkJRnJhbWVOdW1iZXIsCisJdGltZVNsb3QJCVRpbWVTbG90LAorCWJpdE51bWJlcgkJQml0TnVtYmVyLAorIGZyYW1lRHJpZnQgRnJhbWVEcmlmdCBPUFRJT05BTAorfQorCistLSBGcmFtZSBkcmlmdAorRnJhbWVEcmlmdCA6Oj0gSU5URUdFUigtNjQgLi4gNjMpCisKKy0tIEdBTlNTIFJlZmVyZW5jZSBMb2NhdGlvbiBJRQorR0FOU1NSZWZMb2NhdGlvbiA6Oj0gU0VRVUVOQ0UgeworCXRocmVlRExvY2F0aW9uCQkJRXh0LUdlb2dyYXBoaWNhbEluZm9ybWF0aW9uCit9CisKKy0tIEdBTlNTIElvbm9zcGhlcmljIE1vZGVsIElFCistLSBHQU5TUyBJb25vc3BoZXJpYyBNb2RlbCBjb25zaXN0cyBvZiBOZVF1aWNrIG1vZGVsIHBhcmFtZXRlcnMgYW5kIHN0b3JtIGZsYWdzCisKK0dBTlNTSW9ub3NwaGVyaWNNb2RlbCA6Oj0gU0VRVUVOQ0UgeworIGdhbnNzSW9ub01vZGVsIEdBTlNTSW9ub3NwaGVyZU1vZGVsLAorIGdhbnNzSW9ub1N0b3JtRmxhZ3MgR0FOU1NJb25vU3Rvcm1GbGFncyBPUFRJT05BTCwKKyAuLi4KK30KKworLS0gR0FOU1MgaW9ub3NwaGVyZSBtb2RlbC4gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leCAKK0dBTlNTSW9ub3NwaGVyZU1vZGVsIDo6PSBTRVFVRU5DRSB7CisgYWkwIElOVEVHRVIgKDAgLi4gNDA5NSksCisgYWkxIElOVEVHRVIgKDAgLi4gNDA5NSksCisgYWkyIElOVEVHRVIgKDAgLi4gNDA5NSkKK30KKworLS0gR0FOU1MgaW9ub3NwaGVyZSBzdG9ybSBmbGFncworR0FOU1NJb25vU3Rvcm1GbGFncyA6Oj0gU0VRVUVOQ0UgeworCWlvbm9TdG9ybUZsYWcxCUlOVEVHRVIgKDAgLi4gMSksCisJaW9ub1N0b3JtRmxhZzIJSU5URUdFUiAoMCAuLiAxKSwKKwlpb25vU3Rvcm1GbGFnMwlJTlRFR0VSICgwIC4uIDEpLAorCWlvbm9TdG9ybUZsYWc0CUlOVEVHRVIgKDAgLi4gMSksCisJaW9ub1N0b3JtRmxhZzUJSU5URUdFUiAoMCAuLiAxKQorfQorCistLSBHQU5TUyBHRU5FUklDIEFTU0lTVEFOQ0UgREFUQSBFTEVNRU5UUworCistLSBHQU5TUyBUaW1lIE1vZGVsIElFIGNvbnNpc3RzIG9mIHRpbWUgb2Zmc2V0IGFuZCBmaXJzdCBhbmQgc2Vjb25kIG9yZGVyIHBhcmFtZXRlcnMgdG8gcmVsYXRlIEdOU1MKKy0tIHNwZWNpZmljIHN5c3RlbSB0aW1lIHRvIHNlbGVjdGVkIHRpbWUgcmVmZXJlbmNlCitTZXFPZkdBTlNTVGltZU1vZGVsIDo6PSBTRVFVRU5DRSAoU0laRSgxLi43KSkgT0YgR0FOU1NUaW1lTW9kZWxFbGVtZW50CisKK0dBTlNTVGltZU1vZGVsRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCWdhbnNzVGltZU1vZGVsUmVmVGltZQkJSU5URUdFUigwIC4uIDY1NTM1KSwKKwl0QTAJCSBUQTAsCisJdEExCQkgVEExIE9QVElPTkFMLAorCXRBMgkJIFRBMiBPUFRJT05BTCwKKyBnbnNzVE9JRCBJTlRFR0VSICgwIC4uIDcpLAorIHdlZWtOdW1iZXIgSU5URUdFUiAoMCAuLiA4MTkxKSBPUFRJT05BTCAKK30KKworLS0gR0FOU1MgdGltZSBtb2RlbCBwYXJhbWV0ZXIgQTAKK1RBMCA6Oj0gSU5URUdFUiAoLTIxNDc0ODM2NDggLi4gMjE0NzQ4MzY0NykKKworLS0gR0FOU1MgdGltZSBtb2RlbCBwYXJhbWV0ZXIgQTEKK1RBMSA6Oj0gSU5URUdFUiAoLTgzODg2MDggLi4gODM4ODYwNykKKworLS0gR0FOU1MgdGltZSBtb2RlbCBwYXJhbWV0ZXIgQTIKK1RBMiA6Oj0gSU5URUdFUiAoLTY0IC4uIDYzKQorCistLSBER0FOU1MgQ29ycmVjdGlvbnMgSUUKK0dBTlNTRGlmZkNvcnJlY3Rpb25zIDo6PSBTRVFVRU5DRSB7CisJZGdhbnNzUmVmVGltZQkJSU5URUdFUiAoMCAuLiAxMTkpLAkgLS0gREdBTlNTIHJlZmVyZW5jZSB0aW1lCisKKwktLSBOX1NHTl9UWVBFIGNhbiBiZSByZWFkIGZyb20gbnVtYmVyIG9mIGVsZW1lbnRzIG9mIHNnblR5cGVMaXN0CisJc2duVHlwZUxpc3QJCSBTZXFPZlNnblR5cGVFbGVtZW50Cit9CisKK1NlcU9mU2duVHlwZUVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFICgxLi4zKSkgT0YgU2duVHlwZUVsZW1lbnQgLS0gbWF4IHRocmVlIHNpZ25hbHMgcGVyIEdOU1MKKworLS0gREdBTlNTIHNpZ25hbCB0eXBlIGVsZW1lbnQsIG9uY2UgcGVyIEdOU1Mgc2lnbmFsIHR5cGUgaW5jbHVkZWQgaW4gREdBTlNTCitTZ25UeXBlRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCWdhbnNzU2lnbmFsSUQJCSBHQU5TU1NpZ25hbElEIE9QVElPTkFMLCAtLSBzaWduYWwgdHlwZSBpZGVudGl0eQorIGdhbnNzU3RhdHVzSGVhbHRoIElOVEVHRVIgKDAgLi4gNyksCisJLS0gTl9TR04gY2FuIGJlIHJlYWQgZnJvbSBudW1iZXIgb2YgZWxlbWVudHMgb2YgZGdhbnNzU2duTGlzdAorIGRnYW5zc1Nnbkxpc3QgU2VxT2ZER0FOU1NTZ25FbGVtZW50Cit9CisKK0dBTlNTU2lnbmFsSUQgOjo9IElOVEVHRVIgKDAgLi4gMykJLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorU2VxT2ZER0FOU1NTZ25FbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSAoMS4uMTYpKSBPRiBER0FOU1NTZ25FbGVtZW50CisKKy0tIG51bWJlciBvZiBjb3JyZWN0aW9uIGZvciBzaWduYWxzCitER0FOU1NTZ25FbGVtZW50IDo6PSBTRVFVRU5DRSB7CisJc3ZJRAkJIFNWSUQsIC0tIFNhdGVsbGl0ZSBpZGVudGl0eQorCistLS0gU2VxdWVuY2UgbnVtYmVyIGZvciBHQU5TUyBOYXZpZ2F0aW9uIE1vZGVsIHRoYXQgbWF0Y2hlcyB0aGUgREdBTlNTIGNvcnJlY3Rpb24gc2V0CisJaW9kIAkJCUlOVEVHRVIgKDAgLi4gMTAyMyksCisKKwktLSBVc2VyIERpZmZlcmVudGlhbCBSYW5nZSBFcnJvcgorCXVkcmUJCQlJTlRFR0VSICgwLi4zKSwJCQorCisJLS0gUHNldWRvIFJhbmdlIENvcnJlY3Rpb24sIHJhbmdlIGlzCisJLS0gLTY1NS4wNCAtICs2NTUuMDQsCisJcHNldWRvUmFuZ2VDb3IJSU5URUdFUiAoLTIwNDcuLjIwNDcpLCAJCisKKwktLSBQc2V1ZG8gUmFuZ2UgUmF0ZSBDb3JyZWN0aW9uLCByYW5nZSBpcworCS0tIC00LjA2NCAtICs0LjA2NCwKKwlyYW5nZVJhdGVDb3IJSU5URUdFUiAoLTEyNy4uMTI3KQorfQorCitTVklEIDo6PSBJTlRFR0VSICgwIC4uIDYzKQktLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisKKy0tIEdBTlNTIE5hdmlnYXRpb24gTW9kZWwgSUUKK0dBTlNTTmF2TW9kZWwgOjo9IFNFUVVFTkNFIHsKKyBub25Ccm9hZGNhc3RJbmRGbGFnIElOVEVHRVIgKDAgLi4gMSksCisgdG9lTVNCIElOVEVHRVIgKDAgLi4gMzEpIE9QVElPTkFMLCAtLSA1IE1TQiBvZiB0b2UgYW5kIHRvYyAKKyBlTVNCIElOVEVHRVIgKDAgLi4gMTI3KSBPUFRJT05BTCwKKyBzcXJ0QU1CUyBJTlRFR0VSICgwIC4uIDYzKSBPUFRJT05BTCwKKwlnYW5zc1NhdGVsbGl0ZUxpc3QgU2VxT2ZHQU5TU1NhdGVsbGl0ZUVsZW1lbnQKK30KKworU2VxT2ZHQU5TU1NhdGVsbGl0ZUVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEuLjMyKSkgT0YgR0FOU1NTYXRlbGxpdGVFbGVtZW50CisKK0dBTlNTU2F0ZWxsaXRlRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworCXN2SUQgU1ZJRCwKKyBzdkhlYWx0aCBJTlRFR0VSICgtNyAuLiAxMyksIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKyBpb2QgSU5URUdFUiAoMCAuLiAxMDIzKSwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorIGdhbnNzQ2xvY2tNb2RlbCBHQU5TU0Nsb2NrTW9kZWwsIAorIGdhbnNzT3JiaXRNb2RlbCBHQU5TU09yYml0TW9kZWwsIAorIC4uLgorfQorCistLSBHQU5TUyBvcmJpdCBtb2RlbCBmb3IgdGhlIEdOU1Mgc2F0ZWxsaXRlIGFjY29yZGluZyB0byB0aGUgY2hvaWNlCitHQU5TU09yYml0TW9kZWwgOjo9IENIT0lDRSB7CisJa2VwbGVyaWFuU2V0CSBOYXZNb2RlbC1LZXBsZXJpYW5TZXQsCQorIC4uLgorfQorCistLSBOYXZpZ2F0aW9uIG1vZGVsIGluIEtlcGxlcmlhbiBwYXJhbWV0ZXJzCitOYXZNb2RlbC1LZXBsZXJpYW5TZXQgOjo9IFNFUVVFTkNFIHsKKyBrZXBsZXJUb2VMU0IgSU5URUdFUiAoMCAuLiA1MTEpLCAtLSA5TFNCIGFyZSBnaXZlbiBpbiBHQU5TU05hdmlnYXRpb25Nb2RlbAorCWtlcGxlclcJCQkgSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCWtlcGxlckRlbHRhTgkgSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJa2VwbGVyTTAJCSBJTlRFR0VSICgtMjE0NzQ4MzY0OC4uMjE0NzQ4MzY0NyksCisJa2VwbGVyT21lZ2FEb3QJIElOVEVHRVIgKC04Mzg4NjA4Li44Mzg4NjA3KSwKKwlrZXBsZXJFTFNCIAkgSU5URUdFUiAoMC4uMzM1NTQ0MzEpLAorCWtlcGxlcklEb3QJCSBJTlRFR0VSICgtODE5Mi4uODE5MSksCisJa2VwbGVyQVBvd2VySGFsZkxTQiBJTlRFR0VSICgwLi4gNjcxMDg4NjMpLAorCWtlcGxlckkwCQkgSU5URUdFUiAoLTIxNDc0ODM2NDguLjIxNDc0ODM2NDcpLAorCWtlcGxlck9tZWdhMCBJTlRFR0VSICgtMjE0NzQ4MzY0OC4uMjE0NzQ4MzY0NyksCisJa2VwbGVyQ3JzCQkgSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJa2VwbGVyQ2lzCQkgSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJa2VwbGVyQ3VzCQkgSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJa2VwbGVyQ3JjCQkgSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJa2VwbGVyQ2ljCQkgSU5URUdFUiAoLTMyNzY4Li4zMjc2NyksCisJa2VwbGVyQ3VjCQkgSU5URUdFUiAoLTMyNzY4Li4zMjc2NykKK30KKworLS0gR0FOU1MgY2xvY2sgbW9kZWwgZm9yIHRoZSBHTlNTIHNhdGVsbGl0ZSBhY2NvcmRpbmcgdG8gdGhlIGNob2ljZQorR0FOU1NDbG9ja01vZGVsIDo6PSBDSE9JQ0UgeworCXN0YW5kYXJkQ2xvY2tNb2RlbExpc3QJIFNlcU9mU3RhbmRhcmRDbG9ja01vZGVsRWxlbWVudCwJCisgLi4uCit9CisKK1NlcU9mU3RhbmRhcmRDbG9ja01vZGVsRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMikpIE9GIFN0YW5kYXJkQ2xvY2tNb2RlbEVsZW1lbnQKKworU3RhbmRhcmRDbG9ja01vZGVsRWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworIHN0YW5DbG9ja1RvY0xTQiBJTlRFR0VSICgwIC4uIDUxMSksIC0tIDlMU0Igb2YgdGltZSBvZiBjbG9jaworIHN0YW5DbG9ja0FGMiBJTlRFR0VSICgtMjA0OCAuLiAyMDQ3KSwgCisgc3RhbkNsb2NrQUYxIElOVEVHRVIgKC0xMzEwNzIgLi4gMTMxMDcxKSwgCisgc3RhbkNsb2NrQUYwIElOVEVHRVIgKC0xMzQyMTc3MjggLi4gMTM0MjE3NzI3KSwKKyBzdGFuQ2xvY2tUZ2QgSU5URUdFUiAoLTUxMiAuLiA1MTEpIE9QVElPTkFMLAorIHN0YW5Nb2RlbElEIElOVEVHRVIgKDAgLi4gMSkgT1BUSU9OQUwsCisgLi4uCit9IAorCistLSBHQU5TUyBSZWFsLVRpbWUgSW50ZWdyaXR5IElFCitHQU5TU1JlYWxUaW1lSW50ZWdyaXR5IDo6PSBTRVFVRU5DRSB7CisgLS0gbGlzdCBvZiBiYWQgc2lnbmFscworIC0tIE5CUyBjYW4gYmUgcmVhZCBmcm9tIG51bWJlciBvZiBlbGVtZW50cyBpbiBTZXFPZi1CYWRTaWduYWxTZXQKKyBnYW5zc0JhZFNpZ25hbExpc3QgU2VxT2ZCYWRTaWduYWxFbGVtZW50Cit9CisKK1NlcU9mQmFkU2lnbmFsRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMTYpKSBPRiBCYWRTaWduYWxFbGVtZW50CisKK0JhZFNpZ25hbEVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKyBiYWRTVklEIFNWSUQsIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKyBiYWRTaWduYWxJRCBJTlRFR0VSICgwIC4uIDMpIE9QVElPTkFMIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKK30KKworCistLSBHQU5TUyBEYXRhIEJpdCBBc3Npc3RhbmNlIElFCitHQU5TU0RhdGFCaXRBc3Npc3QgOjo9IFNFUVVFTkNFIHsKKyBnYW5zc1RPRCBJTlRFR0VSICgwIC4uIDU5KSwKKyBzdklEIFNWSUQsCisgZ2Fuc3NEYXRhVHlwZUlEIElOVEVHRVIgKDAgLi4gMiksIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKyAtLSBsaXN0IG9mIG5hdmlnYXRpb24gZGF0YSBiaXRzCisgLS0gTl9CSVQgY2FuIGJlIHJlYWQgZnJvbSBudW1iZXIgb2YgZWxlbWVudHMgaW4gU2VxT2YtRGF0YUJpdHMKKyBnYW5zc0RhdGFCaXRzIFNlcU9mLUdBTlNTRGF0YUJpdHMKK30KKworU2VxT2YtR0FOU1NEYXRhQml0cyA6Oj0gU0VRVUVOQ0UgKFNJWkUoMSAuLiAxMDI0KSkgT0YgR0FOU1NEYXRhQml0CitHQU5TU0RhdGFCaXQgOjo9IElOVEVHRVIoMCAuLiAxKQorCistLSBHQU5TUyBSZWZlcmVuY2UgTWVhc3VyZW1lbnQgQXNzaXN0YW5jZSBJRQorLS0gQ29kZSBhbmQgRG9wcGxlciBhc3Npc3RhbmNlIGZyb20gdGhlIG5ldHdvcmsuIAorR0FOU1NSZWZNZWFzdXJlbWVudEFzc2lzdCA6Oj0gU0VRVUVOQ0UgeworIGdhbnNzU2lnbmFsSUQgSU5URUdFUiAoMCAuLiAzKSBPUFRJT05BTCwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorIGdhbnNzUmVmTWVhc0Fzc2l0TGlzdCBTZXFPZkdBTlNTUmVmTWVhc3VyZW1lbnRFbGVtZW50Cit9CisKK1NlcU9mR0FOU1NSZWZNZWFzdXJlbWVudEVsZW1lbnQgOjo9IFNFUVVFTkNFIChTSVpFKDEgLi4gMTYpKSBPRiBHQU5TU1JlZk1lYXN1cmVtZW50RWxlbWVudAorCitHQU5TU1JlZk1lYXN1cmVtZW50RWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworIHN2SUQgU1ZJRCwKKwktLSBEb3BwbGVyIDB0aCBvcmRlciB0ZXJtLAorCS0tIC0xMDI0IG0vcyB0byAxMDIzLjUgbS9zIHdpdGggMC41IG0vcyByZXNvbHV0aW9uKQorCWRvcHBsZXIwCQkJCUlOVEVHRVIgKC0yMDQ4IC4uIDIwNDcpLAktLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisJYWRkaXRpb25hbERvcHBsZXIJCUFkZGl0aW9uYWxEb3BwbGVyRmllbGRzCSBPUFRJT05BTCwKKwljb2RlUGhhc2UJCQkJSU5URUdFUiAoMCAuLiAxMDIyKSwJIC0tIENvZGUgUGhhc2UgaW4gbXMKKwlpbnRDb2RlUGhhc2UJCQlJTlRFR0VSICgwIC4uIDEyNyksCSAtLSBJbnRlZ2VyIENvZGUgUGhhc2UgaW4gbXMKKwljb2RlUGhhc2VTZWFyY2hXaW5kb3cJSU5URUdFUiAoMCAuLiAzMSksCSAtLSBDb2RlIFBoYXNlIFNlYXJjaCBXaW5kb3csIHNlZSBBbm5leAorCWFkZGl0aW9uYWxBbmdsZQkJCUFkZGlvbmFsQW5nbGVGaWVsZHMJCSBPUFRJT05BTCwKKyAuLi4KK30KKworQWRkaXRpb25hbERvcHBsZXJGaWVsZHMgOjo9IFNFUVVFTkNFIHsKKwktLSBEb3BwbGVyIDFzdCBvcmRlciB0ZXJtLCAtMC4yIC0gKzAuMSBtL3MyCisJZG9wcGxlcjEJCQkJSU5URUdFUiAoMC4uNjMpLAorCWRvcHBsZXJVbmNlcnRhaW50eQkJSU5URUdFUiAoMC4uNCkKK30KKworLS0gR0FOU1MgQWxtYW5hYyBNb2RlbCBJRQorR0FOU1NBbG1hbmFjTW9kZWwgOjo9IFNFUVVFTkNFIHsKKyB3ZWVrTnVtYmVyIElOVEVHRVIgKDAgLi4gMjU1KSwKKyBzdklETWFzayBTVklETUFTSywKKyB0b2EgSU5URUdFUiAoMCAuLiAyNTUpIE9QVElPTkFMLAorIGlvZGEgSU5URUdFUiAoMCAuLiAzKSBPUFRJT05BTCwKKyBnYW5zc0FsbWFuYWNMaXN0IFNlcU9mR0FOU1NBbG1hbmFjRWxlbWVudAorfQorCistLSBTViBJRCBNYXNrLCBMU0IgZm9yIElEIDEgYW5kIE1TQiBmb3IgSUQgMzYKK1NWSURNQVNLIDo6PSBCSVQgU1RSSU5HIChTSVpFICgxLi4zNikpCisKK1NlcU9mR0FOU1NBbG1hbmFjRWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMSAuLiAzNikpIE9GIEdBTlNTQWxtYW5hY0VsZW1lbnQKKworLS0gR0FOU1MgQWxtYW5hYyBNb2RlbCAKK0dBTlNTQWxtYW5hY0VsZW1lbnQgOjo9IENIT0lDRSB7CisJa2VwbGVyaWFuQWxtYW5hY1NldAkgQWxtYW5hYy1LZXBsZXJpYW5TZXQsCQorIC4uLgorfQorCistLSBBbG1hbmFjIHBhcmFtZXRlcnMgYWNjb3JkaW5nIHRvIEtlcGxlcmlhbiBwYXJhbWV0ZXJzCitBbG1hbmFjLUtlcGxlcmlhblNldCA6Oj0gU0VRVUVOQ0UgeworIAlrZXBBbG1hbmFjRQkJCSBJTlRFR0VSICgwIC4uIDIwNDcpLAorCWtlcEFsbWFuYWNEZWx0YUkJCUlOVEVHRVIgKC0xMDI0IC4uIDEwMjMpLAorCWtlcEFsbWFuYWNPbWVnYURvdAkJSU5URUdFUiAoLTEwMjQgLi4gMTAyMyksCisga2VwU1ZIZWFsdGggSU5URUdFUiAoMCAuLiAxNSksIC0tIENvZGluZyBhY2NvcmRpbmcgdG8gQW5uZXgKKwlrZXBBbG1hbmFjQVBvd2VySGFsZglJTlRFR0VSICgtNjU1MzYgLi4gNjU1MzUpLAorCWtlcEFsbWFuYWNPbWVnYTAJCUlOVEVHRVIgKC0zMjc2OCAuLiAzMjc2NyksCisJa2VwQWxtYW5hY1cJCQkgSU5URUdFUiAoLTMyNzY4IC4uIDMyNzY3KSwKKwlrZXBBbG1hbmFjTTAJCQlJTlRFR0VSICgtMzI3NjggLi4gMzI3NjcpLAorCWtlcEFsbWFuYWNBRjAJCQlJTlRFR0VSICgtODE5MiAuLiA4MTkxKSwKKwlrZXBBbG1hbmFjQUYxCQkJSU5URUdFUiAoLTEwMjQuLjEwMjMpCit9CisKKy0tIEdBTlNTIFVuaXZlcnNhbCBUaW1lIENvb3JkaW5hdGUgTW9kZWwKK0dBTlNTVVRDTW9kZWwgOjo9IFNFUVVFTkNFIHsKKwlnYW5zc1V0Y0ExCQkJSU5URUdFUiAoLTgzODg2MDguLjgzODg2MDcpLAorCWdhbnNzVXRjQTAJCQlJTlRFR0VSICgtMjE0NzQ4MzY0OC4uMjE0NzQ4MzY0NyksCisJZ2Fuc3NVdGNUb3QJCQlJTlRFR0VSICgwLi4yNTUpLAorCWdhbnNzVXRjV050CQkJSU5URUdFUiAoMC4uMjU1KSwKKwlnYW5zc1V0Y0RlbHRhVGxzCUlOVEVHRVIgKC0xMjguLjEyNyksCisJZ2Fuc3NVdGNXTmxzZgkJSU5URUdFUiAoMC4uMjU1KSwKKwlnYW5zc1V0Y0ROCQkJSU5URUdFUiAoLTEyOC4uMTI3KSwKKwlnYW5zc1V0Y0RlbHRhVGxzZglJTlRFR0VSICgtMTI4Li4xMjcpCit9CisKKy0tUmVxdWlyZWQgTWVhc3VyZW1lbnQgUmVxdWVzdCBSZXNwb25zZSBUaW1lLCByYW5nZSBpcyAxIHRvIDEyOCBzZWNvbmRzLiAKK1JlcXVpcmVkUmVzcG9uc2VUaW1lIDo6PSBJTlRFR0VSICAoMS4uMTI4KQorCitSZWwtNy1Nc3JQb3NpdGlvbi1Sc3AtRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7CisKKwl2ZWxFc3RpbWF0ZSAJVmVsb2NpdHlFc3RpbWF0ZSBPUFRJT05BTCwKKyAtLSBIb3Jpem9udGFsIFZlbG9jaXR5CisgLS0gSG9yaXpvbnRhbCB3aXRoIFZlcnRpY2FsIFZlbG9jaXR5CisgLS0gSG9yaXpvbnRhbCBWZWxvY2l0eSB3aXRoIFVuY2VydGFpbnR5CisgLS0gSG9yaXpvbnRhbCB3aXRoIFZlcnRpY2FsIFZlbG9jaXR5IGFuZCBVbmNlcnRhaW50eQorIGdhbnNzTG9jYXRpb25JbmZvIEdBTlNTTG9jYXRpb25JbmZvIE9QVElPTkFMLAorIGdhbnNzTWVhc3VyZUluZm8gR0FOU1NNZWFzdXJlSW5mbyBPUFRJT05BTCwKKwkuLi4KKy0tIEZ1cnRoZXIgUmVsZWFzZSA3IGV4dGVuc2lvbnMgaGVyZQorfQorCistLSBHQU5TUyBMb2NhdGlvbiBJbmZvcm1hdGlvbiBjb250YWlucyBsb2NhdGlvbiBlc3RpbWF0ZSwgdGltZSBzdGFtcCB3aXRoIHVuY2VydGFpbnR5IAorLS0gYW5kIG9wdGlvbmFsbHkgUmVmZXJlbmNlIEZyYW1lIGZpZWxkCitHQU5TU0xvY2F0aW9uSW5mbyA6Oj0gU0VRVUVOQ0UgeworIHJlZmVyZW5jZUZyYW1lIFJlZmVyZW5jZUZyYW1lIE9QVElPTkFMLCAtLSBSZWZlcmVuY2UgRnJhbWUgTnVtYmVyCisgZ2Fuc3NUT0RtIEdBTlNTVE9EbSBPUFRJT05BTCwgLS0gR05TUyBUT0QgbW9kdWxvCisgZ2Fuc3NUT0RGcmFjIElOVEVHRVIgKDAgLi4gMTYzODQpIE9QVElPTkFMLCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisJZ2Fuc3NUT0RVbmNlcnRhaW50eSBHQU5TU1RPRFVuY2VydGFpbnR5IE9QVElPTkFMLCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisgZ2Fuc3NUaW1lSUQgSU5URUdFUiAoMCAuLiAzKSBPUFRJT05BTCwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorCWZpeFR5cGUJCQkgRml4VHlwZSwKKyBwb3NEYXRhIFBvc2l0aW9uRGF0YSwKKyBzdGF0aW9uYXJ5SW5kaWNhdGlvbiBJTlRFR0VSKDAgLi4gMSkgT1BUSU9OQUwsIC0tICcwJyBpZiBtb3Zpbmcgb3IgbW90aW9uIG5vdCBrbm93biAKKwktLSBQb3NzaWJsZSBzaGFwZXMgY2FycmllZCBpbiBwb3NFc3RpbWF0ZSBhcmUKKwktLSBlbGxpcHNvaWQgcG9pbnQsCisJLS0gZWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgY2lyY2xlCisJLS0gZWxsaXBzb2lkIHBvaW50IHdpdGggdW5jZXJ0YWludHkgZWxsaXBzZQorCS0tIGVsbGlwc29pZCBwb2ludCB3aXRoIGFsdGl0dWRlIGFuZCB1bmNlcnRhaW50eSBlbGxpcHNvaWQKKwlwb3NFc3RpbWF0ZQkJIEV4dC1HZW9ncmFwaGljYWxJbmZvcm1hdGlvbiwKKyAuLi4KK30KKworUG9zaXRpb25EYXRhIDo6PSBCSVQgU1RSSU5HIHsKKyBlLW90ZCgwKSwKKwlncHMgKDEpLAorCWdhbGlsZW8gKDIpIH0gKFNJWkUgKDMuLjE2KSkKKworCistLSBHQU5TUyBUT0QgbW9kdWxvIDEgaG91cgorR0FOU1NUT0RtIDo6PSBJTlRFR0VSICgwIC4uIDM1OTk5OTkpCisKK1JlZmVyZW5jZUZyYW1lIDo6PSBTRVFVRU5DRSB7CisgcmVmZXJlbmNlRk4gSU5URUdFUiAoMCAuLiA2NTUzNSksCisJLS0gTm90ZSB0aGF0IGFwcGxpY2FibGUgcmFuZ2UgZm9yIHJlZmVyZW5jZUZOIGlzIDAgLSA0MjQzMQorIHJlZmVyZW5jZUZOTVNCIElOVEVHRVIgKDAgLi4gNjMpIE9QVElPTkFMIC0tIE1TQiBvZiBSZWZlcmVuY2UgRnJhbWUgTnVtYmVyCit9CisKKworCistLSBHQU5TUyBNZWFzdXJlbWVudCBJbmZvcm1hdGlvbiAKK0dBTlNTTWVhc3VyZUluZm8gOjo9IFNFUVVFTkNFIHsKKwktLSBNZWFzdXJlbWVudCBpbmZvIGVsZW1lbnRzCisJLS0gdXNlciBoYXMgdG8gbWFrZSBzdXJlIHRoYXQgaW4gdGhpcyBlbGVtZW50IGlzIG51bWJlciBvZiBlbGVtZW50cworCS0tIGRlZmluZWQgaW4gcmVmZXJlbmNlIEJUUyBpZGVudGl0eQorIGdhbnNzTXNyU2V0TGlzdCBTZXFPZkdBTlNTLU1zclNldEVsZW1lbnQKK30KK1NlcU9mR0FOU1MtTXNyU2V0RWxlbWVudCA6Oj0gU0VRVUVOQ0UgKFNJWkUoMS4uMykpIE9GIEdBTlNTLU1zclNldEVsZW1lbnQKKworLS0gR0FOU1MgbWVhc3VyZW1lbnQgaW5mb3JtYXRpb24gMS0zIHRpbWVzIGluIGEgbWVzc2FnZQorR0FOU1MtTXNyU2V0RWxlbWVudCA6Oj0gU0VRVUVOQ0UgeworIHJlZmVyZW5jZUZyYW1lIFJlZmVyZW5jZUZyYW1lIE9QVElPTkFMLCAtLSBSZWZlcmVuY2UgRnJhbWUgTnVtYmVyCisgZ2Fuc3NUT0RtIEdBTlNTVE9EbSBPUFRJT05BTCwgLS0gR0FOU1MgVE9EIG1vZHVsbworIGRlbHRhR05BU1NUT0QgSU5URUdFUiAoMCAuLiAxMjcpIE9QVElPTkFMLAorCWdhbnNzVE9EVW5jZXJ0YWludHkgR0FOU1NUT0RVbmNlcnRhaW50eSBPUFRJT05BTCwgLS0gQ29kaW5nIGFjY29yaW5nIHRvIEFubmV4CisKKyAtLU5fU0dOX1RZUEUgY2FuIGJlIHJlYWQgZnJvbSBudW1iZXIgb2YgZWxlbWVudHMgb2YgU2VxT2ZHQU5TUy1TZ25UeXBlRWxlbWVudAorIGdhbnNzLVNnblR5cGVMaXN0IFNlcU9mR0FOU1MtU2duVHlwZUVsZW1lbnQKK30KKworLS0gTWVhc3VyZW1lbnRzIGNhbiBiZSByZXR1cm5lZCB1cCB0byA2IGRpZmZlcmVudCBzaWduYWwgdHlwZXMgCitTZXFPZkdBTlNTLVNnblR5cGVFbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSgxLi42KSkgT0YgR0FOU1MtU2duVHlwZUVsZW1lbnQKKworR0FOU1MtU2duVHlwZUVsZW1lbnQgOjo9IFNFUVVFTkNFIHsKKwlnYW5zc1NpZ25hbElECQlJTlRFR0VSICgwIC4uIDE1KSwgLS0gQ29kaW5nIGFjY3JvZGluZyB0byBBbm5leAorIC0tTl9TR04gY2FuIGJlIHJlYWQgZnJvbSBudW1iZXIgb2YgZWxlbWVudHMgb2YgU2VxT2ZHQU5TUy1TZ25FbGVtZW50CisgZ2Fuc3MtU2duTGlzdCBTZXFPZkdBTlNTLVNnbkVsZW1lbnQKK30KKworLS0gTWVhc3VyZW1lbnRzIGNhbiBiZSByZXR1cm5lZCB1cCB0byAxNiBwZXIgc2lnbmFsIHR5cGVzIAorU2VxT2ZHQU5TUy1TZ25FbGVtZW50IDo6PSBTRVFVRU5DRSAoU0laRSgxLi4xNikpIE9GIEdBTlNTLVNnbkVsZW1lbnQKKworCitHQU5TUy1TZ25FbGVtZW50IDo6PSBTRVFVRU5DRSB7Cisgc3ZJRCBTVklELAorIGNObyBJTlRFR0VSICgwIC4uIDYzKSwKKyBtcGF0aERldCBNcGF0aEluZGljLCAtLSBDb2RpbmcgYWNjb3JkaW5nIHRvIEFubmV4CisgY2FycmllclF1YWxpdHlJbmQgSU5URUdFUiAoMCAuLiAzKSBPUFRJT05BTCwgLS0gQ29kaW5nIGFjY29yZGluZyB0byBBbm5leAorIGNvZGVQaGFzZSBJTlRFR0VSICgwIC4uIDIwOTcxNTEpLAorIGludGVnZXJDb2RlUGhhc2UgSU5URUdFUiAoMCAuLiA2MykgT1BUSU9OQUwsCisgY29kZVBoYXNlUk1TRXJyb3IgSU5URUdFUiAoMC4uNjMpLCAtLSBDb2RpbmcgYWNjb3JpbmcgdG8gQW5uZXgKKyBkb3BwbGVyIElOVEVHRVIgKC0zMjc2OCAuLiAzMjc2NykgT1BUSU9OQUwsCisgYWRyIElOVEVHRVIgKDAgLi4gMzM1NTQ0MzEpIE9QVElPTkFMCit9CisKK1JlbDctQXNzaXN0YW5jZURhdGEtRXh0ZW5zaW9uIDo6PSBTRVFVRU5DRSB7CisgZ2Fuc3MtQXNzaXN0RGF0YSBHQU5TUy1Bc3Npc3REYXRhIE9QVElPTkFMLAorIGdhbnNzQ2FycmllclBoYXNlTWVhc3VyZW1lbnRSZXF1ZXN0IE5VTEwgT1BUSU9OQUwsCisgZ2Fuc3NUT0RHU01UaW1lQXNzb2NpYXRpb25NZWFzdXJlbWVudFJlcXVlc3QgTlVMTCBPUFRJT05BTCwKKwkuLi4KKy0tIFBvc3NpYmx5IG1vcmUgZXh0ZW5zaW9ucyBmb3IgUmVsZWFzZSA3IGhlcmUKK30KKworRU5ECmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xL1JSTFAtTWVzc2FnZXMuYXNuIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9SUkxQLU1lc3NhZ2VzLmFzbgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43OTE0MGUyCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvYXNuMS9SUkxQLU1lc3NhZ2VzLmFzbgpAQCAtMCwwICsxLDM4IEBACistLSBSUkxQLU1lc3NhZ2VzLmFzbgorLS0gJElkJAorLS0gVGFrZW4gZnJvbSAzR1BQIFRTIDQ0LjAzMSBWNy40LjAgKDIwMDctMDMpCistLSBodHRwOi8vd3d3LjNncHAub3JnL2Z0cC9TcGVjcy9hcmNoaXZlLzQ0X3Nlcmllcy80NC4wMzEvNDQwMzEtNzQwLnppcC80NDAzMS03NDAuZG9jCistLQorLS0gMy4xIEdlbmVyYWwgRm9ybWF0IG9mIFJSTFAgTWVzc2FnZQorLS0KKworUlJMUC1NZXNzYWdlcworLS0geyBSUkxQLW1lc3NhZ2VzIH0KKworREVGSU5JVElPTlMgQVVUT01BVElDIFRBR1MgOjo9CisKK0JFR0lOCisKK0lNUE9SVFMKKwlNc3JQb3NpdGlvbi1SZXEsIE1zclBvc2l0aW9uLVJzcCwgQXNzaXN0YW5jZURhdGEsCisJUHJvdG9jb2xFcnJvcgorRlJPTQorCVJSTFAtQ29tcG9uZW50cyAJLS0geyBSUkxQLUNvbXBvbmVudHMgfQorOworCitQRFUgOjo9IFNFUVVFTkNFIHsKKwlyZWZlcmVuY2VOdW1iZXIJCQlJTlRFR0VSICgwLi43KSwKKwljb21wb25lbnQJCQkJUlJMUC1Db21wb25lbnQKK30KKworUlJMUC1Db21wb25lbnQgOjo9IENIT0lDRSB7CisJbXNyUG9zaXRpb25SZXEJCQlNc3JQb3NpdGlvbi1SZXEsCisJbXNyUG9zaXRpb25Sc3AJCQlNc3JQb3NpdGlvbi1Sc3AsCisJYXNzaXN0YW5jZURhdGEJCQlBc3Npc3RhbmNlRGF0YSwKKwlhc3Npc3RhbmNlRGF0YUFjawkJTlVMTCwKKwlwcm90b2NvbEVycm9yCQkJUHJvdG9jb2xFcnJvciwKKwkuLi4KKworfQorCitFTkQKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2FzbjEvcGF0Y2gtcnJscC1jb21wb25lbnRzLmRpZmYgYi9ycmxwLWVwaGVtZXJpcy9hc24xL3BhdGNoLXJybHAtY29tcG9uZW50cy5kaWZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1ZTU1YWUKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xL3BhdGNoLXJybHAtY29tcG9uZW50cy5kaWZmCkBAIC0wLDAgKzEsMzYgQEAKKy0tLSBSUkxQLUNvbXBvbmVudHMuYXNuCTIwMDktMTAtMjYgMjI6MTA6NDQuMDAwMDAwMDAwICswMTAwCisrKysgUlJMUC1Db21wb25lbnRzLmFzbgkyMDA5LTEwLTI2IDIyOjEwOjQ0LjAwMDAwMDAwMCArMDEwMAorQEAgLTE4LDE2ICsxOCwxNiBAQAorIAlFeHQtR2VvZ3JhcGhpY2FsSW5mb3JtYXRpb24sIFZlbG9jaXR5RXN0aW1hdGUKKyBGUk9NCisgCU1BUC1MQ1MtRGF0YVR5cGVzIHsKKy0JY2NpdHQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKy0JZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1MQ1MtRGF0YVR5cGVzICgyNSkgdmVyc2lvbjUgKDUpfQorKwlpdHUtdCBpZGVudGlmaWVkLW9yZ2FuaXphdGlvbiAoNCkgZXRzaSAoMCkgbW9iaWxlRG9tYWluICgwKQorKwlnc20tTmV0d29yayAoMSkgbW9kdWxlcyAoMykgbWFwLUxDUy1EYXRhVHlwZXMgKDI1KSB2ZXJzaW9uMTEgKDExKX0KKyAKKyAJRXh0ZW5zaW9uQ29udGFpbmVyCisgRlJPTSBNQVAtRXh0ZW5zaW9uRGF0YVR5cGVzIHsKKy0JY2NpdHQgaWRlbnRpZmllZC1vcmdhbml6YXRpb24gKDQpIGV0c2kgKDApIG1vYmlsZURvbWFpbiAoMCkKKy0JZ3NtLU5ldHdvcmsgKDEpIG1vZHVsZXMgKDMpIG1hcC1FeHRlbnNpb25EYXRhVHlwZXMgKDIxKSB2ZXJzaW9uNCAoNCl9CisrCWl0dS10IGlkZW50aWZpZWQtb3JnYW5pemF0aW9uICg0KSBldHNpICgwKSBtb2JpbGVEb21haW4gKDApCisrCWdzbS1OZXR3b3JrICgxKSBtb2R1bGVzICgzKSBtYXAtRXh0ZW5zaW9uRGF0YVR5cGVzICgyMSkgdmVyc2lvbjExICgxMSl9CisgOworIAorIC0tIEFkZCBoZXJlIG90aGVyIEFTTi4xIGRlZmluaXRpb25zIHByZXNlbnRlZCBiZWxvdworIC0tIGluIGNoYXB0ZXJzIDQgYW5kIDUuCisgCitAQCAtMzA1LDExICszMDUsMTEgQEAKKyBTeXN0ZW1JbmZvSW5kZXggOjo9IElOVEVHRVIgKDEuLjMyKQorIAorIENlbGxJREFuZExBQyA6Oj0gU0VRVUVOQ0UgeworLQlyZWZlcmVuY2VMQUMJTEFDLAkJCQktLSBMb2NhdGlvbiBhcmVhIGNvZGUKKysJcmVmZXJlbmNlTEFDCUxBQ0lELAkJCQktLSBMb2NhdGlvbiBhcmVhIGNvZGUKKyAJcmVmZXJlbmNlQ0kJCUNlbGxJRAkJCQktLSBDZWxsIGlkZW50aXR5CisgfQorIENlbGxJRCA6Oj0gSU5URUdFUiAoMC4uNjU1MzUpCistTEFDIDo6PSBJTlRFR0VSICgwLi42NTUzNSkKKytMQUNJRCA6Oj0gSU5URUdFUiAoMC4uNjU1MzUpCisgCisgLS0gT1RELU1lYXN1cmVJbmZvCisgT1RELU1lYXN1cmVJbmZvIDo6PSBTRVFVRU5DRSB7CmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9hc24xY19wYXRjaGVzLzAwX2FkZF9lbnVtZXJhdGVkX3ZlcmJvc2UuZGlmZiBiL3JybHAtZXBoZW1lcmlzL2FzbjFjX3BhdGNoZXMvMDBfYWRkX2VudW1lcmF0ZWRfdmVyYm9zZS5kaWZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY0YzIyYTMKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xY19wYXRjaGVzLzAwX2FkZF9lbnVtZXJhdGVkX3ZlcmJvc2UuZGlmZgpAQCAtMCwwICsxLDU2IEBACitJbmRleDogc2tlbGV0b25zL05hdGl2ZUVudW1lcmF0ZWQuYworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tIHNrZWxldG9ucy9OYXRpdmVFbnVtZXJhdGVkLmMJKHJldmlzaW9uIDE0MDcpCisrKysgc2tlbGV0b25zL05hdGl2ZUVudW1lcmF0ZWQuYwkod29ya2luZyBjb3B5KQorQEAgLTIyLDcgKzIyLDcgQEAKKyAJIkVOVU1FUkFURUQiLAkJCS8qIFRoZSBBU04uMSB0eXBlIGlzIHN0aWxsIEVOVU1FUkFURUQgKi8KKyAJIkVOVU1FUkFURUQiLAorIAlOYXRpdmVJbnRlZ2VyX2ZyZWUsCistCU5hdGl2ZUludGVnZXJfcHJpbnQsCisrCU5hdGl2ZUVudW1lcmF0ZWRfcHJpbnQsCisgCWFzbl9nZW5lcmljX25vX2NvbnN0cmFpbnQsCisgCU5hdGl2ZUludGVnZXJfZGVjb2RlX2JlciwKKyAJTmF0aXZlSW50ZWdlcl9lbmNvZGVfZGVyLAorQEAgLTIwNSwzICsyMDUsMzAgQEAKKyAJX0FTTl9FTkNPREVEX09LKGVyKTsKKyB9CisgCisraW50CisrTmF0aXZlRW51bWVyYXRlZF9wcmludChhc25fVFlQRV9kZXNjcmlwdG9yX3QgKnRkLCBjb25zdCB2b2lkICpzcHRyLCBpbnQgaWxldmVsLAorKwlhc25fYXBwX2NvbnN1bWVfYnl0ZXNfZiAqY2IsIHZvaWQgKmFwcF9rZXkpIHsKKysJYXNuX0lOVEVHRVJfc3BlY2lmaWNzX3QgKnNwZWNzPShhc25fSU5URUdFUl9zcGVjaWZpY3NfdCAqKXRkLT5zcGVjaWZpY3M7CisrCWNvbnN0IGxvbmcgKm5hdGl2ZSA9IChjb25zdCBsb25nICopc3B0cjsKKysJY2hhciBzY3JhdGNoWzI1Nl07CisrCWludCByZXQ7CisrCisrCSh2b2lkKXRkOwkvKiBVbnVzZWQgYXJndW1lbnQgKi8KKysJKHZvaWQpaWxldmVsOwkvKiBVbnVzZWQgYXJndW1lbnQgKi8KKysKKysJaWYobmF0aXZlKSB7CisrCQljb25zdCBhc25fSU5URUdFUl9lbnVtX21hcF90ICptYXAgPSBJTlRFR0VSX21hcF92YWx1ZTJlbnVtKHNwZWNzLCAqbmF0aXZlKTsKKysJCWlmIChtYXAgJiYgbWFwLT5lbnVtX2xlbiAmJiBtYXAtPmVudW1fbmFtZSkgeworKwkJCXJldCA9IHNucHJpbnRmKHNjcmF0Y2gsIHNpemVvZihzY3JhdGNoKSwKKysJCQkJIiVzIiwgbWFwLT5lbnVtX25hbWUpOworKwkJfSBlbHNlIHsKKysJCQlyZXQgPSBzbnByaW50ZihzY3JhdGNoLCBzaXplb2Yoc2NyYXRjaCksCisrCQkJCShzcGVjcyAmJiBzcGVjcy0+ZmllbGRfdW5zaWduZWQpCisrCQkJCT8gIiVsdSIgOiAiJWxkIiwgKm5hdGl2ZSk7CisrCQl9CisrCQlhc3NlcnQocmV0ID4gMCAmJiAoc2l6ZV90KXJldCA8IHNpemVvZihzY3JhdGNoKSk7CisrCQlyZXR1cm4gKGNiKHNjcmF0Y2gsIHJldCwgYXBwX2tleSkgPCAwKSA/IC0xIDogMDsKKysJfSBlbHNlIHsKKysJCXJldHVybiAoY2IoIjxhYnNlbnQ+IiwgOCwgYXBwX2tleSkgPCAwKSA/IC0xIDogMDsKKysJfQorK30KK0luZGV4OiBza2VsZXRvbnMvTmF0aXZlRW51bWVyYXRlZC5oCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0gc2tlbGV0b25zL05hdGl2ZUVudW1lcmF0ZWQuaAkocmV2aXNpb24gMTQwNykKKysrKyBza2VsZXRvbnMvTmF0aXZlRW51bWVyYXRlZC5oCSh3b3JraW5nIGNvcHkpCitAQCAtMjQsNiArMjQsNyBAQAorIHhlcl90eXBlX2VuY29kZXJfZiBOYXRpdmVFbnVtZXJhdGVkX2VuY29kZV94ZXI7CisgcGVyX3R5cGVfZGVjb2Rlcl9mIE5hdGl2ZUVudW1lcmF0ZWRfZGVjb2RlX3VwZXI7CisgcGVyX3R5cGVfZW5jb2Rlcl9mIE5hdGl2ZUVudW1lcmF0ZWRfZW5jb2RlX3VwZXI7CisrYXNuX3N0cnVjdF9wcmludF9mIE5hdGl2ZUVudW1lcmF0ZWRfcHJpbnQ7CisgCisgI2lmZGVmIF9fY3BsdXNwbHVzCisgfQpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvYXNuMWNfcGF0Y2hlcy8wMV9maXhfcGVyX2VuY29kaW5nX2RpZXRlci5kaWZmIGIvcnJscC1lcGhlbWVyaXMvYXNuMWNfcGF0Y2hlcy8wMV9maXhfcGVyX2VuY29kaW5nX2RpZXRlci5kaWZmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwOWMyMDEKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9hc24xY19wYXRjaGVzLzAxX2ZpeF9wZXJfZW5jb2RpbmdfZGlldGVyLmRpZmYKQEAgLTAsMCArMSwxNyBAQAorSW5kZXg6IHNrZWxldG9ucy9wZXJfc3VwcG9ydC5jCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0gc2tlbGV0b25zL3Blcl9zdXBwb3J0LmMJKHJldmlzaW9uIDE0MDcpCisrKysgc2tlbGV0b25zL3Blcl9zdXBwb3J0LmMJKHdvcmtpbmcgY29weSkKK0BAIC0zMzYsNyArMzM2LDEyIEBACisgCQlidWZbM10gPSBiaXRzOworIAllbHNlIHsKKyAJCUFTTl9ERUJVRygiLT5bUEVSIG91dCBzcGxpdCAlZF0iLCBvYml0cyk7CisrI2lmIDEgLy8gRGlldGVyCisrCQlwby0+bmJvZmYgLT0gb2JpdHM7IC8vIHVuZG8gaW5jcmVtZW50YXRpb24gZnJvbSBhIGZldyBsaW5lcyBhYm92ZQorKwkJcGVyX3B1dF9mZXdfYml0cyhwbywgYml0cyA+PiAob2JpdHMgLSAyNCksIDI0KTsgLy8gc2hpZnQgYWNjb3JkaW5nIHRvIHRoZSByZXN0IG9mIHRoZSBiaXRzIAorKyNlbHNlCQkKKyAJCXBlcl9wdXRfZmV3X2JpdHMocG8sIGJpdHMgPj4gOCwgMjQpOworKyNlbmRpZgorIAkJcGVyX3B1dF9mZXdfYml0cyhwbywgYml0cywgb2JpdHMgLSAyNCk7CisgCQlBU05fREVCVUcoIjwtW1BFUiBvdXQgc3BsaXQgJWRdIiwgb2JpdHMpOworIAl9CmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9kYXRhLnVieCBiL3JybHAtZXBoZW1lcmlzL2RhdGEudWJ4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3Y2RkZGMKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9kYXRhLnVieApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9nZXQtdGVzdC1kYXRhLnNoIGIvcnJscC1lcGhlbWVyaXMvZ2V0LXRlc3QtZGF0YS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4xNjlmNDNjCi0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvZ2V0LXRlc3QtZGF0YS5zaApAQCAtMCwwICsxLDE3IEBACisjIS9iaW4vc2gKKworREVWPSQxCitPVVRGPSQyCisKKyMgQ2hhbmdlIG1vZGUKK2VjaG8gLWVuICJcJFBVQlgsNDEsMSwwMDAxLDAwMDEsOTYwMCwwKjE0XHJcbiIgPiAke0RFVn0KKworIyBXYWl0IGEgbGl0dGxlCitzbGVlcCAyCisKKyMgU3RhcnQgZHVtcAorZWNobyAtZW4gIlx4YjVceDYyXHgwMVx4MDJceDAwXHgwMFx4MDNceDBhIiB8IFwKKwlzb2NhdCAtdDUgJHtERVZ9LGI5NjAwLHJhdyxjbG9jYWw9MSxlY2hvPTAgLSA+ICR7T1VURn0KK2VjaG8gLWVuICJceGI1XHg2Mlx4MGJceDEwXHgwMFx4MDBceDFiXHg1YyIgfCBcCisJc29jYXQgLXQxMCAke0RFVn0sYjk2MDAscmF3LGNsb2NhbD0xLGVjaG89MCAtID4+ICR7T1VURn0KKwpkaWZmIC0tZ2l0IGEvQ09QWUlORyBiL3JybHAtZXBoZW1lcmlzL2dwbC0yLjAudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpjb3B5IGZyb20gQ09QWUlORwpjb3B5IHRvIHJybHAtZXBoZW1lcmlzL2dwbC0yLjAudHh0CmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy9ncGwtMy4wLnR4dCBiL3JybHAtZXBoZW1lcmlzL2dwbC0zLjAudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0YTllZDAKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9ncGwtMy4wLnR4dApAQCAtMCwwICsxLDY3NCBAQAorICAgICAgICAgICAgICAgICAgICBHTlUgR0VORVJBTCBQVUJMSUMgTElDRU5TRQorICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDMsIDI5IEp1bmUgMjAwNworCisgQ29weXJpZ2h0IChDKSAyMDA3IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiA8aHR0cDovL2ZzZi5vcmcvPgorIEV2ZXJ5b25lIGlzIHBlcm1pdHRlZCB0byBjb3B5IGFuZCBkaXN0cmlidXRlIHZlcmJhdGltIGNvcGllcworIG9mIHRoaXMgbGljZW5zZSBkb2N1bWVudCwgYnV0IGNoYW5naW5nIGl0IGlzIG5vdCBhbGxvd2VkLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlYW1ibGUKKworICBUaGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaXMgYSBmcmVlLCBjb3B5bGVmdCBsaWNlbnNlIGZvcgorc29mdHdhcmUgYW5kIG90aGVyIGtpbmRzIG9mIHdvcmtzLgorCisgIFRoZSBsaWNlbnNlcyBmb3IgbW9zdCBzb2Z0d2FyZSBhbmQgb3RoZXIgcHJhY3RpY2FsIHdvcmtzIGFyZSBkZXNpZ25lZAordG8gdGFrZSBhd2F5IHlvdXIgZnJlZWRvbSB0byBzaGFyZSBhbmQgY2hhbmdlIHRoZSB3b3Jrcy4gIEJ5IGNvbnRyYXN0LAordGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGlzIGludGVuZGVkIHRvIGd1YXJhbnRlZSB5b3VyIGZyZWVkb20gdG8KK3NoYXJlIGFuZCBjaGFuZ2UgYWxsIHZlcnNpb25zIG9mIGEgcHJvZ3JhbS0tdG8gbWFrZSBzdXJlIGl0IHJlbWFpbnMgZnJlZQorc29mdHdhcmUgZm9yIGFsbCBpdHMgdXNlcnMuICBXZSwgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgdXNlIHRoZQorR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vc3Qgb2Ygb3VyIHNvZnR3YXJlOyBpdCBhcHBsaWVzIGFsc28gdG8KK2FueSBvdGhlciB3b3JrIHJlbGVhc2VkIHRoaXMgd2F5IGJ5IGl0cyBhdXRob3JzLiAgWW91IGNhbiBhcHBseSBpdCB0bworeW91ciBwcm9ncmFtcywgdG9vLgorCisgIFdoZW4gd2Ugc3BlYWsgb2YgZnJlZSBzb2Z0d2FyZSwgd2UgYXJlIHJlZmVycmluZyB0byBmcmVlZG9tLCBub3QKK3ByaWNlLiAgT3VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2VzIGFyZSBkZXNpZ25lZCB0byBtYWtlIHN1cmUgdGhhdCB5b3UKK2hhdmUgdGhlIGZyZWVkb20gdG8gZGlzdHJpYnV0ZSBjb3BpZXMgb2YgZnJlZSBzb2Z0d2FyZSAoYW5kIGNoYXJnZSBmb3IKK3RoZW0gaWYgeW91IHdpc2gpLCB0aGF0IHlvdSByZWNlaXZlIHNvdXJjZSBjb2RlIG9yIGNhbiBnZXQgaXQgaWYgeW91Cit3YW50IGl0LCB0aGF0IHlvdSBjYW4gY2hhbmdlIHRoZSBzb2Z0d2FyZSBvciB1c2UgcGllY2VzIG9mIGl0IGluIG5ldworZnJlZSBwcm9ncmFtcywgYW5kIHRoYXQgeW91IGtub3cgeW91IGNhbiBkbyB0aGVzZSB0aGluZ3MuCisKKyAgVG8gcHJvdGVjdCB5b3VyIHJpZ2h0cywgd2UgbmVlZCB0byBwcmV2ZW50IG90aGVycyBmcm9tIGRlbnlpbmcgeW91Cit0aGVzZSByaWdodHMgb3IgYXNraW5nIHlvdSB0byBzdXJyZW5kZXIgdGhlIHJpZ2h0cy4gIFRoZXJlZm9yZSwgeW91IGhhdmUKK2NlcnRhaW4gcmVzcG9uc2liaWxpdGllcyBpZiB5b3UgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlIHNvZnR3YXJlLCBvciBpZgoreW91IG1vZGlmeSBpdDogcmVzcG9uc2liaWxpdGllcyB0byByZXNwZWN0IHRoZSBmcmVlZG9tIG9mIG90aGVycy4KKworICBGb3IgZXhhbXBsZSwgaWYgeW91IGRpc3RyaWJ1dGUgY29waWVzIG9mIHN1Y2ggYSBwcm9ncmFtLCB3aGV0aGVyCitncmF0aXMgb3IgZm9yIGEgZmVlLCB5b3UgbXVzdCBwYXNzIG9uIHRvIHRoZSByZWNpcGllbnRzIHRoZSBzYW1lCitmcmVlZG9tcyB0aGF0IHlvdSByZWNlaXZlZC4gIFlvdSBtdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZXksIHRvbywgcmVjZWl2ZQorb3IgY2FuIGdldCB0aGUgc291cmNlIGNvZGUuICBBbmQgeW91IG11c3Qgc2hvdyB0aGVtIHRoZXNlIHRlcm1zIHNvIHRoZXkKK2tub3cgdGhlaXIgcmlnaHRzLgorCisgIERldmVsb3BlcnMgdGhhdCB1c2UgdGhlIEdOVSBHUEwgcHJvdGVjdCB5b3VyIHJpZ2h0cyB3aXRoIHR3byBzdGVwczoKKygxKSBhc3NlcnQgY29weXJpZ2h0IG9uIHRoZSBzb2Z0d2FyZSwgYW5kICgyKSBvZmZlciB5b3UgdGhpcyBMaWNlbnNlCitnaXZpbmcgeW91IGxlZ2FsIHBlcm1pc3Npb24gdG8gY29weSwgZGlzdHJpYnV0ZSBhbmQvb3IgbW9kaWZ5IGl0LgorCisgIEZvciB0aGUgZGV2ZWxvcGVycycgYW5kIGF1dGhvcnMnIHByb3RlY3Rpb24sIHRoZSBHUEwgY2xlYXJseSBleHBsYWlucwordGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhpcyBmcmVlIHNvZnR3YXJlLiAgRm9yIGJvdGggdXNlcnMnIGFuZAorYXV0aG9ycycgc2FrZSwgdGhlIEdQTCByZXF1aXJlcyB0aGF0IG1vZGlmaWVkIHZlcnNpb25zIGJlIG1hcmtlZCBhcworY2hhbmdlZCwgc28gdGhhdCB0aGVpciBwcm9ibGVtcyB3aWxsIG5vdCBiZSBhdHRyaWJ1dGVkIGVycm9uZW91c2x5IHRvCithdXRob3JzIG9mIHByZXZpb3VzIHZlcnNpb25zLgorCisgIFNvbWUgZGV2aWNlcyBhcmUgZGVzaWduZWQgdG8gZGVueSB1c2VycyBhY2Nlc3MgdG8gaW5zdGFsbCBvciBydW4KK21vZGlmaWVkIHZlcnNpb25zIG9mIHRoZSBzb2Z0d2FyZSBpbnNpZGUgdGhlbSwgYWx0aG91Z2ggdGhlIG1hbnVmYWN0dXJlcgorY2FuIGRvIHNvLiAgVGhpcyBpcyBmdW5kYW1lbnRhbGx5IGluY29tcGF0aWJsZSB3aXRoIHRoZSBhaW0gb2YKK3Byb3RlY3RpbmcgdXNlcnMnIGZyZWVkb20gdG8gY2hhbmdlIHRoZSBzb2Z0d2FyZS4gIFRoZSBzeXN0ZW1hdGljCitwYXR0ZXJuIG9mIHN1Y2ggYWJ1c2Ugb2NjdXJzIGluIHRoZSBhcmVhIG9mIHByb2R1Y3RzIGZvciBpbmRpdmlkdWFscyB0bwordXNlLCB3aGljaCBpcyBwcmVjaXNlbHkgd2hlcmUgaXQgaXMgbW9zdCB1bmFjY2VwdGFibGUuICBUaGVyZWZvcmUsIHdlCitoYXZlIGRlc2lnbmVkIHRoaXMgdmVyc2lvbiBvZiB0aGUgR1BMIHRvIHByb2hpYml0IHRoZSBwcmFjdGljZSBmb3IgdGhvc2UKK3Byb2R1Y3RzLiAgSWYgc3VjaCBwcm9ibGVtcyBhcmlzZSBzdWJzdGFudGlhbGx5IGluIG90aGVyIGRvbWFpbnMsIHdlCitzdGFuZCByZWFkeSB0byBleHRlbmQgdGhpcyBwcm92aXNpb24gdG8gdGhvc2UgZG9tYWlucyBpbiBmdXR1cmUgdmVyc2lvbnMKK29mIHRoZSBHUEwsIGFzIG5lZWRlZCB0byBwcm90ZWN0IHRoZSBmcmVlZG9tIG9mIHVzZXJzLgorCisgIEZpbmFsbHksIGV2ZXJ5IHByb2dyYW0gaXMgdGhyZWF0ZW5lZCBjb25zdGFudGx5IGJ5IHNvZnR3YXJlIHBhdGVudHMuCitTdGF0ZXMgc2hvdWxkIG5vdCBhbGxvdyBwYXRlbnRzIHRvIHJlc3RyaWN0IGRldmVsb3BtZW50IGFuZCB1c2Ugb2YKK3NvZnR3YXJlIG9uIGdlbmVyYWwtcHVycG9zZSBjb21wdXRlcnMsIGJ1dCBpbiB0aG9zZSB0aGF0IGRvLCB3ZSB3aXNoIHRvCithdm9pZCB0aGUgc3BlY2lhbCBkYW5nZXIgdGhhdCBwYXRlbnRzIGFwcGxpZWQgdG8gYSBmcmVlIHByb2dyYW0gY291bGQKK21ha2UgaXQgZWZmZWN0aXZlbHkgcHJvcHJpZXRhcnkuICBUbyBwcmV2ZW50IHRoaXMsIHRoZSBHUEwgYXNzdXJlcyB0aGF0CitwYXRlbnRzIGNhbm5vdCBiZSB1c2VkIHRvIHJlbmRlciB0aGUgcHJvZ3JhbSBub24tZnJlZS4KKworICBUaGUgcHJlY2lzZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgY29weWluZywgZGlzdHJpYnV0aW9uIGFuZAorbW9kaWZpY2F0aW9uIGZvbGxvdy4KKworICAgICAgICAgICAgICAgICAgICAgICBURVJNUyBBTkQgQ09ORElUSU9OUworCisgIDAuIERlZmluaXRpb25zLgorCisgICJUaGlzIExpY2Vuc2UiIHJlZmVycyB0byB2ZXJzaW9uIDMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlLgorCisgICJDb3B5cmlnaHQiIGFsc28gbWVhbnMgY29weXJpZ2h0LWxpa2UgbGF3cyB0aGF0IGFwcGx5IHRvIG90aGVyIGtpbmRzIG9mCit3b3Jrcywgc3VjaCBhcyBzZW1pY29uZHVjdG9yIG1hc2tzLgorCisgICJUaGUgUHJvZ3JhbSIgcmVmZXJzIHRvIGFueSBjb3B5cmlnaHRhYmxlIHdvcmsgbGljZW5zZWQgdW5kZXIgdGhpcworTGljZW5zZS4gIEVhY2ggbGljZW5zZWUgaXMgYWRkcmVzc2VkIGFzICJ5b3UiLiAgIkxpY2Vuc2VlcyIgYW5kCisicmVjaXBpZW50cyIgbWF5IGJlIGluZGl2aWR1YWxzIG9yIG9yZ2FuaXphdGlvbnMuCisKKyAgVG8gIm1vZGlmeSIgYSB3b3JrIG1lYW5zIHRvIGNvcHkgZnJvbSBvciBhZGFwdCBhbGwgb3IgcGFydCBvZiB0aGUgd29yaworaW4gYSBmYXNoaW9uIHJlcXVpcmluZyBjb3B5cmlnaHQgcGVybWlzc2lvbiwgb3RoZXIgdGhhbiB0aGUgbWFraW5nIG9mIGFuCitleGFjdCBjb3B5LiAgVGhlIHJlc3VsdGluZyB3b3JrIGlzIGNhbGxlZCBhICJtb2RpZmllZCB2ZXJzaW9uIiBvZiB0aGUKK2VhcmxpZXIgd29yayBvciBhIHdvcmsgImJhc2VkIG9uIiB0aGUgZWFybGllciB3b3JrLgorCisgIEEgImNvdmVyZWQgd29yayIgbWVhbnMgZWl0aGVyIHRoZSB1bm1vZGlmaWVkIFByb2dyYW0gb3IgYSB3b3JrIGJhc2VkCitvbiB0aGUgUHJvZ3JhbS4KKworICBUbyAicHJvcGFnYXRlIiBhIHdvcmsgbWVhbnMgdG8gZG8gYW55dGhpbmcgd2l0aCBpdCB0aGF0LCB3aXRob3V0CitwZXJtaXNzaW9uLCB3b3VsZCBtYWtlIHlvdSBkaXJlY3RseSBvciBzZWNvbmRhcmlseSBsaWFibGUgZm9yCitpbmZyaW5nZW1lbnQgdW5kZXIgYXBwbGljYWJsZSBjb3B5cmlnaHQgbGF3LCBleGNlcHQgZXhlY3V0aW5nIGl0IG9uIGEKK2NvbXB1dGVyIG9yIG1vZGlmeWluZyBhIHByaXZhdGUgY29weS4gIFByb3BhZ2F0aW9uIGluY2x1ZGVzIGNvcHlpbmcsCitkaXN0cmlidXRpb24gKHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24pLCBtYWtpbmcgYXZhaWxhYmxlIHRvIHRoZQorcHVibGljLCBhbmQgaW4gc29tZSBjb3VudHJpZXMgb3RoZXIgYWN0aXZpdGllcyBhcyB3ZWxsLgorCisgIFRvICJjb252ZXkiIGEgd29yayBtZWFucyBhbnkga2luZCBvZiBwcm9wYWdhdGlvbiB0aGF0IGVuYWJsZXMgb3RoZXIKK3BhcnRpZXMgdG8gbWFrZSBvciByZWNlaXZlIGNvcGllcy4gIE1lcmUgaW50ZXJhY3Rpb24gd2l0aCBhIHVzZXIgdGhyb3VnaAorYSBjb21wdXRlciBuZXR3b3JrLCB3aXRoIG5vIHRyYW5zZmVyIG9mIGEgY29weSwgaXMgbm90IGNvbnZleWluZy4KKworICBBbiBpbnRlcmFjdGl2ZSB1c2VyIGludGVyZmFjZSBkaXNwbGF5cyAiQXBwcm9wcmlhdGUgTGVnYWwgTm90aWNlcyIKK3RvIHRoZSBleHRlbnQgdGhhdCBpdCBpbmNsdWRlcyBhIGNvbnZlbmllbnQgYW5kIHByb21pbmVudGx5IHZpc2libGUKK2ZlYXR1cmUgdGhhdCAoMSkgZGlzcGxheXMgYW4gYXBwcm9wcmlhdGUgY29weXJpZ2h0IG5vdGljZSwgYW5kICgyKQordGVsbHMgdGhlIHVzZXIgdGhhdCB0aGVyZSBpcyBubyB3YXJyYW50eSBmb3IgdGhlIHdvcmsgKGV4Y2VwdCB0byB0aGUKK2V4dGVudCB0aGF0IHdhcnJhbnRpZXMgYXJlIHByb3ZpZGVkKSwgdGhhdCBsaWNlbnNlZXMgbWF5IGNvbnZleSB0aGUKK3dvcmsgdW5kZXIgdGhpcyBMaWNlbnNlLCBhbmQgaG93IHRvIHZpZXcgYSBjb3B5IG9mIHRoaXMgTGljZW5zZS4gIElmCit0aGUgaW50ZXJmYWNlIHByZXNlbnRzIGEgbGlzdCBvZiB1c2VyIGNvbW1hbmRzIG9yIG9wdGlvbnMsIHN1Y2ggYXMgYQorbWVudSwgYSBwcm9taW5lbnQgaXRlbSBpbiB0aGUgbGlzdCBtZWV0cyB0aGlzIGNyaXRlcmlvbi4KKworICAxLiBTb3VyY2UgQ29kZS4KKworICBUaGUgInNvdXJjZSBjb2RlIiBmb3IgYSB3b3JrIG1lYW5zIHRoZSBwcmVmZXJyZWQgZm9ybSBvZiB0aGUgd29yaworZm9yIG1ha2luZyBtb2RpZmljYXRpb25zIHRvIGl0LiAgIk9iamVjdCBjb2RlIiBtZWFucyBhbnkgbm9uLXNvdXJjZQorZm9ybSBvZiBhIHdvcmsuCisKKyAgQSAiU3RhbmRhcmQgSW50ZXJmYWNlIiBtZWFucyBhbiBpbnRlcmZhY2UgdGhhdCBlaXRoZXIgaXMgYW4gb2ZmaWNpYWwKK3N0YW5kYXJkIGRlZmluZWQgYnkgYSByZWNvZ25pemVkIHN0YW5kYXJkcyBib2R5LCBvciwgaW4gdGhlIGNhc2Ugb2YKK2ludGVyZmFjZXMgc3BlY2lmaWVkIGZvciBhIHBhcnRpY3VsYXIgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UsIG9uZSB0aGF0CitpcyB3aWRlbHkgdXNlZCBhbW9uZyBkZXZlbG9wZXJzIHdvcmtpbmcgaW4gdGhhdCBsYW5ndWFnZS4KKworICBUaGUgIlN5c3RlbSBMaWJyYXJpZXMiIG9mIGFuIGV4ZWN1dGFibGUgd29yayBpbmNsdWRlIGFueXRoaW5nLCBvdGhlcgordGhhbiB0aGUgd29yayBhcyBhIHdob2xlLCB0aGF0IChhKSBpcyBpbmNsdWRlZCBpbiB0aGUgbm9ybWFsIGZvcm0gb2YKK3BhY2thZ2luZyBhIE1ham9yIENvbXBvbmVudCwgYnV0IHdoaWNoIGlzIG5vdCBwYXJ0IG9mIHRoYXQgTWFqb3IKK0NvbXBvbmVudCwgYW5kIChiKSBzZXJ2ZXMgb25seSB0byBlbmFibGUgdXNlIG9mIHRoZSB3b3JrIHdpdGggdGhhdAorTWFqb3IgQ29tcG9uZW50LCBvciB0byBpbXBsZW1lbnQgYSBTdGFuZGFyZCBJbnRlcmZhY2UgZm9yIHdoaWNoIGFuCitpbXBsZW1lbnRhdGlvbiBpcyBhdmFpbGFibGUgdG8gdGhlIHB1YmxpYyBpbiBzb3VyY2UgY29kZSBmb3JtLiAgQQorIk1ham9yIENvbXBvbmVudCIsIGluIHRoaXMgY29udGV4dCwgbWVhbnMgYSBtYWpvciBlc3NlbnRpYWwgY29tcG9uZW50Cisoa2VybmVsLCB3aW5kb3cgc3lzdGVtLCBhbmQgc28gb24pIG9mIHRoZSBzcGVjaWZpYyBvcGVyYXRpbmcgc3lzdGVtCisoaWYgYW55KSBvbiB3aGljaCB0aGUgZXhlY3V0YWJsZSB3b3JrIHJ1bnMsIG9yIGEgY29tcGlsZXIgdXNlZCB0bworcHJvZHVjZSB0aGUgd29yaywgb3IgYW4gb2JqZWN0IGNvZGUgaW50ZXJwcmV0ZXIgdXNlZCB0byBydW4gaXQuCisKKyAgVGhlICJDb3JyZXNwb25kaW5nIFNvdXJjZSIgZm9yIGEgd29yayBpbiBvYmplY3QgY29kZSBmb3JtIG1lYW5zIGFsbAordGhlIHNvdXJjZSBjb2RlIG5lZWRlZCB0byBnZW5lcmF0ZSwgaW5zdGFsbCwgYW5kIChmb3IgYW4gZXhlY3V0YWJsZQord29yaykgcnVuIHRoZSBvYmplY3QgY29kZSBhbmQgdG8gbW9kaWZ5IHRoZSB3b3JrLCBpbmNsdWRpbmcgc2NyaXB0cyB0bworY29udHJvbCB0aG9zZSBhY3Rpdml0aWVzLiAgSG93ZXZlciwgaXQgZG9lcyBub3QgaW5jbHVkZSB0aGUgd29yaydzCitTeXN0ZW0gTGlicmFyaWVzLCBvciBnZW5lcmFsLXB1cnBvc2UgdG9vbHMgb3IgZ2VuZXJhbGx5IGF2YWlsYWJsZSBmcmVlCitwcm9ncmFtcyB3aGljaCBhcmUgdXNlZCB1bm1vZGlmaWVkIGluIHBlcmZvcm1pbmcgdGhvc2UgYWN0aXZpdGllcyBidXQKK3doaWNoIGFyZSBub3QgcGFydCBvZiB0aGUgd29yay4gIEZvciBleGFtcGxlLCBDb3JyZXNwb25kaW5nIFNvdXJjZQoraW5jbHVkZXMgaW50ZXJmYWNlIGRlZmluaXRpb24gZmlsZXMgYXNzb2NpYXRlZCB3aXRoIHNvdXJjZSBmaWxlcyBmb3IKK3RoZSB3b3JrLCBhbmQgdGhlIHNvdXJjZSBjb2RlIGZvciBzaGFyZWQgbGlicmFyaWVzIGFuZCBkeW5hbWljYWxseQorbGlua2VkIHN1YnByb2dyYW1zIHRoYXQgdGhlIHdvcmsgaXMgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIHRvIHJlcXVpcmUsCitzdWNoIGFzIGJ5IGludGltYXRlIGRhdGEgY29tbXVuaWNhdGlvbiBvciBjb250cm9sIGZsb3cgYmV0d2VlbiB0aG9zZQorc3VicHJvZ3JhbXMgYW5kIG90aGVyIHBhcnRzIG9mIHRoZSB3b3JrLgorCisgIFRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBuZWVkIG5vdCBpbmNsdWRlIGFueXRoaW5nIHRoYXQgdXNlcnMKK2NhbiByZWdlbmVyYXRlIGF1dG9tYXRpY2FsbHkgZnJvbSBvdGhlciBwYXJ0cyBvZiB0aGUgQ29ycmVzcG9uZGluZworU291cmNlLgorCisgIFRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSBmb3IgYSB3b3JrIGluIHNvdXJjZSBjb2RlIGZvcm0gaXMgdGhhdAorc2FtZSB3b3JrLgorCisgIDIuIEJhc2ljIFBlcm1pc3Npb25zLgorCisgIEFsbCByaWdodHMgZ3JhbnRlZCB1bmRlciB0aGlzIExpY2Vuc2UgYXJlIGdyYW50ZWQgZm9yIHRoZSB0ZXJtIG9mCitjb3B5cmlnaHQgb24gdGhlIFByb2dyYW0sIGFuZCBhcmUgaXJyZXZvY2FibGUgcHJvdmlkZWQgdGhlIHN0YXRlZAorY29uZGl0aW9ucyBhcmUgbWV0LiAgVGhpcyBMaWNlbnNlIGV4cGxpY2l0bHkgYWZmaXJtcyB5b3VyIHVubGltaXRlZAorcGVybWlzc2lvbiB0byBydW4gdGhlIHVubW9kaWZpZWQgUHJvZ3JhbS4gIFRoZSBvdXRwdXQgZnJvbSBydW5uaW5nIGEKK2NvdmVyZWQgd29yayBpcyBjb3ZlcmVkIGJ5IHRoaXMgTGljZW5zZSBvbmx5IGlmIHRoZSBvdXRwdXQsIGdpdmVuIGl0cworY29udGVudCwgY29uc3RpdHV0ZXMgYSBjb3ZlcmVkIHdvcmsuICBUaGlzIExpY2Vuc2UgYWNrbm93bGVkZ2VzIHlvdXIKK3JpZ2h0cyBvZiBmYWlyIHVzZSBvciBvdGhlciBlcXVpdmFsZW50LCBhcyBwcm92aWRlZCBieSBjb3B5cmlnaHQgbGF3LgorCisgIFlvdSBtYXkgbWFrZSwgcnVuIGFuZCBwcm9wYWdhdGUgY292ZXJlZCB3b3JrcyB0aGF0IHlvdSBkbyBub3QKK2NvbnZleSwgd2l0aG91dCBjb25kaXRpb25zIHNvIGxvbmcgYXMgeW91ciBsaWNlbnNlIG90aGVyd2lzZSByZW1haW5zCitpbiBmb3JjZS4gIFlvdSBtYXkgY29udmV5IGNvdmVyZWQgd29ya3MgdG8gb3RoZXJzIGZvciB0aGUgc29sZSBwdXJwb3NlCitvZiBoYXZpbmcgdGhlbSBtYWtlIG1vZGlmaWNhdGlvbnMgZXhjbHVzaXZlbHkgZm9yIHlvdSwgb3IgcHJvdmlkZSB5b3UKK3dpdGggZmFjaWxpdGllcyBmb3IgcnVubmluZyB0aG9zZSB3b3JrcywgcHJvdmlkZWQgdGhhdCB5b3UgY29tcGx5IHdpdGgKK3RoZSB0ZXJtcyBvZiB0aGlzIExpY2Vuc2UgaW4gY29udmV5aW5nIGFsbCBtYXRlcmlhbCBmb3Igd2hpY2ggeW91IGRvCitub3QgY29udHJvbCBjb3B5cmlnaHQuICBUaG9zZSB0aHVzIG1ha2luZyBvciBydW5uaW5nIHRoZSBjb3ZlcmVkIHdvcmtzCitmb3IgeW91IG11c3QgZG8gc28gZXhjbHVzaXZlbHkgb24geW91ciBiZWhhbGYsIHVuZGVyIHlvdXIgZGlyZWN0aW9uCithbmQgY29udHJvbCwgb24gdGVybXMgdGhhdCBwcm9oaWJpdCB0aGVtIGZyb20gbWFraW5nIGFueSBjb3BpZXMgb2YKK3lvdXIgY29weXJpZ2h0ZWQgbWF0ZXJpYWwgb3V0c2lkZSB0aGVpciByZWxhdGlvbnNoaXAgd2l0aCB5b3UuCisKKyAgQ29udmV5aW5nIHVuZGVyIGFueSBvdGhlciBjaXJjdW1zdGFuY2VzIGlzIHBlcm1pdHRlZCBzb2xlbHkgdW5kZXIKK3RoZSBjb25kaXRpb25zIHN0YXRlZCBiZWxvdy4gIFN1YmxpY2Vuc2luZyBpcyBub3QgYWxsb3dlZDsgc2VjdGlvbiAxMAorbWFrZXMgaXQgdW5uZWNlc3NhcnkuCisKKyAgMy4gUHJvdGVjdGluZyBVc2VycycgTGVnYWwgUmlnaHRzIEZyb20gQW50aS1DaXJjdW12ZW50aW9uIExhdy4KKworICBObyBjb3ZlcmVkIHdvcmsgc2hhbGwgYmUgZGVlbWVkIHBhcnQgb2YgYW4gZWZmZWN0aXZlIHRlY2hub2xvZ2ljYWwKK21lYXN1cmUgdW5kZXIgYW55IGFwcGxpY2FibGUgbGF3IGZ1bGZpbGxpbmcgb2JsaWdhdGlvbnMgdW5kZXIgYXJ0aWNsZQorMTEgb2YgdGhlIFdJUE8gY29weXJpZ2h0IHRyZWF0eSBhZG9wdGVkIG9uIDIwIERlY2VtYmVyIDE5OTYsIG9yCitzaW1pbGFyIGxhd3MgcHJvaGliaXRpbmcgb3IgcmVzdHJpY3RpbmcgY2lyY3VtdmVudGlvbiBvZiBzdWNoCittZWFzdXJlcy4KKworICBXaGVuIHlvdSBjb252ZXkgYSBjb3ZlcmVkIHdvcmssIHlvdSB3YWl2ZSBhbnkgbGVnYWwgcG93ZXIgdG8gZm9yYmlkCitjaXJjdW12ZW50aW9uIG9mIHRlY2hub2xvZ2ljYWwgbWVhc3VyZXMgdG8gdGhlIGV4dGVudCBzdWNoIGNpcmN1bXZlbnRpb24KK2lzIGVmZmVjdGVkIGJ5IGV4ZXJjaXNpbmcgcmlnaHRzIHVuZGVyIHRoaXMgTGljZW5zZSB3aXRoIHJlc3BlY3QgdG8KK3RoZSBjb3ZlcmVkIHdvcmssIGFuZCB5b3UgZGlzY2xhaW0gYW55IGludGVudGlvbiB0byBsaW1pdCBvcGVyYXRpb24gb3IKK21vZGlmaWNhdGlvbiBvZiB0aGUgd29yayBhcyBhIG1lYW5zIG9mIGVuZm9yY2luZywgYWdhaW5zdCB0aGUgd29yaydzCit1c2VycywgeW91ciBvciB0aGlyZCBwYXJ0aWVzJyBsZWdhbCByaWdodHMgdG8gZm9yYmlkIGNpcmN1bXZlbnRpb24gb2YKK3RlY2hub2xvZ2ljYWwgbWVhc3VyZXMuCisKKyAgNC4gQ29udmV5aW5nIFZlcmJhdGltIENvcGllcy4KKworICBZb3UgbWF5IGNvbnZleSB2ZXJiYXRpbSBjb3BpZXMgb2YgdGhlIFByb2dyYW0ncyBzb3VyY2UgY29kZSBhcyB5b3UKK3JlY2VpdmUgaXQsIGluIGFueSBtZWRpdW0sIHByb3ZpZGVkIHRoYXQgeW91IGNvbnNwaWN1b3VzbHkgYW5kCithcHByb3ByaWF0ZWx5IHB1Ymxpc2ggb24gZWFjaCBjb3B5IGFuIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBub3RpY2U7CitrZWVwIGludGFjdCBhbGwgbm90aWNlcyBzdGF0aW5nIHRoYXQgdGhpcyBMaWNlbnNlIGFuZCBhbnkKK25vbi1wZXJtaXNzaXZlIHRlcm1zIGFkZGVkIGluIGFjY29yZCB3aXRoIHNlY3Rpb24gNyBhcHBseSB0byB0aGUgY29kZTsKK2tlZXAgaW50YWN0IGFsbCBub3RpY2VzIG9mIHRoZSBhYnNlbmNlIG9mIGFueSB3YXJyYW50eTsgYW5kIGdpdmUgYWxsCityZWNpcGllbnRzIGEgY29weSBvZiB0aGlzIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgUHJvZ3JhbS4KKworICBZb3UgbWF5IGNoYXJnZSBhbnkgcHJpY2Ugb3Igbm8gcHJpY2UgZm9yIGVhY2ggY29weSB0aGF0IHlvdSBjb252ZXksCithbmQgeW91IG1heSBvZmZlciBzdXBwb3J0IG9yIHdhcnJhbnR5IHByb3RlY3Rpb24gZm9yIGEgZmVlLgorCisgIDUuIENvbnZleWluZyBNb2RpZmllZCBTb3VyY2UgVmVyc2lvbnMuCisKKyAgWW91IG1heSBjb252ZXkgYSB3b3JrIGJhc2VkIG9uIHRoZSBQcm9ncmFtLCBvciB0aGUgbW9kaWZpY2F0aW9ucyB0bworcHJvZHVjZSBpdCBmcm9tIHRoZSBQcm9ncmFtLCBpbiB0aGUgZm9ybSBvZiBzb3VyY2UgY29kZSB1bmRlciB0aGUKK3Rlcm1zIG9mIHNlY3Rpb24gNCwgcHJvdmlkZWQgdGhhdCB5b3UgYWxzbyBtZWV0IGFsbCBvZiB0aGVzZSBjb25kaXRpb25zOgorCisgICAgYSkgVGhlIHdvcmsgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgeW91IG1vZGlmaWVkCisgICAgaXQsIGFuZCBnaXZpbmcgYSByZWxldmFudCBkYXRlLgorCisgICAgYikgVGhlIHdvcmsgbXVzdCBjYXJyeSBwcm9taW5lbnQgbm90aWNlcyBzdGF0aW5nIHRoYXQgaXQgaXMKKyAgICByZWxlYXNlZCB1bmRlciB0aGlzIExpY2Vuc2UgYW5kIGFueSBjb25kaXRpb25zIGFkZGVkIHVuZGVyIHNlY3Rpb24KKyAgICA3LiAgVGhpcyByZXF1aXJlbWVudCBtb2RpZmllcyB0aGUgcmVxdWlyZW1lbnQgaW4gc2VjdGlvbiA0IHRvCisgICAgImtlZXAgaW50YWN0IGFsbCBub3RpY2VzIi4KKworICAgIGMpIFlvdSBtdXN0IGxpY2Vuc2UgdGhlIGVudGlyZSB3b3JrLCBhcyBhIHdob2xlLCB1bmRlciB0aGlzCisgICAgTGljZW5zZSB0byBhbnlvbmUgd2hvIGNvbWVzIGludG8gcG9zc2Vzc2lvbiBvZiBhIGNvcHkuICBUaGlzCisgICAgTGljZW5zZSB3aWxsIHRoZXJlZm9yZSBhcHBseSwgYWxvbmcgd2l0aCBhbnkgYXBwbGljYWJsZSBzZWN0aW9uIDcKKyAgICBhZGRpdGlvbmFsIHRlcm1zLCB0byB0aGUgd2hvbGUgb2YgdGhlIHdvcmssIGFuZCBhbGwgaXRzIHBhcnRzLAorICAgIHJlZ2FyZGxlc3Mgb2YgaG93IHRoZXkgYXJlIHBhY2thZ2VkLiAgVGhpcyBMaWNlbnNlIGdpdmVzIG5vCisgICAgcGVybWlzc2lvbiB0byBsaWNlbnNlIHRoZSB3b3JrIGluIGFueSBvdGhlciB3YXksIGJ1dCBpdCBkb2VzIG5vdAorICAgIGludmFsaWRhdGUgc3VjaCBwZXJtaXNzaW9uIGlmIHlvdSBoYXZlIHNlcGFyYXRlbHkgcmVjZWl2ZWQgaXQuCisKKyAgICBkKSBJZiB0aGUgd29yayBoYXMgaW50ZXJhY3RpdmUgdXNlciBpbnRlcmZhY2VzLCBlYWNoIG11c3QgZGlzcGxheQorICAgIEFwcHJvcHJpYXRlIExlZ2FsIE5vdGljZXM7IGhvd2V2ZXIsIGlmIHRoZSBQcm9ncmFtIGhhcyBpbnRlcmFjdGl2ZQorICAgIGludGVyZmFjZXMgdGhhdCBkbyBub3QgZGlzcGxheSBBcHByb3ByaWF0ZSBMZWdhbCBOb3RpY2VzLCB5b3VyCisgICAgd29yayBuZWVkIG5vdCBtYWtlIHRoZW0gZG8gc28uCisKKyAgQSBjb21waWxhdGlvbiBvZiBhIGNvdmVyZWQgd29yayB3aXRoIG90aGVyIHNlcGFyYXRlIGFuZCBpbmRlcGVuZGVudAord29ya3MsIHdoaWNoIGFyZSBub3QgYnkgdGhlaXIgbmF0dXJlIGV4dGVuc2lvbnMgb2YgdGhlIGNvdmVyZWQgd29yaywKK2FuZCB3aGljaCBhcmUgbm90IGNvbWJpbmVkIHdpdGggaXQgc3VjaCBhcyB0byBmb3JtIGEgbGFyZ2VyIHByb2dyYW0sCitpbiBvciBvbiBhIHZvbHVtZSBvZiBhIHN0b3JhZ2Ugb3IgZGlzdHJpYnV0aW9uIG1lZGl1bSwgaXMgY2FsbGVkIGFuCisiYWdncmVnYXRlIiBpZiB0aGUgY29tcGlsYXRpb24gYW5kIGl0cyByZXN1bHRpbmcgY29weXJpZ2h0IGFyZSBub3QKK3VzZWQgdG8gbGltaXQgdGhlIGFjY2VzcyBvciBsZWdhbCByaWdodHMgb2YgdGhlIGNvbXBpbGF0aW9uJ3MgdXNlcnMKK2JleW9uZCB3aGF0IHRoZSBpbmRpdmlkdWFsIHdvcmtzIHBlcm1pdC4gIEluY2x1c2lvbiBvZiBhIGNvdmVyZWQgd29yaworaW4gYW4gYWdncmVnYXRlIGRvZXMgbm90IGNhdXNlIHRoaXMgTGljZW5zZSB0byBhcHBseSB0byB0aGUgb3RoZXIKK3BhcnRzIG9mIHRoZSBhZ2dyZWdhdGUuCisKKyAgNi4gQ29udmV5aW5nIE5vbi1Tb3VyY2UgRm9ybXMuCisKKyAgWW91IG1heSBjb252ZXkgYSBjb3ZlcmVkIHdvcmsgaW4gb2JqZWN0IGNvZGUgZm9ybSB1bmRlciB0aGUgdGVybXMKK29mIHNlY3Rpb25zIDQgYW5kIDUsIHByb3ZpZGVkIHRoYXQgeW91IGFsc28gY29udmV5IHRoZQorbWFjaGluZS1yZWFkYWJsZSBDb3JyZXNwb25kaW5nIFNvdXJjZSB1bmRlciB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlLAoraW4gb25lIG9mIHRoZXNlIHdheXM6CisKKyAgICBhKSBDb252ZXkgdGhlIG9iamVjdCBjb2RlIGluLCBvciBlbWJvZGllZCBpbiwgYSBwaHlzaWNhbCBwcm9kdWN0CisgICAgKGluY2x1ZGluZyBhIHBoeXNpY2FsIGRpc3RyaWJ1dGlvbiBtZWRpdW0pLCBhY2NvbXBhbmllZCBieSB0aGUKKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSBmaXhlZCBvbiBhIGR1cmFibGUgcGh5c2ljYWwgbWVkaXVtCisgICAgY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UuCisKKyAgICBiKSBDb252ZXkgdGhlIG9iamVjdCBjb2RlIGluLCBvciBlbWJvZGllZCBpbiwgYSBwaHlzaWNhbCBwcm9kdWN0CisgICAgKGluY2x1ZGluZyBhIHBoeXNpY2FsIGRpc3RyaWJ1dGlvbiBtZWRpdW0pLCBhY2NvbXBhbmllZCBieSBhCisgICAgd3JpdHRlbiBvZmZlciwgdmFsaWQgZm9yIGF0IGxlYXN0IHRocmVlIHllYXJzIGFuZCB2YWxpZCBmb3IgYXMKKyAgICBsb25nIGFzIHlvdSBvZmZlciBzcGFyZSBwYXJ0cyBvciBjdXN0b21lciBzdXBwb3J0IGZvciB0aGF0IHByb2R1Y3QKKyAgICBtb2RlbCwgdG8gZ2l2ZSBhbnlvbmUgd2hvIHBvc3Nlc3NlcyB0aGUgb2JqZWN0IGNvZGUgZWl0aGVyICgxKSBhCisgICAgY29weSBvZiB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgZm9yIGFsbCB0aGUgc29mdHdhcmUgaW4gdGhlCisgICAgcHJvZHVjdCB0aGF0IGlzIGNvdmVyZWQgYnkgdGhpcyBMaWNlbnNlLCBvbiBhIGR1cmFibGUgcGh5c2ljYWwKKyAgICBtZWRpdW0gY3VzdG9tYXJpbHkgdXNlZCBmb3Igc29mdHdhcmUgaW50ZXJjaGFuZ2UsIGZvciBhIHByaWNlIG5vCisgICAgbW9yZSB0aGFuIHlvdXIgcmVhc29uYWJsZSBjb3N0IG9mIHBoeXNpY2FsbHkgcGVyZm9ybWluZyB0aGlzCisgICAgY29udmV5aW5nIG9mIHNvdXJjZSwgb3IgKDIpIGFjY2VzcyB0byBjb3B5IHRoZQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGZyb20gYSBuZXR3b3JrIHNlcnZlciBhdCBubyBjaGFyZ2UuCisKKyAgICBjKSBDb252ZXkgaW5kaXZpZHVhbCBjb3BpZXMgb2YgdGhlIG9iamVjdCBjb2RlIHdpdGggYSBjb3B5IG9mIHRoZQorICAgIHdyaXR0ZW4gb2ZmZXIgdG8gcHJvdmlkZSB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UuICBUaGlzCisgICAgYWx0ZXJuYXRpdmUgaXMgYWxsb3dlZCBvbmx5IG9jY2FzaW9uYWxseSBhbmQgbm9uY29tbWVyY2lhbGx5LCBhbmQKKyAgICBvbmx5IGlmIHlvdSByZWNlaXZlZCB0aGUgb2JqZWN0IGNvZGUgd2l0aCBzdWNoIGFuIG9mZmVyLCBpbiBhY2NvcmQKKyAgICB3aXRoIHN1YnNlY3Rpb24gNmIuCisKKyAgICBkKSBDb252ZXkgdGhlIG9iamVjdCBjb2RlIGJ5IG9mZmVyaW5nIGFjY2VzcyBmcm9tIGEgZGVzaWduYXRlZAorICAgIHBsYWNlIChncmF0aXMgb3IgZm9yIGEgY2hhcmdlKSwgYW5kIG9mZmVyIGVxdWl2YWxlbnQgYWNjZXNzIHRvIHRoZQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlIGluIHRoZSBzYW1lIHdheSB0aHJvdWdoIHRoZSBzYW1lIHBsYWNlIGF0IG5vCisgICAgZnVydGhlciBjaGFyZ2UuICBZb3UgbmVlZCBub3QgcmVxdWlyZSByZWNpcGllbnRzIHRvIGNvcHkgdGhlCisgICAgQ29ycmVzcG9uZGluZyBTb3VyY2UgYWxvbmcgd2l0aCB0aGUgb2JqZWN0IGNvZGUuICBJZiB0aGUgcGxhY2UgdG8KKyAgICBjb3B5IHRoZSBvYmplY3QgY29kZSBpcyBhIG5ldHdvcmsgc2VydmVyLCB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UKKyAgICBtYXkgYmUgb24gYSBkaWZmZXJlbnQgc2VydmVyIChvcGVyYXRlZCBieSB5b3Ugb3IgYSB0aGlyZCBwYXJ0eSkKKyAgICB0aGF0IHN1cHBvcnRzIGVxdWl2YWxlbnQgY29weWluZyBmYWNpbGl0aWVzLCBwcm92aWRlZCB5b3UgbWFpbnRhaW4KKyAgICBjbGVhciBkaXJlY3Rpb25zIG5leHQgdG8gdGhlIG9iamVjdCBjb2RlIHNheWluZyB3aGVyZSB0byBmaW5kIHRoZQorICAgIENvcnJlc3BvbmRpbmcgU291cmNlLiAgUmVnYXJkbGVzcyBvZiB3aGF0IHNlcnZlciBob3N0cyB0aGUKKyAgICBDb3JyZXNwb25kaW5nIFNvdXJjZSwgeW91IHJlbWFpbiBvYmxpZ2F0ZWQgdG8gZW5zdXJlIHRoYXQgaXQgaXMKKyAgICBhdmFpbGFibGUgZm9yIGFzIGxvbmcgYXMgbmVlZGVkIHRvIHNhdGlzZnkgdGhlc2UgcmVxdWlyZW1lbnRzLgorCisgICAgZSkgQ29udmV5IHRoZSBvYmplY3QgY29kZSB1c2luZyBwZWVyLXRvLXBlZXIgdHJhbnNtaXNzaW9uLCBwcm92aWRlZAorICAgIHlvdSBpbmZvcm0gb3RoZXIgcGVlcnMgd2hlcmUgdGhlIG9iamVjdCBjb2RlIGFuZCBDb3JyZXNwb25kaW5nCisgICAgU291cmNlIG9mIHRoZSB3b3JrIGFyZSBiZWluZyBvZmZlcmVkIHRvIHRoZSBnZW5lcmFsIHB1YmxpYyBhdCBubworICAgIGNoYXJnZSB1bmRlciBzdWJzZWN0aW9uIDZkLgorCisgIEEgc2VwYXJhYmxlIHBvcnRpb24gb2YgdGhlIG9iamVjdCBjb2RlLCB3aG9zZSBzb3VyY2UgY29kZSBpcyBleGNsdWRlZAorZnJvbSB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2UgYXMgYSBTeXN0ZW0gTGlicmFyeSwgbmVlZCBub3QgYmUKK2luY2x1ZGVkIGluIGNvbnZleWluZyB0aGUgb2JqZWN0IGNvZGUgd29yay4KKworICBBICJVc2VyIFByb2R1Y3QiIGlzIGVpdGhlciAoMSkgYSAiY29uc3VtZXIgcHJvZHVjdCIsIHdoaWNoIG1lYW5zIGFueQordGFuZ2libGUgcGVyc29uYWwgcHJvcGVydHkgd2hpY2ggaXMgbm9ybWFsbHkgdXNlZCBmb3IgcGVyc29uYWwsIGZhbWlseSwKK29yIGhvdXNlaG9sZCBwdXJwb3Nlcywgb3IgKDIpIGFueXRoaW5nIGRlc2lnbmVkIG9yIHNvbGQgZm9yIGluY29ycG9yYXRpb24KK2ludG8gYSBkd2VsbGluZy4gIEluIGRldGVybWluaW5nIHdoZXRoZXIgYSBwcm9kdWN0IGlzIGEgY29uc3VtZXIgcHJvZHVjdCwKK2RvdWJ0ZnVsIGNhc2VzIHNoYWxsIGJlIHJlc29sdmVkIGluIGZhdm9yIG9mIGNvdmVyYWdlLiAgRm9yIGEgcGFydGljdWxhcgorcHJvZHVjdCByZWNlaXZlZCBieSBhIHBhcnRpY3VsYXIgdXNlciwgIm5vcm1hbGx5IHVzZWQiIHJlZmVycyB0byBhCit0eXBpY2FsIG9yIGNvbW1vbiB1c2Ugb2YgdGhhdCBjbGFzcyBvZiBwcm9kdWN0LCByZWdhcmRsZXNzIG9mIHRoZSBzdGF0dXMKK29mIHRoZSBwYXJ0aWN1bGFyIHVzZXIgb3Igb2YgdGhlIHdheSBpbiB3aGljaCB0aGUgcGFydGljdWxhciB1c2VyCithY3R1YWxseSB1c2VzLCBvciBleHBlY3RzIG9yIGlzIGV4cGVjdGVkIHRvIHVzZSwgdGhlIHByb2R1Y3QuICBBIHByb2R1Y3QKK2lzIGEgY29uc3VtZXIgcHJvZHVjdCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgdGhlIHByb2R1Y3QgaGFzIHN1YnN0YW50aWFsCitjb21tZXJjaWFsLCBpbmR1c3RyaWFsIG9yIG5vbi1jb25zdW1lciB1c2VzLCB1bmxlc3Mgc3VjaCB1c2VzIHJlcHJlc2VudAordGhlIG9ubHkgc2lnbmlmaWNhbnQgbW9kZSBvZiB1c2Ugb2YgdGhlIHByb2R1Y3QuCisKKyAgIkluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbiIgZm9yIGEgVXNlciBQcm9kdWN0IG1lYW5zIGFueSBtZXRob2RzLAorcHJvY2VkdXJlcywgYXV0aG9yaXphdGlvbiBrZXlzLCBvciBvdGhlciBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBpbnN0YWxsCithbmQgZXhlY3V0ZSBtb2RpZmllZCB2ZXJzaW9ucyBvZiBhIGNvdmVyZWQgd29yayBpbiB0aGF0IFVzZXIgUHJvZHVjdCBmcm9tCithIG1vZGlmaWVkIHZlcnNpb24gb2YgaXRzIENvcnJlc3BvbmRpbmcgU291cmNlLiAgVGhlIGluZm9ybWF0aW9uIG11c3QKK3N1ZmZpY2UgdG8gZW5zdXJlIHRoYXQgdGhlIGNvbnRpbnVlZCBmdW5jdGlvbmluZyBvZiB0aGUgbW9kaWZpZWQgb2JqZWN0Citjb2RlIGlzIGluIG5vIGNhc2UgcHJldmVudGVkIG9yIGludGVyZmVyZWQgd2l0aCBzb2xlbHkgYmVjYXVzZQorbW9kaWZpY2F0aW9uIGhhcyBiZWVuIG1hZGUuCisKKyAgSWYgeW91IGNvbnZleSBhbiBvYmplY3QgY29kZSB3b3JrIHVuZGVyIHRoaXMgc2VjdGlvbiBpbiwgb3Igd2l0aCwgb3IKK3NwZWNpZmljYWxseSBmb3IgdXNlIGluLCBhIFVzZXIgUHJvZHVjdCwgYW5kIHRoZSBjb252ZXlpbmcgb2NjdXJzIGFzCitwYXJ0IG9mIGEgdHJhbnNhY3Rpb24gaW4gd2hpY2ggdGhlIHJpZ2h0IG9mIHBvc3Nlc3Npb24gYW5kIHVzZSBvZiB0aGUKK1VzZXIgUHJvZHVjdCBpcyB0cmFuc2ZlcnJlZCB0byB0aGUgcmVjaXBpZW50IGluIHBlcnBldHVpdHkgb3IgZm9yIGEKK2ZpeGVkIHRlcm0gKHJlZ2FyZGxlc3Mgb2YgaG93IHRoZSB0cmFuc2FjdGlvbiBpcyBjaGFyYWN0ZXJpemVkKSwgdGhlCitDb3JyZXNwb25kaW5nIFNvdXJjZSBjb252ZXllZCB1bmRlciB0aGlzIHNlY3Rpb24gbXVzdCBiZSBhY2NvbXBhbmllZAorYnkgdGhlIEluc3RhbGxhdGlvbiBJbmZvcm1hdGlvbi4gIEJ1dCB0aGlzIHJlcXVpcmVtZW50IGRvZXMgbm90IGFwcGx5CitpZiBuZWl0aGVyIHlvdSBub3IgYW55IHRoaXJkIHBhcnR5IHJldGFpbnMgdGhlIGFiaWxpdHkgdG8gaW5zdGFsbAorbW9kaWZpZWQgb2JqZWN0IGNvZGUgb24gdGhlIFVzZXIgUHJvZHVjdCAoZm9yIGV4YW1wbGUsIHRoZSB3b3JrIGhhcworYmVlbiBpbnN0YWxsZWQgaW4gUk9NKS4KKworICBUaGUgcmVxdWlyZW1lbnQgdG8gcHJvdmlkZSBJbnN0YWxsYXRpb24gSW5mb3JtYXRpb24gZG9lcyBub3QgaW5jbHVkZSBhCityZXF1aXJlbWVudCB0byBjb250aW51ZSB0byBwcm92aWRlIHN1cHBvcnQgc2VydmljZSwgd2FycmFudHksIG9yIHVwZGF0ZXMKK2ZvciBhIHdvcmsgdGhhdCBoYXMgYmVlbiBtb2RpZmllZCBvciBpbnN0YWxsZWQgYnkgdGhlIHJlY2lwaWVudCwgb3IgZm9yCit0aGUgVXNlciBQcm9kdWN0IGluIHdoaWNoIGl0IGhhcyBiZWVuIG1vZGlmaWVkIG9yIGluc3RhbGxlZC4gIEFjY2VzcyB0byBhCituZXR3b3JrIG1heSBiZSBkZW5pZWQgd2hlbiB0aGUgbW9kaWZpY2F0aW9uIGl0c2VsZiBtYXRlcmlhbGx5IGFuZAorYWR2ZXJzZWx5IGFmZmVjdHMgdGhlIG9wZXJhdGlvbiBvZiB0aGUgbmV0d29yayBvciB2aW9sYXRlcyB0aGUgcnVsZXMgYW5kCitwcm90b2NvbHMgZm9yIGNvbW11bmljYXRpb24gYWNyb3NzIHRoZSBuZXR3b3JrLgorCisgIENvcnJlc3BvbmRpbmcgU291cmNlIGNvbnZleWVkLCBhbmQgSW5zdGFsbGF0aW9uIEluZm9ybWF0aW9uIHByb3ZpZGVkLAoraW4gYWNjb3JkIHdpdGggdGhpcyBzZWN0aW9uIG11c3QgYmUgaW4gYSBmb3JtYXQgdGhhdCBpcyBwdWJsaWNseQorZG9jdW1lbnRlZCAoYW5kIHdpdGggYW4gaW1wbGVtZW50YXRpb24gYXZhaWxhYmxlIHRvIHRoZSBwdWJsaWMgaW4KK3NvdXJjZSBjb2RlIGZvcm0pLCBhbmQgbXVzdCByZXF1aXJlIG5vIHNwZWNpYWwgcGFzc3dvcmQgb3Iga2V5IGZvcgordW5wYWNraW5nLCByZWFkaW5nIG9yIGNvcHlpbmcuCisKKyAgNy4gQWRkaXRpb25hbCBUZXJtcy4KKworICAiQWRkaXRpb25hbCBwZXJtaXNzaW9ucyIgYXJlIHRlcm1zIHRoYXQgc3VwcGxlbWVudCB0aGUgdGVybXMgb2YgdGhpcworTGljZW5zZSBieSBtYWtpbmcgZXhjZXB0aW9ucyBmcm9tIG9uZSBvciBtb3JlIG9mIGl0cyBjb25kaXRpb25zLgorQWRkaXRpb25hbCBwZXJtaXNzaW9ucyB0aGF0IGFyZSBhcHBsaWNhYmxlIHRvIHRoZSBlbnRpcmUgUHJvZ3JhbSBzaGFsbAorYmUgdHJlYXRlZCBhcyB0aG91Z2ggdGhleSB3ZXJlIGluY2x1ZGVkIGluIHRoaXMgTGljZW5zZSwgdG8gdGhlIGV4dGVudAordGhhdCB0aGV5IGFyZSB2YWxpZCB1bmRlciBhcHBsaWNhYmxlIGxhdy4gIElmIGFkZGl0aW9uYWwgcGVybWlzc2lvbnMKK2FwcGx5IG9ubHkgdG8gcGFydCBvZiB0aGUgUHJvZ3JhbSwgdGhhdCBwYXJ0IG1heSBiZSB1c2VkIHNlcGFyYXRlbHkKK3VuZGVyIHRob3NlIHBlcm1pc3Npb25zLCBidXQgdGhlIGVudGlyZSBQcm9ncmFtIHJlbWFpbnMgZ292ZXJuZWQgYnkKK3RoaXMgTGljZW5zZSB3aXRob3V0IHJlZ2FyZCB0byB0aGUgYWRkaXRpb25hbCBwZXJtaXNzaW9ucy4KKworICBXaGVuIHlvdSBjb252ZXkgYSBjb3B5IG9mIGEgY292ZXJlZCB3b3JrLCB5b3UgbWF5IGF0IHlvdXIgb3B0aW9uCityZW1vdmUgYW55IGFkZGl0aW9uYWwgcGVybWlzc2lvbnMgZnJvbSB0aGF0IGNvcHksIG9yIGZyb20gYW55IHBhcnQgb2YKK2l0LiAgKEFkZGl0aW9uYWwgcGVybWlzc2lvbnMgbWF5IGJlIHdyaXR0ZW4gdG8gcmVxdWlyZSB0aGVpciBvd24KK3JlbW92YWwgaW4gY2VydGFpbiBjYXNlcyB3aGVuIHlvdSBtb2RpZnkgdGhlIHdvcmsuKSAgWW91IG1heSBwbGFjZQorYWRkaXRpb25hbCBwZXJtaXNzaW9ucyBvbiBtYXRlcmlhbCwgYWRkZWQgYnkgeW91IHRvIGEgY292ZXJlZCB3b3JrLAorZm9yIHdoaWNoIHlvdSBoYXZlIG9yIGNhbiBnaXZlIGFwcHJvcHJpYXRlIGNvcHlyaWdodCBwZXJtaXNzaW9uLgorCisgIE5vdHdpdGhzdGFuZGluZyBhbnkgb3RoZXIgcHJvdmlzaW9uIG9mIHRoaXMgTGljZW5zZSwgZm9yIG1hdGVyaWFsIHlvdQorYWRkIHRvIGEgY292ZXJlZCB3b3JrLCB5b3UgbWF5IChpZiBhdXRob3JpemVkIGJ5IHRoZSBjb3B5cmlnaHQgaG9sZGVycyBvZgordGhhdCBtYXRlcmlhbCkgc3VwcGxlbWVudCB0aGUgdGVybXMgb2YgdGhpcyBMaWNlbnNlIHdpdGggdGVybXM6CisKKyAgICBhKSBEaXNjbGFpbWluZyB3YXJyYW50eSBvciBsaW1pdGluZyBsaWFiaWxpdHkgZGlmZmVyZW50bHkgZnJvbSB0aGUKKyAgICB0ZXJtcyBvZiBzZWN0aW9ucyAxNSBhbmQgMTYgb2YgdGhpcyBMaWNlbnNlOyBvcgorCisgICAgYikgUmVxdWlyaW5nIHByZXNlcnZhdGlvbiBvZiBzcGVjaWZpZWQgcmVhc29uYWJsZSBsZWdhbCBub3RpY2VzIG9yCisgICAgYXV0aG9yIGF0dHJpYnV0aW9ucyBpbiB0aGF0IG1hdGVyaWFsIG9yIGluIHRoZSBBcHByb3ByaWF0ZSBMZWdhbAorICAgIE5vdGljZXMgZGlzcGxheWVkIGJ5IHdvcmtzIGNvbnRhaW5pbmcgaXQ7IG9yCisKKyAgICBjKSBQcm9oaWJpdGluZyBtaXNyZXByZXNlbnRhdGlvbiBvZiB0aGUgb3JpZ2luIG9mIHRoYXQgbWF0ZXJpYWwsIG9yCisgICAgcmVxdWlyaW5nIHRoYXQgbW9kaWZpZWQgdmVyc2lvbnMgb2Ygc3VjaCBtYXRlcmlhbCBiZSBtYXJrZWQgaW4KKyAgICByZWFzb25hYmxlIHdheXMgYXMgZGlmZmVyZW50IGZyb20gdGhlIG9yaWdpbmFsIHZlcnNpb247IG9yCisKKyAgICBkKSBMaW1pdGluZyB0aGUgdXNlIGZvciBwdWJsaWNpdHkgcHVycG9zZXMgb2YgbmFtZXMgb2YgbGljZW5zb3JzIG9yCisgICAgYXV0aG9ycyBvZiB0aGUgbWF0ZXJpYWw7IG9yCisKKyAgICBlKSBEZWNsaW5pbmcgdG8gZ3JhbnQgcmlnaHRzIHVuZGVyIHRyYWRlbWFyayBsYXcgZm9yIHVzZSBvZiBzb21lCisgICAgdHJhZGUgbmFtZXMsIHRyYWRlbWFya3MsIG9yIHNlcnZpY2UgbWFya3M7IG9yCisKKyAgICBmKSBSZXF1aXJpbmcgaW5kZW1uaWZpY2F0aW9uIG9mIGxpY2Vuc29ycyBhbmQgYXV0aG9ycyBvZiB0aGF0CisgICAgbWF0ZXJpYWwgYnkgYW55b25lIHdobyBjb252ZXlzIHRoZSBtYXRlcmlhbCAob3IgbW9kaWZpZWQgdmVyc2lvbnMgb2YKKyAgICBpdCkgd2l0aCBjb250cmFjdHVhbCBhc3N1bXB0aW9ucyBvZiBsaWFiaWxpdHkgdG8gdGhlIHJlY2lwaWVudCwgZm9yCisgICAgYW55IGxpYWJpbGl0eSB0aGF0IHRoZXNlIGNvbnRyYWN0dWFsIGFzc3VtcHRpb25zIGRpcmVjdGx5IGltcG9zZSBvbgorICAgIHRob3NlIGxpY2Vuc29ycyBhbmQgYXV0aG9ycy4KKworICBBbGwgb3RoZXIgbm9uLXBlcm1pc3NpdmUgYWRkaXRpb25hbCB0ZXJtcyBhcmUgY29uc2lkZXJlZCAiZnVydGhlcgorcmVzdHJpY3Rpb25zIiB3aXRoaW4gdGhlIG1lYW5pbmcgb2Ygc2VjdGlvbiAxMC4gIElmIHRoZSBQcm9ncmFtIGFzIHlvdQorcmVjZWl2ZWQgaXQsIG9yIGFueSBwYXJ0IG9mIGl0LCBjb250YWlucyBhIG5vdGljZSBzdGF0aW5nIHRoYXQgaXQgaXMKK2dvdmVybmVkIGJ5IHRoaXMgTGljZW5zZSBhbG9uZyB3aXRoIGEgdGVybSB0aGF0IGlzIGEgZnVydGhlcgorcmVzdHJpY3Rpb24sIHlvdSBtYXkgcmVtb3ZlIHRoYXQgdGVybS4gIElmIGEgbGljZW5zZSBkb2N1bWVudCBjb250YWlucworYSBmdXJ0aGVyIHJlc3RyaWN0aW9uIGJ1dCBwZXJtaXRzIHJlbGljZW5zaW5nIG9yIGNvbnZleWluZyB1bmRlciB0aGlzCitMaWNlbnNlLCB5b3UgbWF5IGFkZCB0byBhIGNvdmVyZWQgd29yayBtYXRlcmlhbCBnb3Zlcm5lZCBieSB0aGUgdGVybXMKK29mIHRoYXQgbGljZW5zZSBkb2N1bWVudCwgcHJvdmlkZWQgdGhhdCB0aGUgZnVydGhlciByZXN0cmljdGlvbiBkb2VzCitub3Qgc3Vydml2ZSBzdWNoIHJlbGljZW5zaW5nIG9yIGNvbnZleWluZy4KKworICBJZiB5b3UgYWRkIHRlcm1zIHRvIGEgY292ZXJlZCB3b3JrIGluIGFjY29yZCB3aXRoIHRoaXMgc2VjdGlvbiwgeW91CittdXN0IHBsYWNlLCBpbiB0aGUgcmVsZXZhbnQgc291cmNlIGZpbGVzLCBhIHN0YXRlbWVudCBvZiB0aGUKK2FkZGl0aW9uYWwgdGVybXMgdGhhdCBhcHBseSB0byB0aG9zZSBmaWxlcywgb3IgYSBub3RpY2UgaW5kaWNhdGluZword2hlcmUgdG8gZmluZCB0aGUgYXBwbGljYWJsZSB0ZXJtcy4KKworICBBZGRpdGlvbmFsIHRlcm1zLCBwZXJtaXNzaXZlIG9yIG5vbi1wZXJtaXNzaXZlLCBtYXkgYmUgc3RhdGVkIGluIHRoZQorZm9ybSBvZiBhIHNlcGFyYXRlbHkgd3JpdHRlbiBsaWNlbnNlLCBvciBzdGF0ZWQgYXMgZXhjZXB0aW9uczsKK3RoZSBhYm92ZSByZXF1aXJlbWVudHMgYXBwbHkgZWl0aGVyIHdheS4KKworICA4LiBUZXJtaW5hdGlvbi4KKworICBZb3UgbWF5IG5vdCBwcm9wYWdhdGUgb3IgbW9kaWZ5IGEgY292ZXJlZCB3b3JrIGV4Y2VwdCBhcyBleHByZXNzbHkKK3Byb3ZpZGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEFueSBhdHRlbXB0IG90aGVyd2lzZSB0byBwcm9wYWdhdGUgb3IKK21vZGlmeSBpdCBpcyB2b2lkLCBhbmQgd2lsbCBhdXRvbWF0aWNhbGx5IHRlcm1pbmF0ZSB5b3VyIHJpZ2h0cyB1bmRlcgordGhpcyBMaWNlbnNlIChpbmNsdWRpbmcgYW55IHBhdGVudCBsaWNlbnNlcyBncmFudGVkIHVuZGVyIHRoZSB0aGlyZAorcGFyYWdyYXBoIG9mIHNlY3Rpb24gMTEpLgorCisgIEhvd2V2ZXIsIGlmIHlvdSBjZWFzZSBhbGwgdmlvbGF0aW9uIG9mIHRoaXMgTGljZW5zZSwgdGhlbiB5b3VyCitsaWNlbnNlIGZyb20gYSBwYXJ0aWN1bGFyIGNvcHlyaWdodCBob2xkZXIgaXMgcmVpbnN0YXRlZCAoYSkKK3Byb3Zpc2lvbmFsbHksIHVubGVzcyBhbmQgdW50aWwgdGhlIGNvcHlyaWdodCBob2xkZXIgZXhwbGljaXRseSBhbmQKK2ZpbmFsbHkgdGVybWluYXRlcyB5b3VyIGxpY2Vuc2UsIGFuZCAoYikgcGVybWFuZW50bHksIGlmIHRoZSBjb3B5cmlnaHQKK2hvbGRlciBmYWlscyB0byBub3RpZnkgeW91IG9mIHRoZSB2aW9sYXRpb24gYnkgc29tZSByZWFzb25hYmxlIG1lYW5zCitwcmlvciB0byA2MCBkYXlzIGFmdGVyIHRoZSBjZXNzYXRpb24uCisKKyAgTW9yZW92ZXIsIHlvdXIgbGljZW5zZSBmcm9tIGEgcGFydGljdWxhciBjb3B5cmlnaHQgaG9sZGVyIGlzCityZWluc3RhdGVkIHBlcm1hbmVudGx5IGlmIHRoZSBjb3B5cmlnaHQgaG9sZGVyIG5vdGlmaWVzIHlvdSBvZiB0aGUKK3Zpb2xhdGlvbiBieSBzb21lIHJlYXNvbmFibGUgbWVhbnMsIHRoaXMgaXMgdGhlIGZpcnN0IHRpbWUgeW91IGhhdmUKK3JlY2VpdmVkIG5vdGljZSBvZiB2aW9sYXRpb24gb2YgdGhpcyBMaWNlbnNlIChmb3IgYW55IHdvcmspIGZyb20gdGhhdAorY29weXJpZ2h0IGhvbGRlciwgYW5kIHlvdSBjdXJlIHRoZSB2aW9sYXRpb24gcHJpb3IgdG8gMzAgZGF5cyBhZnRlcgoreW91ciByZWNlaXB0IG9mIHRoZSBub3RpY2UuCisKKyAgVGVybWluYXRpb24gb2YgeW91ciByaWdodHMgdW5kZXIgdGhpcyBzZWN0aW9uIGRvZXMgbm90IHRlcm1pbmF0ZSB0aGUKK2xpY2Vuc2VzIG9mIHBhcnRpZXMgd2hvIGhhdmUgcmVjZWl2ZWQgY29waWVzIG9yIHJpZ2h0cyBmcm9tIHlvdSB1bmRlcgordGhpcyBMaWNlbnNlLiAgSWYgeW91ciByaWdodHMgaGF2ZSBiZWVuIHRlcm1pbmF0ZWQgYW5kIG5vdCBwZXJtYW5lbnRseQorcmVpbnN0YXRlZCwgeW91IGRvIG5vdCBxdWFsaWZ5IHRvIHJlY2VpdmUgbmV3IGxpY2Vuc2VzIGZvciB0aGUgc2FtZQorbWF0ZXJpYWwgdW5kZXIgc2VjdGlvbiAxMC4KKworICA5LiBBY2NlcHRhbmNlIE5vdCBSZXF1aXJlZCBmb3IgSGF2aW5nIENvcGllcy4KKworICBZb3UgYXJlIG5vdCByZXF1aXJlZCB0byBhY2NlcHQgdGhpcyBMaWNlbnNlIGluIG9yZGVyIHRvIHJlY2VpdmUgb3IKK3J1biBhIGNvcHkgb2YgdGhlIFByb2dyYW0uICBBbmNpbGxhcnkgcHJvcGFnYXRpb24gb2YgYSBjb3ZlcmVkIHdvcmsKK29jY3VycmluZyBzb2xlbHkgYXMgYSBjb25zZXF1ZW5jZSBvZiB1c2luZyBwZWVyLXRvLXBlZXIgdHJhbnNtaXNzaW9uCit0byByZWNlaXZlIGEgY29weSBsaWtld2lzZSBkb2VzIG5vdCByZXF1aXJlIGFjY2VwdGFuY2UuICBIb3dldmVyLAorbm90aGluZyBvdGhlciB0aGFuIHRoaXMgTGljZW5zZSBncmFudHMgeW91IHBlcm1pc3Npb24gdG8gcHJvcGFnYXRlIG9yCittb2RpZnkgYW55IGNvdmVyZWQgd29yay4gIFRoZXNlIGFjdGlvbnMgaW5mcmluZ2UgY29weXJpZ2h0IGlmIHlvdSBkbworbm90IGFjY2VwdCB0aGlzIExpY2Vuc2UuICBUaGVyZWZvcmUsIGJ5IG1vZGlmeWluZyBvciBwcm9wYWdhdGluZyBhCitjb3ZlcmVkIHdvcmssIHlvdSBpbmRpY2F0ZSB5b3VyIGFjY2VwdGFuY2Ugb2YgdGhpcyBMaWNlbnNlIHRvIGRvIHNvLgorCisgIDEwLiBBdXRvbWF0aWMgTGljZW5zaW5nIG9mIERvd25zdHJlYW0gUmVjaXBpZW50cy4KKworICBFYWNoIHRpbWUgeW91IGNvbnZleSBhIGNvdmVyZWQgd29yaywgdGhlIHJlY2lwaWVudCBhdXRvbWF0aWNhbGx5CityZWNlaXZlcyBhIGxpY2Vuc2UgZnJvbSB0aGUgb3JpZ2luYWwgbGljZW5zb3JzLCB0byBydW4sIG1vZGlmeSBhbmQKK3Byb3BhZ2F0ZSB0aGF0IHdvcmssIHN1YmplY3QgdG8gdGhpcyBMaWNlbnNlLiAgWW91IGFyZSBub3QgcmVzcG9uc2libGUKK2ZvciBlbmZvcmNpbmcgY29tcGxpYW5jZSBieSB0aGlyZCBwYXJ0aWVzIHdpdGggdGhpcyBMaWNlbnNlLgorCisgIEFuICJlbnRpdHkgdHJhbnNhY3Rpb24iIGlzIGEgdHJhbnNhY3Rpb24gdHJhbnNmZXJyaW5nIGNvbnRyb2wgb2YgYW4KK29yZ2FuaXphdGlvbiwgb3Igc3Vic3RhbnRpYWxseSBhbGwgYXNzZXRzIG9mIG9uZSwgb3Igc3ViZGl2aWRpbmcgYW4KK29yZ2FuaXphdGlvbiwgb3IgbWVyZ2luZyBvcmdhbml6YXRpb25zLiAgSWYgcHJvcGFnYXRpb24gb2YgYSBjb3ZlcmVkCit3b3JrIHJlc3VsdHMgZnJvbSBhbiBlbnRpdHkgdHJhbnNhY3Rpb24sIGVhY2ggcGFydHkgdG8gdGhhdAordHJhbnNhY3Rpb24gd2hvIHJlY2VpdmVzIGEgY29weSBvZiB0aGUgd29yayBhbHNvIHJlY2VpdmVzIHdoYXRldmVyCitsaWNlbnNlcyB0byB0aGUgd29yayB0aGUgcGFydHkncyBwcmVkZWNlc3NvciBpbiBpbnRlcmVzdCBoYWQgb3IgY291bGQKK2dpdmUgdW5kZXIgdGhlIHByZXZpb3VzIHBhcmFncmFwaCwgcGx1cyBhIHJpZ2h0IHRvIHBvc3Nlc3Npb24gb2YgdGhlCitDb3JyZXNwb25kaW5nIFNvdXJjZSBvZiB0aGUgd29yayBmcm9tIHRoZSBwcmVkZWNlc3NvciBpbiBpbnRlcmVzdCwgaWYKK3RoZSBwcmVkZWNlc3NvciBoYXMgaXQgb3IgY2FuIGdldCBpdCB3aXRoIHJlYXNvbmFibGUgZWZmb3J0cy4KKworICBZb3UgbWF5IG5vdCBpbXBvc2UgYW55IGZ1cnRoZXIgcmVzdHJpY3Rpb25zIG9uIHRoZSBleGVyY2lzZSBvZiB0aGUKK3JpZ2h0cyBncmFudGVkIG9yIGFmZmlybWVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIEZvciBleGFtcGxlLCB5b3UgbWF5Citub3QgaW1wb3NlIGEgbGljZW5zZSBmZWUsIHJveWFsdHksIG9yIG90aGVyIGNoYXJnZSBmb3IgZXhlcmNpc2Ugb2YKK3JpZ2h0cyBncmFudGVkIHVuZGVyIHRoaXMgTGljZW5zZSwgYW5kIHlvdSBtYXkgbm90IGluaXRpYXRlIGxpdGlnYXRpb24KKyhpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0CithbnkgcGF0ZW50IGNsYWltIGlzIGluZnJpbmdlZCBieSBtYWtpbmcsIHVzaW5nLCBzZWxsaW5nLCBvZmZlcmluZyBmb3IKK3NhbGUsIG9yIGltcG9ydGluZyB0aGUgUHJvZ3JhbSBvciBhbnkgcG9ydGlvbiBvZiBpdC4KKworICAxMS4gUGF0ZW50cy4KKworICBBICJjb250cmlidXRvciIgaXMgYSBjb3B5cmlnaHQgaG9sZGVyIHdobyBhdXRob3JpemVzIHVzZSB1bmRlciB0aGlzCitMaWNlbnNlIG9mIHRoZSBQcm9ncmFtIG9yIGEgd29yayBvbiB3aGljaCB0aGUgUHJvZ3JhbSBpcyBiYXNlZC4gIFRoZQord29yayB0aHVzIGxpY2Vuc2VkIGlzIGNhbGxlZCB0aGUgY29udHJpYnV0b3IncyAiY29udHJpYnV0b3IgdmVyc2lvbiIuCisKKyAgQSBjb250cmlidXRvcidzICJlc3NlbnRpYWwgcGF0ZW50IGNsYWltcyIgYXJlIGFsbCBwYXRlbnQgY2xhaW1zCitvd25lZCBvciBjb250cm9sbGVkIGJ5IHRoZSBjb250cmlidXRvciwgd2hldGhlciBhbHJlYWR5IGFjcXVpcmVkIG9yCitoZXJlYWZ0ZXIgYWNxdWlyZWQsIHRoYXQgd291bGQgYmUgaW5mcmluZ2VkIGJ5IHNvbWUgbWFubmVyLCBwZXJtaXR0ZWQKK2J5IHRoaXMgTGljZW5zZSwgb2YgbWFraW5nLCB1c2luZywgb3Igc2VsbGluZyBpdHMgY29udHJpYnV0b3IgdmVyc2lvbiwKK2J1dCBkbyBub3QgaW5jbHVkZSBjbGFpbXMgdGhhdCB3b3VsZCBiZSBpbmZyaW5nZWQgb25seSBhcyBhCitjb25zZXF1ZW5jZSBvZiBmdXJ0aGVyIG1vZGlmaWNhdGlvbiBvZiB0aGUgY29udHJpYnV0b3IgdmVyc2lvbi4gIEZvcgorcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAiY29udHJvbCIgaW5jbHVkZXMgdGhlIHJpZ2h0IHRvIGdyYW50CitwYXRlbnQgc3VibGljZW5zZXMgaW4gYSBtYW5uZXIgY29uc2lzdGVudCB3aXRoIHRoZSByZXF1aXJlbWVudHMgb2YKK3RoaXMgTGljZW5zZS4KKworICBFYWNoIGNvbnRyaWJ1dG9yIGdyYW50cyB5b3UgYSBub24tZXhjbHVzaXZlLCB3b3JsZHdpZGUsIHJveWFsdHktZnJlZQorcGF0ZW50IGxpY2Vuc2UgdW5kZXIgdGhlIGNvbnRyaWJ1dG9yJ3MgZXNzZW50aWFsIHBhdGVudCBjbGFpbXMsIHRvCittYWtlLCB1c2UsIHNlbGwsIG9mZmVyIGZvciBzYWxlLCBpbXBvcnQgYW5kIG90aGVyd2lzZSBydW4sIG1vZGlmeSBhbmQKK3Byb3BhZ2F0ZSB0aGUgY29udGVudHMgb2YgaXRzIGNvbnRyaWJ1dG9yIHZlcnNpb24uCisKKyAgSW4gdGhlIGZvbGxvd2luZyB0aHJlZSBwYXJhZ3JhcGhzLCBhICJwYXRlbnQgbGljZW5zZSIgaXMgYW55IGV4cHJlc3MKK2FncmVlbWVudCBvciBjb21taXRtZW50LCBob3dldmVyIGRlbm9taW5hdGVkLCBub3QgdG8gZW5mb3JjZSBhIHBhdGVudAorKHN1Y2ggYXMgYW4gZXhwcmVzcyBwZXJtaXNzaW9uIHRvIHByYWN0aWNlIGEgcGF0ZW50IG9yIGNvdmVuYW50IG5vdCB0bworc3VlIGZvciBwYXRlbnQgaW5mcmluZ2VtZW50KS4gIFRvICJncmFudCIgc3VjaCBhIHBhdGVudCBsaWNlbnNlIHRvIGEKK3BhcnR5IG1lYW5zIHRvIG1ha2Ugc3VjaCBhbiBhZ3JlZW1lbnQgb3IgY29tbWl0bWVudCBub3QgdG8gZW5mb3JjZSBhCitwYXRlbnQgYWdhaW5zdCB0aGUgcGFydHkuCisKKyAgSWYgeW91IGNvbnZleSBhIGNvdmVyZWQgd29yaywga25vd2luZ2x5IHJlbHlpbmcgb24gYSBwYXRlbnQgbGljZW5zZSwKK2FuZCB0aGUgQ29ycmVzcG9uZGluZyBTb3VyY2Ugb2YgdGhlIHdvcmsgaXMgbm90IGF2YWlsYWJsZSBmb3IgYW55b25lCit0byBjb3B5LCBmcmVlIG9mIGNoYXJnZSBhbmQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoaXMgTGljZW5zZSwgdGhyb3VnaCBhCitwdWJsaWNseSBhdmFpbGFibGUgbmV0d29yayBzZXJ2ZXIgb3Igb3RoZXIgcmVhZGlseSBhY2Nlc3NpYmxlIG1lYW5zLAordGhlbiB5b3UgbXVzdCBlaXRoZXIgKDEpIGNhdXNlIHRoZSBDb3JyZXNwb25kaW5nIFNvdXJjZSB0byBiZSBzbworYXZhaWxhYmxlLCBvciAoMikgYXJyYW5nZSB0byBkZXByaXZlIHlvdXJzZWxmIG9mIHRoZSBiZW5lZml0IG9mIHRoZQorcGF0ZW50IGxpY2Vuc2UgZm9yIHRoaXMgcGFydGljdWxhciB3b3JrLCBvciAoMykgYXJyYW5nZSwgaW4gYSBtYW5uZXIKK2NvbnNpc3RlbnQgd2l0aCB0aGUgcmVxdWlyZW1lbnRzIG9mIHRoaXMgTGljZW5zZSwgdG8gZXh0ZW5kIHRoZSBwYXRlbnQKK2xpY2Vuc2UgdG8gZG93bnN0cmVhbSByZWNpcGllbnRzLiAgIktub3dpbmdseSByZWx5aW5nIiBtZWFucyB5b3UgaGF2ZQorYWN0dWFsIGtub3dsZWRnZSB0aGF0LCBidXQgZm9yIHRoZSBwYXRlbnQgbGljZW5zZSwgeW91ciBjb252ZXlpbmcgdGhlCitjb3ZlcmVkIHdvcmsgaW4gYSBjb3VudHJ5LCBvciB5b3VyIHJlY2lwaWVudCdzIHVzZSBvZiB0aGUgY292ZXJlZCB3b3JrCitpbiBhIGNvdW50cnksIHdvdWxkIGluZnJpbmdlIG9uZSBvciBtb3JlIGlkZW50aWZpYWJsZSBwYXRlbnRzIGluIHRoYXQKK2NvdW50cnkgdGhhdCB5b3UgaGF2ZSByZWFzb24gdG8gYmVsaWV2ZSBhcmUgdmFsaWQuCisKKyAgSWYsIHB1cnN1YW50IHRvIG9yIGluIGNvbm5lY3Rpb24gd2l0aCBhIHNpbmdsZSB0cmFuc2FjdGlvbiBvcgorYXJyYW5nZW1lbnQsIHlvdSBjb252ZXksIG9yIHByb3BhZ2F0ZSBieSBwcm9jdXJpbmcgY29udmV5YW5jZSBvZiwgYQorY292ZXJlZCB3b3JrLCBhbmQgZ3JhbnQgYSBwYXRlbnQgbGljZW5zZSB0byBzb21lIG9mIHRoZSBwYXJ0aWVzCityZWNlaXZpbmcgdGhlIGNvdmVyZWQgd29yayBhdXRob3JpemluZyB0aGVtIHRvIHVzZSwgcHJvcGFnYXRlLCBtb2RpZnkKK29yIGNvbnZleSBhIHNwZWNpZmljIGNvcHkgb2YgdGhlIGNvdmVyZWQgd29yaywgdGhlbiB0aGUgcGF0ZW50IGxpY2Vuc2UKK3lvdSBncmFudCBpcyBhdXRvbWF0aWNhbGx5IGV4dGVuZGVkIHRvIGFsbCByZWNpcGllbnRzIG9mIHRoZSBjb3ZlcmVkCit3b3JrIGFuZCB3b3JrcyBiYXNlZCBvbiBpdC4KKworICBBIHBhdGVudCBsaWNlbnNlIGlzICJkaXNjcmltaW5hdG9yeSIgaWYgaXQgZG9lcyBub3QgaW5jbHVkZSB3aXRoaW4KK3RoZSBzY29wZSBvZiBpdHMgY292ZXJhZ2UsIHByb2hpYml0cyB0aGUgZXhlcmNpc2Ugb2YsIG9yIGlzCitjb25kaXRpb25lZCBvbiB0aGUgbm9uLWV4ZXJjaXNlIG9mIG9uZSBvciBtb3JlIG9mIHRoZSByaWdodHMgdGhhdCBhcmUKK3NwZWNpZmljYWxseSBncmFudGVkIHVuZGVyIHRoaXMgTGljZW5zZS4gIFlvdSBtYXkgbm90IGNvbnZleSBhIGNvdmVyZWQKK3dvcmsgaWYgeW91IGFyZSBhIHBhcnR5IHRvIGFuIGFycmFuZ2VtZW50IHdpdGggYSB0aGlyZCBwYXJ0eSB0aGF0IGlzCitpbiB0aGUgYnVzaW5lc3Mgb2YgZGlzdHJpYnV0aW5nIHNvZnR3YXJlLCB1bmRlciB3aGljaCB5b3UgbWFrZSBwYXltZW50Cit0byB0aGUgdGhpcmQgcGFydHkgYmFzZWQgb24gdGhlIGV4dGVudCBvZiB5b3VyIGFjdGl2aXR5IG9mIGNvbnZleWluZwordGhlIHdvcmssIGFuZCB1bmRlciB3aGljaCB0aGUgdGhpcmQgcGFydHkgZ3JhbnRzLCB0byBhbnkgb2YgdGhlCitwYXJ0aWVzIHdobyB3b3VsZCByZWNlaXZlIHRoZSBjb3ZlcmVkIHdvcmsgZnJvbSB5b3UsIGEgZGlzY3JpbWluYXRvcnkKK3BhdGVudCBsaWNlbnNlIChhKSBpbiBjb25uZWN0aW9uIHdpdGggY29waWVzIG9mIHRoZSBjb3ZlcmVkIHdvcmsKK2NvbnZleWVkIGJ5IHlvdSAob3IgY29waWVzIG1hZGUgZnJvbSB0aG9zZSBjb3BpZXMpLCBvciAoYikgcHJpbWFyaWx5Citmb3IgYW5kIGluIGNvbm5lY3Rpb24gd2l0aCBzcGVjaWZpYyBwcm9kdWN0cyBvciBjb21waWxhdGlvbnMgdGhhdAorY29udGFpbiB0aGUgY292ZXJlZCB3b3JrLCB1bmxlc3MgeW91IGVudGVyZWQgaW50byB0aGF0IGFycmFuZ2VtZW50LAorb3IgdGhhdCBwYXRlbnQgbGljZW5zZSB3YXMgZ3JhbnRlZCwgcHJpb3IgdG8gMjggTWFyY2ggMjAwNy4KKworICBOb3RoaW5nIGluIHRoaXMgTGljZW5zZSBzaGFsbCBiZSBjb25zdHJ1ZWQgYXMgZXhjbHVkaW5nIG9yIGxpbWl0aW5nCithbnkgaW1wbGllZCBsaWNlbnNlIG9yIG90aGVyIGRlZmVuc2VzIHRvIGluZnJpbmdlbWVudCB0aGF0IG1heQorb3RoZXJ3aXNlIGJlIGF2YWlsYWJsZSB0byB5b3UgdW5kZXIgYXBwbGljYWJsZSBwYXRlbnQgbGF3LgorCisgIDEyLiBObyBTdXJyZW5kZXIgb2YgT3RoZXJzJyBGcmVlZG9tLgorCisgIElmIGNvbmRpdGlvbnMgYXJlIGltcG9zZWQgb24geW91ICh3aGV0aGVyIGJ5IGNvdXJ0IG9yZGVyLCBhZ3JlZW1lbnQgb3IKK290aGVyd2lzZSkgdGhhdCBjb250cmFkaWN0IHRoZSBjb25kaXRpb25zIG9mIHRoaXMgTGljZW5zZSwgdGhleSBkbyBub3QKK2V4Y3VzZSB5b3UgZnJvbSB0aGUgY29uZGl0aW9ucyBvZiB0aGlzIExpY2Vuc2UuICBJZiB5b3UgY2Fubm90IGNvbnZleSBhCitjb3ZlcmVkIHdvcmsgc28gYXMgdG8gc2F0aXNmeSBzaW11bHRhbmVvdXNseSB5b3VyIG9ibGlnYXRpb25zIHVuZGVyIHRoaXMKK0xpY2Vuc2UgYW5kIGFueSBvdGhlciBwZXJ0aW5lbnQgb2JsaWdhdGlvbnMsIHRoZW4gYXMgYSBjb25zZXF1ZW5jZSB5b3UgbWF5Citub3QgY29udmV5IGl0IGF0IGFsbC4gIEZvciBleGFtcGxlLCBpZiB5b3UgYWdyZWUgdG8gdGVybXMgdGhhdCBvYmxpZ2F0ZSB5b3UKK3RvIGNvbGxlY3QgYSByb3lhbHR5IGZvciBmdXJ0aGVyIGNvbnZleWluZyBmcm9tIHRob3NlIHRvIHdob20geW91IGNvbnZleQordGhlIFByb2dyYW0sIHRoZSBvbmx5IHdheSB5b3UgY291bGQgc2F0aXNmeSBib3RoIHRob3NlIHRlcm1zIGFuZCB0aGlzCitMaWNlbnNlIHdvdWxkIGJlIHRvIHJlZnJhaW4gZW50aXJlbHkgZnJvbSBjb252ZXlpbmcgdGhlIFByb2dyYW0uCisKKyAgMTMuIFVzZSB3aXRoIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuCisKKyAgTm90d2l0aHN0YW5kaW5nIGFueSBvdGhlciBwcm92aXNpb24gb2YgdGhpcyBMaWNlbnNlLCB5b3UgaGF2ZQorcGVybWlzc2lvbiB0byBsaW5rIG9yIGNvbWJpbmUgYW55IGNvdmVyZWQgd29yayB3aXRoIGEgd29yayBsaWNlbnNlZAordW5kZXIgdmVyc2lvbiAzIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgaW50byBhIHNpbmdsZQorY29tYmluZWQgd29yaywgYW5kIHRvIGNvbnZleSB0aGUgcmVzdWx0aW5nIHdvcmsuICBUaGUgdGVybXMgb2YgdGhpcworTGljZW5zZSB3aWxsIGNvbnRpbnVlIHRvIGFwcGx5IHRvIHRoZSBwYXJ0IHdoaWNoIGlzIHRoZSBjb3ZlcmVkIHdvcmssCitidXQgdGhlIHNwZWNpYWwgcmVxdWlyZW1lbnRzIG9mIHRoZSBHTlUgQWZmZXJvIEdlbmVyYWwgUHVibGljIExpY2Vuc2UsCitzZWN0aW9uIDEzLCBjb25jZXJuaW5nIGludGVyYWN0aW9uIHRocm91Z2ggYSBuZXR3b3JrIHdpbGwgYXBwbHkgdG8gdGhlCitjb21iaW5hdGlvbiBhcyBzdWNoLgorCisgIDE0LiBSZXZpc2VkIFZlcnNpb25zIG9mIHRoaXMgTGljZW5zZS4KKworICBUaGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIG1heSBwdWJsaXNoIHJldmlzZWQgYW5kL29yIG5ldyB2ZXJzaW9ucyBvZgordGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZyb20gdGltZSB0byB0aW1lLiAgU3VjaCBuZXcgdmVyc2lvbnMgd2lsbAorYmUgc2ltaWxhciBpbiBzcGlyaXQgdG8gdGhlIHByZXNlbnQgdmVyc2lvbiwgYnV0IG1heSBkaWZmZXIgaW4gZGV0YWlsIHRvCithZGRyZXNzIG5ldyBwcm9ibGVtcyBvciBjb25jZXJucy4KKworICBFYWNoIHZlcnNpb24gaXMgZ2l2ZW4gYSBkaXN0aW5ndWlzaGluZyB2ZXJzaW9uIG51bWJlci4gIElmIHRoZQorUHJvZ3JhbSBzcGVjaWZpZXMgdGhhdCBhIGNlcnRhaW4gbnVtYmVyZWQgdmVyc2lvbiBvZiB0aGUgR05VIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlICJvciBhbnkgbGF0ZXIgdmVyc2lvbiIgYXBwbGllcyB0byBpdCwgeW91IGhhdmUgdGhlCitvcHRpb24gb2YgZm9sbG93aW5nIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBlaXRoZXIgb2YgdGhhdCBudW1iZXJlZAordmVyc2lvbiBvciBvZiBhbnkgbGF0ZXIgdmVyc2lvbiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUKK0ZvdW5kYXRpb24uICBJZiB0aGUgUHJvZ3JhbSBkb2VzIG5vdCBzcGVjaWZ5IGEgdmVyc2lvbiBudW1iZXIgb2YgdGhlCitHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSwgeW91IG1heSBjaG9vc2UgYW55IHZlcnNpb24gZXZlciBwdWJsaXNoZWQKK2J5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCisKKyAgSWYgdGhlIFByb2dyYW0gc3BlY2lmaWVzIHRoYXQgYSBwcm94eSBjYW4gZGVjaWRlIHdoaWNoIGZ1dHVyZQordmVyc2lvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGNhbiBiZSB1c2VkLCB0aGF0IHByb3h5J3MKK3B1YmxpYyBzdGF0ZW1lbnQgb2YgYWNjZXB0YW5jZSBvZiBhIHZlcnNpb24gcGVybWFuZW50bHkgYXV0aG9yaXplcyB5b3UKK3RvIGNob29zZSB0aGF0IHZlcnNpb24gZm9yIHRoZSBQcm9ncmFtLgorCisgIExhdGVyIGxpY2Vuc2UgdmVyc2lvbnMgbWF5IGdpdmUgeW91IGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50CitwZXJtaXNzaW9ucy4gIEhvd2V2ZXIsIG5vIGFkZGl0aW9uYWwgb2JsaWdhdGlvbnMgYXJlIGltcG9zZWQgb24gYW55CithdXRob3Igb3IgY29weXJpZ2h0IGhvbGRlciBhcyBhIHJlc3VsdCBvZiB5b3VyIGNob29zaW5nIHRvIGZvbGxvdyBhCitsYXRlciB2ZXJzaW9uLgorCisgIDE1LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LgorCisgIFRIRVJFIElTIE5PIFdBUlJBTlRZIEZPUiBUSEUgUFJPR1JBTSwgVE8gVEhFIEVYVEVOVCBQRVJNSVRURUQgQlkKK0FQUExJQ0FCTEUgTEFXLiAgRVhDRVBUIFdIRU4gT1RIRVJXSVNFIFNUQVRFRCBJTiBXUklUSU5HIFRIRSBDT1BZUklHSFQKK0hPTERFUlMgQU5EL09SIE9USEVSIFBBUlRJRVMgUFJPVklERSBUSEUgUFJPR1JBTSAiQVMgSVMiIFdJVEhPVVQgV0FSUkFOVFkKK09GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLAorVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorUFVSUE9TRS4gIFRIRSBFTlRJUkUgUklTSyBBUyBUTyBUSEUgUVVBTElUWSBBTkQgUEVSRk9STUFOQ0UgT0YgVEhFIFBST0dSQU0KK0lTIFdJVEggWU9VLiAgU0hPVUxEIFRIRSBQUk9HUkFNIFBST1ZFIERFRkVDVElWRSwgWU9VIEFTU1VNRSBUSEUgQ09TVCBPRgorQUxMIE5FQ0VTU0FSWSBTRVJWSUNJTkcsIFJFUEFJUiBPUiBDT1JSRUNUSU9OLgorCisgIDE2LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4KKworICBJTiBOTyBFVkVOVCBVTkxFU1MgUkVRVUlSRUQgQlkgQVBQTElDQUJMRSBMQVcgT1IgQUdSRUVEIFRPIElOIFdSSVRJTkcKK1dJTEwgQU5ZIENPUFlSSUdIVCBIT0xERVIsIE9SIEFOWSBPVEhFUiBQQVJUWSBXSE8gTU9ESUZJRVMgQU5EL09SIENPTlZFWVMKK1RIRSBQUk9HUkFNIEFTIFBFUk1JVFRFRCBBQk9WRSwgQkUgTElBQkxFIFRPIFlPVSBGT1IgREFNQUdFUywgSU5DTFVESU5HIEFOWQorR0VORVJBTCwgU1BFQ0lBTCwgSU5DSURFTlRBTCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgQVJJU0lORyBPVVQgT0YgVEhFCitVU0UgT1IgSU5BQklMSVRZIFRPIFVTRSBUSEUgUFJPR1JBTSAoSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBMT1NTIE9GCitEQVRBIE9SIERBVEEgQkVJTkcgUkVOREVSRUQgSU5BQ0NVUkFURSBPUiBMT1NTRVMgU1VTVEFJTkVEIEJZIFlPVSBPUiBUSElSRAorUEFSVElFUyBPUiBBIEZBSUxVUkUgT0YgVEhFIFBST0dSQU0gVE8gT1BFUkFURSBXSVRIIEFOWSBPVEhFUiBQUk9HUkFNUyksCitFVkVOIElGIFNVQ0ggSE9MREVSIE9SIE9USEVSIFBBUlRZIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCitTVUNIIERBTUFHRVMuCisKKyAgMTcuIEludGVycHJldGF0aW9uIG9mIFNlY3Rpb25zIDE1IGFuZCAxNi4KKworICBJZiB0aGUgZGlzY2xhaW1lciBvZiB3YXJyYW50eSBhbmQgbGltaXRhdGlvbiBvZiBsaWFiaWxpdHkgcHJvdmlkZWQKK2Fib3ZlIGNhbm5vdCBiZSBnaXZlbiBsb2NhbCBsZWdhbCBlZmZlY3QgYWNjb3JkaW5nIHRvIHRoZWlyIHRlcm1zLAorcmV2aWV3aW5nIGNvdXJ0cyBzaGFsbCBhcHBseSBsb2NhbCBsYXcgdGhhdCBtb3N0IGNsb3NlbHkgYXBwcm94aW1hdGVzCithbiBhYnNvbHV0ZSB3YWl2ZXIgb2YgYWxsIGNpdmlsIGxpYWJpbGl0eSBpbiBjb25uZWN0aW9uIHdpdGggdGhlCitQcm9ncmFtLCB1bmxlc3MgYSB3YXJyYW50eSBvciBhc3N1bXB0aW9uIG9mIGxpYWJpbGl0eSBhY2NvbXBhbmllcyBhCitjb3B5IG9mIHRoZSBQcm9ncmFtIGluIHJldHVybiBmb3IgYSBmZWUuCisKKyAgICAgICAgICAgICAgICAgICAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUworCisgICAgICAgICAgICBIb3cgdG8gQXBwbHkgVGhlc2UgVGVybXMgdG8gWW91ciBOZXcgUHJvZ3JhbXMKKworICBJZiB5b3UgZGV2ZWxvcCBhIG5ldyBwcm9ncmFtLCBhbmQgeW91IHdhbnQgaXQgdG8gYmUgb2YgdGhlIGdyZWF0ZXN0Citwb3NzaWJsZSB1c2UgdG8gdGhlIHB1YmxpYywgdGhlIGJlc3Qgd2F5IHRvIGFjaGlldmUgdGhpcyBpcyB0byBtYWtlIGl0CitmcmVlIHNvZnR3YXJlIHdoaWNoIGV2ZXJ5b25lIGNhbiByZWRpc3RyaWJ1dGUgYW5kIGNoYW5nZSB1bmRlciB0aGVzZSB0ZXJtcy4KKworICBUbyBkbyBzbywgYXR0YWNoIHRoZSBmb2xsb3dpbmcgbm90aWNlcyB0byB0aGUgcHJvZ3JhbS4gIEl0IGlzIHNhZmVzdAordG8gYXR0YWNoIHRoZW0gdG8gdGhlIHN0YXJ0IG9mIGVhY2ggc291cmNlIGZpbGUgdG8gbW9zdCBlZmZlY3RpdmVseQorc3RhdGUgdGhlIGV4Y2x1c2lvbiBvZiB3YXJyYW50eTsgYW5kIGVhY2ggZmlsZSBzaG91bGQgaGF2ZSBhdCBsZWFzdAordGhlICJjb3B5cmlnaHQiIGxpbmUgYW5kIGEgcG9pbnRlciB0byB3aGVyZSB0aGUgZnVsbCBub3RpY2UgaXMgZm91bmQuCisKKyAgICA8b25lIGxpbmUgdG8gZ2l2ZSB0aGUgcHJvZ3JhbSdzIG5hbWUgYW5kIGEgYnJpZWYgaWRlYSBvZiB3aGF0IGl0IGRvZXMuPgorICAgIENvcHlyaWdodCAoQykgPHllYXI+ICA8bmFtZSBvZiBhdXRob3I+CisKKyAgICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICAgIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgICAgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMyBvZiB0aGUgTGljZW5zZSwgb3IKKyAgICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorCisgICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAgICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKworICAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgICAgYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisKK0Fsc28gYWRkIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb250YWN0IHlvdSBieSBlbGVjdHJvbmljIGFuZCBwYXBlciBtYWlsLgorCisgIElmIHRoZSBwcm9ncmFtIGRvZXMgdGVybWluYWwgaW50ZXJhY3Rpb24sIG1ha2UgaXQgb3V0cHV0IGEgc2hvcnQKK25vdGljZSBsaWtlIHRoaXMgd2hlbiBpdCBzdGFydHMgaW4gYW4gaW50ZXJhY3RpdmUgbW9kZToKKworICAgIDxwcm9ncmFtPiAgQ29weXJpZ2h0IChDKSA8eWVhcj4gIDxuYW1lIG9mIGF1dGhvcj4KKyAgICBUaGlzIHByb2dyYW0gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZOyBmb3IgZGV0YWlscyB0eXBlIGBzaG93IHcnLgorICAgIFRoaXMgaXMgZnJlZSBzb2Z0d2FyZSwgYW5kIHlvdSBhcmUgd2VsY29tZSB0byByZWRpc3RyaWJ1dGUgaXQKKyAgICB1bmRlciBjZXJ0YWluIGNvbmRpdGlvbnM7IHR5cGUgYHNob3cgYycgZm9yIGRldGFpbHMuCisKK1RoZSBoeXBvdGhldGljYWwgY29tbWFuZHMgYHNob3cgdycgYW5kIGBzaG93IGMnIHNob3VsZCBzaG93IHRoZSBhcHByb3ByaWF0ZQorcGFydHMgb2YgdGhlIEdlbmVyYWwgUHVibGljIExpY2Vuc2UuICBPZiBjb3Vyc2UsIHlvdXIgcHJvZ3JhbSdzIGNvbW1hbmRzCittaWdodCBiZSBkaWZmZXJlbnQ7IGZvciBhIEdVSSBpbnRlcmZhY2UsIHlvdSB3b3VsZCB1c2UgYW4gImFib3V0IGJveCIuCisKKyAgWW91IHNob3VsZCBhbHNvIGdldCB5b3VyIGVtcGxveWVyIChpZiB5b3Ugd29yayBhcyBhIHByb2dyYW1tZXIpIG9yIHNjaG9vbCwKK2lmIGFueSwgdG8gc2lnbiBhICJjb3B5cmlnaHQgZGlzY2xhaW1lciIgZm9yIHRoZSBwcm9ncmFtLCBpZiBuZWNlc3NhcnkuCitGb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGlzLCBhbmQgaG93IHRvIGFwcGx5IGFuZCBmb2xsb3cgdGhlIEdOVSBHUEwsIHNlZQorPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorCisgIFRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBkb2VzIG5vdCBwZXJtaXQgaW5jb3Jwb3JhdGluZyB5b3VyIHByb2dyYW0KK2ludG8gcHJvcHJpZXRhcnkgcHJvZ3JhbXMuICBJZiB5b3VyIHByb2dyYW0gaXMgYSBzdWJyb3V0aW5lIGxpYnJhcnksIHlvdQorbWF5IGNvbnNpZGVyIGl0IG1vcmUgdXNlZnVsIHRvIHBlcm1pdCBsaW5raW5nIHByb3ByaWV0YXJ5IGFwcGxpY2F0aW9ucyB3aXRoCit0aGUgbGlicmFyeS4gIElmIHRoaXMgaXMgd2hhdCB5b3Ugd2FudCB0byBkbywgdXNlIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwKK1B1YmxpYyBMaWNlbnNlIGluc3RlYWQgb2YgdGhpcyBMaWNlbnNlLiAgQnV0IGZpcnN0LCBwbGVhc2UgcmVhZAorPGh0dHA6Ly93d3cuZ251Lm9yZy9waGlsb3NvcGh5L3doeS1ub3QtbGdwbC5odG1sPi4KZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL2dwcy5jIGIvcnJscC1lcGhlbWVyaXMvZ3BzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIzNTc0OAotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL2dwcy5jCkBAIC0wLDAgKzEsMTI2IEBACisvKgorICogZ3BzLmMKKyAqCisgKiBBIGZldyB1dGlsaXR5IGZ1bmN0aW9ucyB0byBkZWFsIHdpdGggbG93IGxldmVsIEdQUyBkYXRhCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSAgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2luY2x1ZGUgImdwcy5oIgorCisKKyNkZWZpbmUgR0VUX0ZJRUxEX1UodywgbmIsIHBvcykgKCgodykgPj4gKHBvcykpICYgKCgxPDwobmIpKS0xKSkKKyNkZWZpbmUgR0VUX0ZJRUxEX1ModywgbmIsIHBvcykgKCgoaW50KSgodykgPDwgKDMyLShuYiktKHBvcykpKSkgPj4gKDMyLShuYikpKQorCisvKgorICogVW5wYWNrcyBHUFMgU3ViZnJhbWUgMSwyLDMgcGF5bG9hZHMgKDMgKiA4IHdvcmRzKQorICoKKyAqIE5vdGU6IGVwaC0+c3ZfaWQgaXMgbm90IGZpbGxlZCBoZXJlIHNpbmNlIG5vdCBwcmVzZW50IGluIHRob3NlIHN1YmZyYW1lcworICoKKyAqIChubyBwYXJpdHkgYml0IGNoZWNraW5nIGlzIGRvbmUsIG9ubHkgdGhlIGxvd2VyIDI0IGJpdHMgb2YgZWFjaCB3b3JkCisgKiAgYXJlIHVzZWQpCisgKi8KK2ludAorZ3BzX3VucGFja19zZjEyMyh1aW50MzJfdCAqc2YsIHN0cnVjdCBncHNfZXBoZW1lcmlzX3N2ICplcGgpCit7CisJdWludDMyX3QgKnNmMSA9ICZzZlswXTsKKwl1aW50MzJfdCAqc2YyID0gJnNmWzhdOworCXVpbnQzMl90ICpzZjMgPSAmc2ZbMTZdOworCisJaW50IGlvZGUxLCBpb2RlMjsKKworCWVwaC0+d2Vla19ubwk9IEdFVF9GSUVMRF9VKHNmMVswXSwgMTAsIDE0KTsKKwllcGgtPmNvZGVfb25fbDIJPSBHRVRfRklFTERfVShzZjFbMF0sICAyLCAxMik7CisJZXBoLT5zdl91cmEJPSBHRVRfRklFTERfVShzZjFbMF0sICA0LCAgOCk7CisJZXBoLT5zdl9oZWFsdGgJPSBHRVRfRklFTERfVShzZjFbMF0sICA2LCAgMik7CisJZXBoLT5sMl9wX2ZsYWcJPSBHRVRfRklFTERfVShzZjFbMV0sICAxLCAyMyk7CisJZXBoLT50X2dkCT0gR0VUX0ZJRUxEX1Moc2YxWzRdLCAgOCwgIDApOworCWVwaC0+aW9kYwk9IChHRVRfRklFTERfVShzZjFbMF0sICAyLCAgMCkgPDwgOCkgfCBcCisJICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRF9VKHNmMVs1XSwgIDgsIDE2KTsKKwllcGgtPnRfb2MJPSBHRVRfRklFTERfVShzZjFbNV0sIDE2LCAgMCk7CisJZXBoLT5hX2YyCT0gR0VUX0ZJRUxEX1Moc2YxWzZdLCAgOCwgMTYpOworCWVwaC0+YV9mMQk9IEdFVF9GSUVMRF9TKHNmMVs2XSwgMTYsICAwKTsKKwllcGgtPmFfZjAJPSBHRVRfRklFTERfUyhzZjFbN10sIDIyLCAgMik7CisKKwlpb2RlMQkJPSBHRVRfRklFTERfVShzZjJbMF0sICA4LCAxNik7CisJZXBoLT5jX3JzCT0gR0VUX0ZJRUxEX1Moc2YyWzBdLCAxNiwgIDApOworCWVwaC0+ZGVsdGFfbgk9IEdFVF9GSUVMRF9TKHNmMlsxXSwgMTYsICA4KTsKKwllcGgtPm1fMAk9IChHRVRfRklFTERfUyhzZjJbMV0sICA4LCAgMCkgPDwgMjQpIHwgXAorCSAgICAgICAgICAgICAgICAgICBHRVRfRklFTERfVShzZjJbMl0sIDI0LCAgMCk7CisJZXBoLT5jX3VjCT0gR0VUX0ZJRUxEX1Moc2YyWzNdLCAxNiwgIDgpOworCWVwaC0+ZQkJPSAoR0VUX0ZJRUxEX1Uoc2YyWzNdLCAgOCwgIDApIDw8IDI0KSB8IFwKKwkgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEX1Uoc2YyWzRdLCAyNCwgIDApOworCWVwaC0+Y191cwk9IEdFVF9GSUVMRF9TKHNmMls1XSwgMTYsICA4KTsKKwllcGgtPmFfcG93aGFsZgk9IChHRVRfRklFTERfVShzZjJbNV0sICA4LCAgMCkgPDwgMjQpIHwgXAorCSAgICAgICAgICAgICAgICAgICBHRVRfRklFTERfVShzZjJbNl0sIDI0LCAgMCk7CisJZXBoLT50X29lCT0gR0VUX0ZJRUxEX1Uoc2YyWzddLCAxNiwgIDgpOworCWVwaC0+Zml0X2ZsYWcJPSBHRVRfRklFTERfVShzZjJbN10sICAxLCAgNyk7CisKKwllcGgtPmNfaWMJPSBHRVRfRklFTERfUyhzZjNbMF0sIDE2LCAgOCk7CisJZXBoLT5vbWVnYV8wCT0gKEdFVF9GSUVMRF9TKHNmM1swXSwgIDgsICAwKSA8PCAyNCkgfCBcCisJICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRF9VKHNmM1sxXSwgMjQsICAwKTsKKwllcGgtPmNfaXMJPSBHRVRfRklFTERfUyhzZjNbMl0sIDE2LCAgOCk7CisJZXBoLT5pXzAJPSAoR0VUX0ZJRUxEX1Moc2YzWzJdLCAgOCwgIDApIDw8IDI0KSB8IFwKKwkgICAgICAgICAgICAgICAgICAgR0VUX0ZJRUxEX1Uoc2YzWzNdLCAyNCwgIDApOworCWVwaC0+Y19yYwk9IEdFVF9GSUVMRF9TKHNmM1s0XSwgMTYsICA4KTsKKwllcGgtPncJCT0gKEdFVF9GSUVMRF9TKHNmM1s0XSwgIDgsICAwKSA8PCAyNCkgfCBcCisJICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRF9VKHNmM1s1XSwgMjQsICAwKTsKKwllcGgtPm9tZWdhX2RvdAk9IEdFVF9GSUVMRF9TKHNmM1s2XSwgMjQsICAwKTsKKwlpb2RlMgkJPSBHRVRfRklFTERfVShzZjNbN10sICA4LCAxNik7CisJZXBoLT5pZG90CT0gR0VUX0ZJRUxEX1Moc2YzWzddLCAxNCwgIDIpOworCisJZXBoLT5fcnN2ZDEJPSBHRVRfRklFTERfVShzZjFbMV0sIDIzLCAgMCk7CisJZXBoLT5fcnN2ZDIJPSBHRVRfRklFTERfVShzZjFbMl0sIDI0LCAgMCk7CisJZXBoLT5fcnN2ZDMJPSBHRVRfRklFTERfVShzZjFbM10sIDI0LCAgMCk7CisJZXBoLT5fcnN2ZDQJPSBHRVRfRklFTERfVShzZjFbNF0sIDE2LCAgOCk7CisJZXBoLT5hb2RvCT0gR0VUX0ZJRUxEX1Uoc2YyWzddLCAgNSwgIDIpOworCisJLyogQ2hlY2sgJiBjcm9zcy12YWxpZGF0ZSBpb2RjWzc6MF0sIGlvZGUxLCBpb2RlMiAqLworCWlmICgoaW9kZTEgIT0gaW9kZTIpIHx8IChpb2RlMSAhPSAoZXBoLT5pb2RjICYgMHhmZikpKQorCQlyZXR1cm4gLTE7CisKKwlyZXR1cm4gMDsKK30KKworCisvKgorICogVW5wYWNrcyBHUFMgU3ViZnJhbWUgNCBvciA1IEFsbWFuYWMgcGFnZXMgcGF5bG9hZCAoOCB3b3JkcykKKyAqCisgKiAobm8gcGFyaXR5IGJpdCBjaGVja2luZyBpcyBkb25lLCBvbmx5IHRoZSBsb3dlciAyNCBiaXRzIG9mIGVhY2ggd29yZAorICogIGFyZSB1c2VkKQorICovCitpbnQKK2dwc191bnBhY2tfc2Y0NV9hbG1hbmFjKHVpbnQzMl90ICpzZiwgc3RydWN0IGdwc19hbG1hbmFjX3N2ICphbG0pCit7CisJYWxtLT5zdl9pZCAgICAgID0gR0VUX0ZJRUxEX1Uoc2ZbMF0sICA2LCAxNik7CisKKwlhbG0tPmUJCT0gR0VUX0ZJRUxEX1Uoc2ZbMF0sIDE2LCAgMCk7CisJYWxtLT50X29hCT0gR0VUX0ZJRUxEX1Uoc2ZbMV0sICA4LCAxNik7CisJYWxtLT5rc2lpCT0gR0VUX0ZJRUxEX1Moc2ZbMV0sIDE2LCAgMCk7CisJYWxtLT5vbWVnYV9kb3QJPSBHRVRfRklFTERfUyhzZlsyXSwgMTYsICA4KTsKKwlhbG0tPnN2X2hlYWx0aAk9IEdFVF9GSUVMRF9VKHNmWzJdLCAgOCwgIDApOworCWFsbS0+YV9wb3doYWxmCT0gR0VUX0ZJRUxEX1Uoc2ZbM10sIDI0LCAgMCk7CisJYWxtLT5vbWVnYV8wCT0gR0VUX0ZJRUxEX1Moc2ZbNF0sIDI0LCAgMCk7CisJYWxtLT53CQk9IEdFVF9GSUVMRF9TKHNmWzVdLCAyNCwgIDApOworCWFsbS0+bV8wCT0gR0VUX0ZJRUxEX1Moc2ZbNl0sIDI0LCAgMCk7CisJYWxtLT5hX2YwCT0gKEdFVF9GSUVMRF9TKHNmWzddLCA4LCAxNikgPDwgMykgfCBcCisJICAgICAgICAgICAgICAgICAgIEdFVF9GSUVMRF9VKHNmWzddLCAzLCAgMik7CisJYWxtLT5hX2YxCT0gR0VUX0ZJRUxEX1Moc2ZbN10sIDExLCAgNSk7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvZ3BzLmggYi9ycmxwLWVwaGVtZXJpcy9ncHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNDFiOWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvZ3BzLmgKQEAgLTAsMCArMSwxOTAgQEAKKy8qCisgKiBncHMuaAorICoKKyAqIEhlYWRlciB0byBkZWFsIHdpdGggbG93IGxldmVsIEdQUyBkYXRhCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSAgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworI2lmbmRlZiBfX0dQU19IX18KKyNkZWZpbmUgX19HUFNfSF9fCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisKKyNkZWZpbmUgTUFYX1NWCTY0CisKKworLyogSW9ub3NwZXJpYyBtb2RlbCBkYXRhICovCitzdHJ1Y3QgZ3BzX2lvbm9zcGhlcmVfbW9kZWwgeworCQkJLyogI2JpdHMgIFNjYWxlIGZhY3RvciAgRWZmZWN0aXZlICBVbml0cyAgICAgICAgICAgICovCisJCQkvKiAgICAgICAgICAgKExTQikgICAgICAgcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgKi8KKworCWludCBhbHBoYV8wOwkvKiBzIDggICAgICAgMl4tMzAgICAgICAgICAgICAgICAgIHNlY29uZHMgICAgICAgICAgKi8KKwlpbnQgYWxwaGFfMTsJLyogcyA4ICAgICAgIDJeLTI3ICAgICAgICAgICAgICAgICBzIC8gc2VtaS1jaXJjbGVzICovCisJaW50IGFscGhhXzI7CS8qIHMgOCAgICAgICAyXi0yNCAgICAgICAgICAgICAgICAgcyAvIChzZW1pLWNpcmNsZXMpXjIgKi8KKwlpbnQgYWxwaGFfMzsJLyogcyA4ICAgICAgIDJeLTI0ICAgICAgICAgICAgICAgICBzIC8gKHNlbWktY2lyY2xlcyleMyAqLworCWludCBiZXRhXzA7CS8qIHMgOCAgICAgICAyXjExICAgICAgICAgICAgICAgICAgc2Vjb25kcyAgICAgICAgICAqLworCWludCBiZXRhXzE7CS8qIHMgOCAgICAgICAyXjE0ICAgICAgICAgICAgICAgICAgcyAvIHNlbWktY2lyY2xlcyAqLworCWludCBiZXRhXzI7CS8qIHMgOCAgICAgICAyXjE2ICAgICAgICAgICAgICAgICAgcyAvIChzZW1pLWNpcmNsZXMpXjIgKi8KKwlpbnQgYmV0YV8zOwkvKiBzIDggICAgICAgMl4xNiAgICAgICAgICAgICAgICAgIHMgLyAoc2VtaS1jaXJjbGVzKV4zICovCit9OworCisKKy8qIFVUQyBtb2RlbCBkYXRhICovCitzdHJ1Y3QgZ3BzX3V0Y19tb2RlbCB7CisJCQkvKiAjYml0cyAgU2NhbGUgZmFjdG9yICBFZmZlY3RpdmUgIFVuaXRzICAgICAgICAgICAgKi8KKwkJCS8qICAgICAgICAgICAoTFNCKSAgICAgICByYW5nZSAgICAgICAgICAgICAgICAgICAgICAqLworCisJaW50IGEwOwkJLyogcyAzMiAgICAgIDJeLTMwICAgICAgICAgICAgICAgICBzZWNvbmRzICAgICAgICAgICovCisJaW50IGExOwkJLyogcyAyNCAgICAgIDJeLTUwICAgICAgICAgICAgICAgICBzZWNvbmRzIC8gc2Vjb25kcyAqLworCWludCBkZWx0YV90X2xzOwkvKiBzICA4ICAgICAgMSAgICAgICAgICAgICAgICAgICAgIHNlY29uZHMgICAgICAgICAgKi8KKwlpbnQgdF9vdDsJLyogdSAgOCAgICAgIDJeMTIgICAgICAgNjAyLDExMiAgICBzZWNvbmRzICAgICAgICAgICovCisJaW50IHduX3Q7CS8qIHUgIDggICAgICAxICAgICAgICAgICAgICAgICAgICAgd2Vla3MgICAgICAgICAgICAqLworCWludCB3bl9sc2Y7CS8qIHUgIDggICAgICAxICAgICAgICAgICAgICAgICAgICAgd2Vla3MgICAgICAgICAgICAqLworCWludCBkbjsJCS8qIHUgIDggICAgICAxICAgICAgICAgICAgICAgIDcgICAgZGF5cyAgICAgICAgICAgICAqLworCWludCBkZWx0YV90X2xzZjsvKiBzICA4ICAgICAgMSAgICAgICAgICAgICAgICAgICAgIHNlY29uZHMgICAgICAgICAgKi8KK307CisKKworLyogQWxtYW5hY2ggZGF0YSAqLworc3RydWN0IGdwc19hbG1hbmFjX3N2IHsKKwlpbnQgc3ZfaWQ7CisJaW50IHN2X2hlYWx0aDsKKworCQkJLyogI2JpdHMgIFNjYWxlIGZhY3RvciAgRWZmZWN0aXZlICBVbml0cyAgICAgICAgICAgICovCisJCQkvKiAgICAgICAgICAgKExTQikgICAgICAgcmFuZ2UgICAgICAgICAgICAgICAgICAgICAgKi8KKworCWludCBlOwkJLyogdSAxNiAgICAgIDJeLTIxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisJaW50IHRfb2E7CS8qIHUgIDggICAgICAyXjEyICAgICAgIDYwMiwxMTIgICAgc2Vjb25kcyAgICAgICAgICAqLworCWludCBrc2lpOwkvKiBzIDE2ICAgICAgMl4tMTkgICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAgICAgKi8KKwlpbnQgb21lZ2FfZG90OwkvKiBzIDE2ICAgICAgMl4tMzggICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAvIHMgKi8KKwlpbnQgYV9wb3doYWxmOwkvKiB1IDI0ICAgICAgMl4tMTEgICAgICAgICAgICAgICAgIG1ldGVycyAgICAgICAgICAgKi8KKwlpbnQgb21lZ2FfMDsJLyogcyAyNCAgICAgIDJeLTIzICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgICAgICovCisJaW50IHc7CQkvKiBzIDI0ICAgICAgMl4tMjMgICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAgICAgKi8KKwlpbnQgbV8wOwkvKiBzIDI0ICAgICAgMl4tMjMgICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAgICAgKi8KKwlpbnQgYV9mMDsJLyogcyAxMSAgICAgIDJeLTIwICAgICAgICAgICAgICAgICBzZWNvbmRzICAgICAgICAgICovCisJaW50IGFfZjE7CS8qIHMgMTEgICAgICAyXi0zOCAgICAgICAgICAgICAgICAgc2Vjb25kcyAvIHNlY29uZHMgKi8KK307CisKK3N0cnVjdCBncHNfYWxtYW5hYyB7CisJaW50IHduYTsKKwlpbnQgbl9zdjsKKwlzdHJ1Y3QgZ3BzX2FsbWFuYWNfc3Ygc3ZzW01BWF9TVl07Cit9OworCisKKy8qIEVwaGVtZXJpcyBkYXRhICovCitzdHJ1Y3QgZ3BzX2VwaGVtZXJpc19zdiB7CisJaW50IHN2X2lkOworCisJCQkvKiAjYml0cyAgU2NhbGUgZmFjdG9yICBFZmZlY3RpdmUgIFVuaXRzICAgICAgICAgICAgKi8KKwkJCS8qICAgICAgICAgICAoTFNCKSAgICAgICByYW5nZSAgICAgICAgICAgICAgICAgICAgICAqLworCisJaW50IGNvZGVfb25fbDI7CS8qIHUgIDIgICAgICAxICAgICAgICAgICAgICAgICAgICAgLyAgICAgICAgICAgICAgICAqLworCWludCB3ZWVrX25vOwkvKiB1IDEwICAgICAgMSAgICAgICAgICAgICAgICAgICAgIHdlZWsgICAgICAgICAgICAgKi8KKwlpbnQgbDJfcF9mbGFnOwkvKiB1ICAxICAgICAgMSAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgKi8KKwlpbnQgc3ZfdXJhOwkvKiB1ICA0ICAgICAgLyAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgKi8KKwlpbnQgc3ZfaGVhbHRoOwkvKiB1ICA2ICAgICAgLyAgICAgICAgICAgICAgICAgICAgIC8gICAgICAgICAgICAgICAgKi8KKwlpbnQgdF9nZDsJLyogcyAgOCAgICAgIDJeLTMxICAgICAgICAgICAgICAgICBzZWNvbmRzICAgICAgICAgICovCisJaW50IGlvZGM7CS8qIHUgMTAgICAgICAvICAgICAgICAgICAgICAgICAgICAgLyAgICAgICAgICAgICAgICAqLworCWludCB0X29jOwkvKiB1IDE2ICAgICAgMl40ICAgICAgICA2MDQsNzg0ICAgIHNlY29uZHMgICAgICAgICAgKi8KKwlpbnQgYV9mMjsJLyogcyAgOCAgICAgIDJeLTU1ICAgICAgICAgICAgICAgICBzZWMgLyBzZWNeMiAgICAgICovCisJaW50IGFfZjE7CS8qIHMgMTYgICAgICAyXi00MyAgICAgICAgICAgICAgICAgc2VjIC8gc2VjICAgICAgICAqLworCWludCBhX2YwOwkvKiBzIDIyICAgICAgMl4tMzEgICAgICAgICAgICAgICAgIHNlY29uZHMgICAgICAgICAgKi8KKworCWludCBjX3JzOwkvKiBzIDE2ICAgICAgMl4tNSAgICAgICAgICAgICAgICAgIG1ldGVycyAgICAgICAgICAgKi8KKwlpbnQgZGVsdGFfbjsJLyogcyAxNiAgICAgIDJeLTQzICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgLyBzICovCisJaW50IG1fMDsJLyogcyAzMiAgICAgIDJeLTMxICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgICAgICovCisJaW50IGNfdWM7CS8qIHMgMTYgICAgICAyXi0yOSAgICAgICAgICAgICAgICAgcmFkaWFucyAgICAgICAgICAqLworCXVuc2lnbmVkIGludCBlOwkvKiB1IDMyICAgICAgMl4tMzMgICAgICAwLjAzICAgICAgIC8gICAgICAgICAgICAgICAgKi8KKwlpbnQgY191czsJLyogcyAxNiAgICAgIDJeLTI5ICAgICAgICAgICAgICAgICByYWRpYW5zICAgICAgICAgICovCisJdW5zaWduZWQgaW50IGFfcG93aGFsZjsgLyogdSAzMiAgMl4tMTkgICAgICAgICAgICAgbWV0ZXJzXigxLzIpICAgICAqLworCWludCB0X29lOwkvKiB1IDE2ICAgICAgMl40ICAgICAgICA2MDQsNzg0ICAgIHNlY29uZHMgICAgICAgICAgKi8KKwlpbnQgZml0X2ZsYWc7CS8qIHUgIDEgICAgICAvICAgICAgICAgICAgICAgICAgICAgLyAgICAgICAgICAgICAgICAqLworCisJaW50IGNfaWM7CS8qIHMgMTYgICAgICAyXi0yOSAgICAgICAgICAgICAgICAgcmFkaWFucyAgICAgICAgICAqLworCWludCBvbWVnYV8wOwkvKiBzIDMyICAgICAgMl4tMzEgICAgICAgICAgICAgICAgIHNlbWktY2lyY2xlcyAgICAgKi8KKwlpbnQgY19pczsJLyogcyAxNiAgICAgIDJeLTI5ICAgICAgICAgICAgICAgICByYWRpYW5zICAgICAgICAgICovCisJaW50IGlfMDsJLyogcyAzMiAgICAgIDJeLTMxICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgICAgICovCisJaW50IGNfcmM7CS8qIHMgMTYgICAgICAyXi01ICAgICAgICAgICAgICAgICAgbWV0ZXJzICAgICAgICAgICAqLworCWludCB3OwkJLyogcyAzMiAgICAgIDJeLTMxICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgICAgICovCisJaW50IG9tZWdhX2RvdDsJLyogcyAyNCAgICAgIDJeLTQzICAgICAgICAgICAgICAgICBzZW1pLWNpcmNsZXMgLyBzICovCisJaW50IGlkb3Q7CS8qIHMgMTQgICAgICAyXi00MyAgICAgICAgICAgICAgICAgc2VtaS1jaXJjbGVzIC8gcyAqLworCisJaW50IF9yc3ZkMTsJLyogMjMgYml0cyAqLworCWludCBfcnN2ZDI7CS8qIDI0IGJpdHMgKi8KKwlpbnQgX3JzdmQzOwkvKiAyNCBiaXRzICovCisJaW50IF9yc3ZkNDsJLyogMTYgYml0cyAqLworCWludCBhb2RvOwkvKiA4IGJpdHMgIE5vdCBzdXJlIGl0IG5lZWRzIHRvIGJlIGhlcmUgLi4uICovCit9OworCitzdHJ1Y3QgZ3BzX2VwaGVtZXJpcyB7CisJaW50IG5fc3Y7CisJc3RydWN0IGdwc19lcGhlbWVyaXNfc3Ygc3ZzW01BWF9TVl07Cit9OworCisKKy8qIFJlZmVyZW5jZSBwb3NpdGlvbiAqLworc3RydWN0IGdwc19yZWZfcG9zIHsJLyogV1NHODQgZWxsaXBzb2lkICovCisJZG91YmxlIGxhdGl0dWRlOwkvKiBkZWcgKi8KKwlkb3VibGUgbG9uZ2l0dWRlOwkvKiBkZWcgKi8KKwlkb3VibGUgYWx0aXR1ZGU7CS8qIG0gYWJvdmUgZWxsaXBzb2lkICovCit9OworCisKKy8qIFJlZmVyZW5jZSB0aW1lICovCitzdHJ1Y3QgZ3BzX3JlZl90aW1lIHsKKwlpbnQgd247CQkJLyogR1BTIHdlZWsgbnVtYmVyICovCisJZG91YmxlIHRvdzsJCS8qIGluIHNlY29uZHMgKi8KK307CisKKworLyogQWxsIGFzc2lzdCBkYXRhICovCisjZGVmaW5lIEdQU19GSUVMRF9JT05PU1BIRVJFCSgxPDwwKQorI2RlZmluZSBHUFNfRklFTERfVVRDCQkoMTw8MSkKKyNkZWZpbmUgR1BTX0ZJRUxEX0FMTUFOQUMJKDE8PDIpCisjZGVmaW5lIEdQU19GSUVMRF9FUEhFTUVSSVMJKDE8PDMpCisjZGVmaW5lIEdQU19GSUVMRF9SRUZQT1MJKDE8PDQpCisjZGVmaW5lIEdQU19GSUVMRF9SRUZUSU1FCSgxPDw1KQorCitzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhIHsKKwlpbnQgZmllbGRzOworCXN0cnVjdCBncHNfaW9ub3NwaGVyZV9tb2RlbAlpb25vc3BoZXJlOworCXN0cnVjdCBncHNfdXRjX21vZGVsCQl1dGM7CisJc3RydWN0IGdwc19hbG1hbmFjCQlhbG1hbmFjOworCXN0cnVjdCBncHNfZXBoZW1lcmlzCQllcGhlbWVyaXM7CisJc3RydWN0IGdwc19yZWZfcG9zCQlyZWZfcG9zOworCXN0cnVjdCBncHNfcmVmX3RpbWUJCXJlZl90aW1lOworfTsKKworCisvKiBHUFMgU3ViZnJhbWUgdXRpbGl0eSBtZXRob2RzIChzZWUgZ3BzLmMgZm9yIGRldGFpbHMpICovCitpbnQgZ3BzX3VucGFja19zZjEyMyh1aW50MzJfdCAqc2YsIHN0cnVjdCBncHNfZXBoZW1lcmlzX3N2ICplcGgpOworaW50IGdwc191bnBhY2tfc2Y0NV9hbG1hbmFjKHVpbnQzMl90ICpzZiwgc3RydWN0IGdwc19hbG1hbmFjX3N2ICphbG0pOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX0dQU19IX18gKi8KKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvbWFpbi5jIGIvcnJscC1lcGhlbWVyaXMvbWFpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMDI1YTIKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9tYWluLmMKQEAgLTAsMCArMSw5OSBAQAorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKyNpbmNsdWRlICJncHMuaCIKKyNpbmNsdWRlICJ1YnguaCIKKyNpbmNsdWRlICJ1YngtcGFyc2UuaCIKKyNpbmNsdWRlICJycmxwLmgiCisKK3N0YXRpYyBpbnQKK2RvX3VieF9yZWFkKHN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwcywgY29uc3QgY2hhciAqZmlsZW5hbWUpCit7CisJaW50IHJ2LCBmZCwgaTsKKwlzdHJ1Y3Qgc3RhdCBzdDsKKwl2b2lkICpidWY7CisKKwkvKiBMb2FkIGZpbGUgKi8KKwlmZCA9IG9wZW4oZmlsZW5hbWUsIE9fUkRPTkxZKTsKKwlpZiAoZmQgPCAwKQorCQlyZXR1cm4gLTE7CisKKwlydiA9IGZzdGF0KGZkLCAmc3QpOworCWlmIChydiA8IDApIHsKKwkJY2xvc2UoZmQpOworCQlyZXR1cm4gLTE7CisJfQorCisJYnVmID0gbWFsbG9jKHN0LnN0X3NpemUpOworCWlmICghYnVmKSB7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXJ2ID0gcmVhZChmZCwgYnVmLCBzdC5zdF9zaXplKTsKKwlpZiAocnYgIT0gc3Quc3Rfc2l6ZSkgeworCQlmcmVlKGJ1Zik7CisJCWNsb3NlKGZkKTsKKwkJcmV0dXJuIC0xOworCX0KKworCS8qIFBhcnNlIGVhY2ggbWVzc2FnZSAqLworCWZvciAoaT0wOyBpPHN0LnN0X3NpemU7KSB7CisJCWludCBydjsKKwkJcnYgPSB1YnhfbXNnX2Rpc3BhdGNoKHVieF9wYXJzZV9kdCwgYnVmICsgaSwgc3Quc3Rfc2l6ZSAtIGksIGdwcyk7CisJCWlmIChydiA8IDApCisJCQlpKys7CS8qIEludmFsaWQgbWVzc2FnZTogdHJ5IG9uZSBieXRlIGxhdGVyICovCisJCWVsc2UKKwkJCWkgKz0gcnY7CisJfQorCisJLyogRG9uZSAqLworCWZyZWUoYnVmKTsKKwljbG9zZShmZCk7CisKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIGludAorZG9fcnJscChzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHMpCit7CisJc3RydWN0IHJybHBfYXNzaXN0X3JlcSBhcjsKKwl2b2lkICpwZHVzWzY0XTsKKwlpbnQgbGVuWzY0XTsKKwlpbnQgaSwgcnY7CisKKwljaGFyICp0ZXN0ID0gIlx4MjhceDAwXHg4MFx4MTBceDAxXHgzMlx4MDBceDE5XHg0Rlx4MDdceDE1XHgwNCI7CisKKwlycmxwX2RlY29kZV9hc3Npc3RhbmNlX3JlcXVlc3QoJmFyLCB0ZXN0LCAxMik7CisJcHJpbnRmKCIlMDh4ICUwMTZsbHhcbiIsIGFyLnJlcV9lbGVtcywgKGxvbmcgbG9uZyB1bnNpZ25lZCkgYXIuZXBoX3N2cyk7CisKKwlhci5yZXFfZWxlbXMgPSAtMTsKKwlhci5lcGhfc3ZzID0gLTFMTDsKKwlydiA9IHJybHBfZ3BzX2Fzc2lzdF9wZHVzKGdwcywgJmFyLCBwZHVzLCBsZW4sIDY0KTsKKwlwcmludGYoIiVkXG4iLCBydik7CisJZm9yIChpPTA7IGk8cnY7IGkrKykgeworCQlwcmludGYoIiVwICVkXG4iLCBwZHVzW2ldLCBsZW5baV0pOworCX0KKwlyZXR1cm4gMDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKK3sKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhIGdwczsKKwlpbnQgcnY7CisKKwltZW1zZXQoJmdwcywgMHgwMCwgc2l6ZW9mKGdwcykpOworCisJcnYgPSBkb191YnhfcmVhZCgmZ3BzLCAiZGF0YS51YngiKTsKKwkKKwlydiA9IGRvX3JybHAoJmdwcyk7CisKKwlyZXR1cm4gMDsKK30KKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvcnJscC5jIGIvcnJscC1lcGhlbWVyaXMvcnJscC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2MGMzYWIKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy9ycmxwLmMKQEAgLTAsMCArMSw2NDggQEAKKy8qCisgKiBycmxwLmMKKyAqCisgKiBSUkxQIGltcGxlbWVudGF0aW9uCisgKgorICoKKyAqIENvcHlyaWdodCAoQykgMjAwOSAgU3lsdmFpbiBNdW5hdXQgPHRudEAyNDZ0TnQuY29tPgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOiB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CisgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IKKyAqIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisgKiBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgorICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKyAqCisgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW0uICBJZiBub3QsIHNlZSA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uCisgKi8KKworCisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJncHMuaCIKKyNpbmNsdWRlICJycmxwLmgiCisKKyNpbmNsdWRlIDxQRFUuaD4KKyNpbmNsdWRlIDxHUFMtQXNzaXN0RGF0YS5oPgorI2luY2x1ZGUgPE5hdmlnYXRpb25Nb2RlbC5oPgorI2luY2x1ZGUgPElvbm9zcGhlcmljTW9kZWwuaD4KKyNpbmNsdWRlIDxVVENNb2RlbC5oPgorI2luY2x1ZGUgPEFsbWFuYWMuaD4KKyNpbmNsdWRlIDxSZWZMb2NhdGlvbi5oPgorI2luY2x1ZGUgPFJlZmVyZW5jZVRpbWUuaD4KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFJSTFAgQXNzaXN0YW5jZSByZXF1ZXN0IGRlY29kaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0te3t7ICovCisvKiBEZWNvZGUgYW5kIHZhbGlkYXRlIHRoZSBhc3Npc3RhbmNlIGRhdGEgcmVxdWVzdCBtZXNzYWdlcy4KKyAqIFNlZSBzZWN0aW9uIDEwLjEwIG9mCisgKiAgLiBFVFNJIFRTIDE0OSAwMzEgVjguMS4wICgyMDA5LTAxKQorICogIC4gM0dQUCBUUyA0OS4wMzEgdmVyc2lvbiA4LjEuMCBSZWxlYXNlIDgKKyAqLworCisvKiBQYWNrZWQgc3RydWN0dXJlIGZyb20gNDkuMDMxIHNwZWMgKFJHQSA9IFJlcXVlc3QgR1BTIEFzc2lzdGFuY2UpICovCisKKyNkZWZpbmUgUlJMUF9SR0EwX0FMTUFOQUMJKDE8PDApCisjZGVmaW5lIFJSTFBfUkdBMF9VVENfTU9ERUwJKDE8PDEpCisjZGVmaW5lIFJSTFBfUkdBMF9JT05PX01PREVMCSgxPDwyKQorI2RlZmluZSBSUkxQX1JHQTBfTkFWX01PREVMCSgxPDwzKQorI2RlZmluZSBSUkxQX1JHQTBfREdQUwkJKDE8PDQpCisjZGVmaW5lIFJSTFBfUkdBMF9SRUZfTE9DCSgxPDw1KQorI2RlZmluZSBSUkxQX1JHQTBfUkVGX1RJTUUJKDE8PDYpCisjZGVmaW5lIFJSTFBfUkdBMF9BQ1FfQVNTSVNUCSgxPDw3KQorCisjZGVmaW5lIFJSTFBfUkdBMV9SRUFMVElNRV9JTlQJKDE8PDApCisjZGVmaW5lIFJSTFBfUkdBMV9FUEhfRVhUCSgxPDwxKQorI2RlZmluZSBSUkxQX1JHQTFfRVBIX0VYVF9DSEVDSwkoMTw8MikKKworc3RydWN0IHJybHBfcmdhX2hkciB7CisJdWludDhfdCBpdGVtczA7CisJdWludDhfdCBpdGVtczE7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgcnJscF9yZ2FfZXBoX3N2IHsKKwl1aW50OF90IHN2X2lkOwkJLyogWzc6Nl0gcmVzZXJ2ZWQsIFs1OjBdIHN2X2lkICovCisJdWludDhfdCBpb2RlOwkJLyogbGF0ZXN0IGVwaCBpbiB0aGUgTVMgbWVtb3J5IGluIGhvdXJzICovCit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgcnJscF9yZ2FfZXBoIHsKKwl1aW50OF90IHduX2hpOwkJLyogWzc6Nl0gPSB3bls5OjhdICovCisJdWludDhfdCB3bl9sbzsJCS8qIHduWzc6MF0gKi8KKwl1aW50OF90IHRvZTsJCS8qIGxhdGVzdCBlcGggaW4gdGhlIE1TIG1lbW9yeSBpbiBob3VycyAqLworCXVpbnQ4X3QgbnNhdF90bXRvZTsJLyogWzc6NF0gbnN0YXQsIFszOjBdIFQtVG9lIGxpbWl0ICovCisJc3RydWN0IHJybHBfcmdhX2VwaF9zdiBzdnNbMF07Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgcnJscF9yZ2FfZXBoX2V4dCB7CisJdWludDhfdCB2YWxpZGl0eTsJLyogaW4gNCBob3VycyB1bml0cyAqLworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHJybHBfcmdhX2VwaF9leHRfY2hlY2sgeworCQkvKiB3ZWVrcyBhcmUgaW4gZ3BzIHdlZWsgbW9kdWxvIDQgKi8KKwl1aW50OF90IHduX2JlZ2luX2VuZDsJLyogWzc6NF0gYmVnaW4sIFszOjBdIGVuZCAqLworCXVpbnQ4X3QgdG93X2JlZ2luOworCXVpbnQ4X3QgdG93X2VuZDsKK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworLyogUGFyc2luZyBmdW5jdGlvbiAqLworCitpbnQKK3JybHBfZGVjb2RlX2Fzc2lzdGFuY2VfcmVxdWVzdCgKKwlzdHJ1Y3QgcnJscF9hc3Npc3RfcmVxICphciwKKwl2b2lkICpyZXEsIGludCByZXFfbGVuKQoreworCXN0cnVjdCBycmxwX3JnYV9oZHIgKmhkciA9IE5VTEw7CisJc3RydWN0IHJybHBfcmdhX2VwaCAqZXBoID0gTlVMTDsKKwlzdHJ1Y3QgcnJscF9yZ2FfZXBoX2V4dCAqZXBoX2V4dCA9IE5VTEw7CisJc3RydWN0IHJybHBfcmdhX2VwaF9leHRfY2hlY2sgKmVwaF9leHRfY2hlY2sgPSBOVUxMOworCWludCBwID0gMDsKKworCS8qIFJlc2V0ICovCisJYXItPnJlcV9lbGVtcyA9IDA7CisJYXItPmVwaF9zdnMgPSAwOworCisJLyogUGFyc2UgbWVzc2FnZSAqLworCWhkciA9IHJlcTsKKwlwICs9IHNpemVvZihzdHJ1Y3QgcnJscF9yZ2FfaGRyKTsKKwlpZiAocCA+IHJlcV9sZW4pCisJCXJldHVybiAtMTsKKworCWlmIChoZHItPml0ZW1zMCAmIFJSTFBfUkdBMF9OQVZfTU9ERUwpIHsKKwkJZXBoID0gcmVxICsgcDsKKwkJcCArPSBzaXplb2Yoc3RydWN0IHJybHBfcmdhX2VwaCk7CisJCWlmIChwID4gcmVxX2xlbikKKwkJCXJldHVybiAtMTsKKwkJcCArPSAoZXBoLT5uc2F0X3RtdG9lID4+IDQpICogc2l6ZW9mKHN0cnVjdCBycmxwX3JnYV9lcGhfc3YpOworCQlpZiAocCA+IHJlcV9sZW4pCisJCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKGhkci0+aXRlbXMxICYgUlJMUF9SR0ExX0VQSF9FWFQpIHsKKwkJZXBoX2V4dCA9IHJlcSArIHA7CisJCXAgKz0gc2l6ZW9mKHN0cnVjdCBycmxwX3JnYV9lcGhfZXh0KTsKKwkJaWYgKHAgPiByZXFfbGVuKQorCQkJcmV0dXJuIC0xOworCX0KKworCWlmIChoZHItPml0ZW1zMSAmIFJSTFBfUkdBMV9FUEhfRVhUX0NIRUNLKSB7CisJCWVwaF9leHRfY2hlY2sgPSByZXEgKyBwOworCQlwICs9IHNpemVvZihzdHJ1Y3QgcnJscF9yZ2FfZXBoX2V4dF9jaGVjayk7CisJCWlmIChwID4gcmVxX2xlbikKKwkJCXJldHVybiAtMTsKKwl9CisKKwlpZiAocCAhPSByZXFfbGVuKQorCQlyZXR1cm4gLTI7IC8qIG5vdCBhbGwgYnl0ZXMgY29uc3VtZWQgPz8/ICovCisKKwkvKiBQcmludCBhIHdhcm5pbmcgZm9yIHVuc3VwcG9ydGVkIHJlcXVlc3RzICovCisJaWYgKChlcGhfZXh0ICE9IE5VTEwpIHx8CisJICAgIChlcGhfZXh0X2NoZWNrICE9IE5VTEwpIHx8CisJICAgIChoZHItPml0ZW1zMCAmIChSUkxQX1JHQTBfREdQUyB8IFJSTFBfUkdBMF9BQ1FfQVNTSVNUKSkgfHwKKwkgICAgKGhkci0+aXRlbXMxICYgUlJMUF9SR0ExX1JFQUxUSU1FX0lOVCkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJbd10gVW5zdXBwb3J0ZWQgYXNzaXN0YW5jZSBkYXRhIHJlcXVlc3RlZCwgaWdub3JlZCAuLi5cbiIpOworCX0KKworCS8qIENvcHkgdGhlIHJlcXVlc3QgKi8KKwlpZiAoaGRyLT5pdGVtczAgJiBSUkxQX1JHQTBfQUxNQU5BQykKKwkJYXItPnJlcV9lbGVtcyB8PSBSUkxQX0FSX0FMTUFOQUM7CisKKwlpZiAoaGRyLT5pdGVtczAgJiBSUkxQX1JHQTBfVVRDX01PREVMKQorCQlhci0+cmVxX2VsZW1zIHw9IFJSTFBfQVJfVVRDX01PREVMOworCisJaWYgKGhkci0+aXRlbXMwICYgUlJMUF9SR0EwX0lPTk9fTU9ERUwpCisJCWFyLT5yZXFfZWxlbXMgfD0gUlJMUF9BUl9JT05PX01PREVMOworCisJaWYgKGhkci0+aXRlbXMwICYgUlJMUF9SR0EwX1JFRl9MT0MpCisJCWFyLT5yZXFfZWxlbXMgfD0gUlJMUF9BUl9SRUZfTE9DOworCisJaWYgKGhkci0+aXRlbXMwICYgUlJMUF9SR0EwX1JFRl9USU1FKQorCQlhci0+cmVxX2VsZW1zIHw9IFJSTFBfQVJfUkVGX1RJTUU7CisKKwlpZiAoaGRyLT5pdGVtczAgJiBSUkxQX1JHQTBfTkFWX01PREVMKSB7CisJCWludCBpLCBuX3N2cyA9IGVwaC0+bnNhdF90bXRvZSA+PiA0OworCQlhci0+cmVxX2VsZW1zIHw9IFJSTFBfQVJfRVBIRU1FUklTOworCQlmb3IgKGk9MDsgaTxuX3N2czsgaSsrKQorCQkJYXItPmVwaF9zdnMgfD0gKDFVTEwgPDwgKGVwaC0+c3ZzW2ldLnN2X2lkIC0gMSkpOworCX0KKworCXJldHVybiAwOworfQorCisvKiB9fX0gKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFJSTFAgZWxlbWVudHMgZmlsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0te3t7ICovCisKKwkvKiBIZWxwZXJzICovCisKK3N0YXRpYyB2b2lkCitfdHNfMjNfMDMyX3N0b3JlX2xhdGl0dWRlKGRvdWJsZSBsYXQsIHVpbnQ4X3QgKmIpCit7CisJdWludDMyX3QgeDsKKwl4ID0gKHVpbnQzMl90KSBmbG9vcihmYWJzKGxhdC85MC4wKSAqICgoZG91YmxlKSgxPDwyMykpKTsKKwlpZiAoeCA+PSAoMTw8MjMpKQorCQl4ID0gKDE8PDIzKSAtIDE7CisJaWYgKGxhdCA8IDAuMCkKKwkJeCB8PSAoMTw8MjMpOworCWJbMF0gPSAoeCA+PiAxNikgJiAweGZmOworCWJbMV0gPSAoeCA+PiAgOCkgJiAweGZmOworCWJbMl0gPSAgeCAgICAgICAgJiAweGZmOworfQorCitzdGF0aWMgdm9pZAorX3RzXzIzXzAzMl9zdG9yZV9sb25naXR1ZGUoZG91YmxlIGxvbiwgdWludDhfdCAqYikKK3sKKwlpbnQzMl90IHg7CisJeCA9IGZsb29yKChsb24vMzYwLjApICogKChkb3VibGUpKDE8PDI0KSkpOworCWlmICh4ID49ICgxPDwyMykpCisJCXggPSAweDAwN2ZmZmZmOworCWVsc2UgaWYgKHggPCAtKDE8PDIzKSkKKwkJeCA9IDB4MDA4MDAwMDA7CisJYlswXSA9ICh4ID4+IDE2KSAmIDB4ZmY7CisJYlsxXSA9ICh4ID4+ICA4KSAmIDB4ZmY7CisJYlsyXSA9ICB4ICAgICAgICAmIDB4ZmY7Cit9CisKK3N0YXRpYyB2b2lkCitfdHNfMjNfMDMyX3N0b3JlX2FsdGl0dWRlKGRvdWJsZSBhbHQsIHVpbnQ4X3QgKmIpCit7CisJaW50IGFsdF9pID0gKGludClmYWJzKGFsdCk7CisJYlswXSA9ICgoYWx0X2kgPj4gOCkgJiAweDdmKSB8IChhbHQ8MC4wID8gMHg4MCA6IDB4MDApOworCWJbMV0gPSBhbHRfaSAmIDB4ZmY7Cit9CisKKworCS8qIEZpbGwgbWV0aG9kcyAqLworCitzdGF0aWMgdm9pZAorX3JybHBfZmlsbF9uYXZpZ2F0aW9uX21vZGVsX2VsZW1lbnQoCisJc3RydWN0IE5hdk1vZGVsRWxlbWVudCAqcnJscF9ubWUsCisJc3RydWN0IGdwc19lcGhlbWVyaXNfc3YgKmdwc19lcGhfc3YpCit7CisJc3RydWN0IFVuY29tcHJlc3NlZEVwaGVtZXJpcyAqcnJscF9lcGg7CisKKwlycmxwX25tZS0+c2F0U3RhdHVzLnByZXNlbnQgPSBTYXRTdGF0dXNfUFJfbmV3U2F0ZWxsaXRlQW5kTW9kZWxVQzsKKwlycmxwX25tZS0+c2F0ZWxsaXRlSUQgPSBncHNfZXBoX3N2LT5zdl9pZDsKKworCXJybHBfZXBoID0gJnJybHBfbm1lLT5zYXRTdGF0dXMuY2hvaWNlLm5ld1NhdGVsbGl0ZUFuZE1vZGVsVUM7CisKKwlycmxwX2VwaC0+ZXBoZW1Db2RlT25MMiAgID0gZ3BzX2VwaF9zdi0+Y29kZV9vbl9sMjsKKwlycmxwX2VwaC0+ZXBoZW1VUkEgICAgICAgID0gZ3BzX2VwaF9zdi0+c3ZfdXJhOworCXJybHBfZXBoLT5lcGhlbVNWaGVhbHRoICAgPSBncHNfZXBoX3N2LT5zdl9oZWFsdGg7CisJcnJscF9lcGgtPmVwaGVtSU9EQyAgICAgICA9IGdwc19lcGhfc3YtPmlvZGM7CisJcnJscF9lcGgtPmVwaGVtTDJQZmxhZyAgICA9IGdwc19lcGhfc3YtPmwyX3BfZmxhZzsKKwlycmxwX2VwaC0+ZXBoZW1UZ2QgICAgICAgID0gZ3BzX2VwaF9zdi0+dF9nZDsKKwlycmxwX2VwaC0+ZXBoZW1Ub2MgICAgICAgID0gZ3BzX2VwaF9zdi0+dF9vYzsKKwlycmxwX2VwaC0+ZXBoZW1BRjIgICAgICAgID0gZ3BzX2VwaF9zdi0+YV9mMjsKKwlycmxwX2VwaC0+ZXBoZW1BRjEgICAgICAgID0gZ3BzX2VwaF9zdi0+YV9mMTsKKwlycmxwX2VwaC0+ZXBoZW1BRjAgICAgICAgID0gZ3BzX2VwaF9zdi0+YV9mMDsKKwlycmxwX2VwaC0+ZXBoZW1DcnMgICAgICAgID0gZ3BzX2VwaF9zdi0+Y19yczsKKwlycmxwX2VwaC0+ZXBoZW1EZWx0YU4gICAgID0gZ3BzX2VwaF9zdi0+ZGVsdGFfbjsKKwlycmxwX2VwaC0+ZXBoZW1NMCAgICAgICAgID0gZ3BzX2VwaF9zdi0+bV8wOworCXJybHBfZXBoLT5lcGhlbUN1YyAgICAgICAgPSBncHNfZXBoX3N2LT5jX3VjOworCXJybHBfZXBoLT5lcGhlbUUgICAgICAgICAgPSBncHNfZXBoX3N2LT5lOworCXJybHBfZXBoLT5lcGhlbUN1cyAgICAgICAgPSBncHNfZXBoX3N2LT5jX3VzOworCXJybHBfZXBoLT5lcGhlbUFQb3dlckhhbGYgPSBncHNfZXBoX3N2LT5hX3Bvd2hhbGY7CisJcnJscF9lcGgtPmVwaGVtVG9lICAgICAgICA9IGdwc19lcGhfc3YtPnRfb2U7CisJcnJscF9lcGgtPmVwaGVtRml0RmxhZyAgICA9IGdwc19lcGhfc3YtPmZpdF9mbGFnOworCXJybHBfZXBoLT5lcGhlbUFPREEgICAgICAgPSBncHNfZXBoX3N2LT5hb2RvOworCXJybHBfZXBoLT5lcGhlbUNpYyAgICAgICAgPSBncHNfZXBoX3N2LT5jX2ljOworCXJybHBfZXBoLT5lcGhlbU9tZWdhQTAgICAgPSBncHNfZXBoX3N2LT5vbWVnYV8wOworCXJybHBfZXBoLT5lcGhlbUNpcyAgICAgICAgPSBncHNfZXBoX3N2LT5jX2lzOworCXJybHBfZXBoLT5lcGhlbUkwICAgICAgICAgPSBncHNfZXBoX3N2LT5pXzA7CisJcnJscF9lcGgtPmVwaGVtQ3JjICAgICAgICA9IGdwc19lcGhfc3YtPmNfcmM7CisJcnJscF9lcGgtPmVwaGVtVyAgICAgICAgICA9IGdwc19lcGhfc3YtPnc7CisJcnJscF9lcGgtPmVwaGVtT21lZ2FBRG90ICA9IGdwc19lcGhfc3YtPm9tZWdhX2RvdDsKKwlycmxwX2VwaC0+ZXBoZW1JRG90ICAgICAgID0gZ3BzX2VwaF9zdi0+aWRvdDsKKworCXJybHBfZXBoLT5lcGhlbVNGMVJzdmQucmVzZXJ2ZWQxID0gZ3BzX2VwaF9zdi0+X3JzdmQxOworCXJybHBfZXBoLT5lcGhlbVNGMVJzdmQucmVzZXJ2ZWQyID0gZ3BzX2VwaF9zdi0+X3JzdmQyOworCXJybHBfZXBoLT5lcGhlbVNGMVJzdmQucmVzZXJ2ZWQzID0gZ3BzX2VwaF9zdi0+X3JzdmQzOworCXJybHBfZXBoLT5lcGhlbVNGMVJzdmQucmVzZXJ2ZWQ0ID0gZ3BzX2VwaF9zdi0+X3JzdmQ0OworfQorCitzdGF0aWMgdm9pZAorX3JybHBfZmlsbF9hbG1hbmFjX2VsZW1lbnQoCisJc3RydWN0IEFsbWFuYWNFbGVtZW50ICpycmxwX2FlLAorCXN0cnVjdCBncHNfYWxtYW5hY19zdiAqZ3BzX2FsbV9zdikKK3sKKwlycmxwX2FlLT5zYXRlbGxpdGVJRCA9IGdwc19hbG1fc3YtPnN2X2lkOworCisJcnJscF9hZS0+YWxtYW5hY0UgICAgICAgICAgPSBncHNfYWxtX3N2LT5lOworCXJybHBfYWUtPmFsYW1hbmFjVG9hICAgICAgID0gZ3BzX2FsbV9zdi0+dF9vYTsKKwlycmxwX2FlLT5hbG1hbmFjS3NpaSAgICAgICA9IGdwc19hbG1fc3YtPmtzaWk7CisJcnJscF9hZS0+YWxtYW5hY09tZWdhRG90ICAgPSBncHNfYWxtX3N2LT5vbWVnYV9kb3Q7CisJcnJscF9hZS0+YWxtYW5hY1NWaGVhbHRoICAgPSBncHNfYWxtX3N2LT5zdl9oZWFsdGg7CisJcnJscF9hZS0+YWxtYW5hY0FQb3dlckhhbGYgPSBncHNfYWxtX3N2LT5hX3Bvd2hhbGY7CisJcnJscF9hZS0+YWxtYW5hY09tZWdhMCAgICAgPSBncHNfYWxtX3N2LT5vbWVnYV8wOworCXJybHBfYWUtPmFsbWFuYWNXICAgICAgICAgID0gZ3BzX2FsbV9zdi0+dzsKKwlycmxwX2FlLT5hbG1hbmFjTTAgICAgICAgICA9IGdwc19hbG1fc3YtPm1fMDsKKwlycmxwX2FlLT5hbG1hbmFjQUYwICAgICAgICA9IGdwc19hbG1fc3YtPmFfZjA7CisJcnJscF9hZS0+YWxtYW5hY0FGMSAgICAgICAgPSBncHNfYWxtX3N2LT5hX2YxOworCit9CisKK3N0YXRpYyB2b2lkCitfcnJscF9maWxsX2lvbm9zcGhlcmljX21vZGVsKAorCXN0cnVjdCBJb25vc3BoZXJpY01vZGVsICpycmxwX2lvbm8sCisJc3RydWN0IGdwc19pb25vc3BoZXJlX21vZGVsICpncHNfaW9ubykKK3sKKwlycmxwX2lvbm8tPmFsZmEwID0gZ3BzX2lvbm8tPmFscGhhXzA7CisJcnJscF9pb25vLT5hbGZhMSA9IGdwc19pb25vLT5hbHBoYV8xOworCXJybHBfaW9uby0+YWxmYTIgPSBncHNfaW9uby0+YWxwaGFfMjsKKwlycmxwX2lvbm8tPmFsZmEzID0gZ3BzX2lvbm8tPmFscGhhXzM7CisJcnJscF9pb25vLT5iZXRhMCA9IGdwc19pb25vLT5iZXRhXzA7CisJcnJscF9pb25vLT5iZXRhMSA9IGdwc19pb25vLT5iZXRhXzE7CisJcnJscF9pb25vLT5iZXRhMiA9IGdwc19pb25vLT5iZXRhXzI7CisJcnJscF9pb25vLT5iZXRhMyA9IGdwc19pb25vLT5iZXRhXzM7Cit9CisKK3N0YXRpYyB2b2lkCitfcnJscF9maWxsX3V0Y19tb2RlbCgKKwlzdHJ1Y3QgVVRDTW9kZWwgKnJybHBfdXRjLAorCXN0cnVjdCBncHNfdXRjX21vZGVsICpncHNfdXRjKQoreworCXJybHBfdXRjLT51dGNBMSAgICAgICAgPSBncHNfdXRjLT5hMTsKKwlycmxwX3V0Yy0+dXRjQTAgICAgICAgID0gZ3BzX3V0Yy0+YTA7CisJcnJscF91dGMtPnV0Y1RvdCAgICAgICA9IGdwc191dGMtPnRfb3Q7CisJcnJscF91dGMtPnV0Y1dOdCAgICAgICA9IGdwc191dGMtPnduX3QgJiAweGZmOworCXJybHBfdXRjLT51dGNEZWx0YVRscyAgPSBncHNfdXRjLT5kZWx0YV90X2xzOworCXJybHBfdXRjLT51dGNXTmxzZiAgICAgPSBncHNfdXRjLT53bl9sc2YgJiAweGZmOworCXJybHBfdXRjLT51dGNETiAgICAgICAgPSBncHNfdXRjLT5kbjsKKwlycmxwX3V0Yy0+dXRjRGVsdGFUbHNmID0gZ3BzX3V0Yy0+ZGVsdGFfdF9sc2Y7Cit9CisKKy8qIH19fSAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogUlJMUCBBc3Npc3RhbmNlIFBEVSBHZW5lcmF0aW9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS17e3sgKi8KKworc3RydWN0IFBEVSAqCitfcnJscF9jcmVhdGVfZ3BzX2Fzc2lzdF9wZHUoaW50IHJlZm51bSwgc3RydWN0IEdQU19Bc3Npc3REYXRhICoqb19ncHNfYWQpCit7CisJc3RydWN0IFBEVSAqcGR1OworCXN0cnVjdCBHUFNfQXNzaXN0RGF0YSAqZ3BzX2FkOworCisJcGR1ID0gY2FsbG9jKDEsIHNpemVvZigqcGR1KSk7CisJaWYgKCFwZHUpCisJCXJldHVybiBOVUxMOworCisJZ3BzX2FkID0gY2FsbG9jKDEsIHNpemVvZigqZ3BzX2FkKSk7CisJaWYgKCFncHNfYWQpIHsKKwkJZnJlZShwZHUpOworCQlyZXR1cm4gTlVMTDsKKwl9CisKKwlpZiAob19ncHNfYWQpCisJCSpvX2dwc19hZCA9IGdwc19hZDsKKworCXBkdS0+cmVmZXJlbmNlTnVtYmVyID0gcmVmbnVtOworCXBkdS0+Y29tcG9uZW50LnByZXNlbnQgPSBSUkxQX0NvbXBvbmVudF9QUl9hc3Npc3RhbmNlRGF0YTsKKwlwZHUtPmNvbXBvbmVudC5jaG9pY2UuYXNzaXN0YW5jZURhdGEuZ3BzX0Fzc2lzdERhdGEgPSBncHNfYWQ7CisKKwlyZXR1cm4gcGR1OworfQorCitzdGF0aWMgaW50CitfcnJscF9hZGRfaW9ub3NwaGVyaWNfbW9kZWwoCisJc3RydWN0IEdQU19Bc3Npc3REYXRhICpycmxwX2dwc19hZCwKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHNfYWQpCit7CisJc3RydWN0IElvbm9zcGhlcmljTW9kZWwgKnJybHBfaW9ubzsKKworCWlmICghKGdwc19hZC0+ZmllbGRzICYgR1BTX0ZJRUxEX0lPTk9TUEhFUkUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJybHBfaW9ubyA9IGNhbGxvYygxLCBzaXplb2YoKnJybHBfaW9ubykpOworCWlmICghcnJscF9pb25vKQorCQlyZXR1cm4gLUVOT01FTTsKKwlycmxwX2dwc19hZC0+Y29udHJvbEhlYWRlci5pb25vc3BoZXJpY01vZGVsID0gcnJscF9pb25vOworCisJX3JybHBfZmlsbF9pb25vc3BoZXJpY19tb2RlbChycmxwX2lvbm8sICZncHNfYWQtPmlvbm9zcGhlcmUpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQKK19ycmxwX2FkZF91dGNfbW9kZWwoCisJc3RydWN0IEdQU19Bc3Npc3REYXRhICpycmxwX2dwc19hZCwKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHNfYWQpCit7CisJc3RydWN0IFVUQ01vZGVsICpycmxwX3V0YzsKKworCWlmICghKGdwc19hZC0+ZmllbGRzICYgR1BTX0ZJRUxEX1VUQykpCisJCXJldHVybiAtRUlOVkFMOworCisJcnJscF91dGMgPSBjYWxsb2MoMSwgc2l6ZW9mKCpycmxwX3V0YykpOworCWlmICghcnJscF91dGMpCisJCXJldHVybiAtRU5PTUVNOworCXJybHBfZ3BzX2FkLT5jb250cm9sSGVhZGVyLnV0Y01vZGVsID0gcnJscF91dGM7CisKKwlfcnJscF9maWxsX3V0Y19tb2RlbChycmxwX3V0YywgJmdwc19hZC0+dXRjKTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitfcnJscF9hZGRfcmVmZXJlbmNlX2xvY2F0aW9uKAorCXN0cnVjdCBHUFNfQXNzaXN0RGF0YSAqcnJscF9ncHNfYWQsCisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzX2FkKQoreworCXN0cnVjdCBSZWZMb2NhdGlvbiAqcnJscF9yZWZsb2M7CisJdWludDhfdCAqYjsKKworCWlmICghKGdwc19hZC0+ZmllbGRzICYgR1BTX0ZJRUxEX1JFRlBPUykpCisJCXJldHVybiAtRUlOVkFMOworCisJcnJscF9yZWZsb2MgPSBjYWxsb2MoMSwgc2l6ZW9mKCpycmxwX3JlZmxvYykpOworCWlmICghcnJscF9yZWZsb2MpCisJCXJldHVybiAtRU5PTUVNOworCXJybHBfZ3BzX2FkLT5jb250cm9sSGVhZGVyLnJlZkxvY2F0aW9uID0gcnJscF9yZWZsb2M7CisKKwliID0gbWFsbG9jKDkpOworCisJYlswXSA9IDB4ODA7IC8qIEVsbGlwc29pZCBQb2ludCB3aXRoIGFsdGl0dWRlICovCisJX3RzXzIzXzAzMl9zdG9yZV9sYXRpdHVkZShncHNfYWQtPnJlZl9wb3MubGF0aXR1ZGUsICZiWzFdKTsKKwlfdHNfMjNfMDMyX3N0b3JlX2xvbmdpdHVkZShncHNfYWQtPnJlZl9wb3MubG9uZ2l0dWRlLCAmYls0XSk7CisJX3RzXzIzXzAzMl9zdG9yZV9hbHRpdHVkZShncHNfYWQtPnJlZl9wb3MuYWx0aXR1ZGUsICZiWzddKTsKKworCXJybHBfcmVmbG9jLT50aHJlZURMb2NhdGlvbi5idWYgPSBiOworCXJybHBfcmVmbG9jLT50aHJlZURMb2NhdGlvbi5zaXplID0gOTsKKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitfcnJscF9hZGRfcmVmZXJlbmNlX3RpbWUoCisJc3RydWN0IEdQU19Bc3Npc3REYXRhICpycmxwX2dwc19hZCwKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHNfYWQpCit7CisJc3RydWN0IFJlZmVyZW5jZVRpbWUgKnJybHBfcmVmdGltZTsKKworCWlmICghKGdwc19hZC0+ZmllbGRzICYgR1BTX0ZJRUxEX1JFRlRJTUUpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJybHBfcmVmdGltZSA9IGNhbGxvYygxLCBzaXplb2YoKnJybHBfcmVmdGltZSkpOworCWlmICghcnJscF9yZWZ0aW1lKQorCQlyZXR1cm4gLUVOT01FTTsKKwlycmxwX2dwc19hZC0+Y29udHJvbEhlYWRlci5yZWZlcmVuY2VUaW1lID0gcnJscF9yZWZ0aW1lOworCisJcnJscF9yZWZ0aW1lLT5ncHNUaW1lLmdwc1dlZWsgICA9IGdwc19hZC0+cmVmX3RpbWUud24gJiAweDNmZjsgLyogMTBiICovCisJcnJscF9yZWZ0aW1lLT5ncHNUaW1lLmdwc1RPVzIzYiA9CisJCSgoaW50KWZsb29yKGdwc19hZC0+cmVmX3RpbWUudG93IC8gMC4wOCkpICYgMHg3ZmZmZmY7ICAvKiAyM2IgKi8KKworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50CitfcnJscF9hZGRfYWxtYW5hYygKKwlzdHJ1Y3QgR1BTX0Fzc2lzdERhdGEgKnJybHBfZ3BzX2FkLAorCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwc19hZCwgaW50ICpzdGFydCwgaW50IGNvdW50KQoreworCWludCBpOworCXN0cnVjdCBBbG1hbmFjICpycmxwX2FsbTsKKwlzdHJ1Y3QgZ3BzX2FsbWFuYWMgKmdwc19hbG0gPSAmZ3BzX2FkLT5hbG1hbmFjOworCisJaWYgKCEoZ3BzX2FkLT5maWVsZHMgJiBHUFNfRklFTERfQUxNQU5BQykpCisJCXJldHVybiAtRUlOVkFMOworCisJcnJscF9hbG0gPSBjYWxsb2MoMSwgc2l6ZW9mKCpycmxwX2FsbSkpOworCWlmICghcnJscF9hbG0pCisJCXJldHVybiAtRU5PTUVNOworCXJybHBfZ3BzX2FkLT5jb250cm9sSGVhZGVyLmFsbWFuYWMgPSBycmxwX2FsbTsKKworCXJybHBfYWxtLT5hbGFtYW5hY1dOYSA9IGdwc19hbG0tPnduYTsKKwlpZiAoY291bnQgPT0gLTEpCisJCWNvdW50ID0gZ3BzX2FsbS0+bl9zdiAtICpzdGFydDsKKwlmb3IgKGk9KnN0YXJ0OyAoaTwqc3RhcnQrY291bnQpICYmIChpPGdwc19hbG0tPm5fc3YpOyBpKyspIHsKKwkJc3RydWN0IEFsbWFuYWNFbGVtZW50ICphZTsKKwkJYWUgPSBjYWxsb2MoMSwgc2l6ZW9mKCphZSkpOworCQlpZiAoIWFlKQorCQkJcmV0dXJuIC1FTk9NRU07CisJCV9ycmxwX2ZpbGxfYWxtYW5hY19lbGVtZW50KGFlLCAmZ3BzX2FsbS0+c3ZzW2ldKTsKKwkJQVNOX1NFUVVFTkNFX0FERCgmcnJscF9hbG0tPmFsbWFuYWNMaXN0Lmxpc3QsIGFlKTsKKwl9CisKKwkqc3RhcnQgPSBpOworCisJcmV0dXJuIGkgPCBncHNfYWxtLT5uX3N2OworfQorCitzdGF0aWMgaW50CitfcnJscF9hZGRfZXBoZW1lcmlzKAorCXN0cnVjdCBHUFNfQXNzaXN0RGF0YSAqcnJscF9ncHNfYWQsCisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzX2FkLCBpbnQgKnN0YXJ0LCBpbnQgY291bnQsIHVpbnQ2NF90IG1hc2spCit7CisJaW50IGksIGo7CisJc3RydWN0IE5hdmlnYXRpb25Nb2RlbCAqcnJscF9uYXY7CisJc3RydWN0IGdwc19lcGhlbWVyaXMgKmdwc19lcGggPSAmZ3BzX2FkLT5lcGhlbWVyaXM7CisKKwlpZiAoIShncHNfYWQtPmZpZWxkcyAmIEdQU19GSUVMRF9FUEhFTUVSSVMpKQorCQlyZXR1cm4gLUVJTlZBTDsKKworCXJybHBfbmF2ID0gY2FsbG9jKDEsIHNpemVvZigqcnJscF9uYXYpKTsKKwlpZiAoIXJybHBfbmF2KQorCQlyZXR1cm4gLUVOT01FTTsKKwlycmxwX2dwc19hZC0+Y29udHJvbEhlYWRlci5uYXZpZ2F0aW9uTW9kZWwgPSBycmxwX25hdjsKKworCWlmIChjb3VudCA9PSAtMSkKKwkJY291bnQgPSBncHNfZXBoLT5uX3N2IC0gKnN0YXJ0OworCWZvciAoaT0qc3RhcnQsaj0wOyAoajxjb3VudCkgJiYgKGk8Z3BzX2VwaC0+bl9zdik7IGkrKykgeworCQlpZiAoIShtYXNrICYgKDFVTEw8PChncHNfZXBoLT5zdnNbaV0uc3ZfaWQtMSkpKSkKKwkJCWNvbnRpbnVlOworCQlzdHJ1Y3QgTmF2TW9kZWxFbGVtZW50ICpubWU7CisJCW5tZSA9IGNhbGxvYygxLCBzaXplb2YoKm5tZSkpOworCQlpZiAoIW5tZSkKKwkJCXJldHVybiAtRU5PTUVNOworCQlfcnJscF9maWxsX25hdmlnYXRpb25fbW9kZWxfZWxlbWVudChubWUsICZncHNfZXBoLT5zdnNbaV0pOworCQlBU05fU0VRVUVOQ0VfQUREKCZycmxwX25hdi0+bmF2TW9kZWxMaXN0Lmxpc3QsIG5tZSk7CisJCWorKzsKKwl9CisKKwkqc3RhcnQgPSBpOworCisJcmV0dXJuIGkgPCBncHNfZXBoLT5uX3N2OworfQorCisKKyNkZWZpbmUgTUFYX1BEVVMgNjQKKworaW50CitycmxwX2dwc19hc3Npc3RfcGR1cygKKwlzdHJ1Y3QgZ3BzX2Fzc2lzdF9kYXRhICpncHNfYWQsIHN0cnVjdCBycmxwX2Fzc2lzdF9yZXEgKnJlcSwKKwl2b2lkICoqb19wZHUsIGludCAqb19sZW4sIGludCBvX21heF9wZHVzKQoreworCXN0cnVjdCBQRFUgKmxzdF9wZHVbTUFYX1BEVVNdOworCWludCBsc3RfY250ID0gMDsKKworCXN0cnVjdCBQRFUgKnJybHBfcGR1ID0gTlVMTDsKKwlzdHJ1Y3QgR1BTX0Fzc2lzdERhdGEgKnJybHBfZ3BzX2FkID0gTlVMTDsKKwl1aW50MzJfdCByZSA9IHJlcS0+cmVxX2VsZW1zOworCWludCBpLCBydiA9IDA7CisKKwkvKiBJb25vc3BoZXJpY01vZGVsLCBVVENNb2RlbCwgUmVmTG9jYXRpb24sIFJlZmVyZW5jZVRpbWUgKi8KKwlpZiAocmUgJiAoUlJMUF9BUl9JT05PX01PREVMIHwKKwkgICAgICAgICAgUlJMUF9BUl9VVENfTU9ERUwgfAorCSAgICAgICAgICBSUkxQX0FSX1JFRl9USU1FIHwKKwkgICAgICAgICAgUlJMUF9BUl9SRUZfTE9DKSkKKwl7CisJCWludCBwZHVfaGFzX2RhdGEgPSAwOworCisJCXJybHBfcGR1ID0gX3JybHBfY3JlYXRlX2dwc19hc3Npc3RfcGR1KDEsICZycmxwX2dwc19hZCk7CisJCWlmICghcnJscF9wZHUpIHsKKwkJCXJ2ID0gLUVOT01FTTsKKwkJCWdvdG8gZXJyb3I7CisJCX0KKworCQlpZiAocmUgJiBSUkxQX0FSX0lPTk9fTU9ERUwpCisJCQlpZiAoIV9ycmxwX2FkZF9pb25vc3BoZXJpY19tb2RlbChycmxwX2dwc19hZCwgZ3BzX2FkKSkKKwkJCQlwZHVfaGFzX2RhdGEgPSAxOworCisJCWlmIChyZSAmIFJSTFBfQVJfVVRDX01PREVMKQorCQkJaWYgKCFfcnJscF9hZGRfdXRjX21vZGVsKHJybHBfZ3BzX2FkLCBncHNfYWQpKQorCQkJCXBkdV9oYXNfZGF0YSA9IDE7CisKKwkJaWYgKHJlICYgUlJMUF9BUl9SRUZfVElNRSkKKwkJCWlmICghX3JybHBfYWRkX3JlZmVyZW5jZV90aW1lKHJybHBfZ3BzX2FkLCBncHNfYWQpKQorCQkJCXBkdV9oYXNfZGF0YSA9IDE7CisKKwkJaWYgKHJlICYgUlJMUF9BUl9SRUZfTE9DKQorCQkJaWYgKCFfcnJscF9hZGRfcmVmZXJlbmNlX2xvY2F0aW9uKHJybHBfZ3BzX2FkLCBncHNfYWQpKQorCQkJCXBkdV9oYXNfZGF0YSA9IDE7CisKKwkJaWYgKHBkdV9oYXNfZGF0YSkgeworCQkJbHN0X3BkdVtsc3RfY250KytdID0gcnJscF9wZHU7CisJCQlycmxwX3BkdSA9IE5VTEw7CisJCX0KKwl9CisKKwkvKiBBbG1hbmFjICovCisJaWYgKHJlICYgUlJMUF9BUl9BTE1BTkFDKSB7CisJCWkgPSAwOworCQlkbyB7CisJCQlpZiAoIShncHNfYWQtPmZpZWxkcyAmIEdQU19GSUVMRF9BTE1BTkFDKSkKKwkJCQlicmVhazsKKworCQkJaWYgKCFycmxwX3BkdSkgeworCQkJCXJybHBfcGR1ID0gX3JybHBfY3JlYXRlX2dwc19hc3Npc3RfcGR1KDEsICZycmxwX2dwc19hZCk7CisJCQkJaWYgKCFycmxwX3BkdSkgeworCQkJCQlydiA9IC1FTk9NRU07CisJCQkJCWdvdG8gZXJyb3I7CisJCQkJfQorCQkJfQorCisJCQlydiA9IF9ycmxwX2FkZF9hbG1hbmFjKHJybHBfZ3BzX2FkLCBncHNfYWQsICZpLCAxMCk7CisJCQlpZiAocnYgPCAwKQorCQkJCWdvdG8gZXJyb3I7CisKKwkJCWxzdF9wZHVbbHN0X2NudCsrXSA9IHJybHBfcGR1OworCQkJcnJscF9wZHUgPSBOVUxMOworCQl9IHdoaWxlIChydik7CisJfQorCisJLyogRXBoZW1lcmlzICovCisJaWYgKHJlICYgUlJMUF9BUl9FUEhFTUVSSVMpIHsKKwkJaSA9IDA7CisJCWRvIHsKKwkJCWlmICghKGdwc19hZC0+ZmllbGRzICYgR1BTX0ZJRUxEX0VQSEVNRVJJUykpCisJCQkJYnJlYWs7CisKKwkJCWlmICghcnJscF9wZHUpIHsKKwkJCQlycmxwX3BkdSA9IF9ycmxwX2NyZWF0ZV9ncHNfYXNzaXN0X3BkdSgxLCAmcnJscF9ncHNfYWQpOworCQkJCWlmICghcnJscF9wZHUpIHsKKwkJCQkJcnYgPSAtRU5PTUVNOworCQkJCQlnb3RvIGVycm9yOworCQkJCX0KKwkJCX0KKworCQkJcnYgPSBfcnJscF9hZGRfZXBoZW1lcmlzKHJybHBfZ3BzX2FkLCBncHNfYWQsICZpLCAyLCByZXEtPmVwaF9zdnMpOworCisJCQlsc3RfcGR1W2xzdF9jbnQrK10gPSBycmxwX3BkdTsKKwkJCXJybHBfcGR1ID0gTlVMTDsKKworCQl9IHdoaWxlIChydik7CisJfQorCisJLyogU2VyaWFsaXplICYgUmVsZWFzZSBhbGwgUERVcyAqLworCWZvciAoaT0wOyBpPGxzdF9jbnQgJiYgaTxvX21heF9wZHVzOyBpKyspIHsKKwkJLyogUHNldWRvIHNlZ21lbnRhdGlvbiBmbGFncyAqLworCQlNb3JlQXNzRGF0YVRvQmVTZW50X3QgKm1hZCA9IGNhbGxvYygxLCBzaXplb2YoKm1hZCkpOworCQkqbWFkID0gKGkgPT0gKGxzdF9jbnQtMSkpID8KKwkJCQlNb3JlQXNzRGF0YVRvQmVTZW50X25vTW9yZU1lc3NhZ2VzIDoKKwkJCQlNb3JlQXNzRGF0YVRvQmVTZW50X21vcmVNZXNzYWdlc09uVGhlV2F5OworCQlsc3RfcGR1W2ldLT5jb21wb25lbnQuY2hvaWNlLmFzc2lzdGFuY2VEYXRhLm1vcmVBc3NEYXRhVG9CZVNlbnQgPSBtYWQ7CisKKwkJLyogU2VyaWFsaXphdGlvbiAqLworCQkvLyBhc25fZnByaW50KHN0ZG91dCwgJmFzbl9ERUZfUERVLCBsc3RfcGR1W2ldKTsKKwkJcnYgPSB1cGVyX2VuY29kZV90b19uZXdfYnVmZmVyKCZhc25fREVGX1BEVSwgTlVMTCwgbHN0X3BkdVtpXSwgJm9fcGR1W2ldKTsKKwkJaWYgKHJ2IDwgMCkKKwkJCWdvdG8gZXJyb3I7CisJCW9fbGVuW2ldID0gcnY7CisJfQorCisJcnYgPSBsc3RfY250OworCisJLyogUmVsZWFzZSBBU04uMSBvYmplY3RzICovCitlcnJvcjoKKwlpZiAocnJscF9wZHUpCisJCWFzbl9ERUZfUERVLmZyZWVfc3RydWN0KCZhc25fREVGX1BEVSwgKHZvaWQqKXJybHBfcGR1LCAwKTsKKworCWZvciAoaT0wOyBpPGxzdF9jbnQ7IGkrKykKKwkJYXNuX0RFRl9QRFUuZnJlZV9zdHJ1Y3QoJmFzbl9ERUZfUERVLCBsc3RfcGR1W2ldLCAwKTsKKworCXJldHVybiBydjsKK30KKworLyogfX19ICovCisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL3JybHAuaCBiL3JybHAtZXBoZW1lcmlzL3JybHAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNWU0MzQ0Ci0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvcnJscC5oCkBAIC0wLDAgKzEsNjQgQEAKKy8qCisgKiBycmxwLmgKKyAqCisgKiBSUkxQIEhlYWRlcgorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFN5bHZhaW4gTXVuYXV0IDx0bnRAMjQ2dE50LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpZm5kZWYgX19SUkxQX0hfXworI2RlZmluZSBfX1JSTFBfSF9fCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgImdwcy5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworLyogT3VyIGludGVybmFsIHNpbXBsaWZpZWQgc3RydWN0dXJlIGZvciByZXF1ZXN0cyAqLworCisjZGVmaW5lIFJSTFBfQVJfUkVGX0xPQwkJKDE8PDApCisjZGVmaW5lIFJSTFBfQVJfUkVGX1RJTUUJKDE8PDEpCisjZGVmaW5lIFJSTFBfQVJfVVRDX01PREVMCSgxPDwyKQorI2RlZmluZSBSUkxQX0FSX0lPTk9fTU9ERUwJKDE8PDMpCisjZGVmaW5lIFJSTFBfQVJfQUxNQU5BQwkJKDE8PDQpCisjZGVmaW5lIFJSTFBfQVJfRVBIRU1FUklTCSgxPDw1KQorCitzdHJ1Y3QgcnJscF9hc3Npc3RfcmVxIHsKKwl1aW50MzJfdCByZXFfZWxlbXM7CisJdWludDY0X3QgZXBoX3N2czsKK307CisKKworLyogTWV0aG9kcyAqLworaW50IHJybHBfZGVjb2RlX2Fzc2lzdGFuY2VfcmVxdWVzdChzdHJ1Y3QgcnJscF9hc3Npc3RfcmVxICphciwKKwl2b2lkICpyZXEsIGludCByZXFfbGVuKTsKKworaW50IHJybHBfZ3BzX2Fzc2lzdF9wZHVzKAorCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwc19hZCwgc3RydWN0IHJybHBfYXNzaXN0X3JlcSAqcmVxLAorCXZvaWQgKipvX3BkdSwgaW50ICpvX2xlbiwgaW50IG9fbWF4X3BkdXMpOworCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBfX1JSTFBfSF9fICovCisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL3VieC1wYXJzZS5jIGIvcnJscC1lcGhlbWVyaXMvdWJ4LXBhcnNlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNkMGY3MAotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL3VieC1wYXJzZS5jCkBAIC0wLDAgKzEsMTc3IEBACisvKgorICogdWJ4LXBhcnNlLmMKKyAqCisgKiBJbXBsZW1lbnRhdGlvbiBvZiBwYXJzaW5nIGNvZGUgY29udmVydGluZyBVQlggbWVzc2FnZXMgdG8gR1BTIGFzc2lzdAorICogZGF0YQorICoKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDkgIFN5bHZhaW4gTXVuYXV0IDx0bnRAMjQ2dE50LmNvbT4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTogeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQorICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkKKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisgKiAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKyAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisgKgorICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LgorICovCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAiZ3BzLmgiCisjaW5jbHVkZSAidWJ4LmgiCisjaW5jbHVkZSAidWJ4LXBhcnNlLmgiCisKKworLyogSGVscGVycyAqLworCitzdGF0aWMgaW50CitmbG9hdF90b19maXhlZHBvaW50KGZsb2F0IGYsIGludCBzZikKK3sKKwlpZiAoc2YgPCAwKSB7CisJCXdoaWxlIChzZisrIDwgMCkKKwkJCWYgKj0gMi4wZjsKKwl9IGVsc2UgeworCQl3aGlsZSAoc2YtLSA+IDApCisJCQlmICo9IDAuNWY7CisJfQorCisJcmV0dXJuIChpbnQpZjsKK30KKworc3RhdGljIGlubGluZSBpbnQKK2RvdWJsZV90b19maXhlZHBvaW50KGRvdWJsZSBkLCBpbnQgc2YpCit7CisJaWYgKHNmIDwgMCkgeworCQl3aGlsZSAoc2YrKyA8IDApCisJCQlkICo9IDIuMDsKKwl9IGVsc2UgeworCQl3aGlsZSAoc2YtLSA+IDApCisJCQlkICo9IDAuNTsKKwl9CisKKwlyZXR1cm4gKGludClkOworfQorCisKKy8qIFVCWCBtZXNzYWdlIHBhcnNpbmcgdG8gZmlsbCBncHMgYXNzaXN0IGRhdGEgKi8KKworc3RhdGljIHZvaWQKK191YnhfbXNnX3BhcnNlX25hdl9wb3NsbGgoc3RydWN0IHVieF9oZHIgKmhkciwgdm9pZCAqcGwsIGludCBwbF9sZW4sIHZvaWQgKnVkKQoreworCXN0cnVjdCB1YnhfbmF2X3Bvc2xsaCAqbmF2X3Bvc2xsaCA9IHBsOworCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwcyA9IHVkOworCisJLy9wcmludGYoIlsuXSBOQVZfUE9TTExIXG4iKTsKKworCWdwcy0+ZmllbGRzIHw9IEdQU19GSUVMRF9SRUZQT1M7CisKKwlncHMtPnJlZl9wb3MubGF0aXR1ZGUgID0gKGRvdWJsZSkobmF2X3Bvc2xsaC0+bGF0KSAqIDFlLTc7CisJZ3BzLT5yZWZfcG9zLmxvbmdpdHVkZSA9IChkb3VibGUpKG5hdl9wb3NsbGgtPmxvbikgKiAxZS03OworCWdwcy0+cmVmX3Bvcy5hbHRpdHVkZSAgPSAoZG91YmxlKShuYXZfcG9zbGxoLT5oZWlnaHQpICogMWUtMzsKK30KKworc3RhdGljIHZvaWQKK191YnhfbXNnX3BhcnNlX2FpZF9pbmkoc3RydWN0IHVieF9oZHIgKmhkciwgdm9pZCAqcGwsIGludCBwbF9sZW4sIHZvaWQgKnVkKQoreworCXN0cnVjdCB1YnhfYWlkX2luaSAqYWlkX2luaSA9IHBsOworCXN0cnVjdCBncHNfYXNzaXN0X2RhdGEgKmdwcyA9IHVkOworCisJLy9wcmludGYoIlsuXSBBSURfSU5JXG4iKTsKKworCS8qIEV4dHJhY3QgaW5mbyBmb3IgIlJlZmVyZW5jZSBUaW1lIiAqLworCWdwcy0+ZmllbGRzIHw9IEdQU19GSUVMRF9SRUZUSU1FOworCisJZ3BzLT5yZWZfdGltZS53biA9IGFpZF9pbmktPnduOworCWdwcy0+cmVmX3RpbWUudG93ID0gKGRvdWJsZSlhaWRfaW5pLT50b3cgKiAxZS0zOworCisJLy8gRklYTUU6IFdlIGNvdWxkIGV4dHJhY3QgcmVmIHBvc2l0aW9uIGFzIHdlbGwgYnV0IHdlIG5lZWQgaXQgaW4KKwkvLyAgICAgICAgV0dTODQgZ2VvZGV0aWMgY29vcmRpbmF0ZXMgYW5kIGl0J3MgcHJvdmlkZWQgYXMgZWNlZiwgc28KKwkvLyAgICAgICAgd2UgbmVlZCBhIGxvdCBvZiBtYXRoIC4uLgorfQorCitzdGF0aWMgdm9pZAorX3VieF9tc2dfcGFyc2VfYWlkX2h1aShzdHJ1Y3QgdWJ4X2hkciAqaGRyLCB2b2lkICpwbCwgaW50IHBsX2xlbiwgdm9pZCAqdWQpCit7CisJc3RydWN0IHVieF9haWRfaHVpICphaWRfaHVpID0gcGw7CisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzID0gdWQ7CisKKwkvL3ByaW50ZigiWy5dIEFJRF9IVUlcbiIpOworCisJaWYgKGFpZF9odWktPmZsYWdzICYgMHgyKSB7IC8qIFVUQyBwYXJhbWV0ZXJzIHZhbGlkICovCisJCXN0cnVjdCBncHNfdXRjX21vZGVsICp1dGMgPSAmZ3BzLT51dGM7CisKKwkJZ3BzLT5maWVsZHMgfD0gR1BTX0ZJRUxEX1VUQzsKKworCQl1dGMtPmEwICAgICAgICAgID0gZG91YmxlX3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+dXRjX2EwLCAtMzApOworCQl1dGMtPmExICAgICAgICAgID0gZG91YmxlX3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+dXRjX2ExLCAtNTApOworCQl1dGMtPmRlbHRhX3RfbHMgID0gYWlkX2h1aS0+dXRjX2xzOworCQl1dGMtPnRfb3QgICAgICAgID0gYWlkX2h1aS0+dXRjX3RvdCA+PiAxMjsKKwkJdXRjLT53bl90ICAgICAgICA9IGFpZF9odWktPnV0Y193bnQ7CisJCXV0Yy0+d25fbHNmICAgICAgPSBhaWRfaHVpLT51dGNfd25mOworCQl1dGMtPmRuICAgICAgICAgID0gYWlkX2h1aS0+dXRjX2RuOworCQl1dGMtPmRlbHRhX3RfbHNmID0gYWlkX2h1aS0+dXRjX2xzZjsKKwl9CisKKwlpZiAoYWlkX2h1aS0+ZmxhZ3MgJiAweDA0KSB7IC8qIEtsb2J1Y2hhciBwYXJhbWV0ZXJzIHZhbGlkICovCisJCXN0cnVjdCBncHNfaW9ub3NwaGVyZV9tb2RlbCAqaW9ubyA9ICZncHMtPmlvbm9zcGhlcmU7CisKKwkJZ3BzLT5maWVsZHMgfD0gR1BTX0ZJRUxEX0lPTk9TUEhFUkU7CisKKwkJaW9uby0+YWxwaGFfMCA9IGZsb2F0X3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+a2xvYl9hMCwgLTMwKTsKKwkJaW9uby0+YWxwaGFfMSA9IGZsb2F0X3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+a2xvYl9hMSwgLTI3KTsKKwkJaW9uby0+YWxwaGFfMiA9IGZsb2F0X3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+a2xvYl9hMiwgLTI0KTsKKwkJaW9uby0+YWxwaGFfMyA9IGZsb2F0X3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+a2xvYl9hMywgLTI0KTsKKwkJaW9uby0+YmV0YV8wID0gZmxvYXRfdG9fZml4ZWRwb2ludChhaWRfaHVpLT5rbG9iX2IwLCAxMSk7CisJCWlvbm8tPmJldGFfMSA9IGZsb2F0X3RvX2ZpeGVkcG9pbnQoYWlkX2h1aS0+a2xvYl9iMSwgMTQpOworCQlpb25vLT5iZXRhXzIgPSBmbG9hdF90b19maXhlZHBvaW50KGFpZF9odWktPmtsb2JfYjIsIDE2KTsKKwkJaW9uby0+YmV0YV8zID0gZmxvYXRfdG9fZml4ZWRwb2ludChhaWRfaHVpLT5rbG9iX2IzLCAxNik7CisJfQorfQorCitzdGF0aWMgdm9pZAorX3VieF9tc2dfcGFyc2VfYWlkX2FsbShzdHJ1Y3QgdWJ4X2hkciAqaGRyLCB2b2lkICpwbCwgaW50IHBsX2xlbiwgdm9pZCAqdWQpCit7CisJc3RydWN0IHVieF9haWRfYWxtICphaWRfYWxtID0gcGw7CisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzID0gdWQ7CisKKwkvL3ByaW50ZigiWy5dIEFJRF9BTE0gJWQgLSAlZFxuIiwgYWlkX2FsbS0+c3ZfaWQsIGFpZF9hbG0tPmdwc193ZWVrKTsKKworCWlmIChhaWRfYWxtLT5ncHNfd2VlaykgeworCQlncHMtPmZpZWxkcyB8PSBHUFNfRklFTERfQUxNQU5BQzsKKwkJZ3BzLT5hbG1hbmFjLnduYSA9IGFpZF9hbG0tPmdwc193ZWVrICYgMHhmZjsKKwkJZ3BzX3VucGFja19zZjQ1X2FsbWFuYWMoYWlkX2FsbS0+YWxtX3dvcmRzLCAmZ3BzLT5hbG1hbmFjLnN2c1tncHMtPmFsbWFuYWMubl9zdisrXSk7CisJfQorfQorCitzdGF0aWMgdm9pZAorX3VieF9tc2dfcGFyc2VfYWlkX2VwaChzdHJ1Y3QgdWJ4X2hkciAqaGRyLCB2b2lkICpwbCwgaW50IHBsX2xlbiwgdm9pZCAqdWQpCit7CisJc3RydWN0IHVieF9haWRfZXBoICphaWRfZXBoID0gcGw7CisJc3RydWN0IGdwc19hc3Npc3RfZGF0YSAqZ3BzID0gdWQ7CisKKwkvL3ByaW50ZigiWy5dIEFJRF9FUEggJWQgLSAlc1xuIiwgYWlkX2VwaC0+c3ZfaWQsIGFpZF9lcGgtPnByZXNlbnQgPyAicHJlc2VudCIgOiAibm90IHByZXNlbnQiKTsKKworCWlmIChhaWRfZXBoLT5wcmVzZW50KSB7CisJCWludCBpID0gZ3BzLT5lcGhlbWVyaXMubl9zdisrOworCQlncHMtPmZpZWxkcyB8PSBHUFNfRklFTERfRVBIRU1FUklTOworCQlncHMtPmVwaGVtZXJpcy5zdnNbaV0uc3ZfaWQgPSBhaWRfZXBoLT5zdl9pZDsKKwkJZ3BzX3VucGFja19zZjEyMyhhaWRfZXBoLT5lcGhfd29yZHMsICZncHMtPmVwaGVtZXJpcy5zdnNbaV0pOworCX0KK30KKworCisvKiBEaXNwYXRjaCB0YWJsZSAqLworc3RydWN0IHVieF9kaXNwYXRjaF9lbnRyeSB1YnhfcGFyc2VfZHRbXSA9IHsKKwlVQlhfRElTUEFUQ0goTkFWLCBQT1NMTEgsIF91YnhfbXNnX3BhcnNlX25hdl9wb3NsbGgpLAorCVVCWF9ESVNQQVRDSChBSUQsIElOSSwgX3VieF9tc2dfcGFyc2VfYWlkX2luaSksCisJVUJYX0RJU1BBVENIKEFJRCwgSFVJLCBfdWJ4X21zZ19wYXJzZV9haWRfaHVpKSwKKwlVQlhfRElTUEFUQ0goQUlELCBBTE0sIF91YnhfbXNnX3BhcnNlX2FpZF9hbG0pLAorCVVCWF9ESVNQQVRDSChBSUQsIEVQSCwgX3VieF9tc2dfcGFyc2VfYWlkX2VwaCksCit9OworCmRpZmYgLS1naXQgYS9ycmxwLWVwaGVtZXJpcy91YngtcGFyc2UuaCBiL3JybHAtZXBoZW1lcmlzL3VieC1wYXJzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyMTQ3NWQKLS0tIC9kZXYvbnVsbAorKysgYi9ycmxwLWVwaGVtZXJpcy91YngtcGFyc2UuaApAQCAtMCwwICsxLDQ1IEBACisvKgorICogdWJ4LXBhcnNlLmgKKyAqCisgKiBIZWFkZXIgZm9yIHBhcnNpbmcgY29kZSBjb252ZXJ0aW5nIFVCWCBtZXNzYWdlcyB0byBHUFMgYXNzaXN0IGRhdGEKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBTeWx2YWluIE11bmF1dCA8dG50QDI0NnROdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIF9fVUJYX1BBUlNFX0hfXworI2RlZmluZSBfX1VCWF9QQVJTRV9IX18KKworCisjaW5jbHVkZSAiZ3BzLmgiCisjaW5jbHVkZSAidWJ4LmgiCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisKKy8qIERpc3BhdGNoIHRhYmxlICovCitleHRlcm4gc3RydWN0IHVieF9kaXNwYXRjaF9lbnRyeSB1YnhfcGFyc2VfZHRbXTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19VQlhfUEFSU0VfSF9fICovCisKZGlmZiAtLWdpdCBhL3JybHAtZXBoZW1lcmlzL3VieC5jIGIvcnJscC1lcGhlbWVyaXMvdWJ4LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODNkZDFmMAotLS0gL2Rldi9udWxsCisrKyBiL3JybHAtZXBoZW1lcmlzL3VieC5jCkBAIC0wLDAgKzEsODEgQEAKKy8qCisgKiB1YnguYworICoKKyAqIEltcGxlbWVudGF0aW9uIG9mIGdlbmVyaWMgVUJYIGhlbHBlcnMKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBTeWx2YWluIE11bmF1dCA8dG50QDI0NnROdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworI2luY2x1ZGUgInVieC5oIgorCisKK3N0YXRpYyB2b2lkCit1YnhfY2hlY2tzdW0odWludDhfdCAqZGF0YSwgaW50IGxlbiwgdWludDhfdCAqY2tzdW0pCit7CisJaW50IGk7CisJdWludDhfdCBjazAgPSAwLCBjazEgPSAwOworCWZvciAoaT0wOyBpPGxlbjsgaSsrKSB7CisJCWNrMCArPSBkYXRhW2ldOworCQljazEgKz0gY2swOworCX0KKwlja3N1bVswXSA9IGNrMDsKKwlja3N1bVsxXSA9IGNrMTsKK30KKworCitzdGF0aWMgdWJ4X21zZ19oYW5kbGVyX3QKK3VieF9maW5kX2hhbmRsZXIoc3RydWN0IHVieF9kaXNwYXRjaF9lbnRyeSAqZHQsIHVpbnQ4X3QgbXNnX2NsYXNzLCB1aW50OF90IG1zZ19pZCkKK3sKKwl3aGlsZSAoZHQtPmhhbmRsZXIpIHsKKwkJaWYgKChkdC0+bXNnX2NsYXNzID09IG1zZ19jbGFzcykgJiYgKGR0LT5tc2dfaWQgPT0gbXNnX2lkKSkKKwkJCXJldHVybiBkdC0+aGFuZGxlcjsKKwkJZHQrKzsKKwl9CisJcmV0dXJuIE5VTEw7Cit9CisKKworaW50Cit1YnhfbXNnX2Rpc3BhdGNoKHN0cnVjdCB1YnhfZGlzcGF0Y2hfZW50cnkgKmR0LAorICAgICAgICAgICAgICAgICB2b2lkICptc2csIGludCBsZW4sIHZvaWQgKnVzZXJkYXRhKQoreworCXN0cnVjdCB1YnhfaGRyICpoZHIgPSBtc2c7CisJdWludDhfdCBja3N1bVsyXSwgKmNrc3VtX3B0cjsKKwl1YnhfbXNnX2hhbmRsZXJfdCBoOworCisJaWYgKChoZHItPnN5bmNbMF0gIT0gVUJYX1NZTkMwKSB8fCAoaGRyLT5zeW5jWzFdICE9IFVCWF9TWU5DMSkpIHsKKwkJZnByaW50ZihzdGRlcnIsICJbIV0gSW52YWxpZCBzeW5jIGJ5dGVzXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCXVieF9jaGVja3N1bShtc2cgKyAyLCBzaXplb2Yoc3RydWN0IHVieF9oZHIpICsgaGRyLT5wYXlsb2FkX2xlbiAtIDIsIGNrc3VtKTsKKwlja3N1bV9wdHIgPSBtc2cgKyAoc2l6ZW9mKHN0cnVjdCB1YnhfaGRyKSArIGhkci0+cGF5bG9hZF9sZW4pOworCWlmICgoY2tzdW1fcHRyWzBdICE9IGNrc3VtWzBdKSB8fCAoY2tzdW1fcHRyWzFdICE9IGNrc3VtWzFdKSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlshXSBJbnZhbGlkIGNoZWNrc3VtXG4iKTsKKwkJcmV0dXJuIC0xOworCX0KKworCWggPSB1YnhfZmluZF9oYW5kbGVyKGR0LCBoZHItPm1zZ19jbGFzcywgaGRyLT5tc2dfaWQpOworCWlmIChoKQorCQloKGhkciwgbXNnICsgc2l6ZW9mKHN0cnVjdCB1YnhfaGRyKSwgaGRyLT5wYXlsb2FkX2xlbiwgdXNlcmRhdGEpOworCisJcmV0dXJuIHNpemVvZihzdHJ1Y3QgdWJ4X2hkcikgKyBoZHItPnBheWxvYWRfbGVuICsgMjsKK30KKwpkaWZmIC0tZ2l0IGEvcnJscC1lcGhlbWVyaXMvdWJ4LmggYi9ycmxwLWVwaGVtZXJpcy91YnguaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjY0Mzg2Ci0tLSAvZGV2L251bGwKKysrIGIvcnJscC1lcGhlbWVyaXMvdWJ4LmgKQEAgLTAsMCArMSwyMzIgQEAKKy8qCisgKiB1YnguaAorICoKKyAqIEhlYWRlciBmb3IgVUJYIHJlbGF0ZWQgc3R1ZmYKKyAqCisgKgorICogQ29weXJpZ2h0IChDKSAyMDA5ICBTeWx2YWluIE11bmF1dCA8dG50QDI0NnROdC5jb20+CisgKgorICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU6IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKyAqIGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5CisgKiB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBlaXRoZXIgdmVyc2lvbiAyIG9mIHRoZSBMaWNlbnNlLCBvcgorICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisgKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgorICoKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbS4gIElmIG5vdCwgc2VlIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4KKyAqLworCisjaWZuZGVmIF9fVUJYX0hfXworI2RlZmluZSBfX1VCWF9IX18KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKKy8qIENvbnN0YW50cyB1c2VkIGluIFVCWCAqLworCisJLyogU3luYyBieXRlcyAodHdvIGZpcnN0IGJ5dGVzIG9mIGVhY2ggbWVzc2FnZSkgKi8KKyNkZWZpbmUgVUJYX1NZTkMwCQkweGI1CisjZGVmaW5lIFVCWF9TWU5DMQkJMHg2MgorCisJLyogVUJYIG1lc3NhZ2VzIGNsYXNzZXMgKi8KKyNkZWZpbmUgVUJYX0NMQVNTX05BVgkJMHgwMQorI2RlZmluZSBVQlhfQ0xBU1NfUlhNCQkweDAyCisjZGVmaW5lIFVCWF9DTEFTU19JTkYJCTB4MDQKKyNkZWZpbmUgVUJYX0NMQVNTX0FDSwkJMHgwNQorI2RlZmluZSBVQlhfQ0xBU1NfQ0ZHCQkweDA2CisjZGVmaW5lIFVCWF9DTEFTU19VUEQJCTB4MDkKKyNkZWZpbmUgVUJYX0NMQVNTX01PTgkJMHgwYQorI2RlZmluZSBVQlhfQ0xBU1NfQUlECQkweDBiCisjZGVmaW5lIFVCWF9DTEFTU19USU0JCTB4MGQKKworCS8qIFVCWCBtZXNzYWdlcyB0eXBlIElEIChieSBjbGFzcykgKi8KKyNkZWZpbmUgVUJYX05BVl9QT1NFQ0VGCQkweDAxCisjZGVmaW5lIFVCWF9OQVZfUE9TTExICQkweDAyCisjZGVmaW5lIFVCWF9OQVZfU1RBVFVTCQkweDAzCisjZGVmaW5lIFVCWF9OQVZfRE9QCQkweDA0CisjZGVmaW5lIFVCWF9OQVZfU09MCQkweDA2CisjZGVmaW5lIFVCWF9OQVZfUE9TVVRNCQkweDA4CisjZGVmaW5lIFVCWF9OQVZfVkVMRUNFRgkJMHgxMQorI2RlZmluZSBVQlhfTkFWX1ZFTE5FRAkJMHgxMgorI2RlZmluZSBVQlhfTkFWX1RJTUVHUFMJCTB4MjAKKyNkZWZpbmUgVUJYX05BVl9USU1FVVRDCQkweDIxCisjZGVmaW5lIFVCWF9OQVZfQ0xPQ0sJCTB4MjIKKyNkZWZpbmUgVUJYX05BVl9TVklORk8JCTB4MzAKKyNkZWZpbmUgVUJYX05BVl9ER1BTCQkweDMxCisjZGVmaW5lIFVCWF9OQVZfU0JBUwkJMHgzMgorI2RlZmluZSBVQlhfTkFWX0VLRlNUQVRVUwkweDQwCisKKyNkZWZpbmUgVUJYX1JYTV9SQVcJCTB4MTAKKyNkZWZpbmUgVUJYX1JYTV9TRlJCCQkweDExCisjZGVmaW5lIFVCWF9SWE1fU1ZTSQkJMHgyMAorI2RlZmluZSBVQlhfUlhNX1NWU0lfR1BTCTB4MjAKKyNkZWZpbmUgVUJYX1JYTV9BTE0JCTB4MzAKKyNkZWZpbmUgVUJYX1JYTV9FUEgJCTB4MzEKKyNkZWZpbmUgVUJYX1JYTV9QT1NSRVEJCTB4NDAKKworI2RlZmluZSBVQlhfSU5GX0VSUk9SCQkweDAwCisjZGVmaW5lIFVCWF9JTkZfV0FSTklORwkJMHgwMQorI2RlZmluZSBVQlhfSU5GX05PVElDRQkJMHgwMgorI2RlZmluZSBVQlhfSU5GX1RFU1QJCTB4MDMKKyNkZWZpbmUgVUJYX0lORl9ERUJVRwkJMHgwNAorI2RlZmluZSBVQlhfSU5GX1VTRVIJCTB4MDcKKworI2RlZmluZSBVQlhfQUNLX05BSwkJMHgwMAorI2RlZmluZSBVQlhfQUNLX0FDSwkJMHgwMQorCisjZGVmaW5lIFVCWF9DRkdfUFJUCQkweDAwCisjZGVmaW5lIFVCWF9DRkdfVVNCCQkweDFiCisjZGVmaW5lIFVCWF9DRkdfTVNHCQkweDAxCisjZGVmaW5lIFVCWF9DRkdfTk1FQQkJMHgxNworI2RlZmluZSBVQlhfQ0ZHX1JBVEUJCTB4MDgKKyNkZWZpbmUgVUJYX0NGR19DRkcJCTB4MDkKKyNkZWZpbmUgVUJYX0NGR19UUAkJMHgwNworI2RlZmluZSBVQlhfQ0ZHX05BVjIJCTB4MWEKKyNkZWZpbmUgVUJYX0NGR19EQVQJCTB4MDYKKyNkZWZpbmUgVUJYX0NGR19JTkYJCTB4MDIKKyNkZWZpbmUgVUJYX0NGR19SU1QJCTB4MDQKKyNkZWZpbmUgVUJYX0NGR19SWE0JCTB4MTEKKyNkZWZpbmUgVUJYX0NGR19BTlQJCTB4MTMKKyNkZWZpbmUgVUJYX0NGR19GWE4JCTB4MGUKKyNkZWZpbmUgVUJYX0NGR19TQkFTCQkweDE2CisjZGVmaW5lIFVCWF9DRkdfTElDCQkweDgwCisjZGVmaW5lIFVCWF9DRkdfVE0JCTB4MTAKKyNkZWZpbmUgVUJYX0NGR19UTTIJCTB4MTkKKyNkZWZpbmUgVUJYX0NGR19UTU9ERQkJMHgxZAorI2RlZmluZSBVQlhfQ0ZHX0VLRgkJMHgxMgorCisjZGVmaW5lIFVCWF9VUERfRE9XTkwJCTB4MDEKKyNkZWZpbmUgVUJYX1VQRF9VUExPQUQJCTB4MDIKKyNkZWZpbmUgVUJYX1VQRF9FWEVDCQkweDAzCisjZGVmaW5lIFVCWF9VUERfTUVNQ1BZCQkweDA0CisKKyNkZWZpbmUgVUJYX01PTl9TQ0hECQkweDAxCisjZGVmaW5lIFVCWF9NT05fSU8JCTB4MDIKKyNkZWZpbmUgVUJYX01PTl9JUEMJCTB4MDMKKyNkZWZpbmUgVUJYX01PTl9WRVIJCTB4MDQKKyNkZWZpbmUgVUJYX01PTl9FWENFUFQJCTB4MDUKKyNkZWZpbmUgVUJYX01PTl9NU0dQUAkJMHgwNgorI2RlZmluZSBVQlhfTU9OX1JYQlVGCQkweDA3CisjZGVmaW5lIFVCWF9NT05fVFhCVUYJCTB4MDgKKyNkZWZpbmUgVUJYX01PTl9IVwkJMHgwOQorI2RlZmluZSBVQlhfTU9OX1VTQgkJMHgwYQorCisjZGVmaW5lIFVCWF9BSURfUkVRCQkweDAwCisjZGVmaW5lIFVCWF9BSURfSU5JCQkweDAxCisjZGVmaW5lIFVCWF9BSURfSFVJCQkweDAyCisjZGVmaW5lIFVCWF9BSURfREFUQQkJMHgxMAorI2RlZmluZSBVQlhfQUlEX0FMTQkJMHgzMAorI2RlZmluZSBVQlhfQUlEX0VQSAkJMHgzMQorCisjZGVmaW5lIFVCWF9USU1fVFAJCTB4MDEKKyNkZWZpbmUgVUJYX1RJTV9UTQkJMHgwMgorI2RlZmluZSBVQlhfVElNX1RNMgkJMHgwMworI2RlZmluZSBVQlhfVElNX1NWSU4JCTB4MDQKKworCisvKiBIZWFkZXIgKi8KK3N0cnVjdCB1YnhfaGRyIHsKKyAgICAgICAgdWludDhfdCAgc3luY1syXTsKKyAgICAgICAgdWludDhfdCAgbXNnX2NsYXNzOworICAgICAgICB1aW50OF90ICBtc2dfaWQ7CisgICAgICAgIHVpbnQxNl90IHBheWxvYWRfbGVuOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworCisvKiBQYXlsb2FkIGZvcm1hdHMgKHNvbWUgb2YgdGhlbSkgKi8KK3N0cnVjdCB1YnhfbmF2X3Bvc2xsaCB7CisJdWludDMyX3QgaXRvdzsKKwlpbnQzMl90ICBsb247CS8qIHNjYWxpbmcgMWUtNyAqLworCWludDMyX3QgIGxhdDsJLyogc2NhbGluZyAxZS03ICovCisJaW50MzJfdCAgaGVpZ2h0Oy8qIG1tICovCisJaW50MzJfdCAgaHNsOwkvKiBtbSAqLworCXVpbnQzMl90IGhhY2M7CS8qIG1tICovCisJdWludDMyX3QgdmFjYzsJLyogbW0gKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCB1YnhfYWlkX2luaSB7CisJaW50MzJfdCAgeDsKKwlpbnQzMl90ICB5OworCWludDMyX3QgIHo7CisJdWludDMyX3QgcG9zYWNjOworCXVpbnQxNl90IHRtX2NmZzsKKwl1aW50MTZfdCB3bjsKKwl1aW50MzJfdCB0b3c7CisJaW50MzJfdCAgdG93X25zOworCXVpbnQzMl90IHRhY2NfbXM7CisJdWludDMyX3QgdGFjY19uczsKKwlpbnQzMl90ICBjbGtkOworCXVpbnQzMl90IGNsa2RhY2M7CisJdWludDMyX3QgZmxhZ3M7Cit9IF9fYXR0cmlidXRlX18oKHBhY2tlZCkpOworCitzdHJ1Y3QgdWJ4X2FpZF9odWkgeworCXVpbnQzMl90IGhlYWx0aDsKKwlkb3VibGUgICB1dGNfYTE7CisJZG91YmxlICAgdXRjX2EwOworCWludDMyX3QgIHV0Y190b3Q7CisJaW50MTZfdCAgdXRjX3dudDsKKwlpbnQxNl90ICB1dGNfbHM7CisJaW50MTZfdCAgdXRjX3duZjsKKwlpbnQxNl90ICB1dGNfZG47CisJaW50MTZfdCAgdXRjX2xzZjsKKwlpbnQxNl90ICB1dGNfc3BhcmU7CisJZmxvYXQgICAga2xvYl9hMDsKKwlmbG9hdCAgICBrbG9iX2ExOworCWZsb2F0ICAgIGtsb2JfYTI7CisJZmxvYXQgICAga2xvYl9hMzsKKwlmbG9hdCAgICBrbG9iX2IwOworCWZsb2F0ICAgIGtsb2JfYjE7CisJZmxvYXQgICAga2xvYl9iMjsKKwlmbG9hdCAgICBrbG9iX2IzOworCXVpbnQzMl90IGZsYWdzOworfSBfX2F0dHJpYnV0ZV9fKChwYWNrZWQpKTsKKworc3RydWN0IHVieF9haWRfYWxtIHsKKwl1aW50MzJfdCBzdl9pZDsKKwl1aW50MzJfdCBncHNfd2VlazsKKwl1aW50MzJfdCBhbG1fd29yZHNbOF07CS8qIFByZXNlbnQgb25seSBpZiAnZ3BzX3dlZWsnICE9IDAgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKK3N0cnVjdCB1YnhfYWlkX2VwaCB7CisJdWludDMyX3Qgc3ZfaWQ7CisJdWludDMyX3QgcHJlc2VudDsKKwl1aW50MzJfdCBlcGhfd29yZHNbMjRdOwkvKiBQcmVzZW50IG9ubHkgaWYgJ3ByZXNlbnQnICE9IDAgKi8KK30gX19hdHRyaWJ1dGVfXygocGFja2VkKSk7CisKKworLyogTWVzc2FnZSBoYW5kbGVyICovCit0eXBlZGVmIHZvaWQgKCp1YnhfbXNnX2hhbmRsZXJfdCkoCisJc3RydWN0IHVieF9oZHIgKmhkciwgdm9pZCAqcGF5bG9hZCwgaW50IHBheWxvYWRfbGVuLCB2b2lkICp1c2VyZGF0YSk7CisKK3N0cnVjdCB1YnhfZGlzcGF0Y2hfZW50cnkgeworCXVpbnQ4X3QgbXNnX2NsYXNzOworCXVpbnQ4X3QgbXNnX2lkOworCXVieF9tc2dfaGFuZGxlcl90IGhhbmRsZXI7Cit9OworCisjZGVmaW5lIFVCWF9ESVNQQVRDSChrbHMsaWQsaGRsKSB7CQlcCisJLm1zZ19jbGFzcyA9IFVCWF9DTEFTU18gIyMga2xzICwJXAorCS5tc2dfaWQgPSBVQlhfICMjIGtscyAjIyBfICMjIGlkLAlcCisJLmhhbmRsZXIgPSAoaGRsKSwJCQlcCit9CisKKworLyogTWV0aG9kcyAqLworaW50IHVieF9tc2dfZGlzcGF0Y2goc3RydWN0IHVieF9kaXNwYXRjaF9lbnRyeSAqZHQsCisgICAgICAgICAgICAgICAgICAgICB2b2lkICptc2csIGludCBsZW4sIHZvaWQgKnVzZXJkYXRhKTsKKworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLyogX19VQlhfSF9fICovCisKZGlmZiAtLWdpdCBhL3dpcmVzaGFyay9hYmlzX29tbC5wYXRjaCBiL3dpcmVzaGFyay9hYmlzX29tbC5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjA2YjRkCi0tLSAvZGV2L251bGwKKysrIGIvd2lyZXNoYXJrL2FiaXNfb21sLnBhdGNoCkBAIC0wLDAgKzEsMjE5MiBAQAorSW5kZXg6IHdpcmVzaGFyay9lcGFuL2Rpc3NlY3RvcnMvTWFrZWZpbGUuY29tbW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0gd2lyZXNoYXJrLm9yaWcvZXBhbi9kaXNzZWN0b3JzL01ha2VmaWxlLmNvbW1vbgorKysrIHdpcmVzaGFyay9lcGFuL2Rpc3NlY3RvcnMvTWFrZWZpbGUuY29tbW9uCitAQCAtNDc0LDYgKzQ3NCw3IEBACisgCXBhY2tldC1nc21fYV9nbS5jCQlcCisgCXBhY2tldC1nc21fYV9ycC5jCQlcCisgCXBhY2tldC1nc21fYV9yci5jCVwKKysJcGFja2V0LWdzbV9hYmlzX29tbC5jCVwKKyAJcGFja2V0LWdzbV9pcGEuYwlcCisgCXBhY2tldC1nc21fYnNzbGFwLmMJCVwKKyAJcGFja2V0LWdzbV9ic3NtYXBfbGUuYwlcCitkaWZmIC0tZ2l0IGEvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1nc21fYWJpc19vbWwuYyBiL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtZ3NtX2FiaXNfb21sLmMKK25ldyBmaWxlIG1vZGUgMTAwNjQ0CitpbmRleCAwMDAwMDAwLi4yZGU5ZGNhCistLS0gL2Rldi9udWxsCisrKysgYi9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWdzbV9hYmlzX29tbC5jCitAQCAtMCwwICsxLDEzODIgQEAKKysvKiBwYWNrZXQtYWJpc19vbWwuYworKyAqIFJvdXRpbmVzIGZvciBwYWNrZXQgZGlzc2VjdGlvbiBvZiBHU00gQS1iaXMgb3ZlciBJUCAoM0dQUCBUUyAxMi4yMSkKKysgKiBDb3B5cmlnaHQgMjAwOSBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPgorKyAqIENvcHlyaWdodCAyMDA5IGJ5IEhvbGdlciBIYW5zIFBldGVyIEZyZXl0aGVyIDx6ZWNrZUBzZWxmaXNoLm9yZz4KKysgKiBiYXNlZCBvbiBBLWJpcyBPTUwgY29kZSBpbiBPcGVuQlNDCisrICoKKysgKiAkSWQkCisrICoKKysgKiBXaXJlc2hhcmsgLSBOZXR3b3JrIHRyYWZmaWMgYW5hbHl6ZXIKKysgKiBCeSBHZXJhbGQgQ29tYnMgPGdlcmFsZEB3aXJlc2hhcmsub3JnPgorKyAqIENvcHlyaWdodCAxOTk4IEdlcmFsZCBDb21icworKyAqCisrICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgorKyAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisrICogYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIKKysgKiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKysgKgorKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisrICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrICoKKysgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQorKyAqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCisrICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BIDAyMTExLTEzMDcsIFVTQS4KKysgKi8KKysKKysjaWZkZWYgSEFWRV9DT05GSUdfSAorKyMgaW5jbHVkZSAiY29uZmlnLmgiCisrI2VuZGlmCisrCisrI2luY2x1ZGUgPGdsaWIuaD4KKysKKysjaW5jbHVkZSA8ZXBhbi9wYWNrZXQuaD4KKysjaW5jbHVkZSA8ZXBhbi9lbWVtLmg+CisrI2luY2x1ZGUgPGVwYW4vbGFwZF9zYXBpLmg+CisrI2luY2x1ZGUgPGVwYW4vcHJlZnMuaD4KKysKKysjaW5jbHVkZSAicGFja2V0LWdzbV9hYmlzX29tbC5oIgorKyNpbmNsdWRlICJwYWNrZXQtZ3NtX2FfY29tbW9uLmgiCisrCisrLyogaW5pdGlhbGl6ZSB0aGUgcHJvdG9jb2wgYW5kIHJlZ2lzdGVyZWQgZmllbGRzICovCisrc3RhdGljIGludCBwcm90b19hYmlzX29tbCA9IC0xOworKworKy8qIE9NTCBoZWFkZXIgKi8KKytzdGF0aWMgaW50IGhmX29tbF9tc2dfZGlzYyA9IC0xOworK3N0YXRpYyBpbnQgaGZfb21sX3BsYWNlbWVudCA9IC0xOworK3N0YXRpYyBpbnQgaGZfb21sX3NlcXVlbmNlID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfbGVuZ3RoID0gLTE7CisrLyogRk9NIGhlYWRlciAqLworK3N0YXRpYyBpbnQgaGZfb21sX2ZvbV9tc2d0eXBlID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfZm9tX29iamNsYXNzID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfZm9tX2luc3RfYnRzID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfZm9tX2luc3RfdHJ4ID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfZm9tX2luc3RfdHMgPSAtMTsKKytzdGF0aWMgaW50IGhmX29tbF9mb21fYXR0cl90YWcgPSAtMTsKKytzdGF0aWMgaW50IGhmX29tbF9mb21fYXR0cl9sZW4gPSAtMTsKKytzdGF0aWMgaW50IGhmX29tbF9mb21fYXR0cl92YWwgPSAtMTsKKysvKiBGT00gYXR0cmlidXRlcyAqLworK3N0YXRpYyBpbnQgaGZfYXR0cl9hZG1fc3RhdGUgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfYXJmY24gPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfb3Blcl9zdGF0ZSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9hdmFpbF9zdGF0ZSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9ldmVudF90eXBlID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX3NldmVyaXR5ID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2JjY2hfYXJmY24gPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfYnNpYyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl90ZXN0X25vID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX3RzYyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl90ZWkgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfYWNoX2J0c3AgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfYWNoX3RzbG90ID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2FjaF9zc2xvdCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9nc21fdGltZSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9jaGFuX2NvbWIgPSAtMTsKKysvKiBJcGFjY2VzcyAqLworK3N0YXRpYyBpbnQgaGZfb21sX2lwYV90cmVzX2F0dHJfdGFnID0gLTE7Cisrc3RhdGljIGludCBoZl9vbWxfaXBhX3RyZXNfYXR0cl9sZW4gPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3Rlc3RfcmVzID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9yeGxldiA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfYl9yeGxldiA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfYXJmY24gPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX2ZfcXVhbCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfZl9lcnIgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX3J4cXVhbCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfZnJhbWVfb2ZmcyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfZnJhbWVucl9vZmZzID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9ic2ljID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9jZWxsX2lkID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9zaTIgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3RyX3NpMmJpcyA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfdHJfc2kydGVyID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV90cl9jaGFuX2Rlc2MgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3JzbF9pcCA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfcnNsX3BvcnQgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX3ByaW1fb21sX2lwID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9wcmltX29tbF9wb3J0ID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9sb2NhdGlvbl9uYW1lID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV91bml0X2lkID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV91bml0X25hbWUgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX252X2ZsYWdzID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9udl9tYXNrID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9uc2xfc3BvcnQgPSAtMTsKKytzdGF0aWMgaW50IGhmX2F0dHJfaXBhX25zbF9kYWRkciA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfbnNsX2Rwb3J0ID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9uc2VpID0gLTE7Cisrc3RhdGljIGludCBoZl9hdHRyX2lwYV9uc3ZjaSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfYnZjaSA9IC0xOworK3N0YXRpYyBpbnQgaGZfYXR0cl9pcGFfcmFjID0gLTE7CisrCisrLyogaW5pdGlhbGl6ZSB0aGUgc3VidHJlZSBwb2ludGVycyAqLworK3N0YXRpYyBpbnQgZXR0X29tbCA9IC0xOworK3N0YXRpYyBpbnQgZXR0X29tbF9mb20gPSAtMTsKKytzdGF0aWMgaW50IGV0dF9vbWxfZm9tX2F0dCA9IC0xOworKworKy8qIERlY29kZSB0aGluZ3MgYXMgbmFub0JUUyB0cmFjZXMgKi8KKytzdGF0aWMgZ2Jvb2xlYW4gZ2xvYmFsX29tbF91c2VfbmFub19idHMgPSBGQUxTRTsKKysKKytzdGF0aWMgcHJvdG9fdHJlZSAqdG9wX3RyZWU7CisrCisrLyogVFMgMTIuMjEgQ2hhcHRlciA4LjEgLyBUUyAwOC41OSAqLworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX21zZ19kaXNjX3ZhbHNbXSA9IHsKKysJeyBBQklTX09NX01ESVNDX0ZPTSwJIkZvcm1hdHRlZCBPJk0iIH0sCisrCXsgQUJJU19PTV9NRElTQ19NTUksCSJNTUkgVHJhbnNmZXIiIH0sCisrCXsgQUJJU19PTV9NRElTQ19UUkFVLAkiVFJBVSBPJk0iIH0sCisrCXsgQUJJU19PTV9NRElTQ19NQU5VRiwJIk1hbnVmYWN0dXJlciBzcGVjaWZpYyIgfSwKKyt9OworKworKy8qIFRTIDEyLjIxIENoYXB0ZXIgOC4xLjEgKi8KKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9wbGFjZW1lbnRfdmFsc1tdID0geworKwl7IEFCSVNfT01fUExBQ0VNRU5UX09OTFksCSJPbmx5IiB9LAorKwl7IEFCSVNfT01fUExBQ0VNRU5UX0ZJUlNULAkiRmlyc3QiIH0sCisrCXsgQUJJU19PTV9QTEFDRU1FTlRfTUlERExFLAkiTWlkZGxlIiB9LAorKwl7IEFCSVNfT01fUExBQ0VNRU5UX0xBU1QsCSJMYXN0IiB9LAorK307CisrCisrLyogVFMgMTIuMjEgQ2hhcHRlciA5LjIgKi8KKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9mb21fbXNndHlwZV92YWxzW10gPSB7CisrCXsgTk1fTVRfTE9BRF9JTklULAkJIlNvZnR3YXJlIExvYWQgSW5pdCIgfSwKKysJeyBOTV9NVF9MT0FEX0lOSVRfQUNLLAkJIlNvZnR3YXJlIExvYWQgSW5pdCBBQ0siIH0sCisrCXsgTk1fTVRfTE9BRF9JTklUX05BQ0ssCQkiU29mdHdhcmUgTG9hZCBJbml0IE5BQ0siIH0sCisrCXsgTk1fTVRfTE9BRF9TRUcsCQkiU29mdHdhcmUgTG9hZCBTZWdtZW50IiB9LAorKwl7IE5NX01UX0xPQURfU0VHX0FDSywJCSJTb2Z0d2FyZSBMb2FkIFNlZ21lbnQgQUNLIiB9LAorKwl7IE5NX01UX0xPQURfRU5ELAkJIlNvZnR3YXJlIExvYWQgRW5kIiB9LAorKwl7IE5NX01UX0xPQURfRU5EX0FDSywJCSJTb2Z0d2FyZSBMb2FkIEVuZCBBQ0siIH0sCisrCXsgTk1fTVRfTE9BRF9FTkRfTkFDSywJCSJTb2Z0d2FyZSBMb2FkIEVuZCBOQUNLIiB9LAorKwl7IE5NX01UX1NXX0FDVF9SRVEsCQkiU29mdHdhcmUgQWN0aXZhdGUgUmVxdWVzdCIgfSwKKysJeyBOTV9NVF9TV19BQ1RfUkVRX0FDSywJCSJTb2Z0d2FyZSBBY3RpdmF0ZSBSZXF1ZXN0IEFDSyIgfSwKKysJeyBOTV9NVF9TV19BQ1RfUkVRX05BQ0ssCSJTb2Z0d2FyZSBBY3RpdmF0ZSBSZXF1ZXN0IE5BQ0siIH0sCisrCXsgTk1fTVRfQUNUSVZBVEVfU1csCQkiQWN0aXZhdGUgU29mdHdhcmUiIH0sCisrCXsgTk1fTVRfQUNUSVZBVEVfU1dfQUNLLAkiQWN0aXZhdGUgU29mdHdhcmUgQUNLIiB9LAorKwl7IE5NX01UX0FDVElWQVRFX1NXX05BQ0ssCSJBY3RpdmF0ZSBTb2Z0d2FyZSBOQUNLIiB9LAorKwl7IE5NX01UX1NXX0FDVElWQVRFRF9SRVAsCSJTb2Z0d2FyZSBBY3RpdmF0ZWQgUmVwb3J0IiB9LAorKwl7IE5NX01UX0VTVEFCTElTSF9URUksCQkiRXN0YWJsaXNoIFRFSSIgfSwKKysJeyBOTV9NVF9FU1RBQkxJU0hfVEVJX0FDSywJIkVzdGFibGlzaCBURUkgQUNLIiB9LAorKwl7IE5NX01UX0VTVEFCTElTSF9URUlfTkFDSywJIkVzdGFibGlzaCBURUkgTkFDSyIgfSwKKysJeyBOTV9NVF9DT05OX1RFUlJfU0lHTiwJCSJDb25uZWN0IFRlcnJlc3RyaWFsIFNpZ25hbGxpbmciIH0sCisrCXsgTk1fTVRfQ09OTl9URVJSX1NJR05fQUNLLAkiQ29ubmVjdCBUZXJyZXN0cmlhbCBTaWduYWxsaW5nIEFDSyIgfSwKKysJeyBOTV9NVF9DT05OX1RFUlJfU0lHTl9OQUNLLAkiQ29ubmVjdCBUZXJyZXN0cmlhbCBTaWduYWxsaW5nIE5BQ0siIH0sCisrCXsgTk1fTVRfRElTQ19URVJSX1NJR04sCQkiRGlzY29ubmVjdCBUZXJyZXN0cmlhbCBTaWduYWxsaW5nIiB9LAorKwl7IE5NX01UX0RJU0NfVEVSUl9TSUdOX0FDSywJIkRpc2Nvbm5lY3QgVGVycmVzdHJpYWwgU2lnbmFsbGluZyBBQ0siIH0sCisrCXsgTk1fTVRfRElTQ19URVJSX1NJR05fTkFDSywJIkRpc2Nvbm5lY3QgVGVycmVzdHJpYWwgU2lnbmFsbGluZyBOQUNLIiB9LAorKwl7IE5NX01UX0NPTk5fVEVSUl9UUkFGLAkJIkNvbm5lY3QgVGVycmVzdHJpYWwgVHJhZmZpYyIgfSwKKysJeyBOTV9NVF9DT05OX1RFUlJfVFJBRl9BQ0ssCSJDb25uZWN0IFRlcnJlc3RyaWFsIFRyYWZmaWMgQUNLIiB9LAorKwl7IE5NX01UX0NPTk5fVEVSUl9UUkFGX05BQ0ssCSJDb25uZWN0IFRlcnJlc3RyaWFsIFRyYWZmaWMgTkFDSyIgfSwKKysJeyBOTV9NVF9ESVNDX1RFUlJfVFJBRiwJCSJEaXNjb25uZWN0IFRlcnJlc3RyaWFsIFRyYWZmaWMiIH0sCisrCXsgTk1fTVRfRElTQ19URVJSX1RSQUZfQUNLLAkiRGlzY29ubmVjdCBUZXJyZXN0cmlhbCBUcmFmZmljIEFDSyIgfSwKKysJeyBOTV9NVF9ESVNDX1RFUlJfVFJBRl9OQUNLLAkiRGlzY29ubmVjdCBUZXJyZXN0cmlhbCBUcmFmZmljIE5BQ0siIH0sCisrCXsgTk1fTVRfQ09OTl9NRFJPUF9MSU5LLAkiQ29ubmVjdCBNdWx0aS1Ecm9wIExpbmsiIH0sCisrCXsgTk1fTVRfQ09OTl9NRFJPUF9MSU5LX0FDSywJIkNvbm5lY3QgTXVsdGktRHJvcCBMaW5rIEFDSyIgfSwKKysJeyBOTV9NVF9DT05OX01EUk9QX0xJTktfTkFDSywJIkNvbm5lY3QgTXVsdGktRHJvcCBMaW5rIE5BQ0siIH0sCisrCXsgTk1fTVRfRElTQ19NRFJPUF9MSU5LLAkiRGlzY29ubmVjdCBNdWx0aS1Ecm9wIExpbmsiIH0sCisrCXsgTk1fTVRfRElTQ19NRFJPUF9MSU5LX0FDSywJIkRpc2Nvbm5lY3QgTXVsdGktRHJvcCBMaW5rIEFDSyIgfSwKKysJeyBOTV9NVF9ESVNDX01EUk9QX0xJTktfTkFDSywJIkRpc2Nvbm5lY3QgTXVsdGktRHJvcCBMaW5rIE5BQ0siIH0sCisrCXsgTk1fTVRfU0VUX0JUU19BVFRSLAkJIlNldCBCVFMgQXR0cmlidXRlcyIgfSwKKysJeyBOTV9NVF9TRVRfQlRTX0FUVFJfQUNLLAkiU2V0IEJUUyBBdHRyaWJ1dGVzIEFDSyIgfSwKKysJeyBOTV9NVF9TRVRfQlRTX0FUVFJfTkFDSywJIlNldCBCVFMgQXR0cmlidXRlcyBOQUNLIiB9LAorKwl7IE5NX01UX1NFVF9SQURJT19BVFRSLAkJIlNldCBSYWRpbyBDYXJyaWVyIEF0dHJpYnV0ZXMiIH0sCisrCXsgTk1fTVRfU0VUX1JBRElPX0FUVFJfQUNLLAkiU2V0IFJhZGlvIENhcnJpZXIgQXR0cmlidXRlcyBBQ0siIH0sCisrCXsgTk1fTVRfU0VUX1JBRElPX0FUVFJfTkFDSywJIlNldCBSYWRpbyBDYXJyaWVyIEF0dHJpYnV0ZXMgTkFDSyIgfSwKKysJeyBOTV9NVF9TRVRfQ0hBTl9BVFRSLAkJIlNldCBDaGFubmVsIEF0dHJpYnV0ZXMiIH0sCisrCXsgTk1fTVRfU0VUX0NIQU5fQVRUUl9BQ0ssCSJTZXQgQ2hhbm5lbCBBdHRyaWJ1dGVzIEFDSyIgfSwKKysJeyBOTV9NVF9TRVRfQ0hBTl9BVFRSX05BQ0ssCSJTZXQgQ2hhbm5lbCBBdHRyaWJ1dGVzIE5BQ0siIH0sCisrCXsgTk1fTVRfUEVSRl9URVNULAkJIlBlcmZvcm0gVGVzdCIgfSwKKysJeyBOTV9NVF9QRVJGX1RFU1RfQUNLLAkJIlBlcmZvcm0gVGVzdCBBQ0siIH0sCisrCXsgTk1fTVRfUEVSRl9URVNUX05BQ0ssCQkiUGVyZm9ybSBUZXN0IE5BQ0siIH0sCisrCXsgTk1fTVRfVEVTVF9SRVAsCQkiVGVzdCBSZXBvcnQiIH0sCisrCXsgTk1fTVRfU0VORF9URVNUX1JFUCwJCSJTZW5kIFRlc3QgUmVwb3J0IiB9LAorKwl7IE5NX01UX1NFTkRfVEVTVF9SRVBfQUNLLAkiU2VuZCBUZXN0IFJlcG9ydCBBQ0siIH0sCisrCXsgTk1fTVRfU0VORF9URVNUX1JFUF9OQUNLLAkiU2VuZCBUZXN0IFJlcG9ydCBOQUNLIiB9LAorKwl7IE5NX01UX1NUT1BfVEVTVCwJCSJTdG9wIFRlc3QiIH0sCisrCXsgTk1fTVRfU1RPUF9URVNUX0FDSywJCSJTdG9wIFRlc3QgQUNLIiB9LAorKwl7IE5NX01UX1NUT1BfVEVTVF9OQUNLLAkJIlN0b3AgVGVzdCBOQUNLIiB9LAorKwl7IE5NX01UX1NUQVRFQ0hHX0VWRU5UX1JFUCwJIlN0YXRlIENoYW5nZWQgRXZlbnQgUmVwb3J0IiB9LAorKwl7IE5NX01UX0ZBSUxVUkVfRVZFTlRfUkVQLAkiRmFpbHVyZSBFdmVudCBSZXBvcnQiIH0sCisrCXsgTk1fTVRfU1RPUF9FVkVOVF9SRVAsCQkiU3RvcCBTZW5kaW5nIEV2ZW50IFJlcG9ydHMiIH0sCisrCXsgTk1fTVRfU1RPUF9FVkVOVF9SRVBfQUNLLAkiU3RvcCBTZW5kaW5nIEV2ZW50IFJlcG9ydHMgQUNLIiB9LAorKwl7IE5NX01UX1NUT1BfRVZFTlRfUkVQX05BQ0ssCSJTdG9wIFNlbmRpbmcgRXZlbnQgUmVwb3J0cyBOQUNLIiB9LAorKwl7IE5NX01UX1JFU1RfRVZFTlRfUkVQLAkJIlJlc3RhcnQgU2VuZGluZyBFdmVudCBSZXBvcnRzIiB9LAorKwl7IE5NX01UX1JFU1RfRVZFTlRfUkVQX0FDSywJIlJlc3RhcnQgU2VuZGluZyBFdmVudCBSZXBvcnRzIEFDSyIgfSwKKysJeyBOTV9NVF9SRVNUX0VWRU5UX1JFUF9OQUNLLAkiUmVzdGFydCBTZW5kaW5nIEV2ZW50IFJlcG9ydHMgTkFDSyIgfSwKKysJeyBOTV9NVF9DSEdfQURNX1NUQVRFLAkJIkNoYW5nZSBBZG1pbmlzdHJhdGl2ZSBTdGF0ZSIgfSwKKysJeyBOTV9NVF9DSEdfQURNX1NUQVRFX0FDSywJIkNoYW5nZSBBZG1pbmlzdHJhdGl2ZSBTdGF0ZSBBQ0siIH0sCisrCXsgTk1fTVRfQ0hHX0FETV9TVEFURV9OQUNLLAkiQ2hhbmdlIEFkbWluaXN0cmF0aXZlIFN0YXRlIE5BQ0siIH0sCisrCXsgTk1fTVRfQ0hHX0FETV9TVEFURV9SRVEsCSJDaGFuZ2UgQWRtaW5pc3RyYXRpdmUgU3RhdGUgUmVxdWVzdCIgfSwKKysJeyBOTV9NVF9DSEdfQURNX1NUQVRFX1JFUV9BQ0ssCSJDaGFuZ2UgQWRtaW5pc3RyYXRpdmUgU3RhdGUgUmVxdWVzdCBBQ0siIH0sCisrCXsgTk1fTVRfQ0hHX0FETV9TVEFURV9SRVFfTkFDSywJIkNoYW5nZSBBZG1pbmlzdHJhdGl2ZSBTdGF0ZSBSZXF1ZXN0IE5BQ0siIH0sCisrCXsgTk1fTVRfUkVQX09VVFNUX0FMQVJNUywJIlJlcG9ydCBPdXRzdGFuZGluZyBBbGFybXMiIH0sCisrCXsgTk1fTVRfUkVQX09VVFNUX0FMQVJNU19BQ0ssCSJSZXBvcnQgT3V0c3RhbmRpbmcgQWxhcm1zIEFDSyIgfSwKKysJeyBOTV9NVF9SRVBfT1VUU1RfQUxBUk1TX05BQ0ssCSJSZXBvcnQgT3V0c3RhbmRpbmcgQWxhcm1zIE5BQ0siIH0sCisrCXsgTk1fTVRfQ0hBTkdFT1ZFUiwJCSJDaGFuZ2VvdmVyIiB9LAorKwl7IE5NX01UX0NIQU5HRU9WRVJfQUNLLAkJIkNoYW5nZW92ZXIgQUNLIiB9LAorKwl7IE5NX01UX0NIQU5HRU9WRVJfTkFDSywJIkNoYW5nZW92ZXIgTkFDSyIgfSwKKysJeyBOTV9NVF9PUFNUQVJULAkJIk9wc3RhcnQiIH0sCisrCXsgTk1fTVRfT1BTVEFSVF9BQ0ssCQkiT3BzdGFydCBBQ0siIH0sCisrCXsgTk1fTVRfT1BTVEFSVF9OQUNLLAkJIk9wc3RhcnQgTkFDSyIgfSwKKysJeyBOTV9NVF9SRUlOSVQsCQkJIlJlaW5pdGlhbGl6ZSIgfSwKKysJeyBOTV9NVF9SRUlOSVRfQUNLLAkJIlJlaW5pdGlhbGl6ZSBBQ0siIH0sCisrCXsgTk1fTVRfUkVJTklUX05BQ0ssCQkiUmVpbml0aWFsaXplIE5BQ0siIH0sCisrCXsgTk1fTVRfU0VUX1NJVEVfT1VULAkJIlNldCBTaXRlIE91dHB1dHMiIH0sCisrCXsgTk1fTVRfU0VUX1NJVEVfT1VUX0FDSywJIlNldCBTaXRlIE91dHB1dHMgQUNLIiB9LAorKwl7IE5NX01UX1NFVF9TSVRFX09VVF9OQUNLLAkiU2V0IFNpdGUgT3V0cHV0cyBOQUNLIiB9LAorKwl7IE5NX01UX0NIR19IV19DT05GLAkJIkNoYW5nZSBIVyBDb25maWd1cmF0aW9uIiB9LAorKwl7IE5NX01UX0NIR19IV19DT05GX0FDSywJIkNoYW5nZSBIVyBDb25maWd1cmF0aW9uIEFDSyIgfSwKKysJeyBOTV9NVF9DSEdfSFdfQ09ORl9OQUNLLAkiQ2hhbmdlIEhXIENvbmZpZ3VyYXRpb24gTkFDSyIgfSwKKysJeyBOTV9NVF9NRUFTX1JFU19SRVEsCQkiTWVhc3VyZW1lbnQgUmVzdWx0IFJlcXVlc3QiIH0sCisrCXsgTk1fTVRfTUVBU19SRVNfUkVTUCwJCSJNZWFzdXJlbWVudCBSZXN1bHQgUmVzcG9uc2UiIH0sCisrCXsgTk1fTVRfU1RPUF9NRUFTLAkJIlN0b3AgTWVhc3VyZW1lbnQiIH0sCisrCXsgTk1fTVRfU1RBUlRfTUVBUywJCSJTdGFydCBNZWFzdXJlbWVudCIgfSwKKysJeyBOTV9NVF9HRVRfQVRUUiwJCSJHZXQgQXR0cmlidXRlcyIgfSwKKysJeyBOTV9NVF9HRVRfQVRUUl9SRVNQLAkJIkdldCBBdHRyaWJ1dGVzIFJlc3BvbnNlIiB9LAorKwl7IE5NX01UX0dFVF9BVFRSX05BQ0ssCQkiR2V0IEF0dHJpYnV0ZXMgTkFDSyIgfSwKKysJeyBOTV9NVF9TRVRfQUxBUk1fVEhSRVMsCSJTZXQgQWxhcm0gVGhyZXNob2xkIiB9LAorKwl7IE5NX01UX1NFVF9BTEFSTV9USFJFU19BQ0ssCSJTZXQgQWxhcm0gVGhyZXNob2xkIEFDSyIgfSwKKysJeyBOTV9NVF9TRVRfQUxBUk1fVEhSRVNfTkFDSywJIlNldCBBbGFybSBUaHJlc2hvbGQgTkFDSyIgfSwKKysJLyogcHJvcHJpZXRhcnksIG5vdCBpbiB0aGUgc3RhbmRhcmQgKi8KKysJeyBOTV9NVF9JUEFDQ19SRVNUQVJULAkJIklQQSBSZXN0YXJ0IiB9LAorKwl7IE5NX01UX0lQQUNDX1JFU1RBUlRfQUNLLAkiSVBBIFJlc3RhcnQgQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1JTTF9DT05ORUNULAkiSVBBIFJTTCBDb25uZWN0IiB9LAorKwl7IE5NX01UX0lQQUNDX1JTTF9DT05ORUNUX0FDSywJIklQQSBSU0wgQ29ubmVjdCBBQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfUlNMX0NPTk5FQ1RfTkFDSywJIklQQSBSU0wgQ29ubmVjdCBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1JTTF9ESVNDT05ORUNULAkiSVBBIFJTTCBEaXNjb25uZWN0IiB9LAorKwl7IE5NX01UX0lQQUNDX1JTTF9ESVNDT05ORUNUX0FDSywgIklQQSBSU0wgRGlzY29ubmVjdCBBQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfUlNMX0RJU0NPTk5FQ1RfTkFDSywgIklQQSBSU0wgRGlzY29ubmVjdCBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX0NPTk5fVFJBRiwJIklQQSBDb25uZWN0IFRyYWZmaWMiIH0sCisrCXsgTk1fTVRfSVBBQ0NfQ09OTl9UUkFGX0FDSywJIklQQSBDb25uZWN0IFRyYWZmaWMgQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX0NPTk5fVFJBRl9OQUNLLAkiSVBBIENvbm5lY3QgVHJhZmZpYyBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX0RJU0NfVFJBRiwJIklQQSBEaXNjb25uZWN0IFRyYWZmaWMiIH0sCisrCXsgTk1fTVRfSVBBQ0NfRElTQ19UUkFGX0FDSywJIklQQSBEaXNjb25uZWN0IFRyYWZmaWMgQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX0RJU0NfVFJBRl9OQUNLLAkiSVBBIERpc2Nvbm5lY3QgVHJhZmZpYyBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX0RFRl9CT09UX1NXLAkiSVBBIERlZmF1bHQgQm9vdCBTb2Z0d2FyZSIgfSwKKysJeyBOTV9NVF9JUEFDQ19ERUZfQk9PVF9TV19BQ0ssCSJJUEEgRGVmYXVsdCBCb290IFNvZnR3YXJlIEFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19ERUZfQk9PVF9TV19OQUNLLAkiSVBBIERlZmF1bHQgQm9vdCBTb2Z0d2FyZSBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1NFVF9OVkFUVFIsCSJJUEEgU2V0IE5WUkFNIEF0dHJpYnV0ZXMiIH0sCisrCXsgTk1fTVRfSVBBQ0NfU0VUX05WQVRUUl9BQ0ssCSJJUEEgU2V0IE5WUkFNIEF0dHJpYnV0ZXMgQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1NFVF9OVkFUVFJfTkFDSywJIklQQSBTZXQgTlZSQU0gQXR0cmlidXRlcyBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX0dFVF9OVkFUVFIsCSJJUEEgR2V0IE5WUkFNIEF0dHJpYnV0ZXMiIH0sCisrCXsgTk1fTVRfSVBBQ0NfR0VUX05WQVRUUl9BQ0ssCSJJUEEgR2V0IE5WUkFNIEF0dHJpYnV0ZXMgQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX0dFVF9OVkFUVFJfTkFDSywJIklQQSBHZXQgTlZSQU0gQXR0cmlidXRlcyBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1NFVF9BVFRSLAkJIklQQSBTZXQgQXR0cmlidXRlcyIgfSwKKysJeyBOTV9NVF9JUEFDQ19TRVRfQVRUUl9BQ0ssCSJJUEEgU2V0IEF0dHJpYnV0ZXMgQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1NFVF9BVFRSX05BQ0ssCSJJUEEgU2V0IEF0dHJpYnV0ZXMgTkFDSyIgfSwKKysJeyBOTV9NVF9JUEFDQ19BVFRSX0NIR19FVlQsCSJJUEEgQXR0cmlidXRlIENoYW5nZSBFdmVudCIgfSwKKysJeyBOTV9NVF9JUEFDQ19TV19ERUFDVCwJCSJJUEEgU29mdHdhcmUgRGVhY3RpdmF0ZSIgfSwKKysJeyBOTV9NVF9JUEFDQ19TV19ERUFDVF9BQ0ssCSJJUEEgU29mdHdhcmUgRGVhY3RpdmF0ZSBBQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfU1dfREVBQ1RfTkFDSywJIklQQSBTb2Z0d2FyZSBEZWFjdGl2YXRlIE5BQ0siIH0sCisrCXsgTk1fTVRfSVBBQ0NfTUVBU19SRVNfUkVRX05BQ0ssIklQQSBNZWFzdXJlbWVudCBSZXN1bHQgUmVxdWVzdCBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1NUQVJUX01FQVNfTkFDSywJIklQQSBTdGFydCBNZWFzdXJlbWVudCBOQUNLIiB9LAorKwl7IE5NX01UX0lQQUNDX1NUT1BfTUVBU19OQUNLLAkiSVBBIFN0b3AgTWVhc3VyZW1lbnQgTkFDSyIgfSwKKysJeyBOTV9NVF9CUzExX1JFU0VUX1JFU09VUkNFLAkiU0lFIFJlc2V0IFJlc291cmNlIiB9LAorKwl7IE5NX01UX0JTMTFfQkVHSU5fREJfVFgsCSJTSUUgQmVnaW4gRGF0YWJhc2UgVHJhbnNtaXNzaW9uIiB9LAorKwl7IE5NX01UX0JTMTFfQkVHSU5fREJfVFhfQUNLLAkiU0lFIEJlZ2luIERhdGFiYXNlIFRyYW5zbWlzc2lvbiBBQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9CRUdJTl9EQl9UWF9OQUNLLAkiU0lFIEJlZ2luIERhdGFiYXNlIFRyYW5zbWlzc2lvbiBOQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfRU5EX0RCX1RYLAkJIlNJRSBFbmQgRGF0YWJhc2UgVHJhbnNtaXNzaW9uIiB9LAorKwl7IE5NX01UX0JTMTFfRU5EX0RCX1RYX0FDSywJIlNJRSBFbmQgRGF0YWJhc2UgVHJhbnNtaXNzaW9uIEFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0VORF9EQl9UWF9OQUNLLAkiU0lFIEVuZCBEYXRhYmFzZSBUcmFuc21pc3Npb24gTkFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0NSRUFURV9PQkosCSJTSUUgQ3JlYXRlIE9iamVjdCIgfSwKKysJeyBOTV9NVF9CUzExX0NSRUFURV9PQkpfQUNLLAkiU0lFIENyZWF0ZSBPYmplY3QgQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfQ1JFQVRFX09CSl9OQUNLLAkiU0lFIENyZWF0ZSBPYmplY3QgTkFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0RFTEVURV9PQkosCSJTSUUgRGVsZXRlIE9iamVjdCIgfSwKKysJeyBOTV9NVF9CUzExX0RFTEVURV9PQkpfQUNLLAkiU0lFIERlbGV0ZSBPYmplY3QgQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfREVMRVRFX09CSl9OQUNLLAkiU0lFIERlbGV0ZSBPYmplY3QgTkFDSyIgfSwKKysJeyBOTV9NVF9CUzExX0dFVF9TVEFURSwJCSJTSUUgR2V0IFN0YXRlIiB9LAorKwl7IE5NX01UX0JTMTFfR0VUX1NUQVRFX0FDSywJIlNJRSBHZXQgU3RhdGUgQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfTE1UX0xPR09OLAkJIlNJRSBMTVQgTG9nb24iIH0sCisrCXsgTk1fTVRfQlMxMV9MTVRfTE9HT05fQUNLLAkiU0lFIExNVCBMb2dvbiBBQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9SRVNUQVJULAkJIlNJRSBSZXN0YXJ0IiB9LAorKwl7IE5NX01UX0JTMTFfUkVTVEFSVF9BQ0ssCSJTSUUgUmVzdGFydCBBQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9ESVNDT05ORUNULAkiU0lFIERpc2Nvbm5lY3QgQlRTIiB9LAorKwl7IE5NX01UX0JTMTFfRElTQ09OTkVDVF9BQ0ssCSJTSUUgRGlzY29ubmVjdCBCVFMgQUNLIiB9LAorKwl7IE5NX01UX0JTMTFfTE1UX0xPR09GRiwJIlNJRSBMTVQgTG9nb2ZmIiB9LAorKwl7IE5NX01UX0JTMTFfTE1UX0xPR09GRl9BQ0ssCSJTSUUgTE1UIExvZ29mZiBBQ0siIH0sCisrCXsgTk1fTVRfQlMxMV9SRUNPTk5FQ1QsCQkiU0lFIFJlY29ubmVjdCBCVFMiIH0sCisrCXsgTk1fTVRfQlMxMV9SRUNPTk5FQ1RfQUNLLAkiU0lFIFJlY29ubmVjdCBCVFMgQUNLIiB9LAorK307CisrCisrLyogVFMgMTIuMjEgU2VjdGlvbiA5LjI6IE9iamVjdCBDbGFzcyAqLworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX2ZvbV9vYmpjbGFzc192YWxzW10gPSB7CisrCXsgTk1fT0NfU0lURV9NQU5BR0VSLAkJIkJUUyBTaXRlIE1hbmFnZXIiIH0sCisrCXsgTk1fT0NfQlRTLAkJCSJCVFMiIH0sCisrCXsgTk1fT0NfUkFESU9fQ0FSUklFUiwJCSJSYWRpbyBDYXJyaWVyIiB9LAorKwl7IE5NX09DX0NIQU5ORUwsCQkiUmFkaW8gQ2hhbm5lbCIgfSwKKysJeyBOTV9PQ19CQVNFQl9UUkFOU0MsCQkiQmFzZWJhbmQgVHJhbnNjZWl2ZXIiIH0sCisrCS8qIHByb3ByaWV0YXJ5LCB2ZW5kb3Igc3BlY2lmaWMgKi8KKysJeyBOTV9PQ19CUzExX0FESkMsCQkiU0lFIEFkamFjZW5kIENoYW5uZWwiIH0sCisrCXsgTk1fT0NfQlMxMV9IQU5ET1ZFUiwJCSJTSUUgSGFuZG92ZXIiIH0sCisrCXsgTk1fT0NfQlMxMV9QV1JfQ1RSTCwJCSJTSUUgUG93ZXIgQ29udHJvbCIgfSwKKysJeyBOTV9PQ19CUzExX0JUU0UsCQkiU0lFIEJUU0UiIH0sCisrCXsgTk1fT0NfQlMxMV9SQUNLLAkJIlNJRSBSYWNrIiB9LAorKwl7IE5NX09DX0JTMTEsCQkJIlNJRSBTaWVtZW5zSFciIH0sCisrCXsgTk1fT0NfQlMxMV9URVNULAkJIlNJRSBUZXN0IiB9LAorKwl7IE5NX09DX0JTMTFfRU5WQUJUU0UsCQkiU0lFIEVudmFCVFNFIiB9LAorKwl7IE5NX09DX0JTMTFfQlBPUlQsCQkiU0lFIEJQb3J0IiB9LAorKwl7IE5NX09DX0dQUlNfTlNFLAkJIkdQUlMgTlNFIiB9LAorKwl7IE5NX09DX0dQUlNfQ0VMTCwJCSJHUFJTIENlbGwiIH0sCisrCXsgTk1fT0NfR1BSU19OU1ZDMCwJCSJHUFJTIE5TVkMwIiB9LAorKwl7IE5NX09DX0dQUlNfTlNWQzEsCQkiR1BSUyBOU1ZDMSIgfSwKKysJeyBOTV9PQ19OVUxMLAkJCSJOVUxMIiB9LAorK307CisrCisrLyogVFMgMTIuMjEgU2VjdGlvbiA5LjQ6IEF0dHJpYnV0ZXMgKi8KKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9mb21fYXR0cl92YWxzW10gPSB7CisrCXsgTk1fQVRUX0FCSVNfQ0hBTk5FTCwJCSJBLWJpcyBDaGFubmVsIiB9LAorKwl7IE5NX0FUVF9BRERfSU5GTywJCSJBZGRpdGlvbmFsIEluZm9ybWF0aW9uIiB9LAorKwl7IE5NX0FUVF9BRERfVEVYVCwJCSJBZGRpdGlvbmFsIFRleHQiIH0sCisrCXsgTk1fQVRUX0FETV9TVEFURSwJCSJBZG1pbmlzdHJhdGl2ZSBTdGF0ZSIgfSwKKysJeyBOTV9BVFRfQVJGQ05fTElTVCwJCSJBUkZDTiBMaXN0IiB9LAorKwl7IE5NX0FUVF9BVVRPTl9SRVBPUlQsCQkiQXV0b25vbW91c2x5IFJlcG9ydCIgfSwKKysJeyBOTV9BVFRfQVZBSUxfU1RBVFVTLAkJIkF2YWlsYWJpbGl0eSBTdGF0dXMiIH0sCisrCXsgTk1fQVRUX0JDQ0hfQVJGQ04sCQkiQkNDSCBBUkZDTiIgfSwKKysJeyBOTV9BVFRfQlNJQywJCQkiQlNJQyIgfSwKKysJeyBOTV9BVFRfQlRTX0FJUl9USU1FUiwJCSJCVFMgQWlyIFRpbWVyIiB9LAorKwl7IE5NX0FUVF9DQ0NIX0xfSV9QLAkJIkNDQ0ggTG9hZCBJbmRpY2F0aW9uIFBlcmlvZCIgfSwKKysJeyBOTV9BVFRfQ0NDSF9MX1QsCQkiQ0NDSCBMb2FkIFRocmVzaG9sZCIgfSwKKysJeyBOTV9BVFRfQ0hBTl9DT01CLAkJIkNoYW5uZWwgQ29tYmluYXRpb24iIH0sCisrCXsgTk1fQVRUX0NPTk5fRkFJTF9DUklULAkiQ29ubmVjdGlvbiBGYWlsIENyaXRlcmlvbiIgfSwKKysJeyBOTV9BVFRfREVTVCwJCQkiRGVzdGluYXRpb24iIH0sCisrCXsgTk1fQVRUX0VWRU5UX1RZUEUsCQkiRXZlbnQgVHlwZSIgfSwKKysJeyBOTV9BVFRfRklMRV9JRCwJCSJGaWxlIElEIiB9LAorKwl7IE5NX0FUVF9GSUxFX1ZFUlNJT04sCQkiRmlsZSBWZXJzaW9uIiB9LAorKwl7IE5NX0FUVF9HU01fVElNRSwJCSJHU00gVGltZSIgfSwKKysJeyBOTV9BVFRfSFNOLAkJCSJIU04iIH0sCisrCXsgTk1fQVRUX0hXX0NPTkZJRywJCSJIVyBDb25maWd1cmF0aW9uIiB9LAorKwl7IE5NX0FUVF9IV19ERVNDLAkJIkhXIERlc2NyaXB0aW9uIiB9LAorKwl7IE5NX0FUVF9JTlRBVkVfUEFSQU0sCQkiSW50YXZlIFBhcmFtZXRlciIgfSwKKysJeyBOTV9BVFRfSU5URVJGX0JPVU5ELAkJIkludGVyZmVyZW5jZSBCb3VuZGFyaWVzIiB9LAorKwl7IE5NX0FUVF9MSVNUX1JFUV9BVFRSLAkJIkxpc3Qgb2YgcmVxdWlyZWQgQXR0cmlidXRlcyIgfSwKKysJeyBOTV9BVFRfTUFJTywJCQkiTUFJTyIgfSwKKysJeyBOTV9BVFRfTUFOVUZfU1RBVEUsCQkiTWFudWZhY3R1cmVyIERlcGVuZGVudCBTdGF0ZSIgfSwKKysJeyBOTV9BVFRfTUFOVUZfVEhSRVNILAkJIk1hbnVmYWN0dXJlciBEZXBlbmRlbnQgVGhyZXNob2xkcyIgfSwKKysJeyBOTV9BVFRfTUFOVUZfSUQsCQkiTWFudWZhY3R1cmVyIElkIiB9LAorKwl7IE5NX0FUVF9NQVhfVEEsCQkiTWF4aW11bSBUaW1pbmcgQWR2YW5jZSIgfSwKKysJeyBOTV9BVFRfTURST1BfTElOSywJCSJNdWx0aS1kcm9wIEJTQyBMaW5rIiB9LAorKwl7IE5NX0FUVF9NRFJPUF9ORVhULAkJIk11bHRpLWRyb3AgbmV4dCBCVFMgTGluayIgfSwKKysJeyBOTV9BVFRfTkFDS19DQVVTRVMsCQkiTkFDSyBDYXVzZXMiIH0sCisrCXsgTk1fQVRUX05ZMSwJCQkiTnkxIiB9LAorKwl7IE5NX0FUVF9PUEVSX1NUQVRFLAkJIk9wZXJhdGlvbmFsIFN0YXRlIiB9LAorKwl7IE5NX0FUVF9PVkVSTF9QRVJJT0QsCQkiT3ZlcmxvYWQgUGVyaW9kIiB9LAorKwl7IE5NX0FUVF9QSFlTX0NPTkYsCQkiUGh5c2ljYWwgQ29uZmlnIiB9LAorKwl7IE5NX0FUVF9QT1dFUl9DTEFTUywJCSJQb3dlciBDbGFzcyIgfSwKKysJeyBOTV9BVFRfUE9XRVJfVEhSRVNILAkJIlBvd2VyIE91dHB1dCBUaHJlc2hvbGRzIiB9LAorKwl7IE5NX0FUVF9QUk9CX0NBVVNFLAkJIlByb2JhYmxlIENhdXNlIiB9LAorKwl7IE5NX0FUVF9SQUNIX0JfVEhSRVNILAkJIlJBQ0ggQnVzeSBUaHJlc2hvbGQiIH0sCisrCXsgTk1fQVRUX0xEQVZHX1NMT1RTLAkJIlJBQ0ggTG9hZCBBdmVyYWdpbmcgU2xvdHMiIH0sCisrCXsgTk1fQVRUX1JBRF9TVUJDLAkJIlJhZGlvIFN1YiBDaGFubmVsIiB9LAorKwl7IE5NX0FUVF9SRl9NQVhQT1dSX1IsCQkiUkYgTWF4IFBvd2VyIFJlZHVjdGlvbiIgfSwKKysJeyBOTV9BVFRfU0lURV9JTlBVVFMsCQkiU2l0ZSBJbnB1dHMiIH0sCisrCXsgTk1fQVRUX1NJVEVfT1VUUFVUUywJCSJTaXRlIE91dHB1dHMiIH0sCisrCXsgTk1fQVRUX1NPVVJDRSwJCSJTb3VyY2UiIH0sCisrCXsgTk1fQVRUX1NQRUNfUFJPQiwJCSJTcGVjaWZpYyBQcm9ibGVtcyIgfSwKKysJeyBOTV9BVFRfU1RBUlRfVElNRSwJCSJTdGFydGluZyBUaW1lIiB9LAorKwl7IE5NX0FUVF9UMjAwLAkJCSJUMjAwIiB9LAorKwl7IE5NX0FUVF9URUksCQkJIlRFSSIgfSwKKysJeyBOTV9BVFRfVEVTVF9EVVIsCQkiVGVzdCBEdXJhdGlvbiIgfSwKKysJeyBOTV9BVFRfVEVTVF9OTywJCSJUZXN0IE5vIiB9LAorKwl7IE5NX0FUVF9URVNUX1JFUE9SVCwJCSJUZXN0IFJlcG9ydCBJbmZvIiB9LAorKwl7IE5NX0FUVF9WU1dSX1RIUkVTSCwJCSJWU1dSIFRocmVzaG9sZHMgIiB9LAorKwl7IE5NX0FUVF9XSU5ET1dfU0laRSwJCSJXaW5kb3cgU2l6ZSIgfSwKKysJeyBOTV9BVFRfQlMxMV9SU1NJX09GRlMsCSJTSUUgUlNTSSBPZmZzZXQiIH0sCisrCXsgTk1fQVRUX0JTMTFfVFhQV1IsCQkiU0lFIFRYIFBvd2VyIiB9LAorKwl7IE5NX0FUVF9CUzExX0RJVkVSU0lUWSwJIlNJRSBEaXZlcnNpdHkiIH0sCisrCXsgTk1fQVRUX1RTQywJCQkiVHJhaW5pbmcgU2VxdWVuY2UgQ29kZSIgfSwKKysJeyBOTV9BVFRfU1dfQ09ORklHLAkJIlNXIENvbmZpZ3VyYXRpb24iIH0sCisrCXsgTk1fQVRUX1NXX0RFU0NSLAkJIlNXIERlc2NyaXB0aW9uIiB9LAorKwl7IE5NX0FUVF9TRVZFUklUWSwJCSJQZXJjZWl2ZWQgU2V2ZXJpdHkiIH0sCisrCXsgTk1fQVRUX0dFVF9BUkksCQkiR2V0IEFSSSIgfSwKKysJeyBOTV9BVFRfSFdfQ09ORl9DSEcsCQkiSFcgQ29uZmlndXJhdGlvbiBDaGFuZ2UiIH0sCisrCXsgTk1fQVRUX09VVFNUX0FMQVJNLAkJIk91dHN0YW5kaW5nIEFsYXJtIiB9LAorKwl7IE5NX0FUVF9GSUxFX0RBVEEsCQkiRmlsZSBEYXRhIiB9LAorKwl7IE5NX0FUVF9NRUFTX1JFUywJCSJNZWFzdXJlbWVudCBSZXN1bHQiIH0sCisrCXsgTk1fQVRUX01FQVNfVFlQRSwJCSJNZWFzdXJlbWVudCBUeXBlIiB9LAorKwl7IE5NX0FUVF9CUzExX0VTTl9GV19DT0RFX05PLAkiU0lFIEVTTiBGVyBDb2RlIE51bWJlciIgfSwKKysJeyBOTV9BVFRfQlMxMV9FU05fSFdfQ09ERV9OTywJIlNJRSBFU04gSFcgQ29kZSBOdW1iZXIiIH0sCisrCXsgTk1fQVRUX0JTMTFfRVNOX1BDQl9TRVJJQUwsCSJTSUUgRVNOIFBDQiBTZXJpYWwgTnVtYmVyIiB9LAorKwl7IE5NX0FUVF9CUzExX0VYQ0VTU0lWRV9ESVNUQU5DRSwgIlNJRSBFeGNlc3NpdmUgRGlzdGFuY2UiIH0sCisrCXsgTk1fQVRUX0JTMTFfQUxMX1RFU1RfQ0FURywJIlNJRSBBbGwgVGVzdCBDYXRlZ29yaWVzIiB9LAorKwl7IE5NX0FUVF9CUzExX0JUU0xTX0hPUFBJTkcsCSJTSUUgQlRTIExTIEhvcHBpbmciIH0sCisrCXsgTk1fQVRUX0JTMTFfQ0VMTF9BTExPQ19OUiwJIlNJRSBDZWxsIEFsbG9jYXRpb24gTnVtYmVyIiB9LAorKwl7IE5NX0FUVF9CUzExX0NFTExfR0xPQkFMX0lELAkiU0lFIENlbGwgR2xvYmFsIElEIiB9LAorKwl7IE5NX0FUVF9CUzExX0VOQV9JTlRFUkZfQ0xBU1MsCSJTSUUgRW5hYmxlIEludGVyZmVyZW5jZSBDbGFzcyIgfSwKKysJLyogRklYTUUgKi8KKysJeyBOTV9BVFRfQlMxMV9FTkFfTVNfUFdSX0NUUkwsCSJTSUUgRW5hYmxlIE1TIFBvd2VyIENvbnRyb2wiIH0sCisrCXsgTk1fQVRUX0JTMTFfRU5BX1BXUl9CREdUX0hPLAkiU0lFIEVuYWJsZSBQb3dlciBCdWRnZXQgSE8iIH0sCisrCXsgTk1fQVRUX0JTMTFfRU5BX1JYTEVWX0hPLAkiU0lFIEVuYWJsZSBSeExldmVsIEhPIiB9LAorKwl7IE5NX0FUVF9CUzExX0VOQV9SWFFVQUxfSE8sCSJTSUUgRW5hYmxlIFJ4UXVhbCBITyIgfSwKKysJeyBOTV9BVFRfQlMxMV9GQUNDSF9RVUFMLAkiU0lFIEZBQ0NIIFF1YWxpdHkiIH0sCisrCXsgTk1fQVRUX0lQQUNDX0RTVF9JUCwJCSJJUEEgRGVzdGluYXRpb24gSVAgQWRkcmVzcyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfRFNUX0lQX1BPUlQsCSJJUEEgRGVzdGlvbmF0aW9uIElQIFBvcnQiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1NTUkMsCQkiSVBBIFJUUCBTU1JDIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19SVFBfUEFZTERfVFlQRSwJIklQQSBSVFAgUGF5bG9hZCBUeXBlIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19CQVNFQl9JRCwJIklQQSBCYXNlYmFuZCBJZGVudGlmaWVyIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19TVFJFQU1fSUQsCSJJUEEgU3RyZWFtIElkZW50aWZpZXIiIH0sCisrCXsgTk1fQVRUX0lQQUNDX05WX0ZMQUdTLAkiSVBBIE5WUkFNIEZsYWdzIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19GUkVRX0NUUkwsCSJJUEEgRnJlcXVlbmN5IENvbnRyb2wiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1BSSU1fT01MX0NGRywJIklQQSBQcmltYXJ5IE9NTCBDb25maWciIH0sCisrCXsgTk1fQVRUX0lQQUNDX1NFQ19PTUxfQ0ZHLAkiSVBBIFNlY29uZGFyeSBPTUwgQ29uZmlnIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19JUF9JRl9DRkcsCSJJUEEgSVAgSW50ZXJmYWNlIENvbmZpZyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfSVBfR1dfQ0ZHLAkiSVBBIElQIEdhdGV3YXkgQ29uZmlnIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19JTl9TRVJWX1RJTUUsCSJJUEEgSW4gU2VydmljZSBUaW1lIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19UUlhfQlRTX0FTUywJIklQQSBUUlggQlRTIEFzc2lnbm1lbnQiIH0sCisrCXsgTk1fQVRUX0lQQUNDX0xPQ0FUSU9OLAkiSVBBIEJUUyBMb2NhdGlvbiBOYW1lIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19QQUdJTkdfQ0ZHLAkiSVBBIFBhZ2luZyBDb25maWd1cmF0aW9uIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19GSUxFX0RBVEEsCSJJUEEgRmlsZSBEYXRhIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19VTklUX0lELAkJIklQQSBVbml0IElEIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19QQVJFTlRfVU5JVF9JRCwJIklQQSBQYXJlbnQgVW5pdCBJRCIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfVU5JVF9OQU1FLAkiSVBBIFVuaXQgTmFtZSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfU05NUF9DRkcsCSJJUEEgU05NUCBDb25maWciIH0sCisrCXsgTk1fQVRUX0lQQUNDX1BSSU1fT01MX0NGR19MSVNULCAiSVBBIFByaW1hcnkgT01MIENvbmZpZyBMaXN0IiB9LAorKwl7IE5NX0FUVF9JUEFDQ19QUklNX09NTF9GQl9UT1VULCJJUEEgUHJpbWFyeSBPTUwgRmFsbGJhY2sgVGltZW91dCIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfQ1VSX1NXX0NGRywJIklQQSBDdXJyZW50IFNvZnR3YXJlIENvbmZpZyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfVElNSU5HX0JVUywJIklQQSBUaW1pbmcgQnVzIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19DR0ksCQkiSVBBIENHSSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfUkFDLAkJIklQQSBSQUMiIH0sCisrCXsgTk1fQVRUX0lQQUNDX09CSl9WRVJTSU9OLAkiSVBBIE9iamVjdCBWZXJzaW9uIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19HUFJTX1BBR0lOR19DRkcsCSJJUEEgR1BSUyBQYWdpbmcgQ29uZmlndXJhdGlvbiIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfTlNFSSwJCSJJUEEgTlNFSSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfQlZDSSwJCSJJUEEgQlZDSSIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfTlNWQ0ksCQkiSVBBIE5TVkNJIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19OU19DRkcsCQkiSVBBIE5TIENvbmZpZ3VyYXRpb24iIH0sCisrCXsgTk1fQVRUX0lQQUNDX0JTU0dQX0NGRywJIklQQSBCU1NHUCBDb25maWd1cmF0aW9uIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19OU19MSU5LX0NGRywJIklQQSBOUyBMaW5rIENvbmZpZ3VyYXRpb24iIH0sCisrCXsgTk1fQVRUX0lQQUNDX1JMQ19DRkcsCQkiSVBBIFJMQyBDb25maWd1cmF0aW9uIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19BTE1fVEhSRVNIX0xJU1QsCSJJUEEgQWxhcm0gVGhyZXNob2xkIExpc3QiIH0sCisrCXsgTk1fQVRUX0lQQUNDX01PTklUX1ZBTF9MSVNULAkiSVBBIE1vbml0b3JlZCBWYWx1ZSBMaXN0IiB9LAorKwl7IE5NX0FUVF9JUEFDQ19USUJfQ09OVFJPTCwJIklQQSBUaW1pbmcgSW50ZXJmYWNlIEJ1cyBDb250cm9sIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19TVVBQX0ZFQVRVUkVTLAkiSVBBIFN1cHBvcnRlZCBGZWF0dXJlcyIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfQ09ESU5HX1NDSEVNRVMsCSJJUEEgQ29kaW5nIFNjaGVtZXMiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1JMQ19DRkdfMiwJIklQQSBSTEMgQ29uZmlndXJhdGlvbiAyIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19IRUFSVEJfVE9VVCwJIklQQSBIZWFydGJlYXQgVGltZW91dCIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfVVBUSU1FLAkJIklQQSBVcHRpbWUiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1JMQ19DRkdfMywJIklQQSBSTEMgQ29uZmlndXJhdGlvbiAzIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19TU0xfQ0ZHLAkJIklQQSBTU0wgQ29uZmlndXJhdGlvbiIgfSwKKysJeyBOTV9BVFRfSVBBQ0NfU0VDX1BPU1NJQkxFLAkiSVBBIFNlY3VyaXR5IFBvc3NpYmxlIiB9LAorKwl7IE5NX0FUVF9JUEFDQ19JTUxfU1NMX1NUQVRFLAkiSVBBIElNTCBTU0wgU3RhdGUiIH0sCisrCXsgTk1fQVRUX0lQQUNDX1JFVk9DX0RBVEUsCSJJUEEgUmV2b2NhdGlvbiBEYXRlIiB9LAorKwkvKiBGSVhNRTogTW9yZSBTSUUgKi8KKyt9OworKworKy8qIFNlY3Rpb24gOS40LjQ6IEFkbWluaXN0cmF0aXZlIFN0YXRlICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfYWRtX3N0YXRlX3ZhbHNbXSA9IHsKKysJeyBOTV9TVEFURV9MT0NLRUQsCQkiTG9ja2VkIiB9LAorKwl7IE5NX1NUQVRFX1VOTE9DS0VELAkJIlVubG9ja2VkIiB9LAorKwl7IE5NX1NUQVRFX1NIVVRET1dOLAkJIlNodXRkb3duIiB9LAorKwl7IE5NX1NUQVRFX05VTEwsCQkiTnVsbCIgfSwKKyt9OworKworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX29wZXJfc3RhdGVfdmFsc1tdID0geworKwl7IDEsCSJEaXNhYmxlZCIgfSwKKysJeyAyLAkiRW5hYmxlZCIgfSwKKysJeyAweGZmLAkiTlVMTCIgfSwKKyt9OworKworKy8qIFNlY3Rpb24gOS40LjcgQXZhaWxhYmlsaXR5IFN0YXR1cyAqLworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgb21sX2F2YWlsX3N0YXRlX3ZhbHNbXSA9IHsKKysJeyAwLAkiSW4gdGVzdCIgfSwKKysJeyAxLAkiRmFpbGVkIiB9LAorKwl7IDIsCSJQb3dlciBvZmYiIH0sCisrCXsgMywJIk9mZiBsaW5lIiB9LAorKwl7IDUsCSJEZXBlbmRlbmN5IiB9LAorKwl7IDYsCSJEZWdyYWRlZCIgfSwKKysJeyA3LCAJIk5vdCBpbnN0YWxsZWQiIH0sCisrCXsgMHhmZiwJIk9LIiB9LAorK307CisrCisrLyogU2VjdGlvbiA5LjQuMTM6IENoYW5uZWwgQ29tYmluYXRpb24gKi8KKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIG9tbF9jaGFuX2NvbWJfdmFsc1tdID0geworKwl7IE5NX0NIQU5DX1RDSEZ1bGwsCQkiVENIL0YiIH0sCisrCXsgTk1fQ0hBTkNfVENISGFsZiwJCSJUQ0gvSCIgfSwKKysJeyBOTV9DSEFOQ19UQ0hIYWxmMiwJCSJUQ0gvSCAyIiB9LAorKwl7IE5NX0NIQU5DX1NEQ0NILAkJIlNEQ0NIIiB9LAorKwl7IE5NX0NIQU5DX21haW5CQ0NILAkJIk1haW4gQkNDSCIgfSwKKysJeyBOTV9DSEFOQ19CQ0NIQ29tYiwJCSJDb21iaW5lZCBCQ0NIIiB9LAorKwl7IE5NX0NIQU5DX0JDQ0gsCQkiQkNDSCIgfSwKKysJeyBOTV9DSEFOQ19CQ0NIX0NCQ0gsCQkiQkNDSCtDQkNIIiB9LAorKwl7IE5NX0NIQU5DX1NEQ0NIX0NCQ0gsCQkiU0RDQ0grQ0JDSCIgfSwKKyt9OworKworKy8qIFNlY3Rpb24gOS40LjE2OiBFdmVudCBUeXBlICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfZXZlbnRfdHlwZV92YWxzW10gPSB7CisrCXsgTk1fRVZUX0NPTU1fRkFJTCwJCSJDb21tdW5pY2F0aW9uIEZhaWx1cmUiIH0sCisrCXsgTk1fRVZUX1FPU19GQUlMLAkJIlFvUyBGYWlsdXJlIiB9LAorKwl7IE5NX0VWVF9QUk9DX0ZBSUwsCQkiUHJvY2Vzc29yIEZhaWx1cmUiIH0sCisrCXsgTk1fRVZUX0VRVUlQX0ZBSUwsCQkiRXF1aXBtZW50IEZhaWx1cmUiIH0sCisrCXsgTk1fRVZUX0VOVl9GQUlMLAkJIkVudmlyb25tZW50IEZhaWx1cmUiIH0sCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNC42MzogUGVyY2VpdmVkIFNldmVyaXR5ICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfc2V2ZXJpdHlfdmFsc1tdID0geworKwl7IE5NX1NFVkVSX0NFQVNFRCwJCSJDZWFzZWQiIH0sCisrCXsgTk1fU0VWRVJfQ1JJVElDQUwsCQkiQ3JpdGljYWwiIH0sCisrCXsgTk1fU0VWRVJfTUFKT1IsCQkiTWFqb3IiIH0sCisrCXsgTk1fU0VWRVJfTUlOT1IsCQkiTWlub3IiIH0sCisrCXsgTk1fU0VWRVJfV0FSTklORywJCSJXYXJuaW5nIiB9LAorKwl7IE5NX1NFVkVSX0lOREVURVJNSU5BVEUsCSJJbmRldGVybWluYXRlIiB9LAorK307CisrCisrLyogU2VjdGlvbiA5LjQuMzY6IE5BQ0sgQ2F1c2VzICovCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfbmFja19jYXVzZVtdID0geworKwl7IE5NX05BQ0tfSU5DT1JSX1NUUlVDVCwJIkluY29ycmVjdCBtZXNzYWdlIHN0cnVjdHVyZSIgfSwKKysJeyBOTV9OQUNLX01TR1RZUEVfSU5WQUwsCSJJbnZhbGlkIG1lc3NhZ2UgdHlwZSB2YWx1ZSIgfSwKKysJeyBOTV9OQUNLX09CSkNMQVNTX0lOVkFMLAkiSW52YWxpZCBPYmplY3QgY2xhc3MgdmFsdWUiIH0sCisrCXsgTk1fTkFDS19PQkpDTEFTU19OT1RTVVBQLAkiT2JqZWN0IENsYXNzIG5vdCBzdXBwb3J0ZWQiIH0sCisrCXsgTk1fTkFDS19CVFNOUl9VTktOLAkJIkJUUyBOdW1iZXIgdW5rbm93biIgfSwKKysJeyBOTV9OQUNLX1RSWE5SX1VOS04sCQkiVFJYIE51bWJlciB1bmtub3duIiB9LAorKwl7IE5NX05BQ0tfT0JKSU5TVF9VTktOLAkJIk9iamVjdCBJbnN0YW5jZSB1bmtub3duIiB9LAorKwl7IE5NX05BQ0tfQVRUUklEX0lOVkFMLAkJIkludmFsaWQgQXR0cmlidXRlIElEIHZhbHVlIiB9LAorKwl7IE5NX05BQ0tfQVRUUklEX05PVFNVUFAsCSJBdHRyaWJ1dGUgSUQgbm90IHN1cHBvcnRlZCIgfSwKKysJeyBOTV9OQUNLX1BBUkFNX1JBTkdFLAkJIlBhcmFtZXRlciB2YWx1ZSBvdXQgb2YgcmFuZ2UiIH0sCisrCXsgTk1fTkFDS19BVFRSTElTVF9JTkNPTlNJU1RFTlQsICJJbmNvbnNpc3RlbmN5IGluIEF0dHJpYnV0ZSBsaXN0IiB9LAorKwl7IE5NX05BQ0tfU1BFQ19JTVBMX05PVFNVUFAsCSJTcGVjaWZpZWQgSW1wbGVtZW50YXRpb24gbm90IHN1cHBvcnRlZCIgfSwKKysJeyBOTV9OQUNLX0NBTlRfUEVSRk9STSwJCSJNZXNzYWdlIGNhbm5vdCBiZSBwZXJmb3JtZWQiIH0sCisrCXsgTk1fTkFDS19SRVNfTk9USU1QTCwJCSJSZXNvdXJjZSBub3QgaW1wbGVtZW50ZWQiIH0sCisrCXsgTk1fTkFDS19SRVNfTk9UQVZBSUwsCQkiUmVzb3VyY2Ugbm90IGF2YWlsYWJsZSIgfSwKKysJeyBOTV9OQUNLX0ZSRVFfTk9UQVZBSUwsCSJGcmVxdWVuY3kgbm90IGF2YWlsYWJsZSIgfSwKKysJeyBOTV9OQUNLX1RFU1RfTk9UU1VQUCwJCSJUZXN0IG5vdCBzdXBwb3J0ZWQiIH0sCisrCXsgTk1fTkFDS19DQVBBQ0lUWV9SRVNUUiwJIkNhcGFjaXR5IHJlc3RyaWN0aW9ucyIgfSwKKysJeyBOTV9OQUNLX1BIWVNDRkdfTk9UUEVSRk9STSwJIlBoeXMgY29uZmlnIGNhbm5vdCBiZSBwZXJmb3JtZWQiIH0sCisrCXsgTk1fTkFDS19URVNUX05PVElOSVQsCQkiVGVzdCBub3QgaW5pdGlhdGVkIiB9LAorKwl7IE5NX05BQ0tfUEhZU0NGR19OT1RSRVNUT1JFLAkiUGh5cyBjb25maWcgY2Fubm90IGJlIHJlc3RvcmVkIiB9LAorKwl7IE5NX05BQ0tfVEVTVF9OT1NVQ0gsCQkiTm8gc3VjaCBUZXN0IiB9LAorKwl7IE5NX05BQ0tfVEVTVF9OT1NUT1AsCQkiVGVzdCBjYW5ub3QgYmUgc3RvcHBlZCIgfSwKKysJeyBOTV9OQUNLX01TR0lOQ09OU0lTVF9QSFlTQ0ZHLAkiTWVzc2FnZSBpbmNvbnNpc3RlbiB3aXRoIHBoeXNpY2FsIGNvbmZpZyIgfSwKKysJeyBOTV9OQUNLX0ZJTEVfSU5DT01QTEVURSwJIkNvbXBsZXRlIGZpbGUgbm90IHJlY2VpdmVkIiB9LAorKwl7IE5NX05BQ0tfRklMRV9OT1RBVkFJTCwJIkZpbGUgbm90IGF2YWlsYWJsZSBhdCBkZXN0aW5hdGlvbiIgfSwKKysJeyBOTV9OQUNLX0ZJTEVfTk9UQUNUSVZBVEUsCSJGaWxlIGNhbm5vdCBiZSBhY3RpdmF0ZWQiIH0sCisrCXsgTk1fTkFDS19SRVFfTk9UX0dSQU5ULAkiUmVxdWVzdCBub3QgZ3JhbnRlZCIgfSwKKysJeyBOTV9OQUNLX1dBSVQsCQkJIldhaXQiIH0sCisrCXsgTk1fTkFDS19OT1RIX1JFUE9SVF9FWElTVCwJIk5vdGhpbmcgcmVwb3J0YWJsZSBleGlzdGluZyIgfSwKKysJeyBOTV9OQUNLX01FQVNfTk9UU1VQUCwJCSJNZWFzdXJlbWVudCBub3Qgc3VwcG9ydGVkIiB9LAorKwl7IE5NX05BQ0tfTUVBU19OT1RTVEFSVCwJIk1lYXN1cmVtZW50IG5vdCBzdGFydGVkIiB9LAorKwl7IDB4ZmYsCQkJCSJOVUxMIiB9LAorK307CisrCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBvbWxfdGVzdF9ub192YWxzW10gPSB7CisrCXsgTk1fSVBBQ0NfVEVTVE5PX1JMT09QX0FOVCwJIlJhZGlvIExvb3AgdGVzdCB2aWEgYW50ZW5uYSIgfSwKKysJeyBOTV9JUEFDQ19URVNUTk9fUkxPT1BfWENWUiwJIlJhZGlvIExvb3AgdGVzdCB2aWEgdHJhbnNjZWl2ZXIiIH0sCisrCXsgTk1fSVBBQ0NfVEVTVE5PX0ZVTkNfT0JKLAkiQlRTIEZ1bmN0aW9uYWwgb2JqZWN0IHNlbGYgdGVzdCIgfSwKKysJeyBOTV9JUEFDQ19URVNUTk9fQ0hBTl9VU0FHRSwJIkNoYW5uZWwgVXNhZ2UiIH0sCisrCXsgTk1fSVBBQ0NfVEVTVE5PX0JDQ0hfQ0hBTl9VU0FHRSwgIkJDQ0ggQ2hhbm5lbCBVc2FnZSIgfSwKKysJeyBOTV9JUEFDQ19URVNUTk9fRlJFUV9TWU5DLAkiRnJlcXVlbmN5IFN5bmNocm9uaXphdGlvbiIgfSwKKysJeyBOTV9JUEFDQ19URVNUTk9fQkNDSF9JTkZPLAkiQkNDSCBJbmZvcm1hdGlvbiIgfSwKKysJeyBOTV9JUEFDQ19URVNUTk9fVFhfQkVBQ09OLAkiVHJhbnNtaXQgQmVhY29uIiB9LAorKwl7IE5NX0lQQUNDX1RFU1ROT19TWVNJTkZPX01PTklUT1IsICJTeXNJbmZvIE1vbml0b3IiIH0sCisrCXsgTk1fSVBBQ0NfVEVTVE5PX0JDQ0NIX01PTklUT1IsICJCQ0NIICYgQ0NDSCBNb25pdG9yIiB9LAorK307CisrCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBpcGFjY190ZXN0X3Jlc192YWxzW10gPSB7CisrCXsgTk1fSVBBQ0NfVEVTVFJFU19TVUNDRVNTLAkiU3VjY2VzcyIgfSwKKysJeyBOTV9JUEFDQ19URVNUUkVTX1RJTUVPVVQsCSJUaW1lb3V0IiB9LAorKwl7IE5NX0lQQUNDX1RFU1RSRVNfTk9fQ0hBTlMsCSJObyBzdWl0YWJsZSBjaGFubmVscyBhdmFpbGFibGUiIH0sCisrCXsgTk1fSVBBQ0NfVEVTVFJFU19QQVJUSUFMLAkiUGFydGlhbCIgfSwKKysJeyBOTV9JUEFDQ19URVNUUkVTX1NUT1BQRUQsCSJTdG9wcGVkIiB9LAorK307CisrCisrc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyBpcGFjY190ZXN0cmVzX2llX3ZhbHNbXSA9IHsKKysJeyBOTV9JUEFDQ19UUl9JRV9GUkVRX0VSUl9MSVNULAkiRnJlcXVlbmN5IEVycm9yIExpc3QiIH0sCisrCXsgTk1fSVBBQ0NfVFJfSUVfQ0hBTl9VU0FHRSwJIkNoYW5uZWwgVXNhZ2UiIH0sCisrCXsgTk1fSVBBQ0NfVFJfSUVfQkNDSF9JTkZPLAkiQkNDSCBJbmZvcm1hdGlvbiIgfSwKKysJeyBOTV9JUEFDQ19UUl9JRV9SRVNVTFRfREVUQUlMUywiUmVzdWx0IERldGFpbHMiIH0sCisrCXsgTk1fSVBBQ0NfVFJfSUVfRlJFUV9FUlIsCSJGcmVxdWVuY3kgRXJyb3IiIH0sCisrfTsKKysKKysvKiBQYXJzZSB0aGUgaXAuYWNjZXNzIHNwZWNpZmljIEJDQ0ggSW5mb3JtYXRpb24gSUUgZW1iZWRkZWQgaW50byB0aGUgVGVzdAorKyAqIFJlcG9ydCBJRSAqLworK3N0YXRpYyBnaW50CisraXBhY2NfdHJfaWVfYmNjaCh0dmJ1ZmZfdCAqdHZiLCBwcm90b190cmVlICphdHRfdHJlZSwgaW50IG9mZnNldCkKKyt7CisrCWd1aW50MTYgYmluZm9fdHlwZSwgdG1wOworKworKwliaW5mb190eXBlID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCk7CisrCW9mZnNldCArPSAyOworKworKwl0bXAgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KTsKKysKKysJLyogRklYTUU6IHRoZXJlIGFyZSBzdGlsbCBzb21lIGJ1Z3MgcmVtYWluaW5nIGhlcmUgKi8KKysJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfYXJmY24sCisrCQkJICAgIHR2Yiwgb2Zmc2V0LCAyLCBUUlVFKTsKKysKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfZl9xdWFsLAorKwkJCSAgICB0dmIsIG9mZnNldCwgMiwgVFJVRSk7CisrCW9mZnNldCArPSAyOworKworKwlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9iX3J4bGV2LAorKwkJCSAgICB0dmIsIG9mZnNldCsrLCAxLCBUUlVFKTsKKysKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfcnhxdWFsLAorKwkJCSAgICB0dmIsIG9mZnNldCsrLCAxLCBUUlVFKTsKKysKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfZl9lcnIsCisrCQkJICAgIHR2Yiwgb2Zmc2V0LCAyLCBUUlVFKTsKKysJb2Zmc2V0ICs9IDI7CisrCisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX2ZyYW1lX29mZnMsCisrCQkJICAgIHR2Yiwgb2Zmc2V0LCAyLCBUUlVFKTsKKysJb2Zmc2V0ICs9IDI7CisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX2ZyYW1lbnJfb2ZmcywKKysJCQkgICAgdHZiLCBvZmZzZXQsIDQsIFRSVUUpOworKwlvZmZzZXQgKz0gNDsKKysKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfYnNpYywKKysJCQkgICAgdHZiLCBvZmZzZXQrKywgMSwgVFJVRSk7CisrCisrCWRlX2xhaSh0dmIsIGF0dF90cmVlLCBvZmZzZXQsIDUsIE5VTEwsIDApOworKwlvZmZzZXQgKz0gNTsKKysKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfY2VsbF9pZCwKKysJCQkgICAgdHZiLCBvZmZzZXQsIDIsIFRSVUUpOworKwlvZmZzZXQgKz0gMjsKKysKKysJaWYgKGJpbmZvX3R5cGUgJiAweDgwMDApIHsKKysJCS8qIFN5c3RlbSBJbmZvcm1hdGlvbiAyICovCisrCQkvKiBGSVhNRTogUGFyc2UgMDQuMTggTmVpZ2hib3VyIENlbGwgRGVzY3JpcHRpb24gKi8KKysJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX3NpMiwKKysJCQkJICAgIHR2Yiwgb2Zmc2V0LCAxNiwgVFJVRSk7CisrCQlvZmZzZXQgKz0gMTY7CisrCX0KKysJaWYgKGJpbmZvX3R5cGUgJiAweDAwMDEpIHsKKysJCS8qIFN5c3RlbSBJbmZvcm1hdGlvbiAyYmlzICovCisrCQkvKiBGSVhNRTogUGFyc2UgMDQuMTggTmVpZ2hib3VyIENlbGwgRGVzY3JpcHRpb24gKi8KKysJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX3NpMmJpcywKKysJCQkJICAgIHR2Yiwgb2Zmc2V0LCAxNiwgVFJVRSk7CisrCQlvZmZzZXQgKz0gMTY7CisrCX0KKysJaWYgKGJpbmZvX3R5cGUgJiAweDAwMDIpIHsKKysJCS8qIFN5c3RlbSBJbmZvcm1hdGlvbiAydGVyICovCisrCQkvKiBGSVhNRTogUGFyc2UgMDQuMTggTmVpZ2hib3VyIENlbGwgRGVzY3JpcHRpb24gKi8KKysJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX3NpMnRlciwKKysJCQkJICAgIHR2Yiwgb2Zmc2V0LCAxNiwgVFJVRSk7CisrCQlvZmZzZXQgKz0gMTY7CisrCX0KKysJaWYgKGJpbmZvX3R5cGUgJiAweDAwMDQpIHsKKysJCS8qIEZJWE1FOiBQYXJzZSAwNC4xOCBDZWxsIENoYW5uZWwgRGVzY3JpcHRpb24gKi8KKysJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfaXBhX3RyX2NoYW5fZGVzYywKKysJCQkJICAgIHR2Yiwgb2Zmc2V0LCAxNiwgVFJVRSk7CisrCQlvZmZzZXQgKz0gMTY7CisrCX0KKysKKysJcmV0dXJuIG9mZnNldDsKKyt9CisrCisrLyogUGFyc2UgdGhlIGlwLmFjY2VzcyBzcGVjaWZpYyBDaGFubmVsIFVzYWdlIElFIGVtYmVkZGVkIGludG8gdGhlIFRlc3QKKysgKiBSZXBvcnQgSUUgKi8KKytzdGF0aWMgZ2ludAorK2lwYWNjX3RyX2llX2NoYW5fdXNhZ2UodHZidWZmX3QgKnR2YiwgcHJvdG9fdHJlZSAqYXR0X3RyZWUsIGludCBvZmZzZXQpCisreworKwl3aGlsZSAodHZiX3JlcG9ydGVkX2xlbmd0aF9yZW1haW5pbmcodHZiLCBvZmZzZXQpICE9IDApIHsKKysJCWd1aW50MTYgcmVzdWx0ID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCk7CisrCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9hdHRyX2lwYV90cl9hcmZjbiwKKysJCQkJICAgIHR2Yiwgb2Zmc2V0LCAyLCByZXN1bHQpOworKwkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdHJfcnhsZXYsCisrCQkJCSAgICB0dmIsIG9mZnNldCwgMiwgcmVzdWx0KTsKKysJCW9mZnNldCArPSAyOworKwl9CisrCXJldHVybiBvZmZzZXQ7CisrfQorKworKy8qIFBhcnNlIHRoZSBpcC5hY2Nlc3Mgc3BlY2lmaWMgZm9ybWF0IG9mIHRoZSBzdGFuZGFyZCB0ZXN0IHJlcG9ydCBJRSAqLworK3N0YXRpYyBnaW50CisrZGlzc2VjdF9pcGFjY190ZXN0X3JlcChwcm90b190cmVlICp0cmVlLCB0dmJ1ZmZfdCAqdHZiKQorK3sKKysJZ2ludCBvZmZzZXQgPSAwOworKworKwlwcm90b190cmVlX2FkZF9pdGVtKHRyZWUsIGhmX2F0dHJfaXBhX3Rlc3RfcmVzLCB0dmIsIG9mZnNldCsrLAorKwkJCSAgICAxLCBGQUxTRSk7CisrCisrCXdoaWxlICh0dmJfcmVwb3J0ZWRfbGVuZ3RoX3JlbWFpbmluZyh0dmIsIG9mZnNldCkgIT0gMCkgeworKwkJZ3VpbnQ4IGllID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOworKwkJZ3VpbnQxNiBsZW4gPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KzEpOworKwkJcHJvdG9faXRlbSAqdGk7CisrCQlwcm90b190cmVlICphdHRfdHJlZTsKKysKKysJCXRpID0gcHJvdG9fdHJlZV9hZGRfaXRlbSh0cmVlLCBoZl9vbWxfaXBhX3RyZXNfYXR0cl90YWcsIHR2YiwKKysJCQkJCSBvZmZzZXQrKywgMSwgRkFMU0UpOworKwkJYXR0X3RyZWUgPSBwcm90b19pdGVtX2FkZF9zdWJ0cmVlKHRpLCBldHRfb21sX2ZvbV9hdHQpOworKwkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfb21sX2lwYV90cmVzX2F0dHJfbGVuLCB0dmIsCisrCQkJCSAgICBvZmZzZXQsIDIsIGxlbik7CisrCQlvZmZzZXQgKz0gMjsKKysKKysJCXN3aXRjaCAoaWUpIHsKKysJCWNhc2UgTk1fSVBBQ0NfVFJfSUVfQ0hBTl9VU0FHRToKKysJCQlvZmZzZXQgPSBpcGFjY190cl9pZV9jaGFuX3VzYWdlKHR2YiwKKysJCQkJCQkgCWF0dF90cmVlLCBvZmZzZXQpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9JUEFDQ19UUl9JRV9CQ0NIX0lORk86CisrCQkJb2Zmc2V0ID0gaXBhY2NfdHJfaWVfYmNjaCh0dmIsCisrCQkJCQkJICBhdHRfdHJlZSwgb2Zmc2V0KTsKKysJCQlicmVhazsKKysJCWRlZmF1bHQ6CisrCQkJYnJlYWs7CisrCQl9CisrCX0KKysJcmV0dXJuIG9mZnNldDsKKyt9CisrCisrLyogRGlzc2VjdCBPTUwgRk9NIEF0dHJpYnV0ZXMgYWZ0ZXIgT01MICsgRk9NIGhlYWRlciAqLworK3N0YXRpYyBnaW50CisrZGlzc2VjdF9vbWxfYXR0cnModHZidWZmX3QgKnR2YiwgaW50IGJhc2Vfb2ZmcywgcGFja2V0X2luZm8gKnBpbmZvLAorKwkJICBwcm90b190cmVlICp0cmVlKQorK3sKKysJaW50IG9mZnNldCA9IGJhc2Vfb2ZmczsKKysKKysJd2hpbGUgKHR2Yl9yZXBvcnRlZF9sZW5ndGhfcmVtYWluaW5nKHR2Yiwgb2Zmc2V0KSAhPSAwKSB7CisrCQlndWludCBpOworKwkJZ3VpbnQ4IHRhZywgdmFsODsKKysJCWd1aW50MTYgdmFsMTY7CisrCQlndWludDMyIHZhbDMyOworKwkJdW5zaWduZWQgaW50IGxlbiwgbGVuX2xlbiwgaGxlbjsKKysJCWNvbnN0IHN0cnVjdCB0bHZfZGVmICp0ZGVmOworKwkJcHJvdG9faXRlbSAqdGk7CisrCQlwcm90b190cmVlICphdHRfdHJlZTsKKysJCXR2YnVmZl90ICpzdWJfdHZiOworKworKwkJdGFnID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOworKwkJdGRlZiA9ICZubV9hdHRfdGx2ZGVmLmRlZlt0YWddOworKworKwkJc3dpdGNoICh0ZGVmLT50eXBlKSB7CisrCQljYXNlIFRMVl9UWVBFX0ZJWEVEOgorKwkJCWhsZW4gPSAxOworKwkJCWxlbl9sZW4gPSAwOworKwkJCWxlbiA9IHRkZWYtPmZpeGVkX2xlbjsKKysJCQlicmVhazsKKysJCWNhc2UgVExWX1RZUEVfVDoKKysJCQlobGVuID0gMTsKKysJCQlsZW5fbGVuID0gMDsKKysJCQlsZW4gPSAwOworKwkJCWJyZWFrOworKwkJY2FzZSBUTFZfVFlQRV9UVjoKKysJCQlobGVuID0gMTsKKysJCQlsZW5fbGVuID0gMDsKKysJCQlsZW4gPSAxOworKwkJCWJyZWFrOworKwkJY2FzZSBUTFZfVFlQRV9UTFY6CisrCQkJaGxlbiA9IDI7CisrCQkJbGVuX2xlbiA9IDE7CisrCQkJbGVuID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrMSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFRMVl9UWVBFX1RMMTZWOgorKwkJCWhsZW4gPSAzOworKwkJCWxlbl9sZW4gPSAyOworKwkJCWxlbiA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzEpIDw8IDggfAorKwkJCQkJCXR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzIpOworKwkJCWJyZWFrOworKwkJZGVmYXVsdDoKKysJCQlobGVuID0gbGVuX2xlbiA9IGxlbiA9IDA7CisrCQkJRElTU0VDVE9SX0FTU0VSVF9OT1RfUkVBQ0hFRCgpOworKwkJCWJyZWFrOworKwkJfQorKworKwkJdGkgPSBwcm90b190cmVlX2FkZF9pdGVtKHRyZWUsIGhmX29tbF9mb21fYXR0cl90YWcsIHR2YiwKKysJCQkJCSBvZmZzZXQsIDEsIEZBTFNFKTsKKysJCWF0dF90cmVlID0gcHJvdG9faXRlbV9hZGRfc3VidHJlZSh0aSwgZXR0X29tbF9mb21fYXR0KTsKKysJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX29tbF9mb21fYXR0cl9sZW4sIHR2YiwKKysJCQkJICAgIG9mZnNldCsxLCBsZW5fbGVuLCBsZW4pOworKwkJb2Zmc2V0ICs9IGhsZW47CisrCisrCQlzdWJfdHZiID0gdHZiX25ld19zdWJzZXQodHZiLCBvZmZzZXQsIGxlbiwgbGVuKTsKKysKKysJCXN3aXRjaCAodGFnKSB7CisrCQkvKiBwYXJzZSBvbmx5IHRoZSBtb3N0IGNvbW1vbiBJRSBmb3Igbm93ICovCisrCQljYXNlIE5NX0FUVF9BQklTX0NIQU5ORUw6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9hY2hfYnRzcCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgMSwgVFJVRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9hY2hfdHNsb3QsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQrMSwgMSwgVFJVRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9hY2hfc3Nsb3QsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQrMiwgMSwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9BRE1fU1RBVEU6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9hZG1fc3RhdGUsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCXZhbDggPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCk7CisrCQkJY29sX2FwcGVuZF9mc3RyKHBpbmZvLT5jaW5mbywgQ09MX0lORk8sICIlcyAiLAorKwkJCQkJdmFsX3RvX3N0cih2YWw4LCBvbWxfYWRtX3N0YXRlX3ZhbHMsCisrCQkJCQkJICAgIiUwMngiKSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9BUkZDTl9MSVNUOgorKwkJCWZvciAoaSA9IDA7IGkgPCBsZW47IGkgKz0gMikgeworKwkJCQl2YWwxNiA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQgKyBpKTsKKysJCQkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9hcmZjbiwKKysJCQkJCQkgICAgdHZiLCBvZmZzZXQgKyBpLCAyLCB2YWwxNik7CisrCQkJfQorKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfQVZBSUxfU1RBVFVTOgorKwkJCS8qIEF2YWlsYWJpbGl0eSBzdGF0dXMgY2FuIGhhdmUgbGVuZ3RoIDAgKi8KKysJCQlpZiAobGVuKSB7CisrCQkJCXZhbDggPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCk7CisrCQkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsCisrCQkJCQkJICAgIGhmX2F0dHJfYXZhaWxfc3RhdGUsIHR2YiwKKysJCQkJCSAgICAJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJfSBlbHNlCisrCQkJCXZhbDggPSAweGZmOworKwkJCWNvbF9hcHBlbmRfZnN0cihwaW5mby0+Y2luZm8sIENPTF9JTkZPLCAiJXMgIiwKKysJCQkJCXZhbF90b19zdHIodmFsOCwgb21sX2F2YWlsX3N0YXRlX3ZhbHMsCisrCQkJCQkJICAgIiUwMngiKSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9CQ0NIX0FSRkNOOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfYmNjaF9hcmZjbiwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0JTSUM6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9ic2ljLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfQ0hBTl9DT01COgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfY2hhbl9jb21iLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfRVZFTlRfVFlQRToKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2V2ZW50X3R5cGUsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9HU01fVElNRToKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2dzbV90aW1lLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfT1BFUl9TVEFURToKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX29wZXJfc3RhdGUsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCXZhbDggPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCk7CisrCQkJY29sX2FwcGVuZF9mc3RyKHBpbmZvLT5jaW5mbywgQ09MX0lORk8sICIlcyAiLAorKwkJCQkJdmFsX3RvX3N0cih2YWw4LCBvbWxfb3Blcl9zdGF0ZV92YWxzLAorKwkJCQkJCSAgICIlMDJ4IikpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfVEVJOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfdGVpLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfVFNDOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oYXR0X3RyZWUsIGhmX2F0dHJfdHNjLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIFRSVUUpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfU0VWRVJJVFk6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9zZXZlcml0eSwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX1RFU1RfUkVQT1JUOgorKwkJCWRpc3NlY3RfaXBhY2NfdGVzdF9yZXAoYXR0X3RyZWUsIHN1Yl90dmIpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfVEVTVF9OTzoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX3Rlc3Rfbm8sIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJdmFsOCA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KTsKKysJCQljb2xfYXBwZW5kX2ZzdHIocGluZm8tPmNpbmZvLCBDT0xfSU5GTywgIiVzICIsCisrCQkJCQl2YWxfdG9fc3RyKHZhbDgsIG9tbF90ZXN0X25vX3ZhbHMsCisrCQkJCQkJICAgIiUwMngiKSk7CisrCQkJYnJlYWs7CisrCisrCQkvKiBwcm9wcmlldGFyeSBpcC5hY2Nlc3MgZXh0ZW5zaW9ucyAqLworKwkJY2FzZSBOTV9BVFRfSVBBQ0NfRFNUX0lQOgorKwkJCXZhbDMyID0gdHZiX2dldF9udG9obCh0dmIsIG9mZnNldCk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXB2NChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfcnNsX2lwLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIHZhbDMyKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX0RTVF9JUF9QT1JUOgorKwkJCXZhbDE2ID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCk7CisrCQkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfcnNsX3BvcnQsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgdmFsMTYpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfSVBBQ0NfTE9DQVRJT046CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfbG9jYXRpb25fbmFtZSwKKysJCQkJCSAgICB0dmIsIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX1VOSVRfSUQ6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfdW5pdF9pZCwKKysJCQkJCSAgICB0dmIsIG9mZnNldCwgbGVuLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX1VOSVRfTkFNRToKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV91bml0X25hbWUsCisrCQkJCQkgICAgdHZiLCBvZmZzZXQsIGxlbiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19QUklNX09NTF9DRkdfTElTVDoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV9wcmltX29tbF9pcCwKKysJCQkJCSAgICB0dmIsIG9mZnNldCsxLCA0LCBUUlVFKTsKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9hdHRyX2lwYV9wcmltX29tbF9wb3J0LAorKwkJCQkJICAgIHR2Yiwgb2Zmc2V0KzErNCwgMiwgVFJVRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19OVl9GTEFHUzoKKysJCQl7CisrCQkJCWd1aW50IGZsYWdzLCBtYXNrOworKwkJCQlmbGFncyA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KTsKKysJCQkJbWFzayA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzEpOworKwkJCQlmbGFncyB8PSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCsyKSA8PCA4OworKwkJCQltYXNrIHw9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzMpIDw8IDg7CisrCQkJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX252X2ZsYWdzLAorKwkJCQkJCSAgICB0dmIsIG9mZnNldCwgMywgZmxhZ3MpOworKwkJCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9hdHRyX2lwYV9udl9tYXNrLAorKwkJCQkJCSAgICB0dmIsIG9mZnNldCsxLCAzLCBtYXNrKTsKKysJCQl9CisrCQkJYnJlYWs7CisrCQljYXNlIE5NX0FUVF9JUEFDQ19SQUM6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShhdHRfdHJlZSwgaGZfYXR0cl9pcGFfcmFjLAorKwkJCQkJICAgIHR2Yiwgb2Zmc2V0LCAxLCBUUlVFKTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX05TRUk6CisrCQkJdmFsMTYgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KTsKKysJCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9hdHRyX2lwYV9uc2VpLAorKwkJCQkJICAgdHZiLCBvZmZzZXQsIDIsIHZhbDE2KTsKKysJCQlicmVhazsKKysJCWNhc2UgTk1fQVRUX0lQQUNDX05TVkNJOgorKwkJCXZhbDE2ID0gdHZiX2dldF9udG9ocyh0dmIsIG9mZnNldCk7CisrCQkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfbnN2Y2ksCisrCQkJCQkgICB0dmIsIG9mZnNldCwgMiwgdmFsMTYpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfSVBBQ0NfQlZDSToKKysJCQl2YWwxNiA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQpOworKwkJCXByb3RvX3RyZWVfYWRkX3VpbnQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX2J2Y2ksCisrCQkJCQkgICB0dmIsIG9mZnNldCwgMiwgdmFsMTYpOworKwkJCWJyZWFrOworKwkJY2FzZSBOTV9BVFRfSVBBQ0NfTlNfTElOS19DRkc6CisrCQkJdmFsMTYgPSB0dmJfZ2V0X250b2hzKHR2Yiwgb2Zmc2V0KTsKKysJCQlwcm90b190cmVlX2FkZF91aW50KGF0dF90cmVlLCBoZl9hdHRyX2lwYV9uc2xfc3BvcnQsCisrCQkJCQkgICB0dmIsIG9mZnNldCwgMiwgdmFsMTYpOworKwkJCXZhbDMyID0gdHZiX2dldF9pcHY0KHR2Yiwgb2Zmc2V0KzIpOworKwkJCXByb3RvX3RyZWVfYWRkX2lwdjQoYXR0X3RyZWUsIGhmX2F0dHJfaXBhX25zbF9kYWRkciwKKysJCQkJCSAgIHR2Yiwgb2Zmc2V0KzIsIDQsIHZhbDMyKTsKKysJCQl2YWwxNiA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQrNik7CisrCQkJcHJvdG9fdHJlZV9hZGRfdWludChhdHRfdHJlZSwgaGZfYXR0cl9pcGFfbnNsX2Rwb3J0LAorKwkJCQkJICAgdHZiLCBvZmZzZXQrNiwgMiwgdmFsMTYpOworKwkJCWJyZWFrOworKwkJZGVmYXVsdDoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGF0dF90cmVlLCBoZl9vbWxfZm9tX2F0dHJfdmFsLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCX0KKysJCW9mZnNldCArPSBsZW47CisrCX0KKysJcmV0dXJuIG9mZnNldDsKKyt9CisrCisrc3RhdGljIGludAorK2Rpc3NlY3Rfb21sX2ZvbSh0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8sIHByb3RvX3RyZWUgKnRyZWUsCisrCQlpbnQgb2Zmc2V0LCBwcm90b19pdGVtICp0b3BfdGkpCisreworKwlndWludDggbXNnX3R5cGUsIG9ial9jbGFzcywgYnRzX25yLCB0cnhfbnIsIHRzX25yOworKwlwcm90b19pdGVtICp0aTsKKysJcHJvdG9fdHJlZSAqZm9tX3RyZWU7CisrCisrCW1zZ190eXBlID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOworKwlvYmpfY2xhc3MgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCsxKTsKKysJYnRzX25yID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrMik7CisrCXRyeF9uciA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzMpOworKwl0c19uciA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzQpOworKwlwcm90b19pdGVtX2FwcGVuZF90ZXh0KHRvcF90aSwgIiwgJXMoJTAyeCwlMDJ4LCUwMngpICVzICIsCisrCQkJdmFsX3RvX3N0cihvYmpfY2xhc3MsIG9tbF9mb21fb2JqY2xhc3NfdmFscywgIiUwMngiKSwKKysJCQlidHNfbnIsIHRyeF9uciwgdHNfbnIsCisrCQkJdmFsX3RvX3N0cihtc2dfdHlwZSwgb21sX2ZvbV9tc2d0eXBlX3ZhbHMsCisrCQkJCSAgICJ1bmtub3duIDB4JXgiKSk7CisrCWNvbF9hcHBlbmRfZnN0cihwaW5mby0+Y2luZm8sIENPTF9JTkZPLCAiJXMoJTAyeCwlMDJ4LCUwMngpICVzICIsCisrCQkJdmFsX3RvX3N0cihvYmpfY2xhc3MsIG9tbF9mb21fb2JqY2xhc3NfdmFscywgIiUwMngiKSwKKysJCQlidHNfbnIsIHRyeF9uciwgdHNfbnIsCisrCQkJdmFsX3RvX3N0cihtc2dfdHlwZSwgb21sX2ZvbV9tc2d0eXBlX3ZhbHMsCisrCQkJCSAgICJ1bmtub3duIDB4JXgiKSk7CisrCXRpID0gcHJvdG9fdHJlZV9hZGRfaXRlbSh0cmVlLCBoZl9vbWxfZm9tX21zZ3R5cGUsIHR2Yiwgb2Zmc2V0KyssIDEsIEZBTFNFKTsKKysJZm9tX3RyZWUgPSBwcm90b19pdGVtX2FkZF9zdWJ0cmVlKHRpLCBldHRfb21sX2ZvbSk7CisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oZm9tX3RyZWUsIGhmX29tbF9mb21fb2JqY2xhc3MsIHR2Yiwgb2Zmc2V0KyssIDEsIEZBTFNFKTsKKysJcHJvdG9fdHJlZV9hZGRfaXRlbShmb21fdHJlZSwgaGZfb21sX2ZvbV9pbnN0X2J0cywgdHZiLCBvZmZzZXQrKywgMSwgRkFMU0UpOworKwlwcm90b190cmVlX2FkZF9pdGVtKGZvbV90cmVlLCBoZl9vbWxfZm9tX2luc3RfdHJ4LCB0dmIsIG9mZnNldCsrLCAxLCBGQUxTRSk7CisrCXByb3RvX3RyZWVfYWRkX2l0ZW0oZm9tX3RyZWUsIGhmX29tbF9mb21faW5zdF90cywgdHZiLCBvZmZzZXQrKywgMSwgRkFMU0UpOworKworKworKwkvKiBkaXNzZWN0IHRoZSBUTFYgb2JqZWN0cyBpbiB0aGUgbWVzc2FnZSBib2R5ICovCisrCW9mZnNldCA9IGRpc3NlY3Rfb21sX2F0dHJzKHR2Yiwgb2Zmc2V0LCBwaW5mbywgZm9tX3RyZWUpOworKworKwlyZXR1cm4gb2Zmc2V0OworK30KKysKKytzdGF0aWMgY29uc3QgZ3VpbnQ4IGlwYWNjZXNzX21hZ2ljW10gPSAiY29tLmlwYWNjZXNzIjsKKysKKytzdGF0aWMgaW50CisrZGlzc2VjdF9vbWxfbWFudWYodHZidWZmX3QgKnR2YiwgcGFja2V0X2luZm8gKnBpbmZvLCBwcm90b190cmVlICp0cmVlLAorKwkJICBpbnQgb2Zmc2V0LCBwcm90b19pdGVtICp0b3BfdGkpCisreworKwlpZiAodHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpICE9IDB4MGQgfHwKKysJICAgIHR2Yl9tZW1lcWwodHZiLCBvZmZzZXQrMSwgaXBhY2Nlc3NfbWFnaWMsIHNpemVvZihpcGFjY2Vzc19tYWdpYykpKQorKwkJcmV0dXJuIG9mZnNldDsKKysKKysJb2Zmc2V0ICs9IHNpemVvZihpcGFjY2Vzc19tYWdpYykgKyAxOworKworKwlyZXR1cm4gZGlzc2VjdF9vbWxfZm9tKHR2YiwgcGluZm8sIHRyZWUsIG9mZnNldCwgdG9wX3RpKTsKKyt9CisrCisrc3RhdGljIHZvaWQKKytkaXNzZWN0X2FiaXNfb21sKHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbywgcHJvdG9fdHJlZSAqdHJlZSkKKyt7CisrCXByb3RvX2l0ZW0gKnRpOworKwlwcm90b190cmVlICpvbWxfdHJlZTsKKysKKysJaW50IG9mZnNldCA9IDA7CisrCisrCWNvbF9zZXRfc3RyKHBpbmZvLT5jaW5mbywgQ09MX1BST1RPQ09MLCAiT01MIik7CisrCisrCXRvcF90cmVlID0gdHJlZTsKKysJaWYgKHRyZWUpIHsKKysJCXVfaW50OF90IG1zZ19kaXNjID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQpOworKworKwkJdGkgPSBwcm90b190cmVlX2FkZF9pdGVtKHRyZWUsIHByb3RvX2FiaXNfb21sLCB0dmIsIDAsIC0xLCBGQUxTRSk7CisrCQlvbWxfdHJlZSA9IHByb3RvX2l0ZW1fYWRkX3N1YnRyZWUodGksIGV0dF9vbWwpOworKworKwkJcHJvdG9fdHJlZV9hZGRfaXRlbShvbWxfdHJlZSwgaGZfb21sX21zZ19kaXNjLCB0dmIsIG9mZnNldCsrLAorKwkJCQkgICAgMSwgVFJVRSk7CisrCQlwcm90b190cmVlX2FkZF9pdGVtKG9tbF90cmVlLCBoZl9vbWxfcGxhY2VtZW50LCB0dmIsIG9mZnNldCsrLAorKwkJCQkgICAgMSwgVFJVRSk7CisrCQlwcm90b190cmVlX2FkZF9pdGVtKG9tbF90cmVlLCBoZl9vbWxfc2VxdWVuY2UsIHR2Yiwgb2Zmc2V0KyssCisrCQkJCSAgICAxLCBUUlVFKTsKKysJCXByb3RvX3RyZWVfYWRkX2l0ZW0ob21sX3RyZWUsIGhmX29tbF9sZW5ndGgsIHR2Yiwgb2Zmc2V0KyssCisrCQkJCSAgICAxLCBUUlVFKTsKKysKKysJCXN3aXRjaCAobXNnX2Rpc2MpIHsKKysJCWNhc2UgQUJJU19PTV9NRElTQ19GT006CisrCQkJb2Zmc2V0ID0gZGlzc2VjdF9vbWxfZm9tKHR2YiwgcGluZm8sIG9tbF90cmVlLAorKwkJCQkJCSBvZmZzZXQsIHRpKTsKKysJCQlicmVhazsKKysJCWNhc2UgQUJJU19PTV9NRElTQ19NQU5VRjoKKysJCQlvZmZzZXQgPSBkaXNzZWN0X29tbF9tYW51Zih0dmIsIHBpbmZvLCBvbWxfdHJlZSwJCQkJCQkJICAgICAgIG9mZnNldCwgdGkpOworKwkJCWJyZWFrOworKwkJY2FzZSBBQklTX09NX01ESVNDX01NSToKKysJCWNhc2UgQUJJU19PTV9NRElTQ19UUkFVOgorKwkJZGVmYXVsdDoKKysJCQlicmVhazsKKysJCX0KKysJfQorK30KKysKKyt2b2lkCisrcHJvdG9fcmVnX2hhbmRvZmZfYWJpc19vbWwodm9pZCk7CisrCisrdm9pZAorK3Byb3RvX3JlZ2lzdGVyX2FiaXNfb21sKHZvaWQpCisreworKwlzdGF0aWMgaGZfcmVnaXN0ZXJfaW5mbyBoZltdID0geworKwkJeyAmaGZfb21sX21zZ19kaXNjLAorKwkJCXsgIk1lc3NhZ2UgRGlzY3JpbWluYXRvciIsICJvbWwubXNnX2RzYyIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMob21sX21zZ19kaXNjX3ZhbHMpLCAwLAorKwkJCSAgIkdTTSAxMi4yMSBNZXNzYWdlIERpc2NyaW1pbmF0b3IiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfb21sX3BsYWNlbWVudCwKKysJCQl7ICJQbGFjZW1lbnQgSW5kaWNhdG9yIiwgIm9tbC5wbGFjZW1lbnQiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF9wbGFjZW1lbnRfdmFscyksIDAsCisrCQkJICAiR1NNIDEyLjIxIFBsYWNlbWVudCBJbmRpY2F0b3IiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfb21sX3NlcXVlbmNlLAorKwkJCXsgIlNlcXVlbmNlIE51bWJlciIsICJvbWwuc2VxdWVuY2UiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBOVUxMLCAwLAorKwkJCSAgIlNlcXVlbmNlIE51bWJlciAoaWYgbXVsdGktcGFydCBtc2cpIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9sZW5ndGgsCisrCQkJeyAiTGVuZ3RoIEluZGljYXRvciIsICJvbWwubGVuZ3RoIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgICJUb3RhbCBsZW5ndGggb2YgcGF5bG9hZCIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfZm9tX21zZ3R5cGUsCisrCQkJeyAiRk9NIE1lc3NhZ2UgVHlwZSIsICJvbWwuZm9tLm1zZ190eXBlIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfZm9tX21zZ3R5cGVfdmFscyksIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfb21sX2ZvbV9vYmpjbGFzcywKKysJCQl7ICJGT00gT2JqZWN0IENsYXNzIiwgIm9tbC5mb20ub2JqX2NsYXNzIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfZm9tX29iamNsYXNzX3ZhbHMpLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9mb21faW5zdF9idHMsCisrCQkJeyAiRk9NIE9iamVjdCBJbnN0YW5jZSBCVFMiLCAib21sLmZvbS5vYmpfaW5zdC5idHMiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9mb21faW5zdF90cngsCisrCQkJeyAiRk9NIE9iamVjdCBJbnN0YW5jZSBUUlgiLCAib21sLmZvbS5vYmpfaW5zdC50cngiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9mb21faW5zdF90cywKKysJCQl7ICJGT00gT2JqZWN0IEluc3RhbmNlIFRTIiwgIm9tbC5mb20ub2JqX2luc3QudHMiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX29tbF9mb21fYXR0cl90YWcsCisrCQkJeyAiRk9NIEF0dHJpYnV0ZSBJRCIsICJvbWwuZm9tLmF0dHJfaWQiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF9mb21fYXR0cl92YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfZm9tX2F0dHJfbGVuLAorKwkJCXsgIkZPTSBBdHRyaWJ1dGUgTGVuZ3RoIiwgIm9tbC5mb20uYXR0cl9sZW4iLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9vbWxfZm9tX2F0dHJfdmFsLAorKwkJCXsgIkZPTSBBdHRyaWJ1dGUgVmFsdWUiLCAib21sLmZvbS5hdHRyX3ZhbCIsCisrCQkJICBGVF9CWVRFUywgQkFTRV9OT05FLCBOVUxMLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysKKysKKysKKysJCS8qIE9NTCBBdHRyaWJ1dGVzICovCisrCQl7ICZoZl9hdHRyX2FkbV9zdGF0ZSwKKysJCQl7ICJBZG1pbmlzdHJhdGl2ZSBTdGF0ZSIsICJvbWwuZm9tLmF0dHIuYWRtX3N0YXRlIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfYWRtX3N0YXRlX3ZhbHMpLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfYXJmY24sCisrCQkJeyAiQVJGQ04iLCAib21sLmZvbS5hdHRyLmFyZmNuIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX29wZXJfc3RhdGUsCisrCQkJeyAiT3BlcmF0aW9uYWwgU3RhdGUiLCAib21sLmZvbS5hdHRyLm9wZXJfc3RhdGUiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF9vcGVyX3N0YXRlX3ZhbHMpLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfYXZhaWxfc3RhdGUsCisrCQkJeyAiQXZhaWxhYmlsaXR5IFN0YXR1cyIsICJvbWwuZm9tLmF0dHIuYXZhaWxfc3RhdGUiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF9hdmFpbF9zdGF0ZV92YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2V2ZW50X3R5cGUsCisrCQkJeyAiRXZlbnQgVHlwZSIsICJvbWwuZm9tLmF0dHIuZXZlbnRfdHlwZSIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMob21sX2V2ZW50X3R5cGVfdmFscyksIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9zZXZlcml0eSwKKysJCQl7ICJTZXZlcml0eSIsICJvbWwuZm9tLmF0dHIuc2V2ZXJpdHkiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF9zZXZlcml0eV92YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2JjY2hfYXJmY24sCisrCQkJeyAiQkNDSCBBUkZDTiIsICJvbWwuZm9tLmF0dHIuYmNjaF9hcmZjbiIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgIkFSRkNOIG9mIHRoZSBCQ0NIIiwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfYnNpYywKKysJCQl7ICJCU0lDIiwgIm9tbC5mb20uYXR0ci5ic2ljIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9IRVgsIE5VTEwsIDAsCisrCQkJICAiQmFzZSBTdGF0aW9uIElkZW50aXR5IENkb2UiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl90ZXN0X25vLAorKwkJCXsgIlRlc3QgTnVtYmVyIiwgIm9tbC5mb20uYXR0ci50ZXN0X25vIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhvbWxfdGVzdF9ub192YWxzKSwgMCwKKysJCQkgIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX3RzYywKKysJCQl7ICJUU0MiLCAib21sLmZvbS5hdHRyLnRzYyIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIE5VTEwsIDAsCisrCQkJICAiVHJhaW5pbmcgU2VxdWVuY2UgQ29kZSIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX3RlaSwKKysJCQl7ICJURUkiLCAib21sLmZvbS5hdHRyLnRlaSIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9hY2hfYnRzcCwKKysJCQl7ICJCVFMgRTEgUG9ydCIsICJvbWwuZm9tLmF0dHIuYWJpc19jaC5idHNfcG9ydCIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9hY2hfdHNsb3QsCisrCQkJeyAiRTEgVGltZXNsb3QiLCAib21sLmZvbS5hdHRyLmFiaXNfY2gudGltZXNsb3QiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfYWNoX3NzbG90LAorKwkJCXsgIkUxIFN1YnNsb3QiLCAib21sLmZvbS5hdHRyLmFiaXNfY2guc3Vic2xvdCIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9nc21fdGltZSwKKysJCQl7ICJHU00gVGltZSIsICJvbWwuZm9tLmF0dHIuZ3NtX3RpbWUiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgICJHU00gVGltZSIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2NoYW5fY29tYiwKKysJCQl7ICJDaGFubmVsIENvbWJpbmF0aW9uIiwgIm9tbC5mb20uYXR0ci5jaGFuX2NvbWIiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKG9tbF9jaGFuX2NvbWJfdmFscyksIDAsCisrCQkJICBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJLyogSVAgQWNjZXNzICovCisrCQl7ICZoZl9vbWxfaXBhX3RyZXNfYXR0cl90YWcsCisrCQkJeyAiSVBBIFRlc3QgUmVzdWx0IEVtYmVkZGVkIElFIiwKKysJCQkJCQkib21sLmZvbS50ZXN0cmVwLmlwYV90YWciLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKGlwYWNjX3Rlc3RyZXNfaWVfdmFscyksIDAsCisrCQkJICAiSW5mb3JtYXRpb24gRWxlbWVudCBlbWJlZGRlZCBpbnRvIHRoZSBUZXN0IFJlc3VsdCAiCisrCQkJICAib2YgaXAuYWNjZXNzIEJUUyIsIEhGSUxMIH0sCisrCQl9LAorKwkJeyAmaGZfb21sX2lwYV90cmVzX2F0dHJfbGVuLAorKwkJCXsgIklQQSBUZXN0IFJlc3VsdCBFbWJlZGRlZCBJRSBMZW5ndGgiLAorKwkJCQkJCSJvbWwuZm9tLnRlc3RyZXAuaXBhX2xlbiIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLAorKwkJCSAgIkxlbmd0aCBvZiBpcC5hY2Nlc3MgVGVzdCBSZXN1bHQgRW1iZWRkZWQgSUUiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdGVzdF9yZXMsCisrCQkJeyAiSVBBIFRlc3QgUmVzdWx0IiwgIm9tbC5mb20udGVzdHJlcC5yZXN1bHQiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBWQUxTKGlwYWNjX3Rlc3RfcmVzX3ZhbHMpLCAwLAorKwkJCSAgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX3J4bGV2LAorKwkJCXsgIlJ4IExldmVsIiwgIm9tbC5mb20udGVzdHJlcC5pcGFfcnhsZXYiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMHhmYzAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfYl9yeGxldiwKKysJCQl7ICJSeCBMZXZlbCIsICJvbWwuZm9tLnRlc3RyZXAuaXBhX3J4bGV2X2IiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfYXJmY24sCisrCQkJeyAiQVJGQ04iLCAib21sLmZvbS50ZXN0cmVwLmlwYV9hcmZjbiIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAweDAzZmYsICJBUkZDTiIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9mX3F1YWwsCisrCQkJeyAiRnJlcXVlbmN5IFF1YWxpdHkiLCAib21sLmZvbS50ZXN0cmVwLmlwYS5mcmVxX3F1YWwiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfREVDLCBOVUxMLCAweGZjLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfZl9lcnIsCisrCQkJeyAiRnJlcXVlbmN5IEVycm9yIiwgIm9tbC5mb20udGVzdHJlcC5pcGEuZnJlcV9lcnIiLAorKwkJCSAgRlRfSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfcnhxdWFsLAorKwkJCXsgIlJ4IFF1YWxpdHkiLCAib21sLmZvbS50ZXN0cmVwLmlwYS5yeF9xdWFsIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMHg3LCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfZnJhbWVfb2ZmcywKKysJCQl7ICJGcmFtZSBPZmZzZXQiLCAib21sLmZvbS50ZXN0cmVwLmlwYS5mcmFtZV9vZmZzZXQiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX2ZyYW1lbnJfb2ZmcywKKysJCQl7ICJGcmFtZSBOdW1iZXIgT2Zmc2V0IiwKKysJCQkJCSJvbWwuZm9tLnRlc3RyZXAuaXBhLmZyYW1lbnJfb2Zmc2V0IiwKKysJCQkgIEZUX1VJTlQzMiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9ic2ljLAorKwkJCXsgIkJTSUMiLCAib21sLmZvbS50ZXN0cmVwLmlwYS5ic2ljIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0RFQywgTlVMTCwgMHgzZiwKKysJCQkgICJCYXNlIFN0YXRpb24gSWRlbnRpdHkgQ29kZSIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9jZWxsX2lkLAorKwkJCXsgIkNlbGwgSUQiLCAib21sLmZvbS50ZXN0cmVwLmlwYS5jZWxsX2lkIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9IRVgsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9yc2xfaXAsCisrCQkJeyAiQlNDIFJTTCBJUCBBZGRyZXNzIiwgIm9tbC5mb20uYXR0ci5pcGEucnNsX2lwIiwKKysJCQkgIEZUX0lQdjQsIEJBU0VfTk9ORSwgTlVMTCwgMCwKKysJCQkgICJJUCBBZGRyZXNzIHRvIHdoaWNoIHRoZSBCVFMgZXN0YWJsaXNoZXMgIgorKwkJCSAgInRoZSBSU0wgbGluayIsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9yc2xfcG9ydCwKKysJCQl7ICJCU0MgUlNMIFRDUCBQb3J0IiwgIm9tbC5mb20uYXR0ci5pcGEucnNsX3BvcnQiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMCwKKysJCQkgICJQb3J0IG51bWJlciB0byB3aGljaCB0aGUgQlNUIGVzdGFibGlzaGVzICIKKysJCQkgICJ0aGUgUlNMIGxpbmsiLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfcHJpbV9vbWxfaXAsCisrCQkJeyAiUHJpbWFyeSBPTUwgSVAgQWRkcmVzcyIsCisrCQkJCQkib21sLmZvbS5hdHRyLmlwYS5wcmltX29tbF9pcCIsCisrCQkJICBGVF9JUHY0LCBCQVNFX05PTkUsIE5VTEwsIDAsCisrCQkJICAiSVAgQWRkcmVzcyBvZiB0aGUgQlNDIGZvciB0aGUgcHJpbWFyeSBPTUwgbGluayIsCisrCQkJICBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfcHJpbV9vbWxfcG9ydCwKKysJCQl7ICJQcmltYXJ5IE9NTCBUQ1AgUG9ydCIsCisrCQkJCQkib21sLmZvbS5hdHRyLmlwYS5wcmltX29tbF9wb3J0IiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsCisrCQkJICAiVENQIFBvcnQgb2YgdGhlIEJTQyBmb3IgdGhlIHByaW1hcmx5IE9NTCBsaW5rIiwKKysJCQkgIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9sb2NhdGlvbl9uYW1lLAorKwkJCXsgIkxvY2F0aW9uIE5hbWUiLCAib21sLmZvbS5hdHRyLmlwYS5sb2NfbmFtZSIsCisrCQkJICBGVF9TVFJJTkcsIEJBU0VfTk9ORSwgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3VuaXRfbmFtZSwKKysJCQl7ICJVbml0IE5hbWUiLCAib21sLmZvbS5hdHRyLmlwYS51bml0X25hbWUiLAorKwkJCSAgRlRfU1RSSU5HLCBCQVNFX05PTkUsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV91bml0X2lkLAorKwkJCXsgIlVuaXQgSUQiLCAib21sLmZvbS5hdHRyLmlwYS51bml0X2lkIiwKKysJCQkgIEZUX1NUUklORywgQkFTRV9OT05FLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfbnZfZmxhZ3MsCisrCQkJeyAiTlZSQU0gQ29uZmlnIEZsYWdzIiwgIm9tbC5mb20uYXR0ci5pcGEubnZfZmxhZ3MiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0hFWCwgTlVMTCwgMHhmZmZmLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfbnZfbWFzaywKKysJCQl7ICJOVlJBTSBDb25maWcgTWFzayIsICJvbWwuZm9tLmF0dHIuaXBhLm52X21hc2siLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0hFWCwgTlVMTCwgMHhmZmZmLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfc2kyLAorKwkJCXsgIlN5c3RlbSBJbmZvcm1hdGlvbiAyIiwgIm9tbC5mb20uYXR0ci5pcGEuc2kyIiwKKysJCQkgIEZUX0JZVEVTLCBCQVNFX05PTkUsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV90cl9zaTJiaXMsCisrCQkJeyAiU3lzdGVtIEluZm9ybWF0aW9uIDJiaXMiLCAib21sLmZvbS5hdHRyLmlwYS5zaTJiaXMiLAorKwkJCSAgRlRfQllURVMsIEJBU0VfTk9ORSwgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX2F0dHJfaXBhX3RyX3NpMnRlciwKKysJCQl7ICJTeXN0ZW0gSW5mb3JtYXRpb24gMnRlciIsICJvbWwuZm9tLmF0dHIuaXBhLnNpMnRlciIsCisrCQkJICBGVF9CWVRFUywgQkFTRV9OT05FLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfdHJfY2hhbl9kZXNjLAorKwkJCXsgIkNlbGwgQ2hhbm5lbCBEZXNjcmlwdGlvbiIsCisrCQkJCQkJIm9tbC5mb20uYXR0ci5pcGEuY2hhbl9kZXNjIiwKKysJCQkgIEZUX0JZVEVTLCBCQVNFX05PTkUsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9uc2xfc3BvcnQsCisrCQkJeyAiTlMgTGluayBJUCBTb3VyY2UgUG9ydCIsCisrCQkJCQkJIm9tbC5mb20uYXR0ci5pcGEubnNsX3Nwb3J0IiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9uc2xfZGFkZHIsCisrCQkJeyAiTlMgTGluayBJUCBEZXN0aW5hdGlvbiBBZGRyIiwKKysJCQkJCQkib21sLmZvbS5hdHRyLmlwYS5uc2xfZGFkZHIiLAorKwkJCSAgRlRfSVB2NCwgQkFTRV9OT05FLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfYXR0cl9pcGFfbnNsX2Rwb3J0LAorKwkJCXsgIk5TIExpbmsgSVAgRGVzdGluYXRpb24gUG9ydCIsCisrCQkJCQkJIm9tbC5mb20uYXR0ci5pcGEubnNsX2Rwb3J0IiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9uc2VpLAorKwkJCXsgIk5TRUkiLCAib21sLmZvbS5hdHRyLmlwYS5uc2VpIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9uc3ZjaSwKKysJCQl7ICJOU1ZDSSIsICJvbWwuZm9tLmF0dHIuaXBhLm5zdmNpIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9idmNpLAorKwkJCXsgIkJWQ0kiLCAib21sLmZvbS5hdHRyLmlwYS5idmNpIiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9hdHRyX2lwYV9yYWMsCisrCQkJeyAiUkFDIiwgIm9tbC5mb20uYXR0ci5pcGEucmFjIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgTlVMTCwgMCwKKysJCQkgICJSb3V0aW5nIEFyZWEgQ29kZSIsIEhGSUxMIH0KKysJCX0sCisrCX07CisrCXN0YXRpYyBnaW50ICpldHRbXSA9IHsKKysJCSZldHRfb21sLAorKwkJJmV0dF9vbWxfZm9tLAorKwkJJmV0dF9vbWxfZm9tX2F0dCwKKysJfTsKKysKKysJbW9kdWxlX3QgKm9tbF9tb2R1bGU7CisrCisrCXByb3RvX2FiaXNfb21sID0gcHJvdG9fcmVnaXN0ZXJfcHJvdG9jb2woIkdTTSBBLWJpcyBPTUwiLCAiT01MIiwKKysJCQkJCQkgImdzbV9hYmlzX29tbCIpOworKworKwlwcm90b19yZWdpc3Rlcl9maWVsZF9hcnJheShwcm90b19hYmlzX29tbCwgaGYsIGFycmF5X2xlbmd0aChoZikpOworKworKwlwcm90b19yZWdpc3Rlcl9zdWJ0cmVlX2FycmF5KGV0dCwgYXJyYXlfbGVuZ3RoKGV0dCkpOworKworKwlyZWdpc3Rlcl9kaXNzZWN0b3IoImdzbV9hYmlzX29tbCIsIGRpc3NlY3RfYWJpc19vbWwsIHByb3RvX2FiaXNfb21sKTsKKysKKysKKysJb21sX21vZHVsZSA9IHByZWZzX3JlZ2lzdGVyX3Byb3RvY29sKHByb3RvX2FiaXNfb21sLCBwcm90b19yZWdfaGFuZG9mZl9hYmlzX29tbCk7CisrCXByZWZzX3JlZ2lzdGVyX2Jvb2xfcHJlZmVyZW5jZShvbWxfbW9kdWxlLCAidXNlX2lwYWNjZXNzX29tbCIsCisrCQkgICAgIlVzZSBuYW5vQlRTIGRlZmluaXRpb25zIiwKKysJCSAgICAiVXNlIGlwYWNjZXNzIG5hbm9CVFMgc3BlY2lmaWMgZGVmaW5pdGlvbnMgZm9yIE9NTCIsCisrCQkgICAgJmdsb2JhbF9vbWxfdXNlX25hbm9fYnRzKTsKKyt9CisrCisrdm9pZAorK3Byb3RvX3JlZ19oYW5kb2ZmX2FiaXNfb21sKHZvaWQpCisreworKwlkaXNzZWN0b3JfaGFuZGxlX3QgYWJpc19vbWxfaGFuZGxlOworKworKwlhYmlzX29tbF9oYW5kbGUgPSBjcmVhdGVfZGlzc2VjdG9yX2hhbmRsZShkaXNzZWN0X2FiaXNfb21sLCBwcm90b19hYmlzX29tbCk7CisrCWRpc3NlY3Rvcl9hZGQoImxhcGQuZ3NtLnNhcGkiLCBMQVBEX0dTTV9TQVBJX09NX1BST0MsIGFiaXNfb21sX2hhbmRsZSk7CisrfQorSW5kZXg6IHdpcmVzaGFyay9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWdzbV9hYmlzX29tbC5oCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0gL2Rldi9udWxsCisrKysgd2lyZXNoYXJrL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtZ3NtX2FiaXNfb21sLmgKK0BAIC0wLDAgKzEsNzg2IEBACisrLyogR1NNIE5ldHdvcmsgTWFuYWdlbWVudCBtZXNzYWdlcyBvbiB0aGUgQS1iaXMgaW50ZXJmYWNlCisrICogM0dQUCBUUyAxMi4yMSB2ZXJzaW9uIDguMC4wIFJlbGVhc2UgMTk5OSAvIEVUU0kgVFMgMTAwIDYyMyBWOC4wLjAgKi8KKysKKysvKiAoQykgMjAwOC0yMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisrICogQWxsIFJpZ2h0cyBSZXNlcnZlZAorKyAqCisrICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkKKysgKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQorKyAqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yCisrICogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKysgKgorKyAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAorKyAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCisrICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQorKyAqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCisrICoKKysgKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhbG9uZworKyAqIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sCisrICogNTEgRnJhbmtsaW4gU3RyZWV0LCBGaWZ0aCBGbG9vciwgQm9zdG9uLCBNQSAwMjExMC0xMzAxIFVTQS4KKysgKgorKyAqLworKworKyNpZm5kZWYgX19QQUNLRVRfQUJJU19PTUxfSF9fCisrI2RlZmluZSBfX1BBQ0tFVF9BQklTX09NTF9IX18KKysKKysjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisrCisrLyogRnJvbSBvcGVuYnNjL2luY2x1ZGUvb3BlbmJzYy9hYmlzX25tLmggKi8KKysKKysvKiBnZW5lcmljIGhlYWRlciBpbiBmcm9udCBvZiBldmVyeSBPTUwgbWVzc2FnZSBhY2NvcmRpbmcgdG8gVFMgMDguNTkgKi8KKytzdHJ1Y3QgYWJpc19vbV9oZHIgeworKwlndWludDgJbWRpc2M7CisrCWd1aW50OAlwbGFjZW1lbnQ7CisrCWd1aW50OAlzZXF1ZW5jZTsKKysJZ3VpbnQ4CWxlbmd0aDsKKysJZ3VpbnQ4CWRhdGFbMF07CisrfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisrCisrI2RlZmluZSBBQklTX09NX01ESVNDX0ZPTQkJMHg4MAorKyNkZWZpbmUgQUJJU19PTV9NRElTQ19NTUkJCTB4NDAKKysjZGVmaW5lIEFCSVNfT01fTURJU0NfVFJBVQkJMHgyMAorKyNkZWZpbmUgQUJJU19PTV9NRElTQ19NQU5VRgkJMHgxMAorKyNkZWZpbmUgQUJJU19PTV9QTEFDRU1FTlRfT05MWQkJMHg4MAorKyNkZWZpbmUgQUJJU19PTV9QTEFDRU1FTlRfRklSU1QgCTB4NDAKKysjZGVmaW5lIEFCSVNfT01fUExBQ0VNRU5UX01JRERMRQkweDIwCisrI2RlZmluZSBBQklTX09NX1BMQUNFTUVOVF9MQVNUCQkweDEwCisrCisrc3RydWN0IGFiaXNfb21fb2JqX2luc3QgeworKwlndWludDgJYnRzX25yOworKwlndWludDgJdHJ4X25yOworKwlndWludDgJdHNfbnI7CisrfSBfX2F0dHJpYnV0ZV9fICgocGFja2VkKSk7CisrCisrc3RydWN0IGFiaXNfb21fZm9tX2hkciB7CisrCWd1aW50OAltc2dfdHlwZTsKKysJZ3VpbnQ4CW9ial9jbGFzczsKKysJc3RydWN0IGFiaXNfb21fb2JqX2luc3QJb2JqX2luc3Q7CisrCWd1aW50OAlkYXRhWzBdOworK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworKworKyNkZWZpbmUgQUJJU19PTV9GT01fSERSX1NJWkUJKHNpemVvZihzdHJ1Y3QgYWJpc19vbV9oZHIpICsgc2l6ZW9mKHN0cnVjdCBhYmlzX29tX2ZvbV9oZHIpKQorKworKy8qIFNlY3Rpb24gOS4xOiBNZXNzYWdlIFR5cGVzICovCisrZW51bSBhYmlzX25tX21zZ3R5cGUgeworKwkvKiBTVyBEb3dubG9hZCBNYW5hZ2VtZW50IE1lc3NhZ2VzICovCisrCU5NX01UX0xPQURfSU5JVAkJCT0gMHgwMSwKKysJTk1fTVRfTE9BRF9JTklUX0FDSywKKysJTk1fTVRfTE9BRF9JTklUX05BQ0ssCisrCU5NX01UX0xPQURfU0VHLAorKwlOTV9NVF9MT0FEX1NFR19BQ0ssCisrCU5NX01UX0xPQURfQUJPUlQsCisrCU5NX01UX0xPQURfRU5ELAorKwlOTV9NVF9MT0FEX0VORF9BQ0ssCisrCU5NX01UX0xPQURfRU5EX05BQ0ssCisrCU5NX01UX1NXX0FDVF9SRVEsCQkvKiBCVFMtPkJTQyAqLworKwlOTV9NVF9TV19BQ1RfUkVRX0FDSywKKysJTk1fTVRfU1dfQUNUX1JFUV9OQUNLLAorKwlOTV9NVF9BQ1RJVkFURV9TVywJCS8qIEJTQy0+QlRTICovCisrCU5NX01UX0FDVElWQVRFX1NXX0FDSywKKysJTk1fTVRfQUNUSVZBVEVfU1dfTkFDSywKKysJTk1fTVRfU1dfQUNUSVZBVEVEX1JFUCwJCS8qIDB4MTAgKi8KKysJLyogQS1iaXMgSW50ZXJmYWNlIE1hbmFnZW1lbnQgTWVzc2FnZXMgKi8KKysJTk1fTVRfRVNUQUJMSVNIX1RFSQkJPSAweDIxLAorKwlOTV9NVF9FU1RBQkxJU0hfVEVJX0FDSywKKysJTk1fTVRfRVNUQUJMSVNIX1RFSV9OQUNLLAorKwlOTV9NVF9DT05OX1RFUlJfU0lHTiwKKysJTk1fTVRfQ09OTl9URVJSX1NJR05fQUNLLAorKwlOTV9NVF9DT05OX1RFUlJfU0lHTl9OQUNLLAorKwlOTV9NVF9ESVNDX1RFUlJfU0lHTiwKKysJTk1fTVRfRElTQ19URVJSX1NJR05fQUNLLAorKwlOTV9NVF9ESVNDX1RFUlJfU0lHTl9OQUNLLAorKwlOTV9NVF9DT05OX1RFUlJfVFJBRiwKKysJTk1fTVRfQ09OTl9URVJSX1RSQUZfQUNLLAorKwlOTV9NVF9DT05OX1RFUlJfVFJBRl9OQUNLLAorKwlOTV9NVF9ESVNDX1RFUlJfVFJBRiwKKysJTk1fTVRfRElTQ19URVJSX1RSQUZfQUNLLAorKwlOTV9NVF9ESVNDX1RFUlJfVFJBRl9OQUNLLAorKwkvKiBUcmFuc21pc3Npb24gTWFuYWdlbWVudCBNZXNzYWdlcyAqLworKwlOTV9NVF9DT05OX01EUk9QX0xJTksJCT0gMHgzMSwKKysJTk1fTVRfQ09OTl9NRFJPUF9MSU5LX0FDSywKKysJTk1fTVRfQ09OTl9NRFJPUF9MSU5LX05BQ0ssCisrCU5NX01UX0RJU0NfTURST1BfTElOSywKKysJTk1fTVRfRElTQ19NRFJPUF9MSU5LX0FDSywKKysJTk1fTVRfRElTQ19NRFJPUF9MSU5LX05BQ0ssCisrCS8qIEFpciBJbnRlcmZhY2UgTWFuYWdlbWVudCBNZXNzYWdlcyAqLworKwlOTV9NVF9TRVRfQlRTX0FUVFIJCT0gMHg0MSwKKysJTk1fTVRfU0VUX0JUU19BVFRSX0FDSywKKysJTk1fTVRfU0VUX0JUU19BVFRSX05BQ0ssCisrCU5NX01UX1NFVF9SQURJT19BVFRSLAorKwlOTV9NVF9TRVRfUkFESU9fQVRUUl9BQ0ssCisrCU5NX01UX1NFVF9SQURJT19BVFRSX05BQ0ssCisrCU5NX01UX1NFVF9DSEFOX0FUVFIsCisrCU5NX01UX1NFVF9DSEFOX0FUVFJfQUNLLAorKwlOTV9NVF9TRVRfQ0hBTl9BVFRSX05BQ0ssCisrCS8qIFRlc3QgTWFuYWdlbWVudCBNZXNzYWdlcyAqLworKwlOTV9NVF9QRVJGX1RFU1QJCQk9IDB4NTEsCisrCU5NX01UX1BFUkZfVEVTVF9BQ0ssCisrCU5NX01UX1BFUkZfVEVTVF9OQUNLLAorKwlOTV9NVF9URVNUX1JFUCwKKysJTk1fTVRfU0VORF9URVNUX1JFUCwKKysJTk1fTVRfU0VORF9URVNUX1JFUF9BQ0ssCisrCU5NX01UX1NFTkRfVEVTVF9SRVBfTkFDSywKKysJTk1fTVRfU1RPUF9URVNULAorKwlOTV9NVF9TVE9QX1RFU1RfQUNLLAorKwlOTV9NVF9TVE9QX1RFU1RfTkFDSywKKysJLyogU3RhdGUgTWFuYWdlbWVudCBhbmQgRXZlbnQgUmVwb3J0IE1lc3NhZ2VzICovCisrCU5NX01UX1NUQVRFQ0hHX0VWRU5UX1JFUAk9IDB4NjEsCisrCU5NX01UX0ZBSUxVUkVfRVZFTlRfUkVQLAorKwlOTV9NVF9TVE9QX0VWRU5UX1JFUCwKKysJTk1fTVRfU1RPUF9FVkVOVF9SRVBfQUNLLAorKwlOTV9NVF9TVE9QX0VWRU5UX1JFUF9OQUNLLAorKwlOTV9NVF9SRVNUX0VWRU5UX1JFUCwKKysJTk1fTVRfUkVTVF9FVkVOVF9SRVBfQUNLLAorKwlOTV9NVF9SRVNUX0VWRU5UX1JFUF9OQUNLLAorKwlOTV9NVF9DSEdfQURNX1NUQVRFLAorKwlOTV9NVF9DSEdfQURNX1NUQVRFX0FDSywKKysJTk1fTVRfQ0hHX0FETV9TVEFURV9OQUNLLAorKwlOTV9NVF9DSEdfQURNX1NUQVRFX1JFUSwKKysJTk1fTVRfQ0hHX0FETV9TVEFURV9SRVFfQUNLLAorKwlOTV9NVF9DSEdfQURNX1NUQVRFX1JFUV9OQUNLLAorKwlOTV9NVF9SRVBfT1VUU1RfQUxBUk1TCQk9IDB4OTMsCisrCU5NX01UX1JFUF9PVVRTVF9BTEFSTVNfQUNLLAorKwlOTV9NVF9SRVBfT1VUU1RfQUxBUk1TX05BQ0ssCisrCS8qIEVxdWlwbWVudCBNYW5hZ2VtZW50IE1lc3NhZ2VzICovCisrCU5NX01UX0NIQU5HRU9WRVIJCT0gMHg3MSwKKysJTk1fTVRfQ0hBTkdFT1ZFUl9BQ0ssCisrCU5NX01UX0NIQU5HRU9WRVJfTkFDSywKKysJTk1fTVRfT1BTVEFSVCwKKysJTk1fTVRfT1BTVEFSVF9BQ0ssCisrCU5NX01UX09QU1RBUlRfTkFDSywKKysJTk1fTVRfUkVJTklULAorKwlOTV9NVF9SRUlOSVRfQUNLLAorKwlOTV9NVF9SRUlOSVRfTkFDSywKKysJTk1fTVRfU0VUX1NJVEVfT1VULAkJLyogQlMxMTogZ2V0IGFsYXJtID8hPyAqLworKwlOTV9NVF9TRVRfU0lURV9PVVRfQUNLLAorKwlOTV9NVF9TRVRfU0lURV9PVVRfTkFDSywKKysJTk1fTVRfQ0hHX0hXX0NPTkYJCT0gMHg5MCwKKysJTk1fTVRfQ0hHX0hXX0NPTkZfQUNLLAorKwlOTV9NVF9DSEdfSFdfQ09ORl9OQUNLLAorKwkvKiBNZWFzdXJlbWVudCBNYW5hZ2VtZW50IE1lc3NhZ2VzICovCisrCU5NX01UX01FQVNfUkVTX1JFUQkJPSAweDhhLAorKwlOTV9NVF9NRUFTX1JFU19SRVNQLAorKwlOTV9NVF9TVE9QX01FQVMsCisrCU5NX01UX1NUQVJUX01FQVMsCisrCS8qIE90aGVyIE1lc3NhZ2VzICovCisrCU5NX01UX0dFVF9BVFRSCQkJPSAweDgxLAorKwlOTV9NVF9HRVRfQVRUUl9SRVNQLAorKwlOTV9NVF9HRVRfQVRUUl9OQUNLLAorKwlOTV9NVF9TRVRfQUxBUk1fVEhSRVMsCisrCU5NX01UX1NFVF9BTEFSTV9USFJFU19BQ0ssCisrCU5NX01UX1NFVF9BTEFSTV9USFJFU19OQUNLLAorKworKwlOTV9NVF9JUEFDQ19SRVNUQVJUCQk9IDB4ODcsCisrCU5NX01UX0lQQUNDX1JFU1RBUlRfQUNLLAorK307CisrCisrZW51bSBhYmlzX25tX21zZ3R5cGVfYnMxMSB7CisrCU5NX01UX0JTMTFfUkVTRVRfUkVTT1VSQ0UJPSAweDc0LAorKworKwlOTV9NVF9CUzExX0JFR0lOX0RCX1RYCQk9IDB4YTMsCisrCU5NX01UX0JTMTFfQkVHSU5fREJfVFhfQUNLLAorKwlOTV9NVF9CUzExX0JFR0lOX0RCX1RYX05BQ0ssCisrCU5NX01UX0JTMTFfRU5EX0RCX1RYCQk9IDB4YTYsCisrCU5NX01UX0JTMTFfRU5EX0RCX1RYX0FDSywKKysJTk1fTVRfQlMxMV9FTkRfREJfVFhfTkFDSywKKysJTk1fTVRfQlMxMV9DUkVBVEVfT0JKCQk9IDB4YTksCisrCU5NX01UX0JTMTFfQ1JFQVRFX09CSl9BQ0ssCisrCU5NX01UX0JTMTFfQ1JFQVRFX09CSl9OQUNLLAorKwlOTV9NVF9CUzExX0RFTEVURV9PQkoJCT0gMHhhYywKKysJTk1fTVRfQlMxMV9ERUxFVEVfT0JKX0FDSywKKysJTk1fTVRfQlMxMV9ERUxFVEVfT0JKX05BQ0ssCisrCisrCU5NX01UX0JTMTFfU0VUX0FUVFIJCT0gMHhkMCwKKysJTk1fTVRfQlMxMV9TRVRfQVRUUl9BQ0ssCisrCU5NX01UX0JTMTFfU0VUX0FUVFJfTkFDSywKKysJTk1fTVRfQlMxMV9MTVRfU0VTU0lPTgkJPSAweGRjLAorKworKwlOTV9NVF9CUzExX0dFVF9TVEFURQkJPSAweGUzLAorKwlOTV9NVF9CUzExX0dFVF9TVEFURV9BQ0ssCisrCU5NX01UX0JTMTFfTE1UX0xPR09OCQk9IDB4ZTUsCisrCU5NX01UX0JTMTFfTE1UX0xPR09OX0FDSywKKysJTk1fTVRfQlMxMV9SRVNUQVJUCQk9IDB4ZTcsCisrCU5NX01UX0JTMTFfUkVTVEFSVF9BQ0ssCisrCU5NX01UX0JTMTFfRElTQ09OTkVDVAkJPSAweGU5LAorKwlOTV9NVF9CUzExX0RJU0NPTk5FQ1RfQUNLLAorKwlOTV9NVF9CUzExX0xNVF9MT0dPRkYJCT0gMHhlYywKKysJTk1fTVRfQlMxMV9MTVRfTE9HT0ZGX0FDSywKKysJTk1fTVRfQlMxMV9SRUNPTk5FQ1QJCT0gMHhmMSwKKysJTk1fTVRfQlMxMV9SRUNPTk5FQ1RfQUNLLAorK307CisrCisrZW51bSBhYmlzX25tX21zZ3R5cGVfaXBhY2MgeworKwlOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVAkJPSAweGUwLAorKwlOTV9NVF9JUEFDQ19SU0xfQ09OTkVDVF9BQ0ssCisrCU5NX01UX0lQQUNDX1JTTF9DT05ORUNUX05BQ0ssCisrCU5NX01UX0lQQUNDX1JTTF9ESVNDT05ORUNUCT0gMHhlMywKKysJTk1fTVRfSVBBQ0NfUlNMX0RJU0NPTk5FQ1RfQUNLLAorKwlOTV9NVF9JUEFDQ19SU0xfRElTQ09OTkVDVF9OQUNLLAorKwlOTV9NVF9JUEFDQ19DT05OX1RSQUYJCT0gMHhlNiwKKysJTk1fTVRfSVBBQ0NfQ09OTl9UUkFGX0FDSywKKysJTk1fTVRfSVBBQ0NfQ09OTl9UUkFGX05BQ0ssCisrCU5NX01UX0lQQUNDX0RJU0NfVFJBRgkJPSAweGU5LAorKwlOTV9NVF9JUEFDQ19ESVNDX1RSQUZfQUNLLAorKwlOTV9NVF9JUEFDQ19ESVNDX1RSQUZfTkFDSywKKysJTk1fTVRfSVBBQ0NfREVGX0JPT1RfU1cJCT0gMHhlYywKKysJTk1fTVRfSVBBQ0NfREVGX0JPT1RfU1dfQUNLLAorKwlOTV9NVF9JUEFDQ19ERUZfQk9PVF9TV19OQUNLLAorKwlOTV9NVF9JUEFDQ19TRVRfTlZBVFRSCQk9IDB4ZWYsCisrCU5NX01UX0lQQUNDX1NFVF9OVkFUVFJfQUNLLAorKwlOTV9NVF9JUEFDQ19TRVRfTlZBVFRSX05BQ0ssCisrCU5NX01UX0lQQUNDX0dFVF9OVkFUVFIJCT0gMHhmMiwKKysJTk1fTVRfSVBBQ0NfR0VUX05WQVRUUl9BQ0ssCisrCU5NX01UX0lQQUNDX0dFVF9OVkFUVFJfTkFDSywKKysJTk1fTVRfSVBBQ0NfU0VUX0FUVFIJCT0gMHhmNSwKKysJTk1fTVRfSVBBQ0NfU0VUX0FUVFJfQUNLLAorKwlOTV9NVF9JUEFDQ19TRVRfQVRUUl9OQUNLLAorKwlOTV9NVF9JUEFDQ19BVFRSX0NIR19FVlQJPSAweGY4LAorKwlOTV9NVF9JUEFDQ19TV19ERUFDVAkJPSAweGY5LAorKwlOTV9NVF9JUEFDQ19TV19ERUFDVF9BQ0ssCisrCU5NX01UX0lQQUNDX1NXX0RFQUNUX05BQ0ssCisrCU5NX01UX0lQQUNDX01FQVNfUkVTX1JFUV9OQUNLCT0gMHhmYywKKysJTk1fTVRfSVBBQ0NfU1RBUlRfTUVBU19OQUNLLAorKwlOTV9NVF9JUEFDQ19TVE9QX01FQVNfTkFDSywKKyt9OworKworK2VudW0gYWJpc19ubV9iczExX2NlbGxfYWxsb2MgeworKwlOTV9CUzExX0NBTlJfR1NNCT0gMHgwMCwKKysJTk1fQlMxMV9DQU5SX0RDUzE4MDAJPSAweDAxLAorK307CisrCisrLyogU2VjdGlvbiA5LjI6IE9iamVjdCBDbGFzcyAqLworK2VudW0gYWJpc19ubV9vYmpfY2xhc3MgeworKwlOTV9PQ19TSVRFX01BTkFHRVIJCT0gMHgwMCwKKysJTk1fT0NfQlRTLAorKwlOTV9PQ19SQURJT19DQVJSSUVSLAorKwlOTV9PQ19DSEFOTkVMLAorKwlOTV9PQ19CQVNFQl9UUkFOU0MsCisrCS8qIFJGVTogMDUtRkUgKi8KKysJTk1fT0NfQlMxMV9BREpDCQkJPSAweGEwLAorKwlOTV9PQ19CUzExX0hBTkRPVkVSCQk9IDB4YTEsCisrCU5NX09DX0JTMTFfUFdSX0NUUkwJCT0gMHhhMiwKKysJTk1fT0NfQlMxMV9CVFNFCQkJPSAweGEzLAkJLyogTE1UPyAqLworKwlOTV9PQ19CUzExX1JBQ0sJCQk9IDB4YTQsCisrCU5NX09DX0JTMTEJCQk9IDB4YTUsCQkvKiAwMTogQUxDTyAqLworKwlOTV9PQ19CUzExX1RFU1QJCQk9IDB4YTYsCisrCU5NX09DX0JTMTFfRU5WQUJUU0UJCT0gMHhhOCwKKysJTk1fT0NfQlMxMV9CUE9SVAkJPSAweGE5LAorKworKwlOTV9PQ19HUFJTX05TRQkJCT0gMHhmMCwKKysJTk1fT0NfR1BSU19DRUxMCQkJPSAweGYxLAorKwlOTV9PQ19HUFJTX05TVkMwCQk9IDB4ZjIsCisrCU5NX09DX0dQUlNfTlNWQzEJCT0gMHhmMywKKysKKysJTk1fT0NfTlVMTAkJCT0gMHhmZiwKKyt9OworKworKy8qIFNlY3Rpb24gOS40OiBBdHRyaWJ1dGVzICovCisrZW51bSBhYmlzX25tX2F0dHIgeworKwlOTV9BVFRfQUJJU19DSEFOTkVMCT0gMHgwMSwKKysJTk1fQVRUX0FERF9JTkZPLAorKwlOTV9BVFRfQUREX1RFWFQsCisrCU5NX0FUVF9BRE1fU1RBVEUsCisrCU5NX0FUVF9BUkZDTl9MSVNULAorKwlOTV9BVFRfQVVUT05fUkVQT1JULAorKwlOTV9BVFRfQVZBSUxfU1RBVFVTLAorKwlOTV9BVFRfQkNDSF9BUkZDTiwKKysJTk1fQVRUX0JTSUMsCisrCU5NX0FUVF9CVFNfQUlSX1RJTUVSLAorKwlOTV9BVFRfQ0NDSF9MX0lfUCwKKysJTk1fQVRUX0NDQ0hfTF9ULAorKwlOTV9BVFRfQ0hBTl9DT01CLAorKwlOTV9BVFRfQ09OTl9GQUlMX0NSSVQsCisrCU5NX0FUVF9ERVNULAorKwkvKiByZXMgKi8KKysJTk1fQVRUX0VWRU5UX1RZUEUJPSAweDExLCAvKiBCUzExOiBmaWxlIGRhdGEgPyE/ICovCisrCU5NX0FUVF9GSUxFX0lELAorKwlOTV9BVFRfRklMRV9WRVJTSU9OLAorKwlOTV9BVFRfR1NNX1RJTUUsCisrCU5NX0FUVF9IU04sCisrCU5NX0FUVF9IV19DT05GSUcsCisrCU5NX0FUVF9IV19ERVNDLAorKwlOTV9BVFRfSU5UQVZFX1BBUkFNLAorKwlOTV9BVFRfSU5URVJGX0JPVU5ELAorKwlOTV9BVFRfTElTVF9SRVFfQVRUUiwKKysJTk1fQVRUX01BSU8sCisrCU5NX0FUVF9NQU5VRl9TVEFURSwKKysJTk1fQVRUX01BTlVGX1RIUkVTSCwKKysJTk1fQVRUX01BTlVGX0lELAorKwlOTV9BVFRfTUFYX1RBLAorKwlOTV9BVFRfTURST1BfTElOSywJLyogMHgyMCAqLworKwlOTV9BVFRfTURST1BfTkVYVCwKKysJTk1fQVRUX05BQ0tfQ0FVU0VTLAorKwlOTV9BVFRfTlkxLAorKwlOTV9BVFRfT1BFUl9TVEFURSwKKysJTk1fQVRUX09WRVJMX1BFUklPRCwKKysJTk1fQVRUX1BIWVNfQ09ORiwKKysJTk1fQVRUX1BPV0VSX0NMQVNTLAorKwlOTV9BVFRfUE9XRVJfVEhSRVNILAorKwlOTV9BVFRfUFJPQl9DQVVTRSwKKysJTk1fQVRUX1JBQ0hfQl9USFJFU0gsCisrCU5NX0FUVF9MREFWR19TTE9UUywKKysJTk1fQVRUX1JBRF9TVUJDLAorKwlOTV9BVFRfUkZfTUFYUE9XUl9SLAorKwlOTV9BVFRfU0lURV9JTlBVVFMsCisrCU5NX0FUVF9TSVRFX09VVFBVVFMsCisrCU5NX0FUVF9TT1VSQ0UsCQkvKiAweDMwICovCisrCU5NX0FUVF9TUEVDX1BST0IsCisrCU5NX0FUVF9TVEFSVF9USU1FLAorKwlOTV9BVFRfVDIwMCwKKysJTk1fQVRUX1RFSSwKKysJTk1fQVRUX1RFU1RfRFVSLAorKwlOTV9BVFRfVEVTVF9OTywKKysJTk1fQVRUX1RFU1RfUkVQT1JULAorKwlOTV9BVFRfVlNXUl9USFJFU0gsCisrCU5NX0FUVF9XSU5ET1dfU0laRSwKKysJLyogUmVzICAqLworKwlOTV9BVFRfQlMxMV9SU1NJX09GRlMJPSAweDNkLAorKwlOTV9BVFRfQlMxMV9UWFBXUgk9IDB4M2UsCisrCU5NX0FUVF9CUzExX0RJVkVSU0lUWQk9IDB4M2YsCisrCS8qIFJlcyAgKi8KKysJTk1fQVRUX1RTQwkJPSAweDQwLAorKwlOTV9BVFRfU1dfQ09ORklHLAorKwlOTV9BVFRfU1dfREVTQ1IsCisrCU5NX0FUVF9TRVZFUklUWSwKKysJTk1fQVRUX0dFVF9BUkksCisrCU5NX0FUVF9IV19DT05GX0NIRywKKysJTk1fQVRUX09VVFNUX0FMQVJNLAorKwlOTV9BVFRfRklMRV9EQVRBLAorKwlOTV9BVFRfTUVBU19SRVMsCisrCU5NX0FUVF9NRUFTX1RZUEUsCisrCisrCU5NX0FUVF9CUzExX0VTTl9GV19DT0RFX05PCT0gMHg0YywKKysJTk1fQVRUX0JTMTFfRVNOX0hXX0NPREVfTk8JPSAweDRmLAorKworKwlOTV9BVFRfQlMxMV9FU05fUENCX1NFUklBTAk9IDB4NTUsCisrCU5NX0FUVF9CUzExX0VYQ0VTU0lWRV9ESVNUQU5DRQk9IDB4NTgsCisrCisrCU5NX0FUVF9CUzExX0FMTF9URVNUX0NBVEcJPSAweDYwLAorKwlOTV9BVFRfQlMxMV9CVFNMU19IT1BQSU5HLAorKwlOTV9BVFRfQlMxMV9DRUxMX0FMTE9DX05SLAorKwlOTV9BVFRfQlMxMV9DRUxMX0dMT0JBTF9JRCwKKysJTk1fQVRUX0JTMTFfRU5BX0lOVEVSRl9DTEFTUwk9IDB4NjYsCisrCU5NX0FUVF9CUzExX0VOQV9JTlRfSU5URUNfSEFORE8JPSAweDY3LAorKwlOTV9BVFRfQlMxMV9FTkFfSU5UX0lOVFJDX0hBTkRPCT0gMHg2OCwKKysJTk1fQVRUX0JTMTFfRU5BX01TX1BXUl9DVFJMCT0gMHg2OSwKKysJTk1fQVRUX0JTMTFfRU5BX1BXUl9CREdUX0hPCT0gMHg2YSwKKysJTk1fQVRUX0JTMTFfRU5BX1BXUl9DVFJMX1JMRlcJPSAweDZiLAorKwlOTV9BVFRfQlMxMV9FTkFfUlhMRVZfSE8JPSAweDZjLAorKwlOTV9BVFRfQlMxMV9FTkFfUlhRVUFMX0hPCT0gMHg2ZCwKKysJTk1fQVRUX0JTMTFfRkFDQ0hfUVVBTAkJPSAweDZlLAorKworKwlOTV9BVFRfSVBBQ0NfRFNUX0lQCQk9IDB4ODAsCisrCU5NX0FUVF9JUEFDQ19EU1RfSVBfUE9SVAk9IDB4ODEsCisrCU5NX0FUVF9JUEFDQ19TU1JDCQk9IDB4ODIsCQkvKiBSVFAgU3luYyBTb3VyY2UgKi8KKysJTk1fQVRUX0lQQUNDX1JUUF9QQVlMRF9UWVBFCT0gMHg4MywKKysJTk1fQVRUX0lQQUNDX0JBU0VCX0lECQk9IDB4ODQsCisrCU5NX0FUVF9JUEFDQ19TVFJFQU1fSUQJCT0gMHg4NSwKKysJTk1fQVRUX0lQQUNDX05WX0ZMQUdTCQk9IDB4ODYsCisrCU5NX0FUVF9JUEFDQ19GUkVRX0NUUkwJCT0gMHg4NywKKysJTk1fQVRUX0lQQUNDX1BSSU1fT01MX0NGRwk9IDB4ODgsCisrCU5NX0FUVF9JUEFDQ19TRUNfT01MX0NGRwk9IDB4ODksCisrCU5NX0FUVF9JUEFDQ19JUF9JRl9DRkcJCT0gMHg4YSwJCS8qIElQIGludGVyZmFjZSAqLworKwlOTV9BVFRfSVBBQ0NfSVBfR1dfQ0ZHCQk9IDB4OGIsCQkvKiBJUCBnYXRld2F5ICovCisrCU5NX0FUVF9JUEFDQ19JTl9TRVJWX1RJTUUJPSAweDhjLAorKwlOTV9BVFRfSVBBQ0NfVFJYX0JUU19BU1MJPSAweDhkLAorKwlOTV9BVFRfSVBBQ0NfTE9DQVRJT04JCT0gMHg4ZSwJCS8qIHN0cmluZyBkZXNjcmliaW5nIGxvY2F0aW9uICovCisrCU5NX0FUVF9JUEFDQ19QQUdJTkdfQ0ZHCQk9IDB4OGYsCisrCU5NX0FUVF9JUEFDQ19GSUxFX0RBVEEJCT0gMHg5MCwKKysJTk1fQVRUX0lQQUNDX1VOSVRfSUQJCT0gMHg5MSwJCS8qIFNpdGUvQlRTL1RSWCAqLworKwlOTV9BVFRfSVBBQ0NfUEFSRU5UX1VOSVRfSUQJPSAweDkyLAorKwlOTV9BVFRfSVBBQ0NfVU5JVF9OQU1FCQk9IDB4OTMsCQkvKiBkZWZhdWx0OiBuYnRzLTxtYWMtYXMtc3RyaW5nPiAqLworKwlOTV9BVFRfSVBBQ0NfU05NUF9DRkcJCT0gMHg5NCwKKysJTk1fQVRUX0lQQUNDX1BSSU1fT01MX0NGR19MSVNUCT0gMHg5NSwKKysJTk1fQVRUX0lQQUNDX1BSSU1fT01MX0ZCX1RPVVQJPSAweDk2LAkJLyogZmFsbGJhY2sgdGltZW91dCAqLworKwlOTV9BVFRfSVBBQ0NfQ1VSX1NXX0NGRwkJPSAweDk3LAorKwlOTV9BVFRfSVBBQ0NfVElNSU5HX0JVUwkJPSAweDk4LAorKwlOTV9BVFRfSVBBQ0NfQ0dJCQk9IDB4OTksCQkvKiBDZWxsIEdsb2JhbCBJRCAqLworKwlOTV9BVFRfSVBBQ0NfUkFDCQk9IDB4OWEsCisrCU5NX0FUVF9JUEFDQ19PQkpfVkVSU0lPTgk9IDB4OWIsCisrCU5NX0FUVF9JUEFDQ19HUFJTX1BBR0lOR19DRkcJPSAweDljLAorKwlOTV9BVFRfSVBBQ0NfTlNFSQkJPSAweDlkLAorKwlOTV9BVFRfSVBBQ0NfQlZDSQkJPSAweDllLAorKwlOTV9BVFRfSVBBQ0NfTlNWQ0kJCT0gMHg5ZiwKKysJTk1fQVRUX0lQQUNDX05TX0NGRwkJPSAweGEwLAorKwlOTV9BVFRfSVBBQ0NfQlNTR1BfQ0ZHCQk9IDB4YTEsCisrCU5NX0FUVF9JUEFDQ19OU19MSU5LX0NGRwk9IDB4YTIsCisrCU5NX0FUVF9JUEFDQ19STENfQ0ZHCQk9IDB4YTMsCisrCU5NX0FUVF9JUEFDQ19BTE1fVEhSRVNIX0xJU1QJPSAweGE0LAorKwlOTV9BVFRfSVBBQ0NfTU9OSVRfVkFMX0xJU1QJPSAweGE1LAorKwlOTV9BVFRfSVBBQ0NfVElCX0NPTlRST0wJPSAweGE2LAorKwlOTV9BVFRfSVBBQ0NfU1VQUF9GRUFUVVJFUwk9IDB4YTcsCisrCU5NX0FUVF9JUEFDQ19DT0RJTkdfU0NIRU1FUwk9IDB4YTgsCisrCU5NX0FUVF9JUEFDQ19STENfQ0ZHXzIJCT0gMHhhOSwKKysJTk1fQVRUX0lQQUNDX0hFQVJUQl9UT1VUCT0gMHhhYSwKKysJTk1fQVRUX0lQQUNDX1VQVElNRQkJPSAweGFiLAorKwlOTV9BVFRfSVBBQ0NfUkxDX0NGR18zCQk9IDB4YWMsCisrCU5NX0FUVF9JUEFDQ19TU0xfQ0ZHCQk9IDB4YWQsCisrCU5NX0FUVF9JUEFDQ19TRUNfUE9TU0lCTEUJPSAweGFlLAorKwlOTV9BVFRfSVBBQ0NfSU1MX1NTTF9TVEFURQk9IDB4YWYsCisrCU5NX0FUVF9JUEFDQ19SRVZPQ19EQVRFCQk9IDB4YjAsCisrCisrCisrCU5NX0FUVF9CUzExX1JGX1JFU19JTkRfUEVSCT0gMHg4ZiwKKysKKysJTk1fQVRUX0JTMTFfUlhfTEVWX01JTl9DRUxMCT0gMHg5MCwKKysJTk1fQVRUX0JTMTFfQUJJU19FWFRfVElNRQk9IDB4OTEsCisrCU5NX0FUVF9CUzExX1RJTUVSX0hPX1JFUVVFU1QJPSAweDkyLAorKwlOTV9BVFRfQlMxMV9USU1FUl9OQ0VMTAkJPSAweDkzLAorKwlOTV9BVFRfQlMxMV9UU1lOQwkJPSAweDk0LAorKwlOTV9BVFRfQlMxMV9UVFJBVQkJPSAweDk1LAorKwlOTV9BVFRfQlMxMV9FTVJHX0NGR19NRU1CRVIJPSAweDliLAorKwlOTV9BVFRfQlMxMV9UUlhfQVJFQQkJPSAweDlmLAorKworKwlOTV9BVFRfQlMxMV9CQ0NIX1JFQ09ORgkJPSAweGQ3LAorKwlOTV9BVFRfQlMxMV9CSVRfRVJSX1RIRVNICT0gMHhhMCwKKysJTk1fQVRUX0JTMTFfQk9PVF9TV19WRVJTCT0gMHhhMSwKKysJTk1fQVRUX0JTMTFfQ0NMS19BQ0NVUkFDWQk9IDB4YTMsCisrCU5NX0FUVF9CUzExX0NDTEtfVFlQRQkJPSAweGE0LAorKwlOTV9BVFRfQlMxMV9JTlBfSU1QRURBTkNFCT0gMHhhYSwKKysJTk1fQVRUX0JTMTFfTDFfUFJPVF9UWVBFCT0gMHhhYiwKKysJTk1fQVRUX0JTMTFfTElORV9DRkcJCT0gMHhhYywKKysJTk1fQVRUX0JTMTFfTElfUE9SVF8xCQk9IDB4YWQsCisrCU5NX0FUVF9CUzExX0xJX1BPUlRfMgkJPSAweGFlLAorKworKwlOTV9BVFRfQlMxMV9MMV9SRU1fQUxNX1RZUEUJPSAweGIwLAorKwlOTV9BVFRfQlMxMV9TV19MT0FEX0lOVEVOREVECT0gMHhiYiwKKysJTk1fQVRUX0JTMTFfU1dfTE9BRF9TQUZFVFkJPSAweGJjLAorKwlOTV9BVFRfQlMxMV9TV19MT0FEX1NUT1JFRAk9IDB4YmQsCisrCisrCU5NX0FUVF9CUzExX1ZFTkRPUl9OQU1FCQk9IDB4YzEsCisrCU5NX0FUVF9CUzExX0hPUFBJTkdfTU9ERQk9IDB4YzUsCisrCU5NX0FUVF9CUzExX0xNVF9MT0dPTl9TRVNTSU9OCT0gMHhjNiwKKysJTk1fQVRUX0JTMTFfTE1UX0xPR0lOX1RJTUUJPSAweGM3LAorKwlOTV9BVFRfQlMxMV9MTVRfVVNFUl9BQ0NfTEVWCT0gMHhjOCwKKysJTk1fQVRUX0JTMTFfTE1UX1VTRVJfTkFNRQk9IDB4YzksCisrCisrCU5NX0FUVF9CUzExX0wxX0NPTlRST0xfVFMJPSAweGQ4LAorKwlOTV9BVFRfQlMxMV9SQURJT19NRUFTX0dSQU4JPSAweGRjLAkvKiBpbiBTQUNDSCBtdWx0aWZyYW1lcyAqLworKwlOTV9BVFRfQlMxMV9SQURJT19NRUFTX1JFUAk9IDB4ZGQsCisrCisrCU5NX0FUVF9CUzExX1NIX0xBUERfSU5UX1RJTUVSCT0gMHhlOCwKKysKKysJTk1fQVRUX0JTMTFfQlRTX1NUQVRFCQk9IDB4ZjAsCisrCU5NX0FUVF9CUzExX0UxX1NUQVRFCQk9IDB4ZjEsCisrCU5NX0FUVF9CUzExX1BMTAkJCT0gMHhmMiwKKysJTk1fQVRUX0JTMTFfUlhfT0ZGU0VUCQk9IDB4ZjMsCisrCU5NX0FUVF9CUzExX0FOVF9UWVBFCQk9IDB4ZjQsCisrCU5NX0FUVF9CUzExX1BMTF9NT0RFCQk9IDB4ZmMsCisrCU5NX0FUVF9CUzExX1BBU1NXT1JECQk9IDB4ZmQsCisrfTsKKysjZGVmaW5lIE5NX0FUVF9CUzExX0ZJTEVfREFUQQlOTV9BVFRfRVZFTlRfVFlQRQorKworKy8qIFNlY3Rpb24gOS40LjQ6IEFkbWluaXN0cmF0aXZlIFN0YXRlICovCisrZW51bSBhYmlzX25tX2FkbV9zdGF0ZSB7CisrCU5NX1NUQVRFX0xPQ0tFRAkJPSAweDAxLAorKwlOTV9TVEFURV9VTkxPQ0tFRAk9IDB4MDIsCisrCU5NX1NUQVRFX1NIVVRET1dOCT0gMHgwMywKKysJTk1fU1RBVEVfTlVMTAkJPSAweGZmLAorK307CisrCisrLyogU2VjdGlvbiA5LjQuMTM6IENoYW5uZWwgQ29tYmluYXRpb24gKi8KKytlbnVtIGFiaXNfbm1fY2hhbl9jb21iIHsKKysJTk1fQ0hBTkNfVENIRnVsbAk9IDB4MDAsCisrCU5NX0NIQU5DX1RDSEhhbGYJPSAweDAxLAorKwlOTV9DSEFOQ19UQ0hIYWxmMgk9IDB4MDIsCisrCU5NX0NIQU5DX1NEQ0NICQk9IDB4MDMsCisrCU5NX0NIQU5DX21haW5CQ0NICT0gMHgwNCwKKysJTk1fQ0hBTkNfQkNDSENvbWIJPSAweDA1LAorKwlOTV9DSEFOQ19CQ0NICQk9IDB4MDYsCisrCU5NX0NIQU5DX0JDQ0hfQ0JDSAk9IDB4MDcsCisrCU5NX0NIQU5DX1NEQ0NIX0NCQ0gJPSAweDA4LAorK307CisrCisrLyogU2VjdGlvbiA5LjQuMTY6IEV2ZW50IFR5cGUgKi8KKytlbnVtIGFiaXNfbm1fZXZlbnRfdHlwZSB7CisrCU5NX0VWVF9DT01NX0ZBSUwJPSAweDAwLAorKwlOTV9FVlRfUU9TX0ZBSUwJCT0gMHgwMSwKKysJTk1fRVZUX1BST0NfRkFJTAk9IDB4MDIsCisrCU5NX0VWVF9FUVVJUF9GQUlMCT0gMHgwMywKKysJTk1fRVZUX0VOVl9GQUlMCQk9IDB4MDQsCisrfTsKKysKKysvKiBTZWN0aW9uOiA5LjQuNjM6IFBlcmNlaXZlZCBTZXZlcml0eSAqLworK2VudW0gYWJpc19ubV9zZXZlcml0eSB7CisrCU5NX1NFVkVSX0NFQVNFRAkJPSAweDAwLAorKwlOTV9TRVZFUl9DUklUSUNBTAk9IDB4MDEsCisrCU5NX1NFVkVSX01BSk9SCQk9IDB4MDIsCisrCU5NX1NFVkVSX01JTk9SCQk9IDB4MDMsCisrCU5NX1NFVkVSX1dBUk5JTkcJPSAweDA0LAorKwlOTV9TRVZFUl9JTkRFVEVSTUlOQVRFCT0gMHgwNSwKKyt9OworKworKy8qIFNlY3Rpb24gOS40LjQzOiBQcm9iYWJsZSBDYXVzZSBUeXBlICovCisrZW51bSBhYmlzX25tX3BjYXVzZV90eXBlIHsKKysJTk1fUENBVVNFX1RfWDcyMQk9IDB4MDEsCisrCU5NX1BDQVVTRV9UX0dTTQkJPSAweDAyLAorKwlOTV9QQ0FVU0VfVF9NQU5VRgk9IDB4MDMsCisrfTsKKysKKysvKiBTZWN0aW9uIDkuNC4zNjogTkFDSyBDYXVzZXMgKi8KKytlbnVtIGFiaXNfbm1fbmFja19jYXVzZSB7CisrCS8qIEdlbmVyYWwgTmFjayBDYXVzZXMgKi8KKysJTk1fTkFDS19JTkNPUlJfU1RSVUNUCQk9IDB4MDEsCisrCU5NX05BQ0tfTVNHVFlQRV9JTlZBTAkJPSAweDAyLAorKwlOTV9OQUNLX09CSkNMQVNTX0lOVkFMCQk9IDB4MDUsCisrCU5NX05BQ0tfT0JKQ0xBU1NfTk9UU1VQUAk9IDB4MDYsCisrCU5NX05BQ0tfQlRTTlJfVU5LTgkJPSAweDA3LAorKwlOTV9OQUNLX1RSWE5SX1VOS04JCT0gMHgwOCwKKysJTk1fTkFDS19PQkpJTlNUX1VOS04JCT0gMHgwOSwKKysJTk1fTkFDS19BVFRSSURfSU5WQUwJCT0gMHgwYywKKysJTk1fTkFDS19BVFRSSURfTk9UU1VQUAkJPSAweDBkLAorKwlOTV9OQUNLX1BBUkFNX1JBTkdFCQk9IDB4MGUsCisrCU5NX05BQ0tfQVRUUkxJU1RfSU5DT05TSVNURU5UCT0gMHgwZiwKKysJTk1fTkFDS19TUEVDX0lNUExfTk9UU1VQUAk9IDB4MTAsCisrCU5NX05BQ0tfQ0FOVF9QRVJGT1JNCQk9IDB4MTEsCisrCS8qIFNwZWNpZmljIE5hY2sgQ2F1c2VzICovCisrCU5NX05BQ0tfUkVTX05PVElNUEwJCT0gMHgxOSwKKysJTk1fTkFDS19SRVNfTk9UQVZBSUwJCT0gMHgxYSwKKysJTk1fTkFDS19GUkVRX05PVEFWQUlMCQk9IDB4MWIsCisrCU5NX05BQ0tfVEVTVF9OT1RTVVBQCQk9IDB4MWMsCisrCU5NX05BQ0tfQ0FQQUNJVFlfUkVTVFIJCT0gMHgxZCwKKysJTk1fTkFDS19QSFlTQ0ZHX05PVFBFUkZPUk0JPSAweDFlLAorKwlOTV9OQUNLX1RFU1RfTk9USU5JVAkJPSAweDFmLAorKwlOTV9OQUNLX1BIWVNDRkdfTk9UUkVTVE9SRQk9IDB4MjAsCisrCU5NX05BQ0tfVEVTVF9OT1NVQ0gJCT0gMHgyMSwKKysJTk1fTkFDS19URVNUX05PU1RPUAkJPSAweDIyLAorKwlOTV9OQUNLX01TR0lOQ09OU0lTVF9QSFlTQ0ZHCT0gMHgyMywKKysJTk1fTkFDS19GSUxFX0lOQ09NUExFVEUJCT0gMHgyNSwKKysJTk1fTkFDS19GSUxFX05PVEFWQUlMCQk9IDB4MjYsCisrCU5NX05BQ0tfRklMRV9OT1RBQ1RJVkFURQk9IDB4MjcsCisrCU5NX05BQ0tfUkVRX05PVF9HUkFOVAkJPSAweDI4LAorKwlOTV9OQUNLX1dBSVQJCQk9IDB4MjksCisrCU5NX05BQ0tfTk9USF9SRVBPUlRfRVhJU1QJPSAweDJhLAorKwlOTV9OQUNLX01FQVNfTk9UU1VQUAkJPSAweDJiLAorKwlOTV9OQUNLX01FQVNfTk9UU1RBUlQJCT0gMHgyYywKKyt9OworKworKy8qIFNlY3Rpb24gOS40LjEgKi8KKytzdHJ1Y3QgYWJpc19ubV9jaGFubmVsIHsKKysJZ3VpbnQ4CWF0dHJpYjsKKysJZ3VpbnQ4CWJ0c19wb3J0OworKwlndWludDgJdGltZXNsb3Q7CisrCWd1aW50OAlzdWJzbG90OworK30gX19hdHRyaWJ1dGVfXyAoKHBhY2tlZCkpOworKworKy8qIFNpZW1lbnMgQlMtMTEgc3BlY2lmaWMgb2JqZWN0cyBpbiB0aGUgU2llbmVtc0hXICgweEE1KSBvYmplY3QgY2xhc3MgKi8KKytlbnVtIGFiaXNfYnMxMV9vYmp0eXBlIHsKKysJQlMxMV9PQkpfQUxDTwkJPSAweDAxLAorKwlCUzExX09CSl9CQlNJRwkJPSAweDAyLAkvKiBvYmpfY2xhc3M6IDAsMSAqLworKwlCUzExX09CSl9UUlgxCQk9IDB4MDMsCS8qIG9ubHkgREVBQ1RJVkFURSBUUlgxICovCisrCUJTMTFfT0JKX0NDTEsJCT0gMHgwNCwKKysJQlMxMV9PQkpfR1BTVQkJPSAweDA2LAorKwlCUzExX09CSl9MSQkJPSAweDA3LAorKwlCUzExX09CSl9QQQkJPSAweDA5LAkvKiBvYmpfY2xhc3M6IDAsIDEqLworK307CisrCisrZW51bSBhYmlzX2JzMTFfdHJ4X3Bvd2VyIHsKKysJQlMxMV9UUlhfUE9XRVJfR1NNXzJXCT0gMHgwNiwKKysJQlMxMV9UUlhfUE9XRVJfR1NNXzI1MG1XPSAweDA3LAorKwlCUzExX1RSWF9QT1dFUl9HU01fODBtVwk9IDB4MDgsCisrCUJTMTFfVFJYX1BPV0VSX0dTTV8zMG1XCT0gMHgwOSwKKysJQlMxMV9UUlhfUE9XRVJfRENTXzNXCT0gMHgwYSwKKysJQlMxMV9UUlhfUE9XRVJfRENTXzFXNgk9IDB4MGIsCisrCUJTMTFfVFJYX1BPV0VSX0RDU181MDBtVz0gMHgwYywKKysJQlMxMV9UUlhfUE9XRVJfRENTXzE2MG1XPSAweDBkLAorK307CisrCisrZW51bSBhYmlzX2JzMTFfbGlfcGxsX21vZGUgeworKwlCUzExX0xJX1BMTF9MT0NLRUQJPSAyLAorKwlCUzExX0xJX1BMTF9TVEFOREFMT05FCT0gMywKKyt9OworKworK2VudW0gYWJpc19iczExX3BoYXNlIHsKKysJQlMxMV9TVEFURV9TT0ZUV0FSRV9SUUQJCT0gMHgwMSwKKysJQlMxMV9TVEFURV9MT0FEX1NNVV9JTlRFTkRFRAk9IDB4MTEsCisrCUJTMTFfU1RBVEVfTE9BRF9TTVVfU0FGRVRZCT0gMHgyMSwKKysJQlMxMV9TVEFURV9MT0FEX0ZBSUxFRAkJPSAweDMxLAorKwlCUzExX1NUQVRFX0xPQURfRElBR05PU1RJQwk9IDB4NDEsCisrCUJTMTFfU1RBVEVfV0FSTV9VUAkJPSAweDUxLAorKwlCUzExX1NUQVRFX1dBUk1fVVBfMgkJPSAweDUyLAorKwlCUzExX1NUQVRFX1dBSVRfTUlOX0NGRwkJPSAweDYyLAorKwlCUzExX1NUQVRFX01BSU5URU5BTkNFCQk9IDB4NzIsCisrCUJTMTFfU1RBVEVfTE9BRF9NQkNDVQkJPSAweDkyLAorKwlCUzExX1NUQVRFX1dBSVRfTUlOX0NGR18yCT0gMHhBMiwKKysJQlMxMV9TVEFURV9OT1JNQUwJCT0gMHgwMywKKysJQlMxMV9TVEFURV9BQklTX0xPQUQJCT0gMHgxMywKKyt9OworKworKy8qIEZyb20gb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdGx2LmggKi8KKytlbnVtIHRsdl90eXBlIHsKKysJVExWX1RZUEVfRklYRUQsCisrCVRMVl9UWVBFX1QsCisrCVRMVl9UWVBFX1RWLAorKwlUTFZfVFlQRV9UTFYsCisrCVRMVl9UWVBFX1RMMTZWLAorK307CisrCisrc3RydWN0IHRsdl9kZWYgeworKwllbnVtIHRsdl90eXBlIHR5cGU7CisrCXVfaW50OF90IGZpeGVkX2xlbjsKKyt9OworKworK3N0cnVjdCB0bHZfZGVmaW5pdGlvbiB7CisrCXN0cnVjdCB0bHZfZGVmIGRlZlsweGZmXTsKKyt9OworKworK2VudW0gYWJpc19ubV9pcGFjY190ZXN0X25vIHsKKysJTk1fSVBBQ0NfVEVTVE5PX1JMT09QX0FOVAk9IDB4MDEsCisrCU5NX0lQQUNDX1RFU1ROT19STE9PUF9YQ1ZSCT0gMHgwMiwKKysJTk1fSVBBQ0NfVEVTVE5PX0ZVTkNfT0JKCT0gMHgwMywKKysJTk1fSVBBQ0NfVEVTVE5PX0NIQU5fVVNBR0UJPSAweDQwLAorKwlOTV9JUEFDQ19URVNUTk9fQkNDSF9DSEFOX1VTQUdFCT0gMHg0MSwKKysJTk1fSVBBQ0NfVEVTVE5PX0ZSRVFfU1lOQwk9IDB4NDIsCisrCU5NX0lQQUNDX1RFU1ROT19CQ0NIX0lORk8JPSAweDQzLAorKwlOTV9JUEFDQ19URVNUTk9fVFhfQkVBQ09OCT0gMHg0NCwKKysJTk1fSVBBQ0NfVEVTVE5PX1NZU0lORk9fTU9OSVRPUgk9IDB4NDUsCisrCU5NX0lQQUNDX1RFU1ROT19CQ0NDSF9NT05JVE9SCT0gMHg0NiwKKyt9OworKworKy8qIGZpcnN0IGJ5dGUgYWZ0ZXIgbGVuZ3RoIGluc2lkZSBOTV9BVFRfVEVTVF9SRVBPUlQgKi8KKytlbnVtIGFiaXNfbm1faXBhY2NfdGVzdF9yZXMgeworKwlOTV9JUEFDQ19URVNUUkVTX1NVQ0NFU1MJPSAwLAorKwlOTV9JUEFDQ19URVNUUkVTX1RJTUVPVVQJPSAxLAorKwlOTV9JUEFDQ19URVNUUkVTX05PX0NIQU5TCT0gMiwKKysJTk1fSVBBQ0NfVEVTVFJFU19QQVJUSUFMCT0gMywKKysJTk1fSVBBQ0NfVEVTVFJFU19TVE9QUEVECT0gNCwKKyt9OworKworKy8qIGludGVybmFsIElFIGluc2lkZSBOTV9BVFRfVEVTVF9SRVBPUlQgKi8KKytlbnVtIGFiaXNfbm1faXBhY2NfdGVzdHJlc19pZSB7CisrCU5NX0lQQUNDX1RSX0lFX0ZSRVFfRVJSX0xJU1QJPSAzLAorKwlOTV9JUEFDQ19UUl9JRV9DSEFOX1VTQUdFCT0gNCwKKysJTk1fSVBBQ0NfVFJfSUVfQkNDSF9JTkZPCT0gNiwKKysJTk1fSVBBQ0NfVFJfSUVfUkVTVUxUX0RFVEFJTFMJPSA4LAorKwlOTV9JUEFDQ19UUl9JRV9GUkVRX0VSUgkJPSAxOCwKKyt9OworKworKy8qIEZyb20gb3BlbmJzYy9zcmMvYWJpc19ubS5jICovCisrc3RhdGljIGNvbnN0IHN0cnVjdCB0bHZfZGVmaW5pdGlvbiBubV9hdHRfdGx2ZGVmID0geworKwkuZGVmID0geworKwkJW05NX0FUVF9BQklTX0NIQU5ORUxdID0JCXsgVExWX1RZUEVfRklYRUQsIDMgfSwKKysJCVtOTV9BVFRfQUREX0lORk9dID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfQUREX1RFWFRdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfQURNX1NUQVRFXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0FSRkNOX0xJU1RdPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9BVVRPTl9SRVBPUlRdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfQVZBSUxfU1RBVFVTXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0JDQ0hfQVJGQ05dID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfQlNJQ10gPQkJCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfQlRTX0FJUl9USU1FUl0gPQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0NDQ0hfTF9JX1BdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfQ0NDSF9MX1RdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfQ0hBTl9DT01CXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0NPTk5fRkFJTF9DUklUXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfREVTVF0gPQkJCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfRVZFTlRfVFlQRV0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9GSUxFX0lEXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0ZJTEVfVkVSU0lPTl0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9HU01fVElNRV0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW05NX0FUVF9IU05dID0JCQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0hXX0NPTkZJR10gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJLy9CUzExIFtOTV9BVFRfSFdfREVTQ10gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9IV19ERVNDXSA9CQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9JTlRBVkVfUEFSQU1dID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfSU5URVJGX0JPVU5EXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCA2IH0sCisrCQlbTk1fQVRUX0xJU1RfUkVRX0FUVFJdID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9NQUlPXSA9CQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9NQU5VRl9TVEFURV0gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9NQU5VRl9USFJFU0hdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfTUFOVUZfSURdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfTUFYX1RBXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX01EUk9QX0xJTktdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfTURST1BfTkVYVF0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW05NX0FUVF9OQUNLX0NBVVNFU10gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9OWTFdID0JCQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX09QRVJfU1RBVEVdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfT1ZFUkxfUEVSSU9EXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX1BIWVNfQ09ORl0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9QT1dFUl9DTEFTU10gPQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9QT1dFUl9USFJFU0hdID0JCXsgVExWX1RZUEVfRklYRUQsIDMgfSwKKysJCVtOTV9BVFRfUFJPQl9DQVVTRV0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMyB9LAorKwkJW05NX0FUVF9SQUNIX0JfVEhSRVNIXSA9CXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfTERBVkdfU0xPVFNdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfUkFEX1NVQkNdID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfUkZfTUFYUE9XUl9SXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX1NJVEVfSU5QVVRTXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX1NJVEVfT1VUUFVUU10gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9TT1VSQ0VdID0JCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfU1BFQ19QUk9CXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX1NUQVJUX1RJTUVdID0JCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfVDIwMF0gPQkJCXsgVExWX1RZUEVfRklYRUQsIDcgfSwKKysJCVtOTV9BVFRfVEVJXSA9CQkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9URVNUX0RVUl0gPQkJeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW05NX0FUVF9URVNUX05PXSA9CQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX1RFU1RfUkVQT1JUXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX1ZTV1JfVEhSRVNIXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX1dJTkRPV19TSVpFXSA9IAkJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9UU0NdID0JCQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX1NXX0NPTkZJR10gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9TRVZFUklUWV0gPSAJCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfR0VUX0FSSV0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9IV19DT05GX0NIR10gPSAJCXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfT1VUU1RfQUxBUk1dID0JCXsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtOTV9BVFRfRklMRV9EQVRBXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX01FQVNfUkVTXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrI2lmIDAKKysJCS8qIEJTMTEgc3BlY2lmaWNzICovCisrCQlbTk1fQVRUX0JTMTFfRVNOX0ZXX0NPREVfTk9dID0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9FU05fSFdfQ09ERV9OT10gPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0VTTl9QQ0JfU0VSSUFMXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfQk9PVF9TV19WRVJTXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbMHhkNV0gPQkJCXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbMHhhOF0gPQkJCXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfUEFTU1dPUkRdID0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9UWFBXUl0gPQkJeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9SU1NJX09GRlNdID0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9MSU5FX0NGR10gPSAJeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0wxX1BST1RfVFlQRV0gPQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfQklUX0VSUl9USEVTSF0gPQl7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbTk1fQVRUX0JTMTFfRElWRVJTSVRZXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfTE1UX0xPR09OX1NFU1NJT05dPXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfTE1UX0xPR0lOX1RJTUVdID0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9MTVRfVVNFUl9BQ0NfTEVWXSA9eyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9MTVRfVVNFUl9OQU1FXSA9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfQlRTX1NUQVRFXQk9CXsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbTk1fQVRUX0JTMTFfRTFfU1RBVEVdCT0JeyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtOTV9BVFRfQlMxMV9QTExfTU9ERV0JPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX1BMTF0JPQl7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0NDTEtfQUNDVVJBQ1ldID0JeyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW05NX0FUVF9CUzExX0NDTEtfVFlQRV0gPQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbMHg5NV0gPQkJCXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysjZW5kaWYKKysJCS8qIGlwLmFjY2VzcyBzcGVjaWZpY3MgKi8KKysJCVtOTV9BVFRfSVBBQ0NfRFNUX0lQXSA9CQl7IFRMVl9UWVBFX0ZJWEVELCA0IH0sCisrCQlbTk1fQVRUX0lQQUNDX0RTVF9JUF9QT1JUXSA9CXsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtOTV9BVFRfSVBBQ0NfUFJJTV9PTUxfQ0ZHXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfTlZfRkxBR1NdID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19GUkVRX0NUUkxdID0JeyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW05NX0FUVF9JUEFDQ19TRUNfT01MX0NGR10gPQl7IFRMVl9UWVBFX0ZJWEVELCA2IH0sCisrCQlbTk1fQVRUX0lQQUNDX0lQX0lGX0NGR10gPQl7IFRMVl9UWVBFX0ZJWEVELCA4IH0sCisrCQlbTk1fQVRUX0lQQUNDX0lQX0dXX0NGR10gPQl7IFRMVl9UWVBFX0ZJWEVELCAxMiB9LAorKwkJW05NX0FUVF9JUEFDQ19MT0NBVElPTl0gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX1VOSVRfSURdID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19VTklUX05BTUVdID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19TTk1QX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX0FMTV9USFJFU0hfTElTVF09IHsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfQ1VSX1NXX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX1NUUkVBTV9JRF0gPQl7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX1JBQ10gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19PQkpfVkVSU0lPTl0gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX0dQUlNfUEFHSU5HX0NGR10gPXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfTlNFSV0gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19CVkNJXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX05TVkNJXSA9CQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX05TX0NGR10gPQkJeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19CU1NHUF9DRkddID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19OU19MSU5LX0NGR10gPQl7IFRMVl9UWVBFX1RMMTZWLCAwIH0sCisrCQlbTk1fQVRUX0lQQUNDX1JMQ19DRkddID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19TVVBQX0ZFQVRVUkVTXSA9CXsgVExWX1RZUEVfVEwxNlYsIDAgfSwKKysJCVtOTV9BVFRfSVBBQ0NfQ09ESU5HX1NDSEVNRVNdID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19STENfQ0ZHXzJdID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19STENfQ0ZHXzNdID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW05NX0FUVF9JUEFDQ19GSUxFX0RBVEFdID0JeyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwl9LAorK307CisrCisrI2VuZGlmIC8qIF9OTV9IICovCmRpZmYgLS1naXQgYS93aXJlc2hhcmsvbHVjZW50LWhuYi5wYXRjaCBiL3dpcmVzaGFyay9sdWNlbnQtaG5iLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjODUxOTUKLS0tIC9kZXYvbnVsbAorKysgYi93aXJlc2hhcmsvbHVjZW50LWhuYi5wYXRjaApAQCAtMCwwICsxLDEyMCBAQAorSW5kZXg6IHdpcmVzaGFyay9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWx1Y2VudF9obmIuYworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tIC9kZXYvbnVsbAorKysrIHdpcmVzaGFyay9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LWx1Y2VudF9obmIuYworQEAgLTAsMCArMSwxMDMgQEAKKysvKiBwYWNrZXQtbHVjZW50X2huYi5jCisrICogUm91dGluZXMgZm9yIHBhY2tldCBkaXNzZWN0aW9uIG9mIEFsY2F0ZWwvTHVjZW50IEhvbWVOb2RlQgorKyAqIENvcHlyaWdodCAyMDA5IGJ5IEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisrICoKKysgKiBUaGlzIHByb3RvY29sIGRlY29kZXIgaXMgYmFzZWQgZW50aXJlbHkgb24gcmV2ZXJzZSBlbmdpbmVlcmluZywgaS5lLgorKyAqIG9uIGVkdWNhdGVkIGd1ZXNzZXMuCisrICoKKysgKiAkSWQ6IHBhY2tldC1sdWNlbnRfaG5iLmMgMjkyNTQgMjAwOS0wNy0zMSAxOToxOToyNVogZ2VyYWxkICQKKysgKgorKyAqIFdpcmVzaGFyayAtIE5ldHdvcmsgdHJhZmZpYyBhbmFseXplcgorKyAqIEJ5IEdlcmFsZCBDb21icyA8Z2VyYWxkQHdpcmVzaGFyay5vcmc+CisrICogQ29weXJpZ2h0IDE5OTggR2VyYWxkIENvbWJzCisrICoKKysgKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCisrICogbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKKysgKiBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMgorKyAqIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgorKyAqCisrICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCisrICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKKysgKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCisrICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KKysgKgorKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisrICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKKysgKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgMDIxMTEtMTMwNywgVVNBLgorKyAqLworKworKyNpZmRlZiBIQVZFX0NPTkZJR19ICisrIyBpbmNsdWRlICJjb25maWcuaCIKKysjZW5kaWYKKysKKysjZGVmaW5lIExITkJfU0NUUF9QUElfTU0JMQorKyNkZWZpbmUgTEhOQl9TQ1RQX1BQSV9HTU0JNgorKworKyNkZWZpbmUgTEhOQl9TQ1RQX1BPUlQJCTYwMDUKKysKKysjaW5jbHVkZSA8Z2xpYi5oPgorKworKyNpbmNsdWRlIDxlcGFuL3BhY2tldC5oPgorKworKy8qIEluaXRpYWxpemUgdGhlIHByb3RvY29sIGFuZCByZWdpc3RlcmVkIGZpZWxkcyAqLworK3N0YXRpYyBpbnQgcHJvdG9fbGhuYiA9IC0xOworKworK3N0YXRpYyBpbnQgaGZfbGhuYl9sZW5ndGggPSAtMTsKKysKKysvKiBJbml0aWFsaXplIHRoZSBzdWJ0cmVlIHBvaW50ZXJzICovCisrc3RhdGljIGdpbnQgZXR0X2xobmIgPSAtMTsKKysKKytzdGF0aWMgZGlzc2VjdG9yX2hhbmRsZV90IHJhbmFwX2hhbmRsZTsKKysKKysvKiBDb2RlIHRvIGFjdHVhbGx5IGRpc3NlY3QgdGhlIHBhY2tldHMgKi8KKytzdGF0aWMgdm9pZAorK2Rpc3NlY3RfbGhuYih0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8sIHByb3RvX3RyZWUgKnRyZWUpCisreworKworKwlpbnQgb2Zmc2V0ID0gMDsKKysJdV9pbnQxNl90IGxlbjsKKysJdHZidWZmX3QgKm5leHRfdHZiOworKworKwljb2xfc2V0X3N0cihwaW5mby0+Y2luZm8sIENPTF9QUk9UT0NPTCwgIkxITkIiKTsKKysJY29sX2NsZWFyKHBpbmZvLT5jaW5mbywgQ09MX0lORk8pOworKworKwlwcm90b190cmVlX2FkZF9pdGVtKHRyZWUsIGhmX2xobmJfbGVuZ3RoLCB0dmIsIG9mZnNldCsyLCAyLCBGQUxTRSk7CisrCWxlbiA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQrMik7CisrCW5leHRfdHZiID0gdHZiX25ld19zdWJzZXQodHZiLCBvZmZzZXQrMis2LCBsZW4tNCwgLTEpOworKworKwljYWxsX2Rpc3NlY3RvcihyYW5hcF9oYW5kbGUsIG5leHRfdHZiLCBwaW5mbywgdHJlZSk7CisrfQorKworK3ZvaWQgcHJvdG9fcmVnaXN0ZXJfbHVjZW50X2huYih2b2lkKQorK3sKKysJc3RhdGljIGhmX3JlZ2lzdGVyX2luZm8gaGZbXSA9IHsKKysJCXsmaGZfbGhuYl9sZW5ndGgsCisrCQkgeyJMZW5ndGgiLCAibGhuYi5sZW4iLAorKwkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAweDAsIE5VTEwsIEhGSUxMfQorKwkJIH0sCisrCX07CisrCisrCXN0YXRpYyBnaW50ICpldHRbXSA9IHsKKysJCSZldHRfbGhuYiwKKysJfTsKKysKKysJcHJvdG9fbGhuYiA9CisrCSAgICBwcm90b19yZWdpc3Rlcl9wcm90b2NvbCgiQWxjYXRlbC9MdWNlbnQgSG9tZU5vZGVCIiwKKysJCQkJICAgICJMdWNlbnQgSE5CIiwgImxobmIiKTsKKysKKysJcHJvdG9fcmVnaXN0ZXJfZmllbGRfYXJyYXkocHJvdG9fbGhuYiwgaGYsIGFycmF5X2xlbmd0aChoZikpOworKwlwcm90b19yZWdpc3Rlcl9zdWJ0cmVlX2FycmF5KGV0dCwgYXJyYXlfbGVuZ3RoKGV0dCkpOworK30KKysKKyt2b2lkIHByb3RvX3JlZ19oYW5kb2ZmX2x1Y2VudF9obmIodm9pZCkKKyt7CisrCWRpc3NlY3Rvcl9oYW5kbGVfdCBsaG5iX2hhbmRsZTsKKysKKysJcmFuYXBfaGFuZGxlID0gZmluZF9kaXNzZWN0b3IoInJhbmFwIik7CisrCisrCWxobmJfaGFuZGxlID0gY3JlYXRlX2Rpc3NlY3Rvcl9oYW5kbGUoZGlzc2VjdF9saG5iLCBwcm90b19saG5iKTsKKysKKysJZGlzc2VjdG9yX2FkZCgic2N0cC5wcGkiLCBMSE5CX1NDVFBfUFBJX01NLCBsaG5iX2hhbmRsZSk7CisrCWRpc3NlY3Rvcl9hZGQoInNjdHAucHBpIiwgTEhOQl9TQ1RQX1BQSV9HTU0sIGxobmJfaGFuZGxlKTsKKysJZGlzc2VjdG9yX2FkZCgic2N0cC5wb3J0IiwgTEhOQl9TQ1RQX1BPUlQsIGxobmJfaGFuZGxlKTsKKyt9CitJbmRleDogd2lyZXNoYXJrL2VwYW4vZGlzc2VjdG9ycy9NYWtlZmlsZS5jb21tb24KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0tLSB3aXJlc2hhcmsub3JpZy9lcGFuL2Rpc3NlY3RvcnMvTWFrZWZpbGUuY29tbW9uCisrKysgd2lyZXNoYXJrL2VwYW4vZGlzc2VjdG9ycy9NYWtlZmlsZS5jb21tb24KK0BAIC02MDUsNiArNjA1LDcgQEAKKyAJcGFja2V0LWxvb3AuYwkJXAorIAlwYWNrZXQtbHBkLmMJCVwKKyAJcGFja2V0LWxzYy5jCQlcCisrCXBhY2tldC1sdWNlbnRfaG5iLmMJXAorIAlwYWNrZXQtbHdhcHAuYwkJXAorIAlwYWNrZXQtbHdyZXMuYwkJXAorIAlwYWNrZXQtbTJwYS5jCQlcCmRpZmYgLS1naXQgYS93aXJlc2hhcmsvcnNsLWlwYWNjZXNzLnBhdGNoIGIvd2lyZXNoYXJrL3JzbC1pcGFjY2Vzcy5wYXRjaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNmMwOWM1Ci0tLSAvZGV2L251bGwKKysrIGIvd2lyZXNoYXJrL3JzbC1pcGFjY2Vzcy5wYXRjaApAQCAtMCwwICsxLDY1MiBAQAorSW5kZXg6IHdpcmVzaGFyay9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LXJzbC5jCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CistLS0gd2lyZXNoYXJrLm9yaWcvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1yc2wuYwkyMDA5LTEwLTIxIDIzOjAzOjQxLjAwMDAwMDAwMCArMDIwMAorKysrIHdpcmVzaGFyay9lcGFuL2Rpc3NlY3RvcnMvcGFja2V0LXJzbC5jCTIwMDktMTAtMjIgMTA6MDI6NTEuMDAwMDAwMDAwICswMjAwCitAQCAtMiw2ICsyLDcgQEAKKyAgKiBSb3V0aW5lcyBmb3IgUmFkaW8gU2lnbmFsbGluZyBMaW5rIChSU0wpIGRpc3NlY3Rpb24uCisgICoKKyAgKiBDb3B5cmlnaHQgMjAwNywgQW5kZXJzIEJyb21hbiA8YW5kZXJzLmJyb21hbkBlcmljc3Nvbi5jb20+CisrICogQ29weXJpZ2h0IDIwMDksIEhhcmFsZCBXZWx0ZSA8bGFmb3JnZUBnbnVtb25rcy5vcmc+CisgICoKKyAgKiAkSWQ6IHBhY2tldC1yc2wuYyAyOTk0NCAyMDA5LTA5LTE2IDEzOjM5OjM3WiBtb3JyaXNzICQKKyAgKgorQEAgLTQ0LDYgKzQ1LDggQEAKKyAjaW5jbHVkZSA8ZXBhbi9sYXBkX3NhcGkuaD4KKyAKKyAjaW5jbHVkZSAicGFja2V0LWdzbV9hX2NvbW1vbi5oIgorKyNpbmNsdWRlICJwYWNrZXQtcnRwLmgiCisrI2luY2x1ZGUgInBhY2tldC1ydGNwLmgiCisgCisgLyogSW5pdGlhbGl6ZSB0aGUgcHJvdG9jb2wgYW5kIHJlZ2lzdGVyZWQgZmllbGRzICovCisgc3RhdGljIGludCBwcm90b19yc2wJCT0gLTE7CitAQCAtMTE3LDYgKzEyMCwyNCBAQAorIHN0YXRpYyBpbnQgaGZfcnNsX3J0ZAkJCQk9IC0xOworIHN0YXRpYyBpbnQgaGZfcnNsX2RlbGF5X2luZAkJCT0gLTE7Cisgc3RhdGljIGludCBoZl9yc2xfdGZvCQkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfc3BlZWNoX21vZGVfcwkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfc3BlZWNoX21vZGVfbQkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfY29ubl9zdGF0CQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9jb25uX2lkCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9ydHBfcGF5bG9hZAkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfcnRwX2NzZF9mbXRfZAkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfcnRwX2NzZF9mbXRfaXIJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfbG9jYWxfcG9ydAkJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfcmVtb3RlX3BvcnQJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2xvY2FsX2lwCQkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9yZW1vdGVfaXAJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2NzdGF0X3R4X3BrdHMJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2NzdGF0X3R4X29jdHMJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2NzdGF0X3J4X3BrdHMJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2NzdGF0X3J4X29jdHMJCQk9IC0xOworK3N0YXRpYyBpbnQgaGZfcnNsX2NzdGF0X2xvc3RfcGt0cwkJPSAtMTsKKytzdGF0aWMgaW50IGhmX3JzbF9jc3RhdF9pYV9qaXR0ZXIJCT0gLTE7Cisrc3RhdGljIGludCBoZl9yc2xfY3N0YXRfYXZnX3R4X2RseQkJPSAtMTsKKyAKKyAvKiBJbml0aWFsaXplIHRoZSBzdWJ0cmVlIHBvaW50ZXJzICovCisgc3RhdGljIGludCBldHRfcnNsID0gLTE7CitAQCAtMTc0LDYgKzE5NSwxNSBAQAorIHN0YXRpYyBpbnQgZXR0X2llX21lYXNfcmVzX25vID0gLTE7Cisgc3RhdGljIGludCBldHRfaWVfbWVzc2FnZV9pZCA9IC0xOworIHN0YXRpYyBpbnQgZXR0X2llX3N5c19pbmZvX3R5cGUgPSAtMTsKKytzdGF0aWMgaW50IGV0dF9pZV9zcGVlY2hfbW9kZSA9IC0xOworK3N0YXRpYyBpbnQgZXR0X2llX2Nvbm5fc3RhdCA9IC0xOworK3N0YXRpYyBpbnQgZXR0X2llX2Nvbm5faWQgPSAtMTsKKytzdGF0aWMgaW50IGV0dF9pZV9yZW1vdGVfaXAgPSAtMTsKKytzdGF0aWMgaW50IGV0dF9pZV9yZW1vdGVfcG9ydCA9IC0xOworK3N0YXRpYyBpbnQgZXR0X2llX2xvY2FsX3BvcnQgPSAtMTsKKytzdGF0aWMgaW50IGV0dF9pZV9sb2NhbF9pcCA9IC0xOworK3N0YXRpYyBpbnQgZXR0X2llX3J0cF9wYXlsb2FkID0gLTE7CisrCisgCisgcHJvdG9fdHJlZSAqdG9wX3RyZWU7CisgZGlzc2VjdG9yX2hhbmRsZV90IGdzbV9hX2NjY2hfaGFuZGxlOworQEAgLTIwOSw4ICsyMzksMTEgQEAKKyAJeyAgMHgwNiwJCSJDb21tb24gQ2hhbm5lbCBNYW5hZ2VtZW50IG1lc3NhZ2VzIiB9LAorIAl7ICAweDA4LAkJIlRSWCBNYW5hZ2VtZW50IG1lc3NhZ2VzIiB9LAorIAl7ICAweDE2LAkJIkxvY2F0aW9uIFNlcnZpY2VzIG1lc3NhZ2VzIiB9LAorKwl7ICAweDNmLAkJImlwLmFjY2VzcyBWZW5kb3IgU3BlY2lmaWMgbWVzc2FnZXMiIH0sCisgCXsgMCwJCQlOVUxMIH0KKyB9OworKyNkZWZpbmUgUlNMX01TR0RJU0NfSVBBQ0NFU1MJMHgzZgorKworIC8qCisgICogOS4yIE1FU1NBR0UgVFlQRQorICAqLworQEAgLTI3Nyw2ICszMTAsNDkgQEAKKyAJLyogCTAgMSAtIC0gLSAtIC0gLSBMb2NhdGlvbiBTZXJ2aWNlcyBtZXNzYWdlczogKi8KKyAjZGVmaW5lIFJTTF9NU0dfTE9DX0lORgkJCQkJNjUJLyogOC43LjEgKi8KKyAKKysvKiBWZW5kb3ItU3BlY2lmaWMgbWVzc2FnZXMgb2YgaXAuYWNjZXNzIG5hbm9CVFMuIFRoZXJlIGlzIG5vIHB1YmxpYyBkb2N1bWVudGF0aW9uCisrICogYWJvdXQgdGhvc2UgZXh0ZW5zaW9ucywgYWxsIGluZm9ybWF0aW9uIGluIHRoaXMgZGlzc2VjdG9yIGlzIGJhc2VkIG9uIGxhd2Z1bAorKyAqIHByb3RvY29sIHJldmVyc2UgZW5naW5lcmluZyBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAZ251bW9ua3Mub3JnPiAqLworKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfTUVBU19QUF9ERUYJMHg2MAorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfSE9fQ0FORF9JTlEJMHg2MQorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfSE9fQ0FORF9SRVNQCTB4NjIKKysKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUCTB4NDgKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUX0FDSwkweDQ5CisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0FDVF9OQUNLCTB4NGEKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfREVBQ1QJMHg0YgorKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfUERDSF9ERUFDVF9BQ0sgMHg0YworKyNkZWZpbmUgUlNMX01TR19UWVBFX0lQQUNfUERDSF9ERUFDVF9OQUNLIDB4NGQKKysKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX0JJTkQJCTB4NzAKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX0JJTkRfQUNLCTB4NzEKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX0JJTkRfTkFDSwkweDcyCisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19DT05ORUNUCTB4NzMKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX0NPTk5FQ1RfQUNLCTB4NzQKKysjZGVmaW5lIFJTTF9NU0dfVFlQRV9JUEFDX0NPTk5FQ1RfTkFDSwkweDc1CisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19ESVNDX0lORAkweDc2CisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19ESVNDCQkweDc3CisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19ESVNDX0FDSwkweDc4CisrI2RlZmluZSBSU0xfTVNHX1RZUEVfSVBBQ19ESVNDX05BQ0sJMHg3OQorKworKyNkZWZpbmUgUlNMX0lFX0lQQUNfU1JUUF9DT05GSUcJCTB4ZTAKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1BST1hZX1VEUAkJMHhlMQorKyNkZWZpbmUgUlNMX0lFX0lQQUNfQlNDTVBMX1RPVVQJCTB4ZTIKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1JFTU9URV9JUAkJMHhmMAorKyNkZWZpbmUgUlNMX0lFX0lQQUNfUkVNT1RFX1BPUlQJCTB4ZjEKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1JUUF9QQVlMT0FECQkweGYyCisrI2RlZmluZSBSU0xfSUVfSVBBQ19MT0NBTF9QT1JUCQkweGYzCisrI2RlZmluZSBSU0xfSUVfSVBBQ19TUEVFQ0hfTU9ERQkJMHhmNAorKyNkZWZpbmUgUlNMX0lFX0lQQUNfTE9DQUxfSVAJCTB4ZjUKKysjZGVmaW5lIFJTTF9JRV9JUEFDX0NPTk5fU1RBVAkJMHhmNgorKyNkZWZpbmUgUlNMX0lFX0lQQUNfSE9fQ19QQVJNUwkJMHhmNworKyNkZWZpbmUgUlNMX0lFX0lQQUNfQ09OTl9JRAkJMHhmOAorKyNkZWZpbmUgUlNMX0lFX0lQQUNfUlRQX0NTRF9GTVQJCTB4ZjkKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1JUUF9KSVRfQlVGCQkweGZhCisrI2RlZmluZSBSU0xfSUVfSVBBQ19SVFBfQ09NUFIJCTB4ZmIKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1JUUF9QQVlMT0FEMgkweGZjCisrI2RlZmluZSBSU0xfSUVfSVBBQ19SVFBfTVBMRVgJCTB4ZmQKKysjZGVmaW5lIFJTTF9JRV9JUEFDX1JUUF9NUExFWF9JRAkweGZlCisgCisgc3RhdGljIGNvbnN0IHZhbHVlX3N0cmluZyByc2xfbXNnX3R5cGVfdmFsc1tdID0geworIAkgIC8qIAkwIDAgMCAwIC0gLSAtIC0gUmFkaW8gTGluayBMYXllciBNYW5hZ2VtZW50IG1lc3NhZ2VzOiAqLworQEAgLTMzOSw2ICs0MTUsMjYgQEAKKyAJeyAgMHgzZiwJIlRGTyBNT0RpZmljYXRpb24gUkVRdWVzdCIgfSwJCQkJCS8qIDguNC4zMSAqLworIAkvKiAJMCAxIC0gLSAtIC0gLSAtIExvY2F0aW9uIFNlcnZpY2VzIG1lc3NhZ2VzOiAqLworIAl7ICAweDQxLAkiTG9jYXRpb24gSW5mb3JtYXRpb24iIH0sCQkJCQkJLyogOC43LjEgKi8KKysJLyogaXAuYWNjZXNzICovCisrCXsgIDB4NDgsCSJpcC5hY2Nlc3MgUERDSCBBQ1RJVkFUSU9OIiB9LAorKwl7ICAweDQ5LAkiaXAuYWNjZXNzIFBEQ0ggQUNUSVZBVElPTiBBQ0siIH0sCisrCXsgIDB4NGEsCSJpcC5hY2Nlc3MgUERDSCBBQ1RJVkFUSU9OIE5BQ0siIH0sCisrCXsgIDB4NGIsCSJpcC5hY2Nlc3MgUERDSCBERUFDVElWQVRJT04iIH0sCisrCXsgIDB4NGMsCSJpcC5hY2Nlc3MgUERDSCBERUFDVElWQVRJT04gQUNLIiB9LAorKwl7ICAweDRkLAkiaXAuYWNjZXNzIFBEQ0ggREVBQ1RJVkFUSU9OIE5BQ0siIH0sCisrCXsgIDB4NjAsCSJpcC5hY2Nlc3MgTUVBU3VyZW1lbnQgUFJFUFJPQ2Vzc2luZyBEZUZhdUxUIiB9LAorKwl7ICAweDYxLAkiaXAuYWNjZXNzIEhBTkRPb3ZlciBDQU5EaWRhdGUgRU5RdWlyeSIgfSwKKysJeyAgMHg2MiwJImlwLmFjY2VzcyBIQU5ET292ZXIgQ0FORGlkYXRlIFJFU1BvbnNlIiB9LAorKwl7ICAweDcwLAkiaXAuYWNjZXNzIENSQ1giIH0sCisrCXsgIDB4NzEsCSJpcC5hY2Nlc3MgQ1JDWCBBQ0siIH0sCisrCXsgIDB4NzIsCSJpcC5hY2Nlc3MgQ1JDWCBOQUNLIiB9LAorKwl7ICAweDczLAkiaXAuYWNjZXNzIE1EQ1giIH0sCisrCXsgIDB4NzQsCSJpcC5hY2Nlc3MgTURDWCBBQ0siIH0sCisrCXsgIDB4NzUsCSJpcC5hY2Nlc3MgTURDWCBOQUNLIiB9LAorKwl7ICAweDc2LAkiaXAuYWNjZXNzIERMQ1ggSU5EaWNhdGlvbiIgfSwKKysJeyAgMHg3NywJImlwLmFjY2VzcyBETENYIiB9LAorKwl7ICAweDc4LAkiaXAuYWNjZXNzIERMQ1ggQUNLIiB9LAorKwl7ICAweDc5LAkiaXAuYWNjZXNzIERMQ1ggTkFDSyIgfSwKKyAJeyAwLAkJTlVMTCB9CisgfTsKKyAKK0BAIC0zNzIsMTAgKzQ2OCwxMCBAQCBzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9tc2dfdHlwZV92YWxzW10gPSB7CisgI2RlZmluZSBSU0xfSUVfTUVTU0FHRV9JRAkJMjgKKyAKKyAjZGVmaW5lIFJTTF9JRV9TWVNfSU5GT19UWVBFCTMwCistCistCistCistCisrI2RlZmluZSBSU0xfSUVfTVNfUE9XRVJfUEFSQU0JCTMxCisrI2RlZmluZSBSU0xfSUVfQlNfUE9XRVJfUEFSQU0JCTMyCisrI2RlZmluZSBSU0xfSUVfUFJFUFJPQ19QQVJBTQkJMzMKKysjZGVmaW5lIFJTTF9JRV9QUkVQUk9DX01FQVMJCTM0CisgI2RlZmluZSBSU0xfSUVfRlVMTF9JTU1fQVNTX0lORgkJCTM1CisgI2RlZmluZSBSU0xfSUVfU01TQ0JfSU5GCQkJCTM2CisgI2RlZmluZSBSU0xfSUVfRlVMTF9NU19USU1JTkdfT0ZGU0VUCTM3CitAQCAtNDc4LDYgKzU3NCwyNCBAQAorIAkJCU5vdCB1c2VkCisgCisgCSovCisrCXsgMHhlMCwJCSJTUlRQIENvbmZpZ3VyYXRpb24iIH0sCisrCXsgMHhlMSwJCSJCU0MgUHJveHkgVURQIFBvcnQiIH0sCisrCXsgMHhlMiwJCSJCU0MgTXVsdGlwbGV4IFRpbWVvdXQiIH0sCisrCXsgMHhmMCwJCSJSZW1vdGUgSVAgQWRkcmVzcyIgfSwKKysJeyAweGYxLAkJIlJlbW90ZSBSVFAgUG9ydCIgfSwKKysJeyAweGYyLAkJIlJUUCBQYXlsb2FkIFR5cGUiIH0sCisrCXsgMHhmMywJCSJMb2NhbCBSVFAgUG9ydCIgfSwKKysJeyAweGY0LAkJIlNwZWVjaCBNb2RlIiB9LAorKwl7IDB4ZjUsCQkiTG9jYWwgSVAgQWRkcmVzcyIgfSwKKysJeyAweGY2LAkJIkNvbm5lY3Rpb24gU3RhdGlzdGljcyIgfSwKKysJeyAweGY3LAkJIkhhbmRvdmVyIEMgUGFyYW1ldGVycyIgfSwKKysJeyAweGY4LAkJIkNvbm5lY3Rpb24gSWRlbnRpZmllciIgfSwKKysJeyAweGY5LAkJIlJUUCBDU0QgRm9ybWF0IiB9LAorKwl7IDB4ZmEsCQkiUlRQIEppdHRlciBCdWZmZXIiIH0sCisrCXsgMHhmYiwJCSJSVFAgQ29tcHJlc3Npb24iIH0sCisrCXsgMHhmYywJCSJSVFAgUGF5bG9hZCBUeXBlIDIiIH0sCisrCXsgMHhmZCwJCSJSVFAgTXVsdGlwbGV4IiB9LAorKwl7IDB4ZmUsCQkiUlRQIE11bHRpcGxleCBJZGVudGlmaWVyIiB9LAorIAl7IDAsCQkJTlVMTCB9CisgfTsKKyAKK0BAIC01MTQsNiArNjI4LDk2IEBACisgCXsgMCwJCQlOVUxMIH0KKyB9OworIAorKy8qIEZyb20gb3BlbmJzYy9pbmNsdWRlL29wZW5ic2MvdGx2LmggKi8KKytlbnVtIHRsdl90eXBlIHsKKysJVExWX1RZUEVfRklYRUQsCisrCVRMVl9UWVBFX1QsCisrCVRMVl9UWVBFX1RWLAorKwlUTFZfVFlQRV9UTFYsCisrCVRMVl9UWVBFX1RMMTZWLAorK307CisrCisrc3RydWN0IHRsdl9kZWYgeworKwllbnVtIHRsdl90eXBlIHR5cGU7CisrCXVfaW50OF90IGZpeGVkX2xlbjsKKyt9OworKworK3N0cnVjdCB0bHZfZGVmaW5pdGlvbiB7CisrCXN0cnVjdCB0bHZfZGVmIGRlZlsweGZmXTsKKyt9OworKworK3N0YXRpYyBjb25zdCBzdHJ1Y3QgdGx2X2RlZmluaXRpb24gcnNsX2F0dF90bHZkZWYgPSB7CisrCS5kZWYgPSB7CisrCQlbUlNMX0lFX0NIX05PXQkJCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9MSU5LX0lEXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0FDVF9UWVBFXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0JTX1BPV10JCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfQ0hfSURdCQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9DSF9NT0RFXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9FTkNfSU5GXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9GUkFNRV9OT10JCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW1JTTF9JRV9IT19SRUZdCQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0wxX0lORl0JCQk9IHsgVExWX1RZUEVfRklYRUQsIDIgfSwKKysJCVtSU0xfSUVfTDNfSU5GXQkJCT0geyBUTFZfVFlQRV9UTDE2ViwgMCB9LAorKwkJW1JTTF9JRV9NU19JRF0JCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX01TX1BPV10JCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfUEFHSU5HX0dSUF0JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9QQUdJTkdfTE9BRF0JCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW1JTTF9JRV9QSFlfQ1RYXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9BQ0NFU1NfREVMQVldCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfUkFDSF9MT0FEXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9SRVFfUkVGXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCAzIH0sCisrCQlbUlNMX0lFX1JFTF9NT0RFXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1JFU09VUkNFX0lORl0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfUkxNX0NBVVNFXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9TVEFSVElOR19USU1FXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbUlNMX0lFX1RJTUlOR19BRFZdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfVVBMSU5LX01FQVNdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0NBVVNFXQkJCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfTUVBU19SRVNfTk9dCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfTUVTU0FHRV9JRF0JCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9TWVNfSU5GT19UWVBFXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX01TX1BPV0VSX1BBUkFNXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9CU19QT1dFUl9QQVJBTV0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfUFJFUFJPQ19QQVJBTV0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfUFJFUFJPQ19NRUFTXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJLy9bUlNMX0lFX0lNTV9BU1NfSU5GT10JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCS8vW1JTTF9JRV9TTVNDQl9JTkZPXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCAyMyB9LAorKwkJLy9bUlNMX0lFX01TX1RJTUlOR19PRkZTRVRdCT0geyBUTFZfVFlQRV9UViwgMCB9LAorKwkJW1JTTF9JRV9FUlJfTVNHXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9GVUxMX0JDQ0hfSU5GXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9DSF9ORUVERURdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfQ0JfQ01EX1RZUEVdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfU01TQ0JfTUVTU10JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfRlVMTF9JTU1fQVNTX0lORl0JPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJLy9bUlNMX0lFX1NBQ0NIX0lORk9dCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0NCQ0hfTE9BRF9JTkZdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfU01TQ0JfQ0hfSU5EXQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX0dSUF9DQUxMX1JFRl0JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfQ0hfREVTQ10JCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfTkNIX0RSWF9JTkZdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0NNRF9JTkRdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0VNTFBQX1BSSU9dCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfVUlDXQkJCT0geyBUTFZfVFlQRV9UTFYsIDAgfSwKKysJCVtSU0xfSUVfTUFJTl9DSF9SRUZdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfTVVMVElSQVRFX0NPTkZdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX01VTFRJUkFURV9DTlRSTF0JPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1NVUF9DT0RFQ19UWVBFU10JPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9DT0RFQ19DT05GXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9SVERdCQkJPSB7IFRMVl9UWVBFX1RWLCAwIH0sCisrCQlbUlNMX0lFX1RGT19TVEFUVVNdCQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfTExQX0FQRFVdCQk9IHsgVExWX1RZUEVfVExWLCAwIH0sCisrCQlbUlNMX0lFX0lQQUNfUkVNT1RFX0lQXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCA0IH0sCisrCQlbUlNMX0lFX0lQQUNfUkVNT1RFX1BPUlRdCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW1JTTF9JRV9JUEFDX0xPQ0FMX0lQXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCA0IH0sCisrCQlbUlNMX0lFX0lQQUNfQ09OTl9TVEFUXQkJPSB7IFRMVl9UWVBFX1RMViwgMCB9LAorKwkJW1JTTF9JRV9JUEFDX0xPQ0FMX1BPUlRdCT0geyBUTFZfVFlQRV9GSVhFRCwgMiB9LAorKwkJW1JTTF9JRV9JUEFDX1NQRUVDSF9NT0RFXQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJCVtSU0xfSUVfSVBBQ19DT05OX0lEXQkJPSB7IFRMVl9UWVBFX0ZJWEVELCAyIH0sCisrCQlbUlNMX0lFX0lQQUNfUlRQX1BBWUxPQUQyXQk9IHsgVExWX1RZUEVfVFYsIDAgfSwKKysJfSwKKyt9OworKworIC8qIDkuMy4xIENoYW5uZWwgbnVtYmVyCQkJOS4zLjEJTSBUViAyICovCisgc3RhdGljIGludAorIGRpc3NlY3RfcnNsX2llX2NoX25vKHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbyBfVV8sIHByb3RvX3RyZWUgKnRyZWUsIGludCBvZmZzZXQsIGdib29sZWFuIGlzX21hbmRhdG9yeSkKK0BAIC0yMDQ0LDcgKzIyNDgsNiBAQAorIAlwcm90b19pdGVtX3NldF9sZW4odGksIGxlbmd0aCsyKTsKKyAKKyAJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfaWVfbGVuZ3RoLCB0dmIsIG9mZnNldCwgMSwgRkFMU0UpOworLQlvZmZzZXQrKzsKKyAKKyAJLyogUmVjZWl2ZWQgTWVzc2FnZSAqLworIAlvZmZzZXQgPSBkaXNzY3RfcnNsX21zZyh0dmIsIHBpbmZvLCBpZV90cmVlLCBvZmZzZXQpOworQEAgLTI5MDksMTIgKzMxMTIsMTgzIEBACisgfQorIAorIHN0YXRpYyBpbnQKKytkaXNzY3RfcnNsX2lwYWNjZXNzX21zZyh0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8sIHByb3RvX3RyZWUgKnRyZWUsCQkJCSAgICBpbnQgb2Zmc2V0KQorK3sKKysJZ3VpbnQ4IG1zZ190eXBlOworKwlndWludDMyIGxvY2FsX2FkZHIgPSAwOworKwlndWludDE2IGxvY2FsX3BvcnQgPSAwOworKwlhZGRyZXNzIHNyY19hZGRyOworKworKwltc2dfdHlwZSA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KSYweDdmOworKwlvZmZzZXQrKzsKKysKKysjaWYgMAorKwlzd2l0Y2ggKG1zZ190eXBlKSB7CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfQklORDoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19CSU5EX0FDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19CSU5EX05BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfQ09OTkVDVDoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19DT05ORUNUX0FDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19DT05ORUNUX05BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfRElTQ19JTkQ6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfRElTQzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19ESVNDX0FDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19ESVNDX05BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9BQ1Q6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9BQ1RfQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUX05BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9ERUFDVDoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0RFQUNUX0FDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0RFQUNUX05BQ0s6CisrCQkvKiBDaGFubmVsIG51bWJlcgkJCTkuMy4xCU0gVFYgMgkJKi8KKysJCW9mZnNldCA9IGRpc3NlY3RfcnNsX2llX2NoX25vKHR2YiwgcGluZm8sIHRyZWUsIG9mZnNldCwgVFJVRSk7CisrCQlicmVhazsKKysJfQorKyNlbmRpZgorKwkvKiBwYXJzZSBUTFYgYXR0cmlidXRlcyAqLworKwl3aGlsZSAodHZiX3JlcG9ydGVkX2xlbmd0aF9yZW1haW5pbmcodHZiLCBvZmZzZXQpICE9IDApIHsKKysJCWd1aW50OCB0YWc7CisrCQl1bnNpZ25lZCBpbnQgbGVuLCBobGVuLCBsZW5fbGVuOworKwkJY29uc3Qgc3RydWN0IHRsdl9kZWYgKnRkZWY7CisrCQlwcm90b19pdGVtICp0aTsKKysJCXByb3RvX3RyZWUgKmllX3RyZWU7CisrCisrCQl0YWcgPSB0dmJfZ2V0X2d1aW50OCh0dmIsIG9mZnNldCk7CisrCQl0ZGVmID0gJnJzbF9hdHRfdGx2ZGVmLmRlZlt0YWddOworKworKwkJc3dpdGNoICh0ZGVmLT50eXBlKSB7CisrCQljYXNlIFRMVl9UWVBFX0ZJWEVEOgorKwkJCWhsZW4gPSAxOworKwkJCWxlbl9sZW4gPSAwOworKwkJCWxlbiA9IHRkZWYtPmZpeGVkX2xlbjsKKysJCQlicmVhazsKKysJCWNhc2UgVExWX1RZUEVfVDoKKysJCQlobGVuID0gMTsKKysJCQlsZW5fbGVuID0gMDsKKysJCQlsZW4gPSAwOworKwkJCWJyZWFrOworKwkJY2FzZSBUTFZfVFlQRV9UVjoKKysJCQlobGVuID0gMTsKKysJCQlsZW5fbGVuID0gMDsKKysJCQlsZW4gPSAxOworKwkJCWJyZWFrOworKwkJY2FzZSBUTFZfVFlQRV9UTFY6CisrCQkJaGxlbiA9IDI7CisrCQkJbGVuX2xlbiA9IDE7CisrCQkJbGVuID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrMSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFRMVl9UWVBFX1RMMTZWOgorKwkJCWhsZW4gPSAzOworKwkJCWxlbl9sZW4gPSAyOworKwkJCWxlbiA9IHR2Yl9nZXRfZ3VpbnQ4KHR2Yiwgb2Zmc2V0KzEpIDw8IDggfAorKwkJCQkJdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrMik7CisrCQkJYnJlYWs7CisrCQlkZWZhdWx0OgorKwkJCWhsZW4gPSBsZW5fbGVuID0gbGVuID0gMDsKKysJCQlESVNTRUNUT1JfQVNTRVJUX05PVF9SRUFDSEVEKCk7CisrCQkJYnJlYWs7CisrCQl9CisrCisrCQl0aSA9IHByb3RvX3RyZWVfYWRkX2l0ZW0odHJlZSwgaGZfcnNsX2llX2lkLCB0dmIsIG9mZnNldCwgMSwgRkFMU0UpOworKwkJaWVfdHJlZSA9IHByb3RvX2l0ZW1fYWRkX3N1YnRyZWUodGksIGV0dF9pZV9sb2NhbF9wb3J0KTsKKysJCW9mZnNldCArPSBobGVuOworKworKwkJc3dpdGNoICh0YWcpIHsKKysJCWNhc2UgUlNMX0lFX0NIX05POgorKwkJCWRpc3NlY3RfcnNsX2llX2NoX25vKHR2YiwgcGluZm8sIGllX3RyZWUsIG9mZnNldCwgRkFMU0UpOworKwkJCWJyZWFrOworKwkJY2FzZSBSU0xfSUVfRlJBTUVfTk86CisrCQkJZGlzc2VjdF9yc2xfaWVfZnJhbWVfbm8odHZiLCBwaW5mbywgaWVfdHJlZSwgb2Zmc2V0LCBGQUxTRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFJTTF9JRV9NU19QT1c6CisrCQkJZGlzc2VjdF9yc2xfaWVfbXNfcG93KHR2YiwgcGluZm8sIGllX3RyZWUsIG9mZnNldCwgRkFMU0UpOworKwkJCWJyZWFrOworKwkJY2FzZSBSU0xfSUVfSVBBQ19SRU1PVEVfSVA6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfcmVtb3RlX2lwLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX0lQQUNfUkVNT1RFX1BPUlQ6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfcmVtb3RlX3BvcnQsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCWJyZWFrOworKwkJY2FzZSBSU0xfSUVfSVBBQ19MT0NBTF9JUDoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9sb2NhbF9pcCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJbG9jYWxfYWRkciA9IHR2Yl9nZXRfaXB2NCh0dmIsIG9mZnNldCk7CisrCQkJYnJlYWs7CisrCQljYXNlIFJTTF9JRV9JUEFDX0xPQ0FMX1BPUlQ6CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfbG9jYWxfcG9ydCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJbG9jYWxfcG9ydCA9IHR2Yl9nZXRfbnRvaHModHZiLCBvZmZzZXQpOworKwkJCWJyZWFrOworKwkJY2FzZSBSU0xfSUVfSVBBQ19TUEVFQ0hfTU9ERToKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9zcGVlY2hfbW9kZV9zLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9zcGVlY2hfbW9kZV9tLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX0lQQUNfUlRQX1BBWUxPQUQ6CisrCQljYXNlIFJTTF9JRV9JUEFDX1JUUF9QQVlMT0FEMjoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9ydHBfcGF5bG9hZCwgdHZiLAorKwkJCQkJICAgIG9mZnNldCwgbGVuLCBGQUxTRSk7CisrCQkJYnJlYWs7CisrCQljYXNlIFJTTF9JRV9JUEFDX1JUUF9DU0RfRk1UOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX3J0cF9jc2RfZm10X2QsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIGxlbiwgRkFMU0UpOworKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX3J0cF9jc2RfZm10X2lyLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX0lQQUNfQ09OTl9JRDoKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9jb25uX2lkLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0LCBsZW4sIEZBTFNFKTsKKysJCQlicmVhazsKKysJCWNhc2UgUlNMX0lFX0lQQUNfQ09OTl9TVEFUOgorKwkJCXByb3RvX3RyZWVfYWRkX2l0ZW0oaWVfdHJlZSwgaGZfcnNsX2NzdGF0X3R4X3BrdHMsIHR2YiwKKysJCQkJCSAgICBvZmZzZXQsIDQsIEZBTFNFKTsKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9jc3RhdF90eF9vY3RzLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0KzQsIDQsIEZBTFNFKTsKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9jc3RhdF9yeF9wa3RzLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0KzgsIDQsIEZBTFNFKTsKKysJCQlwcm90b190cmVlX2FkZF9pdGVtKGllX3RyZWUsIGhmX3JzbF9jc3RhdF9yeF9vY3RzLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0KzEyLCA0LCBGQUxTRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfY3N0YXRfbG9zdF9wa3RzLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0KzE2LCA0LCBGQUxTRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfY3N0YXRfaWFfaml0dGVyLCB0dmIsCisrCQkJCQkgICAgb2Zmc2V0KzIwLCA0LCBGQUxTRSk7CisrCQkJcHJvdG9fdHJlZV9hZGRfaXRlbShpZV90cmVlLCBoZl9yc2xfY3N0YXRfYXZnX3R4X2RseSwgdHZiLAorKwkJCQkJICAgIG9mZnNldCsyNCwgNCwgRkFMU0UpOworKwkJCWJyZWFrOworKwkJfQorKwkJb2Zmc2V0ICs9IGxlbjsKKysJfQorKworKwlzd2l0Y2ggKG1zZ190eXBlKSB7CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfQklORF9BQ0s6CisrCQkvKiBOb3RpZnkgdGhlIFJUUCBhbmQgUlRDUCBkaXNzZWN0b3JzIGFib3V0IGEgbmV3IFJUUCBzdHJlYW0gKi8KKysJCXNyY19hZGRyLnR5cGUgPSBBVF9JUHY0OworKwkJc3JjX2FkZHIubGVuID0gNDsKKysJCXNyY19hZGRyLmRhdGEgPSAoZ3VpbnQ4ICopJmxvY2FsX2FkZHI7CisrCQlydHBfYWRkX2FkZHJlc3MocGluZm8sICZzcmNfYWRkciwgbG9jYWxfcG9ydCwgMCwKKysJCQkJIkdTTSBBLWJpcy9JUCIsIHBpbmZvLT5mZC0+bnVtLCAwLCBOVUxMKTsKKysJCXJ0Y3BfYWRkX2FkZHJlc3MocGluZm8sICZzcmNfYWRkciwgbG9jYWxfcG9ydCsxLCAwLAorKwkJCQkgIkdTTSBBLWJpcy9JUCIsIHBpbmZvLT5mZC0+bnVtKTsKKysJCWJyZWFrOworKwl9CisrCXJldHVybiBvZmZzZXQ7CisrfQorKworK3N0YXRpYyBpbnQKKyBkaXNzY3RfcnNsX21zZyh0dmJ1ZmZfdCAqdHZiLCBwYWNrZXRfaW5mbyAqcGluZm8sIHByb3RvX3RyZWUgKnRyZWUsIGludCBvZmZzZXQpCisgeworLQlndWludDgJbXNnX3R5cGU7CisrCWd1aW50OAltc2dfZGlzYywgbXNnX3R5cGU7CisgCisrCW1zZ19kaXNjID0gdHZiX2dldF9ndWludDgodHZiLCBvZmZzZXQrKykgPj4gMTsKKyAJbXNnX3R5cGUgPSB0dmJfZ2V0X2d1aW50OCh0dmIsb2Zmc2V0KSYweDdmOworIAlwcm90b190cmVlX2FkZF9pdGVtKHRyZWUsIGhmX3JzbF9tc2dfdHlwZSwgdHZiLCBvZmZzZXQsIDEsIEZBTFNFKTsKKysKKysJaWYgKG1zZ19kaXNjID09IFJTTF9NU0dESVNDX0lQQUNDRVNTKSB7CisrCQlvZmZzZXQgPSBkaXNzY3RfcnNsX2lwYWNjZXNzX21zZyh0dmIsIHBpbmZvLCB0cmVlLCBvZmZzZXQpOworKwkJcmV0dXJuIG9mZnNldDsKKysJfQorIAlvZmZzZXQrKzsKKyAKKyAJc3dpdGNoIChtc2dfdHlwZSl7CitAQCAtMzQ4Miw2ICszODU2LDE4IEBACisgCQkvKiBMTFAgQVBEVSA5LjMuNTggTSBMViAyLU4gKi8KKyAJCW9mZnNldCA9IGRpc3NlY3RfcnNsX2llX2xscF9hcGR1KHR2YiwgcGluZm8sIHRyZWUsIG9mZnNldCwgVFJVRSk7CisgCQlicmVhazsKKysJLyogdGhlIGZvbGxvd2luZyBtZXNzYWdlcyBhcmUgaXAuYWNjZXNzIHNwZWNpZmljIGJ1dCBzZW50IHdpdGhvdXQKKysJICogaXAuYWNjZXNzIG1lbXNzYWdlIGRpc2NyaW1pbmF0b3IgKi8KKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19NRUFTX1BQX0RFRjoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19IT19DQU5EX0lOUToKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19IT19DQU5EX1JFU1A6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9BQ1Q6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9BQ1RfQUNLOgorKwljYXNlIFJTTF9NU0dfVFlQRV9JUEFDX1BEQ0hfQUNUX05BQ0s6CisrCWNhc2UgUlNMX01TR19UWVBFX0lQQUNfUERDSF9ERUFDVDoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0RFQUNUX0FDSzoKKysJY2FzZSBSU0xfTVNHX1RZUEVfSVBBQ19QRENIX0RFQUNUX05BQ0s6CisrCQlvZmZzZXQgPSBkaXNzY3RfcnNsX2lwYWNjZXNzX21zZyh0dmIsIHBpbmZvLCB0cmVlLCBvZmZzZXQtMSk7CisgCWRlZmF1bHQ6CisgCQlicmVhazsKKyAJfQorQEAgLTM0ODksNiArMzg3NSw0MCBAQAorIAlyZXR1cm4gb2Zmc2V0OworIAorIH0KKysKKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9pcGFjY19zcG1fc192YWxzW10gPSB7CisrCXsgMCwJIkdTTSBGUiBjb2RlYyAoR1NNIHR5cGUgMSwgRlMpIiB9LAorKwl7IDEsCSJHU00gRUZSIGNvZGVjIChHU00gdHlwZSAyLCBGUykiIH0sCisrCXsgMiwgCSJHU00gQU1SL0ZSIGNvZGVjIChHU00gdHlwZSAzLCBGUykiIH0sCisrCXsgMywJIkdTTSBIUiBjb2RlYyAoR1NNIHR5cGUgMSwgSFMpIiB9LAorKwl7IDUsCSJHU00gQU1SL0hSIGNvZGVjIChHU00gdHlwZSAzLCBIUykiIH0sCisrCXsgMHhmLAkiQXMgc3BlY2lmaWVkIGJ5IFJUUCBQYXlsb2FkIFR5cGUgSUUiIH0sCisrCXsgMCwJTlVMTCB9CisrfTsKKysKKytzdGF0aWMgY29uc3QgdmFsdWVfc3RyaW5nIHJzbF9pcGFjY19zcG1fbV92YWxzW10gPSB7CisrCXsgMCwJIlNlbmQgYW5kIFJlY2VpdmUiIH0sCisrCXsgMSwJIlJlY2VpdmUgT25seSIgfSwKKysJeyAyLAkiU2VuZCBPbmx5IiB9LAorKwl7IDAsIAlOVUxMIH0KKyt9OworKworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgcnNsX2lwYWNjX3J0cF9jc2RfZm10X2RfdmFsc1tdID0geworKwl7IDAsCSJFeHRlcm5hbCBUUkFVIGZvcm1hdCIgfSwKKysJeyAxLAkiTm9uLVRSQVUgUGFja2VkIGZvcm1hdCIgfSwKKysJeyAyLAkiVFJBVSB3aXRoaW4gdGhlIEJUUyIgfSwKKysJeyAzLAkiSVdGLUZyZWUgQlRTLUJUUyBEYXRhIiB9LAorKwl7IDAsIAlOVUxMIH0KKyt9OworKworK3N0YXRpYyBjb25zdCB2YWx1ZV9zdHJpbmcgcnNsX2lwYWNjX3J0cF9jc2RfZm10X2lyX3ZhbHNbXSA9IHsKKysJeyAwLAkiOGtiL3MiIH0sCisrCXsgMSwJIjE2a2IvcyIgfSwKKysJeyAyLAkiMzJrYi9zIiB9LAorKwl7IDMsCSI2NGtiL3MiIH0sCisrCXsgMCwJTlVMTCB9CisrfTsKKysKKyBzdGF0aWMgdm9pZAorIGRpc3NlY3RfcnNsKHR2YnVmZl90ICp0dmIsIHBhY2tldF9pbmZvICpwaW5mbywgcHJvdG9fdHJlZSAqdHJlZSkKKyB7CitAQCAtMzUxNiw3ICszOTM2LDYgQEAKKyAJCS8qIDkuMSBNZXNzYWdlIGRpc2NyaW1pbmF0b3IgKi8KKyAJCXByb3RvX3RyZWVfYWRkX2l0ZW0ocnNsX3RyZWUsIGhmX3JzbF9tc2dfZHNjLCB0dmIsIG9mZnNldCwgMSwgRkFMU0UpOworIAkJcHJvdG9fdHJlZV9hZGRfaXRlbShyc2xfdHJlZSwgaGZfcnNsX1RfYml0LCB0dmIsIG9mZnNldCwgMSwgRkFMU0UpOworLQkJb2Zmc2V0Kys7CisgCisgCQlvZmZzZXQgPSBkaXNzY3RfcnNsX21zZyh0dmIsIHBpbmZvLCByc2xfdHJlZSwgb2Zmc2V0KTsKKyAKK0BAIC0zODg2LDYgKzQzMDUsODYgQEAKKyAJCQlGVF9VSU5UOCwgQkFTRV9ERUMsIFZBTFMocnNsX2VtbHBwX3ByaW9fdmFscyksIDB4MDMsCisgCQkJTlVMTCwgSEZJTEwgfQorIAkJfSwKKysJCXsgJmhmX3JzbF9zcGVlY2hfbW9kZV9zLAorKwkJCXsgImlwLmFjY2VzcyBTcGVlY2ggTW9kZSBTIiwgInJzbC5pcGFjYy5zcGVlY2hfbW9kZV9zIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhyc2xfaXBhY2Nfc3BtX3NfdmFscyksCisrCQkJICAweGYsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisrCQl7ICZoZl9yc2xfc3BlZWNoX21vZGVfbSwKKysJCQl7ICJpcC5hY2Nlc3MgU3BlZWNoIE1vZGUgTSIsICJyc2wuaXBhY2Muc3BlZWNoX21vZGVfbSIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9IRVgsIFZBTFMocnNsX2lwYWNjX3NwbV9tX3ZhbHMpLAorKwkJCSAgMHhmMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9jb25uX3N0YXQsCisrCQkJeyAiaXAuYWNjZXNzIENvbm5lY3Rpb24gU3RhdGlzdGljcyIsInJzbC5pcGFjYy5jb25uX3N0YXQiLAorKwkJCSAgRlRfQllURVMsIEJBU0VfTk9ORSwgTlVMTCwgMHgwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfcnNsX2Nvbm5faWQsCisrCQkJeyAiaXAuYWNjZXNzIENvbm5lY3Rpb24gSUQiLAkicnNsLmlwYWNjLmNvbm5faWQiLAorKwkJCSAgRlRfVUlOVDE2LCBCQVNFX0RFQywgTlVMTCwgMHgwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfcnNsX3J0cF9wYXlsb2FkLAorKwkJCXsgImlwLmFjY2VzcyBSVFAgUGF5bG9hZCBUeXBlIiwJInJzbC5pcGFjYy5ydHBfcGF5bG9hZCIsCisrCQkJICBGVF9VSU5UOCwgQkFTRV9ERUMsIE5VTEwsIDB4MCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9ydHBfY3NkX2ZtdF9kLAorKwkJCXsgImlwLmFjY2VzcyBSVFAgQ1NEIEZvcm1hdCBEIiwgInJzbC5pcGFjYy5ydHBfY3NkX2ZtdF9kIiwKKysJCQkgIEZUX1VJTlQ4LCBCQVNFX0hFWCwgVkFMUyhyc2xfaXBhY2NfcnRwX2NzZF9mbXRfZF92YWxzKSwKKysJCQkgIDB4MGYsIE5VTEwsIEhGSUxMIH0sCisrCQl9LAorKwkJeyAmaGZfcnNsX3J0cF9jc2RfZm10X2lyLAorKwkJCXsgImlwLmFjY2VzcyBSVFAgQ1NEIEZvcm1hdCBJUiIsICJyc2wuaXBhY2MucnRwX2NzZF9mbXRfaXIiLAorKwkJCSAgRlRfVUlOVDgsIEJBU0VfSEVYLCBWQUxTKHJzbF9pcGFjY19ydHBfY3NkX2ZtdF9pcl92YWxzKSwKKysJCQkgIDB4ZjAsIE5VTEwsIEhGSUxMIH0sCisrCQl9LAorKwkJeyAmaGZfcnNsX2xvY2FsX3BvcnQsCisrCQkJeyAiaXAuYWNjZXNzIExvY2FsIFJUUCBQb3J0IiwJInJzbC5pcGFjYy5sb2NhbF9wb3J0IiwKKysJCQkgIEZUX1VJTlQxNiwgQkFTRV9ERUMsIE5VTEwsIDB4MCwKKysJCQkgICJpcC5hY2Nlc3MgTG9jYWwgUlRQIFBvcnQiLCBIRklMTCB9LAorKwkJfSwKKysJCXsgJmhmX3JzbF9yZW1vdGVfcG9ydCwKKysJCQl7ICJpcC5hY2Nlc3MgUmVtb3RlIFJUUCBQb3J0IiwJInJzbC5pcGFjYy5yZW1vdGVfcG9ydCIsCisrCQkJICBGVF9VSU5UMTYsIEJBU0VfREVDLCBOVUxMLCAweDAsCisrCQkJICAiaXAuYWNjZXNzIFJlbW90ZSBSVFAgUG9ydCIsIEhGSUxMIH0sCisrCQl9LAorKwkJeyAmaGZfcnNsX2xvY2FsX2lwLAorKwkJCXsgImlwLmFjY2VzcyBMb2NhbCBJUCBBZGRyZXNzIiwJInJzbC5pcGFjYy5sb2NhbF9pcCIsCisrCQkJICBGVF9JUHY0LCBCQVNFX05PTkUsIE5VTEwsIDB4MCwKKysJCQkgICJpcC5hY2Nlc3MgTG9jYWwgSVAgQWRkcmVzcyIsIEhGSUxMIH0sCisrCQl9LAorKwkJeyAmaGZfcnNsX3JlbW90ZV9pcCwKKysJCQl7ICJpcC5hY2Nlc3MgUmVtb3RlIElQIEFkZHJlc3MiLCAicnNsLmlwYWNjLnJlbW90ZV9pcCIsCisrCQkJICBGVF9JUHY0LCBCQVNFX05PTkUsIE5VTEwsIDB4MCwKKysJCQkgICJpcC5hY2Nlc3MgUmVtb3RlIElQIEFkZHJlc3MiLCBIRklMTCB9LAorKwkJfSwKKysJCXsgJmhmX3JzbF9jc3RhdF90eF9wa3RzLAorKwkJCXsgIlBhY2tldHMgU2VudCIsICJyc2wuaXBhY2MuY3N0YXQudHhfcGt0cyIsCisrCQkJICBGVF9VSU5UMzIsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfcnNsX2NzdGF0X3R4X29jdHMsCisrCQkJeyAiT2N0ZXRzIFNlbnQiLCAicnNsLmlwYWNjLmNzdGF0LnR4X29jdGV0cyIsCisrCQkJICBGVF9VSU5UMzIsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfcnNsX2NzdGF0X3J4X3BrdHMsCisrCQkJeyAiUGFja2V0cyBSZWNlaXZlZCIsICJyc2wuaXBhY2MuY3N0YXQucnhfcGt0cyIsCisrCQkJICBGVF9VSU5UMzIsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfcnNsX2NzdGF0X3J4X29jdHMsCisrCQkJeyAiT2N0ZXRzIFJlY2VpdmVkIiwgInJzbC5pcGFjYy5jc3RhdC5yeF9vY3RldHMiLAorKwkJCSAgRlRfVUlOVDMyLCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9jc3RhdF9sb3N0X3BrdHMsCisrCQkJeyAiUGFja2V0cyBMb3N0IiwgInJzbC5pcGFjYy5jc3RhdC5sb3N0X3BrdHMiLAorKwkJCSAgRlRfVUlOVDMyLCBCQVNFX0RFQywgTlVMTCwgMCwgTlVMTCwgSEZJTEwgfQorKwkJfSwKKysJCXsgJmhmX3JzbF9jc3RhdF9pYV9qaXR0ZXIsCisrCQkJeyAiSW50ZXItYXJyaXZhbCBKaXR0ZXIiLCAicnNsLmlwYWNjLmNzdGF0LmlhX2ppdHRlciIsCisrCQkJICBGVF9VSU5UMzIsIEJBU0VfREVDLCBOVUxMLCAwLCBOVUxMLCBIRklMTCB9CisrCQl9LAorKwkJeyAmaGZfcnNsX2NzdGF0X2F2Z190eF9kbHksCisrCQkJeyAiQXZlcmFnZSBUeCBEZWxheSIsICJyc2wuaXBhY2MuY3N0YXQuYXZnX3R4X2RlbGF5IiwKKysJCQkgIEZUX1VJTlQzMiwgQkFTRV9ERUMsIE5VTEwsIDAsIE5VTEwsIEhGSUxMIH0KKysJCX0sCisgCX07CisgCXN0YXRpYyBnaW50ICpldHRbXSA9IHsKKyAJCSZldHRfcnNsLAorQEAgLTM5NDMsNiArNDQ0MiwxNCBAQAorIAkJJmV0dF9pZV9tZWFzX3Jlc19ubywKKyAJCSZldHRfaWVfbWVzc2FnZV9pZCwKKyAJCSZldHRfaWVfc3lzX2luZm9fdHlwZSwKKysJCSZldHRfaWVfc3BlZWNoX21vZGUsCisrCQkmZXR0X2llX2Nvbm5fc3RhdCwKKysJCSZldHRfaWVfY29ubl9pZCwKKysJCSZldHRfaWVfcmVtb3RlX2lwLAorKwkJJmV0dF9pZV9yZW1vdGVfcG9ydCwKKysJCSZldHRfaWVfbG9jYWxfcG9ydCwKKysJCSZldHRfaWVfbG9jYWxfaXAsCisrCQkmZXR0X2llX3J0cF9wYXlsb2FkLAorIAl9OworIAorIAkvKiBSZWdpc3RlciB0aGUgcHJvdG9jb2wgbmFtZSBhbmQgZGVzY3JpcHRpb24gKi8KZGlmZiAtLWdpdCBhL3dpcmVzaGFyay9yc2wtc3lzdGVtX2luZm8ucGF0Y2ggYi93aXJlc2hhcmsvcnNsLXN5c3RlbV9pbmZvLnBhdGNoCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI5NDVjNjUKLS0tIC9kZXYvbnVsbAorKysgYi93aXJlc2hhcmsvcnNsLXN5c3RlbV9pbmZvLnBhdGNoCkBAIC0wLDAgKzEsMTMgQEAKK0luZGV4OiB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1yc2wuYworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLS0tIHdpcmVzaGFyay5vcmlnL2VwYW4vZGlzc2VjdG9ycy9wYWNrZXQtcnNsLmMKKysrKyB3aXJlc2hhcmsvZXBhbi9kaXNzZWN0b3JzL3BhY2tldC1yc2wuYworQEAgLTIyOTEsNyArMjI5MSw3IEBACisgCisgCXByb3RvX3RyZWVfYWRkX3RleHQoaWVfdHJlZSwgdHZiLG9mZnNldCxsZW5ndGgsIkxheWVyIDMgbWVzc2FnZSIpOworIAluZXh0X3R2YiA9IHR2Yl9uZXdfc3Vic2V0KHR2Yiwgb2Zmc2V0LCBsZW5ndGgsIGxlbmd0aCk7CistCS8qIGNhbGxfZGlzc2VjdG9yKGdzbV9hX2R0YXBfaGFuZGxlLCBuZXh0X3R2YiwgcGluZm8sIHRvcF90cmVlKTsqLworKwljYWxsX2Rpc3NlY3Rvcihnc21fYV9jY2NoX2hhbmRsZSwgbmV4dF90dmIsIHBpbmZvLCB0b3BfdHJlZSk7CisgCisgCW9mZnNldCA9IG9mZnNldCArIGxlbmd0aDsKKyAK