LyoKICogV1BBIFN1cHBsaWNhbnQgLyBDb250cm9sIGludGVyZmFjZSAoc2hhcmVkIGNvZGUgZm9yIGFsbCBiYWNrZW5kcykKICogQ29weXJpZ2h0IChjKSAyMDA0LTIwMTIsIEpvdW5pIE1hbGluZW4gPGpAdzEuZmk+CiAqCiAqIFRoaXMgc29mdHdhcmUgbWF5IGJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgQlNEIGxpY2Vuc2UuCiAqIFNlZSBSRUFETUUgZm9yIG1vcmUgZGV0YWlscy4KICovCgojaW5jbHVkZSAidXRpbHMvaW5jbHVkZXMuaCIKCiNpbmNsdWRlICJ1dGlscy9jb21tb24uaCIKI2luY2x1ZGUgInV0aWxzL2Vsb29wLmgiCiNpbmNsdWRlICJjb21tb24vdmVyc2lvbi5oIgojaW5jbHVkZSAiY29tbW9uL2llZWU4MDJfMTFfZGVmcy5oIgojaW5jbHVkZSAiY29tbW9uL2llZWU4MDJfMTFfY29tbW9uLmgiCiNpbmNsdWRlICJjb21tb24vd3BhX2N0cmwuaCIKI2luY2x1ZGUgImVhcF9wZWVyL2VhcC5oIgojaW5jbHVkZSAiZWFwb2xfc3VwcC9lYXBvbF9zdXBwX3NtLmgiCiNpbmNsdWRlICJyc25fc3VwcC93cGEuaCIKI2luY2x1ZGUgInJzbl9zdXBwL3ByZWF1dGguaCIKI2luY2x1ZGUgInJzbl9zdXBwL3Bta3NhX2NhY2hlLmgiCiNpbmNsdWRlICJsMl9wYWNrZXQvbDJfcGFja2V0LmgiCiNpbmNsdWRlICJ3cHMvd3BzLmgiCiNpbmNsdWRlICJjb25maWcuaCIKI2luY2x1ZGUgIndwYV9zdXBwbGljYW50X2kuaCIKI2luY2x1ZGUgImRyaXZlcl9pLmgiCiNpbmNsdWRlICJ3cHNfc3VwcGxpY2FudC5oIgojaW5jbHVkZSAiaWJzc19yc24uaCIKI2luY2x1ZGUgImFwLmgiCiNpbmNsdWRlICJwMnBfc3VwcGxpY2FudC5oIgojaW5jbHVkZSAicDJwL3AycC5oIgojaW5jbHVkZSAiaHMyMF9zdXBwbGljYW50LmgiCiNpbmNsdWRlICJ3aWZpX2Rpc3BsYXkuaCIKI2luY2x1ZGUgIm5vdGlmeS5oIgojaW5jbHVkZSAiYnNzLmgiCiNpbmNsdWRlICJzY2FuLmgiCiNpbmNsdWRlICJjdHJsX2lmYWNlLmgiCiNpbmNsdWRlICJpbnRlcndvcmtpbmcuaCIKI2luY2x1ZGUgImJsYWNrbGlzdC5oIgojaW5jbHVkZSAiYXV0b3NjYW4uaCIKI2luY2x1ZGUgIndubV9zdGEuaCIKCmV4dGVybiBzdHJ1Y3Qgd3BhX2RyaXZlcl9vcHMgKndwYV9kcml2ZXJzW107CgpzdGF0aWMgaW50IHdwYV9zdXBwbGljYW50X2dsb2JhbF9pZmFjZV9saXN0KHN0cnVjdCB3cGFfZ2xvYmFsICpnbG9iYWwsCgkJCQkJICAgIGNoYXIgKmJ1ZiwgaW50IGxlbik7CnN0YXRpYyBpbnQgd3BhX3N1cHBsaWNhbnRfZ2xvYmFsX2lmYWNlX2ludGVyZmFjZXMoc3RydWN0IHdwYV9nbG9iYWwgKmdsb2JhbCwKCQkJCQkJICBjaGFyICpidWYsIGludCBsZW4pOwoKCnN0YXRpYyBpbnQgcG5vX3N0YXJ0KHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MpCnsKCWludCByZXQ7CglzaXplX3QgaSwgbnVtX3NzaWQ7CglzdHJ1Y3Qgd3BhX3NzaWQgKnNzaWQ7CglzdHJ1Y3Qgd3BhX2RyaXZlcl9zY2FuX3BhcmFtcyBwYXJhbXM7CgoJaWYgKHdwYV9zLT5wbm8pCgkJcmV0dXJuIDA7CgoJaWYgKHdwYV9zLT53cGFfc3RhdGUgPT0gV1BBX1NDQU5OSU5HKSB7CgkJd3BhX3N1cHBsaWNhbnRfY2FuY2VsX3NjaGVkX3NjYW4od3BhX3MpOwoJCXdwYV9zdXBwbGljYW50X2NhbmNlbF9zY2FuKHdwYV9zKTsKCX0KCglvc19tZW1zZXQoJnBhcmFtcywgMCwgc2l6ZW9mKHBhcmFtcykpOwoKCW51bV9zc2lkID0gMDsKCXNzaWQgPSB3cGFfcy0+Y29uZi0+c3NpZDsKCXdoaWxlIChzc2lkKSB7CgkJaWYgKCF3cGFzX25ldHdvcmtfZGlzYWJsZWQod3BhX3MsIHNzaWQpKQoJCQludW1fc3NpZCsrOwoJCXNzaWQgPSBzc2lkLT5uZXh0OwoJfQoJaWYgKG51bV9zc2lkID4gV1BBU19NQVhfU0NBTl9TU0lEUykgewoJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUE5POiBVc2Ugb25seSB0aGUgZmlyc3QgJXUgU1NJRHMgZnJvbSAiCgkJCSAgICIldSIsIFdQQVNfTUFYX1NDQU5fU1NJRFMsICh1bnNpZ25lZCBpbnQpIG51bV9zc2lkKTsKCQludW1fc3NpZCA9IFdQQVNfTUFYX1NDQU5fU1NJRFM7Cgl9CgoJaWYgKG51bV9zc2lkID09IDApIHsKCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlBOTzogTm8gY29uZmlndXJlZCBTU0lEcyIpOwoJCXJldHVybiAtMTsKCX0KCglwYXJhbXMuZmlsdGVyX3NzaWRzID0gb3NfbWFsbG9jKHNpemVvZihzdHJ1Y3Qgd3BhX2RyaXZlcl9zY2FuX2ZpbHRlcikgKgoJCQkJCW51bV9zc2lkKTsKCWlmIChwYXJhbXMuZmlsdGVyX3NzaWRzID09IE5VTEwpCgkJcmV0dXJuIC0xOwoJaSA9IDA7Cglzc2lkID0gd3BhX3MtPmNvbmYtPnNzaWQ7Cgl3aGlsZSAoc3NpZCkgewoJCWlmICghd3Bhc19uZXR3b3JrX2Rpc2FibGVkKHdwYV9zLCBzc2lkKSkgewoJCQlwYXJhbXMuc3NpZHNbaV0uc3NpZCA9IHNzaWQtPnNzaWQ7CgkJCXBhcmFtcy5zc2lkc1tpXS5zc2lkX2xlbiA9IHNzaWQtPnNzaWRfbGVuOwoJCQlwYXJhbXMubnVtX3NzaWRzKys7CgkJCW9zX21lbWNweShwYXJhbXMuZmlsdGVyX3NzaWRzW2ldLnNzaWQsIHNzaWQtPnNzaWQsCgkJCQkgIHNzaWQtPnNzaWRfbGVuKTsKCQkJcGFyYW1zLmZpbHRlcl9zc2lkc1tpXS5zc2lkX2xlbiA9IHNzaWQtPnNzaWRfbGVuOwoJCQlwYXJhbXMubnVtX2ZpbHRlcl9zc2lkcysrOwoJCQlpKys7CgkJCWlmIChpID09IG51bV9zc2lkKQoJCQkJYnJlYWs7CgkJfQoJCXNzaWQgPSBzc2lkLT5uZXh0OwoJfQoKCWlmICh3cGFfcy0+Y29uZi0+ZmlsdGVyX3Jzc2kpCgkJcGFyYW1zLmZpbHRlcl9yc3NpID0gd3BhX3MtPmNvbmYtPmZpbHRlcl9yc3NpOwoKCXJldCA9IHdwYV9kcnZfc2NoZWRfc2Nhbih3cGFfcywgJnBhcmFtcywgMTAgKiAxMDAwKTsKCW9zX2ZyZWUocGFyYW1zLmZpbHRlcl9zc2lkcyk7CglpZiAocmV0ID09IDApCgkJd3BhX3MtPnBubyA9IDE7CglyZXR1cm4gcmV0Owp9CgoKc3RhdGljIGludCBwbm9fc3RvcChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKQp7CglpbnQgcmV0ID0gMDsKCglpZiAod3BhX3MtPnBubykgewoJCXdwYV9zLT5wbm8gPSAwOwoJCXJldCA9IHdwYV9kcnZfc3RvcF9zY2hlZF9zY2FuKHdwYV9zKTsKCX0KCglpZiAod3BhX3MtPndwYV9zdGF0ZSA9PSBXUEFfU0NBTk5JTkcpCgkJd3BhX3N1cHBsaWNhbnRfcmVxX3NjYW4od3BhX3MsIDAsIDApOwoKCXJldHVybiByZXQ7Cn0KCgpzdGF0aWMgaW50IHNldF9ic3NpZF9maWx0ZXIoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY2hhciAqdmFsKQp7CgljaGFyICpwb3M7Cgl1OCBhZGRyW0VUSF9BTEVOXSwgKmZpbHRlciA9IE5VTEwsICpuOwoJc2l6ZV90IGNvdW50ID0gMDsKCglwb3MgPSB2YWw7Cgl3aGlsZSAocG9zKSB7CgkJaWYgKCpwb3MgPT0gJ1wwJykKCQkJYnJlYWs7CgkJaWYgKGh3YWRkcl9hdG9uKHBvcywgYWRkcikpIHsKCQkJb3NfZnJlZShmaWx0ZXIpOwoJCQlyZXR1cm4gLTE7CgkJfQoJCW4gPSBvc19yZWFsbG9jX2FycmF5KGZpbHRlciwgY291bnQgKyAxLCBFVEhfQUxFTik7CgkJaWYgKG4gPT0gTlVMTCkgewoJCQlvc19mcmVlKGZpbHRlcik7CgkJCXJldHVybiAtMTsKCQl9CgkJZmlsdGVyID0gbjsKCQlvc19tZW1jcHkoZmlsdGVyICsgY291bnQgKiBFVEhfQUxFTiwgYWRkciwgRVRIX0FMRU4pOwoJCWNvdW50Kys7CgoJCXBvcyA9IG9zX3N0cmNocihwb3MsICcgJyk7CgkJaWYgKHBvcykKCQkJcG9zKys7Cgl9CgoJd3BhX2hleGR1bXAoTVNHX0RFQlVHLCAiYnNzaWRfZmlsdGVyIiwgZmlsdGVyLCBjb3VudCAqIEVUSF9BTEVOKTsKCW9zX2ZyZWUod3BhX3MtPmJzc2lkX2ZpbHRlcik7Cgl3cGFfcy0+YnNzaWRfZmlsdGVyID0gZmlsdGVyOwoJd3BhX3MtPmJzc2lkX2ZpbHRlcl9jb3VudCA9IGNvdW50OwoKCXJldHVybiAwOwp9CgoKc3RhdGljIGludCBzZXRfZGlzYWxsb3dfYXBzKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGNoYXIgKnZhbCkKewoJY2hhciAqcG9zOwoJdTggYWRkcltFVEhfQUxFTl0sICpic3NpZCA9IE5VTEwsICpuOwoJc3RydWN0IHdwYV9zc2lkX3ZhbHVlICpzc2lkID0gTlVMTCwgKm5zOwoJc2l6ZV90IGNvdW50ID0gMCwgc3NpZF9jb3VudCA9IDA7CglzdHJ1Y3Qgd3BhX3NzaWQgKmM7CgoJLyoKCSAqIGRpc2FsbG93X2xpc3QgOjo9IDxzc2lkX3NwZWM+IHwgPGJzc2lkX3NwZWM+IHwgPGRpc2FsbG93X2xpc3Q+IHwgk5QKCSAqIFNTSURfU1BFQyA6Oj0gc3NpZCA8U1NJRF9IRVg+CgkgKiBCU1NJRF9TUEVDIDo6PSBic3NpZCA8QlNTSURfSEVYPgoJICovCgoJcG9zID0gdmFsOwoJd2hpbGUgKHBvcykgewoJCWlmICgqcG9zID09ICdcMCcpCgkJCWJyZWFrOwoJCWlmIChvc19zdHJuY21wKHBvcywgImJzc2lkICIsIDYpID09IDApIHsKCQkJaW50IHJlczsKCQkJcG9zICs9IDY7CgkJCXJlcyA9IGh3YWRkcl9hdG9uMihwb3MsIGFkZHIpOwoJCQlpZiAocmVzIDwgMCkgewoJCQkJb3NfZnJlZShzc2lkKTsKCQkJCW9zX2ZyZWUoYnNzaWQpOwoJCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJJbnZhbGlkIGRpc2FsbG93X2FwcyAiCgkJCQkJICAgIkJTU0lEIHZhbHVlICclcyciLCBwb3MpOwoJCQkJcmV0dXJuIC0xOwoJCQl9CgkJCXBvcyArPSByZXM7CgkJCW4gPSBvc19yZWFsbG9jX2FycmF5KGJzc2lkLCBjb3VudCArIDEsIEVUSF9BTEVOKTsKCQkJaWYgKG4gPT0gTlVMTCkgewoJCQkJb3NfZnJlZShzc2lkKTsKCQkJCW9zX2ZyZWUoYnNzaWQpOwoJCQkJcmV0dXJuIC0xOwoJCQl9CgkJCWJzc2lkID0gbjsKCQkJb3NfbWVtY3B5KGJzc2lkICsgY291bnQgKiBFVEhfQUxFTiwgYWRkciwgRVRIX0FMRU4pOwoJCQljb3VudCsrOwoJCX0gZWxzZSBpZiAob3Nfc3RybmNtcChwb3MsICJzc2lkICIsIDUpID09IDApIHsKCQkJY2hhciAqZW5kOwoJCQlwb3MgKz0gNTsKCgkJCWVuZCA9IHBvczsKCQkJd2hpbGUgKCplbmQpIHsKCQkJCWlmICgqZW5kID09ICdcMCcgfHwgKmVuZCA9PSAnICcpCgkJCQkJYnJlYWs7CgkJCQllbmQrKzsKCQkJfQoKCQkJbnMgPSBvc19yZWFsbG9jX2FycmF5KHNzaWQsIHNzaWRfY291bnQgKyAxLAoJCQkJCSAgICAgIHNpemVvZihzdHJ1Y3Qgd3BhX3NzaWRfdmFsdWUpKTsKCQkJaWYgKG5zID09IE5VTEwpIHsKCQkJCW9zX2ZyZWUoc3NpZCk7CgkJCQlvc19mcmVlKGJzc2lkKTsKCQkJCXJldHVybiAtMTsKCQkJfQoJCQlzc2lkID0gbnM7CgoJCQlpZiAoKGVuZCAtIHBvcykgJiAweDAxIHx8IGVuZCAtIHBvcyA+IDIgKiAzMiB8fAoJCQkgICAgaGV4c3RyMmJpbihwb3MsIHNzaWRbc3NpZF9jb3VudF0uc3NpZCwKCQkJCSAgICAgICAoZW5kIC0gcG9zKSAvIDIpIDwgMCkgewoJCQkJb3NfZnJlZShzc2lkKTsKCQkJCW9zX2ZyZWUoYnNzaWQpOwoJCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJJbnZhbGlkIGRpc2FsbG93X2FwcyAiCgkJCQkJICAgIlNTSUQgdmFsdWUgJyVzJyIsIHBvcyk7CgkJCQlyZXR1cm4gLTE7CgkJCX0KCQkJc3NpZFtzc2lkX2NvdW50XS5zc2lkX2xlbiA9IChlbmQgLSBwb3MpIC8gMjsKCQkJd3BhX2hleGR1bXBfYXNjaWkoTVNHX0RFQlVHLCAiZGlzYWxsb3dfYXBzIFNTSUQiLAoJCQkJCSAgc3NpZFtzc2lkX2NvdW50XS5zc2lkLAoJCQkJCSAgc3NpZFtzc2lkX2NvdW50XS5zc2lkX2xlbik7CgkJCXNzaWRfY291bnQrKzsKCQkJcG9zID0gZW5kOwoJCX0gZWxzZSB7CgkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiVW5leHBlY3RlZCBkaXNhbGxvd19hcHMgdmFsdWUgIgoJCQkJICAgIiclcyciLCBwb3MpOwoJCQlvc19mcmVlKHNzaWQpOwoJCQlvc19mcmVlKGJzc2lkKTsKCQkJcmV0dXJuIC0xOwoJCX0KCgkJcG9zID0gb3Nfc3RyY2hyKHBvcywgJyAnKTsKCQlpZiAocG9zKQoJCQlwb3MrKzsKCX0KCgl3cGFfaGV4ZHVtcChNU0dfREVCVUcsICJkaXNhbGxvd19hcHNfYnNzaWQiLCBic3NpZCwgY291bnQgKiBFVEhfQUxFTik7Cglvc19mcmVlKHdwYV9zLT5kaXNhbGxvd19hcHNfYnNzaWQpOwoJd3BhX3MtPmRpc2FsbG93X2Fwc19ic3NpZCA9IGJzc2lkOwoJd3BhX3MtPmRpc2FsbG93X2Fwc19ic3NpZF9jb3VudCA9IGNvdW50OwoKCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiZGlzYWxsb3dfYXBzX3NzaWRfY291bnQgJWQiLCAoaW50KSBzc2lkX2NvdW50KTsKCW9zX2ZyZWUod3BhX3MtPmRpc2FsbG93X2Fwc19zc2lkKTsKCXdwYV9zLT5kaXNhbGxvd19hcHNfc3NpZCA9IHNzaWQ7Cgl3cGFfcy0+ZGlzYWxsb3dfYXBzX3NzaWRfY291bnQgPSBzc2lkX2NvdW50OwoKCWlmICghd3BhX3MtPmN1cnJlbnRfc3NpZCB8fCB3cGFfcy0+d3BhX3N0YXRlIDwgV1BBX0FVVEhFTlRJQ0FUSU5HKQoJCXJldHVybiAwOwoKCWMgPSB3cGFfcy0+Y3VycmVudF9zc2lkOwoJaWYgKGMtPm1vZGUgIT0gV1BBU19NT0RFX0lORlJBICYmIGMtPm1vZGUgIT0gV1BBU19NT0RFX0lCU1MpCgkJcmV0dXJuIDA7CgoJaWYgKCFkaXNhbGxvd2VkX2Jzc2lkKHdwYV9zLCB3cGFfcy0+YnNzaWQpICYmCgkgICAgIWRpc2FsbG93ZWRfc3NpZCh3cGFfcywgYy0+c3NpZCwgYy0+c3NpZF9sZW4pKQoJCXJldHVybiAwOwoKCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiRGlzY29ubmVjdCBhbmQgdHJ5IHRvIGZpbmQgYW5vdGhlciBuZXR3b3JrICIKCQkgICAiYmVjYXVzZSBjdXJyZW50IEFQIHdhcyBtYXJrZWQgZGlzYWxsb3dlZCIpOwoKI2lmZGVmIENPTkZJR19TTUUKCXdwYV9zLT5zbWUucHJldl9ic3NpZF9zZXQgPSAwOwojZW5kaWYgLyogQ09ORklHX1NNRSAqLwoJd3BhX3MtPnJlYXNzb2NpYXRlID0gMTsKCXdwYV9zdXBwbGljYW50X2RlYXV0aGVudGljYXRlKHdwYV9zLCBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyk7Cgl3cGFfc3VwcGxpY2FudF9yZXFfc2Nhbih3cGFfcywgMCwgMCk7CgoJcmV0dXJuIDA7Cn0KCgpzdGF0aWMgaW50IHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2Vfc2V0KHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCgkJCQkJIGNoYXIgKmNtZCkKewoJY2hhciAqdmFsdWU7CglpbnQgcmV0ID0gMDsKCgl2YWx1ZSA9IG9zX3N0cmNocihjbWQsICcgJyk7CglpZiAodmFsdWUgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CgkqdmFsdWUrKyA9ICdcMCc7CgoJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDVFJMX0lGQUNFIFNFVCAnJXMnPSclcyciLCBjbWQsIHZhbHVlKTsKCWlmIChvc19zdHJjYXNlY21wKGNtZCwgIkVBUE9MOjpoZWxkUGVyaW9kIikgPT0gMCkgewoJCWVhcG9sX3NtX2NvbmZpZ3VyZSh3cGFfcy0+ZWFwb2wsCgkJCQkgICBhdG9pKHZhbHVlKSwgLTEsIC0xLCAtMSk7Cgl9IGVsc2UgaWYgKG9zX3N0cmNhc2VjbXAoY21kLCAiRUFQT0w6OmF1dGhQZXJpb2QiKSA9PSAwKSB7CgkJZWFwb2xfc21fY29uZmlndXJlKHdwYV9zLT5lYXBvbCwKCQkJCSAgIC0xLCBhdG9pKHZhbHVlKSwgLTEsIC0xKTsKCX0gZWxzZSBpZiAob3Nfc3RyY2FzZWNtcChjbWQsICJFQVBPTDo6c3RhcnRQZXJpb2QiKSA9PSAwKSB7CgkJZWFwb2xfc21fY29uZmlndXJlKHdwYV9zLT5lYXBvbCwKCQkJCSAgIC0xLCAtMSwgYXRvaSh2YWx1ZSksIC0xKTsKCX0gZWxzZSBpZiAob3Nfc3RyY2FzZWNtcChjbWQsICJFQVBPTDo6bWF4U3RhcnQiKSA9PSAwKSB7CgkJZWFwb2xfc21fY29uZmlndXJlKHdwYV9zLT5lYXBvbCwKCQkJCSAgIC0xLCAtMSwgLTEsIGF0b2kodmFsdWUpKTsKCX0gZWxzZSBpZiAob3Nfc3RyY2FzZWNtcChjbWQsICJkb3QxMVJTTkFDb25maWdQTUtMaWZldGltZSIpID09IDApIHsKCQlpZiAod3BhX3NtX3NldF9wYXJhbSh3cGFfcy0+d3BhLCBSU05BX1BNS19MSUZFVElNRSwKCQkJCSAgICAgYXRvaSh2YWx1ZSkpKQoJCQlyZXQgPSAtMTsKCX0gZWxzZSBpZiAob3Nfc3RyY2FzZWNtcChjbWQsICJkb3QxMVJTTkFDb25maWdQTUtSZWF1dGhUaHJlc2hvbGQiKSA9PQoJCSAgIDApIHsKCQlpZiAod3BhX3NtX3NldF9wYXJhbSh3cGFfcy0+d3BhLCBSU05BX1BNS19SRUFVVEhfVEhSRVNIT0xELAoJCQkJICAgICBhdG9pKHZhbHVlKSkpCgkJCXJldCA9IC0xOwoJfSBlbHNlIGlmIChvc19zdHJjYXNlY21wKGNtZCwgImRvdDExUlNOQUNvbmZpZ1NBVGltZW91dCIpID09IDApIHsKCQlpZiAod3BhX3NtX3NldF9wYXJhbSh3cGFfcy0+d3BhLCBSU05BX1NBX1RJTUVPVVQsIGF0b2kodmFsdWUpKSkKCQkJcmV0ID0gLTE7Cgl9IGVsc2UgaWYgKG9zX3N0cmNhc2VjbXAoY21kLCAid3BzX2ZyYWdtZW50X3NpemUiKSA9PSAwKSB7CgkJd3BhX3MtPndwc19mcmFnbWVudF9zaXplID0gYXRvaSh2YWx1ZSk7CiNpZmRlZiBDT05GSUdfV1BTX1RFU1RJTkcKCX0gZWxzZSBpZiAob3Nfc3RyY2FzZWNtcChjbWQsICJ3cHNfdmVyc2lvbl9udW1iZXIiKSA9PSAwKSB7CgkJbG9uZyBpbnQgdmFsOwoJCXZhbCA9IHN0cnRvbCh2YWx1ZSwgTlVMTCwgMCk7CgkJaWYgKHZhbCA8IDAgfHwgdmFsID4gMHhmZikgewoJCQlyZXQgPSAtMTsKCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXUFM6IEludmFsaWQgIgoJCQkJICAgIndwc192ZXJzaW9uX251bWJlciAlbGQiLCB2YWwpOwoJCX0gZWxzZSB7CgkJCXdwc192ZXJzaW9uX251bWJlciA9IHZhbDsKCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXUFM6IFRlc3RpbmcgLSBmb3JjZSBXUFMgIgoJCQkJICAgInZlcnNpb24gJXUuJXUiLAoJCQkJICAgKHdwc192ZXJzaW9uX251bWJlciAmIDB4ZjApID4+IDQsCgkJCQkgICB3cHNfdmVyc2lvbl9udW1iZXIgJiAweDBmKTsKCQl9Cgl9IGVsc2UgaWYgKG9zX3N0cmNhc2VjbXAoY21kLCAid3BzX3Rlc3RpbmdfZHVtbXlfY3JlZCIpID09IDApIHsKCQl3cHNfdGVzdGluZ19kdW1teV9jcmVkID0gYXRvaSh2YWx1ZSk7CgkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXUFM6IFRlc3RpbmcgLSBkdW1teV9jcmVkPSVkIiwKCQkJICAgd3BzX3Rlc3RpbmdfZHVtbXlfY3JlZCk7CiNlbmRpZiAvKiBDT05GSUdfV1BTX1RFU1RJTkcgKi8KCX0gZWxzZSBpZiAob3Nfc3RyY2FzZWNtcChjbWQsICJhbXBkdSIpID09IDApIHsKCQlpZiAod3BhX2Rydl9hbXBkdSh3cGFfcywgYXRvaSh2YWx1ZSkpIDwgMCkKCQkJcmV0ID0gLTE7CiNpZmRlZiBDT05GSUdfVERMU19URVNUSU5HCgl9IGVsc2UgaWYgKG9zX3N0cmNhc2VjbXAoY21kLCAidGRsc190ZXN0aW5nIikgPT0gMCkgewoJCWV4dGVybiB1bnNpZ25lZCBpbnQgdGRsc190ZXN0aW5nOwoJCXRkbHNfdGVzdGluZyA9IHN0cnRvbCh2YWx1ZSwgTlVMTCwgMCk7CgkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJURExTOiB0ZGxzX3Rlc3Rpbmc9MHgleCIsIHRkbHNfdGVzdGluZyk7CiNlbmRpZiAvKiBDT05GSUdfVERMU19URVNUSU5HICovCiNpZmRlZiBDT05GSUdfVERMUwoJfSBlbHNlIGlmIChvc19zdHJjYXNlY21wKGNtZCwgInRkbHNfZGlzYWJsZWQiKSA9PSAwKSB7CgkJaW50IGRpc2FibGVkID0gYXRvaSh2YWx1ZSk7CgkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJURExTOiB0ZGxzX2Rpc2FibGVkPSVkIiwgZGlzYWJsZWQpOwoJCWlmIChkaXNhYmxlZCkgewoJCQlpZiAod3BhX2Rydl90ZGxzX29wZXIod3BhX3MsIFRETFNfRElTQUJMRSwgTlVMTCkgPCAwKQoJCQkJcmV0ID0gLTE7CgkJfSBlbHNlIGlmICh3cGFfZHJ2X3RkbHNfb3Blcih3cGFfcywgVERMU19FTkFCTEUsIE5VTEwpIDwgMCkKCQkJcmV0ID0gLTE7CgkJd3BhX3RkbHNfZW5hYmxlKHdwYV9zLT53cGEsICFkaXNhYmxlZCk7CiNlbmRpZiAvKiBDT05GSUdfVERMUyAqLwoJfSBlbHNlIGlmIChvc19zdHJjYXNlY21wKGNtZCwgInBubyIpID09IDApIHsKCQlpZiAoYXRvaSh2YWx1ZSkpCgkJCXJldCA9IHBub19zdGFydCh3cGFfcyk7CgkJZWxzZQoJCQlyZXQgPSBwbm9fc3RvcCh3cGFfcyk7Cgl9IGVsc2UgaWYgKG9zX3N0cmNhc2VjbXAoY21kLCAicmFkaW9fZGlzYWJsZWQiKSA9PSAwKSB7CgkJaW50IGRpc2FibGVkID0gYXRvaSh2YWx1ZSk7CgkJaWYgKHdwYV9kcnZfcmFkaW9fZGlzYWJsZSh3cGFfcywgZGlzYWJsZWQpIDwgMCkKCQkJcmV0ID0gLTE7CgkJZWxzZSBpZiAoZGlzYWJsZWQpCgkJCXdwYV9zdXBwbGljYW50X3NldF9zdGF0ZSh3cGFfcywgV1BBX0lOQUNUSVZFKTsKCX0gZWxzZSBpZiAob3Nfc3RyY2FzZWNtcChjbWQsICJ1YXBzZCIpID09IDApIHsKCQlpZiAob3Nfc3RyY21wKHZhbHVlLCAiZGlzYWJsZSIpID09IDApCgkJCXdwYV9zLT5zZXRfc3RhX3VhcHNkID0gMDsKCQllbHNlIHsKCQkJaW50IGJlLCBiaywgdmksIHZvOwoJCQljaGFyICpwb3M7CgkJCS8qIGZvcm1hdDogQkUsQkssVkksVk87bWF4IFNQIExlbmd0aCAqLwoJCQliZSA9IGF0b2kodmFsdWUpOwoJCQlwb3MgPSBvc19zdHJjaHIodmFsdWUsICcsJyk7CgkJCWlmIChwb3MgPT0gTlVMTCkKCQkJCXJldHVybiAtMTsKCQkJcG9zKys7CgkJCWJrID0gYXRvaShwb3MpOwoJCQlwb3MgPSBvc19zdHJjaHIocG9zLCAnLCcpOwoJCQlpZiAocG9zID09IE5VTEwpCgkJCQlyZXR1cm4gLTE7CgkJCXBvcysrOwoJCQl2aSA9IGF0b2kocG9zKTsKCQkJcG9zID0gb3Nfc3RyY2hyKHBvcywgJywnKTsKCQkJaWYgKHBvcyA9PSBOVUxMKQoJCQkJcmV0dXJuIC0xOwoJCQlwb3MrKzsKCQkJdm8gPSBhdG9pKHBvcyk7CgkJCS8qIGlnbm9yZSBtYXggU1AgTGVuZ3RoIGZvciBub3cgKi8KCgkJCXdwYV9zLT5zZXRfc3RhX3VhcHNkID0gMTsKCQkJd3BhX3MtPnN0YV91YXBzZCA9IDA7CgkJCWlmIChiZSkKCQkJCXdwYV9zLT5zdGFfdWFwc2QgfD0gQklUKDApOwoJCQlpZiAoYmspCgkJCQl3cGFfcy0+c3RhX3VhcHNkIHw9IEJJVCgxKTsKCQkJaWYgKHZpKQoJCQkJd3BhX3MtPnN0YV91YXBzZCB8PSBCSVQoMik7CgkJCWlmICh2bykKCQkJCXdwYV9zLT5zdGFfdWFwc2QgfD0gQklUKDMpOwoJCX0KCX0gZWxzZSBpZiAob3Nfc3RyY2FzZWNtcChjbWQsICJwcyIpID09IDApIHsKCQlyZXQgPSB3cGFfZHJ2X3NldF9wMnBfcG93ZXJzYXZlKHdwYV9zLCBhdG9pKHZhbHVlKSwgLTEsIC0xKTsKI2lmZGVmIENPTkZJR19XSUZJX0RJU1BMQVkKCX0gZWxzZSBpZiAob3Nfc3RyY2FzZWNtcChjbWQsICJ3aWZpX2Rpc3BsYXkiKSA9PSAwKSB7CgkJd2lmaV9kaXNwbGF5X2VuYWJsZSh3cGFfcy0+Z2xvYmFsLCAhIWF0b2kodmFsdWUpKTsKI2VuZGlmIC8qIENPTkZJR19XSUZJX0RJU1BMQVkgKi8KCX0gZWxzZSBpZiAob3Nfc3RyY2FzZWNtcChjbWQsICJic3NpZF9maWx0ZXIiKSA9PSAwKSB7CgkJcmV0ID0gc2V0X2Jzc2lkX2ZpbHRlcih3cGFfcywgdmFsdWUpOwoJfSBlbHNlIGlmIChvc19zdHJjYXNlY21wKGNtZCwgImRpc2FsbG93X2FwcyIpID09IDApIHsKCQlyZXQgPSBzZXRfZGlzYWxsb3dfYXBzKHdwYV9zLCB2YWx1ZSk7Cgl9IGVsc2UgaWYgKG9zX3N0cmNhc2VjbXAoY21kLCAibm9fa2VlcF9hbGl2ZSIpID09IDApIHsKCQl3cGFfcy0+bm9fa2VlcF9hbGl2ZSA9ICEhYXRvaSh2YWx1ZSk7Cgl9IGVsc2UgewoJCXZhbHVlWy0xXSA9ICc9JzsKCQlyZXQgPSB3cGFfY29uZmlnX3Byb2Nlc3NfZ2xvYmFsKHdwYV9zLT5jb25mLCBjbWQsIC0xKTsKCQlpZiAocmV0ID09IDApCgkJCXdwYV9zdXBwbGljYW50X3VwZGF0ZV9jb25maWcod3BhX3MpOwoJfQoKCXJldHVybiByZXQ7Cn0KCgpzdGF0aWMgaW50IHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2VfZ2V0KHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCgkJCQkJIGNoYXIgKmNtZCwgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQp7CglpbnQgcmVzID0gLTE7CgoJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDVFJMX0lGQUNFIEdFVCAnJXMnIiwgY21kKTsKCglpZiAob3Nfc3RyY21wKGNtZCwgInZlcnNpb24iKSA9PSAwKSB7CgkJcmVzID0gb3Nfc25wcmludGYoYnVmLCBidWZsZW4sICIlcyIsIFZFUlNJT05fU1RSKTsKCX0gZWxzZSBpZiAob3Nfc3RyY2FzZWNtcChjbWQsICJjb3VudHJ5IikgPT0gMCkgewoJCWlmICh3cGFfcy0+Y29uZi0+Y291bnRyeVswXSAmJiB3cGFfcy0+Y29uZi0+Y291bnRyeVsxXSkKCQkJcmVzID0gb3Nfc25wcmludGYoYnVmLCBidWZsZW4sICIlYyVjIiwKCQkJCQkgIHdwYV9zLT5jb25mLT5jb3VudHJ5WzBdLAoJCQkJCSAgd3BhX3MtPmNvbmYtPmNvdW50cnlbMV0pOwojaWZkZWYgQ09ORklHX1dJRklfRElTUExBWQoJfSBlbHNlIGlmIChvc19zdHJjYXNlY21wKGNtZCwgIndpZmlfZGlzcGxheSIpID09IDApIHsKCQlyZXMgPSBvc19zbnByaW50ZihidWYsIGJ1ZmxlbiwgIiVkIiwKCQkJCSAgd3BhX3MtPmdsb2JhbC0+d2lmaV9kaXNwbGF5KTsKCQlpZiAocmVzIDwgMCB8fCAodW5zaWduZWQgaW50KSByZXMgPj0gYnVmbGVuKQoJCQlyZXR1cm4gLTE7CgkJcmV0dXJuIHJlczsKI2VuZGlmIC8qIENPTkZJR19XSUZJX0RJU1BMQVkgKi8KCX0KCglpZiAocmVzIDwgMCB8fCAodW5zaWduZWQgaW50KSByZXMgPj0gYnVmbGVuKQoJCXJldHVybiAtMTsKCXJldHVybiByZXM7Cn0KCgojaWZkZWYgSUVFRTgwMjFYX0VBUE9MCnN0YXRpYyBpbnQgd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV9wcmVhdXRoKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCgkJCQkJICAgICBjaGFyICphZGRyKQp7Cgl1OCBic3NpZFtFVEhfQUxFTl07CglzdHJ1Y3Qgd3BhX3NzaWQgKnNzaWQgPSB3cGFfcy0+Y3VycmVudF9zc2lkOwoKCWlmIChod2FkZHJfYXRvbihhZGRyLCBic3NpZCkpIHsKCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0UgUFJFQVVUSDogaW52YWxpZCBhZGRyZXNzICIKCQkJICAgIiclcyciLCBhZGRyKTsKCQlyZXR1cm4gLTE7Cgl9CgoJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDVFJMX0lGQUNFIFBSRUFVVEggIiBNQUNTVFIsIE1BQzJTVFIoYnNzaWQpKTsKCXJzbl9wcmVhdXRoX2RlaW5pdCh3cGFfcy0+d3BhKTsKCWlmIChyc25fcHJlYXV0aF9pbml0KHdwYV9zLT53cGEsIGJzc2lkLCBzc2lkID8gJnNzaWQtPmVhcCA6IE5VTEwpKQoJCXJldHVybiAtMTsKCglyZXR1cm4gMDsKfQojZW5kaWYgLyogSUVFRTgwMjFYX0VBUE9MICovCgoKI2lmZGVmIENPTkZJR19QRUVSS0VZCi8qIE1MTUUtU1RLU1RBUlQucmVxdWVzdChwZWVyKSAqLwpzdGF0aWMgaW50IHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2Vfc3Rrc3RhcnQoCglzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjaGFyICphZGRyKQp7Cgl1OCBwZWVyW0VUSF9BTEVOXTsKCglpZiAoaHdhZGRyX2F0b24oYWRkciwgcGVlcikpIHsKCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0UgU1RLU1RBUlQ6IGludmFsaWQgIgoJCQkgICAiYWRkcmVzcyAnJXMnIiwgYWRkcik7CgkJcmV0dXJuIC0xOwoJfQoKCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRSBTVEtTVEFSVCAiIE1BQ1NUUiwKCQkgICBNQUMyU1RSKHBlZXIpKTsKCglyZXR1cm4gd3BhX3NtX3N0a3N0YXJ0KHdwYV9zLT53cGEsIHBlZXIpOwp9CiNlbmRpZiAvKiBDT05GSUdfUEVFUktFWSAqLwoKCiNpZmRlZiBDT05GSUdfVERMUwoKc3RhdGljIGludCB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3RkbHNfZGlzY292ZXIoCglzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjaGFyICphZGRyKQp7Cgl1OCBwZWVyW0VUSF9BTEVOXTsKCWludCByZXQ7CgoJaWYgKGh3YWRkcl9hdG9uKGFkZHIsIHBlZXIpKSB7CgkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDVFJMX0lGQUNFIFRETFNfRElTQ09WRVI6IGludmFsaWQgIgoJCQkgICAiYWRkcmVzcyAnJXMnIiwgYWRkcik7CgkJcmV0dXJuIC0xOwoJfQoKCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRSBURExTX0RJU0NPVkVSICIgTUFDU1RSLAoJCSAgIE1BQzJTVFIocGVlcikpOwoKCWlmICh3cGFfdGRsc19pc19leHRlcm5hbF9zZXR1cCh3cGFfcy0+d3BhKSkKCQlyZXQgPSB3cGFfdGRsc19zZW5kX2Rpc2NvdmVyeV9yZXF1ZXN0KHdwYV9zLT53cGEsIHBlZXIpOwoJZWxzZQoJCXJldCA9IHdwYV9kcnZfdGRsc19vcGVyKHdwYV9zLCBURExTX0RJU0NPVkVSWV9SRVEsIHBlZXIpOwoKCXJldHVybiByZXQ7Cn0KCgpzdGF0aWMgaW50IHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2VfdGRsc19zZXR1cCgKCXN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGNoYXIgKmFkZHIpCnsKCXU4IHBlZXJbRVRIX0FMRU5dOwoJaW50IHJldDsKCglpZiAoaHdhZGRyX2F0b24oYWRkciwgcGVlcikpIHsKCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0UgVERMU19TRVRVUDogaW52YWxpZCAiCgkJCSAgICJhZGRyZXNzICclcyciLCBhZGRyKTsKCQlyZXR1cm4gLTE7Cgl9CgoJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDVFJMX0lGQUNFIFRETFNfU0VUVVAgIiBNQUNTVFIsCgkJICAgTUFDMlNUUihwZWVyKSk7CgoJd3BhX3RkbHNfcmVtb3ZlKHdwYV9zLT53cGEsIHBlZXIpOwoKCWlmICh3cGFfdGRsc19pc19leHRlcm5hbF9zZXR1cCh3cGFfcy0+d3BhKSkKCQlyZXQgPSB3cGFfdGRsc19zdGFydCh3cGFfcy0+d3BhLCBwZWVyKTsKCWVsc2UKCQlyZXQgPSB3cGFfZHJ2X3RkbHNfb3Blcih3cGFfcywgVERMU19TRVRVUCwgcGVlcik7CgoJcmV0dXJuIHJldDsKfQoKCnN0YXRpYyBpbnQgd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV90ZGxzX3RlYXJkb3duKAoJc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY2hhciAqYWRkcikKewoJdTggcGVlcltFVEhfQUxFTl07CgoJaWYgKGh3YWRkcl9hdG9uKGFkZHIsIHBlZXIpKSB7CgkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDVFJMX0lGQUNFIFRETFNfVEVBUkRPV046IGludmFsaWQgIgoJCQkgICAiYWRkcmVzcyAnJXMnIiwgYWRkcik7CgkJcmV0dXJuIC0xOwoJfQoKCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRSBURExTX1RFQVJET1dOICIgTUFDU1RSLAoJCSAgIE1BQzJTVFIocGVlcikpOwoKCXJldHVybiB3cGFfdGRsc190ZWFyZG93bl9saW5rKHdwYV9zLT53cGEsIHBlZXIsCgkJCQkgICAgICBXTEFOX1JFQVNPTl9URExTX1RFQVJET1dOX1VOU1BFQ0lGSUVEKTsKfQoKI2VuZGlmIC8qIENPTkZJR19URExTICovCgoKI2lmZGVmIENPTkZJR19JRUVFODAyMTFSCnN0YXRpYyBpbnQgd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV9mdF9kcygKCXN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGNoYXIgKmFkZHIpCnsKCXU4IHRhcmdldF9hcFtFVEhfQUxFTl07CglzdHJ1Y3Qgd3BhX2JzcyAqYnNzOwoJY29uc3QgdTggKm1kaWU7CgoJaWYgKGh3YWRkcl9hdG9uKGFkZHIsIHRhcmdldF9hcCkpIHsKCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0UgRlRfRFM6IGludmFsaWQgIgoJCQkgICAiYWRkcmVzcyAnJXMnIiwgYWRkcik7CgkJcmV0dXJuIC0xOwoJfQoKCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRSBGVF9EUyAiIE1BQ1NUUiwgTUFDMlNUUih0YXJnZXRfYXApKTsKCglic3MgPSB3cGFfYnNzX2dldF9ic3NpZCh3cGFfcywgdGFyZ2V0X2FwKTsKCWlmIChic3MpCgkJbWRpZSA9IHdwYV9ic3NfZ2V0X2llKGJzcywgV0xBTl9FSURfTU9CSUxJVFlfRE9NQUlOKTsKCWVsc2UKCQltZGllID0gTlVMTDsKCglyZXR1cm4gd3BhX2Z0X3N0YXJ0X292ZXJfZHMod3BhX3MtPndwYSwgdGFyZ2V0X2FwLCBtZGllKTsKfQojZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVIgKi8KCgojaWZkZWYgQ09ORklHX1dQUwpzdGF0aWMgaW50IHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2Vfd3BzX3BiYyhzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAoJCQkJCSAgICAgY2hhciAqY21kKQp7Cgl1OCBic3NpZFtFVEhfQUxFTl0sICpfYnNzaWQgPSBic3NpZDsKI2lmZGVmIENPTkZJR19QMlAKCXU4IHAycF9kZXZfYWRkcltFVEhfQUxFTl07CiNlbmRpZiAvKiBDT05GSUdfUDJQICovCiNpZmRlZiBDT05GSUdfQVAKCXU4ICpfcDJwX2Rldl9hZGRyID0gTlVMTDsKI2VuZGlmIC8qIENPTkZJR19BUCAqLwoKCWlmIChjbWQgPT0gTlVMTCB8fCBvc19zdHJjbXAoY21kLCAiYW55IikgPT0gMCB8fCBjbWRbMF0gPT0gJ1wwJykgewoJCV9ic3NpZCA9IE5VTEw7CiNpZmRlZiBDT05GSUdfUDJQCgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoY21kLCAicDJwX2Rldl9hZGRyPSIsIDEzKSA9PSAwKSB7CgkJaWYgKGh3YWRkcl9hdG9uKGNtZCArIDEzLCBwMnBfZGV2X2FkZHIpKSB7CgkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRSBXUFNfUEJDOiBpbnZhbGlkICIKCQkJCSAgICJQMlAgRGV2aWNlIEFkZHJlc3MgJyVzJyIsCgkJCQkgICBjbWQgKyAxMyk7CgkJCXJldHVybiAtMTsKCQl9CgkJX3AycF9kZXZfYWRkciA9IHAycF9kZXZfYWRkcjsKI2VuZGlmIC8qIENPTkZJR19QMlAgKi8KCX0gZWxzZSBpZiAoaHdhZGRyX2F0b24oY21kLCBic3NpZCkpIHsKCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0UgV1BTX1BCQzogaW52YWxpZCBCU1NJRCAnJXMnIiwKCQkJICAgY21kKTsKCQlyZXR1cm4gLTE7Cgl9CgojaWZkZWYgQ09ORklHX0FQCglpZiAod3BhX3MtPmFwX2lmYWNlKQoJCXJldHVybiB3cGFfc3VwcGxpY2FudF9hcF93cHNfcGJjKHdwYV9zLCBfYnNzaWQsIF9wMnBfZGV2X2FkZHIpOwojZW5kaWYgLyogQ09ORklHX0FQICovCgoJcmV0dXJuIHdwYXNfd3BzX3N0YXJ0X3BiYyh3cGFfcywgX2Jzc2lkLCAwKTsKfQoKCnN0YXRpYyBpbnQgd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV93cHNfcGluKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCgkJCQkJICAgICBjaGFyICpjbWQsIGNoYXIgKmJ1ZiwKCQkJCQkgICAgIHNpemVfdCBidWZsZW4pCnsKCXU4IGJzc2lkW0VUSF9BTEVOXSwgKl9ic3NpZCA9IGJzc2lkOwoJY2hhciAqcGluOwoJaW50IHJldDsKCglwaW4gPSBvc19zdHJjaHIoY21kLCAnICcpOwoJaWYgKHBpbikKCQkqcGluKysgPSAnXDAnOwoKCWlmIChvc19zdHJjbXAoY21kLCAiYW55IikgPT0gMCkKCQlfYnNzaWQgPSBOVUxMOwoJZWxzZSBpZiAob3Nfc3RyY21wKGNtZCwgImdldCIpID09IDApIHsKCQlyZXQgPSB3cHNfZ2VuZXJhdGVfcGluKCk7CgkJZ290byBkb25lOwoJfSBlbHNlIGlmIChod2FkZHJfYXRvbihjbWQsIGJzc2lkKSkgewoJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRSBXUFNfUElOOiBpbnZhbGlkIEJTU0lEICclcyciLAoJCQkgICBjbWQpOwoJCXJldHVybiAtMTsKCX0KCiNpZmRlZiBDT05GSUdfQVAKCWlmICh3cGFfcy0+YXBfaWZhY2UpIHsKCQlpbnQgdGltZW91dCA9IDA7CgkJY2hhciAqcG9zOwoKCQlpZiAocGluKSB7CgkJCXBvcyA9IG9zX3N0cmNocihwaW4sICcgJyk7CgkJCWlmIChwb3MpIHsKCQkJCSpwb3MrKyA9ICdcMCc7CgkJCQl0aW1lb3V0ID0gYXRvaShwb3MpOwoJCQl9CgkJfQoKCQlyZXR1cm4gd3BhX3N1cHBsaWNhbnRfYXBfd3BzX3Bpbih3cGFfcywgX2Jzc2lkLCBwaW4sCgkJCQkJCSBidWYsIGJ1ZmxlbiwgdGltZW91dCk7Cgl9CiNlbmRpZiAvKiBDT05GSUdfQVAgKi8KCglpZiAocGluKSB7CgkJcmV0ID0gd3Bhc193cHNfc3RhcnRfcGluKHdwYV9zLCBfYnNzaWQsIHBpbiwgMCwKCQkJCQkgREVWX1BXX0RFRkFVTFQpOwoJCWlmIChyZXQgPCAwKQoJCQlyZXR1cm4gLTE7CgkJcmV0ID0gb3Nfc25wcmludGYoYnVmLCBidWZsZW4sICIlcyIsIHBpbik7CgkJaWYgKHJldCA8IDAgfHwgKHNpemVfdCkgcmV0ID49IGJ1ZmxlbikKCQkJcmV0dXJuIC0xOwoJCXJldHVybiByZXQ7Cgl9CgoJcmV0ID0gd3Bhc193cHNfc3RhcnRfcGluKHdwYV9zLCBfYnNzaWQsIE5VTEwsIDAsIERFVl9QV19ERUZBVUxUKTsKCWlmIChyZXQgPCAwKQoJCXJldHVybiAtMTsKCmRvbmU6CgkvKiBSZXR1cm4gdGhlIGdlbmVyYXRlZCBQSU4gKi8KCXJldCA9IG9zX3NucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJTA4ZCIsIHJldCk7CglpZiAocmV0IDwgMCB8fCAoc2l6ZV90KSByZXQgPj0gYnVmbGVuKQoJCXJldHVybiAtMTsKCXJldHVybiByZXQ7Cn0KCgpzdGF0aWMgaW50IHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2Vfd3BzX2NoZWNrX3BpbigKCXN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGNoYXIgKmNtZCwgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQp7CgljaGFyIHBpbls5XTsKCXNpemVfdCBsZW47CgljaGFyICpwb3M7CglpbnQgcmV0OwoKCXdwYV9oZXhkdW1wX2FzY2lpX2tleShNU0dfREVCVUcsICJXUFNfQ0hFQ0tfUElOIiwKCQkJICAgICAgKHU4ICopIGNtZCwgb3Nfc3RybGVuKGNtZCkpOwoJZm9yIChwb3MgPSBjbWQsIGxlbiA9IDA7ICpwb3MgIT0gJ1wwJzsgcG9zKyspIHsKCQlpZiAoKnBvcyA8ICcwJyB8fCAqcG9zID4gJzknKQoJCQljb250aW51ZTsKCQlwaW5bbGVuKytdID0gKnBvczsKCQlpZiAobGVuID09IDkpIHsKCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXUFM6IFRvbyBsb25nIFBJTiIpOwoJCQlyZXR1cm4gLTE7CgkJfQoJfQoJaWYgKGxlbiAhPSA0ICYmIGxlbiAhPSA4KSB7CgkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJXUFM6IEludmFsaWQgUElOIGxlbmd0aCAlZCIsIChpbnQpIGxlbik7CgkJcmV0dXJuIC0xOwoJfQoJcGluW2xlbl0gPSAnXDAnOwoKCWlmIChsZW4gPT0gOCkgewoJCXVuc2lnbmVkIGludCBwaW5fdmFsOwoJCXBpbl92YWwgPSBhdG9pKHBpbik7CgkJaWYgKCF3cHNfcGluX3ZhbGlkKHBpbl92YWwpKSB7CgkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiV1BTOiBJbnZhbGlkIGNoZWNrc3VtIGRpZ2l0Iik7CgkJCXJldCA9IG9zX3NucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiRkFJTC1DSEVDS1NVTVxuIik7CgkJCWlmIChyZXQgPCAwIHx8IChzaXplX3QpIHJldCA+PSBidWZsZW4pCgkJCQlyZXR1cm4gLTE7CgkJCXJldHVybiByZXQ7CgkJfQoJfQoKCXJldCA9IG9zX3NucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJXMiLCBwaW4pOwoJaWYgKHJldCA8IDAgfHwgKHNpemVfdCkgcmV0ID49IGJ1ZmxlbikKCQlyZXR1cm4gLTE7CgoJcmV0dXJuIHJldDsKfQoKCiNpZmRlZiBDT05GSUdfV1BTX05GQwoKc3RhdGljIGludCB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3dwc19uZmMoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKCQkJCQkgICAgIGNoYXIgKmNtZCkKewoJdTggYnNzaWRbRVRIX0FMRU5dLCAqX2Jzc2lkID0gYnNzaWQ7CgoJaWYgKGNtZCA9PSBOVUxMIHx8IGNtZFswXSA9PSAnXDAnKQoJCV9ic3NpZCA9IE5VTEw7CgllbHNlIGlmIChod2FkZHJfYXRvbihjbWQsIGJzc2lkKSkKCQlyZXR1cm4gLTE7CgoJcmV0dXJuIHdwYXNfd3BzX3N0YXJ0X25mYyh3cGFfcywgX2Jzc2lkKTsKfQoKCnN0YXRpYyBpbnQgd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV93cHNfbmZjX2NvbmZpZ190b2tlbigKCXN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGNoYXIgKmNtZCwgY2hhciAqcmVwbHksIHNpemVfdCBtYXhfbGVuKQp7CglpbnQgbmRlZjsKCXN0cnVjdCB3cGFidWYgKmJ1ZjsKCWludCByZXM7CgoJaWYgKG9zX3N0cmNtcChjbWQsICJXUFMiKSA9PSAwKQoJCW5kZWYgPSAwOwoJZWxzZSBpZiAob3Nfc3RyY21wKGNtZCwgIk5ERUYiKSA9PSAwKQoJCW5kZWYgPSAxOwoJZWxzZQoJCXJldHVybiAtMTsKCglidWYgPSB3cGFzX3dwc19uZmNfY29uZmlnX3Rva2VuKHdwYV9zLCBuZGVmKTsKCWlmIChidWYgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CgoJcmVzID0gd3BhX3NucHJpbnRmX2hleF91cHBlcmNhc2UocmVwbHksIG1heF9sZW4sIHdwYWJ1Zl9oZWFkKGJ1ZiksCgkJCQkJIHdwYWJ1Zl9sZW4oYnVmKSk7CglyZXBseVtyZXMrK10gPSAnXG4nOwoJcmVwbHlbcmVzXSA9ICdcMCc7CgoJd3BhYnVmX2ZyZWUoYnVmKTsKCglyZXR1cm4gcmVzOwp9CgoKc3RhdGljIGludCB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3dwc19uZmNfdG9rZW4oCglzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjaGFyICpjbWQsIGNoYXIgKnJlcGx5LCBzaXplX3QgbWF4X2xlbikKewoJaW50IG5kZWY7CglzdHJ1Y3Qgd3BhYnVmICpidWY7CglpbnQgcmVzOwoKCWlmIChvc19zdHJjbXAoY21kLCAiV1BTIikgPT0gMCkKCQluZGVmID0gMDsKCWVsc2UgaWYgKG9zX3N0cmNtcChjbWQsICJOREVGIikgPT0gMCkKCQluZGVmID0gMTsKCWVsc2UKCQlyZXR1cm4gLTE7CgoJYnVmID0gd3Bhc193cHNfbmZjX3Rva2VuKHdwYV9zLCBuZGVmKTsKCWlmIChidWYgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CgoJcmVzID0gd3BhX3NucHJpbnRmX2hleF91cHBlcmNhc2UocmVwbHksIG1heF9sZW4sIHdwYWJ1Zl9oZWFkKGJ1ZiksCgkJCQkJIHdwYWJ1Zl9sZW4oYnVmKSk7CglyZXBseVtyZXMrK10gPSAnXG4nOwoJcmVwbHlbcmVzXSA9ICdcMCc7CgoJd3BhYnVmX2ZyZWUoYnVmKTsKCglyZXR1cm4gcmVzOwp9CgoKc3RhdGljIGludCB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3dwc19uZmNfdGFnX3JlYWQoCglzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjaGFyICpwb3MpCnsKCXNpemVfdCBsZW47CglzdHJ1Y3Qgd3BhYnVmICpidWY7CglpbnQgcmV0OwoKCWxlbiA9IG9zX3N0cmxlbihwb3MpOwoJaWYgKGxlbiAmIDB4MDEpCgkJcmV0dXJuIC0xOwoJbGVuIC89IDI7CgoJYnVmID0gd3BhYnVmX2FsbG9jKGxlbik7CglpZiAoYnVmID09IE5VTEwpCgkJcmV0dXJuIC0xOwoJaWYgKGhleHN0cjJiaW4ocG9zLCB3cGFidWZfcHV0KGJ1ZiwgbGVuKSwgbGVuKSA8IDApIHsKCQl3cGFidWZfZnJlZShidWYpOwoJCXJldHVybiAtMTsKCX0KCglyZXQgPSB3cGFzX3dwc19uZmNfdGFnX3JlYWQod3BhX3MsIGJ1Zik7Cgl3cGFidWZfZnJlZShidWYpOwoKCXJldHVybiByZXQ7Cn0KCgpzdGF0aWMgaW50IHdwYXNfY3RybF9uZmNfZ2V0X2hhbmRvdmVyX3JlcV93cHMoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKCQkJCQkgICAgICBjaGFyICpyZXBseSwgc2l6ZV90IG1heF9sZW4sCgkJCQkJICAgICAgaW50IGNyKQp7CglzdHJ1Y3Qgd3BhYnVmICpidWY7CglpbnQgcmVzOwoKCWJ1ZiA9IHdwYXNfd3BzX25mY19oYW5kb3Zlcl9yZXEod3BhX3MsIGNyKTsKCWlmIChidWYgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CgoJcmVzID0gd3BhX3NucHJpbnRmX2hleF91cHBlcmNhc2UocmVwbHksIG1heF9sZW4sIHdwYWJ1Zl9oZWFkKGJ1ZiksCgkJCQkJIHdwYWJ1Zl9sZW4oYnVmKSk7CglyZXBseVtyZXMrK10gPSAnXG4nOwoJcmVwbHlbcmVzXSA9ICdcMCc7CgoJd3BhYnVmX2ZyZWUoYnVmKTsKCglyZXR1cm4gcmVzOwp9CgoKc3RhdGljIGludCB3cGFzX2N0cmxfbmZjX2dldF9oYW5kb3Zlcl9yZXEoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKCQkJCQkgIGNoYXIgKmNtZCwgY2hhciAqcmVwbHksCgkJCQkJICBzaXplX3QgbWF4X2xlbikKewoJY2hhciAqcG9zOwoKCXBvcyA9IG9zX3N0cmNocihjbWQsICcgJyk7CglpZiAocG9zID09IE5VTEwpCgkJcmV0dXJuIC0xOwoJKnBvcysrID0gJ1wwJzsKCglpZiAob3Nfc3RyY21wKGNtZCwgIk5ERUYiKSAhPSAwKQoJCXJldHVybiAtMTsKCglpZiAob3Nfc3RyY21wKHBvcywgIldQUyIpID09IDAgfHwgb3Nfc3RyY21wKHBvcywgIldQUy1DUiIpID09IDApIHsKCQlyZXR1cm4gd3Bhc19jdHJsX25mY19nZXRfaGFuZG92ZXJfcmVxX3dwcygKCQkJd3BhX3MsIHJlcGx5LCBtYXhfbGVuLCBvc19zdHJjbXAocG9zLCAiV1BTLUNSIikgPT0gMCk7Cgl9CgoJcmV0dXJuIC0xOwp9CgoKc3RhdGljIGludCB3cGFzX2N0cmxfbmZjX2dldF9oYW5kb3Zlcl9zZWxfd3BzKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCgkJCQkJICAgICAgY2hhciAqcmVwbHksIHNpemVfdCBtYXhfbGVuLAoJCQkJCSAgICAgIGludCBuZGVmLCBpbnQgY3IsIGNoYXIgKnV1aWQpCnsKCXN0cnVjdCB3cGFidWYgKmJ1ZjsKCWludCByZXM7CgoJYnVmID0gd3Bhc193cHNfbmZjX2hhbmRvdmVyX3NlbCh3cGFfcywgbmRlZiwgY3IsIHV1aWQpOwoJaWYgKGJ1ZiA9PSBOVUxMKQoJCXJldHVybiAtMTsKCglyZXMgPSB3cGFfc25wcmludGZfaGV4X3VwcGVyY2FzZShyZXBseSwgbWF4X2xlbiwgd3BhYnVmX2hlYWQoYnVmKSwKCQkJCQkgd3BhYnVmX2xlbihidWYpKTsKCXJlcGx5W3JlcysrXSA9ICdcbic7CglyZXBseVtyZXNdID0gJ1wwJzsKCgl3cGFidWZfZnJlZShidWYpOwoKCXJldHVybiByZXM7Cn0KCgpzdGF0aWMgaW50IHdwYXNfY3RybF9uZmNfZ2V0X2hhbmRvdmVyX3NlbChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAoJCQkJCSAgY2hhciAqY21kLCBjaGFyICpyZXBseSwKCQkJCQkgIHNpemVfdCBtYXhfbGVuKQp7CgljaGFyICpwb3MsICpwb3MyOwoJaW50IG5kZWY7CgoJcG9zID0gb3Nfc3RyY2hyKGNtZCwgJyAnKTsKCWlmIChwb3MgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CgkqcG9zKysgPSAnXDAnOwoKCWlmIChvc19zdHJjbXAoY21kLCAiV1BTIikgPT0gMCkKCQluZGVmID0gMDsKCWVsc2UgaWYgKG9zX3N0cmNtcChjbWQsICJOREVGIikgPT0gMCkKCQluZGVmID0gMTsKCWVsc2UKCQlyZXR1cm4gLTE7CgoJcG9zMiA9IG9zX3N0cmNocihwb3MsICcgJyk7CglpZiAocG9zMikKCQkqcG9zMisrID0gJ1wwJzsKCWlmIChvc19zdHJjbXAocG9zLCAiV1BTIikgPT0gMCB8fCBvc19zdHJjbXAocG9zLCAiV1BTLUNSIikgPT0gMCkgewoJCXJldHVybiB3cGFzX2N0cmxfbmZjX2dldF9oYW5kb3Zlcl9zZWxfd3BzKAoJCQl3cGFfcywgcmVwbHksIG1heF9sZW4sIG5kZWYsCgkJCW9zX3N0cmNtcChwb3MsICJXUFMtQ1IiKSA9PSAwLCBwb3MyKTsKCX0KCglyZXR1cm4gLTE7Cn0KCgpzdGF0aWMgaW50IHdwYXNfY3RybF9uZmNfcnhfaGFuZG92ZXJfcmVxKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCgkJCQkJIGNoYXIgKmNtZCwgY2hhciAqcmVwbHksCgkJCQkJIHNpemVfdCBtYXhfbGVuKQp7CglzaXplX3QgbGVuOwoJc3RydWN0IHdwYWJ1ZiAqYnVmOwoJaW50IHJldDsKCglsZW4gPSBvc19zdHJsZW4oY21kKTsKCWlmIChsZW4gJiAweDAxKQoJCXJldHVybiAtMTsKCWxlbiAvPSAyOwoKCWJ1ZiA9IHdwYWJ1Zl9hbGxvYyhsZW4pOwoJaWYgKGJ1ZiA9PSBOVUxMKQoJCXJldHVybiAtMTsKCWlmIChoZXhzdHIyYmluKGNtZCwgd3BhYnVmX3B1dChidWYsIGxlbiksIGxlbikgPCAwKSB7CgkJd3BhYnVmX2ZyZWUoYnVmKTsKCQlyZXR1cm4gLTE7Cgl9CgoJcmV0ID0gd3Bhc193cHNfbmZjX3J4X2hhbmRvdmVyX3JlcSh3cGFfcywgYnVmKTsKCXdwYWJ1Zl9mcmVlKGJ1Zik7CgoJcmV0dXJuIHJldDsKfQoKCnN0YXRpYyBpbnQgd3Bhc19jdHJsX25mY19yeF9oYW5kb3Zlcl9zZWwoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKCQkJCQkgY2hhciAqY21kKQp7CglzaXplX3QgbGVuOwoJc3RydWN0IHdwYWJ1ZiAqYnVmOwoJaW50IHJldDsKCglsZW4gPSBvc19zdHJsZW4oY21kKTsKCWlmIChsZW4gJiAweDAxKQoJCXJldHVybiAtMTsKCWxlbiAvPSAyOwoKCWJ1ZiA9IHdwYWJ1Zl9hbGxvYyhsZW4pOwoJaWYgKGJ1ZiA9PSBOVUxMKQoJCXJldHVybiAtMTsKCWlmIChoZXhzdHIyYmluKGNtZCwgd3BhYnVmX3B1dChidWYsIGxlbiksIGxlbikgPCAwKSB7CgkJd3BhYnVmX2ZyZWUoYnVmKTsKCQlyZXR1cm4gLTE7Cgl9CgoJcmV0ID0gd3Bhc193cHNfbmZjX3J4X2hhbmRvdmVyX3NlbCh3cGFfcywgYnVmKTsKCXdwYWJ1Zl9mcmVlKGJ1Zik7CgoJcmV0dXJuIHJldDsKfQoKCnN0YXRpYyBpbnQgd3Bhc19jdHJsX25mY19yZXBvcnRfaGFuZG92ZXIoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKCQkJCQkgY2hhciAqY21kKQp7CglzaXplX3QgbGVuOwoJc3RydWN0IHdwYWJ1ZiAqcmVxLCAqc2VsOwoJaW50IHJldDsKCWNoYXIgKnBvcywgKnJvbGUsICp0eXBlLCAqcG9zMjsKCglyb2xlID0gY21kOwoJcG9zID0gb3Nfc3RyY2hyKHJvbGUsICcgJyk7CglpZiAocG9zID09IE5VTEwpCgkJcmV0dXJuIC0xOwoJKnBvcysrID0gJ1wwJzsKCgl0eXBlID0gcG9zOwoJcG9zID0gb3Nfc3RyY2hyKHR5cGUsICcgJyk7CglpZiAocG9zID09IE5VTEwpCgkJcmV0dXJuIC0xOwoJKnBvcysrID0gJ1wwJzsKCglwb3MyID0gb3Nfc3RyY2hyKHBvcywgJyAnKTsKCWlmIChwb3MyID09IE5VTEwpCgkJcmV0dXJuIC0xOwoJKnBvczIrKyA9ICdcMCc7CgoJbGVuID0gb3Nfc3RybGVuKHBvcyk7CglpZiAobGVuICYgMHgwMSkKCQlyZXR1cm4gLTE7CglsZW4gLz0gMjsKCglyZXEgPSB3cGFidWZfYWxsb2MobGVuKTsKCWlmIChyZXEgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CglpZiAoaGV4c3RyMmJpbihwb3MsIHdwYWJ1Zl9wdXQocmVxLCBsZW4pLCBsZW4pIDwgMCkgewoJCXdwYWJ1Zl9mcmVlKHJlcSk7CgkJcmV0dXJuIC0xOwoJfQoKCWxlbiA9IG9zX3N0cmxlbihwb3MyKTsKCWlmIChsZW4gJiAweDAxKSB7CgkJd3BhYnVmX2ZyZWUocmVxKTsKCQlyZXR1cm4gLTE7Cgl9CglsZW4gLz0gMjsKCglzZWwgPSB3cGFidWZfYWxsb2MobGVuKTsKCWlmIChzZWwgPT0gTlVMTCkgewoJCXdwYWJ1Zl9mcmVlKHJlcSk7CgkJcmV0dXJuIC0xOwoJfQoJaWYgKGhleHN0cjJiaW4ocG9zMiwgd3BhYnVmX3B1dChzZWwsIGxlbiksIGxlbikgPCAwKSB7CgkJd3BhYnVmX2ZyZWUocmVxKTsKCQl3cGFidWZfZnJlZShzZWwpOwoJCXJldHVybiAtMTsKCX0KCglpZiAob3Nfc3RyY21wKHJvbGUsICJJTklUIikgPT0gMCAmJiBvc19zdHJjbXAodHlwZSwgIldQUyIpID09IDApIHsKCQlyZXQgPSB3cGFzX3dwc19uZmNfcmVwb3J0X2hhbmRvdmVyKHdwYV9zLCByZXEsIHNlbCk7Cgl9IGVsc2UgewoJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiTkZDOiBVbnN1cHBvcnRlZCBjb25uZWN0aW9uIGhhbmRvdmVyICIKCQkJICAgInJlcG9ydGVkOiByb2xlPSVzIHR5cGU9JXMiLCByb2xlLCB0eXBlKTsKCQlyZXQgPSAtMTsKCX0KCXdwYWJ1Zl9mcmVlKHJlcSk7Cgl3cGFidWZfZnJlZShzZWwpOwoKCXJldHVybiByZXQ7Cn0KCiNlbmRpZiAvKiBDT05GSUdfV1BTX05GQyAqLwoKCnN0YXRpYyBpbnQgd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV93cHNfcmVnKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCgkJCQkJICAgICBjaGFyICpjbWQpCnsKCXU4IGJzc2lkW0VUSF9BTEVOXTsKCWNoYXIgKnBpbjsKCWNoYXIgKm5ld19zc2lkOwoJY2hhciAqbmV3X2F1dGg7CgljaGFyICpuZXdfZW5jcjsKCWNoYXIgKm5ld19rZXk7CglzdHJ1Y3Qgd3BzX25ld19hcF9zZXR0aW5ncyBhcDsKCglwaW4gPSBvc19zdHJjaHIoY21kLCAnICcpOwoJaWYgKHBpbiA9PSBOVUxMKQoJCXJldHVybiAtMTsKCSpwaW4rKyA9ICdcMCc7CgoJaWYgKGh3YWRkcl9hdG9uKGNtZCwgYnNzaWQpKSB7CgkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDVFJMX0lGQUNFIFdQU19SRUc6IGludmFsaWQgQlNTSUQgJyVzJyIsCgkJCSAgIGNtZCk7CgkJcmV0dXJuIC0xOwoJfQoKCW5ld19zc2lkID0gb3Nfc3RyY2hyKHBpbiwgJyAnKTsKCWlmIChuZXdfc3NpZCA9PSBOVUxMKQoJCXJldHVybiB3cGFzX3dwc19zdGFydF9yZWcod3BhX3MsIGJzc2lkLCBwaW4sIE5VTEwpOwoJKm5ld19zc2lkKysgPSAnXDAnOwoKCW5ld19hdXRoID0gb3Nfc3RyY2hyKG5ld19zc2lkLCAnICcpOwoJaWYgKG5ld19hdXRoID09IE5VTEwpCgkJcmV0dXJuIC0xOwoJKm5ld19hdXRoKysgPSAnXDAnOwoKCW5ld19lbmNyID0gb3Nfc3RyY2hyKG5ld19hdXRoLCAnICcpOwoJaWYgKG5ld19lbmNyID09IE5VTEwpCgkJcmV0dXJuIC0xOwoJKm5ld19lbmNyKysgPSAnXDAnOwoKCW5ld19rZXkgPSBvc19zdHJjaHIobmV3X2VuY3IsICcgJyk7CglpZiAobmV3X2tleSA9PSBOVUxMKQoJCXJldHVybiAtMTsKCSpuZXdfa2V5KysgPSAnXDAnOwoKCW9zX21lbXNldCgmYXAsIDAsIHNpemVvZihhcCkpOwoJYXAuc3NpZF9oZXggPSBuZXdfc3NpZDsKCWFwLmF1dGggPSBuZXdfYXV0aDsKCWFwLmVuY3IgPSBuZXdfZW5jcjsKCWFwLmtleV9oZXggPSBuZXdfa2V5OwoJcmV0dXJuIHdwYXNfd3BzX3N0YXJ0X3JlZyh3cGFfcywgYnNzaWQsIHBpbiwgJmFwKTsKfQoKCiNpZmRlZiBDT05GSUdfQVAKc3RhdGljIGludCB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3dwc19hcF9waW4oc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKCQkJCQkJY2hhciAqY21kLCBjaGFyICpidWYsCgkJCQkJCXNpemVfdCBidWZsZW4pCnsKCWludCB0aW1lb3V0ID0gMzAwOwoJY2hhciAqcG9zOwoJY29uc3QgY2hhciAqcGluX3R4dDsKCglpZiAoIXdwYV9zLT5hcF9pZmFjZSkKCQlyZXR1cm4gLTE7CgoJcG9zID0gb3Nfc3RyY2hyKGNtZCwgJyAnKTsKCWlmIChwb3MpCgkJKnBvcysrID0gJ1wwJzsKCglpZiAob3Nfc3RyY21wKGNtZCwgImRpc2FibGUiKSA9PSAwKSB7CgkJd3Bhc193cHNfYXBfcGluX2Rpc2FibGUod3BhX3MpOwoJCXJldHVybiBvc19zbnByaW50ZihidWYsIGJ1ZmxlbiwgIk9LXG4iKTsKCX0KCglpZiAob3Nfc3RyY21wKGNtZCwgInJhbmRvbSIpID09IDApIHsKCQlpZiAocG9zKQoJCQl0aW1lb3V0ID0gYXRvaShwb3MpOwoJCXBpbl90eHQgPSB3cGFzX3dwc19hcF9waW5fcmFuZG9tKHdwYV9zLCB0aW1lb3V0KTsKCQlpZiAocGluX3R4dCA9PSBOVUxMKQoJCQlyZXR1cm4gLTE7CgkJcmV0dXJuIG9zX3NucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJXMiLCBwaW5fdHh0KTsKCX0KCglpZiAob3Nfc3RyY21wKGNtZCwgImdldCIpID09IDApIHsKCQlwaW5fdHh0ID0gd3Bhc193cHNfYXBfcGluX2dldCh3cGFfcyk7CgkJaWYgKHBpbl90eHQgPT0gTlVMTCkKCQkJcmV0dXJuIC0xOwoJCXJldHVybiBvc19zbnByaW50ZihidWYsIGJ1ZmxlbiwgIiVzIiwgcGluX3R4dCk7Cgl9CgoJaWYgKG9zX3N0cmNtcChjbWQsICJzZXQiKSA9PSAwKSB7CgkJY2hhciAqcGluOwoJCWlmIChwb3MgPT0gTlVMTCkKCQkJcmV0dXJuIC0xOwoJCXBpbiA9IHBvczsKCQlwb3MgPSBvc19zdHJjaHIocG9zLCAnICcpOwoJCWlmIChwb3MpIHsKCQkJKnBvcysrID0gJ1wwJzsKCQkJdGltZW91dCA9IGF0b2kocG9zKTsKCQl9CgkJaWYgKG9zX3N0cmxlbihwaW4pID4gYnVmbGVuKQoJCQlyZXR1cm4gLTE7CgkJaWYgKHdwYXNfd3BzX2FwX3Bpbl9zZXQod3BhX3MsIHBpbiwgdGltZW91dCkgPCAwKQoJCQlyZXR1cm4gLTE7CgkJcmV0dXJuIG9zX3NucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJXMiLCBwaW4pOwoJfQoKCXJldHVybiAtMTsKfQojZW5kaWYgLyogQ09ORklHX0FQICovCgoKI2lmZGVmIENPTkZJR19XUFNfRVIKc3RhdGljIGludCB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3dwc19lcl9waW4oc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKCQkJCQkJY2hhciAqY21kKQp7CgljaGFyICp1dWlkID0gY21kLCAqcGluLCAqcG9zOwoJdTggYWRkcl9idWZbRVRIX0FMRU5dLCAqYWRkciA9IE5VTEw7CglwaW4gPSBvc19zdHJjaHIodXVpZCwgJyAnKTsKCWlmIChwaW4gPT0gTlVMTCkKCQlyZXR1cm4gLTE7CgkqcGluKysgPSAnXDAnOwoJcG9zID0gb3Nfc3RyY2hyKHBpbiwgJyAnKTsKCWlmIChwb3MpIHsKCQkqcG9zKysgPSAnXDAnOwoJCWlmIChod2FkZHJfYXRvbihwb3MsIGFkZHJfYnVmKSA9PSAwKQoJCQlhZGRyID0gYWRkcl9idWY7Cgl9CglyZXR1cm4gd3Bhc193cHNfZXJfYWRkX3Bpbih3cGFfcywgYWRkciwgdXVpZCwgcGluKTsKfQoKCnN0YXRpYyBpbnQgd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV93cHNfZXJfbGVhcm4oc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKCQkJCQkJICBjaGFyICpjbWQpCnsKCWNoYXIgKnV1aWQgPSBjbWQsICpwaW47CglwaW4gPSBvc19zdHJjaHIodXVpZCwgJyAnKTsKCWlmIChwaW4gPT0gTlVMTCkKCQlyZXR1cm4gLTE7CgkqcGluKysgPSAnXDAnOwoJcmV0dXJuIHdwYXNfd3BzX2VyX2xlYXJuKHdwYV9zLCB1dWlkLCBwaW4pOwp9CgoKc3RhdGljIGludCB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3dwc19lcl9zZXRfY29uZmlnKAoJc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY2hhciAqY21kKQp7CgljaGFyICp1dWlkID0gY21kLCAqaWQ7CglpZCA9IG9zX3N0cmNocih1dWlkLCAnICcpOwoJaWYgKGlkID09IE5VTEwpCgkJcmV0dXJuIC0xOwoJKmlkKysgPSAnXDAnOwoJcmV0dXJuIHdwYXNfd3BzX2VyX3NldF9jb25maWcod3BhX3MsIHV1aWQsIGF0b2koaWQpKTsKfQoKCnN0YXRpYyBpbnQgd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV93cHNfZXJfY29uZmlnKAoJc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY2hhciAqY21kKQp7CgljaGFyICpwaW47CgljaGFyICpuZXdfc3NpZDsKCWNoYXIgKm5ld19hdXRoOwoJY2hhciAqbmV3X2VuY3I7CgljaGFyICpuZXdfa2V5OwoJc3RydWN0IHdwc19uZXdfYXBfc2V0dGluZ3MgYXA7CgoJcGluID0gb3Nfc3RyY2hyKGNtZCwgJyAnKTsKCWlmIChwaW4gPT0gTlVMTCkKCQlyZXR1cm4gLTE7CgkqcGluKysgPSAnXDAnOwoKCW5ld19zc2lkID0gb3Nfc3RyY2hyKHBpbiwgJyAnKTsKCWlmIChuZXdfc3NpZCA9PSBOVUxMKQoJCXJldHVybiAtMTsKCSpuZXdfc3NpZCsrID0gJ1wwJzsKCgluZXdfYXV0aCA9IG9zX3N0cmNocihuZXdfc3NpZCwgJyAnKTsKCWlmIChuZXdfYXV0aCA9PSBOVUxMKQoJCXJldHVybiAtMTsKCSpuZXdfYXV0aCsrID0gJ1wwJzsKCgluZXdfZW5jciA9IG9zX3N0cmNocihuZXdfYXV0aCwgJyAnKTsKCWlmIChuZXdfZW5jciA9PSBOVUxMKQoJCXJldHVybiAtMTsKCSpuZXdfZW5jcisrID0gJ1wwJzsKCgluZXdfa2V5ID0gb3Nfc3RyY2hyKG5ld19lbmNyLCAnICcpOwoJaWYgKG5ld19rZXkgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CgkqbmV3X2tleSsrID0gJ1wwJzsKCglvc19tZW1zZXQoJmFwLCAwLCBzaXplb2YoYXApKTsKCWFwLnNzaWRfaGV4ID0gbmV3X3NzaWQ7CglhcC5hdXRoID0gbmV3X2F1dGg7CglhcC5lbmNyID0gbmV3X2VuY3I7CglhcC5rZXlfaGV4ID0gbmV3X2tleTsKCXJldHVybiB3cGFzX3dwc19lcl9jb25maWcod3BhX3MsIGNtZCwgcGluLCAmYXApOwp9CgoKI2lmZGVmIENPTkZJR19XUFNfTkZDCnN0YXRpYyBpbnQgd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV93cHNfZXJfbmZjX2NvbmZpZ190b2tlbigKCXN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGNoYXIgKmNtZCwgY2hhciAqcmVwbHksIHNpemVfdCBtYXhfbGVuKQp7CglpbnQgbmRlZjsKCXN0cnVjdCB3cGFidWYgKmJ1ZjsKCWludCByZXM7CgljaGFyICp1dWlkOwoKCXV1aWQgPSBvc19zdHJjaHIoY21kLCAnICcpOwoJaWYgKHV1aWQgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CgkqdXVpZCsrID0gJ1wwJzsKCglpZiAob3Nfc3RyY21wKGNtZCwgIldQUyIpID09IDApCgkJbmRlZiA9IDA7CgllbHNlIGlmIChvc19zdHJjbXAoY21kLCAiTkRFRiIpID09IDApCgkJbmRlZiA9IDE7CgllbHNlCgkJcmV0dXJuIC0xOwoKCWJ1ZiA9IHdwYXNfd3BzX2VyX25mY19jb25maWdfdG9rZW4od3BhX3MsIG5kZWYsIHV1aWQpOwoJaWYgKGJ1ZiA9PSBOVUxMKQoJCXJldHVybiAtMTsKCglyZXMgPSB3cGFfc25wcmludGZfaGV4X3VwcGVyY2FzZShyZXBseSwgbWF4X2xlbiwgd3BhYnVmX2hlYWQoYnVmKSwKCQkJCQkgd3BhYnVmX2xlbihidWYpKTsKCXJlcGx5W3JlcysrXSA9ICdcbic7CglyZXBseVtyZXNdID0gJ1wwJzsKCgl3cGFidWZfZnJlZShidWYpOwoKCXJldHVybiByZXM7Cn0KI2VuZGlmIC8qIENPTkZJR19XUFNfTkZDICovCiNlbmRpZiAvKiBDT05GSUdfV1BTX0VSICovCgojZW5kaWYgLyogQ09ORklHX1dQUyAqLwoKCiNpZmRlZiBDT05GSUdfSUJTU19SU04Kc3RhdGljIGludCB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX2lic3NfcnNuKAoJc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY2hhciAqYWRkcikKewoJdTggcGVlcltFVEhfQUxFTl07CgoJaWYgKGh3YWRkcl9hdG9uKGFkZHIsIHBlZXIpKSB7CgkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDVFJMX0lGQUNFIElCU1NfUlNOOiBpbnZhbGlkICIKCQkJICAgImFkZHJlc3MgJyVzJyIsIGFkZHIpOwoJCXJldHVybiAtMTsKCX0KCgl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0UgSUJTU19SU04gIiBNQUNTVFIsCgkJICAgTUFDMlNUUihwZWVyKSk7CgoJcmV0dXJuIGlic3NfcnNuX3N0YXJ0KHdwYV9zLT5pYnNzX3JzbiwgcGVlcik7Cn0KI2VuZGlmIC8qIENPTkZJR19JQlNTX1JTTiAqLwoKCnN0YXRpYyBpbnQgd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV9jdHJsX3JzcChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAoJCQkJCSAgICAgIGNoYXIgKnJzcCkKewojaWZkZWYgSUVFRTgwMjFYX0VBUE9MCgljaGFyICpwb3MsICppZF9wb3M7CglpbnQgaWQ7CglzdHJ1Y3Qgd3BhX3NzaWQgKnNzaWQ7CgoJcG9zID0gb3Nfc3RyY2hyKHJzcCwgJy0nKTsKCWlmIChwb3MgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CgkqcG9zKysgPSAnXDAnOwoJaWRfcG9zID0gcG9zOwoJcG9zID0gb3Nfc3RyY2hyKHBvcywgJzonKTsKCWlmIChwb3MgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CgkqcG9zKysgPSAnXDAnOwoJaWQgPSBhdG9pKGlkX3Bvcyk7Cgl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0U6IGZpZWxkPSVzIGlkPSVkIiwgcnNwLCBpZCk7Cgl3cGFfaGV4ZHVtcF9hc2NpaV9rZXkoTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRTogdmFsdWUiLAoJCQkgICAgICAodTggKikgcG9zLCBvc19zdHJsZW4ocG9zKSk7CgoJc3NpZCA9IHdwYV9jb25maWdfZ2V0X25ldHdvcmsod3BhX3MtPmNvbmYsIGlkKTsKCWlmIChzc2lkID09IE5VTEwpIHsKCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0U6IENvdWxkIG5vdCBmaW5kIFNTSUQgaWQ9JWQgIgoJCQkgICAidG8gdXBkYXRlIiwgaWQpOwoJCXJldHVybiAtMTsKCX0KCglyZXR1cm4gd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV9jdHJsX3JzcF9oYW5kbGUod3BhX3MsIHNzaWQsIHJzcCwKCQkJCQkJCSBwb3MpOwojZWxzZSAvKiBJRUVFODAyMVhfRUFQT0wgKi8KCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRTogODAyLjFYIG5vdCBpbmNsdWRlZCIpOwoJcmV0dXJuIC0xOwojZW5kaWYgLyogSUVFRTgwMjFYX0VBUE9MICovCn0KCgpzdGF0aWMgaW50IHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2Vfc3RhdHVzKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCgkJCQkJICAgIGNvbnN0IGNoYXIgKnBhcmFtcywKCQkJCQkgICAgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQp7CgljaGFyICpwb3MsICplbmQsIHRtcFszMF07CglpbnQgcmVzLCB2ZXJib3NlLCB3cHMsIHJldDsKCgl2ZXJib3NlID0gb3Nfc3RyY21wKHBhcmFtcywgIi1WRVJCT1NFIikgPT0gMDsKCXdwcyA9IG9zX3N0cmNtcChwYXJhbXMsICItV1BTIikgPT0gMDsKCXBvcyA9IGJ1ZjsKCWVuZCA9IGJ1ZiArIGJ1ZmxlbjsKCWlmICh3cGFfcy0+d3BhX3N0YXRlID49IFdQQV9BU1NPQ0lBVEVEKSB7CgkJc3RydWN0IHdwYV9zc2lkICpzc2lkID0gd3BhX3MtPmN1cnJlbnRfc3NpZDsKCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgImJzc2lkPSIgTUFDU1RSICJcbiIsCgkJCQkgIE1BQzJTVFIod3BhX3MtPmJzc2lkKSk7CgkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKCQlwb3MgKz0gcmV0OwoJCWlmIChzc2lkKSB7CgkJCXU4ICpfc3NpZCA9IHNzaWQtPnNzaWQ7CgkJCXNpemVfdCBzc2lkX2xlbiA9IHNzaWQtPnNzaWRfbGVuOwoJCQl1OCBzc2lkX2J1ZltNQVhfU1NJRF9MRU5dOwoJCQlpZiAoc3NpZF9sZW4gPT0gMCkgewoJCQkJaW50IF9yZXMgPSB3cGFfZHJ2X2dldF9zc2lkKHdwYV9zLCBzc2lkX2J1Zik7CgkJCQlpZiAoX3JlcyA8IDApCgkJCQkJc3NpZF9sZW4gPSAwOwoJCQkJZWxzZQoJCQkJCXNzaWRfbGVuID0gX3JlczsKCQkJCV9zc2lkID0gc3NpZF9idWY7CgkJCX0KCQkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJzc2lkPSVzXG5pZD0lZFxuIiwKCQkJCQkgIHdwYV9zc2lkX3R4dChfc3NpZCwgc3NpZF9sZW4pLAoJCQkJCSAgc3NpZC0+aWQpOwoJCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKCQkJcG9zICs9IHJldDsKCgkJCWlmICh3cHMgJiYgc3NpZC0+cGFzc3BocmFzZSAmJgoJCQkgICAgd3BhX2tleV9tZ210X3dwYV9wc2soc3NpZC0+a2V5X21nbXQpICYmCgkJCSAgICAoc3NpZC0+bW9kZSA9PSBXUEFTX01PREVfQVAgfHwKCQkJICAgICBzc2lkLT5tb2RlID09IFdQQVNfTU9ERV9QMlBfR08pKSB7CgkJCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywKCQkJCQkJICAicGFzc3BocmFzZT0lc1xuIiwKCQkJCQkJICBzc2lkLT5wYXNzcGhyYXNlKTsKCQkJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCgkJCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKCQkJCXBvcyArPSByZXQ7CgkJCX0KCQkJaWYgKHNzaWQtPmlkX3N0cikgewoJCQkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsCgkJCQkJCSAgImlkX3N0cj0lc1xuIiwKCQkJCQkJICBzc2lkLT5pZF9zdHIpOwoJCQkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJCQlyZXR1cm4gcG9zIC0gYnVmOwoJCQkJcG9zICs9IHJldDsKCQkJfQoKCQkJc3dpdGNoIChzc2lkLT5tb2RlKSB7CgkJCWNhc2UgV1BBU19NT0RFX0lORlJBOgoJCQkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsCgkJCQkJCSAgIm1vZGU9c3RhdGlvblxuIik7CgkJCQlicmVhazsKCQkJY2FzZSBXUEFTX01PREVfSUJTUzoKCQkJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLAoJCQkJCQkgICJtb2RlPUlCU1NcbiIpOwoJCQkJYnJlYWs7CgkJCWNhc2UgV1BBU19NT0RFX0FQOgoJCQkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsCgkJCQkJCSAgIm1vZGU9QVBcbiIpOwoJCQkJYnJlYWs7CgkJCWNhc2UgV1BBU19NT0RFX1AyUF9HTzoKCQkJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLAoJCQkJCQkgICJtb2RlPVAyUCBHT1xuIik7CgkJCQlicmVhazsKCQkJY2FzZSBXUEFTX01PREVfUDJQX0dST1VQX0ZPUk1BVElPTjoKCQkJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLAoJCQkJCQkgICJtb2RlPVAyUCBHTyAtIGdyb3VwICIKCQkJCQkJICAiZm9ybWF0aW9uXG4iKTsKCQkJCWJyZWFrOwoJCQlkZWZhdWx0OgoJCQkJcmV0ID0gMDsKCQkJCWJyZWFrOwoJCQl9CgkJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCgkJCQlyZXR1cm4gcG9zIC0gYnVmOwoJCQlwb3MgKz0gcmV0OwoJCX0KCiNpZmRlZiBDT05GSUdfQVAKCQlpZiAod3BhX3MtPmFwX2lmYWNlKSB7CgkJCXBvcyArPSBhcF9jdHJsX2lmYWNlX3dwYV9nZXRfc3RhdHVzKHdwYV9zLCBwb3MsCgkJCQkJCQkgICAgZW5kIC0gcG9zLAoJCQkJCQkJICAgIHZlcmJvc2UpOwoJCX0gZWxzZQojZW5kaWYgLyogQ09ORklHX0FQICovCgkJcG9zICs9IHdwYV9zbV9nZXRfc3RhdHVzKHdwYV9zLT53cGEsIHBvcywgZW5kIC0gcG9zLCB2ZXJib3NlKTsKCX0KI2lmZGVmIENPTkZJR19TQUUKCWlmICh3cGFfcy0+d3BhX3N0YXRlID49IFdQQV9BU1NPQ0lBVEVEICYmCgkgICAgd3BhX3MtPnNtZS5zYWUuc3RhdGUgPT0gU0FFX0FDQ0VQVEVEICYmICF3cGFfcy0+YXBfaWZhY2UpIHsKCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgInNhZV9ncm91cD0lZFxuIiwKCQkJCSAgd3BhX3MtPnNtZS5zYWUuZ3JvdXApOwoJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCgkJCXJldHVybiBwb3MgLSBidWY7CgkJcG9zICs9IHJldDsKCX0KI2VuZGlmIC8qIENPTkZJR19TQUUgKi8KCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAid3BhX3N0YXRlPSVzXG4iLAoJCQkgIHdwYV9zdXBwbGljYW50X3N0YXRlX3R4dCh3cGFfcy0+d3BhX3N0YXRlKSk7CglpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCXJldHVybiBwb3MgLSBidWY7Cglwb3MgKz0gcmV0OwoKCWlmICh3cGFfcy0+bDIgJiYKCSAgICBsMl9wYWNrZXRfZ2V0X2lwX2FkZHIod3BhX3MtPmwyLCB0bXAsIHNpemVvZih0bXApKSA+PSAwKSB7CgkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJpcF9hZGRyZXNzPSVzXG4iLCB0bXApOwoJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCgkJCXJldHVybiBwb3MgLSBidWY7CgkJcG9zICs9IHJldDsKCX0KCiNpZmRlZiBDT05GSUdfUDJQCglpZiAod3BhX3MtPmdsb2JhbC0+cDJwKSB7CgkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJwMnBfZGV2aWNlX2FkZHJlc3M9IiBNQUNTVFIKCQkJCSAgIlxuIiwgTUFDMlNUUih3cGFfcy0+Z2xvYmFsLT5wMnBfZGV2X2FkZHIpKTsKCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCQlyZXR1cm4gcG9zIC0gYnVmOwoJCXBvcyArPSByZXQ7Cgl9CiNlbmRpZiAvKiBDT05GSUdfUDJQICovCgoJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJhZGRyZXNzPSIgTUFDU1RSICJcbiIsCgkJCSAgTUFDMlNUUih3cGFfcy0+b3duX2FkZHIpKTsKCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCgkJcmV0dXJuIHBvcyAtIGJ1ZjsKCXBvcyArPSByZXQ7CgojaWZkZWYgQ09ORklHX0hTMjAKCWlmICh3cGFfcy0+Y3VycmVudF9ic3MgJiYKCSAgICB3cGFfYnNzX2dldF92ZW5kb3JfaWUod3BhX3MtPmN1cnJlbnRfYnNzLCBIUzIwX0lFX1ZFTkRPUl9UWVBFKSAmJgoJICAgIHdwYV9zLT53cGFfcHJvdG8gPT0gV1BBX1BST1RPX1JTTiAmJgoJICAgIHdwYV9rZXlfbWdtdF93cGFfaWVlZTgwMjF4KHdwYV9zLT5rZXlfbWdtdCkpIHsKCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgImhzMjA9MVxuIik7CgkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKCQlwb3MgKz0gcmV0OwoJfQoKCWlmICh3cGFfcy0+Y3VycmVudF9zc2lkKSB7CgkJc3RydWN0IHdwYV9jcmVkICpjcmVkOwoJCWNoYXIgKnR5cGU7CgoJCWZvciAoY3JlZCA9IHdwYV9zLT5jb25mLT5jcmVkOyBjcmVkOyBjcmVkID0gY3JlZC0+bmV4dCkgewoJCQlpZiAod3BhX3MtPmN1cnJlbnRfc3NpZC0+cGFyZW50X2NyZWQgIT0gY3JlZCkKCQkJCWNvbnRpbnVlOwoJCQlpZiAoIWNyZWQtPmRvbWFpbikKCQkJCWNvbnRpbnVlOwoKCQkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJob21lX3NwPSVzXG4iLAoJCQkJCSAgY3JlZC0+ZG9tYWluKTsKCQkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJCXJldHVybiBwb3MgLSBidWY7CgkJCXBvcyArPSByZXQ7CgoJCQlpZiAod3BhX3MtPmN1cnJlbnRfYnNzID09IE5VTEwgfHwKCQkJICAgIHdwYV9zLT5jdXJyZW50X2Jzcy0+YW5xcCA9PSBOVUxMKQoJCQkJcmVzID0gLTE7CgkJCWVsc2UKCQkJCXJlcyA9IGludGVyd29ya2luZ19ob21lX3NwX2NyZWQoCgkJCQkJd3BhX3MsIGNyZWQsCgkJCQkJd3BhX3MtPmN1cnJlbnRfYnNzLT5hbnFwLT5kb21haW5fbmFtZSk7CgkJCWlmIChyZXMgPiAwKQoJCQkJdHlwZSA9ICJob21lIjsKCQkJZWxzZSBpZiAocmVzID09IDApCgkJCQl0eXBlID0gInJvYW1pbmciOwoJCQllbHNlCgkJCQl0eXBlID0gInVua25vd24iOwoKCQkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJzcF90eXBlPSVzXG4iLCB0eXBlKTsKCQkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJCXJldHVybiBwb3MgLSBidWY7CgkJCXBvcyArPSByZXQ7CgoJCQlicmVhazsKCQl9Cgl9CiNlbmRpZiAvKiBDT05GSUdfSFMyMCAqLwoKCWlmICh3cGFfa2V5X21nbXRfd3BhX2llZWU4MDIxeCh3cGFfcy0+a2V5X21nbXQpIHx8CgkgICAgd3BhX3MtPmtleV9tZ210ID09IFdQQV9LRVlfTUdNVF9JRUVFODAyMVhfTk9fV1BBKSB7CgkJcmVzID0gZWFwb2xfc21fZ2V0X3N0YXR1cyh3cGFfcy0+ZWFwb2wsIHBvcywgZW5kIC0gcG9zLAoJCQkJCSAgdmVyYm9zZSk7CgkJaWYgKHJlcyA+PSAwKQoJCQlwb3MgKz0gcmVzOwoJfQoKCXJlcyA9IHJzbl9wcmVhdXRoX2dldF9zdGF0dXMod3BhX3MtPndwYSwgcG9zLCBlbmQgLSBwb3MsIHZlcmJvc2UpOwoJaWYgKHJlcyA+PSAwKQoJCXBvcyArPSByZXM7CgojaWZkZWYgQU5EUk9JRAoJd3BhX21zZ19jdHJsKHdwYV9zLCBNU0dfSU5GTywgV1BBX0VWRU5UX1NUQVRFX0NIQU5HRQoJCSAgICAgImlkPSVkIHN0YXRlPSVkIEJTU0lEPSIgTUFDU1RSICIgU1NJRD0lcyIsCgkJICAgICB3cGFfcy0+Y3VycmVudF9zc2lkID8gd3BhX3MtPmN1cnJlbnRfc3NpZC0+aWQgOiAtMSwKCQkgICAgIHdwYV9zLT53cGFfc3RhdGUsCgkJICAgICBNQUMyU1RSKHdwYV9zLT5ic3NpZCksCgkJICAgICB3cGFfcy0+Y3VycmVudF9zc2lkICYmIHdwYV9zLT5jdXJyZW50X3NzaWQtPnNzaWQgPwoJCSAgICAgd3BhX3NzaWRfdHh0KHdwYV9zLT5jdXJyZW50X3NzaWQtPnNzaWQsCgkJICAgICB3cGFfcy0+Y3VycmVudF9zc2lkLT5zc2lkX2xlbikgOiAiIik7CglpZiAod3BhX3MtPndwYV9zdGF0ZSA9PSBXUEFfQ09NUExFVEVEKSB7CgkJc3RydWN0IHdwYV9zc2lkICpzc2lkID0gd3BhX3MtPmN1cnJlbnRfc3NpZDsKCQl3cGFfbXNnX2N0cmwod3BhX3MsIE1TR19JTkZPLCBXUEFfRVZFTlRfQ09OTkVDVEVEICItIGNvbm5lY3Rpb24gdG8gIgoJCQlNQUNTVFIgIiBjb21wbGV0ZWQgJXMgW2lkPSVkIGlkX3N0cj0lc10iLAoJCQlNQUMyU1RSKHdwYV9zLT5ic3NpZCksICIoYXV0aCkiLAoJCQlzc2lkID8gc3NpZC0+aWQgOiAtMSwKCQkJc3NpZCAmJiBzc2lkLT5pZF9zdHIgPyBzc2lkLT5pZF9zdHIgOiAiIik7Cgl9CiNlbmRpZiAvKiBBTkRST0lEICovCgoJcmV0dXJuIHBvcyAtIGJ1ZjsKfQoKCnN0YXRpYyBpbnQgd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV9ic3NpZChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAoJCQkJCSAgIGNoYXIgKmNtZCkKewoJY2hhciAqcG9zOwoJaW50IGlkOwoJc3RydWN0IHdwYV9zc2lkICpzc2lkOwoJdTggYnNzaWRbRVRIX0FMRU5dOwoKCS8qIGNtZDogIjxuZXR3b3JrIGlkPiA8QlNTSUQ+IiAqLwoJcG9zID0gb3Nfc3RyY2hyKGNtZCwgJyAnKTsKCWlmIChwb3MgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CgkqcG9zKysgPSAnXDAnOwoJaWQgPSBhdG9pKGNtZCk7Cgl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0U6IGlkPSVkIGJzc2lkPSclcyciLCBpZCwgcG9zKTsKCWlmIChod2FkZHJfYXRvbihwb3MsIGJzc2lkKSkgewoJCXdwYV9wcmludGYoTVNHX0RFQlVHICwiQ1RSTF9JRkFDRTogaW52YWxpZCBCU1NJRCAnJXMnIiwgcG9zKTsKCQlyZXR1cm4gLTE7Cgl9CgoJc3NpZCA9IHdwYV9jb25maWdfZ2V0X25ldHdvcmsod3BhX3MtPmNvbmYsIGlkKTsKCWlmIChzc2lkID09IE5VTEwpIHsKCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0U6IENvdWxkIG5vdCBmaW5kIFNTSUQgaWQ9JWQgIgoJCQkgICAidG8gdXBkYXRlIiwgaWQpOwoJCXJldHVybiAtMTsKCX0KCglvc19tZW1jcHkoc3NpZC0+YnNzaWQsIGJzc2lkLCBFVEhfQUxFTik7Cglzc2lkLT5ic3NpZF9zZXQgPSAhaXNfemVyb19ldGhlcl9hZGRyKGJzc2lkKTsKCglyZXR1cm4gMDsKfQoKCnN0YXRpYyBpbnQgd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV9ibGFja2xpc3Qoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKCQkJCQkgICAgICAgY2hhciAqY21kLCBjaGFyICpidWYsCgkJCQkJICAgICAgIHNpemVfdCBidWZsZW4pCnsKCXU4IGJzc2lkW0VUSF9BTEVOXTsKCXN0cnVjdCB3cGFfYmxhY2tsaXN0ICplOwoJY2hhciAqcG9zLCAqZW5kOwoJaW50IHJldDsKCgkvKiBjbWQ6ICJCTEFDS0xJU1QgWzxCU1NJRD5dIiAqLwoJaWYgKCpjbWQgPT0gJ1wwJykgewoJCXBvcyA9IGJ1ZjsKCQllbmQgPSBidWYgKyBidWZsZW47CgkJZSA9IHdwYV9zLT5ibGFja2xpc3Q7CgkJd2hpbGUgKGUpIHsKCQkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsIE1BQ1NUUiAiXG4iLAoJCQkJCSAgTUFDMlNUUihlLT5ic3NpZCkpOwoJCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKCQkJcG9zICs9IHJldDsKCQkJZSA9IGUtPm5leHQ7CgkJfQoJCXJldHVybiBwb3MgLSBidWY7Cgl9CgoJY21kKys7CglpZiAob3Nfc3RybmNtcChjbWQsICJjbGVhciIsIDUpID09IDApIHsKCQl3cGFfYmxhY2tsaXN0X2NsZWFyKHdwYV9zKTsKCQlvc19tZW1jcHkoYnVmLCAiT0tcbiIsIDMpOwoJCXJldHVybiAzOwoJfQoKCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRTogQkxBQ0tMSVNUIGJzc2lkPSclcyciLCBjbWQpOwoJaWYgKGh3YWRkcl9hdG9uKGNtZCwgYnNzaWQpKSB7CgkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDVFJMX0lGQUNFOiBpbnZhbGlkIEJTU0lEICclcyciLCBjbWQpOwoJCXJldHVybiAtMTsKCX0KCgkvKgoJICogQWRkIHRoZSBCU1NJRCB0d2ljZSwgc28gaXRzIGNvdW50IHdpbGwgYmUgMiwgY2F1c2luZyBpdCB0byBiZQoJICogc2tpcHBlZCB3aGVuIHByb2Nlc3Npbmcgc2NhbiByZXN1bHRzLgoJICovCglyZXQgPSB3cGFfYmxhY2tsaXN0X2FkZCh3cGFfcywgYnNzaWQpOwoJaWYgKHJldCAhPSAwKQoJCXJldHVybiAtMTsKCXJldCA9IHdwYV9ibGFja2xpc3RfYWRkKHdwYV9zLCBic3NpZCk7CglpZiAocmV0ICE9IDApCgkJcmV0dXJuIC0xOwoJb3NfbWVtY3B5KGJ1ZiwgIk9LXG4iLCAzKTsKCXJldHVybiAzOwp9CgoKZXh0ZXJuIGludCB3cGFfZGVidWdfbGV2ZWw7CmV4dGVybiBpbnQgd3BhX2RlYnVnX3RpbWVzdGFtcDsKCnN0YXRpYyBjb25zdCBjaGFyICogZGVidWdfbGV2ZWxfc3RyKGludCBsZXZlbCkKewoJc3dpdGNoIChsZXZlbCkgewoJY2FzZSBNU0dfRVhDRVNTSVZFOgoJCXJldHVybiAiRVhDRVNTSVZFIjsKCWNhc2UgTVNHX01TR0RVTVA6CgkJcmV0dXJuICJNU0dEVU1QIjsKCWNhc2UgTVNHX0RFQlVHOgoJCXJldHVybiAiREVCVUciOwoJY2FzZSBNU0dfSU5GTzoKCQlyZXR1cm4gIklORk8iOwoJY2FzZSBNU0dfV0FSTklORzoKCQlyZXR1cm4gIldBUk5JTkciOwoJY2FzZSBNU0dfRVJST1I6CgkJcmV0dXJuICJFUlJPUiI7CglkZWZhdWx0OgoJCXJldHVybiAiPyI7Cgl9Cn0KCgpzdGF0aWMgaW50IHN0cl90b19kZWJ1Z19sZXZlbChjb25zdCBjaGFyICpzKQp7CglpZiAob3Nfc3RyY2FzZWNtcChzLCAiRVhDRVNTSVZFIikgPT0gMCkKCQlyZXR1cm4gTVNHX0VYQ0VTU0lWRTsKCWlmIChvc19zdHJjYXNlY21wKHMsICJNU0dEVU1QIikgPT0gMCkKCQlyZXR1cm4gTVNHX01TR0RVTVA7CglpZiAob3Nfc3RyY2FzZWNtcChzLCAiREVCVUciKSA9PSAwKQoJCXJldHVybiBNU0dfREVCVUc7CglpZiAob3Nfc3RyY2FzZWNtcChzLCAiSU5GTyIpID09IDApCgkJcmV0dXJuIE1TR19JTkZPOwoJaWYgKG9zX3N0cmNhc2VjbXAocywgIldBUk5JTkciKSA9PSAwKQoJCXJldHVybiBNU0dfV0FSTklORzsKCWlmIChvc19zdHJjYXNlY21wKHMsICJFUlJPUiIpID09IDApCgkJcmV0dXJuIE1TR19FUlJPUjsKCXJldHVybiAtMTsKfQoKCnN0YXRpYyBpbnQgd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV9sb2dfbGV2ZWwoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKCQkJCQkgICAgICAgY2hhciAqY21kLCBjaGFyICpidWYsCgkJCQkJICAgICAgIHNpemVfdCBidWZsZW4pCnsKCWNoYXIgKnBvcywgKmVuZCwgKnN0YW1wOwoJaW50IHJldDsKCglpZiAoY21kID09IE5VTEwpIHsKCQlyZXR1cm4gLTE7Cgl9CgoJLyogY21kOiAiTE9HX0xFVkVMIFs8bGV2ZWw+XSIgKi8KCWlmICgqY21kID09ICdcMCcpIHsKCQlwb3MgPSBidWY7CgkJZW5kID0gYnVmICsgYnVmbGVuOwoJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiQ3VycmVudCBsZXZlbDogJXNcbiIKCQkJCSAgIlRpbWVzdGFtcDogJWRcbiIsCgkJCQkgIGRlYnVnX2xldmVsX3N0cih3cGFfZGVidWdfbGV2ZWwpLAoJCQkJICB3cGFfZGVidWdfdGltZXN0YW1wKTsKCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCQlyZXQgPSAwOwoKCQlyZXR1cm4gcmV0OwoJfQoKCXdoaWxlICgqY21kID09ICcgJykKCQljbWQrKzsKCglzdGFtcCA9IG9zX3N0cmNocihjbWQsICcgJyk7CglpZiAoc3RhbXApIHsKCQkqc3RhbXArKyA9ICdcMCc7CgkJd2hpbGUgKCpzdGFtcCA9PSAnICcpIHsKCQkJc3RhbXArKzsKCQl9Cgl9CgoJaWYgKGNtZCAmJiBvc19zdHJsZW4oY21kKSkgewoJCWludCBsZXZlbCA9IHN0cl90b19kZWJ1Z19sZXZlbChjbWQpOwoJCWlmIChsZXZlbCA8IDApCgkJCXJldHVybiAtMTsKCQl3cGFfZGVidWdfbGV2ZWwgPSBsZXZlbDsKCX0KCglpZiAoc3RhbXAgJiYgb3Nfc3RybGVuKHN0YW1wKSkKCQl3cGFfZGVidWdfdGltZXN0YW1wID0gYXRvaShzdGFtcCk7CgoJb3NfbWVtY3B5KGJ1ZiwgIk9LXG4iLCAzKTsKCXJldHVybiAzOwp9CgoKc3RhdGljIGludCB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX2xpc3RfbmV0d29ya3MoCglzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pCnsKCWNoYXIgKnBvcywgKmVuZDsKCXN0cnVjdCB3cGFfc3NpZCAqc3NpZDsKCWludCByZXQ7CgoJcG9zID0gYnVmOwoJZW5kID0gYnVmICsgYnVmbGVuOwoJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsCgkJCSAgIm5ldHdvcmsgaWQgLyBzc2lkIC8gYnNzaWQgLyBmbGFnc1xuIik7CglpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCXJldHVybiBwb3MgLSBidWY7Cglwb3MgKz0gcmV0OwoKCXNzaWQgPSB3cGFfcy0+Y29uZi0+c3NpZDsKCXdoaWxlIChzc2lkKSB7CgkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICIlZFx0JXMiLAoJCQkJICBzc2lkLT5pZCwKCQkJCSAgd3BhX3NzaWRfdHh0KHNzaWQtPnNzaWQsIHNzaWQtPnNzaWRfbGVuKSk7CgkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKCQlwb3MgKz0gcmV0OwoJCWlmIChzc2lkLT5ic3NpZF9zZXQpIHsKCQkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJcdCIgTUFDU1RSLAoJCQkJCSAgTUFDMlNUUihzc2lkLT5ic3NpZCkpOwoJCX0gZWxzZSB7CgkJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiXHRhbnkiKTsKCQl9CgkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKCQlwb3MgKz0gcmV0OwoJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiXHQlcyVzJXMlcyIsCgkJCQkgIHNzaWQgPT0gd3BhX3MtPmN1cnJlbnRfc3NpZCA/CgkJCQkgICJbQ1VSUkVOVF0iIDogIiIsCgkJCQkgIHNzaWQtPmRpc2FibGVkID8gIltESVNBQkxFRF0iIDogIiIsCgkJCQkgIHNzaWQtPmRpc2FibGVkX3VudGlsLnNlYyA/CgkJCQkgICJbVEVNUC1ESVNBQkxFRF0iIDogIiIsCgkJCQkgIHNzaWQtPmRpc2FibGVkID09IDIgPyAiW1AyUC1QRVJTSVNURU5UXSIgOgoJCQkJICAiIik7CgkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKCQlwb3MgKz0gcmV0OwoJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiXG4iKTsKCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCQlyZXR1cm4gcG9zIC0gYnVmOwoJCXBvcyArPSByZXQ7CgoJCXNzaWQgPSBzc2lkLT5uZXh0OwoJfQoKCXJldHVybiBwb3MgLSBidWY7Cn0KCgpzdGF0aWMgY2hhciAqIHdwYV9zdXBwbGljYW50X2NpcGhlcl90eHQoY2hhciAqcG9zLCBjaGFyICplbmQsIGludCBjaXBoZXIpCnsKCWludCByZXQ7CglyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIi0iKTsKCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCgkJcmV0dXJuIHBvczsKCXBvcyArPSByZXQ7CglyZXQgPSB3cGFfd3JpdGVfY2lwaGVycyhwb3MsIGVuZCwgY2lwaGVyLCAiKyIpOwoJaWYgKHJldCA8IDApCgkJcmV0dXJuIHBvczsKCXBvcyArPSByZXQ7CglyZXR1cm4gcG9zOwp9CgoKc3RhdGljIGNoYXIgKiB3cGFfc3VwcGxpY2FudF9pZV90eHQoY2hhciAqcG9zLCBjaGFyICplbmQsIGNvbnN0IGNoYXIgKnByb3RvLAoJCQkJICAgIGNvbnN0IHU4ICppZSwgc2l6ZV90IGllX2xlbikKewoJc3RydWN0IHdwYV9pZV9kYXRhIGRhdGE7CglpbnQgZmlyc3QsIHJldDsKCglyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIlslcy0iLCBwcm90byk7CglpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCXJldHVybiBwb3M7Cglwb3MgKz0gcmV0OwoKCWlmICh3cGFfcGFyc2Vfd3BhX2llKGllLCBpZV9sZW4sICZkYXRhKSA8IDApIHsKCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIj9dIik7CgkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJcmV0dXJuIHBvczsKCQlwb3MgKz0gcmV0OwoJCXJldHVybiBwb3M7Cgl9CgoJZmlyc3QgPSAxOwoJaWYgKGRhdGEua2V5X21nbXQgJiBXUEFfS0VZX01HTVRfSUVFRTgwMjFYKSB7CgkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICIlc0VBUCIsIGZpcnN0ID8gIiIgOiAiKyIpOwoJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCgkJCXJldHVybiBwb3M7CgkJcG9zICs9IHJldDsKCQlmaXJzdCA9IDA7Cgl9CglpZiAoZGF0YS5rZXlfbWdtdCAmIFdQQV9LRVlfTUdNVF9QU0spIHsKCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIiVzUFNLIiwgZmlyc3QgPyAiIiA6ICIrIik7CgkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJcmV0dXJuIHBvczsKCQlwb3MgKz0gcmV0OwoJCWZpcnN0ID0gMDsKCX0KCWlmIChkYXRhLmtleV9tZ210ICYgV1BBX0tFWV9NR01UX1dQQV9OT05FKSB7CgkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICIlc05vbmUiLCBmaXJzdCA/ICIiIDogIisiKTsKCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCQlyZXR1cm4gcG9zOwoJCXBvcyArPSByZXQ7CgkJZmlyc3QgPSAwOwoJfQojaWZkZWYgQ09ORklHX0lFRUU4MDIxMVIKCWlmIChkYXRhLmtleV9tZ210ICYgV1BBX0tFWV9NR01UX0ZUX0lFRUU4MDIxWCkgewoJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiJXNGVC9FQVAiLAoJCQkJICBmaXJzdCA/ICIiIDogIisiKTsKCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCQlyZXR1cm4gcG9zOwoJCXBvcyArPSByZXQ7CgkJZmlyc3QgPSAwOwoJfQoJaWYgKGRhdGEua2V5X21nbXQgJiBXUEFfS0VZX01HTVRfRlRfUFNLKSB7CgkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICIlc0ZUL1BTSyIsCgkJCQkgIGZpcnN0ID8gIiIgOiAiKyIpOwoJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCgkJCXJldHVybiBwb3M7CgkJcG9zICs9IHJldDsKCQlmaXJzdCA9IDA7Cgl9CiNlbmRpZiAvKiBDT05GSUdfSUVFRTgwMjExUiAqLwojaWZkZWYgQ09ORklHX0lFRUU4MDIxMVcKCWlmIChkYXRhLmtleV9tZ210ICYgV1BBX0tFWV9NR01UX0lFRUU4MDIxWF9TSEEyNTYpIHsKCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIiVzRUFQLVNIQTI1NiIsCgkJCQkgIGZpcnN0ID8gIiIgOiAiKyIpOwoJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCgkJCXJldHVybiBwb3M7CgkJcG9zICs9IHJldDsKCQlmaXJzdCA9IDA7Cgl9CglpZiAoZGF0YS5rZXlfbWdtdCAmIFdQQV9LRVlfTUdNVF9QU0tfU0hBMjU2KSB7CgkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICIlc1BTSy1TSEEyNTYiLAoJCQkJICBmaXJzdCA/ICIiIDogIisiKTsKCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCQlyZXR1cm4gcG9zOwoJCXBvcyArPSByZXQ7CgkJZmlyc3QgPSAwOwoJfQojZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVcgKi8KCglwb3MgPSB3cGFfc3VwcGxpY2FudF9jaXBoZXJfdHh0KHBvcywgZW5kLCBkYXRhLnBhaXJ3aXNlX2NpcGhlcik7CgoJaWYgKGRhdGEuY2FwYWJpbGl0aWVzICYgV1BBX0NBUEFCSUxJVFlfUFJFQVVUSCkgewoJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiLXByZWF1dGgiKTsKCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCQlyZXR1cm4gcG9zOwoJCXBvcyArPSByZXQ7Cgl9CgoJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJdIik7CglpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCXJldHVybiBwb3M7Cglwb3MgKz0gcmV0OwoKCXJldHVybiBwb3M7Cn0KCgojaWZkZWYgQ09ORklHX1dQUwpzdGF0aWMgY2hhciAqIHdwYV9zdXBwbGljYW50X3dwc19pZV90eHRfYnVmKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCgkJCQkJICAgIGNoYXIgKnBvcywgY2hhciAqZW5kLAoJCQkJCSAgICBzdHJ1Y3Qgd3BhYnVmICp3cHNfaWUpCnsKCWludCByZXQ7Cgljb25zdCBjaGFyICp0eHQ7CgoJaWYgKHdwc19pZSA9PSBOVUxMKQoJCXJldHVybiBwb3M7CglpZiAod3BzX2lzX3NlbGVjdGVkX3BiY19yZWdpc3RyYXIod3BzX2llKSkKCQl0eHQgPSAiW1dQUy1QQkNdIjsKI2lmZGVmIENPTkZJR19XUFMyCgllbHNlIGlmICh3cHNfaXNfYWRkcl9hdXRob3JpemVkKHdwc19pZSwgd3BhX3MtPm93bl9hZGRyLCAwKSkKCQl0eHQgPSAiW1dQUy1BVVRIXSI7CiNlbmRpZiAvKiBDT05GSUdfV1BTMiAqLwoJZWxzZSBpZiAod3BzX2lzX3NlbGVjdGVkX3Bpbl9yZWdpc3RyYXIod3BzX2llKSkKCQl0eHQgPSAiW1dQUy1QSU5dIjsKCWVsc2UKCQl0eHQgPSAiW1dQU10iOwoKCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiJXMiLCB0eHQpOwoJaWYgKHJldCA+PSAwICYmIHJldCA8IGVuZCAtIHBvcykKCQlwb3MgKz0gcmV0OwoJd3BhYnVmX2ZyZWUod3BzX2llKTsKCXJldHVybiBwb3M7Cn0KI2VuZGlmIC8qIENPTkZJR19XUFMgKi8KCgpzdGF0aWMgY2hhciAqIHdwYV9zdXBwbGljYW50X3dwc19pZV90eHQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKCQkJCQljaGFyICpwb3MsIGNoYXIgKmVuZCwKCQkJCQljb25zdCBzdHJ1Y3Qgd3BhX2JzcyAqYnNzKQp7CiNpZmRlZiBDT05GSUdfV1BTCglzdHJ1Y3Qgd3BhYnVmICp3cHNfaWU7Cgl3cHNfaWUgPSB3cGFfYnNzX2dldF92ZW5kb3JfaWVfbXVsdGkoYnNzLCBXUFNfSUVfVkVORE9SX1RZUEUpOwoJcmV0dXJuIHdwYV9zdXBwbGljYW50X3dwc19pZV90eHRfYnVmKHdwYV9zLCBwb3MsIGVuZCwgd3BzX2llKTsKI2Vsc2UgLyogQ09ORklHX1dQUyAqLwoJcmV0dXJuIHBvczsKI2VuZGlmIC8qIENPTkZJR19XUFMgKi8KfQoKCi8qIEZvcm1hdCBvbmUgcmVzdWx0IG9uIG9uZSB0ZXh0IGxpbmUgaW50byBhIGJ1ZmZlci4gKi8Kc3RhdGljIGludCB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3NjYW5fcmVzdWx0KAoJc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKCWNvbnN0IHN0cnVjdCB3cGFfYnNzICpic3MsIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbikKewoJY2hhciAqcG9zLCAqZW5kOwoJaW50IHJldDsKCWNvbnN0IHU4ICppZSwgKmllMiwgKnAycDsKCglwMnAgPSB3cGFfYnNzX2dldF92ZW5kb3JfaWUoYnNzLCBQMlBfSUVfVkVORE9SX1RZUEUpOwoJaWYgKHAycCAmJiBic3MtPnNzaWRfbGVuID09IFAyUF9XSUxEQ0FSRF9TU0lEX0xFTiAmJgoJICAgIG9zX21lbWNtcChic3MtPnNzaWQsIFAyUF9XSUxEQ0FSRF9TU0lELCBQMlBfV0lMRENBUkRfU1NJRF9MRU4pID09CgkgICAgMCkKCQlyZXR1cm4gMDsgLyogRG8gbm90IHNob3cgUDJQIGxpc3RlbiBkaXNjb3ZlcnkgcmVzdWx0cyBoZXJlICovCgoJcG9zID0gYnVmOwoJZW5kID0gYnVmICsgYnVmbGVuOwoKCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCBNQUNTVFIgIlx0JWRcdCVkXHQiLAoJCQkgIE1BQzJTVFIoYnNzLT5ic3NpZCksIGJzcy0+ZnJlcSwgYnNzLT5sZXZlbCk7CglpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCXJldHVybiAtMTsKCXBvcyArPSByZXQ7CglpZSA9IHdwYV9ic3NfZ2V0X3ZlbmRvcl9pZShic3MsIFdQQV9JRV9WRU5ET1JfVFlQRSk7CglpZiAoaWUpCgkJcG9zID0gd3BhX3N1cHBsaWNhbnRfaWVfdHh0KHBvcywgZW5kLCAiV1BBIiwgaWUsIDIgKyBpZVsxXSk7CglpZTIgPSB3cGFfYnNzX2dldF9pZShic3MsIFdMQU5fRUlEX1JTTik7CglpZiAoaWUyKQoJCXBvcyA9IHdwYV9zdXBwbGljYW50X2llX3R4dChwb3MsIGVuZCwgIldQQTIiLCBpZTIsIDIgKyBpZTJbMV0pOwoJcG9zID0gd3BhX3N1cHBsaWNhbnRfd3BzX2llX3R4dCh3cGFfcywgcG9zLCBlbmQsIGJzcyk7CglpZiAoIWllICYmICFpZTIgJiYgYnNzLT5jYXBzICYgSUVFRTgwMjExX0NBUF9QUklWQUNZKSB7CgkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJbV0VQXSIpOwoJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCgkJCXJldHVybiAtMTsKCQlwb3MgKz0gcmV0OwoJfQoJaWYgKGJzcy0+Y2FwcyAmIElFRUU4MDIxMV9DQVBfSUJTUykgewoJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiW0lCU1NdIik7CgkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJcmV0dXJuIC0xOwoJCXBvcyArPSByZXQ7Cgl9CglpZiAoYnNzLT5jYXBzICYgSUVFRTgwMjExX0NBUF9FU1MpIHsKCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIltFU1NdIik7CgkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJcmV0dXJuIC0xOwoJCXBvcyArPSByZXQ7Cgl9CglpZiAocDJwKSB7CgkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJbUDJQXSIpOwoJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCgkJCXJldHVybiAtMTsKCQlwb3MgKz0gcmV0OwoJfQojaWZkZWYgQ09ORklHX0hTMjAKCWlmICh3cGFfYnNzX2dldF92ZW5kb3JfaWUoYnNzLCBIUzIwX0lFX1ZFTkRPUl9UWVBFKSAmJiBpZTIpIHsKCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIltIUzIwXSIpOwoJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCgkJCXJldHVybiAtMTsKCQlwb3MgKz0gcmV0OwoJfQojZW5kaWYgLyogQ09ORklHX0hTMjAgKi8KCglyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIlx0JXMiLAoJCQkgIHdwYV9zc2lkX3R4dChic3MtPnNzaWQsIGJzcy0+c3NpZF9sZW4pKTsKCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCgkJcmV0dXJuIC0xOwoJcG9zICs9IHJldDsKCglyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIlxuIik7CglpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCXJldHVybiAtMTsKCXBvcyArPSByZXQ7CgoJcmV0dXJuIHBvcyAtIGJ1ZjsKfQoKCnN0YXRpYyBpbnQgd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV9zY2FuX3Jlc3VsdHMoCglzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pCnsKCWNoYXIgKnBvcywgKmVuZDsKCXN0cnVjdCB3cGFfYnNzICpic3M7CglpbnQgcmV0OwoKCXBvcyA9IGJ1ZjsKCWVuZCA9IGJ1ZiArIGJ1ZmxlbjsKCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiYnNzaWQgLyBmcmVxdWVuY3kgLyBzaWduYWwgbGV2ZWwgLyAiCgkJCSAgImZsYWdzIC8gc3NpZFxuIik7CglpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCXJldHVybiBwb3MgLSBidWY7Cglwb3MgKz0gcmV0OwoKCWRsX2xpc3RfZm9yX2VhY2goYnNzLCAmd3BhX3MtPmJzc19pZCwgc3RydWN0IHdwYV9ic3MsIGxpc3RfaWQpIHsKCQlyZXQgPSB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3NjYW5fcmVzdWx0KHdwYV9zLCBic3MsIHBvcywKCQkJCQkJCSAgICBlbmQgLSBwb3MpOwoJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCgkJCXJldHVybiBwb3MgLSBidWY7CgkJcG9zICs9IHJldDsKCX0KCglyZXR1cm4gcG9zIC0gYnVmOwp9CgoKc3RhdGljIGludCB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3NlbGVjdF9uZXR3b3JrKAoJc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY2hhciAqY21kKQp7CglpbnQgaWQ7CglzdHJ1Y3Qgd3BhX3NzaWQgKnNzaWQ7CgoJLyogY21kOiAiPG5ldHdvcmsgaWQ+IiBvciAiYW55IiAqLwoJaWYgKG9zX3N0cmNtcChjbWQsICJhbnkiKSA9PSAwKSB7CgkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDVFJMX0lGQUNFOiBTRUxFQ1RfTkVUV09SSyBhbnkiKTsKCQlzc2lkID0gTlVMTDsKCX0gZWxzZSB7CgkJaWQgPSBhdG9pKGNtZCk7CgkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDVFJMX0lGQUNFOiBTRUxFQ1RfTkVUV09SSyBpZD0lZCIsIGlkKTsKCgkJc3NpZCA9IHdwYV9jb25maWdfZ2V0X25ldHdvcmsod3BhX3MtPmNvbmYsIGlkKTsKCQlpZiAoc3NpZCA9PSBOVUxMKSB7CgkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRTogQ291bGQgbm90IGZpbmQgIgoJCQkJICAgIm5ldHdvcmsgaWQ9JWQiLCBpZCk7CgkJCXJldHVybiAtMTsKCQl9CgkJaWYgKHNzaWQtPmRpc2FibGVkID09IDIpIHsKCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDVFJMX0lGQUNFOiBDYW5ub3QgdXNlICIKCQkJCSAgICJTRUxFQ1RfTkVUV09SSyB3aXRoIHBlcnNpc3RlbnQgUDJQIGdyb3VwIik7CgkJCXJldHVybiAtMTsKCQl9Cgl9CgoJd3BhX3N1cHBsaWNhbnRfc2VsZWN0X25ldHdvcmsod3BhX3MsIHNzaWQpOwoKCXJldHVybiAwOwp9CgoKc3RhdGljIGludCB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX2VuYWJsZV9uZXR3b3JrKAoJc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY2hhciAqY21kKQp7CglpbnQgaWQ7CglzdHJ1Y3Qgd3BhX3NzaWQgKnNzaWQ7CgoJLyogY21kOiAiPG5ldHdvcmsgaWQ+IiBvciAiYWxsIiAqLwoJaWYgKG9zX3N0cmNtcChjbWQsICJhbGwiKSA9PSAwKSB7CgkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDVFJMX0lGQUNFOiBFTkFCTEVfTkVUV09SSyBhbGwiKTsKCQlzc2lkID0gTlVMTDsKCX0gZWxzZSB7CgkJaWQgPSBhdG9pKGNtZCk7CgkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDVFJMX0lGQUNFOiBFTkFCTEVfTkVUV09SSyBpZD0lZCIsIGlkKTsKCgkJc3NpZCA9IHdwYV9jb25maWdfZ2V0X25ldHdvcmsod3BhX3MtPmNvbmYsIGlkKTsKCQlpZiAoc3NpZCA9PSBOVUxMKSB7CgkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRTogQ291bGQgbm90IGZpbmQgIgoJCQkJICAgIm5ldHdvcmsgaWQ9JWQiLCBpZCk7CgkJCXJldHVybiAtMTsKCQl9CgkJaWYgKHNzaWQtPmRpc2FibGVkID09IDIpIHsKCQkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDVFJMX0lGQUNFOiBDYW5ub3QgdXNlICIKCQkJCSAgICJFTkFCTEVfTkVUV09SSyB3aXRoIHBlcnNpc3RlbnQgUDJQIGdyb3VwIik7CgkJCXJldHVybiAtMTsKCQl9CgoJCWlmIChvc19zdHJzdHIoY21kLCAiIG5vLWNvbm5lY3QiKSkgewoJCQlzc2lkLT5kaXNhYmxlZCA9IDA7CgkJCXJldHVybiAwOwoJCX0KCX0KCXdwYV9zdXBwbGljYW50X2VuYWJsZV9uZXR3b3JrKHdwYV9zLCBzc2lkKTsKCglyZXR1cm4gMDsKfQoKCnN0YXRpYyBpbnQgd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV9kaXNhYmxlX25ldHdvcmsoCglzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjaGFyICpjbWQpCnsKCWludCBpZDsKCXN0cnVjdCB3cGFfc3NpZCAqc3NpZDsKCgkvKiBjbWQ6ICI8bmV0d29yayBpZD4iIG9yICJhbGwiICovCglpZiAob3Nfc3RyY21wKGNtZCwgImFsbCIpID09IDApIHsKCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0U6IERJU0FCTEVfTkVUV09SSyBhbGwiKTsKCQlzc2lkID0gTlVMTDsKCX0gZWxzZSB7CgkJaWQgPSBhdG9pKGNtZCk7CgkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDVFJMX0lGQUNFOiBESVNBQkxFX05FVFdPUksgaWQ9JWQiLCBpZCk7CgoJCXNzaWQgPSB3cGFfY29uZmlnX2dldF9uZXR3b3JrKHdwYV9zLT5jb25mLCBpZCk7CgkJaWYgKHNzaWQgPT0gTlVMTCkgewoJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0U6IENvdWxkIG5vdCBmaW5kICIKCQkJCSAgICJuZXR3b3JrIGlkPSVkIiwgaWQpOwoJCQlyZXR1cm4gLTE7CgkJfQoJCWlmIChzc2lkLT5kaXNhYmxlZCA9PSAyKSB7CgkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRTogQ2Fubm90IHVzZSAiCgkJCQkgICAiRElTQUJMRV9ORVRXT1JLIHdpdGggcGVyc2lzdGVudCBQMlAgIgoJCQkJICAgImdyb3VwIik7CgkJCXJldHVybiAtMTsKCQl9Cgl9Cgl3cGFfc3VwcGxpY2FudF9kaXNhYmxlX25ldHdvcmsod3BhX3MsIHNzaWQpOwoKCXJldHVybiAwOwp9CgoKc3RhdGljIGludCB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX2FkZF9uZXR3b3JrKAoJc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQp7CglzdHJ1Y3Qgd3BhX3NzaWQgKnNzaWQ7CglpbnQgcmV0OwoKCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRTogQUREX05FVFdPUksiKTsKCglzc2lkID0gd3BhX2NvbmZpZ19hZGRfbmV0d29yayh3cGFfcy0+Y29uZik7CglpZiAoc3NpZCA9PSBOVUxMKQoJCXJldHVybiAtMTsKCgl3cGFzX25vdGlmeV9uZXR3b3JrX2FkZGVkKHdwYV9zLCBzc2lkKTsKCglzc2lkLT5kaXNhYmxlZCA9IDE7Cgl3cGFfY29uZmlnX3NldF9uZXR3b3JrX2RlZmF1bHRzKHNzaWQpOwoKCXJldCA9IG9zX3NucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiJWRcbiIsIHNzaWQtPmlkKTsKCWlmIChyZXQgPCAwIHx8IChzaXplX3QpIHJldCA+PSBidWZsZW4pCgkJcmV0dXJuIC0xOwoJcmV0dXJuIHJldDsKfQoKCnN0YXRpYyBpbnQgd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV9yZW1vdmVfbmV0d29yaygKCXN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGNoYXIgKmNtZCkKewoJaW50IGlkOwoJc3RydWN0IHdwYV9zc2lkICpzc2lkOwoJaW50IHdhc19kaXNhYmxlZDsKCgkvKiBjbWQ6ICI8bmV0d29yayBpZD4iIG9yICJhbGwiICovCglpZiAob3Nfc3RyY21wKGNtZCwgImFsbCIpID09IDApIHsKCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0U6IFJFTU9WRV9ORVRXT1JLIGFsbCIpOwoJCWlmICh3cGFfcy0+c2NoZWRfc2Nhbm5pbmcpCgkJCXdwYV9zdXBwbGljYW50X2NhbmNlbF9zY2hlZF9zY2FuKHdwYV9zKTsKCgkJZWFwb2xfc21faW52YWxpZGF0ZV9jYWNoZWRfc2Vzc2lvbih3cGFfcy0+ZWFwb2wpOwoJCWlmICh3cGFfcy0+Y3VycmVudF9zc2lkKSB7CiNpZmRlZiBDT05GSUdfU01FCgkJCXdwYV9zLT5zbWUucHJldl9ic3NpZF9zZXQgPSAwOwojZW5kaWYgLyogQ09ORklHX1NNRSAqLwoJCQl3cGFfc21fc2V0X2NvbmZpZyh3cGFfcy0+d3BhLCBOVUxMKTsKCQkJZWFwb2xfc21fbm90aWZ5X2NvbmZpZyh3cGFfcy0+ZWFwb2wsIE5VTEwsIE5VTEwpOwoJCQl3cGFfc3VwcGxpY2FudF9kZWF1dGhlbnRpY2F0ZSgKCQkJCXdwYV9zLCBXTEFOX1JFQVNPTl9ERUFVVEhfTEVBVklORyk7CgkJfQoJCXNzaWQgPSB3cGFfcy0+Y29uZi0+c3NpZDsKCQl3aGlsZSAoc3NpZCkgewoJCQlzdHJ1Y3Qgd3BhX3NzaWQgKnJlbW92ZV9zc2lkID0gc3NpZDsKCQkJaWQgPSBzc2lkLT5pZDsKCQkJc3NpZCA9IHNzaWQtPm5leHQ7CgkJCXdwYXNfbm90aWZ5X25ldHdvcmtfcmVtb3ZlZCh3cGFfcywgcmVtb3ZlX3NzaWQpOwoJCQl3cGFfY29uZmlnX3JlbW92ZV9uZXR3b3JrKHdwYV9zLT5jb25mLCBpZCk7CgkJfQoJCXJldHVybiAwOwoJfQoKCWlkID0gYXRvaShjbWQpOwoJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDVFJMX0lGQUNFOiBSRU1PVkVfTkVUV09SSyBpZD0lZCIsIGlkKTsKCglzc2lkID0gd3BhX2NvbmZpZ19nZXRfbmV0d29yayh3cGFfcy0+Y29uZiwgaWQpOwoJaWYgKHNzaWQpCgkJd3Bhc19ub3RpZnlfbmV0d29ya19yZW1vdmVkKHdwYV9zLCBzc2lkKTsKCWlmIChzc2lkID09IE5VTEwpIHsKCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0U6IENvdWxkIG5vdCBmaW5kIG5ldHdvcmsgIgoJCQkgICAiaWQ9JWQiLCBpZCk7CgkJcmV0dXJuIC0xOwoJfQoKCWlmIChzc2lkID09IHdwYV9zLT5jdXJyZW50X3NzaWQgfHwgd3BhX3MtPmN1cnJlbnRfc3NpZCA9PSBOVUxMKSB7CiNpZmRlZiBDT05GSUdfU01FCgkJd3BhX3MtPnNtZS5wcmV2X2Jzc2lkX3NldCA9IDA7CiNlbmRpZiAvKiBDT05GSUdfU01FICovCgkJLyoKCQkgKiBJbnZhbGlkYXRlIHRoZSBFQVAgc2Vzc2lvbiBjYWNoZSBpZiB0aGUgY3VycmVudCBvcgoJCSAqIHByZXZpb3VzbHkgdXNlZCBuZXR3b3JrIGlzIHJlbW92ZWQuCgkJICovCgkJZWFwb2xfc21faW52YWxpZGF0ZV9jYWNoZWRfc2Vzc2lvbih3cGFfcy0+ZWFwb2wpOwoJfQoKCWlmIChzc2lkID09IHdwYV9zLT5jdXJyZW50X3NzaWQpIHsKCQl3cGFfc21fc2V0X2NvbmZpZyh3cGFfcy0+d3BhLCBOVUxMKTsKCQllYXBvbF9zbV9ub3RpZnlfY29uZmlnKHdwYV9zLT5lYXBvbCwgTlVMTCwgTlVMTCk7CgoJCXdwYV9zdXBwbGljYW50X2RlYXV0aGVudGljYXRlKHdwYV9zLAoJCQkJCSAgICAgIFdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HKTsKCX0KCgl3YXNfZGlzYWJsZWQgPSBzc2lkLT5kaXNhYmxlZDsKCglpZiAod3BhX2NvbmZpZ19yZW1vdmVfbmV0d29yayh3cGFfcy0+Y29uZiwgaWQpIDwgMCkgewoJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRTogTm90IGFibGUgdG8gcmVtb3ZlIHRoZSAiCgkJCSAgICJuZXR3b3JrIGlkPSVkIiwgaWQpOwoJCXJldHVybiAtMTsKCX0KCglpZiAoIXdhc19kaXNhYmxlZCAmJiB3cGFfcy0+c2NoZWRfc2Nhbm5pbmcpIHsKCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlN0b3Agb25nb2luZyBzY2hlZF9zY2FuIHRvIHJlbW92ZSAiCgkJCSAgICJuZXR3b3JrIGZyb20gZmlsdGVycyIpOwoJCXdwYV9zdXBwbGljYW50X2NhbmNlbF9zY2hlZF9zY2FuKHdwYV9zKTsKCQl3cGFfc3VwcGxpY2FudF9yZXFfc2Nhbih3cGFfcywgMCwgMCk7Cgl9CgoJcmV0dXJuIDA7Cn0KCgpzdGF0aWMgaW50IHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2Vfc2V0X25ldHdvcmsoCglzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjaGFyICpjbWQpCnsKCWludCBpZDsKCXN0cnVjdCB3cGFfc3NpZCAqc3NpZDsKCWNoYXIgKm5hbWUsICp2YWx1ZTsKCgkvKiBjbWQ6ICI8bmV0d29yayBpZD4gPHZhcmlhYmxlIG5hbWU+IDx2YWx1ZT4iICovCgluYW1lID0gb3Nfc3RyY2hyKGNtZCwgJyAnKTsKCWlmIChuYW1lID09IE5VTEwpCgkJcmV0dXJuIC0xOwoJKm5hbWUrKyA9ICdcMCc7CgoJdmFsdWUgPSBvc19zdHJjaHIobmFtZSwgJyAnKTsKCWlmICh2YWx1ZSA9PSBOVUxMKQoJCXJldHVybiAtMTsKCSp2YWx1ZSsrID0gJ1wwJzsKCglpZCA9IGF0b2koY21kKTsKCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRTogU0VUX05FVFdPUksgaWQ9JWQgbmFtZT0nJXMnIiwKCQkgICBpZCwgbmFtZSk7Cgl3cGFfaGV4ZHVtcF9hc2NpaV9rZXkoTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRTogdmFsdWUiLAoJCQkgICAgICAodTggKikgdmFsdWUsIG9zX3N0cmxlbih2YWx1ZSkpOwoKCXNzaWQgPSB3cGFfY29uZmlnX2dldF9uZXR3b3JrKHdwYV9zLT5jb25mLCBpZCk7CglpZiAoc3NpZCA9PSBOVUxMKSB7CgkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDVFJMX0lGQUNFOiBDb3VsZCBub3QgZmluZCBuZXR3b3JrICIKCQkJICAgImlkPSVkIiwgaWQpOwoJCXJldHVybiAtMTsKCX0KCglpZiAod3BhX2NvbmZpZ19zZXQoc3NpZCwgbmFtZSwgdmFsdWUsIDApIDwgMCkgewoJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRTogRmFpbGVkIHRvIHNldCBuZXR3b3JrICIKCQkJICAgInZhcmlhYmxlICclcyciLCBuYW1lKTsKCQlyZXR1cm4gLTE7Cgl9CgoJaWYgKG9zX3N0cmNtcChuYW1lLCAiYnNzaWQiKSAhPSAwICYmCgkgICAgb3Nfc3RyY21wKG5hbWUsICJwcmlvcml0eSIpICE9IDApCgkJd3BhX3NtX3Bta3NhX2NhY2hlX2ZsdXNoKHdwYV9zLT53cGEsIHNzaWQpOwoKCWlmICh3cGFfcy0+Y3VycmVudF9zc2lkID09IHNzaWQgfHwgd3BhX3MtPmN1cnJlbnRfc3NpZCA9PSBOVUxMKSB7CgkJLyoKCQkgKiBJbnZhbGlkYXRlIHRoZSBFQVAgc2Vzc2lvbiBjYWNoZSBpZiBhbnl0aGluZyBpbiB0aGUgY3VycmVudAoJCSAqIG9yIHByZXZpb3VzbHkgdXNlZCBjb25maWd1cmF0aW9uIGNoYW5nZXMuCgkJICovCgkJZWFwb2xfc21faW52YWxpZGF0ZV9jYWNoZWRfc2Vzc2lvbih3cGFfcy0+ZWFwb2wpOwoJfQoKCWlmICgob3Nfc3RyY21wKG5hbWUsICJwc2siKSA9PSAwICYmCgkgICAgIHZhbHVlWzBdID09ICciJyAmJiBzc2lkLT5zc2lkX2xlbikgfHwKCSAgICAob3Nfc3RyY21wKG5hbWUsICJzc2lkIikgPT0gMCAmJiBzc2lkLT5wYXNzcGhyYXNlKSkKCQl3cGFfY29uZmlnX3VwZGF0ZV9wc2soc3NpZCk7CgllbHNlIGlmIChvc19zdHJjbXAobmFtZSwgInByaW9yaXR5IikgPT0gMCkKCQl3cGFfY29uZmlnX3VwZGF0ZV9wcmlvX2xpc3Qod3BhX3MtPmNvbmYpOwoKCXJldHVybiAwOwp9CgoKc3RhdGljIGludCB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX2dldF9uZXR3b3JrKAoJc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY2hhciAqY21kLCBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pCnsKCWludCBpZDsKCXNpemVfdCByZXM7CglzdHJ1Y3Qgd3BhX3NzaWQgKnNzaWQ7CgljaGFyICpuYW1lLCAqdmFsdWU7CgoJLyogY21kOiAiPG5ldHdvcmsgaWQ+IDx2YXJpYWJsZSBuYW1lPiIgKi8KCW5hbWUgPSBvc19zdHJjaHIoY21kLCAnICcpOwoJaWYgKG5hbWUgPT0gTlVMTCB8fCBidWZsZW4gPT0gMCkKCQlyZXR1cm4gLTE7CgkqbmFtZSsrID0gJ1wwJzsKCglpZCA9IGF0b2koY21kKTsKCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRTogR0VUX05FVFdPUksgaWQ9JWQgbmFtZT0nJXMnIiwKCQkgICBpZCwgbmFtZSk7CgoJc3NpZCA9IHdwYV9jb25maWdfZ2V0X25ldHdvcmsod3BhX3MtPmNvbmYsIGlkKTsKCWlmIChzc2lkID09IE5VTEwpIHsKCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0U6IENvdWxkIG5vdCBmaW5kIG5ldHdvcmsgIgoJCQkgICAiaWQ9JWQiLCBpZCk7CgkJcmV0dXJuIC0xOwoJfQoKCXZhbHVlID0gd3BhX2NvbmZpZ19nZXRfbm9fa2V5KHNzaWQsIG5hbWUpOwoJaWYgKHZhbHVlID09IE5VTEwpIHsKCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0U6IEZhaWxlZCB0byBnZXQgbmV0d29yayAiCgkJCSAgICJ2YXJpYWJsZSAnJXMnIiwgbmFtZSk7CgkJcmV0dXJuIC0xOwoJfQoKCXJlcyA9IG9zX3N0cmxjcHkoYnVmLCB2YWx1ZSwgYnVmbGVuKTsKCWlmIChyZXMgPj0gYnVmbGVuKSB7CgkJb3NfZnJlZSh2YWx1ZSk7CgkJcmV0dXJuIC0xOwoJfQoKCW9zX2ZyZWUodmFsdWUpOwoKCXJldHVybiByZXM7Cn0KCgpzdGF0aWMgaW50IHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2VfbGlzdF9jcmVkcyhzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAoJCQkJCQljaGFyICpidWYsIHNpemVfdCBidWZsZW4pCnsKCWNoYXIgKnBvcywgKmVuZDsKCXN0cnVjdCB3cGFfY3JlZCAqY3JlZDsKCWludCByZXQ7CgoJcG9zID0gYnVmOwoJZW5kID0gYnVmICsgYnVmbGVuOwoJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsCgkJCSAgImNyZWQgaWQgLyByZWFsbSAvIHVzZXJuYW1lIC8gZG9tYWluIC8gaW1zaVxuIik7CglpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCXJldHVybiBwb3MgLSBidWY7Cglwb3MgKz0gcmV0OwoKCWNyZWQgPSB3cGFfcy0+Y29uZi0+Y3JlZDsKCXdoaWxlIChjcmVkKSB7CgkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICIlZFx0JXNcdCVzXHQlc1x0JXNcbiIsCgkJCQkgIGNyZWQtPmlkLCBjcmVkLT5yZWFsbSA/IGNyZWQtPnJlYWxtIDogIiIsCgkJCQkgIGNyZWQtPnVzZXJuYW1lID8gY3JlZC0+dXNlcm5hbWUgOiAiIiwKCQkJCSAgY3JlZC0+ZG9tYWluID8gY3JlZC0+ZG9tYWluIDogIiIsCgkJCQkgIGNyZWQtPmltc2kgPyBjcmVkLT5pbXNpIDogIiIpOwoJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCgkJCXJldHVybiBwb3MgLSBidWY7CgkJcG9zICs9IHJldDsKCgkJY3JlZCA9IGNyZWQtPm5leHQ7Cgl9CgoJcmV0dXJuIHBvcyAtIGJ1ZjsKfQoKCnN0YXRpYyBpbnQgd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV9hZGRfY3JlZChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAoJCQkJCSAgICAgIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbikKewoJc3RydWN0IHdwYV9jcmVkICpjcmVkOwoJaW50IHJldDsKCgl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0U6IEFERF9DUkVEIik7CgoJY3JlZCA9IHdwYV9jb25maWdfYWRkX2NyZWQod3BhX3MtPmNvbmYpOwoJaWYgKGNyZWQgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CgoJcmV0ID0gb3Nfc25wcmludGYoYnVmLCBidWZsZW4sICIlZFxuIiwgY3JlZC0+aWQpOwoJaWYgKHJldCA8IDAgfHwgKHNpemVfdCkgcmV0ID49IGJ1ZmxlbikKCQlyZXR1cm4gLTE7CglyZXR1cm4gcmV0Owp9CgoKc3RhdGljIGludCB3cGFzX2N0cmxfcmVtb3ZlX2NyZWQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKCQkJCSBzdHJ1Y3Qgd3BhX2NyZWQgKmNyZWQpCnsKCXN0cnVjdCB3cGFfc3NpZCAqc3NpZDsKCWNoYXIgc3RyWzIwXTsKCglpZiAoY3JlZCA9PSBOVUxMIHx8IHdwYV9jb25maWdfcmVtb3ZlX2NyZWQod3BhX3MtPmNvbmYsIGNyZWQtPmlkKSA8IDApIHsKCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0U6IENvdWxkIG5vdCBmaW5kIGNyZWQiKTsKCQlyZXR1cm4gLTE7Cgl9CgoJLyogUmVtb3ZlIGFueSBuZXR3b3JrIGVudHJ5IGNyZWF0ZWQgYmFzZWQgb24gdGhlIHJlbW92ZWQgY3JlZGVudGlhbCAqLwoJc3NpZCA9IHdwYV9zLT5jb25mLT5zc2lkOwoJd2hpbGUgKHNzaWQpIHsKCQlpZiAoc3NpZC0+cGFyZW50X2NyZWQgPT0gY3JlZCkgewoJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlJlbW92ZSBuZXR3b3JrIGlkICVkIHNpbmNlIGl0ICIKCQkJCSAgICJ1c2VkIHRoZSByZW1vdmVkIGNyZWRlbnRpYWwiLCBzc2lkLT5pZCk7CgkJCW9zX3NucHJpbnRmKHN0ciwgc2l6ZW9mKHN0ciksICIlZCIsIHNzaWQtPmlkKTsKCQkJc3NpZCA9IHNzaWQtPm5leHQ7CgkJCXdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2VfcmVtb3ZlX25ldHdvcmsod3BhX3MsIHN0cik7CgkJfSBlbHNlCgkJCXNzaWQgPSBzc2lkLT5uZXh0OwoJfQoKCXJldHVybiAwOwp9CgoKc3RhdGljIGludCB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3JlbW92ZV9jcmVkKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCgkJCQkJCSBjaGFyICpjbWQpCnsKCWludCBpZDsKCXN0cnVjdCB3cGFfY3JlZCAqY3JlZCwgKnByZXY7CgoJLyogY21kOiAiPGNyZWQgaWQ+IiwgImFsbCIsIG9yICJzcF9mcWRuPTxGUUROPiIgKi8KCWlmIChvc19zdHJjbXAoY21kLCAiYWxsIikgPT0gMCkgewoJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRTogUkVNT1ZFX0NSRUQgYWxsIik7CgkJY3JlZCA9IHdwYV9zLT5jb25mLT5jcmVkOwoJCXdoaWxlIChjcmVkKSB7CgkJCXByZXYgPSBjcmVkOwoJCQljcmVkID0gY3JlZC0+bmV4dDsKCQkJd3Bhc19jdHJsX3JlbW92ZV9jcmVkKHdwYV9zLCBwcmV2KTsKCQl9CgkJcmV0dXJuIDA7Cgl9CgoJaWYgKG9zX3N0cm5jbXAoY21kLCAic3BfZnFkbj0iLCA4KSA9PSAwKSB7CgkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDVFJMX0lGQUNFOiBSRU1PVkVfQ1JFRCBTUCBGUUROICclcyciLAoJCQkgICBjbWQgKyA4KTsKCQljcmVkID0gd3BhX3MtPmNvbmYtPmNyZWQ7CgkJd2hpbGUgKGNyZWQpIHsKCQkJcHJldiA9IGNyZWQ7CgkJCWNyZWQgPSBjcmVkLT5uZXh0OwoJCQlpZiAocHJldi0+ZG9tYWluICYmCgkJCSAgICBvc19zdHJjbXAocHJldi0+ZG9tYWluLCBjbWQgKyA4KSA9PSAwKQoJCQkJd3Bhc19jdHJsX3JlbW92ZV9jcmVkKHdwYV9zLCBwcmV2KTsKCQl9CgkJcmV0dXJuIDA7Cgl9CgoJaWQgPSBhdG9pKGNtZCk7Cgl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0U6IFJFTU9WRV9DUkVEIGlkPSVkIiwgaWQpOwoKCWNyZWQgPSB3cGFfY29uZmlnX2dldF9jcmVkKHdwYV9zLT5jb25mLCBpZCk7CglyZXR1cm4gd3Bhc19jdHJsX3JlbW92ZV9jcmVkKHdwYV9zLCBjcmVkKTsKfQoKCnN0YXRpYyBpbnQgd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV9zZXRfY3JlZChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAoJCQkJCSAgICAgIGNoYXIgKmNtZCkKewoJaW50IGlkOwoJc3RydWN0IHdwYV9jcmVkICpjcmVkOwoJY2hhciAqbmFtZSwgKnZhbHVlOwoKCS8qIGNtZDogIjxjcmVkIGlkPiA8dmFyaWFibGUgbmFtZT4gPHZhbHVlPiIgKi8KCW5hbWUgPSBvc19zdHJjaHIoY21kLCAnICcpOwoJaWYgKG5hbWUgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CgkqbmFtZSsrID0gJ1wwJzsKCgl2YWx1ZSA9IG9zX3N0cmNocihuYW1lLCAnICcpOwoJaWYgKHZhbHVlID09IE5VTEwpCgkJcmV0dXJuIC0xOwoJKnZhbHVlKysgPSAnXDAnOwoKCWlkID0gYXRvaShjbWQpOwoJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDVFJMX0lGQUNFOiBTRVRfQ1JFRCBpZD0lZCBuYW1lPSclcyciLAoJCSAgIGlkLCBuYW1lKTsKCXdwYV9oZXhkdW1wX2FzY2lpX2tleShNU0dfREVCVUcsICJDVFJMX0lGQUNFOiB2YWx1ZSIsCgkJCSAgICAgICh1OCAqKSB2YWx1ZSwgb3Nfc3RybGVuKHZhbHVlKSk7CgoJY3JlZCA9IHdwYV9jb25maWdfZ2V0X2NyZWQod3BhX3MtPmNvbmYsIGlkKTsKCWlmIChjcmVkID09IE5VTEwpIHsKCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0U6IENvdWxkIG5vdCBmaW5kIGNyZWQgaWQ9JWQiLAoJCQkgICBpZCk7CgkJcmV0dXJuIC0xOwoJfQoKCWlmICh3cGFfY29uZmlnX3NldF9jcmVkKGNyZWQsIG5hbWUsIHZhbHVlLCAwKSA8IDApIHsKCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0U6IEZhaWxlZCB0byBzZXQgY3JlZCAiCgkJCSAgICJ2YXJpYWJsZSAnJXMnIiwgbmFtZSk7CgkJcmV0dXJuIC0xOwoJfQoKCXJldHVybiAwOwp9CgoKI2lmbmRlZiBDT05GSUdfTk9fQ09ORklHX1dSSVRFCnN0YXRpYyBpbnQgd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV9zYXZlX2NvbmZpZyhzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zKQp7CglpbnQgcmV0OwoKCWlmICghd3BhX3MtPmNvbmYtPnVwZGF0ZV9jb25maWcpIHsKCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0U6IFNBVkVfQ09ORklHIC0gTm90IGFsbG93ZWQgIgoJCQkgICAidG8gdXBkYXRlIGNvbmZpZ3VyYXRpb24gKHVwZGF0ZV9jb25maWc9MCkiKTsKCQlyZXR1cm4gLTE7Cgl9CgoJcmV0ID0gd3BhX2NvbmZpZ193cml0ZSh3cGFfcy0+Y29uZm5hbWUsIHdwYV9zLT5jb25mKTsKCWlmIChyZXQpIHsKCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0U6IFNBVkVfQ09ORklHIC0gRmFpbGVkIHRvICIKCQkJICAgInVwZGF0ZSBjb25maWd1cmF0aW9uIik7Cgl9IGVsc2UgewoJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRTogU0FWRV9DT05GSUcgLSBDb25maWd1cmF0aW9uIgoJCQkgICAiIHVwZGF0ZWQiKTsKCX0KCglyZXR1cm4gcmV0Owp9CiNlbmRpZiAvKiBDT05GSUdfTk9fQ09ORklHX1dSSVRFICovCgoKc3RhdGljIGludCBjdHJsX2lmYWNlX2dldF9jYXBhYmlsaXR5X3BhaXJ3aXNlKGludCByZXMsIGNoYXIgKnN0cmljdCwKCQkJCQkgICAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl9jYXBhICpjYXBhLAoJCQkJCSAgICAgIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbikKewoJaW50IHJldCwgZmlyc3QgPSAxOwoJY2hhciAqcG9zLCAqZW5kOwoJc2l6ZV90IGxlbjsKCglwb3MgPSBidWY7CgllbmQgPSBwb3MgKyBidWZsZW47CgoJaWYgKHJlcyA8IDApIHsKCQlpZiAoc3RyaWN0KQoJCQlyZXR1cm4gMDsKCQlsZW4gPSBvc19zdHJsY3B5KGJ1ZiwgIkNDTVAgVEtJUCBOT05FIiwgYnVmbGVuKTsKCQlpZiAobGVuID49IGJ1ZmxlbikKCQkJcmV0dXJuIC0xOwoJCXJldHVybiBsZW47Cgl9CgoJaWYgKGNhcGEtPmVuYyAmIFdQQV9EUklWRVJfQ0FQQV9FTkNfQ0NNUCkgewoJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiJXNDQ01QIiwgZmlyc3QgPyAiIiA6ICIgIik7CgkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKCQlwb3MgKz0gcmV0OwoJCWZpcnN0ID0gMDsKCX0KCglpZiAoY2FwYS0+ZW5jICYgV1BBX0RSSVZFUl9DQVBBX0VOQ19HQ01QKSB7CgkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICIlc0dDTVAiLCBmaXJzdCA/ICIiIDogIiAiKTsKCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCQlyZXR1cm4gcG9zIC0gYnVmOwoJCXBvcyArPSByZXQ7CgkJZmlyc3QgPSAwOwoJfQoKCWlmIChjYXBhLT5lbmMgJiBXUEFfRFJJVkVSX0NBUEFfRU5DX1RLSVApIHsKCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIiVzVEtJUCIsIGZpcnN0ID8gIiIgOiAiICIpOwoJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCgkJCXJldHVybiBwb3MgLSBidWY7CgkJcG9zICs9IHJldDsKCQlmaXJzdCA9IDA7Cgl9CgoJaWYgKGNhcGEtPmtleV9tZ210ICYgV1BBX0RSSVZFUl9DQVBBX0tFWV9NR01UX1dQQV9OT05FKSB7CgkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICIlc05PTkUiLCBmaXJzdCA/ICIiIDogIiAiKTsKCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCQlyZXR1cm4gcG9zIC0gYnVmOwoJCXBvcyArPSByZXQ7CgkJZmlyc3QgPSAwOwoJfQoKCXJldHVybiBwb3MgLSBidWY7Cn0KCgpzdGF0aWMgaW50IGN0cmxfaWZhY2VfZ2V0X2NhcGFiaWxpdHlfZ3JvdXAoaW50IHJlcywgY2hhciAqc3RyaWN0LAoJCQkJCSAgIHN0cnVjdCB3cGFfZHJpdmVyX2NhcGEgKmNhcGEsCgkJCQkJICAgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQp7CglpbnQgcmV0LCBmaXJzdCA9IDE7CgljaGFyICpwb3MsICplbmQ7CglzaXplX3QgbGVuOwoKCXBvcyA9IGJ1ZjsKCWVuZCA9IHBvcyArIGJ1ZmxlbjsKCglpZiAocmVzIDwgMCkgewoJCWlmIChzdHJpY3QpCgkJCXJldHVybiAwOwoJCWxlbiA9IG9zX3N0cmxjcHkoYnVmLCAiQ0NNUCBUS0lQIFdFUDEwNCBXRVA0MCIsIGJ1Zmxlbik7CgkJaWYgKGxlbiA+PSBidWZsZW4pCgkJCXJldHVybiAtMTsKCQlyZXR1cm4gbGVuOwoJfQoKCWlmIChjYXBhLT5lbmMgJiBXUEFfRFJJVkVSX0NBUEFfRU5DX0NDTVApIHsKCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIiVzQ0NNUCIsIGZpcnN0ID8gIiIgOiAiICIpOwoJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCgkJCXJldHVybiBwb3MgLSBidWY7CgkJcG9zICs9IHJldDsKCQlmaXJzdCA9IDA7Cgl9CgoJaWYgKGNhcGEtPmVuYyAmIFdQQV9EUklWRVJfQ0FQQV9FTkNfR0NNUCkgewoJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiJXNHQ01QIiwgZmlyc3QgPyAiIiA6ICIgIik7CgkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKCQlwb3MgKz0gcmV0OwoJCWZpcnN0ID0gMDsKCX0KCglpZiAoY2FwYS0+ZW5jICYgV1BBX0RSSVZFUl9DQVBBX0VOQ19US0lQKSB7CgkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICIlc1RLSVAiLCBmaXJzdCA/ICIiIDogIiAiKTsKCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCQlyZXR1cm4gcG9zIC0gYnVmOwoJCXBvcyArPSByZXQ7CgkJZmlyc3QgPSAwOwoJfQoKCWlmIChjYXBhLT5lbmMgJiBXUEFfRFJJVkVSX0NBUEFfRU5DX1dFUDEwNCkgewoJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiJXNXRVAxMDQiLAoJCQkJICBmaXJzdCA/ICIiIDogIiAiKTsKCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCQlyZXR1cm4gcG9zIC0gYnVmOwoJCXBvcyArPSByZXQ7CgkJZmlyc3QgPSAwOwoJfQoKCWlmIChjYXBhLT5lbmMgJiBXUEFfRFJJVkVSX0NBUEFfRU5DX1dFUDQwKSB7CgkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICIlc1dFUDQwIiwgZmlyc3QgPyAiIiA6ICIgIik7CgkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKCQlwb3MgKz0gcmV0OwoJCWZpcnN0ID0gMDsKCX0KCglyZXR1cm4gcG9zIC0gYnVmOwp9CgoKc3RhdGljIGludCBjdHJsX2lmYWNlX2dldF9jYXBhYmlsaXR5X2tleV9tZ210KGludCByZXMsIGNoYXIgKnN0cmljdCwKCQkJCQkgICAgICBzdHJ1Y3Qgd3BhX2RyaXZlcl9jYXBhICpjYXBhLAoJCQkJCSAgICAgIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbikKewoJaW50IHJldDsKCWNoYXIgKnBvcywgKmVuZDsKCXNpemVfdCBsZW47CgoJcG9zID0gYnVmOwoJZW5kID0gcG9zICsgYnVmbGVuOwoKCWlmIChyZXMgPCAwKSB7CgkJaWYgKHN0cmljdCkKCQkJcmV0dXJuIDA7CgkJbGVuID0gb3Nfc3RybGNweShidWYsICJXUEEtUFNLIFdQQS1FQVAgSUVFRTgwMjFYIFdQQS1OT05FICIKCQkJCSAiTk9ORSIsIGJ1Zmxlbik7CgkJaWYgKGxlbiA+PSBidWZsZW4pCgkJCXJldHVybiAtMTsKCQlyZXR1cm4gbGVuOwoJfQoKCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiTk9ORSBJRUVFODAyMVgiKTsKCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCgkJcmV0dXJuIHBvcyAtIGJ1ZjsKCXBvcyArPSByZXQ7CgoJaWYgKGNhcGEtPmtleV9tZ210ICYgKFdQQV9EUklWRVJfQ0FQQV9LRVlfTUdNVF9XUEEgfAoJCQkgICAgICBXUEFfRFJJVkVSX0NBUEFfS0VZX01HTVRfV1BBMikpIHsKCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIiBXUEEtRUFQIik7CgkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKCQlwb3MgKz0gcmV0OwoJfQoKCWlmIChjYXBhLT5rZXlfbWdtdCAmIChXUEFfRFJJVkVSX0NBUEFfS0VZX01HTVRfV1BBX1BTSyB8CgkJCSAgICAgIFdQQV9EUklWRVJfQ0FQQV9LRVlfTUdNVF9XUEEyX1BTSykpIHsKCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIiBXUEEtUFNLIik7CgkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKCQlwb3MgKz0gcmV0OwoJfQoKCWlmIChjYXBhLT5rZXlfbWdtdCAmIFdQQV9EUklWRVJfQ0FQQV9LRVlfTUdNVF9XUEFfTk9ORSkgewoJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiIFdQQS1OT05FIik7CgkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKCQlwb3MgKz0gcmV0OwoJfQoKCXJldHVybiBwb3MgLSBidWY7Cn0KCgpzdGF0aWMgaW50IGN0cmxfaWZhY2VfZ2V0X2NhcGFiaWxpdHlfcHJvdG8oaW50IHJlcywgY2hhciAqc3RyaWN0LAoJCQkJCSAgIHN0cnVjdCB3cGFfZHJpdmVyX2NhcGEgKmNhcGEsCgkJCQkJICAgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQp7CglpbnQgcmV0LCBmaXJzdCA9IDE7CgljaGFyICpwb3MsICplbmQ7CglzaXplX3QgbGVuOwoKCXBvcyA9IGJ1ZjsKCWVuZCA9IHBvcyArIGJ1ZmxlbjsKCglpZiAocmVzIDwgMCkgewoJCWlmIChzdHJpY3QpCgkJCXJldHVybiAwOwoJCWxlbiA9IG9zX3N0cmxjcHkoYnVmLCAiUlNOIFdQQSIsIGJ1Zmxlbik7CgkJaWYgKGxlbiA+PSBidWZsZW4pCgkJCXJldHVybiAtMTsKCQlyZXR1cm4gbGVuOwoJfQoKCWlmIChjYXBhLT5rZXlfbWdtdCAmIChXUEFfRFJJVkVSX0NBUEFfS0VZX01HTVRfV1BBMiB8CgkJCSAgICAgIFdQQV9EUklWRVJfQ0FQQV9LRVlfTUdNVF9XUEEyX1BTSykpIHsKCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIiVzUlNOIiwgZmlyc3QgPyAiIiA6ICIgIik7CgkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKCQlwb3MgKz0gcmV0OwoJCWZpcnN0ID0gMDsKCX0KCglpZiAoY2FwYS0+a2V5X21nbXQgJiAoV1BBX0RSSVZFUl9DQVBBX0tFWV9NR01UX1dQQSB8CgkJCSAgICAgIFdQQV9EUklWRVJfQ0FQQV9LRVlfTUdNVF9XUEFfUFNLKSkgewoJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiJXNXUEEiLCBmaXJzdCA/ICIiIDogIiAiKTsKCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCQlyZXR1cm4gcG9zIC0gYnVmOwoJCXBvcyArPSByZXQ7CgkJZmlyc3QgPSAwOwoJfQoKCXJldHVybiBwb3MgLSBidWY7Cn0KCgpzdGF0aWMgaW50IGN0cmxfaWZhY2VfZ2V0X2NhcGFiaWxpdHlfYXV0aF9hbGcoaW50IHJlcywgY2hhciAqc3RyaWN0LAoJCQkJCSAgICAgIHN0cnVjdCB3cGFfZHJpdmVyX2NhcGEgKmNhcGEsCgkJCQkJICAgICAgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQp7CglpbnQgcmV0LCBmaXJzdCA9IDE7CgljaGFyICpwb3MsICplbmQ7CglzaXplX3QgbGVuOwoKCXBvcyA9IGJ1ZjsKCWVuZCA9IHBvcyArIGJ1ZmxlbjsKCglpZiAocmVzIDwgMCkgewoJCWlmIChzdHJpY3QpCgkJCXJldHVybiAwOwoJCWxlbiA9IG9zX3N0cmxjcHkoYnVmLCAiT1BFTiBTSEFSRUQgTEVBUCIsIGJ1Zmxlbik7CgkJaWYgKGxlbiA+PSBidWZsZW4pCgkJCXJldHVybiAtMTsKCQlyZXR1cm4gbGVuOwoJfQoKCWlmIChjYXBhLT5hdXRoICYgKFdQQV9EUklWRVJfQVVUSF9PUEVOKSkgewoJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiJXNPUEVOIiwgZmlyc3QgPyAiIiA6ICIgIik7CgkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKCQlwb3MgKz0gcmV0OwoJCWZpcnN0ID0gMDsKCX0KCglpZiAoY2FwYS0+YXV0aCAmIChXUEFfRFJJVkVSX0FVVEhfU0hBUkVEKSkgewoJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiJXNTSEFSRUQiLAoJCQkJICBmaXJzdCA/ICIiIDogIiAiKTsKCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCQlyZXR1cm4gcG9zIC0gYnVmOwoJCXBvcyArPSByZXQ7CgkJZmlyc3QgPSAwOwoJfQoKCWlmIChjYXBhLT5hdXRoICYgKFdQQV9EUklWRVJfQVVUSF9MRUFQKSkgewoJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiJXNMRUFQIiwgZmlyc3QgPyAiIiA6ICIgIik7CgkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKCQlwb3MgKz0gcmV0OwoJCWZpcnN0ID0gMDsKCX0KCglyZXR1cm4gcG9zIC0gYnVmOwp9CgoKc3RhdGljIGludCBjdHJsX2lmYWNlX2dldF9jYXBhYmlsaXR5X21vZGVzKGludCByZXMsIGNoYXIgKnN0cmljdCwKCQkJCQkgICBzdHJ1Y3Qgd3BhX2RyaXZlcl9jYXBhICpjYXBhLAoJCQkJCSAgIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbikKewoJaW50IHJldCwgZmlyc3QgPSAxOwoJY2hhciAqcG9zLCAqZW5kOwoJc2l6ZV90IGxlbjsKCglwb3MgPSBidWY7CgllbmQgPSBwb3MgKyBidWZsZW47CgoJaWYgKHJlcyA8IDApIHsKCQlpZiAoc3RyaWN0KQoJCQlyZXR1cm4gMDsKCQlsZW4gPSBvc19zdHJsY3B5KGJ1ZiwgIklCU1MgQVAiLCBidWZsZW4pOwoJCWlmIChsZW4gPj0gYnVmbGVuKQoJCQlyZXR1cm4gLTE7CgkJcmV0dXJuIGxlbjsKCX0KCglpZiAoY2FwYS0+ZmxhZ3MgJiBXUEFfRFJJVkVSX0ZMQUdTX0lCU1MpIHsKCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIiVzSUJTUyIsIGZpcnN0ID8gIiIgOiAiICIpOwoJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCgkJCXJldHVybiBwb3MgLSBidWY7CgkJcG9zICs9IHJldDsKCQlmaXJzdCA9IDA7Cgl9CgoJaWYgKGNhcGEtPmZsYWdzICYgV1BBX0RSSVZFUl9GTEFHU19BUCkgewoJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiJXNBUCIsIGZpcnN0ID8gIiIgOiAiICIpOwoJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCgkJCXJldHVybiBwb3MgLSBidWY7CgkJcG9zICs9IHJldDsKCQlmaXJzdCA9IDA7Cgl9CgoJcmV0dXJuIHBvcyAtIGJ1ZjsKfQoKCnN0YXRpYyBpbnQgY3RybF9pZmFjZV9nZXRfY2FwYWJpbGl0eV9jaGFubmVscyhzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAoJCQkJCSAgICAgIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbikKewoJc3RydWN0IGhvc3RhcGRfY2hhbm5lbF9kYXRhICpjaG5sOwoJaW50IHJldCwgaSwgajsKCWNoYXIgKnBvcywgKmVuZCwgKmhtb2RlOwoKCXBvcyA9IGJ1ZjsKCWVuZCA9IHBvcyArIGJ1ZmxlbjsKCglmb3IgKGogPSAwOyBqIDwgd3BhX3MtPmh3Lm51bV9tb2RlczsgaisrKSB7CgkJc3dpdGNoICh3cGFfcy0+aHcubW9kZXNbal0ubW9kZSkgewoJCWNhc2UgSE9TVEFQRF9NT0RFX0lFRUU4MDIxMUI6CgkJCWhtb2RlID0gIkIiOwoJCQlicmVhazsKCQljYXNlIEhPU1RBUERfTU9ERV9JRUVFODAyMTFHOgoJCQlobW9kZSA9ICJHIjsKCQkJYnJlYWs7CgkJY2FzZSBIT1NUQVBEX01PREVfSUVFRTgwMjExQToKCQkJaG1vZGUgPSAiQSI7CgkJCWJyZWFrOwoJCWNhc2UgSE9TVEFQRF9NT0RFX0lFRUU4MDIxMUFEOgoJCQlobW9kZSA9ICJBRCI7CgkJCWJyZWFrOwoJCWRlZmF1bHQ6CgkJCWNvbnRpbnVlOwoJCX0KCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIk1vZGVbJXNdIENoYW5uZWxzOiIsIGhtb2RlKTsKCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCQlyZXR1cm4gcG9zIC0gYnVmOwoJCXBvcyArPSByZXQ7CgkJY2hubCA9IHdwYV9zLT5ody5tb2Rlc1tqXS5jaGFubmVsczsKCQlmb3IgKGkgPSAwOyBpIDwgd3BhX3MtPmh3Lm1vZGVzW2pdLm51bV9jaGFubmVsczsgaSsrKSB7CgkJCWlmIChjaG5sW2ldLmZsYWcgJiBIT1NUQVBEX0NIQU5fRElTQUJMRUQpCgkJCQljb250aW51ZTsKCQkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICIgJWQiLCBjaG5sW2ldLmNoYW4pOwoJCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKCQkJcG9zICs9IHJldDsKCQl9CgkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJcbiIpOwoJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCgkJCXJldHVybiBwb3MgLSBidWY7CgkJcG9zICs9IHJldDsKCX0KCglyZXR1cm4gcG9zIC0gYnVmOwp9CgoKc3RhdGljIGludCB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX2dldF9jYXBhYmlsaXR5KAoJc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY29uc3QgY2hhciAqX2ZpZWxkLCBjaGFyICpidWYsCglzaXplX3QgYnVmbGVuKQp7CglzdHJ1Y3Qgd3BhX2RyaXZlcl9jYXBhIGNhcGE7CglpbnQgcmVzOwoJY2hhciAqc3RyaWN0OwoJY2hhciBmaWVsZFszMF07CglzaXplX3QgbGVuOwoKCS8qIERldGVybWluZSB3aGV0aGVyIG9yIG5vdCBzdHJpY3QgY2hlY2tpbmcgd2FzIHJlcXVlc3RlZCAqLwoJbGVuID0gb3Nfc3RybGNweShmaWVsZCwgX2ZpZWxkLCBzaXplb2YoZmllbGQpKTsKCWlmIChsZW4gPj0gc2l6ZW9mKGZpZWxkKSkKCQlyZXR1cm4gLTE7CglzdHJpY3QgPSBvc19zdHJjaHIoZmllbGQsICcgJyk7CglpZiAoc3RyaWN0ICE9IE5VTEwpIHsKCQkqc3RyaWN0KysgPSAnXDAnOwoJCWlmIChvc19zdHJjbXAoc3RyaWN0LCAic3RyaWN0IikgIT0gMCkKCQkJcmV0dXJuIC0xOwoJfQoKCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRTogR0VUX0NBUEFCSUxJVFkgJyVzJyAlcyIsCgkJZmllbGQsIHN0cmljdCA/IHN0cmljdCA6ICIiKTsKCglpZiAob3Nfc3RyY21wKGZpZWxkLCAiZWFwIikgPT0gMCkgewoJCXJldHVybiBlYXBfZ2V0X25hbWVzKGJ1ZiwgYnVmbGVuKTsKCX0KCglyZXMgPSB3cGFfZHJ2X2dldF9jYXBhKHdwYV9zLCAmY2FwYSk7CgoJaWYgKG9zX3N0cmNtcChmaWVsZCwgInBhaXJ3aXNlIikgPT0gMCkKCQlyZXR1cm4gY3RybF9pZmFjZV9nZXRfY2FwYWJpbGl0eV9wYWlyd2lzZShyZXMsIHN0cmljdCwgJmNhcGEsCgkJCQkJCQkgIGJ1ZiwgYnVmbGVuKTsKCglpZiAob3Nfc3RyY21wKGZpZWxkLCAiZ3JvdXAiKSA9PSAwKQoJCXJldHVybiBjdHJsX2lmYWNlX2dldF9jYXBhYmlsaXR5X2dyb3VwKHJlcywgc3RyaWN0LCAmY2FwYSwKCQkJCQkJICAgICAgIGJ1ZiwgYnVmbGVuKTsKCglpZiAob3Nfc3RyY21wKGZpZWxkLCAia2V5X21nbXQiKSA9PSAwKQoJCXJldHVybiBjdHJsX2lmYWNlX2dldF9jYXBhYmlsaXR5X2tleV9tZ210KHJlcywgc3RyaWN0LCAmY2FwYSwKCQkJCQkJCSAgYnVmLCBidWZsZW4pOwoKCWlmIChvc19zdHJjbXAoZmllbGQsICJwcm90byIpID09IDApCgkJcmV0dXJuIGN0cmxfaWZhY2VfZ2V0X2NhcGFiaWxpdHlfcHJvdG8ocmVzLCBzdHJpY3QsICZjYXBhLAoJCQkJCQkgICAgICAgYnVmLCBidWZsZW4pOwoKCWlmIChvc19zdHJjbXAoZmllbGQsICJhdXRoX2FsZyIpID09IDApCgkJcmV0dXJuIGN0cmxfaWZhY2VfZ2V0X2NhcGFiaWxpdHlfYXV0aF9hbGcocmVzLCBzdHJpY3QsICZjYXBhLAoJCQkJCQkJICBidWYsIGJ1Zmxlbik7CgoJaWYgKG9zX3N0cmNtcChmaWVsZCwgIm1vZGVzIikgPT0gMCkKCQlyZXR1cm4gY3RybF9pZmFjZV9nZXRfY2FwYWJpbGl0eV9tb2RlcyhyZXMsIHN0cmljdCwgJmNhcGEsCgkJCQkJCSAgICAgICBidWYsIGJ1Zmxlbik7CgoJaWYgKG9zX3N0cmNtcChmaWVsZCwgImNoYW5uZWxzIikgPT0gMCkKCQlyZXR1cm4gY3RybF9pZmFjZV9nZXRfY2FwYWJpbGl0eV9jaGFubmVscyh3cGFfcywgYnVmLCBidWZsZW4pOwoKCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRTogVW5rbm93biBHRVRfQ0FQQUJJTElUWSBmaWVsZCAnJXMnIiwKCQkgICBmaWVsZCk7CgoJcmV0dXJuIC0xOwp9CgoKI2lmZGVmIENPTkZJR19JTlRFUldPUktJTkcKc3RhdGljIGNoYXIgKiBhbnFwX2FkZF9oZXgoY2hhciAqcG9zLCBjaGFyICplbmQsIGNvbnN0IGNoYXIgKnRpdGxlLAoJCQkgICBzdHJ1Y3Qgd3BhYnVmICpkYXRhKQp7CgljaGFyICpzdGFydCA9IHBvczsKCXNpemVfdCBpOwoJaW50IHJldDsKCWNvbnN0IHU4ICpkOwoKCWlmIChkYXRhID09IE5VTEwpCgkJcmV0dXJuIHN0YXJ0OwoKCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiJXM9IiwgdGl0bGUpOwoJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQlyZXR1cm4gc3RhcnQ7Cglwb3MgKz0gcmV0OwoKCWQgPSB3cGFidWZfaGVhZF91OChkYXRhKTsKCWZvciAoaSA9IDA7IGkgPCB3cGFidWZfbGVuKGRhdGEpOyBpKyspIHsKCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIiUwMngiLCAqZCsrKTsKCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCQlyZXR1cm4gc3RhcnQ7CgkJcG9zICs9IHJldDsKCX0KCglyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIlxuIik7CglpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCXJldHVybiBzdGFydDsKCXBvcyArPSByZXQ7CgoJcmV0dXJuIHBvczsKfQojZW5kaWYgLyogQ09ORklHX0lOVEVSV09SS0lORyAqLwoKCnN0YXRpYyBpbnQgcHJpbnRfYnNzX2luZm8oc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgc3RydWN0IHdwYV9ic3MgKmJzcywKCQkJICB1bnNpZ25lZCBsb25nIG1hc2ssIGNoYXIgKmJ1Ziwgc2l6ZV90IGJ1ZmxlbikKewoJc2l6ZV90IGk7CglpbnQgcmV0OwoJY2hhciAqcG9zLCAqZW5kOwoJY29uc3QgdTggKmllLCAqaWUyOwoKCXBvcyA9IGJ1ZjsKCWVuZCA9IGJ1ZiArIGJ1ZmxlbjsKCglpZiAobWFzayAmIFdQQV9CU1NfTUFTS19JRCkgewoJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiaWQ9JXVcbiIsIGJzcy0+aWQpOwoJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCgkJCXJldHVybiAwOwoJCXBvcyArPSByZXQ7Cgl9CgoJaWYgKG1hc2sgJiBXUEFfQlNTX01BU0tfQlNTSUQpIHsKCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgImJzc2lkPSIgTUFDU1RSICJcbiIsCgkJCQkgIE1BQzJTVFIoYnNzLT5ic3NpZCkpOwoJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCgkJCXJldHVybiAwOwoJCXBvcyArPSByZXQ7Cgl9CgoJaWYgKG1hc2sgJiBXUEFfQlNTX01BU0tfRlJFUSkgewoJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiZnJlcT0lZFxuIiwgYnNzLT5mcmVxKTsKCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCQlyZXR1cm4gMDsKCQlwb3MgKz0gcmV0OwoJfQoKCWlmIChtYXNrICYgV1BBX0JTU19NQVNLX0JFQUNPTl9JTlQpIHsKCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgImJlYWNvbl9pbnQ9JWRcbiIsCgkJCQkgIGJzcy0+YmVhY29uX2ludCk7CgkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJcmV0dXJuIDA7CgkJcG9zICs9IHJldDsKCX0KCglpZiAobWFzayAmIFdQQV9CU1NfTUFTS19DQVBBQklMSVRJRVMpIHsKCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgImNhcGFiaWxpdGllcz0weCUwNHhcbiIsCgkJCQkgIGJzcy0+Y2Fwcyk7CgkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJcmV0dXJuIDA7CgkJcG9zICs9IHJldDsKCX0KCglpZiAobWFzayAmIFdQQV9CU1NfTUFTS19RVUFMKSB7CgkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJxdWFsPSVkXG4iLCBic3MtPnF1YWwpOwoJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCgkJCXJldHVybiAwOwoJCXBvcyArPSByZXQ7Cgl9CgoJaWYgKG1hc2sgJiBXUEFfQlNTX01BU0tfTk9JU0UpIHsKCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIm5vaXNlPSVkXG4iLCBic3MtPm5vaXNlKTsKCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCQlyZXR1cm4gMDsKCQlwb3MgKz0gcmV0OwoJfQoKCWlmIChtYXNrICYgV1BBX0JTU19NQVNLX0xFVkVMKSB7CgkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJsZXZlbD0lZFxuIiwgYnNzLT5sZXZlbCk7CgkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJcmV0dXJuIDA7CgkJcG9zICs9IHJldDsKCX0KCglpZiAobWFzayAmIFdQQV9CU1NfTUFTS19UU0YpIHsKCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgInRzZj0lMDE2bGx1XG4iLAoJCQkJICAodW5zaWduZWQgbG9uZyBsb25nKSBic3MtPnRzZik7CgkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJcmV0dXJuIDA7CgkJcG9zICs9IHJldDsKCX0KCglpZiAobWFzayAmIFdQQV9CU1NfTUFTS19BR0UpIHsKCQlzdHJ1Y3Qgb3NfdGltZSBub3c7CgoJCW9zX2dldF90aW1lKCZub3cpOwoJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiYWdlPSVkXG4iLAoJCQkJICAoaW50KSAobm93LnNlYyAtIGJzcy0+bGFzdF91cGRhdGUuc2VjKSk7CgkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJcmV0dXJuIDA7CgkJcG9zICs9IHJldDsKCX0KCglpZiAobWFzayAmIFdQQV9CU1NfTUFTS19JRSkgewoJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiaWU9Iik7CgkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJcmV0dXJuIDA7CgkJcG9zICs9IHJldDsKCgkJaWUgPSAoY29uc3QgdTggKikgKGJzcyArIDEpOwoJCWZvciAoaSA9IDA7IGkgPCBic3MtPmllX2xlbjsgaSsrKSB7CgkJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiJTAyeCIsICppZSsrKTsKCQkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJCXJldHVybiAwOwoJCQlwb3MgKz0gcmV0OwoJCX0KCgkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJcbiIpOwoJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCgkJCXJldHVybiAwOwoJCXBvcyArPSByZXQ7Cgl9CgoJaWYgKG1hc2sgJiBXUEFfQlNTX01BU0tfRkxBR1MpIHsKCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgImZsYWdzPSIpOwoJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCgkJCXJldHVybiAwOwoJCXBvcyArPSByZXQ7CgoJCWllID0gd3BhX2Jzc19nZXRfdmVuZG9yX2llKGJzcywgV1BBX0lFX1ZFTkRPUl9UWVBFKTsKCQlpZiAoaWUpCgkJCXBvcyA9IHdwYV9zdXBwbGljYW50X2llX3R4dChwb3MsIGVuZCwgIldQQSIsIGllLAoJCQkJCQkgICAgMiArIGllWzFdKTsKCQlpZTIgPSB3cGFfYnNzX2dldF9pZShic3MsIFdMQU5fRUlEX1JTTik7CgkJaWYgKGllMikKCQkJcG9zID0gd3BhX3N1cHBsaWNhbnRfaWVfdHh0KHBvcywgZW5kLCAiV1BBMiIsIGllMiwKCQkJCQkJICAgIDIgKyBpZTJbMV0pOwoJCXBvcyA9IHdwYV9zdXBwbGljYW50X3dwc19pZV90eHQod3BhX3MsIHBvcywgZW5kLCBic3MpOwoJCWlmICghaWUgJiYgIWllMiAmJiBic3MtPmNhcHMgJiBJRUVFODAyMTFfQ0FQX1BSSVZBQ1kpIHsKCQkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJbV0VQXSIpOwoJCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCQkJcmV0dXJuIDA7CgkJCXBvcyArPSByZXQ7CgkJfQoJCWlmIChic3MtPmNhcHMgJiBJRUVFODAyMTFfQ0FQX0lCU1MpIHsKCQkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJbSUJTU10iKTsKCQkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJCXJldHVybiAwOwoJCQlwb3MgKz0gcmV0OwoJCX0KCQlpZiAoYnNzLT5jYXBzICYgSUVFRTgwMjExX0NBUF9FU1MpIHsKCQkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJbRVNTXSIpOwoJCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCQkJcmV0dXJuIDA7CgkJCXBvcyArPSByZXQ7CgkJfQoJCWlmICh3cGFfYnNzX2dldF92ZW5kb3JfaWUoYnNzLCBQMlBfSUVfVkVORE9SX1RZUEUpKSB7CgkJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiW1AyUF0iKTsKCQkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJCXJldHVybiAwOwoJCQlwb3MgKz0gcmV0OwoJCX0KI2lmZGVmIENPTkZJR19IUzIwCgkJaWYgKHdwYV9ic3NfZ2V0X3ZlbmRvcl9pZShic3MsIEhTMjBfSUVfVkVORE9SX1RZUEUpKSB7CgkJCXJldCA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiW0hTMjBdIik7CgkJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCgkJCQlyZXR1cm4gMDsKCQkJcG9zICs9IHJldDsKCQl9CiNlbmRpZiAvKiBDT05GSUdfSFMyMCAqLwoKCQlyZXQgPSBvc19zbnByaW50Zihwb3MsIGVuZCAtIHBvcywgIlxuIik7CgkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJcmV0dXJuIDA7CgkJcG9zICs9IHJldDsKCX0KCglpZiAobWFzayAmIFdQQV9CU1NfTUFTS19TU0lEKSB7CgkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJzc2lkPSVzXG4iLAoJCQkJICB3cGFfc3NpZF90eHQoYnNzLT5zc2lkLCBic3MtPnNzaWRfbGVuKSk7CgkJaWYgKHJldCA8IDAgfHwgcmV0ID49IGVuZCAtIHBvcykKCQkJcmV0dXJuIDA7CgkJcG9zICs9IHJldDsKCX0KCiNpZmRlZiBDT05GSUdfV1BTCglpZiAobWFzayAmIFdQQV9CU1NfTUFTS19XUFNfU0NBTikgewoJCWllID0gKGNvbnN0IHU4ICopIChic3MgKyAxKTsKCQlyZXQgPSB3cGFzX3dwc19zY2FuX3Jlc3VsdF90ZXh0KGllLCBic3MtPmllX2xlbiwgcG9zLCBlbmQpOwoJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCgkJCXJldHVybiAwOwoJCXBvcyArPSByZXQ7Cgl9CiNlbmRpZiAvKiBDT05GSUdfV1BTICovCgojaWZkZWYgQ09ORklHX1AyUAoJaWYgKG1hc2sgJiBXUEFfQlNTX01BU0tfUDJQX1NDQU4pIHsKCQlpZSA9IChjb25zdCB1OCAqKSAoYnNzICsgMSk7CgkJcmV0ID0gd3Bhc19wMnBfc2Nhbl9yZXN1bHRfdGV4dChpZSwgYnNzLT5pZV9sZW4sIHBvcywgZW5kKTsKCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCQlyZXR1cm4gMDsKCQlwb3MgKz0gcmV0OwoJfQojZW5kaWYgLyogQ09ORklHX1AyUCAqLwoKI2lmZGVmIENPTkZJR19XSUZJX0RJU1BMQVkKCWlmIChtYXNrICYgV1BBX0JTU19NQVNLX1dJRklfRElTUExBWSkgewoJCXN0cnVjdCB3cGFidWYgKndmZDsKCQlpZSA9IChjb25zdCB1OCAqKSAoYnNzICsgMSk7CgkJd2ZkID0gaWVlZTgwMl8xMV92ZW5kb3JfaWVfY29uY2F0KGllLCBic3MtPmllX2xlbiwKCQkJCQkJICBXRkRfSUVfVkVORE9SX1RZUEUpOwoJCWlmICh3ZmQpIHsKCQkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJ3ZmRfc3ViZWxlbXM9Iik7CgkJCWlmIChyZXQgPCAwIHx8IHJldCA+PSBlbmQgLSBwb3MpCgkJCQlyZXR1cm4gMDsKCQkJcG9zICs9IHJldDsKCgkJCXBvcyArPSB3cGFfc25wcmludGZfaGV4KHBvcywgZW5kIC0gcG9zLAoJCQkJCQl3cGFidWZfaGVhZCh3ZmQpLAoJCQkJCQl3cGFidWZfbGVuKHdmZCkpOwoJCQl3cGFidWZfZnJlZSh3ZmQpOwoKCQkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJcbiIpOwoJCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCQkJcmV0dXJuIDA7CgkJCXBvcyArPSByZXQ7CgkJfQoJfQojZW5kaWYgLyogQ09ORklHX1dJRklfRElTUExBWSAqLwoKI2lmZGVmIENPTkZJR19JTlRFUldPUktJTkcKCWlmICgobWFzayAmIFdQQV9CU1NfTUFTS19JTlRFUk5FVFcpICYmIGJzcy0+YW5xcCkgewoJCXN0cnVjdCB3cGFfYnNzX2FucXAgKmFucXAgPSBic3MtPmFucXA7CgkJcG9zID0gYW5xcF9hZGRfaGV4KHBvcywgZW5kLCAiYW5xcF92ZW51ZV9uYW1lIiwKCQkJCSAgIGFucXAtPnZlbnVlX25hbWUpOwoJCXBvcyA9IGFucXBfYWRkX2hleChwb3MsIGVuZCwgImFucXBfbmV0d29ya19hdXRoX3R5cGUiLAoJCQkJICAgYW5xcC0+bmV0d29ya19hdXRoX3R5cGUpOwoJCXBvcyA9IGFucXBfYWRkX2hleChwb3MsIGVuZCwgImFucXBfcm9hbWluZ19jb25zb3J0aXVtIiwKCQkJCSAgIGFucXAtPnJvYW1pbmdfY29uc29ydGl1bSk7CgkJcG9zID0gYW5xcF9hZGRfaGV4KHBvcywgZW5kLCAiYW5xcF9pcF9hZGRyX3R5cGVfYXZhaWxhYmlsaXR5IiwKCQkJCSAgIGFucXAtPmlwX2FkZHJfdHlwZV9hdmFpbGFiaWxpdHkpOwoJCXBvcyA9IGFucXBfYWRkX2hleChwb3MsIGVuZCwgImFucXBfbmFpX3JlYWxtIiwKCQkJCSAgIGFucXAtPm5haV9yZWFsbSk7CgkJcG9zID0gYW5xcF9hZGRfaGV4KHBvcywgZW5kLCAiYW5xcF8zZ3BwIiwgYW5xcC0+YW5xcF8zZ3BwKTsKCQlwb3MgPSBhbnFwX2FkZF9oZXgocG9zLCBlbmQsICJhbnFwX2RvbWFpbl9uYW1lIiwKCQkJCSAgIGFucXAtPmRvbWFpbl9uYW1lKTsKI2lmZGVmIENPTkZJR19IUzIwCgkJcG9zID0gYW5xcF9hZGRfaGV4KHBvcywgZW5kLCAiaHMyMF9vcGVyYXRvcl9mcmllbmRseV9uYW1lIiwKCQkJCSAgIGFucXAtPmhzMjBfb3BlcmF0b3JfZnJpZW5kbHlfbmFtZSk7CgkJcG9zID0gYW5xcF9hZGRfaGV4KHBvcywgZW5kLCAiaHMyMF93YW5fbWV0cmljcyIsCgkJCQkgICBhbnFwLT5oczIwX3dhbl9tZXRyaWNzKTsKCQlwb3MgPSBhbnFwX2FkZF9oZXgocG9zLCBlbmQsICJoczIwX2Nvbm5lY3Rpb25fY2FwYWJpbGl0eSIsCgkJCQkgICBhbnFwLT5oczIwX2Nvbm5lY3Rpb25fY2FwYWJpbGl0eSk7CiNlbmRpZiAvKiBDT05GSUdfSFMyMCAqLwoJfQojZW5kaWYgLyogQ09ORklHX0lOVEVSV09SS0lORyAqLwoKCWlmIChtYXNrICYgV1BBX0JTU19NQVNLX0RFTElNKSB7CgkJcmV0ID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICI9PT09XG4iKTsKCQlpZiAocmV0IDwgMCB8fCByZXQgPj0gZW5kIC0gcG9zKQoJCQlyZXR1cm4gMDsKCQlwb3MgKz0gcmV0OwoJfQoKCXJldHVybiBwb3MgLSBidWY7Cn0KCgpzdGF0aWMgaW50IHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2VfYnNzKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCgkJCQkJIGNvbnN0IGNoYXIgKmNtZCwgY2hhciAqYnVmLAoJCQkJCSBzaXplX3QgYnVmbGVuKQp7Cgl1OCBic3NpZFtFVEhfQUxFTl07CglzaXplX3QgaTsKCXN0cnVjdCB3cGFfYnNzICpic3M7CglzdHJ1Y3Qgd3BhX2JzcyAqYnNzbGFzdCA9IE5VTEw7CglzdHJ1Y3QgZGxfbGlzdCAqbmV4dDsKCWludCByZXQgPSAwOwoJaW50IGxlbjsKCWNoYXIgKmN0bXA7Cgl1bnNpZ25lZCBsb25nIG1hc2sgPSBXUEFfQlNTX01BU0tfQUxMOwoKCWlmIChvc19zdHJuY21wKGNtZCwgIlJBTkdFPSIsIDYpID09IDApIHsKCQlpZiAob3Nfc3RybmNtcChjbWQgKyA2LCAiQUxMIiwgMykgPT0gMCkgewoJCQlic3MgPSBkbF9saXN0X2ZpcnN0KCZ3cGFfcy0+YnNzX2lkLCBzdHJ1Y3Qgd3BhX2JzcywKCQkJCQkgICAgbGlzdF9pZCk7CgkJCWJzc2xhc3QgPSBkbF9saXN0X2xhc3QoJndwYV9zLT5ic3NfaWQsIHN0cnVjdCB3cGFfYnNzLAoJCQkJCSAgICAgICBsaXN0X2lkKTsKCQl9IGVsc2UgeyAvKiBOMS1OMiAqLwoJCQl1bnNpZ25lZCBpbnQgaWQxLCBpZDI7CgoJCQlpZiAoKGN0bXAgPSBvc19zdHJjaHIoY21kICsgNiwgJy0nKSkgPT0gTlVMTCkgewoJCQkJd3BhX3ByaW50ZihNU0dfSU5GTywgIldyb25nIEJTUyByYW5nZSAiCgkJCQkJICAgImZvcm1hdCIpOwoJCQkJcmV0dXJuIDA7CgkJCX0KCgkJCWlmICgqKGNtZCArIDYpID09ICctJykKCQkJCWlkMSA9IDA7CgkJCWVsc2UKCQkJCWlkMSA9IGF0b2koY21kICsgNik7CgkJCWN0bXArKzsKCQkJaWYgKCpjdG1wID49ICcwJyAmJiAqY3RtcCA8PSAnOScpCgkJCQlpZDIgPSBhdG9pKGN0bXApOwoJCQllbHNlCgkJCQlpZDIgPSAodW5zaWduZWQgaW50KSAtMTsKCQkJYnNzID0gd3BhX2Jzc19nZXRfaWRfcmFuZ2Uod3BhX3MsIGlkMSwgaWQyKTsKCQkJaWYgKGlkMiA9PSAodW5zaWduZWQgaW50KSAtMSkKCQkJCWJzc2xhc3QgPSBkbF9saXN0X2xhc3QoJndwYV9zLT5ic3NfaWQsCgkJCQkJCSAgICAgICBzdHJ1Y3Qgd3BhX2JzcywKCQkJCQkJICAgICAgIGxpc3RfaWQpOwoJCQllbHNlIHsKCQkJCWJzc2xhc3QgPSB3cGFfYnNzX2dldF9pZCh3cGFfcywgaWQyKTsKCQkJCWlmIChic3NsYXN0ID09IE5VTEwgJiYgYnNzICYmIGlkMiA+IGlkMSkgewoJCQkJCXN0cnVjdCB3cGFfYnNzICp0bXAgPSBic3M7CgkJCQkJZm9yICg7OykgewoJCQkJCQluZXh0ID0gdG1wLT5saXN0X2lkLm5leHQ7CgkJCQkJCWlmIChuZXh0ID09ICZ3cGFfcy0+YnNzX2lkKQoJCQkJCQkJYnJlYWs7CgkJCQkJCXRtcCA9IGRsX2xpc3RfZW50cnkoCgkJCQkJCQluZXh0LCBzdHJ1Y3Qgd3BhX2JzcywKCQkJCQkJCWxpc3RfaWQpOwoJCQkJCQlpZiAodG1wLT5pZCA+IGlkMikKCQkJCQkJCWJyZWFrOwoJCQkJCQlic3NsYXN0ID0gdG1wOwoJCQkJCX0KCQkJCX0KCQkJfQoJCX0KCX0gZWxzZSBpZiAob3Nfc3RybmNtcChjbWQsICJGSVJTVCIsIDUpID09IDApCgkJYnNzID0gZGxfbGlzdF9maXJzdCgmd3BhX3MtPmJzc19pZCwgc3RydWN0IHdwYV9ic3MsIGxpc3RfaWQpOwoJZWxzZSBpZiAob3Nfc3RybmNtcChjbWQsICJMQVNUIiwgNCkgPT0gMCkKCQlic3MgPSBkbF9saXN0X2xhc3QoJndwYV9zLT5ic3NfaWQsIHN0cnVjdCB3cGFfYnNzLCBsaXN0X2lkKTsKCWVsc2UgaWYgKG9zX3N0cm5jbXAoY21kLCAiSUQtIiwgMykgPT0gMCkgewoJCWkgPSBhdG9pKGNtZCArIDMpOwoJCWJzcyA9IHdwYV9ic3NfZ2V0X2lkKHdwYV9zLCBpKTsKCX0gZWxzZSBpZiAob3Nfc3RybmNtcChjbWQsICJORVhULSIsIDUpID09IDApIHsKCQlpID0gYXRvaShjbWQgKyA1KTsKCQlic3MgPSB3cGFfYnNzX2dldF9pZCh3cGFfcywgaSk7CgkJaWYgKGJzcykgewoJCQluZXh0ID0gYnNzLT5saXN0X2lkLm5leHQ7CgkJCWlmIChuZXh0ID09ICZ3cGFfcy0+YnNzX2lkKQoJCQkJYnNzID0gTlVMTDsKCQkJZWxzZQoJCQkJYnNzID0gZGxfbGlzdF9lbnRyeShuZXh0LCBzdHJ1Y3Qgd3BhX2JzcywKCQkJCQkJICAgIGxpc3RfaWQpOwoJCX0KI2lmZGVmIENPTkZJR19QMlAKCX0gZWxzZSBpZiAob3Nfc3RybmNtcChjbWQsICJwMnBfZGV2X2FkZHI9IiwgMTMpID09IDApIHsKCQlpZiAoaHdhZGRyX2F0b24oY21kICsgMTMsIGJzc2lkKSA9PSAwKQoJCQlic3MgPSB3cGFfYnNzX2dldF9wMnBfZGV2X2FkZHIod3BhX3MsIGJzc2lkKTsKCQllbHNlCgkJCWJzcyA9IE5VTEw7CiNlbmRpZiAvKiBDT05GSUdfUDJQICovCgl9IGVsc2UgaWYgKGh3YWRkcl9hdG9uKGNtZCwgYnNzaWQpID09IDApCgkJYnNzID0gd3BhX2Jzc19nZXRfYnNzaWQod3BhX3MsIGJzc2lkKTsKCWVsc2UgewoJCXN0cnVjdCB3cGFfYnNzICp0bXA7CgkJaSA9IGF0b2koY21kKTsKCQlic3MgPSBOVUxMOwoJCWRsX2xpc3RfZm9yX2VhY2godG1wLCAmd3BhX3MtPmJzc19pZCwgc3RydWN0IHdwYV9ic3MsIGxpc3RfaWQpCgkJewoJCQlpZiAoaS0tID09IDApIHsKCQkJCWJzcyA9IHRtcDsKCQkJCWJyZWFrOwoJCQl9CgkJfQoJfQoKCWlmICgoY3RtcCA9IG9zX3N0cnN0cihjbWQsICJNQVNLPSIpKSAhPSBOVUxMKSB7CgkJbWFzayA9IHN0cnRvdWwoY3RtcCArIDUsIE5VTEwsIDB4MTApOwoJCWlmIChtYXNrID09IDApCgkJCW1hc2sgPSBXUEFfQlNTX01BU0tfQUxMOwoJfQoKCWlmIChic3MgPT0gTlVMTCkKCQlyZXR1cm4gMDsKCglpZiAoYnNzbGFzdCA9PSBOVUxMKQoJCWJzc2xhc3QgPSBic3M7CglkbyB7CgkJbGVuID0gcHJpbnRfYnNzX2luZm8od3BhX3MsIGJzcywgbWFzaywgYnVmLCBidWZsZW4pOwoJCXJldCArPSBsZW47CgkJYnVmICs9IGxlbjsKCQlidWZsZW4gLT0gbGVuOwoJCWlmIChic3MgPT0gYnNzbGFzdCkgewoJCQlpZiAoKG1hc2sgJiBXUEFfQlNTX01BU0tfREVMSU0pICYmIGxlbiAmJgoJCQkgICAgKGJzcyA9PSBkbF9saXN0X2xhc3QoJndwYV9zLT5ic3NfaWQsCgkJCQkJCSBzdHJ1Y3Qgd3BhX2JzcywgbGlzdF9pZCkpKQoJCQkJb3Nfc25wcmludGYoYnVmIC0gNSwgNSwgIiMjIyNcbiIpOwoJCQlicmVhazsKCQl9CgkJbmV4dCA9IGJzcy0+bGlzdF9pZC5uZXh0OwoJCWlmIChuZXh0ID09ICZ3cGFfcy0+YnNzX2lkKQoJCQlicmVhazsKCQlic3MgPSBkbF9saXN0X2VudHJ5KG5leHQsIHN0cnVjdCB3cGFfYnNzLCBsaXN0X2lkKTsKCX0gd2hpbGUgKGJzcyAmJiBsZW4pOwoKCXJldHVybiByZXQ7Cn0KCgpzdGF0aWMgaW50IHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2VfYXBfc2NhbigKCXN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGNoYXIgKmNtZCkKewoJaW50IGFwX3NjYW4gPSBhdG9pKGNtZCk7CglyZXR1cm4gd3BhX3N1cHBsaWNhbnRfc2V0X2FwX3NjYW4od3BhX3MsIGFwX3NjYW4pOwp9CgoKc3RhdGljIGludCB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3NjYW5faW50ZXJ2YWwoCglzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjaGFyICpjbWQpCnsKCWludCBzY2FuX2ludCA9IGF0b2koY21kKTsKCXJldHVybiB3cGFfc3VwcGxpY2FudF9zZXRfc2Nhbl9pbnRlcnZhbCh3cGFfcywgc2Nhbl9pbnQpOwp9CgoKc3RhdGljIGludCB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX2Jzc19leHBpcmVfYWdlKAoJc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY2hhciAqY21kKQp7CglpbnQgZXhwaXJlX2FnZSA9IGF0b2koY21kKTsKCXJldHVybiB3cGFfc3VwcGxpY2FudF9zZXRfYnNzX2V4cGlyYXRpb25fYWdlKHdwYV9zLCBleHBpcmVfYWdlKTsKfQoKCnN0YXRpYyBpbnQgd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV9ic3NfZXhwaXJlX2NvdW50KAoJc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY2hhciAqY21kKQp7CglpbnQgZXhwaXJlX2NvdW50ID0gYXRvaShjbWQpOwoJcmV0dXJuIHdwYV9zdXBwbGljYW50X3NldF9ic3NfZXhwaXJhdGlvbl9jb3VudCh3cGFfcywgZXhwaXJlX2NvdW50KTsKfQoKCnN0YXRpYyBpbnQgd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV9ic3NfZmx1c2goCglzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjaGFyICpjbWQpCnsKCWludCBmbHVzaF9hZ2UgPSBhdG9pKGNtZCk7CgoJaWYgKGZsdXNoX2FnZSA9PSAwKQoJCXdwYV9ic3NfZmx1c2god3BhX3MpOwoJZWxzZQoJCXdwYV9ic3NfZmx1c2hfYnlfYWdlKHdwYV9zLCBmbHVzaF9hZ2UpOwoJcmV0dXJuIDA7Cn0KCgpzdGF0aWMgdm9pZCB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX2Ryb3Bfc2Eoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcykKewoJd3BhX3ByaW50ZihNU0dfREVCVUcsICJEcm9wcGluZyBTQSB3aXRob3V0IGRlYXV0aGVudGljYXRpb24iKTsKCS8qIE1MTUUtREVMRVRFS0VZUy5yZXF1ZXN0ICovCgl3cGFfZHJ2X3NldF9rZXkod3BhX3MsIFdQQV9BTEdfTk9ORSwgTlVMTCwgMCwgMCwgTlVMTCwgMCwgTlVMTCwgMCk7Cgl3cGFfZHJ2X3NldF9rZXkod3BhX3MsIFdQQV9BTEdfTk9ORSwgTlVMTCwgMSwgMCwgTlVMTCwgMCwgTlVMTCwgMCk7Cgl3cGFfZHJ2X3NldF9rZXkod3BhX3MsIFdQQV9BTEdfTk9ORSwgTlVMTCwgMiwgMCwgTlVMTCwgMCwgTlVMTCwgMCk7Cgl3cGFfZHJ2X3NldF9rZXkod3BhX3MsIFdQQV9BTEdfTk9ORSwgTlVMTCwgMywgMCwgTlVMTCwgMCwgTlVMTCwgMCk7CiNpZmRlZiBDT05GSUdfSUVFRTgwMjExVwoJd3BhX2Rydl9zZXRfa2V5KHdwYV9zLCBXUEFfQUxHX05PTkUsIE5VTEwsIDQsIDAsIE5VTEwsIDAsIE5VTEwsIDApOwoJd3BhX2Rydl9zZXRfa2V5KHdwYV9zLCBXUEFfQUxHX05PTkUsIE5VTEwsIDUsIDAsIE5VTEwsIDAsIE5VTEwsIDApOwojZW5kaWYgLyogQ09ORklHX0lFRUU4MDIxMVcgKi8KCgl3cGFfZHJ2X3NldF9rZXkod3BhX3MsIFdQQV9BTEdfTk9ORSwgd3BhX3MtPmJzc2lkLCAwLCAwLCBOVUxMLCAwLCBOVUxMLAoJCQkwKTsKCS8qIE1MTUUtU0VUUFJPVEVDVElPTi5yZXF1ZXN0KE5vbmUpICovCgl3cGFfZHJ2X21sbWVfc2V0cHJvdGVjdGlvbih3cGFfcywgd3BhX3MtPmJzc2lkLAoJCQkJICAgTUxNRV9TRVRQUk9URUNUSU9OX1BST1RFQ1RfVFlQRV9OT05FLAoJCQkJICAgTUxNRV9TRVRQUk9URUNUSU9OX0tFWV9UWVBFX1BBSVJXSVNFKTsKCXdwYV9zbV9kcm9wX3NhKHdwYV9zLT53cGEpOwp9CgoKc3RhdGljIGludCB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3JvYW0oc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKCQkJCQkgIGNoYXIgKmFkZHIpCnsKI2lmZGVmIENPTkZJR19OT19TQ0FOX1BST0NFU1NJTkcKCXJldHVybiAtMTsKI2Vsc2UgLyogQ09ORklHX05PX1NDQU5fUFJPQ0VTU0lORyAqLwoJdTggYnNzaWRbRVRIX0FMRU5dOwoJc3RydWN0IHdwYV9ic3MgKmJzczsKCXN0cnVjdCB3cGFfc3NpZCAqc3NpZCA9IHdwYV9zLT5jdXJyZW50X3NzaWQ7CgoJaWYgKGh3YWRkcl9hdG9uKGFkZHIsIGJzc2lkKSkgewoJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRSBST0FNOiBpbnZhbGlkICIKCQkJICAgImFkZHJlc3MgJyVzJyIsIGFkZHIpOwoJCXJldHVybiAtMTsKCX0KCgl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0UgUk9BTSAiIE1BQ1NUUiwgTUFDMlNUUihic3NpZCkpOwoKCWJzcyA9IHdwYV9ic3NfZ2V0X2Jzc2lkKHdwYV9zLCBic3NpZCk7CglpZiAoIWJzcykgewoJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRSBST0FNOiBUYXJnZXQgQVAgbm90IGZvdW5kICIKCQkJICAgImZyb20gQlNTIHRhYmxlIik7CgkJcmV0dXJuIC0xOwoJfQoKCS8qCgkgKiBUT0RPOiBGaW5kIGJlc3QgbmV0d29yayBjb25maWd1cmF0aW9uIGJsb2NrIGZyb20gY29uZmlndXJhdGlvbiB0bwoJICogYWxsb3cgcm9hbWluZyB0byBvdGhlciBuZXR3b3JrcwoJICovCgoJaWYgKCFzc2lkKSB7CgkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDVFJMX0lGQUNFIFJPQU06IE5vIG5ldHdvcmsgIgoJCQkgICAiY29uZmlndXJhdGlvbiBrbm93biBmb3IgdGhlIHRhcmdldCBBUCIpOwoJCXJldHVybiAtMTsKCX0KCgl3cGFfcy0+cmVhc3NvY2lhdGUgPSAxOwoJd3BhX3N1cHBsaWNhbnRfY29ubmVjdCh3cGFfcywgYnNzLCBzc2lkKTsKCglyZXR1cm4gMDsKI2VuZGlmIC8qIENPTkZJR19OT19TQ0FOX1BST0NFU1NJTkcgKi8KfQoKCiNpZmRlZiBDT05GSUdfUDJQCnN0YXRpYyBpbnQgcDJwX2N0cmxfZmluZChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjaGFyICpjbWQpCnsKCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gYXRvaShjbWQpOwoJZW51bSBwMnBfZGlzY292ZXJ5X3R5cGUgdHlwZSA9IFAyUF9GSU5EX1NUQVJUX1dJVEhfRlVMTDsKCXU4IGRldl9pZFtFVEhfQUxFTl0sICpfZGV2X2lkID0gTlVMTDsKCWNoYXIgKnBvczsKCXVuc2lnbmVkIGludCBzZWFyY2hfZGVsYXk7CgoJaWYgKG9zX3N0cnN0cihjbWQsICJ0eXBlPXNvY2lhbCIpKQoJCXR5cGUgPSBQMlBfRklORF9PTkxZX1NPQ0lBTDsKCWVsc2UgaWYgKG9zX3N0cnN0cihjbWQsICJ0eXBlPXByb2dyZXNzaXZlIikpCgkJdHlwZSA9IFAyUF9GSU5EX1BST0dSRVNTSVZFOwoKCXBvcyA9IG9zX3N0cnN0cihjbWQsICJkZXZfaWQ9Iik7CglpZiAocG9zKSB7CgkJcG9zICs9IDc7CgkJaWYgKGh3YWRkcl9hdG9uKHBvcywgZGV2X2lkKSkKCQkJcmV0dXJuIC0xOwoJCV9kZXZfaWQgPSBkZXZfaWQ7Cgl9CgoJcG9zID0gb3Nfc3Ryc3RyKGNtZCwgImRlbGF5PSIpOwoJaWYgKHBvcykgewoJCXBvcyArPSA2OwoJCXNlYXJjaF9kZWxheSA9IGF0b2kocG9zKTsKCX0gZWxzZQoJCXNlYXJjaF9kZWxheSA9IHdwYXNfcDJwX3NlYXJjaF9kZWxheSh3cGFfcyk7CgoJcmV0dXJuIHdwYXNfcDJwX2ZpbmQod3BhX3MsIHRpbWVvdXQsIHR5cGUsIDAsIE5VTEwsIF9kZXZfaWQsCgkJCSAgICAgc2VhcmNoX2RlbGF5KTsKfQoKCnN0YXRpYyBpbnQgcDJwX2N0cmxfY29ubmVjdChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjaGFyICpjbWQsCgkJCSAgICBjaGFyICpidWYsIHNpemVfdCBidWZsZW4pCnsKCXU4IGFkZHJbRVRIX0FMRU5dOwoJY2hhciAqcG9zLCAqcG9zMjsKCWNoYXIgKnBpbiA9IE5VTEw7CgllbnVtIHAycF93cHNfbWV0aG9kIHdwc19tZXRob2Q7CglpbnQgbmV3X3BpbjsKCWludCByZXQ7CglpbnQgcGVyc2lzdGVudF9ncm91cCwgcGVyc2lzdGVudF9pZCA9IC0xOwoJaW50IGpvaW47CglpbnQgYXV0aDsKCWludCBhdXRvbWF0aWM7CglpbnQgZ29faW50ZW50ID0gLTE7CglpbnQgZnJlcSA9IDA7CglpbnQgcGQ7CglpbnQgaHQ0MDsKCgkvKiA8YWRkcj4gPCJwYmMiIHwgInBpbiIgfCBQSU4+IFtsYWJlbHxkaXNwbGF5fGtleXBhZF0KCSAqIFtwZXJzaXN0ZW50fHBlcnNpc3RlbnQ9PG5ldHdvcmsgaWQ+XQoJICogW2pvaW5dIFthdXRoXSBbZ29faW50ZW50PTwwLi4xNT5dIFtmcmVxPTxpbiBNSHo+XSBbcHJvdmRpc2NdCgkgKiBbaHQ0MF0gKi8KCglpZiAoaHdhZGRyX2F0b24oY21kLCBhZGRyKSkKCQlyZXR1cm4gLTE7CgoJcG9zID0gY21kICsgMTc7CglpZiAoKnBvcyAhPSAnICcpCgkJcmV0dXJuIC0xOwoJcG9zKys7CgoJcGVyc2lzdGVudF9ncm91cCA9IG9zX3N0cnN0cihwb3MsICIgcGVyc2lzdGVudCIpICE9IE5VTEw7Cglwb3MyID0gb3Nfc3Ryc3RyKHBvcywgIiBwZXJzaXN0ZW50PSIpOwoJaWYgKHBvczIpIHsKCQlzdHJ1Y3Qgd3BhX3NzaWQgKnNzaWQ7CgkJcGVyc2lzdGVudF9pZCA9IGF0b2kocG9zMiArIDEyKTsKCQlzc2lkID0gd3BhX2NvbmZpZ19nZXRfbmV0d29yayh3cGFfcy0+Y29uZiwgcGVyc2lzdGVudF9pZCk7CgkJaWYgKHNzaWQgPT0gTlVMTCB8fCBzc2lkLT5kaXNhYmxlZCAhPSAyIHx8CgkJICAgIHNzaWQtPm1vZGUgIT0gV1BBU19NT0RFX1AyUF9HTykgewoJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkxfSUZBQ0U6IENvdWxkIG5vdCBmaW5kICIKCQkJCSAgICJTU0lEIGlkPSVkIGZvciBwZXJzaXN0ZW50IFAyUCBncm91cCAoR08pIiwKCQkJCSAgIHBlcnNpc3RlbnRfaWQpOwoJCQlyZXR1cm4gLTE7CgkJfQoJfQoJam9pbiA9IG9zX3N0cnN0cihwb3MsICIgam9pbiIpICE9IE5VTEw7CglhdXRoID0gb3Nfc3Ryc3RyKHBvcywgIiBhdXRoIikgIT0gTlVMTDsKCWF1dG9tYXRpYyA9IG9zX3N0cnN0cihwb3MsICIgYXV0byIpICE9IE5VTEw7CglwZCA9IG9zX3N0cnN0cihwb3MsICIgcHJvdmRpc2MiKSAhPSBOVUxMOwoJaHQ0MCA9IChvc19zdHJzdHIoY21kLCAiIGh0NDAiKSAhPSBOVUxMKSB8fCB3cGFfcy0+Y29uZi0+cDJwX2dvX2h0NDA7CgoJcG9zMiA9IG9zX3N0cnN0cihwb3MsICIgZ29faW50ZW50PSIpOwoJaWYgKHBvczIpIHsKCQlwb3MyICs9IDExOwoJCWdvX2ludGVudCA9IGF0b2kocG9zMik7CgkJaWYgKGdvX2ludGVudCA8IDAgfHwgZ29faW50ZW50ID4gMTUpCgkJCXJldHVybiAtMTsKCX0KCglwb3MyID0gb3Nfc3Ryc3RyKHBvcywgIiBmcmVxPSIpOwoJaWYgKHBvczIpIHsKCQlwb3MyICs9IDY7CgkJZnJlcSA9IGF0b2kocG9zMik7CgkJaWYgKGZyZXEgPD0gMCkKCQkJcmV0dXJuIC0xOwoJfQoKCWlmIChvc19zdHJuY21wKHBvcywgInBpbiIsIDMpID09IDApIHsKCQkvKiBSZXF1ZXN0IHJhbmRvbSBQSU4gKHRvIGJlIGRpc3BsYXllZCkgYW5kIGVuYWJsZSB0aGUgUElOICovCgkJd3BzX21ldGhvZCA9IFdQU19QSU5fRElTUExBWTsKCX0gZWxzZSBpZiAob3Nfc3RybmNtcChwb3MsICJwYmMiLCAzKSA9PSAwKSB7CgkJd3BzX21ldGhvZCA9IFdQU19QQkM7Cgl9IGVsc2UgewoJCXBpbiA9IHBvczsKCQlwb3MgPSBvc19zdHJjaHIocGluLCAnICcpOwoJCXdwc19tZXRob2QgPSBXUFNfUElOX0tFWVBBRDsKCQlpZiAocG9zKSB7CgkJCSpwb3MrKyA9ICdcMCc7CgkJCWlmIChvc19zdHJuY21wKHBvcywgImRpc3BsYXkiLCA3KSA9PSAwKQoJCQkJd3BzX21ldGhvZCA9IFdQU19QSU5fRElTUExBWTsKCQl9CgkJaWYgKCF3cHNfcGluX3N0cl92YWxpZChwaW4pKSB7CgkJCW9zX21lbWNweShidWYsICJGQUlMLUlOVkFMSUQtUElOXG4iLCAxNyk7CgkJCXJldHVybiAxNzsKCQl9Cgl9CgoJbmV3X3BpbiA9IHdwYXNfcDJwX2Nvbm5lY3Qod3BhX3MsIGFkZHIsIHBpbiwgd3BzX21ldGhvZCwKCQkJCSAgIHBlcnNpc3RlbnRfZ3JvdXAsIGF1dG9tYXRpYywgam9pbiwKCQkJCSAgIGF1dGgsIGdvX2ludGVudCwgZnJlcSwgcGVyc2lzdGVudF9pZCwgcGQsCgkJCQkgICBodDQwKTsKCWlmIChuZXdfcGluID09IC0yKSB7CgkJb3NfbWVtY3B5KGJ1ZiwgIkZBSUwtQ0hBTk5FTC1VTkFWQUlMQUJMRVxuIiwgMjUpOwoJCXJldHVybiAyNTsKCX0KCWlmIChuZXdfcGluID09IC0zKSB7CgkJb3NfbWVtY3B5KGJ1ZiwgIkZBSUwtQ0hBTk5FTC1VTlNVUFBPUlRFRFxuIiwgMjUpOwoJCXJldHVybiAyNTsKCX0KCWlmIChuZXdfcGluIDwgMCkKCQlyZXR1cm4gLTE7CglpZiAod3BzX21ldGhvZCA9PSBXUFNfUElOX0RJU1BMQVkgJiYgcGluID09IE5VTEwpIHsKCQlyZXQgPSBvc19zbnByaW50ZihidWYsIGJ1ZmxlbiwgIiUwOGQiLCBuZXdfcGluKTsKCQlpZiAocmV0IDwgMCB8fCAoc2l6ZV90KSByZXQgPj0gYnVmbGVuKQoJCQlyZXR1cm4gLTE7CgkJcmV0dXJuIHJldDsKCX0KCglvc19tZW1jcHkoYnVmLCAiT0tcbiIsIDMpOwoJcmV0dXJuIDM7Cn0KCgpzdGF0aWMgaW50IHAycF9jdHJsX2xpc3RlbihzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjaGFyICpjbWQpCnsKCXVuc2lnbmVkIGludCB0aW1lb3V0ID0gYXRvaShjbWQpOwoJcmV0dXJuIHdwYXNfcDJwX2xpc3Rlbih3cGFfcywgdGltZW91dCk7Cn0KCgpzdGF0aWMgaW50IHAycF9jdHJsX3Byb3ZfZGlzYyhzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjaGFyICpjbWQpCnsKCXU4IGFkZHJbRVRIX0FMRU5dOwoJY2hhciAqcG9zOwoJZW51bSB3cGFzX3AycF9wcm92X2Rpc2NfdXNlIHVzZSA9IFdQQVNfUDJQX1BEX0ZPUl9HT19ORUc7CgoJLyogPGFkZHI+IDxjb25maWcgbWV0aG9kPiBbam9pbnxhdXRvXSAqLwoKCWlmIChod2FkZHJfYXRvbihjbWQsIGFkZHIpKQoJCXJldHVybiAtMTsKCglwb3MgPSBjbWQgKyAxNzsKCWlmICgqcG9zICE9ICcgJykKCQlyZXR1cm4gLTE7Cglwb3MrKzsKCglpZiAob3Nfc3Ryc3RyKHBvcywgIiBqb2luIikgIT0gTlVMTCkKCQl1c2UgPSBXUEFTX1AyUF9QRF9GT1JfSk9JTjsKCWVsc2UgaWYgKG9zX3N0cnN0cihwb3MsICIgYXV0byIpICE9IE5VTEwpCgkJdXNlID0gV1BBU19QMlBfUERfQVVUTzsKCglyZXR1cm4gd3Bhc19wMnBfcHJvdl9kaXNjKHdwYV9zLCBhZGRyLCBwb3MsIHVzZSk7Cn0KCgpzdGF0aWMgaW50IHAycF9nZXRfcGFzc3BocmFzZShzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjaGFyICpidWYsCgkJCSAgICAgIHNpemVfdCBidWZsZW4pCnsKCXN0cnVjdCB3cGFfc3NpZCAqc3NpZCA9IHdwYV9zLT5jdXJyZW50X3NzaWQ7CgoJaWYgKHNzaWQgPT0gTlVMTCB8fCBzc2lkLT5tb2RlICE9IFdQQVNfTU9ERV9QMlBfR08gfHwKCSAgICBzc2lkLT5wYXNzcGhyYXNlID09IE5VTEwpCgkJcmV0dXJuIC0xOwoKCW9zX3N0cmxjcHkoYnVmLCBzc2lkLT5wYXNzcGhyYXNlLCBidWZsZW4pOwoJcmV0dXJuIG9zX3N0cmxlbihidWYpOwp9CgoKc3RhdGljIGludCBwMnBfY3RybF9zZXJ2X2Rpc2NfcmVxKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGNoYXIgKmNtZCwKCQkJCSAgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQp7Cgl1NjQgcmVmOwoJaW50IHJlczsKCXU4IGRzdF9idWZbRVRIX0FMRU5dLCAqZHN0OwoJc3RydWN0IHdwYWJ1ZiAqdGx2czsKCWNoYXIgKnBvczsKCXNpemVfdCBsZW47CgoJaWYgKGh3YWRkcl9hdG9uKGNtZCwgZHN0X2J1ZikpCgkJcmV0dXJuIC0xOwoJZHN0ID0gZHN0X2J1ZjsKCWlmIChkc3RbMF0gPT0gMCAmJiBkc3RbMV0gPT0gMCAmJiBkc3RbMl0gPT0gMCAmJgoJICAgIGRzdFszXSA9PSAwICYmIGRzdFs0XSA9PSAwICYmIGRzdFs1XSA9PSAwKQoJCWRzdCA9IE5VTEw7Cglwb3MgPSBjbWQgKyAxNzsKCWlmICgqcG9zICE9ICcgJykKCQlyZXR1cm4gLTE7Cglwb3MrKzsKCglpZiAob3Nfc3RybmNtcChwb3MsICJ1cG5wICIsIDUpID09IDApIHsKCQl1OCB2ZXJzaW9uOwoJCXBvcyArPSA1OwoJCWlmIChoZXhzdHIyYmluKHBvcywgJnZlcnNpb24sIDEpIDwgMCkKCQkJcmV0dXJuIC0xOwoJCXBvcyArPSAyOwoJCWlmICgqcG9zICE9ICcgJykKCQkJcmV0dXJuIC0xOwoJCXBvcysrOwoJCXJlZiA9IHdwYXNfcDJwX3NkX3JlcXVlc3RfdXBucCh3cGFfcywgZHN0LCB2ZXJzaW9uLCBwb3MpOwojaWZkZWYgQ09ORklHX1dJRklfRElTUExBWQoJfSBlbHNlIGlmIChvc19zdHJuY21wKHBvcywgIndpZmktZGlzcGxheSAiLCAxMykgPT0gMCkgewoJCXJlZiA9IHdwYXNfcDJwX3NkX3JlcXVlc3Rfd2lmaV9kaXNwbGF5KHdwYV9zLCBkc3QsIHBvcyArIDEzKTsKI2VuZGlmIC8qIENPTkZJR19XSUZJX0RJU1BMQVkgKi8KCX0gZWxzZSB7CgkJbGVuID0gb3Nfc3RybGVuKHBvcyk7CgkJaWYgKGxlbiAmIDEpCgkJCXJldHVybiAtMTsKCQlsZW4gLz0gMjsKCQl0bHZzID0gd3BhYnVmX2FsbG9jKGxlbik7CgkJaWYgKHRsdnMgPT0gTlVMTCkKCQkJcmV0dXJuIC0xOwoJCWlmIChoZXhzdHIyYmluKHBvcywgd3BhYnVmX3B1dCh0bHZzLCBsZW4pLCBsZW4pIDwgMCkgewoJCQl3cGFidWZfZnJlZSh0bHZzKTsKCQkJcmV0dXJuIC0xOwoJCX0KCgkJcmVmID0gd3Bhc19wMnBfc2RfcmVxdWVzdCh3cGFfcywgZHN0LCB0bHZzKTsKCQl3cGFidWZfZnJlZSh0bHZzKTsKCX0KCWlmIChyZWYgPT0gMCkKCQlyZXR1cm4gLTE7CglyZXMgPSBvc19zbnByaW50ZihidWYsIGJ1ZmxlbiwgIiVsbHgiLCAobG9uZyBsb25nIHVuc2lnbmVkKSByZWYpOwoJaWYgKHJlcyA8IDAgfHwgKHVuc2lnbmVkKSByZXMgPj0gYnVmbGVuKQoJCXJldHVybiAtMTsKCXJldHVybiByZXM7Cn0KCgpzdGF0aWMgaW50IHAycF9jdHJsX3NlcnZfZGlzY19jYW5jZWxfcmVxKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCgkJCQkJIGNoYXIgKmNtZCkKewoJbG9uZyBsb25nIHVuc2lnbmVkIHZhbDsKCXU2NCByZXE7CglpZiAoc3NjYW5mKGNtZCwgIiVsbHgiLCAmdmFsKSAhPSAxKQoJCXJldHVybiAtMTsKCXJlcSA9IHZhbDsKCXJldHVybiB3cGFzX3AycF9zZF9jYW5jZWxfcmVxdWVzdCh3cGFfcywgcmVxKTsKfQoKCnN0YXRpYyBpbnQgcDJwX2N0cmxfc2Vydl9kaXNjX3Jlc3Aoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY2hhciAqY21kKQp7CglpbnQgZnJlcTsKCXU4IGRzdFtFVEhfQUxFTl07Cgl1OCBkaWFsb2dfdG9rZW47CglzdHJ1Y3Qgd3BhYnVmICpyZXNwX3RsdnM7CgljaGFyICpwb3MsICpwb3MyOwoJc2l6ZV90IGxlbjsKCglwb3MgPSBvc19zdHJjaHIoY21kLCAnICcpOwoJaWYgKHBvcyA9PSBOVUxMKQoJCXJldHVybiAtMTsKCSpwb3MrKyA9ICdcMCc7CglmcmVxID0gYXRvaShjbWQpOwoJaWYgKGZyZXEgPT0gMCkKCQlyZXR1cm4gLTE7CgoJaWYgKGh3YWRkcl9hdG9uKHBvcywgZHN0KSkKCQlyZXR1cm4gLTE7Cglwb3MgKz0gMTc7CglpZiAoKnBvcyAhPSAnICcpCgkJcmV0dXJuIC0xOwoJcG9zKys7CgoJcG9zMiA9IG9zX3N0cmNocihwb3MsICcgJyk7CglpZiAocG9zMiA9PSBOVUxMKQoJCXJldHVybiAtMTsKCSpwb3MyKysgPSAnXDAnOwoJZGlhbG9nX3Rva2VuID0gYXRvaShwb3MpOwoKCWxlbiA9IG9zX3N0cmxlbihwb3MyKTsKCWlmIChsZW4gJiAxKQoJCXJldHVybiAtMTsKCWxlbiAvPSAyOwoJcmVzcF90bHZzID0gd3BhYnVmX2FsbG9jKGxlbik7CglpZiAocmVzcF90bHZzID09IE5VTEwpCgkJcmV0dXJuIC0xOwoJaWYgKGhleHN0cjJiaW4ocG9zMiwgd3BhYnVmX3B1dChyZXNwX3RsdnMsIGxlbiksIGxlbikgPCAwKSB7CgkJd3BhYnVmX2ZyZWUocmVzcF90bHZzKTsKCQlyZXR1cm4gLTE7Cgl9CgoJd3Bhc19wMnBfc2RfcmVzcG9uc2Uod3BhX3MsIGZyZXEsIGRzdCwgZGlhbG9nX3Rva2VuLCByZXNwX3RsdnMpOwoJd3BhYnVmX2ZyZWUocmVzcF90bHZzKTsKCXJldHVybiAwOwp9CgoKc3RhdGljIGludCBwMnBfY3RybF9zZXJ2X2Rpc2NfZXh0ZXJuYWwoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKCQkJCSAgICAgICBjaGFyICpjbWQpCnsKCWlmIChvc19zdHJjbXAoY21kLCAiMCIpICYmIG9zX3N0cmNtcChjbWQsICIxIikpCgkJcmV0dXJuIC0xOwoJd3BhX3MtPnAycF9zZF9vdmVyX2N0cmxfaWZhY2UgPSBhdG9pKGNtZCk7CglyZXR1cm4gMDsKfQoKCnN0YXRpYyBpbnQgcDJwX2N0cmxfc2VydmljZV9hZGRfYm9uam91cihzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAoJCQkJCWNoYXIgKmNtZCkKewoJY2hhciAqcG9zOwoJc2l6ZV90IGxlbjsKCXN0cnVjdCB3cGFidWYgKnF1ZXJ5LCAqcmVzcDsKCglwb3MgPSBvc19zdHJjaHIoY21kLCAnICcpOwoJaWYgKHBvcyA9PSBOVUxMKQoJCXJldHVybiAtMTsKCSpwb3MrKyA9ICdcMCc7CgoJbGVuID0gb3Nfc3RybGVuKGNtZCk7CglpZiAobGVuICYgMSkKCQlyZXR1cm4gLTE7CglsZW4gLz0gMjsKCXF1ZXJ5ID0gd3BhYnVmX2FsbG9jKGxlbik7CglpZiAocXVlcnkgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CglpZiAoaGV4c3RyMmJpbihjbWQsIHdwYWJ1Zl9wdXQocXVlcnksIGxlbiksIGxlbikgPCAwKSB7CgkJd3BhYnVmX2ZyZWUocXVlcnkpOwoJCXJldHVybiAtMTsKCX0KCglsZW4gPSBvc19zdHJsZW4ocG9zKTsKCWlmIChsZW4gJiAxKSB7CgkJd3BhYnVmX2ZyZWUocXVlcnkpOwoJCXJldHVybiAtMTsKCX0KCWxlbiAvPSAyOwoJcmVzcCA9IHdwYWJ1Zl9hbGxvYyhsZW4pOwoJaWYgKHJlc3AgPT0gTlVMTCkgewoJCXdwYWJ1Zl9mcmVlKHF1ZXJ5KTsKCQlyZXR1cm4gLTE7Cgl9CglpZiAoaGV4c3RyMmJpbihwb3MsIHdwYWJ1Zl9wdXQocmVzcCwgbGVuKSwgbGVuKSA8IDApIHsKCQl3cGFidWZfZnJlZShxdWVyeSk7CgkJd3BhYnVmX2ZyZWUocmVzcCk7CgkJcmV0dXJuIC0xOwoJfQoKCWlmICh3cGFzX3AycF9zZXJ2aWNlX2FkZF9ib25qb3VyKHdwYV9zLCBxdWVyeSwgcmVzcCkgPCAwKSB7CgkJd3BhYnVmX2ZyZWUocXVlcnkpOwoJCXdwYWJ1Zl9mcmVlKHJlc3ApOwoJCXJldHVybiAtMTsKCX0KCXJldHVybiAwOwp9CgoKc3RhdGljIGludCBwMnBfY3RybF9zZXJ2aWNlX2FkZF91cG5wKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGNoYXIgKmNtZCkKewoJY2hhciAqcG9zOwoJdTggdmVyc2lvbjsKCglwb3MgPSBvc19zdHJjaHIoY21kLCAnICcpOwoJaWYgKHBvcyA9PSBOVUxMKQoJCXJldHVybiAtMTsKCSpwb3MrKyA9ICdcMCc7CgoJaWYgKGhleHN0cjJiaW4oY21kLCAmdmVyc2lvbiwgMSkgPCAwKQoJCXJldHVybiAtMTsKCglyZXR1cm4gd3Bhc19wMnBfc2VydmljZV9hZGRfdXBucCh3cGFfcywgdmVyc2lvbiwgcG9zKTsKfQoKCnN0YXRpYyBpbnQgcDJwX2N0cmxfc2VydmljZV9hZGQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY2hhciAqY21kKQp7CgljaGFyICpwb3M7CgoJcG9zID0gb3Nfc3RyY2hyKGNtZCwgJyAnKTsKCWlmIChwb3MgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CgkqcG9zKysgPSAnXDAnOwoKCWlmIChvc19zdHJjbXAoY21kLCAiYm9uam91ciIpID09IDApCgkJcmV0dXJuIHAycF9jdHJsX3NlcnZpY2VfYWRkX2JvbmpvdXIod3BhX3MsIHBvcyk7CglpZiAob3Nfc3RyY21wKGNtZCwgInVwbnAiKSA9PSAwKQoJCXJldHVybiBwMnBfY3RybF9zZXJ2aWNlX2FkZF91cG5wKHdwYV9zLCBwb3MpOwoJd3BhX3ByaW50ZihNU0dfREVCVUcsICJVbmtub3duIHNlcnZpY2UgJyVzJyIsIGNtZCk7CglyZXR1cm4gLTE7Cn0KCgpzdGF0aWMgaW50IHAycF9jdHJsX3NlcnZpY2VfZGVsX2JvbmpvdXIoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKCQkJCQljaGFyICpjbWQpCnsKCXNpemVfdCBsZW47CglzdHJ1Y3Qgd3BhYnVmICpxdWVyeTsKCWludCByZXQ7CgoJbGVuID0gb3Nfc3RybGVuKGNtZCk7CglpZiAobGVuICYgMSkKCQlyZXR1cm4gLTE7CglsZW4gLz0gMjsKCXF1ZXJ5ID0gd3BhYnVmX2FsbG9jKGxlbik7CglpZiAocXVlcnkgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CglpZiAoaGV4c3RyMmJpbihjbWQsIHdwYWJ1Zl9wdXQocXVlcnksIGxlbiksIGxlbikgPCAwKSB7CgkJd3BhYnVmX2ZyZWUocXVlcnkpOwoJCXJldHVybiAtMTsKCX0KCglyZXQgPSB3cGFzX3AycF9zZXJ2aWNlX2RlbF9ib25qb3VyKHdwYV9zLCBxdWVyeSk7Cgl3cGFidWZfZnJlZShxdWVyeSk7CglyZXR1cm4gcmV0Owp9CgoKc3RhdGljIGludCBwMnBfY3RybF9zZXJ2aWNlX2RlbF91cG5wKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGNoYXIgKmNtZCkKewoJY2hhciAqcG9zOwoJdTggdmVyc2lvbjsKCglwb3MgPSBvc19zdHJjaHIoY21kLCAnICcpOwoJaWYgKHBvcyA9PSBOVUxMKQoJCXJldHVybiAtMTsKCSpwb3MrKyA9ICdcMCc7CgoJaWYgKGhleHN0cjJiaW4oY21kLCAmdmVyc2lvbiwgMSkgPCAwKQoJCXJldHVybiAtMTsKCglyZXR1cm4gd3Bhc19wMnBfc2VydmljZV9kZWxfdXBucCh3cGFfcywgdmVyc2lvbiwgcG9zKTsKfQoKCnN0YXRpYyBpbnQgcDJwX2N0cmxfc2VydmljZV9kZWwoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY2hhciAqY21kKQp7CgljaGFyICpwb3M7CgoJcG9zID0gb3Nfc3RyY2hyKGNtZCwgJyAnKTsKCWlmIChwb3MgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CgkqcG9zKysgPSAnXDAnOwoKCWlmIChvc19zdHJjbXAoY21kLCAiYm9uam91ciIpID09IDApCgkJcmV0dXJuIHAycF9jdHJsX3NlcnZpY2VfZGVsX2JvbmpvdXIod3BhX3MsIHBvcyk7CglpZiAob3Nfc3RyY21wKGNtZCwgInVwbnAiKSA9PSAwKQoJCXJldHVybiBwMnBfY3RybF9zZXJ2aWNlX2RlbF91cG5wKHdwYV9zLCBwb3MpOwoJd3BhX3ByaW50ZihNU0dfREVCVUcsICJVbmtub3duIHNlcnZpY2UgJyVzJyIsIGNtZCk7CglyZXR1cm4gLTE7Cn0KCgpzdGF0aWMgaW50IHAycF9jdHJsX3JlamVjdChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjaGFyICpjbWQpCnsKCXU4IGFkZHJbRVRIX0FMRU5dOwoKCS8qIDxhZGRyPiAqLwoKCWlmIChod2FkZHJfYXRvbihjbWQsIGFkZHIpKQoJCXJldHVybiAtMTsKCglyZXR1cm4gd3Bhc19wMnBfcmVqZWN0KHdwYV9zLCBhZGRyKTsKfQoKCnN0YXRpYyBpbnQgcDJwX2N0cmxfaW52aXRlX3BlcnNpc3RlbnQoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY2hhciAqY21kKQp7CgljaGFyICpwb3M7CglpbnQgaWQ7CglzdHJ1Y3Qgd3BhX3NzaWQgKnNzaWQ7Cgl1OCAqX3BlZXIgPSBOVUxMLCBwZWVyW0VUSF9BTEVOXTsKCWludCBmcmVxID0gMCwgcHJlZl9mcmVxID0gMDsKCWludCBodDQwOwoKCWlkID0gYXRvaShjbWQpOwoJcG9zID0gb3Nfc3Ryc3RyKGNtZCwgIiBwZWVyPSIpOwoJaWYgKHBvcykgewoJCXBvcyArPSA2OwoJCWlmIChod2FkZHJfYXRvbihwb3MsIHBlZXIpKQoJCQlyZXR1cm4gLTE7CgkJX3BlZXIgPSBwZWVyOwoJfQoJc3NpZCA9IHdwYV9jb25maWdfZ2V0X25ldHdvcmsod3BhX3MtPmNvbmYsIGlkKTsKCWlmIChzc2lkID09IE5VTEwgfHwgc3NpZC0+ZGlzYWJsZWQgIT0gMikgewoJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRTogQ291bGQgbm90IGZpbmQgU1NJRCBpZD0lZCAiCgkJCSAgICJmb3IgcGVyc2lzdGVudCBQMlAgZ3JvdXAiLAoJCQkgICBpZCk7CgkJcmV0dXJuIC0xOwoJfQoKCXBvcyA9IG9zX3N0cnN0cihjbWQsICIgZnJlcT0iKTsKCWlmIChwb3MpIHsKCQlwb3MgKz0gNjsKCQlmcmVxID0gYXRvaShwb3MpOwoJCWlmIChmcmVxIDw9IDApCgkJCXJldHVybiAtMTsKCX0KCglwb3MgPSBvc19zdHJzdHIoY21kLCAiIHByZWY9Iik7CglpZiAocG9zKSB7CgkJcG9zICs9IDY7CgkJcHJlZl9mcmVxID0gYXRvaShwb3MpOwoJCWlmIChwcmVmX2ZyZXEgPD0gMCkKCQkJcmV0dXJuIC0xOwoJfQoKCWh0NDAgPSAob3Nfc3Ryc3RyKGNtZCwgIiBodDQwIikgIT0gTlVMTCkgfHwgd3BhX3MtPmNvbmYtPnAycF9nb19odDQwOwoKCXJldHVybiB3cGFzX3AycF9pbnZpdGUod3BhX3MsIF9wZWVyLCBzc2lkLCBOVUxMLCBmcmVxLCBodDQwLCBwcmVmX2ZyZXEpOwp9CgoKc3RhdGljIGludCBwMnBfY3RybF9pbnZpdGVfZ3JvdXAoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY2hhciAqY21kKQp7CgljaGFyICpwb3M7Cgl1OCBwZWVyW0VUSF9BTEVOXSwgZ29fZGV2X2FkZHJbRVRIX0FMRU5dLCAqZ29fZGV2ID0gTlVMTDsKCglwb3MgPSBvc19zdHJzdHIoY21kLCAiIHBlZXI9Iik7CglpZiAoIXBvcykKCQlyZXR1cm4gLTE7CgoJKnBvcyA9ICdcMCc7Cglwb3MgKz0gNjsKCWlmIChod2FkZHJfYXRvbihwb3MsIHBlZXIpKSB7CgkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJQMlA6IEludmFsaWQgTUFDIGFkZHJlc3MgJyVzJyIsIHBvcyk7CgkJcmV0dXJuIC0xOwoJfQoKCXBvcyA9IG9zX3N0cnN0cihwb3MsICIgZ29fZGV2X2FkZHI9Iik7CglpZiAocG9zKSB7CgkJcG9zICs9IDEzOwoJCWlmIChod2FkZHJfYXRvbihwb3MsIGdvX2Rldl9hZGRyKSkgewoJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlAyUDogSW52YWxpZCBNQUMgYWRkcmVzcyAnJXMnIiwKCQkJCSAgIHBvcyk7CgkJCXJldHVybiAtMTsKCQl9CgkJZ29fZGV2ID0gZ29fZGV2X2FkZHI7Cgl9CgoJcmV0dXJuIHdwYXNfcDJwX2ludml0ZV9ncm91cCh3cGFfcywgY21kLCBwZWVyLCBnb19kZXYpOwp9CgoKc3RhdGljIGludCBwMnBfY3RybF9pbnZpdGUoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY2hhciAqY21kKQp7CglpZiAob3Nfc3RybmNtcChjbWQsICJwZXJzaXN0ZW50PSIsIDExKSA9PSAwKQoJCXJldHVybiBwMnBfY3RybF9pbnZpdGVfcGVyc2lzdGVudCh3cGFfcywgY21kICsgMTEpOwoJaWYgKG9zX3N0cm5jbXAoY21kLCAiZ3JvdXA9IiwgNikgPT0gMCkKCQlyZXR1cm4gcDJwX2N0cmxfaW52aXRlX2dyb3VwKHdwYV9zLCBjbWQgKyA2KTsKCglyZXR1cm4gLTE7Cn0KCgpzdGF0aWMgaW50IHAycF9jdHJsX2dyb3VwX2FkZF9wZXJzaXN0ZW50KHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCgkJCQkJIGNoYXIgKmNtZCwgaW50IGZyZXEsIGludCBodDQwKQp7CglpbnQgaWQ7CglzdHJ1Y3Qgd3BhX3NzaWQgKnNzaWQ7CgoJaWQgPSBhdG9pKGNtZCk7Cglzc2lkID0gd3BhX2NvbmZpZ19nZXRfbmV0d29yayh3cGFfcy0+Y29uZiwgaWQpOwoJaWYgKHNzaWQgPT0gTlVMTCB8fCBzc2lkLT5kaXNhYmxlZCAhPSAyKSB7CgkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDVFJMX0lGQUNFOiBDb3VsZCBub3QgZmluZCBTU0lEIGlkPSVkICIKCQkJICAgImZvciBwZXJzaXN0ZW50IFAyUCBncm91cCIsCgkJCSAgIGlkKTsKCQlyZXR1cm4gLTE7Cgl9CgoJcmV0dXJuIHdwYXNfcDJwX2dyb3VwX2FkZF9wZXJzaXN0ZW50KHdwYV9zLCBzc2lkLCAwLCBmcmVxLCBodDQwLCBOVUxMKTsKfQoKCnN0YXRpYyBpbnQgcDJwX2N0cmxfZ3JvdXBfYWRkKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGNoYXIgKmNtZCkKewoJaW50IGZyZXEgPSAwLCBodDQwOwoJY2hhciAqcG9zOwoKCXBvcyA9IG9zX3N0cnN0cihjbWQsICJmcmVxPSIpOwoJaWYgKHBvcykKCQlmcmVxID0gYXRvaShwb3MgKyA1KTsKCglodDQwID0gKG9zX3N0cnN0cihjbWQsICJodDQwIikgIT0gTlVMTCkgfHwgd3BhX3MtPmNvbmYtPnAycF9nb19odDQwOwoKCWlmIChvc19zdHJuY21wKGNtZCwgInBlcnNpc3RlbnQ9IiwgMTEpID09IDApCgkJcmV0dXJuIHAycF9jdHJsX2dyb3VwX2FkZF9wZXJzaXN0ZW50KHdwYV9zLCBjbWQgKyAxMSwgZnJlcSwKCQkJCQkJICAgICBodDQwKTsKCWlmIChvc19zdHJjbXAoY21kLCAicGVyc2lzdGVudCIpID09IDAgfHwKCSAgICBvc19zdHJuY21wKGNtZCwgInBlcnNpc3RlbnQgIiwgMTEpID09IDApCgkJcmV0dXJuIHdwYXNfcDJwX2dyb3VwX2FkZCh3cGFfcywgMSwgZnJlcSwgaHQ0MCk7CglpZiAob3Nfc3RybmNtcChjbWQsICJmcmVxPSIsIDUpID09IDApCgkJcmV0dXJuIHdwYXNfcDJwX2dyb3VwX2FkZCh3cGFfcywgMCwgZnJlcSwgaHQ0MCk7CglpZiAoaHQ0MCkKCQlyZXR1cm4gd3Bhc19wMnBfZ3JvdXBfYWRkKHdwYV9zLCAwLCBmcmVxLCBodDQwKTsKCgl3cGFfcHJpbnRmKE1TR19ERUJVRywgIkNUUkw6IEludmFsaWQgUDJQX0dST1VQX0FERCBwYXJhbWV0ZXJzICclcyciLAoJCSAgIGNtZCk7CglyZXR1cm4gLTE7Cn0KCgpzdGF0aWMgaW50IHAycF9jdHJsX3BlZXIoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY2hhciAqY21kLAoJCQkgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQp7Cgl1OCBhZGRyW0VUSF9BTEVOXSwgKmFkZHJfcHRyOwoJaW50IG5leHQsIHJlczsKCWNvbnN0IHN0cnVjdCBwMnBfcGVlcl9pbmZvICppbmZvOwoJY2hhciAqcG9zLCAqZW5kOwoJY2hhciBkZXZ0eXBlW1dQU19ERVZfVFlQRV9CVUZTSVpFXTsKCXN0cnVjdCB3cGFfc3NpZCAqc3NpZDsKCXNpemVfdCBpOwoKCWlmICghd3BhX3MtPmdsb2JhbC0+cDJwKQoJCXJldHVybiAtMTsKCglpZiAob3Nfc3RyY21wKGNtZCwgIkZJUlNUIikgPT0gMCkgewoJCWFkZHJfcHRyID0gTlVMTDsKCQluZXh0ID0gMDsKCX0gZWxzZSBpZiAob3Nfc3RybmNtcChjbWQsICJORVhULSIsIDUpID09IDApIHsKCQlpZiAoaHdhZGRyX2F0b24oY21kICsgNSwgYWRkcikgPCAwKQoJCQlyZXR1cm4gLTE7CgkJYWRkcl9wdHIgPSBhZGRyOwoJCW5leHQgPSAxOwoJfSBlbHNlIHsKCQlpZiAoaHdhZGRyX2F0b24oY21kLCBhZGRyKSA8IDApCgkJCXJldHVybiAtMTsKCQlhZGRyX3B0ciA9IGFkZHI7CgkJbmV4dCA9IDA7Cgl9CgoJaW5mbyA9IHAycF9nZXRfcGVlcl9pbmZvKHdwYV9zLT5nbG9iYWwtPnAycCwgYWRkcl9wdHIsIG5leHQpOwoJaWYgKGluZm8gPT0gTlVMTCkKCQlyZXR1cm4gLTE7CgoJcG9zID0gYnVmOwoJZW5kID0gYnVmICsgYnVmbGVuOwoKCXJlcyA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCBNQUNTVFIgIlxuIgoJCQkgICJwcmlfZGV2X3R5cGU9JXNcbiIKCQkJICAiZGV2aWNlX25hbWU9JXNcbiIKCQkJICAibWFudWZhY3R1cmVyPSVzXG4iCgkJCSAgIm1vZGVsX25hbWU9JXNcbiIKCQkJICAibW9kZWxfbnVtYmVyPSVzXG4iCgkJCSAgInNlcmlhbF9udW1iZXI9JXNcbiIKCQkJICAiY29uZmlnX21ldGhvZHM9MHgleFxuIgoJCQkgICJkZXZfY2FwYWI9MHgleFxuIgoJCQkgICJncm91cF9jYXBhYj0weCV4XG4iCgkJCSAgImxldmVsPSVkXG4iLAoJCQkgIE1BQzJTVFIoaW5mby0+cDJwX2RldmljZV9hZGRyKSwKCQkJICB3cHNfZGV2X3R5cGVfYmluMnN0cihpbmZvLT5wcmlfZGV2X3R5cGUsCgkJCQkJICAgICAgIGRldnR5cGUsIHNpemVvZihkZXZ0eXBlKSksCgkJCSAgaW5mby0+ZGV2aWNlX25hbWUsCgkJCSAgaW5mby0+bWFudWZhY3R1cmVyLAoJCQkgIGluZm8tPm1vZGVsX25hbWUsCgkJCSAgaW5mby0+bW9kZWxfbnVtYmVyLAoJCQkgIGluZm8tPnNlcmlhbF9udW1iZXIsCgkJCSAgaW5mby0+Y29uZmlnX21ldGhvZHMsCgkJCSAgaW5mby0+ZGV2X2NhcGFiLAoJCQkgIGluZm8tPmdyb3VwX2NhcGFiLAoJCQkgIGluZm8tPmxldmVsKTsKCWlmIChyZXMgPCAwIHx8IHJlcyA+PSBlbmQgLSBwb3MpCgkJcmV0dXJuIHBvcyAtIGJ1ZjsKCXBvcyArPSByZXM7CgoJZm9yIChpID0gMDsgaSA8IGluZm8tPndwc19zZWNfZGV2X3R5cGVfbGlzdF9sZW4gLyBXUFNfREVWX1RZUEVfTEVOOyBpKyspCgl7CgkJY29uc3QgdTggKnQ7CgkJdCA9ICZpbmZvLT53cHNfc2VjX2Rldl90eXBlX2xpc3RbaSAqIFdQU19ERVZfVFlQRV9MRU5dOwoJCXJlcyA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAic2VjX2Rldl90eXBlPSVzXG4iLAoJCQkJICB3cHNfZGV2X3R5cGVfYmluMnN0cih0LCBkZXZ0eXBlLAoJCQkJCQkgICAgICAgc2l6ZW9mKGRldnR5cGUpKSk7CgkJaWYgKHJlcyA8IDAgfHwgcmVzID49IGVuZCAtIHBvcykKCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKCQlwb3MgKz0gcmVzOwoJfQoKCXNzaWQgPSB3cGFzX3AycF9nZXRfcGVyc2lzdGVudCh3cGFfcywgaW5mby0+cDJwX2RldmljZV9hZGRyLCBOVUxMLCAwKTsKCWlmIChzc2lkKSB7CgkJcmVzID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICJwZXJzaXN0ZW50PSVkXG4iLCBzc2lkLT5pZCk7CgkJaWYgKHJlcyA8IDAgfHwgcmVzID49IGVuZCAtIHBvcykKCQkJcmV0dXJuIHBvcyAtIGJ1ZjsKCQlwb3MgKz0gcmVzOwoJfQoKCXJlcyA9IHAycF9nZXRfcGVlcl9pbmZvX3R4dChpbmZvLCBwb3MsIGVuZCAtIHBvcyk7CglpZiAocmVzIDwgMCkKCQlyZXR1cm4gcG9zIC0gYnVmOwoJcG9zICs9IHJlczsKCglyZXR1cm4gcG9zIC0gYnVmOwp9CgoKc3RhdGljIGludCBwMnBfY3RybF9kaXNhbGxvd19mcmVxKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsCgkJCQkgIGNvbnN0IGNoYXIgKnBhcmFtKQp7CglzdHJ1Y3Qgd3BhX2ZyZXFfcmFuZ2UgKmZyZXEgPSBOVUxMLCAqbjsKCXVuc2lnbmVkIGludCBjb3VudCA9IDAsIGk7Cgljb25zdCBjaGFyICpwb3MsICpwb3MyLCAqcG9zMzsKCglpZiAod3BhX3MtPmdsb2JhbC0+cDJwID09IE5VTEwpCgkJcmV0dXJuIC0xOwoKCS8qCgkgKiBwYXJhbSBpbmNsdWRlcyBjb21tYSBzZXBhcmF0ZWQgZnJlcXVlbmN5IHJhbmdlLgoJICogRm9yIGV4YW1wbGU6IDI0MTItMjQzMiwyNDYyLDUwMDAtNjAwMAoJICovCglwb3MgPSBwYXJhbTsKCXdoaWxlIChwb3MgJiYgcG9zWzBdKSB7CgkJbiA9IG9zX3JlYWxsb2NfYXJyYXkoZnJlcSwgY291bnQgKyAxLAoJCQkJICAgICBzaXplb2Yoc3RydWN0IHdwYV9mcmVxX3JhbmdlKSk7CgkJaWYgKG4gPT0gTlVMTCkgewoJCQlvc19mcmVlKGZyZXEpOwoJCQlyZXR1cm4gLTE7CgkJfQoJCWZyZXEgPSBuOwoJCWZyZXFbY291bnRdLm1pbiA9IGF0b2kocG9zKTsKCQlwb3MyID0gb3Nfc3RyY2hyKHBvcywgJy0nKTsKCQlwb3MzID0gb3Nfc3RyY2hyKHBvcywgJywnKTsKCQlpZiAocG9zMiAmJiAoIXBvczMgfHwgcG9zMiA8IHBvczMpKSB7CgkJCXBvczIrKzsKCQkJZnJlcVtjb3VudF0ubWF4ID0gYXRvaShwb3MyKTsKCQl9IGVsc2UKCQkJZnJlcVtjb3VudF0ubWF4ID0gZnJlcVtjb3VudF0ubWluOwoJCXBvcyA9IHBvczM7CgkJaWYgKHBvcykKCQkJcG9zKys7CgkJY291bnQrKzsKCX0KCglmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewoJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiUDJQOiBEaXNhbGxvd2VkIGZyZXF1ZW5jeSByYW5nZSAldS0ldSIsCgkJCSAgIGZyZXFbaV0ubWluLCBmcmVxW2ldLm1heCk7Cgl9CgoJb3NfZnJlZSh3cGFfcy0+Z2xvYmFsLT5wMnBfZGlzYWxsb3dfZnJlcSk7Cgl3cGFfcy0+Z2xvYmFsLT5wMnBfZGlzYWxsb3dfZnJlcSA9IGZyZXE7Cgl3cGFfcy0+Z2xvYmFsLT5udW1fcDJwX2Rpc2FsbG93X2ZyZXEgPSBjb3VudDsKCXdwYXNfcDJwX3VwZGF0ZV9jaGFubmVsX2xpc3Qod3BhX3MpOwoJcmV0dXJuIDA7Cn0KCgpzdGF0aWMgaW50IHAycF9jdHJsX3NldChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjaGFyICpjbWQpCnsKCWNoYXIgKnBhcmFtOwoKCWlmICh3cGFfcy0+Z2xvYmFsLT5wMnAgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CgoJcGFyYW0gPSBvc19zdHJjaHIoY21kLCAnICcpOwoJaWYgKHBhcmFtID09IE5VTEwpCgkJcmV0dXJuIC0xOwoJKnBhcmFtKysgPSAnXDAnOwoKCWlmIChvc19zdHJjbXAoY21kLCAiZGlzY292ZXJhYmlsaXR5IikgPT0gMCkgewoJCXAycF9zZXRfY2xpZW50X2Rpc2NvdmVyYWJpbGl0eSh3cGFfcy0+Z2xvYmFsLT5wMnAsCgkJCQkJICAgICAgIGF0b2kocGFyYW0pKTsKCQlyZXR1cm4gMDsKCX0KCglpZiAob3Nfc3RyY21wKGNtZCwgIm1hbmFnZWQiKSA9PSAwKSB7CgkJcDJwX3NldF9tYW5hZ2VkX29wZXIod3BhX3MtPmdsb2JhbC0+cDJwLCBhdG9pKHBhcmFtKSk7CgkJcmV0dXJuIDA7Cgl9CgoJaWYgKG9zX3N0cmNtcChjbWQsICJsaXN0ZW5fY2hhbm5lbCIpID09IDApIHsKCQlyZXR1cm4gcDJwX3NldF9saXN0ZW5fY2hhbm5lbCh3cGFfcy0+Z2xvYmFsLT5wMnAsIDgxLAoJCQkJCSAgICAgIGF0b2kocGFyYW0pKTsKCX0KCglpZiAob3Nfc3RyY21wKGNtZCwgInNzaWRfcG9zdGZpeCIpID09IDApIHsKCQlyZXR1cm4gcDJwX3NldF9zc2lkX3Bvc3RmaXgod3BhX3MtPmdsb2JhbC0+cDJwLCAodTggKikgcGFyYW0sCgkJCQkJICAgIG9zX3N0cmxlbihwYXJhbSkpOwoJfQoKCWlmIChvc19zdHJjbXAoY21kLCAibm9hIikgPT0gMCkgewoJCWNoYXIgKnBvczsKCQlpbnQgY291bnQsIHN0YXJ0LCBkdXJhdGlvbjsKCQkvKiBHTyBOb0EgcGFyYW1ldGVyczogY291bnQsc3RhcnRfb2Zmc2V0KG1zKSxkdXJhdGlvbihtcykgKi8KCQljb3VudCA9IGF0b2kocGFyYW0pOwoJCXBvcyA9IG9zX3N0cmNocihwYXJhbSwgJywnKTsKCQlpZiAocG9zID09IE5VTEwpCgkJCXJldHVybiAtMTsKCQlwb3MrKzsKCQlzdGFydCA9IGF0b2kocG9zKTsKCQlwb3MgPSBvc19zdHJjaHIocG9zLCAnLCcpOwoJCWlmIChwb3MgPT0gTlVMTCkKCQkJcmV0dXJuIC0xOwoJCXBvcysrOwoJCWR1cmF0aW9uID0gYXRvaShwb3MpOwoJCWlmIChjb3VudCA8IDAgfHwgY291bnQgPiAyNTUgfHwgc3RhcnQgPCAwIHx8IGR1cmF0aW9uIDwgMCkKCQkJcmV0dXJuIC0xOwoJCWlmIChjb3VudCA9PSAwICYmIGR1cmF0aW9uID4gMCkKCQkJcmV0dXJuIC0xOwoJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRTogUDJQX1NFVCBHTyBOb0E6IGNvdW50PSVkICIKCQkJICAgInN0YXJ0PSVkIGR1cmF0aW9uPSVkIiwgY291bnQsIHN0YXJ0LCBkdXJhdGlvbik7CgkJcmV0dXJuIHdwYXNfcDJwX3NldF9ub2Eod3BhX3MsIGNvdW50LCBzdGFydCwgZHVyYXRpb24pOwoJfQoKCWlmIChvc19zdHJjbXAoY21kLCAicHMiKSA9PSAwKQoJCXJldHVybiB3cGFfZHJ2X3NldF9wMnBfcG93ZXJzYXZlKHdwYV9zLCBhdG9pKHBhcmFtKSwgLTEsIC0xKTsKCglpZiAob3Nfc3RyY21wKGNtZCwgIm9wcHBzIikgPT0gMCkKCQlyZXR1cm4gd3BhX2Rydl9zZXRfcDJwX3Bvd2Vyc2F2ZSh3cGFfcywgLTEsIGF0b2kocGFyYW0pLCAtMSk7CgoJaWYgKG9zX3N0cmNtcChjbWQsICJjdHdpbmRvdyIpID09IDApCgkJcmV0dXJuIHdwYV9kcnZfc2V0X3AycF9wb3dlcnNhdmUod3BhX3MsIC0xLCAtMSwgYXRvaShwYXJhbSkpOwoKCWlmIChvc19zdHJjbXAoY21kLCAiZGlzYWJsZWQiKSA9PSAwKSB7CgkJd3BhX3MtPmdsb2JhbC0+cDJwX2Rpc2FibGVkID0gYXRvaShwYXJhbSk7CgkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJQMlAgZnVuY3Rpb25hbGl0eSAlcyIsCgkJCSAgIHdwYV9zLT5nbG9iYWwtPnAycF9kaXNhYmxlZCA/CgkJCSAgICJkaXNhYmxlZCIgOiAiZW5hYmxlZCIpOwoJCWlmICh3cGFfcy0+Z2xvYmFsLT5wMnBfZGlzYWJsZWQpIHsKCQkJd3Bhc19wMnBfc3RvcF9maW5kKHdwYV9zKTsKCQkJb3NfbWVtc2V0KHdwYV9zLT5wMnBfYXV0aF9pbnZpdGUsIDAsIEVUSF9BTEVOKTsKCQkJcDJwX2ZsdXNoKHdwYV9zLT5nbG9iYWwtPnAycCk7CgkJfQoJCXJldHVybiAwOwoJfQoKCWlmIChvc19zdHJjbXAoY21kLCAiY29uY19wcmVmIikgPT0gMCkgewoJCWlmIChvc19zdHJjbXAocGFyYW0sICJzdGEiKSA9PSAwKQoJCQl3cGFfcy0+Z2xvYmFsLT5jb25jX3ByZWYgPSBXUEFfQ09OQ19QUkVGX1NUQTsKCQllbHNlIGlmIChvc19zdHJjbXAocGFyYW0sICJwMnAiKSA9PSAwKQoJCQl3cGFfcy0+Z2xvYmFsLT5jb25jX3ByZWYgPSBXUEFfQ09OQ19QUkVGX1AyUDsKCQllbHNlIHsKCQkJd3BhX3ByaW50ZihNU0dfSU5GTywgIkludmFsaWQgY29uY19wcmVmIHZhbHVlIik7CgkJCXJldHVybiAtMTsKCQl9CgkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJTaW5nbGUgY2hhbm5lbCBjb25jdXJyZW5jeSBwcmVmZXJlbmNlOiAiCgkJCSAgICIlcyIsIHBhcmFtKTsKCQlyZXR1cm4gMDsKCX0KCglpZiAob3Nfc3RyY21wKGNtZCwgImZvcmNlX2xvbmdfc2QiKSA9PSAwKSB7CgkJd3BhX3MtPmZvcmNlX2xvbmdfc2QgPSBhdG9pKHBhcmFtKTsKCQlyZXR1cm4gMDsKCX0KCglpZiAob3Nfc3RyY21wKGNtZCwgInBlZXJfZmlsdGVyIikgPT0gMCkgewoJCXU4IGFkZHJbRVRIX0FMRU5dOwoJCWlmIChod2FkZHJfYXRvbihwYXJhbSwgYWRkcikpCgkJCXJldHVybiAtMTsKCQlwMnBfc2V0X3BlZXJfZmlsdGVyKHdwYV9zLT5nbG9iYWwtPnAycCwgYWRkcik7CgkJcmV0dXJuIDA7Cgl9CgoJaWYgKG9zX3N0cmNtcChjbWQsICJjcm9zc19jb25uZWN0IikgPT0gMCkKCQlyZXR1cm4gd3Bhc19wMnBfc2V0X2Nyb3NzX2Nvbm5lY3Qod3BhX3MsIGF0b2kocGFyYW0pKTsKCglpZiAob3Nfc3RyY21wKGNtZCwgImdvX2Fwc2QiKSA9PSAwKSB7CgkJaWYgKG9zX3N0cmNtcChwYXJhbSwgImRpc2FibGUiKSA9PSAwKQoJCQl3cGFfcy0+c2V0X2FwX3VhcHNkID0gMDsKCQllbHNlIHsKCQkJd3BhX3MtPnNldF9hcF91YXBzZCA9IDE7CgkJCXdwYV9zLT5hcF91YXBzZCA9IGF0b2kocGFyYW0pOwoJCX0KCQlyZXR1cm4gMDsKCX0KCglpZiAob3Nfc3RyY21wKGNtZCwgImNsaWVudF9hcHNkIikgPT0gMCkgewoJCWlmIChvc19zdHJjbXAocGFyYW0sICJkaXNhYmxlIikgPT0gMCkKCQkJd3BhX3MtPnNldF9zdGFfdWFwc2QgPSAwOwoJCWVsc2UgewoJCQlpbnQgYmUsIGJrLCB2aSwgdm87CgkJCWNoYXIgKnBvczsKCQkJLyogZm9ybWF0OiBCRSxCSyxWSSxWTzttYXggU1AgTGVuZ3RoICovCgkJCWJlID0gYXRvaShwYXJhbSk7CgkJCXBvcyA9IG9zX3N0cmNocihwYXJhbSwgJywnKTsKCQkJaWYgKHBvcyA9PSBOVUxMKQoJCQkJcmV0dXJuIC0xOwoJCQlwb3MrKzsKCQkJYmsgPSBhdG9pKHBvcyk7CgkJCXBvcyA9IG9zX3N0cmNocihwb3MsICcsJyk7CgkJCWlmIChwb3MgPT0gTlVMTCkKCQkJCXJldHVybiAtMTsKCQkJcG9zKys7CgkJCXZpID0gYXRvaShwb3MpOwoJCQlwb3MgPSBvc19zdHJjaHIocG9zLCAnLCcpOwoJCQlpZiAocG9zID09IE5VTEwpCgkJCQlyZXR1cm4gLTE7CgkJCXBvcysrOwoJCQl2byA9IGF0b2kocG9zKTsKCQkJLyogaWdub3JlIG1heCBTUCBMZW5ndGggZm9yIG5vdyAqLwoKCQkJd3BhX3MtPnNldF9zdGFfdWFwc2QgPSAxOwoJCQl3cGFfcy0+c3RhX3VhcHNkID0gMDsKCQkJaWYgKGJlKQoJCQkJd3BhX3MtPnN0YV91YXBzZCB8PSBCSVQoMCk7CgkJCWlmIChiaykKCQkJCXdwYV9zLT5zdGFfdWFwc2QgfD0gQklUKDEpOwoJCQlpZiAodmkpCgkJCQl3cGFfcy0+c3RhX3VhcHNkIHw9IEJJVCgyKTsKCQkJaWYgKHZvKQoJCQkJd3BhX3MtPnN0YV91YXBzZCB8PSBCSVQoMyk7CgkJfQoJCXJldHVybiAwOwoJfQoKCWlmIChvc19zdHJjbXAoY21kLCAiZGlzYWxsb3dfZnJlcSIpID09IDApCgkJcmV0dXJuIHAycF9jdHJsX2Rpc2FsbG93X2ZyZXEod3BhX3MsIHBhcmFtKTsKCglpZiAob3Nfc3RyY21wKGNtZCwgImRpc2NfaW50IikgPT0gMCkgewoJCWludCBtaW5fZGlzY19pbnQsIG1heF9kaXNjX2ludCwgbWF4X2Rpc2NfdHU7CgkJY2hhciAqcG9zOwoKCQlwb3MgPSBwYXJhbTsKCgkJbWluX2Rpc2NfaW50ID0gYXRvaShwb3MpOwoJCXBvcyA9IG9zX3N0cmNocihwb3MsICcgJyk7CgkJaWYgKHBvcyA9PSBOVUxMKQoJCQlyZXR1cm4gLTE7CgkJKnBvcysrID0gJ1wwJzsKCgkJbWF4X2Rpc2NfaW50ID0gYXRvaShwb3MpOwoJCXBvcyA9IG9zX3N0cmNocihwb3MsICcgJyk7CgkJaWYgKHBvcyA9PSBOVUxMKQoJCQlyZXR1cm4gLTE7CgkJKnBvcysrID0gJ1wwJzsKCgkJbWF4X2Rpc2NfdHUgPSBhdG9pKHBvcyk7CgoJCXJldHVybiBwMnBfc2V0X2Rpc2NfaW50KHdwYV9zLT5nbG9iYWwtPnAycCwgbWluX2Rpc2NfaW50LAoJCQkJCW1heF9kaXNjX2ludCwgbWF4X2Rpc2NfdHUpOwoJfQoKCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiQ1RSTF9JRkFDRTogVW5rbm93biBQMlBfU0VUIGZpZWxkIHZhbHVlICclcyciLAoJCSAgIGNtZCk7CgoJcmV0dXJuIC0xOwp9CgoKc3RhdGljIGludCBwMnBfY3RybF9wcmVzZW5jZV9yZXEoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY2hhciAqY21kKQp7CgljaGFyICpwb3MsICpwb3MyOwoJdW5zaWduZWQgaW50IGR1cjEgPSAwLCBpbnQxID0gMCwgZHVyMiA9IDAsIGludDIgPSAwOwoKCWlmIChjbWRbMF0pIHsKCQlwb3MgPSBvc19zdHJjaHIoY21kLCAnICcpOwoJCWlmIChwb3MgPT0gTlVMTCkKCQkJcmV0dXJuIC0xOwoJCSpwb3MrKyA9ICdcMCc7CgkJZHVyMSA9IGF0b2koY21kKTsKCgkJcG9zMiA9IG9zX3N0cmNocihwb3MsICcgJyk7CgkJaWYgKHBvczIpCgkJCSpwb3MyKysgPSAnXDAnOwoJCWludDEgPSBhdG9pKHBvcyk7Cgl9IGVsc2UKCQlwb3MyID0gTlVMTDsKCglpZiAocG9zMikgewoJCXBvcyA9IG9zX3N0cmNocihwb3MyLCAnICcpOwoJCWlmIChwb3MgPT0gTlVMTCkKCQkJcmV0dXJuIC0xOwoJCSpwb3MrKyA9ICdcMCc7CgkJZHVyMiA9IGF0b2kocG9zMik7CgkJaW50MiA9IGF0b2kocG9zKTsKCX0KCglyZXR1cm4gd3Bhc19wMnBfcHJlc2VuY2VfcmVxKHdwYV9zLCBkdXIxLCBpbnQxLCBkdXIyLCBpbnQyKTsKfQoKCnN0YXRpYyBpbnQgcDJwX2N0cmxfZXh0X2xpc3RlbihzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjaGFyICpjbWQpCnsKCWNoYXIgKnBvczsKCXVuc2lnbmVkIGludCBwZXJpb2QgPSAwLCBpbnRlcnZhbCA9IDA7CgoJaWYgKGNtZFswXSkgewoJCXBvcyA9IG9zX3N0cmNocihjbWQsICcgJyk7CgkJaWYgKHBvcyA9PSBOVUxMKQoJCQlyZXR1cm4gLTE7CgkJKnBvcysrID0gJ1wwJzsKCQlwZXJpb2QgPSBhdG9pKGNtZCk7CgkJaW50ZXJ2YWwgPSBhdG9pKHBvcyk7Cgl9CgoJcmV0dXJuIHdwYXNfcDJwX2V4dF9saXN0ZW4od3BhX3MsIHBlcmlvZCwgaW50ZXJ2YWwpOwp9CgojZW5kaWYgLyogQ09ORklHX1AyUCAqLwoKCiNpZmRlZiBDT05GSUdfSU5URVJXT1JLSU5HCnN0YXRpYyBpbnQgY3RybF9pbnRlcndvcmtpbmdfY29ubmVjdChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjaGFyICpkc3QpCnsKCXU4IGJzc2lkW0VUSF9BTEVOXTsKCXN0cnVjdCB3cGFfYnNzICpic3M7CgoJaWYgKGh3YWRkcl9hdG9uKGRzdCwgYnNzaWQpKSB7CgkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJJbnZhbGlkIEJTU0lEICclcyciLCBkc3QpOwoJCXJldHVybiAtMTsKCX0KCglic3MgPSB3cGFfYnNzX2dldF9ic3NpZCh3cGFfcywgYnNzaWQpOwoJaWYgKGJzcyA9PSBOVUxMKSB7CgkJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDb3VsZCBub3QgZmluZCBCU1MgIiBNQUNTVFIsCgkJCSAgIE1BQzJTVFIoYnNzaWQpKTsKCQlyZXR1cm4gLTE7Cgl9CgoJcmV0dXJuIGludGVyd29ya2luZ19jb25uZWN0KHdwYV9zLCBic3MpOwp9CgoKc3RhdGljIGludCBnZXRfYW5xcChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjaGFyICpkc3QpCnsKCXU4IGRzdF9hZGRyW0VUSF9BTEVOXTsKCWludCB1c2VkOwoJY2hhciAqcG9zOwojZGVmaW5lIE1BWF9BTlFQX0lORk9fSUQgMTAwCgl1MTYgaWRbTUFYX0FOUVBfSU5GT19JRF07CglzaXplX3QgbnVtX2lkID0gMDsKCgl1c2VkID0gaHdhZGRyX2F0b24yKGRzdCwgZHN0X2FkZHIpOwoJaWYgKHVzZWQgPCAwKQoJCXJldHVybiAtMTsKCXBvcyA9IGRzdCArIHVzZWQ7Cgl3aGlsZSAobnVtX2lkIDwgTUFYX0FOUVBfSU5GT19JRCkgewoJCWlkW251bV9pZF0gPSBhdG9pKHBvcyk7CgkJaWYgKGlkW251bV9pZF0pCgkJCW51bV9pZCsrOwoJCXBvcyA9IG9zX3N0cmNocihwb3MgKyAxLCAnLCcpOwoJCWlmIChwb3MgPT0gTlVMTCkKCQkJYnJlYWs7CgkJcG9zKys7Cgl9CgoJaWYgKG51bV9pZCA9PSAwKQoJCXJldHVybiAtMTsKCglyZXR1cm4gYW5xcF9zZW5kX3JlcSh3cGFfcywgZHN0X2FkZHIsIGlkLCBudW1faWQpOwp9CgoKc3RhdGljIGludCBnYXNfcmVxdWVzdChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjaGFyICpjbWQpCnsKCXU4IGRzdF9hZGRyW0VUSF9BTEVOXTsKCXN0cnVjdCB3cGFidWYgKmFkdnByb3RvLCAqcXVlcnkgPSBOVUxMOwoJaW50IHVzZWQsIHJldCA9IC0xOwoJY2hhciAqcG9zLCAqZW5kOwoJc2l6ZV90IGxlbjsKCgl1c2VkID0gaHdhZGRyX2F0b24yKGNtZCwgZHN0X2FkZHIpOwoJaWYgKHVzZWQgPCAwKQoJCXJldHVybiAtMTsKCglwb3MgPSBjbWQgKyB1c2VkOwoJd2hpbGUgKCpwb3MgPT0gJyAnKQoJCXBvcysrOwoKCS8qIEFkdmVydGlzZW1lbnQgUHJvdG9jb2wgSUQgKi8KCWVuZCA9IG9zX3N0cmNocihwb3MsICcgJyk7CglpZiAoZW5kKQoJCWxlbiA9IGVuZCAtIHBvczsKCWVsc2UKCQlsZW4gPSBvc19zdHJsZW4ocG9zKTsKCWlmIChsZW4gJiAweDAxKQoJCXJldHVybiAtMTsKCWxlbiAvPSAyOwoJaWYgKGxlbiA9PSAwKQoJCXJldHVybiAtMTsKCWFkdnByb3RvID0gd3BhYnVmX2FsbG9jKGxlbik7CglpZiAoYWR2cHJvdG8gPT0gTlVMTCkKCQlyZXR1cm4gLTE7CglpZiAoaGV4c3RyMmJpbihwb3MsIHdwYWJ1Zl9wdXQoYWR2cHJvdG8sIGxlbiksIGxlbikgPCAwKQoJCWdvdG8gZmFpbDsKCglpZiAoZW5kKSB7CgkJLyogT3B0aW9uYWwgUXVlcnkgUmVxdWVzdCAqLwoJCXBvcyA9IGVuZCArIDE7CgkJd2hpbGUgKCpwb3MgPT0gJyAnKQoJCQlwb3MrKzsKCgkJbGVuID0gb3Nfc3RybGVuKHBvcyk7CgkJaWYgKGxlbikgewoJCQlpZiAobGVuICYgMHgwMSkKCQkJCWdvdG8gZmFpbDsKCQkJbGVuIC89IDI7CgkJCWlmIChsZW4gPT0gMCkKCQkJCWdvdG8gZmFpbDsKCQkJcXVlcnkgPSB3cGFidWZfYWxsb2MobGVuKTsKCQkJaWYgKHF1ZXJ5ID09IE5VTEwpCgkJCQlnb3RvIGZhaWw7CgkJCWlmIChoZXhzdHIyYmluKHBvcywgd3BhYnVmX3B1dChxdWVyeSwgbGVuKSwgbGVuKSA8IDApCgkJCQlnb3RvIGZhaWw7CgkJfQoJfQoKCXJldCA9IGdhc19zZW5kX3JlcXVlc3Qod3BhX3MsIGRzdF9hZGRyLCBhZHZwcm90bywgcXVlcnkpOwoKZmFpbDoKCXdwYWJ1Zl9mcmVlKGFkdnByb3RvKTsKCXdwYWJ1Zl9mcmVlKHF1ZXJ5KTsKCglyZXR1cm4gcmV0Owp9CgoKc3RhdGljIGludCBnYXNfcmVzcG9uc2VfZ2V0KHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGNoYXIgKmNtZCwgY2hhciAqYnVmLAoJCQkgICAgc2l6ZV90IGJ1ZmxlbikKewoJdTggYWRkcltFVEhfQUxFTl07CglpbnQgZGlhbG9nX3Rva2VuOwoJaW50IHVzZWQ7CgljaGFyICpwb3M7CglzaXplX3QgcmVzcF9sZW4sIHN0YXJ0LCByZXF1ZXN0ZWRfbGVuOwoKCWlmICghd3BhX3MtPmxhc3RfZ2FzX3Jlc3ApCgkJcmV0dXJuIC0xOwoKCXVzZWQgPSBod2FkZHJfYXRvbjIoY21kLCBhZGRyKTsKCWlmICh1c2VkIDwgMCkKCQlyZXR1cm4gLTE7CgoJcG9zID0gY21kICsgdXNlZDsKCXdoaWxlICgqcG9zID09ICcgJykKCQlwb3MrKzsKCWRpYWxvZ190b2tlbiA9IGF0b2kocG9zKTsKCglpZiAob3NfbWVtY21wKGFkZHIsIHdwYV9zLT5sYXN0X2dhc19hZGRyLCBFVEhfQUxFTikgIT0gMCB8fAoJICAgIGRpYWxvZ190b2tlbiAhPSB3cGFfcy0+bGFzdF9nYXNfZGlhbG9nX3Rva2VuKQoJCXJldHVybiAtMTsKCglyZXNwX2xlbiA9IHdwYWJ1Zl9sZW4od3BhX3MtPmxhc3RfZ2FzX3Jlc3ApOwoJc3RhcnQgPSAwOwoJcmVxdWVzdGVkX2xlbiA9IHJlc3BfbGVuOwoKCXBvcyA9IG9zX3N0cmNocihwb3MsICcgJyk7CglpZiAocG9zKSB7CgkJc3RhcnQgPSBhdG9pKHBvcyk7CgkJaWYgKHN0YXJ0ID4gcmVzcF9sZW4pCgkJCXJldHVybiBvc19zbnByaW50ZihidWYsIGJ1ZmxlbiwgIkZBSUwtSW52YWxpZCByYW5nZSIpOwoJCXBvcyA9IG9zX3N0cmNocihwb3MsICcsJyk7CgkJaWYgKHBvcyA9PSBOVUxMKQoJCQlyZXR1cm4gLTE7CgkJcG9zKys7CgkJcmVxdWVzdGVkX2xlbiA9IGF0b2kocG9zKTsKCQlpZiAoc3RhcnQgKyByZXF1ZXN0ZWRfbGVuID4gcmVzcF9sZW4pCgkJCXJldHVybiBvc19zbnByaW50ZihidWYsIGJ1ZmxlbiwgIkZBSUwtSW52YWxpZCByYW5nZSIpOwoJfQoKCWlmIChyZXF1ZXN0ZWRfbGVuICogMiArIDEgPiBidWZsZW4pCgkJcmV0dXJuIG9zX3NucHJpbnRmKGJ1ZiwgYnVmbGVuLCAiRkFJTC1Ub28gbG9uZyByZXNwb25zZSIpOwoKCXJldHVybiB3cGFfc25wcmludGZfaGV4KGJ1ZiwgYnVmbGVuLAoJCQkJd3BhYnVmX2hlYWRfdTgod3BhX3MtPmxhc3RfZ2FzX3Jlc3ApICsgc3RhcnQsCgkJCQlyZXF1ZXN0ZWRfbGVuKTsKfQojZW5kaWYgLyogQ09ORklHX0lOVEVSV09SS0lORyAqLwoKCiNpZmRlZiBDT05GSUdfSFMyMAoKc3RhdGljIGludCBnZXRfaHMyMF9hbnFwKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGNoYXIgKmRzdCkKewoJdTggZHN0X2FkZHJbRVRIX0FMRU5dOwoJaW50IHVzZWQ7CgljaGFyICpwb3M7Cgl1MzIgc3VidHlwZXMgPSAwOwoKCXVzZWQgPSBod2FkZHJfYXRvbjIoZHN0LCBkc3RfYWRkcik7CglpZiAodXNlZCA8IDApCgkJcmV0dXJuIC0xOwoJcG9zID0gZHN0ICsgdXNlZDsKCWZvciAoOzspIHsKCQlpbnQgbnVtID0gYXRvaShwb3MpOwoJCWlmIChudW0gPD0gMCB8fCBudW0gPiAzMSkKCQkJcmV0dXJuIC0xOwoJCXN1YnR5cGVzIHw9IEJJVChudW0pOwoJCXBvcyA9IG9zX3N0cmNocihwb3MgKyAxLCAnLCcpOwoJCWlmIChwb3MgPT0gTlVMTCkKCQkJYnJlYWs7CgkJcG9zKys7Cgl9CgoJaWYgKHN1YnR5cGVzID09IDApCgkJcmV0dXJuIC0xOwoKCXJldHVybiBoczIwX2FucXBfc2VuZF9yZXEod3BhX3MsIGRzdF9hZGRyLCBzdWJ0eXBlcywgTlVMTCwgMCk7Cn0KCgpzdGF0aWMgaW50IGhzMjBfbmFpX2hvbWVfcmVhbG1fbGlzdChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLAoJCQkJICAgIGNvbnN0IHU4ICphZGRyLCBjb25zdCBjaGFyICpyZWFsbSkKewoJdTggKmJ1ZjsKCXNpemVfdCBybGVuLCBsZW47CglpbnQgcmV0OwoKCXJsZW4gPSBvc19zdHJsZW4ocmVhbG0pOwoJbGVuID0gMyArIHJsZW47CglidWYgPSBvc19tYWxsb2MobGVuKTsKCWlmIChidWYgPT0gTlVMTCkKCQlyZXR1cm4gLTE7CglidWZbMF0gPSAxOyAvKiBOQUkgSG9tZSBSZWFsbSBDb3VudCAqLwoJYnVmWzFdID0gMDsgLyogRm9ybWF0dGVkIGluIGFjY29yZGFuY2Ugd2l0aCBSRkMgNDI4MiAqLwoJYnVmWzJdID0gcmxlbjsKCW9zX21lbWNweShidWYgKyAzLCByZWFsbSwgcmxlbik7CgoJcmV0ID0gaHMyMF9hbnFwX3NlbmRfcmVxKHdwYV9zLCBhZGRyLAoJCQkJIEJJVChIUzIwX1NUWVBFX05BSV9IT01FX1JFQUxNX1FVRVJZKSwKCQkJCSBidWYsIGxlbik7CgoJb3NfZnJlZShidWYpOwoKCXJldHVybiByZXQ7Cn0KCgpzdGF0aWMgaW50IGhzMjBfZ2V0X25haV9ob21lX3JlYWxtX2xpc3Qoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKCQkJCQljaGFyICpkc3QpCnsKCXN0cnVjdCB3cGFfY3JlZCAqY3JlZCA9IHdwYV9zLT5jb25mLT5jcmVkOwoJdTggZHN0X2FkZHJbRVRIX0FMRU5dOwoJaW50IHVzZWQ7Cgl1OCAqYnVmOwoJc2l6ZV90IGxlbjsKCWludCByZXQ7CgoJdXNlZCA9IGh3YWRkcl9hdG9uMihkc3QsIGRzdF9hZGRyKTsKCWlmICh1c2VkIDwgMCkKCQlyZXR1cm4gLTE7CgoJd2hpbGUgKGRzdFt1c2VkXSA9PSAnICcpCgkJdXNlZCsrOwoJaWYgKG9zX3N0cm5jbXAoZHN0ICsgdXNlZCwgInJlYWxtPSIsIDYpID09IDApCgkJcmV0dXJuIGhzMjBfbmFpX2hvbWVfcmVhbG1fbGlzdCh3cGFfcywgZHN0X2FkZHIsCgkJCQkJCWRzdCArIHVzZWQgKyA2KTsKCglsZW4gPSBvc19zdHJsZW4oZHN0ICsgdXNlZCk7CgoJaWYgKGxlbiA9PSAwICYmIGNyZWQgJiYgY3JlZC0+cmVhbG0pCgkJcmV0dXJuIGhzMjBfbmFpX2hvbWVfcmVhbG1fbGlzdCh3cGFfcywgZHN0X2FkZHIsIGNyZWQtPnJlYWxtKTsKCglpZiAobGVuICUgMSkKCQlyZXR1cm4gLTE7CglsZW4gLz0gMjsKCWJ1ZiA9IG9zX21hbGxvYyhsZW4pOwoJaWYgKGJ1ZiA9PSBOVUxMKQoJCXJldHVybiAtMTsKCWlmIChoZXhzdHIyYmluKGRzdCArIHVzZWQsIGJ1ZiwgbGVuKSA8IDApIHsKCQlvc19mcmVlKGJ1Zik7CgkJcmV0dXJuIC0xOwoJfQoKCXJldCA9IGhzMjBfYW5xcF9zZW5kX3JlcSh3cGFfcywgZHN0X2FkZHIsCgkJCQkgQklUKEhTMjBfU1RZUEVfTkFJX0hPTUVfUkVBTE1fUVVFUlkpLAoJCQkJIGJ1ZiwgbGVuKTsKCW9zX2ZyZWUoYnVmKTsKCglyZXR1cm4gcmV0Owp9CgojZW5kaWYgLyogQ09ORklHX0hTMjAgKi8KCgpzdGF0aWMgaW50IHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2Vfc3RhX2F1dG9jb25uZWN0KAoJc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY2hhciAqY21kKQp7Cgl3cGFfcy0+YXV0b19yZWNvbm5lY3RfZGlzYWJsZWQgPSBhdG9pKGNtZCkgPT0gMCA/IDEgOiAwOwoJcmV0dXJuIDA7Cn0KCgojaWZkZWYgQ09ORklHX0FVVE9TQ0FOCgpzdGF0aWMgaW50IHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2VfYXV0b3NjYW4oc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKCQkJCQkgICAgICBjaGFyICpjbWQpCnsKCWVudW0gd3BhX3N0YXRlcyBzdGF0ZSA9IHdwYV9zLT53cGFfc3RhdGU7CgljaGFyICpuZXdfcGFyYW1zID0gTlVMTDsKCglpZiAob3Nfc3RybGVuKGNtZCkgPiAwKSB7CgkJbmV3X3BhcmFtcyA9IG9zX3N0cmR1cChjbWQpOwoJCWlmIChuZXdfcGFyYW1zID09IE5VTEwpCgkJCXJldHVybiAtMTsKCX0KCglvc19mcmVlKHdwYV9zLT5jb25mLT5hdXRvc2Nhbik7Cgl3cGFfcy0+Y29uZi0+YXV0b3NjYW4gPSBuZXdfcGFyYW1zOwoKCWlmICh3cGFfcy0+Y29uZi0+YXV0b3NjYW4gPT0gTlVMTCkKCQlhdXRvc2Nhbl9kZWluaXQod3BhX3MpOwoJZWxzZSBpZiAoc3RhdGUgPT0gV1BBX0RJU0NPTk5FQ1RFRCB8fCBzdGF0ZSA9PSBXUEFfSU5BQ1RJVkUpCgkJYXV0b3NjYW5faW5pdCh3cGFfcywgMSk7CgllbHNlIGlmIChzdGF0ZSA9PSBXUEFfU0NBTk5JTkcpCgkJd3BhX3N1cHBsaWNhbnRfcmVpbml0X2F1dG9zY2FuKHdwYV9zKTsKCglyZXR1cm4gMDsKfQoKI2VuZGlmIC8qIENPTkZJR19BVVRPU0NBTiAqLwoKCiNpZmRlZiBDT05GSUdfV05NCgpzdGF0aWMgaW50IHdwYXNfY3RybF9pZmFjZV93bm1fc2xlZXAoc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywgY2hhciAqY21kKQp7CglpbnQgZW50ZXI7CglpbnQgaW50dmFsID0gMDsKCWNoYXIgKnBvczsKCWludCByZXQ7CglzdHJ1Y3Qgd3BhYnVmICp0ZnNfcmVxID0gTlVMTDsKCglpZiAob3Nfc3RybmNtcChjbWQsICJlbnRlciIsIDUpID09IDApCgkJZW50ZXIgPSAxOwoJZWxzZSBpZiAob3Nfc3RybmNtcChjbWQsICJleGl0IiwgNCkgPT0gMCkKCQllbnRlciA9IDA7CgllbHNlCgkJcmV0dXJuIC0xOwoKCXBvcyA9IG9zX3N0cnN0cihjbWQsICIgaW50ZXJ2YWw9Iik7CglpZiAocG9zKQoJCWludHZhbCA9IGF0b2kocG9zICsgMTApOwoKCXBvcyA9IG9zX3N0cnN0cihjbWQsICIgdGZzX3JlcT0iKTsKCWlmIChwb3MpIHsKCQljaGFyICplbmQ7CgkJc2l6ZV90IGxlbjsKCQlwb3MgKz0gOTsKCQllbmQgPSBvc19zdHJjaHIocG9zLCAnICcpOwoJCWlmIChlbmQpCgkJCWxlbiA9IGVuZCAtIHBvczsKCQllbHNlCgkJCWxlbiA9IG9zX3N0cmxlbihwb3MpOwoJCWlmIChsZW4gJiAxKQoJCQlyZXR1cm4gLTE7CgkJbGVuIC89IDI7CgkJdGZzX3JlcSA9IHdwYWJ1Zl9hbGxvYyhsZW4pOwoJCWlmICh0ZnNfcmVxID09IE5VTEwpCgkJCXJldHVybiAtMTsKCQlpZiAoaGV4c3RyMmJpbihwb3MsIHdwYWJ1Zl9wdXQodGZzX3JlcSwgbGVuKSwgbGVuKSA8IDApIHsKCQkJd3BhYnVmX2ZyZWUodGZzX3JlcSk7CgkJCXJldHVybiAtMTsKCQl9Cgl9CgoJcmV0ID0gaWVlZTgwMl8xMV9zZW5kX3dubXNsZWVwX3JlcSh3cGFfcywgZW50ZXIgPyBXTk1fU0xFRVBfTU9ERV9FTlRFUiA6CgkJCQkJICAgV05NX1NMRUVQX01PREVfRVhJVCwgaW50dmFsLAoJCQkJCSAgIHRmc19yZXEpOwoJd3BhYnVmX2ZyZWUodGZzX3JlcSk7CgoJcmV0dXJuIHJldDsKfQoKI2VuZGlmIC8qIENPTkZJR19XTk0gKi8KCgpzdGF0aWMgaW50IHdwYV9zdXBwbGljYW50X3NpZ25hbF9wb2xsKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGNoYXIgKmJ1ZiwKCQkJCSAgICAgIHNpemVfdCBidWZsZW4pCnsKCXN0cnVjdCB3cGFfc2lnbmFsX2luZm8gc2k7CglpbnQgcmV0OwoKCXJldCA9IHdwYV9kcnZfc2lnbmFsX3BvbGwod3BhX3MsICZzaSk7CglpZiAocmV0KQoJCXJldHVybiAtMTsKCglyZXQgPSBvc19zbnByaW50ZihidWYsIGJ1ZmxlbiwgIlJTU0k9JWRcbkxJTktTUEVFRD0lZFxuIgoJCQkgICJOT0lTRT0lZFxuRlJFUVVFTkNZPSV1XG4iLAoJCQkgIHNpLmN1cnJlbnRfc2lnbmFsLCBzaS5jdXJyZW50X3R4cmF0ZSAvIDEwMDAsCgkJCSAgc2kuY3VycmVudF9ub2lzZSwgc2kuZnJlcXVlbmN5KTsKCWlmIChyZXQgPCAwIHx8ICh1bnNpZ25lZCBpbnQpIHJldCA+IGJ1ZmxlbikKCQlyZXR1cm4gLTE7CglyZXR1cm4gcmV0Owp9CgoKc3RhdGljIGludCB3cGFfc3VwcGxpY2FudF9wa3RjbnRfcG9sbChzdHJ1Y3Qgd3BhX3N1cHBsaWNhbnQgKndwYV9zLCBjaGFyICpidWYsCgkJCQkgICAgICBzaXplX3QgYnVmbGVuKQp7CglzdHJ1Y3QgaG9zdGFwX3N0YV9kcml2ZXJfZGF0YSBzdGE7CglpbnQgcmV0OwoKCXJldCA9IHdwYV9kcnZfcGt0Y250X3BvbGwod3BhX3MsICZzdGEpOwoJaWYgKHJldCkKCQlyZXR1cm4gLTE7CgoJcmV0ID0gb3Nfc25wcmludGYoYnVmLCBidWZsZW4sICJUWEdPT0Q9JWx1XG5UWEJBRD0lbHVcblJYR09PRD0lbHVcbiIsCgkJCSAgc3RhLnR4X3BhY2tldHMsIHN0YS50eF9yZXRyeV9mYWlsZWQsIHN0YS5yeF9wYWNrZXRzKTsKCWlmIChyZXQgPCAwIHx8IChzaXplX3QpIHJldCA+IGJ1ZmxlbikKCQlyZXR1cm4gLTE7CglyZXR1cm4gcmV0Owp9CgoKI2lmZGVmIEFORFJPSUQKc3RhdGljIGludCB3cGFfc3VwcGxpY2FudF9kcml2ZXJfY21kKHN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3MsIGNoYXIgKmNtZCwKCQkJCSAgICAgY2hhciAqYnVmLCBzaXplX3QgYnVmbGVuKQp7CglpbnQgcmV0OwoKCXJldCA9IHdwYV9kcnZfZHJpdmVyX2NtZCh3cGFfcywgY21kLCBidWYsIGJ1Zmxlbik7CglpZiAocmV0ID09IDApCgkJcmV0ID0gc3ByaW50ZihidWYsICIlc1xuIiwgIk9LIik7CglyZXR1cm4gcmV0Owp9CiNlbmRpZgoKCmNoYXIgKiB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3Byb2Nlc3Moc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfcywKCQkJCQkgY2hhciAqYnVmLCBzaXplX3QgKnJlc3BfbGVuKQp7CgljaGFyICpyZXBseTsKCWNvbnN0IGludCByZXBseV9zaXplID0gNDA5NjsKCWludCBjdHJsX3JzcCA9IDA7CglpbnQgcmVwbHlfbGVuOwoKCWlmIChvc19zdHJuY21wKGJ1ZiwgV1BBX0NUUkxfUlNQLCBvc19zdHJsZW4oV1BBX0NUUkxfUlNQKSkgPT0gMCB8fAoJICAgIG9zX3N0cm5jbXAoYnVmLCAiU0VUX05FVFdPUksgIiwgMTIpID09IDAgfHwKCSAgICBvc19zdHJuY21wKGJ1ZiwgIldQU19ORkNfVEFHX1JFQUQiLCAxNikgPT0gMCB8fAoJICAgIG9zX3N0cm5jbXAoYnVmLCAiTkZDX1JFUE9SVF9IQU5ET1ZFUiIsIDE5KSA9PSAwIHx8CgkgICAgb3Nfc3RybmNtcChidWYsICJORkNfUlhfSEFORE9WRVJfU0VMIiwgMTkpID09IDApIHsKCQl3cGFfaGV4ZHVtcF9hc2NpaV9rZXkoTVNHX0RFQlVHLCAiUlggY3RybF9pZmFjZSIsCgkJCQkgICAgICAoY29uc3QgdTggKikgYnVmLCBvc19zdHJsZW4oYnVmKSk7Cgl9IGVsc2UgewoJCWludCBsZXZlbCA9IE1TR19ERUJVRzsKCQlpZiAob3Nfc3RyY21wKGJ1ZiwgIlBJTkciKSA9PSAwKQoJCQlsZXZlbCA9IE1TR19FWENFU1NJVkU7CgkJd3BhX2hleGR1bXBfYXNjaWkobGV2ZWwsICJSWCBjdHJsX2lmYWNlIiwKCQkJCSAgKGNvbnN0IHU4ICopIGJ1Ziwgb3Nfc3RybGVuKGJ1ZikpOwoJCXdwYV9kYmcod3BhX3MsIGxldmVsLCAiQ29udHJvbCBpbnRlcmZhY2UgY29tbWFuZCAnJXMnIiwgYnVmKTsKCX0KCglyZXBseSA9IG9zX21hbGxvYyhyZXBseV9zaXplKTsKCWlmIChyZXBseSA9PSBOVUxMKSB7CgkJKnJlc3BfbGVuID0gMTsKCQlyZXR1cm4gTlVMTDsKCX0KCglvc19tZW1jcHkocmVwbHksICJPS1xuIiwgMyk7CglyZXBseV9sZW4gPSAzOwoKCWlmIChvc19zdHJjbXAoYnVmLCAiUElORyIpID09IDApIHsKCQlvc19tZW1jcHkocmVwbHksICJQT05HXG4iLCA1KTsKCQlyZXBseV9sZW4gPSA1OwoJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAiSUZOQU1FIikgPT0gMCkgewoJCXJlcGx5X2xlbiA9IG9zX3N0cmxlbih3cGFfcy0+aWZuYW1lKTsKCQlvc19tZW1jcHkocmVwbHksIHdwYV9zLT5pZm5hbWUsIHJlcGx5X2xlbik7Cgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiUkVMT0ciLCA1KSA9PSAwKSB7CgkJaWYgKHdwYV9kZWJ1Z19yZW9wZW5fZmlsZSgpIDwgMCkKCQkJcmVwbHlfbGVuID0gLTE7Cgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiTk9URSAiLCA1KSA9PSAwKSB7CgkJd3BhX3ByaW50ZihNU0dfSU5GTywgIk5PVEU6ICVzIiwgYnVmICsgNSk7Cgl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJNSUIiKSA9PSAwKSB7CgkJcmVwbHlfbGVuID0gd3BhX3NtX2dldF9taWIod3BhX3MtPndwYSwgcmVwbHksIHJlcGx5X3NpemUpOwoJCWlmIChyZXBseV9sZW4gPj0gMCkgewoJCQlpbnQgcmVzOwoJCQlyZXMgPSBlYXBvbF9zbV9nZXRfbWliKHdwYV9zLT5lYXBvbCwgcmVwbHkgKyByZXBseV9sZW4sCgkJCQkJICAgICAgIHJlcGx5X3NpemUgLSByZXBseV9sZW4pOwoJCQlpZiAocmVzIDwgMCkKCQkJCXJlcGx5X2xlbiA9IC0xOwoJCQllbHNlCgkJCQlyZXBseV9sZW4gKz0gcmVzOwoJCX0KCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJTVEFUVVMiLCA2KSA9PSAwKSB7CgkJcmVwbHlfbGVuID0gd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV9zdGF0dXMoCgkJCXdwYV9zLCBidWYgKyA2LCByZXBseSwgcmVwbHlfc2l6ZSk7Cgl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJQTUtTQSIpID09IDApIHsKCQlyZXBseV9sZW4gPSB3cGFfc21fcG1rc2FfY2FjaGVfbGlzdCh3cGFfcy0+d3BhLCByZXBseSwKCQkJCQkJICAgIHJlcGx5X3NpemUpOwoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIlNFVCAiLCA0KSA9PSAwKSB7CgkJaWYgKHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2Vfc2V0KHdwYV9zLCBidWYgKyA0KSkKCQkJcmVwbHlfbGVuID0gLTE7Cgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiR0VUICIsIDQpID09IDApIHsKCQlyZXBseV9sZW4gPSB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX2dldCh3cGFfcywgYnVmICsgNCwKCQkJCQkJCSAgcmVwbHksIHJlcGx5X3NpemUpOwoJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAiTE9HT04iKSA9PSAwKSB7CgkJZWFwb2xfc21fbm90aWZ5X2xvZ29mZih3cGFfcy0+ZWFwb2wsIEZBTFNFKTsKCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgIkxPR09GRiIpID09IDApIHsKCQllYXBvbF9zbV9ub3RpZnlfbG9nb2ZmKHdwYV9zLT5lYXBvbCwgVFJVRSk7Cgl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJSRUFTU09DSUFURSIpID09IDApIHsKCQlpZiAod3BhX3MtPndwYV9zdGF0ZSA9PSBXUEFfSU5URVJGQUNFX0RJU0FCTEVEKQoJCQlyZXBseV9sZW4gPSAtMTsKCQllbHNlCgkJCXdwYXNfcmVxdWVzdF9jb25uZWN0aW9uKHdwYV9zKTsKCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgIlJFQ09OTkVDVCIpID09IDApIHsKCQlpZiAod3BhX3MtPndwYV9zdGF0ZSA9PSBXUEFfSU5URVJGQUNFX0RJU0FCTEVEKQoJCQlyZXBseV9sZW4gPSAtMTsKCQllbHNlIGlmICh3cGFfcy0+ZGlzY29ubmVjdGVkKQoJCQl3cGFzX3JlcXVlc3RfY29ubmVjdGlvbih3cGFfcyk7CiNpZmRlZiBJRUVFODAyMVhfRUFQT0wKCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJQUkVBVVRIICIsIDgpID09IDApIHsKCQlpZiAod3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV9wcmVhdXRoKHdwYV9zLCBidWYgKyA4KSkKCQkJcmVwbHlfbGVuID0gLTE7CiNlbmRpZiAvKiBJRUVFODAyMVhfRUFQT0wgKi8KI2lmZGVmIENPTkZJR19QRUVSS0VZCgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiU1RLU1RBUlQgIiwgOSkgPT0gMCkgewoJCWlmICh3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3N0a3N0YXJ0KHdwYV9zLCBidWYgKyA5KSkKCQkJcmVwbHlfbGVuID0gLTE7CiNlbmRpZiAvKiBDT05GSUdfUEVFUktFWSAqLwojaWZkZWYgQ09ORklHX0lFRUU4MDIxMVIKCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJGVF9EUyAiLCA2KSA9PSAwKSB7CgkJaWYgKHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2VfZnRfZHMod3BhX3MsIGJ1ZiArIDYpKQoJCQlyZXBseV9sZW4gPSAtMTsKI2VuZGlmIC8qIENPTkZJR19JRUVFODAyMTFSICovCiNpZmRlZiBDT05GSUdfV1BTCgl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJXUFNfUEJDIikgPT0gMCkgewoJCWludCByZXMgPSB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3dwc19wYmMod3BhX3MsIE5VTEwpOwoJCWlmIChyZXMgPT0gLTIpIHsKCQkJb3NfbWVtY3B5KHJlcGx5LCAiRkFJTC1QQkMtT1ZFUkxBUFxuIiwgMTcpOwoJCQlyZXBseV9sZW4gPSAxNzsKCQl9IGVsc2UgaWYgKHJlcykKCQkJcmVwbHlfbGVuID0gLTE7Cgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiV1BTX1BCQyAiLCA4KSA9PSAwKSB7CgkJaW50IHJlcyA9IHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2Vfd3BzX3BiYyh3cGFfcywgYnVmICsgOCk7CgkJaWYgKHJlcyA9PSAtMikgewoJCQlvc19tZW1jcHkocmVwbHksICJGQUlMLVBCQy1PVkVSTEFQXG4iLCAxNyk7CgkJCXJlcGx5X2xlbiA9IDE3OwoJCX0gZWxzZSBpZiAocmVzKQoJCQlyZXBseV9sZW4gPSAtMTsKCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJXUFNfUElOICIsIDgpID09IDApIHsKCQlyZXBseV9sZW4gPSB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3dwc19waW4od3BhX3MsIGJ1ZiArIDgsCgkJCQkJCQkgICAgICByZXBseSwKCQkJCQkJCSAgICAgIHJlcGx5X3NpemUpOwoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIldQU19DSEVDS19QSU4gIiwgMTQpID09IDApIHsKCQlyZXBseV9sZW4gPSB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3dwc19jaGVja19waW4oCgkJCXdwYV9zLCBidWYgKyAxNCwgcmVwbHksIHJlcGx5X3NpemUpOwoJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAiV1BTX0NBTkNFTCIpID09IDApIHsKCQlpZiAod3Bhc193cHNfY2FuY2VsKHdwYV9zKSkKCQkJcmVwbHlfbGVuID0gLTE7CiNpZmRlZiBDT05GSUdfV1BTX05GQwoJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAiV1BTX05GQyIpID09IDApIHsKCQlpZiAod3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV93cHNfbmZjKHdwYV9zLCBOVUxMKSkKCQkJcmVwbHlfbGVuID0gLTE7Cgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiV1BTX05GQyAiLCA4KSA9PSAwKSB7CgkJaWYgKHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2Vfd3BzX25mYyh3cGFfcywgYnVmICsgOCkpCgkJCXJlcGx5X2xlbiA9IC0xOwoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIldQU19ORkNfQ09ORklHX1RPS0VOICIsIDIxKSA9PSAwKSB7CgkJcmVwbHlfbGVuID0gd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV93cHNfbmZjX2NvbmZpZ190b2tlbigKCQkJd3BhX3MsIGJ1ZiArIDIxLCByZXBseSwgcmVwbHlfc2l6ZSk7Cgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiV1BTX05GQ19UT0tFTiAiLCAxNCkgPT0gMCkgewoJCXJlcGx5X2xlbiA9IHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2Vfd3BzX25mY190b2tlbigKCQkJd3BhX3MsIGJ1ZiArIDE0LCByZXBseSwgcmVwbHlfc2l6ZSk7Cgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiV1BTX05GQ19UQUdfUkVBRCAiLCAxNykgPT0gMCkgewoJCWlmICh3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3dwc19uZmNfdGFnX3JlYWQod3BhX3MsCgkJCQkJCQkgICAgICAgYnVmICsgMTcpKQoJCQlyZXBseV9sZW4gPSAtMTsKCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJORkNfR0VUX0hBTkRPVkVSX1JFUSAiLCAyMSkgPT0gMCkgewoJCXJlcGx5X2xlbiA9IHdwYXNfY3RybF9uZmNfZ2V0X2hhbmRvdmVyX3JlcSgKCQkJd3BhX3MsIGJ1ZiArIDIxLCByZXBseSwgcmVwbHlfc2l6ZSk7Cgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiTkZDX0dFVF9IQU5ET1ZFUl9TRUwgIiwgMjEpID09IDApIHsKCQlyZXBseV9sZW4gPSB3cGFzX2N0cmxfbmZjX2dldF9oYW5kb3Zlcl9zZWwoCgkJCXdwYV9zLCBidWYgKyAyMSwgcmVwbHksIHJlcGx5X3NpemUpOwoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIk5GQ19SWF9IQU5ET1ZFUl9SRVEgIiwgMjApID09IDApIHsKCQlyZXBseV9sZW4gPSB3cGFzX2N0cmxfbmZjX3J4X2hhbmRvdmVyX3JlcSgKCQkJd3BhX3MsIGJ1ZiArIDIwLCByZXBseSwgcmVwbHlfc2l6ZSk7Cgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiTkZDX1JYX0hBTkRPVkVSX1NFTCAiLCAyMCkgPT0gMCkgewoJCWlmICh3cGFzX2N0cmxfbmZjX3J4X2hhbmRvdmVyX3NlbCh3cGFfcywgYnVmICsgMjApKQoJCQlyZXBseV9sZW4gPSAtMTsKCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJORkNfUkVQT1JUX0hBTkRPVkVSICIsIDIwKSA9PSAwKSB7CgkJaWYgKHdwYXNfY3RybF9uZmNfcmVwb3J0X2hhbmRvdmVyKHdwYV9zLCBidWYgKyAyMCkpCgkJCXJlcGx5X2xlbiA9IC0xOwojZW5kaWYgLyogQ09ORklHX1dQU19ORkMgKi8KCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJXUFNfUkVHICIsIDgpID09IDApIHsKCQlpZiAod3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV93cHNfcmVnKHdwYV9zLCBidWYgKyA4KSkKCQkJcmVwbHlfbGVuID0gLTE7CiNpZmRlZiBDT05GSUdfQVAKCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJXUFNfQVBfUElOICIsIDExKSA9PSAwKSB7CgkJcmVwbHlfbGVuID0gd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV93cHNfYXBfcGluKAoJCQl3cGFfcywgYnVmICsgMTEsIHJlcGx5LCByZXBseV9zaXplKTsKI2VuZGlmIC8qIENPTkZJR19BUCAqLwojaWZkZWYgQ09ORklHX1dQU19FUgoJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAiV1BTX0VSX1NUQVJUIikgPT0gMCkgewoJCWlmICh3cGFzX3dwc19lcl9zdGFydCh3cGFfcywgTlVMTCkpCgkJCXJlcGx5X2xlbiA9IC0xOwoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIldQU19FUl9TVEFSVCAiLCAxMykgPT0gMCkgewoJCWlmICh3cGFzX3dwc19lcl9zdGFydCh3cGFfcywgYnVmICsgMTMpKQoJCQlyZXBseV9sZW4gPSAtMTsKCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgIldQU19FUl9TVE9QIikgPT0gMCkgewoJCWlmICh3cGFzX3dwc19lcl9zdG9wKHdwYV9zKSkKCQkJcmVwbHlfbGVuID0gLTE7Cgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiV1BTX0VSX1BJTiAiLCAxMSkgPT0gMCkgewoJCWlmICh3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3dwc19lcl9waW4od3BhX3MsIGJ1ZiArIDExKSkKCQkJcmVwbHlfbGVuID0gLTE7Cgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiV1BTX0VSX1BCQyAiLCAxMSkgPT0gMCkgewoJCWludCByZXQgPSB3cGFzX3dwc19lcl9wYmMod3BhX3MsIGJ1ZiArIDExKTsKCQlpZiAocmV0ID09IC0yKSB7CgkJCW9zX21lbWNweShyZXBseSwgIkZBSUwtUEJDLU9WRVJMQVBcbiIsIDE3KTsKCQkJcmVwbHlfbGVuID0gMTc7CgkJfSBlbHNlIGlmIChyZXQgPT0gLTMpIHsKCQkJb3NfbWVtY3B5KHJlcGx5LCAiRkFJTC1VTktOT1dOLVVVSURcbiIsIDE4KTsKCQkJcmVwbHlfbGVuID0gMTg7CgkJfSBlbHNlIGlmIChyZXQgPT0gLTQpIHsKCQkJb3NfbWVtY3B5KHJlcGx5LCAiRkFJTC1OTy1BUC1TRVRUSU5HU1xuIiwgMjApOwoJCQlyZXBseV9sZW4gPSAyMDsKCQl9IGVsc2UgaWYgKHJldCkKCQkJcmVwbHlfbGVuID0gLTE7Cgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiV1BTX0VSX0xFQVJOICIsIDEzKSA9PSAwKSB7CgkJaWYgKHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2Vfd3BzX2VyX2xlYXJuKHdwYV9zLCBidWYgKyAxMykpCgkJCXJlcGx5X2xlbiA9IC0xOwoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIldQU19FUl9TRVRfQ09ORklHICIsIDE4KSA9PSAwKSB7CgkJaWYgKHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2Vfd3BzX2VyX3NldF9jb25maWcod3BhX3MsCgkJCQkJCQkJYnVmICsgMTgpKQoJCQlyZXBseV9sZW4gPSAtMTsKCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJXUFNfRVJfQ09ORklHICIsIDE0KSA9PSAwKSB7CgkJaWYgKHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2Vfd3BzX2VyX2NvbmZpZyh3cGFfcywgYnVmICsgMTQpKQoJCQlyZXBseV9sZW4gPSAtMTsKI2lmZGVmIENPTkZJR19XUFNfTkZDCgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiV1BTX0VSX05GQ19DT05GSUdfVE9LRU4gIiwgMjQpID09IDApIHsKCQlyZXBseV9sZW4gPSB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3dwc19lcl9uZmNfY29uZmlnX3Rva2VuKAoJCQl3cGFfcywgYnVmICsgMjQsIHJlcGx5LCByZXBseV9zaXplKTsKI2VuZGlmIC8qIENPTkZJR19XUFNfTkZDICovCiNlbmRpZiAvKiBDT05GSUdfV1BTX0VSICovCiNlbmRpZiAvKiBDT05GSUdfV1BTICovCiNpZmRlZiBDT05GSUdfSUJTU19SU04KCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJJQlNTX1JTTiAiLCA5KSA9PSAwKSB7CgkJaWYgKHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2VfaWJzc19yc24od3BhX3MsIGJ1ZiArIDkpKQoJCQlyZXBseV9sZW4gPSAtMTsKI2VuZGlmIC8qIENPTkZJR19JQlNTX1JTTiAqLwojaWZkZWYgQ09ORklHX1AyUAoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIlAyUF9GSU5EICIsIDkpID09IDApIHsKCQlpZiAocDJwX2N0cmxfZmluZCh3cGFfcywgYnVmICsgOSkpCgkJCXJlcGx5X2xlbiA9IC0xOwoJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAiUDJQX0ZJTkQiKSA9PSAwKSB7CgkJaWYgKHAycF9jdHJsX2ZpbmQod3BhX3MsICIiKSkKCQkJcmVwbHlfbGVuID0gLTE7Cgl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJQMlBfU1RPUF9GSU5EIikgPT0gMCkgewoJCXdwYXNfcDJwX3N0b3BfZmluZCh3cGFfcyk7Cgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiUDJQX0NPTk5FQ1QgIiwgMTIpID09IDApIHsKCQlyZXBseV9sZW4gPSBwMnBfY3RybF9jb25uZWN0KHdwYV9zLCBidWYgKyAxMiwgcmVwbHksCgkJCQkJICAgICByZXBseV9zaXplKTsKCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJQMlBfTElTVEVOICIsIDExKSA9PSAwKSB7CgkJaWYgKHAycF9jdHJsX2xpc3Rlbih3cGFfcywgYnVmICsgMTEpKQoJCQlyZXBseV9sZW4gPSAtMTsKCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgIlAyUF9MSVNURU4iKSA9PSAwKSB7CgkJaWYgKHAycF9jdHJsX2xpc3Rlbih3cGFfcywgIiIpKQoJCQlyZXBseV9sZW4gPSAtMTsKCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJQMlBfR1JPVVBfUkVNT1ZFICIsIDE3KSA9PSAwKSB7CgkJaWYgKHdwYXNfcDJwX2dyb3VwX3JlbW92ZSh3cGFfcywgYnVmICsgMTcpKQoJCQlyZXBseV9sZW4gPSAtMTsKCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgIlAyUF9HUk9VUF9BREQiKSA9PSAwKSB7CgkJaWYgKHdwYXNfcDJwX2dyb3VwX2FkZCh3cGFfcywgMCwgMCwgMCkpCgkJCXJlcGx5X2xlbiA9IC0xOwoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIlAyUF9HUk9VUF9BREQgIiwgMTQpID09IDApIHsKCQlpZiAocDJwX2N0cmxfZ3JvdXBfYWRkKHdwYV9zLCBidWYgKyAxNCkpCgkJCXJlcGx5X2xlbiA9IC0xOwoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIlAyUF9QUk9WX0RJU0MgIiwgMTQpID09IDApIHsKCQlpZiAocDJwX2N0cmxfcHJvdl9kaXNjKHdwYV9zLCBidWYgKyAxNCkpCgkJCXJlcGx5X2xlbiA9IC0xOwoJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAiUDJQX0dFVF9QQVNTUEhSQVNFIikgPT0gMCkgewoJCXJlcGx5X2xlbiA9IHAycF9nZXRfcGFzc3BocmFzZSh3cGFfcywgcmVwbHksIHJlcGx5X3NpemUpOwoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIlAyUF9TRVJWX0RJU0NfUkVRICIsIDE4KSA9PSAwKSB7CgkJcmVwbHlfbGVuID0gcDJwX2N0cmxfc2Vydl9kaXNjX3JlcSh3cGFfcywgYnVmICsgMTgsIHJlcGx5LAoJCQkJCQkgICByZXBseV9zaXplKTsKCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJQMlBfU0VSVl9ESVNDX0NBTkNFTF9SRVEgIiwgMjUpID09IDApIHsKCQlpZiAocDJwX2N0cmxfc2Vydl9kaXNjX2NhbmNlbF9yZXEod3BhX3MsIGJ1ZiArIDI1KSA8IDApCgkJCXJlcGx5X2xlbiA9IC0xOwoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIlAyUF9TRVJWX0RJU0NfUkVTUCAiLCAxOSkgPT0gMCkgewoJCWlmIChwMnBfY3RybF9zZXJ2X2Rpc2NfcmVzcCh3cGFfcywgYnVmICsgMTkpIDwgMCkKCQkJcmVwbHlfbGVuID0gLTE7Cgl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJQMlBfU0VSVklDRV9VUERBVEUiKSA9PSAwKSB7CiNpZmRlZiBBTkRST0lEX1AyUAoJCXdwYXNfcDJwX3NkX3NlcnZpY2VfdXBkYXRlKHdwYV9zLCBTUlZfVVBEQVRFKTsKI2Vsc2UKCQl3cGFzX3AycF9zZF9zZXJ2aWNlX3VwZGF0ZSh3cGFfcyk7CiNlbmRpZgoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIlAyUF9TRVJWX0RJU0NfRVhURVJOQUwgIiwgMjMpID09IDApIHsKCQlpZiAocDJwX2N0cmxfc2Vydl9kaXNjX2V4dGVybmFsKHdwYV9zLCBidWYgKyAyMykgPCAwKQoJCQlyZXBseV9sZW4gPSAtMTsKCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgIlAyUF9TRVJWSUNFX0ZMVVNIIikgPT0gMCkgewoJCXdwYXNfcDJwX3NlcnZpY2VfZmx1c2god3BhX3MpOwoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIlAyUF9TRVJWSUNFX0FERCAiLCAxNikgPT0gMCkgewoJCWlmIChwMnBfY3RybF9zZXJ2aWNlX2FkZCh3cGFfcywgYnVmICsgMTYpIDwgMCkKCQkJcmVwbHlfbGVuID0gLTE7Cgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiUDJQX1NFUlZJQ0VfREVMICIsIDE2KSA9PSAwKSB7CgkJaWYgKHAycF9jdHJsX3NlcnZpY2VfZGVsKHdwYV9zLCBidWYgKyAxNikgPCAwKQoJCQlyZXBseV9sZW4gPSAtMTsKCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJQMlBfUkVKRUNUICIsIDExKSA9PSAwKSB7CgkJaWYgKHAycF9jdHJsX3JlamVjdCh3cGFfcywgYnVmICsgMTEpIDwgMCkKCQkJcmVwbHlfbGVuID0gLTE7Cgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiUDJQX0lOVklURSAiLCAxMSkgPT0gMCkgewoJCWlmIChwMnBfY3RybF9pbnZpdGUod3BhX3MsIGJ1ZiArIDExKSA8IDApCgkJCXJlcGx5X2xlbiA9IC0xOwoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIlAyUF9QRUVSICIsIDkpID09IDApIHsKCQlyZXBseV9sZW4gPSBwMnBfY3RybF9wZWVyKHdwYV9zLCBidWYgKyA5LCByZXBseSwKCQkJCQkgICAgICByZXBseV9zaXplKTsKCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJQMlBfU0VUICIsIDgpID09IDApIHsKCQlpZiAocDJwX2N0cmxfc2V0KHdwYV9zLCBidWYgKyA4KSA8IDApCgkJCXJlcGx5X2xlbiA9IC0xOwoJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAiUDJQX0ZMVVNIIikgPT0gMCkgewoJCW9zX21lbXNldCh3cGFfcy0+cDJwX2F1dGhfaW52aXRlLCAwLCBFVEhfQUxFTik7CgkJd3BhX3MtPmZvcmNlX2xvbmdfc2QgPSAwOwoJCWlmICh3cGFfcy0+Z2xvYmFsLT5wMnApCgkJCXAycF9mbHVzaCh3cGFfcy0+Z2xvYmFsLT5wMnApOwoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIlAyUF9VTkFVVEhPUklaRSAiLCAxNikgPT0gMCkgewoJCWlmICh3cGFzX3AycF91bmF1dGhvcml6ZSh3cGFfcywgYnVmICsgMTYpIDwgMCkKCQkJcmVwbHlfbGVuID0gLTE7Cgl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJQMlBfQ0FOQ0VMIikgPT0gMCkgewoJCWlmICh3cGFzX3AycF9jYW5jZWwod3BhX3MpKQoJCQlyZXBseV9sZW4gPSAtMTsKCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJQMlBfUFJFU0VOQ0VfUkVRICIsIDE3KSA9PSAwKSB7CgkJaWYgKHAycF9jdHJsX3ByZXNlbmNlX3JlcSh3cGFfcywgYnVmICsgMTcpIDwgMCkKCQkJcmVwbHlfbGVuID0gLTE7Cgl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJQMlBfUFJFU0VOQ0VfUkVRIikgPT0gMCkgewoJCWlmIChwMnBfY3RybF9wcmVzZW5jZV9yZXEod3BhX3MsICIiKSA8IDApCgkJCXJlcGx5X2xlbiA9IC0xOwoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIlAyUF9FWFRfTElTVEVOICIsIDE1KSA9PSAwKSB7CgkJaWYgKHAycF9jdHJsX2V4dF9saXN0ZW4od3BhX3MsIGJ1ZiArIDE1KSA8IDApCgkJCXJlcGx5X2xlbiA9IC0xOwoJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAiUDJQX0VYVF9MSVNURU4iKSA9PSAwKSB7CgkJaWYgKHAycF9jdHJsX2V4dF9saXN0ZW4od3BhX3MsICIiKSA8IDApCgkJCXJlcGx5X2xlbiA9IC0xOwojZW5kaWYgLyogQ09ORklHX1AyUCAqLwojaWZkZWYgQ09ORklHX1dJRklfRElTUExBWQoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIldGRF9TVUJFTEVNX1NFVCAiLCAxNikgPT0gMCkgewoJCWlmICh3aWZpX2Rpc3BsYXlfc3ViZWxlbV9zZXQod3BhX3MtPmdsb2JhbCwgYnVmICsgMTYpIDwgMCkKCQkJcmVwbHlfbGVuID0gLTE7Cgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiV0ZEX1NVQkVMRU1fR0VUICIsIDE2KSA9PSAwKSB7CgkJcmVwbHlfbGVuID0gd2lmaV9kaXNwbGF5X3N1YmVsZW1fZ2V0KHdwYV9zLT5nbG9iYWwsIGJ1ZiArIDE2LAoJCQkJCQkgICAgIHJlcGx5LCByZXBseV9zaXplKTsKI2VuZGlmIC8qIENPTkZJR19XSUZJX0RJU1BMQVkgKi8KI2lmZGVmIENPTkZJR19JTlRFUldPUktJTkcKCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgIkZFVENIX0FOUVAiKSA9PSAwKSB7CgkJaWYgKGludGVyd29ya2luZ19mZXRjaF9hbnFwKHdwYV9zKSA8IDApCgkJCXJlcGx5X2xlbiA9IC0xOwoJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAiU1RPUF9GRVRDSF9BTlFQIikgPT0gMCkgewoJCWludGVyd29ya2luZ19zdG9wX2ZldGNoX2FucXAod3BhX3MpOwoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIklOVEVSV09SS0lOR19TRUxFQ1QiLCAxOSkgPT0gMCkgewoJCWlmIChpbnRlcndvcmtpbmdfc2VsZWN0KHdwYV9zLCBvc19zdHJzdHIoYnVmICsgMTksICJhdXRvIikgIT0KCQkJCQlOVUxMKSA8IDApCgkJCXJlcGx5X2xlbiA9IC0xOwoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIklOVEVSV09SS0lOR19DT05ORUNUICIsIDIxKSA9PSAwKSB7CgkJaWYgKGN0cmxfaW50ZXJ3b3JraW5nX2Nvbm5lY3Qod3BhX3MsIGJ1ZiArIDIxKSA8IDApCgkJCXJlcGx5X2xlbiA9IC0xOwoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIkFOUVBfR0VUICIsIDkpID09IDApIHsKCQlpZiAoZ2V0X2FucXAod3BhX3MsIGJ1ZiArIDkpIDwgMCkKCQkJcmVwbHlfbGVuID0gLTE7Cgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiR0FTX1JFUVVFU1QgIiwgMTIpID09IDApIHsKCQlpZiAoZ2FzX3JlcXVlc3Qod3BhX3MsIGJ1ZiArIDEyKSA8IDApCgkJCXJlcGx5X2xlbiA9IC0xOwoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIkdBU19SRVNQT05TRV9HRVQgIiwgMTcpID09IDApIHsKCQlyZXBseV9sZW4gPSBnYXNfcmVzcG9uc2VfZ2V0KHdwYV9zLCBidWYgKyAxNywgcmVwbHksCgkJCQkJICAgICByZXBseV9zaXplKTsKI2VuZGlmIC8qIENPTkZJR19JTlRFUldPUktJTkcgKi8KI2lmZGVmIENPTkZJR19IUzIwCgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiSFMyMF9BTlFQX0dFVCAiLCAxNCkgPT0gMCkgewoJCWlmIChnZXRfaHMyMF9hbnFwKHdwYV9zLCBidWYgKyAxNCkgPCAwKQoJCQlyZXBseV9sZW4gPSAtMTsKCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJIUzIwX0dFVF9OQUlfSE9NRV9SRUFMTV9MSVNUICIsIDI5KSA9PSAwKSB7CgkJaWYgKGhzMjBfZ2V0X25haV9ob21lX3JlYWxtX2xpc3Qod3BhX3MsIGJ1ZiArIDI5KSA8IDApCgkJCXJlcGx5X2xlbiA9IC0xOwojZW5kaWYgLyogQ09ORklHX0hTMjAgKi8KCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsIFdQQV9DVFJMX1JTUCwgb3Nfc3RybGVuKFdQQV9DVFJMX1JTUCkpID09IDApCgl7CgkJaWYgKHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2VfY3RybF9yc3AoCgkJCSAgICB3cGFfcywgYnVmICsgb3Nfc3RybGVuKFdQQV9DVFJMX1JTUCkpKQoJCQlyZXBseV9sZW4gPSAtMTsKCQllbHNlCgkJCWN0cmxfcnNwID0gMTsKCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgIlJFQ09ORklHVVJFIikgPT0gMCkgewoJCWlmICh3cGFfc3VwcGxpY2FudF9yZWxvYWRfY29uZmlndXJhdGlvbih3cGFfcykpCgkJCXJlcGx5X2xlbiA9IC0xOwoJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAiVEVSTUlOQVRFIikgPT0gMCkgewoJCXdwYV9zdXBwbGljYW50X3Rlcm1pbmF0ZV9wcm9jKHdwYV9zLT5nbG9iYWwpOwoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIkJTU0lEICIsIDYpID09IDApIHsKCQlpZiAod3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV9ic3NpZCh3cGFfcywgYnVmICsgNikpCgkJCXJlcGx5X2xlbiA9IC0xOwoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIkJMQUNLTElTVCIsIDkpID09IDApIHsKCQlyZXBseV9sZW4gPSB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX2JsYWNrbGlzdCgKCQkJd3BhX3MsIGJ1ZiArIDksIHJlcGx5LCByZXBseV9zaXplKTsKCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJMT0dfTEVWRUwiLCA5KSA9PSAwKSB7CgkJcmVwbHlfbGVuID0gd3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV9sb2dfbGV2ZWwoCgkJCXdwYV9zLCBidWYgKyA5LCByZXBseSwgcmVwbHlfc2l6ZSk7Cgl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJMSVNUX05FVFdPUktTIikgPT0gMCkgewoJCXJlcGx5X2xlbiA9IHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2VfbGlzdF9uZXR3b3JrcygKCQkJd3BhX3MsIHJlcGx5LCByZXBseV9zaXplKTsKCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgIkRJU0NPTk5FQ1QiKSA9PSAwKSB7CiNpZmRlZiBDT05GSUdfU01FCgkJd3BhX3MtPnNtZS5wcmV2X2Jzc2lkX3NldCA9IDA7CiNlbmRpZiAvKiBDT05GSUdfU01FICovCgkJd3BhX3MtPnJlYXNzb2NpYXRlID0gMDsKCQl3cGFfcy0+ZGlzY29ubmVjdGVkID0gMTsKCQl3cGFfc3VwcGxpY2FudF9jYW5jZWxfc2NoZWRfc2Nhbih3cGFfcyk7CgkJd3BhX3N1cHBsaWNhbnRfY2FuY2VsX3NjYW4od3BhX3MpOwoJCXdwYV9zdXBwbGljYW50X2RlYXV0aGVudGljYXRlKHdwYV9zLAoJCQkJCSAgICAgIFdMQU5fUkVBU09OX0RFQVVUSF9MRUFWSU5HKTsKCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgIlNDQU4iKSA9PSAwIHx8CgkJICAgb3Nfc3RybmNtcChidWYsICJTQ0FOICIsIDUpID09IDApIHsKCQlpZiAod3BhX3MtPndwYV9zdGF0ZSA9PSBXUEFfSU5URVJGQUNFX0RJU0FCTEVEKQoJCQlyZXBseV9sZW4gPSAtMTsKCQllbHNlIHsKCQkJaWYgKG9zX3N0cmxlbihidWYpID4gNCAmJgoJCQkgICAgb3Nfc3RybmNhc2VjbXAoYnVmICsgNSwgIlRZUEU9T05MWSIsIDkpID09IDApCgkJCQl3cGFfcy0+c2Nhbl9yZXNfaGFuZGxlciA9IHNjYW5fb25seV9oYW5kbGVyOwoJCQlpZiAoIXdwYV9zLT5zY2hlZF9zY2FubmluZyAmJiAhd3BhX3MtPnNjYW5uaW5nICYmCgkJCSAgICAoKHdwYV9zLT53cGFfc3RhdGUgPD0gV1BBX1NDQU5OSU5HKSB8fAoJCQkgICAgICh3cGFfcy0+d3BhX3N0YXRlID09IFdQQV9DT01QTEVURUQpKSkgewoJCQkJd3BhX3MtPm5vcm1hbF9zY2FucyA9IDA7CgkJCQl3cGFfcy0+c2Nhbl9yZXEgPSBNQU5VQUxfU0NBTl9SRVE7CgkJCQl3cGFfc3VwcGxpY2FudF9yZXFfc2Nhbih3cGFfcywgMCwgMCk7CgkJCX0gZWxzZSBpZiAod3BhX3MtPnNjaGVkX3NjYW5uaW5nKSB7CgkJCQl3cGFfcHJpbnRmKE1TR19ERUJVRywgIlN0b3Agb25nb2luZyAiCgkJCQkJICAgInNjaGVkX3NjYW4gdG8gYWxsb3cgcmVxdWVzdGVkICIKCQkJCQkgICAiZnVsbCBzY2FuIHRvIHByb2NlZWQiKTsKCQkJCXdwYV9zdXBwbGljYW50X2NhbmNlbF9zY2hlZF9zY2FuKHdwYV9zKTsKCQkJCXdwYV9zLT5zY2FuX3JlcSA9IE1BTlVBTF9TQ0FOX1JFUTsKCQkJCXdwYV9zdXBwbGljYW50X3JlcV9zY2FuKHdwYV9zLCAwLCAwKTsKCQkJfSBlbHNlIHsKCQkJCXdwYV9wcmludGYoTVNHX0RFQlVHLCAiT25nb2luZyBzY2FuIGFjdGlvbiAtICIKCQkJCQkgICAicmVqZWN0IG5ldyByZXF1ZXN0Iik7CgkJCQlyZXBseV9sZW4gPSBvc19zbnByaW50ZihyZXBseSwgcmVwbHlfc2l6ZSwKCQkJCQkJCSJGQUlMLUJVU1lcbiIpOwoJCQl9CgkJfQoJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAiU0NBTl9SRVNVTFRTIikgPT0gMCkgewoJCXJlcGx5X2xlbiA9IHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2Vfc2Nhbl9yZXN1bHRzKAoJCQl3cGFfcywgcmVwbHksIHJlcGx5X3NpemUpOwoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIlNFTEVDVF9ORVRXT1JLICIsIDE1KSA9PSAwKSB7CgkJaWYgKHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2Vfc2VsZWN0X25ldHdvcmsod3BhX3MsIGJ1ZiArIDE1KSkKCQkJcmVwbHlfbGVuID0gLTE7Cgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiRU5BQkxFX05FVFdPUksgIiwgMTUpID09IDApIHsKCQlpZiAod3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV9lbmFibGVfbmV0d29yayh3cGFfcywgYnVmICsgMTUpKQoJCQlyZXBseV9sZW4gPSAtMTsKCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJESVNBQkxFX05FVFdPUksgIiwgMTYpID09IDApIHsKCQlpZiAod3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV9kaXNhYmxlX25ldHdvcmsod3BhX3MsIGJ1ZiArIDE2KSkKCQkJcmVwbHlfbGVuID0gLTE7Cgl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJBRERfTkVUV09SSyIpID09IDApIHsKCQlyZXBseV9sZW4gPSB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX2FkZF9uZXR3b3JrKAoJCQl3cGFfcywgcmVwbHksIHJlcGx5X3NpemUpOwoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIlJFTU9WRV9ORVRXT1JLICIsIDE1KSA9PSAwKSB7CgkJaWYgKHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2VfcmVtb3ZlX25ldHdvcmsod3BhX3MsIGJ1ZiArIDE1KSkKCQkJcmVwbHlfbGVuID0gLTE7Cgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiU0VUX05FVFdPUksgIiwgMTIpID09IDApIHsKCQlpZiAod3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV9zZXRfbmV0d29yayh3cGFfcywgYnVmICsgMTIpKQoJCQlyZXBseV9sZW4gPSAtMTsKCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJHRVRfTkVUV09SSyAiLCAxMikgPT0gMCkgewoJCXJlcGx5X2xlbiA9IHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2VfZ2V0X25ldHdvcmsoCgkJCXdwYV9zLCBidWYgKyAxMiwgcmVwbHksIHJlcGx5X3NpemUpOwoJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAiTElTVF9DUkVEUyIpID09IDApIHsKCQlyZXBseV9sZW4gPSB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX2xpc3RfY3JlZHMoCgkJCXdwYV9zLCByZXBseSwgcmVwbHlfc2l6ZSk7Cgl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJBRERfQ1JFRCIpID09IDApIHsKCQlyZXBseV9sZW4gPSB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX2FkZF9jcmVkKAoJCQl3cGFfcywgcmVwbHksIHJlcGx5X3NpemUpOwoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIlJFTU9WRV9DUkVEICIsIDEyKSA9PSAwKSB7CgkJaWYgKHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2VfcmVtb3ZlX2NyZWQod3BhX3MsIGJ1ZiArIDEyKSkKCQkJcmVwbHlfbGVuID0gLTE7Cgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiU0VUX0NSRUQgIiwgOSkgPT0gMCkgewoJCWlmICh3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3NldF9jcmVkKHdwYV9zLCBidWYgKyA5KSkKCQkJcmVwbHlfbGVuID0gLTE7CiNpZm5kZWYgQ09ORklHX05PX0NPTkZJR19XUklURQoJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAiU0FWRV9DT05GSUciKSA9PSAwKSB7CgkJaWYgKHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2Vfc2F2ZV9jb25maWcod3BhX3MpKQoJCQlyZXBseV9sZW4gPSAtMTsKI2VuZGlmIC8qIENPTkZJR19OT19DT05GSUdfV1JJVEUgKi8KCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJHRVRfQ0FQQUJJTElUWSAiLCAxNSkgPT0gMCkgewoJCXJlcGx5X2xlbiA9IHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2VfZ2V0X2NhcGFiaWxpdHkoCgkJCXdwYV9zLCBidWYgKyAxNSwgcmVwbHksIHJlcGx5X3NpemUpOwoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIkFQX1NDQU4gIiwgOCkgPT0gMCkgewoJCWlmICh3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX2FwX3NjYW4od3BhX3MsIGJ1ZiArIDgpKQoJCQlyZXBseV9sZW4gPSAtMTsKCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJTQ0FOX0lOVEVSVkFMICIsIDE0KSA9PSAwKSB7CgkJaWYgKHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2Vfc2Nhbl9pbnRlcnZhbCh3cGFfcywgYnVmICsgMTQpKQoJCQlyZXBseV9sZW4gPSAtMTsKCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgIklOVEVSRkFDRV9MSVNUIikgPT0gMCkgewoJCXJlcGx5X2xlbiA9IHdwYV9zdXBwbGljYW50X2dsb2JhbF9pZmFjZV9saXN0KAoJCQl3cGFfcy0+Z2xvYmFsLCByZXBseSwgcmVwbHlfc2l6ZSk7Cgl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJJTlRFUkZBQ0VTIikgPT0gMCkgewoJCXJlcGx5X2xlbiA9IHdwYV9zdXBwbGljYW50X2dsb2JhbF9pZmFjZV9pbnRlcmZhY2VzKAoJCQl3cGFfcy0+Z2xvYmFsLCByZXBseSwgcmVwbHlfc2l6ZSk7Cgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiQlNTICIsIDQpID09IDApIHsKCQlyZXBseV9sZW4gPSB3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX2JzcygKCQkJd3BhX3MsIGJ1ZiArIDQsIHJlcGx5LCByZXBseV9zaXplKTsKI2lmZGVmIENPTkZJR19BUAoJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAiU1RBLUZJUlNUIikgPT0gMCkgewoJCXJlcGx5X2xlbiA9IGFwX2N0cmxfaWZhY2Vfc3RhX2ZpcnN0KHdwYV9zLCByZXBseSwgcmVwbHlfc2l6ZSk7Cgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiU1RBICIsIDQpID09IDApIHsKCQlyZXBseV9sZW4gPSBhcF9jdHJsX2lmYWNlX3N0YSh3cGFfcywgYnVmICsgNCwgcmVwbHksCgkJCQkJICAgICAgcmVwbHlfc2l6ZSk7Cgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiU1RBLU5FWFQgIiwgOSkgPT0gMCkgewoJCXJlcGx5X2xlbiA9IGFwX2N0cmxfaWZhY2Vfc3RhX25leHQod3BhX3MsIGJ1ZiArIDksIHJlcGx5LAoJCQkJCQkgICByZXBseV9zaXplKTsKCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJERUFVVEhFTlRJQ0FURSAiLCAxNSkgPT0gMCkgewoJCWlmIChhcF9jdHJsX2lmYWNlX3N0YV9kZWF1dGhlbnRpY2F0ZSh3cGFfcywgYnVmICsgMTUpKQoJCQlyZXBseV9sZW4gPSAtMTsKCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJESVNBU1NPQ0lBVEUgIiwgMTMpID09IDApIHsKCQlpZiAoYXBfY3RybF9pZmFjZV9zdGFfZGlzYXNzb2NpYXRlKHdwYV9zLCBidWYgKyAxMykpCgkJCXJlcGx5X2xlbiA9IC0xOwojZW5kaWYgLyogQ09ORklHX0FQICovCgl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJTVVNQRU5EIikgPT0gMCkgewoJCXdwYXNfbm90aWZ5X3N1c3BlbmQod3BhX3MtPmdsb2JhbCk7Cgl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJSRVNVTUUiKSA9PSAwKSB7CgkJd3Bhc19ub3RpZnlfcmVzdW1lKHdwYV9zLT5nbG9iYWwpOwoJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAiRFJPUF9TQSIpID09IDApIHsKCQl3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX2Ryb3Bfc2Eod3BhX3MpOwoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIlJPQU0gIiwgNSkgPT0gMCkgewoJCWlmICh3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3JvYW0od3BhX3MsIGJ1ZiArIDUpKQoJCQlyZXBseV9sZW4gPSAtMTsKCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJTVEFfQVVUT0NPTk5FQ1QgIiwgMTYpID09IDApIHsKCQlpZiAod3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV9zdGFfYXV0b2Nvbm5lY3Qod3BhX3MsIGJ1ZiArIDE2KSkKCQkJcmVwbHlfbGVuID0gLTE7Cgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiQlNTX0VYUElSRV9BR0UgIiwgMTUpID09IDApIHsKCQlpZiAod3BhX3N1cHBsaWNhbnRfY3RybF9pZmFjZV9ic3NfZXhwaXJlX2FnZSh3cGFfcywgYnVmICsgMTUpKQoJCQlyZXBseV9sZW4gPSAtMTsKCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJCU1NfRVhQSVJFX0NPVU5UICIsIDE3KSA9PSAwKSB7CgkJaWYgKHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2VfYnNzX2V4cGlyZV9jb3VudCh3cGFfcywKCQkJCQkJCSAgICAgICBidWYgKyAxNykpCgkJCXJlcGx5X2xlbiA9IC0xOwoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIkJTU19GTFVTSCAiLCAxMCkgPT0gMCkgewoJCWlmICh3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX2Jzc19mbHVzaCh3cGFfcywgYnVmICsgMTApKQoJCQlyZXBseV9sZW4gPSAtMTsKI2lmZGVmIENPTkZJR19URExTCgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiVERMU19ESVNDT1ZFUiAiLCAxNCkgPT0gMCkgewoJCWlmICh3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3RkbHNfZGlzY292ZXIod3BhX3MsIGJ1ZiArIDE0KSkKCQkJcmVwbHlfbGVuID0gLTE7Cgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiVERMU19TRVRVUCAiLCAxMSkgPT0gMCkgewoJCWlmICh3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3RkbHNfc2V0dXAod3BhX3MsIGJ1ZiArIDExKSkKCQkJcmVwbHlfbGVuID0gLTE7Cgl9IGVsc2UgaWYgKG9zX3N0cm5jbXAoYnVmLCAiVERMU19URUFSRE9XTiAiLCAxNCkgPT0gMCkgewoJCWlmICh3cGFfc3VwcGxpY2FudF9jdHJsX2lmYWNlX3RkbHNfdGVhcmRvd24od3BhX3MsIGJ1ZiArIDE0KSkKCQkJcmVwbHlfbGVuID0gLTE7CiNlbmRpZiAvKiBDT05GSUdfVERMUyAqLwoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIlNJR05BTF9QT0xMIiwgMTEpID09IDApIHsKCQlyZXBseV9sZW4gPSB3cGFfc3VwcGxpY2FudF9zaWduYWxfcG9sbCh3cGFfcywgcmVwbHksCgkJCQkJCSAgICAgICByZXBseV9zaXplKTsKCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJQS1RDTlRfUE9MTCIsIDExKSA9PSAwKSB7CgkJcmVwbHlfbGVuID0gd3BhX3N1cHBsaWNhbnRfcGt0Y250X3BvbGwod3BhX3MsIHJlcGx5LAoJCQkJCQkgICAgICAgcmVwbHlfc2l6ZSk7CiNpZmRlZiBDT05GSUdfQVVUT1NDQU4KCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJBVVRPU0NBTiAiLCA5KSA9PSAwKSB7CgkJaWYgKHdwYV9zdXBwbGljYW50X2N0cmxfaWZhY2VfYXV0b3NjYW4od3BhX3MsIGJ1ZiArIDkpKQoJCQlyZXBseV9sZW4gPSAtMTsKI2VuZGlmIC8qIENPTkZJR19BVVRPU0NBTiAqLwojaWZkZWYgQU5EUk9JRAoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIkRSSVZFUiAiLCA3KSA9PSAwKSB7CgkJcmVwbHlfbGVuID0gd3BhX3N1cHBsaWNhbnRfZHJpdmVyX2NtZCh3cGFfcywgYnVmICsgNywgcmVwbHksCgkJCQkJCSAgICAgIHJlcGx5X3NpemUpOwojZW5kaWYKCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgIlJFQVVUSEVOVElDQVRFIikgPT0gMCkgewoJCXBta3NhX2NhY2hlX2NsZWFyX2N1cnJlbnQod3BhX3MtPndwYSk7CgkJZWFwb2xfc21fcmVxdWVzdF9yZWF1dGgod3BhX3MtPmVhcG9sKTsKI2lmZGVmIENPTkZJR19XTk0KCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJXTk1fU0xFRVAgIiwgMTApID09IDApIHsKCQlpZiAod3Bhc19jdHJsX2lmYWNlX3dubV9zbGVlcCh3cGFfcywgYnVmICsgMTApKQoJCQlyZXBseV9sZW4gPSAtMTsKI2VuZGlmIC8qIENPTkZJR19XTk0gKi8KCX0gZWxzZSB7CgkJb3NfbWVtY3B5KHJlcGx5LCAiVU5LTk9XTiBDT01NQU5EXG4iLCAxNik7CgkJcmVwbHlfbGVuID0gMTY7Cgl9CgoJaWYgKHJlcGx5X2xlbiA8IDApIHsKCQlvc19tZW1jcHkocmVwbHksICJGQUlMXG4iLCA1KTsKCQlyZXBseV9sZW4gPSA1OwoJfQoKCWlmIChjdHJsX3JzcCkKCQllYXBvbF9zbV9ub3RpZnlfY3RybF9yZXNwb25zZSh3cGFfcy0+ZWFwb2wpOwoKCSpyZXNwX2xlbiA9IHJlcGx5X2xlbjsKCXJldHVybiByZXBseTsKfQoKCnN0YXRpYyBpbnQgd3BhX3N1cHBsaWNhbnRfZ2xvYmFsX2lmYWNlX2FkZChzdHJ1Y3Qgd3BhX2dsb2JhbCAqZ2xvYmFsLAoJCQkJCSAgIGNoYXIgKmNtZCkKewoJc3RydWN0IHdwYV9pbnRlcmZhY2UgaWZhY2U7CgljaGFyICpwb3M7CgoJLyoKCSAqIDxpZm5hbWU+VEFCPGNvbmZuYW1lPlRBQjxkcml2ZXI+VEFCPGN0cmxfaW50ZXJmYWNlPlRBQjxkcml2ZXJfcGFyYW0+CgkgKiBUQUI8YnJpZGdlX2lmbmFtZT4KCSAqLwoJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDVFJMX0lGQUNFIEdMT0JBTCBJTlRFUkZBQ0VfQUREICclcyciLCBjbWQpOwoKCW9zX21lbXNldCgmaWZhY2UsIDAsIHNpemVvZihpZmFjZSkpOwoKCWRvIHsKCQlpZmFjZS5pZm5hbWUgPSBwb3MgPSBjbWQ7CgkJcG9zID0gb3Nfc3RyY2hyKHBvcywgJ1x0Jyk7CgkJaWYgKHBvcykKCQkJKnBvcysrID0gJ1wwJzsKCQlpZiAoaWZhY2UuaWZuYW1lWzBdID09ICdcMCcpCgkJCXJldHVybiAtMTsKCQlpZiAocG9zID09IE5VTEwpCgkJCWJyZWFrOwoKCQlpZmFjZS5jb25mbmFtZSA9IHBvczsKCQlwb3MgPSBvc19zdHJjaHIocG9zLCAnXHQnKTsKCQlpZiAocG9zKQoJCQkqcG9zKysgPSAnXDAnOwoJCWlmIChpZmFjZS5jb25mbmFtZVswXSA9PSAnXDAnKQoJCQlpZmFjZS5jb25mbmFtZSA9IE5VTEw7CgkJaWYgKHBvcyA9PSBOVUxMKQoJCQlicmVhazsKCgkJaWZhY2UuZHJpdmVyID0gcG9zOwoJCXBvcyA9IG9zX3N0cmNocihwb3MsICdcdCcpOwoJCWlmIChwb3MpCgkJCSpwb3MrKyA9ICdcMCc7CgkJaWYgKGlmYWNlLmRyaXZlclswXSA9PSAnXDAnKQoJCQlpZmFjZS5kcml2ZXIgPSBOVUxMOwoJCWlmIChwb3MgPT0gTlVMTCkKCQkJYnJlYWs7CgoJCWlmYWNlLmN0cmxfaW50ZXJmYWNlID0gcG9zOwoJCXBvcyA9IG9zX3N0cmNocihwb3MsICdcdCcpOwoJCWlmIChwb3MpCgkJCSpwb3MrKyA9ICdcMCc7CgkJaWYgKGlmYWNlLmN0cmxfaW50ZXJmYWNlWzBdID09ICdcMCcpCgkJCWlmYWNlLmN0cmxfaW50ZXJmYWNlID0gTlVMTDsKCQlpZiAocG9zID09IE5VTEwpCgkJCWJyZWFrOwoKCQlpZmFjZS5kcml2ZXJfcGFyYW0gPSBwb3M7CgkJcG9zID0gb3Nfc3RyY2hyKHBvcywgJ1x0Jyk7CgkJaWYgKHBvcykKCQkJKnBvcysrID0gJ1wwJzsKCQlpZiAoaWZhY2UuZHJpdmVyX3BhcmFtWzBdID09ICdcMCcpCgkJCWlmYWNlLmRyaXZlcl9wYXJhbSA9IE5VTEw7CgkJaWYgKHBvcyA9PSBOVUxMKQoJCQlicmVhazsKCgkJaWZhY2UuYnJpZGdlX2lmbmFtZSA9IHBvczsKCQlwb3MgPSBvc19zdHJjaHIocG9zLCAnXHQnKTsKCQlpZiAocG9zKQoJCQkqcG9zKysgPSAnXDAnOwoJCWlmIChpZmFjZS5icmlkZ2VfaWZuYW1lWzBdID09ICdcMCcpCgkJCWlmYWNlLmJyaWRnZV9pZm5hbWUgPSBOVUxMOwoJCWlmIChwb3MgPT0gTlVMTCkKCQkJYnJlYWs7Cgl9IHdoaWxlICgwKTsKCglpZiAod3BhX3N1cHBsaWNhbnRfZ2V0X2lmYWNlKGdsb2JhbCwgaWZhY2UuaWZuYW1lKSkKCQlyZXR1cm4gLTE7CgoJcmV0dXJuIHdwYV9zdXBwbGljYW50X2FkZF9pZmFjZShnbG9iYWwsICZpZmFjZSkgPyAwIDogLTE7Cn0KCgpzdGF0aWMgaW50IHdwYV9zdXBwbGljYW50X2dsb2JhbF9pZmFjZV9yZW1vdmUoc3RydWN0IHdwYV9nbG9iYWwgKmdsb2JhbCwKCQkJCQkgICAgICBjaGFyICpjbWQpCnsKCXN0cnVjdCB3cGFfc3VwcGxpY2FudCAqd3BhX3M7CgoJd3BhX3ByaW50ZihNU0dfREVCVUcsICJDVFJMX0lGQUNFIEdMT0JBTCBJTlRFUkZBQ0VfUkVNT1ZFICclcyciLCBjbWQpOwoKCXdwYV9zID0gd3BhX3N1cHBsaWNhbnRfZ2V0X2lmYWNlKGdsb2JhbCwgY21kKTsKCWlmICh3cGFfcyA9PSBOVUxMKQoJCXJldHVybiAtMTsKCXJldHVybiB3cGFfc3VwcGxpY2FudF9yZW1vdmVfaWZhY2UoZ2xvYmFsLCB3cGFfcywgMCk7Cn0KCgpzdGF0aWMgdm9pZCB3cGFfZnJlZV9pZmFjZV9pbmZvKHN0cnVjdCB3cGFfaW50ZXJmYWNlX2luZm8gKmlmYWNlKQp7CglzdHJ1Y3Qgd3BhX2ludGVyZmFjZV9pbmZvICpwcmV2OwoKCXdoaWxlIChpZmFjZSkgewoJCXByZXYgPSBpZmFjZTsKCQlpZmFjZSA9IGlmYWNlLT5uZXh0OwoKCQlvc19mcmVlKHByZXYtPmlmbmFtZSk7CgkJb3NfZnJlZShwcmV2LT5kZXNjKTsKCQlvc19mcmVlKHByZXYpOwoJfQp9CgoKc3RhdGljIGludCB3cGFfc3VwcGxpY2FudF9nbG9iYWxfaWZhY2VfbGlzdChzdHJ1Y3Qgd3BhX2dsb2JhbCAqZ2xvYmFsLAoJCQkJCSAgICBjaGFyICpidWYsIGludCBsZW4pCnsKCWludCBpLCByZXM7CglzdHJ1Y3Qgd3BhX2ludGVyZmFjZV9pbmZvICppZmFjZSA9IE5VTEwsICpsYXN0ID0gTlVMTCwgKnRtcDsKCWNoYXIgKnBvcywgKmVuZDsKCglmb3IgKGkgPSAwOyB3cGFfZHJpdmVyc1tpXTsgaSsrKSB7CgkJc3RydWN0IHdwYV9kcml2ZXJfb3BzICpkcnYgPSB3cGFfZHJpdmVyc1tpXTsKCQlpZiAoZHJ2LT5nZXRfaW50ZXJmYWNlcyA9PSBOVUxMKQoJCQljb250aW51ZTsKCQl0bXAgPSBkcnYtPmdldF9pbnRlcmZhY2VzKGdsb2JhbC0+ZHJ2X3ByaXZbaV0pOwoJCWlmICh0bXAgPT0gTlVMTCkKCQkJY29udGludWU7CgoJCWlmIChsYXN0ID09IE5VTEwpCgkJCWlmYWNlID0gbGFzdCA9IHRtcDsKCQllbHNlCgkJCWxhc3QtPm5leHQgPSB0bXA7CgkJd2hpbGUgKGxhc3QtPm5leHQpCgkJCWxhc3QgPSBsYXN0LT5uZXh0OwoJfQoKCXBvcyA9IGJ1ZjsKCWVuZCA9IGJ1ZiArIGxlbjsKCWZvciAodG1wID0gaWZhY2U7IHRtcDsgdG1wID0gdG1wLT5uZXh0KSB7CgkJcmVzID0gb3Nfc25wcmludGYocG9zLCBlbmQgLSBwb3MsICIlc1x0JXNcdCVzXG4iLAoJCQkJICB0bXAtPmRydl9uYW1lLCB0bXAtPmlmbmFtZSwKCQkJCSAgdG1wLT5kZXNjID8gdG1wLT5kZXNjIDogIiIpOwoJCWlmIChyZXMgPCAwIHx8IHJlcyA+PSBlbmQgLSBwb3MpIHsKCQkJKnBvcyA9ICdcMCc7CgkJCWJyZWFrOwoJCX0KCQlwb3MgKz0gcmVzOwoJfQoKCXdwYV9mcmVlX2lmYWNlX2luZm8oaWZhY2UpOwoKCXJldHVybiBwb3MgLSBidWY7Cn0KCgpzdGF0aWMgaW50IHdwYV9zdXBwbGljYW50X2dsb2JhbF9pZmFjZV9pbnRlcmZhY2VzKHN0cnVjdCB3cGFfZ2xvYmFsICpnbG9iYWwsCgkJCQkJCSAgY2hhciAqYnVmLCBpbnQgbGVuKQp7CglpbnQgcmVzOwoJY2hhciAqcG9zLCAqZW5kOwoJc3RydWN0IHdwYV9zdXBwbGljYW50ICp3cGFfczsKCgl3cGFfcyA9IGdsb2JhbC0+aWZhY2VzOwoJcG9zID0gYnVmOwoJZW5kID0gYnVmICsgbGVuOwoKCXdoaWxlICh3cGFfcykgewoJCXJlcyA9IG9zX3NucHJpbnRmKHBvcywgZW5kIC0gcG9zLCAiJXNcbiIsIHdwYV9zLT5pZm5hbWUpOwoJCWlmIChyZXMgPCAwIHx8IHJlcyA+PSBlbmQgLSBwb3MpIHsKCQkJKnBvcyA9ICdcMCc7CgkJCWJyZWFrOwoJCX0KCQlwb3MgKz0gcmVzOwoJCXdwYV9zID0gd3BhX3MtPm5leHQ7Cgl9CglyZXR1cm4gcG9zIC0gYnVmOwp9CgoKY2hhciAqIHdwYV9zdXBwbGljYW50X2dsb2JhbF9jdHJsX2lmYWNlX3Byb2Nlc3Moc3RydWN0IHdwYV9nbG9iYWwgKmdsb2JhbCwKCQkJCQkJY2hhciAqYnVmLCBzaXplX3QgKnJlc3BfbGVuKQp7CgljaGFyICpyZXBseTsKCWNvbnN0IGludCByZXBseV9zaXplID0gMjA0ODsKCWludCByZXBseV9sZW47CglpbnQgbGV2ZWwgPSBNU0dfREVCVUc7CgoJaWYgKG9zX3N0cmNtcChidWYsICJQSU5HIikgPT0gMCkKCQlsZXZlbCA9IE1TR19FWENFU1NJVkU7Cgl3cGFfaGV4ZHVtcF9hc2NpaShsZXZlbCwgIlJYIGdsb2JhbCBjdHJsX2lmYWNlIiwKCQkJICAoY29uc3QgdTggKikgYnVmLCBvc19zdHJsZW4oYnVmKSk7CgoJcmVwbHkgPSBvc19tYWxsb2MocmVwbHlfc2l6ZSk7CglpZiAocmVwbHkgPT0gTlVMTCkgewoJCSpyZXNwX2xlbiA9IDE7CgkJcmV0dXJuIE5VTEw7Cgl9CgoJb3NfbWVtY3B5KHJlcGx5LCAiT0tcbiIsIDMpOwoJcmVwbHlfbGVuID0gMzsKCglpZiAob3Nfc3RyY21wKGJ1ZiwgIlBJTkciKSA9PSAwKSB7CgkJb3NfbWVtY3B5KHJlcGx5LCAiUE9OR1xuIiwgNSk7CgkJcmVwbHlfbGVuID0gNTsKCX0gZWxzZSBpZiAob3Nfc3RybmNtcChidWYsICJJTlRFUkZBQ0VfQUREICIsIDE0KSA9PSAwKSB7CgkJaWYgKHdwYV9zdXBwbGljYW50X2dsb2JhbF9pZmFjZV9hZGQoZ2xvYmFsLCBidWYgKyAxNCkpCgkJCXJlcGx5X2xlbiA9IC0xOwoJfSBlbHNlIGlmIChvc19zdHJuY21wKGJ1ZiwgIklOVEVSRkFDRV9SRU1PVkUgIiwgMTcpID09IDApIHsKCQlpZiAod3BhX3N1cHBsaWNhbnRfZ2xvYmFsX2lmYWNlX3JlbW92ZShnbG9iYWwsIGJ1ZiArIDE3KSkKCQkJcmVwbHlfbGVuID0gLTE7Cgl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJJTlRFUkZBQ0VfTElTVCIpID09IDApIHsKCQlyZXBseV9sZW4gPSB3cGFfc3VwcGxpY2FudF9nbG9iYWxfaWZhY2VfbGlzdCgKCQkJZ2xvYmFsLCByZXBseSwgcmVwbHlfc2l6ZSk7Cgl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJJTlRFUkZBQ0VTIikgPT0gMCkgewoJCXJlcGx5X2xlbiA9IHdwYV9zdXBwbGljYW50X2dsb2JhbF9pZmFjZV9pbnRlcmZhY2VzKAoJCQlnbG9iYWwsIHJlcGx5LCByZXBseV9zaXplKTsKCX0gZWxzZSBpZiAob3Nfc3RyY21wKGJ1ZiwgIlRFUk1JTkFURSIpID09IDApIHsKCQl3cGFfc3VwcGxpY2FudF90ZXJtaW5hdGVfcHJvYyhnbG9iYWwpOwoJfSBlbHNlIGlmIChvc19zdHJjbXAoYnVmLCAiU1VTUEVORCIpID09IDApIHsKCQl3cGFzX25vdGlmeV9zdXNwZW5kKGdsb2JhbCk7Cgl9IGVsc2UgaWYgKG9zX3N0cmNtcChidWYsICJSRVNVTUUiKSA9PSAwKSB7CgkJd3Bhc19ub3RpZnlfcmVzdW1lKGdsb2JhbCk7Cgl9IGVsc2UgewoJCW9zX21lbWNweShyZXBseSwgIlVOS05PV04gQ09NTUFORFxuIiwgMTYpOwoJCXJlcGx5X2xlbiA9IDE2OwoJfQoKCWlmIChyZXBseV9sZW4gPCAwKSB7CgkJb3NfbWVtY3B5KHJlcGx5LCAiRkFJTFxuIiwgNSk7CgkJcmVwbHlfbGVuID0gNTsKCX0KCgkqcmVzcF9sZW4gPSByZXBseV9sZW47CglyZXR1cm4gcmVwbHk7Cn0K