IyEvdXNyL2Jpbi9wZXJsIC13Cgp1c2Ugc3RyaWN0OwoKIwojIEV2ZW4gd2l0aCBnaXQsIHdlIGRvbid0IGFsd2F5cyBoYXZlIG5hbWUgdHJhbnNsYXRpb25zLgojIFNvIGhhdmUgYW4gZW1haWwtPnJlYWwgbmFtZSB0YWJsZSB0byB0cmFuc2xhdGUgdGhlCiMgKGhvcGVmdWxseSBmZXcpIG1pc3NpbmcgbmFtZXMKIwpteSAlbWFpbG1hcCA9ICgKCSdSLk1hcmVrQHNoLmN2dXQuY3onID0+ICdSdWRvbGYgTWFyZWsnLAoJJ1JhbGYuV2lsZGVuaHVlc0BnbXguZGUnID0+ICdSYWxmIFdpbGRlbmh1ZXMnLAoJJ2FoZXJybWFuQGRlLmlibS5jb20nID0+ICdBbmRyZWFzIEhlcnJtYW5uJywKCSdha3BtQG9zZGwub3JnJyA9PiAnQW5kcmV3IE1vcnRvbicsCgknYW5kcmV3LnZhc3F1ZXpAcWxvZ2ljLmNvbScgPT4gJ0FuZHJldyBWYXNxdWV6JywKCSdhcXV5bmhAZ21haWwuY29tJyA9PiAnTmd1eWVuIEFuaCBRdXluaCcsCgknYXhib2VAc3VzZS5kZScgPT4gJ0plbnMgQXhib2UnLAoJJ2JsYWlzb3JibGFkZUB5YWhvby5pdCcgPT4gJ1Bhb2xvIFwnQmxhaXNvcmJsYWRlXCcgR2lhcnJ1c3NvJywKCSdidW5rQHN0dXN0YS5kZScgPT4gJ0FkcmlhbiBCdW5rJywKCSdkb21lbkBjb2Rlcm9jay5vcmcnID0+ICdEb21lbiBQdW5jZXInLAoJJ2RvdWdnQHRvcnF1ZS5uZXQnID0+ICdEb3VnbGFzIEdpbGJlcnQnLAoJJ2R3bXcyQHNoaW55Ym9vay5pbmZyYWRlYWQub3JnJyA9PiAnRGF2aWQgV29vZGhvdXNlJywKCSdlY2FzaGluQGNvcmFpZC5jb20nID0+ICdFZCBMIENhc2hpbicsCgknZmVsaXhAZGVya2xlY2tzLmRlJyA9PiAnRmVsaXggTW9lbGxlcicsCgknZnphZ29Ac3lzdGVtZmFicmljd29ya3MuY29tJyA9PiAnRnJhbmsgWmFnbycsCgknZ3JlZ2toQHN1c2UuZGUnID0+ICdHcmVnIEtyb2FoLUhhcnRtYW4nLAoJJ2hjaEBsc3QuZGUnID0+ICdDaHJpc3RvcGggSGVsbHdpZycsCgknaHRlanVuQGdtYWlsLmNvbScgPT4gJ1RlanVuIEhlbycsCgknamVqYkBtdWxncmF2ZS4obm9uZSknID0+ICdKYW1lcyBCb3R0b21sZXknLAoJJ2plamJAdGl0YW5pYy5pbC5zdGVlbGV5ZS5jb20nID0+ICdKYW1lcyBCb3R0b21sZXknLAoJJ2pnYXJ6aWtAcHJldHplbC55eXoudXMnID0+ICdKZWZmIEdhcnppaycsCgknam9obnBvbEAya2EubWlwdC5ydScgPT4gJ0V2Z2VuaXkgUG9seWFrb3YnLAoJJ2theS5zaWV2ZXJzQHZyZnkub3JnJyA9PiAnS2F5IFNpZXZlcnMnLAoJJ21pbnlhcmRAYWNtLm9yZycgPT4gJ0NvcmV5IE1pbnlhcmQnLAoJJ21zaGFoQHRlamEuY29tJyA9PiAnTWl0ZXNoIHNoYWgnLAoJJ3BqQGx1ZGQubHR1LnNlJyA9PiAnUGV0ZXIgQSBKb25zc29uJywKCSdybXBzQGpvZWwuaXN0LnV0bC5wdCcgPT4gJ1J1aSBTYXJhaXZhJywKCSdzYW50dHUuaHlya2tvQGdtYWlsLmNvbScgPT4gJ1NhbnR0dSBIeXJra/YnLAoJJ3NpbW9uQHRoZWtlbGxleXMub3JnLnVrJyA9PiAnU2ltb24gS2VsbGV5JywKCSdzc2FudEBpbi5pYm0uY29tJyA9PiAnU2FjaGluIFAgU2FudCcsCgkndGVycmFAZ25vbWUub3JnJyA9PiAnTW9ydGVuIFdlbGluZGVyJywKCSd0b255Lmx1Y2tAaW50ZWwuY29tJyA9PiAnVG9ueSBMdWNrJywKCSd3ZWxpbmRlckBhbmVtb25lLnJlbnRlYy5jb20nID0+ICdNb3J0ZW4gV2VsaW5kZXInLAoJJ3dlbGluZGVyQGRhcnRlci5yZW50ZWMuY29tJyA9PiAnTW9ydGVuIFdlbGluZGVyJywKCSd3ZWxpbmRlckB0cm9sbC5jb20nID0+ICdNb3J0ZW4gV2VsaW5kZXInLAopOwoKbXkgKCVtYXApOwpteSAkcHN0YXRlID0gMTsKbXkgJG5fcmVjb3JkcyA9IDA7Cm15ICRuX291dHB1dCA9IDA7CgoKc3ViIHNob3J0bG9nX2VudHJ5KCQkKSB7CglteSAoJG5hbWUsICRkZXNjKSA9IEBfOwoJbXkgJGtleSA9ICRuYW1lOwoKCSRkZXNjID1+IHMjL3B1Yi9zY20vbGludXgva2VybmVsL2dpdC8jLy4uLi8jZzsKCSRkZXNjID1+IHMjXFtQQVRDSFxdICMjZzsKCgkjIHN0b3JlIGRlc2NyaXB0aW9uIGluIGFycmF5LCBpbiBlbWFpbC0+e2Rlc2MgbGlzdH0gbWFwCglpZiAoZXhpc3RzICRtYXB7JGtleX0pIHsKCQkjIGdyYWIgcmVmCgkJbXkgJG9iaiA9ICRtYXB7JGtleX07CgoJCSMgYWRkIGRlc2MgdG8gYXJyYXkKCQlwdXNoKEAkb2JqLCAkZGVzYyk7Cgl9IGVsc2UgewoJCSMgY3JlYXRlIG5ldyBhcnJheSwgY29udGFpbmluZyAxIGl0ZW0KCQlteSBAYXJyID0gKCRkZXNjKTsKCgkJIyBzdG9yZSByZWYgdG8gYXJyYXkKCQkkbWFweyRrZXl9ID0gXEBhcnI7Cgl9Cn0KCiMgc29ydCBjb21wYXJpc29uIGZ1bmN0aW9uCnN1YiBieV9uYW1lKCQkKSB7CglteSAoJGEsICRiKSA9IEBfOwoKCXVjKCRhKSBjbXAgdWMoJGIpOwp9CgpzdWIgc2hvcnRsb2dfb3V0cHV0IHsKCW15ICgkb2JqLCAka2V5LCAkZGVzYyk7CgoJZm9yZWFjaCAka2V5IChzb3J0IGJ5X25hbWUga2V5cyAlbWFwKSB7CgkJIyBvdXRwdXQgYXV0aG9yCgkJcHJpbnRmICIlczpcbiIsICRrZXk7CgoJCSMgb3V0cHV0IGF1dGhvcidzIDEtbGluZSBzdW1tYXJpZXMKCQkkb2JqID0gJG1hcHska2V5fTsKCQlmb3JlYWNoICRkZXNjIChyZXZlcnNlIEAkb2JqKSB7CgkJCXByaW50ICIgICRkZXNjXG4iOwoJCQkkbl9vdXRwdXQrKzsKCQl9CgoJCSMgYmxhbmsgbGluZSBzZXBhcmF0aW5nIGF1dGhvciBmcm9tIG5leHQgYXV0aG9yCgkJcHJpbnQgIlxuIjsKCX0KfQoKc3ViIGNoYW5nZWxvZ19pbnB1dCB7CglteSAoJGF1dGhvciwgJGRlc2MpOwoKCXdoaWxlICg8PikgewoJCSMgZ2V0IGF1dGhvciBhbmQgZW1haWwKCQlpZiAoJHBzdGF0ZSA9PSAxKSB7CgkJCW15ICgkZW1haWwpOwoKCQkJbmV4dCB1bmxlc3MgL15bQWFddXRob3I6PyAoLiopPCguKik+LiokLzsKCQoJCQkkbl9yZWNvcmRzKys7CgkKCQkJJGF1dGhvciA9ICQxOwoJCQkkZW1haWwgPSAkMjsKCQkJJGRlc2MgPSB1bmRlZjsKCgkJCSMgdHJpbSB0cmFpbGluZyB3aGl0ZXNwYWNlLgoJCQkjIHdoeSBkb2Vzbid0IGNob21wIHdvcms/CgkJCXdoaWxlICgkYXV0aG9yICYmICgkYXV0aG9yID1+IC9ccyQvKSkgewoJCQkJY2hvcCAkYXV0aG9yOwoJCQl9CgkKCQkJIyBjc2V0IGF1dGhvciBmaXh1cHMKCQkJaWYgKGV4aXN0cyAkbWFpbG1hcHskZW1haWx9KSB7CgkJCQkkYXV0aG9yID0gJG1haWxtYXB7JGVtYWlsfTsKCQkJfSBlbHNpZiAoZXhpc3RzICRtYWlsbWFweyRhdXRob3J9KSB7CgkJCQkkYXV0aG9yID0gJG1haWxtYXB7JGF1dGhvcn07CgkJCX0gZWxzaWYgKCghJGF1dGhvcikgfHwgKCRhdXRob3IgZXEgIiIpKSB7CgkJCQkkYXV0aG9yID0gJGVtYWlsOwoJCQl9CgkKCQkJJHBzdGF0ZSsrOwoJCX0KCQoJCSMgc2tpcCB0byBibGFuayBsaW5lCgkJZWxzaWYgKCRwc3RhdGUgPT0gMikgewoJCQluZXh0IHVubGVzcyAvXlxzKiQvOwoJCQkkcHN0YXRlKys7CgkJfQoJCgkJIyBza2lwIHRvIG5vbi1ibGFuayBsaW5lCgkJZWxzaWYgKCRwc3RhdGUgPT0gMykgewoJCQluZXh0IHVubGVzcyAvXlxzKihcUy4qKSQvOwoKCQkJIyBza2lwIGxpbmVzIHRoYXQgYXJlIG9idmlvdXNseSBub3QKCQkJIyBhIDEtbGluZSBjc2V0IGRlc2NyaXB0aW9uCgkJCW5leHQgaWYgL15ccypGcm9tOiAvOwoKCQkJY2hvbXA7CgkJCSRkZXNjID0gJDE7CgkKCQkJJnNob3J0bG9nX2VudHJ5KCRhdXRob3IsICRkZXNjKTsKCQoJCQkkcHN0YXRlID0gMTsKCQl9CgkKCQllbHNlIHsKCQkJZGllICJpbnZhbGlkIHBhcnNlIHN0YXRlICRwc3RhdGUiOwoJCX0KCX0KfQoKc3ViIGZpbmFsaXplIHsKCSNwcmludCAiXG4kbl9yZWNvcmRzIHJlY29yZHMgcGFyc2VkLlxuIjsKCglpZiAoJG5fcmVjb3JkcyAhPSAkbl9vdXRwdXQpIHsKCQlkaWUgInBhcnNlIGVycm9yOiBpbnB1dCByZWNvcmRzICE9IG91dHB1dCByZWNvcmRzXG4iOwoJfQp9CgomY2hhbmdlbG9nX2lucHV0Owomc2hvcnRsb2dfb3V0cHV0OwomZmluYWxpemU7CmV4aXQoMCk7Cgo=