LyoKICogbGludXgvZHJpdmVycy92aWRlby9hbWlmYi5jIC0tIEFtaWdhIGJ1aWx0aW4gY2hpcHNldCBmcmFtZSBidWZmZXIgZGV2aWNlCiAqCiAqICAgIENvcHlyaWdodCAoQykgMTk5NS0yMDAzIEdlZXJ0IFV5dHRlcmhvZXZlbgogKgogKiAgICAgICAgICB3aXRoIHdvcmsgYnkgUm9tYW4gWmlwcGVsCiAqCiAqCiAqIFRoaXMgZmlsZSBpcyBiYXNlZCBvbiB0aGUgQXRhcmkgZnJhbWUgYnVmZmVyIGRldmljZSAoYXRhZmIuYyk6CiAqCiAqICAgIENvcHlyaWdodCAoQykgMTk5NCBNYXJ0aW4gU2NoYWxsZXIKICogICAgICAgICAgICAgICAgICAgICAgIFJvbWFuIEhvZGVrCiAqCiAqICAgICAgICAgIHdpdGggd29yayBieSBBbmRyZWFzIFNjaHdhYgogKiAgICAgICAgICAgICAgICAgICAgICAgR3VlbnRoZXIgS2VsbGV0ZXIKICoKICogYW5kIG9uIHRoZSBvcmlnaW5hbCBBbWlnYSBjb25zb2xlIGRyaXZlciAoYW1pY29uLmMpOgogKgogKiAgICBDb3B5cmlnaHQgKEMpIDE5OTMgSGFtaXNoIE1hY2RvbmFsZAogKiAgICAgICAgICAgICAgICAgICAgICAgR3JlZyBIYXJwCiAqICAgIENvcHlyaWdodCAoQykgMTk5NCBEYXZpZCBDYXJ0ZXIgW2NhcnRlckBjb21wc2NpLmJyaXN0b2wuYWMudWtdCiAqCiAqICAgICAgICAgIHdpdGggd29yayBieSBXaWxsaWFtIFJ1Y2tsaWRnZSAod2pyQGNzLmNvcm5lbGwuZWR1KQogKiAgICAgICAgICAgICAgICAgICAgICAgR2VlcnQgVXl0dGVyaG9ldmVuCiAqICAgICAgICAgICAgICAgICAgICAgICBKZXMgU29yZW5zZW4gKGpkc0Brb20uYXVjLmRrKQogKgogKgogKiBIaXN0b3J5OgogKgogKiAgIC0gMjQgSnVsIDk2OiBDb3BwZXIgZ2VuZXJhdGVzIG5vdyB2YmxhbmsgaW50ZXJydXB0IGFuZAogKiAgICAgICAgICAgICAgICBWRVNBIFBvd2VyIFNhdmluZyBQcm90b2NvbCBpcyBmdWxseSBpbXBsZW1lbnRlZAogKiAgIC0gMTQgSnVsIDk2OiBSZXdvcmsgYW5kIGhvcGVmdWxseSBsYXN0IEVDUyBidWdzIGZpeGVkCiAqICAgLSAgNyBNYXIgOTY6IEhhcmR3YXJlIHNwcml0ZSBzdXBwb3J0IGJ5IFJvbWFuIFppcHBlbAogKiAgIC0gMTggRmViIDk2OiBPQ1MgYW5kIEVDUyBzdXBwb3J0IGJ5IFJvbWFuIFppcHBlbAogKiAgICAgICAgICAgICAgICBIYXJkd2FyZSBmdW5jdGlvbnMgY29tcGxldGVseSByZXdyaXR0ZW4KICogICAtICAyIERlYyA5NTogQUdBIHZlcnNpb24gYnkgR2VlcnQgVXl0dGVyaG9ldmVuCiAqCiAqIFRoaXMgZmlsZSBpcyBzdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljCiAqIExpY2Vuc2UuIFNlZSB0aGUgZmlsZSBDT1BZSU5HIGluIHRoZSBtYWluIGRpcmVjdG9yeSBvZiB0aGlzIGFyY2hpdmUKICogZm9yIG1vcmUgZGV0YWlscy4KICovCgojaW5jbHVkZSA8bGludXgvbW9kdWxlLmg+CiNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KI2luY2x1ZGUgPGxpbnV4L2Vycm5vLmg+CiNpbmNsdWRlIDxsaW51eC9zdHJpbmcuaD4KI2luY2x1ZGUgPGxpbnV4L21tLmg+CiNpbmNsdWRlIDxsaW51eC9zbGFiLmg+CiNpbmNsdWRlIDxsaW51eC9kZWxheS5oPgojaW5jbHVkZSA8bGludXgvaW50ZXJydXB0Lmg+CiNpbmNsdWRlIDxsaW51eC9mYi5oPgojaW5jbHVkZSA8bGludXgvaW5pdC5oPgojaW5jbHVkZSA8bGludXgvaW9wb3J0Lmg+CgojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KI2luY2x1ZGUgPGFzbS9zeXN0ZW0uaD4KI2luY2x1ZGUgPGFzbS9pcnEuaD4KI2luY2x1ZGUgPGFzbS9hbWlnYWh3Lmg+CiNpbmNsdWRlIDxhc20vYW1pZ2FpbnRzLmg+CiNpbmNsdWRlIDxhc20vc2V0dXAuaD4KCiNpbmNsdWRlICJjMnAuaCIKCgojZGVmaW5lIERFQlVHCgojaWYgIWRlZmluZWQoQ09ORklHX0ZCX0FNSUdBX09DUykgJiYgIWRlZmluZWQoQ09ORklHX0ZCX0FNSUdBX0VDUykgJiYgIWRlZmluZWQoQ09ORklHX0ZCX0FNSUdBX0FHQSkKI2RlZmluZSBDT05GSUdfRkJfQU1JR0FfT0NTICAgLyogZGVmaW5lIGF0IGxlYXN0IG9uZSBmYiBkcml2ZXIsIHRoaXMgd2lsbCBjaGFuZ2UgbGF0ZXIgKi8KI2VuZGlmCgojaWYgIWRlZmluZWQoQ09ORklHX0ZCX0FNSUdBX09DUykKIyAgZGVmaW5lIElTX09DUyAoMCkKI2VsaWYgZGVmaW5lZChDT05GSUdfRkJfQU1JR0FfRUNTKSB8fCBkZWZpbmVkKENPTkZJR19GQl9BTUlHQV9BR0EpCiMgIGRlZmluZSBJU19PQ1MgKGNoaXBzZXQgPT0gVEFHX09DUykKI2Vsc2UKIyAgZGVmaW5lIENPTkZJR19GQl9BTUlHQV9PQ1NfT05MWQojICBkZWZpbmUgSVNfT0NTICgxKQojZW5kaWYKCiNpZiAhZGVmaW5lZChDT05GSUdfRkJfQU1JR0FfRUNTKQojICBkZWZpbmUgSVNfRUNTICgwKQojZWxpZiBkZWZpbmVkKENPTkZJR19GQl9BTUlHQV9PQ1MpIHx8IGRlZmluZWQoQ09ORklHX0ZCX0FNSUdBX0FHQSkKIyAgZGVmaW5lIElTX0VDUyAoY2hpcHNldCA9PSBUQUdfRUNTKQojZWxzZQojICBkZWZpbmUgQ09ORklHX0ZCX0FNSUdBX0VDU19PTkxZCiMgIGRlZmluZSBJU19FQ1MgKDEpCiNlbmRpZgoKI2lmICFkZWZpbmVkKENPTkZJR19GQl9BTUlHQV9BR0EpCiMgIGRlZmluZSBJU19BR0EgKDApCiNlbGlmIGRlZmluZWQoQ09ORklHX0ZCX0FNSUdBX09DUykgfHwgZGVmaW5lZChDT05GSUdfRkJfQU1JR0FfRUNTKQojICBkZWZpbmUgSVNfQUdBIChjaGlwc2V0ID09IFRBR19BR0EpCiNlbHNlCiMgIGRlZmluZSBDT05GSUdfRkJfQU1JR0FfQUdBX09OTFkKIyAgZGVmaW5lIElTX0FHQSAoMSkKI2VuZGlmCgojaWZkZWYgREVCVUcKIyAgZGVmaW5lIERQUklOVEsoZm10LCBhcmdzLi4uKQlwcmludGsoS0VSTl9ERUJVRyAiJXM6ICIgZm10LCBfX0ZVTkNUSU9OX18gLCAjIyBhcmdzKQojZWxzZQojICBkZWZpbmUgRFBSSU5USyhmbXQsIGFyZ3MuLi4pCiNlbmRpZgoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKCgogICBHZW5lcmljIHZpZGVvIHRpbWluZ3MKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICBUaW1pbmdzIHVzZWQgYnkgdGhlIGZyYW1lIGJ1ZmZlciBpbnRlcmZhY2U6CgogICArLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tKwogICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgfAogICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICAgfHVwcGVyX21hcmdpbiAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgfAogICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICAgpSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgfAogICArLS0tLS0tLS0tLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjLS0tLS0tLS0tLSstLS0tLS0tKwogICB8ICAgICAgICAgICMgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgIHwgICAgICAgfAogICB8ICAgICAgICAgICMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgIHwgICAgICAgfAogICB8ICAgICAgICAgICMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgIHwgICAgICAgfAogICB8ICAgICAgICAgICMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgIHwgICAgICAgfAogICB8ICAgbGVmdCAgICMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICByaWdodCAgIHwgaHN5bmMgfAogICB8ICBtYXJnaW4gICMgICAgICAgICAgICAgICAgfCAgICAgICB4cmVzICAgICAgICAgICAgICAgICAjICBtYXJnaW4gIHwgIGxlbiAgfAogICB8PC0tLS0tLS0tPiM8LS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT4jPC0tLS0tLS0tPnw8LS0tLS0+fAogICB8ICAgICAgICAgICMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgIHwgICAgICAgfAogICB8ICAgICAgICAgICMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgIHwgICAgICAgfAogICB8ICAgICAgICAgICMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgIHwgICAgICAgfAogICB8ICAgICAgICAgICMgICAgICAgICAgICAgICAgfHlyZXMgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgIHwgICAgICAgfAogICB8ICAgICAgICAgICMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgIHwgICAgICAgfAogICB8ICAgICAgICAgICMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgIHwgICAgICAgfAogICB8ICAgICAgICAgICMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgIHwgICAgICAgfAogICB8ICAgICAgICAgICMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgIHwgICAgICAgfAogICB8ICAgICAgICAgICMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgIHwgICAgICAgfAogICB8ICAgICAgICAgICMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgIHwgICAgICAgfAogICB8ICAgICAgICAgICMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgIHwgICAgICAgfAogICB8ICAgICAgICAgICMgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgIHwgICAgICAgfAogICB8ICAgICAgICAgICMgICAgICAgICAgICAgICAgpSAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICAgICAgICAgIHwgICAgICAgfAogICArLS0tLS0tLS0tLSMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjLS0tLS0tLS0tLSstLS0tLS0tKwogICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgfAogICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICAgfGxvd2VyX21hcmdpbiAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgfAogICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICAgpSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgfAogICArLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tKwogICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgfAogICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICAgfHZzeW5jX2xlbiAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgfAogICB8ICAgICAgICAgIHwgICAgICAgICAgICAgICAgpSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwgICAgICAgfAogICArLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLSstLS0tLS0tKwoKCiAgIEFtaWdhIHZpZGVvIHRpbWluZ3MKICAgLS0tLS0tLS0tLS0tLS0tLS0tLQoKICAgVGhlIEFtaWdhIG5hdGl2ZSBjaGlwc2V0cyB1c2VzIGFub3RoZXIgdGltaW5nIHNjaGVtZToKCiAgICAgIC0gaHNzdHJ0OiAgIFN0YXJ0IG9mIGhvcml6b250YWwgc3luY2hyb25pemF0aW9uIHB1bHNlCiAgICAgIC0gaHNzdG9wOiAgIEVuZCBvZiBob3Jpem9udGFsIHN5bmNocm9uaXphdGlvbiBwdWxzZQogICAgICAtIGh0b3RhbDogICBMYXN0IHZhbHVlIG9uIHRoZSBsaW5lIChpLmUuIGxpbmUgbGVuZ3RoID0gaHRvdGFsKzEpCiAgICAgIC0gdnNzdHJ0OiAgIFN0YXJ0IG9mIHZlcnRpY2FsIHN5bmNocm9uaXphdGlvbiBwdWxzZQogICAgICAtIHZzc3RvcDogICBFbmQgb2YgdmVydGljYWwgc3luY2hyb25pemF0aW9uIHB1bHNlCiAgICAgIC0gdnRvdGFsOiAgIExhc3QgbGluZSB2YWx1ZSAoaS5lLiBudW1iZXIgb2YgbGluZXMgPSB2dG90YWwrMSkKICAgICAgLSBoY2VudGVyOiAgU3RhcnQgb2YgdmVydGljYWwgcmV0cmFjZSBmb3IgaW50ZXJsYWNlCgogICBZb3UgY2FuIHNwZWNpZnkgdGhlIGJsYW5raW5nIHRpbWluZ3MgaW5kZXBlbmRlbnRseS4gQ3VycmVudGx5IEkganVzdCBzZXQKICAgdGhlbSBlcXVhbCB0byB0aGUgcmVzcGVjdGl2ZSBzeW5jaHJvbml6YXRpb24gdmFsdWVzOgoKICAgICAgLSBoYnN0cnQ6ICAgU3RhcnQgb2YgaG9yaXpvbnRhbCBibGFuawogICAgICAtIGhic3RvcDogICBFbmQgb2YgaG9yaXpvbnRhbCBibGFuawogICAgICAtIHZic3RydDogICBTdGFydCBvZiB2ZXJ0aWNhbCBibGFuawogICAgICAtIHZic3RvcDogICBFbmQgb2YgdmVydGljYWwgYmxhbmsKCiAgIEhvcml6b250YWwgdmFsdWVzIGFyZSBpbiBjb2xvciBjbG9jayBjeWNsZXMgKDI4MCBucyksIHZlcnRpY2FsIHZhbHVlcyBhcmUgaW4KICAgc2NhbmxpbmVzLgoKICAgKDAsIDApIGlzIHNvbWV3aGVyZSBpbiB0aGUgdXBwZXItbGVmdCBjb3JuZXIgOi0pCgoKICAgQW1pZ2EgdmlzaWJsZSB3aW5kb3cgZGVmaW5pdGlvbnMKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgIEN1cnJlbnRseSBJIG9ubHkgaGF2ZSB2YWx1ZXMgZm9yIEFHQSwgU0hSRVMgKDI4IE1IeiBkb3RjbG9jaykuIEZlZWwgZnJlZSB0bwogICBtYWtlIGNvcnJlY3Rpb25zIGFuZC9vciBhZGRpdGlvbnMuCgogICBXaXRoaW4gdGhlIGFib3ZlIHN5bmNocm9uaXphdGlvbiBzcGVjaWZpY2F0aW9ucywgdGhlIHZpc2libGUgd2luZG93IGlzCiAgIGRlZmluZWQgYnkgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzIChhY3R1YWwgcmVnaXN0ZXIgcmVzb2x1dGlvbnMgbWF5IGJlCiAgIGRpZmZlcmVudDsgYWxsIGhvcml6b250YWwgdmFsdWVzIGFyZSBub3JtYWxpemVkIHdpdGggcmVzcGVjdCB0byB0aGUgcGl4ZWwKICAgY2xvY2spOgoKICAgICAgLSBkaXdzdHJ0X2g6ICAgSG9yaXpvbnRhbCBzdGFydCBvZiB0aGUgdmlzaWJsZSB3aW5kb3cKICAgICAgLSBkaXdzdG9wX2g6ICAgSG9yaXpvbnRhbCBzdG9wKzEoKikgb2YgdGhlIHZpc2libGUgd2luZG93CiAgICAgIC0gZGl3c3RydF92OiAgIFZlcnRpY2FsIHN0YXJ0IG9mIHRoZSB2aXNpYmxlIHdpbmRvdwogICAgICAtIGRpd3N0b3BfdjogICBWZXJ0aWNhbCBzdG9wIG9mIHRoZSB2aXNpYmxlIHdpbmRvdwogICAgICAtIGRkZnN0cnQ6ICAgICBIb3Jpem9udGFsIHN0YXJ0IG9mIGRpc3BsYXkgRE1BCiAgICAgIC0gZGRmc3RvcDogICAgIEhvcml6b250YWwgc3RvcCBvZiBkaXNwbGF5IERNQQogICAgICAtIGhzY3JvbGw6ICAgICBIb3Jpem9udGFsIGRpc3BsYXkgb3V0cHV0IGRlbGF5CgogICBTcHJpdGUgcG9zaXRpb25pbmc6CgogICAgICAtIHNwcnN0cnRfaDogICBIb3Jpem9udGFsIHN0YXJ0LTQgb2Ygc3ByaXRlCiAgICAgIC0gc3Byc3RydF92OiAgIFZlcnRpY2FsIHN0YXJ0IG9mIHNwcml0ZQoKICAgKCopIEV2ZW4gQ29tbW9kb3JlIGRpZCBpdCB3cm9uZyBpbiB0aGUgQUdBIG1vbml0b3IgZHJpdmVycyBieSBub3QgYWRkaW5nIDEuCgogICBIb3Jpem9udGFsIHZhbHVlcyBhcmUgaW4gZG90Y2xvY2sgY3ljbGVzICgzNSBucyksIHZlcnRpY2FsIHZhbHVlcyBhcmUgaW4KICAgc2NhbmxpbmVzLgoKICAgKDAsIDApIGlzIHNvbWV3aGVyZSBpbiB0aGUgdXBwZXItbGVmdCBjb3JuZXIgOi0pCgoKICAgRGVwZW5kZW5jaWVzIChBR0EsIFNIUkVTICgzNSBucyBkb3RjbG9jaykpCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgIFNpbmNlIHRoZXJlIGFyZSBtdWNoIG1vcmUgcGFyYW1ldGVycyBmb3IgdGhlIEFtaWdhIGRpc3BsYXkgdGhhbiBmb3IgdGhlCiAgIGZyYW1lIGJ1ZmZlciBpbnRlcmZhY2UsIHRoZXJlIG11c3QgYmUgc29tZSBkZXBlbmRlbmNpZXMgYW1vbmcgdGhlIEFtaWdhCiAgIGRpc3BsYXkgcGFyYW1ldGVycy4gSGVyZSdzIHdoYXQgSSBmb3VuZCBvdXQ6CgogICAgICAtIGRkZnN0cnQgYW5kIGRkZnN0b3AgYXJlIGJlc3QgYWxpZ25lZCB0byA2NCBwaXhlbHMuCiAgICAgIC0gdGhlIGNoaXBzZXQgbmVlZHMgNjQrNCBob3Jpem9udGFsIHBpeGVscyBhZnRlciB0aGUgRE1BIHN0YXJ0IGJlZm9yZSB0aGUKICAgICAgICBmaXJzdCBwaXhlbCBpcyBvdXRwdXQsIHNvIGRpd3N0cnRfaCA9IGRkZnN0cnQrNjQrNCBpZiB5b3Ugd2FudCB0bwogICAgICAgIGRpc3BsYXkgdGhlIGZpcnN0IHBpeGVsIG9uIHRoZSBsaW5lIHRvby4gSW5jcmVhc2UgZGl3c3RydF9oIGZvciB2aXJ0dWFsCiAgICAgICAgc2NyZWVuIHBhbm5pbmcuCiAgICAgIC0gdGhlIGRpc3BsYXkgRE1BIGFsd2F5cyBmZXRjaGVzIDY0IHBpeGVscyBhdCBhIHRpbWUgKGZtb2RlID0gMykuCiAgICAgIC0gZGRmc3RvcCBpcyBkZGZzdHJ0KyNwaXhlbHMtNjQuCiAgICAgIC0gZGl3c3RvcF9oID0gZGl3c3RydF9oK3hyZXMrMS4gQmVjYXVzZSBvZiB0aGUgYWRkaXRpb25hbCAxIHRoaXMgY2FuIGJlIDEKICAgICAgICBtb3JlIHRoYW4gaHRvdGFsLgogICAgICAtIGhzY3JvbGwgc2ltcGx5IGFkZHMgYSBkZWxheSB0byB0aGUgZGlzcGxheSBvdXRwdXQuIFNtb290aCBob3Jpem9udGFsCiAgICAgICAgcGFubmluZyBuZWVkcyBhbiBleHRyYSA2NCBwaXhlbHMgb24gdGhlIGxlZnQgdG8gcHJlZmV0Y2ggdGhlIHBpeGVscyB0aGF0CiAgICAgICAgYGZhbGwgb2ZmJyBvbiB0aGUgbGVmdC4KICAgICAgLSBpZiBkZGZzdHJ0IDwgMTkyLCB0aGUgc3ByaXRlIERNQSBjeWNsZXMgYXJlIGFsbCBzdG9sZW4gYnkgdGhlIGJpdHBsYW5lCiAgICAgICAgRE1BLCBzbyBpdCdzIGJlc3QgdG8gbWFrZSB0aGUgRE1BIHN0YXJ0IGFzIGxhdGUgYXMgcG9zc2libGUuCiAgICAgIC0geW91IHJlYWxseSBkb24ndCB3YW50IHRvIG1ha2UgZGRmc3RydCA8IDEyOCwgc2luY2UgdGhpcyB3aWxsIHN0ZWFsIERNQQogICAgICAgIGN5Y2xlcyBmcm9tIHRoZSBvdGhlciBETUEgY2hhbm5lbHMgKGF1ZGlvLCBmbG9wcHkgYW5kIENoaXAgUkFNIHJlZnJlc2gpLgogICAgICAtIEkgbWFrZSBkaXdzdG9wX2ggYW5kIGRpd3N0b3BfdiBhcyBsYXJnZSBhcyBwb3NzaWJsZS4KCiAgIEdlbmVyYWwgZGVwZW5kZW5jaWVzCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICAgICAtIGFsbCB2YWx1ZXMgYXJlIFNIUkVTIHBpeGVsICgzNW5zKQoKICAgICAgICAgICAgICAgICAgdGFibGUgMTpmZXRjaHN0YXJ0ICB0YWJsZSAyOnByZWZldGNoICAgIHRhYmxlIDM6ZmV0Y2hzaXplCiAgICAgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLS0tLQogICBQaXhjbG9jayAgICAgIyBTSFJFU3xISVJFU3xMT1JFUyAjIFNIUkVTfEhJUkVTfExPUkVTICMgU0hSRVN8SElSRVN8TE9SRVMKICAgLS0tLS0tLS0tLS0tLSMtLS0tLS0rLS0tLS0rLS0tLS0tIy0tLS0tLSstLS0tLSstLS0tLS0jLS0tLS0tKy0tLS0tKy0tLS0tLQogICBCdXMgd2lkdGggMXggIyAgIDE2IHwgIDMyIHwgIDY0ICAjICAgMTYgfCAgMzIgfCAgNjQgICMgICA2NCB8ICA2NCB8ICA2NAogICBCdXMgd2lkdGggMnggIyAgIDMyIHwgIDY0IHwgMTI4ICAjICAgMzIgfCAgNjQgfCAgNjQgICMgICA2NCB8ICA2NCB8IDEyOAogICBCdXMgd2lkdGggNHggIyAgIDY0IHwgMTI4IHwgMjU2ICAjICAgNjQgfCAgNjQgfCAgNjQgICMgICA2NCB8IDEyOCB8IDI1NgoKICAgICAgLSBjaGlwc2V0IG5lZWRzIDQgcGl4ZWxzIGJlZm9yZSB0aGUgZmlyc3QgcGl4ZWwgaXMgb3V0cHV0CiAgICAgIC0gZGRmc3RydCBtdXN0IGJlIGFsaWduZWQgdG8gZmV0Y2hzdGFydCAodGFibGUgMSkKICAgICAgLSBjaGlwc2V0IG5lZWRzIGFsc28gcHJlZmV0Y2ggKHRhYmxlIDIpIHRvIGdldCBmaXJzdCBwaXhlbCBkYXRhLCBzbwogICAgICAgIGRkZnN0cnQgPSAoKGRpd3N0cnRfaC00KSAmIC1mZXRjaHN0YXJ0KSAtIHByZWZldGNoCiAgICAgIC0gZm9yIGhvcml6b250YWwgcGFubmluZyBkZWNyZWFzZSBkaXdzdHJ0X2gKICAgICAgLSB0aGUgbGVuZ3RoIG9mIGEgZmV0Y2hsaW5lIG11c3QgYmUgYWxpZ25lZCB0byBmZXRjaHNpemUgKHRhYmxlIDMpCiAgICAgIC0gaWYgZmV0Y2hzdGFydCBpcyBzbWFsbGVyIHRoYW4gZmV0Y2hzaXplLCB0aGVuIGRkZnN0cnQgY2FuIGEgbGl0dGxlIGJpdAogICAgICAgIG1vdmVkIHRvIG9wdGltaXplIHVzZSBvZiBkbWEgKHVzZWZ1bCBmb3IgT0NTL0VDUyBvdmVyc2NhbiBkaXNwbGF5cykKICAgICAgLSBkZGZzdG9wIGlzIGRkZnN0cnQrZGRmc2l6ZS1mZXRjaHNpemUKICAgICAgLSBJZiBDPSBkaWRuJ3QgY2hhbmdlIGFueXRoaW5nIGZvciBBR0EsIHRoZW4gYXQgZm9sbG93aW5nIHBvc2l0aW9ucyB0aGUKICAgICAgICBkbWEgYnVzIGlzIGFscmVhZHkgdXNlZDoKICAgICAgICBkZGZzdHJ0IDwgIDQ4IC0+IG1lbW9yeSByZWZyZXNoCiAgICAgICAgICAgICAgICA8ICA5NiAtPiBkaXNrIGRtYQogICAgICAgICAgICAgICAgPCAxNjAgLT4gYXVkaW8gZG1hCiAgICAgICAgICAgICAgICA8IDE5MiAtPiBzcHJpdGUgMCBkbWEKICAgICAgICAgICAgICAgIDwgNDE2IC0+IHNwcml0ZSBkbWEgKDMyIHBlciBzcHJpdGUpCiAgICAgIC0gaW4gYWNjb3JkYW5jZSB3aXRoIHRoZSBoYXJkd2FyZSByZWZlcmVuY2UgbWFudWFsIGEgaGFyZHdhcmUgc3RvcCBpcyBhdAogICAgICAgIDE5MiwgYnV0IEFHQSAoRUNTPykgY2FuIGdvIGJlbG93IHRoaXMuCgogICBETUEgcHJpb3JpdGllcwogICAtLS0tLS0tLS0tLS0tLQoKICAgU2luY2UgdGhlcmUgYXJlIGxpbWl0cyBvbiB0aGUgZWFybGllc3Qgc3RhcnQgdmFsdWUgZm9yIGRpc3BsYXkgRE1BIGFuZCB0aGUKICAgZGlzcGxheSBvZiBzcHJpdGVzLCBJIHVzZSB0aGUgZm9sbG93aW5nIHBvbGljeSBvbiBob3Jpem9udGFsIHBhbm5pbmcgYW5kCiAgIHRoZSBoYXJkd2FyZSBjdXJzb3I6CgogICAgICAtIGlmIHlvdSB3YW50IHRvIHN0YXJ0IGRpc3BsYXkgRE1BIHRvbyBlYXJseSwgeW91IGxvc2UgdGhlIGFiaWxpdHkgdG8KICAgICAgICBkbyBzbW9vdGggaG9yaXpvbnRhbCBwYW5uaW5nICh4cGFuc3RlcCAxIC0+IDY0KS4KICAgICAgLSBpZiB5b3Ugd2FudCB0byBnbyBldmVuIGZ1cnRoZXIsIHlvdSBsb3NlIHRoZSBoYXJkd2FyZSBjdXJzb3IgdG9vLgoKICAgSU1ITyBhIGhhcmR3YXJlIGN1cnNvciBpcyBtb3JlIGltcG9ydGFudCBmb3IgWCB0aGFuIGhvcml6b250YWwgc2Nyb2xsaW5nLAogICBzbyB0aGF0J3MgbXkgbW90aXZhdGlvbi4KCgogICBJbXBsZW1lbnRhdGlvbgogICAtLS0tLS0tLS0tLS0tLQoKICAgYW1pX2RlY29kZV92YXIoKSBjb252ZXJ0cyB0aGUgZnJhbWUgYnVmZmVyIHZhbHVlcyB0byB0aGUgQW1pZ2EgdmFsdWVzLiBJdCdzCiAgIGp1c3QgYSBgc3RyYWlnaHRmb3J3YXJkJyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgYWJvdmUgcnVsZXMuCgoKICAgU3RhbmRhcmQgVkdBIHRpbWluZ3MKICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICAgICAgICAgICAgIHhyZXMgIHlyZXMgICAgbGVmdCAgcmlnaHQgIHVwcGVyICBsb3dlciAgICBoc3luYyAgICB2c3luYwogICAgICAgICAgICAgICAtLS0tICAtLS0tICAgIC0tLS0gIC0tLS0tICAtLS0tLSAgLS0tLS0gICAgLS0tLS0gICAgLS0tLS0KICAgICAgODB4MjUgICAgIDcyMCAgIDQwMCAgICAgIDI3ICAgICA0NSAgICAgMzUgICAgIDEyICAgICAgMTA4ICAgICAgICAyCiAgICAgIDgweDMwICAgICA3MjAgICA0ODAgICAgICAyNyAgICAgNDUgICAgIDMwICAgICAgOSAgICAgIDEwOCAgICAgICAgMgoKICAgVGhlc2Ugd2VyZSB0YWtlbiBmcm9tIGEgWEZyZWU4NiBjb25maWd1cmF0aW9uIGZpbGUsIHJlY2FsY3VsYXRlZCBmb3IgYSAyOCBNSHoKICAgZG90Y2xvY2sgKEFtaWdhcyBkb24ndCBoYXZlIGEgMjUgTUh6IGRvdGNsb2NrKSBhbmQgY29udmVydGVkIHRvIGZyYW1lIGJ1ZmZlcgogICBnZW5lcmljIHRpbWluZ3MuCgogICBBcyBhIGNvbXBhcmlzb24sIGdyYXBoaWNzL21vbml0b3IuaCBzdWdnZXN0cyB0aGUgZm9sbG93aW5nOgoKICAgICAgICAgICAgICAgeHJlcyAgeXJlcyAgICBsZWZ0ICByaWdodCAgdXBwZXIgIGxvd2VyICAgIGhzeW5jICAgIHZzeW5jCiAgICAgICAgICAgICAgIC0tLS0gIC0tLS0gICAgLS0tLSAgLS0tLS0gIC0tLS0tICAtLS0tLSAgICAtLS0tLSAgICAtLS0tLQoKICAgICAgVkdBICAgICAgIDY0MCAgIDQ4MCAgICAgIDUyICAgIDExMiAgICAgMjQgICAgIDE5ICAgIDExMiAtICAgICAgMiArCiAgICAgIFZHQTcwICAgICA2NDAgICA0MDAgICAgICA1MiAgICAxMTIgICAgIDI3ICAgICAyMSAgICAxMTIgLSAgICAgIDIgLQoKCiAgIFN5bmMgcG9sYXJpdGllcwogICAtLS0tLS0tLS0tLS0tLS0KCiAgICAgIFZTWU5DICAgIEhTWU5DICAgIFZlcnRpY2FsIHNpemUgICAgVmVydGljYWwgdG90YWwKICAgICAgLS0tLS0gICAgLS0tLS0gICAgLS0tLS0tLS0tLS0tLSAgICAtLS0tLS0tLS0tLS0tLQogICAgICAgICsgICAgICAgICsgICAgICAgICAgIFJlc2VydmVkICAgICAgICAgIFJlc2VydmVkCiAgICAgICAgKyAgICAgICAgLSAgICAgICAgICAgICAgICA0MDAgICAgICAgICAgICAgICA0MTQKICAgICAgICAtICAgICAgICArICAgICAgICAgICAgICAgIDM1MCAgICAgICAgICAgICAgIDM2MgogICAgICAgIC0gICAgICAgIC0gICAgICAgICAgICAgICAgNDgwICAgICAgICAgICAgICAgNDk2CgogICBTb3VyY2U6IENMLUdENTQyWCBUZWNobmljYWwgUmVmZXJlbmNlIE1hbnVhbCwgQ2lycnVzIExvZ2ljLCBPY3QgMTk5MgoKCiAgIEJyb2FkY2FzdCB2aWRlbyB0aW1pbmdzCiAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgogICBBY2NvcmRpbmcgdG8gdGhlIENDSVIgYW5kIFJFVE1BIHNwZWNpZmljYXRpb25zLCB3ZSBoYXZlIHRoZSBmb2xsb3dpbmcgdmFsdWVzOgoKICAgQ0NJUiAtPiBQQUwKICAgLS0tLS0tLS0tLS0KCiAgICAgIC0gYSBzY2FubGluZSBpcyA2NCC1cyBsb25nLCBvZiB3aGljaCA1Mi40OCC1cyBhcmUgdmlzaWJsZS4gVGhpcyBpcyBhYm91dAogICAgICAgIDczNiB2aXNpYmxlIDcwIG5zIHBpeGVscyBwZXIgbGluZS4KICAgICAgLSB3ZSBoYXZlIDYyNSBzY2FubGluZXMsIG9mIHdoaWNoIDU3NSBhcmUgdmlzaWJsZSAoaW50ZXJsYWNlZCk7IGFmdGVyCiAgICAgICAgcm91bmRpbmcgdGhpcyBiZWNvbWVzIDU3Ni4KCiAgIFJFVE1BIC0+IE5UU0MKICAgLS0tLS0tLS0tLS0tLQoKICAgICAgLSBhIHNjYW5saW5lIGlzIDYzLjUgtXMgbG9uZywgb2Ygd2hpY2ggNTMuNSC1cyBhcmUgdmlzaWJsZS4gIFRoaXMgaXMgYWJvdXQKICAgICAgICA3MzYgdmlzaWJsZSA3MCBucyBwaXhlbHMgcGVyIGxpbmUuCiAgICAgIC0gd2UgaGF2ZSA1MjUgc2NhbmxpbmVzLCBvZiB3aGljaCA0ODUgYXJlIHZpc2libGUgKGludGVybGFjZWQpOyBhZnRlcgogICAgICAgIHJvdW5kaW5nIHRoaXMgYmVjb21lcyA0ODQuCgogICBUaHVzIGlmIHlvdSB3YW50IGEgUEFMIGNvbXBhdGlibGUgZGlzcGxheSwgeW91IGhhdmUgdG8gZG8gdGhlIGZvbGxvd2luZzoKCiAgICAgIC0gc2V0IHRoZSBGQl9TWU5DX0JST0FEQ0FTVCBmbGFnIHRvIGluZGljYXRlIHRoYXQgc3RhbmRhcmQgYnJvYWRjYXN0CiAgICAgICAgdGltaW5ncyBhcmUgdG8gYmUgdXNlZC4KICAgICAgLSBtYWtlIHN1cmUgdXBwZXJfbWFyZ2luK3lyZXMrbG93ZXJfbWFyZ2luK3ZzeW5jX2xlbiA9IDYyNSBmb3IgYW4KICAgICAgICBpbnRlcmxhY2VkLCAzMTIgZm9yIGEgbm9uLWludGVybGFjZWQgYW5kIDE1NiBmb3IgYSBkb3VibGVzY2FubmVkCiAgICAgICAgZGlzcGxheS4KICAgICAgLSBtYWtlIHN1cmUgbGVmdF9tYXJnaW4reHJlcytyaWdodF9tYXJnaW4raHN5bmNfbGVuID0gMTgxNiBmb3IgYSBTSFJFUywKICAgICAgICA5MDggZm9yIGEgSElSRVMgYW5kIDQ1NCBmb3IgYSBMT1JFUyBkaXNwbGF5LgogICAgICAtIHRoZSBsZWZ0IHZpc2libGUgcGFydCBiZWdpbnMgYXQgMzYwIChTSFJFUzsgSElSRVM6MTgwLCBMT1JFUzo5MCksCiAgICAgICAgbGVmdF9tYXJnaW4rMipoc3luY19sZW4gbXVzdCBiZSBncmVhdGVyIG9yIGVxdWFsLgogICAgICAtIHRoZSB1cHBlciB2aXNpYmxlIHBhcnQgYmVnaW5zIGF0IDQ4IChpbnRlcmxhY2VkOyBub24taW50ZXJsYWNlZDoyNCwKICAgICAgICBkb3VibGVzY2FubmVkOjEyKSwgdXBwZXJfbWFyZ2luKzIqdnN5bmNfbGVuIG11c3QgYmUgZ3JlYXRlciBvciBlcXVhbC4KICAgICAgLSBhbWlfZW5jb2RlX3ZhcigpIGNhbGN1bGF0ZXMgbWFyZ2lucyB3aXRoIGEgaHN5bmMgb2YgNTMyMCBucyBhbmQgYSB2c3luYwogICAgICAgIG9mIDQgc2NhbmxpbmVzCgogICBUaGUgc2V0dGluZ3MgZm9yIGEgTlRTQyBjb21wYXRpYmxlIGRpc3BsYXkgYXJlIHN0cmFpZ2h0Zm9yd2FyZC4KCiAgIE5vdGUgdGhhdCBpbiBhIHN0cmljdCBzZW5zZSB0aGUgUEFMIGFuZCBOVFNDIHN0YW5kYXJkcyBvbmx5IGRlZmluZSB0aGUKICAgZW5jb2Rpbmcgb2YgdGhlIGNvbG9yIHBhcnQgKGNocm9taW5hbmNlKSBvZiB0aGUgdmlkZW8gc2lnbmFsIGFuZCBkb24ndCBzYXkKICAgYW55dGhpbmcgYWJvdXQgaG9yaXpvbnRhbC92ZXJ0aWNhbCBzeW5jaHJvbml6YXRpb24gbm9yIHJlZnJlc2ggcmF0ZXMuCgoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gR2VlcnQgLS0KCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCgoKCS8qCgkgKiBDdXN0b20gQ2hpcHNldCBEZWZpbml0aW9ucwoJICovCgojZGVmaW5lIENVU1RPTV9PRlMoZmxkKSAoKGxvbmcpJigoc3RydWN0IENVU1RPTSopMCktPmZsZCkKCgkvKgoJICogQlBMQ09OMCAtLSBCaXRwbGFuZSBDb250cm9sIFJlZ2lzdGVyIDAKCSAqLwoKI2RlZmluZSBCUEMwX0hJUkVTCSgweDgwMDApCiNkZWZpbmUgQlBDMF9CUFUyCSgweDQwMDApIC8qIEJpdCBwbGFuZSB1c2VkIGNvdW50ICovCiNkZWZpbmUgQlBDMF9CUFUxCSgweDIwMDApCiNkZWZpbmUgQlBDMF9CUFUwCSgweDEwMDApCiNkZWZpbmUgQlBDMF9IQU0JKDB4MDgwMCkgLyogSEFNIG1vZGUgKi8KI2RlZmluZSBCUEMwX0RQRgkoMHgwNDAwKSAvKiBEb3VibGUgcGxheWZpZWxkICovCiNkZWZpbmUgQlBDMF9DT0xPUgkoMHgwMjAwKSAvKiBFbmFibGUgY29sb3JidXJzdCAqLwojZGVmaW5lIEJQQzBfR0FVRAkoMHgwMTAwKSAvKiBHZW5sb2NrIGF1ZGlvIGVuYWJsZSAqLwojZGVmaW5lIEJQQzBfVUhSRVMJKDB4MDA4MCkgLyogVWx0cmFoaSByZXMgZW5hYmxlICovCiNkZWZpbmUgQlBDMF9TSFJFUwkoMHgwMDQwKSAvKiBTdXBlciBoaSByZXMgbW9kZSAqLwojZGVmaW5lIEJQQzBfQllQQVNTCSgweDAwMjApIC8qIEJ5cGFzcyBMVVQgLSBBR0EgKi8KI2RlZmluZSBCUEMwX0JQVTMJKDB4MDAxMCkgLyogQUdBICovCiNkZWZpbmUgQlBDMF9MUEVOCSgweDAwMDgpIC8qIExpZ2h0IHBlbiBlbmFibGUgKi8KI2RlZmluZSBCUEMwX0xBQ0UJKDB4MDAwNCkgLyogSW50ZXJsYWNlICovCiNkZWZpbmUgQlBDMF9FUlNZCSgweDAwMDIpIC8qIEV4dGVybmFsIHJlc3luYyAqLwojZGVmaW5lIEJQQzBfRUNTRU5BCSgweDAwMDEpIC8qIEVDUyBlbmFibGUgKi8KCgkvKgoJICogQlBMQ09OMiAtLSBCaXRwbGFuZSBDb250cm9sIFJlZ2lzdGVyIDIKCSAqLwoKI2RlZmluZSBCUEMyX1pEQlBTRUwyCSgweDQwMDApIC8qIEJpdHBsYW5lIHRvIGJlIHVzZWQgZm9yIFpEIC0gQUdBICovCiNkZWZpbmUgQlBDMl9aREJQU0VMMQkoMHgyMDAwKQojZGVmaW5lIEJQQzJfWkRCUFNFTDAJKDB4MTAwMCkKI2RlZmluZSBCUEMyX1pEQlBFTgkoMHgwODAwKSAvKiBFbmFibGUgWkQgd2l0aCBaREJQU0VMeCAtIEFHQSAqLwojZGVmaW5lIEJQQzJfWkRDVEVOCSgweDA0MDApIC8qIEVuYWJsZSBaRCB3aXRoIHBhbGV0dGUgYml0ICMzMSAtIEFHQSAqLwojZGVmaW5lIEJQQzJfS0lMTEVIQgkoMHgwMjAwKSAvKiBLaWxsIEVIQiBtb2RlIC0gQUdBICovCiNkZWZpbmUgQlBDMl9SRFJBTQkoMHgwMTAwKSAvKiBDb2xvciB0YWJsZSBhY2Nlc3NlcyByZWFkLCBub3Qgd3JpdGUgLSBBR0EgKi8KI2RlZmluZSBCUEMyX1NPR0VOCSgweDAwODApIC8qIFNPRyBvdXRwdXQgcGluIGhpZ2ggLSBBR0EgKi8KI2RlZmluZSBCUEMyX1BGMlBSSQkoMHgwMDQwKSAvKiBQRjIgcHJpb3JpdHkgb3ZlciBQRjEgKi8KI2RlZmluZSBCUEMyX1BGMlAyCSgweDAwMjApIC8qIFBGMiBwcmlvcml0eSB3cnQgc3ByaXRlcyAqLwojZGVmaW5lIEJQQzJfUEYyUDEJKDB4MDAxMCkKI2RlZmluZSBCUEMyX1BGMlAwCSgweDAwMDgpCiNkZWZpbmUgQlBDMl9QRjFQMgkoMHgwMDA0KSAvKiBkaXR0byBQRjEgKi8KI2RlZmluZSBCUEMyX1BGMVAxCSgweDAwMDIpCiNkZWZpbmUgQlBDMl9QRjFQMAkoMHgwMDAxKQoKCS8qCgkgKiBCUExDT04zIC0tIEJpdHBsYW5lIENvbnRyb2wgUmVnaXN0ZXIgMyAoQUdBKQoJICovCgojZGVmaW5lIEJQQzNfQkFOSzIJKDB4ODAwMCkgLyogQml0cyB0byBzZWxlY3QgY29sb3IgcmVnaXN0ZXIgYmFuayAqLwojZGVmaW5lIEJQQzNfQkFOSzEJKDB4NDAwMCkKI2RlZmluZSBCUEMzX0JBTkswCSgweDIwMDApCiNkZWZpbmUgQlBDM19QRjJPRjIJKDB4MTAwMCkgLyogQml0cyBmb3IgY29sb3IgdGFibGUgb2Zmc2V0IHdoZW4gUEYyICovCiNkZWZpbmUgQlBDM19QRjJPRjEJKDB4MDgwMCkKI2RlZmluZSBCUEMzX1BGMk9GMAkoMHgwNDAwKQojZGVmaW5lIEJQQzNfTE9DVAkoMHgwMjAwKSAvKiBDb2xvciByZWdpc3RlciB3cml0ZXMgZ28gdG8gbG93IGJpdHMgKi8KI2RlZmluZSBCUEMzX1NQUkVTMQkoMHgwMDgwKSAvKiBTcHJpdGUgcmVzb2x1dGlvbiBiaXRzICovCiNkZWZpbmUgQlBDM19TUFJFUzAJKDB4MDA0MCkKI2RlZmluZSBCUEMzX0JSRFJCTE5LCSgweDAwMjApIC8qIEJvcmRlciBibGFua2VkPyAqLwojZGVmaW5lIEJQQzNfQlJEUlRSQU4JKDB4MDAxMCkgLyogQm9yZGVyIHRyYW5zcGFyZW50PyAqLwojZGVmaW5lIEJQQzNfWkRDTEtFTgkoMHgwMDA0KSAvKiBaRCBwaW4gaXMgMTQgTUh6IChISVJFUykgY2xvY2sgb3V0cHV0ICovCiNkZWZpbmUgQlBDM19CUkRSU1BSVAkoMHgwMDAyKSAvKiBTcHJpdGVzIGluIGJvcmRlcj8gKi8KI2RlZmluZSBCUEMzX0VYVEJMS0VOCSgweDAwMDEpIC8qIEJMQU5LIHByb2dyYW1tYWJsZSAqLwoKCS8qCgkgKiBCUExDT040IC0tIEJpdHBsYW5lIENvbnRyb2wgUmVnaXN0ZXIgNCAoQUdBKQoJICovCgojZGVmaW5lIEJQQzRfQlBMQU03CSgweDgwMDApIC8qIGJpdHBsYW5lIGNvbG9yIFhPUiBmaWVsZCAqLwojZGVmaW5lIEJQQzRfQlBMQU02CSgweDQwMDApCiNkZWZpbmUgQlBDNF9CUExBTTUJKDB4MjAwMCkKI2RlZmluZSBCUEM0X0JQTEFNNAkoMHgxMDAwKQojZGVmaW5lIEJQQzRfQlBMQU0zCSgweDA4MDApCiNkZWZpbmUgQlBDNF9CUExBTTIJKDB4MDQwMCkKI2RlZmluZSBCUEM0X0JQTEFNMQkoMHgwMjAwKQojZGVmaW5lIEJQQzRfQlBMQU0wCSgweDAxMDApCiNkZWZpbmUgQlBDNF9FU1BSTTcJKDB4MDA4MCkgLyogNCBoaWdoIGJpdHMgZm9yIGV2ZW4gc3ByaXRlIGNvbG9ycyAqLwojZGVmaW5lIEJQQzRfRVNQUk02CSgweDAwNDApCiNkZWZpbmUgQlBDNF9FU1BSTTUJKDB4MDAyMCkKI2RlZmluZSBCUEM0X0VTUFJNNAkoMHgwMDEwKQojZGVmaW5lIEJQQzRfT1NQUk03CSgweDAwMDgpIC8qIDQgaGlnaCBiaXRzIGZvciBvZGQgc3ByaXRlIGNvbG9ycyAqLwojZGVmaW5lIEJQQzRfT1NQUk02CSgweDAwMDQpCiNkZWZpbmUgQlBDNF9PU1BSTTUJKDB4MDAwMikKI2RlZmluZSBCUEM0X09TUFJNNAkoMHgwMDAxKQoKCS8qCgkgKiBCRUFNQ09OMCAtLSBCZWFtIENvbnRyb2wgUmVnaXN0ZXIKCSAqLwoKI2RlZmluZSBCTUMwX0hBUkRESVMJKDB4NDAwMCkgLyogRGlzYWJsZSBoYXJkd2FyZSBsaW1pdHMgKi8KI2RlZmluZSBCTUMwX0xQRU5ESVMJKDB4MjAwMCkgLyogRGlzYWJsZSBsaWdodCBwZW4gbGF0Y2ggKi8KI2RlZmluZSBCTUMwX1ZBUlZCRU4JKDB4MTAwMCkgLyogRW5hYmxlIHZhcmlhYmxlIHZlcnRpY2FsIGJsYW5rICovCiNkZWZpbmUgQk1DMF9MT0xESVMJKDB4MDgwMCkgLyogRGlzYWJsZSBsb25nL3Nob3J0IGxpbmUgdG9nZ2xlICovCiNkZWZpbmUgQk1DMF9DU0NCRU4JKDB4MDQwMCkgLyogQ29tcG9zaXRlIHN5bmMvYmxhbmsgKi8KI2RlZmluZSBCTUMwX1ZBUlZTWUVOCSgweDAyMDApIC8qIEVuYWJsZSB2YXJpYWJsZSB2ZXJ0aWNhbCBzeW5jICovCiNkZWZpbmUgQk1DMF9WQVJIU1lFTgkoMHgwMTAwKSAvKiBFbmFibGUgdmFyaWFibGUgaG9yaXpvbnRhbCBzeW5jICovCiNkZWZpbmUgQk1DMF9WQVJCRUFNRU4JKDB4MDA4MCkgLyogRW5hYmxlIHZhcmlhYmxlIGJlYW0gY291bnRlcnMgKi8KI2RlZmluZSBCTUMwX0RVQUwJKDB4MDA0MCkgLyogRW5hYmxlIGFsdGVybmF0ZSBob3Jpem9udGFsIGJlYW0gY291bnRlciAqLwojZGVmaW5lIEJNQzBfUEFMCSgweDAwMjApIC8qIFNldCBkZWNvZGVzIGZvciBQQUwgKi8KI2RlZmluZSBCTUMwX1ZBUkNTWUVOCSgweDAwMTApIC8qIEVuYWJsZSB2YXJpYWJsZSBjb21wb3NpdGUgc3luYyAqLwojZGVmaW5lIEJNQzBfQkxBTktFTgkoMHgwMDA4KSAvKiBCbGFuayBlbmFibGUgKG5vIGxvbmdlciB1c2VkIG9uIEFHQSkgKi8KI2RlZmluZSBCTUMwX0NTWVRSVUUJKDB4MDAwNCkgLyogQ1NZIHBvbGFyaXR5ICovCiNkZWZpbmUgQk1DMF9WU1lUUlVFCSgweDAwMDIpIC8qIFZTWSBwb2xhcml0eSAqLwojZGVmaW5lIEJNQzBfSFNZVFJVRQkoMHgwMDAxKSAvKiBIU1kgcG9sYXJpdHkgKi8KCgoJLyoKCSAqIEZNT0RFIC0tIEZldGNoIE1vZGUgQ29udHJvbCBSZWdpc3RlciAoQUdBKQoJICovCgojZGVmaW5lIEZNT0RFX1NTQ0FOMgkoMHg4MDAwKSAvKiBTcHJpdGUgc2Nhbi1kb3VibGluZyAqLwojZGVmaW5lIEZNT0RFX0JTQ0FOMgkoMHg0MDAwKSAvKiBVc2UgUEYyIG1vZHVsdXMgZXZlcnkgb3RoZXIgbGluZSAqLwojZGVmaW5lIEZNT0RFX1NQQUdFTQkoMHgwMDA4KSAvKiBTcHJpdGUgcGFnZSBtb2RlICovCiNkZWZpbmUgRk1PREVfU1BSMzIJKDB4MDAwNCkgLyogU3ByaXRlIDMyIGJpdCBmZXRjaCAqLwojZGVmaW5lIEZNT0RFX0JQQUdFTQkoMHgwMDAyKSAvKiBCaXRwbGFuZSBwYWdlIG1vZGUgKi8KI2RlZmluZSBGTU9ERV9CUEwzMgkoMHgwMDAxKSAvKiBCaXRwbGFuZSAzMiBiaXQgZmV0Y2ggKi8KCgkvKgoJICogVGFncyB1c2VkIHRvIGluZGljYXRlIGEgc3BlY2lmaWMgUGl4ZWwgQ2xvY2sKCSAqCgkgKiBjbGtfc2hpZnQgaXMgdGhlIHNoaWZ0IHZhbHVlIHRvIGdldCB0aGUgdGltaW5ncyBpbiAzNSBucyB1bml0cwoJICovCgplbnVtIHsgVEFHX1NIUkVTLCBUQUdfSElSRVMsIFRBR19MT1JFUyB9OwoKCS8qCgkgKiBUYWdzIHVzZWQgdG8gaW5kaWNhdGUgdGhlIHNwZWNpZmljIGNoaXBzZXQKCSAqLwoKZW51bSB7IFRBR19PQ1MsIFRBR19FQ1MsIFRBR19BR0EgfTsKCgkvKgoJICogVGFncyB1c2VkIHRvIGluZGljYXRlIHRoZSBtZW1vcnkgYmFuZHdpZHRoCgkgKi8KCmVudW0geyBUQUdfRk1PREVfMSwgVEFHX0ZNT0RFXzIsIFRBR19GTU9ERV80IH07CgoKCS8qCgkgKiBDbG9jayBEZWZpbml0aW9ucywgTWF4aW11bSBEaXNwbGF5IERlcHRoCgkgKgoJICogVGhlc2UgZGVwZW5kIG9uIHRoZSBFLUNsb2NrIG9yIHRoZSBDaGlwc2V0LCBzbyB0aGV5IGFyZSBmaWxsZWQgaW4KCSAqIGR5bmFtaWNhbGx5CgkgKi8KCnN0YXRpYyB1X2xvbmcgcGl4Y2xvY2tbM107CS8qIFNIUkVTL0hJUkVTL0xPUkVTOiBpbmRleCA9IGNsa19zaGlmdCAqLwpzdGF0aWMgdV9zaG9ydCBtYXhkZXB0aFszXTsJLyogU0hSRVMvSElSRVMvTE9SRVM6IGluZGV4ID0gY2xrX3NoaWZ0ICovCnN0YXRpYyB1X3Nob3J0IG1heGZtb2RlLCBjaGlwc2V0OwoKCgkvKgoJICogQnJvYWRjYXN0IFZpZGVvIFRpbWluZ3MKCSAqCgkgKiBIb3Jpem9udGFsIHZhbHVlcyBhcmUgaW4gMzUgbnMgKFNIUkVTKSB1bml0cwoJICogVmVydGljYWwgdmFsdWVzIGFyZSBpbiBpbnRlcmxhY2VkIHNjYW5saW5lcwoJICovCgojZGVmaW5lIFBBTF9ESVdTVFJUX0gJKDM2MCkJLyogUEFMIFdpbmRvdyBMaW1pdHMgKi8KI2RlZmluZSBQQUxfRElXU1RSVF9WCSg0OCkKI2RlZmluZSBQQUxfSFRPVEFMCSgxODE2KQojZGVmaW5lIFBBTF9WVE9UQUwJKDYyNSkKCiNkZWZpbmUgTlRTQ19ESVdTVFJUX0gJKDM2MCkJLyogTlRTQyBXaW5kb3cgTGltaXRzICovCiNkZWZpbmUgTlRTQ19ESVdTVFJUX1YJKDQwKQojZGVmaW5lIE5UU0NfSFRPVEFMCSgxODE2KQojZGVmaW5lIE5UU0NfVlRPVEFMCSg1MjUpCgoKCS8qCgkgKiBWYXJpb3VzIG1hY3JvcwoJICovCgojZGVmaW5lIHVwMih2KQkJKCgodikrMSkgJiAtMikKI2RlZmluZSBkb3duMih2KQkoKHYpICYgLTIpCiNkZWZpbmUgZGl2Mih2KQkJKCh2KT4+MSkKI2RlZmluZSBtb2QyKHYpCQkoKHYpICYgMSkKCiNkZWZpbmUgdXA0KHYpCQkoKCh2KSszKSAmIC00KQojZGVmaW5lIGRvd240KHYpCSgodikgJiAtNCkKI2RlZmluZSBtdWw0KHYpCQkoKHYpPDwyKQojZGVmaW5lIGRpdjQodikJCSgodik+PjIpCiNkZWZpbmUgbW9kNCh2KQkJKCh2KSAmIDMpCgojZGVmaW5lIHVwOCh2KQkJKCgodikrNykgJiAtOCkKI2RlZmluZSBkb3duOCh2KQkoKHYpICYgLTgpCiNkZWZpbmUgZGl2OCh2KQkJKCh2KT4+MykKI2RlZmluZSBtb2Q4KHYpCQkoKHYpICYgNykKCiNkZWZpbmUgdXAxNih2KQkJKCgodikrMTUpICYgLTE2KQojZGVmaW5lIGRvd24xNih2KQkoKHYpICYgLTE2KQojZGVmaW5lIGRpdjE2KHYpCSgodik+PjQpCiNkZWZpbmUgbW9kMTYodikJKCh2KSAmIDE1KQoKI2RlZmluZSB1cDMyKHYpCQkoKCh2KSszMSkgJiAtMzIpCiNkZWZpbmUgZG93bjMyKHYpCSgodikgJiAtMzIpCiNkZWZpbmUgZGl2MzIodikJKCh2KT4+NSkKI2RlZmluZSBtb2QzMih2KQkoKHYpICYgMzEpCgojZGVmaW5lIHVwNjQodikJCSgoKHYpKzYzKSAmIC02NCkKI2RlZmluZSBkb3duNjQodikJKCh2KSAmIC02NCkKI2RlZmluZSBkaXY2NCh2KQkoKHYpPj42KQojZGVmaW5lIG1vZDY0KHYpCSgodikgJiA2MykKCiNkZWZpbmUgdXB4KHgsdikJKCgodikrKHgpLTEpICYgLSh4KSkKI2RlZmluZSBkb3dueCh4LHYpCSgodikgJiAtKHgpKQojZGVmaW5lIG1vZHgoeCx2KQkoKHYpICYgKCh4KS0xKSkKCi8qIGlmIHgxIGlzIG5vdCBhIGNvbnN0YW50LCB0aGlzIG1hY3JvIHdvbid0IG1ha2UgcmVhbCBzZW5zZSA6LSkgKi8KI2lmZGVmIF9fbWM2ODAwMF9fCiNkZWZpbmUgRElWVUwoeDEsIHgyKSAoe2ludCByZXM7IGFzbSgiZGl2dWwgJTEsJTIsJTMiOiAiPWQiIChyZXMpOiBcCgkiZCIgKHgyKSwgImQiICgobG9uZykoKHgxKS8weDEwMDAwMDAwMFVMTCkpLCAiMCIgKChsb25nKSh4MSkpKTsgcmVzO30pCiNlbHNlCi8qIFdlIGtub3cgYSBiaXQgYWJvdXQgdGhlIG51bWJlcnMsIHNvIHdlIGNhbiBkbyBpdCB0aGlzIHdheSAqLwojZGVmaW5lIERJVlVMKHgxLCB4MikgKCgoKGxvbmcpKCh1bnNpZ25lZCBsb25nIGxvbmcpeDEgPj4gOCkgLyB4MikgPDwgOCkgKyBcCgkoKCgobG9uZykoKHVuc2lnbmVkIGxvbmcgbG9uZyl4MSA+PiA4KSAlIHgyKSA8PCA4KSAvIHgyKSkKI2VuZGlmCgojZGVmaW5lIGhpZ2h3KHgpCSgodV9sb25nKSh4KT4+MTYgJiAweGZmZmYpCiNkZWZpbmUgbG93dyh4KQkJKCh1X2xvbmcpKHgpICYgMHhmZmZmKQoKI2RlZmluZSBjdXN0b20JCWFtaWdhX2N1c3RvbQoKI2RlZmluZSBWQmxhbmtPbigpCWN1c3RvbS5pbnRlbmEgPSBJRl9TRVRDTFJ8SUZfQ09QRVIKI2RlZmluZSBWQmxhbmtPZmYoKQljdXN0b20uaW50ZW5hID0gSUZfQ09QRVIKCgoJLyoKCSAqIENoaXAgUkFNIHdlIHJlc2VydmUgZm9yIHRoZSBGcmFtZSBCdWZmZXIKCSAqCgkgKiBUaGlzIGRlZmluZXMgdGhlIE1heGltdW0gVmlydHVhbCBTY3JlZW4gU2l6ZQoJICogKFNldGFibGUgcGVyIGtlcm5lbCBvcHRpb25zPykKCSAqLwoKI2RlZmluZSBWSURFT01FTVNJWkVfQUdBXzJNCSgxMzEwNzIwKSAvKiBBR0EgKDJNQikgOiBtYXggMTI4MCoxMDI0KjI1NiAgKi8KI2RlZmluZSBWSURFT01FTVNJWkVfQUdBXzFNCSg3ODY0MzIpICAvKiBBR0EgKDFNQikgOiBtYXggMTAyNCo3NjgqMjU2ICAgKi8KI2RlZmluZSBWSURFT01FTVNJWkVfRUNTXzJNCSg2NTUzNjApICAvKiBFQ1MgKDJNQikgOiBtYXggMTI4MCoxMDI0KjE2ICAgKi8KI2RlZmluZSBWSURFT01FTVNJWkVfRUNTXzFNCSgzOTMyMTYpICAvKiBFQ1MgKDFNQikgOiBtYXggMTAyNCo3NjgqMTYgICAgKi8KI2RlZmluZSBWSURFT01FTVNJWkVfT0NTCSgyNjIxNDQpICAvKiBPQ1MgICAgICAgOiBtYXggY2EuIDgwMCo2MDAqMTYgKi8KCiNkZWZpbmUgU1BSSVRFTUVNU0laRQkJKDY0KjY0LzQpIC8qIG1heCA2NCo2NCo0ICovCiNkZWZpbmUgRFVNTVlTUFJJVEVNRU1TSVpFCSg4KQpzdGF0aWMgdV9sb25nIHNwcml0ZW1lbW9yeTsKCiNkZWZpbmUgQ0hJUFJBTV9TQUZFVFlfTElNSVQJKDE2Mzg0KQoKc3RhdGljIHVfbG9uZyB2aWRlb21lbW9yeTsKCgkvKgoJICogVGhpcyBpcyB0aGUgZWFybGllc3QgYWxsb3dlZCBzdGFydCBvZiBmZXRjaGluZyBkaXNwbGF5IGRhdGEuCgkgKiBPbmx5IGlmIHlvdSByZWFsbHkgd2FudCBubyBoYXJkd2FyZSBjdXJzb3IgYW5kIGF1ZGlvLAoJICogc2V0IHRoaXMgdG8gMTI4LCBidXQgbGV0IGl0IGJldHRlciBhdCAxOTIKCSAqLwoKc3RhdGljIHVfbG9uZyBtaW5fZnN0cnQgPSAxOTI7CgojZGVmaW5lIGFzc2lnbmNodW5rKG5hbWUsIHR5cGUsIHB0ciwgc2l6ZSkgXAp7IFwKCShuYW1lKSA9ICh0eXBlKShwdHIpOyBcCglwdHIgKz0gc2l6ZTsgXAp9CgoKCS8qCgkgKiBDb3BwZXIgSW5zdHJ1Y3Rpb25zCgkgKi8KCiNkZWZpbmUgQ01PVkUodmFsLCByZWcpCQkoQ1VTVE9NX09GUyhyZWcpPDwxNiB8ICh2YWwpKQojZGVmaW5lIENNT1ZFMih2YWwsIHJlZykJKChDVVNUT01fT0ZTKHJlZykrMik8PDE2IHwgKHZhbCkpCiNkZWZpbmUgQ1dBSVQoeCwgeSkJCSgoKHkpICYgMHgxZmUpPDwyMyB8ICgoeCkgJiAweDdmMCk8PDEzIHwgMHgwMDAxZmZmZSkKI2RlZmluZSBDRU5ECQkJKDB4ZmZmZmZmZmUpCgoKdHlwZWRlZiB1bmlvbiB7Cgl1X2xvbmcgbDsKCXVfc2hvcnQgd1syXTsKfSBjb3BpbnM7CgpzdGF0aWMgc3RydWN0IGNvcGRpc3BsYXkgewoJY29waW5zICppbml0OwoJY29waW5zICp3YWl0OwoJY29waW5zICpsaXN0WzJdWzJdOwoJY29waW5zICpyZWJ1aWxkWzJdOwp9IGNvcGRpc3BsYXk7CgpzdGF0aWMgdV9zaG9ydCBjdXJyZW50Y29wID0gMDsKCgkvKgoJICogSGFyZHdhcmUgQ3Vyc29yIEFQSSBEZWZpbml0aW9ucwoJICogVGhlc2UgdXNlZCB0byBiZSBpbiBsaW51eC9mYi5oLCBidXQgd2VyZSBwcmVsaW1pbmFyeSBhbmQgdXNlZCBieQoJICogYW1pZmIgb25seSBhbnl3YXkKCSAqLwoKI2RlZmluZSBGQklPR0VUX0ZDVVJTT1JJTkZPICAgICAweDQ2MDcKI2RlZmluZSBGQklPR0VUX1ZDVVJTT1JJTkZPICAgICAweDQ2MDgKI2RlZmluZSBGQklPUFVUX1ZDVVJTT1JJTkZPICAgICAweDQ2MDkKI2RlZmluZSBGQklPR0VUX0NVUlNPUlNUQVRFICAgICAweDQ2MEEKI2RlZmluZSBGQklPUFVUX0NVUlNPUlNUQVRFICAgICAweDQ2MEIKCgpzdHJ1Y3QgZmJfZml4X2N1cnNvcmluZm8gewoJX191MTYgY3Jzcl93aWR0aDsJCS8qIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGhlIGN1cnNvciBpbiAqLwoJX191MTYgY3Jzcl9oZWlnaHQ7CQkvKiBwaXhlbHMgKHplcm8gaWYgbm8gY3Vyc29yKQkqLwoJX191MTYgY3Jzcl94c2l6ZTsJCS8qIGN1cnNvciBzaXplIGluIGRpc3BsYXkgcGl4ZWxzICovCglfX3UxNiBjcnNyX3lzaXplOwoJX191MTYgY3Jzcl9jb2xvcjE7CQkvKiBjb2xvcm1hcCBlbnRyeSBmb3IgY3Vyc29yIGNvbG9yMSAqLwoJX191MTYgY3Jzcl9jb2xvcjI7CQkvKiBjb2xvcm1hcCBlbnRyeSBmb3IgY3Vyc29yIGNvbG9yMiAqLwp9OwoKc3RydWN0IGZiX3Zhcl9jdXJzb3JpbmZvIHsKCV9fdTE2IHdpZHRoOwoJX191MTYgaGVpZ2h0OwoJX191MTYgeHNwb3Q7CglfX3UxNiB5c3BvdDsKCV9fdTggZGF0YVsxXTsJCQkvKiBmaWVsZCB3aXRoIFtoZWlnaHRdW3dpZHRoXSAgICAgICAgKi8KfTsKCnN0cnVjdCBmYl9jdXJzb3JzdGF0ZSB7CglfX3MxNiB4b2Zmc2V0OwoJX19zMTYgeW9mZnNldDsKCV9fdTE2IG1vZGU7Cn07CgojZGVmaW5lIEZCX0NVUlNPUl9PRkYJCTAKI2RlZmluZSBGQl9DVVJTT1JfT04JCTEKI2RlZmluZSBGQl9DVVJTT1JfRkxBU0gJCTIKCgoJLyoKCSAqIEhhcmR3YXJlIEN1cnNvcgoJICovCgpzdGF0aWMgaW50IGN1cnNvcnJhdGUgPSAyMDsJLyogTnVtYmVyIG9mIGZyYW1lcy9mbGFzaCB0b2dnbGUgKi8Kc3RhdGljIHVfc2hvcnQgY3Vyc29yc3RhdGUgPSAtMTsKc3RhdGljIHVfc2hvcnQgY3Vyc29ybW9kZSA9IEZCX0NVUlNPUl9PRkY7CgpzdGF0aWMgdV9zaG9ydCAqbG9mc3ByaXRlLCAqc2hmc3ByaXRlLCAqZHVtbXlzcHJpdGU7CgoJLyoKCSAqIEN1cnJlbnQgVmlkZW8gTW9kZQoJICovCgpzdGF0aWMgc3RydWN0IGFtaWZiX3BhciB7CgoJLyogR2VuZXJhbCBWYWx1ZXMgKi8KCglpbnQgeHJlczsJCS8qIHZtb2RlICovCglpbnQgeXJlczsJCS8qIHZtb2RlICovCglpbnQgdnhyZXM7CQkvKiB2bW9kZSAqLwoJaW50IHZ5cmVzOwkJLyogdm1vZGUgKi8KCWludCB4b2Zmc2V0OwkJLyogdm1vZGUgKi8KCWludCB5b2Zmc2V0OwkJLyogdm1vZGUgKi8KCXVfc2hvcnQgYnBwOwkJLyogdm1vZGUgKi8KCXVfc2hvcnQgY2xrX3NoaWZ0OwkvKiB2bW9kZSAqLwoJdV9zaG9ydCBsaW5lX3NoaWZ0OwkvKiB2bW9kZSAqLwoJaW50IHZtb2RlOwkJLyogdm1vZGUgKi8KCXVfc2hvcnQgZGl3c3RydF9oOwkvKiB2bW9kZSAqLwoJdV9zaG9ydCBkaXdzdG9wX2g7CS8qIHZtb2RlICovCgl1X3Nob3J0IGRpd3N0cnRfdjsJLyogdm1vZGUgKi8KCXVfc2hvcnQgZGl3c3RvcF92OwkvKiB2bW9kZSAqLwoJdV9sb25nIG5leHRfbGluZTsJLyogbW9kdWxvIGZvciBuZXh0IGxpbmUgKi8KCXVfbG9uZyBuZXh0X3BsYW5lOwkvKiBtb2R1bG8gZm9yIG5leHQgcGxhbmUgKi8KCgkvKiBDdXJzb3IgVmFsdWVzICovCgoJc3RydWN0IHsKCQlzaG9ydCBjcnNyX3g7CS8qIG1vdmVjdXJzb3IgKi8KCQlzaG9ydCBjcnNyX3k7CS8qIG1vdmVjdXJzb3IgKi8KCQlzaG9ydCBzcG90X3g7CgkJc2hvcnQgc3BvdF95OwoJCXVfc2hvcnQgaGVpZ2h0OwoJCXVfc2hvcnQgd2lkdGg7CgkJdV9zaG9ydCBmbW9kZTsKCX0gY3JzcjsKCgkvKiBPQ1MgSGFyZHdhcmUgUmVnaXN0ZXJzICovCgoJdV9sb25nIGJwbHB0MDsJCS8qIHZtb2RlLCBwYW4gKE5vdGU6IHBoeXNpY2FsIGFkZHJlc3MpICovCgl1X2xvbmcgYnBscHQwd3JhcDsJLyogdm1vZGUsIHBhbiAoTm90ZTogcGh5c2ljYWwgYWRkcmVzcykgKi8KCXVfc2hvcnQgZGRmc3RydDsKCXVfc2hvcnQgZGRmc3RvcDsKCXVfc2hvcnQgYnBsMW1vZDsKCXVfc2hvcnQgYnBsMm1vZDsKCXVfc2hvcnQgYnBsY29uMDsJLyogdm1vZGUgKi8KCXVfc2hvcnQgYnBsY29uMTsJLyogdm1vZGUgKi8KCXVfc2hvcnQgaHRvdGFsOwkJLyogdm1vZGUgKi8KCXVfc2hvcnQgdnRvdGFsOwkJLyogdm1vZGUgKi8KCgkvKiBBZGRpdGlvbmFsIEVDUyBIYXJkd2FyZSBSZWdpc3RlcnMgKi8KCgl1X3Nob3J0IGJwbGNvbjM7CS8qIHZtb2RlICovCgl1X3Nob3J0IGJlYW1jb24wOwkvKiB2bW9kZSAqLwoJdV9zaG9ydCBoc3N0cnQ7CQkvKiB2bW9kZSAqLwoJdV9zaG9ydCBoc3N0b3A7CQkvKiB2bW9kZSAqLwoJdV9zaG9ydCBoYnN0cnQ7CQkvKiB2bW9kZSAqLwoJdV9zaG9ydCBoYnN0b3A7CQkvKiB2bW9kZSAqLwoJdV9zaG9ydCB2c3N0cnQ7CQkvKiB2bW9kZSAqLwoJdV9zaG9ydCB2c3N0b3A7CQkvKiB2bW9kZSAqLwoJdV9zaG9ydCB2YnN0cnQ7CQkvKiB2bW9kZSAqLwoJdV9zaG9ydCB2YnN0b3A7CQkvKiB2bW9kZSAqLwoJdV9zaG9ydCBoY2VudGVyOwkvKiB2bW9kZSAqLwoKCS8qIEFkZGl0aW9uYWwgQUdBIEhhcmR3YXJlIFJlZ2lzdGVycyAqLwoKCXVfc2hvcnQgZm1vZGU7CQkvKiB2bW9kZSAqLwp9IGN1cnJlbnRwYXI7CgoKc3RhdGljIHN0cnVjdCBmYl9pbmZvIGZiX2luZm8gPSB7CiAgICAuZml4ID0gewoJLmlkCQk9ICJBbWlnYSAiLAoJLnZpc3VhbAkJPSBGQl9WSVNVQUxfUFNFVURPQ09MT1IsCgkuYWNjZWwJCT0gRkJfQUNDRUxfQU1JR0FCTElUVAogICAgfQp9OwoKCgkvKgoJICogIFNhdmVkIGNvbG9yIGVudHJ5IDAgc28gd2UgY2FuIHJlc3RvcmUgaXQgd2hlbiB1bmJsYW5raW5nCgkgKi8KCnN0YXRpYyB1X2NoYXIgcmVkMCwgZ3JlZW4wLCBibHVlMDsKCgojaWYgZGVmaW5lZChDT05GSUdfRkJfQU1JR0FfRUNTKQpzdGF0aWMgdV9zaG9ydCBlY3NfcGFsZXR0ZVszMl07CiNlbmRpZgoKCgkvKgoJICogTGF0Y2hlcyBmb3IgRGlzcGxheSBDaGFuZ2VzIGR1cmluZyBWQmxhbmsKCSAqLwoKc3RhdGljIHVfc2hvcnQgZG9fdm1vZGVfZnVsbCA9IDA7CS8qIENoYW5nZSB0aGUgVmlkZW8gTW9kZSAqLwpzdGF0aWMgdV9zaG9ydCBkb192bW9kZV9wYW4gPSAwOwkvKiBVcGRhdGUgdGhlIFZpZGVvIE1vZGUgKi8Kc3RhdGljIHNob3J0IGRvX2JsYW5rID0gMDsJCS8qIChVbilCbGFuayB0aGUgU2NyZWVuICixMSkgKi8Kc3RhdGljIHVfc2hvcnQgZG9fY3Vyc29yID0gMDsJCS8qIE1vdmUgdGhlIEN1cnNvciAqLwoKCgkvKgoJICogVmFyaW91cyBGbGFncwoJICovCgpzdGF0aWMgdV9zaG9ydCBpc19ibGFua2VkID0gMDsJCS8qIFNjcmVlbiBpcyBCbGFua2VkICovCnN0YXRpYyB1X3Nob3J0IGlzX2xhY2UgPSAwOwkJLyogU2NyZWVuIGlzIGxhY2VkICovCgoJLyoKCSAqIFByZWRlZmluZWQgVmlkZW8gTW9kZXMKCSAqCgkgKi8KCnN0YXRpYyBzdHJ1Y3QgZmJfdmlkZW9tb2RlIGFtaV9tb2RlZGJbXSBfX2luaXRkYXRhID0gewoKICAgIC8qCiAgICAgKiAgQW1pZ2FPUyBWaWRlbyBNb2RlcwogICAgICoKICAgICAqICBJZiB5b3UgY2hhbmdlIHRoZXNlLCBtYWtlIHN1cmUgdG8gdXBkYXRlIERFRk1PREVfKiBhcyB3ZWxsIQogICAgICovCgogICAgewoJLyogNjQweDIwMCwgMTUga0h6LCA2MCBIeiAoTlRTQykgKi8KCSJudHNjIiwgNjAsIDY0MCwgMjAwLCBUQUdfSElSRVMsIDEwNiwgODYsIDQ0LCAxNiwgNzYsIDIsCglGQl9TWU5DX0JST0FEQ0FTVCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRCB8IEZCX1ZNT0RFX1lXUkFQCiAgICB9LCB7CgkvKiA2NDB4NDAwLCAxNSBrSHosIDYwIEh6IGludGVybGFjZWQgKE5UU0MpICovCgkibnRzYy1sYWNlIiwgNjAsIDY0MCwgNDAwLCBUQUdfSElSRVMsIDEwNiwgODYsIDg4LCAzMywgNzYsIDQsCglGQl9TWU5DX0JST0FEQ0FTVCwgRkJfVk1PREVfSU5URVJMQUNFRCB8IEZCX1ZNT0RFX1lXUkFQCiAgICB9LCB7CgkvKiA2NDB4MjU2LCAxNSBrSHosIDUwIEh6IChQQUwpICovCgkicGFsIiwgNTAsIDY0MCwgMjU2LCBUQUdfSElSRVMsIDEwNiwgODYsIDQwLCAxNCwgNzYsIDIsCglGQl9TWU5DX0JST0FEQ0FTVCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRCB8IEZCX1ZNT0RFX1lXUkFQCiAgICB9LCB7CgkvKiA2NDB4NTEyLCAxNSBrSHosIDUwIEh6IGludGVybGFjZWQgKFBBTCkgKi8KCSJwYWwtbGFjZSIsIDUwLCA2NDAsIDUxMiwgVEFHX0hJUkVTLCAxMDYsIDg2LCA4MCwgMjksIDc2LCA0LAoJRkJfU1lOQ19CUk9BRENBU1QsIEZCX1ZNT0RFX0lOVEVSTEFDRUQgfCBGQl9WTU9ERV9ZV1JBUAogICAgfSwgewoJLyogNjQweDQ4MCwgMjkga0h6LCA1NyBIeiAqLwoJIm11bHRpc2NhbiIsIDU3LCA2NDAsIDQ4MCwgVEFHX1NIUkVTLCA5NiwgMTEyLCAyOSwgOCwgNzIsIDgsCgkwLCBGQl9WTU9ERV9OT05JTlRFUkxBQ0VEIHwgRkJfVk1PREVfWVdSQVAKICAgIH0sIHsKCS8qIDY0MHg5NjAsIDI5IGtIeiwgNTcgSHogaW50ZXJsYWNlZCAqLwoJIm11bHRpc2Nhbi1sYWNlIiwgNTcsIDY0MCwgOTYwLCBUQUdfU0hSRVMsIDk2LCAxMTIsIDU4LCAxNiwgNzIsIDE2LAoJMCwgRkJfVk1PREVfSU5URVJMQUNFRCB8IEZCX1ZNT0RFX1lXUkFQCiAgICB9LCB7CgkvKiA2NDB4MjAwLCAxNSBrSHosIDcyIEh6ICovCgkiZXVybzM2IiwgNzIsIDY0MCwgMjAwLCBUQUdfSElSRVMsIDkyLCAxMjQsIDYsIDYsIDUyLCA1LAoJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRCB8IEZCX1ZNT0RFX1lXUkFQCiAgICB9LCB7CgkvKiA2NDB4NDAwLCAxNSBrSHosIDcyIEh6IGludGVybGFjZWQgKi8KCSJldXJvMzYtbGFjZSIsIDcyLCA2NDAsIDQwMCwgVEFHX0hJUkVTLCA5MiwgMTI0LCAxMiwgMTIsIDUyLCAxMCwKCTAsIEZCX1ZNT0RFX0lOVEVSTEFDRUQgfCBGQl9WTU9ERV9ZV1JBUAogICAgfSwgewoJLyogNjQweDQwMCwgMjkga0h6LCA2OCBIeiAqLwoJImV1cm83MiIsIDY4LCA2NDAsIDQwMCwgVEFHX1NIUkVTLCAxNjQsIDkyLCA5LCA5LCA4MCwgOCwKCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQgfCBGQl9WTU9ERV9ZV1JBUAogICAgfSwgewoJLyogNjQweDgwMCwgMjkga0h6LCA2OCBIeiBpbnRlcmxhY2VkICovCgkiZXVybzcyLWxhY2UiLCA2OCwgNjQwLCA4MDAsIFRBR19TSFJFUywgMTY0LCA5MiwgMTgsIDE4LCA4MCwgMTYsCgkwLCBGQl9WTU9ERV9JTlRFUkxBQ0VEIHwgRkJfVk1PREVfWVdSQVAKICAgIH0sIHsKCS8qIDgwMHgzMDAsIDIzIGtIeiwgNzAgSHogKi8KCSJzdXBlcjcyIiwgNzAsIDgwMCwgMzAwLCBUQUdfU0hSRVMsIDIxMiwgMTQwLCAxMCwgMTEsIDgwLCA3LAoJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRCB8IEZCX1ZNT0RFX1lXUkFQCiAgICB9LCB7CgkvKiA4MDB4NjAwLCAyMyBrSHosIDcwIEh6IGludGVybGFjZWQgKi8KCSJzdXBlcjcyLWxhY2UiLCA3MCwgODAwLCA2MDAsIFRBR19TSFJFUywgMjEyLCAxNDAsIDIwLCAyMiwgODAsIDE0LAoJMCwgRkJfVk1PREVfSU5URVJMQUNFRCB8IEZCX1ZNT0RFX1lXUkFQCiAgICB9LCB7CgkvKiA2NDB4MjAwLCAyNyBrSHosIDU3IEh6IGRvdWJsZXNjYW4gKi8KCSJkYmxudHNjIiwgNTcsIDY0MCwgMjAwLCBUQUdfU0hSRVMsIDE5NiwgMTI0LCAxOCwgMTcsIDgwLCA0LAoJMCwgRkJfVk1PREVfRE9VQkxFIHwgRkJfVk1PREVfWVdSQVAKICAgIH0sIHsKCS8qIDY0MHg0MDAsIDI3IGtIeiwgNTcgSHogKi8KCSJkYmxudHNjLWZmIiwgNTcsIDY0MCwgNDAwLCBUQUdfU0hSRVMsIDE5NiwgMTI0LCAzNiwgMzUsIDgwLCA3LAoJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRCB8IEZCX1ZNT0RFX1lXUkFQCiAgICB9LCB7CgkvKiA2NDB4ODAwLCAyNyBrSHosIDU3IEh6IGludGVybGFjZWQgKi8KCSJkYmxudHNjLWxhY2UiLCA1NywgNjQwLCA4MDAsIFRBR19TSFJFUywgMTk2LCAxMjQsIDcyLCA3MCwgODAsIDE0LAoJMCwgRkJfVk1PREVfSU5URVJMQUNFRCB8IEZCX1ZNT0RFX1lXUkFQCiAgICB9LCB7CgkvKiA2NDB4MjU2LCAyNyBrSHosIDQ3IEh6IGRvdWJsZXNjYW4gKi8KCSJkYmxwYWwiLCA0NywgNjQwLCAyNTYsIFRBR19TSFJFUywgMTk2LCAxMjQsIDE0LCAxMywgODAsIDQsCgkwLCBGQl9WTU9ERV9ET1VCTEUgfCBGQl9WTU9ERV9ZV1JBUAogICAgfSwgewoJLyogNjQweDUxMiwgMjcga0h6LCA0NyBIeiAqLwoJImRibHBhbC1mZiIsIDQ3LCA2NDAsIDUxMiwgVEFHX1NIUkVTLCAxOTYsIDEyNCwgMjgsIDI3LCA4MCwgNywKCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQgfCBGQl9WTU9ERV9ZV1JBUAogICAgfSwgewoJLyogNjQweDEwMjQsIDI3IGtIeiwgNDcgSHogaW50ZXJsYWNlZCAqLwoJImRibHBhbC1sYWNlIiwgNDcsIDY0MCwgMTAyNCwgVEFHX1NIUkVTLCAxOTYsIDEyNCwgNTYsIDU0LCA4MCwgMTQsCgkwLCBGQl9WTU9ERV9JTlRFUkxBQ0VEIHwgRkJfVk1PREVfWVdSQVAKICAgIH0sCgogICAgLyoKICAgICAqICBWR0EgVmlkZW8gTW9kZXMKICAgICAqLwoKICAgIHsKCS8qIDY0MHg0ODAsIDMxIGtIeiwgNjAgSHogKFZHQSkgKi8KCSJ2Z2EiLCA2MCwgNjQwLCA0ODAsIFRBR19TSFJFUywgNjQsIDk2LCAzMCwgOSwgMTEyLCAyLAoJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRCB8IEZCX1ZNT0RFX1lXUkFQCiAgICB9LCB7CgkvKiA2NDB4NDAwLCAzMSBrSHosIDcwIEh6IChWR0EpICovCgkidmdhNzAiLCA3MCwgNjQwLCA0MDAsIFRBR19TSFJFUywgNjQsIDk2LCAzNSwgMTIsIDExMiwgMiwKCUZCX1NZTkNfVkVSVF9ISUdIX0FDVCB8IEZCX1NZTkNfQ09NUF9ISUdIX0FDVCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRCB8IEZCX1ZNT0RFX1lXUkFQCiAgICB9LAoKI2lmIDAKCiAgICAvKgogICAgICogIEEyMDI0IHZpZGVvIG1vZGVzCiAgICAgKiAgVGhlc2UgbW9kZXMgZG9uJ3Qgd29yayB5ZXQgYmVjYXVzZSB0aGVyZSdzIG5vIEEyMDI0IGRyaXZlci4KICAgICAqLwoKICAgIHsKCS8qIDEwMjR4ODAwLCAxMCBIeiAqLwoJImEyMDI0LTEwIiwgMTAsIDEwMjQsIDgwMCwgVEFHX0hJUkVTLCAwLCAwLCAwLCAwLCAwLCAwLAoJMCwgRkJfVk1PREVfTk9OSU5URVJMQUNFRCB8IEZCX1ZNT0RFX1lXUkFQCiAgICB9LCB7CgkvKiAxMDI0eDgwMCwgMTUgSHogKi8KCSJhMjAyNC0xNSIsIDE1LCAxMDI0LCA4MDAsIFRBR19ISVJFUywgMCwgMCwgMCwgMCwgMCwgMCwKCTAsIEZCX1ZNT0RFX05PTklOVEVSTEFDRUQgfCBGQl9WTU9ERV9ZV1JBUAogICAgfQojZW5kaWYKfTsKCiNkZWZpbmUgTlVNX1RPVEFMX01PREVTICBBUlJBWV9TSVpFKGFtaV9tb2RlZGIpCgpzdGF0aWMgY2hhciAqbW9kZV9vcHRpb24gX19pbml0ZGF0YSA9IE5VTEw7CnN0YXRpYyBpbnQgcm91bmRfZG93bl9icHAgPSAxOwkvKiBmb3IgbW9kZSBwcm9iaW5nICovCgoJLyoKCSAqIFNvbWUgZGVmYXVsdCBtb2RlcwoJICovCgoKI2RlZmluZSBERUZNT0RFX1BBTAkgICAgMgkvKiAicGFsIiBmb3IgUEFMIE9DUy9FQ1MgKi8KI2RlZmluZSBERUZNT0RFX05UU0MJICAgIDAJLyogIm50c2MiIGZvciBOVFNDIE9DUy9FQ1MgKi8KI2RlZmluZSBERUZNT0RFX0FNQkVSX1BBTCAgIDMJLyogInBhbC1sYWNlIiBmb3IgZmxpY2tlciBmaXhlZCBQQUwgKEEzMDAwKSAqLwojZGVmaW5lIERFRk1PREVfQU1CRVJfTlRTQyAgMQkvKiAibnRzYy1sYWNlIiBmb3IgZmxpY2tlciBmaXhlZCBOVFNDIChBMzAwMCkgKi8KI2RlZmluZSBERUZNT0RFX0FHQQkgICAgMTkJLyogInZnYTcwIiBmb3IgQUdBICovCgoKc3RhdGljIGludCBhbWlmYl9pbGJtID0gMDsJLyogaW50ZXJsZWF2ZWQgb3Igbm9ybWFsIGJpdHBsYW5lcyAqLwpzdGF0aWMgaW50IGFtaWZiX2ludmVyc2UgPSAwOwoKCgkvKgoJICogTWFjcm9zIGZvciB0aGUgY29udmVyc2lvbiBmcm9tIHJlYWwgd29ybGQgdmFsdWVzIHRvIGhhcmR3YXJlIHJlZ2lzdGVyCgkgKiB2YWx1ZXMKCSAqCgkgKiBUaGlzIGhlbHBzIHVzIHRvIGtlZXAgb3VyIGF0dGVudGlvbiBvbiB0aGUgcmVhbCBzdHVmZi4uLgoJICoKCSAqIEhhcmR3YXJlIGxpbWl0cyBmb3IgQUdBOgoJICoKCSAqCXBhcmFtZXRlciAgbWluICAgIG1heCAgc3RlcAoJICoJLS0tLS0tLS0tICAtLS0gICAtLS0tICAtLS0tCgkgKglkaXdzdHJ0X2ggICAgMCAgIDIwNDcgICAgIDEKCSAqCWRpd3N0cnRfdiAgICAwICAgMjA0NyAgICAgMQoJICoJZGl3c3RvcF9oICAgIDAgICA0MDk1ICAgICAxCgkgKglkaXdzdG9wX3YgICAgMCAgIDQwOTUgICAgIDEKCSAqCgkgKglkZGZzdHJ0ICAgICAgMCAgIDIwMzIgICAgMTYKCSAqCWRkZnN0b3AgICAgICAwICAgMjAzMiAgICAxNgoJICoKCSAqCWh0b3RhbCAgICAgICA4ICAgMjA0OCAgICAgOAoJICoJaHNzdHJ0ICAgICAgIDAgICAyMDQwICAgICA4CgkgKgloc3N0b3AgICAgICAgMCAgIDIwNDAgICAgIDgKCSAqCXZ0b3RhbCAgICAgICAxICAgNDA5NiAgICAgMQoJICoJdnNzdHJ0ICAgICAgIDAgICA0MDk1ICAgICAxCgkgKgl2c3N0b3AgICAgICAgMCAgIDQwOTUgICAgIDEKCSAqCWhjZW50ZXIgICAgICAwICAgMjA0MCAgICAgOAoJICoKCSAqCWhic3RydCAgICAgICAwICAgMjA0NyAgICAgMQoJICoJaGJzdG9wICAgICAgIDAgICAyMDQ3ICAgICAxCgkgKgl2YnN0cnQgICAgICAgMCAgIDQwOTUgICAgIDEKCSAqCXZic3RvcCAgICAgICAwICAgNDA5NSAgICAgMQoJICoKCSAqIEhvcml6b250YWwgdmFsdWVzIGFyZSBpbiAzNSBucyAoU0hSRVMpIHBpeGVscwoJICogVmVydGljYWwgdmFsdWVzIGFyZSBpbiBoYWxmIHNjYW5saW5lcwoJICovCgovKiBicGxjb24xIChzbW9vdGggc2Nyb2xsaW5nKSAqLwoKI2RlZmluZSBoc2Nyb2xsMmh3KGhzY3JvbGwpIFwKCSgoKGhzY3JvbGwpPDwxMiAmIDB4MzAwMCkgfCAoKGhzY3JvbGwpPDw4ICYgMHhjMzAwKSB8IFwKCSAoKGhzY3JvbGwpPDw0ICYgMHgwYzAwKSB8ICgoaHNjcm9sbCk8PDIgJiAweDAwZjApIHwgKChoc2Nyb2xsKT4+MiAmIDB4MDAwZikpCgovKiBkaXdzdHJ0L2Rpd3N0b3AvZGl3aGlnaCAodmlzaWJsZSBkaXNwbGF5IHdpbmRvdykgKi8KCiNkZWZpbmUgZGl3c3RydDJodyhkaXdzdHJ0X2gsIGRpd3N0cnRfdikgXAoJKCgoZGl3c3RydF92KTw8NyAmIDB4ZmYwMCkgfCAoKGRpd3N0cnRfaCk+PjIgJiAweDAwZmYpKQojZGVmaW5lIGRpd3N0b3AyaHcoZGl3c3RvcF9oLCBkaXdzdG9wX3YpIFwKCSgoKGRpd3N0b3Bfdik8PDcgJiAweGZmMDApIHwgKChkaXdzdG9wX2gpPj4yICYgMHgwMGZmKSkKI2RlZmluZSBkaXdoaWdoMmh3KGRpd3N0cnRfaCwgZGl3c3RydF92LCBkaXdzdG9wX2gsIGRpd3N0b3BfdikgXAoJKCgoZGl3c3RvcF9oKTw8MyAmIDB4MjAwMCkgfCAoKGRpd3N0b3BfaCk8PDExICYgMHgxODAwKSB8IFwKCSAoKGRpd3N0b3Bfdik+PjEgJiAweDA3MDApIHwgKChkaXdzdHJ0X2gpPj41ICYgMHgwMDIwKSB8IFwKCSAoKGRpd3N0cnRfaCk8PDMgJiAweDAwMTgpIHwgKChkaXdzdHJ0X3YpPj45ICYgMHgwMDA3KSkKCi8qIGRkZnN0cnQvZGRmc3RvcCAoZGlzcGxheSBETUEpICovCgojZGVmaW5lIGRkZnN0cnQyaHcoZGRmc3RydCkJZGl2OChkZGZzdHJ0KQojZGVmaW5lIGRkZnN0b3AyaHcoZGRmc3RvcCkJZGl2OChkZGZzdG9wKQoKLyogaHNzdHJ0L2hzc3RvcC9odG90YWwvdnNzdHJ0L3Zzc3RvcC92dG90YWwvaGNlbnRlciAoc3luYyB0aW1pbmdzKSAqLwoKI2RlZmluZSBoc3N0cnQyaHcoaHNzdHJ0KQkoZGl2OChoc3N0cnQpKQojZGVmaW5lIGhzc3RvcDJodyhoc3N0b3ApCShkaXY4KGhzc3RvcCkpCiNkZWZpbmUgaHRvdGFsMmh3KGh0b3RhbCkJKGRpdjgoaHRvdGFsKS0xKQojZGVmaW5lIHZzc3RydDJodyh2c3N0cnQpCShkaXYyKHZzc3RydCkpCiNkZWZpbmUgdnNzdG9wMmh3KHZzc3RvcCkJKGRpdjIodnNzdG9wKSkKI2RlZmluZSB2dG90YWwyaHcodnRvdGFsKQkoZGl2Mih2dG90YWwpLTEpCiNkZWZpbmUgaGNlbnRlcjJodyhodG90YWwpCShkaXY4KGh0b3RhbCkpCgovKiBoYnN0cnQvaGJzdG9wL3Zic3RydC92YnN0b3AgKGJsYW5raW5nIHRpbWluZ3MpICovCgojZGVmaW5lIGhic3RydDJodyhoYnN0cnQpCSgoKGhic3RydCk8PDggJiAweDA3MDApIHwgKChoYnN0cnQpPj4zICYgMHgwMGZmKSkKI2RlZmluZSBoYnN0b3AyaHcoaGJzdG9wKQkoKChoYnN0b3ApPDw4ICYgMHgwNzAwKSB8ICgoaGJzdG9wKT4+MyAmIDB4MDBmZikpCiNkZWZpbmUgdmJzdHJ0Mmh3KHZic3RydCkJKGRpdjIodmJzdHJ0KSkKI2RlZmluZSB2YnN0b3AyaHcodmJzdG9wKQkoZGl2Mih2YnN0b3ApKQoKLyogY29sb3VyICovCgojZGVmaW5lIHJnYjJodzhfaGlnaChyZWQsIGdyZWVuLCBibHVlKSBcCgkoKChyZWQgJiAweGYwKTw8NCkgfCAoZ3JlZW4gJiAweGYwKSB8ICgoYmx1ZSAmIDB4ZjApPj40KSkKI2RlZmluZSByZ2IyaHc4X2xvdyhyZWQsIGdyZWVuLCBibHVlKSBcCgkoKChyZWQgJiAweDBmKTw8OCkgfCAoKGdyZWVuICYgMHgwZik8PDQpIHwgKGJsdWUgJiAweDBmKSkKI2RlZmluZSByZ2IyaHc0KHJlZCwgZ3JlZW4sIGJsdWUpIFwKCSgoKHJlZCAmIDB4ZjApPDw0KSB8IChncmVlbiAmIDB4ZjApIHwgKChibHVlICYgMHhmMCk+PjQpKQojZGVmaW5lIHJnYjJodzIocmVkLCBncmVlbiwgYmx1ZSkgXAoJKCgocmVkICYgMHhjMCk8PDQpIHwgKGdyZWVuICYgMHhjMCkgfCAoKGJsdWUgJiAweGMwKT4+NCkpCgovKiBzcHJwb3Mvc3ByY3RsIChzcHJpdGUgcG9zaXRpb25pbmcpICovCgojZGVmaW5lIHNwcjJod19wb3Moc3RhcnRfdiwgc3RhcnRfaCkgXAoJKCgoc3RhcnRfdik8PDcmMHhmZjAwKSB8ICgoc3RhcnRfaCk+PjMmMHgwMGZmKSkKI2RlZmluZSBzcHIyaHdfY3RsKHN0YXJ0X3YsIHN0YXJ0X2gsIHN0b3BfdikgXAoJKCgoc3RvcF92KTw8NyYweGZmMDApIHwgKChzdGFydF92KT4+NCYweDAwNDApIHwgKChzdG9wX3YpPj41JjB4MDAyMCkgfCBcCgkgKChzdGFydF9oKTw8MyYweDAwMTgpIHwgKChzdGFydF92KT4+NyYweDAwMDQpIHwgKChzdG9wX3YpPj44JjB4MDAwMikgfCBcCgkgKChzdGFydF9oKT4+MiYweDAwMDEpKQoKLyogZ2V0IGN1cnJlbnQgdmVydGljYWwgcG9zaXRpb24gb2YgYmVhbSAqLwojZGVmaW5lIGdldF92YnBvcygpCSgodV9zaG9ydCkoKCoodV9sb25nIHZvbGF0aWxlICopJmN1c3RvbS52cG9zciA+PiA3KSAmIDB4ZmZlKSkKCgkvKgoJICogQ29wcGVyIEluaXRpYWxpc2F0aW9uIExpc3QKCSAqLwoKI2RlZmluZSBDT1BJTklUU0laRSAoc2l6ZW9mKGNvcGlucykqNDApCgplbnVtIHsKCWNpcF9icGxjb24wCn07CgoJLyoKCSAqIExvbmcgRnJhbWUvU2hvcnQgRnJhbWUgQ29wcGVyIExpc3QKCSAqIERvbid0IGNoYW5nZSB0aGUgb3JkZXIsIGJ1aWxkX2NvcHBlcigpL3JlYnVpbGRfY29wcGVyKCkgcmVseSBvbiB0aGlzCgkgKi8KCiNkZWZpbmUgQ09QTElTVFNJWkUgKHNpemVvZihjb3BpbnMpKjY0KQoKZW51bSB7Cgljb3Bfd2FpdCwgY29wX2JwbGNvbjAsCgljb3Bfc3ByMHB0cmgsIGNvcF9zcHIwcHRybCwKCWNvcF9kaXdzdHJ0LCBjb3BfZGl3c3RvcCwKCWNvcF9kaXdoaWdoLAp9OwoKCS8qCgkgKiBQaXhlbCBtb2RlcyBmb3IgQml0cGxhbmVzIGFuZCBTcHJpdGVzCgkgKi8KCnN0YXRpYyB1X3Nob3J0IGJwbHBpeG1vZGVbM10gPSB7CglCUEMwX1NIUkVTLAkJCS8qICAzNSBucyAqLwoJQlBDMF9ISVJFUywJCQkvKiAgNzAgbnMgKi8KCTAJCQkJLyogMTQwIG5zICovCn07CgpzdGF0aWMgdV9zaG9ydCBzcHJwaXhtb2RlWzNdID0gewoJQlBDM19TUFJFUzEgfCBCUEMzX1NQUkVTMCwJLyogIDM1IG5zICovCglCUEMzX1NQUkVTMSwJCQkvKiAgNzAgbnMgKi8KCUJQQzNfU1BSRVMwCQkJLyogMTQwIG5zICovCn07CgoJLyoKCSAqIEZldGNoIG1vZGVzIGZvciBCaXRwbGFuZXMgYW5kIFNwcml0ZXMKCSAqLwoKc3RhdGljIHVfc2hvcnQgYnBsZmV0Y2htb2RlWzNdID0gewoJMCwJCQkJLyogMXggKi8KCUZNT0RFX0JQTDMyLAkJCS8qIDJ4ICovCglGTU9ERV9CUEFHRU0gfCBGTU9ERV9CUEwzMgkvKiA0eCAqLwp9OwoKc3RhdGljIHVfc2hvcnQgc3ByZmV0Y2htb2RlWzNdID0gewoJMCwJCQkJLyogMXggKi8KCUZNT0RFX1NQUjMyLAkJCS8qIDJ4ICovCglGTU9ERV9TUEFHRU0gfCBGTU9ERV9TUFIzMgkvKiA0eCAqLwp9OwoKCgkvKgoJICogSW50ZXJmYWNlIHVzZWQgYnkgdGhlIHdvcmxkCgkgKi8KCmludCBhbWlmYl9zZXR1cChjaGFyKik7CgpzdGF0aWMgaW50IGFtaWZiX2NoZWNrX3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKCQkJICAgc3RydWN0IGZiX2luZm8gKmluZm8pOwpzdGF0aWMgaW50IGFtaWZiX3NldF9wYXIoc3RydWN0IGZiX2luZm8gKmluZm8pOwpzdGF0aWMgaW50IGFtaWZiX3NldGNvbHJlZyh1bnNpZ25lZCByZWdubywgdW5zaWduZWQgcmVkLCB1bnNpZ25lZCBncmVlbiwKCQkJICAgdW5zaWduZWQgYmx1ZSwgdW5zaWduZWQgdHJhbnNwLAoJCQkgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CnN0YXRpYyBpbnQgYW1pZmJfYmxhbmsoaW50IGJsYW5rLCBzdHJ1Y3QgZmJfaW5mbyAqaW5mbyk7CnN0YXRpYyBpbnQgYW1pZmJfcGFuX2Rpc3BsYXkoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIsCgkJCSAgICAgc3RydWN0IGZiX2luZm8gKmluZm8pOwpzdGF0aWMgdm9pZCBhbWlmYl9maWxscmVjdChzdHJ1Y3QgZmJfaW5mbyAqaW5mbywKCQkJICAgY29uc3Qgc3RydWN0IGZiX2ZpbGxyZWN0ICpyZWN0KTsKc3RhdGljIHZvaWQgYW1pZmJfY29weWFyZWEoc3RydWN0IGZiX2luZm8gKmluZm8sCgkJCSAgIGNvbnN0IHN0cnVjdCBmYl9jb3B5YXJlYSAqcmVnaW9uKTsKc3RhdGljIHZvaWQgYW1pZmJfaW1hZ2VibGl0KHN0cnVjdCBmYl9pbmZvICppbmZvLAoJCQkgICAgY29uc3Qgc3RydWN0IGZiX2ltYWdlICppbWFnZSk7CnN0YXRpYyBpbnQgYW1pZmJfaW9jdGwoc3RydWN0IGZiX2luZm8gKmluZm8sIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKTsKCgoJLyoKCSAqIEludGVyZmFjZSB0byB0aGUgbG93IGxldmVsIGNvbnNvbGUgZHJpdmVyCgkgKi8KCmludCBhbWlmYl9pbml0KHZvaWQpOwpzdGF0aWMgdm9pZCBhbWlmYl9kZWluaXQodm9pZCk7CgoJLyoKCSAqIEludGVybmFsIHJvdXRpbmVzCgkgKi8KCnN0YXRpYyBpbnQgZmxhc2hfY3Vyc29yKHZvaWQpOwpzdGF0aWMgaXJxcmV0dXJuX3QgYW1pZmJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKTsKc3RhdGljIHVfbG9uZyBjaGlwYWxsb2ModV9sb25nIHNpemUpOwpzdGF0aWMgdm9pZCBjaGlwZnJlZSh2b2lkKTsKCgkvKgoJICogSGFyZHdhcmUgcm91dGluZXMKCSAqLwoKc3RhdGljIGludCBhbWlfZGVjb2RlX3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYW1pZmJfcGFyICpwYXIpOwpzdGF0aWMgaW50IGFtaV9lbmNvZGVfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhbWlmYl9wYXIgKnBhcik7CnN0YXRpYyB2b2lkIGFtaV9wYW5fdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyKTsKc3RhdGljIGludCBhbWlfdXBkYXRlX3Bhcih2b2lkKTsKc3RhdGljIHZvaWQgYW1pX3VwZGF0ZV9kaXNwbGF5KHZvaWQpOwpzdGF0aWMgdm9pZCBhbWlfaW5pdF9kaXNwbGF5KHZvaWQpOwpzdGF0aWMgdm9pZCBhbWlfZG9fYmxhbmsodm9pZCk7CnN0YXRpYyBpbnQgYW1pX2dldF9maXhfY3Vyc29yaW5mbyhzdHJ1Y3QgZmJfZml4X2N1cnNvcmluZm8gKmZpeCk7CnN0YXRpYyBpbnQgYW1pX2dldF92YXJfY3Vyc29yaW5mbyhzdHJ1Y3QgZmJfdmFyX2N1cnNvcmluZm8gKnZhciwgdV9jaGFyIF9fdXNlciAqZGF0YSk7CnN0YXRpYyBpbnQgYW1pX3NldF92YXJfY3Vyc29yaW5mbyhzdHJ1Y3QgZmJfdmFyX2N1cnNvcmluZm8gKnZhciwgdV9jaGFyIF9fdXNlciAqZGF0YSk7CnN0YXRpYyBpbnQgYW1pX2dldF9jdXJzb3JzdGF0ZShzdHJ1Y3QgZmJfY3Vyc29yc3RhdGUgKnN0YXRlKTsKc3RhdGljIGludCBhbWlfc2V0X2N1cnNvcnN0YXRlKHN0cnVjdCBmYl9jdXJzb3JzdGF0ZSAqc3RhdGUpOwpzdGF0aWMgdm9pZCBhbWlfc2V0X3Nwcml0ZSh2b2lkKTsKc3RhdGljIHZvaWQgYW1pX2luaXRfY29wcGVyKHZvaWQpOwpzdGF0aWMgdm9pZCBhbWlfcmVpbml0X2NvcHBlcih2b2lkKTsKc3RhdGljIHZvaWQgYW1pX2J1aWxkX2NvcHBlcih2b2lkKTsKc3RhdGljIHZvaWQgYW1pX3JlYnVpbGRfY29wcGVyKHZvaWQpOwoKCnN0YXRpYyBzdHJ1Y3QgZmJfb3BzIGFtaWZiX29wcyA9IHsKCS5vd25lcgkJPSBUSElTX01PRFVMRSwKCS5mYl9jaGVja192YXIJPSBhbWlmYl9jaGVja192YXIsCgkuZmJfc2V0X3Bhcgk9IGFtaWZiX3NldF9wYXIsCgkuZmJfc2V0Y29scmVnCT0gYW1pZmJfc2V0Y29scmVnLAoJLmZiX2JsYW5rCT0gYW1pZmJfYmxhbmssCgkuZmJfcGFuX2Rpc3BsYXkJPSBhbWlmYl9wYW5fZGlzcGxheSwKCS5mYl9maWxscmVjdAk9IGFtaWZiX2ZpbGxyZWN0LAoJLmZiX2NvcHlhcmVhCT0gYW1pZmJfY29weWFyZWEsCgkuZmJfaW1hZ2VibGl0CT0gYW1pZmJfaW1hZ2VibGl0LAoJLmZiX2lvY3RsCT0gYW1pZmJfaW9jdGwsCn07CgpzdGF0aWMgdm9pZCBfX2luaXQgYW1pZmJfc2V0dXBfbWNhcChjaGFyICpzcGVjKQp7CgljaGFyICpwOwoJaW50IHZtaW4sIHZtYXgsIGhtaW4sIGhtYXg7CgoJLyogRm9ybWF0IGZvciBtb25pdG9yIGNhcGFiaWxpdGllcyBpczogPFZtaW4+OzxWbWF4Pjs8SG1pbj47PEhtYXg+CgkgKiA8Vio+IHZlcnRpY2FsIGZyZXEuIGluIEh6CgkgKiA8SCo+IGhvcml6b250YWwgZnJlcS4gaW4ga0h6CgkgKi8KCglpZiAoIShwID0gc3Ryc2VwKCZzcGVjLCAiOyIpKSB8fCAhKnApCgkJcmV0dXJuOwoJdm1pbiA9IHNpbXBsZV9zdHJ0b3VsKHAsIE5VTEwsIDEwKTsKCWlmICh2bWluIDw9IDApCgkJcmV0dXJuOwoJaWYgKCEocCA9IHN0cnNlcCgmc3BlYywgIjsiKSkgfHwgISpwKQoJCXJldHVybjsKCXZtYXggPSBzaW1wbGVfc3RydG91bChwLCBOVUxMLCAxMCk7CglpZiAodm1heCA8PSAwIHx8IHZtYXggPD0gdm1pbikKCQlyZXR1cm47CglpZiAoIShwID0gc3Ryc2VwKCZzcGVjLCAiOyIpKSB8fCAhKnApCgkJcmV0dXJuOwoJaG1pbiA9IDEwMDAgKiBzaW1wbGVfc3RydG91bChwLCBOVUxMLCAxMCk7CglpZiAoaG1pbiA8PSAwKQoJCXJldHVybjsKCWlmICghKHAgPSBzdHJzZXAoJnNwZWMsICIiKSkgfHwgISpwKQoJCXJldHVybjsKCWhtYXggPSAxMDAwICogc2ltcGxlX3N0cnRvdWwocCwgTlVMTCwgMTApOwoJaWYgKGhtYXggPD0gMCB8fCBobWF4IDw9IGhtaW4pCgkJcmV0dXJuOwoKCWZiX2luZm8ubW9uc3BlY3MudmZtaW4gPSB2bWluOwoJZmJfaW5mby5tb25zcGVjcy52Zm1heCA9IHZtYXg7CglmYl9pbmZvLm1vbnNwZWNzLmhmbWluID0gaG1pbjsKCWZiX2luZm8ubW9uc3BlY3MuaGZtYXggPSBobWF4Owp9CgppbnQgX19pbml0IGFtaWZiX3NldHVwKGNoYXIgKm9wdGlvbnMpCnsKCWNoYXIgKnRoaXNfb3B0OwoKCWlmICghb3B0aW9ucyB8fCAhKm9wdGlvbnMpCgkJcmV0dXJuIDA7CgoJd2hpbGUgKCh0aGlzX29wdCA9IHN0cnNlcCgmb3B0aW9ucywgIiwiKSkgIT0gTlVMTCkgewoJCWlmICghKnRoaXNfb3B0KQoJCQljb250aW51ZTsKCQlpZiAoIXN0cmNtcCh0aGlzX29wdCwgImludmVyc2UiKSkgewoJCQlhbWlmYl9pbnZlcnNlID0gMTsKCQkJZmJfaW52ZXJ0X2NtYXBzKCk7CgkJfSBlbHNlIGlmICghc3RyY21wKHRoaXNfb3B0LCAiaWxibSIpKQoJCQlhbWlmYl9pbGJtID0gMTsKCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgIm1vbml0b3JjYXA6IiwgMTEpKQoJCQlhbWlmYl9zZXR1cF9tY2FwKHRoaXNfb3B0KzExKTsKCQllbHNlIGlmICghc3RybmNtcCh0aGlzX29wdCwgImZzdGFydDoiLCA3KSkKCQkJbWluX2ZzdHJ0ID0gc2ltcGxlX3N0cnRvdWwodGhpc19vcHQrNywgTlVMTCwgMCk7CgkJZWxzZQoJCQltb2RlX29wdGlvbiA9IHRoaXNfb3B0OwoJfQoKCWlmIChtaW5fZnN0cnQgPCA0OCkKCQltaW5fZnN0cnQgPSA0ODsKCglyZXR1cm4gMDsKfQoKCnN0YXRpYyBpbnQgYW1pZmJfY2hlY2tfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAoJCQkgICBzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKewoJaW50IGVycjsKCXN0cnVjdCBhbWlmYl9wYXIgcGFyOwoKCS8qIFZhbGlkYXRlIHdhbnRlZCBzY3JlZW4gcGFyYW1ldGVycyAqLwoJaWYgKChlcnIgPSBhbWlfZGVjb2RlX3Zhcih2YXIsICZwYXIpKSkKCQlyZXR1cm4gZXJyOwoKCS8qIEVuY29kZSAocG9zc2libHkgcm91bmRlZCkgc2NyZWVuIHBhcmFtZXRlcnMgKi8KCWFtaV9lbmNvZGVfdmFyKHZhciwgJnBhcik7CglyZXR1cm4gMDsKfQoKCnN0YXRpYyBpbnQgYW1pZmJfc2V0X3BhcihzdHJ1Y3QgZmJfaW5mbyAqaW5mbykKewoJc3RydWN0IGFtaWZiX3BhciAqcGFyID0gKHN0cnVjdCBhbWlmYl9wYXIgKilpbmZvLT5wYXI7CgoJZG9fdm1vZGVfcGFuID0gMDsKCWRvX3Ztb2RlX2Z1bGwgPSAwOwoKCS8qIERlY29kZSB3YW50ZWQgc2NyZWVuIHBhcmFtZXRlcnMgKi8KCWFtaV9kZWNvZGVfdmFyKCZpbmZvLT52YXIsIHBhcik7CgoJLyogU2V0IG5ldyB2aWRlb21vZGUgKi8KCWFtaV9idWlsZF9jb3BwZXIoKTsKCgkvKiBTZXQgVkJsYW5rIHRyaWdnZXIgKi8KCWRvX3Ztb2RlX2Z1bGwgPSAxOwoKCS8qIFVwZGF0ZSBmaXggZm9yIG5ldyBzY3JlZW4gcGFyYW1ldGVycyAqLwoJaWYgKHBhci0+YnBwID09IDEpIHsKCQlpbmZvLT5maXgudHlwZSA9IEZCX1RZUEVfUEFDS0VEX1BJWEVMUzsKCQlpbmZvLT5maXgudHlwZV9hdXggPSAwOwoJfSBlbHNlIGlmIChhbWlmYl9pbGJtKSB7CgkJaW5mby0+Zml4LnR5cGUgPSBGQl9UWVBFX0lOVEVSTEVBVkVEX1BMQU5FUzsKCQlpbmZvLT5maXgudHlwZV9hdXggPSBwYXItPm5leHRfbGluZTsKCX0gZWxzZSB7CgkJaW5mby0+Zml4LnR5cGUgPSBGQl9UWVBFX1BMQU5FUzsKCQlpbmZvLT5maXgudHlwZV9hdXggPSAwOwoJfQoJaW5mby0+Zml4LmxpbmVfbGVuZ3RoID0gZGl2OCh1cHgoMTY8PG1heGZtb2RlLCBwYXItPnZ4cmVzKSk7CgoJaWYgKHBhci0+dm1vZGUgJiBGQl9WTU9ERV9ZV1JBUCkgewoJCWluZm8tPmZpeC55d3JhcHN0ZXAgPSAxOwoJCWluZm8tPmZpeC54cGFuc3RlcCA9IDA7CgkJaW5mby0+Zml4LnlwYW5zdGVwID0gMDsKCQlpbmZvLT5mbGFncyA9IEZCSU5GT19ERUZBVUxUIHwgRkJJTkZPX0hXQUNDRUxfWVdSQVAgfAoJCSAgICBGQklORk9fUkVBRFNfRkFTVDsgLyogb3ZlcnJpZGUgU0NST0xMX1JFRFJBVyAqLwoJfSBlbHNlIHsKCQlpbmZvLT5maXgueXdyYXBzdGVwID0gMDsKCQlpZiAocGFyLT52bW9kZSAmIEZCX1ZNT0RFX1NNT09USF9YUEFOKQoJCQlpbmZvLT5maXgueHBhbnN0ZXAgPSAxOwoJCWVsc2UKCQkJaW5mby0+Zml4LnhwYW5zdGVwID0gMTY8PG1heGZtb2RlOwoJCWluZm8tPmZpeC55cGFuc3RlcCA9IDE7CgkJaW5mby0+ZmxhZ3MgPSBGQklORk9fREVGQVVMVCB8IEZCSU5GT19IV0FDQ0VMX1lQQU47Cgl9CglyZXR1cm4gMDsKfQoKCgkvKgoJICogUGFuIG9yIFdyYXAgdGhlIERpc3BsYXkKCSAqCgkgKiBUaGlzIGNhbGwgbG9va3Mgb25seSBhdCB4b2Zmc2V0LCB5b2Zmc2V0IGFuZCB0aGUgRkJfVk1PREVfWVdSQVAgZmxhZwoJICovCgpzdGF0aWMgaW50IGFtaWZiX3Bhbl9kaXNwbGF5KHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAoJCQkgICAgIHN0cnVjdCBmYl9pbmZvICppbmZvKQp7CglpZiAodmFyLT52bW9kZSAmIEZCX1ZNT0RFX1lXUkFQKSB7CgkJaWYgKHZhci0+eW9mZnNldCA8IDAgfHwKCQkgICAgdmFyLT55b2Zmc2V0ID49IGluZm8tPnZhci55cmVzX3ZpcnR1YWwgfHwgdmFyLT54b2Zmc2V0KQoJCQlyZXR1cm4gLUVJTlZBTDsKCX0gZWxzZSB7CgkJLyoKCQkgKiBUT0RPOiBUaGVyZSB3aWxsIGJlIHByb2JsZW1zIHdoZW4geHBhbiE9MSwgc28gc29tZSBjb2x1bW5zCgkJICogb24gdGhlIHJpZ2h0IHNpZGUgd2lsbCBuZXZlciBiZSBzZWVuCgkJICovCgkJaWYgKHZhci0+eG9mZnNldCtpbmZvLT52YXIueHJlcyA+IHVweCgxNjw8bWF4Zm1vZGUsIGluZm8tPnZhci54cmVzX3ZpcnR1YWwpIHx8CgkJICAgIHZhci0+eW9mZnNldCtpbmZvLT52YXIueXJlcyA+IGluZm8tPnZhci55cmVzX3ZpcnR1YWwpCgkJCXJldHVybiAtRUlOVkFMOwoJfQoJYW1pX3Bhbl92YXIodmFyKTsKCWluZm8tPnZhci54b2Zmc2V0ID0gdmFyLT54b2Zmc2V0OwoJaW5mby0+dmFyLnlvZmZzZXQgPSB2YXItPnlvZmZzZXQ7CglpZiAodmFyLT52bW9kZSAmIEZCX1ZNT0RFX1lXUkFQKQoJCWluZm8tPnZhci52bW9kZSB8PSBGQl9WTU9ERV9ZV1JBUDsKCWVsc2UKCQlpbmZvLT52YXIudm1vZGUgJj0gfkZCX1ZNT0RFX1lXUkFQOwoJcmV0dXJuIDA7Cn0KCgojaWYgQklUU19QRVJfTE9ORyA9PSAzMgojZGVmaW5lIEJZVEVTX1BFUl9MT05HCTQKI2RlZmluZSBTSElGVF9QRVJfTE9ORwk1CiNlbGlmIEJJVFNfUEVSX0xPTkcgPT0gNjQKI2RlZmluZSBCWVRFU19QRVJfTE9ORwk4CiNkZWZpbmUgU0hJRlRfUEVSX0xPTkcJNgojZWxzZQojZGVmaW5lIFBsZWFzZSB1cGRhdGUgbWUKI2VuZGlmCgoKICAgIC8qCiAgICAgKiAgQ29tcG9zZSB0d28gdmFsdWVzLCB1c2luZyBhIGJpdG1hc2sgYXMgZGVjaXNpb24gdmFsdWUKICAgICAqICBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gKGEgJiBtYXNrKSB8IChiICYgfm1hc2spCiAgICAgKi8KCnN0YXRpYyBpbmxpbmUgdW5zaWduZWQgbG9uZyBjb21wKHVuc2lnbmVkIGxvbmcgYSwgdW5zaWduZWQgbG9uZyBiLAoJCQkJIHVuc2lnbmVkIGxvbmcgbWFzaykKewoJcmV0dXJuICgoYSBeIGIpICYgbWFzaykgXiBiOwp9CgoKc3RhdGljIGlubGluZSB1bnNpZ25lZCBsb25nIHhvcih1bnNpZ25lZCBsb25nIGEsIHVuc2lnbmVkIGxvbmcgYiwKCQkJCXVuc2lnbmVkIGxvbmcgbWFzaykKewoJcmV0dXJuIChhICYgbWFzaykgXiBiOwp9CgoKICAgIC8qCiAgICAgKiAgVW5hbGlnbmVkIGZvcndhcmQgYml0IGNvcHkgdXNpbmcgMzItYml0IG9yIDY0LWJpdCBtZW1vcnkgYWNjZXNzZXMKICAgICAqLwoKc3RhdGljIHZvaWQgYml0Y3B5KHVuc2lnbmVkIGxvbmcgKmRzdCwgaW50IGRzdF9pZHgsIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnNyYywKCQkgICBpbnQgc3JjX2lkeCwgdTMyIG4pCnsKCXVuc2lnbmVkIGxvbmcgZmlyc3QsIGxhc3Q7CglpbnQgc2hpZnQgPSBkc3RfaWR4LXNyY19pZHgsIGxlZnQsIHJpZ2h0OwoJdW5zaWduZWQgbG9uZyBkMCwgZDE7CglpbnQgbTsKCglpZiAoIW4pCgkJcmV0dXJuOwoKCXNoaWZ0ID0gZHN0X2lkeC1zcmNfaWR4OwoJZmlyc3QgPSB+MFVMID4+IGRzdF9pZHg7CglsYXN0ID0gfih+MFVMID4+ICgoZHN0X2lkeCtuKSAlIEJJVFNfUEVSX0xPTkcpKTsKCglpZiAoIXNoaWZ0KSB7CgkJLy8gU2FtZSBhbGlnbm1lbnQgZm9yIHNvdXJjZSBhbmQgZGVzdAoKCQlpZiAoZHN0X2lkeCtuIDw9IEJJVFNfUEVSX0xPTkcpIHsKCQkJLy8gU2luZ2xlIHdvcmQKCQkJaWYgKGxhc3QpCgkJCQlmaXJzdCAmPSBsYXN0OwoJCQkqZHN0ID0gY29tcCgqc3JjLCAqZHN0LCBmaXJzdCk7CgkJfSBlbHNlIHsKCQkJLy8gTXVsdGlwbGUgZGVzdGluYXRpb24gd29yZHMKCQkJLy8gTGVhZGluZyBiaXRzCgkJCWlmIChmaXJzdCkgewoJCQkJKmRzdCA9IGNvbXAoKnNyYywgKmRzdCwgZmlyc3QpOwoJCQkJZHN0Kys7CgkJCQlzcmMrKzsKCQkJCW4gLT0gQklUU19QRVJfTE9ORy1kc3RfaWR4OwoJCQl9CgoJCQkvLyBNYWluIGNodW5rCgkJCW4gLz0gQklUU19QRVJfTE9ORzsKCQkJd2hpbGUgKG4gPj0gOCkgewoJCQkJKmRzdCsrID0gKnNyYysrOwoJCQkJKmRzdCsrID0gKnNyYysrOwoJCQkJKmRzdCsrID0gKnNyYysrOwoJCQkJKmRzdCsrID0gKnNyYysrOwoJCQkJKmRzdCsrID0gKnNyYysrOwoJCQkJKmRzdCsrID0gKnNyYysrOwoJCQkJKmRzdCsrID0gKnNyYysrOwoJCQkJKmRzdCsrID0gKnNyYysrOwoJCQkJbiAtPSA4OwoJCQl9CgkJCXdoaWxlIChuLS0pCgkJCQkqZHN0KysgPSAqc3JjKys7CgoJCQkvLyBUcmFpbGluZyBiaXRzCgkJCWlmIChsYXN0KQoJCQkJKmRzdCA9IGNvbXAoKnNyYywgKmRzdCwgbGFzdCk7CgkJfQoJfSBlbHNlIHsKCQkvLyBEaWZmZXJlbnQgYWxpZ25tZW50IGZvciBzb3VyY2UgYW5kIGRlc3QKCgkJcmlnaHQgPSBzaGlmdCAmIChCSVRTX1BFUl9MT05HLTEpOwoJCWxlZnQgPSAtc2hpZnQgJiAoQklUU19QRVJfTE9ORy0xKTsKCgkJaWYgKGRzdF9pZHgrbiA8PSBCSVRTX1BFUl9MT05HKSB7CgkJCS8vIFNpbmdsZSBkZXN0aW5hdGlvbiB3b3JkCgkJCWlmIChsYXN0KQoJCQkJZmlyc3QgJj0gbGFzdDsKCQkJaWYgKHNoaWZ0ID4gMCkgewoJCQkJLy8gU2luZ2xlIHNvdXJjZSB3b3JkCgkJCQkqZHN0ID0gY29tcCgqc3JjID4+IHJpZ2h0LCAqZHN0LCBmaXJzdCk7CgkJCX0gZWxzZSBpZiAoc3JjX2lkeCtuIDw9IEJJVFNfUEVSX0xPTkcpIHsKCQkJCS8vIFNpbmdsZSBzb3VyY2Ugd29yZAoJCQkJKmRzdCA9IGNvbXAoKnNyYyA8PCBsZWZ0LCAqZHN0LCBmaXJzdCk7CgkJCX0gZWxzZSB7CgkJCQkvLyAyIHNvdXJjZSB3b3JkcwoJCQkJZDAgPSAqc3JjKys7CgkJCQlkMSA9ICpzcmM7CgkJCQkqZHN0ID0gY29tcChkMCA8PCBsZWZ0IHwgZDEgPj4gcmlnaHQsICpkc3QsCgkJCQkJICAgIGZpcnN0KTsKCQkJfQoJCX0gZWxzZSB7CgkJCS8vIE11bHRpcGxlIGRlc3RpbmF0aW9uIHdvcmRzCgkJCWQwID0gKnNyYysrOwoJCQkvLyBMZWFkaW5nIGJpdHMKCQkJaWYgKHNoaWZ0ID4gMCkgewoJCQkJLy8gU2luZ2xlIHNvdXJjZSB3b3JkCgkJCQkqZHN0ID0gY29tcChkMCA+PiByaWdodCwgKmRzdCwgZmlyc3QpOwoJCQkJZHN0Kys7CgkJCQluIC09IEJJVFNfUEVSX0xPTkctZHN0X2lkeDsKCQkJfSBlbHNlIHsKCQkJCS8vIDIgc291cmNlIHdvcmRzCgkJCQlkMSA9ICpzcmMrKzsKCQkJCSpkc3QgPSBjb21wKGQwIDw8IGxlZnQgfCBkMSA+PiByaWdodCwgKmRzdCwKCQkJCQkgICAgZmlyc3QpOwoJCQkJZDAgPSBkMTsKCQkJCWRzdCsrOwoJCQkJbiAtPSBCSVRTX1BFUl9MT05HLWRzdF9pZHg7CgkJCX0KCgkJCS8vIE1haW4gY2h1bmsKCQkJbSA9IG4gJSBCSVRTX1BFUl9MT05HOwoJCQluIC89IEJJVFNfUEVSX0xPTkc7CgkJCXdoaWxlIChuID49IDQpIHsKCQkJCWQxID0gKnNyYysrOwoJCQkJKmRzdCsrID0gZDAgPDwgbGVmdCB8IGQxID4+IHJpZ2h0OwoJCQkJZDAgPSBkMTsKCQkJCWQxID0gKnNyYysrOwoJCQkJKmRzdCsrID0gZDAgPDwgbGVmdCB8IGQxID4+IHJpZ2h0OwoJCQkJZDAgPSBkMTsKCQkJCWQxID0gKnNyYysrOwoJCQkJKmRzdCsrID0gZDAgPDwgbGVmdCB8IGQxID4+IHJpZ2h0OwoJCQkJZDAgPSBkMTsKCQkJCWQxID0gKnNyYysrOwoJCQkJKmRzdCsrID0gZDAgPDwgbGVmdCB8IGQxID4+IHJpZ2h0OwoJCQkJZDAgPSBkMTsKCQkJCW4gLT0gNDsKCQkJfQoJCQl3aGlsZSAobi0tKSB7CgkJCQlkMSA9ICpzcmMrKzsKCQkJCSpkc3QrKyA9IGQwIDw8IGxlZnQgfCBkMSA+PiByaWdodDsKCQkJCWQwID0gZDE7CgkJCX0KCgkJCS8vIFRyYWlsaW5nIGJpdHMKCQkJaWYgKGxhc3QpIHsKCQkJCWlmIChtIDw9IHJpZ2h0KSB7CgkJCQkJLy8gU2luZ2xlIHNvdXJjZSB3b3JkCgkJCQkJKmRzdCA9IGNvbXAoZDAgPDwgbGVmdCwgKmRzdCwgbGFzdCk7CgkJCQl9IGVsc2UgewoJCQkJCS8vIDIgc291cmNlIHdvcmRzCgkJCQkJZDEgPSAqc3JjOwoJCQkJCSpkc3QgPSBjb21wKGQwIDw8IGxlZnQgfCBkMSA+PiByaWdodCwKCQkJCQkJICAgICpkc3QsIGxhc3QpOwoJCQkJfQoJCQl9CgkJfQoJfQp9CgoKICAgIC8qCiAgICAgKiAgVW5hbGlnbmVkIHJldmVyc2UgYml0IGNvcHkgdXNpbmcgMzItYml0IG9yIDY0LWJpdCBtZW1vcnkgYWNjZXNzZXMKICAgICAqLwoKc3RhdGljIHZvaWQgYml0Y3B5X3Jldih1bnNpZ25lZCBsb25nICpkc3QsIGludCBkc3RfaWR4LAoJCSAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nICpzcmMsIGludCBzcmNfaWR4LCB1MzIgbikKewoJdW5zaWduZWQgbG9uZyBmaXJzdCwgbGFzdDsKCWludCBzaGlmdCA9IGRzdF9pZHgtc3JjX2lkeCwgbGVmdCwgcmlnaHQ7Cgl1bnNpZ25lZCBsb25nIGQwLCBkMTsKCWludCBtOwoKCWlmICghbikKCQlyZXR1cm47CgoJZHN0ICs9IChuLTEpL0JJVFNfUEVSX0xPTkc7CglzcmMgKz0gKG4tMSkvQklUU19QRVJfTE9ORzsKCWlmICgobi0xKSAlIEJJVFNfUEVSX0xPTkcpIHsKCQlkc3RfaWR4ICs9IChuLTEpICUgQklUU19QRVJfTE9ORzsKCQlkc3QgKz0gZHN0X2lkeCA+PiBTSElGVF9QRVJfTE9ORzsKCQlkc3RfaWR4ICY9IEJJVFNfUEVSX0xPTkctMTsKCQlzcmNfaWR4ICs9IChuLTEpICUgQklUU19QRVJfTE9ORzsKCQlzcmMgKz0gc3JjX2lkeCA+PiBTSElGVF9QRVJfTE9ORzsKCQlzcmNfaWR4ICY9IEJJVFNfUEVSX0xPTkctMTsKCX0KCglzaGlmdCA9IGRzdF9pZHgtc3JjX2lkeDsKCWZpcnN0ID0gfjBVTCA8PCAoQklUU19QRVJfTE9ORy0xLWRzdF9pZHgpOwoJbGFzdCA9IH4ofjBVTCA8PCAoQklUU19QRVJfTE9ORy0xLSgoZHN0X2lkeC1uKSAlIEJJVFNfUEVSX0xPTkcpKSk7CgoJaWYgKCFzaGlmdCkgewoJCS8vIFNhbWUgYWxpZ25tZW50IGZvciBzb3VyY2UgYW5kIGRlc3QKCgkJaWYgKCh1bnNpZ25lZCBsb25nKWRzdF9pZHgrMSA+PSBuKSB7CgkJCS8vIFNpbmdsZSB3b3JkCgkJCWlmIChsYXN0KQoJCQkJZmlyc3QgJj0gbGFzdDsKCQkJKmRzdCA9IGNvbXAoKnNyYywgKmRzdCwgZmlyc3QpOwoJCX0gZWxzZSB7CgkJCS8vIE11bHRpcGxlIGRlc3RpbmF0aW9uIHdvcmRzCgkJCS8vIExlYWRpbmcgYml0cwoJCQlpZiAoZmlyc3QpIHsKCQkJCSpkc3QgPSBjb21wKCpzcmMsICpkc3QsIGZpcnN0KTsKCQkJCWRzdC0tOwoJCQkJc3JjLS07CgkJCQluIC09IGRzdF9pZHgrMTsKCQkJfQoKCQkJLy8gTWFpbiBjaHVuawoJCQluIC89IEJJVFNfUEVSX0xPTkc7CgkJCXdoaWxlIChuID49IDgpIHsKCQkJCSpkc3QtLSA9ICpzcmMtLTsKCQkJCSpkc3QtLSA9ICpzcmMtLTsKCQkJCSpkc3QtLSA9ICpzcmMtLTsKCQkJCSpkc3QtLSA9ICpzcmMtLTsKCQkJCSpkc3QtLSA9ICpzcmMtLTsKCQkJCSpkc3QtLSA9ICpzcmMtLTsKCQkJCSpkc3QtLSA9ICpzcmMtLTsKCQkJCSpkc3QtLSA9ICpzcmMtLTsKCQkJCW4gLT0gODsKCQkJfQoJCQl3aGlsZSAobi0tKQoJCQkJKmRzdC0tID0gKnNyYy0tOwoKCQkJLy8gVHJhaWxpbmcgYml0cwoJCQlpZiAobGFzdCkKCQkJCSpkc3QgPSBjb21wKCpzcmMsICpkc3QsIGxhc3QpOwoJCX0KCX0gZWxzZSB7CgkJLy8gRGlmZmVyZW50IGFsaWdubWVudCBmb3Igc291cmNlIGFuZCBkZXN0CgoJCXJpZ2h0ID0gc2hpZnQgJiAoQklUU19QRVJfTE9ORy0xKTsKCQlsZWZ0ID0gLXNoaWZ0ICYgKEJJVFNfUEVSX0xPTkctMSk7CgoJCWlmICgodW5zaWduZWQgbG9uZylkc3RfaWR4KzEgPj0gbikgewoJCQkvLyBTaW5nbGUgZGVzdGluYXRpb24gd29yZAoJCQlpZiAobGFzdCkKCQkJCWZpcnN0ICY9IGxhc3Q7CgkJCWlmIChzaGlmdCA8IDApIHsKCQkJCS8vIFNpbmdsZSBzb3VyY2Ugd29yZAoJCQkJKmRzdCA9IGNvbXAoKnNyYyA8PCBsZWZ0LCAqZHN0LCBmaXJzdCk7CgkJCX0gZWxzZSBpZiAoMSsodW5zaWduZWQgbG9uZylzcmNfaWR4ID49IG4pIHsKCQkJCS8vIFNpbmdsZSBzb3VyY2Ugd29yZAoJCQkJKmRzdCA9IGNvbXAoKnNyYyA+PiByaWdodCwgKmRzdCwgZmlyc3QpOwoJCQl9IGVsc2UgewoJCQkJLy8gMiBzb3VyY2Ugd29yZHMKCQkJCWQwID0gKnNyYy0tOwoJCQkJZDEgPSAqc3JjOwoJCQkJKmRzdCA9IGNvbXAoZDAgPj4gcmlnaHQgfCBkMSA8PCBsZWZ0LCAqZHN0LAoJCQkJCSAgICBmaXJzdCk7CgkJCX0KCQl9IGVsc2UgewoJCQkvLyBNdWx0aXBsZSBkZXN0aW5hdGlvbiB3b3JkcwoJCQlkMCA9ICpzcmMtLTsKCQkJLy8gTGVhZGluZyBiaXRzCgkJCWlmIChzaGlmdCA8IDApIHsKCQkJCS8vIFNpbmdsZSBzb3VyY2Ugd29yZAoJCQkJKmRzdCA9IGNvbXAoZDAgPDwgbGVmdCwgKmRzdCwgZmlyc3QpOwoJCQkJZHN0LS07CgkJCQluIC09IGRzdF9pZHgrMTsKCQkJfSBlbHNlIHsKCQkJCS8vIDIgc291cmNlIHdvcmRzCgkJCQlkMSA9ICpzcmMtLTsKCQkJCSpkc3QgPSBjb21wKGQwID4+IHJpZ2h0IHwgZDEgPDwgbGVmdCwgKmRzdCwKCQkJCQkgICAgZmlyc3QpOwoJCQkJZDAgPSBkMTsKCQkJCWRzdC0tOwoJCQkJbiAtPSBkc3RfaWR4KzE7CgkJCX0KCgkJCS8vIE1haW4gY2h1bmsKCQkJbSA9IG4gJSBCSVRTX1BFUl9MT05HOwoJCQluIC89IEJJVFNfUEVSX0xPTkc7CgkJCXdoaWxlIChuID49IDQpIHsKCQkJCWQxID0gKnNyYy0tOwoJCQkJKmRzdC0tID0gZDAgPj4gcmlnaHQgfCBkMSA8PCBsZWZ0OwoJCQkJZDAgPSBkMTsKCQkJCWQxID0gKnNyYy0tOwoJCQkJKmRzdC0tID0gZDAgPj4gcmlnaHQgfCBkMSA8PCBsZWZ0OwoJCQkJZDAgPSBkMTsKCQkJCWQxID0gKnNyYy0tOwoJCQkJKmRzdC0tID0gZDAgPj4gcmlnaHQgfCBkMSA8PCBsZWZ0OwoJCQkJZDAgPSBkMTsKCQkJCWQxID0gKnNyYy0tOwoJCQkJKmRzdC0tID0gZDAgPj4gcmlnaHQgfCBkMSA8PCBsZWZ0OwoJCQkJZDAgPSBkMTsKCQkJCW4gLT0gNDsKCQkJfQoJCQl3aGlsZSAobi0tKSB7CgkJCQlkMSA9ICpzcmMtLTsKCQkJCSpkc3QtLSA9IGQwID4+IHJpZ2h0IHwgZDEgPDwgbGVmdDsKCQkJCWQwID0gZDE7CgkJCX0KCgkJCS8vIFRyYWlsaW5nIGJpdHMKCQkJaWYgKGxhc3QpIHsKCQkJCWlmIChtIDw9IGxlZnQpIHsKCQkJCQkvLyBTaW5nbGUgc291cmNlIHdvcmQKCQkJCQkqZHN0ID0gY29tcChkMCA+PiByaWdodCwgKmRzdCwgbGFzdCk7CgkJCQl9IGVsc2UgewoJCQkJCS8vIDIgc291cmNlIHdvcmRzCgkJCQkJZDEgPSAqc3JjOwoJCQkJCSpkc3QgPSBjb21wKGQwID4+IHJpZ2h0IHwgZDEgPDwgbGVmdCwKCQkJCQkJICAgICpkc3QsIGxhc3QpOwoJCQkJfQoJCQl9CgkJfQoJfQp9CgoKICAgIC8qCiAgICAgKiAgVW5hbGlnbmVkIGZvcndhcmQgaW52ZXJ0aW5nIGJpdCBjb3B5IHVzaW5nIDMyLWJpdCBvciA2NC1iaXQgbWVtb3J5CiAgICAgKiAgYWNjZXNzZXMKICAgICAqLwoKc3RhdGljIHZvaWQgYml0Y3B5X25vdCh1bnNpZ25lZCBsb25nICpkc3QsIGludCBkc3RfaWR4LAoJCSAgICAgICBjb25zdCB1bnNpZ25lZCBsb25nICpzcmMsIGludCBzcmNfaWR4LCB1MzIgbikKewoJdW5zaWduZWQgbG9uZyBmaXJzdCwgbGFzdDsKCWludCBzaGlmdCA9IGRzdF9pZHgtc3JjX2lkeCwgbGVmdCwgcmlnaHQ7Cgl1bnNpZ25lZCBsb25nIGQwLCBkMTsKCWludCBtOwoKCWlmICghbikKCQlyZXR1cm47CgoJc2hpZnQgPSBkc3RfaWR4LXNyY19pZHg7CglmaXJzdCA9IH4wVUwgPj4gZHN0X2lkeDsKCWxhc3QgPSB+KH4wVUwgPj4gKChkc3RfaWR4K24pICUgQklUU19QRVJfTE9ORykpOwoKCWlmICghc2hpZnQpIHsKCQkvLyBTYW1lIGFsaWdubWVudCBmb3Igc291cmNlIGFuZCBkZXN0CgoJCWlmIChkc3RfaWR4K24gPD0gQklUU19QRVJfTE9ORykgewoJCQkvLyBTaW5nbGUgd29yZAoJCQlpZiAobGFzdCkKCQkJCWZpcnN0ICY9IGxhc3Q7CgkJCSpkc3QgPSBjb21wKH4qc3JjLCAqZHN0LCBmaXJzdCk7CgkJfSBlbHNlIHsKCQkJLy8gTXVsdGlwbGUgZGVzdGluYXRpb24gd29yZHMKCQkJLy8gTGVhZGluZyBiaXRzCgkJCWlmIChmaXJzdCkgewoJCQkJKmRzdCA9IGNvbXAofipzcmMsICpkc3QsIGZpcnN0KTsKCQkJCWRzdCsrOwoJCQkJc3JjKys7CgkJCQluIC09IEJJVFNfUEVSX0xPTkctZHN0X2lkeDsKCQkJfQoKCQkJLy8gTWFpbiBjaHVuawoJCQluIC89IEJJVFNfUEVSX0xPTkc7CgkJCXdoaWxlIChuID49IDgpIHsKCQkJCSpkc3QrKyA9IH4qc3JjKys7CgkJCQkqZHN0KysgPSB+KnNyYysrOwoJCQkJKmRzdCsrID0gfipzcmMrKzsKCQkJCSpkc3QrKyA9IH4qc3JjKys7CgkJCQkqZHN0KysgPSB+KnNyYysrOwoJCQkJKmRzdCsrID0gfipzcmMrKzsKCQkJCSpkc3QrKyA9IH4qc3JjKys7CgkJCQkqZHN0KysgPSB+KnNyYysrOwoJCQkJbiAtPSA4OwoJCQl9CgkJCXdoaWxlIChuLS0pCgkJCQkqZHN0KysgPSB+KnNyYysrOwoKCQkJLy8gVHJhaWxpbmcgYml0cwoJCQlpZiAobGFzdCkKCQkJCSpkc3QgPSBjb21wKH4qc3JjLCAqZHN0LCBsYXN0KTsKCQl9Cgl9IGVsc2UgewoJCS8vIERpZmZlcmVudCBhbGlnbm1lbnQgZm9yIHNvdXJjZSBhbmQgZGVzdAoKCQlyaWdodCA9IHNoaWZ0ICYgKEJJVFNfUEVSX0xPTkctMSk7CgkJbGVmdCA9IC1zaGlmdCAmIChCSVRTX1BFUl9MT05HLTEpOwoKCQlpZiAoZHN0X2lkeCtuIDw9IEJJVFNfUEVSX0xPTkcpIHsKCQkJLy8gU2luZ2xlIGRlc3RpbmF0aW9uIHdvcmQKCQkJaWYgKGxhc3QpCgkJCQlmaXJzdCAmPSBsYXN0OwoJCQlpZiAoc2hpZnQgPiAwKSB7CgkJCQkvLyBTaW5nbGUgc291cmNlIHdvcmQKCQkJCSpkc3QgPSBjb21wKH4qc3JjID4+IHJpZ2h0LCAqZHN0LCBmaXJzdCk7CgkJCX0gZWxzZSBpZiAoc3JjX2lkeCtuIDw9IEJJVFNfUEVSX0xPTkcpIHsKCQkJCS8vIFNpbmdsZSBzb3VyY2Ugd29yZAoJCQkJKmRzdCA9IGNvbXAofipzcmMgPDwgbGVmdCwgKmRzdCwgZmlyc3QpOwoJCQl9IGVsc2UgewoJCQkJLy8gMiBzb3VyY2Ugd29yZHMKCQkJCWQwID0gfipzcmMrKzsKCQkJCWQxID0gfipzcmM7CgkJCQkqZHN0ID0gY29tcChkMCA8PCBsZWZ0IHwgZDEgPj4gcmlnaHQsICpkc3QsCgkJCQkJICAgIGZpcnN0KTsKCQkJfQoJCX0gZWxzZSB7CgkJCS8vIE11bHRpcGxlIGRlc3RpbmF0aW9uIHdvcmRzCgkJCWQwID0gfipzcmMrKzsKCQkJLy8gTGVhZGluZyBiaXRzCgkJCWlmIChzaGlmdCA+IDApIHsKCQkJCS8vIFNpbmdsZSBzb3VyY2Ugd29yZAoJCQkJKmRzdCA9IGNvbXAoZDAgPj4gcmlnaHQsICpkc3QsIGZpcnN0KTsKCQkJCWRzdCsrOwoJCQkJbiAtPSBCSVRTX1BFUl9MT05HLWRzdF9pZHg7CgkJCX0gZWxzZSB7CgkJCQkvLyAyIHNvdXJjZSB3b3JkcwoJCQkJZDEgPSB+KnNyYysrOwoJCQkJKmRzdCA9IGNvbXAoZDAgPDwgbGVmdCB8IGQxID4+IHJpZ2h0LCAqZHN0LAoJCQkJCSAgICBmaXJzdCk7CgkJCQlkMCA9IGQxOwoJCQkJZHN0Kys7CgkJCQluIC09IEJJVFNfUEVSX0xPTkctZHN0X2lkeDsKCQkJfQoKCQkJLy8gTWFpbiBjaHVuawoJCQltID0gbiAlIEJJVFNfUEVSX0xPTkc7CgkJCW4gLz0gQklUU19QRVJfTE9ORzsKCQkJd2hpbGUgKG4gPj0gNCkgewoJCQkJZDEgPSB+KnNyYysrOwoJCQkJKmRzdCsrID0gZDAgPDwgbGVmdCB8IGQxID4+IHJpZ2h0OwoJCQkJZDAgPSBkMTsKCQkJCWQxID0gfipzcmMrKzsKCQkJCSpkc3QrKyA9IGQwIDw8IGxlZnQgfCBkMSA+PiByaWdodDsKCQkJCWQwID0gZDE7CgkJCQlkMSA9IH4qc3JjKys7CgkJCQkqZHN0KysgPSBkMCA8PCBsZWZ0IHwgZDEgPj4gcmlnaHQ7CgkJCQlkMCA9IGQxOwoJCQkJZDEgPSB+KnNyYysrOwoJCQkJKmRzdCsrID0gZDAgPDwgbGVmdCB8IGQxID4+IHJpZ2h0OwoJCQkJZDAgPSBkMTsKCQkJCW4gLT0gNDsKCQkJfQoJCQl3aGlsZSAobi0tKSB7CgkJCQlkMSA9IH4qc3JjKys7CgkJCQkqZHN0KysgPSBkMCA8PCBsZWZ0IHwgZDEgPj4gcmlnaHQ7CgkJCQlkMCA9IGQxOwoJCQl9CgoJCQkvLyBUcmFpbGluZyBiaXRzCgkJCWlmIChsYXN0KSB7CgkJCQlpZiAobSA8PSByaWdodCkgewoJCQkJCS8vIFNpbmdsZSBzb3VyY2Ugd29yZAoJCQkJCSpkc3QgPSBjb21wKGQwIDw8IGxlZnQsICpkc3QsIGxhc3QpOwoJCQkJfSBlbHNlIHsKCQkJCQkvLyAyIHNvdXJjZSB3b3JkcwoJCQkJCWQxID0gfipzcmM7CgkJCQkJKmRzdCA9IGNvbXAoZDAgPDwgbGVmdCB8IGQxID4+IHJpZ2h0LAoJCQkJCQkgICAgKmRzdCwgbGFzdCk7CgkJCQl9CgkJCX0KCQl9Cgl9Cn0KCgogICAgLyoKICAgICAqICBVbmFsaWduZWQgMzItYml0IHBhdHRlcm4gZmlsbCB1c2luZyAzMi82NC1iaXQgbWVtb3J5IGFjY2Vzc2VzCiAgICAgKi8KCnN0YXRpYyB2b2lkIGJpdGZpbGwzMih1bnNpZ25lZCBsb25nICpkc3QsIGludCBkc3RfaWR4LCB1MzIgcGF0LCB1MzIgbikKewoJdW5zaWduZWQgbG9uZyB2YWwgPSBwYXQ7Cgl1bnNpZ25lZCBsb25nIGZpcnN0LCBsYXN0OwoKCWlmICghbikKCQlyZXR1cm47CgojaWYgQklUU19QRVJfTE9ORyA9PSA2NAoJdmFsIHw9IHZhbCA8PCAzMjsKI2VuZGlmCgoJZmlyc3QgPSB+MFVMID4+IGRzdF9pZHg7CglsYXN0ID0gfih+MFVMID4+ICgoZHN0X2lkeCtuKSAlIEJJVFNfUEVSX0xPTkcpKTsKCglpZiAoZHN0X2lkeCtuIDw9IEJJVFNfUEVSX0xPTkcpIHsKCQkvLyBTaW5nbGUgd29yZAoJCWlmIChsYXN0KQoJCQlmaXJzdCAmPSBsYXN0OwoJCSpkc3QgPSBjb21wKHZhbCwgKmRzdCwgZmlyc3QpOwoJfSBlbHNlIHsKCQkvLyBNdWx0aXBsZSBkZXN0aW5hdGlvbiB3b3JkcwoJCS8vIExlYWRpbmcgYml0cwoJCWlmIChmaXJzdCkgewoJCQkqZHN0ID0gY29tcCh2YWwsICpkc3QsIGZpcnN0KTsKCQkJZHN0Kys7CgkJCW4gLT0gQklUU19QRVJfTE9ORy1kc3RfaWR4OwoJCX0KCgkJLy8gTWFpbiBjaHVuawoJCW4gLz0gQklUU19QRVJfTE9ORzsKCQl3aGlsZSAobiA+PSA4KSB7CgkJCSpkc3QrKyA9IHZhbDsKCQkJKmRzdCsrID0gdmFsOwoJCQkqZHN0KysgPSB2YWw7CgkJCSpkc3QrKyA9IHZhbDsKCQkJKmRzdCsrID0gdmFsOwoJCQkqZHN0KysgPSB2YWw7CgkJCSpkc3QrKyA9IHZhbDsKCQkJKmRzdCsrID0gdmFsOwoJCQluIC09IDg7CgkJfQoJCXdoaWxlIChuLS0pCgkJCSpkc3QrKyA9IHZhbDsKCgkJLy8gVHJhaWxpbmcgYml0cwoJCWlmIChsYXN0KQoJCQkqZHN0ID0gY29tcCh2YWwsICpkc3QsIGxhc3QpOwoJfQp9CgoKICAgIC8qCiAgICAgKiAgVW5hbGlnbmVkIDMyLWJpdCBwYXR0ZXJuIHhvciB1c2luZyAzMi82NC1iaXQgbWVtb3J5IGFjY2Vzc2VzCiAgICAgKi8KCnN0YXRpYyB2b2lkIGJpdHhvcjMyKHVuc2lnbmVkIGxvbmcgKmRzdCwgaW50IGRzdF9pZHgsIHUzMiBwYXQsIHUzMiBuKQp7Cgl1bnNpZ25lZCBsb25nIHZhbCA9IHBhdDsKCXVuc2lnbmVkIGxvbmcgZmlyc3QsIGxhc3Q7CgoJaWYgKCFuKQoJCXJldHVybjsKCiNpZiBCSVRTX1BFUl9MT05HID09IDY0Cgl2YWwgfD0gdmFsIDw8IDMyOwojZW5kaWYKCglmaXJzdCA9IH4wVUwgPj4gZHN0X2lkeDsKCWxhc3QgPSB+KH4wVUwgPj4gKChkc3RfaWR4K24pICUgQklUU19QRVJfTE9ORykpOwoKCWlmIChkc3RfaWR4K24gPD0gQklUU19QRVJfTE9ORykgewoJCS8vIFNpbmdsZSB3b3JkCgkJaWYgKGxhc3QpCgkJCWZpcnN0ICY9IGxhc3Q7CgkJKmRzdCA9IHhvcih2YWwsICpkc3QsIGZpcnN0KTsKCX0gZWxzZSB7CgkJLy8gTXVsdGlwbGUgZGVzdGluYXRpb24gd29yZHMKCQkvLyBMZWFkaW5nIGJpdHMKCQlpZiAoZmlyc3QpIHsKCQkJKmRzdCA9IHhvcih2YWwsICpkc3QsIGZpcnN0KTsKCQkJZHN0Kys7CgkJCW4gLT0gQklUU19QRVJfTE9ORy1kc3RfaWR4OwoJCX0KCgkJLy8gTWFpbiBjaHVuawoJCW4gLz0gQklUU19QRVJfTE9ORzsKCQl3aGlsZSAobiA+PSA0KSB7CgkJCSpkc3QrKyBePSB2YWw7CgkJCSpkc3QrKyBePSB2YWw7CgkJCSpkc3QrKyBePSB2YWw7CgkJCSpkc3QrKyBePSB2YWw7CgkJCW4gLT0gNDsKCQl9CgkJd2hpbGUgKG4tLSkKCQkJKmRzdCsrIF49IHZhbDsKCgkJLy8gVHJhaWxpbmcgYml0cwoJCWlmIChsYXN0KQoJCQkqZHN0ID0geG9yKHZhbCwgKmRzdCwgbGFzdCk7Cgl9Cn0KCnN0YXRpYyBpbmxpbmUgdm9pZCBmaWxsX29uZV9saW5lKGludCBicHAsIHVuc2lnbmVkIGxvbmcgbmV4dF9wbGFuZSwKCQkJCSB1bnNpZ25lZCBsb25nICpkc3QsIGludCBkc3RfaWR4LCB1MzIgbiwKCQkJCSB1MzIgY29sb3IpCnsKCXdoaWxlICgxKSB7CgkJZHN0ICs9IGRzdF9pZHggPj4gU0hJRlRfUEVSX0xPTkc7CgkJZHN0X2lkeCAmPSAoQklUU19QRVJfTE9ORy0xKTsKCQliaXRmaWxsMzIoZHN0LCBkc3RfaWR4LCBjb2xvciAmIDEgPyB+MCA6IDAsIG4pOwoJCWlmICghLS1icHApCgkJCWJyZWFrOwoJCWNvbG9yID4+PSAxOwoJCWRzdF9pZHggKz0gbmV4dF9wbGFuZSo4OwoJfQp9CgpzdGF0aWMgaW5saW5lIHZvaWQgeG9yX29uZV9saW5lKGludCBicHAsIHVuc2lnbmVkIGxvbmcgbmV4dF9wbGFuZSwKCQkJCXVuc2lnbmVkIGxvbmcgKmRzdCwgaW50IGRzdF9pZHgsIHUzMiBuLAoJCQkJdTMyIGNvbG9yKQp7Cgl3aGlsZSAoY29sb3IpIHsKCQlkc3QgKz0gZHN0X2lkeCA+PiBTSElGVF9QRVJfTE9ORzsKCQlkc3RfaWR4ICY9IChCSVRTX1BFUl9MT05HLTEpOwoJCWJpdHhvcjMyKGRzdCwgZHN0X2lkeCwgY29sb3IgJiAxID8gfjAgOiAwLCBuKTsKCQlpZiAoIS0tYnBwKQoJCQlicmVhazsKCQljb2xvciA+Pj0gMTsKCQlkc3RfaWR4ICs9IG5leHRfcGxhbmUqODsKCX0KfQoKCnN0YXRpYyB2b2lkIGFtaWZiX2ZpbGxyZWN0KHN0cnVjdCBmYl9pbmZvICppbmZvLAoJCQkgICBjb25zdCBzdHJ1Y3QgZmJfZmlsbHJlY3QgKnJlY3QpCnsKCXN0cnVjdCBhbWlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYW1pZmJfcGFyICopaW5mby0+cGFyOwoJaW50IGRzdF9pZHgsIHgyLCB5MjsKCXVuc2lnbmVkIGxvbmcgKmRzdDsKCXUzMiB3aWR0aCwgaGVpZ2h0OwoKCWlmICghcmVjdC0+d2lkdGggfHwgIXJlY3QtPmhlaWdodCkKCQlyZXR1cm47CgoJLyoKCSAqIFdlIGNvdWxkIHVzZSBoYXJkd2FyZSBjbGlwcGluZyBidXQgb24gbWFueSBjYXJkcyB5b3UgZ2V0IGFyb3VuZAoJICogaGFyZHdhcmUgY2xpcHBpbmcgYnkgd3JpdGluZyB0byBmcmFtZWJ1ZmZlciBkaXJlY3RseS4KCSAqICovCgl4MiA9IHJlY3QtPmR4ICsgcmVjdC0+d2lkdGg7Cgl5MiA9IHJlY3QtPmR5ICsgcmVjdC0+aGVpZ2h0OwoJeDIgPSB4MiA8IGluZm8tPnZhci54cmVzX3ZpcnR1YWwgPyB4MiA6IGluZm8tPnZhci54cmVzX3ZpcnR1YWw7Cgl5MiA9IHkyIDwgaW5mby0+dmFyLnlyZXNfdmlydHVhbCA/IHkyIDogaW5mby0+dmFyLnlyZXNfdmlydHVhbDsKCXdpZHRoID0geDIgLSByZWN0LT5keDsKCWhlaWdodCA9IHkyIC0gcmVjdC0+ZHk7CgoJZHN0ID0gKHVuc2lnbmVkIGxvbmcgKikKCQkoKHVuc2lnbmVkIGxvbmcpaW5mby0+c2NyZWVuX2Jhc2UgJiB+KEJZVEVTX1BFUl9MT05HLTEpKTsKCWRzdF9pZHggPSAoKHVuc2lnbmVkIGxvbmcpaW5mby0+c2NyZWVuX2Jhc2UgJiAoQllURVNfUEVSX0xPTkctMSkpKjg7Cglkc3RfaWR4ICs9IHJlY3QtPmR5KnBhci0+bmV4dF9saW5lKjgrcmVjdC0+ZHg7Cgl3aGlsZSAoaGVpZ2h0LS0pIHsKCQlzd2l0Y2ggKHJlY3QtPnJvcCkgewoJCSAgICBjYXNlIFJPUF9DT1BZOgoJCQlmaWxsX29uZV9saW5lKGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCwKCQkJCSAgICAgIHBhci0+bmV4dF9wbGFuZSwgZHN0LCBkc3RfaWR4LCB3aWR0aCwKCQkJCSAgICAgIHJlY3QtPmNvbG9yKTsKCQkJYnJlYWs7CgoJCSAgICBjYXNlIFJPUF9YT1I6CgkJCXhvcl9vbmVfbGluZShpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwsIHBhci0+bmV4dF9wbGFuZSwKCQkJCSAgICAgZHN0LCBkc3RfaWR4LCB3aWR0aCwgcmVjdC0+Y29sb3IpOwoJCQlicmVhazsKCQl9CgkJZHN0X2lkeCArPSBwYXItPm5leHRfbGluZSo4OwoJfQp9CgpzdGF0aWMgaW5saW5lIHZvaWQgY29weV9vbmVfbGluZShpbnQgYnBwLCB1bnNpZ25lZCBsb25nIG5leHRfcGxhbmUsCgkJCQkgdW5zaWduZWQgbG9uZyAqZHN0LCBpbnQgZHN0X2lkeCwKCQkJCSB1bnNpZ25lZCBsb25nICpzcmMsIGludCBzcmNfaWR4LCB1MzIgbikKewoJd2hpbGUgKDEpIHsKCQlkc3QgKz0gZHN0X2lkeCA+PiBTSElGVF9QRVJfTE9ORzsKCQlkc3RfaWR4ICY9IChCSVRTX1BFUl9MT05HLTEpOwoJCXNyYyArPSBzcmNfaWR4ID4+IFNISUZUX1BFUl9MT05HOwoJCXNyY19pZHggJj0gKEJJVFNfUEVSX0xPTkctMSk7CgkJYml0Y3B5KGRzdCwgZHN0X2lkeCwgc3JjLCBzcmNfaWR4LCBuKTsKCQlpZiAoIS0tYnBwKQoJCQlicmVhazsKCQlkc3RfaWR4ICs9IG5leHRfcGxhbmUqODsKCQlzcmNfaWR4ICs9IG5leHRfcGxhbmUqODsKCX0KfQoKc3RhdGljIGlubGluZSB2b2lkIGNvcHlfb25lX2xpbmVfcmV2KGludCBicHAsIHVuc2lnbmVkIGxvbmcgbmV4dF9wbGFuZSwKCQkJCSAgICAgdW5zaWduZWQgbG9uZyAqZHN0LCBpbnQgZHN0X2lkeCwKCQkJCSAgICAgdW5zaWduZWQgbG9uZyAqc3JjLCBpbnQgc3JjX2lkeCwgdTMyIG4pCnsKCXdoaWxlICgxKSB7CgkJZHN0ICs9IGRzdF9pZHggPj4gU0hJRlRfUEVSX0xPTkc7CgkJZHN0X2lkeCAmPSAoQklUU19QRVJfTE9ORy0xKTsKCQlzcmMgKz0gc3JjX2lkeCA+PiBTSElGVF9QRVJfTE9ORzsKCQlzcmNfaWR4ICY9IChCSVRTX1BFUl9MT05HLTEpOwoJCWJpdGNweV9yZXYoZHN0LCBkc3RfaWR4LCBzcmMsIHNyY19pZHgsIG4pOwoJCWlmICghLS1icHApCgkJCWJyZWFrOwoJCWRzdF9pZHggKz0gbmV4dF9wbGFuZSo4OwoJCXNyY19pZHggKz0gbmV4dF9wbGFuZSo4OwoJfQp9CgoKc3RhdGljIHZvaWQgYW1pZmJfY29weWFyZWEoc3RydWN0IGZiX2luZm8gKmluZm8sCgkJCSAgIGNvbnN0IHN0cnVjdCBmYl9jb3B5YXJlYSAqYXJlYSkKewoJc3RydWN0IGFtaWZiX3BhciAqcGFyID0gKHN0cnVjdCBhbWlmYl9wYXIgKilpbmZvLT5wYXI7CglpbnQgeDIsIHkyOwoJdTMyIGR4LCBkeSwgc3gsIHN5LCB3aWR0aCwgaGVpZ2h0OwoJdW5zaWduZWQgbG9uZyAqZHN0LCAqc3JjOwoJaW50IGRzdF9pZHgsIHNyY19pZHg7CglpbnQgcmV2X2NvcHkgPSAwOwoKCS8qIGNsaXAgdGhlIGRlc3RpbmF0aW9uICovCgl4MiA9IGFyZWEtPmR4ICsgYXJlYS0+d2lkdGg7Cgl5MiA9IGFyZWEtPmR5ICsgYXJlYS0+aGVpZ2h0OwoJZHggPSBhcmVhLT5keCA+IDAgPyBhcmVhLT5keCA6IDA7CglkeSA9IGFyZWEtPmR5ID4gMCA/IGFyZWEtPmR5IDogMDsKCXgyID0geDIgPCBpbmZvLT52YXIueHJlc192aXJ0dWFsID8geDIgOiBpbmZvLT52YXIueHJlc192aXJ0dWFsOwoJeTIgPSB5MiA8IGluZm8tPnZhci55cmVzX3ZpcnR1YWwgPyB5MiA6IGluZm8tPnZhci55cmVzX3ZpcnR1YWw7Cgl3aWR0aCA9IHgyIC0gZHg7CgloZWlnaHQgPSB5MiAtIGR5OwoKCS8qIHVwZGF0ZSBzeCxzeSAqLwoJc3ggPSBhcmVhLT5zeCArIChkeCAtIGFyZWEtPmR4KTsKCXN5ID0gYXJlYS0+c3kgKyAoZHkgLSBhcmVhLT5keSk7CgoJLyogdGhlIHNvdXJjZSBtdXN0IGJlIGNvbXBsZXRlbHkgaW5zaWRlIHRoZSB2aXJ0dWFsIHNjcmVlbiAqLwoJaWYgKHN4IDwgMCB8fCBzeSA8IDAgfHwgKHN4ICsgd2lkdGgpID4gaW5mby0+dmFyLnhyZXNfdmlydHVhbCB8fAoJICAgIChzeSArIGhlaWdodCkgPiBpbmZvLT52YXIueXJlc192aXJ0dWFsKQoJCXJldHVybjsKCglpZiAoZHkgPiBzeSB8fCAoZHkgPT0gc3kgJiYgZHggPiBzeCkpIHsKCQlkeSArPSBoZWlnaHQ7CgkJc3kgKz0gaGVpZ2h0OwoJCXJldl9jb3B5ID0gMTsKCX0KCWRzdCA9ICh1bnNpZ25lZCBsb25nICopCgkJKCh1bnNpZ25lZCBsb25nKWluZm8tPnNjcmVlbl9iYXNlICYgfihCWVRFU19QRVJfTE9ORy0xKSk7CglzcmMgPSBkc3Q7Cglkc3RfaWR4ID0gKCh1bnNpZ25lZCBsb25nKWluZm8tPnNjcmVlbl9iYXNlICYgKEJZVEVTX1BFUl9MT05HLTEpKSo4OwoJc3JjX2lkeCA9IGRzdF9pZHg7Cglkc3RfaWR4ICs9IGR5KnBhci0+bmV4dF9saW5lKjgrZHg7CglzcmNfaWR4ICs9IHN5KnBhci0+bmV4dF9saW5lKjgrc3g7CglpZiAocmV2X2NvcHkpIHsKCQl3aGlsZSAoaGVpZ2h0LS0pIHsKCQkJZHN0X2lkeCAtPSBwYXItPm5leHRfbGluZSo4OwoJCQlzcmNfaWR4IC09IHBhci0+bmV4dF9saW5lKjg7CgkJCWNvcHlfb25lX2xpbmVfcmV2KGluZm8tPnZhci5iaXRzX3Blcl9waXhlbCwKCQkJCQkgIHBhci0+bmV4dF9wbGFuZSwgZHN0LCBkc3RfaWR4LCBzcmMsCgkJCQkJICBzcmNfaWR4LCB3aWR0aCk7CgkJfQoJfSBlbHNlIHsKCQl3aGlsZSAoaGVpZ2h0LS0pIHsKCQkJY29weV9vbmVfbGluZShpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwsCgkJCQkgICAgICBwYXItPm5leHRfcGxhbmUsIGRzdCwgZHN0X2lkeCwgc3JjLAoJCQkJICAgICAgc3JjX2lkeCwgd2lkdGgpOwoJCQlkc3RfaWR4ICs9IHBhci0+bmV4dF9saW5lKjg7CgkJCXNyY19pZHggKz0gcGFyLT5uZXh0X2xpbmUqODsKCQl9Cgl9Cn0KCgpzdGF0aWMgaW5saW5lIHZvaWQgZXhwYW5kX29uZV9saW5lKGludCBicHAsIHVuc2lnbmVkIGxvbmcgbmV4dF9wbGFuZSwKCQkJCSAgIHVuc2lnbmVkIGxvbmcgKmRzdCwgaW50IGRzdF9pZHgsIHUzMiBuLAoJCQkJICAgY29uc3QgdTggKmRhdGEsIHUzMiBiZ2NvbG9yLCB1MzIgZmdjb2xvcikKewogICAgY29uc3QgdW5zaWduZWQgbG9uZyAqc3JjOwogICAgaW50IHNyY19pZHg7CgogICAgd2hpbGUgKDEpIHsKCWRzdCArPSBkc3RfaWR4ID4+IFNISUZUX1BFUl9MT05HOwoJZHN0X2lkeCAmPSAoQklUU19QRVJfTE9ORy0xKTsKCWlmICgoYmdjb2xvciBeIGZnY29sb3IpICYgMSkgewoJICAgIHNyYyA9ICh1bnNpZ25lZCBsb25nICopKCh1bnNpZ25lZCBsb25nKWRhdGEgJiB+KEJZVEVTX1BFUl9MT05HLTEpKTsKCSAgICBzcmNfaWR4ID0gKCh1bnNpZ25lZCBsb25nKWRhdGEgJiAoQllURVNfUEVSX0xPTkctMSkpKjg7CgkgICAgaWYgKGZnY29sb3IgJiAxKQoJCWJpdGNweShkc3QsIGRzdF9pZHgsIHNyYywgc3JjX2lkeCwgbik7CgkgICAgZWxzZQoJCWJpdGNweV9ub3QoZHN0LCBkc3RfaWR4LCBzcmMsIHNyY19pZHgsIG4pOwoJICAgIC8qIHNldCBvciBjbGVhciAqLwoJfSBlbHNlCgkgICAgYml0ZmlsbDMyKGRzdCwgZHN0X2lkeCwgZmdjb2xvciAmIDEgPyB+MCA6IDAsIG4pOwoJaWYgKCEtLWJwcCkKCSAgICBicmVhazsKCWJnY29sb3IgPj49IDE7CglmZ2NvbG9yID4+PSAxOwoJZHN0X2lkeCArPSBuZXh0X3BsYW5lKjg7CiAgICB9Cn0KCgpzdGF0aWMgdm9pZCBhbWlmYl9pbWFnZWJsaXQoc3RydWN0IGZiX2luZm8gKmluZm8sIGNvbnN0IHN0cnVjdCBmYl9pbWFnZSAqaW1hZ2UpCnsKCXN0cnVjdCBhbWlmYl9wYXIgKnBhciA9IChzdHJ1Y3QgYW1pZmJfcGFyICopaW5mby0+cGFyOwoJaW50IHgyLCB5MjsKCXVuc2lnbmVkIGxvbmcgKmRzdDsKCWludCBkc3RfaWR4OwoJY29uc3QgY2hhciAqc3JjOwoJdTMyIGR4LCBkeSwgd2lkdGgsIGhlaWdodCwgcGl0Y2g7CgoJLyoKCSAqIFdlIGNvdWxkIHVzZSBoYXJkd2FyZSBjbGlwcGluZyBidXQgb24gbWFueSBjYXJkcyB5b3UgZ2V0IGFyb3VuZAoJICogaGFyZHdhcmUgY2xpcHBpbmcgYnkgd3JpdGluZyB0byBmcmFtZWJ1ZmZlciBkaXJlY3RseSBsaWtlIHdlIGFyZQoJICogZG9pbmcgaGVyZS4KCSAqLwoJeDIgPSBpbWFnZS0+ZHggKyBpbWFnZS0+d2lkdGg7Cgl5MiA9IGltYWdlLT5keSArIGltYWdlLT5oZWlnaHQ7CglkeCA9IGltYWdlLT5keDsKCWR5ID0gaW1hZ2UtPmR5OwoJeDIgPSB4MiA8IGluZm8tPnZhci54cmVzX3ZpcnR1YWwgPyB4MiA6IGluZm8tPnZhci54cmVzX3ZpcnR1YWw7Cgl5MiA9IHkyIDwgaW5mby0+dmFyLnlyZXNfdmlydHVhbCA/IHkyIDogaW5mby0+dmFyLnlyZXNfdmlydHVhbDsKCXdpZHRoICA9IHgyIC0gZHg7CgloZWlnaHQgPSB5MiAtIGR5OwoKCWlmIChpbWFnZS0+ZGVwdGggPT0gMSkgewoJCWRzdCA9ICh1bnNpZ25lZCBsb25nICopCgkJCSgodW5zaWduZWQgbG9uZylpbmZvLT5zY3JlZW5fYmFzZSAmIH4oQllURVNfUEVSX0xPTkctMSkpOwoJCWRzdF9pZHggPSAoKHVuc2lnbmVkIGxvbmcpaW5mby0+c2NyZWVuX2Jhc2UgJiAoQllURVNfUEVSX0xPTkctMSkpKjg7CgkJZHN0X2lkeCArPSBkeSpwYXItPm5leHRfbGluZSo4K2R4OwoJCXNyYyA9IGltYWdlLT5kYXRhOwoJCXBpdGNoID0gKGltYWdlLT53aWR0aCs3KS84OwoJCXdoaWxlIChoZWlnaHQtLSkgewoJCQlleHBhbmRfb25lX2xpbmUoaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVsLAoJCQkJCXBhci0+bmV4dF9wbGFuZSwgZHN0LCBkc3RfaWR4LCB3aWR0aCwKCQkJCQlzcmMsIGltYWdlLT5iZ19jb2xvciwKCQkJCQlpbWFnZS0+ZmdfY29sb3IpOwoJCQlkc3RfaWR4ICs9IHBhci0+bmV4dF9saW5lKjg7CgkJCXNyYyArPSBwaXRjaDsKCQl9Cgl9IGVsc2UgewoJCWMycChpbmZvLT5zY3JlZW5fYmFzZSwgaW1hZ2UtPmRhdGEsIGR4LCBkeSwgd2lkdGgsIGhlaWdodCwKCQkgICAgcGFyLT5uZXh0X2xpbmUsIHBhci0+bmV4dF9wbGFuZSwgaW1hZ2UtPndpZHRoLAoJCSAgICBpbmZvLT52YXIuYml0c19wZXJfcGl4ZWwpOwoJfQp9CgoKCS8qCgkgKiBBbWlnYSBGcmFtZSBCdWZmZXIgU3BlY2lmaWMgaW9jdGxzCgkgKi8KCnN0YXRpYyBpbnQgYW1pZmJfaW9jdGwoc3RydWN0IGZiX2luZm8gKmluZm8sCgkJICAgICAgIHVuc2lnbmVkIGludCBjbWQsIHVuc2lnbmVkIGxvbmcgYXJnKQp7Cgl1bmlvbiB7CgkJc3RydWN0IGZiX2ZpeF9jdXJzb3JpbmZvIGZpeDsKCQlzdHJ1Y3QgZmJfdmFyX2N1cnNvcmluZm8gdmFyOwoJCXN0cnVjdCBmYl9jdXJzb3JzdGF0ZSBzdGF0ZTsKCX0gY3JzcjsKCXZvaWQgX191c2VyICphcmdwID0gKHZvaWQgX191c2VyICopYXJnOwoJaW50IGk7CgoJc3dpdGNoIChjbWQpIHsKCQljYXNlIEZCSU9HRVRfRkNVUlNPUklORk86CgkJCWkgPSBhbWlfZ2V0X2ZpeF9jdXJzb3JpbmZvKCZjcnNyLmZpeCk7CgkJCWlmIChpKQoJCQkJcmV0dXJuIGk7CgkJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmNyc3IuZml4LAoJCQkJCSAgICBzaXplb2YoY3Jzci5maXgpKSA/IC1FRkFVTFQgOiAwOwoKCQljYXNlIEZCSU9HRVRfVkNVUlNPUklORk86CgkJCWkgPSBhbWlfZ2V0X3Zhcl9jdXJzb3JpbmZvKCZjcnNyLnZhciwKCQkJCSgoc3RydWN0IGZiX3Zhcl9jdXJzb3JpbmZvIF9fdXNlciAqKWFyZyktPmRhdGEpOwoJCQlpZiAoaSkKCQkJCXJldHVybiBpOwoJCQlyZXR1cm4gY29weV90b191c2VyKGFyZ3AsICZjcnNyLnZhciwKCQkJCQkgICAgc2l6ZW9mKGNyc3IudmFyKSkgPyAtRUZBVUxUIDogMDsKCgkJY2FzZSBGQklPUFVUX1ZDVVJTT1JJTkZPOgoJCQlpZiAoY29weV9mcm9tX3VzZXIoJmNyc3IudmFyLCBhcmdwLCBzaXplb2YoY3Jzci52YXIpKSkKCQkJCXJldHVybiAtRUZBVUxUOwoJCQlyZXR1cm4gYW1pX3NldF92YXJfY3Vyc29yaW5mbygmY3Jzci52YXIsCgkJCQkoKHN0cnVjdCBmYl92YXJfY3Vyc29yaW5mbyBfX3VzZXIgKilhcmcpLT5kYXRhKTsKCgkJY2FzZSBGQklPR0VUX0NVUlNPUlNUQVRFOgoJCQlpID0gYW1pX2dldF9jdXJzb3JzdGF0ZSgmY3Jzci5zdGF0ZSk7CgkJCWlmIChpKQoJCQkJcmV0dXJuIGk7CgkJCXJldHVybiBjb3B5X3RvX3VzZXIoYXJncCwgJmNyc3Iuc3RhdGUsCgkJCQkJICAgIHNpemVvZihjcnNyLnN0YXRlKSkgPyAtRUZBVUxUIDogMDsKCgkJY2FzZSBGQklPUFVUX0NVUlNPUlNUQVRFOgoJCQlpZiAoY29weV9mcm9tX3VzZXIoJmNyc3Iuc3RhdGUsIGFyZ3AsCgkJCQkJICAgc2l6ZW9mKGNyc3Iuc3RhdGUpKSkKCQkJCXJldHVybiAtRUZBVUxUOwoJCQlyZXR1cm4gYW1pX3NldF9jdXJzb3JzdGF0ZSgmY3Jzci5zdGF0ZSk7Cgl9CglyZXR1cm4gLUVJTlZBTDsKfQoKCgkvKgoJICogQWxsb2NhdGUsIENsZWFyIGFuZCBBbGlnbiBhIEJsb2NrIG9mIENoaXAgTWVtb3J5CgkgKi8KCnN0YXRpYyB1X2xvbmcgdW5hbGlnbmVkX2NoaXBwdHIgPSAwOwoKc3RhdGljIGlubGluZSB1X2xvbmcgX19pbml0IGNoaXBhbGxvYyh1X2xvbmcgc2l6ZSkKewoJc2l6ZSArPSBQQUdFX1NJWkUtMTsKCWlmICghKHVuYWxpZ25lZF9jaGlwcHRyID0gKHVfbG9uZylhbWlnYV9jaGlwX2FsbG9jKHNpemUsCgkJCQkJCQkgICAiYW1pZmIgW1JBTV0iKSkpCgkJcGFuaWMoIk5vIENoaXAgUkFNIGZvciBmcmFtZSBidWZmZXIiKTsKCW1lbXNldCgodm9pZCAqKXVuYWxpZ25lZF9jaGlwcHRyLCAwLCBzaXplKTsKCXJldHVybiBQQUdFX0FMSUdOKHVuYWxpZ25lZF9jaGlwcHRyKTsKfQoKc3RhdGljIGlubGluZSB2b2lkIGNoaXBmcmVlKHZvaWQpCnsKCWlmICh1bmFsaWduZWRfY2hpcHB0cikKCQlhbWlnYV9jaGlwX2ZyZWUoKHZvaWQgKil1bmFsaWduZWRfY2hpcHB0cik7Cn0KCgoJLyoKCSAqIEluaXRpYWxpc2F0aW9uCgkgKi8KCmludCBfX2luaXQgYW1pZmJfaW5pdCh2b2lkKQp7CglpbnQgdGFnLCBpLCBlcnIgPSAwOwoJdV9sb25nIGNoaXBwdHI7Cgl1X2ludCBkZWZtb2RlOwoKI2lmbmRlZiBNT0RVTEUKCWNoYXIgKm9wdGlvbiA9IE5VTEw7CgoJaWYgKGZiX2dldF9vcHRpb25zKCJhbWlmYiIsICZvcHRpb24pKSB7CgkJYW1pZmJfdmlkZW9fb2ZmKCk7CgkJcmV0dXJuIC1FTk9ERVY7Cgl9CglhbWlmYl9zZXR1cChvcHRpb24pOwojZW5kaWYKCWlmICghTUFDSF9JU19BTUlHQSB8fCAhQU1JR0FIV19QUkVTRU5UKEFNSV9WSURFTykpCgkJcmV0dXJuIC1FTlhJTzsKCgkvKgoJICogV2UgcmVxdWVzdCBhbGwgcmVnaXN0ZXJzIHN0YXJ0aW5nIGZyb20gYnBscHRbMF0KCSAqLwoJaWYgKCFyZXF1ZXN0X21lbV9yZWdpb24oQ1VTVE9NX1BIWVNBRERSKzB4ZTAsIDB4MTIwLAoJCQkJImFtaWZiIFtEZW5pc2UvTGlzYV0iKSkKCQlyZXR1cm4gLUVCVVNZOwoKCWN1c3RvbS5kbWFjb24gPSBETUFGX0FMTCB8IERNQUZfTUFTVEVSOwoKCXN3aXRjaCAoYW1pZ2FfY2hpcHNldCkgewojaWZkZWYgQ09ORklHX0ZCX0FNSUdBX09DUwoJCWNhc2UgQ1NfT0NTOgoJCQlzdHJjYXQoZmJfaW5mby5maXguaWQsICJPQ1MiKTsKZGVmYXVsdF9jaGlwc2V0OgoJCQljaGlwc2V0ID0gVEFHX09DUzsKCQkJbWF4ZGVwdGhbVEFHX1NIUkVTXSA9IDA7CS8qIE9DUyBtZWFucyBubyBTSFJFUyAqLwoJCQltYXhkZXB0aFtUQUdfSElSRVNdID0gNDsKCQkJbWF4ZGVwdGhbVEFHX0xPUkVTXSA9IDY7CgkJCW1heGZtb2RlID0gVEFHX0ZNT0RFXzE7CgkJCWRlZm1vZGUgPSBhbWlnYV92YmxhbmsgPT0gNTAgPyBERUZNT0RFX1BBTAoJCQkJCQkgICAgIDogREVGTU9ERV9OVFNDOwoJCQlmYl9pbmZvLmZpeC5zbWVtX2xlbiA9IFZJREVPTUVNU0laRV9PQ1M7CgkJCWJyZWFrOwojZW5kaWYgLyogQ09ORklHX0ZCX0FNSUdBX09DUyAqLwoKI2lmZGVmIENPTkZJR19GQl9BTUlHQV9FQ1MKCQljYXNlIENTX0VDUzoKCQkJc3RyY2F0KGZiX2luZm8uZml4LmlkLCAiRUNTIik7CgkJCWNoaXBzZXQgPSBUQUdfRUNTOwoJCQltYXhkZXB0aFtUQUdfU0hSRVNdID0gMjsKCQkJbWF4ZGVwdGhbVEFHX0hJUkVTXSA9IDQ7CgkJCW1heGRlcHRoW1RBR19MT1JFU10gPSA2OwoJCQltYXhmbW9kZSA9IFRBR19GTU9ERV8xOwoJCQlpZiAoQU1JR0FIV19QUkVTRU5UKEFNQkVSX0ZGKSkKCQkJICAgIGRlZm1vZGUgPSBhbWlnYV92YmxhbmsgPT0gNTAgPyBERUZNT0RFX0FNQkVSX1BBTAoJCQkJCQkJIDogREVGTU9ERV9BTUJFUl9OVFNDOwoJCQllbHNlCgkJCSAgICBkZWZtb2RlID0gYW1pZ2FfdmJsYW5rID09IDUwID8gREVGTU9ERV9QQUwKCQkJCQkJCSA6IERFRk1PREVfTlRTQzsKCQkJaWYgKGFtaWdhX2NoaXBfYXZhaWwoKS1DSElQUkFNX1NBRkVUWV9MSU1JVCA+CgkJCSAgICBWSURFT01FTVNJWkVfRUNTXzFNKQoJCQkJZmJfaW5mby5maXguc21lbV9sZW4gPSBWSURFT01FTVNJWkVfRUNTXzJNOwoJCQllbHNlCgkJCQlmYl9pbmZvLmZpeC5zbWVtX2xlbiA9IFZJREVPTUVNU0laRV9FQ1NfMU07CgkJCWJyZWFrOwojZW5kaWYgLyogQ09ORklHX0ZCX0FNSUdBX0VDUyAqLwoKI2lmZGVmIENPTkZJR19GQl9BTUlHQV9BR0EKCQljYXNlIENTX0FHQToKCQkJc3RyY2F0KGZiX2luZm8uZml4LmlkLCAiQUdBIik7CgkJCWNoaXBzZXQgPSBUQUdfQUdBOwoJCQltYXhkZXB0aFtUQUdfU0hSRVNdID0gODsKCQkJbWF4ZGVwdGhbVEFHX0hJUkVTXSA9IDg7CgkJCW1heGRlcHRoW1RBR19MT1JFU10gPSA4OwoJCQltYXhmbW9kZSA9IFRBR19GTU9ERV80OwoJCQlkZWZtb2RlID0gREVGTU9ERV9BR0E7CgkJCWlmIChhbWlnYV9jaGlwX2F2YWlsKCktQ0hJUFJBTV9TQUZFVFlfTElNSVQgPgoJCQkgICAgVklERU9NRU1TSVpFX0FHQV8xTSkKCQkJCWZiX2luZm8uZml4LnNtZW1fbGVuID0gVklERU9NRU1TSVpFX0FHQV8yTTsKCQkJZWxzZQoJCQkJZmJfaW5mby5maXguc21lbV9sZW4gPSBWSURFT01FTVNJWkVfQUdBXzFNOwoJCQlicmVhazsKI2VuZGlmIC8qIENPTkZJR19GQl9BTUlHQV9BR0EgKi8KCgkJZGVmYXVsdDoKI2lmZGVmIENPTkZJR19GQl9BTUlHQV9PQ1MKCQkJcHJpbnRrKCJVbmtub3duIGdyYXBoaWNzIGNoaXBzZXQsIGRlZmF1bHRpbmcgdG8gT0NTXG4iKTsKCQkJc3RyY2F0KGZiX2luZm8uZml4LmlkLCAiVW5rbm93biIpOwoJCQlnb3RvIGRlZmF1bHRfY2hpcHNldDsKI2Vsc2UgLyogQ09ORklHX0ZCX0FNSUdBX09DUyAqLwoJCQllcnIgPSAtRU5YSU87CgkJCWdvdG8gYW1pZmJfZXJyb3I7CiNlbmRpZiAvKiBDT05GSUdfRkJfQU1JR0FfT0NTICovCgkJCWJyZWFrOwoJfQoKCS8qCgkgKiBDYWxjdWxhdGUgdGhlIFBpeGVsIENsb2NrIFZhbHVlcyBmb3IgdGhpcyBNYWNoaW5lCgkgKi8KCgl7Cgl1X2xvbmcgdG1wID0gRElWVUwoMjAwMDAwMDAwMDAwVUxMLCBhbWlnYV9lY2xvY2spOwoKCXBpeGNsb2NrW1RBR19TSFJFU10gPSAodG1wICsgNCkgLyA4OwkvKiBTSFJFUzogIDM1IG5zIC8gMjggTUh6ICovCglwaXhjbG9ja1tUQUdfSElSRVNdID0gKHRtcCArIDIpIC8gNDsJLyogSElSRVM6ICA3MCBucyAvIDE0IE1IeiAqLwoJcGl4Y2xvY2tbVEFHX0xPUkVTXSA9ICh0bXAgKyAxKSAvIDI7CS8qIExPUkVTOiAxNDAgbnMgLyAgNyBNSHogKi8KCX0KCgkvKgoJICogUmVwbGFjZSB0aGUgVGFnIFZhbHVlcyB3aXRoIHRoZSBSZWFsIFBpeGVsIENsb2NrIFZhbHVlcwoJICovCgoJZm9yIChpID0gMDsgaSA8IE5VTV9UT1RBTF9NT0RFUzsgaSsrKSB7CgkJc3RydWN0IGZiX3ZpZGVvbW9kZSAqbW9kZSA9ICZhbWlfbW9kZWRiW2ldOwoJCXRhZyA9IG1vZGUtPnBpeGNsb2NrOwoJCWlmICh0YWcgPT0gVEFHX1NIUkVTIHx8IHRhZyA9PSBUQUdfSElSRVMgfHwgdGFnID09IFRBR19MT1JFUykgewoJCQltb2RlLT5waXhjbG9jayA9IHBpeGNsb2NrW3RhZ107CgkJfQoJfQoKCS8qCgkgKiAgVGhlc2UgbW9uaXRvciBzcGVjcyBhcmUgZm9yIGEgdHlwaWNhbCBBbWlnYSBtb25pdG9yIChlLmcuIEExOTYwKQoJICovCglpZiAoZmJfaW5mby5tb25zcGVjcy5oZm1pbiA9PSAwKSB7CgkgICAgZmJfaW5mby5tb25zcGVjcy5oZm1pbiA9IDE1MDAwOwoJICAgIGZiX2luZm8ubW9uc3BlY3MuaGZtYXggPSAzODAwMDsKCSAgICBmYl9pbmZvLm1vbnNwZWNzLnZmbWluID0gNDk7CgkgICAgZmJfaW5mby5tb25zcGVjcy52Zm1heCA9IDkwOwoJfQoKCWZiX2luZm8uZmJvcHMgPSAmYW1pZmJfb3BzOwoJZmJfaW5mby5wYXIgPSAmY3VycmVudHBhcjsKCWZiX2luZm8uZmxhZ3MgPSBGQklORk9fREVGQVVMVDsKCglpZiAoIWZiX2ZpbmRfbW9kZSgmZmJfaW5mby52YXIsICZmYl9pbmZvLCBtb2RlX29wdGlvbiwgYW1pX21vZGVkYiwKCQkJICBOVU1fVE9UQUxfTU9ERVMsICZhbWlfbW9kZWRiW2RlZm1vZGVdLCA0KSkgewoJCWVyciA9IC1FSU5WQUw7CgkJZ290byBhbWlmYl9lcnJvcjsKCX0KCglyb3VuZF9kb3duX2JwcCA9IDA7CgljaGlwcHRyID0gY2hpcGFsbG9jKGZiX2luZm8uZml4LnNtZW1fbGVuKwoJICAgICAgICAgICAgICAgICAgICBTUFJJVEVNRU1TSVpFKwoJICAgICAgICAgICAgICAgICAgICBEVU1NWVNQUklURU1FTVNJWkUrCgkgICAgICAgICAgICAgICAgICAgIENPUElOSVRTSVpFKwoJICAgICAgICAgICAgICAgICAgICA0KkNPUExJU1RTSVpFKTsKCglhc3NpZ25jaHVuayh2aWRlb21lbW9yeSwgdV9sb25nLCBjaGlwcHRyLCBmYl9pbmZvLmZpeC5zbWVtX2xlbik7Cglhc3NpZ25jaHVuayhzcHJpdGVtZW1vcnksIHVfbG9uZywgY2hpcHB0ciwgU1BSSVRFTUVNU0laRSk7Cglhc3NpZ25jaHVuayhkdW1teXNwcml0ZSwgdV9zaG9ydCAqLCBjaGlwcHRyLCBEVU1NWVNQUklURU1FTVNJWkUpOwoJYXNzaWduY2h1bmsoY29wZGlzcGxheS5pbml0LCBjb3BpbnMgKiwgY2hpcHB0ciwgQ09QSU5JVFNJWkUpOwoJYXNzaWduY2h1bmsoY29wZGlzcGxheS5saXN0WzBdWzBdLCBjb3BpbnMgKiwgY2hpcHB0ciwgQ09QTElTVFNJWkUpOwoJYXNzaWduY2h1bmsoY29wZGlzcGxheS5saXN0WzBdWzFdLCBjb3BpbnMgKiwgY2hpcHB0ciwgQ09QTElTVFNJWkUpOwoJYXNzaWduY2h1bmsoY29wZGlzcGxheS5saXN0WzFdWzBdLCBjb3BpbnMgKiwgY2hpcHB0ciwgQ09QTElTVFNJWkUpOwoJYXNzaWduY2h1bmsoY29wZGlzcGxheS5saXN0WzFdWzFdLCBjb3BpbnMgKiwgY2hpcHB0ciwgQ09QTElTVFNJWkUpOwoKCS8qCgkgKiBhY2Nlc3MgdGhlIHZpZGVvbWVtIHdpdGggd3JpdGV0aHJvdWdoIGNhY2hlCgkgKi8KCWZiX2luZm8uZml4LnNtZW1fc3RhcnQgPSAodV9sb25nKVpUV09fUEFERFIodmlkZW9tZW1vcnkpOwoJdmlkZW9tZW1vcnkgPSAodV9sb25nKWlvcmVtYXBfd3JpdGV0aHJvdWdoKGZiX2luZm8uZml4LnNtZW1fc3RhcnQsCgkJCQkJCSAgIGZiX2luZm8uZml4LnNtZW1fbGVuKTsKCWlmICghdmlkZW9tZW1vcnkpIHsKCQlwcmludGsoImFtaWZiOiBXQVJOSU5HISB1bmFibGUgdG8gbWFwIHZpZGVvbWVtIGNhY2hlZCB3cml0ZXRocm91Z2hcbiIpOwoJCXZpZGVvbWVtb3J5ID0gWlRXT19WQUREUihmYl9pbmZvLmZpeC5zbWVtX3N0YXJ0KTsKCX0KCglmYl9pbmZvLnNjcmVlbl9iYXNlID0gKGNoYXIgKil2aWRlb21lbW9yeTsKCW1lbXNldChkdW1teXNwcml0ZSwgMCwgRFVNTVlTUFJJVEVNRU1TSVpFKTsKCgkvKgoJICogRW5hYmxlIERpc3BsYXkgRE1BCgkgKi8KCgljdXN0b20uZG1hY29uID0gRE1BRl9TRVRDTFIgfCBETUFGX01BU1RFUiB8IERNQUZfUkFTVEVSIHwgRE1BRl9DT1BQRVIgfAoJICAgICAgICAgICAgICAgIERNQUZfQkxJVFRFUiB8IERNQUZfU1BSSVRFOwoKCS8qCgkgKiBNYWtlIHN1cmUgdGhlIENvcHBlciBoYXMgc29tZXRoaW5nIHRvIGRvCgkgKi8KCglhbWlfaW5pdF9jb3BwZXIoKTsKCglpZiAocmVxdWVzdF9pcnEoSVJRX0FNSUdBX0NPUFBFUiwgYW1pZmJfaW50ZXJydXB0LCAwLAoJICAgICAgICAgICAgICAgICJmYiB2ZXJ0YiBoYW5kbGVyIiwgJmN1cnJlbnRwYXIpKSB7CgkJZXJyID0gLUVCVVNZOwoJCWdvdG8gYW1pZmJfZXJyb3I7Cgl9CgoJZmJfYWxsb2NfY21hcCgmZmJfaW5mby5jbWFwLCAxPDxmYl9pbmZvLnZhci5iaXRzX3Blcl9waXhlbCwgMCk7CgoJaWYgKHJlZ2lzdGVyX2ZyYW1lYnVmZmVyKCZmYl9pbmZvKSA8IDApIHsKCQllcnIgPSAtRUlOVkFMOwoJCWdvdG8gYW1pZmJfZXJyb3I7Cgl9CgoJcHJpbnRrKCJmYiVkOiAlcyBmcmFtZSBidWZmZXIgZGV2aWNlLCB1c2luZyAlZEsgb2YgdmlkZW8gbWVtb3J5XG4iLAoJICAgICAgIGZiX2luZm8ubm9kZSwgZmJfaW5mby5maXguaWQsIGZiX2luZm8uZml4LnNtZW1fbGVuPj4xMCk7CgoJcmV0dXJuIDA7CgphbWlmYl9lcnJvcjoKCWFtaWZiX2RlaW5pdCgpOwoJcmV0dXJuIGVycjsKfQoKc3RhdGljIHZvaWQgYW1pZmJfZGVpbml0KHZvaWQpCnsKCWZiX2RlYWxsb2NfY21hcCgmZmJfaW5mby5jbWFwKTsKCWNoaXBmcmVlKCk7CglyZWxlYXNlX21lbV9yZWdpb24oQ1VTVE9NX1BIWVNBRERSKzB4ZTAsIDB4MTIwKTsKCWN1c3RvbS5kbWFjb24gPSBETUFGX0FMTCB8IERNQUZfTUFTVEVSOwp9CgoKCS8qCgkgKiBCbGFuayB0aGUgZGlzcGxheS4KCSAqLwoKc3RhdGljIGludCBhbWlmYl9ibGFuayhpbnQgYmxhbmssIHN0cnVjdCBmYl9pbmZvICppbmZvKQp7Cglkb19ibGFuayA9IGJsYW5rID8gYmxhbmsgOiAtMTsKCglyZXR1cm4gMDsKfQoKCS8qCgkgKiBGbGFzaCB0aGUgY3Vyc29yIChjYWxsZWQgYnkgVkJsYW5rIGludGVycnVwdCkKCSAqLwoKc3RhdGljIGludCBmbGFzaF9jdXJzb3Iodm9pZCkKewoJc3RhdGljIGludCBjdXJzb3Jjb3VudCA9IDE7CgoJaWYgKGN1cnNvcm1vZGUgPT0gRkJfQ1VSU09SX0ZMQVNIKSB7CgkJaWYgKCEtLWN1cnNvcmNvdW50KSB7CgkJCWN1cnNvcnN0YXRlID0gLWN1cnNvcnN0YXRlOwoJCQljdXJzb3Jjb3VudCA9IGN1cnNvcnJhdGU7CgkJCWlmICghaXNfYmxhbmtlZCkKCQkJCXJldHVybiAxOwoJCX0KCX0KCXJldHVybiAwOwp9CgoJLyoKCSAqIFZCbGFuayBEaXNwbGF5IEludGVycnVwdAoJICovCgpzdGF0aWMgaXJxcmV0dXJuX3QgYW1pZmJfaW50ZXJydXB0KGludCBpcnEsIHZvaWQgKmRldl9pZCwgc3RydWN0IHB0X3JlZ3MgKmZwKQp7CglpZiAoZG9fdm1vZGVfcGFuIHx8IGRvX3Ztb2RlX2Z1bGwpCgkJYW1pX3VwZGF0ZV9kaXNwbGF5KCk7CgoJaWYgKGRvX3Ztb2RlX2Z1bGwpCgkJYW1pX2luaXRfZGlzcGxheSgpOwoKCWlmIChkb192bW9kZV9wYW4pIHsKCQlmbGFzaF9jdXJzb3IoKTsKCQlhbWlfcmVidWlsZF9jb3BwZXIoKTsKCQlkb19jdXJzb3IgPSBkb192bW9kZV9wYW4gPSAwOwoJfSBlbHNlIGlmIChkb19jdXJzb3IpIHsKCQlmbGFzaF9jdXJzb3IoKTsKCQlhbWlfc2V0X3Nwcml0ZSgpOwoJCWRvX2N1cnNvciA9IDA7Cgl9IGVsc2UgewoJCWlmIChmbGFzaF9jdXJzb3IoKSkKCQkJYW1pX3NldF9zcHJpdGUoKTsKCX0KCglpZiAoZG9fYmxhbmspIHsKCQlhbWlfZG9fYmxhbmsoKTsKCQlkb19ibGFuayA9IDA7Cgl9CgoJaWYgKGRvX3Ztb2RlX2Z1bGwpIHsKCQlhbWlfcmVpbml0X2NvcHBlcigpOwoJCWRvX3Ztb2RlX2Z1bGwgPSAwOwoJfQoJcmV0dXJuIElSUV9IQU5ETEVEOwp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSGFyZHdhcmUgcm91dGluZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgoJLyoKCSAqIEdldCB0aGUgdmlkZW8gcGFyYW1zIG91dCBvZiBgdmFyJy4gSWYgYSB2YWx1ZSBkb2Vzbid0IGZpdCwgcm91bmQKCSAqIGl0IHVwLCBpZiBpdCdzIHRvbyBiaWcsIHJldHVybiAtRUlOVkFMLgoJICovCgpzdGF0aWMgaW50IGFtaV9kZWNvZGVfdmFyKHN0cnVjdCBmYl92YXJfc2NyZWVuaW5mbyAqdmFyLAogICAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBhbWlmYl9wYXIgKnBhcikKewoJdV9zaG9ydCBjbGtfc2hpZnQsIGxpbmVfc2hpZnQ7Cgl1X2xvbmcgbWF4ZmV0Y2hzdG9wLCBmc3RydCwgZnNpemUsIGZjb25zdCwgeHJlc19uLCB5cmVzX247Cgl1X2ludCBodG90YWwsIHZ0b3RhbDsKCgkvKgoJICogRmluZCBhIG1hdGNoaW5nIFBpeGVsIENsb2NrCgkgKi8KCglmb3IgKGNsa19zaGlmdCA9IFRBR19TSFJFUzsgY2xrX3NoaWZ0IDw9IFRBR19MT1JFUzsgY2xrX3NoaWZ0KyspCgkJaWYgKHZhci0+cGl4Y2xvY2sgPD0gcGl4Y2xvY2tbY2xrX3NoaWZ0XSkKCQkJYnJlYWs7CglpZiAoY2xrX3NoaWZ0ID4gVEFHX0xPUkVTKSB7CgkJRFBSSU5USygicGl4Y2xvY2sgdG9vIGhpZ2hcbiIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoJcGFyLT5jbGtfc2hpZnQgPSBjbGtfc2hpZnQ7CgoJLyoKCSAqIENoZWNrIHRoZSBHZW9tZXRyeSBWYWx1ZXMKCSAqLwoKCWlmICgocGFyLT54cmVzID0gdmFyLT54cmVzKSA8IDY0KQoJCXBhci0+eHJlcyA9IDY0OwoJaWYgKChwYXItPnlyZXMgPSB2YXItPnlyZXMpIDwgNjQpCgkJcGFyLT55cmVzID0gNjQ7CglpZiAoKHBhci0+dnhyZXMgPSB2YXItPnhyZXNfdmlydHVhbCkgPCBwYXItPnhyZXMpCgkJcGFyLT52eHJlcyA9IHBhci0+eHJlczsKCWlmICgocGFyLT52eXJlcyA9IHZhci0+eXJlc192aXJ0dWFsKSA8IHBhci0+eXJlcykKCQlwYXItPnZ5cmVzID0gcGFyLT55cmVzOwoKCXBhci0+YnBwID0gdmFyLT5iaXRzX3Blcl9waXhlbDsKCWlmICghdmFyLT5ub25zdGQpIHsKCQlpZiAocGFyLT5icHAgPCAxKQoJCQlwYXItPmJwcCA9IDE7CgkJaWYgKHBhci0+YnBwID4gbWF4ZGVwdGhbY2xrX3NoaWZ0XSkgewoJCQlpZiAocm91bmRfZG93bl9icHAgJiYgbWF4ZGVwdGhbY2xrX3NoaWZ0XSkKCQkJCXBhci0+YnBwID0gbWF4ZGVwdGhbY2xrX3NoaWZ0XTsKCQkJZWxzZSB7CgkJCQlEUFJJTlRLKCJpbnZhbGlkIGJwcFxuIik7CgkJCQlyZXR1cm4gLUVJTlZBTDsKCQkJfQoJCX0KCX0gZWxzZSBpZiAodmFyLT5ub25zdGQgPT0gRkJfTk9OU1REX0hBTSkgewoJCWlmIChwYXItPmJwcCA8IDYpCgkJCXBhci0+YnBwID0gNjsKCQlpZiAocGFyLT5icHAgIT0gNikgewoJCQlpZiAocGFyLT5icHAgPCA4KQoJCQkJcGFyLT5icHAgPSA4OwoJCQlpZiAocGFyLT5icHAgIT0gOCB8fCAhSVNfQUdBKSB7CgkJCQlEUFJJTlRLKCJpbnZhbGlkIGJwcCBmb3IgaGFtIG1vZGVcbiIpOwoJCQkJcmV0dXJuIC1FSU5WQUw7CgkJCX0KCQl9Cgl9IGVsc2UgewoJCURQUklOVEsoInVua25vd24gbm9uc3RkIG1vZGVcbiIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoKCS8qCgkgKiBGQl9WTU9ERV9TTU9PVEhfWFBBTiB3aWxsIGJlIGNsZWFyZWQsIGlmIG9uZSBvZiB0aGUgZm9sbG9pbmcKCSAqIGNoZWNrcyBmYWlsZWQgYW5kIHNtb290aCBzY3JvbGxpbmcgaXMgbm90IHBvc3NpYmxlCgkgKi8KCglwYXItPnZtb2RlID0gdmFyLT52bW9kZSB8IEZCX1ZNT0RFX1NNT09USF9YUEFOOwoJc3dpdGNoIChwYXItPnZtb2RlICYgRkJfVk1PREVfTUFTSykgewoJCWNhc2UgRkJfVk1PREVfSU5URVJMQUNFRDoKCQkJbGluZV9zaGlmdCA9IDA7CgkJCWJyZWFrOwoJCWNhc2UgRkJfVk1PREVfTk9OSU5URVJMQUNFRDoKCQkJbGluZV9zaGlmdCA9IDE7CgkJCWJyZWFrOwoJCWNhc2UgRkJfVk1PREVfRE9VQkxFOgoJCQlpZiAoIUlTX0FHQSkgewoJCQkJRFBSSU5USygiZG91YmxlIG1vZGUgb25seSBwb3NzaWJsZSB3aXRoIGFnYVxuIik7CgkJCQlyZXR1cm4gLUVJTlZBTDsKCQkJfQoJCQlsaW5lX3NoaWZ0ID0gMjsKCQkJYnJlYWs7CgkJZGVmYXVsdDoKCQkJRFBSSU5USygidW5rbm93biB2aWRlbyBtb2RlXG4iKTsKCQkJcmV0dXJuIC1FSU5WQUw7CgkJCWJyZWFrOwoJfQoJcGFyLT5saW5lX3NoaWZ0ID0gbGluZV9zaGlmdDsKCgkvKgoJICogVmVydGljYWwgYW5kIEhvcml6b250YWwgVGltaW5ncwoJICovCgoJeHJlc19uID0gcGFyLT54cmVzPDxjbGtfc2hpZnQ7Cgl5cmVzX24gPSBwYXItPnlyZXM8PGxpbmVfc2hpZnQ7CglwYXItPmh0b3RhbCA9IGRvd244KCh2YXItPmxlZnRfbWFyZ2luK3Bhci0+eHJlcyt2YXItPnJpZ2h0X21hcmdpbit2YXItPmhzeW5jX2xlbik8PGNsa19zaGlmdCk7CglwYXItPnZ0b3RhbCA9IGRvd24yKCgodmFyLT51cHBlcl9tYXJnaW4rcGFyLT55cmVzK3Zhci0+bG93ZXJfbWFyZ2luK3Zhci0+dnN5bmNfbGVuKTw8bGluZV9zaGlmdCkrMSk7CgoJaWYgKElTX0FHQSkKCQlwYXItPmJwbGNvbjMgPSBzcHJwaXhtb2RlW2Nsa19zaGlmdF07CgllbHNlCgkJcGFyLT5icGxjb24zID0gMDsKCWlmICh2YXItPnN5bmMgJiBGQl9TWU5DX0JST0FEQ0FTVCkgewoJCXBhci0+ZGl3c3RvcF9oID0gcGFyLT5odG90YWwtKCh2YXItPnJpZ2h0X21hcmdpbi12YXItPmhzeW5jX2xlbik8PGNsa19zaGlmdCk7CgkJaWYgKElTX0FHQSkKCQkJcGFyLT5kaXdzdG9wX2ggKz0gbW9kNCh2YXItPmhzeW5jX2xlbik7CgkJZWxzZQoJCQlwYXItPmRpd3N0b3BfaCA9IGRvd240KHBhci0+ZGl3c3RvcF9oKTsKCgkJcGFyLT5kaXdzdHJ0X2ggPSBwYXItPmRpd3N0b3BfaCAtIHhyZXNfbjsKCQlwYXItPmRpd3N0b3BfdiA9IHBhci0+dnRvdGFsLSgodmFyLT5sb3dlcl9tYXJnaW4tdmFyLT52c3luY19sZW4pPDxsaW5lX3NoaWZ0KTsKCQlwYXItPmRpd3N0cnRfdiA9IHBhci0+ZGl3c3RvcF92IC0geXJlc19uOwoJCWlmIChwYXItPmRpd3N0b3BfaCA+PSBwYXItPmh0b3RhbCs4KSB7CgkJCURQUklOVEsoImludmFsaWQgZGl3c3RvcF9oXG4iKTsKCQkJcmV0dXJuIC1FSU5WQUw7CgkJfQoJCWlmIChwYXItPmRpd3N0b3BfdiA+IHBhci0+dnRvdGFsKSB7CgkJCURQUklOVEsoImludmFsaWQgZGl3c3RvcF92XG4iKTsKCQkJcmV0dXJuIC1FSU5WQUw7CgkJfQoKCQlpZiAoIUlTX09DUykgewoJCQkvKiBJbml0aWFsaXplIHN5bmMgd2l0aCBzb21lIHJlYXNvbmFibGUgdmFsdWVzIGZvciBwd3JzYXZlICovCgkJCXBhci0+aHNzdHJ0ID0gMTYwOwoJCQlwYXItPmhzc3RvcCA9IDMyMDsKCQkJcGFyLT52c3N0cnQgPSAzMDsKCQkJcGFyLT52c3N0b3AgPSAzNDsKCQl9IGVsc2UgewoJCQlwYXItPmhzc3RydCA9IDA7CgkJCXBhci0+aHNzdG9wID0gMDsKCQkJcGFyLT52c3N0cnQgPSAwOwoJCQlwYXItPnZzc3RvcCA9IDA7CgkJfQoJCWlmIChwYXItPnZ0b3RhbCA+IChQQUxfVlRPVEFMK05UU0NfVlRPVEFMKS8yKSB7CgkJCS8qIFBBTCB2aWRlbyBtb2RlICovCgkJCWlmIChwYXItPmh0b3RhbCAhPSBQQUxfSFRPVEFMKSB7CgkJCQlEUFJJTlRLKCJodG90YWwgaW52YWxpZCBmb3IgcGFsXG4iKTsKCQkJCXJldHVybiAtRUlOVkFMOwoJCQl9CgkJCWlmIChwYXItPmRpd3N0cnRfaCA8IFBBTF9ESVdTVFJUX0gpIHsKCQkJCURQUklOVEsoImRpd3N0cnRfaCB0b28gbG93IGZvciBwYWxcbiIpOwoJCQkJcmV0dXJuIC1FSU5WQUw7CgkJCX0KCQkJaWYgKHBhci0+ZGl3c3RydF92IDwgUEFMX0RJV1NUUlRfVikgewoJCQkJRFBSSU5USygiZGl3c3RydF92IHRvbyBsb3cgZm9yIHBhbFxuIik7CgkJCQlyZXR1cm4gLUVJTlZBTDsKCQkJfQoJCQlodG90YWwgPSBQQUxfSFRPVEFMPj5jbGtfc2hpZnQ7CgkJCXZ0b3RhbCA9IFBBTF9WVE9UQUw+PjE7CgkJCWlmICghSVNfT0NTKSB7CgkJCQlwYXItPmJlYW1jb24wID0gQk1DMF9QQUw7CgkJCQlwYXItPmJwbGNvbjMgfD0gQlBDM19CUkRSQkxOSzsKCQkJfSBlbHNlIGlmIChBTUlHQUhXX1BSRVNFTlQoQUdOVVNfSFJfUEFMKSB8fAoJCQkgICAgICAgICAgIEFNSUdBSFdfUFJFU0VOVChBR05VU19IUl9OVFNDKSkgewoJCQkJcGFyLT5iZWFtY29uMCA9IEJNQzBfUEFMOwoJCQkJcGFyLT5oc3N0b3AgPSAxOwoJCQl9IGVsc2UgaWYgKGFtaWdhX3ZibGFuayAhPSA1MCkgewoJCQkJRFBSSU5USygicGFsIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBjaGlwc2V0XG4iKTsKCQkJCXJldHVybiAtRUlOVkFMOwoJCQl9CgkJfSBlbHNlIHsKCQkJLyogTlRTQyB2aWRlbyBtb2RlCgkJCSAqIEluIHRoZSBBR0EgY2hpcHNldCBzZWVtcyB0byBiZSBoYXJkd2FyZSBidWcgd2l0aCBCUEMzX0JSRFJCTE5LCgkJCSAqIGFuZCBOVFNDIGFjdGl2YXRlZCwgc28gdGhhbiBiZXR0ZXIgbGV0IGRpd3N0b3BfaCA8PSAxODEyCgkJCSAqLwoJCQlpZiAocGFyLT5odG90YWwgIT0gTlRTQ19IVE9UQUwpIHsKCQkJCURQUklOVEsoImh0b3RhbCBpbnZhbGlkIGZvciBudHNjXG4iKTsKCQkJCXJldHVybiAtRUlOVkFMOwoJCQl9CgkJCWlmIChwYXItPmRpd3N0cnRfaCA8IE5UU0NfRElXU1RSVF9IKSB7CgkJCQlEUFJJTlRLKCJkaXdzdHJ0X2ggdG9vIGxvdyBmb3IgbnRzY1xuIik7CgkJCQlyZXR1cm4gLUVJTlZBTDsKCQkJfQoJCQlpZiAocGFyLT5kaXdzdHJ0X3YgPCBOVFNDX0RJV1NUUlRfVikgewoJCQkJRFBSSU5USygiZGl3c3RydF92IHRvbyBsb3cgZm9yIG50c2NcbiIpOwoJCQkJcmV0dXJuIC1FSU5WQUw7CgkJCX0KCQkJaHRvdGFsID0gTlRTQ19IVE9UQUw+PmNsa19zaGlmdDsKCQkJdnRvdGFsID0gTlRTQ19WVE9UQUw+PjE7CgkJCWlmICghSVNfT0NTKSB7CgkJCQlwYXItPmJlYW1jb24wID0gMDsKCQkJCXBhci0+YnBsY29uMyB8PSBCUEMzX0JSRFJCTE5LOwoJCQl9IGVsc2UgaWYgKEFNSUdBSFdfUFJFU0VOVChBR05VU19IUl9QQUwpIHx8CgkJCSAgICAgICAgICAgQU1JR0FIV19QUkVTRU5UKEFHTlVTX0hSX05UU0MpKSB7CgkJCQlwYXItPmJlYW1jb24wID0gMDsKCQkJCXBhci0+aHNzdG9wID0gMTsKCQkJfSBlbHNlIGlmIChhbWlnYV92YmxhbmsgIT0gNjApIHsKCQkJCURQUklOVEsoIm50c2Mgbm90IHN1cHBvcnRlZCBieSB0aGlzIGNoaXBzZXRcbiIpOwoJCQkJcmV0dXJuIC1FSU5WQUw7CgkJCX0KCQl9CgkJaWYgKElTX09DUykgewoJCQlpZiAocGFyLT5kaXdzdHJ0X2ggPj0gMTAyNCB8fCBwYXItPmRpd3N0b3BfaCA8IDEwMjQgfHwKCQkJICAgIHBhci0+ZGl3c3RydF92ID49ICA1MTIgfHwgcGFyLT5kaXdzdG9wX3YgPCAgMjU2KSB7CgkJCQlEUFJJTlRLKCJpbnZhbGlkIHBvc2l0aW9uIGZvciBkaXNwbGF5IG9uIG9jc1xuIik7CgkJCQlyZXR1cm4gLUVJTlZBTDsKCQkJfQoJCX0KCX0gZWxzZSBpZiAoIUlTX09DUykgewoJCS8qIFByb2dyYW1tYWJsZSB2aWRlbyBtb2RlICovCgkJcGFyLT5oc3N0cnQgPSB2YXItPnJpZ2h0X21hcmdpbjw8Y2xrX3NoaWZ0OwoJCXBhci0+aHNzdG9wID0gKHZhci0+cmlnaHRfbWFyZ2luK3Zhci0+aHN5bmNfbGVuKTw8Y2xrX3NoaWZ0OwoJCXBhci0+ZGl3c3RvcF9oID0gcGFyLT5odG90YWwgLSBtb2Q4KHBhci0+aHNzdHJ0KSArIDggLSAoMSA8PCBjbGtfc2hpZnQpOwoJCWlmICghSVNfQUdBKQoJCQlwYXItPmRpd3N0b3BfaCA9IGRvd240KHBhci0+ZGl3c3RvcF9oKSAtIDE2OwoJCXBhci0+ZGl3c3RydF9oID0gcGFyLT5kaXdzdG9wX2ggLSB4cmVzX247CgkJcGFyLT5oYnN0b3AgPSBwYXItPmRpd3N0cnRfaCArIDQ7CgkJcGFyLT5oYnN0cnQgPSBwYXItPmRpd3N0b3BfaCArIDQ7CgkJaWYgKHBhci0+aGJzdHJ0ID49IHBhci0+aHRvdGFsICsgOCkKCQkJcGFyLT5oYnN0cnQgLT0gcGFyLT5odG90YWw7CgkJcGFyLT5oY2VudGVyID0gcGFyLT5oc3N0cnQgKyAocGFyLT5odG90YWwgPj4gMSk7CgkJcGFyLT52c3N0cnQgPSB2YXItPmxvd2VyX21hcmdpbjw8bGluZV9zaGlmdDsKCQlwYXItPnZzc3RvcCA9ICh2YXItPmxvd2VyX21hcmdpbit2YXItPnZzeW5jX2xlbik8PGxpbmVfc2hpZnQ7CgkJcGFyLT5kaXdzdG9wX3YgPSBwYXItPnZ0b3RhbDsKCQlpZiAoKHBhci0+dm1vZGUgJiBGQl9WTU9ERV9NQVNLKSA9PSBGQl9WTU9ERV9JTlRFUkxBQ0VEKQoJCQlwYXItPmRpd3N0b3BfdiAtPSAyOwoJCXBhci0+ZGl3c3RydF92ID0gcGFyLT5kaXdzdG9wX3YgLSB5cmVzX247CgkJcGFyLT52YnN0b3AgPSBwYXItPmRpd3N0cnRfdiAtIDI7CgkJcGFyLT52YnN0cnQgPSBwYXItPmRpd3N0b3BfdiAtIDI7CgkJaWYgKHBhci0+dnRvdGFsID4gMjA0OCkgewoJCQlEUFJJTlRLKCJ2dG90YWwgdG9vIGhpZ2hcbiIpOwoJCQlyZXR1cm4gLUVJTlZBTDsKCQl9CgkJaWYgKHBhci0+aHRvdGFsID4gMjA0OCkgewoJCQlEUFJJTlRLKCJodG90YWwgdG9vIGhpZ2hcbiIpOwoJCQlyZXR1cm4gLUVJTlZBTDsKCQl9CgkJcGFyLT5icGxjb24zIHw9IEJQQzNfRVhUQkxLRU47CgkJcGFyLT5iZWFtY29uMCA9IEJNQzBfSEFSRERJUyB8IEJNQzBfVkFSVkJFTiB8IEJNQzBfTE9MRElTIHwKCQkgICAgICAgICAgICAgICAgQk1DMF9WQVJWU1lFTiB8IEJNQzBfVkFSSFNZRU4gfCBCTUMwX1ZBUkJFQU1FTiB8CgkJICAgICAgICAgICAgICAgIEJNQzBfUEFMIHwgQk1DMF9WQVJDU1lFTjsKCQlpZiAodmFyLT5zeW5jICYgRkJfU1lOQ19IT1JfSElHSF9BQ1QpCgkJCXBhci0+YmVhbWNvbjAgfD0gQk1DMF9IU1lUUlVFOwoJCWlmICh2YXItPnN5bmMgJiBGQl9TWU5DX1ZFUlRfSElHSF9BQ1QpCgkJCXBhci0+YmVhbWNvbjAgfD0gQk1DMF9WU1lUUlVFOwoJCWlmICh2YXItPnN5bmMgJiBGQl9TWU5DX0NPTVBfSElHSF9BQ1QpCgkJCXBhci0+YmVhbWNvbjAgfD0gQk1DMF9DU1lUUlVFOwoJCWh0b3RhbCA9IHBhci0+aHRvdGFsPj5jbGtfc2hpZnQ7CgkJdnRvdGFsID0gcGFyLT52dG90YWw+PjE7Cgl9IGVsc2UgewoJCURQUklOVEsoIm9ubHkgYnJvYWRjYXN0IG1vZGVzIHBvc3NpYmxlIGZvciBvY3NcbiIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoKCS8qCgkgKiBDaGVja2luZyB0aGUgRE1BIHRpbWluZwoJICovCgoJZmNvbnN0ID0gMTY8PG1heGZtb2RlPDxjbGtfc2hpZnQ7CgoJLyoKCSAqIHNtYWxsZXN0IHdpbmRvdyBzdGFydCB2YWx1ZSB3aXRob3V0IHR1cm4gb2ZmIG90aGVyIGRtYSBjeWNsZXMKCSAqIHRoYW4gc3ByaXRlMS03LCB1bmxlc3MgeW91IGNoYW5nZSBtaW5fZnN0cnQKCSAqLwoKCglmc2l6ZSA9ICgobWF4Zm1vZGUrY2xrX3NoaWZ0IDw9IDEpID8gZmNvbnN0IDogNjQpOwoJZnN0cnQgPSBkb3dueChmY29uc3QsIHBhci0+ZGl3c3RydF9oLTQpIC0gZnNpemU7CglpZiAoZnN0cnQgPCBtaW5fZnN0cnQpIHsKCQlEUFJJTlRLKCJmZXRjaCBzdGFydCB0b28gbG93XG4iKTsKCQlyZXR1cm4gLUVJTlZBTDsKCX0KCgkvKgoJICogc21hbGxlc3Qgd2luZG93IHN0YXJ0IHZhbHVlIHdoZXJlIHNtb290aCBzY3JvbGxpbmcgaXMgcG9zc2libGUKCSAqLwoKCWZzdHJ0ID0gZG93bngoZmNvbnN0LCBwYXItPmRpd3N0cnRfaC1mY29uc3QrKDE8PGNsa19zaGlmdCktNCkgLSBmc2l6ZTsKCWlmIChmc3RydCA8IG1pbl9mc3RydCkKCQlwYXItPnZtb2RlICY9IH5GQl9WTU9ERV9TTU9PVEhfWFBBTjsKCgltYXhmZXRjaHN0b3AgPSBkb3duMTYocGFyLT5odG90YWwgLSA4MCk7CgoJZnN0cnQgPSBkb3dueChmY29uc3QsIHBhci0+ZGl3c3RydF9oLTQpIC0gNjQgLSBmY29uc3Q7Cglmc2l6ZSA9IHVweChmY29uc3QsIHhyZXNfbiArIG1vZHgoZmNvbnN0LCBkb3dueCgxPDxjbGtfc2hpZnQsIHBhci0+ZGl3c3RydF9oLTQpKSk7CglpZiAoZnN0cnQgKyBmc2l6ZSA+IG1heGZldGNoc3RvcCkKCQlwYXItPnZtb2RlICY9IH5GQl9WTU9ERV9TTU9PVEhfWFBBTjsKCglmc2l6ZSA9IHVweChmY29uc3QsIHhyZXNfbik7CglpZiAoZnN0cnQgKyBmc2l6ZSA+IG1heGZldGNoc3RvcCkgewoJCURQUklOVEsoImZldGNoIHN0b3AgdG9vIGhpZ2hcbiIpOwoJCXJldHVybiAtRUlOVkFMOwoJfQoKCWlmIChtYXhmbW9kZSArIGNsa19zaGlmdCA8PSAxKSB7CgkJZnNpemUgPSB1cDY0KHhyZXNfbiArIGZjb25zdCAtIDEpOwoJCWlmIChtaW5fZnN0cnQgKyBmc2l6ZSAtIDY0ID4gbWF4ZmV0Y2hzdG9wKQoJCQlwYXItPnZtb2RlICY9IH5GQl9WTU9ERV9TTU9PVEhfWFBBTjsKCgkJZnNpemUgPSB1cDY0KHhyZXNfbik7CgkJaWYgKG1pbl9mc3RydCArIGZzaXplIC0gNjQgPiBtYXhmZXRjaHN0b3ApIHsKCQkJRFBSSU5USygiZmV0Y2ggc2l6ZSB0b28gaGlnaFxuIik7CgkJCXJldHVybiAtRUlOVkFMOwoJCX0KCgkJZnNpemUgLT0gNjQ7Cgl9IGVsc2UKCQlmc2l6ZSAtPSBmY29uc3Q7CgoJLyoKCSAqIENoZWNrIGlmIHRoZXJlIGlzIGVub3VnaCB0aW1lIHRvIHVwZGF0ZSB0aGUgYml0cGxhbmUgcG9pbnRlcnMgZm9yIHl3cmFwCgkgKi8KCglpZiAocGFyLT5odG90YWwtZnNpemUtNjQgPCBwYXItPmJwcCo2NCkKCQlwYXItPnZtb2RlICY9IH5GQl9WTU9ERV9ZV1JBUDsKCgkvKgoJICogQml0cGxhbmUgY2FsY3VsYXRpb25zIGFuZCBjaGVjayB0aGUgTWVtb3J5IFJlcXVpcmVtZW50cwoJICovCgoJaWYgKGFtaWZiX2lsYm0pIHsKCQlwYXItPm5leHRfcGxhbmUgPSBkaXY4KHVweCgxNjw8bWF4Zm1vZGUsIHBhci0+dnhyZXMpKTsKCQlwYXItPm5leHRfbGluZSA9IHBhci0+YnBwKnBhci0+bmV4dF9wbGFuZTsKCQlpZiAocGFyLT5uZXh0X2xpbmUgKiBwYXItPnZ5cmVzID4gZmJfaW5mby5maXguc21lbV9sZW4pIHsKCQkJRFBSSU5USygidG9vIGZldyB2aWRlbyBtZW1cbiIpOwoJCQlyZXR1cm4gLUVJTlZBTDsKCQl9Cgl9IGVsc2UgewoJCXBhci0+bmV4dF9saW5lID0gZGl2OCh1cHgoMTY8PG1heGZtb2RlLCBwYXItPnZ4cmVzKSk7CgkJcGFyLT5uZXh0X3BsYW5lID0gcGFyLT52eXJlcypwYXItPm5leHRfbGluZTsKCQlpZiAocGFyLT5uZXh0X3BsYW5lICogcGFyLT5icHAgPiBmYl9pbmZvLmZpeC5zbWVtX2xlbikgewoJCQlEUFJJTlRLKCJ0b28gZmV3IHZpZGVvIG1lbVxuIik7CgkJCXJldHVybiAtRUlOVkFMOwoJCX0KCX0KCgkvKgoJICogSGFyZHdhcmUgUmVnaXN0ZXIgVmFsdWVzCgkgKi8KCglwYXItPmJwbGNvbjAgPSBCUEMwX0NPTE9SIHwgYnBscGl4bW9kZVtjbGtfc2hpZnRdOwoJaWYgKCFJU19PQ1MpCgkJcGFyLT5icGxjb24wIHw9IEJQQzBfRUNTRU5BOwoJaWYgKHBhci0+YnBwID09IDgpCgkJcGFyLT5icGxjb24wIHw9IEJQQzBfQlBVMzsKCWVsc2UKCQlwYXItPmJwbGNvbjAgfD0gcGFyLT5icHA8PDEyOwoJaWYgKHZhci0+bm9uc3RkID09IEZCX05PTlNURF9IQU0pCgkJcGFyLT5icGxjb24wIHw9IEJQQzBfSEFNOwoJaWYgKHZhci0+c3luYyAmIEZCX1NZTkNfRVhUKQoJCXBhci0+YnBsY29uMCB8PSBCUEMwX0VSU1k7CgoJaWYgKElTX0FHQSkKCQlwYXItPmZtb2RlID0gYnBsZmV0Y2htb2RlW21heGZtb2RlXTsKCglzd2l0Y2ggKHBhci0+dm1vZGUgJiBGQl9WTU9ERV9NQVNLKSB7CgkJY2FzZSBGQl9WTU9ERV9JTlRFUkxBQ0VEOgoJCQlwYXItPmJwbGNvbjAgfD0gQlBDMF9MQUNFOwoJCQlicmVhazsKCQljYXNlIEZCX1ZNT0RFX0RPVUJMRToKCQkJaWYgKElTX0FHQSkKCQkJCXBhci0+Zm1vZGUgfD0gRk1PREVfU1NDQU4yIHwgRk1PREVfQlNDQU4yOwoJCQlicmVhazsKCX0KCglpZiAoISgocGFyLT52bW9kZSBeIHZhci0+dm1vZGUpICYgRkJfVk1PREVfWVdSQVApKSB7CgkJcGFyLT54b2Zmc2V0ID0gdmFyLT54b2Zmc2V0OwoJCXBhci0+eW9mZnNldCA9IHZhci0+eW9mZnNldDsKCQlpZiAocGFyLT52bW9kZSAmIEZCX1ZNT0RFX1lXUkFQKSB7CgkJCWlmIChwYXItPnhvZmZzZXQgfHwgcGFyLT55b2Zmc2V0IDwgMCB8fCBwYXItPnlvZmZzZXQgPj0gcGFyLT52eXJlcykKCQkJCXBhci0+eG9mZnNldCA9IHBhci0+eW9mZnNldCA9IDA7CgkJfSBlbHNlIHsKCQkJaWYgKHBhci0+eG9mZnNldCA8IDAgfHwgcGFyLT54b2Zmc2V0ID4gdXB4KDE2PDxtYXhmbW9kZSwgcGFyLT52eHJlcy1wYXItPnhyZXMpIHx8CgkJCSAgICBwYXItPnlvZmZzZXQgPCAwIHx8IHBhci0+eW9mZnNldCA+IHBhci0+dnlyZXMtcGFyLT55cmVzKQoJCQkJcGFyLT54b2Zmc2V0ID0gcGFyLT55b2Zmc2V0ID0gMDsKCQl9Cgl9IGVsc2UKCQlwYXItPnhvZmZzZXQgPSBwYXItPnlvZmZzZXQgPSAwOwoKCXBhci0+Y3Jzci5jcnNyX3ggPSBwYXItPmNyc3IuY3Jzcl95ID0gMDsKCXBhci0+Y3Jzci5zcG90X3ggPSBwYXItPmNyc3Iuc3BvdF95ID0gMDsKCXBhci0+Y3Jzci5oZWlnaHQgPSBwYXItPmNyc3Iud2lkdGggPSAwOwoKI2lmIDAJLyogZmJtb24gbm90IGRvbmUuICB1bmNvbW1lbnQgZm9yIDIuNS54IC1icmFkICovCglpZiAoIWZibW9uX3ZhbGlkX3RpbWluZ3MocGl4Y2xvY2tbY2xrX3NoaWZ0XSwgaHRvdGFsLCB2dG90YWwsCgkJCQkgJmZiX2luZm8pKSB7CgkJRFBSSU5USygibW9kZSBkb2Vzbid0IGZpdCBmb3IgbW9uaXRvclxuIik7CgkJcmV0dXJuIC1FSU5WQUw7Cgl9CiNlbmRpZgoKCXJldHVybiAwOwp9CgoJLyoKCSAqIEZpbGwgdGhlIGB2YXInIHN0cnVjdHVyZSBiYXNlZCBvbiB0aGUgdmFsdWVzIGluIGBwYXInIGFuZCBtYXliZQoJICogb3RoZXIgdmFsdWVzIHJlYWQgb3V0IG9mIHRoZSBoYXJkd2FyZS4KCSAqLwoKc3RhdGljIGludCBhbWlfZW5jb2RlX3ZhcihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8gKnZhciwKICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYW1pZmJfcGFyICpwYXIpCnsKCXVfc2hvcnQgY2xrX3NoaWZ0LCBsaW5lX3NoaWZ0OwoKCW1lbXNldCh2YXIsIDAsIHNpemVvZihzdHJ1Y3QgZmJfdmFyX3NjcmVlbmluZm8pKTsKCgljbGtfc2hpZnQgPSBwYXItPmNsa19zaGlmdDsKCWxpbmVfc2hpZnQgPSBwYXItPmxpbmVfc2hpZnQ7CgoJdmFyLT54cmVzID0gcGFyLT54cmVzOwoJdmFyLT55cmVzID0gcGFyLT55cmVzOwoJdmFyLT54cmVzX3ZpcnR1YWwgPSBwYXItPnZ4cmVzOwoJdmFyLT55cmVzX3ZpcnR1YWwgPSBwYXItPnZ5cmVzOwoJdmFyLT54b2Zmc2V0ID0gcGFyLT54b2Zmc2V0OwoJdmFyLT55b2Zmc2V0ID0gcGFyLT55b2Zmc2V0OwoKCXZhci0+Yml0c19wZXJfcGl4ZWwgPSBwYXItPmJwcDsKCXZhci0+Z3JheXNjYWxlID0gMDsKCgl2YXItPnJlZC5vZmZzZXQgPSAwOwoJdmFyLT5yZWQubXNiX3JpZ2h0ID0gMDsKCXZhci0+cmVkLmxlbmd0aCA9IHBhci0+YnBwOwoJaWYgKHBhci0+YnBsY29uMCAmIEJQQzBfSEFNKQoJICAgIHZhci0+cmVkLmxlbmd0aCAtPSAyOwoJdmFyLT5ibHVlID0gdmFyLT5ncmVlbiA9IHZhci0+cmVkOwoJdmFyLT50cmFuc3Aub2Zmc2V0ID0gMDsKCXZhci0+dHJhbnNwLmxlbmd0aCA9IDA7Cgl2YXItPnRyYW5zcC5tc2JfcmlnaHQgPSAwOwoKCWlmIChwYXItPmJwbGNvbjAgJiBCUEMwX0hBTSkKCQl2YXItPm5vbnN0ZCA9IEZCX05PTlNURF9IQU07CgllbHNlCgkJdmFyLT5ub25zdGQgPSAwOwoJdmFyLT5hY3RpdmF0ZSA9IDA7CgoJdmFyLT5oZWlnaHQgPSAtMTsKCXZhci0+d2lkdGggPSAtMTsKCgl2YXItPnBpeGNsb2NrID0gcGl4Y2xvY2tbY2xrX3NoaWZ0XTsKCglpZiAoSVNfQUdBICYmIHBhci0+Zm1vZGUgJiBGTU9ERV9CU0NBTjIpCgkJdmFyLT52bW9kZSA9IEZCX1ZNT0RFX0RPVUJMRTsKCWVsc2UgaWYgKHBhci0+YnBsY29uMCAmIEJQQzBfTEFDRSkKCQl2YXItPnZtb2RlID0gRkJfVk1PREVfSU5URVJMQUNFRDsKCWVsc2UKCQl2YXItPnZtb2RlID0gRkJfVk1PREVfTk9OSU5URVJMQUNFRDsKCglpZiAoIUlTX09DUyAmJiBwYXItPmJlYW1jb24wICYgQk1DMF9WQVJCRUFNRU4pIHsKCQl2YXItPmhzeW5jX2xlbiA9IChwYXItPmhzc3RvcC1wYXItPmhzc3RydCk+PmNsa19zaGlmdDsKCQl2YXItPnJpZ2h0X21hcmdpbiA9IHBhci0+aHNzdHJ0Pj5jbGtfc2hpZnQ7CgkJdmFyLT5sZWZ0X21hcmdpbiA9IChwYXItPmh0b3RhbD4+Y2xrX3NoaWZ0KSAtIHZhci0+eHJlcyAtIHZhci0+cmlnaHRfbWFyZ2luIC0gdmFyLT5oc3luY19sZW47CgkJdmFyLT52c3luY19sZW4gPSAocGFyLT52c3N0b3AtcGFyLT52c3N0cnQpPj5saW5lX3NoaWZ0OwoJCXZhci0+bG93ZXJfbWFyZ2luID0gcGFyLT52c3N0cnQ+PmxpbmVfc2hpZnQ7CgkJdmFyLT51cHBlcl9tYXJnaW4gPSAocGFyLT52dG90YWw+PmxpbmVfc2hpZnQpIC0gdmFyLT55cmVzIC0gdmFyLT5sb3dlcl9tYXJnaW4gLSB2YXItPnZzeW5jX2xlbjsKCQl2YXItPnN5bmMgPSAwOwoJCWlmIChwYXItPmJlYW1jb24wICYgQk1DMF9IU1lUUlVFKQoJCQl2YXItPnN5bmMgfD0gRkJfU1lOQ19IT1JfSElHSF9BQ1Q7CgkJaWYgKHBhci0+YmVhbWNvbjAgJiBCTUMwX1ZTWVRSVUUpCgkJCXZhci0+c3luYyB8PSBGQl9TWU5DX1ZFUlRfSElHSF9BQ1Q7CgkJaWYgKHBhci0+YmVhbWNvbjAgJiBCTUMwX0NTWVRSVUUpCgkJCXZhci0+c3luYyB8PSBGQl9TWU5DX0NPTVBfSElHSF9BQ1Q7Cgl9IGVsc2UgewoJCXZhci0+c3luYyA9IEZCX1NZTkNfQlJPQURDQVNUOwoJCXZhci0+aHN5bmNfbGVuID0gKDE1Mj4+Y2xrX3NoaWZ0KSArIG1vZDQocGFyLT5kaXdzdG9wX2gpOwoJCXZhci0+cmlnaHRfbWFyZ2luID0gKChwYXItPmh0b3RhbCAtIGRvd240KHBhci0+ZGl3c3RvcF9oKSk+PmNsa19zaGlmdCkgKyB2YXItPmhzeW5jX2xlbjsKCQl2YXItPmxlZnRfbWFyZ2luID0gKHBhci0+aHRvdGFsPj5jbGtfc2hpZnQpIC0gdmFyLT54cmVzIC0gdmFyLT5yaWdodF9tYXJnaW4gLSB2YXItPmhzeW5jX2xlbjsKCQl2YXItPnZzeW5jX2xlbiA9IDQ+PmxpbmVfc2hpZnQ7CgkJdmFyLT5sb3dlcl9tYXJnaW4gPSAoKHBhci0+dnRvdGFsIC0gcGFyLT5kaXdzdG9wX3YpPj5saW5lX3NoaWZ0KSArIHZhci0+dnN5bmNfbGVuOwoJCXZhci0+dXBwZXJfbWFyZ2luID0gKCgocGFyLT52dG90YWwgLSAyKT4+bGluZV9zaGlmdCkgKyAxKSAtIHZhci0+eXJlcyAtCgkJICAgICAgICAgICAgICAgICAgICB2YXItPmxvd2VyX21hcmdpbiAtIHZhci0+dnN5bmNfbGVuOwoJfQoKCWlmIChwYXItPmJwbGNvbjAgJiBCUEMwX0VSU1kpCgkJdmFyLT5zeW5jIHw9IEZCX1NZTkNfRVhUOwoJaWYgKHBhci0+dm1vZGUgJiBGQl9WTU9ERV9ZV1JBUCkKCQl2YXItPnZtb2RlIHw9IEZCX1ZNT0RFX1lXUkFQOwoKCXJldHVybiAwOwp9CgoKCS8qCgkgKiBQYW4gb3IgV3JhcCB0aGUgRGlzcGxheQoJICoKCSAqIFRoaXMgY2FsbCBsb29rcyBvbmx5IGF0IHhvZmZzZXQsIHlvZmZzZXQgYW5kIHRoZSBGQl9WTU9ERV9ZV1JBUCBmbGFnCgkgKiBpbiBgdmFyJy4KCSAqLwoKc3RhdGljIHZvaWQgYW1pX3Bhbl92YXIoc3RydWN0IGZiX3Zhcl9zY3JlZW5pbmZvICp2YXIpCnsKCXN0cnVjdCBhbWlmYl9wYXIgKnBhciA9ICZjdXJyZW50cGFyOwoKCXBhci0+eG9mZnNldCA9IHZhci0+eG9mZnNldDsKCXBhci0+eW9mZnNldCA9IHZhci0+eW9mZnNldDsKCWlmICh2YXItPnZtb2RlICYgRkJfVk1PREVfWVdSQVApCgkJcGFyLT52bW9kZSB8PSBGQl9WTU9ERV9ZV1JBUDsKCWVsc2UKCQlwYXItPnZtb2RlICY9IH5GQl9WTU9ERV9ZV1JBUDsKCglkb192bW9kZV9wYW4gPSAwOwoJYW1pX3VwZGF0ZV9wYXIoKTsKCWRvX3Ztb2RlX3BhbiA9IDE7Cn0KCgkvKgoJICogVXBkYXRlIGhhcmR3YXJlCgkgKi8KCnN0YXRpYyBpbnQgYW1pX3VwZGF0ZV9wYXIodm9pZCkKewoJc3RydWN0IGFtaWZiX3BhciAqcGFyID0gJmN1cnJlbnRwYXI7CglzaG9ydCBjbGtfc2hpZnQsIHZzaGlmdCwgZnN0cnQsIGZzaXplLCBmc3RvcCwgZmNvbnN0LCAgc2hpZnQsIG1vdmUsIG1vZDsKCgljbGtfc2hpZnQgPSBwYXItPmNsa19zaGlmdDsKCglpZiAoIShwYXItPnZtb2RlICYgRkJfVk1PREVfU01PT1RIX1hQQU4pKQoJCXBhci0+eG9mZnNldCA9IHVweCgxNjw8bWF4Zm1vZGUsIHBhci0+eG9mZnNldCk7CgoJZmNvbnN0ID0gMTY8PG1heGZtb2RlPDxjbGtfc2hpZnQ7Cgl2c2hpZnQgPSBtb2R4KDE2PDxtYXhmbW9kZSwgcGFyLT54b2Zmc2V0KTsKCWZzdHJ0ID0gcGFyLT5kaXdzdHJ0X2ggLSAodnNoaWZ0PDxjbGtfc2hpZnQpIC0gNDsKCWZzaXplID0gKHBhci0+eHJlcyt2c2hpZnQpPDxjbGtfc2hpZnQ7CglzaGlmdCA9IG1vZHgoZmNvbnN0LCBmc3RydCk7Cgltb3ZlID0gZG93bngoMjw8bWF4Zm1vZGUsIGRpdjgocGFyLT54b2Zmc2V0KSk7CglpZiAobWF4Zm1vZGUgKyBjbGtfc2hpZnQgPiAxKSB7CgkJZnN0cnQgPSBkb3dueChmY29uc3QsIGZzdHJ0KSAtIDY0OwoJCWZzaXplID0gdXB4KGZjb25zdCwgZnNpemUpOwoJCWZzdG9wID0gZnN0cnQgKyBmc2l6ZSAtIGZjb25zdDsKCX0gZWxzZSB7CgkJbW9kID0gZnN0cnQgPSBkb3dueChmY29uc3QsIGZzdHJ0KSAtIGZjb25zdDsKCQlmc3RvcCA9IGZzdHJ0ICsgdXB4KGZjb25zdCwgZnNpemUpIC0gNjQ7CgkJZnNpemUgPSB1cDY0KGZzaXplKTsKCQlmc3RydCA9IGZzdG9wIC0gZnNpemUgKyA2NDsKCQlpZiAoZnN0cnQgPCBtaW5fZnN0cnQpIHsKCQkJZnN0b3AgKz0gbWluX2ZzdHJ0IC0gZnN0cnQ7CgkJCWZzdHJ0ID0gbWluX2ZzdHJ0OwoJCX0KCQltb3ZlID0gbW92ZSAtIGRpdjgoKG1vZC1mc3RydCk+PmNsa19zaGlmdCk7Cgl9Cgltb2QgPSBwYXItPm5leHRfbGluZSAtIGRpdjgoZnNpemU+PmNsa19zaGlmdCk7CglwYXItPmRkZnN0cnQgPSBmc3RydDsKCXBhci0+ZGRmc3RvcCA9IGZzdG9wOwoJcGFyLT5icGxjb24xID0gaHNjcm9sbDJodyhzaGlmdCk7CglwYXItPmJwbDJtb2QgPSBtb2Q7CglpZiAocGFyLT5icGxjb24wICYgQlBDMF9MQUNFKQoJCXBhci0+YnBsMm1vZCArPSBwYXItPm5leHRfbGluZTsKCWlmIChJU19BR0EgJiYgKHBhci0+Zm1vZGUgJiBGTU9ERV9CU0NBTjIpKQoJCXBhci0+YnBsMW1vZCA9IC1kaXY4KGZzaXplPj5jbGtfc2hpZnQpOwoJZWxzZQoJCXBhci0+YnBsMW1vZCA9IHBhci0+YnBsMm1vZDsKCglpZiAocGFyLT55b2Zmc2V0KSB7CgkJcGFyLT5icGxwdDAgPSBmYl9pbmZvLmZpeC5zbWVtX3N0YXJ0ICsgcGFyLT5uZXh0X2xpbmUqcGFyLT55b2Zmc2V0ICsgbW92ZTsKCQlpZiAocGFyLT52bW9kZSAmIEZCX1ZNT0RFX1lXUkFQKSB7CgkJCWlmIChwYXItPnlvZmZzZXQgPiBwYXItPnZ5cmVzLXBhci0+eXJlcykgewoJCQkJcGFyLT5icGxwdDB3cmFwID0gZmJfaW5mby5maXguc21lbV9zdGFydCArIG1vdmU7CgkJCQlpZiAocGFyLT5icGxjb24wICYgQlBDMF9MQUNFICYmIG1vZDIocGFyLT5kaXdzdHJ0X3YrcGFyLT52eXJlcy1wYXItPnlvZmZzZXQpKQoJCQkJCXBhci0+YnBscHQwd3JhcCArPSBwYXItPm5leHRfbGluZTsKCQkJfQoJCX0KCX0gZWxzZQoJCXBhci0+YnBscHQwID0gZmJfaW5mby5maXguc21lbV9zdGFydCArIG1vdmU7CgoJaWYgKHBhci0+YnBsY29uMCAmIEJQQzBfTEFDRSAmJiBtb2QyKHBhci0+ZGl3c3RydF92KSkKCQlwYXItPmJwbHB0MCArPSBwYXItPm5leHRfbGluZTsKCglyZXR1cm4gMDsKfQoKCgkvKgoJICogU2V0IGEgc2luZ2xlIGNvbG9yIHJlZ2lzdGVyLiBUaGUgdmFsdWVzIHN1cHBsaWVkIGFyZSBhbHJlYWR5CgkgKiByb3VuZGVkIGRvd24gdG8gdGhlIGhhcmR3YXJlJ3MgY2FwYWJpbGl0aWVzIChhY2NvcmRpbmcgdG8gdGhlCgkgKiBlbnRyaWVzIGluIHRoZSB2YXIgc3RydWN0dXJlKS4gUmV0dXJuICE9IDAgZm9yIGludmFsaWQgcmVnbm8uCgkgKi8KCnN0YXRpYyBpbnQgYW1pZmJfc2V0Y29scmVnKHVfaW50IHJlZ25vLCB1X2ludCByZWQsIHVfaW50IGdyZWVuLCB1X2ludCBibHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICB1X2ludCB0cmFuc3AsIHN0cnVjdCBmYl9pbmZvICppbmZvKQp7CglpZiAoSVNfQUdBKSB7CgkJaWYgKHJlZ25vID4gMjU1KQoJCQlyZXR1cm4gMTsKCX0gZWxzZSBpZiAoY3VycmVudHBhci5icGxjb24wICYgQlBDMF9TSFJFUykgewoJCWlmIChyZWdubyA+IDMpCgkJCXJldHVybiAxOwoJfSBlbHNlIHsKCQlpZiAocmVnbm8gPiAzMSkKCQkJcmV0dXJuIDE7Cgl9CglyZWQgPj49IDg7CglncmVlbiA+Pj0gODsKCWJsdWUgPj49IDg7CglpZiAoIXJlZ25vKSB7CgkJcmVkMCA9IHJlZDsKCQlncmVlbjAgPSBncmVlbjsKCQlibHVlMCA9IGJsdWU7Cgl9CgoJLyoKCSAqIFVwZGF0ZSB0aGUgY29ycmVzcG9uZGluZyBIYXJkd2FyZSBDb2xvciBSZWdpc3RlciwgdW5sZXNzIGl0J3MgQ29sb3IKCSAqIFJlZ2lzdGVyIDAgYW5kIHRoZSBzY3JlZW4gaXMgYmxhbmtlZC4KCSAqCgkgKiBWQmxhbmsgaXMgc3dpdGNoZWQgb2ZmIHRvIHByb3RlY3QgYnBsY29uMyBvciBlY3NfcGFsZXR0ZVtdIGZyb20KCSAqIGJlaW5nIGNoYW5nZWQgYnkgYW1pX2RvX2JsYW5rKCkgZHVyaW5nIHRoZSBWQmxhbmsuCgkgKi8KCglpZiAocmVnbm8gfHwgIWlzX2JsYW5rZWQpIHsKI2lmIGRlZmluZWQoQ09ORklHX0ZCX0FNSUdBX0FHQSkKCQlpZiAoSVNfQUdBKSB7CgkJCXVfc2hvcnQgYnBsY29uMyA9IGN1cnJlbnRwYXIuYnBsY29uMzsKCQkJVkJsYW5rT2ZmKCk7CgkJCWN1c3RvbS5icGxjb24zID0gYnBsY29uMyB8IChyZWdubzw8OCAmIDB4ZTAwMCk7CgkJCWN1c3RvbS5jb2xvcltyZWdubyYzMV0gPSByZ2IyaHc4X2hpZ2gocmVkLCBncmVlbiwgYmx1ZSk7CgkJCWN1c3RvbS5icGxjb24zID0gYnBsY29uMyB8IChyZWdubzw8OCAmIDB4ZTAwMCkgfCBCUEMzX0xPQ1Q7CgkJCWN1c3RvbS5jb2xvcltyZWdubyYzMV0gPSByZ2IyaHc4X2xvdyhyZWQsIGdyZWVuLCBibHVlKTsKCQkJY3VzdG9tLmJwbGNvbjMgPSBicGxjb24zOwoJCQlWQmxhbmtPbigpOwoJCX0gZWxzZQojZW5kaWYKI2lmIGRlZmluZWQoQ09ORklHX0ZCX0FNSUdBX0VDUykKCQlpZiAoY3VycmVudHBhci5icGxjb24wICYgQlBDMF9TSFJFUykgewoJCQl1X3Nob3J0IGNvbG9yLCBtYXNrOwoJCQlpbnQgaTsKCgkJCW1hc2sgPSAweDMzMzM7CgkJCWNvbG9yID0gcmdiMmh3MihyZWQsIGdyZWVuLCBibHVlKTsKCQkJVkJsYW5rT2ZmKCk7CgkJCWZvciAoaSA9IHJlZ25vKzEyOyBpID49IChpbnQpcmVnbm87IGkgLT0gNCkKCQkJCWN1c3RvbS5jb2xvcltpXSA9IGVjc19wYWxldHRlW2ldID0gKGVjc19wYWxldHRlW2ldICYgbWFzaykgfCBjb2xvcjsKCQkJbWFzayA8PD0yOyBjb2xvciA+Pj0gMjsKCQkJcmVnbm8gPSBkb3duMTYocmVnbm8pK211bDQobW9kNChyZWdubykpOwoJCQlmb3IgKGkgPSByZWdubyszOyBpID49IChpbnQpcmVnbm87IGktLSkKCQkJCWN1c3RvbS5jb2xvcltpXSA9IGVjc19wYWxldHRlW2ldID0gKGVjc19wYWxldHRlW2ldICYgbWFzaykgfCBjb2xvcjsKCQkJVkJsYW5rT24oKTsKCQl9IGVsc2UKI2VuZGlmCgkJCWN1c3RvbS5jb2xvcltyZWdub10gPSByZ2IyaHc0KHJlZCwgZ3JlZW4sIGJsdWUpOwoJfQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIGFtaV91cGRhdGVfZGlzcGxheSh2b2lkKQp7CglzdHJ1Y3QgYW1pZmJfcGFyICpwYXIgPSAmY3VycmVudHBhcjsKCgljdXN0b20uYnBsY29uMSA9IHBhci0+YnBsY29uMTsKCWN1c3RvbS5icGwxbW9kID0gcGFyLT5icGwxbW9kOwoJY3VzdG9tLmJwbDJtb2QgPSBwYXItPmJwbDJtb2Q7CgljdXN0b20uZGRmc3RydCA9IGRkZnN0cnQyaHcocGFyLT5kZGZzdHJ0KTsKCWN1c3RvbS5kZGZzdG9wID0gZGRmc3RvcDJodyhwYXItPmRkZnN0b3ApOwp9CgoJLyoKCSAqIENoYW5nZSB0aGUgdmlkZW8gbW9kZSAoY2FsbGVkIGJ5IFZCbGFuayBpbnRlcnJ1cHQpCgkgKi8KCnN0YXRpYyB2b2lkIGFtaV9pbml0X2Rpc3BsYXkodm9pZCkKewoJc3RydWN0IGFtaWZiX3BhciAqcGFyID0gJmN1cnJlbnRwYXI7CglpbnQgaTsKCgljdXN0b20uYnBsY29uMCA9IHBhci0+YnBsY29uMCAmIH5CUEMwX0xBQ0U7CgljdXN0b20uYnBsY29uMiA9IChJU19PQ1MgPyAwIDogQlBDMl9LSUxMRUhCKSB8IEJQQzJfUEYyUDIgfCBCUEMyX1BGMVAyOwoJaWYgKCFJU19PQ1MpIHsKCQljdXN0b20uYnBsY29uMyA9IHBhci0+YnBsY29uMzsKCQlpZiAoSVNfQUdBKQoJCQljdXN0b20uYnBsY29uNCA9IEJQQzRfRVNQUk00IHwgQlBDNF9PU1BSTTQ7CgkJaWYgKHBhci0+YmVhbWNvbjAgJiBCTUMwX1ZBUkJFQU1FTikgewoJCQljdXN0b20uaHRvdGFsID0gaHRvdGFsMmh3KHBhci0+aHRvdGFsKTsKCQkJY3VzdG9tLmhic3RydCA9IGhic3RydDJodyhwYXItPmhic3RydCk7CgkJCWN1c3RvbS5oYnN0b3AgPSBoYnN0b3AyaHcocGFyLT5oYnN0b3ApOwoJCQljdXN0b20uaHNzdHJ0ID0gaHNzdHJ0Mmh3KHBhci0+aHNzdHJ0KTsKCQkJY3VzdG9tLmhzc3RvcCA9IGhzc3RvcDJodyhwYXItPmhzc3RvcCk7CgkJCWN1c3RvbS5oY2VudGVyID0gaGNlbnRlcjJodyhwYXItPmhjZW50ZXIpOwoJCQljdXN0b20udnRvdGFsID0gdnRvdGFsMmh3KHBhci0+dnRvdGFsKTsKCQkJY3VzdG9tLnZic3RydCA9IHZic3RydDJodyhwYXItPnZic3RydCk7CgkJCWN1c3RvbS52YnN0b3AgPSB2YnN0b3AyaHcocGFyLT52YnN0b3ApOwoJCQljdXN0b20udnNzdHJ0ID0gdnNzdHJ0Mmh3KHBhci0+dnNzdHJ0KTsKCQkJY3VzdG9tLnZzc3RvcCA9IHZzc3RvcDJodyhwYXItPnZzc3RvcCk7CgkJfQoJfQoJaWYgKCFJU19PQ1MgfHwgcGFyLT5oc3N0b3ApCgkJY3VzdG9tLmJlYW1jb24wID0gcGFyLT5iZWFtY29uMDsKCWlmIChJU19BR0EpCgkJY3VzdG9tLmZtb2RlID0gcGFyLT5mbW9kZTsKCgkvKgoJICogVGhlIG1pbmltdW0gcGVyaW9kIGZvciBhdWRpbyBkZXBlbmRzIG9uIGh0b3RhbAoJICovCgoJYW1pZ2FfYXVkaW9fbWluX3BlcmlvZCA9IGRpdjE2KHBhci0+aHRvdGFsKTsKCglpc19sYWNlID0gcGFyLT5icGxjb24wICYgQlBDMF9MQUNFID8gMSA6IDA7CiNpZiAxCglpZiAoaXNfbGFjZSkgewoJCWkgPSBjdXN0b20udnBvc3IgPj4gMTU7Cgl9IGVsc2UgewoJCWN1c3RvbS52cG9zdyA9IGN1c3RvbS52cG9zciB8IDB4ODAwMDsKCQlpID0gMTsKCX0KI2Vsc2UKCWkgPSAxOwoJY3VzdG9tLnZwb3N3ID0gY3VzdG9tLnZwb3NyIHwgMHg4MDAwOwojZW5kaWYKCWN1c3RvbS5jb3AybGMgPSAodV9zaG9ydCAqKVpUV09fUEFERFIoY29wZGlzcGxheS5saXN0W2N1cnJlbnRjb3BdW2ldKTsKfQoKCS8qCgkgKiAoVW4pQmxhbmsgdGhlIHNjcmVlbiAoY2FsbGVkIGJ5IFZCbGFuayBpbnRlcnJ1cHQpCgkgKi8KCnN0YXRpYyB2b2lkIGFtaV9kb19ibGFuayh2b2lkKQp7CglzdHJ1Y3QgYW1pZmJfcGFyICpwYXIgPSAmY3VycmVudHBhcjsKI2lmIGRlZmluZWQoQ09ORklHX0ZCX0FNSUdBX0FHQSkKCXVfc2hvcnQgYnBsY29uMyA9IHBhci0+YnBsY29uMzsKI2VuZGlmCgl1X2NoYXIgcmVkLCBncmVlbiwgYmx1ZTsKCglpZiAoZG9fYmxhbmsgPiAwKSB7CgkJY3VzdG9tLmRtYWNvbiA9IERNQUZfUkFTVEVSIHwgRE1BRl9TUFJJVEU7CgkJcmVkID0gZ3JlZW4gPSBibHVlID0gMDsKCQlpZiAoIUlTX09DUyAmJiBkb19ibGFuayA+IDEpIHsKCQkJc3dpdGNoIChkb19ibGFuaykgewoJCQkJY2FzZSBGQl9CTEFOS19WU1lOQ19TVVNQRU5EOgoJCQkJCWN1c3RvbS5oc3N0cnQgPSBoc3N0cnQyaHcocGFyLT5oc3N0cnQpOwoJCQkJCWN1c3RvbS5oc3N0b3AgPSBoc3N0b3AyaHcocGFyLT5oc3N0b3ApOwoJCQkJCWN1c3RvbS52c3N0cnQgPSB2c3N0cnQyaHcocGFyLT52dG90YWwrNCk7CgkJCQkJY3VzdG9tLnZzc3RvcCA9IHZzc3RvcDJodyhwYXItPnZ0b3RhbCs0KTsKCQkJCQlicmVhazsKCQkJCWNhc2UgRkJfQkxBTktfSFNZTkNfU1VTUEVORDoKCQkJCQljdXN0b20uaHNzdHJ0ID0gaHNzdHJ0Mmh3KHBhci0+aHRvdGFsKzE2KTsKCQkJCQljdXN0b20uaHNzdG9wID0gaHNzdG9wMmh3KHBhci0+aHRvdGFsKzE2KTsKCQkJCQljdXN0b20udnNzdHJ0ID0gdnNzdHJ0Mmh3KHBhci0+dnNzdHJ0KTsKCQkJCQljdXN0b20udnNzdG9wID0gdnNzdHJ0Mmh3KHBhci0+dnNzdG9wKTsKCQkJCQlicmVhazsKCQkJCWNhc2UgRkJfQkxBTktfUE9XRVJET1dOOgoJCQkJCWN1c3RvbS5oc3N0cnQgPSBoc3N0cnQyaHcocGFyLT5odG90YWwrMTYpOwoJCQkJCWN1c3RvbS5oc3N0b3AgPSBoc3N0b3AyaHcocGFyLT5odG90YWwrMTYpOwoJCQkJCWN1c3RvbS52c3N0cnQgPSB2c3N0cnQyaHcocGFyLT52dG90YWwrNCk7CgkJCQkJY3VzdG9tLnZzc3RvcCA9IHZzc3RvcDJodyhwYXItPnZ0b3RhbCs0KTsKCQkJCQlicmVhazsKCQkJfQoJCQlpZiAoIShwYXItPmJlYW1jb24wICYgQk1DMF9WQVJCRUFNRU4pKSB7CgkJCQljdXN0b20uaHRvdGFsID0gaHRvdGFsMmh3KHBhci0+aHRvdGFsKTsKCQkJCWN1c3RvbS52dG90YWwgPSB2dG90YWwyaHcocGFyLT52dG90YWwpOwoJCQkJY3VzdG9tLmJlYW1jb24wID0gQk1DMF9IQVJERElTIHwgQk1DMF9WQVJCRUFNRU4gfAoJCQkJICAgICAgICAgICAgICAgICAgQk1DMF9WQVJWU1lFTiB8IEJNQzBfVkFSSFNZRU4gfCBCTUMwX1ZBUkNTWUVOOwoJCQl9CgkJfQoJfSBlbHNlIHsKCQljdXN0b20uZG1hY29uID0gRE1BRl9TRVRDTFIgfCBETUFGX1JBU1RFUiB8IERNQUZfU1BSSVRFOwoJCXJlZCA9IHJlZDA7CgkJZ3JlZW4gPSBncmVlbjA7CgkJYmx1ZSA9IGJsdWUwOwoJCWlmICghSVNfT0NTKSB7CgkJCWN1c3RvbS5oc3N0cnQgPSBoc3N0cnQyaHcocGFyLT5oc3N0cnQpOwoJCQljdXN0b20uaHNzdG9wID0gaHNzdG9wMmh3KHBhci0+aHNzdG9wKTsKCQkJY3VzdG9tLnZzc3RydCA9IHZzc3RydDJodyhwYXItPnZzc3RydCk7CgkJCWN1c3RvbS52c3N0b3AgPSB2c3N0b3AyaHcocGFyLT52c3N0b3ApOwoJCQljdXN0b20uYmVhbWNvbjAgPSBwYXItPmJlYW1jb24wOwoJCX0KCX0KI2lmIGRlZmluZWQoQ09ORklHX0ZCX0FNSUdBX0FHQSkKCWlmIChJU19BR0EpIHsKCQljdXN0b20uYnBsY29uMyA9IGJwbGNvbjM7CgkJY3VzdG9tLmNvbG9yWzBdID0gcmdiMmh3OF9oaWdoKHJlZCwgZ3JlZW4sIGJsdWUpOwoJCWN1c3RvbS5icGxjb24zID0gYnBsY29uMyB8IEJQQzNfTE9DVDsKCQljdXN0b20uY29sb3JbMF0gPSByZ2IyaHc4X2xvdyhyZWQsIGdyZWVuLCBibHVlKTsKCQljdXN0b20uYnBsY29uMyA9IGJwbGNvbjM7Cgl9IGVsc2UKI2VuZGlmCiNpZiBkZWZpbmVkKENPTkZJR19GQl9BTUlHQV9FQ1MpCglpZiAocGFyLT5icGxjb24wICYgQlBDMF9TSFJFUykgewoJCXVfc2hvcnQgY29sb3IsIG1hc2s7CgkJaW50IGk7CgoJCW1hc2sgPSAweDMzMzM7CgkJY29sb3IgPSByZ2IyaHcyKHJlZCwgZ3JlZW4sIGJsdWUpOwoJCWZvciAoaSA9IDEyOyBpID49IDA7IGkgLT0gNCkKCQkJY3VzdG9tLmNvbG9yW2ldID0gZWNzX3BhbGV0dGVbaV0gPSAoZWNzX3BhbGV0dGVbaV0gJiBtYXNrKSB8IGNvbG9yOwoJCW1hc2sgPDw9MjsgY29sb3IgPj49IDI7CgkJZm9yIChpID0gMzsgaSA+PSAwOyBpLS0pCgkJCWN1c3RvbS5jb2xvcltpXSA9IGVjc19wYWxldHRlW2ldID0gKGVjc19wYWxldHRlW2ldICYgbWFzaykgfCBjb2xvcjsKCX0gZWxzZQojZW5kaWYKCQljdXN0b20uY29sb3JbMF0gPSByZ2IyaHc0KHJlZCwgZ3JlZW4sIGJsdWUpOwoJaXNfYmxhbmtlZCA9IGRvX2JsYW5rID4gMCA/IGRvX2JsYW5rIDogMDsKfQoKc3RhdGljIGludCBhbWlfZ2V0X2ZpeF9jdXJzb3JpbmZvKHN0cnVjdCBmYl9maXhfY3Vyc29yaW5mbyAqZml4KQp7CglzdHJ1Y3QgYW1pZmJfcGFyICpwYXIgPSAmY3VycmVudHBhcjsKCglmaXgtPmNyc3Jfd2lkdGggPSBmaXgtPmNyc3JfeHNpemUgPSBwYXItPmNyc3Iud2lkdGg7CglmaXgtPmNyc3JfaGVpZ2h0ID0gZml4LT5jcnNyX3lzaXplID0gcGFyLT5jcnNyLmhlaWdodDsKCWZpeC0+Y3Jzcl9jb2xvcjEgPSAxNzsKCWZpeC0+Y3Jzcl9jb2xvcjIgPSAxODsKCXJldHVybiAwOwp9CgpzdGF0aWMgaW50IGFtaV9nZXRfdmFyX2N1cnNvcmluZm8oc3RydWN0IGZiX3Zhcl9jdXJzb3JpbmZvICp2YXIsIHVfY2hhciBfX3VzZXIgKmRhdGEpCnsKCXN0cnVjdCBhbWlmYl9wYXIgKnBhciA9ICZjdXJyZW50cGFyOwoJcmVnaXN0ZXIgdV9zaG9ydCAqbHNwciwgKnNzcHI7CiNpZmRlZiBfX21jNjgwMDBfXwoJcmVnaXN0ZXIgdV9sb25nIGRhdGF3b3JkcyBhc20gKCJkMiIpOwojZWxzZQoJcmVnaXN0ZXIgdV9sb25nIGRhdGF3b3JkczsKI2VuZGlmCglyZWdpc3RlciBzaG9ydCBkZWx0YTsKCXJlZ2lzdGVyIHVfY2hhciBjb2xvcjsKCXNob3J0IGhlaWdodCwgd2lkdGgsIGJpdHMsIHdvcmRzOwoJaW50IHNpemUsIGFsbG9jOwoKCXNpemUgPSBwYXItPmNyc3IuaGVpZ2h0KnBhci0+Y3Jzci53aWR0aDsKCWFsbG9jID0gdmFyLT5oZWlnaHQqdmFyLT53aWR0aDsKCXZhci0+aGVpZ2h0ID0gcGFyLT5jcnNyLmhlaWdodDsKCXZhci0+d2lkdGggPSBwYXItPmNyc3Iud2lkdGg7Cgl2YXItPnhzcG90ID0gcGFyLT5jcnNyLnNwb3RfeDsKCXZhci0+eXNwb3QgPSBwYXItPmNyc3Iuc3BvdF95OwoJaWYgKHNpemUgPiB2YXItPmhlaWdodCp2YXItPndpZHRoKQoJCXJldHVybiAtRU5BTUVUT09MT05HOwoJaWYgKCFhY2Nlc3Nfb2soVkVSSUZZX1dSSVRFLCBkYXRhLCBzaXplKSkKCQlyZXR1cm4gLUVGQVVMVDsKCWRlbHRhID0gMTw8cGFyLT5jcnNyLmZtb2RlOwoJbHNwciA9IGxvZnNwcml0ZSArIChkZWx0YTw8MSk7CglpZiAocGFyLT5icGxjb24wICYgQlBDMF9MQUNFKQoJCXNzcHIgPSBzaGZzcHJpdGUgKyAoZGVsdGE8PDEpOwoJZWxzZQoJCXNzcHIgPSBOVUxMOwoJZm9yIChoZWlnaHQgPSAoc2hvcnQpdmFyLT5oZWlnaHQtMTsgaGVpZ2h0ID49IDA7IGhlaWdodC0tKSB7CgkJYml0cyA9IDA7IHdvcmRzID0gZGVsdGE7IGRhdGF3b3JkcyA9IDA7CgkJZm9yICh3aWR0aCA9IChzaG9ydCl2YXItPndpZHRoLTE7IHdpZHRoID49IDA7IHdpZHRoLS0pIHsKCQkJaWYgKGJpdHMgPT0gMCkgewoJCQkJYml0cyA9IDE2OyAtLXdvcmRzOwojaWZkZWYgX19tYzY4MDAwX18KCQkJCWFzbSB2b2xhdGlsZSAoIm1vdmV3ICUxQCglMzp3OjIpLCUwIDsgc3dhcCAlMCA7IG1vdmV3ICUxQCssJTAiCgkJCQkJOiAiPWQiIChkYXRhd29yZHMpLCAiPWEiIChsc3ByKSA6ICIxIiAobHNwciksICJkIiAoZGVsdGEpKTsKI2Vsc2UKCQkJCWRhdGF3b3JkcyA9ICgqKGxzcHIrZGVsdGEpIDw8IDE2KSB8ICgqbHNwcisrKTsKI2VuZGlmCgkJCX0KCQkJLS1iaXRzOwojaWZkZWYgX19tYzY4MDAwX18KCQkJYXNtIHZvbGF0aWxlICgKCQkJCSJjbHJiICUwIDsgc3dhcCAlMSA7IGxzbHcgIzEsJTEgOyByb3hsYiAjMSwlMCA7ICIKCQkJCSJzd2FwICUxIDsgbHNsdyAjMSwlMSA7IHJveGxiICMxLCUwIgoJCQkJOiAiPWQiIChjb2xvciksICI9ZCIgKGRhdGF3b3JkcykgOiAiMSIgKGRhdGF3b3JkcykpOwojZWxzZQoJCQljb2xvciA9ICgoKGRhdGF3b3JkcyA+PiAzMCkgJiAyKQoJCQkJIHwgKChkYXRhd29yZHMgPj4gMTUpICYgMSkpOwoJCQlkYXRhd29yZHMgPDw9IDE7CiNlbmRpZgoJCQlwdXRfdXNlcihjb2xvciwgZGF0YSsrKTsKCQl9CgkJaWYgKGJpdHMgPiAwKSB7CgkJCS0td29yZHM7ICsrbHNwcjsKCQl9CgkJd2hpbGUgKC0td29yZHMgPj0gMCkKCQkJKytsc3ByOwojaWZkZWYgX19tYzY4MDAwX18KCQlhc20gdm9sYXRpbGUgKCJsZWEgJTBAKCU0Onc6MiksJTAgOyB0c3RsICUxIDsgamVxIDFmIDsgZXhnICUwLCUxXG4xOiIKCQkJOiAiPWEiIChsc3ByKSwgIj1hIiAoc3NwcikgOiAiMCIgKGxzcHIpLCAiMSIgKHNzcHIpLCAiZCIgKGRlbHRhKSk7CiNlbHNlCgkJbHNwciArPSBkZWx0YTsKCQlpZiAoc3NwcikgewoJCQl1X3Nob3J0ICp0bXAgPSBsc3ByOwoJCQlsc3ByID0gc3NwcjsKCQkJc3NwciA9IHRtcDsKCQl9CiNlbmRpZgoJfQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgYW1pX3NldF92YXJfY3Vyc29yaW5mbyhzdHJ1Y3QgZmJfdmFyX2N1cnNvcmluZm8gKnZhciwgdV9jaGFyIF9fdXNlciAqZGF0YSkKewoJc3RydWN0IGFtaWZiX3BhciAqcGFyID0gJmN1cnJlbnRwYXI7CglyZWdpc3RlciB1X3Nob3J0ICpsc3ByLCAqc3NwcjsKI2lmZGVmIF9fbWM2ODAwMF9fCglyZWdpc3RlciB1X2xvbmcgZGF0YXdvcmRzIGFzbSAoImQyIik7CiNlbHNlCglyZWdpc3RlciB1X2xvbmcgZGF0YXdvcmRzOwojZW5kaWYKCXJlZ2lzdGVyIHNob3J0IGRlbHRhOwoJdV9zaG9ydCBmbW9kZTsKCXNob3J0IGhlaWdodCwgd2lkdGgsIGJpdHMsIHdvcmRzOwoKCWlmICghdmFyLT53aWR0aCkKCQlyZXR1cm4gLUVJTlZBTDsKCWVsc2UgaWYgKHZhci0+d2lkdGggPD0gMTYpCgkJZm1vZGUgPSBUQUdfRk1PREVfMTsKCWVsc2UgaWYgKHZhci0+d2lkdGggPD0gMzIpCgkJZm1vZGUgPSBUQUdfRk1PREVfMjsKCWVsc2UgaWYgKHZhci0+d2lkdGggPD0gNjQpCgkJZm1vZGUgPSBUQUdfRk1PREVfNDsKCWVsc2UKCQlyZXR1cm4gLUVJTlZBTDsKCWlmIChmbW9kZSA+IG1heGZtb2RlKQoJCXJldHVybiAtRUlOVkFMOwoJaWYgKCF2YXItPmhlaWdodCkKCQlyZXR1cm4gLUVJTlZBTDsKCWlmICghYWNjZXNzX29rKFZFUklGWV9SRUFELCBkYXRhLCB2YXItPndpZHRoKnZhci0+aGVpZ2h0KSkKCQlyZXR1cm4gLUVGQVVMVDsKCWRlbHRhID0gMTw8Zm1vZGU7Cglsb2ZzcHJpdGUgPSBzaGZzcHJpdGUgPSAodV9zaG9ydCAqKXNwcml0ZW1lbW9yeTsKCWxzcHIgPSBsb2ZzcHJpdGUgKyAoZGVsdGE8PDEpOwoJaWYgKHBhci0+YnBsY29uMCAmIEJQQzBfTEFDRSkgewoJCWlmICgoKHZhci0+aGVpZ2h0KzQpPDxmbW9kZTw8MikgPiBTUFJJVEVNRU1TSVpFKQoJCQlyZXR1cm4gLUVJTlZBTDsKCQltZW1zZXQobHNwciwgMCwgKHZhci0+aGVpZ2h0KzQpPDxmbW9kZTw8Mik7CgkJc2hmc3ByaXRlICs9ICgodmFyLT5oZWlnaHQrNSkmLTIpPDxmbW9kZTsKCQlzc3ByID0gc2hmc3ByaXRlICsgKGRlbHRhPDwxKTsKCX0gZWxzZSB7CgkJaWYgKCgodmFyLT5oZWlnaHQrMik8PGZtb2RlPDwyKSA+IFNQUklURU1FTVNJWkUpCgkJCXJldHVybiAtRUlOVkFMOwoJCW1lbXNldChsc3ByLCAwLCAodmFyLT5oZWlnaHQrMik8PGZtb2RlPDwyKTsKCQlzc3ByID0gTlVMTDsKCX0KCWZvciAoaGVpZ2h0ID0gKHNob3J0KXZhci0+aGVpZ2h0LTE7IGhlaWdodCA+PSAwOyBoZWlnaHQtLSkgewoJCWJpdHMgPSAxNjsgd29yZHMgPSBkZWx0YTsgZGF0YXdvcmRzID0gMDsKCQlmb3IgKHdpZHRoID0gKHNob3J0KXZhci0+d2lkdGgtMTsgd2lkdGggPj0gMDsgd2lkdGgtLSkgewoJCQl1bnNpZ25lZCBsb25nIHRkYXRhID0gMDsKCQkJZ2V0X3VzZXIodGRhdGEsIGRhdGEpOwoJCQlkYXRhKys7CiNpZmRlZiBfX21jNjgwMDBfXwoJCQlhc20gdm9sYXRpbGUgKAoJCQkJImxzcmIgIzEsJTIgOyByb3hsdyAjMSwlMCA7IHN3YXAgJTAgOyAiCgkJCQkibHNyYiAjMSwlMiA7IHJveGx3ICMxLCUwIDsgc3dhcCAlMCIKCQkJCTogIj1kIiAoZGF0YXdvcmRzKQoJCQkJOiAiMCIgKGRhdGF3b3JkcyksICJkIiAodGRhdGEpKTsKI2Vsc2UKCQkJZGF0YXdvcmRzID0gKChkYXRhd29yZHMgPDwgMSkgJiAweGZmZmVmZmZlKTsKCQkJZGF0YXdvcmRzIHw9IHRkYXRhICYgMTsKCQkJZGF0YXdvcmRzIHw9ICh0ZGF0YSAmIDIpIDw8ICgxNi0xKTsKI2VuZGlmCgkJCWlmICgtLWJpdHMgPT0gMCkgewoJCQkJYml0cyA9IDE2OyAtLXdvcmRzOwojaWZkZWYgX19tYzY4MDAwX18KCQkJCWFzbSB2b2xhdGlsZSAoInN3YXAgJTIgOyBtb3ZldyAlMiwlMEAoJTM6dzoyKSA7IHN3YXAgJTIgOyBtb3ZldyAlMiwlMEArIgoJCQkJCTogIj1hIiAobHNwcikgOiAiMCIgKGxzcHIpLCAiZCIgKGRhdGF3b3JkcyksICJkIiAoZGVsdGEpKTsKI2Vsc2UKCQkJCSoobHNwcitkZWx0YSkgPSAodV9zaG9ydCkgKGRhdGF3b3JkcyA+PiAxNik7CgkJCQkqbHNwcisrID0gKHVfc2hvcnQpIChkYXRhd29yZHMgJiAweGZmZmYpOwojZW5kaWYKCQkJfQoJCX0KCQlpZiAoYml0cyA8IDE2KSB7CgkJCS0td29yZHM7CiNpZmRlZiBfX21jNjgwMDBfXwoJCQlhc20gdm9sYXRpbGUgKAoJCQkJInN3YXAgJTIgOyBsc2x3ICU0LCUyIDsgbW92ZXcgJTIsJTBAKCUzOnc6MikgOyAiCgkJCQkic3dhcCAlMiA7IGxzbHcgJTQsJTIgOyBtb3ZldyAlMiwlMEArIgoJCQkJOiAiPWEiIChsc3ByKSA6ICIwIiAobHNwciksICJkIiAoZGF0YXdvcmRzKSwgImQiIChkZWx0YSksICJkIiAoYml0cykpOwojZWxzZQoJCQkqKGxzcHIrZGVsdGEpID0gKHVfc2hvcnQpIChkYXRhd29yZHMgPj4gKDE2K2JpdHMpKTsKCQkJKmxzcHIrKyA9ICh1X3Nob3J0KSAoKGRhdGF3b3JkcyAmIDB4MDAwMGZmZmYpID4+IGJpdHMpOwojZW5kaWYKCQl9CgkJd2hpbGUgKC0td29yZHMgPj0gMCkgewojaWZkZWYgX19tYzY4MDAwX18KCQkJYXNtIHZvbGF0aWxlICgibW92ZXFsICMwLCUlZDAgOyBtb3ZldyAlJWQwLCUwQCglMjp3OjIpIDsgbW92ZXcgJSVkMCwlMEArIgoJCQkJOiAiPWEiIChsc3ByKSA6ICIwIiAobHNwciksICJkIiAoZGVsdGEpIDogImQwIik7CiNlbHNlCgkJCSoobHNwcitkZWx0YSkgPSAwOwoJCQkqbHNwcisrID0gMDsKI2VuZGlmCgkJfQojaWZkZWYgX19tYzY4MDAwX18KCQlhc20gdm9sYXRpbGUgKCJsZWEgJTBAKCU0Onc6MiksJTAgOyB0c3RsICUxIDsgamVxIDFmIDsgZXhnICUwLCUxXG4xOiIKCQkJOiAiPWEiIChsc3ByKSwgIj1hIiAoc3NwcikgOiAiMCIgKGxzcHIpLCAiMSIgKHNzcHIpLCAiZCIgKGRlbHRhKSk7CiNlbHNlCgkJbHNwciArPSBkZWx0YTsKCQlpZiAoc3NwcikgewoJCQl1X3Nob3J0ICp0bXAgPSBsc3ByOwoJCQlsc3ByID0gc3NwcjsKCQkJc3NwciA9IHRtcDsKCQl9CiNlbmRpZgoJfQoJcGFyLT5jcnNyLmhlaWdodCA9IHZhci0+aGVpZ2h0OwoJcGFyLT5jcnNyLndpZHRoID0gdmFyLT53aWR0aDsKCXBhci0+Y3Jzci5zcG90X3ggPSB2YXItPnhzcG90OwoJcGFyLT5jcnNyLnNwb3RfeSA9IHZhci0+eXNwb3Q7CglwYXItPmNyc3IuZm1vZGUgPSBmbW9kZTsKCWlmIChJU19BR0EpIHsKCQlwYXItPmZtb2RlICY9IH4oRk1PREVfU1BBR0VNIHwgRk1PREVfU1BSMzIpOwoJCXBhci0+Zm1vZGUgfD0gc3ByZmV0Y2htb2RlW2Ztb2RlXTsKCQljdXN0b20uZm1vZGUgPSBwYXItPmZtb2RlOwoJfQoJcmV0dXJuIDA7Cn0KCnN0YXRpYyBpbnQgYW1pX2dldF9jdXJzb3JzdGF0ZShzdHJ1Y3QgZmJfY3Vyc29yc3RhdGUgKnN0YXRlKQp7CglzdHJ1Y3QgYW1pZmJfcGFyICpwYXIgPSAmY3VycmVudHBhcjsKCglzdGF0ZS0+eG9mZnNldCA9IHBhci0+Y3Jzci5jcnNyX3g7CglzdGF0ZS0+eW9mZnNldCA9IHBhci0+Y3Jzci5jcnNyX3k7CglzdGF0ZS0+bW9kZSA9IGN1cnNvcm1vZGU7CglyZXR1cm4gMDsKfQoKc3RhdGljIGludCBhbWlfc2V0X2N1cnNvcnN0YXRlKHN0cnVjdCBmYl9jdXJzb3JzdGF0ZSAqc3RhdGUpCnsKCXN0cnVjdCBhbWlmYl9wYXIgKnBhciA9ICZjdXJyZW50cGFyOwoKCXBhci0+Y3Jzci5jcnNyX3ggPSBzdGF0ZS0+eG9mZnNldDsKCXBhci0+Y3Jzci5jcnNyX3kgPSBzdGF0ZS0+eW9mZnNldDsKCWlmICgoY3Vyc29ybW9kZSA9IHN0YXRlLT5tb2RlKSA9PSBGQl9DVVJTT1JfT0ZGKQoJCWN1cnNvcnN0YXRlID0gLTE7Cglkb19jdXJzb3IgPSAxOwoJcmV0dXJuIDA7Cn0KCnN0YXRpYyB2b2lkIGFtaV9zZXRfc3ByaXRlKHZvaWQpCnsKCXN0cnVjdCBhbWlmYl9wYXIgKnBhciA9ICZjdXJyZW50cGFyOwoJY29waW5zICpjb3BsLCAqY29wczsKCXVfc2hvcnQgaHMsIHZzLCB2ZTsKCXVfbG9uZyBwbCwgcHMsIHB0OwoJc2hvcnQgbXgsIG15OwoKCWNvcHMgPSBjb3BkaXNwbGF5Lmxpc3RbY3VycmVudGNvcF1bMF07Cgljb3BsID0gY29wZGlzcGxheS5saXN0W2N1cnJlbnRjb3BdWzFdOwoJcHMgPSBwbCA9IFpUV09fUEFERFIoZHVtbXlzcHJpdGUpOwoJbXggPSBwYXItPmNyc3IuY3Jzcl94LXBhci0+Y3Jzci5zcG90X3g7CglteSA9IHBhci0+Y3Jzci5jcnNyX3ktcGFyLT5jcnNyLnNwb3RfeTsKCWlmICghKHBhci0+dm1vZGUgJiBGQl9WTU9ERV9ZV1JBUCkpIHsKCQlteCAtPSBwYXItPnhvZmZzZXQ7CgkJbXkgLT0gcGFyLT55b2Zmc2V0OwoJfQoJaWYgKCFpc19ibGFua2VkICYmIGN1cnNvcnN0YXRlID4gMCAmJiBwYXItPmNyc3IuaGVpZ2h0ID4gMCAmJgoJICAgIG14ID4gLShzaG9ydClwYXItPmNyc3Iud2lkdGggJiYgbXggPCBwYXItPnhyZXMgJiYKCSAgICBteSA+IC0oc2hvcnQpcGFyLT5jcnNyLmhlaWdodCAmJiBteSA8IHBhci0+eXJlcykgewoJCXBsID0gWlRXT19QQUREUihsb2ZzcHJpdGUpOwoJCWhzID0gcGFyLT5kaXdzdHJ0X2ggKyAobXg8PHBhci0+Y2xrX3NoaWZ0KSAtIDQ7CgkJdnMgPSBwYXItPmRpd3N0cnRfdiArIChteTw8cGFyLT5saW5lX3NoaWZ0KTsKCQl2ZSA9IHZzICsgKHBhci0+Y3Jzci5oZWlnaHQ8PHBhci0+bGluZV9zaGlmdCk7CgkJaWYgKHBhci0+YnBsY29uMCAmIEJQQzBfTEFDRSkgewoJCQlwcyA9IFpUV09fUEFERFIoc2hmc3ByaXRlKTsKCQkJbG9mc3ByaXRlWzBdID0gc3ByMmh3X3Bvcyh2cywgaHMpOwoJCQlzaGZzcHJpdGVbMF0gPSBzcHIyaHdfcG9zKHZzKzEsIGhzKTsKCQkJaWYgKG1vZDIodnMpKSB7CgkJCQlsb2ZzcHJpdGVbMTw8cGFyLT5jcnNyLmZtb2RlXSA9IHNwcjJod19jdGwodnMsIGhzLCB2ZSk7CgkJCQlzaGZzcHJpdGVbMTw8cGFyLT5jcnNyLmZtb2RlXSA9IHNwcjJod19jdGwodnMrMSwgaHMsIHZlKzEpOwoJCQkJcHQgPSBwbDsgcGwgPSBwczsgcHMgPSBwdDsKCQkJfSBlbHNlIHsKCQkJCWxvZnNwcml0ZVsxPDxwYXItPmNyc3IuZm1vZGVdID0gc3ByMmh3X2N0bCh2cywgaHMsIHZlKzEpOwoJCQkJc2hmc3ByaXRlWzE8PHBhci0+Y3Jzci5mbW9kZV0gPSBzcHIyaHdfY3RsKHZzKzEsIGhzLCB2ZSk7CgkJCX0KCQl9IGVsc2UgewoJCQlsb2ZzcHJpdGVbMF0gPSBzcHIyaHdfcG9zKHZzLCBocykgfCAoSVNfQUdBICYmIChwYXItPmZtb2RlICYgRk1PREVfQlNDQU4yKSA/IDB4ODAgOiAwKTsKCQkJbG9mc3ByaXRlWzE8PHBhci0+Y3Jzci5mbW9kZV0gPSBzcHIyaHdfY3RsKHZzLCBocywgdmUpOwoJCX0KCX0KCWNvcGxbY29wX3NwcjBwdHJoXS53WzFdID0gaGlnaHcocGwpOwoJY29wbFtjb3Bfc3ByMHB0cmxdLndbMV0gPSBsb3d3KHBsKTsKCWlmIChwYXItPmJwbGNvbjAgJiBCUEMwX0xBQ0UpIHsKCQljb3BzW2NvcF9zcHIwcHRyaF0ud1sxXSA9IGhpZ2h3KHBzKTsKCQljb3BzW2NvcF9zcHIwcHRybF0ud1sxXSA9IGxvd3cocHMpOwoJfQp9CgoKCS8qCgkgKiBJbml0aWFsaXNlIHRoZSBDb3BwZXIgSW5pdGlhbGlzYXRpb24gTGlzdAoJICovCgpzdGF0aWMgdm9pZCBfX2luaXQgYW1pX2luaXRfY29wcGVyKHZvaWQpCnsKCWNvcGlucyAqY29wID0gY29wZGlzcGxheS5pbml0OwoJdV9sb25nIHA7CglpbnQgaTsKCglpZiAoIUlTX09DUykgewoJCShjb3ArKyktPmwgPSBDTU9WRShCUEMwX0NPTE9SIHwgQlBDMF9TSFJFUyB8IEJQQzBfRUNTRU5BLCBicGxjb24wKTsKCQkoY29wKyspLT5sID0gQ01PVkUoMHgwMTgxLCBkaXdzdHJ0KTsKCQkoY29wKyspLT5sID0gQ01PVkUoMHgwMjgxLCBkaXdzdG9wKTsKCQkoY29wKyspLT5sID0gQ01PVkUoMHgwMDAwLCBkaXdoaWdoKTsKCX0gZWxzZQoJCShjb3ArKyktPmwgPSBDTU9WRShCUEMwX0NPTE9SLCBicGxjb24wKTsKCXAgPSBaVFdPX1BBRERSKGR1bW15c3ByaXRlKTsKCWZvciAoaSA9IDA7IGkgPCA4OyBpKyspIHsKCQkoY29wKyspLT5sID0gQ01PVkUoMCwgc3ByW2ldLnBvcyk7CgkJKGNvcCsrKS0+bCA9IENNT1ZFKGhpZ2h3KHApLCBzcHJwdFtpXSk7CgkJKGNvcCsrKS0+bCA9IENNT1ZFMihsb3d3KHApLCBzcHJwdFtpXSk7Cgl9CgoJKGNvcCsrKS0+bCA9IENNT1ZFKElGX1NFVENMUiB8IElGX0NPUEVSLCBpbnRyZXEpOwoJY29wZGlzcGxheS53YWl0ID0gY29wOwoJKGNvcCsrKS0+bCA9IENFTkQ7CgkoY29wKyspLT5sID0gQ01PVkUoMCwgY29wam1wMik7Cgljb3AtPmwgPSBDRU5EOwoKCWN1c3RvbS5jb3AxbGMgPSAodV9zaG9ydCAqKVpUV09fUEFERFIoY29wZGlzcGxheS5pbml0KTsKCWN1c3RvbS5jb3BqbXAxID0gMDsKfQoKc3RhdGljIHZvaWQgYW1pX3JlaW5pdF9jb3BwZXIodm9pZCkKewoJc3RydWN0IGFtaWZiX3BhciAqcGFyID0gJmN1cnJlbnRwYXI7CgoJY29wZGlzcGxheS5pbml0W2NpcF9icGxjb24wXS53WzFdID0gfihCUEMwX0JQVTMgfCBCUEMwX0JQVTIgfCBCUEMwX0JQVTEgfCBCUEMwX0JQVTApICYgcGFyLT5icGxjb24wOwoJY29wZGlzcGxheS53YWl0LT5sID0gQ1dBSVQoMzIsIHBhci0+ZGl3c3RydF92LTQpOwp9CgoJLyoKCSAqIEJ1aWxkIHRoZSBDb3BwZXIgTGlzdAoJICovCgpzdGF0aWMgdm9pZCBhbWlfYnVpbGRfY29wcGVyKHZvaWQpCnsKCXN0cnVjdCBhbWlmYl9wYXIgKnBhciA9ICZjdXJyZW50cGFyOwoJY29waW5zICpjb3BsLCAqY29wczsKCXVfbG9uZyBwOwoKCWN1cnJlbnRjb3AgPSAxIC0gY3VycmVudGNvcDsKCgljb3BsID0gY29wZGlzcGxheS5saXN0W2N1cnJlbnRjb3BdWzFdOwoKCShjb3BsKyspLT5sID0gQ1dBSVQoMCwgMTApOwoJKGNvcGwrKyktPmwgPSBDTU9WRShwYXItPmJwbGNvbjAsIGJwbGNvbjApOwoJKGNvcGwrKyktPmwgPSBDTU9WRSgwLCBzcHJwdFswXSk7CgkoY29wbCsrKS0+bCA9IENNT1ZFMigwLCBzcHJwdFswXSk7CgoJaWYgKHBhci0+YnBsY29uMCAmIEJQQzBfTEFDRSkgewoJCWNvcHMgPSBjb3BkaXNwbGF5Lmxpc3RbY3VycmVudGNvcF1bMF07CgoJCShjb3BzKyspLT5sID0gQ1dBSVQoMCwgMTApOwoJCShjb3BzKyspLT5sID0gQ01PVkUocGFyLT5icGxjb24wLCBicGxjb24wKTsKCQkoY29wcysrKS0+bCA9IENNT1ZFKDAsIHNwcnB0WzBdKTsKCQkoY29wcysrKS0+bCA9IENNT1ZFMigwLCBzcHJwdFswXSk7CgoJCShjb3BsKyspLT5sID0gQ01PVkUoZGl3c3RydDJodyhwYXItPmRpd3N0cnRfaCwgcGFyLT5kaXdzdHJ0X3YrMSksIGRpd3N0cnQpOwoJCShjb3BsKyspLT5sID0gQ01PVkUoZGl3c3RvcDJodyhwYXItPmRpd3N0b3BfaCwgcGFyLT5kaXdzdG9wX3YrMSksIGRpd3N0b3ApOwoJCShjb3BzKyspLT5sID0gQ01PVkUoZGl3c3RydDJodyhwYXItPmRpd3N0cnRfaCwgcGFyLT5kaXdzdHJ0X3YpLCBkaXdzdHJ0KTsKCQkoY29wcysrKS0+bCA9IENNT1ZFKGRpd3N0b3AyaHcocGFyLT5kaXdzdG9wX2gsIHBhci0+ZGl3c3RvcF92KSwgZGl3c3RvcCk7CgkJaWYgKCFJU19PQ1MpIHsKCQkJKGNvcGwrKyktPmwgPSBDTU9WRShkaXdoaWdoMmh3KHBhci0+ZGl3c3RydF9oLCBwYXItPmRpd3N0cnRfdisxLAoJCQkgICAgICAgICAgICAgICAgICAgIHBhci0+ZGl3c3RvcF9oLCBwYXItPmRpd3N0b3BfdisxKSwgZGl3aGlnaCk7CgkJCShjb3BzKyspLT5sID0gQ01PVkUoZGl3aGlnaDJodyhwYXItPmRpd3N0cnRfaCwgcGFyLT5kaXdzdHJ0X3YsCgkJCSAgICAgICAgICAgICAgICAgICAgcGFyLT5kaXdzdG9wX2gsIHBhci0+ZGl3c3RvcF92KSwgZGl3aGlnaCk7CiNpZiAwCgkJCWlmIChwYXItPmJlYW1jb24wICYgQk1DMF9WQVJCRUFNRU4pIHsKCQkJCShjb3BsKyspLT5sID0gQ01PVkUodnRvdGFsMmh3KHBhci0+dnRvdGFsKSwgdnRvdGFsKTsKCQkJCShjb3BsKyspLT5sID0gQ01PVkUodmJzdHJ0Mmh3KHBhci0+dmJzdHJ0KzEpLCB2YnN0cnQpOwoJCQkJKGNvcGwrKyktPmwgPSBDTU9WRSh2YnN0b3AyaHcocGFyLT52YnN0b3ArMSksIHZic3RvcCk7CgkJCQkoY29wcysrKS0+bCA9IENNT1ZFKHZ0b3RhbDJodyhwYXItPnZ0b3RhbCksIHZ0b3RhbCk7CgkJCQkoY29wcysrKS0+bCA9IENNT1ZFKHZic3RydDJodyhwYXItPnZic3RydCksIHZic3RydCk7CgkJCQkoY29wcysrKS0+bCA9IENNT1ZFKHZic3RvcDJodyhwYXItPnZic3RvcCksIHZic3RvcCk7CgkJCX0KI2VuZGlmCgkJfQoJCXAgPSBaVFdPX1BBRERSKGNvcGRpc3BsYXkubGlzdFtjdXJyZW50Y29wXVswXSk7CgkJKGNvcGwrKyktPmwgPSBDTU9WRShoaWdodyhwKSwgY29wMmxjKTsKCQkoY29wbCsrKS0+bCA9IENNT1ZFMihsb3d3KHApLCBjb3AybGMpOwoJCXAgPSBaVFdPX1BBRERSKGNvcGRpc3BsYXkubGlzdFtjdXJyZW50Y29wXVsxXSk7CgkJKGNvcHMrKyktPmwgPSBDTU9WRShoaWdodyhwKSwgY29wMmxjKTsKCQkoY29wcysrKS0+bCA9IENNT1ZFMihsb3d3KHApLCBjb3AybGMpOwoJCWNvcGRpc3BsYXkucmVidWlsZFswXSA9IGNvcHM7Cgl9IGVsc2UgewoJCShjb3BsKyspLT5sID0gQ01PVkUoZGl3c3RydDJodyhwYXItPmRpd3N0cnRfaCwgcGFyLT5kaXdzdHJ0X3YpLCBkaXdzdHJ0KTsKCQkoY29wbCsrKS0+bCA9IENNT1ZFKGRpd3N0b3AyaHcocGFyLT5kaXdzdG9wX2gsIHBhci0+ZGl3c3RvcF92KSwgZGl3c3RvcCk7CgkJaWYgKCFJU19PQ1MpIHsKCQkJKGNvcGwrKyktPmwgPSBDTU9WRShkaXdoaWdoMmh3KHBhci0+ZGl3c3RydF9oLCBwYXItPmRpd3N0cnRfdiwKCQkJICAgICAgICAgICAgICAgICAgICBwYXItPmRpd3N0b3BfaCwgcGFyLT5kaXdzdG9wX3YpLCBkaXdoaWdoKTsKI2lmIDAKCQkJaWYgKHBhci0+YmVhbWNvbjAgJiBCTUMwX1ZBUkJFQU1FTikgewoJCQkJKGNvcGwrKyktPmwgPSBDTU9WRSh2dG90YWwyaHcocGFyLT52dG90YWwpLCB2dG90YWwpOwoJCQkJKGNvcGwrKyktPmwgPSBDTU9WRSh2YnN0cnQyaHcocGFyLT52YnN0cnQpLCB2YnN0cnQpOwoJCQkJKGNvcGwrKyktPmwgPSBDTU9WRSh2YnN0b3AyaHcocGFyLT52YnN0b3ApLCB2YnN0b3ApOwoJCQl9CiNlbmRpZgoJCX0KCX0KCWNvcGRpc3BsYXkucmVidWlsZFsxXSA9IGNvcGw7CgoJYW1pX3VwZGF0ZV9wYXIoKTsKCWFtaV9yZWJ1aWxkX2NvcHBlcigpOwp9CgoJLyoKCSAqIFJlYnVpbGQgdGhlIENvcHBlciBMaXN0CgkgKgoJICogV2Ugb25seSBjaGFuZ2UgdGhlIHRoaW5ncyB0aGF0IGFyZSBub3Qgc3RhdGljCgkgKi8KCnN0YXRpYyB2b2lkIGFtaV9yZWJ1aWxkX2NvcHBlcih2b2lkKQp7CglzdHJ1Y3QgYW1pZmJfcGFyICpwYXIgPSAmY3VycmVudHBhcjsKCWNvcGlucyAqY29wbCwgKmNvcHM7Cgl1X3Nob3J0IGxpbmUsIGhfZW5kMSwgaF9lbmQyOwoJc2hvcnQgaTsKCXVfbG9uZyBwOwoKCWlmIChJU19BR0EgJiYgbWF4Zm1vZGUgKyBwYXItPmNsa19zaGlmdCA9PSAwKQoJCWhfZW5kMSA9IHBhci0+ZGl3c3RydF9oLTY0OwoJZWxzZQoJCWhfZW5kMSA9IHBhci0+aHRvdGFsLTMyOwoJaF9lbmQyID0gcGFyLT5kZGZzdG9wKzY0OwoKCWFtaV9zZXRfc3ByaXRlKCk7CgoJY29wbCA9IGNvcGRpc3BsYXkucmVidWlsZFsxXTsKCXAgPSBwYXItPmJwbHB0MDsKCWlmIChwYXItPnZtb2RlICYgRkJfVk1PREVfWVdSQVApIHsKCQlpZiAoKHBhci0+dnlyZXMtcGFyLT55b2Zmc2V0KSAhPSAxIHx8ICFtb2QyKHBhci0+ZGl3c3RydF92KSkgewoJCQlpZiAocGFyLT55b2Zmc2V0ID4gcGFyLT52eXJlcy1wYXItPnlyZXMpIHsKCQkJCWZvciAoaSA9IDA7IGkgPCAoc2hvcnQpcGFyLT5icHA7IGkrKywgcCArPSBwYXItPm5leHRfcGxhbmUpIHsKCQkJCQkoY29wbCsrKS0+bCA9IENNT1ZFKGhpZ2h3KHApLCBicGxwdFtpXSk7CgkJCQkJKGNvcGwrKyktPmwgPSBDTU9WRTIobG93dyhwKSwgYnBscHRbaV0pOwoJCQkJfQoJCQkJbGluZSA9IHBhci0+ZGl3c3RydF92ICsgKChwYXItPnZ5cmVzLXBhci0+eW9mZnNldCk8PHBhci0+bGluZV9zaGlmdCkgLSAxOwoJCQkJd2hpbGUgKGxpbmUgPj0gNTEyKSB7CgkJCQkJKGNvcGwrKyktPmwgPSBDV0FJVChoX2VuZDEsIDUxMCk7CgkJCQkJbGluZSAtPSA1MTI7CgkJCQl9CgkJCQlpZiAobGluZSA+PSA1MTAgJiYgSVNfQUdBICYmIG1heGZtb2RlICsgcGFyLT5jbGtfc2hpZnQgPT0gMCkKCQkJCQkoY29wbCsrKS0+bCA9IENXQUlUKGhfZW5kMSwgbGluZSk7CgkJCQllbHNlCgkJCQkJKGNvcGwrKyktPmwgPSBDV0FJVChoX2VuZDIsIGxpbmUpOwoJCQkJcCA9IHBhci0+YnBscHQwd3JhcDsKCQkJfQoJCX0gZWxzZSBwID0gcGFyLT5icGxwdDB3cmFwOwoJfQoJZm9yIChpID0gMDsgaSA8IChzaG9ydClwYXItPmJwcDsgaSsrLCBwICs9IHBhci0+bmV4dF9wbGFuZSkgewoJCShjb3BsKyspLT5sID0gQ01PVkUoaGlnaHcocCksIGJwbHB0W2ldKTsKCQkoY29wbCsrKS0+bCA9IENNT1ZFMihsb3d3KHApLCBicGxwdFtpXSk7Cgl9Cgljb3BsLT5sID0gQ0VORDsKCglpZiAocGFyLT5icGxjb24wICYgQlBDMF9MQUNFKSB7CgkJY29wcyA9IGNvcGRpc3BsYXkucmVidWlsZFswXTsKCQlwID0gcGFyLT5icGxwdDA7CgkJaWYgKG1vZDIocGFyLT5kaXdzdHJ0X3YpKQoJCQlwIC09IHBhci0+bmV4dF9saW5lOwoJCWVsc2UKCQkJcCArPSBwYXItPm5leHRfbGluZTsKCQlpZiAocGFyLT52bW9kZSAmIEZCX1ZNT0RFX1lXUkFQKSB7CgkJCWlmICgocGFyLT52eXJlcy1wYXItPnlvZmZzZXQpICE9IDEgfHwgbW9kMihwYXItPmRpd3N0cnRfdikpIHsKCQkJCWlmIChwYXItPnlvZmZzZXQgPiBwYXItPnZ5cmVzLXBhci0+eXJlcysxKSB7CgkJCQkJZm9yIChpID0gMDsgaSA8IChzaG9ydClwYXItPmJwcDsgaSsrLCBwICs9IHBhci0+bmV4dF9wbGFuZSkgewoJCQkJCQkoY29wcysrKS0+bCA9IENNT1ZFKGhpZ2h3KHApLCBicGxwdFtpXSk7CgkJCQkJCShjb3BzKyspLT5sID0gQ01PVkUyKGxvd3cocCksIGJwbHB0W2ldKTsKCQkJCQl9CgkJCQkJbGluZSA9IHBhci0+ZGl3c3RydF92ICsgKChwYXItPnZ5cmVzLXBhci0+eW9mZnNldCk8PHBhci0+bGluZV9zaGlmdCkgLSAyOwoJCQkJCXdoaWxlIChsaW5lID49IDUxMikgewoJCQkJCQkoY29wcysrKS0+bCA9IENXQUlUKGhfZW5kMSwgNTEwKTsKCQkJCQkJbGluZSAtPSA1MTI7CgkJCQkJfQoJCQkJCWlmIChsaW5lID4gNTEwICYmIElTX0FHQSAmJiBtYXhmbW9kZSArIHBhci0+Y2xrX3NoaWZ0ID09IDApCgkJCQkJCShjb3BzKyspLT5sID0gQ1dBSVQoaF9lbmQxLCBsaW5lKTsKCQkJCQllbHNlCgkJCQkJCShjb3BzKyspLT5sID0gQ1dBSVQoaF9lbmQyLCBsaW5lKTsKCQkJCQlwID0gcGFyLT5icGxwdDB3cmFwOwoJCQkJCWlmIChtb2QyKHBhci0+ZGl3c3RydF92K3Bhci0+dnlyZXMtcGFyLT55b2Zmc2V0KSkKCQkJCQkJcCAtPSBwYXItPm5leHRfbGluZTsKCQkJCQllbHNlCgkJCQkJCXAgKz0gcGFyLT5uZXh0X2xpbmU7CgkJCQl9CgkJCX0gZWxzZSBwID0gcGFyLT5icGxwdDB3cmFwIC0gcGFyLT5uZXh0X2xpbmU7CgkJfQoJCWZvciAoaSA9IDA7IGkgPCAoc2hvcnQpcGFyLT5icHA7IGkrKywgcCArPSBwYXItPm5leHRfcGxhbmUpIHsKCQkJKGNvcHMrKyktPmwgPSBDTU9WRShoaWdodyhwKSwgYnBscHRbaV0pOwoJCQkoY29wcysrKS0+bCA9IENNT1ZFMihsb3d3KHApLCBicGxwdFtpXSk7CgkJfQoJCWNvcHMtPmwgPSBDRU5EOwoJfQp9CgoKbW9kdWxlX2luaXQoYW1pZmJfaW5pdCk7CgojaWZkZWYgTU9EVUxFCk1PRFVMRV9MSUNFTlNFKCJHUEwiKTsKCnZvaWQgY2xlYW51cF9tb2R1bGUodm9pZCkKewoJdW5yZWdpc3Rlcl9mcmFtZWJ1ZmZlcigmZmJfaW5mbyk7CglhbWlmYl9kZWluaXQoKTsKCWFtaWZiX3ZpZGVvX29mZigpOwp9CiNlbmRpZiAvKiBNT0RVTEUgKi8K