LyoKICogSVMtSVMgUm91dChlKWluZyBwcm90b2NvbCAtIGlzaXNfdGx2LmMKICogICAgICAgICAgICAgICAgICAgICAgICAgICAgIElTLUlTIFRMViByZWxhdGVkIHJvdXRpbmVzCiAqCiAqIENvcHlyaWdodCAoQykgMjAwMSwyMDAyICAgU2FtcG8gU2FhcmlzdG8KICogICAgICAgICAgICAgICAgICAgICAgICAgICBUYW1wZXJlIFVuaXZlcnNpdHkgb2YgVGVjaG5vbG9neSAgICAgIAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RpdHV0ZSBvZiBDb21tdW5pY2F0aW9ucyBFbmdpbmVlcmluZwogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCAKICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSAKICogU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSAKICogYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLGJ1dCBXSVRIT1VUIAogKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IgCiAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgCiAqIG1vcmUgZGV0YWlscy4KCiAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIAogKiB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCAKICogNTkgVGVtcGxlIFBsYWNlIC0gU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3LCBVU0EuCiAqLwoKI2luY2x1ZGUgPHplYnJhLmg+CgojaW5jbHVkZSAibG9nLmgiCiNpbmNsdWRlICJsaW5rbGlzdC5oIgojaW5jbHVkZSAic3RyZWFtLmgiCiNpbmNsdWRlICJtZW1vcnkuaCIKI2luY2x1ZGUgInByZWZpeC5oIgojaW5jbHVkZSAidnR5LmgiCiNpbmNsdWRlICJpZi5oIgoKI2luY2x1ZGUgImlzaXNkL2RpY3QuaCIKI2luY2x1ZGUgImlzaXNkL2lzaXNfY29uc3RhbnRzLmgiCiNpbmNsdWRlICJpc2lzZC9pc2lzX2NvbW1vbi5oIgojaW5jbHVkZSAiaXNpc2QvaXNpc19mbGFncy5oIgojaW5jbHVkZSAiaXNpc2QvaXNpc19jaXJjdWl0LmgiCiNpbmNsdWRlICJpc2lzZC9pc2lzX3Rsdi5oIgojaW5jbHVkZSAiaXNpc2QvaXNpc2QuaCIKI2luY2x1ZGUgImlzaXNkL2lzaXNfZHluaG4uaCIKI2luY2x1ZGUgImlzaXNkL2lzaXNfbWlzYy5oIgojaW5jbHVkZSAiaXNpc2QvaXNpc19wZHUuaCIKI2luY2x1ZGUgImlzaXNkL2lzaXNfbHNwLmgiCgpleHRlcm4gc3RydWN0IGlzaXMgKmlzaXM7CgovKgogKiBQcm90b3R5cGVzLgogKi8KaW50IGFkZF90bHYgKHVfY2hhciwgdV9jaGFyLCB1X2NoYXIgKiwgc3RydWN0IHN0cmVhbSAqKTsKCnZvaWQKZnJlZV90bHYgKHZvaWQgKnZhbCkKewogIFhGUkVFIChNVFlQRV9JU0lTX1RMViwgdmFsKTsKCiAgcmV0dXJuOwp9CgovKgogKiBDYWxsZWQgYWZ0ZXIgcGFyc2luZyBvZiBhIFBEVS4gVGhlcmUgc2hvdWxkbid0IGJlIGFueSB0bHYncyBsZWZ0LCBzbyB0aGlzCiAqIGlzIG9ubHkgYSBjYXV0aW9uIHRvIGF2b2lkIG1lbW9yeSBsZWFrcwogKi8Kdm9pZApmcmVlX3RsdnMgKHN0cnVjdCB0bHZzICp0bHZzKQp7CiAgaWYgKHRsdnMtPmFyZWFfYWRkcnMpCiAgICBsaXN0X2RlbGV0ZSAodGx2cy0+YXJlYV9hZGRycyk7CiAgaWYgKHRsdnMtPmlzX25laWdocykKICAgIGxpc3RfZGVsZXRlICh0bHZzLT5pc19uZWlnaHMpOwogIGlmICh0bHZzLT50ZV9pc19uZWlnaHMpCiAgICBsaXN0X2RlbGV0ZSAodGx2cy0+dGVfaXNfbmVpZ2hzKTsKICBpZiAodGx2cy0+ZXNfbmVpZ2hzKQogICAgbGlzdF9kZWxldGUgKHRsdnMtPmVzX25laWdocyk7CiAgaWYgKHRsdnMtPmxzcF9lbnRyaWVzKQogICAgbGlzdF9kZWxldGUgKHRsdnMtPmxzcF9lbnRyaWVzKTsKICBpZiAodGx2cy0+bGFuX25laWdocykKICAgIGxpc3RfZGVsZXRlICh0bHZzLT5sYW5fbmVpZ2hzKTsKICBpZiAodGx2cy0+cHJlZml4X25laWdocykKICAgIGxpc3RfZGVsZXRlICh0bHZzLT5wcmVmaXhfbmVpZ2hzKTsKICBpZiAodGx2cy0+aXB2NF9hZGRycykKICAgIGxpc3RfZGVsZXRlICh0bHZzLT5pcHY0X2FkZHJzKTsKICBpZiAodGx2cy0+aXB2NF9pbnRfcmVhY2hzKQogICAgbGlzdF9kZWxldGUgKHRsdnMtPmlwdjRfaW50X3JlYWNocyk7CiAgaWYgKHRsdnMtPmlwdjRfZXh0X3JlYWNocykKICAgIGxpc3RfZGVsZXRlICh0bHZzLT5pcHY0X2V4dF9yZWFjaHMpOwogIGlmICh0bHZzLT50ZV9pcHY0X3JlYWNocykKICAgIGxpc3RfZGVsZXRlICh0bHZzLT50ZV9pcHY0X3JlYWNocyk7CiNpZmRlZiBIQVZFX0lQVjYKICBpZiAodGx2cy0+aXB2Nl9hZGRycykKICAgIGxpc3RfZGVsZXRlICh0bHZzLT5pcHY2X2FkZHJzKTsKICBpZiAodGx2cy0+aXB2Nl9yZWFjaHMpCiAgICBsaXN0X2RlbGV0ZSAodGx2cy0+aXB2Nl9yZWFjaHMpOwojZW5kaWYgLyogSEFWRV9JUFY2ICovCiAgCiAgcmV0dXJuOwp9CgovKgogKiBQYXJzZXMgdGhlIHRsdnMgZm91bmQgaW4gdGhlIHZhcmlhbnQgbGVuZ3RoIHBhcnQgb2YgdGhlIFBEVS4KICogQ2FsbGVyIHRlbGxzIHdpdGggZmxhZ3MgaW4gImV4cGVjdGVkIiB3aGljaCBUTFYncyBpdCBpcyBpbnRlcmVzdGVkIGluLgogKi8KaW50CnBhcnNlX3RsdnMgKGNoYXIgKmFyZWF0YWcsIHVfY2hhciAqIHN0cmVhbSwgaW50IHNpemUsIHVfaW50MzJfdCAqIGV4cGVjdGVkLAoJICAgIHVfaW50MzJfdCAqIGZvdW5kLCBzdHJ1Y3QgdGx2cyAqdGx2cykKewogIHVfY2hhciB0eXBlLCBsZW5ndGg7CiAgc3RydWN0IGxhbl9uZWlnaCAqbGFuX25laTsKICBzdHJ1Y3QgYXJlYV9hZGRyICphcmVhX2FkZHI7CiAgc3RydWN0IGlzX25laWdoICppc19uZWk7CiAgc3RydWN0IHRlX2lzX25laWdoICp0ZV9pc19uZWk7CiAgc3RydWN0IGVzX25laWdoICplc19uZWk7CiAgc3RydWN0IGxzcF9lbnRyeSAqbHNwX2VudHJ5OwogIHN0cnVjdCBpbl9hZGRyICppcHY0X2FkZHI7CiAgc3RydWN0IGlwdjRfcmVhY2hhYmlsaXR5ICppcHY0X3JlYWNoOwogIHN0cnVjdCB0ZV9pcHY0X3JlYWNoYWJpbGl0eSAqdGVfaXB2NF9yZWFjaDsKI2lmZGVmIEhBVkVfSVBWNgogIHN0cnVjdCBpbjZfYWRkciAqaXB2Nl9hZGRyOwogIHN0cnVjdCBpcHY2X3JlYWNoYWJpbGl0eSAqaXB2Nl9yZWFjaDsKICBpbnQgcHJlZml4X29jdGV0czsKI2VuZGlmIC8qIEhBVkVfSVBWNiAqLwogIHVfY2hhciB2aXJ0dWFsOwogIGludCB2YWx1ZV9sZW4sIHJldHZhbCA9IElTSVNfT0s7CiAgdV9jaGFyICpwbnQgPSBzdHJlYW07CgogICpmb3VuZCA9IDA7CiAgbWVtc2V0ICh0bHZzLCAwLCBzaXplb2YgKHN0cnVjdCB0bHZzKSk7CgogIHdoaWxlIChwbnQgPCBzdHJlYW0gKyBzaXplIC0gMikKICAgIHsKICAgICAgdHlwZSA9ICpwbnQ7CiAgICAgIGxlbmd0aCA9ICoocG50ICsgMSk7CiAgICAgIHBudCArPSAyOwogICAgICB2YWx1ZV9sZW4gPSAwOwogICAgICBpZiAocG50ICsgbGVuZ3RoID4gc3RyZWFtICsgc2l6ZSkKCXsKCSAgemxvZ193YXJuICgiSVNJUy1UTFYgKCVzKTogVExWICh0eXBlICVkLCBsZW5ndGggJWQpIGV4Y2VlZHMgcGFja2V0ICIKCQkgICAgICJib3VuZGFyaWVzIiwgYXJlYXRhZywgdHlwZSwgbGVuZ3RoKTsKCSAgcmV0dmFsID0gSVNJU19XQVJOSU5HOwoJICBicmVhazsKCX0KICAgICAgc3dpdGNoICh0eXBlKQoJewoJY2FzZSBBUkVBX0FERFJFU1NFUzoKCSAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgTGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgIHwgCgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgQXJlYSBBZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICB8IAoJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgoJICAgKi8KCSAgKmZvdW5kIHw9IFRMVkZMQUdfQVJFQV9BRERSUzsKI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCgkgIHpsb2dfZGVidWcgKCJUTFYgQXJlYSBBZHJlc3NlcyBsZW4gJWQiLCBsZW5ndGgpOwojZW5kaWYgLyogRVhUUkVNRV9UTFZfREVCVUcgKi8KCSAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfQVJFQV9BRERSUykKCSAgICB7CgkgICAgICB3aGlsZSAobGVuZ3RoID4gdmFsdWVfbGVuKQoJCXsKCQkgIGFyZWFfYWRkciA9IChzdHJ1Y3QgYXJlYV9hZGRyICopIHBudDsKCQkgIHZhbHVlX2xlbiArPSBhcmVhX2FkZHItPmFkZHJfbGVuICsgMTsKCQkgIHBudCArPSBhcmVhX2FkZHItPmFkZHJfbGVuICsgMTsKCQkgIGlmICghdGx2cy0+YXJlYV9hZGRycykKCQkgICAgdGx2cy0+YXJlYV9hZGRycyA9IGxpc3RfbmV3ICgpOwoJCSAgbGlzdG5vZGVfYWRkICh0bHZzLT5hcmVhX2FkZHJzLCBhcmVhX2FkZHIpOwoJCX0KCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICBwbnQgKz0gbGVuZ3RoOwoJICAgIH0KCSAgYnJlYWs7CgoJY2FzZSBJU19ORUlHSEJPVVJTOgoJICAqZm91bmQgfD0gVExWRkxBR19JU19ORUlHSFM7CiNpZmRlZiBFWFRSRU1FX1RMVl9ERUJVRwoJICB6bG9nX2RlYnVnICgiSVNJUy1UTFYgKCVzKTogSVMgTmVpZ2hib3VycyBsZW5ndGggJWQiLAoJCSAgICAgIGFyZWF0YWcsIGxlbmd0aCk7CiNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwoJICBpZiAoVExWRkxBR19JU19ORUlHSFMgJiAqZXhwZWN0ZWQpCgkgICAgewoJICAgICAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBWaXJ0dWFsIEZsYWcgICAgICAgICAgICAgICAgICAgICAgICAgICB8IAoJICAgICAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICAgICAqLwoJICAgICAgdmlydHVhbCA9ICpwbnQ7CS8qIEZJWE1FOiB3aGF0IGlzIHRoZSB1c2UgZm9yIHRoaXM/ICovCgkgICAgICBwbnQrKzsKCSAgICAgIHZhbHVlX2xlbisrOwoJICAgICAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICAgICAqIHwgICAwICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRGVmYXVsdCBNZXRyaWMgICAgICAgICAgICAgICAgICB8IAoJICAgICAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICAgICAqIHwgICBTICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRGVsYXkgTWV0cmljICAgICAgICAgICAgICAgICAgICB8CgkgICAgICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgICAgICogfCAgIFMgICB8ICBJL0UgIHwgICAgICAgICAgICAgICBFeHBlbnNlIE1ldHJpYyAgICAgICAgICAgICAgICAgIHwKCSAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAgICAgKiB8ICAgUyAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIEVycm9yIE1ldHJpYyAgICAgICAgICAgICAgICAgICAgfAoJICAgICAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBOZWlnaGJvdXIgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICB8CgkgICAgICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoJICAgICAgICogOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKCSAgICAgICAqLwoJICAgICAgd2hpbGUgKGxlbmd0aCA+IHZhbHVlX2xlbikKCQl7CgkJICBpc19uZWkgPSAoc3RydWN0IGlzX25laWdoICopIHBudDsKCQkgIHZhbHVlX2xlbiArPSA0ICsgSVNJU19TWVNfSURfTEVOICsgMTsKCQkgIHBudCArPSA0ICsgSVNJU19TWVNfSURfTEVOICsgMTsKCQkgIGlmICghdGx2cy0+aXNfbmVpZ2hzKQoJCSAgICB0bHZzLT5pc19uZWlnaHMgPSBsaXN0X25ldyAoKTsKCQkgIGxpc3Rub2RlX2FkZCAodGx2cy0+aXNfbmVpZ2hzLCBpc19uZWkpOwoJCX0KCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICBwbnQgKz0gbGVuZ3RoOwoJICAgIH0KCSAgYnJlYWs7CgoJY2FzZSBURV9JU19ORUlHSEJPVVJTOgoJICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgTmVpZ2hib3VyIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA3CgkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBURSBNZXRyaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMKCSAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCSAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIFN1YlRMVnMgTGVuZ3RoICAgICAgICAgICAgICAgICAgICAgICAgIHwgMQoJICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoJICAgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgoJICAgKi8KCSAgKmZvdW5kIHw9IFRMVkZMQUdfVEVfSVNfTkVJR0hTOwojaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKCSAgemxvZ19kZWJ1ZyAoIklTSVMtVExWICglcyk6IEV4dGVuZGVkIElTIE5laWdoYm91cnMgbGVuZ3RoICVkIiwKCQkgICAgIGFyZWF0YWcsIGxlbmd0aCk7CiNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwoJICBpZiAoVExWRkxBR19URV9JU19ORUlHSFMgJiAqZXhwZWN0ZWQpCgkgICAgewoJICAgICAgd2hpbGUgKGxlbmd0aCA+IHZhbHVlX2xlbikKCQl7CgkJICB0ZV9pc19uZWkgPSAoc3RydWN0IHRlX2lzX25laWdoICopIHBudDsKCQkgIHZhbHVlX2xlbiArPSAxMTsKCQkgIHBudCArPSAxMTsKCQkgIC8qIEZJWE1FIC0gc3VidGx2cyBhcmUgaGFuZGxlZCBoZXJlLCBmb3Igbm93IHdlIHNraXAgKi8KCQkgIHZhbHVlX2xlbiArPSB0ZV9pc19uZWktPnN1Yl90bHZzX2xlbmd0aDsKCQkgIHBudCArPSB0ZV9pc19uZWktPnN1Yl90bHZzX2xlbmd0aDsKCgkJICBpZiAoIXRsdnMtPnRlX2lzX25laWdocykKCQkgICAgdGx2cy0+dGVfaXNfbmVpZ2hzID0gbGlzdF9uZXcgKCk7CgkJICBsaXN0bm9kZV9hZGQgKHRsdnMtPnRlX2lzX25laWdocywgdGVfaXNfbmVpKTsKCQl9CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgcG50ICs9IGxlbmd0aDsKCSAgICB9CgkgIGJyZWFrOwoKCWNhc2UgRVNfTkVJR0hCT1VSUzoKCSAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgIDAgICB8ICBJL0UgIHwgICAgICAgICAgICAgICBEZWZhdWx0IE1ldHJpYyAgICAgICAgICAgICAgICAgIHwgCgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICBTICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRGVsYXkgTWV0cmljICAgICAgICAgICAgICAgICAgICB8CgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICBTICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRXhwZW5zZSBNZXRyaWMgICAgICAgICAgICAgICAgICB8CgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICBTICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRXJyb3IgTWV0cmljICAgICAgICAgICAgICAgICAgICB8CgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBOZWlnaGJvdXIgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICB8CgkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBOZWlnaGJvdXIgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICB8CgkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgkgICAqIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CgkgICAqLwojaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKCSAgemxvZ19kZWJ1ZyAoIklTSVMtVExWICglcyk6IEVTIE5laWdoYm91cnMgbGVuZ3RoICVkIiwKCQkgICAgIGFyZWF0YWcsIGxlbmd0aCk7CiNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwoJICAqZm91bmQgfD0gVExWRkxBR19FU19ORUlHSFM7CgkgIGlmICgqZXhwZWN0ZWQgJiBUTFZGTEFHX0VTX05FSUdIUykKCSAgICB7CgkgICAgICBlc19uZWkgPSAoc3RydWN0IGVzX25laWdoICopIHBudDsKCSAgICAgIHZhbHVlX2xlbiArPSA0OwoJICAgICAgcG50ICs9IDQ7CgkgICAgICB3aGlsZSAobGVuZ3RoID4gdmFsdWVfbGVuKQoJCXsKCQkgIC8qIEZJWE1FIEZJWE1FIEZJWE1FIC0gYWRkIHRvIHRoZSBsaXN0ICovCgkJICAvKiAgICAgICAgICBzeXNfaWQtPmlkID0gcG50OyAqLwoJCSAgdmFsdWVfbGVuICs9IElTSVNfU1lTX0lEX0xFTjsKCQkgIHBudCArPSBJU0lTX1NZU19JRF9MRU47CgkJICAvKiAgaWYgKCFlc19uZWktPm5laWdoX2lkcykgZXNfbmVpLT5uZWlnaF9pZHMgPSBzeXNpZDsgKi8KCQl9CgkgICAgICBpZiAoIXRsdnMtPmVzX25laWdocykKCQl0bHZzLT5lc19uZWlnaHMgPSBsaXN0X25ldyAoKTsKCSAgICAgIGxpc3Rub2RlX2FkZCAodGx2cy0+ZXNfbmVpZ2hzLCBlc19uZWkpOwoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgIHBudCArPSBsZW5ndGg7CgkgICAgfQoJICBicmVhazsKCgljYXNlIExBTl9ORUlHSEJPVVJTOgoJICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgTEFOIEFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAKCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKCSAgICovCgkgICpmb3VuZCB8PSBUTFZGTEFHX0xBTl9ORUlHSFM7CiNpZmRlZiBFWFRSRU1FX1RMVl9ERUJVRwoJICB6bG9nX2RlYnVnICgiSVNJUy1UTFYgKCVzKTogTEFOIE5laWdib3VycyBsZW5ndGggJWQiLAoJCSAgICAgIGFyZWF0YWcsIGxlbmd0aCk7CiNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwoJICBpZiAoVExWRkxBR19MQU5fTkVJR0hTICYgKmV4cGVjdGVkKQoJICAgIHsKCSAgICAgIHdoaWxlIChsZW5ndGggPiB2YWx1ZV9sZW4pCgkJewoJCSAgbGFuX25laSA9IChzdHJ1Y3QgbGFuX25laWdoICopIHBudDsKCQkgIGlmICghdGx2cy0+bGFuX25laWdocykKCQkgICAgdGx2cy0+bGFuX25laWdocyA9IGxpc3RfbmV3ICgpOwoJCSAgbGlzdG5vZGVfYWRkICh0bHZzLT5sYW5fbmVpZ2hzLCBsYW5fbmVpKTsKCQkgIHZhbHVlX2xlbiArPSBFVEhfQUxFTjsKCQkgIHBudCArPSBFVEhfQUxFTjsKCQl9CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgcG50ICs9IGxlbmd0aDsKCSAgICB9CgkgIGJyZWFrOwoKCWNhc2UgUEFERElORzoKI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCgkgIHpsb2dfZGVidWcgKCJUTFYgcGFkZGluZyAlZCIsIGxlbmd0aCk7CiNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwoJICBwbnQgKz0gbGVuZ3RoOwoJICBicmVhazsKCgljYXNlIExTUF9FTlRSSUVTOgoJICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgICAgICAgICAgICAgICAgICAgUmVtYWluaW5nIExpZmV0aW1lICAgICAgICAgICAgICAgICAgICAgICAgfCAyCgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICAgTFNQIElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IGlkKzIKCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgICAgICAgICAgICAgICAgICBMU1AgU2VxdWVuY2UgTnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgIHygNAoJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tzdW0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAyCgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqLwojaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKCSAgemxvZ19kZWJ1ZyAoIklTSVMtVExWICglcyk6IExTUCBFbnRyaWVzIGxlbmd0aCAlZCIsIGFyZWF0YWcsIGxlbmd0aCk7CiNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwoJICAqZm91bmQgfD0gVExWRkxBR19MU1BfRU5UUklFUzsKCSAgaWYgKFRMVkZMQUdfTFNQX0VOVFJJRVMgJiAqZXhwZWN0ZWQpCgkgICAgewoJICAgICAgd2hpbGUgKGxlbmd0aCA+IHZhbHVlX2xlbikKCQl7CgkJICBsc3BfZW50cnkgPSAoc3RydWN0IGxzcF9lbnRyeSAqKSBwbnQ7CgkJICB2YWx1ZV9sZW4gKz0gMTAgKyBJU0lTX1NZU19JRF9MRU47CgkJICBwbnQgKz0gMTAgKyBJU0lTX1NZU19JRF9MRU47CgkJICBpZiAoIXRsdnMtPmxzcF9lbnRyaWVzKQoJCSAgICB0bHZzLT5sc3BfZW50cmllcyA9IGxpc3RfbmV3ICgpOwoJCSAgbGlzdG5vZGVfYWRkICh0bHZzLT5sc3BfZW50cmllcywgbHNwX2VudHJ5KTsKCQl9CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgcG50ICs9IGxlbmd0aDsKCSAgICB9CgkgIGJyZWFrOwoKCWNhc2UgQ0hFQ0tTVU06CgkgIC8qICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICAgMTYgYml0IGZsZXRjaGVyIENIRUNLU1VNICAgICAgICAgICAgICAgICAgICB8CgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CgkgICAqLwoJICAqZm91bmQgfD0gVExWRkxBR19DSEVDS1NVTTsKI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCgkgIHpsb2dfZGVidWcgKCJJU0lTLVRMViAoJXMpOiBDaGVja3N1bSBsZW5ndGggJWQiLCBhcmVhdGFnLCBsZW5ndGgpOwojZW5kaWYgLyogRVhUUkVNRV9UTFZfREVCVUcgKi8KCSAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfQ0hFQ0tTVU0pCgkgICAgewoJICAgICAgdGx2cy0+Y2hlY2tzdW0gPSAoc3RydWN0IGNoZWNrc3VtICopIHBudDsKCSAgICB9CgkgIHBudCArPSBsZW5ndGg7CgkgIGJyZWFrOwoKCWNhc2UgUFJPVE9DT0xTX1NVUFBPUlRFRDoKCSAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgICAgICAgICAgICAgICAgICAgICAgTkxQSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKCSAgICovCgkgICpmb3VuZCB8PSBUTFZGTEFHX05MUElEOwojaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKCSAgemxvZ19kZWJ1ZyAoIklTSVMtVExWICglcyk6IFByb3RvY29scyBTdXBwb3J0ZWQgbGVuZ3RoICVkIiwKCQkgICAgICBhcmVhdGFnLCBsZW5ndGgpOwojZW5kaWYgLyogRVhUUkVNRV9UTFZfREVCVUcgKi8KCSAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfTkxQSUQpCgkgICAgewoJICAgICAgdGx2cy0+bmxwaWRzID0gKHN0cnVjdCBubHBpZHMgKikgKHBudCAtIDEpOwoJICAgIH0KCSAgcG50ICs9IGxlbmd0aDsKCSAgYnJlYWs7CgoJY2FzZSBJUFY0X0FERFI6CgkgIC8qICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqICsgICAgICAgICAgICAgICAgIElQIHZlcnNpb24gNCBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICArIDQKCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKCSAgICovCgkgICpmb3VuZCB8PSBUTFZGTEFHX0lQVjRfQUREUjsKI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCgkgIHpsb2dfZGVidWcgKCJJU0lTLVRMViAoJXMpOiBJUHY0IEFkZHJlc3MgbGVuZ3RoICVkIiwKCQkgICAgICBhcmVhdGFnLCBsZW5ndGgpOwojZW5kaWYgLyogRVhUUkVNRV9UTFZfREVCVUcgKi8KCSAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfSVBWNF9BRERSKQoJICAgIHsKCSAgICAgIHdoaWxlIChsZW5ndGggPiB2YWx1ZV9sZW4pCgkJewoJCSAgaXB2NF9hZGRyID0gKHN0cnVjdCBpbl9hZGRyICopIHBudDsKI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCgkJICB6bG9nX2RlYnVnICgiSVNJUy1UTFYgKCVzKSA6IElQIEFERFIgJXMsIHBudCAlcCIsIGFyZWF0YWcsCgkJCSAgICAgIGluZXRfbnRvYSAoKmlwdjRfYWRkciksIHBudCk7CiNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwoJCSAgaWYgKCF0bHZzLT5pcHY0X2FkZHJzKQoJCSAgICB0bHZzLT5pcHY0X2FkZHJzID0gbGlzdF9uZXcgKCk7CgkJICBsaXN0bm9kZV9hZGQgKHRsdnMtPmlwdjRfYWRkcnMsIGlwdjRfYWRkcik7CgkJICB2YWx1ZV9sZW4gKz0gNDsKCQkgIHBudCArPSA0OwoJCX0KCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICBwbnQgKz0gbGVuZ3RoOwoJICAgIH0KCSAgYnJlYWs7CgoJY2FzZSBBVVRIX0lORk86CgkgICpmb3VuZCB8PSBUTFZGTEFHX0FVVEhfSU5GTzsKI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCgkgIHpsb2dfZGVidWcgKCJJU0lTLVRMViAoJXMpOiBJUy1JUyBBdXRoZW50aWNhdGlvbiBJbmZvcm1hdGlvbiIsCgkJICAgICAgYXJlYXRhZyk7CiNlbmRpZgoJICBpZiAoKmV4cGVjdGVkICYgVExWRkxBR19BVVRIX0lORk8pCgkgICAgewoJICAgICAgdGx2cy0+YXV0aF9pbmZvLnR5cGUgPSAqcG50OwoJICAgICAgdGx2cy0+YXV0aF9pbmZvLmxlbiA9IGxlbmd0aC0xOwoJICAgICAgcG50Kys7CgkgICAgICBtZW1jcHkgKHRsdnMtPmF1dGhfaW5mby5wYXNzd2QsIHBudCwgbGVuZ3RoIC0gMSk7CgkgICAgIC8qIEZpbGwgYXV0aGVudGljYXRpb24gd2l0aCAwIGZvciBsYXRlciBjb21wdXRhdGlvbgoJICAgICAgKiBvZiBNRDUgKFJGQyA1MzA0LCAyKQoJICAgICAgKi8KCSAgICAgbWVtc2V0IChwbnQsIDAsIGxlbmd0aCAtIDEpOwoJICAgICAgcG50ICs9IGxlbmd0aCAtIDE7CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgcG50ICs9IGxlbmd0aDsKCSAgICB9CgkgIGJyZWFrOwoKCWNhc2UgRFlOQU1JQ19IT1NUTkFNRToKCSAgKmZvdW5kIHw9IFRMVkZMQUdfRFlOX0hPU1ROQU1FOwojaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKCSAgemxvZ19kZWJ1ZyAoIklTSVMtVExWICglcyk6IER5bmFtaWMgSG9zdG5hbWUgbGVuZ3RoICVkIiwKCQkgICAgICBhcmVhdGFnLCBsZW5ndGgpOwojZW5kaWYgLyogRVhUUkVNRV9UTFZfREVCVUcgKi8KCSAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfRFlOX0hPU1ROQU1FKQoJICAgIHsKCSAgICAgIC8qIHRoZSBsZW5ndGggaXMgYWxzbyBpbmNsdWRlZCBpbiB0aGUgcG9pbnRlZCBzdHJ1Y3QgKi8KCSAgICAgIHRsdnMtPmhvc3RuYW1lID0gKHN0cnVjdCBob3N0bmFtZSAqKSAocG50IC0gMSk7CgkgICAgfQoJICBwbnQgKz0gbGVuZ3RoOwoJICBicmVhazsKCgljYXNlIFRFX1JPVVRFUl9JRDoKCSAgLyogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCSAgICogKyAgICAgICAgICAgICAgICAgICAgICAgICBSb3V0ZXIgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICsgNAoJICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoJICAgKi8KCSAgKmZvdW5kIHw9IFRMVkZMQUdfVEVfUk9VVEVSX0lEOwojaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKCSAgemxvZ19kZWJ1ZyAoIklTSVMtVExWICglcyk6IFRFIFJvdXRlciBJRCAlZCIsIGFyZWF0YWcsIGxlbmd0aCk7CiNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwoJICBpZiAoKmV4cGVjdGVkICYgVExWRkxBR19URV9ST1VURVJfSUQpCgkgICAgdGx2cy0+cm91dGVyX2lkID0gKHN0cnVjdCB0ZV9yb3V0ZXJfaWQgKikgKHBudCk7CgkgIHBudCArPSBsZW5ndGg7CgkgIGJyZWFrOwoKCWNhc2UgSVBWNF9JTlRfUkVBQ0hBQklMSVRZOgoJICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgMCAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIERlZmF1bHQgTWV0cmljICAgICAgICAgICAgICAgICAgfCAxCgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICBTICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRGVsYXkgTWV0cmljICAgICAgICAgICAgICAgICAgICB8IDEKCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgIFMgICB8ICBJL0UgIHwgICAgICAgICAgICAgICBFeHBlbnNlIE1ldHJpYyAgICAgICAgICAgICAgICAgIHwgMQoJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgUyAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIEVycm9yIE1ldHJpYyAgICAgICAgICAgICAgICAgICAgfCAxCgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBpcCBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDQKCSAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCSAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgbWFzayAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNAoJICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoJICAgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgoJICAgKi8KCSAgKmZvdW5kIHw9IFRMVkZMQUdfSVBWNF9JTlRfUkVBQ0hBQklMSVRZOwojaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKCSAgemxvZ19kZWJ1ZyAoIklTSVMtVExWICglcyk6IElQdjQgaW50ZXJuYWwgUmVhY2hhYmlsaXR5IGxlbmd0aCAlZCIsCgkJICAgICAgYXJlYXRhZywgbGVuZ3RoKTsKI2VuZGlmIC8qIEVYVFJFTUVfVExWX0RFQlVHICovCgkgIGlmICgqZXhwZWN0ZWQgJiBUTFZGTEFHX0lQVjRfSU5UX1JFQUNIQUJJTElUWSkKCSAgICB7CgkgICAgICB3aGlsZSAobGVuZ3RoID4gdmFsdWVfbGVuKQoJCXsKCQkgIGlwdjRfcmVhY2ggPSAoc3RydWN0IGlwdjRfcmVhY2hhYmlsaXR5ICopIHBudDsKCQkgIGlmICghdGx2cy0+aXB2NF9pbnRfcmVhY2hzKQoJCSAgICB0bHZzLT5pcHY0X2ludF9yZWFjaHMgPSBsaXN0X25ldyAoKTsKCQkgIGxpc3Rub2RlX2FkZCAodGx2cy0+aXB2NF9pbnRfcmVhY2hzLCBpcHY0X3JlYWNoKTsKCQkgIHZhbHVlX2xlbiArPSAxMjsKCQkgIHBudCArPSAxMjsKCQl9CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgcG50ICs9IGxlbmd0aDsKCSAgICB9CgkgIGJyZWFrOwoKCWNhc2UgSVBWNF9FWFRfUkVBQ0hBQklMSVRZOgoJICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgMCAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIERlZmF1bHQgTWV0cmljICAgICAgICAgICAgICAgICAgfCAxCgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICBTICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRGVsYXkgTWV0cmljICAgICAgICAgICAgICAgICAgICB8IDEKCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgIFMgICB8ICBJL0UgIHwgICAgICAgICAgICAgICBFeHBlbnNlIE1ldHJpYyAgICAgICAgICAgICAgICAgIHwgMQoJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgUyAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIEVycm9yIE1ldHJpYyAgICAgICAgICAgICAgICAgICAgfCAxCgkgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBpcCBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDQKCSAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCSAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgbWFzayAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNAoJICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoJICAgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgoJICAgKi8KCSAgKmZvdW5kIHw9IFRMVkZMQUdfSVBWNF9FWFRfUkVBQ0hBQklMSVRZOwojaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKCSAgemxvZ19kZWJ1ZyAoIklTSVMtVExWICglcyk6IElQdjQgZXh0ZXJuYWwgUmVhY2hhYmlsaXR5IGxlbmd0aCAlZCIsCgkJICAgICAgYXJlYXRhZywgbGVuZ3RoKTsKI2VuZGlmIC8qIEVYVFJFTUVfVExWX0RFQlVHICovCgkgIGlmICgqZXhwZWN0ZWQgJiBUTFZGTEFHX0lQVjRfRVhUX1JFQUNIQUJJTElUWSkKCSAgICB7CgkgICAgICB3aGlsZSAobGVuZ3RoID4gdmFsdWVfbGVuKQoJCXsKCQkgIGlwdjRfcmVhY2ggPSAoc3RydWN0IGlwdjRfcmVhY2hhYmlsaXR5ICopIHBudDsKCQkgIGlmICghdGx2cy0+aXB2NF9leHRfcmVhY2hzKQoJCSAgICB0bHZzLT5pcHY0X2V4dF9yZWFjaHMgPSBsaXN0X25ldyAoKTsKCQkgIGxpc3Rub2RlX2FkZCAodGx2cy0+aXB2NF9leHRfcmVhY2hzLCBpcHY0X3JlYWNoKTsKCQkgIHZhbHVlX2xlbiArPSAxMjsKCQkgIHBudCArPSAxMjsKCQl9CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgcG50ICs9IGxlbmd0aDsKCSAgICB9CgkgIGJyZWFrOwoKCWNhc2UgVEVfSVBWNF9SRUFDSEFCSUxJVFk6CgkgIC8qICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBURSBNZXRyaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDQKCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgVS9EICB8IHNUTFY/IHwgICAgICAgICAgICAgICBQcmVmaXggTWFzayBMZW4gICAgICAgICAgICAgICAgIHwgMQoJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwLTQKCSAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCSAgICogfCAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgdGx2cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKCSAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCSAgICogOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKCSAgICovCgkgICpmb3VuZCB8PSBUTFZGTEFHX1RFX0lQVjRfUkVBQ0hBQklMSVRZOwojaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKCSAgemxvZ19kZWJ1ZyAoIklTSVMtVExWICglcyk6IElQdjQgZXh0ZW5kZWQgUmVhY2hhYmlsaXR5IGxlbmd0aCAlZCIsCgkJICAgICAgYXJlYXRhZywgbGVuZ3RoKTsKI2VuZGlmIC8qIEVYVFJFTUVfVExWX0RFQlVHICovCgkgIGlmICgqZXhwZWN0ZWQgJiBUTFZGTEFHX1RFX0lQVjRfUkVBQ0hBQklMSVRZKQoJICAgIHsKCSAgICAgIHdoaWxlIChsZW5ndGggPiB2YWx1ZV9sZW4pCgkJewoJCSAgdGVfaXB2NF9yZWFjaCA9IChzdHJ1Y3QgdGVfaXB2NF9yZWFjaGFiaWxpdHkgKikgcG50OwoJCSAgaWYgKCF0bHZzLT50ZV9pcHY0X3JlYWNocykKCQkgICAgdGx2cy0+dGVfaXB2NF9yZWFjaHMgPSBsaXN0X25ldyAoKTsKCQkgIGxpc3Rub2RlX2FkZCAodGx2cy0+dGVfaXB2NF9yZWFjaHMsIHRlX2lwdjRfcmVhY2gpOwoJCSAgLyogdGhpcyB0cmlja2VyeSBpcyBwZXJtaXRhYmxlIHNpbmNlIG5vIHN1YnRsdnMgYXJlIGRlZmluZWQgKi8KCQkgIHZhbHVlX2xlbiArPSA1ICsgKCh0ZV9pcHY0X3JlYWNoLT5jb250cm9sICYgMHgzRikgPwoJCQkJICAgICgoKCh0ZV9pcHY0X3JlYWNoLT5jb250cm9sICYgMHgzRikgLQoJCQkJICAgICAgIDEpID4+IDMpICsgMSkgOiAwKTsKCQkgIHBudCArPSA1ICsgKCh0ZV9pcHY0X3JlYWNoLT5jb250cm9sICYgMHgzRikgPwoJCSAgICAgICAgICAgICAgKCgoKHRlX2lwdjRfcmVhY2gtPmNvbnRyb2wgJiAweDNGKSAtIDEpID4+IDMpICsgMSkgOiAwKTsKCQl9CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgcG50ICs9IGxlbmd0aDsKCSAgICB9CgkgIGJyZWFrOwoKI2lmZGVmICBIQVZFX0lQVjYKCWNhc2UgSVBWNl9BRERSOgoJICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiArICAgICAgICAgICAgICAgICBJUCB2ZXJzaW9uIDYgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgKyAxNgoJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgoJICAgKi8KCSAgKmZvdW5kIHw9IFRMVkZMQUdfSVBWNl9BRERSOwojaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKCSAgemxvZ19kZWJ1ZyAoIklTSVMtVExWICglcyk6IElQdjYgQWRkcmVzcyBsZW5ndGggJWQiLAoJCSAgICAgIGFyZWF0YWcsIGxlbmd0aCk7CiNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLwoJICBpZiAoKmV4cGVjdGVkICYgVExWRkxBR19JUFY2X0FERFIpCgkgICAgewoJICAgICAgd2hpbGUgKGxlbmd0aCA+IHZhbHVlX2xlbikKCQl7CgkJICBpcHY2X2FkZHIgPSAoc3RydWN0IGluNl9hZGRyICopIHBudDsKCQkgIGlmICghdGx2cy0+aXB2Nl9hZGRycykKCQkgICAgdGx2cy0+aXB2Nl9hZGRycyA9IGxpc3RfbmV3ICgpOwoJCSAgbGlzdG5vZGVfYWRkICh0bHZzLT5pcHY2X2FkZHJzLCBpcHY2X2FkZHIpOwoJCSAgdmFsdWVfbGVuICs9IDE2OwoJCSAgcG50ICs9IDE2OwoJCX0KCSAgICB9CgkgIGVsc2UKCSAgICB7CgkgICAgICBwbnQgKz0gbGVuZ3RoOwoJICAgIH0KCSAgYnJlYWs7CgoJY2FzZSBJUFY2X1JFQUNIQUJJTElUWToKCSAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgICAgICAgICAgICAgICAgRGVmYXVsdCBNZXRyaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNCAKCSAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgSW5mb3JtYW50aW9uICAgICAgICAgICAgICAgICAgIHwKCSAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCSAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIElQdjYgUHJlZml4IExlbmd0aCAgICAgICAgICAgICAgICAgICAgIHwtLSsKCSAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgIHwKCSAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIElQdjYgUHJlZml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHw8LSsKCSAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCSAgICovCgkgICpmb3VuZCB8PSBUTFZGTEFHX0lQVjZfUkVBQ0hBQklMSVRZOwoJICBpZiAoKmV4cGVjdGVkICYgVExWRkxBR19JUFY2X1JFQUNIQUJJTElUWSkKCSAgICB7CgkgICAgICB3aGlsZSAobGVuZ3RoID4gdmFsdWVfbGVuKQoJCXsKCQkgIGlwdjZfcmVhY2ggPSAoc3RydWN0IGlwdjZfcmVhY2hhYmlsaXR5ICopIHBudDsKCQkgIHByZWZpeF9vY3RldHMgPSAoKGlwdjZfcmVhY2gtPnByZWZpeF9sZW4gKyA3KSAvIDgpOwoJCSAgdmFsdWVfbGVuICs9IHByZWZpeF9vY3RldHMgKyA2OwoJCSAgcG50ICs9IHByZWZpeF9vY3RldHMgKyA2OwoJCSAgLyogRklYTUU6IHN1Yi10bHZzICovCgkJICBpZiAoIXRsdnMtPmlwdjZfcmVhY2hzKQoJCSAgICB0bHZzLT5pcHY2X3JlYWNocyA9IGxpc3RfbmV3ICgpOwoJCSAgbGlzdG5vZGVfYWRkICh0bHZzLT5pcHY2X3JlYWNocywgaXB2Nl9yZWFjaCk7CgkJfQoJICAgIH0KCSAgZWxzZQoJICAgIHsKCSAgICAgIHBudCArPSBsZW5ndGg7CgkgICAgfQoJICBicmVhazsKI2VuZGlmIC8qIEhBVkVfSVBWNiAqLwoKCWNhc2UgV0FZM19IRUxMTzoKCSAgLyogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCSAgICogfCAgICAgICAgICAgICAgICAgIEFkamFjZW5jeSBzdGF0ZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgMQoJICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoJICAgKiB8ICAgICAgICAgICAgICAgICAgRXh0ZW5kZWQgTG9jYWwgQ2lyY3VpdCBJRCAgICAgICAgICAgICAgICAgICAgfCA0CgkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICBOZWlnaGJvciBTeXN0ZW0gSUQgKElmIGtub3duKSAgICAgICAgICAgICAgICB8IDAtOAoJICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2JhYmx5IDYpCgkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgICBOZWlnaGJvciBMb2NhbCBDaXJjdWl0IElEIChJZiBrbm93bikgICAgICAgICB8IDQKCSAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKCSAgICovCgkgICpmb3VuZCB8PSBUTFZGTEFHXzNXQVlfSEVMTE87CgkgIGlmICgqZXhwZWN0ZWQgJiBUTFZGTEFHXzNXQVlfSEVMTE8pCgkgICAgewoJICAgICAgd2hpbGUgKGxlbmd0aCA+IHZhbHVlX2xlbikKCQl7CgkJICAvKiBGSVhNRTogbWFrZSB0aGlzIHdvcmsgKi8KLyogICAgICAgICAgIEFkamFjZW5jeSBTdGF0ZSAob25lIG9jdGV0KToKICAgICAgICAgICAgICAwID0gVXAKICAgICAgICAgICAgICAxID0gSW5pdGlhbGl6aW5nCiAgICAgICAgICAgICAgMiA9IERvd24KICAgICAgICAgICAgRXh0ZW5kZWQgTG9jYWwgQ2lyY3VpdCBJRCAoZm91ciBvY3RldHMpCiAgICAgICAgICAgIE5laWdoYm9yIFN5c3RlbSBJRCBpZiBrbm93biAoemVybyB0byBlaWdodCBvY3RldHMpCiAgICAgICAgICAgIE5laWdoYm9yIEV4dGVuZGVkIExvY2FsIENpcmN1aXQgSUQgKGZvdXIgb2N0ZXRzLCBpZiBOZWlnaGJvcgogICAgICAgICAgICAgIFN5c3RlbSBJRCBpcyBwcmVzZW50KSAqLwoJCSAgcG50ICs9IGxlbmd0aDsKCQl9CgkgICAgfQoJICBlbHNlCgkgICAgewoJICAgICAgcG50ICs9IGxlbmd0aDsKCSAgICB9CgoJICBicmVhazsKCWNhc2UgR1JBQ0VGVUxfUkVTVEFSVDoKCSAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKCSAgICogfCAgICAgICAgIFJlc2VydmVkICAgICAgICAgICAgICAgICAgICAgIHwgIFNBICAgfCAgUkEgICB8ICBSUiAgIHwgMQoJICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKwoJICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICBSZW1haW5pbmcgVGltZSAgICAgICAgICAgICAgICAgICAgICAgfCAyCgkgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCgkgICAqIHwgICAgICAgICAgICAgICAgUmVzdGFydGluZyBOZWlnaGJvciBJRCAoSWYga25vd24pICAgICAgICAgICAgICB8IDAtOAoJICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKwoJICAgKi8KCSAgKmZvdW5kIHw9IFRMVkZMQUdfR1JBQ0VGVUxfUkVTVEFSVDsKCSAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfR1JBQ0VGVUxfUkVTVEFSVCkKCSAgICB7CgkgICAgICAvKiBGSVhNRTogbWFrZSB0aGlzIHdvcmsgKi8KCSAgICB9CgkgIHBudCArPSBsZW5ndGg7CgkgIGJyZWFrOwoKCWRlZmF1bHQ6CgkgIHpsb2dfd2FybiAoIklTSVMtVExWICglcyk6IHVuc3VwcG9ydGVkIFRMViB0eXBlICVkLCBsZW5ndGggJWQiLAoJCSAgICAgYXJlYXRhZywgdHlwZSwgbGVuZ3RoKTsKCgkgIHJldHZhbCA9IElTSVNfV0FSTklORzsKCSAgcG50ICs9IGxlbmd0aDsKCSAgYnJlYWs7Cgl9CiAgICB9CgogIHJldHVybiByZXR2YWw7Cn0KCmludAphZGRfdGx2ICh1X2NoYXIgdGFnLCB1X2NoYXIgbGVuLCB1X2NoYXIgKiB2YWx1ZSwgc3RydWN0IHN0cmVhbSAqc3RyZWFtKQp7CgogIGlmIChTVFJFQU1fU0laRSAoc3RyZWFtKSAtIHN0cmVhbV9nZXRfZW5kcCAoc3RyZWFtKSA8ICh1bnNpZ25lZCkgbGVuICsgMikKICAgIHsKICAgICAgemxvZ193YXJuICgiTm8gcm9vbSBmb3IgVExWIG9mIHR5cGUgJWQiLCB0YWcpOwogICAgICByZXR1cm4gSVNJU19XQVJOSU5HOwogICAgfQoKICBzdHJlYW1fcHV0YyAoc3RyZWFtLCB0YWcpOwkvKiBUQUcgKi8KICBzdHJlYW1fcHV0YyAoc3RyZWFtLCBsZW4pOwkvKiBMRU5HVEggKi8KICBzdHJlYW1fcHV0IChzdHJlYW0sIHZhbHVlLCAoaW50KSBsZW4pOwkvKiBWQUxVRSAqLwoKI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCiAgemxvZ19kZWJ1ZyAoIkFkZGVkIFRMViAlZCBsZW4gJWQiLCB0YWcsIGxlbik7CiNlbmRpZiAvKiBFWFRSRU1FIERFQlVHICovCiAgcmV0dXJuIElTSVNfT0s7Cn0KCmludAp0bHZfYWRkX2FyZWFfYWRkcnMgKHN0cnVjdCBsaXN0ICphcmVhX2FkZHJzLCBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pCnsKICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CiAgc3RydWN0IGFyZWFfYWRkciAqYXJlYV9hZGRyOwoKICB1X2NoYXIgdmFsdWVbMjU1XTsKICB1X2NoYXIgKnBvcyA9IHZhbHVlOwoKICBmb3IgKEFMTF9MSVNUX0VMRU1FTlRTX1JPIChhcmVhX2FkZHJzLCBub2RlLCBhcmVhX2FkZHIpKQogICAgewogICAgICBpZiAocG9zIC0gdmFsdWUgKyBhcmVhX2FkZHItPmFkZHJfbGVuID4gMjU1KQoJZ290byBlcnI7CiAgICAgICpwb3MgPSBhcmVhX2FkZHItPmFkZHJfbGVuOwogICAgICBwb3MrKzsKICAgICAgbWVtY3B5IChwb3MsIGFyZWFfYWRkci0+YXJlYV9hZGRyLCAoaW50KSBhcmVhX2FkZHItPmFkZHJfbGVuKTsKICAgICAgcG9zICs9IGFyZWFfYWRkci0+YWRkcl9sZW47CiAgICB9CgogIHJldHVybiBhZGRfdGx2IChBUkVBX0FERFJFU1NFUywgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOwoKZXJyOgogIHpsb2dfd2FybiAoInRsdl9hZGRfYXJlYV9hZGRycygpOiBUTFYgbG9uZ2VyIHRoYW4gMjU1Iik7CiAgcmV0dXJuIElTSVNfV0FSTklORzsKfQoKaW50CnRsdl9hZGRfaXNfbmVpZ2hzIChzdHJ1Y3QgbGlzdCAqaXNfbmVpZ2hzLCBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pCnsKICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CiAgc3RydWN0IGlzX25laWdoICppc19uZWlnaDsKICB1X2NoYXIgdmFsdWVbMjU1XTsKICB1X2NoYXIgKnBvcyA9IHZhbHVlOwogIGludCByZXR2YWw7CgogICpwb3MgPSAwOwkJCS8qaXNfbmVpZ2gtPnZpcnR1YWw7ICovCiAgcG9zKys7CgogIGZvciAoQUxMX0xJU1RfRUxFTUVOVFNfUk8gKGlzX25laWdocywgbm9kZSwgaXNfbmVpZ2gpKQogICAgewogICAgICBpZiAocG9zIC0gdmFsdWUgKyBJU19ORUlHSEJPVVJTX0xFTiA+IDI1NSkKCXsKCSAgcmV0dmFsID0gYWRkX3RsdiAoSVNfTkVJR0hCT1VSUywgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOwoJICBpZiAocmV0dmFsICE9IElTSVNfT0spCgkgICAgcmV0dXJuIHJldHZhbDsKCSAgcG9zID0gdmFsdWU7Cgl9CiAgICAgICpwb3MgPSBpc19uZWlnaC0+bWV0cmljcy5tZXRyaWNfZGVmYXVsdDsKICAgICAgcG9zKys7CiAgICAgICpwb3MgPSBpc19uZWlnaC0+bWV0cmljcy5tZXRyaWNfZGVsYXk7CiAgICAgIHBvcysrOwogICAgICAqcG9zID0gaXNfbmVpZ2gtPm1ldHJpY3MubWV0cmljX2V4cGVuc2U7CiAgICAgIHBvcysrOwogICAgICAqcG9zID0gaXNfbmVpZ2gtPm1ldHJpY3MubWV0cmljX2Vycm9yOwogICAgICBwb3MrKzsKICAgICAgbWVtY3B5IChwb3MsIGlzX25laWdoLT5uZWlnaF9pZCwgSVNJU19TWVNfSURfTEVOICsgMSk7CiAgICAgIHBvcyArPSBJU0lTX1NZU19JRF9MRU4gKyAxOwogICAgfQoKICByZXR1cm4gYWRkX3RsdiAoSVNfTkVJR0hCT1VSUywgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOwp9CgppbnQKdGx2X2FkZF90ZV9pc19uZWlnaHMgKHN0cnVjdCBsaXN0ICp0ZV9pc19uZWlnaHMsIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSkKewogIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTsKICBzdHJ1Y3QgdGVfaXNfbmVpZ2ggKnRlX2lzX25laWdoOwogIHVfY2hhciB2YWx1ZVsyNTVdOwogIHVfY2hhciAqcG9zID0gdmFsdWU7CiAgaW50IHJldHZhbDsKCiAgZm9yIChBTExfTElTVF9FTEVNRU5UU19STyAodGVfaXNfbmVpZ2hzLCBub2RlLCB0ZV9pc19uZWlnaCkpCiAgICB7CiAgICAgIC8qIEZJWE1FOiBUaGlzIHdpbGwgYmUgd3JvbmcgaWYgd2UgYXJlIGdvaW5nIHRvIGFkZCBURSBzdWIgVExWcy4gKi8KICAgICAgaWYgKHBvcyAtIHZhbHVlICsgSVNfTkVJR0hCT1VSU19MRU4gPiAyNTUpCiAgICAgICAgewogICAgICAgICAgcmV0dmFsID0gYWRkX3RsdiAoVEVfSVNfTkVJR0hCT1VSUywgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOwogICAgICAgICAgaWYgKHJldHZhbCAhPSBJU0lTX09LKQogICAgICAgICAgICByZXR1cm4gcmV0dmFsOwogICAgICAgICAgcG9zID0gdmFsdWU7CiAgICAgICAgfQogICAgICAKICAgICAgbWVtY3B5IChwb3MsIHRlX2lzX25laWdoLT5uZWlnaF9pZCwgSVNJU19TWVNfSURfTEVOICsgMSk7CiAgICAgIHBvcyArPSBJU0lTX1NZU19JRF9MRU4gKyAxOwogICAgICBtZW1jcHkgKHBvcywgdGVfaXNfbmVpZ2gtPnRlX21ldHJpYywgMyk7CiAgICAgIHBvcyArPSAzOwogICAgICAvKiBTdWIgVExWcyBsZW5ndGguICovCiAgICAgICpwb3MgPSAwOwogICAgICBwb3MrKzsKICAgIH0KCiAgcmV0dXJuIGFkZF90bHYgKFRFX0lTX05FSUdIQk9VUlMsIHBvcyAtIHZhbHVlLCB2YWx1ZSwgc3RyZWFtKTsKfQoKaW50CnRsdl9hZGRfbGFuX25laWdocyAoc3RydWN0IGxpc3QgKmxhbl9uZWlnaHMsIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSkKewogIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTsKICB1X2NoYXIgKnNucGE7CiAgdV9jaGFyIHZhbHVlWzI1NV07CiAgdV9jaGFyICpwb3MgPSB2YWx1ZTsKICBpbnQgcmV0dmFsOwoKICBmb3IgKEFMTF9MSVNUX0VMRU1FTlRTX1JPIChsYW5fbmVpZ2hzLCBub2RlLCBzbnBhKSkKICAgIHsKICAgICAgaWYgKHBvcyAtIHZhbHVlICsgRVRIX0FMRU4gPiAyNTUpCgl7CgkgIHJldHZhbCA9IGFkZF90bHYgKExBTl9ORUlHSEJPVVJTLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7CgkgIGlmIChyZXR2YWwgIT0gSVNJU19PSykKCSAgICByZXR1cm4gcmV0dmFsOwoJICBwb3MgPSB2YWx1ZTsKCX0KICAgICAgbWVtY3B5IChwb3MsIHNucGEsIEVUSF9BTEVOKTsKICAgICAgcG9zICs9IEVUSF9BTEVOOwogICAgfQoKICByZXR1cm4gYWRkX3RsdiAoTEFOX05FSUdIQk9VUlMsIHBvcyAtIHZhbHVlLCB2YWx1ZSwgc3RyZWFtKTsKfQoKaW50CnRsdl9hZGRfbmxwaWQgKHN0cnVjdCBubHBpZHMgKm5scGlkcywgc3RydWN0IHN0cmVhbSAqc3RyZWFtKQp7CiAgcmV0dXJuIGFkZF90bHYgKFBST1RPQ09MU19TVVBQT1JURUQsIG5scGlkcy0+Y291bnQsIG5scGlkcy0+bmxwaWRzLCBzdHJlYW0pOwp9CgppbnQKdGx2X2FkZF9hdXRoaW5mbyAoY2hhciBhdXRoX3R5cGUsIGNoYXIgYXV0aF9sZW4sIHVfY2hhciAqYXV0aF92YWx1ZSwKCQkgIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSkKewogIHVfY2hhciB2YWx1ZVsyNTVdOwogIHVfY2hhciAqcG9zID0gdmFsdWU7CiAgKnBvcysrID0gYXV0aF90eXBlOwogIG1lbWNweSAocG9zLCBhdXRoX3ZhbHVlLCBhdXRoX2xlbik7CgogIHJldHVybiBhZGRfdGx2IChBVVRIX0lORk8sIGF1dGhfbGVuICsgMSwgdmFsdWUsIHN0cmVhbSk7Cn0KCmludAp0bHZfYWRkX2NoZWNrc3VtIChzdHJ1Y3QgY2hlY2tzdW0gKmNoZWNrc3VtLCBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pCnsKICB1X2NoYXIgdmFsdWVbMjU1XTsKICB1X2NoYXIgKnBvcyA9IHZhbHVlOwogIHJldHVybiBhZGRfdGx2IChDSEVDS1NVTSwgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOwp9CgppbnQKdGx2X2FkZF9pcF9hZGRycyAoc3RydWN0IGxpc3QgKmlwX2FkZHJzLCBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pCnsKICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CiAgc3RydWN0IHByZWZpeF9pcHY0ICppcHY0OwogIHVfY2hhciB2YWx1ZVsyNTVdOwogIHVfY2hhciAqcG9zID0gdmFsdWU7CiAgaW50IHJldHZhbDsKCiAgZm9yIChBTExfTElTVF9FTEVNRU5UU19STyAoaXBfYWRkcnMsIG5vZGUsIGlwdjQpKQogICAgewogICAgICBpZiAocG9zIC0gdmFsdWUgKyBJUFY0X01BWF9CWVRFTEVOID4gMjU1KQoJewoJICByZXR2YWwgPSBhZGRfdGx2IChJUFY0X0FERFIsIHBvcyAtIHZhbHVlLCB2YWx1ZSwgc3RyZWFtKTsKCSAgaWYgKHJldHZhbCAhPSBJU0lTX09LKQoJICAgIHJldHVybiByZXR2YWw7CgkgIHBvcyA9IHZhbHVlOwoJfQogICAgICAqKHVfaW50MzJfdCAqKSBwb3MgPSBpcHY0LT5wcmVmaXguc19hZGRyOwogICAgICBwb3MgKz0gSVBWNF9NQVhfQllURUxFTjsKICAgIH0KCiAgcmV0dXJuIGFkZF90bHYgKElQVjRfQUREUiwgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOwp9CgovKiBVc2VkIHRvIGFkZCBUTFYgY29udGFpbmluZyBqdXN0IG9uZSBJUHY0IGFkZHJlc3MgLSBlaXRoZXIgSVB2NCBhZGRyZXNzIFRMVgogKiAoaW4gY2FzZSBvZiBMU1ApIG9yIFRFIHJvdXRlciBJRCBUTFYuICovCmludAp0bHZfYWRkX2luX2FkZHIgKHN0cnVjdCBpbl9hZGRyICphZGRyLCBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0sIHVfY2hhciB0YWcpCnsKICB1X2NoYXIgdmFsdWVbMjU1XTsKICB1X2NoYXIgKnBvcyA9IHZhbHVlOwogIAogIG1lbWNweSAocG9zLCBhZGRyLCBJUFY0X01BWF9CWVRFTEVOKTsKICBwb3MgKz0gSVBWNF9NQVhfQllURUxFTjsKCiAgcmV0dXJuIGFkZF90bHYgKHRhZywgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOwp9CgppbnQKdGx2X2FkZF9keW5hbWljX2hvc3RuYW1lIChzdHJ1Y3QgaG9zdG5hbWUgKmhvc3RuYW1lLCBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pCnsKICByZXR1cm4gYWRkX3RsdiAoRFlOQU1JQ19IT1NUTkFNRSwgaG9zdG5hbWUtPm5hbWVsZW4sIGhvc3RuYW1lLT5uYW1lLAoJCSAgc3RyZWFtKTsKfQoKaW50CnRsdl9hZGRfbHNwX2VudHJpZXMgKHN0cnVjdCBsaXN0ICpsc3BzLCBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pCnsKICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CiAgc3RydWN0IGlzaXNfbHNwICpsc3A7CiAgdV9jaGFyIHZhbHVlWzI1NV07CiAgdV9jaGFyICpwb3MgPSB2YWx1ZTsKICBpbnQgcmV0dmFsOwoKICBmb3IgKEFMTF9MSVNUX0VMRU1FTlRTX1JPIChsc3BzLCBub2RlLCBsc3ApKQogICAgewogICAgICBpZiAocG9zIC0gdmFsdWUgKyBMU1BfRU5UUklFU19MRU4gPiAyNTUpCgl7CgkgIHJldHZhbCA9IGFkZF90bHYgKExTUF9FTlRSSUVTLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7CgkgIGlmIChyZXR2YWwgIT0gSVNJU19PSykKCSAgICByZXR1cm4gcmV0dmFsOwoJICBwb3MgPSB2YWx1ZTsKCX0KICAgICAgKigodV9pbnQxNl90ICopIHBvcykgPSBsc3AtPmxzcF9oZWFkZXItPnJlbV9saWZldGltZTsKICAgICAgcG9zICs9IDI7CiAgICAgIG1lbWNweSAocG9zLCBsc3AtPmxzcF9oZWFkZXItPmxzcF9pZCwgSVNJU19TWVNfSURfTEVOICsgMik7CiAgICAgIHBvcyArPSBJU0lTX1NZU19JRF9MRU4gKyAyOwogICAgICAqKCh1X2ludDMyX3QgKikgcG9zKSA9IGxzcC0+bHNwX2hlYWRlci0+c2VxX251bTsKICAgICAgcG9zICs9IDQ7CiAgICAgICooKHVfaW50MTZfdCAqKSBwb3MpID0gbHNwLT5sc3BfaGVhZGVyLT5jaGVja3N1bTsKICAgICAgcG9zICs9IDI7CiAgICB9CgogIHJldHVybiBhZGRfdGx2IChMU1BfRU5UUklFUywgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOwp9CgppbnQKdGx2X2FkZF9pcHY0X3JlYWNocyAoc3RydWN0IGxpc3QgKmlwdjRfcmVhY2hzLCBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pCnsKICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CiAgc3RydWN0IGlwdjRfcmVhY2hhYmlsaXR5ICpyZWFjaDsKICB1X2NoYXIgdmFsdWVbMjU1XTsKICB1X2NoYXIgKnBvcyA9IHZhbHVlOwogIGludCByZXR2YWw7CgogIGZvciAoQUxMX0xJU1RfRUxFTUVOVFNfUk8gKGlwdjRfcmVhY2hzLCBub2RlLCByZWFjaCkpCiAgICB7CiAgICAgIGlmIChwb3MgLSB2YWx1ZSArIElQVjRfUkVBQ0hfTEVOID4gMjU1KQoJewoJICByZXR2YWwgPQoJICAgIGFkZF90bHYgKElQVjRfSU5UX1JFQUNIQUJJTElUWSwgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOwoJICBpZiAocmV0dmFsICE9IElTSVNfT0spCgkgICAgcmV0dXJuIHJldHZhbDsKCSAgcG9zID0gdmFsdWU7Cgl9CiAgICAgICpwb3MgPSByZWFjaC0+bWV0cmljcy5tZXRyaWNfZGVmYXVsdDsKICAgICAgcG9zKys7CiAgICAgICpwb3MgPSByZWFjaC0+bWV0cmljcy5tZXRyaWNfZGVsYXk7CiAgICAgIHBvcysrOwogICAgICAqcG9zID0gcmVhY2gtPm1ldHJpY3MubWV0cmljX2V4cGVuc2U7CiAgICAgIHBvcysrOwogICAgICAqcG9zID0gcmVhY2gtPm1ldHJpY3MubWV0cmljX2Vycm9yOwogICAgICBwb3MrKzsKICAgICAgKih1X2ludDMyX3QgKikgcG9zID0gcmVhY2gtPnByZWZpeC5zX2FkZHI7CiAgICAgIHBvcyArPSBJUFY0X01BWF9CWVRFTEVOOwogICAgICAqKHVfaW50MzJfdCAqKSBwb3MgPSByZWFjaC0+bWFzay5zX2FkZHI7CiAgICAgIHBvcyArPSBJUFY0X01BWF9CWVRFTEVOOwogICAgfQoKCiAgcmV0dXJuIGFkZF90bHYgKElQVjRfSU5UX1JFQUNIQUJJTElUWSwgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOwp9CgppbnQKdGx2X2FkZF90ZV9pcHY0X3JlYWNocyAoc3RydWN0IGxpc3QgKnRlX2lwdjRfcmVhY2hzLCBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pCnsKICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CiAgc3RydWN0IHRlX2lwdjRfcmVhY2hhYmlsaXR5ICp0ZV9yZWFjaDsKICB1X2NoYXIgdmFsdWVbMjU1XTsKICB1X2NoYXIgKnBvcyA9IHZhbHVlOwogIHVfY2hhciBwcmVmaXhfc2l6ZTsKICBpbnQgcmV0dmFsOwoKICBmb3IgKEFMTF9MSVNUX0VMRU1FTlRTX1JPICh0ZV9pcHY0X3JlYWNocywgbm9kZSwgdGVfcmVhY2gpKQogICAgewogICAgICBwcmVmaXhfc2l6ZSA9ICgoKCh0ZV9yZWFjaC0+Y29udHJvbCAmIDB4M0YpIC0gMSkgPj4gMykgKyAxKTsKCiAgICAgIGlmIChwb3MgLSB2YWx1ZSArICg1ICsgcHJlZml4X3NpemUpID4gMjU1KQoJewoJICByZXR2YWwgPQoJICAgIGFkZF90bHYgKElQVjRfSU5UX1JFQUNIQUJJTElUWSwgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOwoJICBpZiAocmV0dmFsICE9IElTSVNfT0spCgkgICAgcmV0dXJuIHJldHZhbDsKCSAgcG9zID0gdmFsdWU7Cgl9CiAgICAgICoodV9pbnQzMl90ICopIHBvcyA9IHRlX3JlYWNoLT50ZV9tZXRyaWM7CiAgICAgIHBvcyArPSA0OwogICAgICAqcG9zID0gdGVfcmVhY2gtPmNvbnRyb2w7CiAgICAgIHBvcysrOwogICAgICBtZW1jcHkgKHBvcywgJnRlX3JlYWNoLT5wcmVmaXhfc3RhcnQsIHByZWZpeF9zaXplKTsKICAgICAgcG9zICs9IHByZWZpeF9zaXplOwogICAgfQoKICByZXR1cm4gYWRkX3RsdiAoVEVfSVBWNF9SRUFDSEFCSUxJVFksIHBvcyAtIHZhbHVlLCB2YWx1ZSwgc3RyZWFtKTsKfQoKI2lmZGVmIEhBVkVfSVBWNgppbnQKdGx2X2FkZF9pcHY2X2FkZHJzIChzdHJ1Y3QgbGlzdCAqaXB2Nl9hZGRycywgc3RydWN0IHN0cmVhbSAqc3RyZWFtKQp7CiAgc3RydWN0IGxpc3Rub2RlICpub2RlOwogIHN0cnVjdCBwcmVmaXhfaXB2NiAqaXB2NjsKICB1X2NoYXIgdmFsdWVbMjU1XTsKICB1X2NoYXIgKnBvcyA9IHZhbHVlOwogIGludCByZXR2YWw7CgogIGZvciAoQUxMX0xJU1RfRUxFTUVOVFNfUk8gKGlwdjZfYWRkcnMsIG5vZGUsIGlwdjYpKQogICAgewogICAgICBpZiAocG9zIC0gdmFsdWUgKyBJUFY2X01BWF9CWVRFTEVOID4gMjU1KQoJewoJICByZXR2YWwgPSBhZGRfdGx2IChJUFY2X0FERFIsIHBvcyAtIHZhbHVlLCB2YWx1ZSwgc3RyZWFtKTsKCSAgaWYgKHJldHZhbCAhPSBJU0lTX09LKQoJICAgIHJldHVybiByZXR2YWw7CgkgIHBvcyA9IHZhbHVlOwoJfQogICAgICBtZW1jcHkgKHBvcywgaXB2Ni0+cHJlZml4LnM2X2FkZHIsIElQVjZfTUFYX0JZVEVMRU4pOwogICAgICBwb3MgKz0gSVBWNl9NQVhfQllURUxFTjsKICAgIH0KCiAgcmV0dXJuIGFkZF90bHYgKElQVjZfQUREUiwgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOwp9CgppbnQKdGx2X2FkZF9pcHY2X3JlYWNocyAoc3RydWN0IGxpc3QgKmlwdjZfcmVhY2hzLCBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pCnsKICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CiAgc3RydWN0IGlwdjZfcmVhY2hhYmlsaXR5ICppcDZyZWFjaDsKICB1X2NoYXIgdmFsdWVbMjU1XTsKICB1X2NoYXIgKnBvcyA9IHZhbHVlOwogIGludCByZXR2YWwsIHByZWZpeF9vY3RldHM7CgogIGZvciAoQUxMX0xJU1RfRUxFTUVOVFNfUk8gKGlwdjZfcmVhY2hzLCBub2RlLCBpcDZyZWFjaCkpCiAgICB7CiAgICAgIGlmIChwb3MgLSB2YWx1ZSArIElQVjZfTUFYX0JZVEVMRU4gKyA2ID4gMjU1KQoJewoJICByZXR2YWwgPSBhZGRfdGx2IChJUFY2X1JFQUNIQUJJTElUWSwgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOwoJICBpZiAocmV0dmFsICE9IElTSVNfT0spCgkgICAgcmV0dXJuIHJldHZhbDsKCSAgcG9zID0gdmFsdWU7Cgl9CiAgICAgICoodWludDMyX3QgKikgcG9zID0gaXA2cmVhY2gtPm1ldHJpYzsKICAgICAgcG9zICs9IDQ7CiAgICAgICpwb3MgPSBpcDZyZWFjaC0+Y29udHJvbF9pbmZvOwogICAgICBwb3MrKzsKICAgICAgcHJlZml4X29jdGV0cyA9ICgoaXA2cmVhY2gtPnByZWZpeF9sZW4gKyA3KSAvIDgpOwogICAgICAqcG9zID0gaXA2cmVhY2gtPnByZWZpeF9sZW47CiAgICAgIHBvcysrOwogICAgICBtZW1jcHkgKHBvcywgaXA2cmVhY2gtPnByZWZpeCwgcHJlZml4X29jdGV0cyk7CiAgICAgIHBvcyArPSBwcmVmaXhfb2N0ZXRzOwogICAgfQoKICByZXR1cm4gYWRkX3RsdiAoSVBWNl9SRUFDSEFCSUxJVFksIHBvcyAtIHZhbHVlLCB2YWx1ZSwgc3RyZWFtKTsKfQojZW5kaWYgLyogSEFWRV9JUFY2ICovCgppbnQKdGx2X2FkZF9wYWRkaW5nIChzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pCnsKICBpbnQgZnVsbHBhZHMsIGksIGxlZnQ7CgogIC8qCiAgICogSG93IG1hbnkgdGltZXMgY2FuIHdlIGFkZCBmdWxsIHBhZGRpbmcgPwogICAqLwogIGZ1bGxwYWRzID0gKFNUUkVBTV9TSVpFIChzdHJlYW0pIC0gc3RyZWFtX2dldF9lbmRwIChzdHJlYW0pKSAvIDI1NzsKICBmb3IgKGkgPSAwOyBpIDwgZnVsbHBhZHM7IGkrKykKICAgIHsKICAgICAgaWYgKCFzdHJlYW1fcHV0YyAoc3RyZWFtLCAodV9jaGFyKSBQQURESU5HKSkJLyogVEFHICovCglnb3RvIGVycjsKICAgICAgaWYgKCFzdHJlYW1fcHV0YyAoc3RyZWFtLCAodV9jaGFyKSAyNTUpKQkvKiBMRU5HSFQgKi8KCWdvdG8gZXJyOwogICAgICBzdHJlYW1fcHV0IChzdHJlYW0sIE5VTEwsIDI1NSk7CQkvKiB6ZXJvIHBhZGRpbmcgKi8KICAgIH0KCiAgbGVmdCA9IFNUUkVBTV9TSVpFIChzdHJlYW0pIC0gc3RyZWFtX2dldF9lbmRwIChzdHJlYW0pOwoKICBpZiAobGVmdCA8IDIpCiAgICByZXR1cm4gSVNJU19PSzsKCiAgaWYgKGxlZnQgPT0gMikKICAgIHsKICAgICAgc3RyZWFtX3B1dGMgKHN0cmVhbSwgUEFERElORyk7CiAgICAgIHN0cmVhbV9wdXRjIChzdHJlYW0sIDApOwogICAgICByZXR1cm4gSVNJU19PSzsKICAgIH0KCiAgc3RyZWFtX3B1dGMgKHN0cmVhbSwgUEFERElORyk7CiAgc3RyZWFtX3B1dGMgKHN0cmVhbSwgbGVmdCAtIDIpOwogIHN0cmVhbV9wdXQgKHN0cmVhbSwgTlVMTCwgbGVmdC0yKTsKCiAgcmV0dXJuIElTSVNfT0s7CgplcnI6CiAgemxvZ193YXJuICgidGx2X2FkZF9wYWRkaW5nKCk6IG5vIHJvb20gZm9yIHRsdiIpOwogIHJldHVybiBJU0lTX1dBUk5JTkc7Cn0K