LyogQ29tcGFyZSBzdHJpbmdzIHdoaWxlIHRyZWF0aW5nIGRpZ2l0cyBjaGFyYWN0ZXJzIG51bWVyaWNhbGx5LgogICBDb3B5cmlnaHQgKEMpIDE5OTctMjAxOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIGxpYmliZXJ0eSBsaWJyYXJ5LgogICBDb250cmlidXRlZCBieSBKZWFuLUZyYW7nb2lzIEJpZ25vbGxlcyA8Ymlnbm9sbGVAZWNvbGVkb2MuaWJwLmZyPiwgMTk5Ny4KCiAgIExpYmliZXJ0eSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICBMaWJpYmVydHkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCiAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDUxIEZyYW5rbGluIFN0cmVldCwgRmlmdGggRmxvb3IsIEJvc3RvbiwgTUEKICAgMDIxMTAtMTMwMSBVU0EuICAqLwoKI2luY2x1ZGUgImxpYmliZXJ0eS5oIgojaW5jbHVkZSAic2FmZS1jdHlwZS5oIgoKLyogCkBkZWZ0eXBlZnVuIGludCBzdHJ2ZXJzY21wIChjb25zdCBjaGFyICpAdmFye3MxfSwgY29uc3QgY2hhciAqQHZhcntzMn0pClRoZSBAY29kZXtzdHJ2ZXJzY21wfSBmdW5jdGlvbiBjb21wYXJlcyB0aGUgc3RyaW5nIEB2YXJ7czF9IGFnYWluc3QKQHZhcntzMn0sIGNvbnNpZGVyaW5nIHRoZW0gYXMgaG9sZGluZyBpbmRpY2VzL3ZlcnNpb24gbnVtYmVycy4gIFJldHVybgp2YWx1ZSBmb2xsb3dzIHRoZSBzYW1lIGNvbnZlbnRpb25zIGFzIGZvdW5kIGluIHRoZSBAY29kZXtzdHJ2ZXJzY21wfQpmdW5jdGlvbi4gIEluIGZhY3QsIGlmIEB2YXJ7czF9IGFuZCBAdmFye3MyfSBjb250YWluIG5vIGRpZ2l0cywKQGNvZGV7c3RydmVyc2NtcH0gYmVoYXZlcyBsaWtlIEBjb2Rle3N0cmNtcH0uCgpCYXNpY2FsbHksIHdlIGNvbXBhcmUgc3RyaW5ncyBub3JtYWxseSAoY2hhcmFjdGVyIGJ5IGNoYXJhY3RlciksIHVudGlsCndlIGZpbmQgYSBkaWdpdCBpbiBlYWNoIHN0cmluZyAtIHRoZW4gd2UgZW50ZXIgYSBzcGVjaWFsIGNvbXBhcmlzb24KbW9kZSwgd2hlcmUgZWFjaCBzZXF1ZW5jZSBvZiBkaWdpdHMgaXMgdGFrZW4gYXMgYSB3aG9sZS4gIElmIHdlIHJlYWNoIHRoZQplbmQgb2YgdGhlc2UgdHdvIHBhcnRzIHdpdGhvdXQgbm90aWNpbmcgYSBkaWZmZXJlbmNlLCB3ZSByZXR1cm4gdG8gdGhlCnN0YW5kYXJkIGNvbXBhcmlzb24gbW9kZS4gIFRoZXJlIGFyZSB0d28gdHlwZXMgb2YgbnVtZXJpYyBwYXJ0czoKImludGVncmFsIiBhbmQgImZyYWN0aW9uYWwiICh0aG9zZSAgYmVnaW4gd2l0aCBhICcwJykuIFRoZSB0eXBlcwpvZiB0aGUgbnVtZXJpYyBwYXJ0cyBhZmZlY3QgdGhlIHdheSB3ZSBzb3J0IHRoZW06CgpAaXRlbWl6ZSBAYnVsbGV0CkBpdGVtCmludGVncmFsL2ludGVncmFsOiB3ZSBjb21wYXJlIHZhbHVlcyBhcyB5b3Ugd291bGQgZXhwZWN0LgoKQGl0ZW0KZnJhY3Rpb25hbC9pbnRlZ3JhbDogdGhlIGZyYWN0aW9uYWwgcGFydCBpcyBsZXNzIHRoYW4gdGhlIGludGVncmFsIG9uZS4KQWdhaW4sIG5vIHN1cnByaXNlLgoKQGl0ZW0KZnJhY3Rpb25hbC9mcmFjdGlvbmFsOiB0aGUgdGhpbmdzIGJlY29tZSBhIGJpdCBtb3JlIGNvbXBsZXguCklmIHRoZSBjb21tb24gcHJlZml4IGNvbnRhaW5zIG9ubHkgbGVhZGluZyB6ZXJvZXMsIHRoZSBsb25nZXN0IHBhcnQgaXMgbGVzcwp0aGFuIHRoZSBvdGhlciBvbmU7IGVsc2UgdGhlIGNvbXBhcmlzb24gYmVoYXZlcyBub3JtYWxseS4KQGVuZCBpdGVtaXplCgpAc21hbGxleGFtcGxlCnN0cnZlcnNjbXAgKCJubyBkaWdpdCIsICJubyBkaWdpdCIpCiAgICBAcmVzdWx0e30gMCAgICAvLyBAcntzYW1lIGJlaGF2aW9yIGFzIHN0cmNtcC59CnN0cnZlcnNjbXAgKCJpdGVtIzk5IiwgIml0ZW0jMTAwIikKICAgIEByZXN1bHR7fSA8MCAgIC8vIEBye3NhbWUgcHJlZml4LCBidXQgOTkgPCAxMDAufQpzdHJ2ZXJzY21wICgiYWxwaGExIiwgImFscGhhMDAxIikKICAgIEByZXN1bHR7fSA+MCAgIC8vIEBye2ZyYWN0aW9uYWwgcGFydCBpbmZlcmlvciB0byBpbnRlZ3JhbCBvbmUufQpzdHJ2ZXJzY21wICgicGFydDFfZjAxMiIsICJwYXJ0MV9mMDEiKQogICAgQHJlc3VsdHt9ID4wICAgLy8gQHJ7dHdvIGZyYWN0aW9uYWwgcGFydHMufQpzdHJ2ZXJzY21wICgiZm9vLjAwOSIsICJmb28uMCIpCiAgICBAcmVzdWx0e30gPDAgICAvLyBAcntpZGVtLCBidXQgd2l0aCBsZWFkaW5nIHplcm9lcyBvbmx5Ln0KQGVuZCBzbWFsbGV4YW1wbGUKClRoaXMgZnVuY3Rpb24gaXMgZXNwZWNpYWxseSB1c2VmdWwgd2hlbiBkZWFsaW5nIHdpdGggZmlsZW5hbWUgc29ydGluZywKYmVjYXVzZSBmaWxlbmFtZXMgZnJlcXVlbnRseSBob2xkIGluZGljZXMvdmVyc2lvbiBudW1iZXJzLgpAZW5kIGRlZnR5cGVmdW4KCiovCgovKiBzdGF0ZXM6IFNfTjogbm9ybWFsLCBTX0k6IGNvbXBhcmluZyBpbnRlZ3JhbCBwYXJ0LCBTX0Y6IGNvbXBhcmluZwogICAgICAgICAgIGZyYWN0aW9uYWwgcGFydHMsIFNfWjogaWRlbSBidXQgd2l0aCBsZWFkaW5nIFplcm9lcyBvbmx5ICovCiNkZWZpbmUgIFNfTiAgICAweDAKI2RlZmluZSAgU19JICAgIDB4NAojZGVmaW5lICBTX0YgICAgMHg4CiNkZWZpbmUgIFNfWiAgICAweEMKCi8qIHJlc3VsdF90eXBlOiBDTVA6IHJldHVybiBkaWZmOyBMRU46IGNvbXBhcmUgdXNpbmcgbGVuX2RpZmYvZGlmZiAqLwojZGVmaW5lICBDTVAgICAgMgojZGVmaW5lICBMRU4gICAgMwoKCi8qIENvbXBhcmUgUzEgYW5kIFMyIGFzIHN0cmluZ3MgaG9sZGluZyBpbmRpY2VzL3ZlcnNpb24gbnVtYmVycywKICAgcmV0dXJuaW5nIGxlc3MgdGhhbiwgZXF1YWwgdG8gb3IgZ3JlYXRlciB0aGFuIHplcm8gaWYgUzEgaXMgbGVzcyB0aGFuLAogICBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4gUzIgKGZvciBtb3JlIGluZm8sIHNlZSB0aGUgR2xpYmMgdGV4aW5mbyBkb2MpLiAgKi8KCmludApzdHJ2ZXJzY21wIChjb25zdCBjaGFyICpzMSwgY29uc3QgY2hhciAqczIpCnsKICBjb25zdCB1bnNpZ25lZCBjaGFyICpwMSA9IChjb25zdCB1bnNpZ25lZCBjaGFyICopIHMxOwogIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnAyID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIgKikgczI7CiAgdW5zaWduZWQgY2hhciBjMSwgYzI7CiAgaW50IHN0YXRlOwogIGludCBkaWZmOwoKICAvKiBTeW1ib2wocykgICAgMCAgICAgICBbMS05XSAgIG90aGVycyAgKHBhZGRpbmcpCiAgICAgVHJhbnNpdGlvbiAgICgxMCkgMCAgKDAxKSBkICAoMDApIHggICgxMSkgLSAgICovCiAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBuZXh0X3N0YXRlW10gPQogICAgewogICAgICAvKiBzdGF0ZSAgICB4ICAgIGQgICAgMCAgICAtICovCiAgICAgIC8qIFNfTiAqLyAgU19OLCBTX0ksIFNfWiwgU19OLAogICAgICAvKiBTX0kgKi8gIFNfTiwgU19JLCBTX0ksIFNfSSwKICAgICAgLyogU19GICovICBTX04sIFNfRiwgU19GLCBTX0YsCiAgICAgIC8qIFNfWiAqLyAgU19OLCBTX0YsIFNfWiwgU19aCiAgICB9OwoKICBzdGF0aWMgY29uc3QgaW50IHJlc3VsdF90eXBlW10gPQogICAgewogICAgICAvKiBzdGF0ZSAgIHgveCAgeC9kICB4LzAgIHgvLSAgZC94ICBkL2QgIGQvMCAgZC8tCiAgICAgICAgICAgICAgICAgMC94ICAwL2QgIDAvMCAgMC8tICAtL3ggIC0vZCAgLS8wICAtLy0gKi8KCiAgICAgIC8qIFNfTiAqLyAgQ01QLCBDTVAsIENNUCwgQ01QLCBDTVAsIExFTiwgQ01QLCBDTVAsCiAgICAgICAgICAgICAgICAgQ01QLCBDTVAsIENNUCwgQ01QLCBDTVAsIENNUCwgQ01QLCBDTVAsCiAgICAgIC8qIFNfSSAqLyAgQ01QLCAtMSwgIC0xLCAgQ01QLCArMSwgIExFTiwgTEVOLCBDTVAsCiAgICAgICAgICAgICAgICAgKzEsICBMRU4sIExFTiwgQ01QLCBDTVAsIENNUCwgQ01QLCBDTVAsCiAgICAgIC8qIFNfRiAqLyAgQ01QLCBDTVAsIENNUCwgQ01QLCBDTVAsIExFTiwgQ01QLCBDTVAsCiAgICAgICAgICAgICAgICAgQ01QLCBDTVAsIENNUCwgQ01QLCBDTVAsIENNUCwgQ01QLCBDTVAsCiAgICAgIC8qIFNfWiAqLyAgQ01QLCArMSwgICsxLCAgQ01QLCAtMSwgIENNUCwgQ01QLCBDTVAsCiAgICAgICAgICAgICAgICAgLTEsICBDTVAsIENNUCwgQ01QCiAgICB9OwoKICBpZiAocDEgPT0gcDIpCiAgICByZXR1cm4gMDsKCiAgYzEgPSAqcDErKzsKICBjMiA9ICpwMisrOwogIC8qIEhpbnQ6ICcwJyBpcyBhIGRpZ2l0IHRvby4gICovCiAgc3RhdGUgPSBTX04gfCAoKGMxID09ICcwJykgKyAoSVNESUdJVCAoYzEpICE9IDApKTsKCiAgd2hpbGUgKChkaWZmID0gYzEgLSBjMikgPT0gMCAmJiBjMSAhPSAnXDAnKQogICAgewogICAgICBzdGF0ZSA9IG5leHRfc3RhdGVbc3RhdGVdOwogICAgICBjMSA9ICpwMSsrOwogICAgICBjMiA9ICpwMisrOwogICAgICBzdGF0ZSB8PSAoYzEgPT0gJzAnKSArIChJU0RJR0lUIChjMSkgIT0gMCk7CiAgICB9CgogIHN0YXRlID0gcmVzdWx0X3R5cGVbc3RhdGUgPDwgMiB8ICgoKGMyID09ICcwJykgKyAoSVNESUdJVCAoYzIpICE9IDApKSldOwoKICBzd2l0Y2ggKHN0YXRlKQogICAgewogICAgY2FzZSBDTVA6CiAgICAgIHJldHVybiBkaWZmOwogICAgICAKICAgIGNhc2UgTEVOOgogICAgICB3aGlsZSAoSVNESUdJVCAoKnAxKyspKQoJaWYgKCFJU0RJR0lUICgqcDIrKykpCgkgIHJldHVybiAxOwogICAgICAKICAgICAgcmV0dXJuIElTRElHSVQgKCpwMikgPyAtMSA6IGRpZmY7CiAgICAgIAogICAgZGVmYXVsdDoKICAgICAgcmV0dXJuIHN0YXRlOwogICAgfQp9Cg==