LyogaXg4NyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBhcmN0YW5oIGZ1bmN0aW9uLgogICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxNCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCiAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgoKICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHNlZQogICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwoKI2luY2x1ZGUgPG1hY2hpbmUvYXNtLmg+CgoJLnNlY3Rpb24gLnJvZGF0YQoKCS5hbGlnbiBBTElHTkFSRyg0KQoJLyogUGxlYXNlIG5vdGUgdGhhdCB3ZSB1c2UgZG91YmxlIHZhbHVlcyBmb3IgMC41IGFuZCAxLjAuICBUaGVzZQoJICAgbnVtYmVycyBoYXZlIGV4YWN0IHJlcHJlc2VudGF0aW9ucyBhbmQgc28gd2UgZG9uJ3QgZ2V0IGFjY3VyYWN5CgkgICBwcm9ibGVtcy4gIFRoZSBhZHZhbnRhZ2UgaXMgdGhhdCB0aGUgY29kZSBpcyBzaW1wbGVyLiAgKi8KCS50eXBlIGhhbGYsQG9iamVjdApoYWxmOgkuZG91YmxlIDAuNQoJQVNNX1NJWkVfRElSRUNUSVZFKGhhbGYpCgkudHlwZSBvbmUsQG9iamVjdApvbmU6CS5kb3VibGUgMS4wCglBU01fU0laRV9ESVJFQ1RJVkUob25lKQoJLyogSXQgaXMgbm90IGltcG9ydGFudCB0aGF0IHRoaXMgY29uc3RhbnQgaXMgcHJlY2lzZS4gIEl0IGlzIG9ubHkKCSAgIGEgdmFsdWUgd2hpY2ggaXMga25vd24gdG8gYmUgb24gdGhlIHNhZmUgc2lkZSBmb3IgdXNpbmcgdGhlCgkgICBmeWwyeHAxIGluc3RydWN0aW9uLiAgKi8KCS50eXBlIGxpbWl0LEBvYmplY3QKbGltaXQ6CS5kb3VibGUgMC4yOQoJQVNNX1NJWkVfRElSRUNUSVZFKGxpbWl0KQoJLmFsaWduIEFMSUdOQVJHKDQpCgkudHlwZSBsbjJfMixAb2JqZWN0CmxuMl8yOgkudGZsb2F0IDAuMzQ2NTczNTkwMjc5OTcyNjU0NzA4NjE2MAoJQVNNX1NJWkVfRElSRUNUSVZFKGxuMl8yKQoKI2lmZGVmIFBJQwojZGVmaW5lIE1PKG9wKSBvcCMjQEdPVE9GRiglZWR4KQojZWxzZQojZGVmaW5lIE1PKG9wKSBvcAojZW5kaWYKCgkudGV4dApFTlRSWShfX2llZWU3NTRfYXRhbmhsKQoJbW92bAkxMiglZXNwKSwgJWVjeAoKCW1vdmwJJWVjeCwgJWVheAoJYW5kbAkkMHg3ZmZmLCAlZWF4CgljbXBsCSQweDdmZmYsICVlYXgKCWplCTVmCjc6CgojaWZkZWYgUElDCglMT0FEX1BJQ19SRUcgKGR4KQojZW5kaWYKCglhbmRsCSQweDgwMDAsICVlY3gJLy8gRUNYID09IDAgaWZmIFggPj0gMAoKCWZsZHQJTU8obG4yXzIpCS8vIDAuNSpsbjIKCXhvcmwJJWVjeCwgMTIoJWVzcCkKCWZsZHQJNCglZXNwKQkJLy8gfHh8IDogMC41KmxuMgoJZmNvbWwJTU8oaGFsZikJLy8gfHh8IDogMC41KmxuMgoJZmxkCSVzdCgwKQkJLy8gfHh8IDogfHh8IDogMC41KmxuMgoJZm5zdHN3CQkJLy8gfHh8IDogfHh8IDogMC41KmxuMgoJc2FoZgoJamFlCTJmCglmYWRkCSVzdCwgJXN0KDEpCS8vIHx4fCA6IDIqfHh8IDogMC41KmxuMgoJZmxkCSVzdAkJLy8gfHh8IDogfHh8IDogMip8eHwgOiAwLjUqbG4yCglmc3VicmwJTU8ob25lKQkJLy8gMS18eHwgOiB8eHwgOiAyKnx4fCA6IDAuNSpsbjIKCWZ4Y2gJCQkvLyB8eHwgOiAxLXx4fCA6IDIqfHh8IDogMC41KmxuMgoJZm11bAklc3QoMikJCS8vIDIqfHh8XjIgOiAxLXx4fCA6IDIqfHh8IDogMC41KmxuMgoJZmRpdnAJCQkvLyAoMip8eHxeMikvKDEtfHh8KSA6IDIqfHh8IDogMC41KmxuMgoJZmFkZHAJCQkvLyAyKnx4fCsoMip8eHxeMikvKDEtfHh8KSA6IDAuNSpsbjIKCWZjb21sCU1PKGxpbWl0KQkvLyAyKnx4fCsoMip8eHxeMikvKDEtfHh8KSA6IDAuNSpsbjIKCWZuc3RzdwkJCS8vIDIqfHh8KygyKnx4fF4yKS8oMS18eHwpIDogMC41KmxuMgoJc2FoZgoJamFlCTRmCglmeWwyeHAxCQkJLy8gMC41KmxuMipsZCgxKzIqfHh8KygyKnx4fF4yKS8oMS18eHwpKQoJamVjeHoJM2YKCWZjaHMJCQkvLyAwLjUqbG4yKmxkKDErMip4KygyKnheMikvKDEteCkpCjM6CXJldAoKCS5hbGlnbiBBTElHTkFSRyg0KQo0OglmYWRkbAlNTyhvbmUpCQkvLyAxKzIqfHh8KygyKnx4fF4yKS8oMS18eHwpIDogMC41KmxuMgoJZnlsMngJCQkvLyAwLjUqbG4yKmxkKDErMip8eHwrKDIqfHh8XjIpLygxLXx4fCkpCglqZWN4egkzZgoJZmNocwkJCS8vIDAuNSpsbjIqbGQoMSsyKngrKDIqeF4yKS8oMS14KSkKMzoJcmV0CgoJLmFsaWduIEFMSUdOQVJHKDQpCjI6CWZhZGRsCU1PKG9uZSkJCS8vIDErfHh8IDogfHh8IDogMC41KmxuMgoJZnhjaAkJCS8vIHx4fCA6IDErfHh8IDogMC41KmxuMgoJZnN1YnJsCU1PKG9uZSkJCS8vIDEtfHh8IDogMSt8eHwgOiAwLjUqbG4yCglmZGl2cnAJCQkvLyAoMSt8eHwpLygxLXx4fCkgOiAwLjUqbG4yCglmeWwyeAkJCS8vIDAuNSpsbjIqbGQoKDErfHh8KS8oMS18eHwpKQoJamVjeHoJM2YKCWZjaHMJCQkvLyAwLjUqbG4yKmxkKCgxK3gpLygxLXgpKQozOglyZXQKCgkvLyB4ID09IE5hTiBvciCxSW5mCjU6CWNtcGwJJDB4ODAwMDAwMDAsIDgoJWVzcCkKCWphCTZmCgljbXBsCSQwLCA0KCVlc3ApCglqZQk3Ygo2OglmbGR0CTQoJWVzcCkKCXJldApFTkQoX19pZWVlNzU0X2F0YW5obCkKc3Ryb25nX2FsaWFzIChfX2llZWU3NTRfYXRhbmhsLCBfX2F0YW5obF9maW5pdGUpCg==