LyogaXg4NyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBwb3cgZnVuY3Rpb24uCiAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDE4IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCgogICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgc2VlCiAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCgojaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KI2luY2x1ZGUgPGkzODYtbWF0aC1hc20uaD4KCgkuc2VjdGlvbiAucm9kYXRhLmNzdDgsImFNIixAcHJvZ2JpdHMsOAoKCS5wMmFsaWduIDMKCS50eXBlIG9uZSxAb2JqZWN0Cm9uZToJLmRvdWJsZSAxLjAKCUFTTV9TSVpFX0RJUkVDVElWRShvbmUpCgkudHlwZSBwMixAb2JqZWN0CnAyOgkuYnl0ZSAwLCAwLCAwLCAwLCAwLCAwLCAweDEwLCAweDQwCglBU01fU0laRV9ESVJFQ1RJVkUocDIpCgkudHlwZSBwNjMsQG9iamVjdApwNjM6CS5ieXRlIDAsIDAsIDAsIDAsIDAsIDAsIDB4ZTAsIDB4NDMKCUFTTV9TSVpFX0RJUkVDVElWRShwNjMpCgkudHlwZSBwNjQsQG9iamVjdApwNjQ6CS5ieXRlIDAsIDAsIDAsIDAsIDAsIDAsIDB4ZjAsIDB4NDMKCUFTTV9TSVpFX0RJUkVDVElWRShwNjQpCgkudHlwZSBwNzgsQG9iamVjdApwNzg6CS5ieXRlIDAsIDAsIDAsIDAsIDAsIDAsIDB4ZDAsIDB4NDQKCUFTTV9TSVpFX0RJUkVDVElWRShwNzgpCgkudHlwZSBwbTc5LEBvYmplY3QKcG03OToJLmJ5dGUgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMHgzYgoJQVNNX1NJWkVfRElSRUNUSVZFKHBtNzkpCgoJLnNlY3Rpb24gLnJvZGF0YS5jc3QxNiwiYU0iLEBwcm9nYml0cywxNgoKCS5wMmFsaWduIDMKCS50eXBlIGluZmluaXR5LEBvYmplY3QKaW5mX3plcm86CmluZmluaXR5OgoJLmJ5dGUgMCwgMCwgMCwgMCwgMCwgMCwgMHhmMCwgMHg3ZgoJQVNNX1NJWkVfRElSRUNUSVZFKGluZmluaXR5KQoJLnR5cGUgemVybyxAb2JqZWN0Cnplcm86CS5kb3VibGUgMC4wCglBU01fU0laRV9ESVJFQ1RJVkUoemVybykKCS50eXBlIG1pbmZfbXplcm8sQG9iamVjdAptaW5mX216ZXJvOgptaW5maW5pdHk6CgkuYnl0ZSAwLCAwLCAwLCAwLCAwLCAwLCAweGYwLCAweGZmCm16ZXJvOgoJLmJ5dGUgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMHg4MAoJQVNNX1NJWkVfRElSRUNUSVZFKG1pbmZfbXplcm8pCkRFRklORV9MREJMX01JTgoKI2lmZGVmIFBJQwojIGRlZmluZSBNTyhvcCkgb3AjI0BHT1RPRkYoJWVjeCkKIyBkZWZpbmUgTU9YKG9wLHgsZikgb3AjI0BHT1RPRkYoJWVjeCx4LGYpCiNlbHNlCiMgZGVmaW5lIE1PKG9wKSBvcAojIGRlZmluZSBNT1gob3AseCxmKSBvcCgseCxmKQojZW5kaWYKCgkudGV4dApFTlRSWShfX2llZWU3NTRfcG93bCkKCWZsZHQJMTYoJWVzcCkJLy8geQoJZnhhbQoKI2lmZGVmCVBJQwoJTE9BRF9QSUNfUkVHIChjeCkKI2VuZGlmCgoJZm5zdHN3Cgltb3ZiCSVhaCwgJWRsCglhbmRiCSQweDQ1LCAlYWgKCWNtcGIJJDB4NDAsICVhaAkvLyBpcyB5ID09IDAgPwoJamUJMTFmCgoJY21wYgkkMHgwNSwgJWFoCS8vIGlzIHkgPT0gsWluZiA/CglqZQkxMmYKCgljbXBiCSQweDAxLCAlYWgJLy8gaXMgeSA9PSBOYU4gPwoJamUJMzBmCgoJZmxkdAk0KCVlc3ApCQkvLyB4IDogeQoKCXN1YmwJJDgsJWVzcAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg4KQoKCWZ4YW0KCWZuc3RzdwoJbW92YgklYWgsICVkaAoJYW5kYgkkMHg0NSwgJWFoCgljbXBiCSQweDQwLCAlYWgKCWplCTIwZgkJLy8geCBpcyCxMAoKCWNtcGIJJDB4MDUsICVhaAoJamUJMTVmCQkvLyB4IGlzILFpbmYKCgljbXBiCSQweDAxLCAlYWgKCWplCTMyZgkJLy8geCBpcyBOYU4KCglmeGNoCQkJLy8geSA6IHgKCgkvKiBmaXN0cGxsIHJhaXNlcyBpbnZhbGlkIGV4Y2VwdGlvbiBmb3IgfHl8ID49IDFMPDw2My4gICovCglmbGQJJXN0CQkvLyB5IDogeSA6IHgKCWZhYnMJCQkvLyB8eXwgOiB5IDogeAoJZmNvbXBsCU1PKHA2MykJCS8vIHkgOiB4CglmbnN0c3cKCXNhaGYKCWpuYwkyZgoKCS8qIEZpcnN0IHNlZSB3aGV0aGVyIGB5JyBpcyBhIG5hdHVyYWwgbnVtYmVyLiAgSW4gdGhpcyBjYXNlIHdlCgkgICBjYW4gdXNlIGEgbW9yZSBwcmVjaXNlIGFsZ29yaXRobS4gICovCglmbGQJJXN0CQkvLyB5IDogeSA6IHgKCWZpc3RwbGwJKCVlc3ApCQkvLyB5IDogeAoJZmlsZGxsCSglZXNwKQkJLy8gaW50KHkpIDogeSA6IHgKCWZ1Y29tcAklc3QoMSkJCS8vIHkgOiB4CglmbnN0c3cKCXNhaGYKCWplCTlmCgoJLy8gSWYgeSBoYXMgYWJzb2x1dGUgdmFsdWUgYXQgbW9zdCAweDFwLTc5LCB0aGVuIGFueSBmaW5pdGUKCS8vIG5vbnplcm8geCB3aWxsIHJlc3VsdCBpbiAxLiAgU2F0dXJhdGUgeSB0byB0aG9zZSBib3VuZHMgdG8KCS8vIGF2b2lkIHVuZGVyZmxvdyBpbiB0aGUgY2FsY3VsYXRpb24gb2YgeSpsb2cyKHgpLgoJZmxkCSVzdAkJLy8geSA6IHkgOiB4CglmYWJzCQkJLy8gfHl8IDogeSA6IHgKCWZjb21wbAlNTyhwbTc5KQkvLyB5IDogeAoJZm5zdHN3CglzYWhmCglqbmMJM2YKCWZzdHAJJXN0KDApCQkvLyBwb3AgeQoJZmxkbAlNTyhwbTc5KQkvLyAweDFwLTc5IDogeAoJdGVzdGIJJDIsICVkbAoJam56CTNmCQkvLyB5ID4gMAoJZmNocwkJCS8vIC0weDFwLTc5IDogeAoJam1wCTNmCgo5OgkvKiBPSywgd2UgaGF2ZSBhbiBpbnRlZ2VyIHZhbHVlIGZvciB5LiAgVW5sZXNzIHZlcnkgc21hbGwKCSAgICh3ZSB1c2UgPCA0KSwgdXNlIHRoZSBhbGdvcml0aG0gZm9yIHJlYWwgZXhwb25lbnQgdG8gYXZvaWQKCSAgIGFjY3VtdWxhdGlvbiBvZiBlcnJvcnMuICAqLwoJZmxkCSVzdAkJLy8geSA6IHkgOiB4CglmYWJzCQkJLy8gfHl8IDogeSA6IHgKCWZjb21wbAlNTyhwMikJCS8vIHkgOiB4CglmbnN0c3cKCXNhaGYKCWpuYwkzZgoJcG9wbAklZWF4CgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoJcG9wbAklZWR4CgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoJb3JsCSQwLCAlZWR4Cglmc3RwCSVzdCgwKQkJLy8geAoJam5zCTRmCQkvLyB5ID49IDAsIGp1bXAKCWZkaXZybAlNTyhvbmUpCQkvLyAxL3gJCShub3cgcmVmZXJyZWQgdG8gYXMgeCkKCW5lZ2wJJWVheAoJYWRjbAkkMCwgJWVkeAoJbmVnbAklZWR4CjQ6CWZsZGwJTU8ob25lKQkJLy8gMSA6IHgKCWZ4Y2gKCgkvKiBJZiB5IGlzIGV2ZW4sIHRha2UgdGhlIGFic29sdXRlIHZhbHVlIG9mIHguICBPdGhlcndpc2UsCgkgICBlbnN1cmUgYWxsIGludGVybWVkaWF0ZSB2YWx1ZXMgdGhhdCBtaWdodCBvdmVyZmxvdyBoYXZlIHRoZQoJICAgc2lnbiBvZiB4LiAgKi8KCXRlc3RiCSQxLCAlYWwKCWpuegk2ZgoJZmFicwoKNjoJc2hyZGwJJDEsICVlZHgsICVlYXgKCWpuYwk1ZgoJZnhjaAoJZmFicwoJZm11bAklc3QoMSkJCS8vIHggOiBTVCp4CglmeGNoCjU6CWZsZAklc3QJCS8vIHggOiB4IDogU1QqeAoJZmFicwkJCS8vIHx4fCA6IHggOiBTVCp4CglmbXVscAkJCS8vIHx4fCp4IDogU1QqeAoJc2hybAkkMSwgJWVkeAoJbW92bAklZWF4LCAlZWN4CglvcmwJJWVkeCwgJWVjeAoJam56CTZiCglmc3RwCSVzdCgwKQkJLy8gU1QqeAojaWZkZWYJUElDCglMT0FEX1BJQ19SRUcgKGN4KQojZW5kaWYKCUxEQkxfQ0hFQ0tfRk9SQ0VfVUZMT1dfTk9OTkFOCglyZXQKCgkvKiB5IGlzILFOQU4gKi8KMzA6CWZsZHQJNCglZXNwKQkJLy8geCA6IHkKCWZsZGwJTU8ob25lKQkJLy8gMS4wIDogeCA6IHkKCWZ1Y29tcAklc3QoMSkJCS8vIHggOiB5CglmbnN0c3cKCXNhaGYKCWplCTMzZgozMToJLyogQXQgbGVhc3Qgb25lIGFyZ3VtZW50IE5hTiwgYW5kIHJlc3VsdCBzaG91bGQgYmUgTmFOLiAgKi8KCWZhZGRwCglyZXQKMzM6CWpwCTMxYgoJLyogcG93ICgxLCBOYU4pOyBjaGVjayBpZiB0aGUgTmFOIHNpZ25hbGluZy4gICovCgl0ZXN0YgkkMHg0MCwgMjMoJWVzcCkKCWp6CTMxYgoJZnN0cAklc3QoMSkKCXJldAoKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoOCkKMzI6CWFkZGwJJDgsICVlc3AKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTgpCglmYWRkcAoJcmV0CgoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg4KQoJLmFsaWduIEFMSUdOQVJHKDQpCjI6CS8vIHkgaXMgYSBsYXJnZSBpbnRlZ2VyIChhYnNvbHV0ZSB2YWx1ZSBhdCBsZWFzdCAxTDw8NjMpLgoJLy8gSWYgeSBoYXMgYWJzb2x1dGUgdmFsdWUgYXQgbGVhc3QgMUw8PDc4LCB0aGVuIGFueSBmaW5pdGUKCS8vIG5vbnplcm8geCB3aWxsIHJlc3VsdCBpbiAwICh1bmRlcmZsb3cpLCAxIG9yIGluZmluaXR5IChvdmVyZmxvdykuCgkvLyBTYXR1cmF0ZSB5IHRvIHRob3NlIGJvdW5kcyB0byBhdm9pZCBvdmVyZmxvdyBpbiB0aGUgY2FsY3VsYXRpb24KCS8vIG9mIHkqbG9nMih4KS4KCWZsZAklc3QJCS8vIHkgOiB5IDogeAoJZmFicwkJCS8vIHx5fCA6IHkgOiB4CglmY29tcGwJTU8ocDc4KQkJLy8geSA6IHgKCWZuc3RzdwoJc2FoZgoJamMJM2YKCWZzdHAJJXN0KDApCQkvLyBwb3AgeQoJZmxkbAlNTyhwNzgpCQkvLyAxTDw8NzggOiB4Cgl0ZXN0YgkkMiwgJWRsCglqegkzZgkJLy8geSA+IDAKCWZjaHMJCQkvLyAtKDFMPDw3OCkgOiB4CgkuYWxpZ24gQUxJR05BUkcoNCkKMzoJLyogeSBpcyBhIHJlYWwgbnVtYmVyLiAgKi8KCXN1YmwJJDI4LCAlZXNwCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDI4KQoJZnN0cHQJMTIoJWVzcCkJLy8geAoJZnN0cHQJKCVlc3ApCQkvLyA8ZW1wdHk+CgljYWxsCUhJRERFTl9KVU1QVEFSR0VUIChfX3Bvd2xfaGVscGVyKQkvLyA8cmVzdWx0PgoJYWRkbAkkMzYsICVlc3AKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTM2KQoJcmV0CgoJLy8gcG93KHgssTApID0gMSwgdW5sZXNzIHggaXMgc05hTgoJLmFsaWduIEFMSUdOQVJHKDQpCjExOglmc3RwCSVzdCgwKQkJLy8gcG9wIHkKCWZsZHQJNCglZXNwKQkJLy8geAoJZnhhbQoJZm5zdHN3CglhbmRiCSQweDQ1LCAlYWgKCWNtcGIJJDB4MDEsICVhaAoJamUJMTEyZgkJLy8geCBpcyBOYU4KMTExOglmc3RwCSVzdCgwKQoJZmxkbAlNTyhvbmUpCglyZXQKCjExMjoJdGVzdGIJJDB4NDAsIDExKCVlc3ApCglqbnoJMTExYgoJZmFkZAklc3QoMCkKCXJldAoKCS8vIHkgPT0gsWluZgoJLmFsaWduIEFMSUdOQVJHKDQpCjEyOglmc3RwCSVzdCgwKQkJLy8gcG9wIHkKCWZsZGwJTU8ob25lKQkJLy8gMQoJZmxkdAk0KCVlc3ApCQkvLyB4IDogMQoJZmFicwkJCS8vIGFicyh4KSA6IDEKCWZ1Y29tcHAJCQkvLyA8IDEsID09IDEsIG9yID4gMQoJZm5zdHN3CglhbmRiCSQweDQ1LCAlYWgKCWNtcGIJJDB4NDUsICVhaAoJamUJMTNmCQkvLyBqdW1wIGlmIHggaXMgTmFOCgoJY21wYgkkMHg0MCwgJWFoCglqZQkxNGYJCS8vIGp1bXAgaWYgfHh8ID09IDEKCglzaGxiCSQxLCAlYWgKCXhvcmIJJWFoLCAlZGwKCWFuZGwJJDIsICVlZHgKCWZsZGwJTU9YKGluZl96ZXJvLCAlZWR4LCA0KQoJcmV0CgoJLmFsaWduIEFMSUdOQVJHKDQpCjE0OglmbGRsCU1PKG9uZSkKCXJldAoKCS5hbGlnbiBBTElHTkFSRyg0KQoxMzoJZmxkdAk0KCVlc3ApCQkvLyBsb2FkIHggPT0gTmFOCglmYWRkCSVzdCgwKQoJcmV0CgoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg4KQoJLmFsaWduIEFMSUdOQVJHKDQpCgkvLyB4IGlzILFpbmYKMTU6CWZzdHAJJXN0KDApCQkvLyB5Cgl0ZXN0YgkkMiwgJWRoCglqegkxNmYJCS8vIGp1bXAgaWYgeCA9PSAraW5mCgoJLy8gZmlzdHBsbCByYWlzZXMgaW52YWxpZCBleGNlcHRpb24gZm9yIHx5fCA+PSAxTDw8NjMsIGJ1dCB5CgkvLyBtYXkgYmUgb2RkIHVubGVzcyB3ZSBrbm93IHx5fCA+PSAxTDw8NjQuCglmbGQJJXN0CQkvLyB5IDogeQoJZmFicwkJCS8vIHx5fCA6IHkKCWZjb21wbAlNTyhwNjQpCQkvLyB5CglmbnN0c3cKCXNhaGYKCWpuYwkxNmYKCWZsZGwJTU8ocDYzKQkJLy8gcDYzIDogeQoJZnhjaAkJCS8vIHkgOiBwNjMKCWZwcmVtCQkJLy8geSVwNjMgOiBwNjMKCWZzdHAJJXN0KDEpCQkvLyB5JXA2MwoKCS8vIFdlIG11c3QgZmluZCBvdXQgd2hldGhlciB5IGlzIGFuIG9kZCBpbnRlZ2VyLgoJZmxkCSVzdAkJLy8geSA6IHkKCWZpc3RwbGwJKCVlc3ApCQkvLyB5CglmaWxkbGwJKCVlc3ApCQkvLyBpbnQoeSkgOiB5CglmdWNvbXBwCQkJLy8gPGVtcHR5PgoJZm5zdHN3CglzYWhmCglqbmUJMTdmCgoJLy8gT0ssIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLCBidXQgaXMgaXQgb2RkPwoJcG9wbAklZWF4CgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoJcG9wbAklZWR4CgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoJYW5kYgkkMSwgJWFsCglqegkxOGYJCS8vIGp1bXAgaWYgbm90IG9kZAoJLy8gSXQncyBhbiBvZGQgaW50ZWdlci4KCXNocmwJJDMxLCAlZWR4CglmbGRsCU1PWChtaW5mX216ZXJvLCAlZWR4LCA4KQoJcmV0CgoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg4KQoJLmFsaWduIEFMSUdOQVJHKDQpCjE2OglmY29tcGwJTU8oemVybykKCWFkZGwJJDgsICVlc3AKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTgpCglmbnN0c3cKCXNocmwJJDUsICVlYXgKCWFuZGwJJDgsICVlYXgKCWZsZGwJTU9YKGluZl96ZXJvLCAlZWF4LCAxKQoJcmV0CgoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg4KQoJLmFsaWduIEFMSUdOQVJHKDQpCjE3OglzaGxsCSQzMCwgJWVkeAkvLyBzaWduIGJpdCBmb3IgeSBpbiByaWdodCBwb3NpdGlvbgoJYWRkbAkkOCwgJWVzcAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtOCkKMTg6CXNocmwJJDMxLCAlZWR4CglmbGRsCU1PWChpbmZfemVybywgJWVkeCwgOCkKCXJldAoKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoOCkKCS5hbGlnbiBBTElHTkFSRyg0KQoJLy8geCBpcyCxMAoyMDoJZnN0cAklc3QoMCkJCS8vIHkKCXRlc3RiCSQyLCAlZGwKCWp6CTIxZgkJLy8geSA+IDAKCgkvLyB4IGlzILEwIGFuZCB5IGlzIDwgMC4gIFdlIG11c3QgZmluZCBvdXQgd2hldGhlciB5IGlzIGFuIG9kZCBpbnRlZ2VyLgoJdGVzdGIJJDIsICVkaAoJanoJMjVmCgoJLy8gZmlzdHBsbCByYWlzZXMgaW52YWxpZCBleGNlcHRpb24gZm9yIHx5fCA+PSAxTDw8NjMsIGJ1dCB5CgkvLyBtYXkgYmUgb2RkIHVubGVzcyB3ZSBrbm93IHx5fCA+PSAxTDw8NjQuCglmbGQJJXN0CQkvLyB5IDogeQoJZmFicwkJCS8vIHx5fCA6IHkKCWZjb21wbAlNTyhwNjQpCQkvLyB5CglmbnN0c3cKCXNhaGYKCWpuYwkyNWYKCWZsZGwJTU8ocDYzKQkJLy8gcDYzIDogeQoJZnhjaAkJCS8vIHkgOiBwNjMKCWZwcmVtCQkJLy8geSVwNjMgOiBwNjMKCWZzdHAJJXN0KDEpCQkvLyB5JXA2MwoKCWZsZAklc3QJCS8vIHkgOiB5CglmaXN0cGxsCSglZXNwKQkJLy8geQoJZmlsZGxsCSglZXNwKQkJLy8gaW50KHkpIDogeQoJZnVjb21wcAkJCS8vIDxlbXB0eT4KCWZuc3RzdwoJc2FoZgoJam5lCTI2ZgoKCS8vIE9LLCB0aGUgdmFsdWUgaXMgYW4gaW50ZWdlciwgYnV0IGlzIGl0IG9kZD8KCXBvcGwJJWVheAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtNCkKCXBvcGwJJWVkeAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtNCkKCWFuZGIJJDEsICVhbAoJanoJMjdmCQkvLyBqdW1wIGlmIG5vdCBvZGQKCS8vIEl0J3MgYW4gb2RkIGludGVnZXIuCgkvLyBSYWlzZSBkaXZpZGUtYnktemVybyBleGNlcHRpb24gYW5kIGdldCBtaW51cyBpbmZpbml0eSB2YWx1ZS4KCWZsZGwJTU8ob25lKQoJZmRpdmwJTU8oemVybykKCWZjaHMKCXJldAoKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoOCkKMjU6CWZzdHAJJXN0KDApCjI2OglhZGRsCSQ4LCAlZXNwCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC04KQoyNzoJLy8gUmFpc2UgZGl2aWRlLWJ5LXplcm8gZXhjZXB0aW9uIGFuZCBnZXQgaW5maW5pdHkgdmFsdWUuCglmbGRsCU1PKG9uZSkKCWZkaXZsCU1PKHplcm8pCglyZXQKCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDgpCgkuYWxpZ24gQUxJR05BUkcoNCkKCS8vIHggaXMgsTAgYW5kIHkgaXMgPiAwLiAgV2UgbXVzdCBmaW5kIG91dCB3aGV0aGVyIHkgaXMgYW4gb2RkIGludGVnZXIuCjIxOgl0ZXN0YgkkMiwgJWRoCglqegkyMmYKCgkvLyBmaXN0cGxsIHJhaXNlcyBpbnZhbGlkIGV4Y2VwdGlvbiBmb3IgfHl8ID49IDFMPDw2MywgYnV0IHkKCS8vIG1heSBiZSBvZGQgdW5sZXNzIHdlIGtub3cgfHl8ID49IDFMPDw2NC4KCWZsZAklc3QJCS8vIHkgOiB5CglmY29tcGwJTU8ocDY0KQkJLy8geQoJZm5zdHN3CglzYWhmCglqbmMJMjJmCglmbGRsCU1PKHA2MykJCS8vIHA2MyA6IHkKCWZ4Y2gJCQkvLyB5IDogcDYzCglmcHJlbQkJCS8vIHklcDYzIDogcDYzCglmc3RwCSVzdCgxKQkJLy8geSVwNjMKCglmbGQJJXN0CQkvLyB5IDogeQoJZmlzdHBsbAkoJWVzcCkJCS8vIHkKCWZpbGRsbAkoJWVzcCkJCS8vIGludCh5KSA6IHkKCWZ1Y29tcHAJCQkvLyA8ZW1wdHk+CglmbnN0c3cKCXNhaGYKCWpuZQkyM2YKCgkvLyBPSywgdGhlIHZhbHVlIGlzIGFuIGludGVnZXIsIGJ1dCBpcyBpdCBvZGQ/Cglwb3BsCSVlYXgKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTQpCglwb3BsCSVlZHgKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTQpCglhbmRiCSQxLCAlYWwKCWp6CTI0ZgkJLy8ganVtcCBpZiBub3Qgb2RkCgkvLyBJdCdzIGFuIG9kZCBpbnRlZ2VyLgoJZmxkbAlNTyhtemVybykKCXJldAoKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoOCkKMjI6CWZzdHAJJXN0KDApCjIzOglhZGRsCSQ4LCAlZXNwCS8vIERvbid0IHVzZSAyIHggcG9wCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC04KQoyNDoJZmxkbAlNTyh6ZXJvKQoJcmV0CgpFTkQoX19pZWVlNzU0X3Bvd2wpCnN0cm9uZ19hbGlhcyAoX19pZWVlNzU0X3Bvd2wsIF9fcG93bF9maW5pdGUpCg==