LyogCiAgIGlzbG9jYWwuYyAtIHJldHVybnMgdHJ1ZSBpZiB1c2VyIGlzIHJlZ2lzdGVyZWQgaW4gdGhlIGxvY2FsCiAgIC9ldGMvcGFzc3dkIGZpbGUuIFdyaXR0ZW4gYnkgQWx2YXJvIE1hcnRpbmV6IEVjaGV2YXJyaWEsIAogICBhbHZhcm9AZW5hbm8uZXRzaXQudXBtLmVzLCB0byBhbGxvdyBwZWFjZWZ1bCBjb2V4aXN0ZW5jZSB3aXRoIHlwLiBOb3YgOTQuCgogICBIYWNrZWQgYSBiaXQgYnkgcG9lQGRhaW1pLmFhdS5kawogICBTZWUgYWxzbyBmdHA6Ly9mdHAuZGFpbWkuYWF1LmRrL3B1Yi9saW51eC9wb2UvYWRtdXRpbCoKCiAgIEhhY2tlZCBieSBQZXRlciBCcmVpdGVubG9obmVyLCBwZWJAbXBwbXUubXBnLmRlLAogICAgIHRvIGRpc3Rpbmd1aXNoIHVzZXIgbmFtZXMgd2hlcmUgb25lIGlzIGEgcHJlZml4IG9mIHRoZSBvdGhlciwKICAgICBhbmQgdG8gdXNlICJwYXRobmFtZXMuaCIuIE9jdCA1LCA5Ni4gICAKCiAgIDE5OTktMDItMjIgQXJrYWRpdXN6IE1ptmtpZXdpY3ogPG1pc2lla0BwbGQuT1JHLlBMPgogICAtIGFkZGVkIE5hdGl2ZSBMYW5ndWFnZSBTdXBwb3J0CgogICAyMDA4LTA0LTA2IEphbWVzIFlvdW5nbWFuLCBqYXlAZ251Lm9yZwogICAtIENvbXBsZXRlbHkgcmV3cml0dGVuIHRvIHJlbW92ZSBhc3N1bXB0aW9uIHRoYXQgL2V0Yy9wYXNzd2QKICAgICBsaW5lcyBhcmUgPCAxMDI0IGNoYXJhY3RlcnMgbG9uZy4gIEFsc28gYWRkZWQgdW5pdCB0ZXN0cy4KCiovCgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RyaW5nLmg+CgojaW5jbHVkZSAibmxzLmgiCiNpbmNsdWRlICJwYXRobmFtZXMuaCIKI2luY2x1ZGUgImlzbG9jYWwuaCIKCnN0YXRpYyBpbnQKaXNfbG9jYWxfaW5fZmlsZShjb25zdCBjaGFyICp1c2VyLCBjb25zdCBjaGFyICpmaWxlbmFtZSkKewoJaW50IGxvY2FsID0gMDsKCXNpemVfdCBtYXRjaDsKCWludCBjaGluLCBza2lwOwoJRklMRSAqZjsKCiAgICAgICAgaWYgKE5VTEwgPT0gKGY9Zm9wZW4oZmlsZW5hbWUsICJyIikpKQogICAgICAgICAgICAgICAgcmV0dXJuIC0xOwoKCW1hdGNoID0gMHU7Cglza2lwID0gMDsKCXdoaWxlICgoY2hpbiA9IGdldGMoZikpICE9IEVPRikgewoJCWlmIChza2lwKSB7CgkJCS8qIExvb2tpbmcgZm9yIHRoZSBzdGFydCBvZiB0aGUgbmV4dCBsaW5lLiAqLwoJCQlpZiAoJ1xuJyA9PSBjaGluKSB7CgkJCQkvKiBTdGFydCBtYXRjaGluZyB1c2VybmFtZSBhdCB0aGUgbmV4dCBjaGFyLiAqLwoJCQkJc2tpcCA9IDA7CgkJCQltYXRjaCA9IDB1OwoJCQl9CgkJfSBlbHNlIHsKCQkJaWYgKCc6JyA9PSBjaGluKSB7CgkJCQlpZiAoMCA9PSB1c2VyW21hdGNoXSkgewoJCQkJCWxvY2FsID0gMTsgLyogU3VjY2Vzcy4gKi8KCQkJCQkvKiBuZXh0IGxpbmUgaGFzIG5vIHRlc3QgY292ZXJhZ2UsIGJ1dCBpdCBpcwoJCQkJCSAqIGp1c3QgYW4gb3B0aW1pc2F0aW9uIGFueXdheS4gKi8KCQkJCQlicmVhazsKCQkJCX0gZWxzZSB7CgkJCQkJLyogd2UgcmVhZCBhIHdob2xlIHVzZXJuYW1lLCBidXQgaXQgaXMKCQkJCQkgKiB0aGUgd3JvbmcgdXNlci4gIFNraXAgdG8gdGhlIG5leHQKCQkJCQkgKiBsaW5lLiAqLwoJCQkJCXNraXAgPSAxOwoJCQkJfQoJCQl9IGVsc2UgaWYgKCdcbicgPT0gY2hpbikgewoJCQkJLyogVGhpcyBsaW5lIGNvbnRhaW5zIG5vIGNvbG9uOyBpdCdzIG1hbGZvcm1lZC4KCQkJCSAqIE5vIHNraXAgc2luY2Ugd2UgYXJlIGFscmVhZHkgYXQgdGhlIHN0YXJ0IG9mCgkJCQkgKiB0aGUgbmV4dCBsaW5lLiAqLwoJCQkJbWF0Y2ggPSAwdTsKCQkJfSBlbHNlIGlmIChjaGluICE9IHVzZXJbbWF0Y2hdKSB7CgkJCQkvKiB1c2VybmFtZSBkb2VzIG5vdCBtYXRjaC4gKi8KCQkJCXNraXAgPSAxOwoJCQl9IGVsc2UgewoJCQkJKyttYXRjaDsKCQkJfQoJCX0KCX0KCWZjbG9zZShmKTsKCXJldHVybiBsb2NhbDsKfQoKaW50CmlzX2xvY2FsKGNvbnN0IGNoYXIgKnVzZXIpCnsKCWludCBydjsKCWlmICgocnYgPSBpc19sb2NhbF9pbl9maWxlKHVzZXIsIF9QQVRIX1BBU1NXRCkpIDwgMCkgewoJCXBlcnJvcihfUEFUSF9QQVNTV0QpOwoJCWZwcmludGYoc3RkZXJyLCBfKCJGYWlsZWQgdG8gb3BlbiAlcyBmb3IgcmVhZGluZywgZXhpdGluZy4iKSwKCQkJX1BBVEhfUEFTU1dEKTsKCQlleGl0KDEpOwoJfSBlbHNlIHsKCQlyZXR1cm4gcnY7Cgl9Cn0KCiNpZiBNQUlOX1RFU1RfSVNMT0NBTAppbnQKbWFpbiAoaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewoJaWYgKGFyZ2MgPCAyKSB7CgkJZnByaW50ZihzdGRlcnIsICJObyB0ZXN0IHBhc3N3ZCBmaWxlIHdhcyBzcGVjaWZpZWQuXG4iKTsKCQlyZXR1cm4gMTsKCX0gZWxzZSB7CgkJaW50IGk7CgkJZm9yIChpID0gMjsgaSA8IGFyZ2M7IGkrKykgewoJCQljb25zdCBpbnQgcnYgPSBpc19sb2NhbF9pbl9maWxlKGFyZ3ZbaV0sIGFyZ3ZbMV0pOwoJCQlpZiAocnYgPCAwKSB7CgkJCQlwZXJyb3IoYXJndlsxXSk7CgkJCQlyZXR1cm4gMjsKCQkJfQoJCQlwcmludGYoIiVkOiVzXG4iLCBydiwgYXJndltpXSk7CgkJfQoJCXJldHVybiAwOwoJfQp9CiNlbmRpZgo=