LyoKICogKEMpIENvcHlyaWdodCAyMDAyCiAqIERhbmllbCBFbmdzdHL2bSwgT21pY3JvbiBDZXRpIEFCLCBkYW5pZWxAb21pY3Jvbi5zZS4KICoKICogU2VlIGZpbGUgQ1JFRElUUyBmb3IgbGlzdCBvZiBwZW9wbGUgd2hvIGNvbnRyaWJ1dGVkIHRvIHRoaXMKICogcHJvamVjdC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogKiBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBhcwogKiBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZgogKiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KICoKICogVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAqIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAqIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUKICogR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KICoKICogWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogYWxvbmcgd2l0aCB0aGlzIHByb2dyYW07IGlmIG5vdCwgd3JpdGUgdG8gdGhlIEZyZWUgU29mdHdhcmUKICogRm91bmRhdGlvbiwgSW5jLiwgNTkgVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwKICogTUEgMDIxMTEtMTMwNyBVU0EKICovCgpPVVRQVVRfRk9STUFUKCJlbGYzMi1pMzg2IiwgImVsZjMyLWkzODYiLCAiZWxmMzItaTM4NiIpCk9VVFBVVF9BUkNIKGkzODYpCkVOVFJZKF9zdGFydCkKClNFQ1RJT05TCnsKCS4gPSBDT05GSUdfU1lTX1RFWFRfQkFTRTsJLyogTG9jYXRpb24gb2YgYm9vdGNvZGUgaW4gZmxhc2ggKi8KCV9fdGV4dF9zdGFydCA9IC47CgkudGV4dCAgOiB7ICooLnRleHQqKTsgfQoKCS4gPSBBTElHTig0KTsKCV9fdV9ib290X2NtZF9zdGFydCA9IC47CgkudV9ib290X2NtZCA6IHsgKigudV9ib290X2NtZCkgfQoJLiA9IEFMSUdOKDQpOwoJX191X2Jvb3RfY21kX2VuZCA9IC47CgoJLiA9IEFMSUdOKDQpOwoJLnJvZGF0YSA6IHsgKihTT1JUX0JZX0FMSUdOTUVOVChTT1JUX0JZX05BTUUoLnJvZGF0YSopKSkgfQoKCS4gPSBBTElHTig0KTsKCS5kYXRhIDogeyAqKC5kYXRhKikgfQoKCS4gPSBBTElHTig0KTsKCS5keW5zeW0gOiB7ICooLmR5bnN5bSopIH0KCgkuID0gQUxJR04oNCk7CgkuaGFzaCA6IHsgKiguaGFzaCopIH0KCgkuID0gQUxJR04oNCk7CgkuZ290IDogeyAqKC5nb3QqKSB9CgoJLiA9IEFMSUdOKDQpOwoJX19kYXRhX2VuZCA9IC47CgoJLiA9IEFMSUdOKDQpOwoJX19ic3Nfc3RhcnQgPSBBQlNPTFVURSguKTsKCS5ic3MgKE5PTE9BRCkgOiB7ICooLmJzcykgfQoJLiA9IEFMSUdOKDQpOwoJX19ic3NfZW5kID0gQUJTT0xVVEUoLik7CgoJLiA9IEFMSUdOKDQpOwoJX19yZWxfZHluX3N0YXJ0ID0gLjsKCS5yZWwuZHluIDogeyAqKC5yZWwuZHluKSB9CglfX3JlbF9keW5fZW5kID0gLjsKCgkvRElTQ0FSRC8gOiB7ICooLmR5bnN0ciopIH0KCS9ESVNDQVJELyA6IHsgKiguZHluYW1pYyopIH0KCS9ESVNDQVJELyA6IHsgKigucGx0KikgfQoJL0RJU0NBUkQvIDogeyAqKC5pbnRlcnAqKSB9CgkvRElTQ0FSRC8gOiB7ICooLmdudSopIH0KCgkvKiAxNmJpdCByZWFsbW9kZSB0cmFtcG9saW5lIGNvZGUgKi8KCS5yZWFsbW9kZSAweDdjMCA6IEFUICggTE9BREFERFIoLnJlbC5keW4pICsgU0laRU9GKC5yZWwuZHluKSApIHsgS0VFUCgqKC5yZWFsbW9kZSkpIH0KCglfX3JlYWxtb2RlX3N0YXJ0ID0gTE9BREFERFIoLnJlYWxtb2RlKTsKCV9fcmVhbG1vZGVfc2l6ZSA9IFNJWkVPRigucmVhbG1vZGUpOwoKCS8qIDE2Yml0IEJJT1MgZW11bGF0aW9uIGNvZGUgKGp1c3QgZW5vdWdoIHRvIGJvb3QgTGludXgpICovCgkuYmlvcyAwIDogQVQgKCBMT0FEQUREUigucmVhbG1vZGUpICsgU0laRU9GKC5yZWFsbW9kZSkgKSB7IEtFRVAoKiguYmlvcykpIH0KCglfX2Jpb3Nfc3RhcnQgPSBMT0FEQUREUiguYmlvcyk7CglfX2Jpb3Nfc2l6ZSA9IFNJWkVPRiguYmlvcyk7CgoJLyogVGhlIGxvYWQgYWRkcmVzc2VzIGJlbG93IGFzc3VtZXMgdGhhdCB0aGUgZmxhc2gKCSAqIHdpbGwgYmUgbWFwcGVkIHNvIHRoYXQgMHgzODdmMDAwMCA9PSAweGZmZmYwMDAwCgkgKiBhdCByZXNldCB0aW1lCgkgKgoJICogVGhlIGZlMDAgYW5kIGZmMDAgb2Zmc2V0cyBvZiB0aGUgc3RhcnQzMiBhbmQgc3RhcnQxNgoJICogc2VnbWVudHMgYXJlIGFyYml0cmFyeSwgdGhlIGp1c3QgaGF2ZSB0byBiZSBtYXBwZWQKCSAqIGF0IHJlc2V0IGFuZCB0aGUgY29kZSBoYXZlIHRvIGZpdC4KCSAqIFRoZSBmZmYwIG9mZnNldCBvZiByZXNldHZlYyBpcyBpbXBvcnRhbnQsIGhvd2V2ZXIuCgkgKi8KCS4gPSAweGZmZmZmZTAwOwoJLnN0YXJ0MzIgOiBBVCAoQ09ORklHX1NZU19URVhUX0JBU0UgKyAweDNmZTAwKSB7IEtFRVAoKiguc3RhcnQzMikpOyB9CgoJLiA9IDB4ZjgwMDsKCS5zdGFydDE2IDogQVQgKENPTkZJR19TWVNfVEVYVF9CQVNFICsgMHgzZjgwMCkgeyBLRUVQKCooLnN0YXJ0MTYpKTsgfQoKCS4gPSAweGZmZjA7CgkucmVzZXR2ZWMgOiBBVCAoQ09ORklHX1NZU19URVhUX0JBU0UgKyAweDNmZmYwKSB7IEtFRVAoKigucmVzZXR2ZWMpKTsgfQp9Cg==