LyogaXg4NyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBwb3cgZnVuY3Rpb24uCiAgIENvcHlyaWdodCAoQykgMTk5NiwgMTk5NywgMTk5OCwgMTk5OSwgMjAwMSwgMjAwNCwgMjAwNwogICBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4KICAgVGhpcyBmaWxlIGlzIHBhcnQgb2YgdGhlIEdOVSBDIExpYnJhcnkuCiAgIENvbnRyaWJ1dGVkIGJ5IFVscmljaCBEcmVwcGVyIDxkcmVwcGVyQGN5Z251cy5jb20+LCAxOTk2LgoKICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yCiAgIG1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5zZSBhcyBwdWJsaXNoZWQgYnkgdGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyCiAgIHZlcnNpb24gMi4xIG9mIHRoZSBMaWNlbnNlLCBvciAoYXQgeW91ciBvcHRpb24pIGFueSBsYXRlciB2ZXJzaW9uLgoKICAgVGhlIEdOVSBDIExpYnJhcnkgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwKICAgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YKICAgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFLiAgU2VlIHRoZSBHTlUKICAgTGVzc2VyIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yIG1vcmUgZGV0YWlscy4KCiAgIFlvdSBzaG91bGQgaGF2ZSByZWNlaXZlZCBhIGNvcHkgb2YgdGhlIEdOVSBMZXNzZXIgR2VuZXJhbCBQdWJsaWMKICAgTGljZW5zZSBhbG9uZyB3aXRoIHRoZSBHTlUgQyBMaWJyYXJ5OyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlCiAgIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5IFRlbXBsZSBQbGFjZSwgU3VpdGUgMzMwLCBCb3N0b24sIE1BCiAgIDAyMTExLTEzMDcgVVNBLiAgKi8KCiNpbmNsdWRlIDxtYWNoaW5lL2FzbS5oPgoKI2lmZGVmIF9fRUxGX18KCS5zZWN0aW9uIC5yb2RhdGEKI2Vsc2UKCS50ZXh0CiNlbmRpZgoKCS5hbGlnbiBBTElHTkFSRyg0KQoJQVNNX1RZUEVfRElSRUNUSVZFKGluZmluaXR5LEBvYmplY3QpCmluZl96ZXJvOgppbmZpbml0eToKCS5ieXRlIDAsIDAsIDAsIDAsIDAsIDAsIDB4ZjAsIDB4N2YKCUFTTV9TSVpFX0RJUkVDVElWRShpbmZpbml0eSkKCUFTTV9UWVBFX0RJUkVDVElWRSh6ZXJvLEBvYmplY3QpCnplcm86CS5kb3VibGUgMC4wCglBU01fU0laRV9ESVJFQ1RJVkUoemVybykKCUFTTV9UWVBFX0RJUkVDVElWRShtaW5mX216ZXJvLEBvYmplY3QpCm1pbmZfbXplcm86Cm1pbmZpbml0eToKCS5ieXRlIDAsIDAsIDAsIDAsIDAsIDAsIDB4ZjAsIDB4ZmYKbXplcm86CgkuYnl0ZSAwLCAwLCAwLCAwLCAwLCAwLCAwLCAweDgwCglBU01fU0laRV9ESVJFQ1RJVkUobWluZl9temVybykKCUFTTV9UWVBFX0RJUkVDVElWRShvbmUsQG9iamVjdCkKb25lOgkuZG91YmxlIDEuMAoJQVNNX1NJWkVfRElSRUNUSVZFKG9uZSkKCUFTTV9UWVBFX0RJUkVDVElWRShsaW1pdCxAb2JqZWN0KQpsaW1pdDoJLmRvdWJsZSAwLjI5CglBU01fU0laRV9ESVJFQ1RJVkUobGltaXQpCglBU01fVFlQRV9ESVJFQ1RJVkUocDYzLEBvYmplY3QpCnA2MzoKCS5ieXRlIDAsIDAsIDAsIDAsIDAsIDAsIDB4ZTAsIDB4NDMKCUFTTV9TSVpFX0RJUkVDVElWRShwNjMpCgojaWZkZWYgUElDCiNkZWZpbmUgTU8ob3ApIG9wIyMoJXJpcCkKI2Vsc2UKI2RlZmluZSBNTyhvcCkgb3AKI2VuZGlmCgoJLnRleHQKRU5UUlkoX19pZWVlNzU0X3Bvd2wpCglmbGR0CTI0KCVyc3ApCS8vIHkKCWZ4YW0KCgoJZm5zdHN3Cgltb3ZiCSVhaCwgJWRsCglhbmRiCSQweDQ1LCAlYWgKCWNtcGIJJDB4NDAsICVhaAkvLyBpcyB5ID09IDAgPwoJamUJMTFmCgoJY21wYgkkMHgwNSwgJWFoCS8vIGlzIHkgPT0gsWluZiA/CglqZQkxMmYKCgljbXBiCSQweDAxLCAlYWgJLy8gaXMgeSA9PSBOYU4gPwoJamUJMzBmCgoJZmxkdAk4KCVyc3ApCQkvLyB4IDogeQoKCWZ4YW0KCWZuc3RzdwoJbW92YgklYWgsICVkaAoJYW5kYgkkMHg0NSwgJWFoCgljbXBiCSQweDQwLCAlYWgKCWplCTIwZgkJLy8geCBpcyCxMAoKCWNtcGIJJDB4MDUsICVhaAoJamUJMTVmCQkvLyB4IGlzILFpbmYKCglmeGNoCQkJLy8geSA6IHgKCgkvKiBmaXN0cGxsIHJhaXNlcyBpbnZhbGlkIGV4Y2VwdGlvbiBmb3IgfHl8ID49IDFMPDw2My4gICovCglmbGRsCU1PKHA2MykJCS8vIDFMPDw2MyA6IHkgOiB4CglmbGQJJXN0KDEpCQkvLyB5IDogMUw8PDYzIDogeSA6IHgKCWZhYnMJCQkvLyB8eXwgOiAxTDw8NjMgOiB5IDogeAoJZmNvbWlwCSVzdCgxKSwgJXN0CS8vIDFMPDw2MyA6IHkgOiB4Cglmc3RwCSVzdCgwKQkJLy8geSA6IHgKCWpuYwkyZgoKCS8qIEZpcnN0IHNlZSB3aGV0aGVyIGB5JyBpcyBhIG5hdHVyYWwgbnVtYmVyLiAgSW4gdGhpcyBjYXNlIHdlCgkgICBjYW4gdXNlIGEgbW9yZSBwcmVjaXNlIGFsZ29yaXRobS4gICovCglmbGQJJXN0CQkvLyB5IDogeSA6IHgKCWZpc3RwbGwJLTgoJXJzcCkJLy8geSA6IHgKCWZpbGRsbAktOCglcnNwKQkvLyBpbnQoeSkgOiB5IDogeAoJZnVjb21pcAklc3QoMSksJXN0CS8vIHkgOiB4CglqbmUJMmYKCgkvKiBPSywgd2UgaGF2ZSBhbiBpbnRlZ2VyIHZhbHVlIGZvciB5LiAgKi8KCW1vdgktOCglcnNwKSwlZWF4Cgltb3YJLTQoJXJzcCksJWVkeAoJb3JsCSQwLCAlZWR4Cglmc3RwCSVzdCgwKQkJLy8geAoJam5zCTRmCQkvLyB5ID49IDAsIGp1bXAKCWZkaXZybAlNTyhvbmUpCQkvLyAxL3gJCShub3cgcmVmZXJyZWQgdG8gYXMgeCkKCW5lZ2wJJWVheAoJYWRjbAkkMCwgJWVkeAoJbmVnbAklZWR4CjQ6CWZsZGwJTU8ob25lKQkJLy8gMSA6IHgKCWZ4Y2gKCjY6CXNocmRsCSQxLCAlZWR4LCAlZWF4CglqbmMJNWYKCWZ4Y2gKCWZtdWwJJXN0KDEpCQkvLyB4IDogU1QqeAoJZnhjaAo1OglmbXVsCSVzdCgwKSwgJXN0CS8vIHgqeCA6IFNUKngKCXNocmwJJDEsICVlZHgKCW1vdmwJJWVheCwgJWVjeAoJb3JsCSVlZHgsICVlY3gKCWpuegk2YgoJZnN0cAklc3QoMCkJCS8vIFNUKngKCXJldAoKCS8qIHkgaXMgsU5BTiAqLwozMDoJZmxkdAk4KCVyc3ApCQkvLyB4IDogeQoJZmxkbAlNTyhvbmUpCQkvLyAxLjAgOiB4IDogeQoJZnVjb21pcAklc3QoMSksJXN0CS8vIHggOiB5CglqZQkzMWYKCWZ4Y2gJCQkvLyB5IDogeAozMToJZnN0cAklc3QoMSkKCXJldAoKCS5hbGlnbiBBTElHTkFSRyg0KQoyOgkvKiB5IGlzIGEgcmVhbCBudW1iZXIuICAqLwoJZnhjaAkJCS8vIHggOiB5CglmbGRsCU1PKG9uZSkJCS8vIDEuMCA6IHggOiB5CglmbGRsCU1PKGxpbWl0KQkvLyAwLjI5IDogMS4wIDogeCA6IHkKCWZsZAklc3QoMikJCS8vIHggOiAwLjI5IDogMS4wIDogeCA6IHkKCWZzdWIJJXN0KDIpCQkvLyB4LTEgOiAwLjI5IDogMS4wIDogeCA6IHkKCWZhYnMJCQkvLyB8eC0xfCA6IDAuMjkgOiAxLjAgOiB4IDogeQoJZnVjb21wcAkJCS8vIDEuMCA6IHggOiB5CglmbnN0c3cKCWZ4Y2gJCQkvLyB4IDogMS4wIDogeQoJdGVzdAkkNDUwMCwlZWF4Cglqegk3ZgoJZnN1Ygklc3QoMSkJCS8vIHgtMSA6IDEuMCA6IHkKCWZ5bDJ4cDEJCQkvLyBsb2cyKHgpIDogeQoJam1wCThmCgo3OglmeWwyeAkJCS8vIGxvZzIoeCkgOiB5Cjg6CWZtdWwJJXN0KDEpCQkvLyB5KmxvZzIoeCkgOiB5CglmeGFtCglmbnN0c3cKCWFuZGIJJDB4NDUsICVhaAoJY21wYgkkMHgwNSwgJWFoICAgICAgLy8gaXMgeSpsb2cyKHgpID09ILFpbmYgPwoJamUJMjhmCglmc3QJJXN0KDEpCQkvLyB5KmxvZzIoeCkgOiB5KmxvZzIoeCkKCWZybmRpbnQJCQkvLyBpbnQoeSpsb2cyKHgpKSA6IHkqbG9nMih4KQoJZnN1YnIJJXN0LCAlc3QoMSkJLy8gaW50KHkqbG9nMih4KSkgOiBmcmFjdCh5KmxvZzIoeCkpCglmeGNoCQkJLy8gZnJhY3QoeSpsb2cyKHgpKSA6IGludCh5KmxvZzIoeCkpCglmMnhtMQkJCS8vIDJeZnJhY3QoeSpsb2cyKHgpKS0xIDogaW50KHkqbG9nMih4KSkKCWZhZGRsCU1PKG9uZSkJCS8vIDJeZnJhY3QoeSpsb2cyKHgpKSA6IGludCh5KmxvZzIoeCkpCglmc2NhbGUJCQkvLyAyXmZyYWN0KHkqbG9nMih4KSkqMl5pbnQoeSpsb2cyKHgpKSA6IGludCh5KmxvZzIoeCkpCglmc3RwCSVzdCgxKQkJLy8gMl5mcmFjdCh5KmxvZzIoeCkpKjJeaW50KHkqbG9nMih4KSkKCXJldAoKMjg6CWZzdHAJJXN0KDEpCQkvLyB5KmxvZzIoeCkKCWZsZGwJTU8ob25lKQkJLy8gMSA6IHkqbG9nMih4KQoJZnNjYWxlCQkJLy8gMl4oeSpsb2cyKHgpKSA6IHkqbG9nMih4KQoJZnN0cAklc3QoMSkJCS8vIDJeKHkqbG9nMih4KSkKCXJldAoKCS8vIHBvdyh4LLEwKSA9IDEKCS5hbGlnbiBBTElHTkFSRyg0KQoxMToJZnN0cAklc3QoMCkJCS8vIHBvcCB5CglmbGRsCU1PKG9uZSkKCXJldAoKCS8vIHkgPT0gsWluZgoJLmFsaWduIEFMSUdOQVJHKDQpCjEyOglmc3RwCSVzdCgwKQkJLy8gcG9wIHkKCWZsZGwJTU8ob25lKQkJLy8gMQoJZmxkdAk4KCVyc3ApCQkvLyB4IDogMQoJZmFicwkJCS8vIGFicyh4KSA6IDEKCWZ1Y29tcHAJCQkvLyA8IDEsID09IDEsIG9yID4gMQoJZm5zdHN3CglhbmRiCSQweDQ1LCAlYWgKCWNtcGIJJDB4NDUsICVhaAoJamUJMTNmCQkvLyBqdW1wIGlmIHggaXMgTmFOCgoJY21wYgkkMHg0MCwgJWFoCglqZQkxNGYJCS8vIGp1bXAgaWYgfHh8ID09IDEKCglzaGxiCSQxLCAlYWgKCXhvcmIJJWFoLCAlZGwKCWFuZGwJJDIsICVlZHgKI2lmZGVmIFBJQwoJbGVhCWluZl96ZXJvKCVyaXApLCVyY3gKCWZsZGwJKCVyY3gsICVyZHgsIDQpCiNlbHNlCglmbGRsCWluZl96ZXJvKCwlcmR4LCA0KQojZW5kaWYKCXJldAoKCS5hbGlnbiBBTElHTkFSRyg0KQoxNDoJZmxkbAlNTyhvbmUpCglyZXQKCgkuYWxpZ24gQUxJR05BUkcoNCkKMTM6CWZsZHQJOCglcnNwKQkJLy8gbG9hZCB4ID09IE5hTgoJcmV0CgoJLmFsaWduIEFMSUdOQVJHKDQpCgkvLyB4IGlzILFpbmYKMTU6CWZzdHAJJXN0KDApCQkvLyB5Cgl0ZXN0YgkkMiwgJWRoCglqegkxNmYJCS8vIGp1bXAgaWYgeCA9PSAraW5mCgoJLy8gV2UgbXVzdCBmaW5kIG91dCB3aGV0aGVyIHkgaXMgYW4gb2RkIGludGVnZXIuCglmbGQJJXN0CQkvLyB5IDogeQoJZmlzdHBsbAktOCglcnNwKQkvLyB5CglmaWxkbGwJLTgoJXJzcCkJLy8gaW50KHkpIDogeQoJZnVjb21pcCAlc3QoMSksJXN0CglmZnJlZXAJJXN0CQkvLyA8ZW1wdHk+CglqbmUJMTdmCgoJLy8gT0ssIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLCBidXQgaXMgaXQgb2RkPwoJbW92CS04KCVyc3ApLCAlZWF4Cgltb3YJLTQoJXJzcCksICVlZHgKCWFuZGIJJDEsICVhbAoJanoJMThmCQkvLyBqdW1wIGlmIG5vdCBvZGQKCS8vIEl0J3MgYW4gb2RkIGludGVnZXIuCglzaHJsCSQzMSwgJWVkeAojaWZkZWYgUElDCglsZWEJbWluZl9temVybyglcmlwKSwlcmN4CglmbGRsCSglcmN4LCAlcmR4LCA4KQojZWxzZQoJZmxkbAltaW5mX216ZXJvKCwlcmR4LCA4KQojZW5kaWYKCXJldAoKCS5hbGlnbiBBTElHTkFSRyg0KQoxNjoJZmNvbXBsCU1PKHplcm8pCglmbnN0c3cKCXNocmwJJDUsICVlYXgKCWFuZGwJJDgsICVlYXgKI2lmZGVmIFBJQwoJbGVhCWluZl96ZXJvKCVyaXApLCVyY3gKCWZsZGwJKCVyY3gsICVyYXgsIDEpCiNlbHNlCglmbGRsCWluZl96ZXJvKCwlcmF4LCAxKQojZW5kaWYKCXJldAoKCS5hbGlnbiBBTElHTkFSRyg0KQoxNzoJc2hsbAkkMzAsICVlZHgJLy8gc2lnbiBiaXQgZm9yIHkgaW4gcmlnaHQgcG9zaXRpb24KMTg6CXNocmwJJDMxLCAlZWR4CiNpZmRlZiBQSUMKCWxlYQlpbmZfemVybyglcmlwKSwlcmN4CglmbGRsCSglcmN4LCAlcmR4LCA4KQojZWxzZQoJZmxkbAlpbmZfemVybygsJXJkeCwgOCkKI2VuZGlmCglyZXQKCgkuYWxpZ24gQUxJR05BUkcoNCkKCS8vIHggaXMgsTAKMjA6CWZzdHAJJXN0KDApCQkvLyB5Cgl0ZXN0YgkkMiwgJWRsCglqegkyMWYJCS8vIHkgPiAwCgoJLy8geCBpcyCxMCBhbmQgeSBpcyA8IDAuICBXZSBtdXN0IGZpbmQgb3V0IHdoZXRoZXIgeSBpcyBhbiBvZGQgaW50ZWdlci4KCXRlc3RiCSQyLCAlZGgKCWp6CTI1ZgoKCWZsZAklc3QJCS8vIHkgOiB5CglmaXN0cGxsCS04KCVyc3ApCS8vIHkKCWZpbGRsbAktOCglcnNwKQkvLyBpbnQoeSkgOiB5CglmdWNvbWlwCSVzdCgxKSwlc3QKCWZmcmVlcAklc3QJCS8vIDxlbXB0eT4KCWpuZQkyNmYKCgkvLyBPSywgdGhlIHZhbHVlIGlzIGFuIGludGVnZXIsIGJ1dCBpcyBpdCBvZGQ/Cgltb3YJLTgoJXJzcCksJWVheAoJbW92CS00KCVyc3ApLCVlZHgKCWFuZGIJJDEsICVhbAoJanoJMjdmCQkvLyBqdW1wIGlmIG5vdCBvZGQKCS8vIEl0J3MgYW4gb2RkIGludGVnZXIuCgkvLyBSYWlzZSBkaXZpZGUtYnktemVybyBleGNlcHRpb24gYW5kIGdldCBtaW51cyBpbmZpbml0eSB2YWx1ZS4KCWZsZGwJTU8ob25lKQoJZmRpdmwJTU8oemVybykKCWZjaHMKCXJldAoKMjU6CWZzdHAJJXN0KDApCjI2OgoyNzoJLy8gUmFpc2UgZGl2aWRlLWJ5LXplcm8gZXhjZXB0aW9uIGFuZCBnZXQgaW5maW5pdHkgdmFsdWUuCglmbGRsCU1PKG9uZSkKCWZkaXZsCU1PKHplcm8pCglyZXQKCgkuYWxpZ24gQUxJR05BUkcoNCkKCS8vIHggaXMgsTAgYW5kIHkgaXMgPiAwLiAgV2UgbXVzdCBmaW5kIG91dCB3aGV0aGVyIHkgaXMgYW4gb2RkIGludGVnZXIuCjIxOgl0ZXN0YgkkMiwgJWRoCglqegkyMmYKCglmbGQJJXN0CQkvLyB5IDogeQoJZmlzdHBsbAktOCglcnNwKQkvLyB5CglmaWxkbGwJLTgoJXJzcCkJLy8gaW50KHkpIDogeQoJZnVjb21pcCAlc3QoMSksJXN0CglmZnJlZXAJJXN0CQkvLyA8ZW1wdHk+CglqbmUJMjNmCgoJLy8gT0ssIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLCBidXQgaXMgaXQgb2RkPwoJbW92CS04KCVyc3ApLCVlYXgKCW1vdgktNCglcnNwKSwlZWR4CglhbmRiCSQxLCAlYWwKCWp6CTI0ZgkJLy8ganVtcCBpZiBub3Qgb2RkCgkvLyBJdCdzIGFuIG9kZCBpbnRlZ2VyLgoJZmxkbAlNTyhtemVybykKCXJldAoKMjI6CWZzdHAJJXN0KDApCjIzOgoyNDoJZmxkbAlNTyh6ZXJvKQoJcmV0CgpFTkQoX19pZWVlNzU0X3Bvd2wpCg==