LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIENvcHlyaWdodCAoQykgMjAxNiBieSBTYXZvaXItZmFpcmUgTGludXggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogQXV0aG9yOiBK5GdlciBOaWNvbGFzIDxuaWNvbGFzLmphZ2VyQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAgICAgKg0KKiBBdXRob3I6IFRyYWN6eWsgQW5kcmVhcyA8dHJhY3p5ay5hbmRyZWFzQHNhdm9pcmZhaXJlbGludXguY29tPiAgICAgICAgICAqDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgICAgKg0KKiBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieSAgICAqDQoqIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb247IGVpdGhlciB2ZXJzaW9uIDMgb2YgdGhlIExpY2Vuc2UsIG9yICAgICAgICoNCiogKGF0IHlvdXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCAgICAgICAgICoNCiogYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgICAgICAgICAgKg0KKiBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlICAgICAgICAgICAqDQoqIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGZvciBtb3JlIGRldGFpbHMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KKiBZb3Ugc2hvdWxkIGhhdmUgcmVjZWl2ZWQgYSBjb3B5IG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSAgICAgICAqDQoqIGFsb25nIHdpdGggdGhpcyBwcm9ncmFtLiAgSWYgbm90LCBzZWUgPGh0dHA6Ly93d3cuZ251Lm9yZy9saWNlbnNlcy8+LiAgICoNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2luY2x1ZGUgPHBjaC5oPg0KDQojaW5jbHVkZSAiYmFzZTY0LmgiDQoNCiNpbmNsdWRlIDxkaXJlY3QuaD4NCg0KdXNpbmcgbmFtZXNwYWNlIFJpbmdDbGllbnRVV1A7DQp1c2luZyBuYW1lc3BhY2UgVkNhcmRVdGlsczsNCg0KdXNpbmcgbmFtZXNwYWNlIFdpbmRvd3M6OlVJOjpDb3JlOw0KDQpzdGQ6OnN0cmluZw0KZ2V0QmV0d2VlblRva2VucyggICBjb25zdCBzdGQ6OnN0cmluZyYgc3RyLA0KICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB0b2tlbjEsDQogICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHRva2VuMiA9IG51bGxwdHIpDQp7DQogICAgc3RkOjpzaXplX3Qgc3RhcnQgPSB0b2tlbjEgPyAoc3RyLmZpbmQodG9rZW4xKSArIHN0cmxlbih0b2tlbjEpKSA6IDA7DQogICAgc3RkOjpzaXplX3QgbGVuZ3RoID0gdG9rZW4yID8gKHN0ci5maW5kKHRva2VuMikgLSAxIC0gc3RhcnQpIDogc3RkOjpzdHJpbmc6Om5wb3M7DQogICAgcmV0dXJuIHN0ci5zdWJzdHIoc3RhcnQsIGxlbmd0aCk7DQp9DQoNClZDYXJkOjpWQ2FyZChDb250YWN0XiBvd25lcikgOiBtX093bmVyKG93bmVyKQ0Ke30NCg0KaW50DQpWQ2FyZDo6cmVjZWl2ZUNodW5rKGNvbnN0IHN0ZDo6c3RyaW5nJiBhcmdzLCBjb25zdCBzdGQ6OnN0cmluZyYgcGF5bG9hZCkNCnsNCiAgICBNU0dfKCJyZWNlaXZlIFZDQVJEIGNodW5rIik7DQoNCiAgICBpbnQzMl90IF9pZCA9IHN0b2koIGdldEJldHdlZW5Ub2tlbnMoYXJncywgU3ltYm9sczo6SURfVE9LRU4sIFN5bWJvbHM6OlBBUlRfVE9LRU4pICk7DQogICAgdWludDMyX3QgX3BhcnQgPSBzdG9pKCBnZXRCZXR3ZWVuVG9rZW5zKGFyZ3MsIFN5bWJvbHM6OlBBUlRfVE9LRU4sIFN5bWJvbHM6Ok9GX1RPS0VOKSApOw0KICAgIHVpbnQzMl90IF9vZiA9IHN0b2koIGdldEJldHdlZW5Ub2tlbnMoYXJncywgU3ltYm9sczo6T0ZfVE9LRU4pICk7DQoNCiAgICBzdGQ6OnN0cmluZ3N0cmVhbSBfcGF5bG9hZChwYXlsb2FkKTsNCiAgICBzdGQ6OnN0cmluZyBfbGluZTsNCg0KICAgIGlmIChfcGFydCA9PSAxKSB7DQoNCiAgICAgICAgbV9tUGFydHMuY2xlYXIoKTsNCg0KICAgICAgICB3aGlsZSAoc3RkOjpnZXRsaW5lKF9wYXlsb2FkLCBfbGluZSkpIHsNCiAgICAgICAgICAgIGlmIChfbGluZS5maW5kKCJVSUQ6IikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpDQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgIH0NCiAgICAgICAgbV9tUGFydHNbUHJvcGVydHk6OlVJRF0gPSBfbGluZS5zdWJzdHIoNCk7DQoNCiAgICAgICAgYm9vbCBmbkZvdW5kID0gZmFsc2U7DQogICAgICAgIHdoaWxlIChzdGQ6OmdldGxpbmUoX3BheWxvYWQsIF9saW5lKSkgew0KICAgICAgICAgICAgaWYgKF9saW5lLmZpbmQoIkZOOiIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKSB7DQogICAgICAgICAgICAgICAgZm5Gb3VuZCA9IHRydWU7DQogICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgaWYgKGZuRm91bmQpDQogICAgICAgICAgICBtX21QYXJ0c1tQcm9wZXJ0eTo6Rk5dID0gX2xpbmUuc3Vic3RyKDMpOw0KDQogICAgICAgIHdoaWxlIChzdGQ6OmdldGxpbmUoX3BheWxvYWQsIF9saW5lKSkgew0KICAgICAgICAgICAgaWYgKF9saW5lLmZpbmQoIlBIT1RPOyIpICE9IHN0ZDo6c3RyaW5nOjpucG9zKQ0KICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICB9DQoNCiAgICAgICAgLy8gYmVjYXVzZSBhbmRyb2lkIGNsaWVudCBidWlsZHMgdmNhcmQgZGlmZmVyZW50bHkgKFRZUEU9UE5HOiB2cyBQTkc6KQ0KICAgICAgICBzaXplX3QgcG9zID0gX2xpbmUuZmluZCgiUE5HOiIpOw0KICAgICAgICBpZiAocG9zID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7DQogICAgICAgICAgICBwb3MgPSBfbGluZS5maW5kKCJKUEVHOiIpOw0KICAgICAgICAgICAgaWYgKHBvcyAhPSBzdGQ6OnN0cmluZzo6bnBvcykNCiAgICAgICAgICAgICAgICBtX21QYXJ0c1tQcm9wZXJ0eTo6UEhPVE9dLmFwcGVuZChfbGluZS5zdWJzdHIocG9zICsgNSkpOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgICAgIG1fbVBhcnRzW1Byb3BlcnR5OjpQSE9UT10uYXBwZW5kKF9saW5lLnN1YnN0cihwb3MgKyA0KSk7DQoNCiAgICAgICAgcmV0dXJuIFZDQVJEX0lOQ09NUExFVEU7DQogICAgfQ0KICAgIGVsc2Ugew0KICAgICAgICBpZiAoX3BhcnQgPT0gX29mKSB7DQogICAgICAgICAgICBzdGQ6OmdldGxpbmUoX3BheWxvYWQsIF9saW5lKTsNCiAgICAgICAgICAgIG1fbVBhcnRzW1Byb3BlcnR5OjpQSE9UT10uYXBwZW5kKF9saW5lKTsNCg0KICAgICAgICAgICAgYm9vbCBmbkZvdW5kID0gZmFsc2U7DQogICAgICAgICAgICB3aGlsZSAoc3RkOjpnZXRsaW5lKF9wYXlsb2FkLCBfbGluZSkpIHsNCiAgICAgICAgICAgICAgICBpZiAoX2xpbmUuZmluZCgiRk46IikgIT0gc3RkOjpzdHJpbmc6Om5wb3MpIHsNCiAgICAgICAgICAgICAgICAgICAgZm5Gb3VuZCA9IHRydWU7DQogICAgICAgICAgICAgICAgICAgIGJyZWFrOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIGlmIChmbkZvdW5kKQ0KICAgICAgICAgICAgICAgIG1fbVBhcnRzW1Byb3BlcnR5OjpGTl0gPSBfbGluZS5zdWJzdHIoMyk7DQoNCiAgICAgICAgICAgIHNhdmVUb0ZpbGUoKTsNCiAgICAgICAgICAgIGRlY29kZUJhc2U2NFRvUE5HRmlsZSgpOw0KICAgICAgICAgICAgaWYgKCFtX21QYXJ0c1tQcm9wZXJ0eTo6Rk5dLmVtcHR5KCkpDQogICAgICAgICAgICAgICAgbV9Pd25lci0+X2Rpc3BsYXlOYW1lID0gVXRpbHM6OnRvUGxhdGZvcm1TdHJpbmcobV9tUGFydHNbUHJvcGVydHk6OkZOXSk7DQogICAgICAgICAgICBtX093bmVyLT5fdmNhcmRVSUQgPSBVdGlsczo6dG9QbGF0Zm9ybVN0cmluZyhtX21QYXJ0c1tQcm9wZXJ0eTo6VUlEXSk7DQogICAgICAgICAgICBWaWV3TW9kZWw6OkNvbnRhY3RzVmlld01vZGVsOjppbnN0YW5jZS0+c2F2ZUNvbnRhY3RzVG9GaWxlKCk7DQogICAgICAgICAgICBNU0dfKCJWQ0FSRF9DT01QTEVURSIpOw0KICAgICAgICAgICAgcmV0dXJuIFZDQVJEX0NPTVBMRVRFOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICAgICAgbV9tUGFydHNbUHJvcGVydHk6OlBIT1RPXS5hcHBlbmQocGF5bG9hZCk7DQogICAgICAgICAgICByZXR1cm4gVkNBUkRfSU5DT01QTEVURTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gVkNBUkRfQ0hVTktfRVJST1I7DQp9DQoNCnZvaWQNClZDYXJkOjpzZW5kKHN0ZDo6c3RyaW5nIGNhbGxJRCwgY29uc3QgY2hhciogdkNhcmRGaWxlKQ0Kew0KICAgIGludCBpID0gMDsNCiAgICBjb25zdCBpbnQgY2h1bmtTaXplID0gMTAyNDsNCiAgICBzdGQ6OnN0cmluZyB2Q2FyZDsNCiAgICBpZiAodkNhcmRGaWxlKSB7DQogICAgICAgIHN0ZDo6aWZzdHJlYW0gZmlsZSh2Q2FyZEZpbGUpOw0KICAgICAgICB2Q2FyZC5hc3NpZ24oKCBzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oZmlsZSkpLCBzdGQ6OmlzdHJlYW1idWZfaXRlcmF0b3I8Y2hhcj4oKSk7DQogICAgfQ0KICAgIGVsc2UNCiAgICAgICAgdkNhcmQgPSBhc1N0cmluZygpOw0KICAgIGludCB0b3RhbCA9IHZDYXJkLnNpemUoKSAvIGNodW5rU2l6ZSArICh2Q2FyZC5zaXplKCkgJSBjaHVua1NpemUgPyAxIDogMCk7DQogICAgc3RkOjpzdHJpbmcgaWRrZXkgPSBVdGlsczo6Z2VuSUQoMExMLCA5OTk5OTk5OUxMKTsNCiAgICB3aGlsZSAoIHZDYXJkLnNpemUoKSApIHsNCiAgICAgICAgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBjaHVuazsNCiAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0ga2V5Ow0KICAgICAgICBrZXkgPDwgUFJPRklMRV9WQ0YNCiAgICAgICAgICAgIDw8ICI7aWQ9IiA8PCBpZGtleQ0KICAgICAgICAgICAgPDwgIixwYXJ0PSIgPDwgc3RkOjp0b19zdHJpbmcoaSArIDEpDQogICAgICAgICAgICA8PCAiLG9mPSIgPDwgc3RkOjp0b19zdHJpbmcodG90YWwpOw0KICAgICAgICBjaHVua1trZXkuc3RyKCldID0gdkNhcmQuc3Vic3RyKDAsIGNodW5rU2l6ZSk7DQogICAgICAgIHZDYXJkID0gdkNhcmQuZXJhc2UoMCwgY2h1bmtTaXplKTsNCiAgICAgICAgKytpOw0KICAgICAgICBzZW5kQ2h1bmsoY2FsbElELCBjaHVuayk7DQogICAgfQ0KfQ0KDQp2b2lkDQpWQ2FyZDo6c2VuZENodW5rKHN0ZDo6c3RyaW5nIGNhbGxJRCwgc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBjaHVuaykNCnsNCiAgICBNU0dfKCJzZW5kaW5nIGNodW5rLi4uIik7DQogICAgZm9yKGF1dG8gaSA6IGNodW5rKQ0KICAgICAgICBNU0dfKCJrZXk6IiArIGkuZmlyc3QgKyAiXG52YWx1ZToiICsgaS5zZWNvbmQpOw0KICAgIFJpbmdEOjppbnN0YW5jZS0+c2VuZFNJUFRleHRNZXNzYWdlVkNGKGNhbGxJRCwgY2h1bmspOw0KfQ0KDQpzdGQ6OnN0cmluZw0KVkNhcmQ6OmFzU3RyaW5nKCkNCnsNCiAgICBzdGQ6OnN0cmluZ3N0cmVhbSByZXQ7DQoNCiAgICByZXQgPDwgU3ltYm9sczo6QkVHSU5fVE9LRU4gICAgIDw8IFN5bWJvbHM6OkVORF9MSU5FX1RPS0VOOw0KDQogICAgcmV0IDw8IFByb3BlcnR5OjpWRVJTSU9OICAgICAgICA8PCBTeW1ib2xzOjpTRVBFUkFUT1IyICAgICAgPDwgIjMuMCINCiAgICAgICAgPDwgU3ltYm9sczo6RU5EX0xJTkVfVE9LRU47DQoNCiAgICByZXQgPDwgUHJvcGVydHk6OlVJRCAgICAgICAgICAgIDw8IFN5bWJvbHM6OlNFUEVSQVRPUjIgICAgICA8PCBtX21QYXJ0c1tQcm9wZXJ0eTo6VUlEXQ0KICAgICAgICA8PCBTeW1ib2xzOjpFTkRfTElORV9UT0tFTjsNCg0KICAgIHJldCA8PCBQcm9wZXJ0eTo6Rk4gICAgICAgICAgICAgPDwgU3ltYm9sczo6U0VQRVJBVE9SMiAgICAgIDw8IG1fbVBhcnRzW1Byb3BlcnR5OjpGTl0NCiAgICAgICAgPDwgU3ltYm9sczo6RU5EX0xJTkVfVE9LRU47DQoNCiAgICByZXQgPDwgUHJvcGVydHk6OlBIT1RPICAgICAgICAgIDw8IFN5bWJvbHM6OlNFUEVSQVRPUjEgICAgICA8PCBTeW1ib2xzOjpQSE9UT19FTkMNCiAgICAgICAgPDwgU3ltYm9sczo6U0VQRVJBVE9SMSAgICAgIDw8IFN5bWJvbHM6OlBIT1RPX1RZUEUgICAgICA8PCBTeW1ib2xzOjpTRVBFUkFUT1IyDQogICAgICAgIDw8IG1fbVBhcnRzW1Byb3BlcnR5OjpQSE9UT10gICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgU3ltYm9sczo6RU5EX0xJTkVfVE9LRU47DQoNCiAgICByZXQgPDwgU3ltYm9sczo6RU5EX1RPS0VOOw0KDQogICAgcmV0dXJuIHN0ZDo6c3RyaW5nKHJldC5zdHIoKSk7DQp9DQoNCnZvaWQNClZDYXJkOjpkZWNvZGVCYXNlNjRUb1BOR0ZpbGUoKQ0Kew0KICAgIHNpemVfdCBwYWRkaW5nID0gbV9tUGFydHNbUHJvcGVydHk6OlBIT1RPXS5zaXplKCkgJSA0Ow0KICAgIGlmIChwYWRkaW5nKQ0KICAgICAgICBtX21QYXJ0c1tQcm9wZXJ0eTo6UEhPVE9dLmFwcGVuZChwYWRkaW5nLCAwKTsNCg0KICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGRlY29kZWREYXRhID0gcmluZzo6YmFzZTY0OjpkZWNvZGUobV9tUGFydHNbUHJvcGVydHk6OlBIT1RPXSk7DQogICAgc3RkOjpzdHJpbmcgdmNhcmREaXIoUmluZ0Q6Omluc3RhbmNlLT5nZXRMb2NhbEZvbGRlcigpICsgIi52Y2FyZHNcXCIpOw0KICAgIHN0ZDo6c3RyaW5nIHBuZ0ZpbGUobV9tUGFydHNbUHJvcGVydHk6OlVJRF0gKyAiLnBuZyIpOw0KICAgIE1TR18oIlNhdmluZyBQTkcgKCIgKyBtX21QYXJ0c1tQcm9wZXJ0eTo6VUlEXSArICIpIHRvICIgKyBwbmdGaWxlICsgIi4uLiIpOw0KICAgIGlmIChfbWtkaXIodmNhcmREaXIuY19zdHIoKSkpIHsNCiAgICAgICAgc3RkOjpvZnN0cmVhbSBmaWxlKHZjYXJkRGlyICsgcG5nRmlsZSwgc3RkOjppb3M6Om91dCB8IHN0ZDo6aW9zOjp0cnVuYyB8IHN0ZDo6aW9zOjpiaW5hcnkpOw0KICAgICAgICBpZiAoZmlsZS5pc19vcGVuKCkpIHsNCiAgICAgICAgICAgIGZvciAoYXV0byBpIDogZGVjb2RlZERhdGEpDQogICAgICAgICAgICAgICAgZmlsZSA8PCBpOw0KICAgICAgICAgICAgZmlsZS5jbG9zZSgpOw0KICAgICAgICAgICAgbV9Pd25lci0+X2F2YXRhckltYWdlID0gVXRpbHM6OnRvUGxhdGZvcm1TdHJpbmcodmNhcmREaXIgKyBwbmdGaWxlKTsNCiAgICAgICAgICAgIE1TR18oIkRvbmUgZGVjb2RpbmcgYW5kIHNhdmluZyBWQ2FyZCBQaG90byB0byBQTkciKTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0Kdm9pZA0KVkNhcmQ6OmVuY29kZVBOR1RvQmFzZTY0KCkNCnsNCiAgICBzdGQ6OnN0cmluZyB2Y2FyZERpcihSaW5nRDo6aW5zdGFuY2UtPmdldExvY2FsRm9sZGVyKCkgKyAiLnZjYXJkc1xcIik7DQogICAgc3RkOjpzdHJpbmcgcG5nRmlsZShtX21QYXJ0c1tQcm9wZXJ0eTo6VUlEXSArICIucG5nIik7DQogICAgc3RkOjpiYXNpY19pZnN0cmVhbTx1aW50OF90PiBmaWxlKHZjYXJkRGlyICsgcG5nRmlsZSwgc3RkOjppb3M6OmluIHwgc3RkOjppb3M6OmJpbmFyeSk7DQogICAgaWYgKGZpbGUuaXNfb3BlbigpKSB7DQogICAgICAgIGF1dG8gZW9zID0gc3RkOjppc3RyZWFtYnVmX2l0ZXJhdG9yPHVpbnQ4X3Q+KCk7DQogICAgICAgIGF1dG8gZGF0YSA9IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KHN0ZDo6aXN0cmVhbWJ1Zl9pdGVyYXRvcjx1aW50OF90PihmaWxlKSwgZW9zKTsNCiAgICAgICAgbV9tUGFydHNbUHJvcGVydHk6OlBIT1RPXSA9IHJpbmc6OmJhc2U2NDo6ZW5jb2RlKGRhdGEpOw0KICAgICAgICBmaWxlLmNsb3NlKCk7DQogICAgICAgIE1TR18oIkRvbmUgZW5jb2RpbmcgUE5HIHRvIGI2NCIpOw0KICAgIH0NCn0NCg0KaW50DQpWQ2FyZDo6c2F2ZVRvRmlsZSgpDQp7DQogICAgc3RkOjpzdHJpbmcgdmNhcmREaXIoUmluZ0Q6Omluc3RhbmNlLT5nZXRMb2NhbEZvbGRlcigpICsgIi52Y2FyZHNcXCIpOw0KICAgIHN0ZDo6c3RyaW5nIHZjYXJkRmlsZShtX21QYXJ0c1tQcm9wZXJ0eTo6VUlEXSArICIudmNhcmQiKTsNCiAgICBNU0dfKCJTYXZpbmcgVkNhcmQgKCIgKyBtX21QYXJ0c1tQcm9wZXJ0eTo6VUlEXSArICIpIHRvICIgKyB2Y2FyZEZpbGUgKyAiLi4uIik7DQogICAgaWYgKF9ta2Rpcih2Y2FyZERpci5jX3N0cigpKSkgew0KICAgICAgICBzdGQ6Om9mc3RyZWFtIGZpbGUodmNhcmREaXIgKyB2Y2FyZEZpbGUsIHN0ZDo6aW9zOjpvdXQgfCBzdGQ6Omlvczo6dHJ1bmMpOw0KICAgICAgICBpZiAoZmlsZS5pc19vcGVuKCkpIHsNCiAgICAgICAgICAgIGZpbGUgPDwgYXNTdHJpbmcoKTsNCiAgICAgICAgICAgIGZpbGUuY2xvc2UoKTsNCiAgICAgICAgICAgIE1TR18oIkRvbmUgU2F2aW5nIFZDYXJkIik7DQogICAgICAgICAgICByZXR1cm4gMTsNCiAgICAgICAgfQ0KICAgIH0NCiAgICByZXR1cm4gMDsNCn0NCg0Kdm9pZA0KVkNhcmQ6OnNldERhdGEoc3RkOjptYXA8c3RkOjpzdHJpbmcsIHN0ZDo6c3RyaW5nPiBkYXRhKQ0Kew0KICAgIG1fbVBhcnRzID0gZGF0YTsNCn0=