LyoKICogQ29weXJpZ2h0IDE5OTYgVWxyaWNoIFNjaG1pZAogKgogKiBUaGlzIGxpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICogTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAqIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIGxpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICogTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogKiBMaWNlbnNlIGFsb25nIHdpdGggdGhpcyBsaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BICAwMjExMS0xMzA3ICBVU0EKICovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8dGltZS5oPgojaW5jbHVkZSA8Y3R5cGUuaD4KI2luY2x1ZGUgPGZjbnRsLmg+CiNpbmNsdWRlIDxhc3NlcnQuaD4KI2luY2x1ZGUgIndpbmRvd3MuaCIKI2luY2x1ZGUgImhscGZpbGUuaCIKCnR5cGVkZWYgc3RydWN0CnsKICAgIGNvbnN0IGNoYXIgKmhlYWRlcjE7CiAgICBjb25zdCBjaGFyICpoZWFkZXIyOwogICAgY29uc3QgY2hhciAqc2VjdGlvbjsKICAgIGNvbnN0IGNoYXIgKmZpcnN0X3BhcmFncmFwaDsKICAgIGNvbnN0IGNoYXIgKm5ld2xpbmU7CiAgICBjb25zdCBjaGFyICpuZXh0X3BhcmFncmFwaDsKICAgIGNvbnN0IGNoYXIgKnNwZWNpYWxfY2hhcjsKICAgIGNvbnN0IGNoYXIgKmJlZ2luX2l0YWxpYzsKICAgIGNvbnN0IGNoYXIgKmVuZF9pdGFsaWM7CiAgICBjb25zdCBjaGFyICpiZWdpbl9ib2xkZmFjZTsKICAgIGNvbnN0IGNoYXIgKmVuZF9ib2xkZmFjZTsKICAgIGNvbnN0IGNoYXIgKmJlZ2luX3R5cGV3cml0ZXI7CiAgICBjb25zdCBjaGFyICplbmRfdHlwZXdyaXRlcjsKICAgIGNvbnN0IGNoYXIgKnRhaWw7Cn0gRk9STUFUOwoKdHlwZWRlZiBzdHJ1Y3QKewogICAgY29uc3QgY2hhciBjaDsKICAgIGNvbnN0IGNoYXIgKnN1YnN0Owp9IENIQVJNQVBfRU5UUlk7CgoKRk9STUFUIGZvcm1hdCA9CnsKICAgICI8IWRvY3R5cGUgbGludXhkb2Mgc3lzdGVtPlxuIgogICAgIjxhcnRpY2xlPlxuIgogICAgIjx0aXRsZT5cbiIsCgogICAgIlxuPGF1dGhvcj5cbiVzXG4iCiAgICAiPGRhdGU+XG4lc1xuIiwKCiAgICAiXG48c2VjdD5cbiIsCiAgICAiXG48cD5cbiIsCiAgICAiXG48bmV3bGluZT5cbiIsCiAgICAiXG5cbiIsCgogICAgIiYlczsiLAoKICAgICI8ZW0+IiwKICAgICI8L2VtPiIsCiAgICAiPGJmPiIsCiAgICAiPC9iZj4iLAogICAgIjx0dD4iLAogICAgIjwvdHQ+IiwKCiAgICAiXG48L2FydGljbGU+XG4iCn07CgpDSEFSTUFQX0VOVFJZIGNoYXJtYXBbXSA9Cnt7J8YnLCAiQUVsaWcifSwKIHsnwScsICJBYWN1dGUifSwKIHsnwicsICJBY2lyYyJ9LAogeyfAJywgIkFncmF2ZSJ9LAogeyfDJywgIkF0aWxkZSJ9LAogeyfHJywgIkNjZWRpbCJ9LAogeyfJJywgIkVhY3V0ZSJ9LAogeyfIJywgIkVncmF2ZSJ9LAogeyfLJywgIkV1bWwifSwKIHsnzScsICJJYWN1dGUifSwKIHsnzicsICJJY2lyYyJ9LAogeyfMJywgIklncmF2ZSJ9LAogeyfPJywgIkl1bWwifSwKIHsn0ScsICJOdGlsZGUifSwKIHsn0ycsICJPYWN1dGUifSwKIHsn1CcsICJPY2lyYyJ9LAogeyfSJywgIk9ncmF2ZSJ9LAogeyfYJywgIk9zbGFzaCJ9LAogeyfaJywgIlVhY3V0ZSJ9LAogeyfZJywgIlVncmF2ZSJ9LAogeyfdJywgIllhY3V0ZSJ9LAogeyfhJywgImFhY3V0ZSJ9LAogeyfiJywgImFjaXJjIn0sCiB7J+YnLCAiYWVsaWcifSwKIHsn4CcsICJhZ3JhdmUifSwKIHsn5ScsICJhcmluZyJ9LAogeyfjJywgImF0aWxkZSJ9LAogeyfnJywgImNjZWRpbCJ9LAogeyfpJywgImVhY3V0ZSJ9LAogeyfqJywgImVjaXJjIn0sCiB7J+gnLCAiZWdyYXZlIn0sCiB7J+snLCAiZXVtbCJ9LAogeyftJywgImlhY3V0ZSJ9LAogeyfuJywgImljaXJjIn0sCiB7J+wnLCAiaWdyYXZlIn0sCiB7J+8nLCAiaXVtbCJ9LAogeyfxJywgIm50aWxkZSJ9LAogeyfzJywgIm9hY3V0ZSJ9LAogeyf/JywgInl1bWwifSwKIHsn9CcsICJvY2lyYyJ9LAogeyfyJywgIm9ncmF2ZSJ9LAogeyf4JywgIm9zbGFzaCJ9LAogeyf1JywgIm90aWxkZSJ9LAogeyf6JywgInVhY3V0ZSJ9LAogeyf7JywgInVjaXJjIn0sCiB7J/knLCAidWdyYXZlIn0sCiB7J/0nLCAieWFjdXRlIn0sCiB7JzwnLCAibHQifSwKIHsnJicsICJhbXAifSwKIHsnIicsICJkcXVvdCJ9LAogeycjJywgIm51bSJ9LAogeyclJywgInBlcmNudCJ9LAogeydcJycsICJxdW90In0sCiNpZiAwCiB7JygnLCAibHBhciJ9LAogeycpJywgInJwYXIifSwKIHsnKicsICJhc3QifSwKIHsnKycsICJwbHVzIn0sCiB7JywnLCAiY29tbWEifSwKIHsnLScsICJoeXBoZW4ifSwKIHsnOicsICJjb2xvbiJ9LAogeyc7JywgInNlbWkifSwKIHsnPScsICJlcXVhbHMifSwKIHsnQCcsICJjb21tYXQifSwKIHsnWycsICJsc3FiIn0sCiB7J10nLCAicnNxYiJ9LAogeydeJywgImNpcmMifSwKIHsnXycsICJsb3diYXIifSwKIHsneycsICJsY3ViIn0sCiB7J3wnLCAidmVyYmFyIn0sCiB7J30nLCAicmN1YiJ9LAogeyd+JywgInRpbGRlIn0sCiNlbmRpZgogeydcXCcsICJic29sIn0sCiB7JyQnLCAiZG9sbGFyIn0sCiB7J8QnLCAiQXVtbCJ9LAogeyfkJywgImF1bWwifSwKIHsn1icsICJPdW1sIn0sCiB7J/YnLCAib3VtbCJ9LAogeyfcJywgIlV1bWwifSwKIHsn/CcsICJ1dW1sIn0sCiB7J98nLCAic3psaWcifSwKIHsnPicsICJndCJ9LAogeyenJywgInNlY3QifSwKIHsnticsICJwYXJhIn0sCiB7J6knLCAiY29weSJ9LAogeyehJywgImlleGNsIn0sCiB7J78nLCAiaXF1ZXN0In0sCiB7J6InLCAiY2VudCJ9LAogeyejJywgInBvdW5kIn0sCiB7J9cnLCAidGltZXMifSwKIHsnsScsICJwbHVzbW4ifSwKIHsn9ycsICJkaXZpZGUifSwKIHsnrCcsICJub3QifSwKIHsntScsICJtdSJ9LAogezAsMH19OwoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICAgICAgICAgICBwcmludF90ZXh0CiAqLwoKc3RhdGljIHZvaWQgcHJpbnRfdGV4dChjb25zdCBjaGFyICpwKQp7CiAgICBpbnQgaTsKCiAgICBmb3IgKDsgKnA7IHArKykKICAgIHsKICAgICAgICBmb3IgKGkgPSAwOyBjaGFybWFwW2ldLmNoOyBpKyspCiAgICAgICAgICAgIGlmICgqcCA9PSBjaGFybWFwW2ldLmNoKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBwcmludGYoZm9ybWF0LnNwZWNpYWxfY2hhciwgY2hhcm1hcFtpXS5zdWJzdCk7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIGlmICghY2hhcm1hcFtpXS5jaCkKICAgICAgICAgICAgcHJpbnRmKCIlYyIsICpwKTsKICAgIH0KfQoKLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqCiAqICAgICAgICAgICBtYWluCiAqLwoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KQp7CiAgICBITFBGSUxFICAgKmhscGZpbGU7CiAgICBITFBGSUxFX1BBR0UgKnBhZ2U7CiAgICBITFBGSUxFX1BBUkFHUkFQSCAqcGFyYWdyYXBoOwogICAgdGltZV90IHQ7CiAgICBjaGFyIGRhdGVbNTBdOwogICAgY2hhciAqZmlsZW5hbWU7CgogICAgaGxwZmlsZSA9IEhMUEZJTEVfUmVhZEhscEZpbGUoYXJnYyA+IDEgPyBhcmd2WzFdIDogIiIpOwoKICAgIGlmICghaGxwZmlsZSkgcmV0dXJuIDI7CgogICAgdGltZSgmdCk7CiAgICBzdHJmdGltZShkYXRlLCBzaXplb2YoZGF0ZSksICIleCIsIGxvY2FsdGltZSgmdCkpOwogICAgZmlsZW5hbWUgPSBzdHJyY2hyKGhscGZpbGUtPmxwc3pQYXRoLCAnLycpOwogICAgaWYgKGZpbGVuYW1lKSBmaWxlbmFtZSsrOwogICAgZWxzZSBmaWxlbmFtZSA9IGhscGZpbGUtPmxwc3pQYXRoOwoKICAgIC8qIEhlYWRlciAqLwogICAgcHJpbnRmKGZvcm1hdC5oZWFkZXIxKTsKICAgIHByaW50X3RleHQoaGxwZmlsZS0+bHBzelRpdGxlKTsKICAgIHByaW50Zihmb3JtYXQuaGVhZGVyMiwgZmlsZW5hbWUsIGRhdGUpOwoKICAgIGZvciAocGFnZSA9IGhscGZpbGUtPmZpcnN0X3BhZ2U7IHBhZ2U7IHBhZ2UgPSBwYWdlLT5uZXh0KQogICAgewogICAgICAgIHBhcmFncmFwaCA9IHBhZ2UtPmZpcnN0X3BhcmFncmFwaDsKICAgICAgICBpZiAoIXBhcmFncmFwaCkgY29udGludWU7CgogICAgICAgIC8qIFNlY3Rpb24gKi8KICAgICAgICBwcmludGYoZm9ybWF0LnNlY3Rpb24pOwogICAgICAgIGZvciAoOyBwYXJhZ3JhcGggJiYgIXBhcmFncmFwaC0+dS50ZXh0LndWU3BhY2U7IHBhcmFncmFwaCA9IHBhcmFncmFwaC0+bmV4dCkKICAgICAgICAgICAgcHJpbnRfdGV4dChwYXJhZ3JhcGgtPnUudGV4dC5scHN6VGV4dCk7CiAgICAgICAgcHJpbnRmKGZvcm1hdC5maXJzdF9wYXJhZ3JhcGgpOwoKICAgICAgICBmb3IgKDsgcGFyYWdyYXBoOyBwYXJhZ3JhcGggPSBwYXJhZ3JhcGgtPm5leHQpCgl7CiAgICAgICAgICAgIHN3aXRjaCAocGFyYWdyYXBoLT5jb29raWUpCiAgICAgICAgICAgIHsKICAgICAgICAgICAgY2FzZSBwYXJhX25vcm1hbF90ZXh0OgogICAgICAgICAgICBjYXNlIHBhcmFfZGVidWdfdGV4dDoKICAgICAgICAgICAgICAgIC8qIE5ldyBsaW5lOyBuZXcgcGFyYWdyYXBoICovCiAgICAgICAgICAgICAgICBpZiAocGFyYWdyYXBoLT51LnRleHQud1ZTcGFjZSA9PSAxKQogICAgICAgICAgICAgICAgICAgIHByaW50Zihmb3JtYXQubmV3bGluZSk7CiAgICAgICAgICAgICAgICBlbHNlIGlmIChwYXJhZ3JhcGgtPnUudGV4dC53VlNwYWNlID4gMSkKICAgICAgICAgICAgICAgICAgICBwcmludGYoZm9ybWF0Lm5leHRfcGFyYWdyYXBoKTsKCiAgICAgICAgICAgICAgICBpZiAocGFyYWdyYXBoLT51LnRleHQud0ZvbnQpCiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKGZvcm1hdC5iZWdpbl9ib2xkZmFjZSk7CgogICAgICAgICAgICAgICAgcHJpbnRfdGV4dChwYXJhZ3JhcGgtPnUudGV4dC5scHN6VGV4dCk7CgogICAgICAgICAgICAgICAgaWYgKHBhcmFncmFwaC0+dS50ZXh0LndGb250KQogICAgICAgICAgICAgICAgICAgIHByaW50Zihmb3JtYXQuZW5kX2JvbGRmYWNlKTsKICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBjYXNlIHBhcmFfYml0bWFwOgogICAgICAgICAgICBjYXNlIHBhcmFfbWV0YWZpbGU6CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQoJfQogICAgfQoKICAgIHByaW50Zihmb3JtYXQudGFpbCk7CgogICAgcmV0dXJuIDA7Cn0KCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiAgICAgICAgICAgU3Vic3RpdHV0aW9ucyBmb3Igc29tZSBXSU5FTElCIGZ1bmN0aW9ucwogKi8KCnN0YXRpYyBGSUxFICpmaWxlID0gMDsKCkhGSUxFIFdJTkFQSSBPcGVuRmlsZSggTFBDU1RSIHBhdGgsIE9GU1RSVUNUICpvZnMsIFVJTlQgbW9kZSApCnsKICAgIGZpbGUgPSAqcGF0aCA/IGZvcGVuKHBhdGgsICJyIikgOiBzdGRpbjsKICAgIHJldHVybiBmaWxlID8gKEhGSUxFKTEgOiBIRklMRV9FUlJPUjsKfQoKSEZJTEUgV0lOQVBJIF9sY2xvc2UoIEhGSUxFIGhGaWxlICkKewogICAgZmNsb3NlKGZpbGUpOwogICAgcmV0dXJuIDA7Cn0KCkxPTkcgV0lOQVBJIF9ocmVhZCggSEZJTEUgaEZpbGUsIExQVk9JRCBidWZmZXIsIExPTkcgY291bnQgKQp7CiAgICByZXR1cm4gZnJlYWQoYnVmZmVyLCAxLCBjb3VudCwgZmlsZSk7Cn0KCkhBTkRMRSBXSU5BUEkgR2V0UHJvY2Vzc0hlYXAodm9pZCkKewogICAgcmV0dXJuIDA7Cn0KCnZvaWQqIFdJTkFQSSBIZWFwQWxsb2MoIEhBTkRMRSBoZWFwLCBEV09SRCBmbGFncywgU0laRV9UIHNpemUgKQp7CiAgICBhc3NlcnQoZmxhZ3MgPT0gMCk7CiAgICByZXR1cm4gbWFsbG9jKHNpemUpOwp9Cgp2b2lkKiBXSU5BUEkgSGVhcFJlQWxsb2MoIEhBTkRMRSBoZWFwLCBEV09SRCBmbGFncywgdm9pZCogcHRyLCBTSVpFX1Qgc2l6ZSkKewogICAgYXNzZXJ0KGZsYWdzID09IDApOwogICAgcmV0dXJuIHJlYWxsb2MocHRyLCBzaXplKTsKfQoKQk9PTCBXSU5BUEkgSGVhcEZyZWUoIEhHTE9CQUwgaGFuZGxlLCBEV09SRCBmbGFncywgdm9pZCogcHRyICkKewogICAgZnJlZShwdHIpOwogICAgcmV0dXJuIFRSVUU7Cn0KCmNoYXIgX193aW5lX2RiY2hfd2luaGVscFtdID0gIlwwMDN3aW5oZWxwIjsKCmludCB3aW5lX2RiZ19sb2coIGludCBjbHMsIGNvbnN0IGNoYXIgKmNoYW5uZWwsIGNvbnN0IGNoYXIgKmZ1bmMsIGNvbnN0IGNoYXIgKmZvcm1hdCwgLi4uICkKewogICAgcmV0dXJuIDE7Cn0KCmNvbnN0IGNoYXIgKndpbmVfZGJnc3RyX2EoIGNvbnN0IGNoYXIgKnMgKQp7CiAgICByZXR1cm4gTlVMTDsKfQoKSEJJVE1BUCBXSU5BUEkgQ3JlYXRlRElCaXRtYXAoSERDIGhkYywgQ09OU1QgQklUTUFQSU5GT0hFQURFUiogYmloLCBEV09SRCBhLCBDT05TVCB2b2lkKiBwdHIsIENPTlNUIEJJVE1BUElORk8qIGJpLCBVSU5UIGMpCnsKICAgIHJldHVybiAwOwp9CgpITUVUQUZJTEUgV0lOQVBJIFNldE1ldGFGaWxlQml0c0V4KFVJTlQgY2JCdWZmZXIsIENPTlNUIEJZVEUgKmxwYkJ1ZmZlcikKewogICAgcmV0dXJuIDA7Cn0KCkJPT0wgV0lOQVBJIERlbGV0ZU1ldGFGaWxlKEhNRVRBRklMRSBoKQp7CiAgICByZXR1cm4gMDsKfQoKSERDIFdJTkFQSSBHZXREQyhIV05EIGgpCnsKICAgIHJldHVybiAwOwp9CgppbnQgV0lOQVBJIFJlbGVhc2VEQyhIV05EIGgsIEhEQyBoZGMpCnsKICAgIHJldHVybiAwOwp9CgpCT09MIFdJTkFQSSBEZWxldGVPYmplY3QoSEdESU9CSiBoKQp7CiAgICByZXR1cm4gVFJVRTsKfQovKgogKiBTdHJpbmcgZnVuY3Rpb25zCiAqCiAqIENvcHlyaWdodCAxOTkzIFluZ3ZpIFNpZ3Vyam9uc3NvbiAoeW5ndmlAaGFmcm8uaXMpCiAqLwoKSU5UIFdJTkFQSSBsc3RyY21wKCBMUENTVFIgc3RyMSwgTFBDU1RSIHN0cjIgKQp7CiAgICByZXR1cm4gc3RyY21wKCBzdHIxLCBzdHIyICk7Cn0KCklOVCBXSU5BUEkgbHN0cmNtcGkoIExQQ1NUUiBzdHIxLCBMUENTVFIgc3RyMiApCnsKICAgIElOVCByZXM7CgogICAgd2hpbGUgKCpzdHIxKQogICAgewogICAgICAgIGlmICgocmVzID0gdG91cHBlcigqc3RyMSkgLSB0b3VwcGVyKCpzdHIyKSkgIT0gMCkgcmV0dXJuIHJlczsKICAgICAgICBzdHIxKys7CiAgICAgICAgc3RyMisrOwogICAgfQogICAgcmV0dXJuIHRvdXBwZXIoKnN0cjEpIC0gdG91cHBlcigqc3RyMik7Cn0KCklOVCBXSU5BUEkgbHN0cmxlbiggTFBDU1RSIHN0ciApCnsKICAgIHJldHVybiBzdHJsZW4oc3RyKTsKfQoKTFBTVFIgV0lOQVBJIGxzdHJjcHlBKCBMUFNUUiBkc3QsIExQQ1NUUiBzcmMgKQp7CiAgICBpZiAoIXNyYyB8fCAhZHN0KSByZXR1cm4gTlVMTDsKICAgIHN0cmNweSggZHN0LCBzcmMgKTsKICAgIHJldHVybiBkc3Q7Cn0KCkxQU1RSIFdJTkFQSSBsc3RyY3B5bkEoIExQU1RSIGRzdCwgTFBDU1RSIHNyYywgSU5UIG4gKQp7CiAgICBMUFNUUiBkID0gZHN0OwogICAgTFBDU1RSIHMgPSBzcmM7CiAgICBVSU5UIGNvdW50ID0gbjsKCiAgICB3aGlsZSAoKGNvdW50ID4gMSkgJiYgKnMpCiAgICB7CiAgICAgICAgY291bnQtLTsKICAgICAgICAqZCsrID0gKnMrKzsKICAgIH0KICAgIGlmIChjb3VudCkgKmQgPSAwOwogICAgcmV0dXJuIGRzdDsKfQo=