LyogZG1lc2cuYyAtLSBQcmludCBvdXQgdGhlIGNvbnRlbnRzIG9mIHRoZSBrZXJuZWwgcmluZyBidWZmZXIKICogQ3JlYXRlZDogU2F0IE9jdCAgOSAxNjoxOTo0NyAxOTkzCiAqIFJldmlzZWQ6IFRodSBPY3QgMjggMjE6NTI6MTcgMTk5MyBieSBmYWl0aEBjcy51bmMuZWR1CiAqIENvcHlyaWdodCAxOTkzIFRoZW9kb3JlIFRzJ28gKHR5dHNvQGF0aGVuYS5taXQuZWR1KQogKiBUaGlzIHByb2dyYW0gY29tZXMgd2l0aCBBQlNPTFVURUxZIE5PIFdBUlJBTlRZLgogKiBNb2RpZmljYXRpb25zIGJ5IFJpY2sgU2xhZGtleSAoanJzQHdvcmxkLnN0ZC5jb20pCiAqIExhcmdlciBidWZmZXJzaXplIDMgSnVuZSAxOTk4IGJ5IE5pY29sYWkgTGFuZ2ZlbGR0LCBiYXNlZCBvbiBhIHBhdGNoCiAqIGJ5IFBlZXRlciBKb290LiAgVGhpcyB3YXMgYWxzbyBzdWdnZXN0ZWQgYnkgSm9obiBIdWRzb24uCiAqIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BtaXNpZWsuZXUub3JnPgogKiAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CiAqCiAqIGZyb20gdXRpbC1saW51eCAtLSBhZGFwdGVkIGZvciBidXN5Ym94IGJ5IAogKiBFcmlrIEFuZGVyc2VuIDxhbmRlcnNlZUBkZWJpYW4ub3JnPi4gSSByaXBwZWQgb3V0IE5hdGl2ZSBMYW5ndWFnZSAKICogU3VwcG9ydCwgcmVwbGFjZWQgZ2V0b3B0LCBhZGRlZCBzb21lIGdvdG9zIGZvciByZWR1bmRhbnQgc3R1ZmYuCiAqLwoKI2luY2x1ZGUgImludGVybmFsLmgiCiNpbmNsdWRlIDxsaW51eC91bmlzdGQuaD4KI2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxnZXRvcHQuaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgoKI2lmIF9fR05VX0xJQlJBUllfXyA8IDUKCiNpZm5kZWYgX19hbHBoYV9fCiMgZGVmaW5lIF9fTlJfa2xvZ2N0bCBfX05SX3N5c2xvZwogIHN0YXRpYyBpbmxpbmUgX3N5c2NhbGwzKGludCwga2xvZ2N0bCwgaW50LCB0eXBlLCBjaGFyICosIGIsIGludCwgbGVuKTsKI2Vsc2UgLyogX19hbHBoYV9fICovCiNkZWZpbmUga2xvZ2N0bCBzeXNsb2cKI2VuZGlmCgojZWxzZQojIGluY2x1ZGUgPHN5cy9rbG9nLmg+CiNlbmRpZgoKc3RhdGljIGNvbnN0IGNoYXIgZG1lc2dfdXNhZ2VbXSA9ICJkbWVzZyBbLWNdIFstbiBsZXZlbF0gWy1zIGJ1ZnNpemVdXG4iOwoKaW50IGRtZXNnX21haW4oIGludCBhcmdjLCBjaGFyKiogYXJndiApCnsKICAgY2hhciAqYnVmOwogICBpbnQJYnVmc2l6ZT04MTk2OwogICBpbnQgIGk7CiAgIGludCAgbjsKICAgaW50ICBsZXZlbCA9IDA7CiAgIGludCAgbGFzdGM7CiAgIGludCAgY21kID0gMzsKCiAgICAvKiBQYXJzZSBhbnkgb3B0aW9ucyAqLwogICAgd2hpbGUgKGFyZ2MgJiYgKiphcmd2ID09ICctJykgewoJd2hpbGUgKCorKygqYXJndikpCgkgICAgc3dpdGNoICgqKmFyZ3YpIHsKCSAgICBjYXNlICdjJzoKCQljbWQgPSA0OwoJCWJyZWFrOwoJICAgIGNhc2UgJ24nOgoJCWNtZCA9IDg7CgkJaWYgKC0tYXJnYyA9PSAwKQoJCSAgICBnb3RvIGVuZDsKCQlsZXZlbCA9IGF0b2kgKCooKythcmd2KSk7CgkJLS1hcmdjOwoJCSsrYXJndjsKCQlicmVhazsKCSAgICBjYXNlICdzJzoKCQlpZiAoLS1hcmdjID09IDApCgkJICAgIGdvdG8gZW5kOwoJCWJ1ZnNpemUgPSBhdG9pICgqKCsrYXJndikpOwoJCS0tYXJnYzsKCQkrK2FyZ3Y7CgkJYnJlYWs7CgkgICAgZGVmYXVsdDoKCQlnb3RvIGVuZDsKCSAgICB9CiAgICB9CiAgIAogICBpZiAoYXJnYyA+IDEpIHsKCWdvdG8gZW5kOwogICB9CgogICBpZiAoY21kID09IDgpIHsKICAgICAgbiA9IGtsb2djdGwoIGNtZCwgTlVMTCwgbGV2ZWwgKTsKICAgICAgaWYgKG4gPCAwKSB7CgkgIGdvdG8ga2xvZ2N0bF9lcnJvcjsKICAgICAgfQogICAgICBleGl0KCBUUlVFICk7CiAgIH0KCiAgIGlmIChidWZzaXplIDwgNDA5NikgYnVmc2l6ZSA9IDQwOTY7CiAgIGJ1ZiA9IChjaGFyKiltYWxsb2MoYnVmc2l6ZSk7CiAgIG4gPSBrbG9nY3RsKCBjbWQsIGJ1ZiwgYnVmc2l6ZSApOwogICBpZiAobiA8IDApIHsKICAgICAgIGdvdG8ga2xvZ2N0bF9lcnJvcjsKICAgfQoKICAgbGFzdGMgPSAnXG4nOwogICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CiAgICAgIGlmICgoaSA9PSAwIHx8IGJ1ZltpIC0gMV0gPT0gJ1xuJykgJiYgYnVmW2ldID09ICc8JykgewoJIGkrKzsKCSB3aGlsZSAoYnVmW2ldID49ICcwJyAmJiBidWZbaV0gPD0gJzknKQoJICAgIGkrKzsKCSBpZiAoYnVmW2ldID09ICc+JykKCSAgICBpKys7CiAgICAgIH0KICAgICAgbGFzdGMgPSBidWZbaV07CiAgICAgIHB1dGNoYXIoIGxhc3RjICk7CiAgIH0KICAgaWYgKGxhc3RjICE9ICdcbicpCiAgICAgIHB1dGNoYXIoICdcbicgKTsKICAgZXhpdCggVFJVRSk7CmVuZDoKICAgIHVzYWdlKCBkbWVzZ191c2FnZSk7CiAgICBleGl0IChGQUxTRSk7Cmtsb2djdGxfZXJyb3I6CiAgICBwZXJyb3IoICJrbG9nY3RsIiApOwogICAgZXhpdCggRkFMU0UgKTsKCn0K