ZGlmZiAtLWdpdCBhL2RyaXZlcnMvdmlkZW8vYW1pZmIuYyBiL2RyaXZlcnMvdmlkZW8vYW1pZmIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjhiYjY3Ci0tLSAvZGV2L251bGwKKysrIGIvZHJpdmVycy92aWRlby9hbWlmYi5jCkBAIC0wLDAgKzEsMzgxMiBAQAorLyoKKyAqIGxpbnV4L2RyaXZlcnMvdmlkZW8vYW1pZmIuYyAtLSBBbWlnYSBidWlsdGluIGNoaXBzZXQgZnJhbWUgYnVmZmVyIGRldmljZQorICoKKyAqICAgIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIEdlZXJ0IFV5dHRlcmhvZXZlbgorICoKKyAqICAgICAgICAgIHdpdGggd29yayBieSBSb21hbiBaaXBwZWwKKyAqCisgKgorICogVGhpcyBmaWxlIGlzIGJhc2VkIG9uIHRoZSBBdGFyaSBmcmFtZSBidWZmZXIgZGV2aWNlIChhdGFmYi5jKToKKyAqCisgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTQgTWFydGluIFNjaGFsbGVyCisgKiAgICAgICAgICAgICAgICAgICAgICAgUm9tYW4gSG9kZWsKKyAqCisgKiAgICAgICAgICB3aXRoIHdvcmsgYnkgQW5kcmVhcyBTY2h3YWIKKyAqICAgICAgICAgICAgICAgICAgICAgICBHdWVudGhlciBLZWxsZXRlcgorICoKKyAqIGFuZCBvbiB0aGUgb3JpZ2luYWwgQW1pZ2EgY29uc29sZSBkcml2ZXIgKGFtaWNvbi5jKToKKyAqCisgKiAgICBDb3B5cmlnaHQgKEMpIDE5OTMgSGFtaXNoIE1hY2RvbmFsZAorICogICAgICAgICAgICAgICAgICAgICAgIEdyZWcgSGFycAorICogICAgQ29weXJpZ2h0IChDKSAxOTk0IERhdmlkIENhcnRlciBbY2FydGVyQGNvbXBzY2kuYnJpc3RvbC5hYy51a10KKyAqCisgKiAgICAgICAgICB3aXRoIHdvcmsgYnkgV2lsbGlhbSBSdWNrbGlkZ2UgKHdqckBjcy5jb3JuZWxsLmVkdSkKKyAqICAgICAgICAgICAgICAgICAgICAgICBHZWVydCBVeXR0ZXJob2V2ZW4KKyAqICAgICAgICAgICAgICAgICAgICAgICBKZXMgU29yZW5zZW4gKGpkc0Brb20uYXVjLmRrKQorICoKKyAqCisgKiBIaXN0b3J5OgorICoKKyAqICAgLSAyNCBKdWwgOTY6IENvcHBlciBnZW5lcmF0ZXMgbm93IHZibGFuayBpbnRlcnJ1cHQgYW5kCisgKiAgICAgICAgICAgICAgICBWRVNBIFBvd2VyIFNhdmluZyBQcm90b2NvbCBpcyBmdWxseSBpbXBsZW1lbnRlZAorICogICAtIDE0IEp1bCA5NjogUmV3b3JrIGFuZCBob3BlZnVsbHkgbGFzdCBFQ1MgYnVncyBmaXhlZAorICogICAtICA3IE1hciA5NjogSGFyZHdhcmUgc3ByaXRlIHN1cHBvcnQgYnkgUm9tYW4gWmlwcGVsCisgKiAgIC0gMTggRmViIDk2OiBPQ1MgYW5kIEVDUyBzdXBwb3J0IGJ5IFJvbWFuIFppcHBlbAorICogICAgICAgICAgICAgICAgSGFyZHdhcmUgZnVuY3Rpb25zIGNvbXBsZXRlbHkgcmV3cml0dGVuCisgKiAgIC0gIDIgRGVjIDk1OiBBR0EgdmVyc2lvbiBieSBHZWVydCBVeXR0ZXJob2V2ZW4KKyAqCisgKiBUaGlzIGZpbGUgaXMgc3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYworICogTGljZW5zZS4gU2VlIHRoZSBmaWxlIENPUFlJTkcgaW4gdGhlIG1haW4gZGlyZWN0b3J5IG9mIHRoaXMgYXJjaGl2ZQorICogZm9yIG1vcmUgZGV0YWlscy4KKyAqLworCisjaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CisjaW5jbHVkZSA8bGludXgva2VybmVsLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KKyNpbmNsdWRlIDxsaW51eC9tbS5oPgorI2luY2x1ZGUgPGxpbnV4L3R0eS5oPgorI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KKyNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgorI2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgorI2luY2x1ZGUgPGxpbnV4L2ZiLmg+CisjaW5jbHVkZSA8bGludXgvaW5pdC5oPgorI2luY2x1ZGUgPGxpbnV4L2lvcG9ydC5oPgorCisjaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KKyNpbmNsdWRlIDxhc20vc3lzdGVtLmg+CisjaW5jbHVkZSA8YXNtL2lycS5oPgorI2luY2x1ZGUgPGFzbS9hbWlnYWh3Lmg+CisjaW5jbHVkZSA8YXNtL2FtaWdhaW50cy5oPgorI2luY2x1ZGUgPGFzbS9zZXR1cC5oPgorCisjaW5jbHVkZSAiYzJwLmgiCisKKworI2RlZmluZSBERUJVRworCisjaWYgIWRlZmluZWQoQ09ORklHX0ZCX0FNSUdBX09DUykgJiYgIWRlZmluZWQoQ09ORklHX0ZCX0FNSUdBX0VDUykgJiYgIWRlZmluZWQoQ09ORklHX0ZCX0FNSUdBX0FHQSkKKyNkZWZpbmUgQ09ORklHX0ZCX0FNSUdBX09DUyAgIC8qIGRlZmluZSBhdCBsZWFzdCBvbmUgZmIgZHJpdmVyLCB0aGlzIHdpbGwgY2hhbmdlIGxhdGVyICovCisjZW5kaWYKKworI2lmICFkZWZpbmVkKENPTkZJR19GQl9BTUlHQV9PQ1MpCisjICBkZWZpbmUgSVNfT0NTICgwKQorI2VsaWYgZGVmaW5lZChDT05GSUdfRkJfQU1JR0FfRUNTKSB8fCBkZWZpbmVkKENPTkZJR19GQl9BTUlHQV9BR0EpCisjICBkZWZpbmUgSVNfT0NTIChjaGlwc2V0ID09IFRBR19PQ1MpCisjZWxzZQorIyAgZGVmaW5lIENPTkZJR19GQl9BTUlHQV9PQ1NfT05MWQorIyAgZGVmaW5lIElTX09DUyAoMSkKKyNlbmRpZgorCisjaWYgIWRlZmluZWQoQ09ORklHX0ZCX0FNSUdBX0VDUykKKyMgIGRlZmluZSBJU19FQ1MgKDApCisjZWxpZiBkZWZpbmVkKENPTkZJR19GQl9BTUlHQV9PQ1MpIHx8IGRlZmluZWQoQ09ORklHX0ZCX0FNSUdBX0FHQSkKKyMgIGRlZmluZSBJU19FQ1MgKGNoaXBzZXQgPT0gVEFHX0VDUykKKyNlbHNlCisjICBkZWZpbmUgQ09ORklHX0ZCX0FNSUdBX0VDU19PTkxZCisjICBkZWZpbmUgSVNfRUNTICgxKQorI2VuZGlmCisKKyNpZiAhZGVmaW5lZChDT05GSUdfRkJfQU1JR0FfQUdBKQorIyAgZGVmaW5lIElTX0FHQSAoMCkKKyNlbGlmIGRlZmluZWQoQ09ORklHX0ZCX0FNSUdBX09DUykgfHwgZGVmaW5lZChDT05GSUdfRkJfQU1JR0FfRUNTKQorIyAgZGVmaW5lIElTX0FHQSAoY2hpcHNldCA9PSBUQUdfQUdBKQorI2Vsc2UKKyMgIGRlZmluZSBDT05GSUdfRkJfQU1JR0FfQUdBX09OTFkKKyMgIGRlZmluZSBJU19BR0EgKDEpCisjZW5kaWYKKworI2lmZGVmIERFQlVHCisjICBkZWZpbmUgRFBSSU5USyhmbXQsIGFyZ3MuLi4pCXByaW50ayhLRVJOX0RFQlVHICIlczogIiBmbXQsIF9fRlVOQ1RJT05fXyAsICMjIGFyZ3MpCisjZWxzZQorIyAgZGVmaW5lIERQUklOVEsoZm10LCBhcmdzLi4uKQorI2VuZGlmCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKworICAgR2VuZXJpYyB2aWRlbyB0aW1pbmdzCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgVGltaW5ncyB1c2VkIGJ5IHRoZSBmcmFtZSBidWZmZXIgaW50ZXJmYWNlOgorCisgICArLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tKworICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICAgIF4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgIHwKKyAgIHwgICAgICAgICAgfCAgICAgICAgICAgICAgICB8dXBwZXJfbWFyZ2luICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICB8CisgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICAgpSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgfAorICAgKy0tLS0tLS0tLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy0tLS0tLS0tLS0rLS0tLS0tLSsKKyAgIHwgICAgICAgICAgIyAgICAgICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgfCAgICAgICB8CisgICB8ICAgICAgICAgICMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgIHwgICAgICAgfAorICAgfCAgICAgICAgICAjICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICB8ICAgICAgIHwKKyAgIHwgICAgICAgICAgIyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgfCAgICAgICB8CisgICB8ICAgbGVmdCAgICMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICByaWdodCAgIHwgaHN5bmMgfAorICAgfCAgbWFyZ2luICAjICAgICAgICAgICAgICAgIHwgICAgICAgeHJlcyAgICAgICAgICAgICAgICAgIyAgbWFyZ2luICB8ICBsZW4gIHwKKyAgIHw8LS0tLS0tLS0+IzwtLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiM8LS0tLS0tLS0+fDwtLS0tLT58CisgICB8ICAgICAgICAgICMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgIHwgICAgICAgfAorICAgfCAgICAgICAgICAjICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICB8ICAgICAgIHwKKyAgIHwgICAgICAgICAgIyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgfCAgICAgICB8CisgICB8ICAgICAgICAgICMgICAgICAgICAgICAgICAgfHlyZXMgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgIHwgICAgICAgfAorICAgfCAgICAgICAgICAjICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICB8ICAgICAgIHwKKyAgIHwgICAgICAgICAgIyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgfCAgICAgICB8CisgICB8ICAgICAgICAgICMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgIHwgICAgICAgfAorICAgfCAgICAgICAgICAjICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICB8ICAgICAgIHwKKyAgIHwgICAgICAgICAgIyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgfCAgICAgICB8CisgICB8ICAgICAgICAgICMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgIHwgICAgICAgfAorICAgfCAgICAgICAgICAjICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyAgICAgICAgICB8ICAgICAgIHwKKyAgIHwgICAgICAgICAgIyAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgICAgICAgICAgfCAgICAgICB8CisgICB8ICAgICAgICAgICMgICAgICAgICAgICAgICAgpSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgIHwgICAgICAgfAorICAgKy0tLS0tLS0tLS0jIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIy0tLS0tLS0tLS0rLS0tLS0tLSsKKyAgIHwgICAgICAgICAgfCAgICAgICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICB8CisgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICAgfGxvd2VyX21hcmdpbiAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgfAorICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICAgIKUgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgIHwKKyAgICstLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0tKy0tLS0tLS0rCisgICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgfAorICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICAgIHx2c3luY19sZW4gICAgICAgICAgICAgICAgICAgfCAgICAgICAgICB8ICAgICAgIHwKKyAgIHwgICAgICAgICAgfCAgICAgICAgICAgICAgICClICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCAgICAgICB8CisgICArLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tKworCisKKyAgIEFtaWdhIHZpZGVvIHRpbWluZ3MKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgVGhlIEFtaWdhIG5hdGl2ZSBjaGlwc2V0cyB1c2VzIGFub3RoZXIgdGltaW5nIHNjaGVtZToKKworICAgICAgLSBoc3N0cnQ6ICAgU3RhcnQgb2YgaG9yaXpvbnRhbCBzeW5jaHJvbml6YXRpb24gcHVsc2UKKyAgICAgIC0gaHNzdG9wOiAgIEVuZCBvZiBob3Jpem9udGFsIHN5bmNocm9uaXphdGlvbiBwdWxzZQorICAgICAgLSBodG90YWw6ICAgTGFzdCB2YWx1ZSBvbiB0aGUgbGluZSAoaS5lLiBsaW5lIGxlbmd0aCA9IGh0b3RhbCsxKQorICAgICAgLSB2c3N0cnQ6ICAgU3RhcnQgb2YgdmVydGljYWwgc3luY2hyb25pemF0aW9uIHB1bHNlCisgICAgICAtIHZzc3RvcDogICBFbmQgb2YgdmVydGljYWwgc3luY2hyb25pemF0aW9uIHB1bHNlCisgICAgICAtIHZ0b3RhbDogICBMYXN0IGxpbmUgdmFsdWUgKGkuZS4gbnVtYmVyIG9mIGxpbmVzID0gdnRvdGFsKzEpCisgICAgICAtIGhjZW50ZXI6ICBTdGFydCBvZiB2ZXJ0aWNhbCByZXRyYWNlIGZvciBpbnRlcmxhY2UKKworICAgWW91IGNhbiBzcGVjaWZ5IHRoZSBibGFua2luZyB0aW1pbmdzIGluZGVwZW5kZW50bHkuIEN1cnJlbnRseSBJIGp1c3Qgc2V0CisgICB0aGVtIGVxdWFsIHRvIHRoZSByZXNwZWN0aXZlIHN5bmNocm9uaXphdGlvbiB2YWx1ZXM6CisKKyAgICAgIC0gaGJzdHJ0OiAgIFN0YXJ0IG9mIGhvcml6b250YWwgYmxhbmsKKyAgICAgIC0gaGJzdG9wOiAgIEVuZCBvZiBob3Jpem9udGFsIGJsYW5rCisgICAgICAtIHZic3RydDogICBTdGFydCBvZiB2ZXJ0aWNhbCBibGFuaworICAgICAgLSB2YnN0b3A6ICAgRW5kIG9mIHZlcnRpY2FsIGJsYW5rCisKKyAgIEhvcml6b250YWwgdmFsdWVzIGFyZSBpbiBjb2xvciBjbG9jayBjeWNsZXMgKDI4MCBucyksIHZlcnRpY2FsIHZhbHVlcyBhcmUgaW4KKyAgIHNjYW5saW5lcy4KKworICAgKDAsIDApIGlzIHNvbWV3aGVyZSBpbiB0aGUgdXBwZXItbGVmdCBjb3JuZXIgOi0pCisKKworICAgQW1pZ2EgdmlzaWJsZSB3aW5kb3cgZGVmaW5pdGlvbnMKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgIEN1cnJlbnRseSBJIG9ubHkgaGF2ZSB2YWx1ZXMgZm9yIEFHQSwgU0hSRVMgKDI4IE1IeiBkb3RjbG9jaykuIEZlZWwgZnJlZSB0bworICAgbWFrZSBjb3JyZWN0aW9ucyBhbmQvb3IgYWRkaXRpb25zLgorCisgICBXaXRoaW4gdGhlIGFib3ZlIHN5bmNocm9uaXphdGlvbiBzcGVjaWZpY2F0aW9ucywgdGhlIHZpc2libGUgd2luZG93IGlzCisgICBkZWZpbmVkIGJ5IHRoZSBmb2xsb3dpbmcgcGFyYW1ldGVycyAoYWN0dWFsIHJlZ2lzdGVyIHJlc29sdXRpb25zIG1heSBiZQorICAgZGlmZmVyZW50OyBhbGwgaG9yaXpvbnRhbCB2YWx1ZXMgYXJlIG5vcm1hbGl6ZWQgd2l0aCByZXNwZWN0IHRvIHRoZSBwaXhlbAorICAgY2xvY2spOgorCisgICAgICAtIGRpd3N0cnRfaDogICBIb3Jpem9udGFsIHN0YXJ0IG9mIHRoZSB2aXNpYmxlIHdpbmRvdworICAgICAgLSBkaXdzdG9wX2g6ICAgSG9yaXpvbnRhbCBzdG9wKzEoKikgb2YgdGhlIHZpc2libGUgd2luZG93CisgICAgICAtIGRpd3N0cnRfdjogICBWZXJ0aWNhbCBzdGFydCBvZiB0aGUgdmlzaWJsZSB3aW5kb3cKKyAgICAgIC0gZGl3c3RvcF92OiAgIFZlcnRpY2FsIHN0b3Agb2YgdGhlIHZpc2libGUgd2luZG93CisgICAgICAtIGRkZnN0cnQ6ICAgICBIb3Jpem9udGFsIHN0YXJ0IG9mIGRpc3BsYXkgRE1BCisgICAgICAtIGRkZnN0b3A6ICAgICBIb3Jpem9udGFsIHN0b3Agb2YgZGlzcGxheSBETUEKKyAgICAgIC0gaHNjcm9sbDogICAgIEhvcml6b250YWwgZGlzcGxheSBvdXRwdXQgZGVsYXkKKworICAgU3ByaXRlIHBvc2l0aW9uaW5nOgorCisgICAgICAtIHNwcnN0cnRfaDogICBIb3Jpem9udGFsIHN0YXJ0LTQgb2Ygc3ByaXRlCisgICAgICAtIHNwcnN0cnRfdjogICBWZXJ0aWNhbCBzdGFydCBvZiBzcHJpdGUKKworICAgKCopIEV2ZW4gQ29tbW9kb3JlIGRpZCBpdCB3cm9uZyBpbiB0aGUgQUdBIG1vbml0b3IgZHJpdmVycyBieSBub3QgYWRkaW5nIDEuCisKKyAgIEhvcml6b250YWwgdmFsdWVzIGFyZSBpbiBkb3RjbG9jayBjeWNsZXMgKDM1IG5zKSwgdmVydGljYWwgdmFsdWVzIGFyZSBpbgorICAgc2NhbmxpbmVzLgorCisgICAoMCwgMCkgaXMgc29tZXdoZXJlIGluIHRoZSB1cHBlci1sZWZ0IGNvcm5lciA6LSkKKworCisgICBEZXBlbmRlbmNpZXMgKEFHQSwgU0hSRVMgKDM1IG5zIGRvdGNsb2NrKSkKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgU2luY2UgdGhlcmUgYXJlIG11Y2ggbW9yZSBwYXJhbWV0ZXJzIGZvciB0aGUgQW1pZ2EgZGlzcGxheSB0aGFuIGZvciB0aGUKKyAgIGZyYW1lIGJ1ZmZlciBpbnRlcmZhY2UsIHRoZXJlIG11c3QgYmUgc29tZSBkZXBlbmRlbmNpZXMgYW1vbmcgdGhlIEFtaWdhCisgICBkaXNwbGF5IHBhcmFtZXRlcnMuIEhlcmUncyB3aGF0IEkgZm91bmQgb3V0OgorCisgICAgICAtIGRkZnN0cnQgYW5kIGRkZnN0b3AgYXJlIGJlc3QgYWxpZ25lZCB0byA2NCBwaXhlbHMuCisgICAgICAtIHRoZSBjaGlwc2V0IG5lZWRzIDY0KzQgaG9yaXpvbnRhbCBwaXhlbHMgYWZ0ZXIgdGhlIERNQSBzdGFydCBiZWZvcmUgdGhlCisgICAgICAgIGZpcnN0IHBpeGVsIGlzIG91dHB1dCwgc28gZGl3c3RydF9oID0gZGRmc3RydCs2NCs0IGlmIHlvdSB3YW50IHRvCisgICAgICAgIGRpc3BsYXkgdGhlIGZpcnN0IHBpeGVsIG9uIHRoZSBsaW5lIHRvby4gSW5jcmVhc2UgZGl3c3RydF9oIGZvciB2aXJ0dWFsCisgICAgICAgIHNjcmVlbiBwYW5uaW5nLgorICAgICAgLSB0aGUgZGlzcGxheSBETUEgYWx3YXlzIGZldGNoZXMgNjQgcGl4ZWxzIGF0IGEgdGltZSAoZm1vZGUgPSAzKS4KKyAgICAgIC0gZGRmc3RvcCBpcyBkZGZzdHJ0KyNwaXhlbHMtNjQuCisgICAgICAtIGRpd3N0b3BfaCA9IGRpd3N0cnRfaCt4cmVzKzEuIEJlY2F1c2Ugb2YgdGhlIGFkZGl0aW9uYWwgMSB0aGlzIGNhbiBiZSAxCisgICAgICAgIG1vcmUgdGhhbiBodG90YWwuCisgICAgICAtIGhzY3JvbGwgc2ltcGx5IGFkZHMgYSBkZWxheSB0byB0aGUgZGlzcGxheSBvdXRwdXQuIFNtb290aCBob3Jpem9udGFsCisgICAgICAgIHBhbm5pbmcgbmVlZHMgYW4gZXh0cmEgNjQgcGl4ZWxzIG9uIHRoZSBsZWZ0IHRvIHByZWZldGNoIHRoZSBwaXhlbHMgdGhhdAorICAgICAgICBgZmFsbCBvZmYnIG9uIHRoZSBsZWZ0LgorICAgICAgLSBpZiBkZGZzdHJ0IDwgMTkyLCB0aGUgc3ByaXRlIERNQSBjeWNsZXMgYXJlIGFsbCBzdG9sZW4gYnkgdGhlIGJpdHBsYW5lCisgICAgICAgIERNQSwgc28gaXQncyBiZXN0IHRvIG1ha2UgdGhlIERNQSBzdGFydCBhcyBsYXRlIGFzIHBvc3NpYmxlLgorICAgICAgLSB5b3UgcmVhbGx5IGRvbid0IHdhbnQgdG8gbWFrZSBkZGZzdHJ0IDwgMTI4LCBzaW5jZSB0aGlzIHdpbGwgc3RlYWwgRE1BCisgICAgICAgIGN5Y2xlcyBmcm9tIHRoZSBvdGhlciBETUEgY2hhbm5lbHMgKGF1ZGlvLCBmbG9wcHkgYW5kIENoaXAgUkFNIHJlZnJlc2gpLgorICAgICAgLSBJIG1ha2UgZGl3c3RvcF9oIGFuZCBkaXdzdG9wX3YgYXMgbGFyZ2UgYXMgcG9zc2libGUuCisKKyAgIEdlbmVyYWwgZGVwZW5kZW5jaWVzCisgICAtLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAtIGFsbCB2YWx1ZXMgYXJlIFNIUkVTIHBpeGVsICgzNW5zKQorCisgICAgICAgICAgICAgICAgICB0YWJsZSAxOmZldGNoc3RhcnQgIHRhYmxlIDI6cHJlZmV0Y2ggICAgdGFibGUgMzpmZXRjaHNpemUKKyAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLQorICAgUGl4Y2xvY2sgICAgICMgU0hSRVN8SElSRVN8TE9SRVMgIyBTSFJFU3xISVJFU3xMT1JFUyAjIFNIUkVTfEhJUkVTfExPUkVTCisgICAtLS0tLS0tLS0tLS0tIy0tLS0tLSstLS0tLSstLS0tLS0jLS0tLS0tKy0tLS0tKy0tLS0tLSMtLS0tLS0rLS0tLS0rLS0tLS0tCisgICBCdXMgd2lkdGggMXggIyAgIDE2IHwgIDMyIHwgIDY0ICAjICAgMTYgfCAgMzIgfCAgNjQgICMgICA2NCB8ICA2NCB8ICA2NAorICAgQnVzIHdpZHRoIDJ4ICMgICAzMiB8ICA2NCB8IDEyOCAgIyAgIDMyIHwgIDY0IHwgIDY0ICAjICAgNjQgfCAgNjQgfCAxMjgKKyAgIEJ1cyB3aWR0aCA0eCAjICAgNjQgfCAxMjggfCAyNTYgICMgICA2NCB8ICA2NCB8ICA2NCAgIyAgIDY0IHwgMTI4IHwgMjU2CisKKyAgICAgIC0gY2hpcHNldCBuZWVkcyA0IHBpeGVscyBiZWZvcmUgdGhlIGZpcnN0IHBpeGVsIGlzIG91dHB1dAorICAgICAgLSBkZGZzdHJ0IG11c3QgYmUgYWxpZ25lZCB0byBmZXRjaHN0YXJ0ICh0YWJsZSAxKQorICAgICAgLSBjaGlwc2V0IG5lZWRzIGFsc28gcHJlZmV0Y2ggKHRhYmxlIDIpIHRvIGdldCBmaXJzdCBwaXhlbCBkYXRhLCBzbworICAgICAgICBkZGZzdHJ0ID0gKChkaXdzdHJ0X2gtNCkgJiAtZmV0Y2hzdGFydCkgLSBwcmVmZXRjaAorICAgICAgLSBmb3IgaG9yaXpvbnRhbCBwYW5uaW5nIGRlY3JlYXNlIGRpd3N0cnRfaAorICAgICAgLSB0aGUgbGVuZ3RoIG9mIGEgZmV0Y2hsaW5lIG11c3QgYmUgYWxpZ25lZCB0byBmZXRjaHNpemUgKHRhYmxlIDMpCisgICAgICAtIGlmIGZldGNoc3RhcnQgaXMgc21hbGxlciB0aGFuIGZldGNoc2l6ZSwgdGhlbiBkZGZzdHJ0IGNhbiBhIGxpdHRsZSBiaXQKKyAgICAgICAgbW92ZWQgdG8gb3B0aW1pemUgdXNlIG9mIGRtYSAodXNlZnVsIGZvciBPQ1MvRUNTIG92ZXJzY2FuIGRpc3BsYXlzKQorICAgICAgLSBkZGZzdG9wIGlzIGRkZnN0cnQrZGRmc2l6ZS1mZXRjaHNpemUKKyAgICAgIC0gSWYgQz0gZGlkbid0IGNoYW5nZSBhbnl0aGluZyBmb3IgQUdBLCB0aGVuIGF0IGZvbGxvd2luZyBwb3NpdGlvbnMgdGhlCisgICAgICAgIGRtYSBidXMgaXMgYWxyZWFkeSB1c2VkOgorICAgICAgICBkZGZzdHJ0IDwgIDQ4IC0+IG1lbW9yeSByZWZyZXNoCisgICAgICAgICAgICAgICAgPCAgOTYgLT4gZGlzayBkbWEKKyAgICAgICAgICAgICAgICA8IDE2MCAtPiBhdWRpbyBkbWEKKyAgICAgICAgICAgICAgICA8IDE5MiAtPiBzcHJpdGUgMCBkbWEKKyAgICAgICAgICAgICAgICA8IDQxNiAtPiBzcHJpdGUgZG1hICgzMiBwZXIgc3ByaXRlKQorICAgICAgLSBpbiBhY2NvcmRhbmNlIHdpdGggdGhlIGhhcmR3YXJlIHJlZmVyZW5jZSBtYW51YWwgYSBoYXJkd2FyZSBzdG9wIGlzIGF0CisgICAgICAgIDE5MiwgYnV0IEFHQSAoRUNTPykgY2FuIGdvIGJlbG93IHRoaXMuCisKKyAgIERNQSBwcmlvcml0aWVzCisgICAtLS0tLS0tLS0tLS0tLQorCisgICBTaW5jZSB0aGVyZSBhcmUgbGltaXRzIG9uIHRoZSBlYXJsaWVzdCBzdGFydCB2YWx1ZSBmb3IgZGlzcGxheSBETUEgYW5kIHRoZQorICAgZGlzcGxheSBvZiBzcHJpdGVzLCBJIHVzZSB0aGUgZm9sbG93aW5nIHBvbGljeSBvbiBob3Jpem9udGFsIHBhbm5pbmcgYW5kCisgICB0aGUgaGFyZHdhcmUgY3Vyc29yOgorCisgICAgICAtIGlmIHlvdSB3YW50IHRvIHN0YXJ0IGRpc3BsYXkgRE1BIHRvbyBlYXJseSwgeW91IGxvc2UgdGhlIGFiaWxpdHkgdG8KKyAgICAgICAgZG8gc21vb3RoIGhvcml6b250YWwgcGFubmluZyAoeHBhbnN0ZXAgMSAtPiA2NCkuCisgICAgICAtIGlmIHlvdSB3YW50IHRvIGdvIGV2ZW4gZnVydGhlciwgeW91IGxvc2UgdGhlIGhhcmR3YXJlIGN1cnNvciB0b28uCisKKyAgIElNSE8gYSBoYXJkd2FyZSBjdXJzb3IgaXMgbW9yZSBpbXBvcnRhbnQgZm9yIFggdGhhbiBob3Jpem9udGFsIHNjcm9sbGluZywKKyAgIHNvIHRoYXQncyBteSBtb3RpdmF0aW9uLgorCisKKyAgIEltcGxlbWVudGF0aW9uCisgICAtLS0tLS0tLS0tLS0tLQorCisgICBhbWlfZGVjb2RlX3ZhcigpIGNvbnZlcnRzIHRoZSBmcmFtZSBidWZmZXIgdmFsdWVzIHRvIHRoZSBBbWlnYSB2YWx1ZXMuIEl0J3MKKyAgIGp1c3QgYSBgc3RyYWlnaHRmb3J3YXJkJyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWJvdmUgcnVsZXMuCisKKworICAgU3RhbmRhcmQgVkdBIHRpbWluZ3MKKyAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgICAgICAgICAgIHhyZXMgIHlyZXMgICAgbGVmdCAgcmlnaHQgIHVwcGVyICBsb3dlciAgICBoc3luYyAgICB2c3luYworICAgICAgICAgICAgICAgLS0tLSAgLS0tLSAgICAtLS0tICAtLS0tLSAgLS0tLS0gIC0tLS0tICAgIC0tLS0tICAgIC0tLS0tCisgICAgICA4MHgyNSAgICAgNzIwICAgNDAwICAgICAgMjcgICAgIDQ1ICAgICAzNSAgICAgMTIgICAgICAxMDggICAgICAgIDIKKyAgICAgIDgweDMwICAgICA3MjAgICA0ODAgICAgICAyNyAgICAgNDUgICAgIDMwICAgICAgOSAgICAgIDEwOCAgICAgICAgMgorCisgICBUaGVzZSB3ZXJlIHRha2VuIGZyb20gYSBYRnJlZTg2IGNvbmZpZ3VyYXRpb24gZmlsZSwgcmVjYWxjdWxhdGVkIGZvciBhIDI4IE1IegorICAgZG90Y2xvY2sgKEFtaWdhcyBkb24ndCBoYXZlIGEgMjUgTUh6IGRvdGNsb2NrKSBhbmQgY29udmVydGVkIHRvIGZyYW1lIGJ1ZmZlcgorICAgZ2VuZXJpYyB0aW1pbmdzLgorCisgICBBcyBhIGNvbXBhcmlzb24sIGdyYXBoaWNzL21vbml0b3IuaCBzdWdnZXN0cyB0aGUgZm9sbG93aW5nOgorCisgICAgICAgICAgICAgICB4cmVzICB5cmVzICAgIGxlZnQgIHJpZ2h0ICB1cHBlciAgbG93ZXIgICAgaHN5bmMgICAgdnN5bmMKKyAgICAgICAgICAgICAgIC0tLS0gIC0tLS0gICAgLS0tLSAgLS0tLS0gIC0tLS0tICAtLS0tLSAgICAtLS0tLSAgICAtLS0tLQorCisgICAgICBWR0EgICAgICAgNjQwICAgNDgwICAgICAgNTIgICAgMTEyICAgICAyNCAgICAgMTkgICAgMTEyIC0gICAgICAyICsKKyAgICAgIFZHQTcwICAgICA2NDAgICA0MDAgICAgICA1MiAgICAxMTIgICAgIDI3ICAgICAyMSAgICAxMTIgLSAgICAgIDIgLQorCisKKyAgIFN5bmMgcG9sYXJpdGllcworICAgLS0tLS0tLS0tLS0tLS0tCisKKyAgICAgIFZTWU5DICAgIEhTWU5DICAgIFZlcnRpY2FsIHNpemUgICAgVmVydGljYWwgdG90YWwKKyAgICAgIC0tLS0tICAgIC0tLS0tICAgIC0tLS0tLS0tLS0tLS0gICAgLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgKyAgICAgICAgKyAgICAgICAgICAgUmVzZXJ2ZWQgICAgICAgICAgUmVzZXJ2ZWQKKyAgICAgICAgKyAgICAgICAgLSAgICAgICAgICAgICAgICA0MDAgICAgICAgICAgICAgICA0MTQKKyAgICAgICAgLSAgICAgICAgKyAgICAgICAgICAgICAgICAzNTAgICAgICAgICAgICAgICAzNjIKKyAgICAgICAgLSAgICAgICAgLSAgICAgICAgICAgICAgICA0ODAgICAgICAgICAgICAgICA0OTYKKworICAgU291cmNlOiBDTC1HRDU0MlggVGVjaG5pY2FsIFJlZmVyZW5jZSBNYW51YWwsIENpcnJ1cyBMb2dpYywgT2N0IDE5OTIKKworCisgICBCcm9hZGNhc3QgdmlkZW8gdGltaW5ncworICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgQWNjb3JkaW5nIHRvIHRoZSBDQ0lSIGFuZCBSRVRNQSBzcGVjaWZpY2F0aW9ucywgd2UgaGF2ZSB0aGUgZm9sbG93aW5nIHZhbHVlczoKKworICAgQ0NJUiAtPiBQQUwKKyAgIC0tLS0tLS0tLS0tCisKKyAgICAgIC0gYSBzY2FubGluZSBpcyA2NCC1cyBsb25nLCBvZiB3aGljaCA1Mi40OCC1cyBhcmUgdmlzaWJsZS4gVGhpcyBpcyBhYm91dAorICAgICAgICA3MzYgdmlzaWJsZSA3MCBucyBwaXhlbHMgcGVyIGxpbmUuCisgICAgICAtIHdlIGhhdmUgNjI1IHNjYW5saW5lcywgb2Ygd2hpY2ggNTc1IGFyZSB2aXNpYmxlIChpbnRlcmxhY2VkKTsgYWZ0ZXIKKyAgICAgICAgcm91bmRpbmcgdGhpcyBiZWNvbWVzIDU3Ni4KKworICAgUkVUTUEgLT4gTlRTQworICAgLS0tLS0tLS0tLS0tLQorCisgICAgICAtIGEgc2NhbmxpbmUgaXMgNjMuNSC1cyBsb25nLCBvZiB3aGljaCA1My41ILVzIGFyZSB2aXNpYmxlLiAgVGhpcyBpcyBhYm91dAorICAgICAgICA3MzYgdmlzaWJsZSA3MCBucyBwaXhlbHMgcGVyIGxpbmUuCisgICAgICAtIHdlIGhhdmUgNTI1IHNjYW5saW5lcywgb2Ygd2hpY2ggNDg1IGFyZSB2aXNpYmxlIChpbnRlcmxhY2VkKTsgYWZ0ZXIKKyAgICAgICAgcm91bmRpbmcgdGhpcyBiZWNvbWVzIDQ4NC4KKworICAgVGh1cyBpZiB5b3Ugd2FudCBhIFBBTCBjb21wYXRpYmxlIGRpc3BsYXksIHlvdSBoYXZlIHRvIGRvIHRoZSBmb2xsb3dpbmc6CisKKyAgICAgIC0gc2V0IHRoZSBGQl9TWU5DX0JST0FEQ0FTVCBmbGFnIHRvIGluZGljYXRlIHRoYXQgc3RhbmRhcmQgYnJvYWRjYXN0CisgICAgICAgIHRpbWluZ3MgYXJlIHRvIGJlIHVzZWQuCisgICAgICAtIG1ha2Ugc3VyZSB1cHBlcl9tYXJnaW4reXJlcytsb3dlcl9tYXJnaW4rdnN5bmNfbGVuID0gNjI1IGZvciBhbgorICAgICAgICBpbnRlcmxhY2VkLCAzMTIgZm9yIGEgbm9uLWludGVybGFjZWQgYW5kIDE1NiBmb3IgYSBkb3VibGVzY2FubmVkCisgICAgICAgIGRpc3BsYXkuCisgICAgICAtIG1ha2Ugc3VyZSBsZWZ0X21hcmdpbit4cmVzK3JpZ2h0X21hcmdpbitoc3luY19sZW4gPSAxODE2IGZvciBhIFNIUkVTLAorICAgICAgICA5MDggZm9yIGEgSElSRVMgYW5kIDQ1NCBmb3IgYSBMT1JFUyBkaXNwbGF5LgorICAgICAgLSB0aGUgbGVmdCB2aXNpYmxlIHBhcnQgYmVnaW5zIGF0IDM2MCAoU0hSRVM7IEhJUkVTOjE4MCwgTE9SRVM6OTApLAorICAgICAgICBsZWZ0X21hcmdpbisyKmhzeW5jX2xlbiBtdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwuCisgICAgICAtIHRoZSB1cHBlciB2aXNpYmxlIHBhcnQgYmVnaW5zIGF0IDQ4IChpbnRlcmxhY2VkOyBub24taW50ZXJsYWNlZDoyNCwKKyAgICAgICAgZG91Ymxlc2Nhbm5lZDoxMiksIHVwcGVyX21hcmdpbisyKnZzeW5jX2xlbiBtdXN0IGJlIGdyZWF0ZXIgb3IgZXF1YWwuCisgICAgICAtIGFtaV9lbmNvZGVfdmFyKCkgY2FsY3VsYXRlcyBtYXJnaW5zIHdpdGggYSBoc3luYyBvZiA1MzIwIG5zIGFuZCBhIHZzeW5jCisgICAgICAgIG9mIDQgc2NhbmxpbmVzCisKKyAgIFRoZSBzZXR0aW5ncyBmb3IgYSBOVFNDIGNvbXBhdGlibGUgZGlzcGxheSBhcmUgc3RyYWlnaHRmb3J3YXJkLgorCisgICBOb3RlIHRoYXQgaW4gYSBzdHJpY3Qgc2Vuc2UgdGhlIFBBTCBhbmQgTlRTQyBzdGFuZGFyZHMgb25seSBkZWZpbmUgdGhlCisgICBlbmNvZGluZyBvZiB0aGUgY29sb3IgcGFydCAoY2hyb21pbmFuY2UpIG9mIHRoZSB2aWRlbyBzaWduYWwgYW5kIGRvbid0IHNheQorICAgYW55dGhpbmcgYWJvdXQgaG9yaXpvbnRhbC92ZXJ0aWNhbCBzeW5jaHJvbml6YXRpb24gbm9yIHJlZnJlc2ggcmF0ZXMuCisKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gR2VlcnQgLS0KKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisJLyoKKwkgKiBDdXN0b20gQ2hpcHNldCBEZWZpbml0aW9ucworCSAqLworCisjZGVmaW5lIENVU1RPTV9PRlMoZmxkKSAoKGxvbmcpJigoc3RydWN0IENVU1RPTSopMCktPmZsZCkKKworCS8qCisJICogQlBMQ09OMCAtLSBCaXRwbGFuZSBDb250cm9sIFJlZ2lzdGVyIDAKKwkgKi8KKworI2RlZmluZSBCUEMwX0hJUkVTCSgweDgwMDApCisjZGVmaW5lIEJQQzBfQlBVMgkoMHg0MDAwKSAvKiBCaXQgcGxhbmUgdXNlZCBjb3VudCAqLworI2RlZmluZSBCUEMwX0JQVTEJKDB4MjAwMCkKKyNkZWZpbmUgQlBDMF9CUFUwCSgweDEwMDApCisjZGVmaW5lIEJQQzBfSEFNCSgweDA4MDApIC8qIEhBTSBtb2RlICovCisjZGVmaW5lIEJQQzBfRFBGCSgweDA0MDApIC8qIERvdWJsZSBwbGF5ZmllbGQgKi8KKyNkZWZpbmUgQlBDMF9DT0xPUgkoMHgwMjAwKSAvKiBFbmFibGUgY29sb3JidXJzdCAqLworI2RlZmluZSBCUEMwX0dBVUQJKDB4MDEwMCkgLyogR2VubG9jayBhdWRpbyBlbmFibGUgKi8KKyNkZWZpbmUgQlBDMF9VSFJFUwkoMHgwMDgwKSAvKiBVbHRyYWhpIHJlcyBlbmFibGUgKi8KKyNkZWZpbmUgQlBDMF9TSFJFUwkoMHgwMDQwKSAvKiBTdXBlciBoaSByZXMgbW9kZSAqLworI2RlZmluZSBCUEMwX0JZUEFTUwkoMHgwMDIwKSAvKiBCeXBhc3MgTFVUIC0gQUdBICovCisjZGVmaW5lIEJQQzBfQlBVMwkoMHgwMDEwKSAvKiBBR0EgKi8KKyNkZWZpbmUgQlBDMF9MUEVOCSgweDAwMDgpIC8qIExpZ2h0IHBlbiBlbmFibGUgKi8KKyNkZWZpbmUgQlBDMF9MQUNFCSgweDAwMDQpIC8qIEludGVybGFjZSAqLworI2RlZmluZSBCUEMwX0VSU1kJKDB4MDAwMikgLyogRXh0ZXJuYWwgcmVzeW5jICovCisjZGVmaW5lIEJQQzBfRUNTRU5BCSgweDAwMDEpIC8qIEVDUyBlbmFibGUgKi8KKworCS8qCisJICogQlBMQ09OMiAtLSBCaXRwbGFuZSBDb250cm9sIFJlZ2lzdGVyIDIKKwkgKi8KKworI2RlZmluZSBCUEMyX1pEQlBTRUwyCSgweDQwMDApIC8qIEJpdHBsYW5lIHRvIGJlIHVzZWQgZm9yIFpEIC0gQUdBICovCisjZGVmaW5lIEJQQzJfWkRCUFNFTDEJKDB4MjAwMCkKKyNkZWZpbmUgQlBDMl9aREJQU0VMMAkoMHgxMDAwKQorI2RlZmluZSBCUEMyX1pEQlBFTgkoMHgwODAwKSAvKiBFbmFibGUgWkQgd2l0aCBaREJQU0VMeCAtIEFHQSAqLworI2RlZmluZSBCUEMyX1pEQ1RFTgkoMHgwNDAwKSAvKiBFbmFibGUgWkQgd2l0aCBwYWxldHRlIGJpdCAjMzEgLSBBR0EgKi8KKyNkZWZpbmUgQlBDMl9LSUxMRUhCCSgweDAyMDApIC8qIEtpbGwgRUhCIG1vZGUgLSBBR0EgKi8KKyNkZWZpbmUgQlBDMl9SRFJBTQkoMHgwMTAwKSAvKiBDb2xvciB0YWJsZSBhY2Nlc3NlcyByZWFkLCBub3Qgd3JpdGUgLSBBR0EgKi8KKyNkZWZpbmUgQlBDMl9TT0dFTgkoMHgwMDgwKSAvKiBTT0cgb3V0cHV0IHBpbiBoaWdoIC0gQUdBICovCisjZGVmaW5lIEJQQzJfUEYyUFJJCSgweDAwNDApIC8qIFBGMiBwcmlvcml0eSBvdmVyIFBGMSAqLworI2RlZmluZSBCUEMyX1BGMlAyCSgweDAwMjApIC8qIFBGMiBwcmlvcml0eSB3cnQgc3ByaXRlcyAqLworI2RlZmluZSBCUEMyX1BGMlAxCSgweDAwMTApCisjZGVmaW5lIEJQQzJfUEYyUDAJKDB4MDAwOCkKKyNkZWZpbmUgQlBDMl9QRjFQMgkoMHgwMDA0KSAvKiBkaXR0byBQRjEgKi8KKyNkZWZpbmUgQlBDMl9QRjFQMQkoMHgwMDAyKQorI2RlZmluZSBCUEMyX1BGMVAwCSgweDAwMDEpCisKKwkvKgorCSAqIEJQTENPTjMgLS0gQml0cGxhbmUgQ29udHJvbCBSZWdpc3RlciAzIChBR0EpCisJICovCisKKyNkZWZpbmUgQlBDM19CQU5LMgkoMHg4MDAwKSAvKiBCaXRzIHRvIHNlbGVjdCBjb2xvciByZWdpc3RlciBiYW5rICovCisjZGVmaW5lIEJQQzNfQkFOSzEJKDB4NDAwMCkKKyNkZWZpbmUgQlBDM19CQU5LMAkoMHgyMDAwKQorI2RlZmluZSBCUEMzX1BGMk9GMgkoMHgxMDAwKSAvKiBCaXRzIGZvciBjb2xvciB0YWJsZSBvZmZzZXQgd2hlbiBQRjIgKi8KKyNkZWZpbmUgQlBDM19QRjJPRjEJKDB4MDgwMCkKKyNkZWZpbmUgQlBDM19QRjJPRjAJKDB4MDQwMCkKKyNkZWZpbmUgQlBDM19MT0NUCSgweDAyMDApIC8qIENvbG9yIHJlZ2lzdGVyIHdyaXRlcyBnbyB0byBsb3cgYml0cyAqLworI2RlZmluZSBCUEMzX1NQUkVTMQkoMHgwMDgwKSAvKiBTcHJpdGUgcmVzb2x1dGlvbiBiaXRzICovCisjZGVmaW5lIEJQQzNfU1BSRVMwCSgweDAwNDApCisjZGVmaW5lIEJQQzNfQlJEUkJMTksJKDB4MDAyMCkgLyogQm9yZGVyIGJsYW5rZWQ/ICovCisjZGVmaW5lIEJQQzNfQlJEUlRSQU4JKDB4MDAxMCkgLyogQm9yZGVyIHRyYW5zcGFyZW50PyAqLworI2RlZmluZSBCUEMzX1pEQ0xLRU4JKDB4MDAwNCkgLyogWkQgcGluIGlzIDE0IE1IeiAoSElSRVMpIGNsb2NrIG91dHB1dCAqLworI2RlZmluZSBCUEMzX0JSRFJTUFJUCSgweDAwMDIpIC8qIFNwcml0ZXMgaW4gYm9yZGVyPyAqLworI2RlZmluZSBCUEMzX0VYVEJMS0VOCSgweDAwMDEpIC8qIEJMQU5LIHByb2dyYW1tYWJsZSAqLworCisJLyoKKwkgKiBCUExDT040IC0tIEJpdHBsYW5lIENvbnRyb2wgUmVnaXN0ZXIgNCAoQUdBKQorCSAqLworCisjZGVmaW5lIEJQQzRfQlBMQU03CSgweDgwMDApIC8qIGJpdHBsYW5lIGNvbG9yIFhPUiBmaWVsZCAqLworI2RlZmluZSBCUEM0X0JQTEFNNgkoMHg0MDAwKQorI2RlZmluZSBCUEM0X0JQTEFNNQkoMHgyMDAwKQorI2RlZmluZSBCUEM0X0JQTEFNNAkoMHgxMDAwKQorI2RlZmluZSBCUEM0X0JQTEFNMwkoMHgwODAwKQorI2RlZmluZSBCUEM0X0JQTEFNMgkoMHgwNDAwKQorI2RlZmluZSBCUEM0X0JQTEFNMQkoMHgwMjAwKQorI2RlZmluZSBCUEM0X0JQTEFNMAkoMHgwMTAwKQorI2RlZmluZSBCUEM0X0VTUFJNNwkoMHgwMDgwKSAvKiA0IGhpZ2ggYml0cyBmb3IgZXZlbiBzcHJpdGUgY29sb3JzICovCisjZGVmaW5lIEJQQzRfRVNQUk02CSgweDAwNDApCisjZGVmaW5lIEJQQzRfRVNQUk01CSgweDAwMjApCisjZGVmaW5lIEJQQzRfRVNQUk00CSgweDAwMTApCisjZGVmaW5lIEJQQzRfT1NQUk03CSgweDAwMDgpIC8qIDQgaGlnaCBiaXRzIGZvciBvZGQgc3ByaXRlIGNvbG9ycyAqLworI2RlZmluZSBCUEM0X09TUFJNNgkoMHgwMDA0KQorI2RlZmluZSBCUEM0X09TUFJNNQkoMHgwMDAyKQorI2RlZmluZSBCUEM0X09TUFJNNAkoMHgwMDAxKQorCisJLyoKKwkgKiBCRUFNQ09OMCAtLSBCZWFtIENvbnRyb2wgUmVnaXN0ZXIKKwkgKi8KKworI2RlZmluZSBCTUMwX0hBUkRESVMJKDB4NDAwMCkgLyogRGlzYWJsZSBoYXJkd2FyZSBsaW1pdHMgKi8KKyNkZWZpbmUgQk1DMF9MUEVORElTCSgweDIwMDApIC8qIERpc2FibGUgbGlnaHQgcGVuIGxhdGNoICovCisjZGVmaW5lIEJNQzBfVkFSVkJFTgkoMHgxMDAwKSAvKiBFbmFibGUgdmFyaWFibGUgdmVydGljYWwgYmxhbmsgKi8KKyNkZWZpbmUgQk1DMF9MT0xESVMJKDB4MDgwMCkgLyogRGlzYWJsZSBsb25nL3Nob3J0IGxpbmUgdG9nZ2xlICovCisjZGVmaW5lIEJNQzBfQ1NDQkVOCSgweDA0MDApIC8qIENvbXBvc2l0ZSBzeW5jL2JsYW5rICovCisjZGVmaW5lIEJNQzBfVkFSVlNZRU4JKDB4MDIwMCkgLyogRW5hYmxlIHZhcmlhYmxlIHZlcnRpY2FsIHN5bmMgKi8KKyNkZWZpbmUgQk1DMF9WQVJIU1lFTgkoMHgwMTAwKSAvKiBFbmFibGUgdmFyaWFibGUgaG9yaXpvbnRhbCBzeW5jICovCisjZGVmaW5lIEJNQzBfVkFSQkVBTUVOCSgweDAwODApIC8qIEVuYWJsZSB2YXJpYWJsZSBiZWFtIGNvdW50ZXJzICovCisjZGVmaW5lIEJNQzBfRFVBTAkoMHgwMDQwKSAvKiBFbmFibGUgYWx0ZXJuYXRlIGhvcml6b250YWwgYmVhbSBjb3VudGVyICovCisjZGVmaW5lIEJNQzBfUEFMCSgweDAwMjApIC8qIFNldCBkZWNvZGVzIGZvciBQQUwgKi8KKyNkZWZpbmUgQk1DMF9WQVJDU1lFTgkoMHgwMDEwKSAvKiBFbmFibGUgdmFyaWFibGUgY29tcG9zaXRlIHN5bmMgKi8KKyNkZWZpbmUgQk1DMF9CTEFOS0VOCSgweDAwMDgpIC8qIEJsYW5rIGVuYWJsZSAobm8gbG9uZ2VyIHVzZWQgb24gQUdBKSAqLworI2RlZmluZSBCTUMwX0NTWVRSVUUJKDB4MDAwNCkgLyogQ1NZIHBvbGFyaXR5ICovCisjZGVmaW5lIEJNQzBfVlNZVFJVRQkoMHgwMDAyKSAvKiBWU1kgcG9sYXJpdHkgKi8KKyNkZWZpbmUgQk1DMF9IU1lUUlVFCSgweDAwMDEpIC8qIEhTWSBwb2xhcml0eSAqLworCisKKwkvKgorCSAqIEZNT0RFIC0tIEZldGNoIE1vZGUgQ29udHJvbCBSZWdpc3RlciAoQUdBKQorCSAqLworCisjZGVmaW5lIEZNT0RFX1NTQ0FOMgkoMHg4MDAwKSAvKiBTcHJpdGUgc2Nhbi1kb3VibGluZyAqLworI2RlZmluZSBGTU9ERV9CU0NBTjIJKDB4NDAwMCkgLyogVXNlIFBGMiBtb2R1bHVzIGV2ZXJ5IG90aGVyIGxpbmUgKi8KKyNkZWZpbmUgRk1PREVfU1BBR0VNCSgweDAwMDgpIC8qIFNwcml0ZSBwYWdlIG1vZGUgKi8KKyNkZWZpbmUgRk1PREVfU1BSMzIJKDB4MDAwNCkgLyogU3ByaXRlIDMyIGJpdCBmZXRjaCAqLworI2RlZmluZSBGTU9ERV9CUEFHRU0JKDB4MDAwMikgLyogQml0cGxhbmUgcGFnZSBtb2RlICovCisjZGVmaW5lIEZNT0RFX0JQTDMyCSgweDAwMDEpIC8qIEJpdHBsYW5lIDMyIGJpdCBmZXRjaCAqLworCisJLyoKKwkgKiBUYWdzIHVzZWQgdG8gaW5kaWNhdGUgYSBzcGVjaWZpYyBQaXhlbCBDbG9jaworCSAqCisJICogY2xrX3NoaWZ0IGlzIHRoZSBzaGlmdCB2YWx1ZSB0byBnZXQgdGhlIHRpbWluZ3MgaW4gMzUgbnMgdW5pdHMKKwkgKi8KKworZW51bSB7IFRBR19TSFJFUywgVEFHX0hJUkVTLCBUQUdfTE9SRVMgfTsKKworCS8qCisJICogVGFncyB1c2VkIHRvIGluZGljYXRlIHRoZSBzcGVjaWZpYyBjaGlwc2V0CisJICovCisKK2VudW0geyBUQUdfT0NTLCBUQUdfRUNTLCBUQUdfQUdBIH07CisKKwkvKgorCSAqIFRhZ3MgdXNlZCB0byBpbmRpY2F0ZSB0aGUgbWVtb3J5IGJhbmR3aWR0aAorCSAqLworCitlbnVtIHsgVEFHX0ZNT0RFXzEsIFRBR19GTU9ERV8yLCBUQUdfRk1PREVfNCB9OworCisKKwkvKgorCSAqIENsb2NrIERlZmluaXRpb25zLCBNYXhpbXVtIERpc3BsYXkgRGVwdGgKKwkgKgorCSAqIFRoZXNlIGRlcGVuZCBvbiB0aGUgRS1DbG9jayBvciB0aGUgQ2hpcHNldCwgc28gdGhleSBhcmUgZmlsbGVkIGluCisJICogZHluYW1pY2FsbHkKKwkgKi8KKworc3RhdGljIHVfbG9uZyBwaXhjbG9ja1szXTsJLyogU0hSRVMvSElSRVMvTE9SRVM6IGluZGV4ID0gY2xrX3NoaWZ0ICovCitzdGF0aWMgdV9zaG9ydCBtYXhkZXB0aFszXTsJLyogU0hSRVMvSElSRVMvTE9SRVM6IGluZGV4ID0gY2xrX3NoaWZ0ICovCitzdGF0aWMgdV9zaG9ydCBtYXhmbW9kZSwgY2hpcHNldDsKKworCisJLyoKKwkgKiBCcm9hZGNhc3QgVmlkZW8gVGltaW5ncworCSAqCisJICogSG9yaXpvbnRhbCB2YWx1ZXMgYXJlIGluIDM1IG5zIChTSFJFUykgdW5pdHMKKwkgKiBWZXJ0aWNhbCB2YWx1ZXMgYXJlIGluIGludGVybGFjZWQgc2NhbmxpbmVzCisJICovCisKKyNkZWZpbmUgUEFMX0RJV1NUUlRfSAkoMzYwKQkvKiBQQUwgV2luZG93IExpbWl0cyAqLworI2RlZmluZSBQQUxfRElXU1RSVF9WCSg0OCkKKyNkZWZpbmUgUEFMX0hUT1RBTAkoMTgxNikKKyNkZWZpbmUgUEFMX1ZUT1RBTAkoNjI1KQorCisjZGVmaW5lIE5UU0NfRElXU1RSVF9ICSgzNjApCS8qIE5UU0MgV2luZG93IExpbWl0cyAqLworI2RlZmluZSBOVFNDX0RJV1NUUlRfVgkoNDApCisjZGVmaW5lIE5UU0NfSFRPVEFMCSgxODE2KQorI2RlZmluZSBOVFNDX1ZUT1RBTAkoNTI1KQorCisKKwkvKgorCSAqIFZhcmlvdXMgbWFjcm9zCisJICovCisKKyNkZWZpbmUgdXAyKHYpCQkoKCh2KSsxKSAmIC0yKQorI2RlZmluZSBkb3duMih2KQkoKHYpICYgLTIpCisjZGVmaW5lIGRpdjIodikJCSgodik+PjEpCisjZGVmaW5lIG1vZDIodikJCSgodikgJiAxKQorCisjZGVmaW5lIHVwNCh2KQkJKCgodikrMykgJiAtNCkKKyNkZWZpbmUgZG93bjQodikJKCh2KSAmIC00KQorI2RlZmluZSBtdWw0KHYpCQkoKHYpPDwyKQorI2RlZmluZSBkaXY0KHYpCQkoKHYpPj4yKQorI2RlZmluZSBtb2Q0KHYpCQkoKHYpICYgMykKKworI2RlZmluZSB1cDgodikJCSgoKHYpKzcpICYgLTgpCisjZGVmaW5lIGRvd244KHYpCSgodikgJiAtOCkKKyNkZWZpbmUgZGl2OCh2KQkJKCh2KT4+MykKKyNkZWZpbmUgbW9kOCh2KQkJKCh2KSAmIDcpCisKKyNkZWZpbmUgdXAxNih2KQkJKCgodikrMTUpICYgLTE2KQorI2RlZmluZSBkb3duMTYodikJKCh2KSAmIC0xNikKKyNkZWZpbmUgZGl2MTYodikJKCh2KT4+NCkKKyNkZWZpbmUgbW9kMTYodikJKCh2KSAmIDE1KQorCisjZGVmaW5lIHVwMzIodikJCSgoKHYpKzMxKSAmIC0zMikKKyNkZWZpbmUgZG93bjMyKHYpCSgodikgJiAtMzIpCisjZGVmaW5lIGRpdjMyKHYpCSgodik+PjUpCisjZGVmaW5lIG1vZDMyKHYpCSgodikgJiAzMSkKKworI2RlZmluZSB1cDY0KHYpCQkoKCh2KSs2MykgJiAtNjQpCisjZGVmaW5lIGRvd242NCh2KQkoKHYpICYgLTY0KQorI2RlZmluZSBkaXY2NCh2KQkoKHYpPj42KQorI2RlZmluZSBtb2Q2NCh2KQkoKHYpICYgNjMpCisKKyNkZWZpbmUgdXB4KHgsdikJKCgodikrKHgpLTEpICYgLSh4KSkKKyNkZWZpbmUgZG93bngoeCx2KQkoKHYpICYgLSh4KSkKKyNkZWZpbmUgbW9keCh4LHYpCSgodikgJiAoKHgpLTEpKQorCisvKiBpZiB4MSBpcyBub3QgYSBjb25zdGFudCwgdGhpcyBtYWNybyB3b24ndCBtYWtlIHJlYWwgc2Vuc2UgOi0pICovCisjaWZkZWYgX19tYzY4MDAwX18KKyNkZWZpbmUgRElWVUwoeDEsIHgyKSAoe2ludCByZXM7IGFzbSgiZGl2dWwgJTEsJTIsJTMiOiAiPWQiIChyZXMpOiBcCisJImQiICh4MiksICJkIiAoKGxvbmcpKCh4MSkvMHgxMDAwMDAwMDBVTEwpKSwgIjAiICgobG9uZykoeDEpKSk7IHJlczt9KQorI2Vsc2UKKy8qIFdlIGtub3cgYSBiaXQgYWJvdXQgdGhlIG51bWJlcnMsIHNvIHdlIGNhbiBkbyBpdCB0aGlzIHdheSAqLworI2RlZmluZSBESVZVTCh4MSwgeDIpICgoKChsb25nKSgodW5zaWduZWQgbG9uZyBsb25nKXgxID4+IDgpIC8geDIpIDw8IDgpICsgXAorCSgoKChsb25nKSgodW5zaWduZWQgbG9uZyBsb25nKXgxID4+IDgpICUgeDIpIDw8IDgpIC8geDIpKQorI2VuZGlmCisKKyNkZWZpbmUgaGlnaHcoeCkJKCh1X2xvbmcpKHgpPj4xNiAmIDB4ZmZmZikKKyNkZWZpbmUgbG93dyh4KQkJKCh1X2xvbmcpKHgpICYgMHhmZmZmKQorCisjZGVmaW5lIFZCbGFua09uKCkJY3VzdG9tLmludGVuYSA9IElGX1NFVENMUnxJRl9DT1BFUgorI2RlZmluZSBWQmxhbmtPZmYoKQljdXN0b20uaW50ZW5hID0gSUZfQ09QRVIKKworCisJLyoKKwkgKiBDaGlwIFJBTSB3ZSByZXNlcnZlIGZvciB0aGUgRnJhbWUgQnVmZmVyCisJICoKKwkgKiBUaGlzIGRlZmluZXMgdGhlIE1heGltdW0gVmlydHVhbCBTY3JlZW4gU2l6ZQorCSAqIChTZXRhYmxlIHBlciBrZXJuZWwgb3B0aW9ucz8pCisJICovCisKKyNkZWZpbmUgVklERU9NRU1TSVpFX0FHQV8yTQkoMTMxMDcyMCkgLyogQUdBICgyTUIpIDogbWF4IDEyODAqMTAyNCoyNTYgICovCisjZGVmaW5lIFZJREVPTUVNU0laRV9BR0FfMU0JKDc4NjQzMikgIC8qIEFHQSAoMU1CKSA6IG1heCAxMDI0Kjc2OCoyNTYgICAqLworI2RlZmluZSBWSURFT01FTVNJWkVfRUNTXzJNCSg2NTUzNjApICAvKiBFQ1MgKDJNQikgOiBtYXggMTI4MCoxMDI0KjE2ICAgKi8KKyNkZWZpbmUgVklERU9NRU1TSVpFX0VDU18xTQkoMzkzMjE2KSAgLyogRUNTICgxTUIpIDogbWF4IDEwMjQqNzY4KjE2ICAgICovCisjZGVmaW5lIFZJREVPTUVNU0laRV9PQ1MJKDI2MjE0NCkgIC8qIE9DUyAgICAgICA6IG1heCBjYS4gODAwKjYwMCoxNiAqLworCisjZGVmaW5lIFNQUklURU1FTVNJWkUJCSg2NCo2NC80KSAvKiBtYXggNjQqNjQqNCAqLworI2RlZmluZSBEVU1NWVNQUklURU1FTVNJWkUJKDgpCitzdGF0aWMgdV9sb25nIHNwcml0ZW1lbW9yeTsKKworI2RlZmluZSBDSElQUkFNX1NBRkVUWV9MSU1JVAkoMTYzODQpCisKK3N0YXRpYyB1X2xvbmcgdmlkZW9tZW1vcnk7CisKKwkvKgorCSAqIFRoaXMgaXMgdGhlIGVhcmxpZXN0IGFsbG93ZWQgc3RhcnQgb2YgZmV0Y2hpbmcgZGlzcGxheSBkYXRhLgorCSAqIE9ubHkgaWYgeW91IHJlYWxseSB3YW50IG5vIGhhcmR3YXJlIGN1cnNvciBhbmQgYXVkaW8sCisJICogc2V0IHRoaXMgdG8gMTI4LCBidXQgbGV0IGl0IGJldHRlciBhdCAxOTIKKwkgKi8KKworc3RhdGljIHVfbG9uZyBtaW5fZnN0cnQgPSAxOTI7CisKKyNkZWZpbmUgYXNzaWduY2h1bmsobmFtZSwgdHlwZSwgcHRyLCBzaXplKSBcCit7IFwKKwkobmFtZSkgPSAodHlwZSkocHRyKTsgXAorCXB0ciArPSBzaXplOyBcCit9CisKKworCS8qCisJICogQ29wcGVyIEluc3RydWN0aW9ucworCSAqLworCisjZGVmaW5lIENNT1ZFKHZhbCwgcmVnKQkJKENVU1RPTV9PRlMocmVnKTw8MTYgfCAodmFsKSkKKyNkZWZpbmUgQ01PVkUyKHZhbCwgcmVnKQkoKENVU1RPTV9PRlMocmVnKSsyKTw8MTYgfCAodmFsKSkKKyNkZWZpbmUgQ1dBSVQoeCwgeSkJCSgoKHkpICYgMHgxZmUpPDwyMyB8ICgoeCkgJiAweDdmMCk8PDEzIHwgMHgwMDAxZmZmZSkKKyNkZWZpbmUgQ0VORAkJCSgweGZmZmZmZmZlKQorCisKK3R5cGVkZWYgdW5pb24geworCXVfbG9uZyBsOworCXVfc2hvcnQgd1syXTsKK30gY29waW5zOworCitzdGF0aWMgc3RydWN0IGNvcGRpc3BsYXkgeworCWNvcGlucyAqaW5pdDsKKwljb3BpbnMgKndhaXQ7CisJY29waW5zICpsaXN0WzJdWzJdOworCWNvcGlucyAqcmVidWlsZFsyXTsKK30gY29wZGlzcGxheTsKKworc3RhdGljIHVfc2hvcnQgY3VycmVudGNvcCA9IDA7CisKKwkvKgorCSAqIEhhcmR3YXJlIEN1cnNvciBBUEkgRGVmaW5pdGlvbnMKKwkgKiBUaGVzZSB1c2VkIHRvIGJlIGluIGxpbnV4L2ZiLmgsIGJ1dCB3ZXJlIHByZWxpbWluYXJ5IGFuZCB1c2VkIGJ5CisJICogYW1pZmIgb25seSBhbnl3YXkKKwkgKi8KKworI2RlZmluZSBGQklPR0VUX0ZDVVJTT1JJTkZPICAgICAweDQ2MDcKKyNkZWZpbmUgRkJJT0dFVF9WQ1VSU09SSU5GTyAgICAgMHg0NjA4CisjZGVmaW5lIEZCSU9QVVRfVkNVUlNPUklORk8gICAgIDB4NDYwOQorI2RlZmluZSBGQklPR0VUX0NVUlNPUlNUQVRFICAgICAweDQ2MEEKKyNkZWZpbmUgRkJJT1BVVF9DVVJTT1JTVEFURSAgICAgMHg0NjBCCisKKworc3RydWN0IGZiX2ZpeF9jdXJzb3JpbmZvIHsKKwlfX3UxNiBjcnNyX3dpZHRoOwkJLyogd2lkdGggYW5kIGhlaWdodCBvZiB0aGUgY3Vyc29yIGluICovCisJX191MTYgY3Jzcl9oZWlnaHQ7CQkvKiBwaXhlbHMgKHplcm8gaWYgbm8gY3Vyc29yKQkqLworCV9fdTE2IGNyc3JfeHNpemU7CQkvKiBjdXJzb3Igc2l6ZSBpbiBkaXNwbGF5IHBpeGVscyAqLworCV9fdTE2IGNyc3JfeXNpemU7CisJX191MTYgY3Jzcl9jb2xvcjE7CQkvKiBjb2xvcm1hcCBlbnRyeSBmb3IgY3Vyc29yIGNvbG9yMSAqLworCV9fdTE2IGNyc3JfY29sb3IyOwkJLyogY29sb3JtYXAgZW50cnkgZm9yIGN1cnNvciBjb2xvcjIgKi8KK307CisKK3N0cnVjdCBmYl92YXJfY3Vyc29yaW5mbyB7CisJX191MTYgd2lkdGg7CisJX191MTYgaGVpZ2h0OworCV9fdTE2IHhzcG90OworCV9fdTE2IHlzcG90OworCV9fdTggZGF0YVsxXTsJCQkvKiBmaWVsZCB3aXRoIFtoZWlnaHRdW3dpZHRoXSAgICAgICAgKi8KK307CisKK3N0cnVjdCBmYl9jdXJzb3JzdGF0ZSB7CisJX19zMTYgeG9mZnNldDsKKwlfX3MxNiB5b2Zmc2V0OworCV9fdTE2IG1vZGU7Cit9OworCisjZGVmaW5lIEZCX0NVUlNPUl9PRkYJCTAKKyNkZWZpbmUgRkJfQ1VSU09SX09OCQkxCisjZGVmaW5lIEZCX0NVUlNPUl9GTEFTSAkJMgorCisKKwkvKgorCSAqIEhhcmR3YXJlIEN1cnNvcgorCSAqLworCitzdGF0aWMgaW50IGN1cnNvcnJhdGUgPSAyMDsJLyogTnVtYmVyIG9mIGZyYW1lcy9mbGFzaCB0b2dnbGUgKi8KK3N0YXRpYyB1X3Nob3J0IGN1cnNvcnN0YXRlID0gLTE7CitzdGF0aWMgdV9zaG9ydCBjdXJzb3Jtb2RlID0gRkJfQ1VSU09SX09GRjsKKworc3RhdGljIHVfc2hvcnQgKmxvZnNwcml0ZSwgKnNoZnNwcml0ZSwgKmR1bW15c3ByaXRlOworCisJLyoKKwkgKiBDdXJyZW50IFZpZGVvIE1vZGUKKwkgKi8KKworc3RhdGljIHN0cnVjdCBhbWlmYl9wYXIgeworCisJLyogR2VuZXJhbCBWYWx1ZXMgKi8KKworCWludCB4cmVzOwkJLyogdm1vZGUgKi8KKwlpbnQgeXJlczsJCS8qIHZtb2RlICovCisJaW50IHZ4cmVzOwkJLyogdm1vZGUgKi8KKwlpbnQgdnlyZXM7CQkvKiB2bW9kZSAqLworCWludCB4b2Zmc2V0OwkJLyogdm1vZGUgKi8KKwlpbnQgeW9mZnNldDsJCS8qIHZtb2RlICovCisJdV9zaG9ydCBicHA7CQkvKiB2bW9kZSAqLworCXVfc2hvcnQgY2xrX3NoaWZ0OwkvKiB2bW9kZSAqLworCXVfc2hvcnQgbGluZV9zaGlmdDsJLyogdm1vZGUgKi8KKwlpbnQgdm1vZGU7CQkvKiB2bW9kZSAqLworCXVfc2hvcnQgZGl3c3RydF9oOwkvKiB2bW9kZSAqLworCXVfc2hvcnQgZGl3c3RvcF9oOwkvKiB2bW9kZSAqLworCXVfc2hvcnQgZGl3c3RydF92OwkvKiB2bW9kZSAqLworCXVfc2hvcnQgZGl3c3RvcF92OwkvKiB2bW9kZSAqLworCXVfbG9uZyBuZXh0X2xpbmU7CS8qIG1vZHVsbyBmb3IgbmV4dCBsaW5lICovCisJdV9sb25nIG5leHRfcGxhbmU7CS8qIG1vZHVsbyBmb3IgbmV4dCBwbGFuZSAqLworCisJLyogQ3Vyc29yIFZhbHVlcyAqLworCisJc3RydWN0IHsKKwkJc2hvcnQgY3Jzcl94OwkvKiBtb3ZlY3Vyc29yICovCisJCXNob3J0IGNyc3JfeTsJLyogbW92ZWN1cnNvciAqLworCQlzaG9ydCBzcG90X3g7CisJCXNob3J0IHNwb3RfeTsKKwkJdV9zaG9ydCBoZWlnaHQ7CisJCXVfc2hvcnQgd2lkdGg7CisJCXVfc2hvcnQgZm1vZGU7CisJfSBjcnNyOworCisJLyogT0NTIEhhcmR3YXJlIFJlZ2lzdGVycyAqLworCisJdV9sb25nIGJwbHB0MDsJCS8qIHZtb2RlLCBwYW4gKE5vdGU6IHBoeXNpY2FsIGFkZHJlc3MpICovCisJdV9sb25nIGJwbHB0MHdyYXA7CS8qIHZtb2RlLCBwYW4gKE5vdGU6IHBoeXNpY2FsIGFkZHJlc3MpICovCisJdV9zaG9ydCBkZGZzdHJ0OworCXVfc2hvcnQgZGRmc3RvcDsKKwl1X3Nob3J0IGJwbDFtb2Q7CisJdV9zaG9ydCBicGwybW9kOworCXVfc2hvcnQgYnBsY29uMDsJLyogdm1vZGUgKi8KKwl1X3Nob3J0IGJwbGNvbjE7CS8qIHZtb2RlICovCisJdV9zaG9ydCBodG90YWw7CQkvKiB2bW9kZSAqLworCXVfc2hvcnQgdnRvdGFsOwkJLyogdm1vZGUgKi8KKworCS8qIEFkZGl0aW9uYWwgRUNTIEhhcmR3YXJlIFJlZ2lzdGVycyAqLworCisJdV9zaG9ydCBicGxjb24zOwkvKiB2bW9kZSAqLworCXVfc2hvcnQgYmVhbWNvbjA7CS8qIHZtb2RlICovCisJdV9zaG9ydCBoc3N0cnQ7CQkvKiB2bW9kZSAqLworCXVfc2hvcnQgaHNzdG9wOwkJLyogdm1vZGUgKi8KKwl1X3Nob3J0IGhic3RydDsJCS8qIHZtb2RlICovCisJdV9zaG9ydCBoYnN0b3A7CQkvKiB2bW9kZSAqLworCXVfc2hvcnQgdnNzdHJ0OwkJLyogdm1vZGUgKi8KKwl1X3Nob3J0IHZzc3RvcDsJCS8qIHZtb2RlICovCisJdV9zaG9ydCB2YnN0cnQ7CQkvKiB2bW9kZSAqLworCXVfc2hvcnQgdmJzdG9wOwkJLyogdm1vZGUgKi8KKwl1X3Nob3J0IGhjZW50ZXI7CS8qIHZtb2RlICovCisKKwkvKiBBZGRpdGlvbmFsIEFHQSBIYXJkd2FyZSBSZWdpc3RlcnMgKi8KKworCXVfc2hvcnQgZm1vZGU7CQkvKiB2bW9kZSAqLworfSBjdXJyZW50cGFyOworCisKK3N0YXRpYyBzdHJ1Y3QgZmJfaW5mbyBmYl9pbmZvID0geworICAgIC5maXggPSB7CisJLmlkCQk9ICJBbWlnYSAiLAorCS52aXN1YWwJCT0gRkJfVklTVUFMX1BTRVVET0NPTE9SLAorCS5hY2NlbAkJPSBGQl9BQ0NFTF9BTUlHQUJMSVRUCisgICAgfQorfTsKKworCisJLyoKKwkgKiAgU2F2ZWQgY29sb3IgZW50cnkgMCBzbyB3ZSBjYW4gcmVzdG9yZSBpdCB3aGVuIHVuYmxhbmtpbmcKKwkgKi8KKworc3RhdGljIHVfY2hhciByZWQwLCBncmVlbjAsIGJsdWUwOworCisKKyNpZiBkZWZpbmVkKENPTkZJR19GQl9BTUlHQV9FQ1MpCitzdGF0aWMgdV9zaG9ydCBlY3NfcGFsZXR0ZVszMl07CisjZW5kaWYKKworCisJLyoKKwkgKiBMYXRjaGVzIGZvciBEaXNwbGF5IENoYW5nZXMgZHVyaW5nIFZCbGFuaworCSAqLworCitzdGF0aWMgdV9zaG9ydCBkb192bW9kZV9mdWxsID0gMDsJLyogQ2hhbmdlIHRoZSBWaWRlbyBNb2RlICovCitzdGF0aWMgdV9zaG9ydCBkb192bW9kZV9wYW4gPSAwOwkvKiBVcGRhdGUgdGhlIFZpZGVvIE1vZGUgKi8KK3N0YXRpYyBzaG9ydCBkb19ibGFuayA9IDA7CQkvKiAoVW4pQmxhbmsgdGhlIFNjcmVlbiAosTEpICovCitzdGF0aWMgdV9zaG9ydCBkb19jdXJzb3IgPSAwOwkJLyogTW92ZSB0aGUgQ3Vyc29yICovCisKKworCS8qCisJICogVmFyaW91cyBGbGFncworCSAqLworCitzdGF0aWMgdV9zaG9ydCBpc19ibGFua2VkID0gMDsJCS8qIFNjcmVlbiBpcyBCbGFua2VkICovCitzdGF0aWMgdV9zaG9ydCBpc19sYWNlID0gMDsJCS8qIFNjcmVlbiBpcyBsYWNlZCAqLworCisJLyoKKwkgKiBQcmVkZWZpbmVkIFZpZGVvIE1vZGVzCisJICoKKwkgKi8KKworc3RhdGljIHN0cnVjdCBmYl92aWRlb21vZGUgYW1pX21vZGVkYltdIF9faW5pdGRhdGEgPSB7CisKKyAgICAvKgorICAgICAqICBBbWlnYU9TIFZpZGVvIE1vZGVzCisgICAgICoKKyAgICAgKiAgSWYgeW91IGNoYW5nZSB0aGVzZSwgbWFrZSBzdXJlIHRvIHVwZGF0ZSBERUZNT0RFXyogYXMgd2VsbCEKKyAgICAgKi8KKworICAgIHsKKwkvKiA2NDB4MjAwLCAxNSBrSHosIDYwIEh6IChOVFNDKSAqLworCSJudHNjIiwgNjAsIDY0MCwgMjAwLCBUQUdfSElSRVMsIDEwNiwgODYsIDQ0LCAxNiwgNzYsIDIsCisJRkJfU1lOQ19CUk9BRENBU1QsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQgfCBGQl9WTU9ERV9ZV1JBUAorICAgIH0sIHsKKwkvKiA2NDB4NDAwLCAxNSBrSHosIDYwIEh6IGludGVybGFjZWQgKE5UU0MpICovCisJIm50c2MtbGFjZSIsIDYwLCA2NDAsIDQwMCwgVEFHX0hJUkVTLCAxMDYsIDg2LCA4OCwgMzMsIDc2LCA0LAorCUZCX1NZTkNfQlJPQURDQVNULCBGQl9WTU9ERV9JTlRFUkxBQ0VEIHwgRkJfVk1PREVfWVdSQVAKKyAgICB9LCB7CisJLyogNjQweDI1NiwgMTUga0h6LCA1MCBIeiAoUEFMKSAqLworCSJwYWwiLCA1MCwgNjQwLCAyNTYsIFRBR19ISVJFUywgMTA2LCA4NiwgNDAsIDE0LCA3NiwgMiwKKwlGQl9TWU5DX0JST0FEQ0FTVCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRCB8IEZCX1ZNT0RFX1lXUkFQCisgICAgfSwgeworCS8qIDY0MHg1MTIsIDE1IGtIeiwgNTAgSHogaW50ZXJsYWNlZCAoUEFMKSAqLworCSJwYWwtbGFjZSIsIDUwLCA2NDAsIDUxMiwgVEFHX0hJUkVTLCAxMDYsIDg2LCA4MCwgMjksIDc2LCA0LAorCUZCX1NZTkNfQlJPQURDQVNULCBGQl9WTU9ERV9JTlRFUkxBQ0VEIHwgRkJfVk1PREVfWVdSQVAKKyAgICB9LCB7CisJLyogNjQweDQ4MCwgMjkga0h6LCA1NyBIeiAqLworCSJtdWx0aXNjYW4iLCA1NywgNjQwLCA0ODAsIFRBR19TSFJFUywgOTYsIDExMiwgMjksIDgsIDcyLCA4LAorCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQgfCBGQl9WTU9ERV9ZV1JBUAorICAgIH0sIHsKKwkvKiA2NDB4OTYwLCAyOSBrSHosIDU3IEh6IGludGVybGFjZWQgKi8KKwkibXVsdGlzY2FuLWxhY2UiLCA1NywgNjQwLCA5NjAsIFRBR19TSFJFUywgOTYsIDExMiwgNTgsIDE2LCA3MiwgMTYsCisJMCwgRkJfVk1PREVfSU5URVJMQUNFRCB8IEZCX1ZNT0RFX1lXUkFQCisgICAgfSwgeworCS8qIDY0MHgyMDAsIDE1IGtIeiwgNzIgSHogKi8KKwkiZXVybzM2IiwgNzIsIDY0MCwgMjAwLCBUQUdfSElSRVMsIDkyLCAxMjQsIDYsIDYsIDUyLCA1LAorCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQgfCBGQl9WTU9ERV9ZV1JBUAorICAgIH0sIHsKKwkvKiA2NDB4NDAwLCAxNSBrSHosIDcyIEh6IGludGVybGFjZWQgKi8KKwkiZXVybzM2LWxhY2UiLCA3MiwgNjQwLCA0MDAsIFRBR19ISVJFUywgOTIsIDEyNCwgMTIsIDEyLCA1MiwgMTAsCisJMCwgRkJfVk1PREVfSU5URVJMQUNFRCB8IEZCX1ZNT0RFX1lXUkFQCisgICAgfSwgeworCS8qIDY0MHg0MDAsIDI5IGtIeiwgNjggSHogKi8KKwkiZXVybzcyIiwgNjgsIDY0MCwgNDAwLCBUQUdfU0hSRVMsIDE2NCwgOTIsIDksIDksIDgwLCA4LAorCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQgfCBGQl9WTU9ERV9ZV1JBUAorICAgIH0sIHsKKwkvKiA2NDB4ODAwLCAyOSBrSHosIDY4IEh6IGludGVybGFjZWQgKi8KKwkiZXVybzcyLWxhY2UiLCA2OCwgNjQwLCA4MDAsIFRBR19TSFJFUywgMTY0LCA5MiwgMTgsIDE4LCA4MCwgMTYsCisJMCwgRkJfVk1PREVfSU5URVJMQUNFRCB8IEZCX1ZNT0RFX1lXUkFQCisgICAgfSwgeworCS8qIDgwMHgzMDAsIDIzIGtIeiwgNzAgSHogKi8KKwkic3VwZXI3MiIsIDcwLCA4MDAsIDMwMCwgVEFHX1NIUkVTLCAyMTIsIDE0MCwgMTAsIDExLCA4MCwgNywKKwkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEIHwgRkJfVk1PREVfWVdSQVAKKyAgICB9LCB7CisJLyogODAweDYwMCwgMjMga0h6LCA3MCBIeiBpbnRlcmxhY2VkICovCisJInN1cGVyNzItbGFjZSIsIDcwLCA4MDAsIDYwMCwgVEFHX1NIUkVTLCAyMTIsIDE0MCwgMjAsIDIyLCA4MCwgMTQsCisJMCwgRkJfVk1PREVfSU5URVJMQUNFRCB8IEZCX1ZNT0RFX1lXUkFQCisgICAgfSwgeworCS8qIDY0MHgyMDAsIDI3IGtIeiwgNTcgSHogZG91Ymxlc2NhbiAqLworCSJkYmxudHNjIiwgNTcsIDY0MCwgMjAwLCBUQUdfU0hSRVMsIDE5NiwgMTI0LCAxOCwgMTcsIDgwLCA0LAorCTAsIEZCX1ZNT0RFX0RPVUJMRSB8IEZCX1ZNT0RFX1lXUkFQCisgICAgfSwgeworCS8qIDY0MHg0MDAsIDI3IGtIeiwgNTcgSHogKi8KKwkiZGJsbnRzYy1mZiIsIDU3LCA2NDAsIDQwMCwgVEFHX1NIUkVTLCAxOTYsIDEyNCwgMzYsIDM1LCA4MCwgNywKKwkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEIHwgRkJfVk1PREVfWVdSQVAKKyAgICB9LCB7CisJLyogNjQweDgwMCwgMjcga0h6LCA1NyBIeiBpbnRlcmxhY2VkICovCisJImRibG50c2MtbGFjZSIsIDU3LCA2NDAsIDgwMCwgVEFHX1NIUkVTLCAxOTYsIDEyNCwgNzIsIDcwLCA4MCwgMTQsCisJMCwgRkJfVk1PREVfSU5URVJMQUNFRCB8IEZCX1ZNT0RFX1lXUkFQCisgICAgfSwgeworCS8qIDY0MHgyNTYsIDI3IGtIeiwgNDcgSHogZG91Ymxlc2NhbiAqLworCSJkYmxwYWwiLCA0NywgNjQwLCAyNTYsIFRBR19TSFJFUywgMTk2LCAxMjQsIDE0LCAxMywgODAsIDQsCisJMCwgRkJfVk1PREVfRE9VQkxFIHwgRkJfVk1PREVfWVdSQVAKKyAgICB9LCB7CisJLyogNjQweDUxMiwgMjcga0h6LCA0NyBIeiAqLworCSJkYmxwYWwtZmYiLCA0NywgNjQwLCA1MTIsIFRBR19TSFJFUywgMTk2LCAxMjQsIDI4LCAyNywgODAsIDcsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRCB8IEZCX1ZNT0RFX1lXUkFQCisgICAgfSwgeworCS8qIDY0MHgxMDI0LCAyNyBrSHosIDQ3IEh6IGludGVybGFjZWQgKi8KKwkiZGJscGFsLWxhY2UiLCA0NywgNjQwLCAxMDI0LCBUQUdfU0hSRVMsIDE5NiwgMTI0LCA1NiwgNTQsIDgwLCAxNCwKKwkwLCBGQl9WTU9ERV9JTlRFUkxBQ0VEIHwgRkJfVk1PREVfWVdSQVAKKyAgICB9LAorCisgICAgLyoKKyAgICAgKiAgVkdBIFZpZGVvIE1vZGVzCisgICAgICovCisKKyAgICB7CisJLyogNjQweDQ4MCwgMzEga0h6LCA2MCBIeiAoVkdBKSAqLworCSJ2Z2EiLCA2MCwgNjQwLCA0ODAsIFRBR19TSFJFUywgNjQsIDk2LCAzMCwgOSwgMTEyLCAyLAorCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQgfCBGQl9WTU9ERV9ZV1JBUAorICAgIH0sIHsKKwkvKiA2NDB4NDAwLCAzMSBrSHosIDcwIEh6IChWR0EpICovCisJInZnYTcwIiwgNzAsIDY0MCwgNDAwLCBUQUdfU0hSRVMsIDY0LCA5NiwgMzUsIDEyLCAxMTIsIDIsCisJRkJfU1lOQ19WRVJUX0hJR0hfQUNUIHwgRkJfU1lOQ19DT01QX0hJR0hfQUNULCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEIHwgRkJfVk1PREVfWVdSQVAKKyAgICB9LAorCisjaWYgMAorCisgICAgLyoKKyAgICAgKiAgQTIwMjQgdmlkZW8gbW9kZXMKKyAgICAgKiAgVGhlc2UgbW9kZXMgZG9uJ3Qgd29yayB5ZXQgYmVjYXVzZSB0aGVyZSdzIG5vIEEyMDI0IGRyaXZlci4KKyAgICAgKi8KKworICAgIHsKKwkvKiAxMDI0eDgwMCwgMTAgSHogKi8KKwkiYTIwMjQtMTAiLCAxMCwgMTAyNCwgODAwLCBUQUdfSElSRVMsIDAsIDAsIDAsIDAsIDAsIDAsCisJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRCB8IEZCX1ZNT0RFX1lXUkFQCisgICAgfSwgeworCS8qIDEwMjR4ODAwLCAxNSBIeiAqLworCSJhMjAyNC0xNSIsIDE1LCAxMDI0LCA4MDAsIFRBR19ISVJFUywgMCwgMCwgMCwgMCwgMCwgMCwKKwkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEIHwgRkJfVk1PREVfWVdSQVAKKyAgICB9CisjZW5kaWYKK307CisKKyNkZWZpbmUgTlVNX1RPVEFMX01PREVTICBBUlJBWV9TSVpFKGFtaV9tb2RlZGIpCisKK3N0YXRpYyBjaGFyICptb2RlX29wdGlvbiBfX2luaXRkYXRhID0gTlVMTDsKK3N0YXRpYyBpbnQgcm91bmRfZG93bl9icHAgPSAxOwkvKiBmb3IgbW9kZSBwcm9iaW5nICovCisKKwkvKgorCSAqIFNvbWUgZGVmYXVsdCBtb2RlcworCSAqLworCisKKyNkZWZpbmUgREVGTU9ERV9QQUwJICAgIDIJLyogInBhbCIgZm9yIFBBTCBPQ1MvRUNTICovCisjZGVmaW5lIERFRk1PREVfTlRTQwkgICAgMAkvKiAibnRzYyIgZm9yIE5UU0MgT0NTL0VDUyAqLworI2RlZmluZSBERUZNT0RFX0FNQkVSX1BBTCAgIDMJLyogInBhbC1sYWNlIiBmb3IgZmxpY2tlciBmaXhlZCBQQUwgKEEzMDAwKSAqLworI2RlZmluZSBERUZNT0RFX0FNQkVSX05UU0MgIDEJLyogIm50c2MtbGFjZSIgZm9yIGZsaWNrZXIgZml4ZWQgTlRTQyAoQTMwMDApICovCisjZGVmaW5lIERFRk1PREVfQUdBCSAgICAxOQkvKiAidmdhNzAiIGZvciBBR0EgKi8KKworCitzdGF0aWMgaW50IGFtaWZiX2lsYm0gPSAwOwkvKiBpbnRlcmxlYXZlZCBvciBub3JtYWwgYml0cGxhbmVzICovCitzdGF0aWMgaW50IGFtaWZiX2ludmVyc2UgPSAwOworCisKKwkvKgorCSAqIE1hY3JvcyBmb3IgdGhlIGNvbnZlcnNpb24gZnJvbSByZWFsIHdvcmxkIHZhbHVlcyB0byBoYXJkd2FyZSByZWdpc3RlcgorCSAqIHZhbHVlcworCSAqCisJICogVGhpcyBoZWxwcyB1cyB0byBrZWVwIG91ciBhdHRlbnRpb24gb24gdGhlIHJlYWwgc3R1ZmYuLi4KKwkgKgorCSAqIEhhcmR3YXJlIGxpbWl0cyBmb3IgQUdBOgorCSAqCisJICoJcGFyYW1ldGVyICBtaW4gICAgbWF4ICBzdGVwCisJICoJLS0tLS0tLS0tICAtLS0gICAtLS0tICAtLS0tCisJICoJZGl3c3RydF9oICAgIDAgICAyMDQ3ICAgICAxCisJICoJZGl3c3RydF92ICAgIDAgICAyMDQ3ICAgICAxCisJICoJZGl3c3RvcF9oICAgIDAgICA0MDk1ICAgICAxCisJICoJZGl3c3RvcF92ICAgIDAgICA0MDk1ICAgICAxCisJICoKKwkgKglkZGZzdHJ0ICAgICAgMCAgIDIwMzIgICAgMTYKKwkgKglkZGZzdG9wICAgICAgMCAgIDIwMzIgICAgMTYKKwkgKgorCSAqCWh0b3RhbCAgICAgICA4ICAgMjA0OCAgICAgOAorCSAqCWhzc3RydCAgICAgICAwICAgMjA0MCAgICAgOAorCSAqCWhzc3RvcCAgICAgICAwICAgMjA0MCAgICAgOAorCSAqCXZ0b3RhbCAgICAgICAxICAgNDA5NiAgICAgMQorCSAqCXZzc3RydCAgICAgICAwICAgNDA5NSAgICAgMQorCSAqCXZzc3RvcCAgICAgICAwICAgNDA5NSAgICAgMQorCSAqCWhjZW50ZXIgICAgICAwICAgMjA0MCAgICAgOAorCSAqCisJICoJaGJzdHJ0ICAgICAgIDAgICAyMDQ3ICAgICAxCisJICoJaGJzdG9wICAgICAgIDAgICAyMDQ3ICAgICAxCisJICoJdmJzdHJ0ICAgICAgIDAgICA0MDk1ICAgICAxCisJICoJdmJzdG9wICAgICAgIDAgICA0MDk1ICAgICAxCisJICoKKwkgKiBIb3Jpem9udGFsIHZhbHVlcyBhcmUgaW4gMzUgbnMgKFNIUkVTKSBwaXhlbHMKKwkgKiBWZXJ0aWNhbCB2YWx1ZXMgYXJlIGluIGhhbGYgc2NhbmxpbmVzCisJICovCisKKy8qIGJwbGNvbjEgKHNtb290aCBzY3JvbGxpbmcpICovCisKKyNkZWZpbmUgaHNjcm9sbDJodyhoc2Nyb2xsKSBcCisJKCgoaHNjcm9sbCk8PDEyICYgMHgzMDAwKSB8ICgoaHNjcm9sbCk8PDggJiAweGMzMDApIHwgXAorCSAoKGhzY3JvbGwpPDw0ICYgMHgwYzAwKSB8ICgoaHNjcm9sbCk8PDIgJiAweDAwZjApIHwgKChoc2Nyb2xsKT4+MiAmIDB4MDAwZikpCisKKy8qIGRpd3N0cnQvZGl3c3RvcC9kaXdoaWdoICh2aXNpYmxlIGRpc3BsYXkgd2luZG93KSAqLworCisjZGVmaW5lIGRpd3N0cnQyaHcoZGl3c3RydF9oLCBkaXdzdHJ0X3YpIFwKKwkoKChkaXdzdHJ0X3YpPDw3ICYgMHhmZjAwKSB8ICgoZGl3c3RydF9oKT4+MiAmIDB4MDBmZikpCisjZGVmaW5lIGRpd3N0b3AyaHcoZGl3c3RvcF9oLCBkaXdzdG9wX3YpIFwKKwkoKChkaXdzdG9wX3YpPDw3ICYgMHhmZjAwKSB8ICgoZGl3c3RvcF9oKT4+MiAmIDB4MDBmZikpCisjZGVmaW5lIGRpd2hpZ2gyaHcoZGl3c3RydF9oLCBkaXdzdHJ0X3YsIGRpd3N0b3BfaCwgZGl3c3RvcF92KSBcCisJKCgoZGl3c3RvcF9oKTw8MyAmIDB4MjAwMCkgfCAoKGRpd3N0b3BfaCk8PDExICYgMHgxODAwKSB8IFwKKwkgKChkaXdzdG9wX3YpPj4xICYgMHgwNzAwKSB8ICgoZGl3c3RydF9oKT4+NSAmIDB4MDAyMCkgfCBcCisJICgoZGl3c3RydF9oKTw8MyAmIDB4MDAxOCkgfCAoKGRpd3N0cnRfdik+PjkgJiAweDAwMDcpKQorCisvKiBkZGZzdHJ0L2RkZnN0b3AgKGRpc3BsYXkgRE1BKSAqLworCisjZGVmaW5lIGRkZnN0cnQyaHcoZGRmc3RydCkJZGl2OChkZGZzdHJ0KQorI2RlZmluZSBkZGZzdG9wMmh3KGRkZnN0b3ApCWRpdjgoZGRmc3RvcCkKKworLyogaHNzdHJ0L2hzc3RvcC9odG90YWwvdnNzdHJ0L3Zzc3RvcC92dG90YWwvaGNlbnRlciAoc3luYyB0aW1pbmdzKSAqLworCisjZGVmaW5lIGhzc3RydDJodyhoc3N0cnQpCShkaXY4KGhzc3RydCkpCisjZGVmaW5lIGhzc3RvcDJodyhoc3N0b3ApCShkaXY4KGhzc3RvcCkpCisjZGVmaW5lIGh0b3RhbDJodyhodG90YWwpCShkaXY4KGh0b3RhbCktMSkKKyNkZWZpbmUgdnNzdHJ0Mmh3KHZzc3RydCkJKGRpdjIodnNzdHJ0KSkKKyNkZWZpbmUgdnNzdG9wMmh3KHZzc3RvcCkJKGRpdjIodnNzdG9wKSkKKyNkZWZpbmUgdnRvdGFsMmh3KHZ0b3RhbCkJKGRpdjIodnRvdGFsKS0xKQorI2RlZmluZSBoY2VudGVyMmh3KGh0b3RhbCkJKGRpdjgoaHRvdGFsKSkKKworLyogaGJzdHJ0L2hic3RvcC92YnN0cnQvdmJzdG9wIChibGFua2luZyB0aW1pbmdzKSAqLworCisjZGVmaW5lIGhic3RydDJodyhoYnN0cnQpCSgoKGhic3RydCk8PDggJiAweDA3MDApIHwgKChoYnN0cnQpPj4zICYgMHgwMGZmKSkKKyNkZWZpbmUgaGJzdG9wMmh3KGhic3RvcCkJKCgoaGJzdG9wKTw8OCAmIDB4MDcwMCkgfCAoKGhic3RvcCk+PjMgJiAweDAwZmYpKQorI2RlZmluZSB2YnN0cnQyaHcodmJzdHJ0KQkoZGl2Mih2YnN0cnQpKQorI2RlZmluZSB2YnN0b3AyaHcodmJzdG9wKQkoZGl2Mih2YnN0b3ApKQorCisvKiBjb2xvdXIgKi8KKworI2RlZmluZSByZ2IyaHc4X2hpZ2gocmVkLCBncmVlbiwgYmx1ZSkgXAorCSgoKHJlZCAmIDB4ZjApPDw0KSB8IChncmVlbiAmIDB4ZjApIHwgKChibHVlICYgMHhmMCk+PjQpKQorI2RlZmluZSByZ2IyaHc4X2xvdyhyZWQsIGdyZWVuLCBibHVlKSBcCisJKCgocmVkICYgMHgwZik8PDgpIHwgKChncmVlbiAmIDB4MGYpPDw0KSB8IChibHVlICYgMHgwZikpCisjZGVmaW5lIHJnYjJodzQocmVkLCBncmVlbiwgYmx1ZSkgXAorCSgoKHJlZCAmIDB4ZjApPDw0KSB8IChncmVlbiAmIDB4ZjApIHwgKChibHVlICYgMHhmMCk+PjQpKQorI2RlZmluZSByZ2IyaHcyKHJlZCwgZ3JlZW4sIGJsdWUpIFwKKwkoKChyZWQgJiAweGMwKTw8NCkgfCAoZ3JlZW4gJiAweGMwKSB8ICgoYmx1ZSAmIDB4YzApPj40KSkKKworLyogc3BycG9zL3NwcmN0bCAoc3ByaXRlIHBvc2l0aW9uaW5nKSAqLworCisjZGVmaW5lIHNwcjJod19wb3Moc3RhcnRfdiwgc3RhcnRfaCkgXAorCSgoKHN0YXJ0X3YpPDw3JjB4ZmYwMCkgfCAoKHN0YXJ0X2gpPj4zJjB4MDBmZikpCisjZGVmaW5lIHNwcjJod19jdGwoc3RhcnRfdiwgc3RhcnRfaCwgc3RvcF92KSBcCisJKCgoc3RvcF92KTw8NyYweGZmMDApIHwgKChzdGFydF92KT4+NCYweDAwNDApIHwgKChzdG9wX3YpPj41JjB4MDAyMCkgfCBcCisJICgoc3RhcnRfaCk8PDMmMHgwMDE4KSB8ICgoc3RhcnRfdik+PjcmMHgwMDA0KSB8ICgoc3RvcF92KT4+OCYweDAwMDIpIHwgXAorCSAoKHN0YXJ0X2gpPj4yJjB4MDAwMSkpCisKKy8qIGdldCBjdXJyZW50IHZlcnRpY2FsIHBvc2l0aW9uIG9mIGJlYW0gKi8KKyNkZWZpbmUgZ2V0X3ZicG9zKCkJKCh1X3Nob3J0KSgoKih1X2xvbmcgdm9sYXRpbGUgKikmY3VzdG9tLnZwb3NyID4+IDcpICYgMHhmZmUpKQorCisJLyoKKwkgKiBDb3BwZXIgSW5pdGlhbGlzYXRpb24gTGlzdAorCSAqLworCisjZGVmaW5lIENPUElOSVRTSVpFIChzaXplb2YoY29waW5zKSo0MCkKKworZW51bSB7CisJY2lwX2JwbGNvbjAKK307CisKKwkvKgorCSAqIExvbmcgRnJhbWUvU2hvcnQgRnJhbWUgQ29wcGVyIExpc3QKKwkgKiBEb24ndCBjaGFuZ2UgdGhlIG9yZGVyLCBidWlsZF9jb3BwZXIoKS9yZWJ1aWxkX2NvcHBlcigpIHJlbHkgb24gdGhpcworCSAqLworCisjZGVmaW5lIENPUExJU1RTSVpFIChzaXplb2YoY29waW5zKSo2NCkKKworZW51bSB7CisJY29wX3dhaXQsIGNvcF9icGxjb24wLAorCWNvcF9zcHIwcHRyaCwgY29wX3NwcjBwdHJsLAorCWNvcF9kaXdzdHJ0LCBjb3BfZGl3c3RvcCwKKwljb3BfZGl3aGlnaCwKK307CisKKwkvKgorCSAqIFBpeGVsIG1vZGVzIGZvciBCaXRwbGFuZXMgYW5kIFNwcml0ZXMKKwkgKi8KKworc3RhdGljIHVfc2hvcnQgYnBscGl4bW9kZVszXSA9IHsKKwlCUEMwX1NIUkVTLAkJCS8qICAzNSBucyAqLworCUJQQzBfSElSRVMsCQkJLyogIDcwIG5zICovCisJMAkJCQkvKiAxNDAgbnMgKi8KK307CisKK3N0YXRpYyB1X3Nob3J0IHNwcnBpeG1vZGVbM10gPSB7CisJQlBDM19TUFJFUzEgfCBCUEMzX1NQUkVTMCwJLyogIDM1IG5zICovCisJQlBDM19TUFJFUzEsCQkJLyogIDcwIG5zICovCisJQlBDM19TUFJFUzAJCQkvKiAxNDAgbnMgKi8KK307CisKKwkvKgorCSAqIEZldGNoIG1vZGVzIGZvciBCaXRwbGFuZXMgYW5kIFNwcml0ZXMKKwkgKi8KKworc3RhdGljIHVfc2hvcnQgYnBsZmV0Y2htb2RlWzNdID0geworCTAsCQkJCS8qIDF4ICovCisJRk1PREVfQlBMMzIsCQkJLyogMnggKi8KKwlGTU9ERV9CUEFHRU0gfCBGTU9ERV9CUEwzMgkvKiA0eCAqLworfTsKKworc3RhdGljIHVfc2hvcnQgc3ByZmV0Y2htb2RlWzNdID0geworCTAsCQkJCS8qIDF4ICovCisJRk1PREVfU1BSMzIsCQkJLyogMnggKi8KKwlGTU9ERV9TUEFHRU0gfCBGTU9ERV9TUFIzMgkvKiA0eCAqLworfTsKKworCisJLyoKKwkgKiBJbnRlcmZhY2UgdXNlZCBieSB0aGUgd29ybGQKKwkgKi8KKworaW50IGFtaWZiX3NldHVwKGNoYXIqKTsKKworc3RhdGljIGludCBhbWlmYl9jaGVja192YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CitzdGF0aWMgaW50IGFtaWZiX3NldF9wYXIoc3RydWN0IGZiX2luZm8gKmluZm8pOworc3RhdGljIGludCBhbWlmYl9zZXRjb2xyZWcodW5zaWduZWQgcmVnbm8sIHVuc2lnbmVkIHJlZCwgdW5zaWduZWQgZ3JlZW4sCisJCQkgICB1bnNpZ25lZCBibHVlLCB1bnNpZ25lZCB0cmFuc3AsCisJCQkgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CitzdGF0aWMgaW50IGFtaWZiX2JsYW5rKGludCBibGFuaywgc3RydWN0IGZiX2luZm8gKmluZm8pOworc3RhdGljIGludCBhbWlmYl9wYW5fZGlzcGxheShzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKKwkJCSAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pOworc3RhdGljIHZvaWQgYW1pZmJfZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKmluZm8sCisJCQkgICBjb25zdCBzdHJ1Y3QgZmJfZmlsbHJlY3QgKnJlY3QpOworc3RhdGljIHZvaWQgYW1pZmJfY29weWFyZWEoc3RydWN0IGZiX2luZm8gKmluZm8sCisJCQkgICBjb25zdCBzdHJ1Y3QgZmJfY29weWFyZWEgKnJlZ2lvbik7CitzdGF0aWMgdm9pZCBhbWlmYl9pbWFnZWJsaXQoc3RydWN0IGZiX2luZm8gKmluZm8sCisJCQkgICAgY29uc3Qgc3RydWN0IGZiX2ltYWdlICppbWFnZSk7CitzdGF0aWMgaW50IGFtaWZiX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsCisJCSAgICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CisKKworCS8qCisJICogSW50ZXJmYWNlIHRvIHRoZSBsb3cgbGV2ZWwgY29uc29sZSBkcml2ZXIKKwkgKi8KKworaW50IGFtaWZiX2luaXQodm9pZCk7CitzdGF0aWMgdm9pZCBhbWlmYl9kZWluaXQodm9pZCk7CisKKwkvKgorCSAqIEludGVybmFsIHJvdXRpbmVzCisJICovCisKK3N0YXRpYyBpbnQgZmxhc2hfY3Vyc29yKHZvaWQpOworc3RhdGljIGlycXJldHVybl90IGFtaWZiX2ludGVycnVwdChpbnQgaXJxLCB2b2lkICpkZXZfaWQsIHN0cnVjdCBwdF9yZWdzICpmcCk7CitzdGF0aWMgdV9sb25nIGNoaXBhbGxvYyh1X2xvbmcgc2l6ZSk7CitzdGF0aWMgdm9pZCBjaGlwZnJlZSh2b2lkKTsKKworCS8qCisJICogSGFyZHdhcmUgcm91dGluZXMKKwkgKi8KKworc3RhdGljIGludCBhbWlfZGVjb2RlX3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFtaWZiX3BhciAqcGFyKTsKK3N0YXRpYyBpbnQgYW1pX2VuY29kZV92YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhbWlmYl9wYXIgKnBhcik7CitzdGF0aWMgdm9pZCBhbWlfcGFuX3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhcik7CitzdGF0aWMgaW50IGFtaV91cGRhdGVfcGFyKHZvaWQpOworc3RhdGljIHZvaWQgYW1pX3VwZGF0ZV9kaXNwbGF5KHZvaWQpOworc3RhdGljIHZvaWQgYW1pX2luaXRfZGlzcGxheSh2b2lkKTsKK3N0YXRpYyB2b2lkIGFtaV9kb19ibGFuayh2b2lkKTsKK3N0YXRpYyBpbnQgYW1pX2dldF9maXhfY3Vyc29yaW5mbyhzdHJ1Y3QgZmJfZml4X2N1cnNvcmluZm8gKmZpeCk7CitzdGF0aWMgaW50IGFtaV9nZXRfdmFyX2N1cnNvcmluZm8oc3RydWN0IGZiX3Zhcl9jdXJzb3JpbmZvICp2YXIsIHVfY2hhciAqZGF0YSk7CitzdGF0aWMgaW50IGFtaV9zZXRfdmFyX2N1cnNvcmluZm8oc3RydWN0IGZiX3Zhcl9jdXJzb3JpbmZvICp2YXIsIHVfY2hhciAqZGF0YSk7CitzdGF0aWMgaW50IGFtaV9nZXRfY3Vyc29yc3RhdGUoc3RydWN0IGZiX2N1cnNvcnN0YXRlICpzdGF0ZSk7CitzdGF0aWMgaW50IGFtaV9zZXRfY3Vyc29yc3RhdGUoc3RydWN0IGZiX2N1cnNvcnN0YXRlICpzdGF0ZSk7CitzdGF0aWMgdm9pZCBhbWlfc2V0X3Nwcml0ZSh2b2lkKTsKK3N0YXRpYyB2b2lkIGFtaV9pbml0X2NvcHBlcih2b2lkKTsKK3N0YXRpYyB2b2lkIGFtaV9yZWluaXRfY29wcGVyKHZvaWQpOworc3RhdGljIHZvaWQgYW1pX2J1aWxkX2NvcHBlcih2b2lkKTsKK3N0YXRpYyB2b2lkIGFtaV9yZWJ1aWxkX2NvcHBlcih2b2lkKTsKKworCitzdGF0aWMgc3RydWN0IGZiX29wcyBhbWlmYl9vcHMgPSB7CisJLm93bmVyCQk9IFRISVNfTU9EVUxFLAorCS5mYl9jaGVja192YXIJPSBhbWlmYl9jaGVja192YXIsCisJLmZiX3NldF9wYXIJPSBhbWlmYl9zZXRfcGFyLAorCS5mYl9zZXRjb2xyZWcJPSBhbWlmYl9zZXRjb2xyZWcsCisJLmZiX2JsYW5rCT0gYW1pZmJfYmxhbmssCisJLmZiX3Bhbl9kaXNwbGF5CT0gYW1pZmJfcGFuX2Rpc3BsYXksCisJLmZiX2ZpbGxyZWN0CT0gYW1pZmJfZmlsbHJlY3QsCisJLmZiX2NvcHlhcmVhCT0gYW1pZmJfY29weWFyZWEsCisJLmZiX2ltYWdlYmxpdAk9IGFtaWZiX2ltYWdlYmxpdCwKKwkuZmJfY3Vyc29yCT0gc29mdF9jdXJzb3IsCisJLmZiX2lvY3RsCT0gYW1pZmJfaW9jdGwsCit9OworCitzdGF0aWMgdm9pZCBfX2luaXQgYW1pZmJfc2V0dXBfbWNhcChjaGFyICpzcGVjKQoreworCWNoYXIgKnA7CisJaW50IHZtaW4sIHZtYXgsIGhtaW4sIGhtYXg7CisKKwkvKiBGb3JtYXQgZm9yIG1vbml0b3IgY2FwYWJpbGl0aWVzIGlzOiA8Vm1pbj47PFZtYXg+OzxIbWluPjs8SG1heD4KKwkgKiA8Vio+IHZlcnRpY2FsIGZyZXEuIGluIEh6CisJICogPEgqPiBob3Jpem9udGFsIGZyZXEuIGluIGtIegorCSAqLworCisJaWYgKCEocCA9IHN0cnNlcCgmc3BlYywgIjsiKSkgfHwgISpwKQorCQlyZXR1cm47CisJdm1pbiA9IHNpbXBsZV9zdHJ0b3VsKHAsIE5VTEwsIDEwKTsKKwlpZiAodm1pbiA8PSAwKQorCQlyZXR1cm47CisJaWYgKCEocCA9IHN0cnNlcCgmc3BlYywgIjsiKSkgfHwgISpwKQorCQlyZXR1cm47CisJdm1heCA9IHNpbXBsZV9zdHJ0b3VsKHAsIE5VTEwsIDEwKTsKKwlpZiAodm1heCA8PSAwIHx8IHZtYXggPD0gdm1pbikKKwkJcmV0dXJuOworCWlmICghKHAgPSBzdHJzZXAoJnNwZWMsICI7IikpIHx8ICEqcCkKKwkJcmV0dXJuOworCWhtaW4gPSAxMDAwICogc2ltcGxlX3N0cnRvdWwocCwgTlVMTCwgMTApOworCWlmIChobWluIDw9IDApCisJCXJldHVybjsKKwlpZiAoIShwID0gc3Ryc2VwKCZzcGVjLCAiIikpIHx8ICEqcCkKKwkJcmV0dXJuOworCWhtYXggPSAxMDAwICogc2ltcGxlX3N0cnRvdWwocCwgTlVMTCwgMTApOworCWlmIChobWF4IDw9IDAgfHwgaG1heCA8PSBobWluKQorCQlyZXR1cm47CisKKwlmYl9pbmZvLm1vbnNwZWNzLnZmbWluID0gdm1pbjsKKwlmYl9pbmZvLm1vbnNwZWNzLnZmbWF4ID0gdm1heDsKKwlmYl9pbmZvLm1vbnNwZWNzLmhmbWluID0gaG1pbjsKKwlmYl9pbmZvLm1vbnNwZWNzLmhmbWF4ID0gaG1heDsKK30KKworaW50IF9faW5pdCBhbWlmYl9zZXR1cChjaGFyICpvcHRpb25zKQoreworCWNoYXIgKnRoaXNfb3B0OworCisJaWYgKCFvcHRpb25zIHx8ICEqb3B0aW9ucykKKwkJcmV0dXJuIDA7CisKKwl3aGlsZSAoKHRoaXNfb3B0ID0gc3Ryc2VwKCZvcHRpb25zLCAiLCIpKSAhPSBOVUxMKSB7CisJCWlmICghKnRoaXNfb3B0KQorCQkJY29udGludWU7CisJCWlmICghc3RyY21wKHRoaXNfb3B0LCAiaW52ZXJzZSIpKSB7CisJCQlhbWlmYl9pbnZlcnNlID0gMTsKKwkJCWZiX2ludmVydF9jbWFwcygpOworCQl9IGVsc2UgaWYgKCFzdHJjbXAodGhpc19vcHQsICJpbGJtIikpCisJCQlhbWlmYl9pbGJtID0gMTsKKwkJZWxzZSBpZiAoIXN0cm5jbXAodGhpc19vcHQsICJtb25pdG9yY2FwOiIsIDExKSkKKwkJCWFtaWZiX3NldHVwX21jYXAodGhpc19vcHQrMTEpOworCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgImZzdGFydDoiLCA3KSkKKwkJCW1pbl9mc3RydCA9IHNpbXBsZV9zdHJ0b3VsKHRoaXNfb3B0KzcsIE5VTEwsIDApOworCQllbHNlCisJCQltb2RlX29wdGlvbiA9IHRoaXNfb3B0OworCX0KKworCWlmIChtaW5fZnN0cnQgPCA0OCkKKwkJbWluX2ZzdHJ0ID0gNDg7CisKKwlyZXR1cm4gMDsKK30KKworCitzdGF0aWMgaW50IGFtaWZiX2NoZWNrX3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKKwkJCSAgIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCWludCBlcnI7CisJc3RydWN0IGFtaWZiX3BhciBwYXI7CisKKwkvKiBWYWxpZGF0ZSB3YW50ZWQgc2NyZWVuIHBhcmFtZXRlcnMgKi8KKwlpZiAoKGVyciA9IGFtaV9kZWNvZGVfdmFyKHZhciwgJnBhcikpKQorCQlyZXR1cm4gZXJyOworCisJLyogRW5jb2RlIChwb3NzaWJseSByb3VuZGVkKSBzY3JlZW4gcGFyYW1ldGVycyAqLworCWFtaV9lbmNvZGVfdmFyKHZhciwgJnBhcik7CisJcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludCBhbWlmYl9zZXRfcGFyKHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCXN0cnVjdCBhbWlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYW1pZmJfcGFyICopaW5mby0+cGFyOworCisJZG9fdm1vZGVfcGFuID0gMDsKKwlkb192bW9kZV9mdWxsID0gMDsKKworCS8qIERlY29kZSB3YW50ZWQgc2NyZWVuIHBhcmFtZXRlcnMgKi8KKwlhbWlfZGVjb2RlX3ZhcigmaW5mby0+dmFyLCBwYXIpOworCisJLyogU2V0IG5ldyB2aWRlb21vZGUgKi8KKwlhbWlfYnVpbGRfY29wcGVyKCk7CisKKwkvKiBTZXQgVkJsYW5rIHRyaWdnZXIgKi8KKwlkb192bW9kZV9mdWxsID0gMTsKKworCS8qIFVwZGF0ZSBmaXggZm9yIG5ldyBzY3JlZW4gcGFyYW1ldGVycyAqLworCWlmIChwYXItPmJwcCA9PSAxKSB7CisJCWluZm8tPmZpeC50eXBlID0gRkJfVFlQRV9QQUNLRURfUElYRUxTOworCQlpbmZvLT5maXgudHlwZV9hdXggPSAwOworCX0gZWxzZSBpZiAoYW1pZmJfaWxibSkgeworCQlpbmZvLT5maXgudHlwZSA9IEZCX1RZUEVfSU5URVJMRUFWRURfUExBTkVTOworCQlpbmZvLT5maXgudHlwZV9hdXggPSBwYXItPm5leHRfbGluZTsKKwl9IGVsc2UgeworCQlpbmZvLT5maXgudHlwZSA9IEZCX1RZUEVfUExBTkVTOworCQlpbmZvLT5maXgudHlwZV9hdXggPSAwOworCX0KKwlpbmZvLT5maXgubGluZV9sZW5ndGggPSBkaXY4KHVweCgxNjw8bWF4Zm1vZGUsIHBhci0+dnhyZXMpKTsKKworCWlmIChwYXItPnZtb2RlICYgRkJfVk1PREVfWVdSQVApIHsKKwkJaW5mby0+Zml4Lnl3cmFwc3RlcCA9IDE7CisJCWluZm8tPmZpeC54cGFuc3RlcCA9IDA7CisJCWluZm8tPmZpeC55cGFuc3RlcCA9IDA7CisJCWluZm8tPmZsYWdzID0gRkJJTkZPX0RFRkFVTFQgfCBGQklORk9fSFdBQ0NFTF9ZV1JBUCB8CisJCSAgICBGQklORk9fUkVBRFNfRkFTVDsgLyogb3ZlcnJpZGUgU0NST0xMX1JFRFJBVyAqLworCX0gZWxzZSB7CisJCWluZm8tPmZpeC55d3JhcHN0ZXAgPSAwOworCQlpZiAocGFyLT52bW9kZSAmIEZCX1ZNT0RFX1NNT09USF9YUEFOKQorCQkJaW5mby0+Zml4LnhwYW5zdGVwID0gMTsKKwkJZWxzZQorCQkJaW5mby0+Zml4LnhwYW5zdGVwID0gMTY8PG1heGZtb2RlOworCQlpbmZvLT5maXgueXBhbnN0ZXAgPSAxOworCQlpbmZvLT5mbGFncyA9IEZCSU5GT19ERUZBVUxUIHwgRkJJTkZPX0hXQUNDRUxfWVBBTjsKKwl9CisJcmV0dXJuIDA7Cit9CisKKworCS8qCisJICogUGFuIG9yIFdyYXAgdGhlIERpc3BsYXkKKwkgKgorCSAqIFRoaXMgY2FsbCBsb29rcyBvbmx5IGF0IHhvZmZzZXQsIHlvZmZzZXQgYW5kIHRoZSBGQl9WTU9ERV9ZV1JBUCBmbGFnCisJICovCisKK3N0YXRpYyBpbnQgYW1pZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCisJCQkgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCWlmICh2YXItPnZtb2RlICYgRkJfVk1PREVfWVdSQVApIHsKKwkJaWYgKHZhci0+eW9mZnNldCA8IDAgfHwKKwkJICAgIHZhci0+eW9mZnNldCA+PSBpbmZvLT52YXIueXJlc192aXJ0dWFsIHx8IHZhci0+eG9mZnNldCkKKwkJCXJldHVybiAtRUlOVkFMOworCX0gZWxzZSB7CisJCS8qCisJCSAqIFRPRE86IFRoZXJlIHdpbGwgYmUgcHJvYmxlbXMgd2hlbiB4cGFuIT0xLCBzbyBzb21lIGNvbHVtbnMKKwkJICogb24gdGhlIHJpZ2h0IHNpZGUgd2lsbCBuZXZlciBiZSBzZWVuCisJCSAqLworCQlpZiAodmFyLT54b2Zmc2V0K2luZm8tPnZhci54cmVzID4gdXB4KDE2PDxtYXhmbW9kZSwgaW5mby0+dmFyLnhyZXNfdmlydHVhbCkgfHwKKwkJICAgIHZhci0+eW9mZnNldCtpbmZvLT52YXIueXJlcyA+IGluZm8tPnZhci55cmVzX3ZpcnR1YWwpCisJCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisJYW1pX3Bhbl92YXIodmFyKTsKKwlpbmZvLT52YXIueG9mZnNldCA9IHZhci0+eG9mZnNldDsKKwlpbmZvLT52YXIueW9mZnNldCA9IHZhci0+eW9mZnNldDsKKwlpZiAodmFyLT52bW9kZSAmIEZCX1ZNT0RFX1lXUkFQKQorCQlpbmZvLT52YXIudm1vZGUgfD0gRkJfVk1PREVfWVdSQVA7CisJZWxzZQorCQlpbmZvLT52YXIudm1vZGUgJj0gfkZCX1ZNT0RFX1lXUkFQOworCXJldHVybiAwOworfQorCisKKyNpZiBCSVRTX1BFUl9MT05HID09IDMyCisjZGVmaW5lIEJZVEVTX1BFUl9MT05HCTQKKyNkZWZpbmUgU0hJRlRfUEVSX0xPTkcJNQorI2VsaWYgQklUU19QRVJfTE9ORyA9PSA2NAorI2RlZmluZSBCWVRFU19QRVJfTE9ORwk4CisjZGVmaW5lIFNISUZUX1BFUl9MT05HCTYKKyNlbHNlCisjZGVmaW5lIFBsZWFzZSB1cGRhdGUgbWUKKyNlbmRpZgorCisKKyAgICAvKgorICAgICAqICBDb21wb3NlIHR3byB2YWx1ZXMsIHVzaW5nIGEgYml0bWFzayBhcyBkZWNpc2lvbiB2YWx1ZQorICAgICAqICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGEgJiBtYXNrKSB8IChiICYgfm1hc2spCisgICAgICovCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjb21wKHVuc2lnbmVkIGxvbmcgYSwgdW5zaWduZWQgbG9uZyBiLAorCQkJCSB1bnNpZ25lZCBsb25nIG1hc2spCit7CisJcmV0dXJuICgoYSBeIGIpICYgbWFzaykgXiBiOworfQorCisKK3N0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyB4b3IodW5zaWduZWQgbG9uZyBhLCB1bnNpZ25lZCBsb25nIGIsCisJCQkJdW5zaWduZWQgbG9uZyBtYXNrKQoreworCXJldHVybiAoYSAmIG1hc2spIF4gYjsKK30KKworCisgICAgLyoKKyAgICAgKiAgVW5hbGlnbmVkIGZvcndhcmQgYml0IGNvcHkgdXNpbmcgMzItYml0IG9yIDY0LWJpdCBtZW1vcnkgYWNjZXNzZXMKKyAgICAgKi8KKworc3RhdGljIHZvaWQgYml0Y3B5KHVuc2lnbmVkIGxvbmcgKmRzdCwgaW50IGRzdF9pZHgsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnNyYywKKwkJICAgaW50IHNyY19pZHgsIHUzMiBuKQoreworCXVuc2lnbmVkIGxvbmcgZmlyc3QsIGxhc3Q7CisJaW50IHNoaWZ0ID0gZHN0X2lkeC1zcmNfaWR4LCBsZWZ0LCByaWdodDsKKwl1bnNpZ25lZCBsb25nIGQwLCBkMTsKKwlpbnQgbTsKKworCWlmICghbikKKwkJcmV0dXJuOworCisJc2hpZnQgPSBkc3RfaWR4LXNyY19pZHg7CisJZmlyc3QgPSB+MFVMID4+IGRzdF9pZHg7CisJbGFzdCA9IH4ofjBVTCA+PiAoKGRzdF9pZHgrbikgJSBCSVRTX1BFUl9MT05HKSk7CisKKwlpZiAoIXNoaWZ0KSB7CisJCS8vIFNhbWUgYWxpZ25tZW50IGZvciBzb3VyY2UgYW5kIGRlc3QKKworCQlpZiAoZHN0X2lkeCtuIDw9IEJJVFNfUEVSX0xPTkcpIHsKKwkJCS8vIFNpbmdsZSB3b3JkCisJCQlpZiAobGFzdCkKKwkJCQlmaXJzdCAmPSBsYXN0OworCQkJKmRzdCA9IGNvbXAoKnNyYywgKmRzdCwgZmlyc3QpOworCQl9IGVsc2UgeworCQkJLy8gTXVsdGlwbGUgZGVzdGluYXRpb24gd29yZHMKKwkJCS8vIExlYWRpbmcgYml0cworCQkJaWYgKGZpcnN0KSB7CisJCQkJKmRzdCA9IGNvbXAoKnNyYywgKmRzdCwgZmlyc3QpOworCQkJCWRzdCsrOworCQkJCXNyYysrOworCQkJCW4gLT0gQklUU19QRVJfTE9ORy1kc3RfaWR4OworCQkJfQorCisJCQkvLyBNYWluIGNodW5rCisJCQluIC89IEJJVFNfUEVSX0xPTkc7CisJCQl3aGlsZSAobiA+PSA4KSB7CisJCQkJKmRzdCsrID0gKnNyYysrOworCQkJCSpkc3QrKyA9ICpzcmMrKzsKKwkJCQkqZHN0KysgPSAqc3JjKys7CisJCQkJKmRzdCsrID0gKnNyYysrOworCQkJCSpkc3QrKyA9ICpzcmMrKzsKKwkJCQkqZHN0KysgPSAqc3JjKys7CisJCQkJKmRzdCsrID0gKnNyYysrOworCQkJCSpkc3QrKyA9ICpzcmMrKzsKKwkJCQluIC09IDg7CisJCQl9CisJCQl3aGlsZSAobi0tKQorCQkJCSpkc3QrKyA9ICpzcmMrKzsKKworCQkJLy8gVHJhaWxpbmcgYml0cworCQkJaWYgKGxhc3QpCisJCQkJKmRzdCA9IGNvbXAoKnNyYywgKmRzdCwgbGFzdCk7CisJCX0KKwl9IGVsc2UgeworCQkvLyBEaWZmZXJlbnQgYWxpZ25tZW50IGZvciBzb3VyY2UgYW5kIGRlc3QKKworCQlyaWdodCA9IHNoaWZ0ICYgKEJJVFNfUEVSX0xPTkctMSk7CisJCWxlZnQgPSAtc2hpZnQgJiAoQklUU19QRVJfTE9ORy0xKTsKKworCQlpZiAoZHN0X2lkeCtuIDw9IEJJVFNfUEVSX0xPTkcpIHsKKwkJCS8vIFNpbmdsZSBkZXN0aW5hdGlvbiB3b3JkCisJCQlpZiAobGFzdCkKKwkJCQlmaXJzdCAmPSBsYXN0OworCQkJaWYgKHNoaWZ0ID4gMCkgeworCQkJCS8vIFNpbmdsZSBzb3VyY2Ugd29yZAorCQkJCSpkc3QgPSBjb21wKCpzcmMgPj4gcmlnaHQsICpkc3QsIGZpcnN0KTsKKwkJCX0gZWxzZSBpZiAoc3JjX2lkeCtuIDw9IEJJVFNfUEVSX0xPTkcpIHsKKwkJCQkvLyBTaW5nbGUgc291cmNlIHdvcmQKKwkJCQkqZHN0ID0gY29tcCgqc3JjIDw8IGxlZnQsICpkc3QsIGZpcnN0KTsKKwkJCX0gZWxzZSB7CisJCQkJLy8gMiBzb3VyY2Ugd29yZHMKKwkJCQlkMCA9ICpzcmMrKzsKKwkJCQlkMSA9ICpzcmM7CisJCQkJKmRzdCA9IGNvbXAoZDAgPDwgbGVmdCB8IGQxID4+IHJpZ2h0LCAqZHN0LAorCQkJCQkgICAgZmlyc3QpOworCQkJfQorCQl9IGVsc2UgeworCQkJLy8gTXVsdGlwbGUgZGVzdGluYXRpb24gd29yZHMKKwkJCWQwID0gKnNyYysrOworCQkJLy8gTGVhZGluZyBiaXRzCisJCQlpZiAoc2hpZnQgPiAwKSB7CisJCQkJLy8gU2luZ2xlIHNvdXJjZSB3b3JkCisJCQkJKmRzdCA9IGNvbXAoZDAgPj4gcmlnaHQsICpkc3QsIGZpcnN0KTsKKwkJCQlkc3QrKzsKKwkJCQluIC09IEJJVFNfUEVSX0xPTkctZHN0X2lkeDsKKwkJCX0gZWxzZSB7CisJCQkJLy8gMiBzb3VyY2Ugd29yZHMKKwkJCQlkMSA9ICpzcmMrKzsKKwkJCQkqZHN0ID0gY29tcChkMCA8PCBsZWZ0IHwgZDEgPj4gcmlnaHQsICpkc3QsCisJCQkJCSAgICBmaXJzdCk7CisJCQkJZDAgPSBkMTsKKwkJCQlkc3QrKzsKKwkJCQluIC09IEJJVFNfUEVSX0xPTkctZHN0X2lkeDsKKwkJCX0KKworCQkJLy8gTWFpbiBjaHVuaworCQkJbSA9IG4gJSBCSVRTX1BFUl9MT05HOworCQkJbiAvPSBCSVRTX1BFUl9MT05HOworCQkJd2hpbGUgKG4gPj0gNCkgeworCQkJCWQxID0gKnNyYysrOworCQkJCSpkc3QrKyA9IGQwIDw8IGxlZnQgfCBkMSA+PiByaWdodDsKKwkJCQlkMCA9IGQxOworCQkJCWQxID0gKnNyYysrOworCQkJCSpkc3QrKyA9IGQwIDw8IGxlZnQgfCBkMSA+PiByaWdodDsKKwkJCQlkMCA9IGQxOworCQkJCWQxID0gKnNyYysrOworCQkJCSpkc3QrKyA9IGQwIDw8IGxlZnQgfCBkMSA+PiByaWdodDsKKwkJCQlkMCA9IGQxOworCQkJCWQxID0gKnNyYysrOworCQkJCSpkc3QrKyA9IGQwIDw8IGxlZnQgfCBkMSA+PiByaWdodDsKKwkJCQlkMCA9IGQxOworCQkJCW4gLT0gNDsKKwkJCX0KKwkJCXdoaWxlIChuLS0pIHsKKwkJCQlkMSA9ICpzcmMrKzsKKwkJCQkqZHN0KysgPSBkMCA8PCBsZWZ0IHwgZDEgPj4gcmlnaHQ7CisJCQkJZDAgPSBkMTsKKwkJCX0KKworCQkJLy8gVHJhaWxpbmcgYml0cworCQkJaWYgKGxhc3QpIHsKKwkJCQlpZiAobSA8PSByaWdodCkgeworCQkJCQkvLyBTaW5nbGUgc291cmNlIHdvcmQKKwkJCQkJKmRzdCA9IGNvbXAoZDAgPDwgbGVmdCwgKmRzdCwgbGFzdCk7CisJCQkJfSBlbHNlIHsKKwkJCQkJLy8gMiBzb3VyY2Ugd29yZHMKKwkJCQkJZDEgPSAqc3JjOworCQkJCQkqZHN0ID0gY29tcChkMCA8PCBsZWZ0IHwgZDEgPj4gcmlnaHQsCisJCQkJCQkgICAgKmRzdCwgbGFzdCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCisKKyAgICAvKgorICAgICAqICBVbmFsaWduZWQgcmV2ZXJzZSBiaXQgY29weSB1c2luZyAzMi1iaXQgb3IgNjQtYml0IG1lbW9yeSBhY2Nlc3NlcworICAgICAqLworCitzdGF0aWMgdm9pZCBiaXRjcHlfcmV2KHVuc2lnbmVkIGxvbmcgKmRzdCwgaW50IGRzdF9pZHgsCisJCSAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nICpzcmMsIGludCBzcmNfaWR4LCB1MzIgbikKK3sKKwl1bnNpZ25lZCBsb25nIGZpcnN0LCBsYXN0OworCWludCBzaGlmdCA9IGRzdF9pZHgtc3JjX2lkeCwgbGVmdCwgcmlnaHQ7CisJdW5zaWduZWQgbG9uZyBkMCwgZDE7CisJaW50IG07CisKKwlpZiAoIW4pCisJCXJldHVybjsKKworCWRzdCArPSAobi0xKS9CSVRTX1BFUl9MT05HOworCXNyYyArPSAobi0xKS9CSVRTX1BFUl9MT05HOworCWlmICgobi0xKSAlIEJJVFNfUEVSX0xPTkcpIHsKKwkJZHN0X2lkeCArPSAobi0xKSAlIEJJVFNfUEVSX0xPTkc7CisJCWRzdCArPSBkc3RfaWR4ID4+IFNISUZUX1BFUl9MT05HOworCQlkc3RfaWR4ICY9IEJJVFNfUEVSX0xPTkctMTsKKwkJc3JjX2lkeCArPSAobi0xKSAlIEJJVFNfUEVSX0xPTkc7CisJCXNyYyArPSBzcmNfaWR4ID4+IFNISUZUX1BFUl9MT05HOworCQlzcmNfaWR4ICY9IEJJVFNfUEVSX0xPTkctMTsKKwl9CisKKwlzaGlmdCA9IGRzdF9pZHgtc3JjX2lkeDsKKwlmaXJzdCA9IH4wVUwgPDwgKEJJVFNfUEVSX0xPTkctMS1kc3RfaWR4KTsKKwlsYXN0ID0gfih+MFVMIDw8IChCSVRTX1BFUl9MT05HLTEtKChkc3RfaWR4LW4pICUgQklUU19QRVJfTE9ORykpKTsKKworCWlmICghc2hpZnQpIHsKKwkJLy8gU2FtZSBhbGlnbm1lbnQgZm9yIHNvdXJjZSBhbmQgZGVzdAorCisJCWlmICgodW5zaWduZWQgbG9uZylkc3RfaWR4KzEgPj0gbikgeworCQkJLy8gU2luZ2xlIHdvcmQKKwkJCWlmIChsYXN0KQorCQkJCWZpcnN0ICY9IGxhc3Q7CisJCQkqZHN0ID0gY29tcCgqc3JjLCAqZHN0LCBmaXJzdCk7CisJCX0gZWxzZSB7CisJCQkvLyBNdWx0aXBsZSBkZXN0aW5hdGlvbiB3b3JkcworCQkJLy8gTGVhZGluZyBiaXRzCisJCQlpZiAoZmlyc3QpIHsKKwkJCQkqZHN0ID0gY29tcCgqc3JjLCAqZHN0LCBmaXJzdCk7CisJCQkJZHN0LS07CisJCQkJc3JjLS07CisJCQkJbiAtPSBkc3RfaWR4KzE7CisJCQl9CisKKwkJCS8vIE1haW4gY2h1bmsKKwkJCW4gLz0gQklUU19QRVJfTE9ORzsKKwkJCXdoaWxlIChuID49IDgpIHsKKwkJCQkqZHN0LS0gPSAqc3JjLS07CisJCQkJKmRzdC0tID0gKnNyYy0tOworCQkJCSpkc3QtLSA9ICpzcmMtLTsKKwkJCQkqZHN0LS0gPSAqc3JjLS07CisJCQkJKmRzdC0tID0gKnNyYy0tOworCQkJCSpkc3QtLSA9ICpzcmMtLTsKKwkJCQkqZHN0LS0gPSAqc3JjLS07CisJCQkJKmRzdC0tID0gKnNyYy0tOworCQkJCW4gLT0gODsKKwkJCX0KKwkJCXdoaWxlIChuLS0pCisJCQkJKmRzdC0tID0gKnNyYy0tOworCisJCQkvLyBUcmFpbGluZyBiaXRzCisJCQlpZiAobGFzdCkKKwkJCQkqZHN0ID0gY29tcCgqc3JjLCAqZHN0LCBsYXN0KTsKKwkJfQorCX0gZWxzZSB7CisJCS8vIERpZmZlcmVudCBhbGlnbm1lbnQgZm9yIHNvdXJjZSBhbmQgZGVzdAorCisJCXJpZ2h0ID0gc2hpZnQgJiAoQklUU19QRVJfTE9ORy0xKTsKKwkJbGVmdCA9IC1zaGlmdCAmIChCSVRTX1BFUl9MT05HLTEpOworCisJCWlmICgodW5zaWduZWQgbG9uZylkc3RfaWR4KzEgPj0gbikgeworCQkJLy8gU2luZ2xlIGRlc3RpbmF0aW9uIHdvcmQKKwkJCWlmIChsYXN0KQorCQkJCWZpcnN0ICY9IGxhc3Q7CisJCQlpZiAoc2hpZnQgPCAwKSB7CisJCQkJLy8gU2luZ2xlIHNvdXJjZSB3b3JkCisJCQkJKmRzdCA9IGNvbXAoKnNyYyA8PCBsZWZ0LCAqZHN0LCBmaXJzdCk7CisJCQl9IGVsc2UgaWYgKDErKHVuc2lnbmVkIGxvbmcpc3JjX2lkeCA+PSBuKSB7CisJCQkJLy8gU2luZ2xlIHNvdXJjZSB3b3JkCisJCQkJKmRzdCA9IGNvbXAoKnNyYyA+PiByaWdodCwgKmRzdCwgZmlyc3QpOworCQkJfSBlbHNlIHsKKwkJCQkvLyAyIHNvdXJjZSB3b3JkcworCQkJCWQwID0gKnNyYy0tOworCQkJCWQxID0gKnNyYzsKKwkJCQkqZHN0ID0gY29tcChkMCA+PiByaWdodCB8IGQxIDw8IGxlZnQsICpkc3QsCisJCQkJCSAgICBmaXJzdCk7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvLyBNdWx0aXBsZSBkZXN0aW5hdGlvbiB3b3JkcworCQkJZDAgPSAqc3JjLS07CisJCQkvLyBMZWFkaW5nIGJpdHMKKwkJCWlmIChzaGlmdCA8IDApIHsKKwkJCQkvLyBTaW5nbGUgc291cmNlIHdvcmQKKwkJCQkqZHN0ID0gY29tcChkMCA8PCBsZWZ0LCAqZHN0LCBmaXJzdCk7CisJCQkJZHN0LS07CisJCQkJbiAtPSBkc3RfaWR4KzE7CisJCQl9IGVsc2UgeworCQkJCS8vIDIgc291cmNlIHdvcmRzCisJCQkJZDEgPSAqc3JjLS07CisJCQkJKmRzdCA9IGNvbXAoZDAgPj4gcmlnaHQgfCBkMSA8PCBsZWZ0LCAqZHN0LAorCQkJCQkgICAgZmlyc3QpOworCQkJCWQwID0gZDE7CisJCQkJZHN0LS07CisJCQkJbiAtPSBkc3RfaWR4KzE7CisJCQl9CisKKwkJCS8vIE1haW4gY2h1bmsKKwkJCW0gPSBuICUgQklUU19QRVJfTE9ORzsKKwkJCW4gLz0gQklUU19QRVJfTE9ORzsKKwkJCXdoaWxlIChuID49IDQpIHsKKwkJCQlkMSA9ICpzcmMtLTsKKwkJCQkqZHN0LS0gPSBkMCA+PiByaWdodCB8IGQxIDw8IGxlZnQ7CisJCQkJZDAgPSBkMTsKKwkJCQlkMSA9ICpzcmMtLTsKKwkJCQkqZHN0LS0gPSBkMCA+PiByaWdodCB8IGQxIDw8IGxlZnQ7CisJCQkJZDAgPSBkMTsKKwkJCQlkMSA9ICpzcmMtLTsKKwkJCQkqZHN0LS0gPSBkMCA+PiByaWdodCB8IGQxIDw8IGxlZnQ7CisJCQkJZDAgPSBkMTsKKwkJCQlkMSA9ICpzcmMtLTsKKwkJCQkqZHN0LS0gPSBkMCA+PiByaWdodCB8IGQxIDw8IGxlZnQ7CisJCQkJZDAgPSBkMTsKKwkJCQluIC09IDQ7CisJCQl9CisJCQl3aGlsZSAobi0tKSB7CisJCQkJZDEgPSAqc3JjLS07CisJCQkJKmRzdC0tID0gZDAgPj4gcmlnaHQgfCBkMSA8PCBsZWZ0OworCQkJCWQwID0gZDE7CisJCQl9CisKKwkJCS8vIFRyYWlsaW5nIGJpdHMKKwkJCWlmIChsYXN0KSB7CisJCQkJaWYgKG0gPD0gbGVmdCkgeworCQkJCQkvLyBTaW5nbGUgc291cmNlIHdvcmQKKwkJCQkJKmRzdCA9IGNvbXAoZDAgPj4gcmlnaHQsICpkc3QsIGxhc3QpOworCQkJCX0gZWxzZSB7CisJCQkJCS8vIDIgc291cmNlIHdvcmRzCisJCQkJCWQxID0gKnNyYzsKKwkJCQkJKmRzdCA9IGNvbXAoZDAgPj4gcmlnaHQgfCBkMSA8PCBsZWZ0LAorCQkJCQkJICAgICpkc3QsIGxhc3QpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KK30KKworCisgICAgLyoKKyAgICAgKiAgVW5hbGlnbmVkIGZvcndhcmQgaW52ZXJ0aW5nIGJpdCBjb3B5IHVzaW5nIDMyLWJpdCBvciA2NC1iaXQgbWVtb3J5CisgICAgICogIGFjY2Vzc2VzCisgICAgICovCisKK3N0YXRpYyB2b2lkIGJpdGNweV9ub3QodW5zaWduZWQgbG9uZyAqZHN0LCBpbnQgZHN0X2lkeCwKKwkJICAgICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnNyYywgaW50IHNyY19pZHgsIHUzMiBuKQoreworCXVuc2lnbmVkIGxvbmcgZmlyc3QsIGxhc3Q7CisJaW50IHNoaWZ0ID0gZHN0X2lkeC1zcmNfaWR4LCBsZWZ0LCByaWdodDsKKwl1bnNpZ25lZCBsb25nIGQwLCBkMTsKKwlpbnQgbTsKKworCWlmICghbikKKwkJcmV0dXJuOworCisJc2hpZnQgPSBkc3RfaWR4LXNyY19pZHg7CisJZmlyc3QgPSB+MFVMID4+IGRzdF9pZHg7CisJbGFzdCA9IH4ofjBVTCA+PiAoKGRzdF9pZHgrbikgJSBCSVRTX1BFUl9MT05HKSk7CisKKwlpZiAoIXNoaWZ0KSB7CisJCS8vIFNhbWUgYWxpZ25tZW50IGZvciBzb3VyY2UgYW5kIGRlc3QKKworCQlpZiAoZHN0X2lkeCtuIDw9IEJJVFNfUEVSX0xPTkcpIHsKKwkJCS8vIFNpbmdsZSB3b3JkCisJCQlpZiAobGFzdCkKKwkJCQlmaXJzdCAmPSBsYXN0OworCQkJKmRzdCA9IGNvbXAofipzcmMsICpkc3QsIGZpcnN0KTsKKwkJfSBlbHNlIHsKKwkJCS8vIE11bHRpcGxlIGRlc3RpbmF0aW9uIHdvcmRzCisJCQkvLyBMZWFkaW5nIGJpdHMKKwkJCWlmIChmaXJzdCkgeworCQkJCSpkc3QgPSBjb21wKH4qc3JjLCAqZHN0LCBmaXJzdCk7CisJCQkJZHN0Kys7CisJCQkJc3JjKys7CisJCQkJbiAtPSBCSVRTX1BFUl9MT05HLWRzdF9pZHg7CisJCQl9CisKKwkJCS8vIE1haW4gY2h1bmsKKwkJCW4gLz0gQklUU19QRVJfTE9ORzsKKwkJCXdoaWxlIChuID49IDgpIHsKKwkJCQkqZHN0KysgPSB+KnNyYysrOworCQkJCSpkc3QrKyA9IH4qc3JjKys7CisJCQkJKmRzdCsrID0gfipzcmMrKzsKKwkJCQkqZHN0KysgPSB+KnNyYysrOworCQkJCSpkc3QrKyA9IH4qc3JjKys7CisJCQkJKmRzdCsrID0gfipzcmMrKzsKKwkJCQkqZHN0KysgPSB+KnNyYysrOworCQkJCSpkc3QrKyA9IH4qc3JjKys7CisJCQkJbiAtPSA4OworCQkJfQorCQkJd2hpbGUgKG4tLSkKKwkJCQkqZHN0KysgPSB+KnNyYysrOworCisJCQkvLyBUcmFpbGluZyBiaXRzCisJCQlpZiAobGFzdCkKKwkJCQkqZHN0ID0gY29tcCh+KnNyYywgKmRzdCwgbGFzdCk7CisJCX0KKwl9IGVsc2UgeworCQkvLyBEaWZmZXJlbnQgYWxpZ25tZW50IGZvciBzb3VyY2UgYW5kIGRlc3QKKworCQlyaWdodCA9IHNoaWZ0ICYgKEJJVFNfUEVSX0xPTkctMSk7CisJCWxlZnQgPSAtc2hpZnQgJiAoQklUU19QRVJfTE9ORy0xKTsKKworCQlpZiAoZHN0X2lkeCtuIDw9IEJJVFNfUEVSX0xPTkcpIHsKKwkJCS8vIFNpbmdsZSBkZXN0aW5hdGlvbiB3b3JkCisJCQlpZiAobGFzdCkKKwkJCQlmaXJzdCAmPSBsYXN0OworCQkJaWYgKHNoaWZ0ID4gMCkgeworCQkJCS8vIFNpbmdsZSBzb3VyY2Ugd29yZAorCQkJCSpkc3QgPSBjb21wKH4qc3JjID4+IHJpZ2h0LCAqZHN0LCBmaXJzdCk7CisJCQl9IGVsc2UgaWYgKHNyY19pZHgrbiA8PSBCSVRTX1BFUl9MT05HKSB7CisJCQkJLy8gU2luZ2xlIHNvdXJjZSB3b3JkCisJCQkJKmRzdCA9IGNvbXAofipzcmMgPDwgbGVmdCwgKmRzdCwgZmlyc3QpOworCQkJfSBlbHNlIHsKKwkJCQkvLyAyIHNvdXJjZSB3b3JkcworCQkJCWQwID0gfipzcmMrKzsKKwkJCQlkMSA9IH4qc3JjOworCQkJCSpkc3QgPSBjb21wKGQwIDw8IGxlZnQgfCBkMSA+PiByaWdodCwgKmRzdCwKKwkJCQkJICAgIGZpcnN0KTsKKwkJCX0KKwkJfSBlbHNlIHsKKwkJCS8vIE11bHRpcGxlIGRlc3RpbmF0aW9uIHdvcmRzCisJCQlkMCA9IH4qc3JjKys7CisJCQkvLyBMZWFkaW5nIGJpdHMKKwkJCWlmIChzaGlmdCA+IDApIHsKKwkJCQkvLyBTaW5nbGUgc291cmNlIHdvcmQKKwkJCQkqZHN0ID0gY29tcChkMCA+PiByaWdodCwgKmRzdCwgZmlyc3QpOworCQkJCWRzdCsrOworCQkJCW4gLT0gQklUU19QRVJfTE9ORy1kc3RfaWR4OworCQkJfSBlbHNlIHsKKwkJCQkvLyAyIHNvdXJjZSB3b3JkcworCQkJCWQxID0gfipzcmMrKzsKKwkJCQkqZHN0ID0gY29tcChkMCA8PCBsZWZ0IHwgZDEgPj4gcmlnaHQsICpkc3QsCisJCQkJCSAgICBmaXJzdCk7CisJCQkJZDAgPSBkMTsKKwkJCQlkc3QrKzsKKwkJCQluIC09IEJJVFNfUEVSX0xPTkctZHN0X2lkeDsKKwkJCX0KKworCQkJLy8gTWFpbiBjaHVuaworCQkJbSA9IG4gJSBCSVRTX1BFUl9MT05HOworCQkJbiAvPSBCSVRTX1BFUl9MT05HOworCQkJd2hpbGUgKG4gPj0gNCkgeworCQkJCWQxID0gfipzcmMrKzsKKwkJCQkqZHN0KysgPSBkMCA8PCBsZWZ0IHwgZDEgPj4gcmlnaHQ7CisJCQkJZDAgPSBkMTsKKwkJCQlkMSA9IH4qc3JjKys7CisJCQkJKmRzdCsrID0gZDAgPDwgbGVmdCB8IGQxID4+IHJpZ2h0OworCQkJCWQwID0gZDE7CisJCQkJZDEgPSB+KnNyYysrOworCQkJCSpkc3QrKyA9IGQwIDw8IGxlZnQgfCBkMSA+PiByaWdodDsKKwkJCQlkMCA9IGQxOworCQkJCWQxID0gfipzcmMrKzsKKwkJCQkqZHN0KysgPSBkMCA8PCBsZWZ0IHwgZDEgPj4gcmlnaHQ7CisJCQkJZDAgPSBkMTsKKwkJCQluIC09IDQ7CisJCQl9CisJCQl3aGlsZSAobi0tKSB7CisJCQkJZDEgPSB+KnNyYysrOworCQkJCSpkc3QrKyA9IGQwIDw8IGxlZnQgfCBkMSA+PiByaWdodDsKKwkJCQlkMCA9IGQxOworCQkJfQorCisJCQkvLyBUcmFpbGluZyBiaXRzCisJCQlpZiAobGFzdCkgeworCQkJCWlmIChtIDw9IHJpZ2h0KSB7CisJCQkJCS8vIFNpbmdsZSBzb3VyY2Ugd29yZAorCQkJCQkqZHN0ID0gY29tcChkMCA8PCBsZWZ0LCAqZHN0LCBsYXN0KTsKKwkJCQl9IGVsc2UgeworCQkJCQkvLyAyIHNvdXJjZSB3b3JkcworCQkJCQlkMSA9IH4qc3JjOworCQkJCQkqZHN0ID0gY29tcChkMCA8PCBsZWZ0IHwgZDEgPj4gcmlnaHQsCisJCQkJCQkgICAgKmRzdCwgbGFzdCk7CisJCQkJfQorCQkJfQorCQl9CisJfQorfQorCisKKyAgICAvKgorICAgICAqICBVbmFsaWduZWQgMzItYml0IHBhdHRlcm4gZmlsbCB1c2luZyAzMi82NC1iaXQgbWVtb3J5IGFjY2Vzc2VzCisgICAgICovCisKK3N0YXRpYyB2b2lkIGJpdGZpbGwzMih1bnNpZ25lZCBsb25nICpkc3QsIGludCBkc3RfaWR4LCB1MzIgcGF0LCB1MzIgbikKK3sKKwl1bnNpZ25lZCBsb25nIHZhbCA9IHBhdDsKKwl1bnNpZ25lZCBsb25nIGZpcnN0LCBsYXN0OworCisJaWYgKCFuKQorCQlyZXR1cm47CisKKyNpZiBCSVRTX1BFUl9MT05HID09IDY0CisJdmFsIHw9IHZhbCA8PCAzMjsKKyNlbmRpZgorCisJZmlyc3QgPSB+MFVMID4+IGRzdF9pZHg7CisJbGFzdCA9IH4ofjBVTCA+PiAoKGRzdF9pZHgrbikgJSBCSVRTX1BFUl9MT05HKSk7CisKKwlpZiAoZHN0X2lkeCtuIDw9IEJJVFNfUEVSX0xPTkcpIHsKKwkJLy8gU2luZ2xlIHdvcmQKKwkJaWYgKGxhc3QpCisJCQlmaXJzdCAmPSBsYXN0OworCQkqZHN0ID0gY29tcCh2YWwsICpkc3QsIGZpcnN0KTsKKwl9IGVsc2UgeworCQkvLyBNdWx0aXBsZSBkZXN0aW5hdGlvbiB3b3JkcworCQkvLyBMZWFkaW5nIGJpdHMKKwkJaWYgKGZpcnN0KSB7CisJCQkqZHN0ID0gY29tcCh2YWwsICpkc3QsIGZpcnN0KTsKKwkJCWRzdCsrOworCQkJbiAtPSBCSVRTX1BFUl9MT05HLWRzdF9pZHg7CisJCX0KKworCQkvLyBNYWluIGNodW5rCisJCW4gLz0gQklUU19QRVJfTE9ORzsKKwkJd2hpbGUgKG4gPj0gOCkgeworCQkJKmRzdCsrID0gdmFsOworCQkJKmRzdCsrID0gdmFsOworCQkJKmRzdCsrID0gdmFsOworCQkJKmRzdCsrID0gdmFsOworCQkJKmRzdCsrID0gdmFsOworCQkJKmRzdCsrID0gdmFsOworCQkJKmRzdCsrID0gdmFsOworCQkJKmRzdCsrID0gdmFsOworCQkJbiAtPSA4OworCQl9CisJCXdoaWxlIChuLS0pCisJCQkqZHN0KysgPSB2YWw7CisKKwkJLy8gVHJhaWxpbmcgYml0cworCQlpZiAobGFzdCkKKwkJCSpkc3QgPSBjb21wKHZhbCwgKmRzdCwgbGFzdCk7CisJfQorfQorCisKKyAgICAvKgorICAgICAqICBVbmFsaWduZWQgMzItYml0IHBhdHRlcm4geG9yIHVzaW5nIDMyLzY0LWJpdCBtZW1vcnkgYWNjZXNzZXMKKyAgICAgKi8KKworc3RhdGljIHZvaWQgYml0eG9yMzIodW5zaWduZWQgbG9uZyAqZHN0LCBpbnQgZHN0X2lkeCwgdTMyIHBhdCwgdTMyIG4pCit7CisJdW5zaWduZWQgbG9uZyB2YWwgPSBwYXQ7CisJdW5zaWduZWQgbG9uZyBmaXJzdCwgbGFzdDsKKworCWlmICghbikKKwkJcmV0dXJuOworCisjaWYgQklUU19QRVJfTE9ORyA9PSA2NAorCXZhbCB8PSB2YWwgPDwgMzI7CisjZW5kaWYKKworCWZpcnN0ID0gfjBVTCA+PiBkc3RfaWR4OworCWxhc3QgPSB+KH4wVUwgPj4gKChkc3RfaWR4K24pICUgQklUU19QRVJfTE9ORykpOworCisJaWYgKGRzdF9pZHgrbiA8PSBCSVRTX1BFUl9MT05HKSB7CisJCS8vIFNpbmdsZSB3b3JkCisJCWlmIChsYXN0KQorCQkJZmlyc3QgJj0gbGFzdDsKKwkJKmRzdCA9IHhvcih2YWwsICpkc3QsIGZpcnN0KTsKKwl9IGVsc2UgeworCQkvLyBNdWx0aXBsZSBkZXN0aW5hdGlvbiB3b3JkcworCQkvLyBMZWFkaW5nIGJpdHMKKwkJaWYgKGZpcnN0KSB7CisJCQkqZHN0ID0geG9yKHZhbCwgKmRzdCwgZmlyc3QpOworCQkJZHN0Kys7CisJCQluIC09IEJJVFNfUEVSX0xPTkctZHN0X2lkeDsKKwkJfQorCisJCS8vIE1haW4gY2h1bmsKKwkJbiAvPSBCSVRTX1BFUl9MT05HOworCQl3aGlsZSAobiA+PSA0KSB7CisJCQkqZHN0KysgXj0gdmFsOworCQkJKmRzdCsrIF49IHZhbDsKKwkJCSpkc3QrKyBePSB2YWw7CisJCQkqZHN0KysgXj0gdmFsOworCQkJbiAtPSA0OworCQl9CisJCXdoaWxlIChuLS0pCisJCQkqZHN0KysgXj0gdmFsOworCisJCS8vIFRyYWlsaW5nIGJpdHMKKwkJaWYgKGxhc3QpCisJCQkqZHN0ID0geG9yKHZhbCwgKmRzdCwgbGFzdCk7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgZmlsbF9vbmVfbGluZShpbnQgYnBwLCB1bnNpZ25lZCBsb25nIG5leHRfcGxhbmUsCisJCQkJIHVuc2lnbmVkIGxvbmcgKmRzdCwgaW50IGRzdF9pZHgsIHUzMiBuLAorCQkJCSB1MzIgY29sb3IpCit7CisJd2hpbGUgKDEpIHsKKwkJZHN0ICs9IGRzdF9pZHggPj4gU0hJRlRfUEVSX0xPTkc7CisJCWRzdF9pZHggJj0gKEJJVFNfUEVSX0xPTkctMSk7CisJCWJpdGZpbGwzMihkc3QsIGRzdF9pZHgsIGNvbG9yICYgMSA/IH4wIDogMCwgbik7CisJCWlmICghLS1icHApCisJCQlicmVhazsKKwkJY29sb3IgPj49IDE7CisJCWRzdF9pZHggKz0gbmV4dF9wbGFuZSo4OworCX0KK30KKworc3RhdGljIGlubGluZSB2b2lkIHhvcl9vbmVfbGluZShpbnQgYnBwLCB1bnNpZ25lZCBsb25nIG5leHRfcGxhbmUsCisJCQkJdW5zaWduZWQgbG9uZyAqZHN0LCBpbnQgZHN0X2lkeCwgdTMyIG4sCisJCQkJdTMyIGNvbG9yKQoreworCXdoaWxlIChjb2xvcikgeworCQlkc3QgKz0gZHN0X2lkeCA+PiBTSElGVF9QRVJfTE9ORzsKKwkJZHN0X2lkeCAmPSAoQklUU19QRVJfTE9ORy0xKTsKKwkJYml0eG9yMzIoZHN0LCBkc3RfaWR4LCBjb2xvciAmIDEgPyB+MCA6IDAsIG4pOworCQlpZiAoIS0tYnBwKQorCQkJYnJlYWs7CisJCWNvbG9yID4+PSAxOworCQlkc3RfaWR4ICs9IG5leHRfcGxhbmUqODsKKwl9Cit9CisKKworc3RhdGljIHZvaWQgYW1pZmJfZmlsbHJlY3Qoc3RydWN0IGZiX2luZm8gKmluZm8sCisJCQkgICBjb25zdCBzdHJ1Y3QgZmJfZmlsbHJlY3QgKnJlY3QpCit7CisJc3RydWN0IGFtaWZiX3BhciAqcGFyID0gKHN0cnVjdCBhbWlmYl9wYXIgKilpbmZvLT5wYXI7CisJaW50IGRzdF9pZHgsIHgyLCB5MjsKKwl1bnNpZ25lZCBsb25nICpkc3Q7CisJdTMyIHdpZHRoLCBoZWlnaHQ7CisKKwlpZiAoIXJlY3QtPndpZHRoIHx8ICFyZWN0LT5oZWlnaHQpCisJCXJldHVybjsKKworCS8qCisJICogV2UgY291bGQgdXNlIGhhcmR3YXJlIGNsaXBwaW5nIGJ1dCBvbiBtYW55IGNhcmRzIHlvdSBnZXQgYXJvdW5kCisJICogaGFyZHdhcmUgY2xpcHBpbmcgYnkgd3JpdGluZyB0byBmcmFtZWJ1ZmZlciBkaXJlY3RseS4KKwkgKiAqLworCXgyID0gcmVjdC0+ZHggKyByZWN0LT53aWR0aDsKKwl5MiA9IHJlY3QtPmR5ICsgcmVjdC0+aGVpZ2h0OworCXgyID0geDIgPCBpbmZvLT52YXIueHJlc192aXJ0dWFsID8geDIgOiBpbmZvLT52YXIueHJlc192aXJ0dWFsOworCXkyID0geTIgPCBpbmZvLT52YXIueXJlc192aXJ0dWFsID8geTIgOiBpbmZvLT52YXIueXJlc192aXJ0dWFsOworCXdpZHRoID0geDIgLSByZWN0LT5keDsKKwloZWlnaHQgPSB5MiAtIHJlY3QtPmR5OworCisJZHN0ID0gKHVuc2lnbmVkIGxvbmcgKikKKwkJKCh1bnNpZ25lZCBsb25nKWluZm8tPnNjcmVlbl9iYXNlICYgfihCWVRFU19QRVJfTE9ORy0xKSk7CisJZHN0X2lkeCA9ICgodW5zaWduZWQgbG9uZylpbmZvLT5zY3JlZW5fYmFzZSAmIChCWVRFU19QRVJfTE9ORy0xKSkqODsKKwlkc3RfaWR4ICs9IHJlY3QtPmR5KnBhci0+bmV4dF9saW5lKjgrcmVjdC0+ZHg7CisJd2hpbGUgKGhlaWdodC0tKSB7CisJCXN3aXRjaCAocmVjdC0+cm9wKSB7CisJCSAgICBjYXNlIFJPUF9DT1BZOgorCQkJZmlsbF9vbmVfbGluZShpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwsCisJCQkJICAgICAgcGFyLT5uZXh0X3BsYW5lLCBkc3QsIGRzdF9pZHgsIHdpZHRoLAorCQkJCSAgICAgIHJlY3QtPmNvbG9yKTsKKwkJCWJyZWFrOworCisJCSAgICBjYXNlIFJPUF9YT1I6CisJCQl4b3Jfb25lX2xpbmUoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsLCBwYXItPm5leHRfcGxhbmUsCisJCQkJICAgICBkc3QsIGRzdF9pZHgsIHdpZHRoLCByZWN0LT5jb2xvcik7CisJCQlicmVhazsKKwkJfQorCQlkc3RfaWR4ICs9IHBhci0+bmV4dF9saW5lKjg7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY29weV9vbmVfbGluZShpbnQgYnBwLCB1bnNpZ25lZCBsb25nIG5leHRfcGxhbmUsCisJCQkJIHVuc2lnbmVkIGxvbmcgKmRzdCwgaW50IGRzdF9pZHgsCisJCQkJIHVuc2lnbmVkIGxvbmcgKnNyYywgaW50IHNyY19pZHgsIHUzMiBuKQoreworCXdoaWxlICgxKSB7CisJCWRzdCArPSBkc3RfaWR4ID4+IFNISUZUX1BFUl9MT05HOworCQlkc3RfaWR4ICY9IChCSVRTX1BFUl9MT05HLTEpOworCQlzcmMgKz0gc3JjX2lkeCA+PiBTSElGVF9QRVJfTE9ORzsKKwkJc3JjX2lkeCAmPSAoQklUU19QRVJfTE9ORy0xKTsKKwkJYml0Y3B5KGRzdCwgZHN0X2lkeCwgc3JjLCBzcmNfaWR4LCBuKTsKKwkJaWYgKCEtLWJwcCkKKwkJCWJyZWFrOworCQlkc3RfaWR4ICs9IG5leHRfcGxhbmUqODsKKwkJc3JjX2lkeCArPSBuZXh0X3BsYW5lKjg7CisJfQorfQorCitzdGF0aWMgaW5saW5lIHZvaWQgY29weV9vbmVfbGluZV9yZXYoaW50IGJwcCwgdW5zaWduZWQgbG9uZyBuZXh0X3BsYW5lLAorCQkJCSAgICAgdW5zaWduZWQgbG9uZyAqZHN0LCBpbnQgZHN0X2lkeCwKKwkJCQkgICAgIHVuc2lnbmVkIGxvbmcgKnNyYywgaW50IHNyY19pZHgsIHUzMiBuKQoreworCXdoaWxlICgxKSB7CisJCWRzdCArPSBkc3RfaWR4ID4+IFNISUZUX1BFUl9MT05HOworCQlkc3RfaWR4ICY9IChCSVRTX1BFUl9MT05HLTEpOworCQlzcmMgKz0gc3JjX2lkeCA+PiBTSElGVF9QRVJfTE9ORzsKKwkJc3JjX2lkeCAmPSAoQklUU19QRVJfTE9ORy0xKTsKKwkJYml0Y3B5X3Jldihkc3QsIGRzdF9pZHgsIHNyYywgc3JjX2lkeCwgbik7CisJCWlmICghLS1icHApCisJCQlicmVhazsKKwkJZHN0X2lkeCArPSBuZXh0X3BsYW5lKjg7CisJCXNyY19pZHggKz0gbmV4dF9wbGFuZSo4OworCX0KK30KKworCitzdGF0aWMgdm9pZCBhbWlmYl9jb3B5YXJlYShzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKKwkJCSAgIGNvbnN0IHN0cnVjdCBmYl9jb3B5YXJlYSAqYXJlYSkKK3sKKwlzdHJ1Y3QgYW1pZmJfcGFyICpwYXIgPSAoc3RydWN0IGFtaWZiX3BhciAqKWluZm8tPnBhcjsKKwlpbnQgeDIsIHkyOworCXUzMiBkeCwgZHksIHN4LCBzeSwgd2lkdGgsIGhlaWdodDsKKwl1bnNpZ25lZCBsb25nICpkc3QsICpzcmM7CisJaW50IGRzdF9pZHgsIHNyY19pZHg7CisJaW50IHJldl9jb3B5ID0gMDsKKworCS8qIGNsaXAgdGhlIGRlc3RpbmF0aW9uICovCisJeDIgPSBhcmVhLT5keCArIGFyZWEtPndpZHRoOworCXkyID0gYXJlYS0+ZHkgKyBhcmVhLT5oZWlnaHQ7CisJZHggPSBhcmVhLT5keCA+IDAgPyBhcmVhLT5keCA6IDA7CisJZHkgPSBhcmVhLT5keSA+IDAgPyBhcmVhLT5keSA6IDA7CisJeDIgPSB4MiA8IGluZm8tPnZhci54cmVzX3ZpcnR1YWwgPyB4MiA6IGluZm8tPnZhci54cmVzX3ZpcnR1YWw7CisJeTIgPSB5MiA8IGluZm8tPnZhci55cmVzX3ZpcnR1YWwgPyB5MiA6IGluZm8tPnZhci55cmVzX3ZpcnR1YWw7CisJd2lkdGggPSB4MiAtIGR4OworCWhlaWdodCA9IHkyIC0gZHk7CisKKwkvKiB1cGRhdGUgc3gsc3kgKi8KKwlzeCA9IGFyZWEtPnN4ICsgKGR4IC0gYXJlYS0+ZHgpOworCXN5ID0gYXJlYS0+c3kgKyAoZHkgLSBhcmVhLT5keSk7CisKKwkvKiB0aGUgc291cmNlIG11c3QgYmUgY29tcGxldGVseSBpbnNpZGUgdGhlIHZpcnR1YWwgc2NyZWVuICovCisJaWYgKHN4IDwgMCB8fCBzeSA8IDAgfHwgKHN4ICsgd2lkdGgpID4gaW5mby0+dmFyLnhyZXNfdmlydHVhbCB8fAorCSAgICAoc3kgKyBoZWlnaHQpID4gaW5mby0+dmFyLnlyZXNfdmlydHVhbCkKKwkJcmV0dXJuOworCisJaWYgKGR5ID4gc3kgfHwgKGR5ID09IHN5ICYmIGR4ID4gc3gpKSB7CisJCWR5ICs9IGhlaWdodDsKKwkJc3kgKz0gaGVpZ2h0OworCQlyZXZfY29weSA9IDE7CisJfQorCWRzdCA9ICh1bnNpZ25lZCBsb25nICopCisJCSgodW5zaWduZWQgbG9uZylpbmZvLT5zY3JlZW5fYmFzZSAmIH4oQllURVNfUEVSX0xPTkctMSkpOworCXNyYyA9IGRzdDsKKwlkc3RfaWR4ID0gKCh1bnNpZ25lZCBsb25nKWluZm8tPnNjcmVlbl9iYXNlICYgKEJZVEVTX1BFUl9MT05HLTEpKSo4OworCXNyY19pZHggPSBkc3RfaWR4OworCWRzdF9pZHggKz0gZHkqcGFyLT5uZXh0X2xpbmUqOCtkeDsKKwlzcmNfaWR4ICs9IHN5KnBhci0+bmV4dF9saW5lKjgrc3g7CisJaWYgKHJldl9jb3B5KSB7CisJCXdoaWxlIChoZWlnaHQtLSkgeworCQkJZHN0X2lkeCAtPSBwYXItPm5leHRfbGluZSo4OworCQkJc3JjX2lkeCAtPSBwYXItPm5leHRfbGluZSo4OworCQkJY29weV9vbmVfbGluZV9yZXYoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsLAorCQkJCQkgIHBhci0+bmV4dF9wbGFuZSwgZHN0LCBkc3RfaWR4LCBzcmMsCisJCQkJCSAgc3JjX2lkeCwgd2lkdGgpOworCQl9CisJfSBlbHNlIHsKKwkJd2hpbGUgKGhlaWdodC0tKSB7CisJCQljb3B5X29uZV9saW5lKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCwKKwkJCQkgICAgICBwYXItPm5leHRfcGxhbmUsIGRzdCwgZHN0X2lkeCwgc3JjLAorCQkJCSAgICAgIHNyY19pZHgsIHdpZHRoKTsKKwkJCWRzdF9pZHggKz0gcGFyLT5uZXh0X2xpbmUqODsKKwkJCXNyY19pZHggKz0gcGFyLT5uZXh0X2xpbmUqODsKKwkJfQorCX0KK30KKworCitzdGF0aWMgaW5saW5lIHZvaWQgZXhwYW5kX29uZV9saW5lKGludCBicHAsIHVuc2lnbmVkIGxvbmcgbmV4dF9wbGFuZSwKKwkJCQkgICB1bnNpZ25lZCBsb25nICpkc3QsIGludCBkc3RfaWR4LCB1MzIgbiwKKwkJCQkgICBjb25zdCB1OCAqZGF0YSwgdTMyIGJnY29sb3IsIHUzMiBmZ2NvbG9yKQoreworICAgIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnNyYzsKKyAgICBpbnQgc3JjX2lkeDsKKworICAgIHdoaWxlICgxKSB7CisJZHN0ICs9IGRzdF9pZHggPj4gU0hJRlRfUEVSX0xPTkc7CisJZHN0X2lkeCAmPSAoQklUU19QRVJfTE9ORy0xKTsKKwlpZiAoKGJnY29sb3IgXiBmZ2NvbG9yKSAmIDEpIHsKKwkgICAgc3JjID0gKHVuc2lnbmVkIGxvbmcgKikoKHVuc2lnbmVkIGxvbmcpZGF0YSAmIH4oQllURVNfUEVSX0xPTkctMSkpOworCSAgICBzcmNfaWR4ID0gKCh1bnNpZ25lZCBsb25nKWRhdGEgJiAoQllURVNfUEVSX0xPTkctMSkpKjg7CisJICAgIGlmIChmZ2NvbG9yICYgMSkKKwkJYml0Y3B5KGRzdCwgZHN0X2lkeCwgc3JjLCBzcmNfaWR4LCBuKTsKKwkgICAgZWxzZQorCQliaXRjcHlfbm90KGRzdCwgZHN0X2lkeCwgc3JjLCBzcmNfaWR4LCBuKTsKKwkgICAgLyogc2V0IG9yIGNsZWFyICovCisJfSBlbHNlCisJICAgIGJpdGZpbGwzMihkc3QsIGRzdF9pZHgsIGZnY29sb3IgJiAxID8gfjAgOiAwLCBuKTsKKwlpZiAoIS0tYnBwKQorCSAgICBicmVhazsKKwliZ2NvbG9yID4+PSAxOworCWZnY29sb3IgPj49IDE7CisJZHN0X2lkeCArPSBuZXh0X3BsYW5lKjg7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkIGFtaWZiX2ltYWdlYmxpdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywgY29uc3Qgc3RydWN0IGZiX2ltYWdlICppbWFnZSkKK3sKKwlzdHJ1Y3QgYW1pZmJfcGFyICpwYXIgPSAoc3RydWN0IGFtaWZiX3BhciAqKWluZm8tPnBhcjsKKwlpbnQgeDIsIHkyOworCXVuc2lnbmVkIGxvbmcgKmRzdDsKKwlpbnQgZHN0X2lkeDsKKwljb25zdCBjaGFyICpzcmM7CisJdTMyIGR4LCBkeSwgd2lkdGgsIGhlaWdodCwgcGl0Y2g7CisKKwkvKgorCSAqIFdlIGNvdWxkIHVzZSBoYXJkd2FyZSBjbGlwcGluZyBidXQgb24gbWFueSBjYXJkcyB5b3UgZ2V0IGFyb3VuZAorCSAqIGhhcmR3YXJlIGNsaXBwaW5nIGJ5IHdyaXRpbmcgdG8gZnJhbWVidWZmZXIgZGlyZWN0bHkgbGlrZSB3ZSBhcmUKKwkgKiBkb2luZyBoZXJlLgorCSAqLworCXgyID0gaW1hZ2UtPmR4ICsgaW1hZ2UtPndpZHRoOworCXkyID0gaW1hZ2UtPmR5ICsgaW1hZ2UtPmhlaWdodDsKKwlkeCA9IGltYWdlLT5keDsKKwlkeSA9IGltYWdlLT5keTsKKwl4MiA9IHgyIDwgaW5mby0+dmFyLnhyZXNfdmlydHVhbCA/IHgyIDogaW5mby0+dmFyLnhyZXNfdmlydHVhbDsKKwl5MiA9IHkyIDwgaW5mby0+dmFyLnlyZXNfdmlydHVhbCA/IHkyIDogaW5mby0+dmFyLnlyZXNfdmlydHVhbDsKKwl3aWR0aCAgPSB4MiAtIGR4OworCWhlaWdodCA9IHkyIC0gZHk7CisKKwlpZiAoaW1hZ2UtPmRlcHRoID09IDEpIHsKKwkJZHN0ID0gKHVuc2lnbmVkIGxvbmcgKikKKwkJCSgodW5zaWduZWQgbG9uZylpbmZvLT5zY3JlZW5fYmFzZSAmIH4oQllURVNfUEVSX0xPTkctMSkpOworCQlkc3RfaWR4ID0gKCh1bnNpZ25lZCBsb25nKWluZm8tPnNjcmVlbl9iYXNlICYgKEJZVEVTX1BFUl9MT05HLTEpKSo4OworCQlkc3RfaWR4ICs9IGR5KnBhci0+bmV4dF9saW5lKjgrZHg7CisJCXNyYyA9IGltYWdlLT5kYXRhOworCQlwaXRjaCA9IChpbWFnZS0+d2lkdGgrNykvODsKKwkJd2hpbGUgKGhlaWdodC0tKSB7CisJCQlleHBhbmRfb25lX2xpbmUoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsLAorCQkJCQlwYXItPm5leHRfcGxhbmUsIGRzdCwgZHN0X2lkeCwgd2lkdGgsCisJCQkJCXNyYywgaW1hZ2UtPmJnX2NvbG9yLAorCQkJCQlpbWFnZS0+ZmdfY29sb3IpOworCQkJZHN0X2lkeCArPSBwYXItPm5leHRfbGluZSo4OworCQkJc3JjICs9IHBpdGNoOworCQl9CisJfSBlbHNlIHsKKwkJYzJwKGluZm8tPnNjcmVlbl9iYXNlLCBpbWFnZS0+ZGF0YSwgZHgsIGR5LCB3aWR0aCwgaGVpZ2h0LAorCQkgICAgcGFyLT5uZXh0X2xpbmUsIHBhci0+bmV4dF9wbGFuZSwgaW1hZ2UtPndpZHRoLAorCQkgICAgaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsKTsKKwl9Cit9CisKKworCS8qCisJICogQW1pZ2EgRnJhbWUgQnVmZmVyIFNwZWNpZmljIGlvY3RscworCSAqLworCitzdGF0aWMgaW50IGFtaWZiX2lvY3RsKHN0cnVjdCBpbm9kZSAqaW5vZGUsIHN0cnVjdCBmaWxlICpmaWxlLAorCQkgICAgICAgdW5zaWduZWQgaW50IGNtZCwgdW5zaWduZWQgbG9uZyBhcmcsCisJCSAgICAgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKK3sKKwl1bmlvbiB7CisJCXN0cnVjdCBmYl9maXhfY3Vyc29yaW5mbyBmaXg7CisJCXN0cnVjdCBmYl92YXJfY3Vyc29yaW5mbyB2YXI7CisJCXN0cnVjdCBmYl9jdXJzb3JzdGF0ZSBzdGF0ZTsKKwl9IGNyc3I7CisJaW50IGk7CisKKwlzd2l0Y2ggKGNtZCkgeworCQljYXNlIEZCSU9HRVRfRkNVUlNPUklORk86CisJCQlpID0gYW1pX2dldF9maXhfY3Vyc29yaW5mbygmY3Jzci5maXgpOworCQkJaWYgKGkpCisJCQkJcmV0dXJuIGk7CisJCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY3Jzci5maXgsCisJCQkJCSAgICBzaXplb2YoY3Jzci5maXgpKSA/IC1FRkFVTFQgOiAwOworCisJCWNhc2UgRkJJT0dFVF9WQ1VSU09SSU5GTzoKKwkJCWkgPSBhbWlfZ2V0X3Zhcl9jdXJzb3JpbmZvKCZjcnNyLnZhciwKKwkJCQkoKHN0cnVjdCBmYl92YXJfY3Vyc29yaW5mbyAqKWFyZyktPmRhdGEpOworCQkJaWYgKGkpCisJCQkJcmV0dXJuIGk7CisJCQlyZXR1cm4gY29weV90b191c2VyKCh2b2lkICopYXJnLCAmY3Jzci52YXIsCisJCQkJCSAgICBzaXplb2YoY3Jzci52YXIpKSA/IC1FRkFVTFQgOiAwOworCisJCWNhc2UgRkJJT1BVVF9WQ1VSU09SSU5GTzoKKwkJCWlmIChjb3B5X2Zyb21fdXNlcigmY3Jzci52YXIsICh2b2lkICopYXJnLAorCQkJCQkgICBzaXplb2YoY3Jzci52YXIpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiBhbWlfc2V0X3Zhcl9jdXJzb3JpbmZvKCZjcnNyLnZhciwKKwkJCQkoKHN0cnVjdCBmYl92YXJfY3Vyc29yaW5mbyAqKWFyZyktPmRhdGEpOworCisJCWNhc2UgRkJJT0dFVF9DVVJTT1JTVEFURToKKwkJCWkgPSBhbWlfZ2V0X2N1cnNvcnN0YXRlKCZjcnNyLnN0YXRlKTsKKwkJCWlmIChpKQorCQkJCXJldHVybiBpOworCQkJcmV0dXJuIGNvcHlfdG9fdXNlcigodm9pZCAqKWFyZywgJmNyc3Iuc3RhdGUsCisJCQkJCSAgICBzaXplb2YoY3Jzci5zdGF0ZSkpID8gLUVGQVVMVCA6IDA7CisKKwkJY2FzZSBGQklPUFVUX0NVUlNPUlNUQVRFOgorCQkJaWYgKGNvcHlfZnJvbV91c2VyKCZjcnNyLnN0YXRlLCAodm9pZCAqKWFyZywKKwkJCQkJICAgc2l6ZW9mKGNyc3Iuc3RhdGUpKSkKKwkJCQlyZXR1cm4gLUVGQVVMVDsKKwkJCXJldHVybiBhbWlfc2V0X2N1cnNvcnN0YXRlKCZjcnNyLnN0YXRlKTsKKwl9CisJcmV0dXJuIC1FSU5WQUw7Cit9CisKKworCS8qCisJICogQWxsb2NhdGUsIENsZWFyIGFuZCBBbGlnbiBhIEJsb2NrIG9mIENoaXAgTWVtb3J5CisJICovCisKK3N0YXRpYyB1X2xvbmcgdW5hbGlnbmVkX2NoaXBwdHIgPSAwOworCitzdGF0aWMgaW5saW5lIHVfbG9uZyBfX2luaXQgY2hpcGFsbG9jKHVfbG9uZyBzaXplKQoreworCXNpemUgKz0gUEFHRV9TSVpFLTE7CisJaWYgKCEodW5hbGlnbmVkX2NoaXBwdHIgPSAodV9sb25nKWFtaWdhX2NoaXBfYWxsb2Moc2l6ZSwKKwkJCQkJCQkgICAiYW1pZmIgW1JBTV0iKSkpCisJCXBhbmljKCJObyBDaGlwIFJBTSBmb3IgZnJhbWUgYnVmZmVyIik7CisJbWVtc2V0KCh2b2lkICopdW5hbGlnbmVkX2NoaXBwdHIsIDAsIHNpemUpOworCXJldHVybiBQQUdFX0FMSUdOKHVuYWxpZ25lZF9jaGlwcHRyKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNoaXBmcmVlKHZvaWQpCit7CisJaWYgKHVuYWxpZ25lZF9jaGlwcHRyKQorCQlhbWlnYV9jaGlwX2ZyZWUoKHZvaWQgKil1bmFsaWduZWRfY2hpcHB0cik7Cit9CisKKworCS8qCisJICogSW5pdGlhbGlzYXRpb24KKwkgKi8KKworaW50IF9faW5pdCBhbWlmYl9pbml0KHZvaWQpCit7CisJaW50IHRhZywgaSwgZXJyID0gMDsKKwl1X2xvbmcgY2hpcHB0cjsKKwl1X2ludCBkZWZtb2RlOworCisjaWZuZGVmIE1PRFVMRQorCWNoYXIgKm9wdGlvbiA9IE5VTEw7CisKKwlpZiAoZmJfZ2V0X29wdGlvbnMoImFtaWZiIiwgJm9wdGlvbikpIHsKKwkJYW1pZmJfdmlkZW9fb2ZmKCk7CisJCXJldHVybiAtRU5PREVWOworCX0KKwlhbWlmYl9zZXR1cChvcHRpb24pOworI2VuZGlmCisJaWYgKCFNQUNIX0lTX0FNSUdBIHx8ICFBTUlHQUhXX1BSRVNFTlQoQU1JX1ZJREVPKSkKKwkJcmV0dXJuIC1FTlhJTzsKKworCS8qCisJICogV2UgcmVxdWVzdCBhbGwgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gYnBscHRbMF0KKwkgKi8KKwlpZiAoIXJlcXVlc3RfbWVtX3JlZ2lvbihDVVNUT01fUEhZU0FERFIrMHhlMCwgMHgxMjAsCisJCQkJImFtaWZiIFtEZW5pc2UvTGlzYV0iKSkKKwkJcmV0dXJuIC1FQlVTWTsKKworCWN1c3RvbS5kbWFjb24gPSBETUFGX0FMTCB8IERNQUZfTUFTVEVSOworCisJc3dpdGNoIChhbWlnYV9jaGlwc2V0KSB7CisjaWZkZWYgQ09ORklHX0ZCX0FNSUdBX09DUworCQljYXNlIENTX09DUzoKKwkJCXN0cmNhdChmYl9pbmZvLmZpeC5pZCwgIk9DUyIpOworZGVmYXVsdF9jaGlwc2V0OgorCQkJY2hpcHNldCA9IFRBR19PQ1M7CisJCQltYXhkZXB0aFtUQUdfU0hSRVNdID0gMDsJLyogT0NTIG1lYW5zIG5vIFNIUkVTICovCisJCQltYXhkZXB0aFtUQUdfSElSRVNdID0gNDsKKwkJCW1heGRlcHRoW1RBR19MT1JFU10gPSA2OworCQkJbWF4Zm1vZGUgPSBUQUdfRk1PREVfMTsKKwkJCWRlZm1vZGUgPSBhbWlnYV92YmxhbmsgPT0gNTAgPyBERUZNT0RFX1BBTAorCQkJCQkJICAgICA6IERFRk1PREVfTlRTQzsKKwkJCWZiX2luZm8uZml4LnNtZW1fbGVuID0gVklERU9NRU1TSVpFX09DUzsKKwkJCWJyZWFrOworI2VuZGlmIC8qIENPTkZJR19GQl9BTUlHQV9PQ1MgKi8KKworI2lmZGVmIENPTkZJR19GQl9BTUlHQV9FQ1MKKwkJY2FzZSBDU19FQ1M6CisJCQlzdHJjYXQoZmJfaW5mby5maXguaWQsICJFQ1MiKTsKKwkJCWNoaXBzZXQgPSBUQUdfRUNTOworCQkJbWF4ZGVwdGhbVEFHX1NIUkVTXSA9IDI7CisJCQltYXhkZXB0aFtUQUdfSElSRVNdID0gNDsKKwkJCW1heGRlcHRoW1RBR19MT1JFU10gPSA2OworCQkJbWF4Zm1vZGUgPSBUQUdfRk1PREVfMTsKKwkJCWlmIChBTUlHQUhXX1BSRVNFTlQoQU1CRVJfRkYpKQorCQkJICAgIGRlZm1vZGUgPSBhbWlnYV92YmxhbmsgPT0gNTAgPyBERUZNT0RFX0FNQkVSX1BBTAorCQkJCQkJCSA6IERFRk1PREVfQU1CRVJfTlRTQzsKKwkJCWVsc2UKKwkJCSAgICBkZWZtb2RlID0gYW1pZ2FfdmJsYW5rID09IDUwID8gREVGTU9ERV9QQUwKKwkJCQkJCQkgOiBERUZNT0RFX05UU0M7CisJCQlpZiAoYW1pZ2FfY2hpcF9hdmFpbCgpLUNISVBSQU1fU0FGRVRZX0xJTUlUID4KKwkJCSAgICBWSURFT01FTVNJWkVfRUNTXzFNKQorCQkJCWZiX2luZm8uZml4LnNtZW1fbGVuID0gVklERU9NRU1TSVpFX0VDU18yTTsKKwkJCWVsc2UKKwkJCQlmYl9pbmZvLmZpeC5zbWVtX2xlbiA9IFZJREVPTUVNU0laRV9FQ1NfMU07CisJCQlicmVhazsKKyNlbmRpZiAvKiBDT05GSUdfRkJfQU1JR0FfRUNTICovCisKKyNpZmRlZiBDT05GSUdfRkJfQU1JR0FfQUdBCisJCWNhc2UgQ1NfQUdBOgorCQkJc3RyY2F0KGZiX2luZm8uZml4LmlkLCAiQUdBIik7CisJCQljaGlwc2V0ID0gVEFHX0FHQTsKKwkJCW1heGRlcHRoW1RBR19TSFJFU10gPSA4OworCQkJbWF4ZGVwdGhbVEFHX0hJUkVTXSA9IDg7CisJCQltYXhkZXB0aFtUQUdfTE9SRVNdID0gODsKKwkJCW1heGZtb2RlID0gVEFHX0ZNT0RFXzQ7CisJCQlkZWZtb2RlID0gREVGTU9ERV9BR0E7CisJCQlpZiAoYW1pZ2FfY2hpcF9hdmFpbCgpLUNISVBSQU1fU0FGRVRZX0xJTUlUID4KKwkJCSAgICBWSURFT01FTVNJWkVfQUdBXzFNKQorCQkJCWZiX2luZm8uZml4LnNtZW1fbGVuID0gVklERU9NRU1TSVpFX0FHQV8yTTsKKwkJCWVsc2UKKwkJCQlmYl9pbmZvLmZpeC5zbWVtX2xlbiA9IFZJREVPTUVNU0laRV9BR0FfMU07CisJCQlicmVhazsKKyNlbmRpZiAvKiBDT05GSUdfRkJfQU1JR0FfQUdBICovCisKKwkJZGVmYXVsdDoKKyNpZmRlZiBDT05GSUdfRkJfQU1JR0FfT0NTCisJCQlwcmludGsoIlVua25vd24gZ3JhcGhpY3MgY2hpcHNldCwgZGVmYXVsdGluZyB0byBPQ1NcbiIpOworCQkJc3RyY2F0KGZiX2luZm8uZml4LmlkLCAiVW5rbm93biIpOworCQkJZ290byBkZWZhdWx0X2NoaXBzZXQ7CisjZWxzZSAvKiBDT05GSUdfRkJfQU1JR0FfT0NTICovCisJCQllcnIgPSAtRU5YSU87CisJCQlnb3RvIGFtaWZiX2Vycm9yOworI2VuZGlmIC8qIENPTkZJR19GQl9BTUlHQV9PQ1MgKi8KKwkJCWJyZWFrOworCX0KKworCS8qCisJICogQ2FsY3VsYXRlIHRoZSBQaXhlbCBDbG9jayBWYWx1ZXMgZm9yIHRoaXMgTWFjaGluZQorCSAqLworCisJeworCXVfbG9uZyB0bXAgPSBESVZVTCgyMDAwMDAwMDAwMDBVTEwsIGFtaWdhX2VjbG9jayk7CisKKwlwaXhjbG9ja1tUQUdfU0hSRVNdID0gKHRtcCArIDQpIC8gODsJLyogU0hSRVM6ICAzNSBucyAvIDI4IE1IeiAqLworCXBpeGNsb2NrW1RBR19ISVJFU10gPSAodG1wICsgMikgLyA0OwkvKiBISVJFUzogIDcwIG5zIC8gMTQgTUh6ICovCisJcGl4Y2xvY2tbVEFHX0xPUkVTXSA9ICh0bXAgKyAxKSAvIDI7CS8qIExPUkVTOiAxNDAgbnMgLyAgNyBNSHogKi8KKwl9CisKKwkvKgorCSAqIFJlcGxhY2UgdGhlIFRhZyBWYWx1ZXMgd2l0aCB0aGUgUmVhbCBQaXhlbCBDbG9jayBWYWx1ZXMKKwkgKi8KKworCWZvciAoaSA9IDA7IGkgPCBOVU1fVE9UQUxfTU9ERVM7IGkrKykgeworCQlzdHJ1Y3QgZmJfdmlkZW9tb2RlICptb2RlID0gJmFtaV9tb2RlZGJbaV07CisJCXRhZyA9IG1vZGUtPnBpeGNsb2NrOworCQlpZiAodGFnID09IFRBR19TSFJFUyB8fCB0YWcgPT0gVEFHX0hJUkVTIHx8IHRhZyA9PSBUQUdfTE9SRVMpIHsKKwkJCW1vZGUtPnBpeGNsb2NrID0gcGl4Y2xvY2tbdGFnXTsKKwkJfQorCX0KKworCS8qCisJICogIFRoZXNlIG1vbml0b3Igc3BlY3MgYXJlIGZvciBhIHR5cGljYWwgQW1pZ2EgbW9uaXRvciAoZS5nLiBBMTk2MCkKKwkgKi8KKwlpZiAoZmJfaW5mby5tb25zcGVjcy5oZm1pbiA9PSAwKSB7CisJICAgIGZiX2luZm8ubW9uc3BlY3MuaGZtaW4gPSAxNTAwMDsKKwkgICAgZmJfaW5mby5tb25zcGVjcy5oZm1heCA9IDM4MDAwOworCSAgICBmYl9pbmZvLm1vbnNwZWNzLnZmbWluID0gNDk7CisJICAgIGZiX2luZm8ubW9uc3BlY3MudmZtYXggPSA5MDsKKwl9CisKKwlmYl9pbmZvLmZib3BzID0gJmFtaWZiX29wczsKKwlmYl9pbmZvLnBhciA9ICZjdXJyZW50cGFyOworCWZiX2luZm8uZmxhZ3MgPSBGQklORk9fREVGQVVMVDsKKworCWlmICghZmJfZmluZF9tb2RlKCZmYl9pbmZvLnZhciwgJmZiX2luZm8sIG1vZGVfb3B0aW9uLCBhbWlfbW9kZWRiLAorCQkJICBOVU1fVE9UQUxfTU9ERVMsICZhbWlfbW9kZWRiW2RlZm1vZGVdLCA0KSkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGFtaWZiX2Vycm9yOworCX0KKworCXJvdW5kX2Rvd25fYnBwID0gMDsKKwljaGlwcHRyID0gY2hpcGFsbG9jKGZiX2luZm8uZml4LnNtZW1fbGVuKworCSAgICAgICAgICAgICAgICAgICAgU1BSSVRFTUVNU0laRSsKKwkgICAgICAgICAgICAgICAgICAgIERVTU1ZU1BSSVRFTUVNU0laRSsKKwkgICAgICAgICAgICAgICAgICAgIENPUElOSVRTSVpFKworCSAgICAgICAgICAgICAgICAgICAgNCpDT1BMSVNUU0laRSk7CisKKwlhc3NpZ25jaHVuayh2aWRlb21lbW9yeSwgdV9sb25nLCBjaGlwcHRyLCBmYl9pbmZvLmZpeC5zbWVtX2xlbik7CisJYXNzaWduY2h1bmsoc3ByaXRlbWVtb3J5LCB1X2xvbmcsIGNoaXBwdHIsIFNQUklURU1FTVNJWkUpOworCWFzc2lnbmNodW5rKGR1bW15c3ByaXRlLCB1X3Nob3J0ICosIGNoaXBwdHIsIERVTU1ZU1BSSVRFTUVNU0laRSk7CisJYXNzaWduY2h1bmsoY29wZGlzcGxheS5pbml0LCBjb3BpbnMgKiwgY2hpcHB0ciwgQ09QSU5JVFNJWkUpOworCWFzc2lnbmNodW5rKGNvcGRpc3BsYXkubGlzdFswXVswXSwgY29waW5zICosIGNoaXBwdHIsIENPUExJU1RTSVpFKTsKKwlhc3NpZ25jaHVuayhjb3BkaXNwbGF5Lmxpc3RbMF1bMV0sIGNvcGlucyAqLCBjaGlwcHRyLCBDT1BMSVNUU0laRSk7CisJYXNzaWduY2h1bmsoY29wZGlzcGxheS5saXN0WzFdWzBdLCBjb3BpbnMgKiwgY2hpcHB0ciwgQ09QTElTVFNJWkUpOworCWFzc2lnbmNodW5rKGNvcGRpc3BsYXkubGlzdFsxXVsxXSwgY29waW5zICosIGNoaXBwdHIsIENPUExJU1RTSVpFKTsKKworCS8qCisJICogYWNjZXNzIHRoZSB2aWRlb21lbSB3aXRoIHdyaXRldGhyb3VnaCBjYWNoZQorCSAqLworCWZiX2luZm8uZml4LnNtZW1fc3RhcnQgPSAodV9sb25nKVpUV09fUEFERFIodmlkZW9tZW1vcnkpOworCXZpZGVvbWVtb3J5ID0gKHVfbG9uZylpb3JlbWFwX3dyaXRldGhyb3VnaChmYl9pbmZvLmZpeC5zbWVtX3N0YXJ0LAorCQkJCQkJICAgZmJfaW5mby5maXguc21lbV9sZW4pOworCWlmICghdmlkZW9tZW1vcnkpIHsKKwkJcHJpbnRrKCJhbWlmYjogV0FSTklORyEgdW5hYmxlIHRvIG1hcCB2aWRlb21lbSBjYWNoZWQgd3JpdGV0aHJvdWdoXG4iKTsKKwkJdmlkZW9tZW1vcnkgPSBaVFdPX1ZBRERSKGZiX2luZm8uZml4LnNtZW1fc3RhcnQpOworCX0KKworCWZiX2luZm8uc2NyZWVuX2Jhc2UgPSAoY2hhciAqKXZpZGVvbWVtb3J5OworCW1lbXNldChkdW1teXNwcml0ZSwgMCwgRFVNTVlTUFJJVEVNRU1TSVpFKTsKKworCS8qCisJICogRW5hYmxlIERpc3BsYXkgRE1BCisJICovCisKKwljdXN0b20uZG1hY29uID0gRE1BRl9TRVRDTFIgfCBETUFGX01BU1RFUiB8IERNQUZfUkFTVEVSIHwgRE1BRl9DT1BQRVIgfAorCSAgICAgICAgICAgICAgICBETUFGX0JMSVRURVIgfCBETUFGX1NQUklURTsKKworCS8qCisJICogTWFrZSBzdXJlIHRoZSBDb3BwZXIgaGFzIHNvbWV0aGluZyB0byBkbworCSAqLworCisJYW1pX2luaXRfY29wcGVyKCk7CisKKwlpZiAocmVxdWVzdF9pcnEoSVJRX0FNSUdBX0NPUFBFUiwgYW1pZmJfaW50ZXJydXB0LCAwLAorCSAgICAgICAgICAgICAgICAiZmIgdmVydGIgaGFuZGxlciIsICZjdXJyZW50cGFyKSkgeworCQllcnIgPSAtRUJVU1k7CisJCWdvdG8gYW1pZmJfZXJyb3I7CisJfQorCisJZmJfYWxsb2NfY21hcCgmZmJfaW5mby5jbWFwLCAxPDxmYl9pbmZvLnZhci5iaXRzX3Blcl9waXhlbCwgMCk7CisKKwlpZiAocmVnaXN0ZXJfZnJhbWVidWZmZXIoJmZiX2luZm8pIDwgMCkgeworCQllcnIgPSAtRUlOVkFMOworCQlnb3RvIGFtaWZiX2Vycm9yOworCX0KKworCXByaW50aygiZmIlZDogJXMgZnJhbWUgYnVmZmVyIGRldmljZSwgdXNpbmcgJWRLIG9mIHZpZGVvIG1lbW9yeVxuIiwKKwkgICAgICAgZmJfaW5mby5ub2RlLCBmYl9pbmZvLmZpeC5pZCwgZmJfaW5mby5maXguc21lbV9sZW4+PjEwKTsKKworCXJldHVybiAwOworCithbWlmYl9lcnJvcjoKKwlhbWlmYl9kZWluaXQoKTsKKwlyZXR1cm4gZXJyOworfQorCitzdGF0aWMgdm9pZCBhbWlmYl9kZWluaXQodm9pZCkKK3sKKwlmYl9kZWFsbG9jX2NtYXAoJmZiX2luZm8uY21hcCk7CisJY2hpcGZyZWUoKTsKKwlyZWxlYXNlX21lbV9yZWdpb24oQ1VTVE9NX1BIWVNBRERSKzB4ZTAsIDB4MTIwKTsKKwljdXN0b20uZG1hY29uID0gRE1BRl9BTEwgfCBETUFGX01BU1RFUjsKK30KKworCisJLyoKKwkgKiBCbGFuayB0aGUgZGlzcGxheS4KKwkgKi8KKworc3RhdGljIGludCBhbWlmYl9ibGFuayhpbnQgYmxhbmssIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCWRvX2JsYW5rID0gYmxhbmsgPyBibGFuayA6IC0xOworCisJcmV0dXJuIDA7Cit9CisKKwkvKgorCSAqIEZsYXNoIHRoZSBjdXJzb3IgKGNhbGxlZCBieSBWQmxhbmsgaW50ZXJydXB0KQorCSAqLworCitzdGF0aWMgaW50IGZsYXNoX2N1cnNvcih2b2lkKQoreworCXN0YXRpYyBpbnQgY3Vyc29yY291bnQgPSAxOworCisJaWYgKGN1cnNvcm1vZGUgPT0gRkJfQ1VSU09SX0ZMQVNIKSB7CisJCWlmICghLS1jdXJzb3Jjb3VudCkgeworCQkJY3Vyc29yc3RhdGUgPSAtY3Vyc29yc3RhdGU7CisJCQljdXJzb3Jjb3VudCA9IGN1cnNvcnJhdGU7CisJCQlpZiAoIWlzX2JsYW5rZWQpCisJCQkJcmV0dXJuIDE7CisJCX0KKwl9CisJcmV0dXJuIDA7Cit9CisKKwkvKgorCSAqIFZCbGFuayBEaXNwbGF5IEludGVycnVwdAorCSAqLworCitzdGF0aWMgaXJxcmV0dXJuX3QgYW1pZmJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKQoreworCWlmIChkb192bW9kZV9wYW4gfHwgZG9fdm1vZGVfZnVsbCkKKwkJYW1pX3VwZGF0ZV9kaXNwbGF5KCk7CisKKwlpZiAoZG9fdm1vZGVfZnVsbCkKKwkJYW1pX2luaXRfZGlzcGxheSgpOworCisJaWYgKGRvX3Ztb2RlX3BhbikgeworCQlmbGFzaF9jdXJzb3IoKTsKKwkJYW1pX3JlYnVpbGRfY29wcGVyKCk7CisJCWRvX2N1cnNvciA9IGRvX3Ztb2RlX3BhbiA9IDA7CisJfSBlbHNlIGlmIChkb19jdXJzb3IpIHsKKwkJZmxhc2hfY3Vyc29yKCk7CisJCWFtaV9zZXRfc3ByaXRlKCk7CisJCWRvX2N1cnNvciA9IDA7CisJfSBlbHNlIHsKKwkJaWYgKGZsYXNoX2N1cnNvcigpKQorCQkJYW1pX3NldF9zcHJpdGUoKTsKKwl9CisKKwlpZiAoZG9fYmxhbmspIHsKKwkJYW1pX2RvX2JsYW5rKCk7CisJCWRvX2JsYW5rID0gMDsKKwl9CisKKwlpZiAoZG9fdm1vZGVfZnVsbCkgeworCQlhbWlfcmVpbml0X2NvcHBlcigpOworCQlkb192bW9kZV9mdWxsID0gMDsKKwl9CisJcmV0dXJuIElSUV9IQU5ETEVEOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSGFyZHdhcmUgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwkvKgorCSAqIEdldCB0aGUgdmlkZW8gcGFyYW1zIG91dCBvZiBgdmFyJy4gSWYgYSB2YWx1ZSBkb2Vzbid0IGZpdCwgcm91bmQKKwkgKiBpdCB1cCwgaWYgaXQncyB0b28gYmlnLCByZXR1cm4gLUVJTlZBTC4KKwkgKi8KKworc3RhdGljIGludCBhbWlfZGVjb2RlX3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGFtaWZiX3BhciAqcGFyKQoreworCXVfc2hvcnQgY2xrX3NoaWZ0LCBsaW5lX3NoaWZ0OworCXVfbG9uZyBtYXhmZXRjaHN0b3AsIGZzdHJ0LCBmc2l6ZSwgZmNvbnN0LCB4cmVzX24sIHlyZXNfbjsKKwl1X2ludCBodG90YWwsIHZ0b3RhbDsKKworCS8qCisJICogRmluZCBhIG1hdGNoaW5nIFBpeGVsIENsb2NrCisJICovCisKKwlmb3IgKGNsa19zaGlmdCA9IFRBR19TSFJFUzsgY2xrX3NoaWZ0IDw9IFRBR19MT1JFUzsgY2xrX3NoaWZ0KyspCisJCWlmICh2YXItPnBpeGNsb2NrIDw9IHBpeGNsb2NrW2Nsa19zaGlmdF0pCisJCQlicmVhazsKKwlpZiAoY2xrX3NoaWZ0ID4gVEFHX0xPUkVTKSB7CisJCURQUklOVEsoInBpeGNsb2NrIHRvbyBoaWdoXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCXBhci0+Y2xrX3NoaWZ0ID0gY2xrX3NoaWZ0OworCisJLyoKKwkgKiBDaGVjayB0aGUgR2VvbWV0cnkgVmFsdWVzCisJICovCisKKwlpZiAoKHBhci0+eHJlcyA9IHZhci0+eHJlcykgPCA2NCkKKwkJcGFyLT54cmVzID0gNjQ7CisJaWYgKChwYXItPnlyZXMgPSB2YXItPnlyZXMpIDwgNjQpCisJCXBhci0+eXJlcyA9IDY0OworCWlmICgocGFyLT52eHJlcyA9IHZhci0+eHJlc192aXJ0dWFsKSA8IHBhci0+eHJlcykKKwkJcGFyLT52eHJlcyA9IHBhci0+eHJlczsKKwlpZiAoKHBhci0+dnlyZXMgPSB2YXItPnlyZXNfdmlydHVhbCkgPCBwYXItPnlyZXMpCisJCXBhci0+dnlyZXMgPSBwYXItPnlyZXM7CisKKwlwYXItPmJwcCA9IHZhci0+Yml0c19wZXJfcGl4ZWw7CisJaWYgKCF2YXItPm5vbnN0ZCkgeworCQlpZiAocGFyLT5icHAgPCAxKQorCQkJcGFyLT5icHAgPSAxOworCQlpZiAocGFyLT5icHAgPiBtYXhkZXB0aFtjbGtfc2hpZnRdKSB7CisJCQlpZiAocm91bmRfZG93bl9icHAgJiYgbWF4ZGVwdGhbY2xrX3NoaWZ0XSkKKwkJCQlwYXItPmJwcCA9IG1heGRlcHRoW2Nsa19zaGlmdF07CisJCQllbHNlIHsKKwkJCQlEUFJJTlRLKCJpbnZhbGlkIGJwcFxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKwl9IGVsc2UgaWYgKHZhci0+bm9uc3RkID09IEZCX05PTlNURF9IQU0pIHsKKwkJaWYgKHBhci0+YnBwIDwgNikKKwkJCXBhci0+YnBwID0gNjsKKwkJaWYgKHBhci0+YnBwICE9IDYpIHsKKwkJCWlmIChwYXItPmJwcCA8IDgpCisJCQkJcGFyLT5icHAgPSA4OworCQkJaWYgKHBhci0+YnBwICE9IDggfHwgIUlTX0FHQSkgeworCQkJCURQUklOVEsoImludmFsaWQgYnBwIGZvciBoYW0gbW9kZVxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQlEUFJJTlRLKCJ1bmtub3duIG5vbnN0ZCBtb2RlXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJLyoKKwkgKiBGQl9WTU9ERV9TTU9PVEhfWFBBTiB3aWxsIGJlIGNsZWFyZWQsIGlmIG9uZSBvZiB0aGUgZm9sbG9pbmcKKwkgKiBjaGVja3MgZmFpbGVkIGFuZCBzbW9vdGggc2Nyb2xsaW5nIGlzIG5vdCBwb3NzaWJsZQorCSAqLworCisJcGFyLT52bW9kZSA9IHZhci0+dm1vZGUgfCBGQl9WTU9ERV9TTU9PVEhfWFBBTjsKKwlzd2l0Y2ggKHBhci0+dm1vZGUgJiBGQl9WTU9ERV9NQVNLKSB7CisJCWNhc2UgRkJfVk1PREVfSU5URVJMQUNFRDoKKwkJCWxpbmVfc2hpZnQgPSAwOworCQkJYnJlYWs7CisJCWNhc2UgRkJfVk1PREVfTk9OSU5URVJMQUNFRDoKKwkJCWxpbmVfc2hpZnQgPSAxOworCQkJYnJlYWs7CisJCWNhc2UgRkJfVk1PREVfRE9VQkxFOgorCQkJaWYgKCFJU19BR0EpIHsKKwkJCQlEUFJJTlRLKCJkb3VibGUgbW9kZSBvbmx5IHBvc3NpYmxlIHdpdGggYWdhXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWxpbmVfc2hpZnQgPSAyOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlEUFJJTlRLKCJ1bmtub3duIHZpZGVvIG1vZGVcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCQlicmVhazsKKwl9CisJcGFyLT5saW5lX3NoaWZ0ID0gbGluZV9zaGlmdDsKKworCS8qCisJICogVmVydGljYWwgYW5kIEhvcml6b250YWwgVGltaW5ncworCSAqLworCisJeHJlc19uID0gcGFyLT54cmVzPDxjbGtfc2hpZnQ7CisJeXJlc19uID0gcGFyLT55cmVzPDxsaW5lX3NoaWZ0OworCXBhci0+aHRvdGFsID0gZG93bjgoKHZhci0+bGVmdF9tYXJnaW4rcGFyLT54cmVzK3Zhci0+cmlnaHRfbWFyZ2luK3Zhci0+aHN5bmNfbGVuKTw8Y2xrX3NoaWZ0KTsKKwlwYXItPnZ0b3RhbCA9IGRvd24yKCgodmFyLT51cHBlcl9tYXJnaW4rcGFyLT55cmVzK3Zhci0+bG93ZXJfbWFyZ2luK3Zhci0+dnN5bmNfbGVuKTw8bGluZV9zaGlmdCkrMSk7CisKKwlpZiAoSVNfQUdBKQorCQlwYXItPmJwbGNvbjMgPSBzcHJwaXhtb2RlW2Nsa19zaGlmdF07CisJZWxzZQorCQlwYXItPmJwbGNvbjMgPSAwOworCWlmICh2YXItPnN5bmMgJiBGQl9TWU5DX0JST0FEQ0FTVCkgeworCQlwYXItPmRpd3N0b3BfaCA9IHBhci0+aHRvdGFsLSgodmFyLT5yaWdodF9tYXJnaW4tdmFyLT5oc3luY19sZW4pPDxjbGtfc2hpZnQpOworCQlpZiAoSVNfQUdBKQorCQkJcGFyLT5kaXdzdG9wX2ggKz0gbW9kNCh2YXItPmhzeW5jX2xlbik7CisJCWVsc2UKKwkJCXBhci0+ZGl3c3RvcF9oID0gZG93bjQocGFyLT5kaXdzdG9wX2gpOworCisJCXBhci0+ZGl3c3RydF9oID0gcGFyLT5kaXdzdG9wX2ggLSB4cmVzX247CisJCXBhci0+ZGl3c3RvcF92ID0gcGFyLT52dG90YWwtKCh2YXItPmxvd2VyX21hcmdpbi12YXItPnZzeW5jX2xlbik8PGxpbmVfc2hpZnQpOworCQlwYXItPmRpd3N0cnRfdiA9IHBhci0+ZGl3c3RvcF92IC0geXJlc19uOworCQlpZiAocGFyLT5kaXdzdG9wX2ggPj0gcGFyLT5odG90YWwrOCkgeworCQkJRFBSSU5USygiaW52YWxpZCBkaXdzdG9wX2hcbiIpOworCQkJcmV0dXJuIC1FSU5WQUw7CisJCX0KKwkJaWYgKHBhci0+ZGl3c3RvcF92ID4gcGFyLT52dG90YWwpIHsKKwkJCURQUklOVEsoImludmFsaWQgZGl3c3RvcF92XG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisKKwkJaWYgKCFJU19PQ1MpIHsKKwkJCS8qIEluaXRpYWxpemUgc3luYyB3aXRoIHNvbWUgcmVhc29uYWJsZSB2YWx1ZXMgZm9yIHB3cnNhdmUgKi8KKwkJCXBhci0+aHNzdHJ0ID0gMTYwOworCQkJcGFyLT5oc3N0b3AgPSAzMjA7CisJCQlwYXItPnZzc3RydCA9IDMwOworCQkJcGFyLT52c3N0b3AgPSAzNDsKKwkJfSBlbHNlIHsKKwkJCXBhci0+aHNzdHJ0ID0gMDsKKwkJCXBhci0+aHNzdG9wID0gMDsKKwkJCXBhci0+dnNzdHJ0ID0gMDsKKwkJCXBhci0+dnNzdG9wID0gMDsKKwkJfQorCQlpZiAocGFyLT52dG90YWwgPiAoUEFMX1ZUT1RBTCtOVFNDX1ZUT1RBTCkvMikgeworCQkJLyogUEFMIHZpZGVvIG1vZGUgKi8KKwkJCWlmIChwYXItPmh0b3RhbCAhPSBQQUxfSFRPVEFMKSB7CisJCQkJRFBSSU5USygiaHRvdGFsIGludmFsaWQgZm9yIHBhbFxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlpZiAocGFyLT5kaXdzdHJ0X2ggPCBQQUxfRElXU1RSVF9IKSB7CisJCQkJRFBSSU5USygiZGl3c3RydF9oIHRvbyBsb3cgZm9yIHBhbFxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlpZiAocGFyLT5kaXdzdHJ0X3YgPCBQQUxfRElXU1RSVF9WKSB7CisJCQkJRFBSSU5USygiZGl3c3RydF92IHRvbyBsb3cgZm9yIHBhbFxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlodG90YWwgPSBQQUxfSFRPVEFMPj5jbGtfc2hpZnQ7CisJCQl2dG90YWwgPSBQQUxfVlRPVEFMPj4xOworCQkJaWYgKCFJU19PQ1MpIHsKKwkJCQlwYXItPmJlYW1jb24wID0gQk1DMF9QQUw7CisJCQkJcGFyLT5icGxjb24zIHw9IEJQQzNfQlJEUkJMTks7CisJCQl9IGVsc2UgaWYgKEFNSUdBSFdfUFJFU0VOVChBR05VU19IUl9QQUwpIHx8CisJCQkgICAgICAgICAgIEFNSUdBSFdfUFJFU0VOVChBR05VU19IUl9OVFNDKSkgeworCQkJCXBhci0+YmVhbWNvbjAgPSBCTUMwX1BBTDsKKwkJCQlwYXItPmhzc3RvcCA9IDE7CisJCQl9IGVsc2UgaWYgKGFtaWdhX3ZibGFuayAhPSA1MCkgeworCQkJCURQUklOVEsoInBhbCBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgY2hpcHNldFxuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCX0gZWxzZSB7CisJCQkvKiBOVFNDIHZpZGVvIG1vZGUKKwkJCSAqIEluIHRoZSBBR0EgY2hpcHNldCBzZWVtcyB0byBiZSBoYXJkd2FyZSBidWcgd2l0aCBCUEMzX0JSRFJCTE5LCisJCQkgKiBhbmQgTlRTQyBhY3RpdmF0ZWQsIHNvIHRoYW4gYmV0dGVyIGxldCBkaXdzdG9wX2ggPD0gMTgxMgorCQkJICovCisJCQlpZiAocGFyLT5odG90YWwgIT0gTlRTQ19IVE9UQUwpIHsKKwkJCQlEUFJJTlRLKCJodG90YWwgaW52YWxpZCBmb3IgbnRzY1xuIik7CisJCQkJcmV0dXJuIC1FSU5WQUw7CisJCQl9CisJCQlpZiAocGFyLT5kaXdzdHJ0X2ggPCBOVFNDX0RJV1NUUlRfSCkgeworCQkJCURQUklOVEsoImRpd3N0cnRfaCB0b28gbG93IGZvciBudHNjXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJCWlmIChwYXItPmRpd3N0cnRfdiA8IE5UU0NfRElXU1RSVF9WKSB7CisJCQkJRFBSSU5USygiZGl3c3RydF92IHRvbyBsb3cgZm9yIG50c2NcbiIpOworCQkJCXJldHVybiAtRUlOVkFMOworCQkJfQorCQkJaHRvdGFsID0gTlRTQ19IVE9UQUw+PmNsa19zaGlmdDsKKwkJCXZ0b3RhbCA9IE5UU0NfVlRPVEFMPj4xOworCQkJaWYgKCFJU19PQ1MpIHsKKwkJCQlwYXItPmJlYW1jb24wID0gMDsKKwkJCQlwYXItPmJwbGNvbjMgfD0gQlBDM19CUkRSQkxOSzsKKwkJCX0gZWxzZSBpZiAoQU1JR0FIV19QUkVTRU5UKEFHTlVTX0hSX1BBTCkgfHwKKwkJCSAgICAgICAgICAgQU1JR0FIV19QUkVTRU5UKEFHTlVTX0hSX05UU0MpKSB7CisJCQkJcGFyLT5iZWFtY29uMCA9IDA7CisJCQkJcGFyLT5oc3N0b3AgPSAxOworCQkJfSBlbHNlIGlmIChhbWlnYV92YmxhbmsgIT0gNjApIHsKKwkJCQlEUFJJTlRLKCJudHNjIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBjaGlwc2V0XG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCQlpZiAoSVNfT0NTKSB7CisJCQlpZiAocGFyLT5kaXdzdHJ0X2ggPj0gMTAyNCB8fCBwYXItPmRpd3N0b3BfaCA8IDEwMjQgfHwKKwkJCSAgICBwYXItPmRpd3N0cnRfdiA+PSAgNTEyIHx8IHBhci0+ZGl3c3RvcF92IDwgIDI1NikgeworCQkJCURQUklOVEsoImludmFsaWQgcG9zaXRpb24gZm9yIGRpc3BsYXkgb24gb2NzXG4iKTsKKwkJCQlyZXR1cm4gLUVJTlZBTDsKKwkJCX0KKwkJfQorCX0gZWxzZSBpZiAoIUlTX09DUykgeworCQkvKiBQcm9ncmFtbWFibGUgdmlkZW8gbW9kZSAqLworCQlwYXItPmhzc3RydCA9IHZhci0+cmlnaHRfbWFyZ2luPDxjbGtfc2hpZnQ7CisJCXBhci0+aHNzdG9wID0gKHZhci0+cmlnaHRfbWFyZ2luK3Zhci0+aHN5bmNfbGVuKTw8Y2xrX3NoaWZ0OworCQlwYXItPmRpd3N0b3BfaCA9IHBhci0+aHRvdGFsIC0gbW9kOChwYXItPmhzc3RydCkgKyA4IC0gKDEgPDwgY2xrX3NoaWZ0KTsKKwkJaWYgKCFJU19BR0EpCisJCQlwYXItPmRpd3N0b3BfaCA9IGRvd240KHBhci0+ZGl3c3RvcF9oKSAtIDE2OworCQlwYXItPmRpd3N0cnRfaCA9IHBhci0+ZGl3c3RvcF9oIC0geHJlc19uOworCQlwYXItPmhic3RvcCA9IHBhci0+ZGl3c3RydF9oICsgNDsKKwkJcGFyLT5oYnN0cnQgPSBwYXItPmRpd3N0b3BfaCArIDQ7CisJCWlmIChwYXItPmhic3RydCA+PSBwYXItPmh0b3RhbCArIDgpCisJCQlwYXItPmhic3RydCAtPSBwYXItPmh0b3RhbDsKKwkJcGFyLT5oY2VudGVyID0gcGFyLT5oc3N0cnQgKyAocGFyLT5odG90YWwgPj4gMSk7CisJCXBhci0+dnNzdHJ0ID0gdmFyLT5sb3dlcl9tYXJnaW48PGxpbmVfc2hpZnQ7CisJCXBhci0+dnNzdG9wID0gKHZhci0+bG93ZXJfbWFyZ2luK3Zhci0+dnN5bmNfbGVuKTw8bGluZV9zaGlmdDsKKwkJcGFyLT5kaXdzdG9wX3YgPSBwYXItPnZ0b3RhbDsKKwkJaWYgKChwYXItPnZtb2RlICYgRkJfVk1PREVfTUFTSykgPT0gRkJfVk1PREVfSU5URVJMQUNFRCkKKwkJCXBhci0+ZGl3c3RvcF92IC09IDI7CisJCXBhci0+ZGl3c3RydF92ID0gcGFyLT5kaXdzdG9wX3YgLSB5cmVzX247CisJCXBhci0+dmJzdG9wID0gcGFyLT5kaXdzdHJ0X3YgLSAyOworCQlwYXItPnZic3RydCA9IHBhci0+ZGl3c3RvcF92IC0gMjsKKwkJaWYgKHBhci0+dnRvdGFsID4gMjA0OCkgeworCQkJRFBSSU5USygidnRvdGFsIHRvbyBoaWdoXG4iKTsKKwkJCXJldHVybiAtRUlOVkFMOworCQl9CisJCWlmIChwYXItPmh0b3RhbCA+IDIwNDgpIHsKKwkJCURQUklOVEsoImh0b3RhbCB0b28gaGlnaFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCQlwYXItPmJwbGNvbjMgfD0gQlBDM19FWFRCTEtFTjsKKwkJcGFyLT5iZWFtY29uMCA9IEJNQzBfSEFSRERJUyB8IEJNQzBfVkFSVkJFTiB8IEJNQzBfTE9MRElTIHwKKwkJICAgICAgICAgICAgICAgIEJNQzBfVkFSVlNZRU4gfCBCTUMwX1ZBUkhTWUVOIHwgQk1DMF9WQVJCRUFNRU4gfAorCQkgICAgICAgICAgICAgICAgQk1DMF9QQUwgfCBCTUMwX1ZBUkNTWUVOOworCQlpZiAodmFyLT5zeW5jICYgRkJfU1lOQ19IT1JfSElHSF9BQ1QpCisJCQlwYXItPmJlYW1jb24wIHw9IEJNQzBfSFNZVFJVRTsKKwkJaWYgKHZhci0+c3luYyAmIEZCX1NZTkNfVkVSVF9ISUdIX0FDVCkKKwkJCXBhci0+YmVhbWNvbjAgfD0gQk1DMF9WU1lUUlVFOworCQlpZiAodmFyLT5zeW5jICYgRkJfU1lOQ19DT01QX0hJR0hfQUNUKQorCQkJcGFyLT5iZWFtY29uMCB8PSBCTUMwX0NTWVRSVUU7CisJCWh0b3RhbCA9IHBhci0+aHRvdGFsPj5jbGtfc2hpZnQ7CisJCXZ0b3RhbCA9IHBhci0+dnRvdGFsPj4xOworCX0gZWxzZSB7CisJCURQUklOVEsoIm9ubHkgYnJvYWRjYXN0IG1vZGVzIHBvc3NpYmxlIGZvciBvY3NcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisKKwkvKgorCSAqIENoZWNraW5nIHRoZSBETUEgdGltaW5nCisJICovCisKKwlmY29uc3QgPSAxNjw8bWF4Zm1vZGU8PGNsa19zaGlmdDsKKworCS8qCisJICogc21hbGxlc3Qgd2luZG93IHN0YXJ0IHZhbHVlIHdpdGhvdXQgdHVybiBvZmYgb3RoZXIgZG1hIGN5Y2xlcworCSAqIHRoYW4gc3ByaXRlMS03LCB1bmxlc3MgeW91IGNoYW5nZSBtaW5fZnN0cnQKKwkgKi8KKworCisJZnNpemUgPSAoKG1heGZtb2RlK2Nsa19zaGlmdCA8PSAxKSA/IGZjb25zdCA6IDY0KTsKKwlmc3RydCA9IGRvd254KGZjb25zdCwgcGFyLT5kaXdzdHJ0X2gtNCkgLSBmc2l6ZTsKKwlpZiAoZnN0cnQgPCBtaW5fZnN0cnQpIHsKKwkJRFBSSU5USygiZmV0Y2ggc3RhcnQgdG9vIGxvd1xuIik7CisJCXJldHVybiAtRUlOVkFMOworCX0KKworCS8qCisJICogc21hbGxlc3Qgd2luZG93IHN0YXJ0IHZhbHVlIHdoZXJlIHNtb290aCBzY3JvbGxpbmcgaXMgcG9zc2libGUKKwkgKi8KKworCWZzdHJ0ID0gZG93bngoZmNvbnN0LCBwYXItPmRpd3N0cnRfaC1mY29uc3QrKDE8PGNsa19zaGlmdCktNCkgLSBmc2l6ZTsKKwlpZiAoZnN0cnQgPCBtaW5fZnN0cnQpCisJCXBhci0+dm1vZGUgJj0gfkZCX1ZNT0RFX1NNT09USF9YUEFOOworCisJbWF4ZmV0Y2hzdG9wID0gZG93bjE2KHBhci0+aHRvdGFsIC0gODApOworCisJZnN0cnQgPSBkb3dueChmY29uc3QsIHBhci0+ZGl3c3RydF9oLTQpIC0gNjQgLSBmY29uc3Q7CisJZnNpemUgPSB1cHgoZmNvbnN0LCB4cmVzX24gKyBtb2R4KGZjb25zdCwgZG93bngoMTw8Y2xrX3NoaWZ0LCBwYXItPmRpd3N0cnRfaC00KSkpOworCWlmIChmc3RydCArIGZzaXplID4gbWF4ZmV0Y2hzdG9wKQorCQlwYXItPnZtb2RlICY9IH5GQl9WTU9ERV9TTU9PVEhfWFBBTjsKKworCWZzaXplID0gdXB4KGZjb25zdCwgeHJlc19uKTsKKwlpZiAoZnN0cnQgKyBmc2l6ZSA+IG1heGZldGNoc3RvcCkgeworCQlEUFJJTlRLKCJmZXRjaCBzdG9wIHRvbyBoaWdoXG4iKTsKKwkJcmV0dXJuIC1FSU5WQUw7CisJfQorCisJaWYgKG1heGZtb2RlICsgY2xrX3NoaWZ0IDw9IDEpIHsKKwkJZnNpemUgPSB1cDY0KHhyZXNfbiArIGZjb25zdCAtIDEpOworCQlpZiAobWluX2ZzdHJ0ICsgZnNpemUgLSA2NCA+IG1heGZldGNoc3RvcCkKKwkJCXBhci0+dm1vZGUgJj0gfkZCX1ZNT0RFX1NNT09USF9YUEFOOworCisJCWZzaXplID0gdXA2NCh4cmVzX24pOworCQlpZiAobWluX2ZzdHJ0ICsgZnNpemUgLSA2NCA+IG1heGZldGNoc3RvcCkgeworCQkJRFBSSU5USygiZmV0Y2ggc2l6ZSB0b28gaGlnaFxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCisJCWZzaXplIC09IDY0OworCX0gZWxzZQorCQlmc2l6ZSAtPSBmY29uc3Q7CisKKwkvKgorCSAqIENoZWNrIGlmIHRoZXJlIGlzIGVub3VnaCB0aW1lIHRvIHVwZGF0ZSB0aGUgYml0cGxhbmUgcG9pbnRlcnMgZm9yIHl3cmFwCisJICovCisKKwlpZiAocGFyLT5odG90YWwtZnNpemUtNjQgPCBwYXItPmJwcCo2NCkKKwkJcGFyLT52bW9kZSAmPSB+RkJfVk1PREVfWVdSQVA7CisKKwkvKgorCSAqIEJpdHBsYW5lIGNhbGN1bGF0aW9ucyBhbmQgY2hlY2sgdGhlIE1lbW9yeSBSZXF1aXJlbWVudHMKKwkgKi8KKworCWlmIChhbWlmYl9pbGJtKSB7CisJCXBhci0+bmV4dF9wbGFuZSA9IGRpdjgodXB4KDE2PDxtYXhmbW9kZSwgcGFyLT52eHJlcykpOworCQlwYXItPm5leHRfbGluZSA9IHBhci0+YnBwKnBhci0+bmV4dF9wbGFuZTsKKwkJaWYgKHBhci0+bmV4dF9saW5lICogcGFyLT52eXJlcyA+IGZiX2luZm8uZml4LnNtZW1fbGVuKSB7CisJCQlEUFJJTlRLKCJ0b28gZmV3IHZpZGVvIG1lbVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0gZWxzZSB7CisJCXBhci0+bmV4dF9saW5lID0gZGl2OCh1cHgoMTY8PG1heGZtb2RlLCBwYXItPnZ4cmVzKSk7CisJCXBhci0+bmV4dF9wbGFuZSA9IHBhci0+dnlyZXMqcGFyLT5uZXh0X2xpbmU7CisJCWlmIChwYXItPm5leHRfcGxhbmUgKiBwYXItPmJwcCA+IGZiX2luZm8uZml4LnNtZW1fbGVuKSB7CisJCQlEUFJJTlRLKCJ0b28gZmV3IHZpZGVvIG1lbVxuIik7CisJCQlyZXR1cm4gLUVJTlZBTDsKKwkJfQorCX0KKworCS8qCisJICogSGFyZHdhcmUgUmVnaXN0ZXIgVmFsdWVzCisJICovCisKKwlwYXItPmJwbGNvbjAgPSBCUEMwX0NPTE9SIHwgYnBscGl4bW9kZVtjbGtfc2hpZnRdOworCWlmICghSVNfT0NTKQorCQlwYXItPmJwbGNvbjAgfD0gQlBDMF9FQ1NFTkE7CisJaWYgKHBhci0+YnBwID09IDgpCisJCXBhci0+YnBsY29uMCB8PSBCUEMwX0JQVTM7CisJZWxzZQorCQlwYXItPmJwbGNvbjAgfD0gcGFyLT5icHA8PDEyOworCWlmICh2YXItPm5vbnN0ZCA9PSBGQl9OT05TVERfSEFNKQorCQlwYXItPmJwbGNvbjAgfD0gQlBDMF9IQU07CisJaWYgKHZhci0+c3luYyAmIEZCX1NZTkNfRVhUKQorCQlwYXItPmJwbGNvbjAgfD0gQlBDMF9FUlNZOworCisJaWYgKElTX0FHQSkKKwkJcGFyLT5mbW9kZSA9IGJwbGZldGNobW9kZVttYXhmbW9kZV07CisKKwlzd2l0Y2ggKHBhci0+dm1vZGUgJiBGQl9WTU9ERV9NQVNLKSB7CisJCWNhc2UgRkJfVk1PREVfSU5URVJMQUNFRDoKKwkJCXBhci0+YnBsY29uMCB8PSBCUEMwX0xBQ0U7CisJCQlicmVhazsKKwkJY2FzZSBGQl9WTU9ERV9ET1VCTEU6CisJCQlpZiAoSVNfQUdBKQorCQkJCXBhci0+Zm1vZGUgfD0gRk1PREVfU1NDQU4yIHwgRk1PREVfQlNDQU4yOworCQkJYnJlYWs7CisJfQorCisJaWYgKCEoKHBhci0+dm1vZGUgXiB2YXItPnZtb2RlKSAmIEZCX1ZNT0RFX1lXUkFQKSkgeworCQlwYXItPnhvZmZzZXQgPSB2YXItPnhvZmZzZXQ7CisJCXBhci0+eW9mZnNldCA9IHZhci0+eW9mZnNldDsKKwkJaWYgKHBhci0+dm1vZGUgJiBGQl9WTU9ERV9ZV1JBUCkgeworCQkJaWYgKHBhci0+eG9mZnNldCB8fCBwYXItPnlvZmZzZXQgPCAwIHx8IHBhci0+eW9mZnNldCA+PSBwYXItPnZ5cmVzKQorCQkJCXBhci0+eG9mZnNldCA9IHBhci0+eW9mZnNldCA9IDA7CisJCX0gZWxzZSB7CisJCQlpZiAocGFyLT54b2Zmc2V0IDwgMCB8fCBwYXItPnhvZmZzZXQgPiB1cHgoMTY8PG1heGZtb2RlLCBwYXItPnZ4cmVzLXBhci0+eHJlcykgfHwKKwkJCSAgICBwYXItPnlvZmZzZXQgPCAwIHx8IHBhci0+eW9mZnNldCA+IHBhci0+dnlyZXMtcGFyLT55cmVzKQorCQkJCXBhci0+eG9mZnNldCA9IHBhci0+eW9mZnNldCA9IDA7CisJCX0KKwl9IGVsc2UKKwkJcGFyLT54b2Zmc2V0ID0gcGFyLT55b2Zmc2V0ID0gMDsKKworCXBhci0+Y3Jzci5jcnNyX3ggPSBwYXItPmNyc3IuY3Jzcl95ID0gMDsKKwlwYXItPmNyc3Iuc3BvdF94ID0gcGFyLT5jcnNyLnNwb3RfeSA9IDA7CisJcGFyLT5jcnNyLmhlaWdodCA9IHBhci0+Y3Jzci53aWR0aCA9IDA7CisKKyNpZiAwCS8qIGZibW9uIG5vdCBkb25lLiAgdW5jb21tZW50IGZvciAyLjUueCAtYnJhZCAqLworCWlmICghZmJtb25fdmFsaWRfdGltaW5ncyhwaXhjbG9ja1tjbGtfc2hpZnRdLCBodG90YWwsIHZ0b3RhbCwKKwkJCQkgJmZiX2luZm8pKSB7CisJCURQUklOVEsoIm1vZGUgZG9lc24ndCBmaXQgZm9yIG1vbml0b3JcbiIpOworCQlyZXR1cm4gLUVJTlZBTDsKKwl9CisjZW5kaWYKKworCXJldHVybiAwOworfQorCisJLyoKKwkgKiBGaWxsIHRoZSBgdmFyJyBzdHJ1Y3R1cmUgYmFzZWQgb24gdGhlIHZhbHVlcyBpbiBgcGFyJyBhbmQgbWF5YmUKKwkgKiBvdGhlciB2YWx1ZXMgcmVhZCBvdXQgb2YgdGhlIGhhcmR3YXJlLgorCSAqLworCitzdGF0aWMgaW50IGFtaV9lbmNvZGVfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYW1pZmJfcGFyICpwYXIpCit7CisJdV9zaG9ydCBjbGtfc2hpZnQsIGxpbmVfc2hpZnQ7CisKKwltZW1zZXQodmFyLCAwLCBzaXplb2Yoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvKSk7CisKKwljbGtfc2hpZnQgPSBwYXItPmNsa19zaGlmdDsKKwlsaW5lX3NoaWZ0ID0gcGFyLT5saW5lX3NoaWZ0OworCisJdmFyLT54cmVzID0gcGFyLT54cmVzOworCXZhci0+eXJlcyA9IHBhci0+eXJlczsKKwl2YXItPnhyZXNfdmlydHVhbCA9IHBhci0+dnhyZXM7CisJdmFyLT55cmVzX3ZpcnR1YWwgPSBwYXItPnZ5cmVzOworCXZhci0+eG9mZnNldCA9IHBhci0+eG9mZnNldDsKKwl2YXItPnlvZmZzZXQgPSBwYXItPnlvZmZzZXQ7CisKKwl2YXItPmJpdHNfcGVyX3BpeGVsID0gcGFyLT5icHA7CisJdmFyLT5ncmF5c2NhbGUgPSAwOworCisJdmFyLT5yZWQub2Zmc2V0ID0gMDsKKwl2YXItPnJlZC5tc2JfcmlnaHQgPSAwOworCXZhci0+cmVkLmxlbmd0aCA9IHBhci0+YnBwOworCWlmIChwYXItPmJwbGNvbjAgJiBCUEMwX0hBTSkKKwkgICAgdmFyLT5yZWQubGVuZ3RoIC09IDI7CisJdmFyLT5ibHVlID0gdmFyLT5ncmVlbiA9IHZhci0+cmVkOworCXZhci0+dHJhbnNwLm9mZnNldCA9IDA7CisJdmFyLT50cmFuc3AubGVuZ3RoID0gMDsKKwl2YXItPnRyYW5zcC5tc2JfcmlnaHQgPSAwOworCisJaWYgKHBhci0+YnBsY29uMCAmIEJQQzBfSEFNKQorCQl2YXItPm5vbnN0ZCA9IEZCX05PTlNURF9IQU07CisJZWxzZQorCQl2YXItPm5vbnN0ZCA9IDA7CisJdmFyLT5hY3RpdmF0ZSA9IDA7CisKKwl2YXItPmhlaWdodCA9IC0xOworCXZhci0+d2lkdGggPSAtMTsKKworCXZhci0+cGl4Y2xvY2sgPSBwaXhjbG9ja1tjbGtfc2hpZnRdOworCisJaWYgKElTX0FHQSAmJiBwYXItPmZtb2RlICYgRk1PREVfQlNDQU4yKQorCQl2YXItPnZtb2RlID0gRkJfVk1PREVfRE9VQkxFOworCWVsc2UgaWYgKHBhci0+YnBsY29uMCAmIEJQQzBfTEFDRSkKKwkJdmFyLT52bW9kZSA9IEZCX1ZNT0RFX0lOVEVSTEFDRUQ7CisJZWxzZQorCQl2YXItPnZtb2RlID0gRkJfVk1PREVfTk9OSU5URVJMQUNFRDsKKworCWlmICghSVNfT0NTICYmIHBhci0+YmVhbWNvbjAgJiBCTUMwX1ZBUkJFQU1FTikgeworCQl2YXItPmhzeW5jX2xlbiA9IChwYXItPmhzc3RvcC1wYXItPmhzc3RydCk+PmNsa19zaGlmdDsKKwkJdmFyLT5yaWdodF9tYXJnaW4gPSBwYXItPmhzc3RydD4+Y2xrX3NoaWZ0OworCQl2YXItPmxlZnRfbWFyZ2luID0gKHBhci0+aHRvdGFsPj5jbGtfc2hpZnQpIC0gdmFyLT54cmVzIC0gdmFyLT5yaWdodF9tYXJnaW4gLSB2YXItPmhzeW5jX2xlbjsKKwkJdmFyLT52c3luY19sZW4gPSAocGFyLT52c3N0b3AtcGFyLT52c3N0cnQpPj5saW5lX3NoaWZ0OworCQl2YXItPmxvd2VyX21hcmdpbiA9IHBhci0+dnNzdHJ0Pj5saW5lX3NoaWZ0OworCQl2YXItPnVwcGVyX21hcmdpbiA9IChwYXItPnZ0b3RhbD4+bGluZV9zaGlmdCkgLSB2YXItPnlyZXMgLSB2YXItPmxvd2VyX21hcmdpbiAtIHZhci0+dnN5bmNfbGVuOworCQl2YXItPnN5bmMgPSAwOworCQlpZiAocGFyLT5iZWFtY29uMCAmIEJNQzBfSFNZVFJVRSkKKwkJCXZhci0+c3luYyB8PSBGQl9TWU5DX0hPUl9ISUdIX0FDVDsKKwkJaWYgKHBhci0+YmVhbWNvbjAgJiBCTUMwX1ZTWVRSVUUpCisJCQl2YXItPnN5bmMgfD0gRkJfU1lOQ19WRVJUX0hJR0hfQUNUOworCQlpZiAocGFyLT5iZWFtY29uMCAmIEJNQzBfQ1NZVFJVRSkKKwkJCXZhci0+c3luYyB8PSBGQl9TWU5DX0NPTVBfSElHSF9BQ1Q7CisJfSBlbHNlIHsKKwkJdmFyLT5zeW5jID0gRkJfU1lOQ19CUk9BRENBU1Q7CisJCXZhci0+aHN5bmNfbGVuID0gKDE1Mj4+Y2xrX3NoaWZ0KSArIG1vZDQocGFyLT5kaXdzdG9wX2gpOworCQl2YXItPnJpZ2h0X21hcmdpbiA9ICgocGFyLT5odG90YWwgLSBkb3duNChwYXItPmRpd3N0b3BfaCkpPj5jbGtfc2hpZnQpICsgdmFyLT5oc3luY19sZW47CisJCXZhci0+bGVmdF9tYXJnaW4gPSAocGFyLT5odG90YWw+PmNsa19zaGlmdCkgLSB2YXItPnhyZXMgLSB2YXItPnJpZ2h0X21hcmdpbiAtIHZhci0+aHN5bmNfbGVuOworCQl2YXItPnZzeW5jX2xlbiA9IDQ+PmxpbmVfc2hpZnQ7CisJCXZhci0+bG93ZXJfbWFyZ2luID0gKChwYXItPnZ0b3RhbCAtIHBhci0+ZGl3c3RvcF92KT4+bGluZV9zaGlmdCkgKyB2YXItPnZzeW5jX2xlbjsKKwkJdmFyLT51cHBlcl9tYXJnaW4gPSAoKChwYXItPnZ0b3RhbCAtIDIpPj5saW5lX3NoaWZ0KSArIDEpIC0gdmFyLT55cmVzIC0KKwkJICAgICAgICAgICAgICAgICAgICB2YXItPmxvd2VyX21hcmdpbiAtIHZhci0+dnN5bmNfbGVuOworCX0KKworCWlmIChwYXItPmJwbGNvbjAgJiBCUEMwX0VSU1kpCisJCXZhci0+c3luYyB8PSBGQl9TWU5DX0VYVDsKKwlpZiAocGFyLT52bW9kZSAmIEZCX1ZNT0RFX1lXUkFQKQorCQl2YXItPnZtb2RlIHw9IEZCX1ZNT0RFX1lXUkFQOworCisJcmV0dXJuIDA7Cit9CisKKworCS8qCisJICogUGFuIG9yIFdyYXAgdGhlIERpc3BsYXkKKwkgKgorCSAqIFRoaXMgY2FsbCBsb29rcyBvbmx5IGF0IHhvZmZzZXQsIHlvZmZzZXQgYW5kIHRoZSBGQl9WTU9ERV9ZV1JBUCBmbGFnCisJICogaW4gYHZhcicuCisJICovCisKK3N0YXRpYyB2b2lkIGFtaV9wYW5fdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKQoreworCXN0cnVjdCBhbWlmYl9wYXIgKnBhciA9ICZjdXJyZW50cGFyOworCisJcGFyLT54b2Zmc2V0ID0gdmFyLT54b2Zmc2V0OworCXBhci0+eW9mZnNldCA9IHZhci0+eW9mZnNldDsKKwlpZiAodmFyLT52bW9kZSAmIEZCX1ZNT0RFX1lXUkFQKQorCQlwYXItPnZtb2RlIHw9IEZCX1ZNT0RFX1lXUkFQOworCWVsc2UKKwkJcGFyLT52bW9kZSAmPSB+RkJfVk1PREVfWVdSQVA7CisKKwlkb192bW9kZV9wYW4gPSAwOworCWFtaV91cGRhdGVfcGFyKCk7CisJZG9fdm1vZGVfcGFuID0gMTsKK30KKworCS8qCisJICogVXBkYXRlIGhhcmR3YXJlCisJICovCisKK3N0YXRpYyBpbnQgYW1pX3VwZGF0ZV9wYXIodm9pZCkKK3sKKwlzdHJ1Y3QgYW1pZmJfcGFyICpwYXIgPSAmY3VycmVudHBhcjsKKwlzaG9ydCBjbGtfc2hpZnQsIHZzaGlmdCwgZnN0cnQsIGZzaXplLCBmc3RvcCwgZmNvbnN0LCAgc2hpZnQsIG1vdmUsIG1vZDsKKworCWNsa19zaGlmdCA9IHBhci0+Y2xrX3NoaWZ0OworCisJaWYgKCEocGFyLT52bW9kZSAmIEZCX1ZNT0RFX1NNT09USF9YUEFOKSkKKwkJcGFyLT54b2Zmc2V0ID0gdXB4KDE2PDxtYXhmbW9kZSwgcGFyLT54b2Zmc2V0KTsKKworCWZjb25zdCA9IDE2PDxtYXhmbW9kZTw8Y2xrX3NoaWZ0OworCXZzaGlmdCA9IG1vZHgoMTY8PG1heGZtb2RlLCBwYXItPnhvZmZzZXQpOworCWZzdHJ0ID0gcGFyLT5kaXdzdHJ0X2ggLSAodnNoaWZ0PDxjbGtfc2hpZnQpIC0gNDsKKwlmc2l6ZSA9IChwYXItPnhyZXMrdnNoaWZ0KTw8Y2xrX3NoaWZ0OworCXNoaWZ0ID0gbW9keChmY29uc3QsIGZzdHJ0KTsKKwltb3ZlID0gZG93bngoMjw8bWF4Zm1vZGUsIGRpdjgocGFyLT54b2Zmc2V0KSk7CisJaWYgKG1heGZtb2RlICsgY2xrX3NoaWZ0ID4gMSkgeworCQlmc3RydCA9IGRvd254KGZjb25zdCwgZnN0cnQpIC0gNjQ7CisJCWZzaXplID0gdXB4KGZjb25zdCwgZnNpemUpOworCQlmc3RvcCA9IGZzdHJ0ICsgZnNpemUgLSBmY29uc3Q7CisJfSBlbHNlIHsKKwkJbW9kID0gZnN0cnQgPSBkb3dueChmY29uc3QsIGZzdHJ0KSAtIGZjb25zdDsKKwkJZnN0b3AgPSBmc3RydCArIHVweChmY29uc3QsIGZzaXplKSAtIDY0OworCQlmc2l6ZSA9IHVwNjQoZnNpemUpOworCQlmc3RydCA9IGZzdG9wIC0gZnNpemUgKyA2NDsKKwkJaWYgKGZzdHJ0IDwgbWluX2ZzdHJ0KSB7CisJCQlmc3RvcCArPSBtaW5fZnN0cnQgLSBmc3RydDsKKwkJCWZzdHJ0ID0gbWluX2ZzdHJ0OworCQl9CisJCW1vdmUgPSBtb3ZlIC0gZGl2OCgobW9kLWZzdHJ0KT4+Y2xrX3NoaWZ0KTsKKwl9CisJbW9kID0gcGFyLT5uZXh0X2xpbmUgLSBkaXY4KGZzaXplPj5jbGtfc2hpZnQpOworCXBhci0+ZGRmc3RydCA9IGZzdHJ0OworCXBhci0+ZGRmc3RvcCA9IGZzdG9wOworCXBhci0+YnBsY29uMSA9IGhzY3JvbGwyaHcoc2hpZnQpOworCXBhci0+YnBsMm1vZCA9IG1vZDsKKwlpZiAocGFyLT5icGxjb24wICYgQlBDMF9MQUNFKQorCQlwYXItPmJwbDJtb2QgKz0gcGFyLT5uZXh0X2xpbmU7CisJaWYgKElTX0FHQSAmJiAocGFyLT5mbW9kZSAmIEZNT0RFX0JTQ0FOMikpCisJCXBhci0+YnBsMW1vZCA9IC1kaXY4KGZzaXplPj5jbGtfc2hpZnQpOworCWVsc2UKKwkJcGFyLT5icGwxbW9kID0gcGFyLT5icGwybW9kOworCisJaWYgKHBhci0+eW9mZnNldCkgeworCQlwYXItPmJwbHB0MCA9IGZiX2luZm8uZml4LnNtZW1fc3RhcnQgKyBwYXItPm5leHRfbGluZSpwYXItPnlvZmZzZXQgKyBtb3ZlOworCQlpZiAocGFyLT52bW9kZSAmIEZCX1ZNT0RFX1lXUkFQKSB7CisJCQlpZiAocGFyLT55b2Zmc2V0ID4gcGFyLT52eXJlcy1wYXItPnlyZXMpIHsKKwkJCQlwYXItPmJwbHB0MHdyYXAgPSBmYl9pbmZvLmZpeC5zbWVtX3N0YXJ0ICsgbW92ZTsKKwkJCQlpZiAocGFyLT5icGxjb24wICYgQlBDMF9MQUNFICYmIG1vZDIocGFyLT5kaXdzdHJ0X3YrcGFyLT52eXJlcy1wYXItPnlvZmZzZXQpKQorCQkJCQlwYXItPmJwbHB0MHdyYXAgKz0gcGFyLT5uZXh0X2xpbmU7CisJCQl9CisJCX0KKwl9IGVsc2UKKwkJcGFyLT5icGxwdDAgPSBmYl9pbmZvLmZpeC5zbWVtX3N0YXJ0ICsgbW92ZTsKKworCWlmIChwYXItPmJwbGNvbjAgJiBCUEMwX0xBQ0UgJiYgbW9kMihwYXItPmRpd3N0cnRfdikpCisJCXBhci0+YnBscHQwICs9IHBhci0+bmV4dF9saW5lOworCisJcmV0dXJuIDA7Cit9CisKKworCS8qCisJICogU2V0IGEgc2luZ2xlIGNvbG9yIHJlZ2lzdGVyLiBUaGUgdmFsdWVzIHN1cHBsaWVkIGFyZSBhbHJlYWR5CisJICogcm91bmRlZCBkb3duIHRvIHRoZSBoYXJkd2FyZSdzIGNhcGFiaWxpdGllcyAoYWNjb3JkaW5nIHRvIHRoZQorCSAqIGVudHJpZXMgaW4gdGhlIHZhciBzdHJ1Y3R1cmUpLiBSZXR1cm4gIT0gMCBmb3IgaW52YWxpZCByZWduby4KKwkgKi8KKworc3RhdGljIGludCBhbWlmYl9zZXRjb2xyZWcodV9pbnQgcmVnbm8sIHVfaW50IHJlZCwgdV9pbnQgZ3JlZW4sIHVfaW50IGJsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1X2ludCB0cmFuc3AsIHN0cnVjdCBmYl9pbmZvICppbmZvKQoreworCWlmIChJU19BR0EpIHsKKwkJaWYgKHJlZ25vID4gMjU1KQorCQkJcmV0dXJuIDE7CisJfSBlbHNlIGlmIChjdXJyZW50cGFyLmJwbGNvbjAgJiBCUEMwX1NIUkVTKSB7CisJCWlmIChyZWdubyA+IDMpCisJCQlyZXR1cm4gMTsKKwl9IGVsc2UgeworCQlpZiAocmVnbm8gPiAzMSkKKwkJCXJldHVybiAxOworCX0KKwlyZWQgPj49IDg7CisJZ3JlZW4gPj49IDg7CisJYmx1ZSA+Pj0gODsKKwlpZiAoIXJlZ25vKSB7CisJCXJlZDAgPSByZWQ7CisJCWdyZWVuMCA9IGdyZWVuOworCQlibHVlMCA9IGJsdWU7CisJfQorCisJLyoKKwkgKiBVcGRhdGUgdGhlIGNvcnJlc3BvbmRpbmcgSGFyZHdhcmUgQ29sb3IgUmVnaXN0ZXIsIHVubGVzcyBpdCdzIENvbG9yCisJICogUmVnaXN0ZXIgMCBhbmQgdGhlIHNjcmVlbiBpcyBibGFua2VkLgorCSAqCisJICogVkJsYW5rIGlzIHN3aXRjaGVkIG9mZiB0byBwcm90ZWN0IGJwbGNvbjMgb3IgZWNzX3BhbGV0dGVbXSBmcm9tCisJICogYmVpbmcgY2hhbmdlZCBieSBhbWlfZG9fYmxhbmsoKSBkdXJpbmcgdGhlIFZCbGFuay4KKwkgKi8KKworCWlmIChyZWdubyB8fCAhaXNfYmxhbmtlZCkgeworI2lmIGRlZmluZWQoQ09ORklHX0ZCX0FNSUdBX0FHQSkKKwkJaWYgKElTX0FHQSkgeworCQkJdV9zaG9ydCBicGxjb24zID0gY3VycmVudHBhci5icGxjb24zOworCQkJVkJsYW5rT2ZmKCk7CisJCQljdXN0b20uYnBsY29uMyA9IGJwbGNvbjMgfCAocmVnbm88PDggJiAweGUwMDApOworCQkJY3VzdG9tLmNvbG9yW3JlZ25vJjMxXSA9IHJnYjJodzhfaGlnaChyZWQsIGdyZWVuLCBibHVlKTsKKwkJCWN1c3RvbS5icGxjb24zID0gYnBsY29uMyB8IChyZWdubzw8OCAmIDB4ZTAwMCkgfCBCUEMzX0xPQ1Q7CisJCQljdXN0b20uY29sb3JbcmVnbm8mMzFdID0gcmdiMmh3OF9sb3cocmVkLCBncmVlbiwgYmx1ZSk7CisJCQljdXN0b20uYnBsY29uMyA9IGJwbGNvbjM7CisJCQlWQmxhbmtPbigpOworCQl9IGVsc2UKKyNlbmRpZgorI2lmIGRlZmluZWQoQ09ORklHX0ZCX0FNSUdBX0VDUykKKwkJaWYgKGN1cnJlbnRwYXIuYnBsY29uMCAmIEJQQzBfU0hSRVMpIHsKKwkJCXVfc2hvcnQgY29sb3IsIG1hc2s7CisJCQlpbnQgaTsKKworCQkJbWFzayA9IDB4MzMzMzsKKwkJCWNvbG9yID0gcmdiMmh3MihyZWQsIGdyZWVuLCBibHVlKTsKKwkJCVZCbGFua09mZigpOworCQkJZm9yIChpID0gcmVnbm8rMTI7IGkgPj0gKGludClyZWdubzsgaSAtPSA0KQorCQkJCWN1c3RvbS5jb2xvcltpXSA9IGVjc19wYWxldHRlW2ldID0gKGVjc19wYWxldHRlW2ldICYgbWFzaykgfCBjb2xvcjsKKwkJCW1hc2sgPDw9MjsgY29sb3IgPj49IDI7CisJCQlyZWdubyA9IGRvd24xNihyZWdubykrbXVsNChtb2Q0KHJlZ25vKSk7CisJCQlmb3IgKGkgPSByZWdubyszOyBpID49IChpbnQpcmVnbm87IGktLSkKKwkJCQljdXN0b20uY29sb3JbaV0gPSBlY3NfcGFsZXR0ZVtpXSA9IChlY3NfcGFsZXR0ZVtpXSAmIG1hc2spIHwgY29sb3I7CisJCQlWQmxhbmtPbigpOworCQl9IGVsc2UKKyNlbmRpZgorCQkJY3VzdG9tLmNvbG9yW3JlZ25vXSA9IHJnYjJodzQocmVkLCBncmVlbiwgYmx1ZSk7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgdm9pZCBhbWlfdXBkYXRlX2Rpc3BsYXkodm9pZCkKK3sKKwlzdHJ1Y3QgYW1pZmJfcGFyICpwYXIgPSAmY3VycmVudHBhcjsKKworCWN1c3RvbS5icGxjb24xID0gcGFyLT5icGxjb24xOworCWN1c3RvbS5icGwxbW9kID0gcGFyLT5icGwxbW9kOworCWN1c3RvbS5icGwybW9kID0gcGFyLT5icGwybW9kOworCWN1c3RvbS5kZGZzdHJ0ID0gZGRmc3RydDJodyhwYXItPmRkZnN0cnQpOworCWN1c3RvbS5kZGZzdG9wID0gZGRmc3RvcDJodyhwYXItPmRkZnN0b3ApOworfQorCisJLyoKKwkgKiBDaGFuZ2UgdGhlIHZpZGVvIG1vZGUgKGNhbGxlZCBieSBWQmxhbmsgaW50ZXJydXB0KQorCSAqLworCitzdGF0aWMgdm9pZCBhbWlfaW5pdF9kaXNwbGF5KHZvaWQpCit7CisJc3RydWN0IGFtaWZiX3BhciAqcGFyID0gJmN1cnJlbnRwYXI7CisJaW50IGk7CisKKwljdXN0b20uYnBsY29uMCA9IHBhci0+YnBsY29uMCAmIH5CUEMwX0xBQ0U7CisJY3VzdG9tLmJwbGNvbjIgPSAoSVNfT0NTID8gMCA6IEJQQzJfS0lMTEVIQikgfCBCUEMyX1BGMlAyIHwgQlBDMl9QRjFQMjsKKwlpZiAoIUlTX09DUykgeworCQljdXN0b20uYnBsY29uMyA9IHBhci0+YnBsY29uMzsKKwkJaWYgKElTX0FHQSkKKwkJCWN1c3RvbS5icGxjb240ID0gQlBDNF9FU1BSTTQgfCBCUEM0X09TUFJNNDsKKwkJaWYgKHBhci0+YmVhbWNvbjAgJiBCTUMwX1ZBUkJFQU1FTikgeworCQkJY3VzdG9tLmh0b3RhbCA9IGh0b3RhbDJodyhwYXItPmh0b3RhbCk7CisJCQljdXN0b20uaGJzdHJ0ID0gaGJzdHJ0Mmh3KHBhci0+aGJzdHJ0KTsKKwkJCWN1c3RvbS5oYnN0b3AgPSBoYnN0b3AyaHcocGFyLT5oYnN0b3ApOworCQkJY3VzdG9tLmhzc3RydCA9IGhzc3RydDJodyhwYXItPmhzc3RydCk7CisJCQljdXN0b20uaHNzdG9wID0gaHNzdG9wMmh3KHBhci0+aHNzdG9wKTsKKwkJCWN1c3RvbS5oY2VudGVyID0gaGNlbnRlcjJodyhwYXItPmhjZW50ZXIpOworCQkJY3VzdG9tLnZ0b3RhbCA9IHZ0b3RhbDJodyhwYXItPnZ0b3RhbCk7CisJCQljdXN0b20udmJzdHJ0ID0gdmJzdHJ0Mmh3KHBhci0+dmJzdHJ0KTsKKwkJCWN1c3RvbS52YnN0b3AgPSB2YnN0b3AyaHcocGFyLT52YnN0b3ApOworCQkJY3VzdG9tLnZzc3RydCA9IHZzc3RydDJodyhwYXItPnZzc3RydCk7CisJCQljdXN0b20udnNzdG9wID0gdnNzdG9wMmh3KHBhci0+dnNzdG9wKTsKKwkJfQorCX0KKwlpZiAoIUlTX09DUyB8fCBwYXItPmhzc3RvcCkKKwkJY3VzdG9tLmJlYW1jb24wID0gcGFyLT5iZWFtY29uMDsKKwlpZiAoSVNfQUdBKQorCQljdXN0b20uZm1vZGUgPSBwYXItPmZtb2RlOworCisJLyoKKwkgKiBUaGUgbWluaW11bSBwZXJpb2QgZm9yIGF1ZGlvIGRlcGVuZHMgb24gaHRvdGFsCisJICovCisKKwlhbWlnYV9hdWRpb19taW5fcGVyaW9kID0gZGl2MTYocGFyLT5odG90YWwpOworCisJaXNfbGFjZSA9IHBhci0+YnBsY29uMCAmIEJQQzBfTEFDRSA/IDEgOiAwOworI2lmIDEKKwlpZiAoaXNfbGFjZSkgeworCQlpID0gY3VzdG9tLnZwb3NyID4+IDE1OworCX0gZWxzZSB7CisJCWN1c3RvbS52cG9zdyA9IGN1c3RvbS52cG9zciB8IDB4ODAwMDsKKwkJaSA9IDE7CisJfQorI2Vsc2UKKwlpID0gMTsKKwljdXN0b20udnBvc3cgPSBjdXN0b20udnBvc3IgfCAweDgwMDA7CisjZW5kaWYKKwljdXN0b20uY29wMmxjID0gKHVfc2hvcnQgKilaVFdPX1BBRERSKGNvcGRpc3BsYXkubGlzdFtjdXJyZW50Y29wXVtpXSk7Cit9CisKKwkvKgorCSAqIChVbilCbGFuayB0aGUgc2NyZWVuIChjYWxsZWQgYnkgVkJsYW5rIGludGVycnVwdCkKKwkgKi8KKworc3RhdGljIHZvaWQgYW1pX2RvX2JsYW5rKHZvaWQpCit7CisJc3RydWN0IGFtaWZiX3BhciAqcGFyID0gJmN1cnJlbnRwYXI7CisjaWYgZGVmaW5lZChDT05GSUdfRkJfQU1JR0FfQUdBKQorCXVfc2hvcnQgYnBsY29uMyA9IHBhci0+YnBsY29uMzsKKyNlbmRpZgorCXVfY2hhciByZWQsIGdyZWVuLCBibHVlOworCisJaWYgKGRvX2JsYW5rID4gMCkgeworCQljdXN0b20uZG1hY29uID0gRE1BRl9SQVNURVIgfCBETUFGX1NQUklURTsKKwkJcmVkID0gZ3JlZW4gPSBibHVlID0gMDsKKwkJaWYgKCFJU19PQ1MgJiYgZG9fYmxhbmsgPiAxKSB7CisJCQlzd2l0Y2ggKGRvX2JsYW5rKSB7CisJCQkJY2FzZSBGQl9CTEFOS19WU1lOQ19TVVNQRU5EOgorCQkJCQljdXN0b20uaHNzdHJ0ID0gaHNzdHJ0Mmh3KHBhci0+aHNzdHJ0KTsKKwkJCQkJY3VzdG9tLmhzc3RvcCA9IGhzc3RvcDJodyhwYXItPmhzc3RvcCk7CisJCQkJCWN1c3RvbS52c3N0cnQgPSB2c3N0cnQyaHcocGFyLT52dG90YWwrNCk7CisJCQkJCWN1c3RvbS52c3N0b3AgPSB2c3N0b3AyaHcocGFyLT52dG90YWwrNCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRkJfQkxBTktfSFNZTkNfU1VTUEVORDoKKwkJCQkJY3VzdG9tLmhzc3RydCA9IGhzc3RydDJodyhwYXItPmh0b3RhbCsxNik7CisJCQkJCWN1c3RvbS5oc3N0b3AgPSBoc3N0b3AyaHcocGFyLT5odG90YWwrMTYpOworCQkJCQljdXN0b20udnNzdHJ0ID0gdnNzdHJ0Mmh3KHBhci0+dnNzdHJ0KTsKKwkJCQkJY3VzdG9tLnZzc3RvcCA9IHZzc3RydDJodyhwYXItPnZzc3RvcCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRkJfQkxBTktfUE9XRVJET1dOOgorCQkJCQljdXN0b20uaHNzdHJ0ID0gaHNzdHJ0Mmh3KHBhci0+aHRvdGFsKzE2KTsKKwkJCQkJY3VzdG9tLmhzc3RvcCA9IGhzc3RvcDJodyhwYXItPmh0b3RhbCsxNik7CisJCQkJCWN1c3RvbS52c3N0cnQgPSB2c3N0cnQyaHcocGFyLT52dG90YWwrNCk7CisJCQkJCWN1c3RvbS52c3N0b3AgPSB2c3N0b3AyaHcocGFyLT52dG90YWwrNCk7CisJCQkJCWJyZWFrOworCQkJfQorCQkJaWYgKCEocGFyLT5iZWFtY29uMCAmIEJNQzBfVkFSQkVBTUVOKSkgeworCQkJCWN1c3RvbS5odG90YWwgPSBodG90YWwyaHcocGFyLT5odG90YWwpOworCQkJCWN1c3RvbS52dG90YWwgPSB2dG90YWwyaHcocGFyLT52dG90YWwpOworCQkJCWN1c3RvbS5iZWFtY29uMCA9IEJNQzBfSEFSRERJUyB8IEJNQzBfVkFSQkVBTUVOIHwKKwkJCQkgICAgICAgICAgICAgICAgICBCTUMwX1ZBUlZTWUVOIHwgQk1DMF9WQVJIU1lFTiB8IEJNQzBfVkFSQ1NZRU47CisJCQl9CisJCX0KKwl9IGVsc2UgeworCQljdXN0b20uZG1hY29uID0gRE1BRl9TRVRDTFIgfCBETUFGX1JBU1RFUiB8IERNQUZfU1BSSVRFOworCQlyZWQgPSByZWQwOworCQlncmVlbiA9IGdyZWVuMDsKKwkJYmx1ZSA9IGJsdWUwOworCQlpZiAoIUlTX09DUykgeworCQkJY3VzdG9tLmhzc3RydCA9IGhzc3RydDJodyhwYXItPmhzc3RydCk7CisJCQljdXN0b20uaHNzdG9wID0gaHNzdG9wMmh3KHBhci0+aHNzdG9wKTsKKwkJCWN1c3RvbS52c3N0cnQgPSB2c3N0cnQyaHcocGFyLT52c3N0cnQpOworCQkJY3VzdG9tLnZzc3RvcCA9IHZzc3RvcDJodyhwYXItPnZzc3RvcCk7CisJCQljdXN0b20uYmVhbWNvbjAgPSBwYXItPmJlYW1jb24wOworCQl9CisJfQorI2lmIGRlZmluZWQoQ09ORklHX0ZCX0FNSUdBX0FHQSkKKwlpZiAoSVNfQUdBKSB7CisJCWN1c3RvbS5icGxjb24zID0gYnBsY29uMzsKKwkJY3VzdG9tLmNvbG9yWzBdID0gcmdiMmh3OF9oaWdoKHJlZCwgZ3JlZW4sIGJsdWUpOworCQljdXN0b20uYnBsY29uMyA9IGJwbGNvbjMgfCBCUEMzX0xPQ1Q7CisJCWN1c3RvbS5jb2xvclswXSA9IHJnYjJodzhfbG93KHJlZCwgZ3JlZW4sIGJsdWUpOworCQljdXN0b20uYnBsY29uMyA9IGJwbGNvbjM7CisJfSBlbHNlCisjZW5kaWYKKyNpZiBkZWZpbmVkKENPTkZJR19GQl9BTUlHQV9FQ1MpCisJaWYgKHBhci0+YnBsY29uMCAmIEJQQzBfU0hSRVMpIHsKKwkJdV9zaG9ydCBjb2xvciwgbWFzazsKKwkJaW50IGk7CisKKwkJbWFzayA9IDB4MzMzMzsKKwkJY29sb3IgPSByZ2IyaHcyKHJlZCwgZ3JlZW4sIGJsdWUpOworCQlmb3IgKGkgPSAxMjsgaSA+PSAwOyBpIC09IDQpCisJCQljdXN0b20uY29sb3JbaV0gPSBlY3NfcGFsZXR0ZVtpXSA9IChlY3NfcGFsZXR0ZVtpXSAmIG1hc2spIHwgY29sb3I7CisJCW1hc2sgPDw9MjsgY29sb3IgPj49IDI7CisJCWZvciAoaSA9IDM7IGkgPj0gMDsgaS0tKQorCQkJY3VzdG9tLmNvbG9yW2ldID0gZWNzX3BhbGV0dGVbaV0gPSAoZWNzX3BhbGV0dGVbaV0gJiBtYXNrKSB8IGNvbG9yOworCX0gZWxzZQorI2VuZGlmCisJCWN1c3RvbS5jb2xvclswXSA9IHJnYjJodzQocmVkLCBncmVlbiwgYmx1ZSk7CisJaXNfYmxhbmtlZCA9IGRvX2JsYW5rID4gMCA/IGRvX2JsYW5rIDogMDsKK30KKworc3RhdGljIGludCBhbWlfZ2V0X2ZpeF9jdXJzb3JpbmZvKHN0cnVjdCBmYl9maXhfY3Vyc29yaW5mbyAqZml4KQoreworCXN0cnVjdCBhbWlmYl9wYXIgKnBhciA9ICZjdXJyZW50cGFyOworCisJZml4LT5jcnNyX3dpZHRoID0gZml4LT5jcnNyX3hzaXplID0gcGFyLT5jcnNyLndpZHRoOworCWZpeC0+Y3Jzcl9oZWlnaHQgPSBmaXgtPmNyc3JfeXNpemUgPSBwYXItPmNyc3IuaGVpZ2h0OworCWZpeC0+Y3Jzcl9jb2xvcjEgPSAxNzsKKwlmaXgtPmNyc3JfY29sb3IyID0gMTg7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1pX2dldF92YXJfY3Vyc29yaW5mbyhzdHJ1Y3QgZmJfdmFyX2N1cnNvcmluZm8gKnZhciwgdV9jaGFyICpkYXRhKQoreworCXN0cnVjdCBhbWlmYl9wYXIgKnBhciA9ICZjdXJyZW50cGFyOworCXJlZ2lzdGVyIHVfc2hvcnQgKmxzcHIsICpzc3ByOworI2lmZGVmIF9fbWM2ODAwMF9fCisJcmVnaXN0ZXIgdV9sb25nIGRhdGF3b3JkcyBhc20gKCJkMiIpOworI2Vsc2UKKwlyZWdpc3RlciB1X2xvbmcgZGF0YXdvcmRzOworI2VuZGlmCisJcmVnaXN0ZXIgc2hvcnQgZGVsdGE7CisJcmVnaXN0ZXIgdV9jaGFyIGNvbG9yOworCXNob3J0IGhlaWdodCwgd2lkdGgsIGJpdHMsIHdvcmRzOworCWludCBzaXplLCBhbGxvYzsKKworCXNpemUgPSBwYXItPmNyc3IuaGVpZ2h0KnBhci0+Y3Jzci53aWR0aDsKKwlhbGxvYyA9IHZhci0+aGVpZ2h0KnZhci0+d2lkdGg7CisJdmFyLT5oZWlnaHQgPSBwYXItPmNyc3IuaGVpZ2h0OworCXZhci0+d2lkdGggPSBwYXItPmNyc3Iud2lkdGg7CisJdmFyLT54c3BvdCA9IHBhci0+Y3Jzci5zcG90X3g7CisJdmFyLT55c3BvdCA9IHBhci0+Y3Jzci5zcG90X3k7CisJaWYgKHNpemUgPiB2YXItPmhlaWdodCp2YXItPndpZHRoKQorCQlyZXR1cm4gLUVOQU1FVE9PTE9ORzsKKwlpZiAoIWFjY2Vzc19vayhWRVJJRllfV1JJVEUsICh2b2lkICopZGF0YSwgc2l6ZSkpCisJCXJldHVybiAtRUZBVUxUOworCWRlbHRhID0gMTw8cGFyLT5jcnNyLmZtb2RlOworCWxzcHIgPSBsb2ZzcHJpdGUgKyAoZGVsdGE8PDEpOworCWlmIChwYXItPmJwbGNvbjAgJiBCUEMwX0xBQ0UpCisJCXNzcHIgPSBzaGZzcHJpdGUgKyAoZGVsdGE8PDEpOworCWVsc2UKKwkJc3NwciA9IDA7CisJZm9yIChoZWlnaHQgPSAoc2hvcnQpdmFyLT5oZWlnaHQtMTsgaGVpZ2h0ID49IDA7IGhlaWdodC0tKSB7CisJCWJpdHMgPSAwOyB3b3JkcyA9IGRlbHRhOyBkYXRhd29yZHMgPSAwOworCQlmb3IgKHdpZHRoID0gKHNob3J0KXZhci0+d2lkdGgtMTsgd2lkdGggPj0gMDsgd2lkdGgtLSkgeworCQkJaWYgKGJpdHMgPT0gMCkgeworCQkJCWJpdHMgPSAxNjsgLS13b3JkczsKKyNpZmRlZiBfX21jNjgwMDBfXworCQkJCWFzbSB2b2xhdGlsZSAoIm1vdmV3ICUxQCglMzp3OjIpLCUwIDsgc3dhcCAlMCA7IG1vdmV3ICUxQCssJTAiCisJCQkJCTogIj1kIiAoZGF0YXdvcmRzKSwgIj1hIiAobHNwcikgOiAiMSIgKGxzcHIpLCAiZCIgKGRlbHRhKSk7CisjZWxzZQorCQkJCWRhdGF3b3JkcyA9ICgqKGxzcHIrZGVsdGEpIDw8IDE2KSB8ICgqbHNwcisrKTsKKyNlbmRpZgorCQkJfQorCQkJLS1iaXRzOworI2lmZGVmIF9fbWM2ODAwMF9fCisJCQlhc20gdm9sYXRpbGUgKAorCQkJCSJjbHJiICUwIDsgc3dhcCAlMSA7IGxzbHcgIzEsJTEgOyByb3hsYiAjMSwlMCA7ICIKKwkJCQkic3dhcCAlMSA7IGxzbHcgIzEsJTEgOyByb3hsYiAjMSwlMCIKKwkJCQk6ICI9ZCIgKGNvbG9yKSwgIj1kIiAoZGF0YXdvcmRzKSA6ICIxIiAoZGF0YXdvcmRzKSk7CisjZWxzZQorCQkJY29sb3IgPSAoKChkYXRhd29yZHMgPj4gMzApICYgMikKKwkJCQkgfCAoKGRhdGF3b3JkcyA+PiAxNSkgJiAxKSk7CisJCQlkYXRhd29yZHMgPDw9IDE7CisjZW5kaWYKKwkJCXB1dF91c2VyKGNvbG9yLCBkYXRhKyspOworCQl9CisJCWlmIChiaXRzID4gMCkgeworCQkJLS13b3JkczsgKytsc3ByOworCQl9CisJCXdoaWxlICgtLXdvcmRzID49IDApCisJCQkrK2xzcHI7CisjaWZkZWYgX19tYzY4MDAwX18KKwkJYXNtIHZvbGF0aWxlICgibGVhICUwQCglNDp3OjIpLCUwIDsgdHN0bCAlMSA7IGplcSAxZiA7IGV4ZyAlMCwlMVxuMToiCisJCQk6ICI9YSIgKGxzcHIpLCAiPWEiIChzc3ByKSA6ICIwIiAobHNwciksICIxIiAoc3NwciksICJkIiAoZGVsdGEpKTsKKyNlbHNlCisJCWxzcHIgKz0gZGVsdGE7CisJCWlmIChzc3ByKSB7CisJCQl1X3Nob3J0ICp0bXAgPSBsc3ByOworCQkJbHNwciA9IHNzcHI7CisJCQlzc3ByID0gdG1wOworCQl9CisjZW5kaWYKKwl9CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBpbnQgYW1pX3NldF92YXJfY3Vyc29yaW5mbyhzdHJ1Y3QgZmJfdmFyX2N1cnNvcmluZm8gKnZhciwgdV9jaGFyICpkYXRhKQoreworCXN0cnVjdCBhbWlmYl9wYXIgKnBhciA9ICZjdXJyZW50cGFyOworCXJlZ2lzdGVyIHVfc2hvcnQgKmxzcHIsICpzc3ByOworI2lmZGVmIF9fbWM2ODAwMF9fCisJcmVnaXN0ZXIgdV9sb25nIGRhdGF3b3JkcyBhc20gKCJkMiIpOworI2Vsc2UKKwlyZWdpc3RlciB1X2xvbmcgZGF0YXdvcmRzOworI2VuZGlmCisJcmVnaXN0ZXIgc2hvcnQgZGVsdGE7CisJdV9zaG9ydCBmbW9kZTsKKwlzaG9ydCBoZWlnaHQsIHdpZHRoLCBiaXRzLCB3b3JkczsKKworCWlmICghdmFyLT53aWR0aCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJZWxzZSBpZiAodmFyLT53aWR0aCA8PSAxNikKKwkJZm1vZGUgPSBUQUdfRk1PREVfMTsKKwllbHNlIGlmICh2YXItPndpZHRoIDw9IDMyKQorCQlmbW9kZSA9IFRBR19GTU9ERV8yOworCWVsc2UgaWYgKHZhci0+d2lkdGggPD0gNjQpCisJCWZtb2RlID0gVEFHX0ZNT0RFXzQ7CisJZWxzZQorCQlyZXR1cm4gLUVJTlZBTDsKKwlpZiAoZm1vZGUgPiBtYXhmbW9kZSkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCF2YXItPmhlaWdodCkKKwkJcmV0dXJuIC1FSU5WQUw7CisJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1JFQUQsICh2b2lkICopZGF0YSwgdmFyLT53aWR0aCp2YXItPmhlaWdodCkpCisJCXJldHVybiAtRUZBVUxUOworCWRlbHRhID0gMTw8Zm1vZGU7CisJbG9mc3ByaXRlID0gc2hmc3ByaXRlID0gKHVfc2hvcnQgKilzcHJpdGVtZW1vcnk7CisJbHNwciA9IGxvZnNwcml0ZSArIChkZWx0YTw8MSk7CisJaWYgKHBhci0+YnBsY29uMCAmIEJQQzBfTEFDRSkgeworCQlpZiAoKCh2YXItPmhlaWdodCs0KTw8Zm1vZGU8PDIpID4gU1BSSVRFTUVNU0laRSkKKwkJCXJldHVybiAtRUlOVkFMOworCQltZW1zZXQobHNwciwgMCwgKHZhci0+aGVpZ2h0KzQpPDxmbW9kZTw8Mik7CisJCXNoZnNwcml0ZSArPSAoKHZhci0+aGVpZ2h0KzUpJi0yKTw8Zm1vZGU7CisJCXNzcHIgPSBzaGZzcHJpdGUgKyAoZGVsdGE8PDEpOworCX0gZWxzZSB7CisJCWlmICgoKHZhci0+aGVpZ2h0KzIpPDxmbW9kZTw8MikgPiBTUFJJVEVNRU1TSVpFKQorCQkJcmV0dXJuIC1FSU5WQUw7CisJCW1lbXNldChsc3ByLCAwLCAodmFyLT5oZWlnaHQrMik8PGZtb2RlPDwyKTsKKwkJc3NwciA9IDA7CisJfQorCWZvciAoaGVpZ2h0ID0gKHNob3J0KXZhci0+aGVpZ2h0LTE7IGhlaWdodCA+PSAwOyBoZWlnaHQtLSkgeworCQliaXRzID0gMTY7IHdvcmRzID0gZGVsdGE7IGRhdGF3b3JkcyA9IDA7CisJCWZvciAod2lkdGggPSAoc2hvcnQpdmFyLT53aWR0aC0xOyB3aWR0aCA+PSAwOyB3aWR0aC0tKSB7CisJCQl1bnNpZ25lZCBsb25nIHRkYXRhID0gMDsKKwkJCWdldF91c2VyKHRkYXRhLCAoY2hhciAqKWRhdGEpOworCQkJZGF0YSsrOworI2lmZGVmIF9fbWM2ODAwMF9fCisJCQlhc20gdm9sYXRpbGUgKAorCQkJCSJsc3JiICMxLCUyIDsgcm94bHcgIzEsJTAgOyBzd2FwICUwIDsgIgorCQkJCSJsc3JiICMxLCUyIDsgcm94bHcgIzEsJTAgOyBzd2FwICUwIgorCQkJCTogIj1kIiAoZGF0YXdvcmRzKQorCQkJCTogIjAiIChkYXRhd29yZHMpLCAiZCIgKHRkYXRhKSk7CisjZWxzZQorCQkJZGF0YXdvcmRzID0gKChkYXRhd29yZHMgPDwgMSkgJiAweGZmZmVmZmZlKTsKKwkJCWRhdGF3b3JkcyB8PSB0ZGF0YSAmIDE7CisJCQlkYXRhd29yZHMgfD0gKHRkYXRhICYgMikgPDwgKDE2LTEpOworI2VuZGlmCisJCQlpZiAoLS1iaXRzID09IDApIHsKKwkJCQliaXRzID0gMTY7IC0td29yZHM7CisjaWZkZWYgX19tYzY4MDAwX18KKwkJCQlhc20gdm9sYXRpbGUgKCJzd2FwICUyIDsgbW92ZXcgJTIsJTBAKCUzOnc6MikgOyBzd2FwICUyIDsgbW92ZXcgJTIsJTBAKyIKKwkJCQkJOiAiPWEiIChsc3ByKSA6ICIwIiAobHNwciksICJkIiAoZGF0YXdvcmRzKSwgImQiIChkZWx0YSkpOworI2Vsc2UKKwkJCQkqKGxzcHIrZGVsdGEpID0gKHVfc2hvcnQpIChkYXRhd29yZHMgPj4gMTYpOworCQkJCSpsc3ByKysgPSAodV9zaG9ydCkgKGRhdGF3b3JkcyAmIDB4ZmZmZik7CisjZW5kaWYKKwkJCX0KKwkJfQorCQlpZiAoYml0cyA8IDE2KSB7CisJCQktLXdvcmRzOworI2lmZGVmIF9fbWM2ODAwMF9fCisJCQlhc20gdm9sYXRpbGUgKAorCQkJCSJzd2FwICUyIDsgbHNsdyAlNCwlMiA7IG1vdmV3ICUyLCUwQCglMzp3OjIpIDsgIgorCQkJCSJzd2FwICUyIDsgbHNsdyAlNCwlMiA7IG1vdmV3ICUyLCUwQCsiCisJCQkJOiAiPWEiIChsc3ByKSA6ICIwIiAobHNwciksICJkIiAoZGF0YXdvcmRzKSwgImQiIChkZWx0YSksICJkIiAoYml0cykpOworI2Vsc2UKKwkJCSoobHNwcitkZWx0YSkgPSAodV9zaG9ydCkgKGRhdGF3b3JkcyA+PiAoMTYrYml0cykpOworCQkJKmxzcHIrKyA9ICh1X3Nob3J0KSAoKGRhdGF3b3JkcyAmIDB4MDAwMGZmZmYpID4+IGJpdHMpOworI2VuZGlmCisJCX0KKwkJd2hpbGUgKC0td29yZHMgPj0gMCkgeworI2lmZGVmIF9fbWM2ODAwMF9fCisJCQlhc20gdm9sYXRpbGUgKCJtb3ZlcWwgIzAsJSVkMCA7IG1vdmV3ICUlZDAsJTBAKCUyOnc6MikgOyBtb3ZldyAlJWQwLCUwQCsiCisJCQkJOiAiPWEiIChsc3ByKSA6ICIwIiAobHNwciksICJkIiAoZGVsdGEpIDogImQwIik7CisjZWxzZQorCQkJKihsc3ByK2RlbHRhKSA9IDA7CisJCQkqbHNwcisrID0gMDsKKyNlbmRpZgorCQl9CisjaWZkZWYgX19tYzY4MDAwX18KKwkJYXNtIHZvbGF0aWxlICgibGVhICUwQCglNDp3OjIpLCUwIDsgdHN0bCAlMSA7IGplcSAxZiA7IGV4ZyAlMCwlMVxuMToiCisJCQk6ICI9YSIgKGxzcHIpLCAiPWEiIChzc3ByKSA6ICIwIiAobHNwciksICIxIiAoc3NwciksICJkIiAoZGVsdGEpKTsKKyNlbHNlCisJCWxzcHIgKz0gZGVsdGE7CisJCWlmIChzc3ByKSB7CisJCQl1X3Nob3J0ICp0bXAgPSBsc3ByOworCQkJbHNwciA9IHNzcHI7CisJCQlzc3ByID0gdG1wOworCQl9CisjZW5kaWYKKwl9CisJcGFyLT5jcnNyLmhlaWdodCA9IHZhci0+aGVpZ2h0OworCXBhci0+Y3Jzci53aWR0aCA9IHZhci0+d2lkdGg7CisJcGFyLT5jcnNyLnNwb3RfeCA9IHZhci0+eHNwb3Q7CisJcGFyLT5jcnNyLnNwb3RfeSA9IHZhci0+eXNwb3Q7CisJcGFyLT5jcnNyLmZtb2RlID0gZm1vZGU7CisJaWYgKElTX0FHQSkgeworCQlwYXItPmZtb2RlICY9IH4oRk1PREVfU1BBR0VNIHwgRk1PREVfU1BSMzIpOworCQlwYXItPmZtb2RlIHw9IHNwcmZldGNobW9kZVtmbW9kZV07CisJCWN1c3RvbS5mbW9kZSA9IHBhci0+Zm1vZGU7CisJfQorCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtaV9nZXRfY3Vyc29yc3RhdGUoc3RydWN0IGZiX2N1cnNvcnN0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgYW1pZmJfcGFyICpwYXIgPSAmY3VycmVudHBhcjsKKworCXN0YXRlLT54b2Zmc2V0ID0gcGFyLT5jcnNyLmNyc3JfeDsKKwlzdGF0ZS0+eW9mZnNldCA9IHBhci0+Y3Jzci5jcnNyX3k7CisJc3RhdGUtPm1vZGUgPSBjdXJzb3Jtb2RlOworCXJldHVybiAwOworfQorCitzdGF0aWMgaW50IGFtaV9zZXRfY3Vyc29yc3RhdGUoc3RydWN0IGZiX2N1cnNvcnN0YXRlICpzdGF0ZSkKK3sKKwlzdHJ1Y3QgYW1pZmJfcGFyICpwYXIgPSAmY3VycmVudHBhcjsKKworCXBhci0+Y3Jzci5jcnNyX3ggPSBzdGF0ZS0+eG9mZnNldDsKKwlwYXItPmNyc3IuY3Jzcl95ID0gc3RhdGUtPnlvZmZzZXQ7CisJaWYgKChjdXJzb3Jtb2RlID0gc3RhdGUtPm1vZGUpID09IEZCX0NVUlNPUl9PRkYpCisJCWN1cnNvcnN0YXRlID0gLTE7CisJZG9fY3Vyc29yID0gMTsKKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgYW1pX3NldF9zcHJpdGUodm9pZCkKK3sKKwlzdHJ1Y3QgYW1pZmJfcGFyICpwYXIgPSAmY3VycmVudHBhcjsKKwljb3BpbnMgKmNvcGwsICpjb3BzOworCXVfc2hvcnQgaHMsIHZzLCB2ZTsKKwl1X2xvbmcgcGwsIHBzLCBwdDsKKwlzaG9ydCBteCwgbXk7CisKKwljb3BzID0gY29wZGlzcGxheS5saXN0W2N1cnJlbnRjb3BdWzBdOworCWNvcGwgPSBjb3BkaXNwbGF5Lmxpc3RbY3VycmVudGNvcF1bMV07CisJcHMgPSBwbCA9IFpUV09fUEFERFIoZHVtbXlzcHJpdGUpOworCW14ID0gcGFyLT5jcnNyLmNyc3JfeC1wYXItPmNyc3Iuc3BvdF94OworCW15ID0gcGFyLT5jcnNyLmNyc3JfeS1wYXItPmNyc3Iuc3BvdF95OworCWlmICghKHBhci0+dm1vZGUgJiBGQl9WTU9ERV9ZV1JBUCkpIHsKKwkJbXggLT0gcGFyLT54b2Zmc2V0OworCQlteSAtPSBwYXItPnlvZmZzZXQ7CisJfQorCWlmICghaXNfYmxhbmtlZCAmJiBjdXJzb3JzdGF0ZSA+IDAgJiYgcGFyLT5jcnNyLmhlaWdodCA+IDAgJiYKKwkgICAgbXggPiAtKHNob3J0KXBhci0+Y3Jzci53aWR0aCAmJiBteCA8IHBhci0+eHJlcyAmJgorCSAgICBteSA+IC0oc2hvcnQpcGFyLT5jcnNyLmhlaWdodCAmJiBteSA8IHBhci0+eXJlcykgeworCQlwbCA9IFpUV09fUEFERFIobG9mc3ByaXRlKTsKKwkJaHMgPSBwYXItPmRpd3N0cnRfaCArIChteDw8cGFyLT5jbGtfc2hpZnQpIC0gNDsKKwkJdnMgPSBwYXItPmRpd3N0cnRfdiArIChteTw8cGFyLT5saW5lX3NoaWZ0KTsKKwkJdmUgPSB2cyArIChwYXItPmNyc3IuaGVpZ2h0PDxwYXItPmxpbmVfc2hpZnQpOworCQlpZiAocGFyLT5icGxjb24wICYgQlBDMF9MQUNFKSB7CisJCQlwcyA9IFpUV09fUEFERFIoc2hmc3ByaXRlKTsKKwkJCWxvZnNwcml0ZVswXSA9IHNwcjJod19wb3ModnMsIGhzKTsKKwkJCXNoZnNwcml0ZVswXSA9IHNwcjJod19wb3ModnMrMSwgaHMpOworCQkJaWYgKG1vZDIodnMpKSB7CisJCQkJbG9mc3ByaXRlWzE8PHBhci0+Y3Jzci5mbW9kZV0gPSBzcHIyaHdfY3RsKHZzLCBocywgdmUpOworCQkJCXNoZnNwcml0ZVsxPDxwYXItPmNyc3IuZm1vZGVdID0gc3ByMmh3X2N0bCh2cysxLCBocywgdmUrMSk7CisJCQkJcHQgPSBwbDsgcGwgPSBwczsgcHMgPSBwdDsKKwkJCX0gZWxzZSB7CisJCQkJbG9mc3ByaXRlWzE8PHBhci0+Y3Jzci5mbW9kZV0gPSBzcHIyaHdfY3RsKHZzLCBocywgdmUrMSk7CisJCQkJc2hmc3ByaXRlWzE8PHBhci0+Y3Jzci5mbW9kZV0gPSBzcHIyaHdfY3RsKHZzKzEsIGhzLCB2ZSk7CisJCQl9CisJCX0gZWxzZSB7CisJCQlsb2ZzcHJpdGVbMF0gPSBzcHIyaHdfcG9zKHZzLCBocykgfCAoSVNfQUdBICYmIChwYXItPmZtb2RlICYgRk1PREVfQlNDQU4yKSA/IDB4ODAgOiAwKTsKKwkJCWxvZnNwcml0ZVsxPDxwYXItPmNyc3IuZm1vZGVdID0gc3ByMmh3X2N0bCh2cywgaHMsIHZlKTsKKwkJfQorCX0KKwljb3BsW2NvcF9zcHIwcHRyaF0ud1sxXSA9IGhpZ2h3KHBsKTsKKwljb3BsW2NvcF9zcHIwcHRybF0ud1sxXSA9IGxvd3cocGwpOworCWlmIChwYXItPmJwbGNvbjAgJiBCUEMwX0xBQ0UpIHsKKwkJY29wc1tjb3Bfc3ByMHB0cmhdLndbMV0gPSBoaWdodyhwcyk7CisJCWNvcHNbY29wX3NwcjBwdHJsXS53WzFdID0gbG93dyhwcyk7CisJfQorfQorCisKKwkvKgorCSAqIEluaXRpYWxpc2UgdGhlIENvcHBlciBJbml0aWFsaXNhdGlvbiBMaXN0CisJICovCisKK3N0YXRpYyB2b2lkIF9faW5pdCBhbWlfaW5pdF9jb3BwZXIodm9pZCkKK3sKKwljb3BpbnMgKmNvcCA9IGNvcGRpc3BsYXkuaW5pdDsKKwl1X2xvbmcgcDsKKwlpbnQgaTsKKworCWlmICghSVNfT0NTKSB7CisJCShjb3ArKyktPmwgPSBDTU9WRShCUEMwX0NPTE9SIHwgQlBDMF9TSFJFUyB8IEJQQzBfRUNTRU5BLCBicGxjb24wKTsKKwkJKGNvcCsrKS0+bCA9IENNT1ZFKDB4MDE4MSwgZGl3c3RydCk7CisJCShjb3ArKyktPmwgPSBDTU9WRSgweDAyODEsIGRpd3N0b3ApOworCQkoY29wKyspLT5sID0gQ01PVkUoMHgwMDAwLCBkaXdoaWdoKTsKKwl9IGVsc2UKKwkJKGNvcCsrKS0+bCA9IENNT1ZFKEJQQzBfQ09MT1IsIGJwbGNvbjApOworCXAgPSBaVFdPX1BBRERSKGR1bW15c3ByaXRlKTsKKwlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CisJCShjb3ArKyktPmwgPSBDTU9WRSgwLCBzcHJbaV0ucG9zKTsKKwkJKGNvcCsrKS0+bCA9IENNT1ZFKGhpZ2h3KHApLCBzcHJwdFtpXSk7CisJCShjb3ArKyktPmwgPSBDTU9WRTIobG93dyhwKSwgc3BycHRbaV0pOworCX0KKworCShjb3ArKyktPmwgPSBDTU9WRShJRl9TRVRDTFIgfCBJRl9DT1BFUiwgaW50cmVxKTsKKwljb3BkaXNwbGF5LndhaXQgPSBjb3A7CisJKGNvcCsrKS0+bCA9IENFTkQ7CisJKGNvcCsrKS0+bCA9IENNT1ZFKDAsIGNvcGptcDIpOworCWNvcC0+bCA9IENFTkQ7CisKKwljdXN0b20uY29wMWxjID0gKHVfc2hvcnQgKilaVFdPX1BBRERSKGNvcGRpc3BsYXkuaW5pdCk7CisJY3VzdG9tLmNvcGptcDEgPSAwOworfQorCitzdGF0aWMgdm9pZCBhbWlfcmVpbml0X2NvcHBlcih2b2lkKQoreworCXN0cnVjdCBhbWlmYl9wYXIgKnBhciA9ICZjdXJyZW50cGFyOworCisJY29wZGlzcGxheS5pbml0W2NpcF9icGxjb24wXS53WzFdID0gfihCUEMwX0JQVTMgfCBCUEMwX0JQVTIgfCBCUEMwX0JQVTEgfCBCUEMwX0JQVTApICYgcGFyLT5icGxjb24wOworCWNvcGRpc3BsYXkud2FpdC0+bCA9IENXQUlUKDMyLCBwYXItPmRpd3N0cnRfdi00KTsKK30KKworCS8qCisJICogQnVpbGQgdGhlIENvcHBlciBMaXN0CisJICovCisKK3N0YXRpYyB2b2lkIGFtaV9idWlsZF9jb3BwZXIodm9pZCkKK3sKKwlzdHJ1Y3QgYW1pZmJfcGFyICpwYXIgPSAmY3VycmVudHBhcjsKKwljb3BpbnMgKmNvcGwsICpjb3BzOworCXVfbG9uZyBwOworCisJY3VycmVudGNvcCA9IDEgLSBjdXJyZW50Y29wOworCisJY29wbCA9IGNvcGRpc3BsYXkubGlzdFtjdXJyZW50Y29wXVsxXTsKKworCShjb3BsKyspLT5sID0gQ1dBSVQoMCwgMTApOworCShjb3BsKyspLT5sID0gQ01PVkUocGFyLT5icGxjb24wLCBicGxjb24wKTsKKwkoY29wbCsrKS0+bCA9IENNT1ZFKDAsIHNwcnB0WzBdKTsKKwkoY29wbCsrKS0+bCA9IENNT1ZFMigwLCBzcHJwdFswXSk7CisKKwlpZiAocGFyLT5icGxjb24wICYgQlBDMF9MQUNFKSB7CisJCWNvcHMgPSBjb3BkaXNwbGF5Lmxpc3RbY3VycmVudGNvcF1bMF07CisKKwkJKGNvcHMrKyktPmwgPSBDV0FJVCgwLCAxMCk7CisJCShjb3BzKyspLT5sID0gQ01PVkUocGFyLT5icGxjb24wLCBicGxjb24wKTsKKwkJKGNvcHMrKyktPmwgPSBDTU9WRSgwLCBzcHJwdFswXSk7CisJCShjb3BzKyspLT5sID0gQ01PVkUyKDAsIHNwcnB0WzBdKTsKKworCQkoY29wbCsrKS0+bCA9IENNT1ZFKGRpd3N0cnQyaHcocGFyLT5kaXdzdHJ0X2gsIHBhci0+ZGl3c3RydF92KzEpLCBkaXdzdHJ0KTsKKwkJKGNvcGwrKyktPmwgPSBDTU9WRShkaXdzdG9wMmh3KHBhci0+ZGl3c3RvcF9oLCBwYXItPmRpd3N0b3BfdisxKSwgZGl3c3RvcCk7CisJCShjb3BzKyspLT5sID0gQ01PVkUoZGl3c3RydDJodyhwYXItPmRpd3N0cnRfaCwgcGFyLT5kaXdzdHJ0X3YpLCBkaXdzdHJ0KTsKKwkJKGNvcHMrKyktPmwgPSBDTU9WRShkaXdzdG9wMmh3KHBhci0+ZGl3c3RvcF9oLCBwYXItPmRpd3N0b3BfdiksIGRpd3N0b3ApOworCQlpZiAoIUlTX09DUykgeworCQkJKGNvcGwrKyktPmwgPSBDTU9WRShkaXdoaWdoMmh3KHBhci0+ZGl3c3RydF9oLCBwYXItPmRpd3N0cnRfdisxLAorCQkJICAgICAgICAgICAgICAgICAgICBwYXItPmRpd3N0b3BfaCwgcGFyLT5kaXdzdG9wX3YrMSksIGRpd2hpZ2gpOworCQkJKGNvcHMrKyktPmwgPSBDTU9WRShkaXdoaWdoMmh3KHBhci0+ZGl3c3RydF9oLCBwYXItPmRpd3N0cnRfdiwKKwkJCSAgICAgICAgICAgICAgICAgICAgcGFyLT5kaXdzdG9wX2gsIHBhci0+ZGl3c3RvcF92KSwgZGl3aGlnaCk7CisjaWYgMAorCQkJaWYgKHBhci0+YmVhbWNvbjAgJiBCTUMwX1ZBUkJFQU1FTikgeworCQkJCShjb3BsKyspLT5sID0gQ01PVkUodnRvdGFsMmh3KHBhci0+dnRvdGFsKSwgdnRvdGFsKTsKKwkJCQkoY29wbCsrKS0+bCA9IENNT1ZFKHZic3RydDJodyhwYXItPnZic3RydCsxKSwgdmJzdHJ0KTsKKwkJCQkoY29wbCsrKS0+bCA9IENNT1ZFKHZic3RvcDJodyhwYXItPnZic3RvcCsxKSwgdmJzdG9wKTsKKwkJCQkoY29wcysrKS0+bCA9IENNT1ZFKHZ0b3RhbDJodyhwYXItPnZ0b3RhbCksIHZ0b3RhbCk7CisJCQkJKGNvcHMrKyktPmwgPSBDTU9WRSh2YnN0cnQyaHcocGFyLT52YnN0cnQpLCB2YnN0cnQpOworCQkJCShjb3BzKyspLT5sID0gQ01PVkUodmJzdG9wMmh3KHBhci0+dmJzdG9wKSwgdmJzdG9wKTsKKwkJCX0KKyNlbmRpZgorCQl9CisJCXAgPSBaVFdPX1BBRERSKGNvcGRpc3BsYXkubGlzdFtjdXJyZW50Y29wXVswXSk7CisJCShjb3BsKyspLT5sID0gQ01PVkUoaGlnaHcocCksIGNvcDJsYyk7CisJCShjb3BsKyspLT5sID0gQ01PVkUyKGxvd3cocCksIGNvcDJsYyk7CisJCXAgPSBaVFdPX1BBRERSKGNvcGRpc3BsYXkubGlzdFtjdXJyZW50Y29wXVsxXSk7CisJCShjb3BzKyspLT5sID0gQ01PVkUoaGlnaHcocCksIGNvcDJsYyk7CisJCShjb3BzKyspLT5sID0gQ01PVkUyKGxvd3cocCksIGNvcDJsYyk7CisJCWNvcGRpc3BsYXkucmVidWlsZFswXSA9IGNvcHM7CisJfSBlbHNlIHsKKwkJKGNvcGwrKyktPmwgPSBDTU9WRShkaXdzdHJ0Mmh3KHBhci0+ZGl3c3RydF9oLCBwYXItPmRpd3N0cnRfdiksIGRpd3N0cnQpOworCQkoY29wbCsrKS0+bCA9IENNT1ZFKGRpd3N0b3AyaHcocGFyLT5kaXdzdG9wX2gsIHBhci0+ZGl3c3RvcF92KSwgZGl3c3RvcCk7CisJCWlmICghSVNfT0NTKSB7CisJCQkoY29wbCsrKS0+bCA9IENNT1ZFKGRpd2hpZ2gyaHcocGFyLT5kaXdzdHJ0X2gsIHBhci0+ZGl3c3RydF92LAorCQkJICAgICAgICAgICAgICAgICAgICBwYXItPmRpd3N0b3BfaCwgcGFyLT5kaXdzdG9wX3YpLCBkaXdoaWdoKTsKKyNpZiAwCisJCQlpZiAocGFyLT5iZWFtY29uMCAmIEJNQzBfVkFSQkVBTUVOKSB7CisJCQkJKGNvcGwrKyktPmwgPSBDTU9WRSh2dG90YWwyaHcocGFyLT52dG90YWwpLCB2dG90YWwpOworCQkJCShjb3BsKyspLT5sID0gQ01PVkUodmJzdHJ0Mmh3KHBhci0+dmJzdHJ0KSwgdmJzdHJ0KTsKKwkJCQkoY29wbCsrKS0+bCA9IENNT1ZFKHZic3RvcDJodyhwYXItPnZic3RvcCksIHZic3RvcCk7CisJCQl9CisjZW5kaWYKKwkJfQorCX0KKwljb3BkaXNwbGF5LnJlYnVpbGRbMV0gPSBjb3BsOworCisJYW1pX3VwZGF0ZV9wYXIoKTsKKwlhbWlfcmVidWlsZF9jb3BwZXIoKTsKK30KKworCS8qCisJICogUmVidWlsZCB0aGUgQ29wcGVyIExpc3QKKwkgKgorCSAqIFdlIG9ubHkgY2hhbmdlIHRoZSB0aGluZ3MgdGhhdCBhcmUgbm90IHN0YXRpYworCSAqLworCitzdGF0aWMgdm9pZCBhbWlfcmVidWlsZF9jb3BwZXIodm9pZCkKK3sKKwlzdHJ1Y3QgYW1pZmJfcGFyICpwYXIgPSAmY3VycmVudHBhcjsKKwljb3BpbnMgKmNvcGwsICpjb3BzOworCXVfc2hvcnQgbGluZSwgaF9lbmQxLCBoX2VuZDI7CisJc2hvcnQgaTsKKwl1X2xvbmcgcDsKKworCWlmIChJU19BR0EgJiYgbWF4Zm1vZGUgKyBwYXItPmNsa19zaGlmdCA9PSAwKQorCQloX2VuZDEgPSBwYXItPmRpd3N0cnRfaC02NDsKKwllbHNlCisJCWhfZW5kMSA9IHBhci0+aHRvdGFsLTMyOworCWhfZW5kMiA9IHBhci0+ZGRmc3RvcCs2NDsKKworCWFtaV9zZXRfc3ByaXRlKCk7CisKKwljb3BsID0gY29wZGlzcGxheS5yZWJ1aWxkWzFdOworCXAgPSBwYXItPmJwbHB0MDsKKwlpZiAocGFyLT52bW9kZSAmIEZCX1ZNT0RFX1lXUkFQKSB7CisJCWlmICgocGFyLT52eXJlcy1wYXItPnlvZmZzZXQpICE9IDEgfHwgIW1vZDIocGFyLT5kaXdzdHJ0X3YpKSB7CisJCQlpZiAocGFyLT55b2Zmc2V0ID4gcGFyLT52eXJlcy1wYXItPnlyZXMpIHsKKwkJCQlmb3IgKGkgPSAwOyBpIDwgKHNob3J0KXBhci0+YnBwOyBpKyssIHAgKz0gcGFyLT5uZXh0X3BsYW5lKSB7CisJCQkJCShjb3BsKyspLT5sID0gQ01PVkUoaGlnaHcocCksIGJwbHB0W2ldKTsKKwkJCQkJKGNvcGwrKyktPmwgPSBDTU9WRTIobG93dyhwKSwgYnBscHRbaV0pOworCQkJCX0KKwkJCQlsaW5lID0gcGFyLT5kaXdzdHJ0X3YgKyAoKHBhci0+dnlyZXMtcGFyLT55b2Zmc2V0KTw8cGFyLT5saW5lX3NoaWZ0KSAtIDE7CisJCQkJd2hpbGUgKGxpbmUgPj0gNTEyKSB7CisJCQkJCShjb3BsKyspLT5sID0gQ1dBSVQoaF9lbmQxLCA1MTApOworCQkJCQlsaW5lIC09IDUxMjsKKwkJCQl9CisJCQkJaWYgKGxpbmUgPj0gNTEwICYmIElTX0FHQSAmJiBtYXhmbW9kZSArIHBhci0+Y2xrX3NoaWZ0ID09IDApCisJCQkJCShjb3BsKyspLT5sID0gQ1dBSVQoaF9lbmQxLCBsaW5lKTsKKwkJCQllbHNlCisJCQkJCShjb3BsKyspLT5sID0gQ1dBSVQoaF9lbmQyLCBsaW5lKTsKKwkJCQlwID0gcGFyLT5icGxwdDB3cmFwOworCQkJfQorCQl9IGVsc2UgcCA9IHBhci0+YnBscHQwd3JhcDsKKwl9CisJZm9yIChpID0gMDsgaSA8IChzaG9ydClwYXItPmJwcDsgaSsrLCBwICs9IHBhci0+bmV4dF9wbGFuZSkgeworCQkoY29wbCsrKS0+bCA9IENNT1ZFKGhpZ2h3KHApLCBicGxwdFtpXSk7CisJCShjb3BsKyspLT5sID0gQ01PVkUyKGxvd3cocCksIGJwbHB0W2ldKTsKKwl9CisJY29wbC0+bCA9IENFTkQ7CisKKwlpZiAocGFyLT5icGxjb24wICYgQlBDMF9MQUNFKSB7CisJCWNvcHMgPSBjb3BkaXNwbGF5LnJlYnVpbGRbMF07CisJCXAgPSBwYXItPmJwbHB0MDsKKwkJaWYgKG1vZDIocGFyLT5kaXdzdHJ0X3YpKQorCQkJcCAtPSBwYXItPm5leHRfbGluZTsKKwkJZWxzZQorCQkJcCArPSBwYXItPm5leHRfbGluZTsKKwkJaWYgKHBhci0+dm1vZGUgJiBGQl9WTU9ERV9ZV1JBUCkgeworCQkJaWYgKChwYXItPnZ5cmVzLXBhci0+eW9mZnNldCkgIT0gMSB8fCBtb2QyKHBhci0+ZGl3c3RydF92KSkgeworCQkJCWlmIChwYXItPnlvZmZzZXQgPiBwYXItPnZ5cmVzLXBhci0+eXJlcysxKSB7CisJCQkJCWZvciAoaSA9IDA7IGkgPCAoc2hvcnQpcGFyLT5icHA7IGkrKywgcCArPSBwYXItPm5leHRfcGxhbmUpIHsKKwkJCQkJCShjb3BzKyspLT5sID0gQ01PVkUoaGlnaHcocCksIGJwbHB0W2ldKTsKKwkJCQkJCShjb3BzKyspLT5sID0gQ01PVkUyKGxvd3cocCksIGJwbHB0W2ldKTsKKwkJCQkJfQorCQkJCQlsaW5lID0gcGFyLT5kaXdzdHJ0X3YgKyAoKHBhci0+dnlyZXMtcGFyLT55b2Zmc2V0KTw8cGFyLT5saW5lX3NoaWZ0KSAtIDI7CisJCQkJCXdoaWxlIChsaW5lID49IDUxMikgeworCQkJCQkJKGNvcHMrKyktPmwgPSBDV0FJVChoX2VuZDEsIDUxMCk7CisJCQkJCQlsaW5lIC09IDUxMjsKKwkJCQkJfQorCQkJCQlpZiAobGluZSA+IDUxMCAmJiBJU19BR0EgJiYgbWF4Zm1vZGUgKyBwYXItPmNsa19zaGlmdCA9PSAwKQorCQkJCQkJKGNvcHMrKyktPmwgPSBDV0FJVChoX2VuZDEsIGxpbmUpOworCQkJCQllbHNlCisJCQkJCQkoY29wcysrKS0+bCA9IENXQUlUKGhfZW5kMiwgbGluZSk7CisJCQkJCXAgPSBwYXItPmJwbHB0MHdyYXA7CisJCQkJCWlmIChtb2QyKHBhci0+ZGl3c3RydF92K3Bhci0+dnlyZXMtcGFyLT55b2Zmc2V0KSkKKwkJCQkJCXAgLT0gcGFyLT5uZXh0X2xpbmU7CisJCQkJCWVsc2UKKwkJCQkJCXAgKz0gcGFyLT5uZXh0X2xpbmU7CisJCQkJfQorCQkJfSBlbHNlIHAgPSBwYXItPmJwbHB0MHdyYXAgLSBwYXItPm5leHRfbGluZTsKKwkJfQorCQlmb3IgKGkgPSAwOyBpIDwgKHNob3J0KXBhci0+YnBwOyBpKyssIHAgKz0gcGFyLT5uZXh0X3BsYW5lKSB7CisJCQkoY29wcysrKS0+bCA9IENNT1ZFKGhpZ2h3KHApLCBicGxwdFtpXSk7CisJCQkoY29wcysrKS0+bCA9IENNT1ZFMihsb3d3KHApLCBicGxwdFtpXSk7CisJCX0KKwkJY29wcy0+bCA9IENFTkQ7CisJfQorfQorCisKK21vZHVsZV9pbml0KGFtaWZiX2luaXQpOworCisjaWZkZWYgTU9EVUxFCitNT0RVTEVfTElDRU5TRSgiR1BMIik7CisKK3ZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKK3sKKwl1bnJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZmYl9pbmZvKTsKKwlhbWlmYl9kZWluaXQoKTsKKwlhbWlmYl92aWRlb19vZmYoKTsKK30KKyNlbmRpZiAvKiBNT0RVTEUgKi8K