LyogR2lsZGVub2JqZWt0IGZ1ZXIgQWJlbnRldXJlciAtIE1vcmdlbkdyYXVlbiAqLwovKiBCb2luZywgMTk5My0xOTk4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLwovKiBTcHJ1ZWNoZToKICAgICBMaWNodGt1Z2VsIGhlcmJlaXphdWJlcm46IGxpY2h0CiAgICAgICBNYWdpZXB1bmt0ZSA1LCBTdHVmZSA0CiAgICAgICBEYXVlcjogTGV2ZWwgKiAyMCBTZWt1bmRlbgogICAgIElkZW50aWZpemllcmVuOiBpZGVudGlmaXppZXJlCiAgICAgICBNYWdpZXB1bmt0ZSAxMCwgU3R1ZmUgMwogICAgIE1vbnN0ZXIgZWluc2NoYWV0emVuOiBzY2hhZXR6IDxuYW1lPgogICAgICAgTWFnaWVwdW5rdGUgMywgU3R1ZmUgMTAKICAgICBQZmVpbGFuZ3JpZmY6IHBmZWlsIDxuYW1lPgogICAgICAgU2NoYWRlbiBtYXhpbWFsIDIwLCBNYWdpZXB1bmt0ZSAxMCwgU3R1ZmUgMTEKICAgICBHZWdlbnN0YWVuZGUgdW50ZXJzdWNoZW46IGlkZW50aWZpemllcmUgPG9iamVrdD4KICAgICAgIFdlbm4gUF9JTkZPIGV4aXNpdGllcnQsIHdpcmQgZGllcyBhdXNnZWdlYmVuCiAgICAgICBNYWdpZXB1bmt0ZSAxMCwgc3R1ZmUgOAogICAgIEF1c3dlaWNoZW46IGF1c3dlaWNoZW4KICAgICAgIEdlaHQgbnVyIGltIEthbXBmLCBnZW5hdSBlaW5lciBBdHRhY2tlIHdpcmQgYXVzZ2V3aWNoZW4uCiAgICAgICBNYWdpZXB1bmt0ZSAxMCwgU3R1ZmUgMTIKICAgICBLYW1wZnNjaHJlaToga2FtcGZzY2hyZWkgPG9wZmVyPiBiencuIGthbXBmc2NocmVpIG1lbGR1bmcgPG1lbGR1bmc+CiAgICAgICBEZXIgS2FtcGZzY2hyZWkgd2lyZCBhdXNnZXN0b3NzZW4gdW5kIHZlcmxhbmdzYW10IGRlbiBHZWduZXIuCiAgICAgICBNYWdpZXB1bmt0ZSAzMCwgc3R1ZmUgMTMKICAgICBGZXVlcmJhbGw6IGZldWVyYmFsbCA8bmFtZT4KICAgICAgIFNjaGFkZW4gbWF4aW1hbCA0MCwgTWFnaWVwdW5rdGUgMjAsIFN0dWZlIDE1CiAgICAgU2NobmVsbGlna2VpdDogc2NobmVsbAogICAgICAgR2lidCBmdWVyIGVpbmUgYmVzdGltbXRlIFplaXQgenVzYWV0emxpY2hlIEFuZ3JpZmZlCiAgICAgICBNYWdpZXB1bmt0ZSAxMDAsIFN0dWZlIDE3CiAgICAgU2FldXJlc3RyYWhsOiBzYWV1cmVzdHJhaGwgPG5hbWU+CiAgICAgICBTY2hhZGVuIG1heGltYWwgNjAsIE1hZ2llcHVua3RlIDI1LCBTdHVmZSAzMAoqLwoKI2luY2x1ZGUgPHByb3BlcnRpZXMuaD4KI2luY2x1ZGUgPGxhbmd1YWdlLmg+CiNpbmNsdWRlIDxhdHRyaWJ1dGVzLmg+CiNpbmNsdWRlIDxjb21iYXQuaD4KI2luY2x1ZGUgPHdpemxldmVscy5oPgojaW5jbHVkZSA8bmV3X3NraWxscy5oPgoKI2RlZmluZSBMSUNIVEtVR0VMICIvZ2lsZGVuL2ZpbGVzLmFiZW50ZXVyZXIvbGljaHRrdWdlbCIKCmluaGVyaXQgIi9zdGQvc3BlbGxib29rIjsKCnZvaWQgY3JlYXRlKCkgewogIDo6Y3JlYXRlKCk7CiAgU2V0UHJvcChQX0dMT0JBTF9TS0lMTFBST1BTLAogICAgICAgICAgKFtTSV9TUEVMTEZBVElHVUU6MiwgICAgICAgLy8gMiBTZWt1bmRlbiBrZWluIG5ldWVyIFNwZWxsCiAgICAgICAgICAgIFNJX1NLSUxMTEVBUk46NSwgICAgICAgICAvLyAwLjA1JSBwcm8gMiBBX0lOVAogICAgICAgICAgICBPRkZTRVQoU0lfU0tJTExMRUFSTik6MTAgLy8gcGx1cyAwLjElIGluIGplZGVtIEZhbGwKICAgICAgICAgICAgXSkpOwoKICAgIEFkZFNwZWxsKCJzdGVpbnNjaGxhZyIsNSwKICAgICAgICAoW1NJX1NLSUxMUkVTVFJfTEVBUk46KFtQX0xFVkVMOjFdKSwKICAgICAgICAgU0lfU0tJTExEQU1BR0U6NDAsCiAgICAgICAgIE9GRlNFVChTSV9TS0lMTERBTUFHRSk6NDAsCiAgICAgICAgIFNJX1NLSUxMREFNQUdFX1RZUEU6ICh7RFRfQkxVREdFT059KSwKICAgICAgICAgU0lfTUFHSUNfVFlQRTooe01UX0FOR1JJRkZ9KSwKICAgICAgICAgU0lfU1BFTEw6KFtTUF9OQU1FOiJzdGVpbnNjaGxhZyJdKV0pKTsKCiAgQWRkU3BlbGwoImlkZW50aWZpemllcmUiLDEwLAogICAgICAgKFtTSV9TS0lMTFJFU1RSX0xFQVJOOihbUF9MRVZFTDozXSksCiAgICAgICAgIFNJX01BR0lDX1RZUEU6ICh7IE1UX0hFTExTSUNIVCB9KSwKICAgICAgICAgU0lfU1BFTEw6IChbUF9OQU1FOiAiaWRlbnRpZml6aWVyZSJdKSwKICAgICAgICAgXSkgKTsKICBBZGRTcGVsbCgibGljaHQiLDUsCiAgICAgIChbU0lfU0tJTExSRVNUUl9MRUFSTjooW1BfTEVWRUw6Nl0pLAogICAgICAgIFNJX1NQRUxMOiAoW1BfTkFNRTogImxpY2h0Il0pIAogICAgICAgXSkgKTsKICBBZGRTcGVsbCgic2NoYWV0eiIsMywKICAgICAgIChbU0lfU0tJTExSRVNUUl9MRUFSTjooW1BfTEVWRUw6OF0pLAogICAgICAgICBTSV9NQUdJQ19UWVBFOiAoeyBNVF9IRUxMU0lDSFQgfSksCiAgICAgICAgIFNJX1NQRUxMOiAoW1NQX05BTUU6ICJzY2hhZXR6Il0pLAogICAgICAgICBdKSk7CiAgQWRkU3BlbGwoInBmZWlsIiwxMCwKICAgICAgICAgICAoW1NJX1NLSUxMUkVTVFJfTEVBUk46KFtQX0xFVkVMOjEwXSksCiAgICAgICAgICAgICAvLyBVbSBkaWVzZW4gU3BydWNoIGxlcm5lbiB6dSBrb2VubmVuIG11c3MKICAgICAgICAgICAgIC8vIGRlciBMZXZlbCBtaW5kZXN0ZW5zIDExIHNlaW4KICAgICAgICAgICAgIFNJX1NLSUxMREFNQUdFOjIwMCwKICAgICAgICAgICAgIC8vIFNjaGFkZW46IFJhbmRvbSgyMDApIC4uLgogICAgICAgICAgICAgU0lfU0tJTExEQU1BR0VfVFlQRTooe0RUX01BR0lDfSksCiAgICAgICAgICAgICAvLyBEYW1hZ2UgVHlwZTogTWFnaWMKICAgICAgICAgICAgIFNJX01BR0lDX1RZUEU6ICh7IE1UX0FOR1JJRkYgfSksCiAgICAgICAgICAgICBTSV9TUEVMTDogKFsgU1BfTkFNRTogInBmZWlsIiBdKSwKICAgICAgICAgICAgIC8vIEJvbmkgZvxyIGhpbnRlcmUgS2FtcGZyZWloZW4KICAgICAgICAgICAgIFNJX1NLSUxMREFNQUdFX0JZX1JPVzogKFsyOjExMCwzOjUwLDQ6MTBdKSwKICAgICAgICAgICAgIE9GRlNFVChTSV9TS0lMTERBTUFHRV9CWV9ST1cpOiAoWzI6NTAsMzoyMCw0OjVdKQogICAgICAgICAgICAgXSkpOwogIEFkZFNwZWxsKCJhdXN3ZWljaGVuIiwgMTAsCiAgICAgIChbU0lfU0tJTExSRVNUUl9MRUFSTjooW1BfTEVWRUw6MTNdKSwKICAgICAgICBTSV9TUEVMTDogKFtQX05BTUU6ICJhdXN3ZWljaGVuIl0pLAogICAgICAgIF0pKTsKICBBZGRTcGVsbCgia2FtcGZzY2hyZWkiLCAzMCwKICAgICAgIChbU0lfU0tJTExSRVNUUl9MRUFSTjooW1BfTEVWRUw6MTZdKSwKICAgICAgICAgU0lfTUFHSUNfVFlQRTogKHsgTVRfUFNZQ0hPIH0pLAogICAgICAgICBTSV9TUEVMTDogKFtTUF9OQU1FOiAia2FtcGZzY2hyZWkiXSksCiAgICAgICAgIF0pKTsKICBBZGRTcGVsbCgiZmV1ZXJiYWxsIiwyMCwKICAgICAgICAgICAoW1NJX1NLSUxMUkVTVFJfTEVBUk46KFtQX0xFVkVMOjE4XSksCiAgICAgICAgICAgICBTSV9TS0lMTERBTUFHRTozMDAsCiAgICAgICAgICAgICAvLyBTY2hhZGVuOiBSYW5kb20oMzAwKSAuLi4KICAgICAgICAgICAgIE9GRlNFVChTSV9TS0lMTERBTUFHRSk6MTAwLAogICAgICAgICAgICAgLy8gLi4uIHBsdXMgMTAwCiAgICAgICAgICAgICBTSV9TS0lMTERBTUFHRV9UWVBFOih7RFRfRklSRX0pLAogICAgICAgICAgICAgLy8gRGFtYWdlIFR5cGU6IEZpcmUKICAgICAgICAgICAgU0lfTUFHSUNfVFlQRTogKHsgTVRfQU5HUklGRiB9KSwKICAgICAgICAgICAgU0lfU1BFTEw6IChbU1BfTkFNRTogImZldWVyYmFsbCJdKSwKICAgICAgICAgICAgU0lfU0tJTExEQU1BR0VfQllfUk9XOiAoWzI6ODAsMzoxNTAsNDo4MCw1OjIwXSksCiAgICAgICAgICAgIE9GRlNFVChTSV9TS0lMTERBTUFHRV9CWV9ST1cpOiAoWzI6MzAsMzo4MCw0OjMwLDU6MTBdKQogICAgICAgICAgICAgXSkpOwogIEFkZFNwZWxsKCJzY2huZWxsIiwxMDAsCiAgICAgIChbU0lfU0tJTExSRVNUUl9MRUFSTjooW1BfTEVWRUw6MjFdKSwKICAgICAgICBTSV9TUEVMTDogKFtQX05BTUU6ICJzY2huZWxsIl0pIF0pKTsKICBBZGRTcGVsbCgic2FldXJlc3RyYWhsIiwyNSwKICAgICAgIChbU0lfU0tJTExSRVNUUl9MRUFSTjooW1BfTEVWRUw6MjhdKSwKICAgICAgICAgICAgIE9GRlNFVChTSV9TS0lMTExFQVJOKToxLAogICAgICAgICAgICAgRkFDVE9SKFNJX1NLSUxMTEVBUk4pOjIwLAogICAgICAgICAgICAgU0lfU0tJTExEQU1BR0U6NDAwLAogICAgICAgICAgICAgLy8gU2NoYWRlbjogUmFuZG9tKDQwMCkgLi4uCiAgICAgICAgICAgICBPRkZTRVQoU0lfU0tJTExEQU1BR0UpOjIwMCwKICAgICAgICAgICAgIC8vIC4uLiBwbHVzIDIwMAogICAgICAgICAgICAgU0lfU0tJTExEQU1BR0VfVFlQRTooe0RUX0FDSUR9KSwKICAgICAgICAgICAgIC8vIERhbWFnZSBUeXBlOiBTYWV1cmUKICAgICAgICAgICAgIFNJX01BR0lDX1RZUEU6ICh7IE1UX0FOR1JJRkYgfSksCiAgICAgICAgICAgICBTSV9TUEVMTDogKFtTUF9OQU1FOiAic2FldXJlc3RyYWhsIl0pLAogICAgICAgICAgICAgU0lfU0tJTExEQU1BR0VfQllfUk9XOihbMjo2MCwzOjE1MCw0OjIxMCw1OjE1MCw2OjYwXSksCiAgICAgICAgICAgICBPRkZTRVQoU0lfU0tJTExEQU1BR0VfQllfUk9XKTooWzI6MzAsMzo4MCw0OjEyMCw1OjgwLDY6MzBdKQogICAgICAgICAgICAgXSkpOwoKfQoKaW50CnN0ZWluc2NobGFnKG9iamVjdCBjYXN0ZXIsIG1hcHBpbmcgc2luZm8pIHsKICBvYmplY3QgdmljdGltOwogIGludCBoYW5kczsKICBzdHJpbmcgdm4sIHZudywgY247CiAgaW50IHN1YzsKCiAgdmljdGltPUZpbmRFbmVteVZpY3RpbShzaW5mb1tTSV9TS0lMTEFSR10sY2FzdGVyLAogICAgICAgICAiVWViZXIgd2VtIHdpbGxzdCBEdSBlaW5lbiBTdGVpbnNjaGxhZyBuaWVkZXJnZWhlbiBsYXNzZW4/XG4iKTsKICBpZiAoIXZpY3RpbSkKICAgIHJldHVybiAwOwogIGlmICgoc3VjPVNwZWxsU3VjY2VzcyhjYXN0ZXIsc2luZm8pKTw9MCkKICAgIHJldHVybiBNSVNTRVJGT0xHOwogIGlmIChzdWMgPCB2aWN0aW0tPlNwZWxsRGVmZW5kKGNhc3Rlciwgc2luZm8pKQogIHsKICAgIHRlbGxfb2JqZWN0KGNhc3RlciwgdmljdGltLT5OYW1lKCkgKyAiIHdlaHJ0IERlaW5lbiBTcHJ1Y2ggYWIuXG4iKTsKICAgIHJldHVybiBFUkZPTEc7CiAgfQoKICBjbiA9IGNhc3Rlci0+TmFtZSgpOwogIHZudyA9IHZpY3RpbS0+bmFtZShXRU4sIDIpOwogIHNheShzcHJpbnRmKCIlcyBsYWVzc3Qga2xlaW5lIEtpZXNlbCBhdWYgJXMgZmFsbGVuLlxuIixjbiwgdm53KSwKICAgICAgdmljdGltKTsKICBwcmludGYoIkR1IGtvbnplbnRyaWVyc3QgRGljaCBkYXJhdWYsIGtsZWluZSBLaWVzZWwgYXVmICVzIGZhbGxlbiB6dSBsYXNzZW4uXG4iLCB2bncpOwogIHRlbGxfb2JqZWN0KHZpY3RpbSxzcHJpbnRmKCIlcyBsYWVzc3Qga2xlaW5lIEtpZXNlbCBhdWYgRGljaCBmYWxsZW4uXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuKSk7CiAgVHJ5RGVmYXVsdEF0dGFja1NwZWxsKHZpY3RpbSxjYXN0ZXIsc2luZm8sCiAgICAgICAgICAgIChbU1BfTkFNRToic3RlaW5zY2hsYWciLCBTUF9QSFlTSUNBTF9BVFRBQ0s6MSxTUF9TSE9XX0RBTUFHRToxXSkpOwogIHJldHVybiBFUkZPTEc7Cn0KCmludApzY2hhZXR6KG9iamVjdCBjYXN0ZXIsIG1hcHBpbmcgc2luZm8pIHsKICAgb2JqZWN0IHZpY3RpbTsKICAgaW50IGhwZGlmZiwgd2NkaWZmLCBhY2RpZmY7CiAgIGludCBocCwgdmhwLCB3YywgdndjLCBhYywgdmFjOwogICBzdHJpbmcgcmVzdWx0OwogICBzdHJpbmcgdm5hbWUsIHZuYW1lZ2VuOwogICBpbnQgc3VjOwoKICAgdmljdGltPUZpbmRMaXZpbmdWaWN0aW0oc2luZm9bU0lfU0tJTExBUkddLGNhc3RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIldlbiBtb2VjaHRlc3QgRHUgZWluc2NoYWV0emVuP1xuIik7CiAgIGlmICghdmljdGltKQogICAgIHJldHVybiAwOwogICBpZiAoKHN1Yz1TcGVsbFN1Y2Nlc3MoY2FzdGVyLHNpbmZvKSk8PTApCiAgICAgIHJldHVybiBNSVNTRVJGT0xHOwogICBpZiAoc3VjIDwgdmljdGltLT5TcGVsbERlZmVuZChjYXN0ZXIsIHNpbmZvKSkKICAgewogICAgIHRlbGxfb2JqZWN0KGNhc3RlciwgdmljdGltLT5OYW1lKCkgKyAiIHdlaHJ0IERlaW5lbiBTcHJ1Y2ggYWIuXG4iKTsKICAgICByZXR1cm4gRVJGT0xHOwogICB9CgogICBocCA9IGNhc3Rlci0+UXVlcnlQcm9wKFBfSFApOyAgICB2aHAgPSB2aWN0aW0tPlF1ZXJ5UHJvcChQX0hQKTsKICAgd2MgPSBjYXN0ZXItPlF1ZXJ5UHJvcChQX1RPVEFMX1dDKTsgIHZ3YyA9IHZpY3RpbS0+UXVlcnlQcm9wKFBfVE9UQUxfV0MpOwogICBhYyA9IGNhc3Rlci0+UXVlcnlQcm9wKFBfVE9UQUxfQUMpOyAgdmFjID0gdmljdGltLT5RdWVyeVByb3AoUF9UT1RBTF9BQyk7CiAgIGhwZGlmZiA9IGhwIC0gdmhwOwogICB3Y2RpZmYgPSB3YyAtIHZ3YzsKICAgYWNkaWZmID0gYWMgLSB2YWM7CiAgIHZuYW1lID0gdmljdGltLT5uYW1lKFdFUiwgMSk7CiAgIHZuYW1lZ2VuID0gdmljdGltLT5uYW1lKFdFU1NFTiwgMSk7CgogICBpZiAoaHBkaWZmID4gMTAqdmhwKQogICAgICByZXN1bHQgPSBjYXBpdGFsaXplKHZpY3RpbS0+bmFtZShXRVIsIDEpKSsiIHNvbGx0ZSBzaWNoIGJlc3NlciBzY2hvbiBtYWwgZWluZW4gU2FyZyBiZXNvcmdlbi5cbiI7CiAgIGVsc2UgaWYgKGhwZGlmZiA+IDcqdmhwKQogICAgICByZXN1bHQgPSAiRHUgYmlzdCAiICsgdmljdGltLT5uYW1lKFdFTSwgMSkgKyAiIGhhdXNob2NoIHVlYmVybGVnZW4uXG4iOwogICBlbHNlIGlmIChocGRpZmYgPiA0KnZocCkKICAgICAgcmVzdWx0ID0gIkR1IGJpc3Qgc2VociB2aWVsIHN0YWVya2VyIGFscyAiICsgdm5hbWUgKyAiLlxuIjsKICAgZWxzZSBpZiAoaHBkaWZmID4gMip2aHApCiAgICAgIHJlc3VsdCA9ICJEdSBiaXN0IHZpZWwgc3RhZXJrZXIgYWxzICIgKyB2bmFtZSArICIuXG4iOwogICBlbHNlIGlmICgyKmhwZGlmZiA+IDMqdmhwKQogICAgICByZXN1bHQgPSAiRHUgYmlzdCBzcHVlcmJhciBzdGFlcmtlciBhbHMgIiArIHZuYW1lICsgIi5cbiI7CiAgIGVsc2UgaWYgKGhwZGlmZiA+IHZocCkKICAgICAgcmVzdWx0ID0gIkR1IGJpc3Qgc3RhZXJrZXIgYWxzICIgKyB2bmFtZSArICIuXG4iOwogICBlbHNlIGlmIChocGRpZmYgPiB2aHAvNSkKICAgICAgcmVzdWx0ID0gIkR1IGJpc3QgZXR3YXMgc3RhZXJrZXIgYWxzICIgKyB2bmFtZSArICIuXG4iOwogICBlbHNlIGlmICgtaHBkaWZmID4gMTAqaHApCiAgICAgIHJlc3VsdCA9ICJCZXNvcmcgRGlyIGJlc3NlciBzY2hvbiBtYWwgZWluZW4gU2FyZy5cbiI7CiAgIGVsc2UgaWYgKC1ocGRpZmYgPiA3KmhwKQogICAgICByZXN1bHQgPSBjYXBpdGFsaXplKHZuYW1lKSArICIgaXN0IERpciBoYXVzaG9jaCB1ZWJlcmxlZ2VuLlxuIjsKICAgZWxzZSBpZiAoLWhwZGlmZiA+IDQqaHApCiAgICAgIHJlc3VsdCA9IGNhcGl0YWxpemUodm5hbWUpICsgIiBpc3Qgc2VociB2aWVsIHN0YWVya2VyIGFscyBEdS5cbiI7CiAgIGVsc2UgaWYgKC1ocGRpZmYgPiAyKmhwKQogICAgICByZXN1bHQgPSBjYXBpdGFsaXplKHZuYW1lKSArICIgaXN0IHZpZWwgc3RhZXJrZXIgYWxzIER1LlxuIjsKICAgZWxzZSBpZiAoLTIqaHBkaWZmID4gMypocCkKICAgICAgcmVzdWx0ID0gY2FwaXRhbGl6ZSh2bmFtZSkgKyAiIGlzdCBzcHVlcmJhciBzdGFlcmtlciBhbHMgRHUuXG4iOwogICBlbHNlIGlmICgtaHBkaWZmID4gaHApCiAgICAgIHJlc3VsdCA9IGNhcGl0YWxpemUodm5hbWUpICsgIiBpc3Qgc3RhZXJrZXIgYWxzIER1LlxuIjsKICAgZWxzZSBpZiAoLWhwZGlmZiA+IGhwLzUpCiAgICAgIHJlc3VsdCA9IGNhcGl0YWxpemUodm5hbWUpICsgIiBpc3QgZXR3YXMgc3RhZXJrZXIgYWxzIER1LlxuIjsKICAgZWxzZQogICAgICByZXN1bHQgPSBjYXBpdGFsaXplKHZuYW1lKSArICIgaXN0IGV0d2EgZ2xlaWNoIHN0YXJrIHdpZSBEdS5cbiI7CiAgIHdyaXRlKHJlc3VsdCk7CgogICBpZiAoYWNkaWZmID4gMip2YWMpCiAgICAgIHJlc3VsdCA9ICJEZWluZSBSdWVzdHVuZyBpc3QgdW5nbGF1YmxpY2ggdmllbCBiZXNzZXIgYWxzIGRpZSAiCiAgICAgKyB2bmFtZWdlbiArICIuXG4iOwogICBlbHNlIGlmIChhY2RpZmYgPiB2YWMpCiAgICAgIHJlc3VsdCA9ICJEZWluZSBSdWVzdHVuZyBpc3QgdmllbCBiZXNzZXIgYWxzIGRpZSAiICsgdm5hbWVnZW4gKyAiLlxuIjsKICAgZWxzZSBpZiAoYWNkaWZmID52YWMvNSkKICAgICAgcmVzdWx0ID0gIkRlaW5lIFJ1ZXN0dW5nIGlzdCBiZXNzZXIgYWxzIGRpZSAiICsgdm5hbWVnZW4gKyAiLlxuIjsKICAgZWxzZSBpZiAoLWFjZGlmZiA+IDIqYWMpCiAgICAgIHJlc3VsdCA9ICJEaWUgUnVlc3R1bmcgIiArIHZuYW1lZ2VuCiAgICAgKyAiIGlzdCB1bmdsYXVibGljaCB2aWVsIGJlc3NlciBhbHMgRGVpbmUuXG4iOwogICBlbHNlIGlmICgtYWNkaWZmID4gYWMpCiAgICAgIHJlc3VsdCA9ICJEaWUgUnVlc3R1bmcgIiArIHZuYW1lZ2VuICsgIiBpc3QgdmllbCBiZXNzZXIgYWxzIERlaW5lLlxuIjsKICAgZWxzZSBpZiAoLWFjZGlmZiA+IGFjLzUpCiAgICAgIHJlc3VsdCA9ICJEaWUgUnVlc3R1bmcgIiArIHZuYW1lZ2VuICsgIiBpc3QgYmVzc2VyIGFscyBEZWluZS5cbiI7CiAgIGVsc2UKICAgICAgcmVzdWx0ID0gIkV1cmUgUnVlc3R1bmdlbiBzaW5kIGV0d2EgZ2xlaWNoIGd1dC5cbiI7CiAgIHdyaXRlKHJlc3VsdCk7CgogICBpZiAod2NkaWZmID4gMip2d2MpCiAgICAgIHJlc3VsdCA9ICJEZWluZSBXYWZmZSBpc3QgZWlnZW50bGljaCB6dSBndXQgZnVlciBkaWVzZW4gR2VnbmVyLlxuIjsKICAgZWxzZSBpZiAod2NkaWZmID4gdndjKQogICAgICByZXN1bHQgPSAiRGVpbmUgV2FmZmUgaXN0IHZpZWwgYmVzc2VyIGFscyBkaWUgIiArdm5hbWVnZW4gKyAiLlxuIjsKICAgZWxzZSBpZiAod2NkaWZmID4gdndjLzUpCiAgICAgIHJlc3VsdCA9ICJEZWluZSBXYWZmZSBpc3QgYmVzc2VyIGFscyBkaWUgIiArdm5hbWVnZW4gKyAiLlxuIjsKICAgZWxzZSBpZiAoLXdjZGlmZiA+IDIqd2MpCiAgICAgIHJlc3VsdCA9ICJEaWUgV2FmZmUgIiArIHZuYW1lZ2VuCiAgICAgKyAiIGxhZXNzdCBEZWluZSBnYW56IG1pY2tyaWcgYXVzc2VoZW4uXG4iOwogICBlbHNlIGlmICgtd2NkaWZmID4gd2MpCiAgICAgIHJlc3VsdCA9ICJEaWUgV2FmZmUgIiArIHZuYW1lZ2VuICsgIiBpc3QgdmllbCBiZXNzZXIgYWxzIERlaW5lLlxuIjsKICAgZWxzZSBpZiAoLXdjZGlmZiA+IHdjLzUpCiAgICAgIHJlc3VsdCA9ICJEaWUgV2FmZmUgIiArIHZuYW1lZ2VuICsgIiBpc3QgYmVzc2VyIGFscyBEZWluZS5cbiI7CiAgIGVsc2UKICAgICAgcmVzdWx0ID0gIkV1cmUgV2FmZmVuIHNpbmQgZXR3YSBnbGVpY2ggZ3V0LlxuIjsKICAgd3JpdGUocmVzdWx0KTsKICAgcmV0dXJuIEVSRk9MRzsKfQoKaW50IGthbXBmc2NocmVpKG9iamVjdCBjYXN0ZXIsIG1hcHBpbmcgc2luZm8pCnsKICBvYmplY3Qgb2I7CiAgc3RyaW5nIGNtZGxpbmUsIG1lbGR1bmc7CiAgaW50ICAgIHN1YywgZGF1ZXI7CgogIGNtZGxpbmUgPSB0aGlzX3BsYXllcigpLT5fdW5wYXJzZWRfYXJncygpOwogIGlmIChjbWRsaW5lKQogIHsKICAgIGlmIChzc2NhbmYoY21kbGluZSwgIm1lbGR1bmcgJXMiLCBtZWxkdW5nKSkKICAgIHsKICAgICAgY2FzdGVyLT5TZXQoImFiX2thbXBmc2NocmVpIiwgU0FWRSwgRl9NT0RFX0FTKTsKICAgICAgY2FzdGVyLT5TZXRQcm9wKCJhYl9rYW1wZnNjaHJlaSIsIG1lbGR1bmcpOwogICAgICBwcmludGYoIkRlaW4gS2FtcGZzY2hyZWkgaXN0IGpldHp0OiAlc1xuIiwgbWVsZHVuZyk7CiAgICAgIHJldHVybiAwOwogICAgfQogIH0KICBvYiA9IEZpbmRFbmVteVZpY3RpbShzaW5mb1tTSV9TS0lMTEFSR10sIGNhc3RlciwKICAgICAgICAgICJXZW0gd2lsbHN0IER1IERlaW5lbiBLYW1wZnNjaHJlaSBlbnRnZWdlbnNjaGxldWRlcm4/XG4iKTsKCiAgaWYgKCFvYikKICAgIHJldHVybiAwOwoKICBpZiAoKHN1Yz1TcGVsbFN1Y2Nlc3MoY2FzdGVyLCBzaW5mbykpIDw9IDApCiAgICByZXR1cm4gTUlTU0VSRk9MRzsKICBpZiAoc3VjIDwgb2ItPlNwZWxsRGVmZW5kKGNhc3Rlciwgc2luZm8pKQogIHsKICAgIHRlbGxfb2JqZWN0KGNhc3Rlciwgb2ItPk5hbWUoKSArICIgd2VocnQgRGVpbmVuIFNwcnVjaCBhYi5cbiIpOwogICAgcmV0dXJuIEVSRk9MRzsKICB9CgogIG1lbGR1bmcgPSBjYXN0ZXItPlF1ZXJ5UHJvcCgiYWJfa2FtcGZzY2hyZWkiKTsKICBpZiAoIW1lbGR1bmcpCiAgICBtZWxkdW5nID0gIkFhYWFhYWFpaWlpaWVlZWVlZWVlZWVlZWVlZWVoaGhoaGhoaGhoaGhoaGghISEhISEhXG4iOwoKICB3cml0ZShicmVha19zdHJpbmcobWVsZHVuZywgNzgsICJEdSBrcmVpc2Noc3Q6ICIpKTsKICB0ZWxsX3Jvb20oZW52aXJvbm1lbnQoY2FzdGVyKSwKICAgICAgICBicmVha19zdHJpbmcobWVsZHVuZywgNzgsIGNhc3Rlci0+TmFtZSgpKyIga3JlaXNjaHQ6ICIpLAogICAgICAgICh7Y2FzdGVyfSkpOwogIHRlbGxfb2JqZWN0KG9iLCAiRHUgZnVlaGxzdCBEaWNoIHdpZSBnZWxhZWhtdC5cbiIpOwoKICBkYXVlciA9IDEgKyAoc3VjLzEwMDAgKyByYW5kb20oY2FzdGVyLT5RdWVyeVByb3AoUF9MRVZFTCkvMikpLzI7CiAgaWYgKGRhdWVyPjI1KQogICAgZGF1ZXIgPSAyNTsKICBvYi0+TW9kaWZ5U2tpbGxBdHRyaWJ1dGUoU0FfU1BFRUQsIC01MCwgZGF1ZXIpOwoKICByZXR1cm4gRVJGT0xHOwp9CgppbnQgYXVzd2VpY2hlbihvYmplY3QgY2FzdGVyLCBtYXBwaW5nIHNpbmZvKQp7CiAgaWYgKCFjYXN0ZXItPkluRmlnaHQoKSkKICB7CiAgICB3cml0ZSgiQXVzd2VpY2hlbiBhdXNzZXJoYWxiIGVpbmVzIEthbXBmZXMgaXN0IHppZW1saWNoIHNpbm5sb3MuXG4iKTsKICAgIHJldHVybiAwOwogIH0KCiAgaWYgKGNhc3Rlci0+UXVlcnlQcm9wKFBfVE1QX0RFRkVORF9IT09LKSkKICB7CiAgICB3cml0ZSgiRGFzIGdlaHQgbW9tZW50YW4gbmljaHQsIER1IHd1bmRlcnN0IERpY2ggd2llc28hXG4iKTsKICAgIHJldHVybiAwOwogIH0KCiAgaWYgKFNwZWxsU3VjY2VzcyhjYXN0ZXIsc2luZm8pPD0wKQogICAgcmV0dXJuIE1JU1NFUkZPTEc7CgogIGNhc3Rlci0+U2V0UHJvcChQX1RNUF9ERUZFTkRfSE9PSywgKHsgdGltZSgpKzQsIHRoaXNfb2JqZWN0KCksICJEZWNrdW5nIiB9KSk7CiAgcmV0dXJuIEVSRk9MRzsKfQoKbWl4ZWQgRGVja3VuZyhpbnQgZGFtLCBtaXhlZCBkYW1fdHlwZSwgbWl4ZWQgc3BlbGwsIG9iamVjdCBlbmVteSkKewogIGlmICghcG9pbnRlcnAoZGFtX3R5cGUpKQogICAgZGFtX3R5cGUgPSAoeyBkYW1fdHlwZSB9KTsKICBpZiAoc2l6ZW9mKGRhbV90eXBlICYgbV9pbmRpY2VzKFBIWVNJQ0FMX0RBTUFHRV9UWVBFUykpKQogIHsKICAgIHRlbGxfb2JqZWN0KHByZXZpb3VzX29iamVjdCgpLCAiRHUgd2VpY2hzdCBnZWtvbm50IGF1cy5cbiIpOwogICAgaWYgKHByZXZpb3VzX29iamVjdCgpLT5RdWVyeVByb3AoUF9UTVBfREVGRU5EX0hPT0spWzFdID09IHRoaXNfb2JqZWN0KCkpCiAgICAgIHByZXZpb3VzX29iamVjdCgpLT5TZXRQcm9wKFBfVE1QX0RFRkVORF9IT09LLCAwKTsKICAgIHJldHVybiAwOwogIH0KICB0ZWxsX29iamVjdChwcmV2aW91c19vYmplY3QoKSwgIkRlaW4gQXVzd2VpY2h2ZXJzdWNoIGlzdCB2ZXJnZWJlbnMuXG4iKTsKICByZXR1cm4gKHsgZGFtLCBkYW1fdHlwZSwgc3BlbGwsIGVuZW15IH0pOwp9CgppbnQKaWRlbnRpZml6aWVyZShvYmplY3QgY2FzdGVyLCBtYXBwaW5nIHNpbmZvKSB7CiAgb2JqZWN0IG9iOwogIHN0cmluZyogZmk7CiAgc3RyaW5nIGNuOwogIHN0cmluZyByZXN1bHQsIGluZm87CiAgaW50IHN1YzsKICBvYj1GaW5kVmljdGltKHNpbmZvW1NJX1NLSUxMQVJHXSwgY2FzdGVyLAogICAgICAgICAgICAgICAgIldhcyBtb2VjaHRlc3QgRHUgaWRlbnRpZml6aWVyZW4/XG4iKTsKICBpZiAoIW9iKQogICAgcmV0dXJuIDA7CgogIGNuID0gY2FzdGVyLT5uYW1lKCk7CiAgaWYgKChzdWM9U3BlbGxTdWNjZXNzKGNhc3RlcixzaW5mbykpPD0wKQogICAgcmV0dXJuIE1JU1NFUkZPTEc7CiAgaWYgKHN1YyA8IG9iLT5TcGVsbERlZmVuZChjYXN0ZXIsIHNpbmZvKSkKICB7CiAgICB0ZWxsX29iamVjdChjYXN0ZXIsIG9iLT5OYW1lKCkgKyAiIHdlaHJ0IERlaW5lbiBTcHJ1Y2ggYWIuXG4iKTsKICAgIHJldHVybiBFUkZPTEc7CiAgfQoKICByZXN1bHQ9IkR1IGlkZW50aWZpemllcnN0ICIrb2ItPm5hbWUoV0VOLDEpKyIuICIKICAgICAgICArY2FwaXRhbGl6ZShvYi0+UXVlcnlQcm9ub3VuKCkpCiAgICAgICAgKyIgYmVzdGVoIgogICAgICAgICsob2ItPlF1ZXJ5UHJvcChQX1BMVVJBTCkgPyAiZW4iIDogInQiKQogICAgICAgICsiIGF1cyAiCiAgICAgICAgKyhvYi0+TWF0ZXJpYWxMaXN0KFdFTSwgY2FzdGVyKSkrIi4gIjsKICBpZiAoaW5mbz1vYi0+UXVlcnlQcm9wKFBfSU5GTykpCiAgICByZXN1bHQrPSJBdXNzZXJkZW0gYmVtZXJrc3QgRHUgZm9sZ2VuZGVzOlxuIitpbmZvOwogIGVsc2UgcmVzdWx0Kz0iRHUga2FubnN0IHNvbnN0IG5pY2h0cyBiZXNvbmRlcmVzIGFuICIrb2ItPlF1ZXJ5UHJvbm91bihXRU0pCiAgICAgICAgICAgICAgKyIgZXJrZW5uZW4uIjsKICB3cml0ZShicmVha19zdHJpbmcocmVzdWx0LCA3OCwgMCwgMSkpOwogIHJldHVybiBFUkZPTEc7Cn0KCmludApsaWNodChvYmplY3QgY2FzdGVyLCBtYXBwaW5nIHNpbmZvKQp7CiAgIG9iamVjdCBsOwoKICAgdGVsbF9vYmplY3QoY2FzdGVyLCAiRHUgbWFjaHN0IGVpbmUgbWFnaXNjaGUgQmV3ZWd1bmcuXG4iKTsKICAgdGVsbF9yb29tKGVudmlyb25tZW50KGNhc3RlciksCiAgICAgICBzcHJpbnRmKCIlcyBtYWNodCBlaW5lIG1hZ2lzY2hlIEJld2VndW5nLlxuIiwKICAgICAgICAgICBjYXBpdGFsaXplKGNhc3Rlci0+bmFtZShXRVIpKSksICh7Y2FzdGVyfSkpOwogICAKICAgaW50IHN1Yz1TcGVsbFN1Y2Nlc3MoY2FzdGVyLHNpbmZvKTsKICAgaWYgKHN1Yzw9MCkKICAgICAgcmV0dXJuIE1JU1NFUkZPTEc7CgogICBsID0gY2xvbmVfb2JqZWN0KExJQ0hUS1VHRUwpOwogICBpZiAobC0+bW92ZSh0aGlzX3BsYXllcigpKSA+IDApCiAgIHsKICAgICAgaW50IGx2bDsKICAgICAgLy8gZnVlciBTcHJ1Y2hyb2xsZW4tU3VwcG9ydC4KICAgICAgaWYgKCFzaW5mb1tTSV9VU1JdIHx8ICEobHZsPXNpbmZvW1NJX1VTUl1bUF9MRVZFTF0pICkKICAgICAgICBsdmwgPSBjYXN0ZXItPlF1ZXJ5UHJvcChQX0xFVkVMKTsKICAgICAgbHZsID0gbWluKGx2bCw0Mik7CiAgICAgIC8vIHdlbm4gZGVyIFNwZWxsIG5pY2h0IGdhbnogc28gZ3V0IGdlbGluZ3QsIGlzdCBkaWUgS3VnZWwgYXVjaCBldHdhcwogICAgICAvLyBkdW5rbGVyLgogICAgICBpZiAoc3VjPDYwMDApCiAgICAgIHsKICAgICAgICBsLT5TZXRQcm9wKFBfTElHSFQsMSk7CiAgICAgICAgdGVsbF9vYmplY3QoY2FzdGVyLAogICAgICAgICAgICAiV2llIGF1cyBkZW0gTmljaHRzIGVyc2NoZWludCBlaW5lIGxldWNodGVuZGUgS3VnZWwuXG4iKTsKICAgICAgfQogICAgICBlbHNlCiAgICAgICAgdGVsbF9vYmplY3QoY2FzdGVyLAogICAgICAgICAgICAiV2llIGF1cyBkZW0gTmljaHRzIGVyc2NoZWludCBlaW5lIGhlbGwgbGV1Y2h0ZW5kZSBLdWdlbC5cbiIpOwogICAgICBsLT5zdGFydF9yZW1vdmUobHZsICogMjAgKiBtaW4oc3VjKzMzMzMsMTAwMDApIC8gMTAwMDApOwogICB9CiAgIGVsc2UKICAgewogICAgICBsLT5yZW1vdmUoKTsKICAgICAgdGVsbF9vYmplY3QoY2FzdGVyLAogICAgICAgICAgIkVpbmUgTGljaHRrdWdlbCBlcnNjaGVpbnQsIHplcnBsYXR6dCBhYmVyIHNvZm9ydCBtaXQgZWluZW0gc2FuZnRlbiAncGxvcHAnLlxuIik7CiAgIH0KCiAgIHJldHVybiBFUkZPTEc7Cn0KCmludApzYWV1cmVzdHJhaGwob2JqZWN0IGNhc3RlciwgbWFwcGluZyBzaW5mbykgewogIG9iamVjdCB2aWN0aW07CiAgaW50IGhhbmRzOwogIHN0cmluZyB2bnc7CiAgaW50IHN1YzsKCiAgdmljdGltPUZpbmRFbmVteVZpY3RpbShzaW5mb1tTSV9TS0lMTEFSR10sY2FzdGVyLAogICAgICAgICAgICAgICAgICAgICAiV2VuIHdpbGxzdCBEdSBtaXQgZWluZW0gU2FldXJlc3RyYWhsIGJlc2NoaWVzc2VuP1xuIik7CiAgaWYgKCF2aWN0aW0pCiAgICByZXR1cm4gMDsKICBpZiAoKHN1Yz1TcGVsbFN1Y2Nlc3MoY2FzdGVyLHNpbmZvKSk8PTApCiAgICByZXR1cm4gTUlTU0VSRk9MRzsKICBpZiAoc3VjIDwgdmljdGltLT5TcGVsbERlZmVuZChjYXN0ZXIsIHNpbmZvKSkKICB7CiAgICB0ZWxsX29iamVjdChjYXN0ZXIsIHZpY3RpbS0+TmFtZSgpICsgIiB3ZWhydCBEZWluZW4gU3BydWNoIGFiLlxuIik7CiAgICByZXR1cm4gRVJGT0xHOwogIH0KCiAgdm53ID0gdmljdGltLT5uYW1lKFdFTiwgMik7CiAgc2F5KGJyZWFrX3N0cmluZygKICAgc3ByaW50ZigKICAgIiVzIGZ1Y2h0ZWx0IHNlbHRzYW0gaW4gZGVyIEx1ZnQgaGVydW0gdW5kIHNjaGllc3N0IGVpbmVuIFNhZXVyZXN0cmFobCBhdWYgJXMuXG4iLAogICAgICAgY2FzdGVyLT5OYW1lKCksIHZudyksIDc4KSwgdmljdGltKTsKICBwcmludGYoIkR1IHNjaGllc3N0IGVpbmVuIFNhZXVyZXN0cmFobCBhdWYgJXMuXG4iLCB2bncpOwogIHRlbGxfb2JqZWN0KHZpY3RpbSwgc3ByaW50ZigiJXMgc2NoaWVzc3QgZWluZW4gU2FldXJlc3RyYWhsIGF1ZiBEaWNoLlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzdGVyLT5OYW1lKCkpKTsKCiAgVHJ5RGVmYXVsdEF0dGFja1NwZWxsKHZpY3RpbSxjYXN0ZXIsc2luZm8sCiAgICAgICAgICAgIChbU1BfTkFNRToiU2FldXJlc3RyYWhsIiwgU1BfU0hPV19EQU1BR0U6MV0pKTsKCiAgcmV0dXJuIEVSRk9MRzsKfQoKaW50CmZldWVyYmFsbChvYmplY3QgY2FzdGVyLCBtYXBwaW5nIHNpbmZvKSB7CiAgb2JqZWN0IHZpY3RpbTsKICBpbnQgaGFuZHM7CiAgc3RyaW5nIHZudzsKICBpbnQgc3VjOwoKICB2aWN0aW09RmluZEVuZW15VmljdGltKHNpbmZvW1NJX1NLSUxMQVJHXSxjYXN0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAiQXVmIHdlbiB3aWxsc3QgRHUgZWluZW4gRmV1ZXJiYWxsIHNjaGxldWRlcm4/XG4iKTsKICBpZiAoIXZpY3RpbSkKICAgIHJldHVybiAwOwogIGlmICgoc3VjPVNwZWxsU3VjY2VzcyhjYXN0ZXIsc2luZm8pKTw9MCkKICAgIHJldHVybiBNSVNTRVJGT0xHOwogIGlmIChzdWMgPCB2aWN0aW0tPlNwZWxsRGVmZW5kKGNhc3Rlciwgc2luZm8pKQogIHsKICAgIHRlbGxfb2JqZWN0KGNhc3RlciwgdmljdGltLT5OYW1lKCkgKyAiIHdlaHJ0IERlaW5lbiBTcHJ1Y2ggYWIuXG4iKTsKICAgIHJldHVybiBFUkZPTEc7CiAgfQoKICB2bncgPSB2aWN0aW0tPm5hbWUoV0VNLCAyKTsKICBzYXkoc3ByaW50ZigiJXMgd2lyZnQgZWluZW4gRmV1ZXJiYWxsIG5hY2ggJXMuXG4iLAogICAgICAgICAgICAgIGNhc3Rlci0+TmFtZSgpLCB2bncpLCB2aWN0aW0pOwogIHByaW50ZigiRHUgd2lyZnN0IGVpbmVuIEZldWVyYmFsbCBuYWNoICVzLlxuIiwgdm53KTsKICB0ZWxsX29iamVjdCh2aWN0aW0sIHNwcmludGYoIiVzIHdpcmZ0IGVpbmVuIEZldWVyYmFsbCBuYWNoIERpci5cbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc3Rlci0+TmFtZSgpKSk7CgogIFRyeURlZmF1bHRBdHRhY2tTcGVsbCh2aWN0aW0sY2FzdGVyLHNpbmZvLAogICAgICAgICAgICAoW1NQX05BTUU6IkZldWVyYmFsbCIsIFNQX1NIT1dfREFNQUdFOjFdKSk7CgogIHJldHVybiBFUkZPTEc7Cn0KCmludApwZmVpbChvYmplY3QgY2FzdGVyLCBtYXBwaW5nIHNpbmZvKSB7CiAgb2JqZWN0IHZpY3RpbTsKICBpbnQgaGFuZHM7CiAgc3RyaW5nIHZuLCB2bncsIGNuOwogIGludCBzdWM7CgogIHZpY3RpbT1GaW5kRW5lbXlWaWN0aW0oc2luZm9bU0lfU0tJTExBUkddLGNhc3RlciwKICAgICAgICAgICAgICAgICAgICAgICAgICJOYWNoIHdlbSB3aWxsc3QgRHUgZWluZW4gbWFnaXNjaGVuIFBmZWlsIHdlcmZlbj9cbiIpOwogIGlmICghdmljdGltKQogICAgcmV0dXJuIDA7CiAgaWYgKChzdWM9U3BlbGxTdWNjZXNzKGNhc3RlcixzaW5mbykpPD0wKQogICAgcmV0dXJuIE1JU1NFUkZPTEc7CiAgaWYgKHN1YyA8IHZpY3RpbS0+U3BlbGxEZWZlbmQoY2FzdGVyLCBzaW5mbykpCiAgewogICAgdGVsbF9vYmplY3QoY2FzdGVyLCB2aWN0aW0tPk5hbWUoKSArICIgd2VocnQgRGVpbmVuIFNwcnVjaCBhYi5cbiIpOwogICAgcmV0dXJuIEVSRk9MRzsKICB9CgogIGNuID0gY2FzdGVyLT5OYW1lKCk7CiAgdm53ID0gdmljdGltLT5uYW1lKFdFTiwgMik7CiAgc2F5KHNwcmludGYoIiVzIGZldWVydCBlaW5lbiBtYWdpc2NoZW4gUGZlaWwgYXVmICVzIGFiLlxuIixjbiwgdm53KSwKICAgICAgdmljdGltKTsKICBwcmludGYoIkR1IGZldWVyc3QgZWluZW4gbWFnaXNjaGVuIFBmZWlsIGF1ZiAlcyBhYi5cbiIsIHZudyk7CiAgdGVsbF9vYmplY3QodmljdGltLHNwcmludGYoIiVzIGZldWVydCBlaW5lbiBtYWdpc2NoZW4gUGZlaWwgYXVmIERpY2ggYWIuXG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNuKSk7CiAgVHJ5RGVmYXVsdEF0dGFja1NwZWxsKHZpY3RpbSxjYXN0ZXIsc2luZm8sCiAgICAgICAgICAgIChbU1BfTkFNRToiUGZlaWwiLCBTUF9TSE9XX0RBTUFHRToxXSkpOwogIHJldHVybiBFUkZPTEc7Cn0KCmludApzY2huZWxsKG9iamVjdCBjYXN0ZXIsIG1hcHBpbmcgc2luZm8pIHsKICBpbnQgZGF1ZXI7CgogIGlmIChTcGVsbFN1Y2Nlc3MoY2FzdGVyLHNpbmZvKTw9MCkKICAgIHJldHVybiBNSVNTRVJGT0xHOwogIHdyaXRlKCJEdSBmdWVobHN0IERpY2ggcGxvZXR6bGljaCBkZXV0bGljaCBzY2huZWxsZXIuXG4iKTsKICBkYXVlciA9IDIgKiAoY2FzdGVyLT5RdWVyeUF0dHJpYnV0ZShBX0RFWCkgKwogICAgICAgICAgIHJhbmRvbShzaW5mb1tTSV9TS0lMTEFCSUxJVFldLzEwMDApKTsKICBpZiAoZGF1ZXI+NjApCiAgICBkYXVlciA9IDYwOwogIGNhc3Rlci0+TW9kaWZ5U2tpbGxBdHRyaWJ1dGUoU0FfU1BFRUQsIDEwMCwgZGF1ZXIpOwoKICByZXR1cm4gRVJGT0xHOwp9Cg==