LyoKICogQ29weXJpZ2h0IDE5OTYgVWxyaWNoIFNjaG1pZAogKi8KCiNpbmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHRpbWUuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxmY250bC5oPgojaW5jbHVkZSAid2luZG93cy5oIgojaW5jbHVkZSAiaGxwZmlsZS5oIgoKdHlwZWRlZiBzdHJ1Y3QKewogIGNvbnN0IGNoYXIgKmhlYWRlcjE7CiAgY29uc3QgY2hhciAqaGVhZGVyMjsKICBjb25zdCBjaGFyICpzZWN0aW9uOwogIGNvbnN0IGNoYXIgKmZpcnN0X3BhcmFncmFwaDsKICBjb25zdCBjaGFyICpuZXdsaW5lOwogIGNvbnN0IGNoYXIgKm5leHRfcGFyYWdyYXBoOwogIGNvbnN0IGNoYXIgKnNwZWNpYWxfY2hhcjsKICBjb25zdCBjaGFyICpiZWdpbl9pdGFsaWM7CiAgY29uc3QgY2hhciAqZW5kX2l0YWxpYzsKICBjb25zdCBjaGFyICpiZWdpbl9ib2xkZmFjZTsKICBjb25zdCBjaGFyICplbmRfYm9sZGZhY2U7CiAgY29uc3QgY2hhciAqYmVnaW5fdHlwZXdyaXRlcjsKICBjb25zdCBjaGFyICplbmRfdHlwZXdyaXRlcjsKICBjb25zdCBjaGFyICp0YWlsOwp9IEZPUk1BVDsKCnR5cGVkZWYgc3RydWN0CnsKICBjb25zdCBjaGFyIGNoOwogIGNvbnN0IGNoYXIgKnN1YnN0Owp9IENIQVJNQVBbXTsKCgpGT1JNQVQgZm9ybWF0ID0KewogICI8IWRvY3R5cGUgbGludXhkb2Mgc3lzdGVtPlxuIgogICI8YXJ0aWNsZT5cbiIKICAiPHRpdGxlPlxuIiwKCiAgIlxuPGF1dGhvcj5cbiVzXG4iCiAgIjxkYXRlPlxuJXNcbiIsCgogICJcbjxzZWN0PlxuIiwKICAiXG48cD5cbiIsCiAgIlxuPG5ld2xpbmU+XG4iLAogICJcblxuIiwKCiAgIiYlczsiLAoKICAiPGVtPiIsCiAgIjwvZW0+IiwKICAiPGJmPiIsCiAgIjwvYmY+IiwKICAiPHR0PiIsCiAgIjwvdHQ+IiwKCiAgIlxuPC9hcnRpY2xlPlxuIgp9OwoKQ0hBUk1BUCBjaGFybWFwID0KICB7eyfGJywgIkFFbGlnIn0sCiAgIHsnwScsICJBYWN1dGUifSwKICAgeyfCJywgIkFjaXJjIn0sCiAgIHsnwCcsICJBZ3JhdmUifSwKICAgeyfDJywgIkF0aWxkZSJ9LAogICB7J8cnLCAiQ2NlZGlsIn0sCiAgIHsnyScsICJFYWN1dGUifSwKICAgeyfIJywgIkVncmF2ZSJ9LAogICB7J8snLCAiRXVtbCJ9LAogICB7J80nLCAiSWFjdXRlIn0sCiAgIHsnzicsICJJY2lyYyJ9LAogICB7J8wnLCAiSWdyYXZlIn0sCiAgIHsnzycsICJJdW1sIn0sCiAgIHsn0ScsICJOdGlsZGUifSwKICAgeyfTJywgIk9hY3V0ZSJ9LAogICB7J9QnLCAiT2NpcmMifSwKICAgeyfSJywgIk9ncmF2ZSJ9LAogICB7J9gnLCAiT3NsYXNoIn0sCiAgIHsn2icsICJVYWN1dGUifSwKICAgeyfZJywgIlVncmF2ZSJ9LAogICB7J90nLCAiWWFjdXRlIn0sCiAgIHsn4ScsICJhYWN1dGUifSwKICAgeyfiJywgImFjaXJjIn0sCiAgIHsn5icsICJhZWxpZyJ9LAogICB7J+AnLCAiYWdyYXZlIn0sCiAgIHsn5ScsICJhcmluZyJ9LAogICB7J+MnLCAiYXRpbGRlIn0sCiAgIHsn5ycsICJjY2VkaWwifSwKICAgeyfpJywgImVhY3V0ZSJ9LAogICB7J+onLCAiZWNpcmMifSwKICAgeyfoJywgImVncmF2ZSJ9LAogICB7J+snLCAiZXVtbCJ9LAogICB7J+0nLCAiaWFjdXRlIn0sCiAgIHsn7icsICJpY2lyYyJ9LAogICB7J+wnLCAiaWdyYXZlIn0sCiAgIHsn7ycsICJpdW1sIn0sCiAgIHsn8ScsICJudGlsZGUifSwKICAgeyfzJywgIm9hY3V0ZSJ9LAogICB7J/8nLCAieXVtbCJ9LAogICB7J/QnLCAib2NpcmMifSwKICAgeyfyJywgIm9ncmF2ZSJ9LAogICB7J/gnLCAib3NsYXNoIn0sCiAgIHsn9ScsICJvdGlsZGUifSwKICAgeyf6JywgInVhY3V0ZSJ9LAogICB7J/snLCAidWNpcmMifSwKICAgeyf5JywgInVncmF2ZSJ9LAogICB7J/0nLCAieWFjdXRlIn0sCiAgIHsnPCcsICJsdCJ9LAogICB7JyYnLCAiYW1wIn0sCiAgIHsnIicsICJkcXVvdCJ9LAogICB7JyMnLCAibnVtIn0sCiAgIHsnJScsICJwZXJjbnQifSwKICAgeydcJycsICJxdW90In0sCiNpZiAwCiAgIHsnKCcsICJscGFyIn0sCiAgIHsnKScsICJycGFyIn0sCiAgIHsnKicsICJhc3QifSwKICAgeycrJywgInBsdXMifSwKICAgeycsJywgImNvbW1hIn0sCiAgIHsnLScsICJoeXBoZW4ifSwKICAgeyc6JywgImNvbG9uIn0sCiAgIHsnOycsICJzZW1pIn0sCiAgIHsnPScsICJlcXVhbHMifSwKICAgeydAJywgImNvbW1hdCJ9LAogICB7J1snLCAibHNxYiJ9LAogICB7J10nLCAicnNxYiJ9LAogICB7J14nLCAiY2lyYyJ9LAogICB7J18nLCAibG93YmFyIn0sCiAgIHsneycsICJsY3ViIn0sCiAgIHsnfCcsICJ2ZXJiYXIifSwKICAgeyd9JywgInJjdWIifSwKICAgeyd+JywgInRpbGRlIn0sCiNlbmRpZgogICB7J1xcJywgImJzb2wifSwKICAgeyckJywgImRvbGxhciJ9LAogICB7J8QnLCAiQXVtbCJ9LAogICB7J+QnLCAiYXVtbCJ9LAogICB7J9YnLCAiT3VtbCJ9LAogICB7J/YnLCAib3VtbCJ9LAogICB7J9wnLCAiVXVtbCJ9LAogICB7J/wnLCAidXVtbCJ9LAogICB7J98nLCAic3psaWcifSwKICAgeyc+JywgImd0In0sCiAgIHsnpycsICJzZWN0In0sCiAgIHsnticsICJwYXJhIn0sCiAgIHsnqScsICJjb3B5In0sCiAgIHsnoScsICJpZXhjbCJ9LAogICB7J78nLCAiaXF1ZXN0In0sCiAgIHsnoicsICJjZW50In0sCiAgIHsnoycsICJwb3VuZCJ9LAogICB7J9cnLCAidGltZXMifSwKICAgeyexJywgInBsdXNtbiJ9LAogICB7J/cnLCAiZGl2aWRlIn0sCiAgIHsnrCcsICJub3QifSwKICAgeye1JywgIm11In0sCiAgIHswLDB9fTsKCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgICAgICAgICAgcHJpbnRfdGV4dAogKi8KCnN0YXRpYyB2b2lkIHByaW50X3RleHQoY29uc3QgY2hhciAqcCkKewogIGludCBpOwoKICBmb3IgKDsgKnA7IHArKykKICAgIHsKICAgICAgZm9yIChpID0gMDsgY2hhcm1hcFtpXS5jaDsgaSsrKQoJaWYgKCpwID09IGNoYXJtYXBbaV0uY2gpCgkgIHsKCSAgICBwcmludGYoZm9ybWF0LnNwZWNpYWxfY2hhciwgY2hhcm1hcFtpXS5zdWJzdCk7CgkgICAgYnJlYWs7CgkgIH0KICAgICAgaWYgKCFjaGFybWFwW2ldLmNoKQoJcHJpbnRmKCIlYyIsICpwKTsKICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICAgICAgICAgICBtYWluCiAqLwoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CiAgSExQRklMRSAgICpobHBmaWxlOwogIEhMUEZJTEVfUEFHRSAqcGFnZTsKICBITFBGSUxFX1BBUkFHUkFQSCAqcGFyYWdyYXBoOwogIHRpbWVfdCB0OwogIGNoYXIgZGF0ZVs1MF07CiAgY2hhciAqZmlsZW5hbWU7CgogIGhscGZpbGUgPSBITFBGSUxFX1JlYWRIbHBGaWxlKGFyZ2MgPiAxID8gYXJndlsxXSA6ICIiKTsKCiAgaWYgKCFobHBmaWxlKSByZXR1cm4oMik7CgogIHRpbWUoJnQpOwogIHN0cmZ0aW1lKGRhdGUsIHNpemVvZihkYXRlKSwgIiV4IiwgbG9jYWx0aW1lKCZ0KSk7CiAgZmlsZW5hbWUgPSBzdHJyY2hyKGhscGZpbGUtPmxwc3pQYXRoLCAnLycpOwogIGlmIChmaWxlbmFtZSkgZmlsZW5hbWUrKzsKICBlbHNlIGZpbGVuYW1lID0gaGxwZmlsZS0+bHBzelBhdGg7CgogIC8qIEhlYWRlciAqLwogIHByaW50Zihmb3JtYXQuaGVhZGVyMSk7CiAgcHJpbnRfdGV4dChobHBmaWxlLT5scHN6VGl0bGUpOwogIHByaW50Zihmb3JtYXQuaGVhZGVyMiwgZmlsZW5hbWUsIGRhdGUpOwoKICBmb3IgKHBhZ2UgPSBobHBmaWxlLT5maXJzdF9wYWdlOyBwYWdlOyBwYWdlID0gcGFnZS0+bmV4dCkKICAgIHsKICAgICAgcGFyYWdyYXBoID0gcGFnZS0+Zmlyc3RfcGFyYWdyYXBoOwogICAgICBpZiAoIXBhcmFncmFwaCkgY29udGludWU7CgogICAgICAvKiBTZWN0aW9uICovCiAgICAgIHByaW50Zihmb3JtYXQuc2VjdGlvbik7CiAgICAgIGZvciAoOyBwYXJhZ3JhcGggJiYgIXBhcmFncmFwaC0+d1ZTcGFjZTsgcGFyYWdyYXBoID0gcGFyYWdyYXBoLT5uZXh0KQoJcHJpbnRfdGV4dChwYXJhZ3JhcGgtPmxwc3pUZXh0KTsKICAgICAgcHJpbnRmKGZvcm1hdC5maXJzdF9wYXJhZ3JhcGgpOwoKICAgICAgZm9yICg7IHBhcmFncmFwaDsgcGFyYWdyYXBoID0gcGFyYWdyYXBoLT5uZXh0KQoJewoJICAvKiBOZXcgbGluZTsgbmV3IHBhcmFncmFwaCAqLwoJICBpZiAocGFyYWdyYXBoLT53VlNwYWNlID09IDEpCgkgICAgcHJpbnRmKGZvcm1hdC5uZXdsaW5lKTsKCSAgZWxzZSBpZiAocGFyYWdyYXBoLT53VlNwYWNlID4gMSkKCSAgICBwcmludGYoZm9ybWF0Lm5leHRfcGFyYWdyYXBoKTsKCgkgIGlmIChwYXJhZ3JhcGgtPndGb250KQoJICAgIHByaW50Zihmb3JtYXQuYmVnaW5fYm9sZGZhY2UpOwoKCSAgcHJpbnRfdGV4dChwYXJhZ3JhcGgtPmxwc3pUZXh0KTsKCgkgIGlmIChwYXJhZ3JhcGgtPndGb250KQoJICAgIHByaW50Zihmb3JtYXQuZW5kX2JvbGRmYWNlKTsKCX0KICAgIH0KCiAgcHJpbnRmKGZvcm1hdC50YWlsKTsKCiAgcmV0dXJuKDApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogICAgICAgICAgIFN1YnN0aXR1dGlvbnMgZm9yIHNvbWUgV0lORUxJQiBmdW5jdGlvbnMKICovCgpzdGF0aWMgRklMRSAqZmlsZSA9IDA7CgpIRklMRSBXSU5BUEkgT3BlbkZpbGUoIExQQ1NUUiBwYXRoLCBPRlNUUlVDVCAqb2ZzLCBVSU5UIG1vZGUgKQp7CiAgZmlsZSA9ICpwYXRoID8gZm9wZW4ocGF0aCwgInIiKSA6IHN0ZGluOwogIHJldHVybiBmaWxlID8gMSA6IEhGSUxFX0VSUk9SOwp9CgpIRklMRSBXSU5BUEkgX2xjbG9zZSggSEZJTEUgaEZpbGUgKQp7CiAgZmNsb3NlKGZpbGUpOwogIHJldHVybiAwOwp9CgpMT05HIFdJTkFQSSBfaHJlYWQoIEhGSUxFIGhGaWxlLCBMUFZPSUQgYnVmZmVyLCBMT05HIGNvdW50ICkKewogIHJldHVybiBmcmVhZChidWZmZXIsIDEsIGNvdW50LCBmaWxlKTsKfQoKSEdMT0JBTCBXSU5BUEkgR2xvYmFsQWxsb2MoIFVJTlQgZmxhZ3MsIERXT1JEIHNpemUgKQp7CiAgcmV0dXJuIChIR0xPQkFMKSBtYWxsb2Moc2l6ZSk7Cn0KCkxQVk9JRCBXSU5BUEkgR2xvYmFsTG9jayggSEdMT0JBTCBoYW5kbGUgKQp7CiAgcmV0dXJuIChMUFZPSUQpIGhhbmRsZTsKfQoKSEdMT0JBTCBXSU5BUEkgR2xvYmFsRnJlZSggSEdMT0JBTCBoYW5kbGUgKQp7CiAgZnJlZSgoVk9JRCopIGhhbmRsZSk7CiAgcmV0dXJuKDApOwp9CgovKgogKiBTdHJpbmcgZnVuY3Rpb25zCiAqCiAqIENvcHlyaWdodCAxOTkzIFluZ3ZpIFNpZ3Vyam9uc3NvbiAoeW5ndmlAaGFmcm8uaXMpCiAqLwoKSU5UIFdJTkFQSSBsc3RyY21wKExQQ1NUUiBzdHIxLExQQ1NUUiBzdHIyKQp7CiAgcmV0dXJuIHN0cmNtcCggc3RyMSwgc3RyMiApOwp9CgpJTlQgV0lOQVBJIGxzdHJjbXBpKCBMUENTVFIgc3RyMSwgTFBDU1RSIHN0cjIgKQp7CiAgSU5UIHJlczsKCiAgd2hpbGUgKCpzdHIxKQogICAgewogICAgICBpZiAoKHJlcyA9IHRvdXBwZXIoKnN0cjEpIC0gdG91cHBlcigqc3RyMikpICE9IDApIHJldHVybiByZXM7CiAgICAgIHN0cjErKzsKICAgICAgc3RyMisrOwogICAgfQogIHJldHVybiB0b3VwcGVyKCpzdHIxKSAtIHRvdXBwZXIoKnN0cjIpOwp9CgpJTlQgV0lOQVBJIGxzdHJsZW4oTFBDU1RSIHN0cikKewogIHJldHVybiBzdHJsZW4oc3RyKTsKfQoKTFBTVFIgV0lOQVBJIGxzdHJjcHlBKCBMUFNUUiBkc3QsIExQQ1NUUiBzcmMgKQp7CiAgICBpZiAoIXNyYyB8fCAhZHN0KSByZXR1cm4gTlVMTDsKICAgIHN0cmNweSggZHN0LCBzcmMgKTsKICAgIHJldHVybiBkc3Q7Cn0KCnZvaWQgV0lOQVBJIGhtZW1jcHkxNihMUFZPSUQgaHB2RGVzdCwgTFBDVk9JRCBocHZTb3VyY2UsIExPTkcgY2JDb3B5KQp7CiAgbWVtY3B5KGhwdkRlc3QsIGhwdlNvdXJjZSwgY2JDb3B5KTsKfQoKLyogTG9jYWwgVmFyaWFibGVzOiAgICAqLwovKiBjLWZpbGUtc3R5bGU6ICJHTlUiICovCi8qIEVuZDogICAgICAgICAgICAgICAgKi8K