LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIFN05HVibGkgRmF2ZXJnZXMgLSA8d3d3LnN0YXVibGkuY29tPgogKiBQaWVycmUgQVVCRVJUICBwLmF1YmVydEBzdGF1YmxpLmNvbQogKgogKiBTZWUgZmlsZSBDUkVESVRTIGZvciBsaXN0IG9mIHBlb3BsZSB3aG8gY29udHJpYnV0ZWQgdG8gdGhpcwogKiBwcm9qZWN0LgogKgogKiBUaGlzIHByb2dyYW0gaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAqIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzCiAqIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIgdmVyc2lvbiAyIG9mCiAqIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgogKgogKiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICogTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZQogKiBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgogKgogKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZQogKiBhbG9uZyB3aXRoIHRoaXMgcHJvZ3JhbTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZSBTb2Z0d2FyZQogKiBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLAogKiBNQSAwMjExMS0xMzA3IFVTQQogKi8KCiNpbmNsdWRlIDxjb21tb24uaD4KI2luY2x1ZGUgPGNvbmZpZy5oPgoKI2lmIChDT05GSUdfQ09NTUFORFMgJiBDRkdfQ01EX0ZET1MpCiNpbmNsdWRlIDxtYWxsb2MuaD4KI2luY2x1ZGUgImRvcy5oIgojaW5jbHVkZSAiZmRvcy5oIgoKCmNvbnN0IGNoYXIgKm1vbnRoIFtdID0geyJKYW4iLCAiRmViIiwgIk1hciIsICJBcHIiLCAiTWF5IiwgIkp1biIsICJKdWwiLCAiQXVnIiwgIlNlcCIsICJPY3QiLCAiTm92IiwgIkRlYyJ9OwoKRnNfdCAgICBmczsKRmlsZV90ICBmaWxlOwoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBkb3Nfb3BlbiAtLQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwppbnQgZG9zX29wZW4oY2hhciAqbmFtZSkKewogICAgaW50IGxnOwogICAgaW50IGVudHJ5OwogICAgY2hhciAqZm5hbWU7CgogICAgLyogV2UgbmVlZCB0byBzdXBwcmVzcyB0aGUgIiBjaGFyIGFyb3VuZCB0aGUgbmFtZSAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBpZiAobmFtZSBbMF0gPT0gJyInKSB7CgluYW1lICsrOwogICAgfQogICAgbGcgPSBzdHJsZW4gKG5hbWUpOwogICAgaWYgKG5hbWUgW2xnIC0gMV0gPT0gJyInKSB7CgluYW1lIFtsZyAtIDFdID0gJ1wwJzsKICAgIH0KCiAgICAvKiBPcGVuIGZpbGUgc3lzdGVtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KICAgIGlmIChmc19pbml0ICgmZnMpIDwgMCkgewoJcmV0dXJuIC0xOwogICAgfQoKICAgIC8qIEluaXQgdGhlIGZpbGUgZGVzY3JpcHRvciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgZmlsZS5uYW1lID0gbmFtZTsKICAgIGZpbGUuZnMgPSAmZnM7CgogICAgLyogZmluZCB0aGUgc3ViZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIGZpbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBpZiAob3Blbl9zdWJkaXIgKCZmaWxlKSA8IDApIHsKCXJldHVybiAoLTEpOwogICAgfQoKICAgIGZuYW1lID0gYmFzZW5hbWUgKG5hbWUpOwoKICAgIC8qIGlmIHdlIHRyeSB0byBvcGVuIHJvb3QgZGlyZWN0b3J5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwogICAgaWYgKCpmbmFtZSA9PSAnXDAnKSB7CglmaWxlLmZpbGUgPSBmaWxlLnN1YmRpcjsKCXJldHVybiAoMCk7CiAgICB9CgogICAgLyogZmluZCB0aGUgZmlsZSBpbiB0aGUgc3ViZGlyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBlbnRyeSA9IDA7CiAgICBpZiAodmZhdF9sb29rdXAgKCZmaWxlLnN1YmRpciwKCQkgICAgIGZpbGUuZnMsCgkJICAgICAmZmlsZS5maWxlLmRpciwKCQkgICAgICZlbnRyeSwKCQkgICAgIDAsCgkJICAgICBmbmFtZSwKCQkgICAgIEFDQ0VQVF9ESVIgfCBBQ0NFUFRfUExBSU4gfCBTSU5HTEUgfCBET19PUEVOLAoJCSAgICAgMCwKCQkgICAgICZmaWxlLmZpbGUpICE9IDApIHsKCS8qIEZpbGUgbm90IGZvdW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCglwcmludGYgKCJGaWxlIG5vdCBmb3VuZFxuIik7CglyZXR1cm4gKC0xKTsKICAgIH0KCiAgICByZXR1cm4gMDsKfQoKLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBkb3NfcmVhZCAtLQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwppbnQgZG9zX3JlYWQgKHVsb25nIGFkZHIpCnsKICAgIGludCByZWFkID0gMCwgbmI7CgogICAgLyogVHJ5IHRvIGJvb3QgYSBkaXJlY3RvcnkgPyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCiAgICBpZiAoZmlsZS5maWxlLmRpci5hdHRyICYgKEFUVFJfRElSRUNUT1JZIHwgQVRUUl9WT0xVTUUpKSB7CglwcmludGYgKCJVbmFibGUgdG8gYm9vdCAlcyAhIVxuIiwgZmlsZS5uYW1lKTsKCXJldHVybiAoLTEpOwogICAgfQogICAgd2hpbGUgKHJlYWQgPCBmaWxlLmZpbGUuRmlsZVNpemUpIHsKCVBSSU5URiAoInJlYWRfZmlsZSAoJWxkKVxuIiwgKGZpbGUuZmlsZS5GaWxlU2l6ZSAtIHJlYWQpKTsKCW5iID0gcmVhZF9maWxlICgmZnMsCgkJCSZmaWxlLmZpbGUsCgkJCShjaGFyICopYWRkciArIHJlYWQsCgkJCXJlYWQsCgkJCShmaWxlLmZpbGUuRmlsZVNpemUgLSByZWFkKSk7CglQUklOVEYgKCJyZWFkX2ZpbGUgLT4gJWRcbiIsIG5iKTsKCWlmIChuYiA8IDApIHsKCSAgICBwcmludGYgKCJyZWFkIGVycm9yXG4iKTsKCSAgICByZXR1cm4gKC0xKTsKCX0KCXJlYWQgKz0gbmI7CiAgICB9CiAgICByZXR1cm4gKHJlYWQpOwp9Ci8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogZG9zX2RpciAtLQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqLwppbnQgZG9zX2RpciAodm9pZCkKewogICAgaW50IGVudHJ5OwogICAgRGlyZWN0b3J5X3QgZGlyOwogICAgY2hhciAqbmFtZTsKCgogICAgaWYgKChmaWxlLmZpbGUuZGlyLmF0dHIgJiBBVFRSX0RJUkVDVE9SWSkgPT0gMCkgewoJcHJpbnRmICgiJXM6IG5vdCBhIGRpcmVjdG9yeSAhIVxuIiwgZmlsZS5uYW1lKTsKCXJldHVybiAoMSk7CiAgICB9CiAgICBlbnRyeSA9IDA7CiAgICBpZiAoKG5hbWUgPSBtYWxsb2MgKE1BWF9WTkFNRUxFTiArIDEpKSA9PSBOVUxMKSB7CglQUklOVEYgKCJBbGxjYXRpb24gZXJyb3JcbiIpOwoJcmV0dXJuICgxKTsKICAgIH0KCiAgICB3aGlsZSAodmZhdF9sb29rdXAgKCZmaWxlLmZpbGUsCgkJCWZpbGUuZnMsCgkJCSZkaXIsCgkJCSZlbnRyeSwKCQkJMCwKCQkJTlVMTCwKCQkJQUNDRVBUX0RJUiB8IEFDQ0VQVF9QTEFJTiB8IE1BVENIX0FOWSwKCQkJbmFtZSwKCQkJTlVMTCkgPT0gMCkgewoJLyogRGlzcGxheSBmaWxlIGluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KCXByaW50ZiAoIiUzLjNzICU5ZCAlcyAlMDJkICUwNGQgJTAyZDolMDJkOiUwMmQgJXNcbiIsCgkJKGRpci5hdHRyICYgQVRUUl9ESVJFQ1RPUlkpID8gImRpciIgOiAiICAgIiwKCQlfX2xlMzJfdG9fY3B1IChkaXIuc2l6ZSksCgkJbW9udGggW0RPU19NT05USCAoJmRpcikgLSAxXSwKCQlET1NfREFZICgmZGlyKSwKCQlET1NfWUVBUiAoJmRpciksCgkJRE9TX0hPVVIgKCZkaXIpLAoJCURPU19NSU5VVEUgKCZkaXIpLAoJCURPU19TRUMgKCZkaXIpLAoJCW5hbWUpOwoKICAgIH0KICAgIGZyZWUgKG5hbWUpOwogICAgcmV0dXJuICgwKTsKfQoKI2VuZGlmCg==