Lyogdm1zLWhkci5jIC0tIEJGRCBiYWNrLWVuZCBmb3IgVk1TL1ZBWCAob3BlblZNUy9WQVgpIGFuZAogICBFVkFYIChvcGVuVk1TL0FscGhhKSBmaWxlcy4KICAgQ29weXJpZ2h0IDE5OTYsIDE5OTcsIDE5OTgsIDE5OTksIDIwMDAsIDIwMDEsIDIwMDIsIDIwMDMsIDIwMDUsIDIwMDYsCiAgIDIwMDcgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCgogICBIRFIgcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwogICBFTUggcmVjb3JkIGhhbmRsaW5nIGZ1bmN0aW9ucwogICBhbmQKICAgRU9NIHJlY29yZCBoYW5kbGluZyBmdW5jdGlvbnMKICAgRUVPTSByZWNvcmQgaGFuZGxpbmcgZnVuY3Rpb25zCgogICBXcml0dGVuIGJ5IEtsYXVzIEsiYW1wZiAoa2thZW1wZkBybWkuZGUpCgogICBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeQogICBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogICB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAzIG9mIHRoZSBMaWNlbnNlLCBvcgogICAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICAgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCiAgIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAgIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCAtIEZpZnRoIEZsb29yLCBCb3N0b24sCiAgIE1BIDAyMTEwLTEzMDEsIFVTQS4gICovCgojaW5jbHVkZSAic3lzZGVwLmgiCiNpbmNsdWRlICJiZmQuaCIKI2luY2x1ZGUgImJmZHZlci5oIgojaW5jbHVkZSAiYmZkbGluay5oIgojaW5jbHVkZSAic2FmZS1jdHlwZS5oIgojaW5jbHVkZSAibGliYmZkLmgiCgojaW5jbHVkZSAidm1zLmgiCgojaWZkZWYgSEFWRV9BTExPQ0FfSAojaW5jbHVkZSA8YWxsb2NhLmg+CiNlbmRpZgoKLyogUmVhZCAmIHByb2Nlc3MgZW1oIHJlY29yZAogICByZXR1cm4gMCBvbiBzdWNjZXNzLCAtMSBvbiBlcnJvci4gICovCgppbnQKX2JmZF92bXNfc2x1cnBfaGRyIChiZmQgKmFiZmQsIGludCBvYmp0eXBlKQp7CiAgdW5zaWduZWQgY2hhciAqcHRyOwogIHVuc2lnbmVkIGNoYXIgKnZtc19yZWM7CiAgaW50IHN1YnR5cGU7CgogIHZtc19yZWMgPSBQUklWKHZtc19yZWMpOwoKI2lmIFZNU19ERUJVRwogIHZtc19kZWJ1ZygyLCAiSERSL0VNSFxuIik7CiNlbmRpZgoKICBzd2l0Y2ggKG9ianR5cGUpCiAgICB7CiAgICBjYXNlIE9CSl9TX0NfSERSOgogICAgICBzdWJ0eXBlID0gdm1zX3JlY1sxXTsKICAgICAgYnJlYWs7CiAgICBjYXNlIEVPQkpfU19DX0VNSDoKICAgICAgc3VidHlwZSA9IGJmZF9nZXRsMTYgKHZtc19yZWMgKyA0KSArIEVWQVhfT0ZGU0VUOwogICAgICBicmVhazsKICAgIGRlZmF1bHQ6CiAgICAgIHN1YnR5cGUgPSAtMTsKICAgIH0KCiNpZiBWTVNfREVCVUcKICB2bXNfZGVidWcoMywgInN1YnR5cGUgJWRcbiIsIHN1YnR5cGUpOwojZW5kaWYKCiAgc3dpdGNoIChzdWJ0eXBlKQogICAgewogICAgY2FzZSBNSERfU19DX01IRDoKICAgICAgLyogTW9kdWxlIGhlYWRlci4gICovCiAgICAgIFBSSVYgKGhkcl9kYXRhKS5oZHJfYl9zdHJsdmwgPSB2bXNfcmVjWzJdOwogICAgICBQUklWIChoZHJfZGF0YSkuaGRyX2xfcmVjc2l6ID0gYmZkX2dldGwxNiAodm1zX3JlYyArIDMpOwogICAgICBQUklWIChoZHJfZGF0YSkuaGRyX3RfbmFtZSA9IF9iZmRfdm1zX3NhdmVfY291bnRlZF9zdHJpbmcgKHZtc19yZWMgKyA1KTsKICAgICAgcHRyID0gdm1zX3JlYyArIDUgKyB2bXNfcmVjWzVdICsgMTsKICAgICAgUFJJViAoaGRyX2RhdGEpLmhkcl90X3ZlcnNpb24gPSBfYmZkX3Ztc19zYXZlX2NvdW50ZWRfc3RyaW5nIChwdHIpOwogICAgICBwdHIgKz0gKnB0ciArIDE7CiAgICAgIFBSSVYgKGhkcl9kYXRhKS5oZHJfdF9kYXRlID0gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHB0ciwgMTcpOwogICAgICBicmVhazsKCiAgICBjYXNlIE1IRF9TX0NfTE5NOgogICAgICBQUklWIChoZHJfZGF0YSkuaGRyX2NfbG5tID0gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYgKHJlY19sZW5ndGggLSAyKSk7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgTUhEX1NfQ19TUkM6CiAgICAgIFBSSVYgKGhkcl9kYXRhKS5oZHJfY19zcmMgPSBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJViAocmVjX2xlbmd0aCAtIDIpKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBNSERfU19DX1RUTDoKICAgICAgUFJJViAoaGRyX2RhdGEpLmhkcl9jX3R0bCA9IF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWIChyZWNfbGVuZ3RoIC0gMikpOwogICAgICBicmVhazsKCiAgICBjYXNlIEVNSF9TX0NfTUhEICsgRVZBWF9PRkZTRVQ6CiAgICAgIC8qIE1vZHVsZSBoZWFkZXIuICAqLwogICAgICBQUklWIChoZHJfZGF0YSkuaGRyX2Jfc3RybHZsID0gdm1zX3JlY1s2XTsKICAgICAgUFJJViAoaGRyX2RhdGEpLmhkcl9sX2FyY2gxICA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyA4KTsKICAgICAgUFJJViAoaGRyX2RhdGEpLmhkcl9sX2FyY2gyICA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyAxMik7CiAgICAgIFBSSVYgKGhkcl9kYXRhKS5oZHJfbF9yZWNzaXogPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgMTYpOwogICAgICBQUklWIChoZHJfZGF0YSkuaGRyX3RfbmFtZSAgID0gX2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAodm1zX3JlYyArIDIwKTsKICAgICAgcHRyID0gdm1zX3JlYyArIDIwICsgdm1zX3JlY1syMF0gKyAxOwogICAgICBQUklWIChoZHJfZGF0YSkuaGRyX3RfdmVyc2lvbiA9X2JmZF92bXNfc2F2ZV9jb3VudGVkX3N0cmluZyAocHRyKTsKICAgICAgcHRyICs9ICpwdHIgKyAxOwogICAgICBQUklWIChoZHJfZGF0YSkuaGRyX3RfZGF0ZSA9IF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nIChwdHIsIDE3KTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBFTUhfU19DX0xOTSArIEVWQVhfT0ZGU0VUOgogICAgICBQUklWIChoZHJfZGF0YSkuaGRyX2NfbG5tID0gX2JmZF92bXNfc2F2ZV9zaXplZF9zdHJpbmcgKHZtc19yZWMsIFBSSVYgKHJlY19sZW5ndGggLSA2KSk7CiAgICAgIGJyZWFrOwoKICAgIGNhc2UgRU1IX1NfQ19TUkMgKyBFVkFYX09GRlNFVDoKICAgICAgUFJJViAoaGRyX2RhdGEpLmhkcl9jX3NyYyA9IF9iZmRfdm1zX3NhdmVfc2l6ZWRfc3RyaW5nICh2bXNfcmVjLCBQUklWIChyZWNfbGVuZ3RoIC0gNikpOwogICAgICBicmVhazsKCiAgICBjYXNlIEVNSF9TX0NfVFRMICsgRVZBWF9PRkZTRVQ6CiAgICAgIFBSSVYgKGhkcl9kYXRhKS5oZHJfY190dGwgPSBfYmZkX3Ztc19zYXZlX3NpemVkX3N0cmluZyAodm1zX3JlYywgUFJJViAocmVjX2xlbmd0aCAtIDYpKTsKICAgICAgYnJlYWs7CgogICAgY2FzZSBNSERfU19DX0NQUjoKICAgIGNhc2UgTUhEX1NfQ19NVEM6CiAgICBjYXNlIE1IRF9TX0NfR1RYOgogICAgY2FzZSBFTUhfU19DX0NQUiArIEVWQVhfT0ZGU0VUOgogICAgY2FzZSBFTUhfU19DX01UQyArIEVWQVhfT0ZGU0VUOgogICAgY2FzZSBFTUhfU19DX0dUWCArIEVWQVhfT0ZGU0VUOgogICAgICBicmVhazsKCiAgICBkZWZhdWx0OgogICAgICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3Jfd3JvbmdfZm9ybWF0KTsKICAgICAgcmV0dXJuIC0xOwogICAgfQoKICByZXR1cm4gMDsKfQoKLyogT3V0cHV0IHJvdXRpbmVzLiAgKi8KCi8qIE1hbnVmYWN0dXJlIGEgVk1TIGxpa2UgdGltZSBvbiBhIHVuaXggYmFzZWQgc3lzdGVtLgogICBzdG9sZW4gZnJvbSBvYmotdm1zLmMuICAqLwoKc3RhdGljIHVuc2lnbmVkIGNoYXIgKgpnZXRfdm1zX3RpbWVfc3RyaW5nICh2b2lkKQp7CiAgc3RhdGljIHVuc2lnbmVkIGNoYXIgdGJ1ZlsxOF07CiNpZm5kZWYgVk1TCiNpbmNsdWRlIDx0aW1lLmg+CgogIGNoYXIgKnBudDsKICB0aW1lX3QgdGltZWI7CgogIHRpbWUgKCYgdGltZWIpOwogIHBudCA9IGN0aW1lICgmdGltZWIpOwogIHBudFszXSA9IDA7CiAgcG50WzddID0gMDsKICBwbnRbMTBdID0gMDsKICBwbnRbMTZdID0gMDsKICBwbnRbMjRdID0gMDsKICBzcHJpbnRmICgoY2hhciAqKSB0YnVmLCAiJTJzLSUzcy0lcyAlcyIsCgkgICBwbnQgKyA4LCBwbnQgKyA0LCBwbnQgKyAyMCwgcG50ICsgMTEpOwojZWxzZQojaW5jbHVkZSA8c3RhcmxldC5oPgogIHN0cnVjdAogIHsKICAgIGludCBTaXplOwogICAgdW5zaWduZWQgY2hhciAqUHRyOwogIH0gRGVzY3JpcHRvcjsKICBEZXNjcmlwdG9yLlNpemUgPSAxNzsKICBEZXNjcmlwdG9yLlB0ciA9IHRidWY7CiAgU1lTJEFTQ1RJTSAoMCwgJkRlc2NyaXB0b3IsIDAsIDApOwojZW5kaWYgLyogbm90IFZNUyAqLwoKI2lmIFZNU19ERUJVRwogIHZtc19kZWJ1ZyAoNiwgInZtc3RpbWVzdHJpbmc6JyVzJ1xuIiwgdGJ1Zik7CiNlbmRpZgoKICByZXR1cm4gdGJ1ZjsKfQoKLyogV3JpdGUgb2JqZWN0IGhlYWRlciBmb3IgYmZkIGFiZmQuICAqLwoKaW50Cl9iZmRfdm1zX3dyaXRlX2hkciAoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkKewogIGFzeW1ib2wgKnN5bWJvbDsKICB1bnNpZ25lZCBpbnQgc3ltbnVtOwogIGludCBoYWRfY2FzZSA9IDA7CiAgaW50IGhhZF9maWxlID0gMDsKCiNpZiBWTVNfREVCVUcKICB2bXNfZGVidWcgKDIsICJ2bXNfd3JpdGVfaGRyICglcClcbiIsIGFiZmQpOwojZW5kaWYKCiAgX2JmZF92bXNfb3V0cHV0X2FsaWdubWVudCAoYWJmZCwgMik7CgogIC8qIE1IRC4gICovCiAgaWYgKG9ianR5cGUgIT0gT0JKX1NfQ19IRFIpCiAgICB7CiAgICAgIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX01IRCk7CiAgICAgIF9iZmRfdm1zX291dHB1dF9zaG9ydCAoYWJmZCwgRU9CSl9TX0NfU1RSTFZMKTsKICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsIDApOwogICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7CiAgICAgIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCBNQVhfT1VUUkVDX1NJWkUpOwogICAgfQoKICBpZiAoYmZkX2dldF9maWxlbmFtZSAoYWJmZCkgIT0gMCkKICAgIHsKICAgICAgLyogU3RyaXAgcGF0aCBhbmQgc3VmZml4IGluZm9ybWF0aW9uLiAgKi8KICAgICAgY2hhciAqZm5hbWUsICpmb3V0LCAqZnB0cjsKCiAgICAgIGZwdHIgPSBiZmRfZ2V0X2ZpbGVuYW1lIChhYmZkKTsKICAgICAgZm5hbWUgPSBhbGxvY2EgKHN0cmxlbiAoZnB0cikgKyAxKTsKICAgICAgc3RyY3B5IChmbmFtZSwgZnB0cik7CiAgICAgIGZvdXQgPSBzdHJyY2hyIChmbmFtZSwgJ10nKTsKICAgICAgaWYgKGZvdXQgPT0gMCkKCWZvdXQgPSBzdHJjaHIgKGZuYW1lLCAnOicpOwogICAgICBpZiAoZm91dCAhPSAwKQoJZm91dCsrOwogICAgICBlbHNlCglmb3V0ID0gZm5hbWU7CgogICAgICAvKiBTdHJpcCAub2JqIHN1ZmZpeC4gICovCiAgICAgIGZwdHIgPSBzdHJyY2hyIChmbmFtZSwgJy4nKTsKICAgICAgaWYgKChmcHRyICE9IDApCgkgICYmIChzdHJjYXNlY21wIChmcHRyLCAiLk9CSiIpID09IDApKQoJKmZwdHIgPSAwOwoKICAgICAgZnB0ciA9IGZvdXQ7CiAgICAgIHdoaWxlICgqZnB0ciAhPSAwKQoJewoJICAqZnB0ciA9IFRPVVBQRVIgKCpmcHRyKTsKCSAgZnB0cisrOwoJICBpZiAoKCpmcHRyID09ICc7JykKCSAgICAgfHwgKChmcHRyIC0gZm91dCkgPiAzMSkpCgkgICAgKmZwdHIgPSAwOwoJfQogICAgICBfYmZkX3Ztc19vdXRwdXRfY291bnRlZCAoYWJmZCwgZm91dCk7CiAgICB9CiAgZWxzZQogICAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsICJOT05BTUUiKTsKCiAgX2JmZF92bXNfb3V0cHV0X2NvdW50ZWQgKGFiZmQsIEJGRF9WRVJTSU9OX1NUUklORyk7CiAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsIGdldF92bXNfdGltZV9zdHJpbmcgKCksIDE3KTsKICBfYmZkX3Ztc19vdXRwdXRfZmlsbCAoYWJmZCwgMCwgMTcpOwogIF9iZmRfdm1zX291dHB1dF9mbHVzaCAoYWJmZCk7CgogIC8qIExNTi4gICovCiAgX2JmZF92bXNfb3V0cHV0X2JlZ2luIChhYmZkLCBFT0JKX1NfQ19FTUgsIEVNSF9TX0NfTE5NKTsKICBfYmZkX3Ztc19vdXRwdXRfZHVtcCAoYWJmZCwgKHVuc2lnbmVkIGNoYXIgKikgU1RSSU5HX0NPTU1BX0xFTiAoIkdBUyBwcm9HSVMiKSk7CiAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKCiAgLyogU1JDLiAgKi8KICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VNSCwgRU1IX1NfQ19TUkMpOwoKICBmb3IgKHN5bW51bSA9IDA7IHN5bW51bSA8IGFiZmQtPnN5bWNvdW50OyBzeW1udW0rKykKICAgIHsKICAgICAgc3ltYm9sID0gYWJmZC0+b3V0c3ltYm9sc1tzeW1udW1dOwoKICAgICAgaWYgKHN5bWJvbC0+ZmxhZ3MgJiBCU0ZfRklMRSkKCXsKCSAgaWYgKENPTlNUX1NUUk5FUSAoKGNoYXIgKilzeW1ib2wtPm5hbWUsICI8Q0FTRToiKSkKCSAgICB7CgkgICAgICBQUklWIChmbGFnX2hhc2hfbG9uZ19uYW1lcykgPSBzeW1ib2wtPm5hbWVbNl0gLSAnMCc7CgkgICAgICBQUklWIChmbGFnX3Nob3dfYWZ0ZXJfdHJ1bmMpID0gc3ltYm9sLT5uYW1lWzddIC0gJzAnOwoKCSAgICAgIGlmIChoYWRfZmlsZSkKCQlicmVhazsKCSAgICAgIGhhZF9jYXNlID0gMTsKCSAgICAgIGNvbnRpbnVlOwoJICAgIH0KCgkgIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSBzeW1ib2wtPm5hbWUsCgkJCQkoaW50KSBzdHJsZW4gKHN5bWJvbC0+bmFtZSkpOwoJICBpZiAoaGFkX2Nhc2UpCgkgICAgYnJlYWs7CgkgIGhhZF9maWxlID0gMTsKCX0KICAgIH0KCiAgaWYgKHN5bW51bSA9PSBhYmZkLT5zeW1jb3VudCkKICAgIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLCAodW5zaWduZWQgY2hhciAqKSBTVFJJTkdfQ09NTUFfTEVOICgibm9uYW1lIikpOwoKICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwoKICAvKiBUVEwuICAqLwogIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgRU9CSl9TX0NfRU1ILCBFTUhfU19DX1RUTCk7CiAgX2JmZF92bXNfb3V0cHV0X2R1bXAgKGFiZmQsICh1bnNpZ25lZCBjaGFyICopIFNUUklOR19DT01NQV9MRU4gKCJUVEwiKSk7CiAgX2JmZF92bXNfb3V0cHV0X2ZsdXNoIChhYmZkKTsKCiAgLyogQ1BSLiAgKi8KICBfYmZkX3Ztc19vdXRwdXRfYmVnaW4gKGFiZmQsIEVPQkpfU19DX0VNSCwgRU1IX1NfQ19DUFIpOwogIF9iZmRfdm1zX291dHB1dF9kdW1wIChhYmZkLAoJCQkgKHVuc2lnbmVkIGNoYXIgKikiR05VIEJGRCBwb3J0ZWQgYnkgS2xhdXMgS+RtcGYgMTk5NC0xOTk2IiwKCQkJIDM5KTsKICBfYmZkX3Ztc19vdXRwdXRfZmx1c2ggKGFiZmQpOwoKICByZXR1cm4gMDsKfQoKLyogUHJvY2VzcyBFT00vRUVPTSByZWNvcmQKICAgcmV0dXJuIDAgb24gc3VjY2VzcywgLTEgb24gZXJyb3IuICAqLwoKaW50Cl9iZmRfdm1zX3NsdXJwX2VvbSAoYmZkICphYmZkLCBpbnQgb2JqdHlwZSkKewogIHVuc2lnbmVkIGNoYXIgKnZtc19yZWM7CgojaWYgVk1TX0RFQlVHCiAgdm1zX2RlYnVnKDIsICJFT00vRUVPTVxuIik7CiNlbmRpZgoKICB2bXNfcmVjID0gUFJJViAodm1zX3JlYyk7CgogIGlmICgob2JqdHlwZSA9PSBPQkpfU19DX0VPTSkKICAgICB8fCAob2JqdHlwZSA9PSBPQkpfU19DX0VPTVcpKQogICAgewogICAgfQogIGVsc2UKICAgIHsKICAgICAgUFJJViAoZW9tX2RhdGEpLmVvbV9sX3RvdGFsX2xwcyA9IGJmZF9nZXRsMzIgKHZtc19yZWMgKyA0KTsKICAgICAgUFJJViAoZW9tX2RhdGEpLmVvbV9iX2NvbWNvZCA9ICoodm1zX3JlYyArIDgpOwoKICAgICAgaWYgKFBSSVYgKGVvbV9kYXRhKS5lb21fYl9jb21jb2QgPiAxKQoJewoJICAoKl9iZmRfZXJyb3JfaGFuZGxlcikgKF8oIk9iamVjdCBtb2R1bGUgTk9UIGVycm9yLWZyZWUgIVxuIikpOwoJICBiZmRfc2V0X2Vycm9yIChiZmRfZXJyb3JfYmFkX3ZhbHVlKTsKCSAgcmV0dXJuIC0xOwoJfQogICAgICBQUklWIChlb21fZGF0YSkuZW9tX2hhc190cmFuc2ZlciA9IEZBTFNFOwogICAgICBpZiAoUFJJViAocmVjX3NpemUpID4gMTApCgl7CgkgICBQUklWIChlb21fZGF0YSkuZW9tX2hhc190cmFuc2ZlciA9IFRSVUU7CgkgICBQUklWIChlb21fZGF0YSkuZW9tX2JfdGZyZmxnID0gKih2bXNfcmVjICsgOSk7CgkgICBQUklWIChlb21fZGF0YSkuZW9tX2xfcHNpbmR4ID0gYmZkX2dldGwzMiAodm1zX3JlYyArIDEyKTsKCSAgIFBSSVYgKGVvbV9kYXRhKS5lb21fbF90ZnJhZHIgPSBiZmRfZ2V0bDMyICh2bXNfcmVjICsgMTYpOwoKCSAgIGFiZmQtPnN0YXJ0X2FkZHJlc3MgPSBQUklWIChlb21fZGF0YSkuZW9tX2xfdGZyYWRyOwoJfQogICAgfQogIHJldHVybiAwOwp9CgovKiBXcml0ZSBlb20gcmVjb3JkIGZvciBiZmQgYWJmZC4gICovCgppbnQKX2JmZF92bXNfd3JpdGVfZW9tIChiZmQgKmFiZmQsIGludCBvYmp0eXBlKQp7CiNpZiBWTVNfREVCVUcKICB2bXNfZGVidWcgKDIsICJ2bXNfd3JpdGVfZW9tICglcCwgJWQpXG4iLCBhYmZkLCBvYmp0eXBlKTsKI2VuZGlmCgogIF9iZmRfdm1zX291dHB1dF9iZWdpbiAoYWJmZCwgb2JqdHlwZSwgLTEpOwogIF9iZmRfdm1zX291dHB1dF9sb25nIChhYmZkLCAodW5zaWduZWQgbG9uZykgKFBSSVYgKHZtc19saW5rYWdlX2luZGV4KSA+PiAxKSk7CiAgX2JmZF92bXNfb3V0cHV0X2J5dGUgKGFiZmQsIDApOwkvKiBDb21wbGV0aW9uIGNvZGUuICAqLwogIF9iZmRfdm1zX291dHB1dF9ieXRlIChhYmZkLCAwKTsJLyogRmlsbCBieXRlLiAgKi8KCiAgaWYgKGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkgIT0gKGJmZF92bWEpLTEpCiAgICB7CiAgICAgIGFzZWN0aW9uICpzZWN0aW9uOwoKICAgICAgc2VjdGlvbiA9IGJmZF9nZXRfc2VjdGlvbl9ieV9uYW1lIChhYmZkLCAiLmxpbmsiKTsKICAgICAgaWYgKHNlY3Rpb24gPT0gMCkKCXsKCSAgYmZkX3NldF9lcnJvciAoYmZkX2Vycm9yX25vbnJlcHJlc2VudGFibGVfc2VjdGlvbik7CgkgIHJldHVybiAtMTsKCX0KICAgICAgX2JmZF92bXNfb3V0cHV0X3Nob3J0IChhYmZkLCAwKTsKICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsICh1bnNpZ25lZCBsb25nKSAoc2VjdGlvbi0+aW5kZXgpKTsKICAgICAgX2JmZF92bXNfb3V0cHV0X2xvbmcgKGFiZmQsCgkJCSAgICAgKHVuc2lnbmVkIGxvbmcpIGJmZF9nZXRfc3RhcnRfYWRkcmVzcyAoYWJmZCkpOwogICAgICBfYmZkX3Ztc19vdXRwdXRfbG9uZyAoYWJmZCwgMCk7CiAgICB9CgogIF9iZmRfdm1zX291dHB1dF9lbmQgKGFiZmQpOwogIHJldHVybiAwOwp9Cg==