LyogaXg4NyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBhcmNzaW5oLgogICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDE5OTksIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgogICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KCiAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQogICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQogICAwMjExMS0xMzA3IFVTQS4gICovCgojaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KCiNpZmRlZiBfX0VMRl9fCgkuc2VjdGlvbiAucm9kYXRhCiNlbHNlCgkudGV4dAojZW5kaWYKCgkuYWxpZ24gQUxJR05BUkcoNCkKCUFTTV9UWVBFX0RJUkVDVElWRShodWdlLEBvYmplY3QpCmh1Z2U6CS5kb3VibGUgMWUrMzYKCUFTTV9TSVpFX0RJUkVDVElWRShodWdlKQoJQVNNX1RZUEVfRElSRUNUSVZFKG9uZSxAb2JqZWN0KQpvbmU6CS5kb3VibGUgMS4wCglBU01fU0laRV9ESVJFQ1RJVkUob25lKQoJQVNNX1RZUEVfRElSRUNUSVZFKGxpbWl0LEBvYmplY3QpCmxpbWl0OgkuZG91YmxlIDAuMjkKCUFTTV9TSVpFX0RJUkVDVElWRShsaW1pdCkKCiNpZmRlZiBQSUMKI2RlZmluZSBNTyhvcCkgb3AjI0BHT1RPRkYoJWVkeCkKI2Vsc2UKI2RlZmluZSBNTyhvcCkgb3AKI2VuZGlmCgoJLnRleHQKRU5UUlkoX19hc2luaGYpCgltb3ZsCTQoJWVzcCksICVlY3gKCW1vdmwJJDB4N2ZmZmZmZmYsICVlYXgKCWFuZGwJJWVjeCwgJWVheAoJYW5kbAkkMHg4MDAwMDAwMCwgJWVjeAoJbW92bAklZWF4LCAlZWR4CglvcmwJJDB4ODA3ZmZmZmYsICVlZHgKCWluY2wJJWVkeAoJanoJN2YJCQkvLyB4IGluILFJbmYgb3IgTmFOCgl4b3JsCSVlY3gsIDQoJWVzcCkKCWZsZHMJNCglZXNwKQkJCS8vIHx4fAoJY21wbAkkMHgzODAwMDAwMCwgJWVheAoJamIJMmYJCQkvLyB8eHwgPCAyXi0xNAoJZmxkbG4yCQkJCS8vIGxvZygyKSA6IHx4fAoJY21wbAkkMHg0NzAwMDAwMCwgJWVheAoJZnhjaAkJCQkvLyB8eHwgOiBsb2coMikKCWphCTNmCQkJLy8gfHh8ID4gMl4xNAojaWZkZWYJUElDCglMT0FEX1BJQ19SRUcgKGR4KQojZW5kaWYKCWNtcGwJJDB4NDAwMDAwMDAsICVlYXgKCWphCTVmCQkJLy8gfHh8ID4gMgoKCS8vIDJeLTE0IDw9IHx4fCA8PSAyID0+IHkgPSBzaWduKHgpKmxvZzFwKHx4fCt8eHxeMi8oMStzcXJ0KDErfHh8XjIpKSkKCWZsZAklc3QJCQkvLyB8eHwgOiB8eHwgOiBsb2coMikKCWZtdWwJJXN0KDEpCQkJLy8gfHh8XjIgOiB8eHwgOiBsb2coMikKCWZsZAklc3QJCQkvLyB8eHxeMiA6IHx4fF4yIDogfHh8IDogbG9nKDIpCglmYWRkbAlNTyhvbmUpCQkJLy8gMSt8eHxeMiA6IHx4fF4yIDogfHh8IDogbG9nKDIpCglmc3FydAkJCQkvLyBzcXJ0KDErfHh8XjIpIDogfHh8XjIgOiB8eHwgOiBsb2coMikKCWZhZGRsCU1PKG9uZSkJCQkvLyAxK3NxcnQoMSt8eHxeMikgOiB8eHxeMiA6IHx4fCA6IGxvZygyKQoJZmRpdnJwCQkJCS8vIHx4fF4yLygxK3NxcnQoMSt8eHxeMikpIDogfHh8IDogbG9nKDIpCglmYWRkcAkJCQkvLyB8eHwrfHh8XjIvKDErc3FydCgxK3x4fF4yKSkgOiBsb2coMikKCWZjb21sCU1PKGxpbWl0KQoJZm5zdHN3CglzYWhmCglqYQk2ZgoJZnlsMnhwMQoJamVjeHoJNGYKCWZjaHMKNDoJcmV0Cgo3OglmbGRzCTQoJWVzcCkKCXJldAoKNjoJZmFkZGwJTU8ob25lKQoJZnlsMngKCWplY3h6CTRmCglmY2hzCjQ6CXJldAoKCS8vIHx4fCA8IDJeLTE0ID0+IHkgPSB4IChpbmV4YWN0IGlmZiB8eHwgIT0gMC4wKQoJLmFsaWduIEFMSUdOQVJHKDQpCjI6CiNpZmRlZglQSUMKCUxPQURfUElDX1JFRyAoZHgpCiNlbmRpZgoJamVjeHoJNGYKCWZjaHMJCQkJLy8geAo0OglmbGQJJXN0CQkJLy8geCA6IHgKCWZhZGRsCU1PKGh1Z2UpCQkvLyBodWdlK3ggOiB4Cglmc3RwCSVzdCgwKQkJCS8vIHgKCXJldAoKCS8vIHx4fCA+IDJeMTQgPT4geSA9IHNpZ24oeCkgKiAobG9nKHx4fCkgKyBsb2coMikpCgkuYWxpZ24gQUxJR05BUkcoNCkKMzoJZnlsMngJCQkJLy8gbG9nKHx4fCkKCWZsZGxuMgkJCQkvLyBsb2coMikgOiBsb2cofHh8KQoJZmFkZHAJCQkJLy8gbG9nKHx4fCkrbG9nKDIpCglqZWN4egk0ZgoJZmNocwo0OglyZXQKCgkvLyB8eHwgPiAyID0+IHkgPSBzaWduKHgpICogbG9nKDIqfHh8ICsgMS8ofHh8K3NxcnQoeCp4KzEpKSkKCS5hbGlnbiBBTElHTkFSRyg0KQo1OglmbGQJJXN0CQkJLy8gfHh8IDogfHh8IDogbG9nKDIpCglmYWRkCSVzdCwgJXN0KDEpCQkvLyB8eHwgOiAyKnx4fCA6IGxvZygyKQoJZmxkCSVzdAkJCS8vIHx4fCA6IHx4fCA6IDIqfHh8IDogbG9nKDIpCglmbXVsCSVzdCgxKQkJCS8vIHx4fF4yIDogfHh8IDogMip8eHwgOiBsb2coMikKCWZhZGRsCU1PKG9uZSkJCQkvLyAxK3x4fF4yIDogfHh8IDogMip8eHwgOiBsb2coMikKCWZzcXJ0CQkJCS8vIHNxcnQoMSt8eHxeMikgOiB8eHwgOiAyKnx4fCA6IGxvZygyKQoJZmFkZHAJCQkJLy8gfHh8K3NxcnQoMSt8eHxeMikgOiAyKnx4fCA6IGxvZygyKQoJZmRpdnJsCU1PKG9uZSkJCQkvLyAxLyh8eHwrc3FydCgxK3x4fF4yKSkgOiAyKnx4fCA6IGxvZygyKQoJZmFkZHAJCQkJLy8gMip8eHwrMS8ofHh8K3NxcnQoMSt8eHxeMikpIDogbG9nKDIpCglmeWwyeAkJCQkvLyBsb2coMip8eHwrMS8ofHh8K3NxcnQoMSt8eHxeMikpKQoJamVjeHoJNGYKCWZjaHMKNDoJcmV0CkVORChfX2FzaW5oZikKd2Vha19hbGlhcyAoX19hc2luaGYsIGFzaW5oZikK