LyogaXA2dGFibGVzIG1hdGNoIGV4dGVuc2lvbiBmb3IgbGltaXRpbmcgcGFja2V0cyBwZXIgZGVzdGluYXRpb24KICoKICogKEMpIDIwMDMtMjAwNCBieSBIYXJhbGQgV2VsdGUgPGxhZm9yZ2VAbmV0ZmlsdGVyLm9yZz4KICoKICogRGV2ZWxvcG1lbnQgb2YgdGhpcyBjb2RlIHdhcyBmdW5kZWQgYnkgQXN0YXJvIEFHLCBodHRwOi8vd3d3LmFzdGFyby5jb20vCiAqCiAqIEJhc2VkIG9uIGlwdF9saW1pdC5jIGJ5CiAqIErpcvRtZSBkZSBWaXZpZSAgIDxkZXZpdmllQGluZm8uZW5zZXJiLnUtYm9yZGVhdXguZnI+CiAqIEhlcnbpIEV5Y2hlbm5lICAgIDxydkB3YWxsZmlyZS5vcmc+CiAqIAogKiBFcnJvciBjb3JlY3Rpb25zIGJ5IG5tYWx5a2hAYmlsaW0uY29tICgyMi4wMS4yMDA1KQogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPGdldG9wdC5oPgojaW5jbHVkZSA8eHRhYmxlcy5oPgojaW5jbHVkZSA8c3RkZGVmLmg+CiNpbmNsdWRlIDxsaW51eC9uZXRmaWx0ZXIveF90YWJsZXMuaD4KI2luY2x1ZGUgPGxpbnV4L25ldGZpbHRlci94dF9oYXNobGltaXQuaD4KCiNkZWZpbmUgWFRfSEFTSExJTUlUX0JVUlNUCTUKCi8qIG1pbGlzZWNvbmRzICovCiNkZWZpbmUgWFRfSEFTSExJTUlUX0dDSU5URVJWQUwJMTAwMAojZGVmaW5lIFhUX0hBU0hMSU1JVF9FWFBJUkUJMTAwMDAKCi8qIEZ1bmN0aW9uIHdoaWNoIHByaW50cyBvdXQgdXNhZ2UgbWVzc2FnZS4gKi8Kc3RhdGljIHZvaWQgaGFzaGxpbWl0X2hlbHAodm9pZCkKewoJcHJpbnRmKAoiaGFzaGxpbWl0IHYlcyBvcHRpb25zOlxuIgoiLS1oYXNobGltaXQgPGF2Zz4JCW1heCBhdmVyYWdlIG1hdGNoIHJhdGVcbiIKIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1BhY2tldHMgcGVyIHNlY29uZCB1bmxlc3MgZm9sbG93ZWQgYnkgXG4iCiIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC9zZWMgL21pbnV0ZSAvaG91ciAvZGF5IHBvc3RmaXhlc11cbiIKIi0taGFzaGxpbWl0LW1vZGUgPG1vZGU+CQltb2RlIGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2ZcbiIKIgkJCQkJZHN0aXAsc3JjaXAsZHN0cG9ydCxzcmNwb3J0XG4iCiItLWhhc2hsaW1pdC1uYW1lIDxuYW1lPgkJbmFtZSBmb3IgL3Byb2MvbmV0L2lwdF9oYXNobGltaXQvXG4iCiJbLS1oYXNobGltaXQtYnVyc3QgPG51bT5dCW51bWJlciB0byBtYXRjaCBpbiBhIGJ1cnN0LCBkZWZhdWx0ICV1XG4iCiJbLS1oYXNobGltaXQtaHRhYmxlLXNpemUgPG51bT5dCW51bWJlciBvZiBoYXNodGFibGUgYnVja2V0c1xuIgoiWy0taGFzaGxpbWl0LWh0YWJsZS1tYXggPG51bT5dCW51bWJlciBvZiBoYXNodGFibGUgZW50cmllc1xuIgoiWy0taGFzaGxpbWl0LWh0YWJsZS1nY2ludGVydmFsXQlpbnRlcnZhbCBiZXR3ZWVuIGdhcmJhZ2UgY29sbGVjdGlvbiBydW5zXG4iCiJbLS1oYXNobGltaXQtaHRhYmxlLWV4cGlyZV0JYWZ0ZXIgd2hpY2ggdGltZSBhcmUgaWRsZSBlbnRyaWVzIGV4cGlyZWQ/XG4iCiJcbiIsIElQVEFCTEVTX1ZFUlNJT04sIFhUX0hBU0hMSU1JVF9CVVJTVCk7Cn0KCnN0YXRpYyBjb25zdCBzdHJ1Y3Qgb3B0aW9uIGhhc2hsaW1pdF9vcHRzW10gPSB7Cgl7ICJoYXNobGltaXQiLCAxLCBOVUxMLCAnJScgfSwKCXsgImhhc2hsaW1pdC1idXJzdCIsIDEsIE5VTEwsICckJyB9LAoJeyAiaGFzaGxpbWl0LWh0YWJsZS1zaXplIiwgMSwgTlVMTCwgJyYnIH0sCgl7ICJoYXNobGltaXQtaHRhYmxlLW1heCIsIDEsIE5VTEwsICcqJyB9LAoJeyAiaGFzaGxpbWl0LWh0YWJsZS1nY2ludGVydmFsIiwgMSwgTlVMTCwgJygnIH0sCgl7ICJoYXNobGltaXQtaHRhYmxlLWV4cGlyZSIsIDEsIE5VTEwsICcpJyB9LAoJeyAiaGFzaGxpbWl0LW1vZGUiLCAxLCBOVUxMLCAnXycgfSwKCXsgImhhc2hsaW1pdC1uYW1lIiwgMSwgTlVMTCwgJyInIH0sCgl7IH0KfTsKCnN0YXRpYwppbnQgcGFyc2VfcmF0ZShjb25zdCBjaGFyICpyYXRlLCB1X2ludDMyX3QgKnZhbCkKewoJY29uc3QgY2hhciAqZGVsaW07Cgl1X2ludDMyX3QgcjsKCXVfaW50MzJfdCBtdWx0ID0gMTsgIC8qIFNlY29uZHMgYnkgZGVmYXVsdC4gKi8KCglkZWxpbSA9IHN0cmNocihyYXRlLCAnLycpOwoJaWYgKGRlbGltKSB7CgkJaWYgKHN0cmxlbihkZWxpbSsxKSA9PSAwKQoJCQlyZXR1cm4gMDsKCgkJaWYgKHN0cm5jYXNlY21wKGRlbGltKzEsICJzZWNvbmQiLCBzdHJsZW4oZGVsaW0rMSkpID09IDApCgkJCW11bHQgPSAxOwoJCWVsc2UgaWYgKHN0cm5jYXNlY21wKGRlbGltKzEsICJtaW51dGUiLCBzdHJsZW4oZGVsaW0rMSkpID09IDApCgkJCW11bHQgPSA2MDsKCQllbHNlIGlmIChzdHJuY2FzZWNtcChkZWxpbSsxLCAiaG91ciIsIHN0cmxlbihkZWxpbSsxKSkgPT0gMCkKCQkJbXVsdCA9IDYwKjYwOwoJCWVsc2UgaWYgKHN0cm5jYXNlY21wKGRlbGltKzEsICJkYXkiLCBzdHJsZW4oZGVsaW0rMSkpID09IDApCgkJCW11bHQgPSAyNCo2MCo2MDsKCQllbHNlCgkJCXJldHVybiAwOwoJfQoJciA9IGF0b2kocmF0ZSk7CglpZiAoIXIpCgkJcmV0dXJuIDA7CgoJLyogVGhpcyB3b3VsZCBnZXQgbWFwcGVkIHRvIGluZmluaXRlICgxL2RheSBpcyBtaW5pbXVtIHRoZXkKICAgICAgICAgICBjYW4gc3BlY2lmeSwgc28gd2UncmUgb2sgYXQgdGhhdCBlbmQpLiAqLwoJaWYgKHIgLyBtdWx0ID4gWFRfSEFTSExJTUlUX1NDQUxFKQoJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sICJSYXRlIHRvbyBmYXN0IGAlcydcbiIsIHJhdGUpOwoKCSp2YWwgPSBYVF9IQVNITElNSVRfU0NBTEUgKiBtdWx0IC8gcjsKCXJldHVybiAxOwp9CgovKiBJbml0aWFsaXplIHRoZSBtYXRjaC4gKi8Kc3RhdGljIHZvaWQgaGFzaGxpbWl0X2luaXQoc3RydWN0IHh0X2VudHJ5X21hdGNoICptKQp7CglzdHJ1Y3QgeHRfaGFzaGxpbWl0X2luZm8gKnIgPSAoc3RydWN0IHh0X2hhc2hsaW1pdF9pbmZvICopbS0+ZGF0YTsKCglyLT5jZmcuYnVyc3QgPSBYVF9IQVNITElNSVRfQlVSU1Q7CglyLT5jZmcuZ2NfaW50ZXJ2YWwgPSBYVF9IQVNITElNSVRfR0NJTlRFUlZBTDsKCXItPmNmZy5leHBpcmUgPSBYVF9IQVNITElNSVRfRVhQSVJFOwoKfQoKCi8qIFBhcnNlIGEgJ21vZGUnIHBhcmFtZXRlciBpbnRvIHRoZSByZXF1aXJlZCBiaXRtYXNrICovCnN0YXRpYyBpbnQgcGFyc2VfbW9kZShzdHJ1Y3QgeHRfaGFzaGxpbWl0X2luZm8gKnIsIGNoYXIgKm9wdGFyZykKewoJY2hhciAqdG9rOwoJY2hhciAqYXJnID0gc3RyZHVwKG9wdGFyZyk7CgoJaWYgKCFhcmcpCgkJcmV0dXJuIC0xOwoKCXItPmNmZy5tb2RlID0gMDsKCglmb3IgKHRvayA9IHN0cnRvayhhcmcsICIsfCIpOwoJICAgICB0b2s7CgkgICAgIHRvayA9IHN0cnRvayhOVUxMLCAiLHwiKSkgewoJCWlmICghc3RyY21wKHRvaywgImRzdGlwIikpCgkJCXItPmNmZy5tb2RlIHw9IFhUX0hBU0hMSU1JVF9IQVNIX0RJUDsKCQllbHNlIGlmICghc3RyY21wKHRvaywgInNyY2lwIikpCgkJCXItPmNmZy5tb2RlIHw9IFhUX0hBU0hMSU1JVF9IQVNIX1NJUDsKCQllbHNlIGlmICghc3RyY21wKHRvaywgInNyY3BvcnQiKSkKCQkJci0+Y2ZnLm1vZGUgfD0gWFRfSEFTSExJTUlUX0hBU0hfU1BUOwoJCWVsc2UgaWYgKCFzdHJjbXAodG9rLCAiZHN0cG9ydCIpKQoJCQlyLT5jZmcubW9kZSB8PSBYVF9IQVNITElNSVRfSEFTSF9EUFQ7CgkJZWxzZSB7CgkJCWZyZWUoYXJnKTsKCQkJcmV0dXJuIC0xOwoJCX0KCX0KCWZyZWUoYXJnKTsKCXJldHVybiAwOwp9CgojZGVmaW5lIFBBUkFNX0xJTUlUCQkweDAwMDAwMDAxCiNkZWZpbmUgUEFSQU1fQlVSU1QJCTB4MDAwMDAwMDIKI2RlZmluZSBQQVJBTV9NT0RFCQkweDAwMDAwMDA0CiNkZWZpbmUgUEFSQU1fTkFNRQkJMHgwMDAwMDAwOAojZGVmaW5lIFBBUkFNX1NJWkUJCTB4MDAwMDAwMTAKI2RlZmluZSBQQVJBTV9NQVgJCTB4MDAwMDAwMjAKI2RlZmluZSBQQVJBTV9HQ0lOVEVSVkFMCTB4MDAwMDAwNDAKI2RlZmluZSBQQVJBTV9FWFBJUkUJCTB4MDAwMDAwODAKCi8qIEZ1bmN0aW9uIHdoaWNoIHBhcnNlcyBjb21tYW5kIG9wdGlvbnM7IHJldHVybnMgdHJ1ZSBpZiBpdAogICBhdGUgYW4gb3B0aW9uICovCnN0YXRpYyBpbnQKaGFzaGxpbWl0X3BhcnNlKGludCBjLCBjaGFyICoqYXJndiwgaW50IGludmVydCwgdW5zaWduZWQgaW50ICpmbGFncywKICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmVudHJ5LCBzdHJ1Y3QgeHRfZW50cnlfbWF0Y2ggKiptYXRjaCkKewoJc3RydWN0IHh0X2hhc2hsaW1pdF9pbmZvICpyID0gCgkJCShzdHJ1Y3QgeHRfaGFzaGxpbWl0X2luZm8gKikoKm1hdGNoKS0+ZGF0YTsKCXVuc2lnbmVkIGludCBudW07CgoJc3dpdGNoKGMpIHsKCWNhc2UgJyUnOgoJCWlmIChjaGVja19pbnZlcnNlKGFyZ3Zbb3B0aW5kLTFdLCAmaW52ZXJ0LCAmb3B0aW5kLCAwKSkgYnJlYWs7CgkJaWYgKCFwYXJzZV9yYXRlKG9wdGFyZywgJnItPmNmZy5hdmcpKQoJCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAoJCQkJICAgImJhZCByYXRlIGAlcyciLCBvcHRhcmcpOwoJCSpmbGFncyB8PSBQQVJBTV9MSU1JVDsKCQlicmVhazsKCgljYXNlICckJzoKCQlpZiAoY2hlY2tfaW52ZXJzZShhcmd2W29wdGluZC0xXSwgJmludmVydCwgJm9wdGluZCwgMCkpIGJyZWFrOwoJCWlmIChzdHJpbmdfdG9fbnVtYmVyKG9wdGFyZywgMCwgMTAwMDAsICZudW0pID09IC0xKQoJCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAoJCQkJICAgImJhZCAtLWhhc2hsaW1pdC1idXJzdCBgJXMnIiwgb3B0YXJnKTsKCQlyLT5jZmcuYnVyc3QgPSBudW07CgkJKmZsYWdzIHw9IFBBUkFNX0JVUlNUOwoJCWJyZWFrOwoJY2FzZSAnJic6CgkJaWYgKGNoZWNrX2ludmVyc2UoYXJndltvcHRpbmQtMV0sICZpbnZlcnQsICZvcHRpbmQsIDApKSBicmVhazsKCQlpZiAoc3RyaW5nX3RvX251bWJlcihvcHRhcmcsIDAsIDB4ZmZmZmZmZmYsICZudW0pID09IC0xKQoJCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAoJCQkJImJhZCAtLWhhc2hsaW1pdC1odGFibGUtc2l6ZTogYCVzJyIsIG9wdGFyZyk7CgkJci0+Y2ZnLnNpemUgPSBudW07CgkJKmZsYWdzIHw9IFBBUkFNX1NJWkU7CgkJYnJlYWs7CgljYXNlICcqJzoKCQlpZiAoY2hlY2tfaW52ZXJzZShhcmd2W29wdGluZC0xXSwgJmludmVydCwgJm9wdGluZCwgMCkpIGJyZWFrOwoJCWlmIChzdHJpbmdfdG9fbnVtYmVyKG9wdGFyZywgMCwgMHhmZmZmZmZmZiwgJm51bSkgPT0gLTEpCgkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCgkJCQkiYmFkIC0taGFzaGxpbWl0LWh0YWJsZS1tYXg6IGAlcyciLCBvcHRhcmcpOwoJCXItPmNmZy5tYXggPSBudW07CgkJKmZsYWdzIHw9IFBBUkFNX01BWDsKCQlicmVhazsKCWNhc2UgJygnOgoJCWlmIChjaGVja19pbnZlcnNlKGFyZ3Zbb3B0aW5kLTFdLCAmaW52ZXJ0LCAmb3B0aW5kLCAwKSkgYnJlYWs7CgkJaWYgKHN0cmluZ190b19udW1iZXIob3B0YXJnLCAwLCAweGZmZmZmZmZmLCAmbnVtKSA9PSAtMSkKCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKCQkJCSJiYWQgLS1oYXNobGltaXQtaHRhYmxlLWdjaW50ZXJ2YWw6IGAlcyciLCAKCQkJCW9wdGFyZyk7CgkJLyogRklYTUU6IG5vdCBIWiBkZXBlbmRlbnQhISAqLwoJCXItPmNmZy5nY19pbnRlcnZhbCA9IG51bTsKCQkqZmxhZ3MgfD0gUEFSQU1fR0NJTlRFUlZBTDsKCQlicmVhazsKCWNhc2UgJyknOgoJCWlmIChjaGVja19pbnZlcnNlKGFyZ3Zbb3B0aW5kLTFdLCAmaW52ZXJ0LCAmb3B0aW5kLCAwKSkgYnJlYWs7CgkJaWYgKHN0cmluZ190b19udW1iZXIob3B0YXJnLCAwLCAweGZmZmZmZmZmLCAmbnVtKSA9PSAtMSkKCQkJZXhpdF9lcnJvcihQQVJBTUVURVJfUFJPQkxFTSwKCQkJCSJiYWQgLS1oYXNobGltaXQtaHRhYmxlLWV4cGlyZTogYCVzJyIsIG9wdGFyZyk7CgkJLyogRklYTUU6IG5vdCBIWiBkZXBlbmRlbnQgKi8KCQlyLT5jZmcuZXhwaXJlID0gbnVtOwoJCSpmbGFncyB8PSBQQVJBTV9FWFBJUkU7CgkJYnJlYWs7CgljYXNlICdfJzoKCQlpZiAoY2hlY2tfaW52ZXJzZShhcmd2W29wdGluZC0xXSwgJmludmVydCwgJm9wdGluZCwgMCkpIGJyZWFrOwoJCWlmIChwYXJzZV9tb2RlKHIsIG9wdGFyZykgPCAwKQoJCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLCAKCQkJCSAgICJiYWQgLS1oYXNobGltaXQtbW9kZTogYCVzJ1xuIiwgb3B0YXJnKTsKCQkqZmxhZ3MgfD0gUEFSQU1fTU9ERTsKCQlicmVhazsKCWNhc2UgJyInOgoJCWlmIChjaGVja19pbnZlcnNlKGFyZ3Zbb3B0aW5kLTFdLCAmaW52ZXJ0LCAmb3B0aW5kLCAwKSkgYnJlYWs7CgkJaWYgKHN0cmxlbihvcHRhcmcpID09IDApCgkJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sICJaZXJvLWxlbmd0aCBuYW1lPyIpOwoJCXN0cm5jcHkoci0+bmFtZSwgb3B0YXJnLCBzaXplb2Yoci0+bmFtZSkpOwoJCSpmbGFncyB8PSBQQVJBTV9OQU1FOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlyZXR1cm4gMDsKCX0KCglpZiAoaW52ZXJ0KQoJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCgkJCSAgICJoYXNobGltaXQgZG9lcyBub3Qgc3VwcG9ydCBpbnZlcnQiKTsKCglyZXR1cm4gMTsKfQoKLyogRmluYWwgY2hlY2s7IG5vdGhpbmcuICovCnN0YXRpYyB2b2lkIGhhc2hsaW1pdF9jaGVjayh1bnNpZ25lZCBpbnQgZmxhZ3MpCnsKCWlmICghKGZsYWdzICYgUEFSQU1fTElNSVQpKQoJCWV4aXRfZXJyb3IoUEFSQU1FVEVSX1BST0JMRU0sCgkJCQkiWW91IGhhdmUgdG8gc3BlY2lmeSAtLWhhc2hsaW1pdCIpOwoJaWYgKCEoZmxhZ3MgJiBQQVJBTV9NT0RFKSkKCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAoJCQkJIllvdSBoYXZlIHRvIHNwZWNpZnkgLS1oYXNobGltaXQtbW9kZSIpOwoJaWYgKCEoZmxhZ3MgJiBQQVJBTV9OQU1FKSkKCQlleGl0X2Vycm9yKFBBUkFNRVRFUl9QUk9CTEVNLAoJCQkJIllvdSBoYXZlIHRvIHNwZWNpZnkgLS1oYXNobGltaXQtbmFtZSIpOwp9CgpzdGF0aWMgY29uc3Qgc3RydWN0IHJhdGVzCnsKCWNvbnN0IGNoYXIgKm5hbWU7Cgl1X2ludDMyX3QgbXVsdDsKfSByYXRlc1tdID0geyB7ICJkYXkiLCBYVF9IQVNITElNSVRfU0NBTEUqMjQqNjAqNjAgfSwKCSAgICAgIHsgImhvdXIiLCBYVF9IQVNITElNSVRfU0NBTEUqNjAqNjAgfSwKCSAgICAgIHsgIm1pbiIsIFhUX0hBU0hMSU1JVF9TQ0FMRSo2MCB9LAoJICAgICAgeyAic2VjIiwgWFRfSEFTSExJTUlUX1NDQUxFIH0gfTsKCnN0YXRpYyB2b2lkIHByaW50X3JhdGUodV9pbnQzMl90IHBlcmlvZCkKewoJdW5zaWduZWQgaW50IGk7CgoJZm9yIChpID0gMTsgaSA8IHNpemVvZihyYXRlcykvc2l6ZW9mKHN0cnVjdCByYXRlcyk7IGkrKykgewoJCWlmIChwZXJpb2QgPiByYXRlc1tpXS5tdWx0CiAgICAgICAgICAgIHx8IHJhdGVzW2ldLm11bHQvcGVyaW9kIDwgcmF0ZXNbaV0ubXVsdCVwZXJpb2QpCgkJCWJyZWFrOwoJfQoKCXByaW50ZigiJXUvJXMgIiwgcmF0ZXNbaS0xXS5tdWx0IC8gcGVyaW9kLCByYXRlc1tpLTFdLm5hbWUpOwp9CgpzdGF0aWMgdm9pZCBwcmludF9tb2RlKGNvbnN0IHN0cnVjdCB4dF9oYXNobGltaXRfaW5mbyAqciwgY2hhciBzZXBhcmF0b3IpCnsKCWludCBwcmV2bW9kZSA9IDA7CgoJaWYgKHItPmNmZy5tb2RlICYgWFRfSEFTSExJTUlUX0hBU0hfU0lQKSB7CgkJaWYgKHByZXZtb2RlKQoJCQlwdXRjaGFyKHNlcGFyYXRvcik7CgkJZnB1dHMoInNyY2lwIiwgc3Rkb3V0KTsKCQlwcmV2bW9kZSA9IDE7Cgl9CglpZiAoci0+Y2ZnLm1vZGUgJiBYVF9IQVNITElNSVRfSEFTSF9TUFQpIHsKCQlpZiAocHJldm1vZGUpCgkJCXB1dGNoYXIoc2VwYXJhdG9yKTsKCQlmcHV0cygic3JjcG9ydCIsIHN0ZG91dCk7CgkJcHJldm1vZGUgPSAxOwoJfQoJaWYgKHItPmNmZy5tb2RlICYgWFRfSEFTSExJTUlUX0hBU0hfRElQKSB7CgkJaWYgKHByZXZtb2RlKQoJCQlwdXRjaGFyKHNlcGFyYXRvcik7CgkJZnB1dHMoImRzdGlwIiwgc3Rkb3V0KTsKCQlwcmV2bW9kZSA9IDE7Cgl9CglpZiAoci0+Y2ZnLm1vZGUgJiBYVF9IQVNITElNSVRfSEFTSF9EUFQpIHsKCQlpZiAocHJldm1vZGUpCgkJCXB1dGNoYXIoc2VwYXJhdG9yKTsKCQlmcHV0cygiZHN0cG9ydCIsIHN0ZG91dCk7Cgl9CglwdXRjaGFyKCcgJyk7Cn0KCi8qIFByaW50cyBvdXQgdGhlIG1hdGNoaW5mby4gKi8Kc3RhdGljIHZvaWQgaGFzaGxpbWl0X3ByaW50KGNvbnN0IHZvaWQgKmlwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHh0X2VudHJ5X21hdGNoICptYXRjaCwgaW50IG51bWVyaWMpCnsKCXN0cnVjdCB4dF9oYXNobGltaXRfaW5mbyAqciA9IAoJCShzdHJ1Y3QgeHRfaGFzaGxpbWl0X2luZm8gKiltYXRjaC0+ZGF0YTsKCWZwdXRzKCJsaW1pdDogYXZnICIsIHN0ZG91dCk7IHByaW50X3JhdGUoci0+Y2ZnLmF2Zyk7CglwcmludGYoImJ1cnN0ICV1ICIsIHItPmNmZy5idXJzdCk7CglmcHV0cygibW9kZSAiLCBzdGRvdXQpOwoJcHJpbnRfbW9kZShyLCAnLScpOwoJaWYgKHItPmNmZy5zaXplKQoJCXByaW50ZigiaHRhYmxlLXNpemUgJXUgIiwgci0+Y2ZnLnNpemUpOwoJaWYgKHItPmNmZy5tYXgpCgkJcHJpbnRmKCJodGFibGUtbWF4ICV1ICIsIHItPmNmZy5tYXgpOwoJaWYgKHItPmNmZy5nY19pbnRlcnZhbCAhPSBYVF9IQVNITElNSVRfR0NJTlRFUlZBTCkKCQlwcmludGYoImh0YWJsZS1nY2ludGVydmFsICV1ICIsIHItPmNmZy5nY19pbnRlcnZhbCk7CglpZiAoci0+Y2ZnLmV4cGlyZSAhPSBYVF9IQVNITElNSVRfRVhQSVJFKQoJCXByaW50ZigiaHRhYmxlLWV4cGlyZSAldSAiLCByLT5jZmcuZXhwaXJlKTsKfQoKLyogRklYTUU6IE1ha2UgbWluaW1hbGlzdDogb25seSBwcmludCByYXRlIGlmIG5vdCBkZWZhdWx0IC0tUlIgKi8Kc3RhdGljIHZvaWQgaGFzaGxpbWl0X3NhdmUoY29uc3Qgdm9pZCAqaXAsIGNvbnN0IHN0cnVjdCB4dF9lbnRyeV9tYXRjaCAqbWF0Y2gpCnsKCXN0cnVjdCB4dF9oYXNobGltaXRfaW5mbyAqciA9IAoJCShzdHJ1Y3QgeHRfaGFzaGxpbWl0X2luZm8gKiltYXRjaC0+ZGF0YTsKCglmcHV0cygiLS1oYXNobGltaXQgIiwgc3Rkb3V0KTsgcHJpbnRfcmF0ZShyLT5jZmcuYXZnKTsKCWlmIChyLT5jZmcuYnVyc3QgIT0gWFRfSEFTSExJTUlUX0JVUlNUKQoJCXByaW50ZigiLS1oYXNobGltaXQtYnVyc3QgJXUgIiwgci0+Y2ZnLmJ1cnN0KTsKCglmcHV0cygiLS1oYXNobGltaXQtbW9kZSAiLCBzdGRvdXQpOwoJcHJpbnRfbW9kZShyLCAnLCcpOwoJCglwcmludGYoIi0taGFzaGxpbWl0LW5hbWUgJXMgIiwgci0+bmFtZSk7CgoJaWYgKHItPmNmZy5zaXplKQoJCXByaW50ZigiLS1oYXNobGltaXQtaHRhYmxlLXNpemUgJXUgIiwgci0+Y2ZnLnNpemUpOwoJaWYgKHItPmNmZy5tYXgpCgkJcHJpbnRmKCItLWhhc2hsaW1pdC1odGFibGUtbWF4ICV1ICIsIHItPmNmZy5tYXgpOwoJaWYgKHItPmNmZy5nY19pbnRlcnZhbCAhPSBYVF9IQVNITElNSVRfR0NJTlRFUlZBTCkKCQlwcmludGYoIi0taGFzaGxpbWl0LWh0YWJsZS1nY2ludGVydmFsICV1Iiwgci0+Y2ZnLmdjX2ludGVydmFsKTsKCWlmIChyLT5jZmcuZXhwaXJlICE9IFhUX0hBU0hMSU1JVF9FWFBJUkUpCgkJcHJpbnRmKCItLWhhc2hsaW1pdC1odGFibGUtZXhwaXJlICV1ICIsIHItPmNmZy5leHBpcmUpOwp9CgpzdGF0aWMgc3RydWN0IHh0YWJsZXNfbWF0Y2ggaGFzaGxpbWl0X21hdGNoID0gewoJLmZhbWlseQkJPSBBRl9JTkVULAoJLm5hbWUJCT0gImhhc2hsaW1pdCIsCgkudmVyc2lvbgk9IElQVEFCTEVTX1ZFUlNJT04sCgkuc2l6ZQkJPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X2hhc2hsaW1pdF9pbmZvKSksCgkudXNlcnNwYWNlc2l6ZQk9IG9mZnNldG9mKHN0cnVjdCB4dF9oYXNobGltaXRfaW5mbywgaGluZm8pLAoJLmhlbHAJCT0gaGFzaGxpbWl0X2hlbHAsCgkuaW5pdAkJPSBoYXNobGltaXRfaW5pdCwKCS5wYXJzZQkJPSBoYXNobGltaXRfcGFyc2UsCgkuZmluYWxfY2hlY2sJPSBoYXNobGltaXRfY2hlY2ssCgkucHJpbnQJCT0gaGFzaGxpbWl0X3ByaW50LAoJLnNhdmUJCT0gaGFzaGxpbWl0X3NhdmUsCgkuZXh0cmFfb3B0cwk9IGhhc2hsaW1pdF9vcHRzLAp9OwoKc3RhdGljIHN0cnVjdCB4dGFibGVzX21hdGNoIGhhc2hsaW1pdF9tYXRjaDYgPSB7CgkuZmFtaWx5CQk9IEFGX0lORVQ2LAoJLm5hbWUJCT0gImhhc2hsaW1pdCIsCgkudmVyc2lvbgk9IElQVEFCTEVTX1ZFUlNJT04sCgkuc2l6ZQkJPSBYVF9BTElHTihzaXplb2Yoc3RydWN0IHh0X2hhc2hsaW1pdF9pbmZvKSksCgkudXNlcnNwYWNlc2l6ZQk9IG9mZnNldG9mKHN0cnVjdCB4dF9oYXNobGltaXRfaW5mbywgaGluZm8pLAoJLmhlbHAJCT0gaGFzaGxpbWl0X2hlbHAsCgkuaW5pdAkJPSBoYXNobGltaXRfaW5pdCwKCS5wYXJzZQkJPSBoYXNobGltaXRfcGFyc2UsCgkuZmluYWxfY2hlY2sJPSBoYXNobGltaXRfY2hlY2ssCgkucHJpbnQJCT0gaGFzaGxpbWl0X3ByaW50LAoJLnNhdmUJCT0gaGFzaGxpbWl0X3NhdmUsCgkuZXh0cmFfb3B0cwk9IGhhc2hsaW1pdF9vcHRzLAp9OwoKdm9pZCBfaW5pdCh2b2lkKQp7Cgl4dGFibGVzX3JlZ2lzdGVyX21hdGNoKCZoYXNobGltaXRfbWF0Y2gpOwoJeHRhYmxlc19yZWdpc3Rlcl9tYXRjaCgmaGFzaGxpbWl0X21hdGNoNik7Cn0K