LyogaXg4NyBzcGVjaWZpYyBpbXBsZW1lbnRhdGlvbiBvZiBwb3cgZnVuY3Rpb24uCiAgIENvcHlyaWdodCAoQykgMTk5Ni0yMDE0IEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiwgSW5jLgogICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgR05VIEMgTGlicmFyeS4KICAgQ29udHJpYnV0ZWQgYnkgVWxyaWNoIERyZXBwZXIgPGRyZXBwZXJAY3lnbnVzLmNvbT4sIDE5OTYuCgogICBUaGUgR05VIEMgTGlicmFyeSBpcyBmcmVlIHNvZnR3YXJlOyB5b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKICAgbW9kaWZ5IGl0IHVuZGVyIHRoZSB0ZXJtcyBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogICBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSB0aGUgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uOyBlaXRoZXIKICAgdmVyc2lvbiAyLjEgb2YgdGhlIExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCgogICBUaGUgR05VIEMgTGlicmFyeSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLAogICBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZgogICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlIEdOVQogICBMZXNzZXIgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBmb3IgbW9yZSBkZXRhaWxzLgoKICAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIExlc3NlciBHZW5lcmFsIFB1YmxpYwogICBMaWNlbnNlIGFsb25nIHdpdGggdGhlIEdOVSBDIExpYnJhcnk7IGlmIG5vdCwgc2VlCiAgIDxodHRwOi8vd3d3LmdudS5vcmcvbGljZW5zZXMvPi4gICovCgojaW5jbHVkZSA8bWFjaGluZS9hc20uaD4KCgkuc2VjdGlvbiAucm9kYXRhLmNzdDgsImFNIixAcHJvZ2JpdHMsOAoKCS5wMmFsaWduIDMKCS50eXBlIG9uZSxAb2JqZWN0Cm9uZToJLmRvdWJsZSAxLjAKCUFTTV9TSVpFX0RJUkVDVElWRShvbmUpCgkudHlwZSBwMyxAb2JqZWN0CnAzOgkuYnl0ZSAwLCAwLCAwLCAwLCAwLCAwLCAweDIwLCAweDQwCglBU01fU0laRV9ESVJFQ1RJVkUocDMpCgkudHlwZSBwNjMsQG9iamVjdApwNjM6CS5ieXRlIDAsIDAsIDAsIDAsIDAsIDAsIDB4ZTAsIDB4NDMKCUFTTV9TSVpFX0RJUkVDVElWRShwNjMpCgkudHlwZSBwNjQsQG9iamVjdApwNjQ6CS5ieXRlIDAsIDAsIDAsIDAsIDAsIDAsIDB4ZjAsIDB4NDMKCUFTTV9TSVpFX0RJUkVDVElWRShwNjQpCgkudHlwZSBwNzgsQG9iamVjdApwNzg6CS5ieXRlIDAsIDAsIDAsIDAsIDAsIDAsIDB4ZDAsIDB4NDQKCUFTTV9TSVpFX0RJUkVDVElWRShwNzgpCgkudHlwZSBwbTc5LEBvYmplY3QKcG03OToJLmJ5dGUgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMHgzYgoJQVNNX1NJWkVfRElSRUNUSVZFKHBtNzkpCgoJLnNlY3Rpb24gLnJvZGF0YS5jc3QxNiwiYU0iLEBwcm9nYml0cywxNgoKCS5wMmFsaWduIDMKCS50eXBlIGluZmluaXR5LEBvYmplY3QKaW5mX3plcm86CmluZmluaXR5OgoJLmJ5dGUgMCwgMCwgMCwgMCwgMCwgMCwgMHhmMCwgMHg3ZgoJQVNNX1NJWkVfRElSRUNUSVZFKGluZmluaXR5KQoJLnR5cGUgemVybyxAb2JqZWN0Cnplcm86CS5kb3VibGUgMC4wCglBU01fU0laRV9ESVJFQ1RJVkUoemVybykKCS50eXBlIG1pbmZfbXplcm8sQG9iamVjdAptaW5mX216ZXJvOgptaW5maW5pdHk6CgkuYnl0ZSAwLCAwLCAwLCAwLCAwLCAwLCAweGYwLCAweGZmCm16ZXJvOgoJLmJ5dGUgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMHg4MAoJQVNNX1NJWkVfRElSRUNUSVZFKG1pbmZfbXplcm8pCgojaWZkZWYgUElDCiMgZGVmaW5lIE1PKG9wKSBvcCMjQEdPVE9GRiglZWN4KQojIGRlZmluZSBNT1gob3AseCxmKSBvcCMjQEdPVE9GRiglZWN4LHgsZikKI2Vsc2UKIyBkZWZpbmUgTU8ob3ApIG9wCiMgZGVmaW5lIE1PWChvcCx4LGYpIG9wKCx4LGYpCiNlbmRpZgoKCS50ZXh0CkVOVFJZKF9faWVlZTc1NF9wb3dsKQoJZmxkdAkxNiglZXNwKQkvLyB5CglmeGFtCgojaWZkZWYJUElDCglMT0FEX1BJQ19SRUcgKGN4KQojZW5kaWYKCglmbnN0c3cKCW1vdmIJJWFoLCAlZGwKCWFuZGIJJDB4NDUsICVhaAoJY21wYgkkMHg0MCwgJWFoCS8vIGlzIHkgPT0gMCA/CglqZQkxMWYKCgljbXBiCSQweDA1LCAlYWgJLy8gaXMgeSA9PSCxaW5mID8KCWplCTEyZgoKCWNtcGIJJDB4MDEsICVhaAkvLyBpcyB5ID09IE5hTiA/CglqZQkzMGYKCglmbGR0CTQoJWVzcCkJCS8vIHggOiB5CgoJc3VibAkkOCwlZXNwCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDgpCgoJZnhhbQoJZm5zdHN3Cgltb3ZiCSVhaCwgJWRoCglhbmRiCSQweDQ1LCAlYWgKCWNtcGIJJDB4NDAsICVhaAoJamUJMjBmCQkvLyB4IGlzILEwCgoJY21wYgkkMHgwNSwgJWFoCglqZQkxNWYJCS8vIHggaXMgsWluZgoKCWNtcGIJJDB4MDEsICVhaAoJamUJMzJmCQkvLyB4IGlzIE5hTgoKCWZ4Y2gJCQkvLyB5IDogeAoKCS8qIGZpc3RwbGwgcmFpc2VzIGludmFsaWQgZXhjZXB0aW9uIGZvciB8eXwgPj0gMUw8PDYzLiAgKi8KCWZsZAklc3QJCS8vIHkgOiB5IDogeAoJZmFicwkJCS8vIHx5fCA6IHkgOiB4CglmY29tcGwJTU8ocDYzKQkJLy8geSA6IHgKCWZuc3RzdwoJc2FoZgoJam5jCTJmCgoJLyogRmlyc3Qgc2VlIHdoZXRoZXIgYHknIGlzIGEgbmF0dXJhbCBudW1iZXIuICBJbiB0aGlzIGNhc2Ugd2UKCSAgIGNhbiB1c2UgYSBtb3JlIHByZWNpc2UgYWxnb3JpdGhtLiAgKi8KCWZsZAklc3QJCS8vIHkgOiB5IDogeAoJZmlzdHBsbAkoJWVzcCkJCS8vIHkgOiB4CglmaWxkbGwJKCVlc3ApCQkvLyBpbnQoeSkgOiB5IDogeAoJZnVjb21wCSVzdCgxKQkJLy8geSA6IHgKCWZuc3RzdwoJc2FoZgoJamUJOWYKCgkvLyBJZiB5IGhhcyBhYnNvbHV0ZSB2YWx1ZSBhdCBtb3N0IDB4MXAtNzksIHRoZW4gYW55IGZpbml0ZQoJLy8gbm9uemVybyB4IHdpbGwgcmVzdWx0IGluIDEuICBTYXR1cmF0ZSB5IHRvIHRob3NlIGJvdW5kcyB0bwoJLy8gYXZvaWQgdW5kZXJmbG93IGluIHRoZSBjYWxjdWxhdGlvbiBvZiB5KmxvZzIoeCkuCglmbGQJJXN0CQkvLyB5IDogeSA6IHgKCWZhYnMJCQkvLyB8eXwgOiB5IDogeAoJZmNvbXBsCU1PKHBtNzkpCS8vIHkgOiB4CglmbnN0c3cKCXNhaGYKCWpuYwkzZgoJZnN0cAklc3QoMCkJCS8vIHBvcCB5CglmbGRsCU1PKHBtNzkpCS8vIDB4MXAtNzkgOiB4Cgl0ZXN0YgkkMiwgJWRsCglqbnoJM2YJCS8vIHkgPiAwCglmY2hzCQkJLy8gLTB4MXAtNzkgOiB4CglqbXAJM2YKCjk6CS8qIE9LLCB3ZSBoYXZlIGFuIGludGVnZXIgdmFsdWUgZm9yIHkuICBVbmxlc3MgdmVyeSBzbWFsbAoJICAgKHdlIHVzZSA8IDgpLCB1c2UgdGhlIGFsZ29yaXRobSBmb3IgcmVhbCBleHBvbmVudCB0byBhdm9pZAoJICAgYWNjdW11bGF0aW9uIG9mIGVycm9ycy4gICovCglmbGQJJXN0CQkvLyB5IDogeSA6IHgKCWZhYnMJCQkvLyB8eXwgOiB5IDogeAoJZmNvbXBsCU1PKHAzKQkJLy8geSA6IHgKCWZuc3RzdwoJc2FoZgoJam5jCTJmCglwb3BsCSVlYXgKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTQpCglwb3BsCSVlZHgKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTQpCglvcmwJJDAsICVlZHgKCWZzdHAJJXN0KDApCQkvLyB4CglqbnMJNGYJCS8vIHkgPj0gMCwganVtcAoJZmRpdnJsCU1PKG9uZSkJCS8vIDEveAkJKG5vdyByZWZlcnJlZCB0byBhcyB4KQoJbmVnbAklZWF4CglhZGNsCSQwLCAlZWR4CgluZWdsCSVlZHgKNDoJZmxkbAlNTyhvbmUpCQkvLyAxIDogeAoJZnhjaAoKNjoJc2hyZGwJJDEsICVlZHgsICVlYXgKCWpuYwk1ZgoJZnhjaAoJZm11bAklc3QoMSkJCS8vIHggOiBTVCp4CglmeGNoCjU6CWZtdWwJJXN0KDApLCAlc3QJLy8geCp4IDogU1QqeAoJc2hybAkkMSwgJWVkeAoJbW92bAklZWF4LCAlZWN4CglvcmwJJWVkeCwgJWVjeAoJam56CTZiCglmc3RwCSVzdCgwKQkJLy8gU1QqeAoJcmV0CgoJLyogeSBpcyCxTkFOICovCjMwOglmbGR0CTQoJWVzcCkJCS8vIHggOiB5CglmbGRsCU1PKG9uZSkJCS8vIDEuMCA6IHggOiB5CglmdWNvbXAJJXN0KDEpCQkvLyB4IDogeQoJZm5zdHN3CglzYWhmCglqZQkzMWYKCWZ4Y2gJCQkvLyB5IDogeAozMToJZnN0cAklc3QoMSkKCXJldAoKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoOCkKMzI6CWFkZGwJJDgsICVlc3AKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTgpCglmc3RwCSVzdCgxKQoJcmV0CgoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg4KQoJLmFsaWduIEFMSUdOQVJHKDQpCjI6CS8vIHkgaXMgYSBsYXJnZSBpbnRlZ2VyIChhYnNvbHV0ZSB2YWx1ZSBhdCBsZWFzdCA4KSwgYnV0CgkvLyBtYXkgYmUgb2RkIHVubGVzcyBhdCBsZWFzdCAxTDw8NjQuICBTbyBpdCBtYXkgYmUgbmVjZXNzYXJ5CgkvLyB0byBhZGp1c3QgdGhlIHNpZ24gb2YgYSBuZWdhdGl2ZSByZXN1bHQgYWZ0ZXJ3YXJkcy4KCWZ4Y2gJCQkvLyB4IDogeQoJZmFicwkJCS8vIHx4fCA6IHkKCWZ4Y2gJCQkvLyB5IDogfHh8CgkvLyBJZiB5IGhhcyBhYnNvbHV0ZSB2YWx1ZSBhdCBsZWFzdCAxTDw8NzgsIHRoZW4gYW55IGZpbml0ZQoJLy8gbm9uemVybyB4IHdpbGwgcmVzdWx0IGluIDAgKHVuZGVyZmxvdyksIDEgb3IgaW5maW5pdHkgKG92ZXJmbG93KS4KCS8vIFNhdHVyYXRlIHkgdG8gdGhvc2UgYm91bmRzIHRvIGF2b2lkIG92ZXJmbG93IGluIHRoZSBjYWxjdWxhdGlvbgoJLy8gb2YgeSpsb2cyKHgpLgoJZmxkCSVzdAkJLy8geSA6IHkgOiB8eHwKCWZhYnMJCQkvLyB8eXwgOiB5IDogfHh8CglmY29tcGwJTU8ocDc4KQkJLy8geSA6IHx4fAoJZm5zdHN3CglzYWhmCglqYwkzZgoJZnN0cAklc3QoMCkJCS8vIHBvcCB5CglmbGRsCU1PKHA3OCkJCS8vIDFMPDw3OCA6IHx4fAoJdGVzdGIJJDIsICVkbAoJanoJM2YJCS8vIHkgPiAwCglmY2hzCQkJLy8gLSgxTDw8NzgpIDogfHh8CgkuYWxpZ24gQUxJR05BUkcoNCkKMzoJLyogeSBpcyBhIHJlYWwgbnVtYmVyLiAgKi8KCXN1YmwJJDI4LCAlZXNwCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDI4KQoJZnN0cHQJMTIoJWVzcCkJLy8geAoJZnN0cHQJKCVlc3ApCQkvLyA8ZW1wdHk+Cgltb3YJJWVkeCwgMjQoJWVzcCkKCWNhbGwJSElEREVOX0pVTVBUQVJHRVQgKF9fcG93bF9oZWxwZXIpCS8vIDxyZXN1bHQ+Cgltb3YJMjQoJWVzcCksICVlZHgKCWFkZGwJJDI4LCAlZXNwCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC0yOCkKCXRlc3RiCSQyLCAlZGgKCWp6CTI5MmYKCS8vIHggaXMgbmVnYXRpdmUuICBJZiB5IGlzIGFuIG9kZCBpbnRlZ2VyLCBuZWdhdGUgdGhlIHJlc3VsdC4KI2lmZGVmCVBJQwoJTE9BRF9QSUNfUkVHIChjeCkKI2VuZGlmCglmbGR0CTI0KCVlc3ApCS8vIHkgOiBhYnMocmVzdWx0KQoJZmxkCSVzdAkJLy8geSA6IHkgOiBhYnMocmVzdWx0KQoJZmFicwkJCS8vIHx5fCA6IHkgOiBhYnMocmVzdWx0KQoJZmNvbXBsCU1PKHA2NCkJCS8vIHkgOiBhYnMocmVzdWx0KQoJZm5zdHN3CglzYWhmCglqbmMJMjkxZgoJZmxkbAlNTyhwNjMpCQkvLyBwNjMgOiB5IDogYWJzKHJlc3VsdCkKCWZ4Y2gJCQkvLyB5IDogcDYzIDogYWJzKHJlc3VsdCkKCWZwcmVtCQkJLy8geSVwNjMgOiBwNjMgOiBhYnMocmVzdWx0KQoJZnN0cAklc3QoMSkJCS8vIHklcDYzIDogYWJzKHJlc3VsdCkKCgkvLyBXZSBtdXN0IGZpbmQgb3V0IHdoZXRoZXIgeSBpcyBhbiBvZGQgaW50ZWdlci4KCWZsZAklc3QJCS8vIHkgOiB5IDogYWJzKHJlc3VsdCkKCWZpc3RwbGwJKCVlc3ApCQkvLyB5IDogYWJzKHJlc3VsdCkKCWZpbGRsbAkoJWVzcCkJCS8vIGludCh5KSA6IHkgOiBhYnMocmVzdWx0KQoJZnVjb21wcAkJCS8vIGFicyhyZXN1bHQpCglmbnN0c3cKCXNhaGYKCWpuZQkyOTJmCgoJLy8gT0ssIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLCBidXQgaXMgaXQgb2RkPwoJcG9wbAklZWF4CgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoJcG9wbAklZWR4CgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoJYW5kYgkkMSwgJWFsCglqegkyOTBmCQkvLyBqdW1wIGlmIG5vdCBvZGQKCS8vIEl0J3MgYW4gb2RkIGludGVnZXIuCglmY2hzCjI5MDoJcmV0CgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDgpCjI5MToJZnN0cAklc3QoMCkJCS8vIGFicyhyZXN1bHQpCjI5MjoJYWRkbAkkOCwgJWVzcAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtOCkKCXJldAoKCS8vIHBvdyh4LLEwKSA9IDEKCS5hbGlnbiBBTElHTkFSRyg0KQoxMToJZnN0cAklc3QoMCkJCS8vIHBvcCB5CglmbGRsCU1PKG9uZSkKCXJldAoKCS8vIHkgPT0gsWluZgoJLmFsaWduIEFMSUdOQVJHKDQpCjEyOglmc3RwCSVzdCgwKQkJLy8gcG9wIHkKCWZsZGwJTU8ob25lKQkJLy8gMQoJZmxkdAk0KCVlc3ApCQkvLyB4IDogMQoJZmFicwkJCS8vIGFicyh4KSA6IDEKCWZ1Y29tcHAJCQkvLyA8IDEsID09IDEsIG9yID4gMQoJZm5zdHN3CglhbmRiCSQweDQ1LCAlYWgKCWNtcGIJJDB4NDUsICVhaAoJamUJMTNmCQkvLyBqdW1wIGlmIHggaXMgTmFOCgoJY21wYgkkMHg0MCwgJWFoCglqZQkxNGYJCS8vIGp1bXAgaWYgfHh8ID09IDEKCglzaGxiCSQxLCAlYWgKCXhvcmIJJWFoLCAlZGwKCWFuZGwJJDIsICVlZHgKCWZsZGwJTU9YKGluZl96ZXJvLCAlZWR4LCA0KQoJcmV0CgoJLmFsaWduIEFMSUdOQVJHKDQpCjE0OglmbGRsCU1PKG9uZSkKCXJldAoKCS5hbGlnbiBBTElHTkFSRyg0KQoxMzoJZmxkdAk0KCVlc3ApCQkvLyBsb2FkIHggPT0gTmFOCglyZXQKCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDgpCgkuYWxpZ24gQUxJR05BUkcoNCkKCS8vIHggaXMgsWluZgoxNToJZnN0cAklc3QoMCkJCS8vIHkKCXRlc3RiCSQyLCAlZGgKCWp6CTE2ZgkJLy8ganVtcCBpZiB4ID09ICtpbmYKCgkvLyBmaXN0cGxsIHJhaXNlcyBpbnZhbGlkIGV4Y2VwdGlvbiBmb3IgfHl8ID49IDFMPDw2MywgYnV0IHkKCS8vIG1heSBiZSBvZGQgdW5sZXNzIHdlIGtub3cgfHl8ID49IDFMPDw2NC4KCWZsZAklc3QJCS8vIHkgOiB5CglmYWJzCQkJLy8gfHl8IDogeQoJZmNvbXBsCU1PKHA2NCkJCS8vIHkKCWZuc3RzdwoJc2FoZgoJam5jCTE2ZgoJZmxkbAlNTyhwNjMpCQkvLyBwNjMgOiB5CglmeGNoCQkJLy8geSA6IHA2MwoJZnByZW0JCQkvLyB5JXA2MyA6IHA2MwoJZnN0cAklc3QoMSkJCS8vIHklcDYzCgoJLy8gV2UgbXVzdCBmaW5kIG91dCB3aGV0aGVyIHkgaXMgYW4gb2RkIGludGVnZXIuCglmbGQJJXN0CQkvLyB5IDogeQoJZmlzdHBsbAkoJWVzcCkJCS8vIHkKCWZpbGRsbAkoJWVzcCkJCS8vIGludCh5KSA6IHkKCWZ1Y29tcHAJCQkvLyA8ZW1wdHk+CglmbnN0c3cKCXNhaGYKCWpuZQkxN2YKCgkvLyBPSywgdGhlIHZhbHVlIGlzIGFuIGludGVnZXIsIGJ1dCBpcyBpdCBvZGQ/Cglwb3BsCSVlYXgKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTQpCglwb3BsCSVlZHgKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTQpCglhbmRiCSQxLCAlYWwKCWp6CTE4ZgkJLy8ganVtcCBpZiBub3Qgb2RkCgkvLyBJdCdzIGFuIG9kZCBpbnRlZ2VyLgoJc2hybAkkMzEsICVlZHgKCWZsZGwJTU9YKG1pbmZfbXplcm8sICVlZHgsIDgpCglyZXQKCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDgpCgkuYWxpZ24gQUxJR05BUkcoNCkKMTY6CWZjb21wbAlNTyh6ZXJvKQoJYWRkbAkkOCwgJWVzcAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtOCkKCWZuc3RzdwoJc2hybAkkNSwgJWVheAoJYW5kbAkkOCwgJWVheAoJZmxkbAlNT1goaW5mX3plcm8sICVlYXgsIDEpCglyZXQKCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKDgpCgkuYWxpZ24gQUxJR05BUkcoNCkKMTc6CXNobGwJJDMwLCAlZWR4CS8vIHNpZ24gYml0IGZvciB5IGluIHJpZ2h0IHBvc2l0aW9uCglhZGRsCSQ4LCAlZXNwCgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC04KQoxODoJc2hybAkkMzEsICVlZHgKCWZsZGwJTU9YKGluZl96ZXJvLCAlZWR4LCA4KQoJcmV0CgoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg4KQoJLmFsaWduIEFMSUdOQVJHKDQpCgkvLyB4IGlzILEwCjIwOglmc3RwCSVzdCgwKQkJLy8geQoJdGVzdGIJJDIsICVkbAoJanoJMjFmCQkvLyB5ID4gMAoKCS8vIHggaXMgsTAgYW5kIHkgaXMgPCAwLiAgV2UgbXVzdCBmaW5kIG91dCB3aGV0aGVyIHkgaXMgYW4gb2RkIGludGVnZXIuCgl0ZXN0YgkkMiwgJWRoCglqegkyNWYKCgkvLyBmaXN0cGxsIHJhaXNlcyBpbnZhbGlkIGV4Y2VwdGlvbiBmb3IgfHl8ID49IDFMPDw2MywgYnV0IHkKCS8vIG1heSBiZSBvZGQgdW5sZXNzIHdlIGtub3cgfHl8ID49IDFMPDw2NC4KCWZsZAklc3QJCS8vIHkgOiB5CglmYWJzCQkJLy8gfHl8IDogeQoJZmNvbXBsCU1PKHA2NCkJCS8vIHkKCWZuc3RzdwoJc2FoZgoJam5jCTI1ZgoJZmxkbAlNTyhwNjMpCQkvLyBwNjMgOiB5CglmeGNoCQkJLy8geSA6IHA2MwoJZnByZW0JCQkvLyB5JXA2MyA6IHA2MwoJZnN0cAklc3QoMSkJCS8vIHklcDYzCgoJZmxkCSVzdAkJLy8geSA6IHkKCWZpc3RwbGwJKCVlc3ApCQkvLyB5CglmaWxkbGwJKCVlc3ApCQkvLyBpbnQoeSkgOiB5CglmdWNvbXBwCQkJLy8gPGVtcHR5PgoJZm5zdHN3CglzYWhmCglqbmUJMjZmCgoJLy8gT0ssIHRoZSB2YWx1ZSBpcyBhbiBpbnRlZ2VyLCBidXQgaXMgaXQgb2RkPwoJcG9wbAklZWF4CgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoJcG9wbAklZWR4CgljZmlfYWRqdXN0X2NmYV9vZmZzZXQgKC00KQoJYW5kYgkkMSwgJWFsCglqegkyN2YJCS8vIGp1bXAgaWYgbm90IG9kZAoJLy8gSXQncyBhbiBvZGQgaW50ZWdlci4KCS8vIFJhaXNlIGRpdmlkZS1ieS16ZXJvIGV4Y2VwdGlvbiBhbmQgZ2V0IG1pbnVzIGluZmluaXR5IHZhbHVlLgoJZmxkbAlNTyhvbmUpCglmZGl2bAlNTyh6ZXJvKQoJZmNocwoJcmV0CgoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg4KQoyNToJZnN0cAklc3QoMCkKMjY6CWFkZGwJJDgsICVlc3AKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTgpCjI3OgkvLyBSYWlzZSBkaXZpZGUtYnktemVybyBleGNlcHRpb24gYW5kIGdldCBpbmZpbml0eSB2YWx1ZS4KCWZsZGwJTU8ob25lKQoJZmRpdmwJTU8oemVybykKCXJldAoKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoOCkKCS5hbGlnbiBBTElHTkFSRyg0KQoJLy8geCBpcyCxMCBhbmQgeSBpcyA+IDAuICBXZSBtdXN0IGZpbmQgb3V0IHdoZXRoZXIgeSBpcyBhbiBvZGQgaW50ZWdlci4KMjE6CXRlc3RiCSQyLCAlZGgKCWp6CTIyZgoKCS8vIGZpc3RwbGwgcmFpc2VzIGludmFsaWQgZXhjZXB0aW9uIGZvciB8eXwgPj0gMUw8PDYzLCBidXQgeQoJLy8gbWF5IGJlIG9kZCB1bmxlc3Mgd2Uga25vdyB8eXwgPj0gMUw8PDY0LgoJZmxkCSVzdAkJLy8geSA6IHkKCWZjb21wbAlNTyhwNjQpCQkvLyB5CglmbnN0c3cKCXNhaGYKCWpuYwkyMmYKCWZsZGwJTU8ocDYzKQkJLy8gcDYzIDogeQoJZnhjaAkJCS8vIHkgOiBwNjMKCWZwcmVtCQkJLy8geSVwNjMgOiBwNjMKCWZzdHAJJXN0KDEpCQkvLyB5JXA2MwoKCWZsZAklc3QJCS8vIHkgOiB5CglmaXN0cGxsCSglZXNwKQkJLy8geQoJZmlsZGxsCSglZXNwKQkJLy8gaW50KHkpIDogeQoJZnVjb21wcAkJCS8vIDxlbXB0eT4KCWZuc3RzdwoJc2FoZgoJam5lCTIzZgoKCS8vIE9LLCB0aGUgdmFsdWUgaXMgYW4gaW50ZWdlciwgYnV0IGlzIGl0IG9kZD8KCXBvcGwJJWVheAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtNCkKCXBvcGwJJWVkeAoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICgtNCkKCWFuZGIJJDEsICVhbAoJanoJMjRmCQkvLyBqdW1wIGlmIG5vdCBvZGQKCS8vIEl0J3MgYW4gb2RkIGludGVnZXIuCglmbGRsCU1PKG16ZXJvKQoJcmV0CgoJY2ZpX2FkanVzdF9jZmFfb2Zmc2V0ICg4KQoyMjoJZnN0cAklc3QoMCkKMjM6CWFkZGwJJDgsICVlc3AJLy8gRG9uJ3QgdXNlIDIgeCBwb3AKCWNmaV9hZGp1c3RfY2ZhX29mZnNldCAoLTgpCjI0OglmbGRsCU1PKHplcm8pCglyZXQKCkVORChfX2llZWU3NTRfcG93bCkKc3Ryb25nX2FsaWFzIChfX2llZWU3NTRfcG93bCwgX19wb3dsX2Zpbml0ZSkK