LyogaXg4NyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBhcmNzaW5oLgogICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgogICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KCiAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQogICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQogICAwMjExMS0xMzA3IFVTQS4gICovCgojaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KCiNpZmRlZiBfX0VMRl9fCgkuc2VjdGlvbiAucm9kYXRhCiNlbHNlCgkudGV4dAojZW5kaWYKCgkuYWxpZ24gQUxJR05BUkcoNCkKCUFTTV9UWVBFX0RJUkVDVElWRShodWdlLEBvYmplY3QpCmh1Z2U6CS5kb3VibGUgMWUrMzAwCglBU01fU0laRV9ESVJFQ1RJVkUoaHVnZSkKCUFTTV9UWVBFX0RJUkVDVElWRShvbmUsQG9iamVjdCkKb25lOgkuZG91YmxlIDEuMAoJQVNNX1NJWkVfRElSRUNUSVZFKG9uZSkKCUFTTV9UWVBFX0RJUkVDVElWRShsaW1pdCxAb2JqZWN0KQpsaW1pdDoJLmRvdWJsZSAwLjI5CglBU01fU0laRV9ESVJFQ1RJVkUobGltaXQpCgojaWZkZWYgUElDCiNkZWZpbmUgTU8ob3ApIG9wIyNAR09UT0ZGKCVlZHgpCiNlbHNlCiNkZWZpbmUgTU8ob3ApIG9wCiNlbmRpZgoKCS50ZXh0CkVOVFJZKF9fYXNpbmgpCgltb3ZsCTgoJWVzcCksICVlY3gKCW1vdmwJJDB4N2ZmZmZmZmYsICVlYXgKCWFuZGwJJWVjeCwgJWVheAoJYW5kbAkkMHg4MDAwMDAwMCwgJWVjeAoJbW92bAklZWF4LCAlZWR4CglvcmwJJDB4ODAwZmZmZmYsICVlZHgKCWluY2wJJWVkeAoJanoJN2YJCQkvLyB4IGluILFJbmYgb3IgTmFOCgl4b3JsCSVlY3gsIDgoJWVzcCkKCWZsZGwJNCglZXNwKQkJCS8vIHx4fAoJY21wbAkkMHgzZTMwMDAwMCwgJWVheAoJamIJMmYJCQkvLyB8eHwgPCAyXi0yOAoJZmxkbG4yCQkJCS8vIGxvZygyKSA6IHx4fAoJY21wbAkkMHg0MWIwMDAwMCwgJWVheAoJZnhjaAkJCQkvLyB8eHwgOiBsb2coMikKCWphCTNmCQkJLy8gfHh8ID4gMl4yOAojaWZkZWYJUElDCglMT0FEX1BJQ19SRUcgKGR4KQojZW5kaWYKCWNtcGwJJDB4NDAwMDAwMDAsICVlYXgKCWphCTVmCQkJLy8gfHh8ID4gMgoKCS8vIDJeLTI4IDw9IHx4fCA8PSAyID0+IHkgPSBzaWduKHgpKmxvZzFwKHx4fCt8eHxeMi8oMStzcXJ0KDErfHh8XjIpKSkKCWZsZAklc3QJCQkvLyB8eHwgOiB8eHwgOiBsb2coMikKCWZtdWwJJXN0KDEpCQkJLy8gfHh8XjIgOiB8eHwgOiBsb2coMikKCWZsZAklc3QJCQkvLyB8eHxeMiA6IHx4fF4yIDogfHh8IDogbG9nKDIpCglmYWRkbAlNTyhvbmUpCQkJLy8gMSt8eHxeMiA6IHx4fF4yIDogfHh8IDogbG9nKDIpCglmc3FydAkJCQkvLyBzcXJ0KDErfHh8XjIpIDogfHh8XjIgOiB8eHwgOiBsb2coMikKCWZhZGRsCU1PKG9uZSkJCQkvLyAxK3NxcnQoMSt8eHxeMikgOiB8eHxeMiA6IHx4fCA6IGxvZygyKQoJZmRpdnJwCQkJCS8vIHx4fF4yLygxK3NxcnQoMSt8eHxeMikpIDogfHh8IDogbG9nKDIpCglmYWRkcAkJCQkvLyB8eHwrfHh8XjIvKDErc3FydCgxK3x4fF4yKSkgOiBsb2coMikKCWZjb21sCU1PKGxpbWl0KQoJZm5zdHN3CglzYWhmCglqYQk2ZgoJZnlsMnhwMQoJamVjeHoJNGYKCWZjaHMKNDoJcmV0Cgo3OglmbGRsCTQoJWVzcCkKCXJldAoKNjoJZmFkZGwJTU8ob25lKQoJZnlsMngKCWplY3h6CTRmCglmY2hzCjQ6CXJldAoKCS8vIHx4fCA8IDJeLTI4ID0+IHkgPSB4IChpbmV4YWN0IGlmZiB8eHwgIT0gMC4wKQoJLmFsaWduIEFMSUdOQVJHKDQpCjI6CiNpZmRlZglQSUMKCUxPQURfUElDX1JFRyAoZHgpCiNlbmRpZgoJamVjeHoJNGYKCWZjaHMJCQkJLy8geAo0OglmbGQJJXN0CQkJLy8geCA6IHgKCWZhZGRsCU1PKGh1Z2UpCQkvLyBodWdlK3ggOiB4Cglmc3RwCSVzdCgwKQkJCS8vIHgKCXJldAoKCS8vIHx4fCA+IDJeMjggPT4geSA9IHNpZ24oeCkgKiAobG9nKHx4fCkgKyBsb2coMikpCgkuYWxpZ24gQUxJR05BUkcoNCkKMzoJZnlsMngJCQkJLy8gbG9nKHx4fCkKCWZsZGxuMgkJCQkvLyBsb2coMikgOiBsb2cofHh8KQoJZmFkZHAJCQkJLy8gbG9nKHx4fCkrbG9nKDIpCglqZWN4egk0ZgoJZmNocwo0OglyZXQKCgkvLyB8eHwgPiAyID0+IHkgPSBzaWduKHgpICogbG9nKDIqfHh8ICsgMS8ofHh8K3NxcnQoeCp4KzEpKSkKCS5hbGlnbiBBTElHTkFSRyg0KQo1OglmbGQJJXN0CQkJLy8gfHh8IDogfHh8IDogbG9nKDIpCglmYWRkCSVzdCwgJXN0KDEpCQkvLyB8eHwgOiAyKnx4fCA6IGxvZygyKQoJZmxkCSVzdAkJCS8vIHx4fCA6IHx4fCA6IDIqfHh8IDogbG9nKDIpCglmbXVsCSVzdCgxKQkJCS8vIHx4fF4yIDogfHh8IDogMip8eHwgOiBsb2coMikKCWZhZGRsCU1PKG9uZSkJCQkvLyAxK3x4fF4yIDogfHh8IDogMip8eHwgOiBsb2coMikKCWZzcXJ0CQkJCS8vIHNxcnQoMSt8eHxeMikgOiB8eHwgOiAyKnx4fCA6IGxvZygyKQoJZmFkZHAJCQkJLy8gfHh8K3NxcnQoMSt8eHxeMikgOiAyKnx4fCA6IGxvZygyKQoJZmRpdnJsCU1PKG9uZSkJCQkvLyAxLyh8eHwrc3FydCgxK3x4fF4yKSkgOiAyKnx4fCA6IGxvZygyKQoJZmFkZHAJCQkJLy8gMip8eHwrMS8ofHh8K3NxcnQoMSt8eHxeMikpIDogbG9nKDIpCglmeWwyeAkJCQkvLyBsb2coMip8eHwrMS8ofHh8K3NxcnQoMSt8eHxeMikpKQoJamVjeHoJNGYKCWZjaHMKNDoJcmV0CkVORChfX2FzaW5oKQp3ZWFrX2FsaWFzIChfX2FzaW5oLCBhc2luaCkK