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+d1ZTcGFjZTsgcGFyYWdyYXBoID0gcGFyYWdyYXBoLT5uZXh0KQoJcHJpbnRfdGV4dChwYXJhZ3JhcGgtPmxwc3pUZXh0KTsKICAgICAgcHJpbnRmKGZvcm1hdC5maXJzdF9wYXJhZ3JhcGgpOwoKICAgICAgZm9yICg7IHBhcmFncmFwaDsgcGFyYWdyYXBoID0gcGFyYWdyYXBoLT5uZXh0KQoJewoJICAvKiBOZXcgbGluZTsgbmV3IHBhcmFncmFwaCAqLwoJICBpZiAocGFyYWdyYXBoLT53VlNwYWNlID09IDEpCgkgICAgcHJpbnRmKGZvcm1hdC5uZXdsaW5lKTsKCSAgZWxzZSBpZiAocGFyYWdyYXBoLT53VlNwYWNlID4gMSkKCSAgICBwcmludGYoZm9ybWF0Lm5leHRfcGFyYWdyYXBoKTsKCgkgIGlmIChwYXJhZ3JhcGgtPndGb250KQoJICAgIHByaW50Zihmb3JtYXQuYmVnaW5fYm9sZGZhY2UpOwoKCSAgcHJpbnRfdGV4dChwYXJhZ3JhcGgtPmxwc3pUZXh0KTsKCgkgIGlmIChwYXJhZ3JhcGgtPndGb250KQoJICAgIHByaW50Zihmb3JtYXQuZW5kX2JvbGRmYWNlKTsKCX0KICAgIH0KCiAgcHJpbnRmKGZvcm1hdC50YWlsKTsKCiAgcmV0dXJuKDApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogICAgICAgICAgIFN1YnN0aXR1dGlvbnMgZm9yIHNvbWUgV0lORUxJQiBmdW5jdGlvbnMKICovCgpIRklMRSBPcGVuRmlsZSggTFBDU1RSIHBhdGgsIE9GU1RSVUNUICpvZnMsIFVJTlQgbW9kZSApCnsKICBGSUxFICpmaWxlOwoKICBpZiAoISpwYXRoKSByZXR1cm4gKEhGSUxFKSBzdGRpbjsKCiAgZmlsZSA9IGZvcGVuKHBhdGgsICJyIik7CiAgaWYgKCFmaWxlKSByZXR1cm4gSEZJTEVfRVJST1I7CiAgcmV0dXJuIChIRklMRSkgZmlsZTsKfQoKSEZJTEUgX2xjbG9zZSggSEZJTEUgaEZpbGUgKQp7CiAgZmNsb3NlKChGSUxFKikgaEZpbGUpOwogIHJldHVybiAwOwp9CgpMT05HIF9ocmVhZCggSEZJTEUgaEZpbGUsIFNFR1BUUiBidWZmZXIsIExPTkcgY291bnQgKQp7CiAgcmV0dXJuIGZyZWFkKGJ1ZmZlciwgMSwgY291bnQsIChGSUxFKikgaEZpbGUpOwp9CgpIR0xPQkFMIEdsb2JhbEFsbG9jKCBXT1JEIGZsYWdzLCBEV09SRCBzaXplICkKewogIHJldHVybiAoSEdMT0JBTCkgbWFsbG9jKHNpemUpOwp9CgpMUFZPSUQgR2xvYmFsTG9jayggSEdMT0JBTCBoYW5kbGUgKQp7CiAgcmV0dXJuIChMUFZPSUQpIGhhbmRsZTsKfQoKSEdMT0JBTCBHbG9iYWxGcmVlKCBIR0xPQkFMIGhhbmRsZSApCnsKICBmcmVlKChWT0lEKikgaGFuZGxlKTsKICByZXR1cm4oMCk7Cn0KCi8qCiAqIFN0cmluZyBmdW5jdGlvbnMKICoKICogQ29weXJpZ2h0IDE5OTMgWW5ndmkgU2lndXJqb25zc29uICh5bmd2aUBoYWZyby5pcykKICovCgpJTlQgbHN0cmNtcChMUENTVFIgc3RyMSxMUENTVFIgc3RyMikKewogIHJldHVybiBzdHJjbXAoIHN0cjEsIHN0cjIgKTsKfQoKSU5UIGxzdHJjbXBpKCBMUENTVFIgc3RyMSwgTFBDU1RSIHN0cjIgKQp7CiAgSU5UIHJlczsKCiAgd2hpbGUgKCpzdHIxKQogICAgewogICAgICBpZiAoKHJlcyA9IHRvdXBwZXIoKnN0cjEpIC0gdG91cHBlcigqc3RyMikpICE9IDApIHJldHVybiByZXM7CiAgICAgIHN0cjErKzsKICAgICAgc3RyMisrOwogICAgfQogIHJldHVybiB0b3VwcGVyKCpzdHIxKSAtIHRvdXBwZXIoKnN0cjIpOwp9CgpJTlQgbHN0cmxlbihMUENTVFIgc3RyKQp7CiAgcmV0dXJuIHN0cmxlbihzdHIpOwp9CgpTRUdQVFIgbHN0cmNweSggU0VHUFRSIHRhcmdldCwgU0VHUFRSIHNvdXJjZSApCnsKICBzdHJjcHkoIChjaGFyICopdGFyZ2V0LCAoY2hhciAqKXNvdXJjZSApOwogIHJldHVybiB0YXJnZXQ7Cn0KCnZvaWQgaG1lbWNweShMUFZPSUQgaHB2RGVzdCwgTFBDVk9JRCBocHZTb3VyY2UsIExPTkcgY2JDb3B5KQp7CiAgbWVtY3B5KGhwdkRlc3QsIGhwdlNvdXJjZSwgY2JDb3B5KTsKfQoKLyogTG9jYWwgVmFyaWFibGVzOiAgICAqLwovKiBjLWZpbGUtc3R5bGU6ICJHTlUiICovCi8qIEVuZDogICAgICAgICAgICAgICAgKi8K