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+d1ZTcGFjZTsgcGFyYWdyYXBoID0gcGFyYWdyYXBoLT5uZXh0KQoJcHJpbnRfdGV4dChwYXJhZ3JhcGgtPmxwc3pUZXh0KTsKICAgICAgcHJpbnRmKGZvcm1hdC5maXJzdF9wYXJhZ3JhcGgpOwoKICAgICAgZm9yICg7IHBhcmFncmFwaDsgcGFyYWdyYXBoID0gcGFyYWdyYXBoLT5uZXh0KQoJewoJICAvKiBOZXcgbGluZTsgbmV3IHBhcmFncmFwaCAqLwoJICBpZiAocGFyYWdyYXBoLT53VlNwYWNlID09IDEpCgkgICAgcHJpbnRmKGZvcm1hdC5uZXdsaW5lKTsKCSAgZWxzZSBpZiAocGFyYWdyYXBoLT53VlNwYWNlID4gMSkKCSAgICBwcmludGYoZm9ybWF0Lm5leHRfcGFyYWdyYXBoKTsKCgkgIGlmIChwYXJhZ3JhcGgtPndGb250KQoJICAgIHByaW50Zihmb3JtYXQuYmVnaW5fYm9sZGZhY2UpOwoKCSAgcHJpbnRfdGV4dChwYXJhZ3JhcGgtPmxwc3pUZXh0KTsKCgkgIGlmIChwYXJhZ3JhcGgtPndGb250KQoJICAgIHByaW50Zihmb3JtYXQuZW5kX2JvbGRmYWNlKTsKCX0KICAgIH0KCiAgcHJpbnRmKGZvcm1hdC50YWlsKTsKCiAgcmV0dXJuKDApOwp9CgovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICoKICogICAgICAgICAgIFN1YnN0aXR1dGlvbnMgZm9yIHNvbWUgV0lORUxJQiBmdW5jdGlvbnMKICovCgpzdGF0aWMgRklMRSAqZmlsZSA9IDA7CgpIRklMRSBPcGVuRmlsZSggTFBDU1RSIHBhdGgsIE9GU1RSVUNUICpvZnMsIFVJTlQgbW9kZSApCnsKICBmaWxlID0gKnBhdGggPyBmb3BlbihwYXRoLCAiciIpIDogc3RkaW47CiAgcmV0dXJuIGZpbGUgPyAxIDogSEZJTEVfRVJST1I7Cn0KCkhGSUxFIF9sY2xvc2UoIEhGSUxFIGhGaWxlICkKewogIGZjbG9zZShmaWxlKTsKICByZXR1cm4gMDsKfQoKTE9ORyBfaHJlYWQoIEhGSUxFIGhGaWxlLCBTRUdQVFIgYnVmZmVyLCBMT05HIGNvdW50ICkKewogIHJldHVybiBmcmVhZChidWZmZXIsIDEsIGNvdW50LCBmaWxlKTsKfQoKSEdMT0JBTCBHbG9iYWxBbGxvYyggVUlOVCBmbGFncywgRFdPUkQgc2l6ZSApCnsKICByZXR1cm4gKEhHTE9CQUwpIG1hbGxvYyhzaXplKTsKfQoKTFBWT0lEIEdsb2JhbExvY2soIEhHTE9CQUwgaGFuZGxlICkKewogIHJldHVybiAoTFBWT0lEKSBoYW5kbGU7Cn0KCkhHTE9CQUwgR2xvYmFsRnJlZSggSEdMT0JBTCBoYW5kbGUgKQp7CiAgZnJlZSgoVk9JRCopIGhhbmRsZSk7CiAgcmV0dXJuKDApOwp9CgovKgogKiBTdHJpbmcgZnVuY3Rpb25zCiAqCiAqIENvcHlyaWdodCAxOTkzIFluZ3ZpIFNpZ3Vyam9uc3NvbiAoeW5ndmlAaGFmcm8uaXMpCiAqLwoKSU5UIGxzdHJjbXAoTFBDU1RSIHN0cjEsTFBDU1RSIHN0cjIpCnsKICByZXR1cm4gc3RyY21wKCBzdHIxLCBzdHIyICk7Cn0KCklOVCBsc3RyY21waSggTFBDU1RSIHN0cjEsIExQQ1NUUiBzdHIyICkKewogIElOVCByZXM7CgogIHdoaWxlICgqc3RyMSkKICAgIHsKICAgICAgaWYgKChyZXMgPSB0b3VwcGVyKCpzdHIxKSAtIHRvdXBwZXIoKnN0cjIpKSAhPSAwKSByZXR1cm4gcmVzOwogICAgICBzdHIxKys7CiAgICAgIHN0cjIrKzsKICAgIH0KICByZXR1cm4gdG91cHBlcigqc3RyMSkgLSB0b3VwcGVyKCpzdHIyKTsKfQoKSU5UIGxzdHJsZW4oTFBDU1RSIHN0cikKewogIHJldHVybiBzdHJsZW4oc3RyKTsKfQoKTFBTVFIgbHN0cmNweTMyQSggTFBTVFIgZHN0LCBMUENTVFIgc3JjICkKewogICAgaWYgKCFzcmMgfHwgIWRzdCkgcmV0dXJuIE5VTEw7CiAgICBzdHJjcHkoIGRzdCwgc3JjICk7CiAgICByZXR1cm4gZHN0Owp9Cgp2b2lkIGhtZW1jcHkoTFBWT0lEIGhwdkRlc3QsIExQQ1ZPSUQgaHB2U291cmNlLCBMT05HIGNiQ29weSkKewogIG1lbWNweShocHZEZXN0LCBocHZTb3VyY2UsIGNiQ29weSk7Cn0KCi8qIExvY2FsIFZhcmlhYmxlczogICAgKi8KLyogYy1maWxlLXN0eWxlOiAiR05VIiAqLwovKiBFbmQ6ICAgICAgICAgICAgICAgICovCg==