LyogaXg4NyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBhcmNzaW5oLgogICBDb3B5cmlnaHQgKEMpIDE5OTYtMjAxOCBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCiAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgoKICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHNlZQogICA8aHR0cDovL3d3dy5nbnUub3JnL2xpY2Vuc2VzLz4uICAqLwoKI2luY2x1ZGUgPGxpYm0tYWxpYXMtbGRvdWJsZS5oPgojaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KCgkuc2VjdGlvbiAucm9kYXRhCgoJLmFsaWduIEFMSUdOQVJHKDQpCgkudHlwZSBodWdlLEBvYmplY3QKaHVnZToJLnRmbG9hdCAxZSs0OTMwCglBU01fU0laRV9ESVJFQ1RJVkUoaHVnZSkKCS5hbGlnbiBBTElHTkFSRyg0KQoJLyogUGxlYXNlIG5vdGUgdGhhdCB3ZSB1c2UgZG91YmxlIHZhbHVlIGZvciAxLjAuICBUaGlzIG51bWJlcgoJICAgaGFzIGFuIGV4YWN0IHJlcHJlc2VudGF0aW9uIGFuZCBzbyB3ZSBkb24ndCBnZXQgYWNjdXJhY3kKCSAgIHByb2JsZW1zLiAgVGhlIGFkdmFudGFnZSBpcyB0aGF0IHRoZSBjb2RlIGlzIHNpbXBsZXIuICAqLwoJLnR5cGUgb25lLEBvYmplY3QKb25lOgkuZG91YmxlIDEuMAoJQVNNX1NJWkVfRElSRUNUSVZFKG9uZSkKCS8qIEl0IGlzIG5vdCBpbXBvcnRhbnQgdGhhdCB0aGlzIGNvbnN0YW50IGlzIHByZWNpc2UuICBJdCBpcyBvbmx5CgkgICBhIHZhbHVlIHdoaWNoIGlzIGtub3duIHRvIGJlIG9uIHRoZSBzYWZlIHNpZGUgZm9yIHVzaW5nIHRoZQoJICAgZnlsMnhwMSBpbnN0cnVjdGlvbi4gICovCgkudHlwZSBsaW1pdCxAb2JqZWN0CmxpbWl0OgkuZG91YmxlIDAuMjkKCUFTTV9TSVpFX0RJUkVDVElWRShsaW1pdCkKCiNpZmRlZiBQSUMKI2RlZmluZSBNTyhvcCkgb3AjI0BHT1RPRkYoJWVkeCkKI2Vsc2UKI2RlZmluZSBNTyhvcCkgb3AKI2VuZGlmCgoJLnRleHQKRU5UUlkoX19hc2luaGwpCgltb3ZsCTEyKCVlc3ApLCAlZWN4Cgltb3ZsCSQweDdmZmYsICVlYXgKCWFuZGwJJWVjeCwgJWVheAoJYW5kbAkkMHg4MDAwLCAlZWN4Cgltb3ZsCSVlYXgsICVlZHgKCW9ybAkkMHhmZmZmODAwMCwgJWVkeAoJaW5jbAklZWR4Cglqegk3ZgkJCS8vIHggaW4gsUluZiBvciBOYU4KCXhvcmwJJWVjeCwgMTIoJWVzcCkKCWZsZHQJNCglZXNwKQkJCS8vIHx4fAoJY21wbAkkMHgzZmRlLCAlZWF4CglqYgkyZgkJCS8vIHx4fCA8IDJeLTM0CglmbGRsbjIJCQkJLy8gbG9nKDIpIDogfHh8CgljbXBsCSQweDQwMjAsICVlYXgKCWZ4Y2gJCQkJLy8gfHh8IDogbG9nKDIpCglqYQkzZgkJCS8vIHx4fCA+IDJeMzQKI2lmZGVmCVBJQwoJTE9BRF9QSUNfUkVHIChkeCkKI2VuZGlmCgljbXBsCSQweDQwMDAsICVlYXgKCWphCTVmCQkJLy8gfHh8ID4gMgoKCS8vIDJeLTM0IDw9IHx4fCA8PSAyID0+IHkgPSBzaWduKHgpKmxvZzFwKHx4fCt8eHxeMi8oMStzcXJ0KDErfHh8XjIpKSkKCWZsZAklc3QJCQkvLyB8eHwgOiB8eHwgOiBsb2coMikKCWZtdWwJJXN0KDEpCQkJLy8gfHh8XjIgOiB8eHwgOiBsb2coMikKCWZsZAklc3QJCQkvLyB8eHxeMiA6IHx4fF4yIDogfHh8IDogbG9nKDIpCglmYWRkbAlNTyhvbmUpCQkJLy8gMSt8eHxeMiA6IHx4fF4yIDogfHh8IDogbG9nKDIpCglmc3FydAkJCQkvLyBzcXJ0KDErfHh8XjIpIDogfHh8XjIgOiB8eHwgOiBsb2coMikKCWZhZGRsCU1PKG9uZSkJCQkvLyAxK3NxcnQoMSt8eHxeMikgOiB8eHxeMiA6IHx4fCA6IGxvZygyKQoJZmRpdnJwCQkJCS8vIHx4fF4yLygxK3NxcnQoMSt8eHxeMikpIDogfHh8IDogbG9nKDIpCglmYWRkcAkJCQkvLyB8eHwrfHh8XjIvKDErc3FydCgxK3x4fF4yKSkgOiBsb2coMikKCWZjb21sCU1PKGxpbWl0KQoJZm5zdHN3CglzYWhmCglqYQk2ZgoJZnlsMnhwMQoJamVjeHoJNGYKCWZjaHMKNDoJcmV0Cgo3OglmbGR0CTQoJWVzcCkKCWZhZGQJJXN0CglyZXQKCjY6CWZhZGRsCU1PKG9uZSkKCWZ5bDJ4CglqZWN4egk0ZgoJZmNocwo0OglyZXQKCgkvLyB8eHwgPCAyXi0zNCA9PiB5ID0geCAoaW5leGFjdCBpZmYgfHh8ICE9IDAuMCkKCS5hbGlnbiBBTElHTkFSRyg0KQoyOgojaWZkZWYJUElDCglMT0FEX1BJQ19SRUcgKGR4KQojZW5kaWYKCWplY3h6CTRmCglmY2hzCQkJCS8vIHgKNDoJZmxkCSVzdAkJCS8vIHggOiB4CglmbGR0CU1PKGh1Z2UpCQkvLyBodWdlIDogeCA6IHgKCWZhZGRwCQkJCS8vIGh1Z2UreCA6IHgKCWZzdHAJJXN0KDApCQkJLy8geAoJY21wbAkkMHgwMDAxLCAlZWF4CglqYWUJOGYKCWZsZAklc3QoMCkKCWZtdWwJJXN0KDApCglmc3RwCSVzdCgwKQo4OglyZXQKCgkvLyB8eHwgPiAyXjM0ID0+IHkgPSBzaWduKHgpICogKGxvZyh8eHwpICsgbG9nKDIpKQoJLmFsaWduIEFMSUdOQVJHKDQpCjM6CWZ5bDJ4CQkJCS8vIGxvZyh8eHwpCglmbGRsbjIJCQkJLy8gbG9nKDIpIDogbG9nKHx4fCkKCWZhZGRwCQkJCS8vIGxvZyh8eHwpK2xvZygyKQoJamVjeHoJNGYKCWZjaHMKNDoJcmV0CgoJLy8gfHh8ID4gMiA9PiB5ID0gc2lnbih4KSAqIGxvZygyKnx4fCArIDEvKHx4fCtzcXJ0KHgqeCsxKSkpCgkuYWxpZ24gQUxJR05BUkcoNCkKNToJZmxkCSVzdAkJCS8vIHx4fCA6IHx4fCA6IGxvZygyKQoJZmFkZAklc3QsICVzdCgxKQkJLy8gfHh8IDogMip8eHwgOiBsb2coMikKCWZsZAklc3QJCQkvLyB8eHwgOiB8eHwgOiAyKnx4fCA6IGxvZygyKQoJZm11bAklc3QoMSkJCQkvLyB8eHxeMiA6IHx4fCA6IDIqfHh8IDogbG9nKDIpCglmYWRkbAlNTyhvbmUpCQkJLy8gMSt8eHxeMiA6IHx4fCA6IDIqfHh8IDogbG9nKDIpCglmc3FydAkJCQkvLyBzcXJ0KDErfHh8XjIpIDogfHh8IDogMip8eHwgOiBsb2coMikKCWZhZGRwCQkJCS8vIHx4fCtzcXJ0KDErfHh8XjIpIDogMip8eHwgOiBsb2coMikKCWZkaXZybAlNTyhvbmUpCQkJLy8gMS8ofHh8K3NxcnQoMSt8eHxeMikpIDogMip8eHwgOiBsb2coMikKCWZhZGRwCQkJCS8vIDIqfHh8KzEvKHx4fCtzcXJ0KDErfHh8XjIpKSA6IGxvZygyKQoJZnlsMngJCQkJLy8gbG9nKDIqfHh8KzEvKHx4fCtzcXJ0KDErfHh8XjIpKSkKCWplY3h6CTRmCglmY2hzCjQ6CXJldApFTkQoX19hc2luaGwpCmxpYm1fYWxpYXNfbGRvdWJsZSAoX19hc2luaCwgYXNpbmgpCg==