LyogaXg4NyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBhcmNzaW5oLgogICBDb3B5cmlnaHQgKEMpIDE5OTYsIDE5OTcsIDIwMDUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCiAgIFRoaXMgZmlsZSBpcyBwYXJ0IG9mIHRoZSBHTlUgQyBMaWJyYXJ5LgogICBDb250cmlidXRlZCBieSBVbHJpY2ggRHJlcHBlciA8ZHJlcHBlckBjeWdudXMuY29tPiwgMTk5Ni4KCiAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcgogICBtb2RpZnkgaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAgIExpY2Vuc2UgYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlcgogICB2ZXJzaW9uIDIuMSBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KCiAgIFRoZSBHTlUgQyBMaWJyYXJ5IGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsCiAgIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mCiAgIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VCiAgIExlc3NlciBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuCgogICBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgTGVzc2VyIEdlbmVyYWwgUHVibGljCiAgIExpY2Vuc2UgYWxvbmcgd2l0aCB0aGUgR05VIEMgTGlicmFyeTsgaWYgbm90LCB3cml0ZSB0byB0aGUgRnJlZQogICBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQQogICAwMjExMS0xMzA3IFVTQS4gICovCgojaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KCiNpZmRlZiBfX0VMRl9fCgkuc2VjdGlvbiAucm9kYXRhCiNlbHNlCgkudGV4dAojZW5kaWYKCgkuYWxpZ24gQUxJR05BUkcoNCkKCUFTTV9UWVBFX0RJUkVDVElWRShodWdlLEBvYmplY3QpCmh1Z2U6CS50ZmxvYXQgMWUrNDkzMAoJQVNNX1NJWkVfRElSRUNUSVZFKGh1Z2UpCgkuYWxpZ24gQUxJR05BUkcoNCkKCS8qIFBsZWFzZSBub3RlIHRoYXQgd2UgdXNlIGRvdWJsZSB2YWx1ZSBmb3IgMS4wLiAgVGhpcyBudW1iZXIKCSAgIGhhcyBhbiBleGFjdCByZXByZXNlbnRhdGlvbiBhbmQgc28gd2UgZG9uJ3QgZ2V0IGFjY3VyYWN5CgkgICBwcm9ibGVtcy4gIFRoZSBhZHZhbnRhZ2UgaXMgdGhhdCB0aGUgY29kZSBpcyBzaW1wbGVyLiAgKi8KCUFTTV9UWVBFX0RJUkVDVElWRShvbmUsQG9iamVjdCkKb25lOgkuZG91YmxlIDEuMAoJQVNNX1NJWkVfRElSRUNUSVZFKG9uZSkKCS8qIEl0IGlzIG5vdCBpbXBvcnRhbnQgdGhhdCB0aGlzIGNvbnN0YW50IGlzIHByZWNpc2UuICBJdCBpcyBvbmx5CgkgICBhIHZhbHVlIHdoaWNoIGlzIGtub3duIHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUgZm9yIHVzaW5nIHRoZQoJICAgZnlsMnhwMSBpbnN0cnVjdGlvbi4gICovCglBU01fVFlQRV9ESVJFQ1RJVkUobGltaXQsQG9iamVjdCkKbGltaXQ6CS5kb3VibGUgMC4yOQoJQVNNX1NJWkVfRElSRUNUSVZFKGxpbWl0KQoKI2lmZGVmIFBJQwojZGVmaW5lIE1PKG9wKSBvcCMjQEdPVE9GRiglZWR4KQojZWxzZQojZGVmaW5lIE1PKG9wKSBvcAojZW5kaWYKCgkudGV4dApFTlRSWShfX2FzaW5obCkKCW1vdmwJMTIoJWVzcCksICVlY3gKCW1vdmwJJDB4N2ZmZiwgJWVheAoJYW5kbAklZWN4LCAlZWF4CglhbmRsCSQweDgwMDAsICVlY3gKCW1vdmwJJWVheCwgJWVkeAoJb3JsCSQweGZmZmY4MDAwLCAlZWR4CglpbmNsCSVlZHgKCWp6CTdmCQkJLy8geCBpbiCxSW5mIG9yIE5hTgoJeG9ybAklZWN4LCAxMiglZXNwKQoJZmxkdAk0KCVlc3ApCQkJLy8gfHh8CgljbXBsCSQweDNmZGUsICVlYXgKCWpiCTJmCQkJLy8gfHh8IDwgMl4tMzQKCWZsZGxuMgkJCQkvLyBsb2coMikgOiB8eHwKCWNtcGwJJDB4NDAyMCwgJWVheAoJZnhjaAkJCQkvLyB8eHwgOiBsb2coMikKCWphCTNmCQkJLy8gfHh8ID4gMl4zNAojaWZkZWYJUElDCglMT0FEX1BJQ19SRUcgKGR4KQojZW5kaWYKCWNtcGwJJDB4NDAwMCwgJWVheAoJamEJNWYJCQkvLyB8eHwgPiAyCgoJLy8gMl4tMzQgPD0gfHh8IDw9IDIgPT4geSA9IHNpZ24oeCkqbG9nMXAofHh8K3x4fF4yLygxK3NxcnQoMSt8eHxeMikpKQoJZmxkCSVzdAkJCS8vIHx4fCA6IHx4fCA6IGxvZygyKQoJZm11bAklc3QoMSkJCQkvLyB8eHxeMiA6IHx4fCA6IGxvZygyKQoJZmxkCSVzdAkJCS8vIHx4fF4yIDogfHh8XjIgOiB8eHwgOiBsb2coMikKCWZhZGRsCU1PKG9uZSkJCQkvLyAxK3x4fF4yIDogfHh8XjIgOiB8eHwgOiBsb2coMikKCWZzcXJ0CQkJCS8vIHNxcnQoMSt8eHxeMikgOiB8eHxeMiA6IHx4fCA6IGxvZygyKQoJZmFkZGwJTU8ob25lKQkJCS8vIDErc3FydCgxK3x4fF4yKSA6IHx4fF4yIDogfHh8IDogbG9nKDIpCglmZGl2cnAJCQkJLy8gfHh8XjIvKDErc3FydCgxK3x4fF4yKSkgOiB8eHwgOiBsb2coMikKCWZhZGRwCQkJCS8vIHx4fCt8eHxeMi8oMStzcXJ0KDErfHh8XjIpKSA6IGxvZygyKQoJZmNvbWwJTU8obGltaXQpCglmbnN0c3cKCXNhaGYKCWphCTZmCglmeWwyeHAxCglqZWN4egk0ZgoJZmNocwo0OglyZXQKCjc6CWZsZHQJNCglZXNwKQoJcmV0Cgo2OglmYWRkbAlNTyhvbmUpCglmeWwyeAoJamVjeHoJNGYKCWZjaHMKNDoJcmV0CgoJLy8gfHh8IDwgMl4tMzQgPT4geSA9IHggKGluZXhhY3QgaWZmIHx4fCAhPSAwLjApCgkuYWxpZ24gQUxJR05BUkcoNCkKMjoKI2lmZGVmCVBJQwoJTE9BRF9QSUNfUkVHIChkeCkKI2VuZGlmCglqZWN4egk0ZgoJZmNocwkJCQkvLyB4CjQ6CWZsZAklc3QJCQkvLyB4IDogeAoJZmxkdAlNTyhodWdlKQkJLy8gaHVnZSA6IHggOiB4CglmYWRkcAkJCQkvLyBodWdlK3ggOiB4Cglmc3RwCSVzdCgwKQkJCS8vIHgKCXJldAoKCS8vIHx4fCA+IDJeMzQgPT4geSA9IHNpZ24oeCkgKiAobG9nKHx4fCkgKyBsb2coMikpCgkuYWxpZ24gQUxJR05BUkcoNCkKMzoJZnlsMngJCQkJLy8gbG9nKHx4fCkKCWZsZGxuMgkJCQkvLyBsb2coMikgOiBsb2cofHh8KQoJZmFkZHAJCQkJLy8gbG9nKHx4fCkrbG9nKDIpCglqZWN4egk0ZgoJZmNocwo0OglyZXQKCgkvLyB8eHwgPiAyID0+IHkgPSBzaWduKHgpICogbG9nKDIqfHh8ICsgMS8ofHh8K3NxcnQoeCp4KzEpKSkKCS5hbGlnbiBBTElHTkFSRyg0KQo1OglmbGQJJXN0CQkJLy8gfHh8IDogfHh8IDogbG9nKDIpCglmYWRkCSVzdCwgJXN0KDEpCQkvLyB8eHwgOiAyKnx4fCA6IGxvZygyKQoJZmxkCSVzdAkJCS8vIHx4fCA6IHx4fCA6IDIqfHh8IDogbG9nKDIpCglmbXVsCSVzdCgxKQkJCS8vIHx4fF4yIDogfHh8IDogMip8eHwgOiBsb2coMikKCWZhZGRsCU1PKG9uZSkJCQkvLyAxK3x4fF4yIDogfHh8IDogMip8eHwgOiBsb2coMikKCWZzcXJ0CQkJCS8vIHNxcnQoMSt8eHxeMikgOiB8eHwgOiAyKnx4fCA6IGxvZygyKQoJZmFkZHAJCQkJLy8gfHh8K3NxcnQoMSt8eHxeMikgOiAyKnx4fCA6IGxvZygyKQoJZmRpdnJsCU1PKG9uZSkJCQkvLyAxLyh8eHwrc3FydCgxK3x4fF4yKSkgOiAyKnx4fCA6IGxvZygyKQoJZmFkZHAJCQkJLy8gMip8eHwrMS8ofHh8K3NxcnQoMSt8eHxeMikpIDogbG9nKDIpCglmeWwyeAkJCQkvLyBsb2coMip8eHwrMS8ofHh8K3NxcnQoMSt8eHxeMikpKQoJamVjeHoJNGYKCWZjaHMKNDoJcmV0CkVORChfX2FzaW5obCkKd2Vha19hbGlhcyAoX19hc2luaGwsIGFzaW5obCkK