ZGlmZiAtLWdpdCBhL2lzaXNkL2lzaXNfdGx2LmMgYi9pc2lzZC9pc2lzX3Rsdi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MWNlZTkKLS0tIC9kZXYvbnVsbAorKysgYi9pc2lzZC9pc2lzX3Rsdi5jCkBAIC0wLDAgKzEsMTAxNCBAQAorLyoKKyAqIElTLUlTIFJvdXQoZSlpbmcgcHJvdG9jb2wgLSBpc2lzX3Rsdi5jCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVMtSVMgVExWIHJlbGF0ZWQgcm91dGluZXMKKyAqCisgKiBDb3B5cmlnaHQgKEMpIDIwMDEsMjAwMiAgIFNhbXBvIFNhYXJpc3RvCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIFRhbXBlcmUgVW5pdmVyc2l0eSBvZiBUZWNobm9sb2d5ICAgICAgCisgKiAgICAgICAgICAgICAgICAgICAgICAgICAgIEluc3RpdHV0ZSBvZiBDb21tdW5pY2F0aW9ucyBFbmdpbmVlcmluZworICoKKyAqIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5IGl0IAorICogdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZWFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSAKKyAqIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDIgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgCisgKiBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCxidXQgV0lUSE9VVCAKKyAqIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciAKKyAqIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgCisgKiBtb3JlIGRldGFpbHMuCisKKyAqIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFsb25nIAorICogd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLiwgCisgKiA1OSBUZW1wbGUgUGxhY2UgLSBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcsIFVTQS4KKyAqLworCisjaW5jbHVkZSA8emVicmEuaD4KKyNpbmNsdWRlIDxuZXQvZXRoZXJuZXQuaD4KKworI2luY2x1ZGUgImxvZy5oIgorI2luY2x1ZGUgImxpbmtsaXN0LmgiCisjaW5jbHVkZSAic3RyZWFtLmgiCisjaW5jbHVkZSAibWVtb3J5LmgiCisjaW5jbHVkZSAicHJlZml4LmgiCisjaW5jbHVkZSAidnR5LmgiCisjaW5jbHVkZSAiaWYuaCIKKworI2luY2x1ZGUgImlzaXNkL2RpY3QuaCIKKyNpbmNsdWRlICJpc2lzZC9pc2lzX2NvbnN0YW50cy5oIgorI2luY2x1ZGUgImlzaXNkL2lzaXNfY29tbW9uLmgiCisjaW5jbHVkZSAiaXNpc2QvaXNpc19mbGFncy5oIgorI2luY2x1ZGUgImlzaXNkL2lzaXNfY2lyY3VpdC5oIgorI2luY2x1ZGUgImlzaXNkL2lzaXNfdGx2LmgiCisjaW5jbHVkZSAiaXNpc2QvaXNpc2QuaCIKKyNpbmNsdWRlICJpc2lzZC9pc2lzX2R5bmhuLmgiCisjaW5jbHVkZSAiaXNpc2QvaXNpc19taXNjLmgiCisjaW5jbHVkZSAiaXNpc2QvaXNpc19wZHUuaCIKKyNpbmNsdWRlICJpc2lzZC9pc2lzX2xzcC5oIgorCitleHRlcm4gc3RydWN0IGlzaXMgKmlzaXM7CisKK3ZvaWQKK2ZyZWVfdGx2ICh2b2lkICp2YWwpCit7CisgICAgWEZSRUUgKE1UWVBFX0lTSVNfVExWLCB2YWwpOworICAgIAorICAgIHJldHVybjsKK30KKworLyoKKyAqIENhbGxlZCBhZnRlciBwYXJzaW5nIG9mIGEgUERVLiBUaGVyZSBzaG91bGRuJ3QgYmUgYW55IHRsdidzIGxlZnQsIHNvIHRoaXMKKyAqIGlzIG9ubHkgYSBjYXV0aW9uIHRvIGF2b2lkIG1lbW9yeSBsZWFrcworICovCit2b2lkIAorZnJlZV90bHZzIChzdHJ1Y3QgdGx2cyAqdGx2cykKK3sKKyAgaWYgKHRsdnMtPmFyZWFfYWRkcnMpIHsKKyAgICBsaXN0X2RlbGV0ZSAodGx2cy0+YXJlYV9hZGRycyk7CisgIH0KKyAgaWYgKHRsdnMtPmlzX25laWdocykgeworICAgIGxpc3RfZGVsZXRlICh0bHZzLT5pc19uZWlnaHMpOworICB9CisgIGlmICh0bHZzLT50ZV9pc19uZWlnaHMpIHsKKyAgICBsaXN0X2RlbGV0ZSAodGx2cy0+dGVfaXNfbmVpZ2hzKTsKKyAgfQorICBpZiAodGx2cy0+ZXNfbmVpZ2hzKSB7CisgICAgbGlzdF9kZWxldGUgKHRsdnMtPmVzX25laWdocyk7CisgIH0KKyAgaWYgKHRsdnMtPmxzcF9lbnRyaWVzKSB7CisgICAgbGlzdF9kZWxldGUgKHRsdnMtPmxzcF9lbnRyaWVzKTsKKyAgfSAgCisgIGlmICh0bHZzLT5sYW5fbmVpZ2hzKSB7CisgICAgbGlzdF9kZWxldGUgKHRsdnMtPmxhbl9uZWlnaHMpOworICB9CisgIGlmICh0bHZzLT5wcmVmaXhfbmVpZ2hzKSB7CisgICAgbGlzdF9kZWxldGUgKHRsdnMtPnByZWZpeF9uZWlnaHMpOworICB9CisgIGlmICh0bHZzLT5pcHY0X2FkZHJzKSB7CisgICAgbGlzdF9kZWxldGUgKHRsdnMtPmlwdjRfYWRkcnMpOworICB9CisgIGlmICh0bHZzLT5pcHY0X2ludF9yZWFjaHMpIHsKKyAgICBsaXN0X2RlbGV0ZSAodGx2cy0+aXB2NF9pbnRfcmVhY2hzKTsKKyAgfQorICBpZiAodGx2cy0+aXB2NF9leHRfcmVhY2hzKSB7CisgICAgbGlzdF9kZWxldGUgKHRsdnMtPmlwdjRfZXh0X3JlYWNocyk7CisgIH0KKyAgaWYgKHRsdnMtPnRlX2lwdjRfcmVhY2hzKSB7CisgICAgbGlzdF9kZWxldGUgKHRsdnMtPnRlX2lwdjRfcmVhY2hzKTsKKyAgfQorI2lmZGVmIEhBVkVfSVBWNgorICBpZiAodGx2cy0+aXB2Nl9hZGRycykgeworICAgIGxpc3RfZGVsZXRlICh0bHZzLT5pcHY2X2FkZHJzKTsKKyAgfQorICBpZiAodGx2cy0+aXB2Nl9yZWFjaHMpIHsKKyAgICBsaXN0X2RlbGV0ZSAodGx2cy0+aXB2Nl9yZWFjaHMpOworICB9CisjZW5kaWYgLyogSEFWRV9JUFY2ICovCisgIHJldHVybjsKK30KKworLyoKKyAqIFBhcnNlcyB0aGUgdGx2cyBmb3VuZCBpbiB0aGUgdmFyaWFudCBsZW5ndGggcGFydCBvZiB0aGUgUERVLgorICogQ2FsbGVyIHRlbGxzIHdpdGggZmxhZ3MgaW4gImV4cGVjdGVkIiB3aGljaCBUTFYncyBpdCBpcyBpbnRlcmVzdGVkIGluLgorICovCitpbnQgCitwYXJzZV90bHZzIChjaGFyICphcmVhdGFnLCB1X2NoYXIgKnN0cmVhbSwgaW50IHNpemUsIHVfaW50MzJfdCAqZXhwZWN0ZWQsIAorCSAgICB1X2ludDMyX3QgKmZvdW5kLCBzdHJ1Y3QgdGx2cyAqdGx2cykKK3sKKyAgdV9jaGFyICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlLCBsZW5ndGg7CisgIHN0cnVjdCBsYW5fbmVpZ2ggICAgICAgICAgICAgICAgICAgICpsYW5fbmVpOworICBzdHJ1Y3QgYXJlYV9hZGRyICAgICAgICAgICAgICAgICAgKmFyZWFfYWRkcjsKKyAgc3RydWN0IGlzX25laWdoICAgICAgICAgICAgICAgICAgICAgICppc19uZWk7CisgIHN0cnVjdCB0ZV9pc19uZWlnaCAgICAgICAgICAgICAgICAqdGVfaXNfbmVpOworICBzdHJ1Y3QgZXNfbmVpZ2ggICAgICAgICAgICAgICAgICAgICAgKmVzX25laTsKKyAgc3RydWN0IGxzcF9lbnRyeSAgICAgICAgICAgICAgICAgICpsc3BfZW50cnk7CisgIHN0cnVjdCBpbl9hZGRyICAgICAgICAgICAgICAgICAgICAqaXB2NF9hZGRyOworICBzdHJ1Y3QgaXB2NF9yZWFjaGFiaWxpdHkgICAgICAgICAqaXB2NF9yZWFjaDsKKyAgc3RydWN0IHRlX2lwdjRfcmVhY2hhYmlsaXR5ICAgKnRlX2lwdjRfcmVhY2g7CisjaWZkZWYgSEFWRV9JUFY2CisgIHN0cnVjdCBpbjZfYWRkciAgICAgICAgICAgICAgICAgICAqaXB2Nl9hZGRyOworICBzdHJ1Y3QgaXB2Nl9yZWFjaGFiaWxpdHkgICAgICAgICAqaXB2Nl9yZWFjaDsKKyAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeF9vY3RldHM7CisjZW5kaWYgLyogSEFWRV9JUFY2ICovCisgIHVfY2hhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aXJ0dWFsOworICBpbnQgICAgICAgICAgICAgIHZhbHVlX2xlbiwgcmV0dmFsID0gSVNJU19PSzsKKyAgdV9jaGFyICAgICAgICAgICAgICAgICAgICpwbnQgPSBzdHJlYW07CisKKyAgKmZvdW5kID0gMDsKKyAgbWVtc2V0ICh0bHZzLCAwLCBzaXplb2YgKHN0cnVjdCB0bHZzKSk7CisgIAorICB3aGlsZSAocG50IDwgc3RyZWFtICsgc2l6ZSAtIDIpIHsKKyAgICB0eXBlID0gKnBudDsKKyAgICBsZW5ndGggPSAqKHBudCsxKTsKKyAgICBwbnQgKz0gMjsKKyAgICB2YWx1ZV9sZW4gPSAwOworICAgIGlmICggcG50ICsgbGVuZ3RoID4gc3RyZWFtICsgc2l6ZSApIHsKKyAgICAgIHpsb2dfd2FybiAoIklTSVMtVExWICglcyk6IFRMViAodHlwZSAlZCwgbGVuZ3RoICVkKSBleGNlZWRzIHBhY2tldCAiCisJCSAiYm91bmRhcmllcyIsIGFyZWF0YWcsIHR5cGUsIGxlbmd0aCk7CisgICAgICByZXR2YWwgPSBJU0lTX1dBUk5JTkc7CisgICAgICBicmVhazsKKyAgICB9CisgICAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBBUkVBX0FERFJFU1NFUzoKKyAgICAgIC8qICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisgICAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBMZW5ndGggICAgICAgICAgICAgICAgICAgICAgICAgfCAKKyAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisgICAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIEFyZWEgQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgfCAKKyAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisgICAgICAgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICovCisgICAgICAqZm91bmQgfD0gVExWRkxBR19BUkVBX0FERFJTOworI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCisgICAgICB6bG9nX2luZm8gKCJUTFYgQXJlYSBBZHJlc3NlcyBsZW4gJWQiLCBsZW5ndGgpOworI2VuZGlmIC8qIEVYVFJFTUVfVExWX0RFQlVHICovCisgICAgICBpZiAoKmV4cGVjdGVkICYgVExWRkxBR19BUkVBX0FERFJTKSB7CisgICAgICAgIHdoaWxlIChsZW5ndGggPiB2YWx1ZV9sZW4pIHsKKyAgICAgICAgICBhcmVhX2FkZHIgPSAoc3RydWN0IGFyZWFfYWRkciopcG50OworICAgICAgICAgIHZhbHVlX2xlbiArPSBhcmVhX2FkZHItPmFkZHJfbGVuICsgMTsKKyAgICAgICAgICBwbnQgKz0gIGFyZWFfYWRkci0+YWRkcl9sZW4gKyAxOworICAgICAgICAgIGlmICghdGx2cy0+YXJlYV9hZGRycykgdGx2cy0+YXJlYV9hZGRycyA9IGxpc3RfbmV3ICgpOworICAgICAgICAgIGxpc3Rub2RlX2FkZCAodGx2cy0+YXJlYV9hZGRycywgYXJlYV9hZGRyKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcG50ICs9IGxlbmd0aDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBJU19ORUlHSEJPVVJTOgorICAgICAgKmZvdW5kIHw9IFRMVkZMQUdfSVNfTkVJR0hTOworI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCisgICAgICB6bG9nX2luZm8gKCJJU0lTLVRMViAoJXMpOiBJUyBOZWlnaGJvdXJzIGxlbmd0aCAlZCIsCisJCSBhcmVhdGFnLAorCQkgbGVuZ3RoKTsKKyNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLworICAgICAgaWYgKFRMVkZMQUdfSVNfTkVJR0hTICYgKmV4cGVjdGVkKSB7CisgICAgICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworICAgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIFZpcnR1YWwgRmxhZyAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgCisgICAgICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworICAgICAgICovCisgICAgICAgIHZpcnR1YWwgPSAqcG50OyAvKiBGSVhNRTogd2hhdCBpcyB0aGUgdXNlIGZvciB0aGlzPyAqLworICAgICAgICBwbnQrKzsKKyAgICAgICAgdmFsdWVfbGVuICsrOworICAgICAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKyAgICAgICAqIHwgICAwICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRGVmYXVsdCBNZXRyaWMgICAgICAgICAgICAgICAgICB8IAorICAgICAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKyAgICAgICAqIHwgICBTICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRGVsYXkgTWV0cmljICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworICAgICAgICogfCAgIFMgICB8ICBJL0UgIHwgICAgICAgICAgICAgICBFeHBlbnNlIE1ldHJpYyAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisgICAgICAgKiB8ICAgUyAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIEVycm9yIE1ldHJpYyAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKyAgICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBOZWlnaGJvdXIgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICogOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAqLworICAgICAgICB3aGlsZSAobGVuZ3RoID4gdmFsdWVfbGVuKSB7CisgICAgICAgICAgaXNfbmVpID0gKHN0cnVjdCBpc19uZWlnaCopcG50OworICAgICAgICAgIHZhbHVlX2xlbiArPSA0ICsgSVNJU19TWVNfSURfTEVOICsgMTsKKyAgICAgICAgICBwbnQgKz0gNCArIElTSVNfU1lTX0lEX0xFTiArIDE7CisgICAgICAgICAgaWYgKCF0bHZzLT5pc19uZWlnaHMpIHRsdnMtPmlzX25laWdocyA9IGxpc3RfbmV3ICgpOworICAgICAgICAgIGxpc3Rub2RlX2FkZCAodGx2cy0+aXNfbmVpZ2hzLCBpc19uZWkpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBwbnQgKz0gbGVuZ3RoOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRFX0lTX05FSUdIQk9VUlM6CisgICAgICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworICAgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIE5laWdoYm91ciBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNworICAgICAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBURSBNZXRyaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDMKKyAgICAgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgU3ViVExWcyBMZW5ndGggICAgICAgICAgICAgICAgICAgICAgICAgfCAxCisgICAgICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICogOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAqLworICAgICAgKmZvdW5kIHw9IFRMVkZMQUdfVEVfSVNfTkVJR0hTOworI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCisgICAgICB6bG9nX2luZm8gKCJJU0lTLVRMViAoJXMpOiBFeHRlbmRlZCBJUyBOZWlnaGJvdXJzIGxlbmd0aCAlZCIsCisJCSBhcmVhdGFnLAorCQkgbGVuZ3RoKTsKKyNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLworICAgICAgaWYgKFRMVkZMQUdfVEVfSVNfTkVJR0hTICYgKmV4cGVjdGVkKSB7CisgICAgICAgIHdoaWxlIChsZW5ndGggPiB2YWx1ZV9sZW4pIHsKKyAgICAgICAgICB0ZV9pc19uZWkgPSAoc3RydWN0IHRlX2lzX25laWdoKilwbnQ7CisgICAgICAgICAgdmFsdWVfbGVuICs9IDExOworICAgICAgICAgIHBudCArPSAxMTsKKyAgICAgICAgICAvKiBGSVhNRSAtIHN1YnRsdnMgYXJlIGhhbmRsZWQgaGVyZSwgZm9yIG5vdyB3ZSBza2lwICovCisgICAgICAgICAgdmFsdWVfbGVuICs9IHRlX2lzX25laS0+c3ViX3RsdnNfbGVuZ3RoOworICAgICAgICAgIHBudCArPSB0ZV9pc19uZWktPnN1Yl90bHZzX2xlbmd0aDsKKworCisgICAgICAgICAgaWYgKCF0bHZzLT50ZV9pc19uZWlnaHMpIHRsdnMtPnRlX2lzX25laWdocyA9IGxpc3RfbmV3ICgpOworICAgICAgICAgIGxpc3Rub2RlX2FkZCAodGx2cy0+dGVfaXNfbmVpZ2hzLCB0ZV9pc19uZWkpOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBwbnQgKz0gbGVuZ3RoOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIEVTX05FSUdIQk9VUlM6IAorICAgICAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKyAgICAgICAqIHwgICAwICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRGVmYXVsdCBNZXRyaWMgICAgICAgICAgICAgICAgICB8IAorICAgICAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKyAgICAgICAqIHwgICBTICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRGVsYXkgTWV0cmljICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworICAgICAgICogfCAgIFMgICB8ICBJL0UgIHwgICAgICAgICAgICAgICBFeHBlbnNlIE1ldHJpYyAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisgICAgICAgKiB8ICAgUyAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIEVycm9yIE1ldHJpYyAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKyAgICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBOZWlnaGJvdXIgSUQgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIE5laWdoYm91ciBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICovCisjaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKKyAgICAgIHpsb2dfaW5mbyAoIklTSVMtVExWICglcyk6IEVTIE5laWdoYm91cnMgbGVuZ3RoICVkIiwKKwkJIGFyZWF0YWcsCisJCSBsZW5ndGgpOworI2VuZGlmIC8qIEVYVFJFTUVfVExWX0RFQlVHICovCisgICAgICAqZm91bmQgfD0gVExWRkxBR19FU19ORUlHSFM7CisgICAgICBpZiAoKmV4cGVjdGVkICYgVExWRkxBR19FU19ORUlHSFMpIHsKKyAgICAgICAgZXNfbmVpID0gKHN0cnVjdCBlc19uZWlnaCopcG50OworICAgICAgICB2YWx1ZV9sZW4gKz0gNDsKKyAgICAgICAgcG50ICs9IDQ7CisgICAgICAgIHdoaWxlIChsZW5ndGggPiB2YWx1ZV9sZW4pIHsKKyAgICAgICAgLyogRklYTUUgRklYTUUgRklYTUUgLSBhZGQgdG8gdGhlIGxpc3QgKi8KKwkvKiAgICAgICAgICBzeXNfaWQtPmlkID0gcG50OyovCisgICAgICAgICAgdmFsdWVfbGVuICs9IElTSVNfU1lTX0lEX0xFTjsKKyAgICAgICAgICBwbnQgKz0gSVNJU19TWVNfSURfTEVOOworICAgICAgICAvKiAgaWYgKCFlc19uZWktPm5laWdoX2lkcykgZXNfbmVpLT5uZWlnaF9pZHMgPSBzeXNpZDsqLworICAgICAgICB9CisgICAgICAgIGlmICghdGx2cy0+ZXNfbmVpZ2hzKSB0bHZzLT5lc19uZWlnaHMgPSBsaXN0X25ldyAoKTsKKyAgICAgICAgbGlzdG5vZGVfYWRkICh0bHZzLT5lc19uZWlnaHMsIGVzX25laSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBwbnQgKz0gbGVuZ3RoOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExBTl9ORUlHSEJPVVJTOgorICAgICAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKyAgICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBMQU4gQWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IAorICAgICAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKyAgICAgICAqIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgKi8KKyAgICAgICpmb3VuZCB8PSBUTFZGTEFHX0xBTl9ORUlHSFM7CisgICAgICAjaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKKyAgICAgIHpsb2dfaW5mbyAoIklTSVMtVExWICglcyk6IExBTiBOZWlnYm91cnMgbGVuZ3RoICVkIiwKKwkJIGFyZWF0YWcsCisJCSBsZW5ndGgpOworICAgICAgI2VuZGlmIC8qIEVYVFJFTUVfVExWX0RFQlVHICovCisgICAgICBpZiAoVExWRkxBR19MQU5fTkVJR0hTICYgKmV4cGVjdGVkKSB7CisgICAgICAgIHdoaWxlIChsZW5ndGggPiB2YWx1ZV9sZW4pIHsKKyAgICAgICAgICBsYW5fbmVpID0gKHN0cnVjdCBsYW5fbmVpZ2gqKXBudDsKKyAgICAgICAgICBpZiAoIXRsdnMtPmxhbl9uZWlnaHMpIHRsdnMtPmxhbl9uZWlnaHMgPSBsaXN0X25ldyAoKTsKKyAgICAgICAgICBsaXN0bm9kZV9hZGQgKHRsdnMtPmxhbl9uZWlnaHMsIGxhbl9uZWkpOworICAgICAgICAgIHZhbHVlX2xlbiArPSBFVEhfQUxFTjsKKyAgICAgICAgICBwbnQgKz0gRVRIX0FMRU47CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHBudCArPSBsZW5ndGg7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgUEFERElORzoKKyNpZmRlZiBFWFRSRU1FX1RMVl9ERUJVRworICAgICAgemxvZ19pbmZvICgiVExWIHBhZGRpbmcgJWQiLCBsZW5ndGgpOworI2VuZGlmIC8qIEVYVFJFTUVfVExWX0RFQlVHICovCisgICAgICBwbnQgKz0gbGVuZ3RoOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIExTUF9FTlRSSUVTOgorICAgICAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKyAgICAgICAqIHwgICAgICAgICAgICAgICAgICAgICBSZW1haW5pbmcgTGlmZXRpbWUgICAgICAgICAgICAgICAgICAgICAgICB8IDIKKyAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisgICAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIExTUCBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCBpZCsyCisgICAgICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworICAgICAgICogfCAgICAgICAgICAgICAgICAgICBMU1AgU2VxdWVuY2UgTnVtYmVyICAgICAgICAgICAgICAgICAgICAgICAgIHygNAorICAgICAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKyAgICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBDaGVja3N1bSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDIKKyAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisgICAgICAgKi8KKyNpZmRlZiBFWFRSRU1FX1RMVl9ERUJVRworICAgICAgemxvZ19pbmZvICgiTFNQIEVudHJpZXMgbGVuZ3RoICVkIiwKKwkJIGFyZWF0YWcsCisJCSBsZW5ndGgpOworI2VuZGlmIC8qIEVYVFJFTUVfVExWX0RFQlVHICovCisgICAgICAqZm91bmQgfD0gVExWRkxBR19MU1BfRU5UUklFUzsKKyAgICAgIGlmIChUTFZGTEFHX0xTUF9FTlRSSUVTICYgKmV4cGVjdGVkKSB7CisgICAgICAgIHdoaWxlIChsZW5ndGggPiB2YWx1ZV9sZW4pIHsKKyAgICAgICAgICBsc3BfZW50cnkgPSAoc3RydWN0IGxzcF9lbnRyeSopcG50OworICAgICAgICAgIHZhbHVlX2xlbiArPSAxMCArIElTSVNfU1lTX0lEX0xFTjsKKyAgICAgICAgICBwbnQgKz0gIDEwICsgSVNJU19TWVNfSURfTEVOOworICAgICAgICAgIGlmICghdGx2cy0+bHNwX2VudHJpZXMpIHRsdnMtPmxzcF9lbnRyaWVzID0gbGlzdF9uZXcgKCk7CisgICAgICAgICAgbGlzdG5vZGVfYWRkICh0bHZzLT5sc3BfZW50cmllcywgbHNwX2VudHJ5KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcG50ICs9IGxlbmd0aDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBDSEVDS1NVTToKKyAgICAgIC8qICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisgICAgICAgKiB8ICAgICAgICAgICAgICAgICAgIDE2IGJpdCBmbGV0Y2hlciBDSEVDS1NVTSAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKyAgICAgICAqIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgKi8KKyAgICAgICpmb3VuZCB8PSBUTFZGTEFHX0NIRUNLU1VNOworI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCisgICAgICB6bG9nX2luZm8gKCJJU0lTLVRMViAoJXMpOiBDaGVja3N1bSBsZW5ndGggJWQiLAorCQkgYXJlYXRhZywKKwkJIGxlbmd0aCk7CisjZW5kaWYgLyogRVhUUkVNRV9UTFZfREVCVUcgKi8KKyAgICAgIGlmICgqZXhwZWN0ZWQgJiBUTFZGTEFHX0NIRUNLU1VNKSB7CisgICAgICAgIHRsdnMtPmNoZWNrc3VtID0gKHN0cnVjdCBjaGVja3N1bSopcG50OworICAgICAgfQorICAgICAgcG50ICs9IGxlbmd0aDsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBQUk9UT0NPTFNfU1VQUE9SVEVEOgorICAgICAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKyAgICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgIE5MUElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8CisgICAgICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworICAgICAgICogOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAqLworICAgICAgKmZvdW5kIHw9IFRMVkZMQUdfTkxQSUQ7CisjaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKKyAgICAgIHpsb2dfaW5mbyAoIklTSVMtVExWICglcyk6IFByb3RvY29scyBTdXBwb3J0ZWQgbGVuZ3RoICVkIiwKKwkJIGFyZWF0YWcsCisJCSBsZW5ndGgpOworI2VuZGlmIC8qIEVYVFJFTUVfVExWX0RFQlVHICovCisgICAgICBpZiAoKmV4cGVjdGVkICYgVExWRkxBR19OTFBJRCkgeworICAgICAgICB0bHZzLT5ubHBpZHMgPSAoc3RydWN0IG5scGlkcyopKHBudC0xKTsKKyAgICAgIH0KKyAgICAgIHBudCArPSBsZW5ndGg7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSVBWNF9BRERSOgorICAgICAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKyAgICAgICAqICsgICAgICAgICAgICAgICAgIElQIHZlcnNpb24gNCBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICArIDQKKyAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisgICAgICAgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICovCisgICAgICAqZm91bmQgfD0gVExWRkxBR19JUFY0X0FERFI7CisjaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKKyAgICAgIHpsb2dfaW5mbyAoIklTSVMtVExWICglcyk6IElQdjQgQWRkcmVzcyBsZW5ndGggJWQiLAorCQkgYXJlYXRhZywKKwkJIGxlbmd0aCk7CisjZW5kaWYgLyogRVhUUkVNRV9UTFZfREVCVUcgKi8KKyAgICAgIGlmICgqZXhwZWN0ZWQgJiBUTFZGTEFHX0lQVjRfQUREUikgeworICAgICAgICB3aGlsZSAobGVuZ3RoID4gdmFsdWVfbGVuKSB7CisgICAgICAgICAgaXB2NF9hZGRyID0gKHN0cnVjdCBpbl9hZGRyKilwbnQ7CisJICB6bG9nX2luZm8gKCJJU0lTLVRMViAoJXMpIDogSVAgQUREUiAlcywgcG50ICVwIiwgYXJlYXRhZywgCisJCSAgICAgaW5ldF9udG9hICgqaXB2NF9hZGRyKSwgcG50KTsKKyAgICAgICAgICBpZiAoIXRsdnMtPmlwdjRfYWRkcnMpIHRsdnMtPmlwdjRfYWRkcnMgPSBsaXN0X25ldygpOworICAgICAgICAgIGxpc3Rub2RlX2FkZCAodGx2cy0+aXB2NF9hZGRycywgaXB2NF9hZGRyKTsKKyAgICAgICAgICB2YWx1ZV9sZW4gKz0gNDsKKyAgICAgICAgICBwbnQgKz0gNDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcG50ICs9IGxlbmd0aDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBBVVRIX0lORk86CisgICAgICAqZm91bmQgfD0gVExWRkxBR19BVVRIX0lORk87CisjaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKKyAgICAgIHpsb2dfaW5mbyAoIklTSVMtVExWICglcyk6IElTLUlTIEF1dGhlbnRpY2F0aW9uIEluZm9ybWF0aW9uIiwKKwkJIGFyZWF0YWcpOworI2VuZGlmCisgICAgICBpZiAoKmV4cGVjdGVkICYgVExWRkxBR19BVVRIX0lORk8pIHsKKwl0bHZzLT5hdXRoX2luZm8udHlwZSA9ICpwbnQ7CisJcG50Kys7CisJbWVtY3B5ICh0bHZzLT5hdXRoX2luZm8ucGFzc3dkLCBwbnQsIGxlbmd0aCAtIDEpOworCXBudCArPSBsZW5ndGggLSAxOworICAgICAgfQorICAgICAgZWxzZSB7CisJcG50ICs9IGxlbmd0aDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBEWU5BTUlDX0hPU1ROQU1FOgorICAgICAgKmZvdW5kIHw9IFRMVkZMQUdfRFlOX0hPU1ROQU1FOworI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCisgICAgICB6bG9nX2luZm8gKCJJU0lTLVRMViAoJXMpOiBEeW5hbWljIEhvc3RuYW1lIGxlbmd0aCAlZCIsCisJCSBhcmVhdGFnLAorCQkgbGVuZ3RoKTsKKyNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLworICAgICAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfRFlOX0hPU1ROQU1FKSB7CisJLyogdGhlIGxlbmd0aCBpcyBhbHNvIGluY2x1ZGVkIGluIHRoZSBwb2ludGVkIHN0cnVjdCAqLworICAgICAgICB0bHZzLT5ob3N0bmFtZSA9IChzdHJ1Y3QgaG9zdG5hbWUqKShwbnQgLSAxKTsgCisgICAgICB9CisgICAgICBwbnQgKz0gbGVuZ3RoOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIFRFX1JPVVRFUl9JRDoKKyAgICAgIC8qICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgKiArICAgICAgICAgICAgICAgICAgICAgICAgIFJvdXRlciBJRCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyA0CisgICAgICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICovCisgICAgICAqZm91bmQgfD0gVExWRkxBR19URV9ST1VURVJfSUQ7CisjaWZkZWYgRVhUUkVNRV9UTFZfREVCVUcKKyAgICAgIHpsb2dfaW5mbyAoIklTSVMtVExWICglcyk6IFRFIFJvdXRlciBJRCAlZCIsCisJCSBhcmVhdGFnLAorCQkgbGVuZ3RoKTsKKyNlbmRpZiAvKiBFWFRSRU1FX1RMVl9ERUJVRyAqLworICAgICAgaWYgKCpleHBlY3RlZCAmIFRMVkZMQUdfVEVfUk9VVEVSX0lEKSB7CisgICAgICAgIHRsdnMtPnJvdXRlcl9pZCA9IChzdHJ1Y3QgdGVfcm91dGVyX2lkKikocG50KTsKKyAgICAgIH0KKyAgICAgIHBudCArPSBsZW5ndGg7CisgICAgICBicmVhazsKKworICAgIGNhc2UgSVBWNF9JTlRfUkVBQ0hBQklMSVRZOgorICAgICAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKyAgICAgICAqIHwgICAwICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRGVmYXVsdCBNZXRyaWMgICAgICAgICAgICAgICAgICB8IDEKKyAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisgICAgICAgKiB8ICAgUyAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIERlbGF5IE1ldHJpYyAgICAgICAgICAgICAgICAgICAgfCAxCisgICAgICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworICAgICAgICogfCAgIFMgICB8ICBJL0UgIHwgICAgICAgICAgICAgICBFeHBlbnNlIE1ldHJpYyAgICAgICAgICAgICAgICAgIHwgMQorICAgICAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKyAgICAgICAqIHwgICBTICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRXJyb3IgTWV0cmljICAgICAgICAgICAgICAgICAgICB8IDEKKyAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisgICAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgaXAgYWRkcmVzcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCA0CisgICAgICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIGFkZHJlc3MgbWFzayAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNAorICAgICAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAqIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgKi8KKyAgICAgICpmb3VuZCB8PSBUTFZGTEFHX0lQVjRfSU5UX1JFQUNIQUJJTElUWTsKKyNpZmRlZiBFWFRSRU1FX1RMVl9ERUJVRworICAgICAgemxvZ19pbmZvICgiSVNJUy1UTFYgKCVzKTogSVB2NCBpbnRlcm5hbCBSZWFjaGFiaWxpdHkgbGVuZ3RoICVkIiwKKwkJIGFyZWF0YWcsCisJCSBsZW5ndGgpOworI2VuZGlmIC8qIEVYVFJFTUVfVExWX0RFQlVHICovCisgICAgICBpZiAoKmV4cGVjdGVkICYgVExWRkxBR19JUFY0X0lOVF9SRUFDSEFCSUxJVFkpIHsKKyAgICAgICAgd2hpbGUgKGxlbmd0aCA+IHZhbHVlX2xlbikgeworICAgICAgICAgIGlwdjRfcmVhY2ggPSAoc3RydWN0IGlwdjRfcmVhY2hhYmlsaXR5KilwbnQ7CisgICAgICAgICAgaWYgKCF0bHZzLT5pcHY0X2ludF9yZWFjaHMpIHRsdnMtPmlwdjRfaW50X3JlYWNocyA9IGxpc3RfbmV3KCk7CisgICAgICAgICAgbGlzdG5vZGVfYWRkICh0bHZzLT5pcHY0X2ludF9yZWFjaHMsIGlwdjRfcmVhY2gpOworICAgICAgICAgIHZhbHVlX2xlbiArPSAxMjsKKyAgICAgICAgICBwbnQgKz0gMTI7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworICAgICAgICBwbnQgKz0gbGVuZ3RoOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIElQVjRfRVhUX1JFQUNIQUJJTElUWToKKyAgICAgIC8qICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisgICAgICAgKiB8ICAgMCAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIERlZmF1bHQgTWV0cmljICAgICAgICAgICAgICAgICAgfCAxCisgICAgICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworICAgICAgICogfCAgIFMgICB8ICBJL0UgIHwgICAgICAgICAgICAgICBEZWxheSBNZXRyaWMgICAgICAgICAgICAgICAgICAgIHwgMQorICAgICAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKyAgICAgICAqIHwgICBTICAgfCAgSS9FICB8ICAgICAgICAgICAgICAgRXhwZW5zZSBNZXRyaWMgICAgICAgICAgICAgICAgICB8IDEKKyAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisgICAgICAgKiB8ICAgUyAgIHwgIEkvRSAgfCAgICAgICAgICAgICAgIEVycm9yIE1ldHJpYyAgICAgICAgICAgICAgICAgICAgfCAxCisgICAgICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworICAgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIGlwIGFkZHJlc3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNAorICAgICAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBhZGRyZXNzIG1hc2sgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDQKKyAgICAgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgKiA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICovCisgICAgICAqZm91bmQgfD0gVExWRkxBR19URV9JUFY0X1JFQUNIQUJJTElUWTsKKyNpZmRlZiBFWFRSRU1FX1RMVl9ERUJVRworICAgICAgemxvZ19pbmZvICgiSVNJUy1UTFYgKCVzKTogSVB2NCBleHRlcm5hbCBSZWFjaGFiaWxpdHkgbGVuZ3RoICVkIiwKKwkJIGFyZWF0YWcsCisJCSBsZW5ndGgpOworI2VuZGlmIC8qIEVYVFJFTUVfVExWX0RFQlVHICovCisgICAgICBpZiAoKmV4cGVjdGVkICYgVExWRkxBR19URV9JUFY0X1JFQUNIQUJJTElUWSkgeworICAgICAgICB3aGlsZSAobGVuZ3RoID4gdmFsdWVfbGVuKSB7CisgICAgICAgICAgaXB2NF9yZWFjaCA9IChzdHJ1Y3QgaXB2NF9yZWFjaGFiaWxpdHkqKXBudDsKKyAgICAgICAgICBpZiAoIXRsdnMtPmlwdjRfZXh0X3JlYWNocykgdGx2cy0+aXB2NF9leHRfcmVhY2hzID0gbGlzdF9uZXcoKTsKKyAgICAgICAgICBsaXN0bm9kZV9hZGQgKHRsdnMtPmlwdjRfZXh0X3JlYWNocywgaXB2NF9yZWFjaCk7CisgICAgICAgICAgdmFsdWVfbGVuICs9IDEyOworICAgICAgICAgIHBudCArPSAxMjsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgZWxzZSB7CisgICAgICAgIHBudCArPSBsZW5ndGg7CisgICAgICB9CisgICAgICBicmVhazsKKworICAgIGNhc2UgVEVfSVBWNF9SRUFDSEFCSUxJVFk6CisgICAgICAvKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworICAgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIFRFIE1ldHJpYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgNAorICAgICAgICogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKyAgICAgICAqIHwgIFUvRCAgfCBzVExWPyB8ICAgICAgICAgICAgICAgUHJlZml4IE1hc2sgTGVuICAgICAgICAgICAgICAgICB8IDEKKyAgICAgICAqICstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rCisgICAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJlZml4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAwLTQKKyAgICAgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiB0bHZzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAqIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgKi8KKyAgICAgICpmb3VuZCB8PSBUTFZGTEFHX1RFX0lQVjRfUkVBQ0hBQklMSVRZOworI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCisgICAgICB6bG9nX2luZm8gKCJJU0lTLVRMViAoJXMpOiBJUHY0IGV4dGVuZGVkIFJlYWNoYWJpbGl0eSBsZW5ndGggJWQiLAorCQkgYXJlYXRhZywKKwkJIGxlbmd0aCk7CisjZW5kaWYgLyogRVhUUkVNRV9UTFZfREVCVUcgKi8KKyAgICAgIGlmICgqZXhwZWN0ZWQgJiBUTFZGTEFHX1RFX0lQVjRfUkVBQ0hBQklMSVRZKSB7CisgICAgICAgIHdoaWxlIChsZW5ndGggPiB2YWx1ZV9sZW4pIHsKKyAgICAgICAgICB0ZV9pcHY0X3JlYWNoID0gKHN0cnVjdCB0ZV9pcHY0X3JlYWNoYWJpbGl0eSopcG50OworICAgICAgICAgIGlmICghdGx2cy0+dGVfaXB2NF9yZWFjaHMpIHRsdnMtPnRlX2lwdjRfcmVhY2hzID0gbGlzdF9uZXcoKTsKKyAgICAgICAgICBsaXN0bm9kZV9hZGQgKHRsdnMtPnRlX2lwdjRfcmVhY2hzLCB0ZV9pcHY0X3JlYWNoKTsKKyAgICAgICAgICAvKiB0aGlzIHRyaWNrZXJ5IGlzIHBlcm1pdGFibGUgc2luY2Ugbm8gc3VidGx2cyBhcmUgZGVmaW5lZCAqLworICAgICAgICAgIHZhbHVlX2xlbiArPSA1ICsgKCh0ZV9pcHY0X3JlYWNoLT5jb250cm9sICYgMHgzRikgPyAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICgoKCh0ZV9pcHY0X3JlYWNoLT5jb250cm9sICYgMHgzRiktMSk+PjMpKzEpIDogMCk7CisgICAgICAgICAgcG50ICs9ICA1ICsgKCh0ZV9pcHY0X3JlYWNoLT5jb250cm9sICYgMHgzRikgPyAKKyAgICAgICAgICAgICAgICAgICAgICAoKCgodGVfaXB2NF9yZWFjaC0+Y29udHJvbCAmIDB4M0YpLTEpPj4zKSsxKSA6IDApOworICAgICAgICB9CisgICAgICB9CisgICAgICBlbHNlIHsKKyAgICAgICAgcG50ICs9IGxlbmd0aDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworCisjaWZkZWYgIEhBVkVfSVBWNgorICAgIGNhc2UgSVBWNl9BRERSOgorICAgICAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKyAgICAgICAqICsgICAgICAgICAgICAgICAgIElQIHZlcnNpb24gNiBhZGRyZXNzICAgICAgICAgICAgICAgICAgICAgICAgICArIDE2CisgICAgICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworICAgICAgICogOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDoKKyAgICAgICAqLworICAgICAgKmZvdW5kIHw9IFRMVkZMQUdfSVBWNl9BRERSOworI2lmZGVmIEVYVFJFTUVfVExWX0RFQlVHCisgICAgICB6bG9nX2luZm8gKCJJU0lTLVRMViAoJXMpOiBJUHY2IEFkZHJlc3MgbGVuZ3RoICVkIiwKKwkJIGFyZWF0YWcsCisJCSBsZW5ndGgpOworI2VuZGlmIC8qIEVYVFJFTUVfVExWX0RFQlVHICovCisgICAgICBpZiAoKmV4cGVjdGVkICYgVExWRkxBR19JUFY2X0FERFIpIHsKKyAgICAgICAgd2hpbGUgKGxlbmd0aCA+IHZhbHVlX2xlbikgeworICAgICAgICAgIGlwdjZfYWRkciA9IChzdHJ1Y3QgaW42X2FkZHIqKXBudDsKKyAgICAgICAgICBpZiAoIXRsdnMtPmlwdjZfYWRkcnMpIHRsdnMtPmlwdjZfYWRkcnMgPSBsaXN0X25ldygpOworICAgICAgICAgIGxpc3Rub2RlX2FkZCAodGx2cy0+aXB2Nl9hZGRycywgaXB2Nl9hZGRyKTsKKyAgICAgICAgICB2YWx1ZV9sZW4gKz0gMTY7CisgICAgICAgICAgcG50ICs9IDE2OworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBwbnQgKz0gbGVuZ3RoOworICAgICAgfQorICAgICAgYnJlYWs7CisKKyAgICBjYXNlIElQVjZfUkVBQ0hBQklMSVRZOgorICAgICAgLyogKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSsKKyAgICAgICAqIHwgICAgICAgICAgICAgICAgIERlZmF1bHQgTWV0cmljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDQgCisgICAgICAgKiArLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKy0tLS0tLS0rLS0tLS0tLSstLS0tLS0tKworICAgICAgICogfCAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2wgSW5mb3JtYW50aW9uICAgICAgICAgICAgICAgICAgIHwKKyAgICAgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgKiB8ICAgICAgICAgICAgICAgICAgICAgICAgSVB2NiBQcmVmaXggTGVuZ3RoICAgICAgICAgICAgICAgICAgICAgfC0tKworICAgICAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsgIHwKKyAgICAgICAqIHwgICAgICAgICAgICAgICAgICAgICAgICBJUHY2IFByZWZpeCAgICAgICAgICAgICAgICAgICAgICAgICAgICB8PC0rCisgICAgICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICovCisgICAgICAqZm91bmQgfD0gVExWRkxBR19JUFY2X1JFQUNIQUJJTElUWTsKKyAgICAgIGlmICgqZXhwZWN0ZWQgJiBUTFZGTEFHX0lQVjZfUkVBQ0hBQklMSVRZKSB7CisgICAgICAgIHdoaWxlIChsZW5ndGggPiB2YWx1ZV9sZW4pIHsKKyAgICAgICAgICBpcHY2X3JlYWNoID0gKHN0cnVjdCBpcHY2X3JlYWNoYWJpbGl0eSopcG50OworICAgICAgICAgIHByZWZpeF9vY3RldHMgPSAoKGlwdjZfcmVhY2gtPnByZWZpeF9sZW4gKyA3KSAvIDgpOworICAgICAgICAgIHZhbHVlX2xlbiArPSBwcmVmaXhfb2N0ZXRzICsgNjsKKyAgICAgICAgICBwbnQgKz0gIHByZWZpeF9vY3RldHMgKyA2OworICAgICAgICAgIC8qIEZJWE1FOiBzdWItdGx2cyAqLworICAgICAgICAgIGlmICghdGx2cy0+aXB2Nl9yZWFjaHMpIHRsdnMtPmlwdjZfcmVhY2hzID0gbGlzdF9uZXcoKTsKKyAgICAgICAgICBsaXN0bm9kZV9hZGQgKHRsdnMtPmlwdjZfcmVhY2hzLCBpcHY2X3JlYWNoKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcG50ICs9IGxlbmd0aDsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworI2VuZGlmIC8qIEhBVkVfSVBWNiAqLworCisgICAgY2FzZSBXQVkzX0hFTExPOgorICAgICAgLyogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAqIHwgICAgICAgICAgICAgICAgICBBZGphY2VuY3kgc3RhdGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8IDEKKyAgICAgICAqICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rCisgICAgICAgKiB8ICAgICAgICAgICAgICAgICAgRXh0ZW5kZWQgTG9jYWwgQ2lyY3VpdCBJRCAgICAgICAgICAgICAgICAgICAgfCA0CisgICAgICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICogfCAgICAgICAgICAgICAgICAgIE5laWdoYm9yIFN5c3RlbSBJRCAoSWYga25vd24pICAgICAgICAgICAgICAgIHwgMC04CisgICAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHByb2JhYmx5IDYpCisgICAgICAgKiArLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKworICAgICAgICogfCAgICAgICAgICAgICAgICAgIE5laWdoYm9yIExvY2FsIENpcmN1aXQgSUQgKElmIGtub3duKSAgICAgICAgIHwgNAorICAgICAgICogKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAgICAgICAqLworICAgICAgKmZvdW5kIHw9IFRMVkZMQUdfM1dBWV9IRUxMTzsKKyAgICAgIGlmICgqZXhwZWN0ZWQgJiBUTFZGTEFHXzNXQVlfSEVMTE8pIHsKKyAgICAgICAgd2hpbGUgKGxlbmd0aCA+IHZhbHVlX2xlbikgeworICAgICAgICAvKiBGSVhNRTogbWFrZSB0aGlzIHdvcmsgKi8KKy8qICAgICAgICAgICBBZGphY2VuY3kgU3RhdGUgKG9uZSBvY3RldCk6CisgICAgICAgICAgICAgIDAgPSBVcAorICAgICAgICAgICAgICAxID0gSW5pdGlhbGl6aW5nCisgICAgICAgICAgICAgIDIgPSBEb3duCisgICAgICAgICAgICBFeHRlbmRlZCBMb2NhbCBDaXJjdWl0IElEIChmb3VyIG9jdGV0cykKKyAgICAgICAgICAgIE5laWdoYm9yIFN5c3RlbSBJRCBpZiBrbm93biAoemVybyB0byBlaWdodCBvY3RldHMpCisgICAgICAgICAgICBOZWlnaGJvciBFeHRlbmRlZCBMb2NhbCBDaXJjdWl0IElEIChmb3VyIG9jdGV0cywgaWYgTmVpZ2hib3IKKyAgICAgICAgICAgICAgU3lzdGVtIElEIGlzIHByZXNlbnQpICovCisgICAgICAgICAgcG50ICs9IGxlbmd0aDsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIHsKKyAgICAgICAgcG50ICs9IGxlbmd0aDsKKyAgICAgIH0KKworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgemxvZ193YXJuICgiSVNJUy1UTFYgKCVzKTogdW5zdXBwb3J0ZWQgVExWIHR5cGUgJWQsIGxlbmd0aCAlZCIsCisJCSBhcmVhdGFnLAorCQkgdHlwZSwKKwkJIGxlbmd0aCk7CisKKyAgICAgIHJldHZhbCA9IElTSVNfV0FSTklORzsKKyAgICAgIHBudCArPSBsZW5ndGg7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgCisgIHJldHVybiByZXR2YWw7Cit9CisKK2ludAorYWRkX3RsdiAodV9jaGFyIHRhZywgdV9jaGFyIGxlbiwgdV9jaGFyICp2YWx1ZSwgc3RydWN0IHN0cmVhbSAqc3RyZWFtKQoreworCisgIGlmIChTVFJFQU1fU0laRSAoc3RyZWFtKSAtIHN0cmVhbV9nZXRfcHV0cCAoc3RyZWFtKSAgPCBsZW4gKyAyKSB7CisgICAgemxvZ193YXJuICgiTm8gcm9vbSBmb3IgVExWIG9mIHR5cGUgJWQiLCB0YWcpOworICAgIHJldHVybiBJU0lTX1dBUk5JTkc7CisgIH0KKworICBzdHJlYW1fcHV0YyAoc3RyZWFtLCB0YWcpOyAgLyogVEFHICovCisgIHN0cmVhbV9wdXRjIChzdHJlYW0sIGxlbik7ICAvKiBMRU5HVEggKi8KKyAgc3RyZWFtX3B1dCAoc3RyZWFtLCB2YWx1ZSwgKGludClsZW4pOyAvKiBWQUxVRSAqLworCisjaWZkZWYgRVhUUkVNRV9ERUJVRworICB6bG9nX2luZm8gKCJBZGRlZCBUTFYgJWQgbGVuICVkIiwgdGFnLCBsZW4pOworI2VuZGlmIC8qIEVYVFJFTUUgREVCVUcgKi8KKyAgcmV0dXJuIElTSVNfT0s7Cit9CisKKworaW50Cit0bHZfYWRkX2FyZWFfYWRkcnMgKHN0cnVjdCBsaXN0ICphcmVhX2FkZHJzLCBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pIAoreworICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CisgIHN0cnVjdCBhcmVhX2FkZHIgKmFyZWFfYWRkcjsKKworICB1X2NoYXIgdmFsdWUgWzI1NV07CisgIHVfY2hhciAqcG9zID0gdmFsdWU7CisgIAorICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoYXJlYV9hZGRycyk7IG5vZGU7IG5leHRub2RlIChub2RlKSkgeyAKKyAgICBhcmVhX2FkZHIgPSBnZXRkYXRhIChub2RlKTsKKyAgICBpZiAocG9zIC0gdmFsdWUgKyBhcmVhX2FkZHItPmFkZHJfbGVuID4gMjU1KQorICAgICAgZ290byBlcnI7CisgICAgKnBvcyA9IGFyZWFfYWRkci0+YWRkcl9sZW47CisgICAgcG9zICsrOworICAgIG1lbWNweSAocG9zLCBhcmVhX2FkZHItPmFyZWFfYWRkciwgKGludClhcmVhX2FkZHItPmFkZHJfbGVuKTsKKyAgICBwb3MgKz0gYXJlYV9hZGRyLT5hZGRyX2xlbjsKKyAgfQorICAKKyAgcmV0dXJuIGFkZF90bHYgKEFSRUFfQUREUkVTU0VTLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7CisKKyBlcnI6CisgIHpsb2dfd2FybiAoInRsdl9hZGRfYXJlYV9hZGRycygpOiBUTFYgbG9uZ2VyIHRoYW4gMjU1Iik7CisgIHJldHVybiBJU0lTX1dBUk5JTkc7Cit9CisKK2ludCB0bHZfYWRkX2lzX25laWdocyAoc3RydWN0IGxpc3QgKmlzX25laWdocywgc3RydWN0IHN0cmVhbSAqc3RyZWFtKQoreworICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CisgIHN0cnVjdCBpc19uZWlnaCAqaXNfbmVpZ2g7CisgIHVfY2hhciB2YWx1ZSBbMjU1XTsKKyAgdV9jaGFyICpwb3MgPSB2YWx1ZTsKKyAgaW50IHJldHZhbDsKKworICAqcG9zID0gIDA7IC8qaXNfbmVpZ2gtPnZpcnR1YWw7ICovCisgIHBvcyArKzsKKworICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoaXNfbmVpZ2hzKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKSB7IAorICAgIGlzX25laWdoID0gZ2V0ZGF0YSAobm9kZSk7CisgICAgaWYgKHBvcyAtIHZhbHVlICsgSVNfTkVJR0hCT1VSU19MRU4gPiAyNTUpIHsKKyAgICAgIHJldHZhbCA9IGFkZF90bHYgKElTX05FSUdIQk9VUlMsIHBvcyAtIHZhbHVlLCB2YWx1ZSwgc3RyZWFtKTsKKyAgICAgIGlmIChyZXR2YWwgIT0gSVNJU19PSykKKwlyZXR1cm4gcmV0dmFsOworICAgICAgcG9zID0gdmFsdWU7CisgICAgfQorICAgICpwb3MgPSBpc19uZWlnaC0+bWV0cmljcy5tZXRyaWNfZGVmYXVsdDsKKyAgICBwb3MgKys7ICAgIAorICAgICpwb3MgPSBpc19uZWlnaC0+bWV0cmljcy5tZXRyaWNfZGVsYXk7CisgICAgcG9zICsrOyAgICAKKyAgICAqcG9zID0gaXNfbmVpZ2gtPm1ldHJpY3MubWV0cmljX2V4cGVuc2U7CisgICAgcG9zICsrOyAgICAKKyAgICAqcG9zID0gaXNfbmVpZ2gtPm1ldHJpY3MubWV0cmljX2Vycm9yOworICAgIHBvcyArKzsKKyAgICBtZW1jcHkgKHBvcywgaXNfbmVpZ2gtPm5laWdoX2lkLCBJU0lTX1NZU19JRF9MRU4gKyAxKTsKKyAgICBwb3MgKz0gSVNJU19TWVNfSURfTEVOICsgMTsKKyAgfQorCisgIHJldHVybiBhZGRfdGx2IChJU19ORUlHSEJPVVJTLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7Cit9CisKKworaW50Cit0bHZfYWRkX2xhbl9uZWlnaHMgKHN0cnVjdCBsaXN0ICpsYW5fbmVpZ2hzLCBzdHJ1Y3Qgc3RyZWFtICpzdHJlYW0pCit7CisgIHN0cnVjdCBsaXN0bm9kZSAqbm9kZTsKKyAgdV9jaGFyICpzbnBhOworICB1X2NoYXIgdmFsdWUgWzI1NV07CisgIHVfY2hhciAqcG9zID0gdmFsdWU7CisgIGludCByZXR2YWw7CisKKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKGxhbl9uZWlnaHMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsgCisgICAgc25wYSA9IGdldGRhdGEgKG5vZGUpOworICAgIGlmIChwb3MgLSB2YWx1ZSArIEVUSF9BTEVOID4gMjU1KSB7CisgICAgICByZXR2YWwgPSBhZGRfdGx2IChMQU5fTkVJR0hCT1VSUywgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOworICAgICAgaWYgKHJldHZhbCAhPSBJU0lTX09LKQorCXJldHVybiByZXR2YWw7CisgICAgICBwb3MgPSB2YWx1ZTsKKyAgICB9CisgICAgbWVtY3B5IChwb3MsIHNucGEsIEVUSF9BTEVOKTsKKyAgICBwb3MgKz0gRVRIX0FMRU47CisgIH0KKworICByZXR1cm4gYWRkX3RsdiAoTEFOX05FSUdIQk9VUlMsIHBvcyAtIHZhbHVlLCB2YWx1ZSwgc3RyZWFtKTsKK30KKworCisvKgorICB1X2NoYXIgdmFsdWVbMjU1XTsKKyAgdV9jaGFyICpwb3MgPSB2YWx1ZTsKKworICBpZiAoY2lyY3VpdC0+aXBfcm91dGVyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAqcG9zID0gICh1X2NoYXIpTkxQSURfSVA7CisgICAgcG9zICsrOworICB9CisgIGlmIChjaXJjdWl0LT5pcHY2X3JvdXRlcikgeyAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAqcG9zID0gKHVfY2hhcilOTFBJRF9JUFY2OworICAgIHBvcyArKzsKKyAgfQorKi8KKworaW50Cit0bHZfYWRkX25scGlkIChzdHJ1Y3QgbmxwaWRzICpubHBpZHMsIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSkKK3sKKyAgCisgIHJldHVybiBhZGRfdGx2IChQUk9UT0NPTFNfU1VQUE9SVEVELCBubHBpZHMtPmNvdW50LCAKKyAgICAgICAgICAgICAgICAgIG5scGlkcy0+bmxwaWRzLCBzdHJlYW0pOyAKK30KKworaW50IHRsdl9hZGRfYXV0aGluZm8gIChjaGFyIGF1dGhfdHlwZSwgY2hhciBhdXRoX2xlbiwgY2hhciAqYXV0aF92YWx1ZSwKKwkJICAgICAgIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSkKK3sKKyAgdV9jaGFyIHZhbHVlWzI1NV07CisgIHVfY2hhciAqcG9zID0gdmFsdWU7CisgIHBvcysrOworICBtZW1jcHkgKHBvcywgYXV0aF92YWx1ZSwgYXV0aF9sZW4pOworCisgIHJldHVybiBhZGRfdGx2IChBVVRIX0lORk8sIGF1dGhfbGVuICsgMSwgdmFsdWUsIHN0cmVhbSk7Cit9CisKK2ludAordGx2X2FkZF9jaGVja3N1bSAoc3RydWN0IGNoZWNrc3VtICpjaGVja3N1bSwgc3RydWN0IHN0cmVhbSAqc3RyZWFtKQoreworICB1X2NoYXIgdmFsdWVbMjU1XTsKKyAgdV9jaGFyICpwb3MgPSB2YWx1ZTsgIAorICByZXR1cm4gYWRkX3RsdiAoQ0hFQ0tTVU0sIHBvcyAtIHZhbHVlLCAKKyAgICAgICAgICAgICAgICAgIHZhbHVlLCBzdHJlYW0pOyAKK30KKworaW50Cit0bHZfYWRkX2lwX2FkZHJzIChzdHJ1Y3QgbGlzdCAqaXBfYWRkcnMsIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSkKK3sKKyAgc3RydWN0IGxpc3Rub2RlICpub2RlOworICBzdHJ1Y3QgcHJlZml4X2lwdjQgKmlwdjQ7CisgIHVfY2hhciB2YWx1ZVsyNTVdOworICB1X2NoYXIgKnBvcyA9IHZhbHVlOworICBpbnQgcmV0dmFsOworCisgIGZvciAobm9kZSA9IGxpc3RoZWFkIChpcF9hZGRycyk7IG5vZGU7IG5leHRub2RlIChub2RlKSkgeyAKKyAgICBpcHY0ID0gZ2V0ZGF0YSAobm9kZSk7CisgICAgaWYgKHBvcyAtIHZhbHVlICsgSVBWNF9NQVhfQllURUxFTiA+IDI1NSkgeworICAgICAgcmV0dmFsID0gYWRkX3RsdiAoSVBWNF9BRERSLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7CisgICAgICBpZiAocmV0dmFsICE9IElTSVNfT0spCisJcmV0dXJuIHJldHZhbDsKKyAgICAgIHBvcyA9IHZhbHVlOworICAgIH0KKyAgICAqKHVfaW50MzJfdCopcG9zID0gaXB2NC0+cHJlZml4LnNfYWRkcjsKKyAgICBwb3MgKz0gSVBWNF9NQVhfQllURUxFTjsKKyAgfQorICAKKyAgcmV0dXJuIGFkZF90bHYgKElQVjRfQUREUiwgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOworfQorCitpbnQKK3Rsdl9hZGRfZHluYW1pY19ob3N0bmFtZSAoc3RydWN0IGhvc3RuYW1lICpob3N0bmFtZSwgc3RydWN0IHN0cmVhbSAqc3RyZWFtKQoreworICByZXR1cm4gYWRkX3RsdiAoRFlOQU1JQ19IT1NUTkFNRSwgaG9zdG5hbWUtPm5hbWVsZW4sIGhvc3RuYW1lLT5uYW1lLCBzdHJlYW0pOworfQorCitpbnQgCit0bHZfYWRkX2xzcF9lbnRyaWVzIChzdHJ1Y3QgbGlzdCAqbHNwcywgc3RydWN0IHN0cmVhbSAqc3RyZWFtKQoreworICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CisgIHN0cnVjdCBpc2lzX2xzcCAqbHNwOworICB1X2NoYXIgdmFsdWUgWzI1NV07CisgIHVfY2hhciAqcG9zID0gdmFsdWU7CisgIGludCByZXR2YWw7CisKKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKGxzcHMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsgCisgICAgbHNwID0gZ2V0ZGF0YSAobm9kZSk7CisgICAgaWYgKHBvcyAtIHZhbHVlICsgTFNQX0VOVFJJRVNfTEVOID4gMjU1KSB7CisgICAgICByZXR2YWwgPSBhZGRfdGx2IChMU1BfRU5UUklFUywgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOworICAgICAgaWYgKHJldHZhbCAhPSBJU0lTX09LKQorCXJldHVybiByZXR2YWw7CisgICAgICBwb3MgPSB2YWx1ZTsKKyAgICB9CisgICAgKigodV9pbnQxNl90Kilwb3MpID0gbHNwLT5sc3BfaGVhZGVyLT5yZW1fbGlmZXRpbWU7CisgICAgcG9zICs9IDI7CisgICAgbWVtY3B5IChwb3MsIGxzcC0+bHNwX2hlYWRlci0+bHNwX2lkLCBJU0lTX1NZU19JRF9MRU4gKyAyKTsKKyAgICBwb3MgKz0gSVNJU19TWVNfSURfTEVOICsgMjsKKyAgICAqKCh1X2ludDMyX3QqKXBvcykgPSBsc3AtPmxzcF9oZWFkZXItPnNlcV9udW07CisgICAgcG9zICs9IDQ7ICAgIAorICAgICooKHVfaW50MTZfdCopcG9zKSA9IGxzcC0+bHNwX2hlYWRlci0+Y2hlY2tzdW07CisgICAgcG9zICs9IDI7CisgIH0KKyAgCisgIHJldHVybiBhZGRfdGx2IChMU1BfRU5UUklFUywgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOworfQorCitpbnQgCit0bHZfYWRkX2lwdjRfcmVhY2hzIChzdHJ1Y3QgbGlzdCAqaXB2NF9yZWFjaHMsIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSkKK3sKKyAgc3RydWN0IGxpc3Rub2RlICpub2RlOworICBzdHJ1Y3QgaXB2NF9yZWFjaGFiaWxpdHkgKnJlYWNoOworICB1X2NoYXIgdmFsdWUgWzI1NV07CisgIHVfY2hhciAqcG9zID0gdmFsdWU7CisgIGludCByZXR2YWw7CisKKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKGlwdjRfcmVhY2hzKTsgbm9kZTsgbmV4dG5vZGUgKG5vZGUpKSB7IAorICAgIHJlYWNoID0gZ2V0ZGF0YSAobm9kZSk7CisgICAgaWYgKHBvcyAtIHZhbHVlICsgSVBWNF9SRUFDSF9MRU4gPiAyNTUpIHsKKyAgICAgIHJldHZhbCA9IGFkZF90bHYgKElQVjRfSU5UX1JFQUNIQUJJTElUWSwgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOworICAgICAgaWYgKHJldHZhbCAhPSBJU0lTX09LKQorCXJldHVybiByZXR2YWw7CisgICAgICBwb3MgPSB2YWx1ZTsKKyAgICB9CisgICAgKnBvcyA9IHJlYWNoLT5tZXRyaWNzLm1ldHJpY19kZWZhdWx0OworICAgIHBvcyArKzsgICAgCisgICAgKnBvcyA9IHJlYWNoLT5tZXRyaWNzLm1ldHJpY19kZWxheTsKKyAgICBwb3MgKys7ICAgIAorICAgICpwb3MgPSByZWFjaC0+bWV0cmljcy5tZXRyaWNfZXhwZW5zZTsKKyAgICBwb3MgKys7ICAgIAorICAgICpwb3MgPSByZWFjaC0+bWV0cmljcy5tZXRyaWNfZXJyb3I7CisgICAgcG9zICsrOworICAgKih1X2ludDMyX3QqKXBvcyA9IHJlYWNoLT5wcmVmaXguc19hZGRyOworICAgIHBvcyArPSBJUFY0X01BWF9CWVRFTEVOOworICAgKih1X2ludDMyX3QqKXBvcyA9IHJlYWNoLT5tYXNrLnNfYWRkcjsKKyAgICBwb3MgKz0gSVBWNF9NQVhfQllURUxFTjsKKyAgfSAgICAKKyAgCisgIAorICByZXR1cm4gYWRkX3RsdiAoSVBWNF9JTlRfUkVBQ0hBQklMSVRZLCBwb3MgLSB2YWx1ZSwgdmFsdWUsIHN0cmVhbSk7Cit9CisKKyNpZmRlZiBIQVZFX0lQVjYgCitpbnQKK3Rsdl9hZGRfaXB2Nl9hZGRycyAoc3RydWN0IGxpc3QgKmlwdjZfYWRkcnMsIHN0cnVjdCBzdHJlYW0gKnN0cmVhbSkKK3sKKyAgc3RydWN0IGxpc3Rub2RlICpub2RlOworICBzdHJ1Y3QgcHJlZml4X2lwdjYgKmlwdjY7CisgIHVfY2hhciB2YWx1ZVsyNTVdOworICB1X2NoYXIgKnBvcyA9IHZhbHVlOworICBpbnQgcmV0dmFsOworICAKKyAgZm9yIChub2RlID0gbGlzdGhlYWQgKGlwdjZfYWRkcnMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsgCisgICAgaXB2NiA9IGdldGRhdGEgKG5vZGUpOworICAgIGlmIChwb3MgLSB2YWx1ZSArIElQVjZfTUFYX0JZVEVMRU4gPiAyNTUpIHsKKyAgICAgIHJldHZhbCA9IGFkZF90bHYgKElQVjZfQUREUiwgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOworICAgICAgaWYgKHJldHZhbCAhPSBJU0lTX09LKQorCXJldHVybiByZXR2YWw7CisgICAgICBwb3MgPSB2YWx1ZTsKKyAgICB9CisgICAgbWVtY3B5IChwb3MsIGlwdjYtPnByZWZpeC5zNl9hZGRyLCBJUFY2X01BWF9CWVRFTEVOKTsKKyAgICBwb3MgKz0gSVBWNl9NQVhfQllURUxFTjsKKyAgfQorICAKKyAgcmV0dXJuIGFkZF90bHYgKElQVjZfQUREUiwgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOworfQorCitpbnQKK3Rsdl9hZGRfaXB2Nl9yZWFjaHMgKHN0cnVjdCBsaXN0ICppcHY2X3JlYWNocywgc3RydWN0IHN0cmVhbSAqc3RyZWFtKQoreworICBzdHJ1Y3QgbGlzdG5vZGUgKm5vZGU7CisgIHN0cnVjdCBpcHY2X3JlYWNoYWJpbGl0eSAqaXA2cmVhY2g7CisgIHVfY2hhciB2YWx1ZVsyNTVdOworICB1X2NoYXIgKnBvcyA9IHZhbHVlOworICBpbnQgcmV0dmFsLCBwcmVmaXhfb2N0ZXRzOworIAorICBmb3IgKG5vZGUgPSBsaXN0aGVhZCAoaXB2Nl9yZWFjaHMpOyBub2RlOyBuZXh0bm9kZSAobm9kZSkpIHsgCisgICAgaXA2cmVhY2ggPSBnZXRkYXRhIChub2RlKTsKKyAgICBpZiAocG9zIC0gdmFsdWUgKyBJUFY2X01BWF9CWVRFTEVOICsgNiA+IDI1NSkgeworICAgICAgcmV0dmFsID0gYWRkX3RsdiAoSVBWNl9SRUFDSEFCSUxJVFksIHBvcyAtIHZhbHVlLCB2YWx1ZSwgc3RyZWFtKTsKKyAgICAgIGlmIChyZXR2YWwgIT0gSVNJU19PSykKKwlyZXR1cm4gcmV0dmFsOworICAgICAgcG9zID0gdmFsdWU7CisgICAgfQorICAgICoodWludDMyX3QqKXBvcyA9IGlwNnJlYWNoLT5tZXRyaWM7CisgICAgcG9zICs9IDQ7CisgICAgKnBvcyA9IGlwNnJlYWNoLT5jb250cm9sX2luZm87CisgICAgcG9zKys7CisgICAgcHJlZml4X29jdGV0cyA9ICgoaXA2cmVhY2gtPnByZWZpeF9sZW4gKyA3KSAvIDgpOworICAgICpwb3MgPSBpcDZyZWFjaC0+cHJlZml4X2xlbjsKKyAgICBwb3MrKzsKKyAgICBtZW1jcHkgKHBvcywgaXA2cmVhY2gtPnByZWZpeCwgcHJlZml4X29jdGV0cyk7CisgICAgcG9zICs9IHByZWZpeF9vY3RldHM7CisgIH0KKyAgCisgIHJldHVybiBhZGRfdGx2IChJUFY2X1JFQUNIQUJJTElUWSwgcG9zIC0gdmFsdWUsIHZhbHVlLCBzdHJlYW0pOworfQorI2VuZGlmIC8qIEhBVkVfSVBWNiAqLworCitpbnQKK3Rsdl9hZGRfcGFkZGluZyAoc3RydWN0IHN0cmVhbSAqc3RyZWFtKQoreworICB1bnNpZ25lZCBsb25nIHB1dHAsIGVuZHA7CisgIGludCAgZnVsbHBhZHMsIGksIGxlZnQ7CisgIAorICAvKgorICAgKiBIb3cgbWFueSB0aW1lcyBjYW4gd2UgYWRkIGZ1bGwgcGFkZGluZyA/CisgICAqLworICBmdWxscGFkcyA9IChTVFJFQU1fU0laRShzdHJlYW0pIC0gc3RyZWFtX2dldF9lbmRwIChzdHJlYW0pKSAvIDI1NzsKKyAgZm9yIChpID0gMDsgaSA8IGZ1bGxwYWRzOyBpICsrKSB7CisgICAgaWYgKCFzdHJlYW1fcHV0YyAoc3RyZWFtLCAodV9jaGFyKVBBRERJTkcpKSAvKiBUQUcgKi8KKyAgICAgIGdvdG8gZXJyOworICAgIGlmICghc3RyZWFtX3B1dGMgKHN0cmVhbSwgKHVfY2hhcikyNTUpKSAgICAgLyogTEVOR0hUICovCisgICAgICBnb3RvIGVycjsKKyAgICBlbmRwID0gc3RyZWFtX2dldF9lbmRwIChzdHJlYW0pOworICAgIHB1dHAgPSBzdHJlYW1fZ2V0X3B1dHAgKHN0cmVhbSk7CisgICAgaWYgKHB1dHAgIT0gZW5kcCkKKyAgICAgIHpsb2dfd2FybiAoInR2bF9hZGRfcGFkZGluZyBlbmRwICVsZCB3aGlsZSBwdXRwICVsZCIsIGVuZHAsIHB1dHApOworICAgIHN0cmVhbV9zZXRfcHV0cCAoc3RyZWFtLCBwdXRwICsgMjU1KTsgICAgICAgLyogVkFMVUUgKi8KKyAgICBzdHJlYW0tPmVuZHAgPSBzdHJlYW0tPnB1dHA7CisgIH0KKyAgCisgIGxlZnQgPSBTVFJFQU1fU0laRShzdHJlYW0pIC0gc3RyZWFtX2dldF9wdXRwIChzdHJlYW0pOworICAKKyAgaWYgKGxlZnQgPCAyKQorICAgIHJldHVybiBJU0lTX09LOworICAKKyAgaWYgKGxlZnQgPT0gMikgeworICAgIHN0cmVhbV9wdXRjIChzdHJlYW0sIFBBRERJTkcpOworICAgIHN0cmVhbV9wdXRjIChzdHJlYW0sIDApOworICAgIHJldHVybiBJU0lTX09LOworICB9CisgIAorICBzdHJlYW1fcHV0YyAoc3RyZWFtLCBQQURESU5HKTsKKyAgc3RyZWFtX3B1dGMgKHN0cmVhbSwgbGVmdCAtIDIpOworICBzdHJlYW1fc2V0X3B1dHAgKHN0cmVhbSwgc3RyZWFtX2dldF9wdXRwIChzdHJlYW0pICsgbGVmdCAtIDIpOworICBzdHJlYW0tPmVuZHAgPSBzdHJlYW0tPnB1dHA7CisKKyAgcmV0dXJuIElTSVNfT0s7CisKKyBlcnI6CisgIHpsb2dfd2FybiAoInRsdl9hZGRfcGFkZGluZygpOiBubyByb29tIGZvciB0bHYiKTsKKyAgcmV0dXJuIElTSVNfV0FSTklORzsKK30K