LyogV0FSTklORzogVGhpcyBzY3JpcHQgY29udGFpbnMgVm9vZG9vISAqLw0KLyoNCiMjIyMjDQojIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQ0KIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgNCiMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLg0KIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMA0KIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aA0KIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KIw0KIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQojDQojIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCiMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCiMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuDQojIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCiMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQojIyMjIw0KKi8NCg0KdmFyIGJhbGxvdE5hbWVzID0gW10NCnZhciBiYWxsb3RDaGFycyA9IFtdDQp2YXIgY2hhcnMgPSBjaGFycz8gY2hhcnMgOiBbJ2EnLCdiJywnYycsJ2QnLCdlJywnZicsJ2cnLCdoJywnaScsJ2onLCdrJywnbCcsJ20nLCduJywnbycsJ3AnLCdxJywncicsJ3MnLCd0JywndScsJ3YnLCd3JywneCcsJ3knLCd6J10gIC8vIENvcnJlc3BvbmRpbmcgU1RWIGxldHRlcnMsIGluIHNhbWUgb3JkZXIgYXMgbm9taW5lZXMNCnZhciBmYWRpbmcgPSBmYWxzZQ0KLy8gQ3V0IGF3YXkgdW51c2VkIGNoYXJzDQp3aGlsZSAoY2hhcnMubGVuZ3RoID4gY2FuZGlkYXRlcy5sZW5ndGgpIGNoYXJzLnNwbGljZSgtMSwxKQ0KDQovLyBNYWtlIGNvcGllcyBmb3IgcmVzZXQNCnZhciBjYW5kaWRhdGVzX2NvcHkgPSBbXQ0KdmFyIGNoYXJzX2NvcHkgPSBbXQ0KDQp2YXIgZmFpbG92ZXIgPSBudWxsOw0KDQpmb3IgKGkgaW4gY2FuZGlkYXRlcykgY2FuZGlkYXRlc19jb3B5LnB1c2goY2FuZGlkYXRlc1tpXSkNCmZvciAoaSBpbiBjaGFycykgY2hhcnNfY29weS5wdXNoKGNoYXJzW2ldKQ0KDQoNCi8vIFNldCB0cmFuc2ZlciBkYXRhIGR1cmluZyBkcmFnJ24nZHJvcA0KZnVuY3Rpb24gZHJhZ1ZvdGUoZXYpIHsNCiAgICBldi5kYXRhVHJhbnNmZXIuc2V0RGF0YSgiVGV4dCIsIGV2LnRhcmdldC5nZXRBdHRyaWJ1dGUoImRhdGEiKSk7DQogICAgZmFpbG92ZXIgPSBldi50YXJnZXQuZ2V0QXR0cmlidXRlKCJkYXRhIikNCiAgICBpZiAoYmFsbG90TmFtZXMuaW5kZXhPZihmYWlsb3ZlcikgPT0gLTEpIHsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbmRpZGF0ZXMnKS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAidXJsKC9pbWFnZXMvZHJhZ3JpZ2h0LnBuZykiDQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYW5kaWRhdGVzJykuc3R5bGUuYmFja2dyb3VuZFJlcGVhdCA9ICJuby1yZXBlYXQiDQogICAgfSBlbHNlIHsNCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbmRpZGF0ZXMnKS5zdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgPSAidXJsKC9pbWFnZXMvZHJhZ2xlZnQucG5nKSINCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbmRpZGF0ZXMnKS5zdHlsZS5iYWNrZ3JvdW5kUmVwZWF0ID0gIm5vLXJlcGVhdCINCiAgICB9DQp9DQoNCnZhciBzb3VyY2UsIGRlc3QNCg0KZnVuY3Rpb24gY2FuY2VsKGV2KSB7DQogICAgZXYucHJldmVudERlZmF1bHQoKQ0KfQ0KDQpmdW5jdGlvbiByZXNldExpc3QoKSB7DQogICAgY2FuZGlkYXRlcyA9IFtdDQogICAgY2hhcnMgPSBbXQ0KICAgIGZvciAoaSBpbiBjYW5kaWRhdGVzX2NvcHkpIGNhbmRpZGF0ZXMucHVzaChjYW5kaWRhdGVzX2NvcHlbaV0pDQogICAgZm9yIChpIGluIGNoYXJzX2NvcHkpIGNoYXJzLnB1c2goY2hhcnNfY29weVtpXSkNCiAgICBiYWxsb3ROYW1lcyA9IFtdDQogICAgYmFsbG90Q2hhcnMgPSBbXQ0KICAgIHNodWZmbGVDYW5kaWRhdGVzKCk7DQogICAgDQogICAgZHJhd0NhbmRpZGF0ZXMoKQ0KICAgIGZhZGluZyA9IGZhbHNlDQogICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2JhbGxvdCcpLmlubmVySFRNTCA9ICc8aW1nIHNyYz0iL2ltYWdlcy90YXJnZXQucG5nIiBzdHlsZT0ibWFyZ2luLWxlZnQ6IDEwMHB4OyIgb25kcm9wPSJldmVudC5wcmV2ZW50RGVmYXVsdCgpOyBkcm9wQ2FuZGlkYXRlKGV2ZW50KTsiLz4nOw0KICAgIGRyYXdMaXN0KCk7DQp9DQoNCi8vIERpZCB3ZSBkcm9wIGEgdm90ZSBvbiB0b3Agb2YgYW5vdGhlcj8NCmZ1bmN0aW9uIGRyb3BWb3RlKGV2LCBwYXJlbnQpIHsNCiAgICANCiAgICAvL2V2LnByZXZlbnREZWZhdWx0KCk7DQogICAgaWYgKHBhcmVudCB8fCBmYWRpbmcpIHJldHVybjsNCiAgICANCiAgICAvLyBHZXQgd2hvIHdlIGRyYWdnZWQgYW5kIHdobyB3ZSBkcm9wcGVkIGl0IG9uDQogICAgc291cmNlID0gZXYuZGF0YVRyYW5zZmVyLmdldERhdGEoIlRleHQiKTsNCiAgICBkZXN0ID0gcGFyZW50ID8gZXYudGFyZ2V0LnBhcmVudE5vZGUuZ2V0QXR0cmlidXRlKCJkYXRhIikgOiBldi50YXJnZXQuZ2V0QXR0cmlidXRlKCJkYXRhIikNCiAgICBpZiAoZGVzdCA9PSAiVVBQRVIiKSB7IGRlc3QgPSBiYWxsb3ROYW1lc1swXX0NCiAgICBpZiAoZGVzdCA9PSAiTE9XRVIiKSB7IGRlc3QgPSBiYWxsb3ROYW1lc1tiYWxsb3ROYW1lcy5sZW5ndGggLTFdIH0NCiAgICBpZiAoY2FuZGlkYXRlcy5pbmRleE9mKGRlc3QpICE9IC0xKSB7DQogICAgICAgIGFsZXJ0KCJCYWNrIHRvIHNjaG9vbCEiKQ0KICAgIH0NCiAgICANCiAgICAvLyBJZiB3ZSBkaWRuJ3QgZHJhZyB0aGlzIG9udG8gb3Vyc2VsdmVzLCBsZXQncyBpbml0aWF0ZSB0aGUgZmFkZS1vdXQgYW5kIHN3YXANCiAgICBpZiAoc291cmNlICE9IGRlc3QpIHsNCiAgICAgICAgZmFkZU91dCgxLCAiYmFsbG90Iik7DQogICAgfQ0KICAgIA0KfQ0KDQpmdW5jdGlvbiBkcm9wQ29tcGxldGUoeikgew0KICAgIGlmIChmYWRpbmcpIHsNCiAgICAgICAgcmV0dXJuOw0KICAgIH0NCiAgICAvLyBHZXQgYXJyYXkgaW5kaWNlcw0KICAgIHZhciBzaWQgPSBiYWxsb3ROYW1lcy5pbmRleE9mKHNvdXJjZSk7DQogICAgdmFyIGRpZCA9IGJhbGxvdE5hbWVzLmluZGV4T2YoZGVzdCkNCiAgICANCiAgICAvLyBTcGxpY2UhDQogICAgaWYgKHNpZCA+PSAwICYmIGRpZCA+PSAwKSB7DQogICAgICAgIGJhbGxvdE5hbWVzLnNwbGljZShkaWQsIDAsIGJhbGxvdE5hbWVzLnNwbGljZShzaWQsIDEpWzBdKQ0KICAgICAgICBiYWxsb3RDaGFycy5zcGxpY2UoZGlkLCAwLCBiYWxsb3RDaGFycy5zcGxpY2Uoc2lkLCAxKVswXSkNCiAgICB9IGVsc2Ugew0KICAgICAgICBhbGVydChzb3VyY2UgKyAiOiIgKyBkZXN0KQ0KICAgIH0NCiAgICAvL2V2LnByZXZlbnREZWZhdWx0KCk7DQogICAgLy8gUmVkcmF3IGFuZCBjYXJyeSBvbg0KICAgIA0KICAgIGRyYXdMaXN0KCkNCiAgICBmYWRlSW4oMCwgeiwgTWF0aC5yYW5kb20oKSkNCn0NCg0KDQovLyBBIGxpdHRsZSBzaHVmZmxlLCBzbyB3ZSBkb24ndCBhbGwgZ2V0IHRoZSBzYW1lIG9yZGVyIGF0IGZpcnN0DQpmdW5jdGlvbiBzaHVmZmxlQ2FuZGlkYXRlcygpIHsNCiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNhbmRpZGF0ZXMubGVuZ3RoOyBpKyspIHsNCiAgICAgICAgDQogICAgICAgIC8vIFBpY2sgc29tZSBudW1iZXJzDQogICAgICAgIHZhciBzaWQgPSBwYXJzZUludChNYXRoLnJhbmRvbSgpKmNhbmRpZGF0ZXMubGVuZ3RoLTAuMDEpOw0KICAgICAgICB2YXIgZGlkID0gcGFyc2VJbnQoTWF0aC5yYW5kb20oKSpjYW5kaWRhdGVzLmxlbmd0aC0wLjAxKTsNCiAgICAgICAgDQogICAgICAgIC8vIFNwbGljZSENCiAgICAgICAgaWYgKHNpZCA+PSAwICYmIGRpZCA+PSAwKSB7DQogICAgICAgICAgICBjYW5kaWRhdGVzLnNwbGljZShkaWQsIDAsIGNhbmRpZGF0ZXMuc3BsaWNlKHNpZCwgMSlbMF0pDQogICAgICAgICAgICBjaGFycy5zcGxpY2UoZGlkLCAwLCBjaGFycy5zcGxpY2Uoc2lkLCAxKVswXSkNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KDQpmdW5jdGlvbiBkcmF3Q2FuZGlkYXRlcygpIHsNCiAgICB2YXIgYm94ID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ2NhbmRpZGF0ZXMnKQ0KICAgIGJveC5pbm5lckhUTUwgPSAiPGgzPkNhbmRpZGF0ZXM6PC9oMz4iDQogICAgZm9yIChpIGluIGNhbmRpZGF0ZXMpIHsNCiAgICAgICAgdmFyIG5hbWUgPSBjYW5kaWRhdGVzW2ldDQogICAgICAgIHZhciBjaGFyID0gY2hhcnNbaV0NCiAgICAgICAgLy8gQWRkIGVsZW1lbnQgYW5kIHNldCBkcmFnJ24nZHJvcCArIGRhdGENCiAgICAgICAgdmFyIG91dGVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2JykNCiAgICAgICAgdmFyIGlubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpDQogICAgICAgIGlubmVyLnN0eWxlLmZvbnRGYW1pbHkgPSAibW9ub3NwYWNlIg0KICAgICAgICBpbm5lci5pbm5lckhUTUwgPSBjaGFyICsgIjogIiArIG5hbWU7DQogICAgICAgIGlubmVyLnNldEF0dHJpYnV0ZSgib25kcm9wIiwgImRyb3BDYW5kaWRhdGUoZXZlbnQsIHRydWUpIikNCiAgICAgICAgb3V0ZXIuc2V0QXR0cmlidXRlKCJjbGFzcyIsICJiYWxsb3Rib3hfY2xpc3QiKQ0KICAgICAgICBvdXRlci5zZXRBdHRyaWJ1dGUoImlkIiwgbmFtZSkNCiAgICAgICAgb3V0ZXIuc2V0QXR0cmlidXRlKCJkYXRhIiwgbmFtZSkNCiAgICAgICAgaW5uZXIuc2V0QXR0cmlidXRlKCJkYXRhIiwgbmFtZSkNCiAgICAgICAgb3V0ZXIuc2V0QXR0cmlidXRlKCJkcmFnZ2FibGUiLCAidHJ1ZSIpDQogICAgICAgIG91dGVyLnNldEF0dHJpYnV0ZSgib25kcmFnc3RhcnQiLCAiZHJhZ1ZvdGUoZXZlbnQpIikNCiAgICAgICAgb3V0ZXIuYXBwZW5kQ2hpbGQoaW5uZXIpDQogICAgICAgIG91dGVyLnNldEF0dHJpYnV0ZSgidGl0bGUiLCAiRHJhZyB0byBtb3ZlICIgICsgbmFtZSArICIgdG8gdGhlIGJhbGxvdCBib3giKQ0KICAgICAgICBvdXRlci5zZXRBdHRyaWJ1dGUoIm9uZHJvcCIsICJkcm9wQ2FuZGlkYXRlKGV2ZW50LCBmYWxzZSkiKQ0KICAgICAgICBvdXRlci5zZXRBdHRyaWJ1dGUoIm9uZHJhZ292ZXIiLCAiZXZlbnQucHJldmVudERlZmF1bHQoKTsiKQ0KICAgICAgICBvdXRlci5zZXRBdHRyaWJ1dGUoIm9uZHJhZ2VuZCIsICJldmVudC5wcmV2ZW50RGVmYXVsdCgpOyIpDQogICAgICAgIG91dGVyLnNldEF0dHJpYnV0ZSgib25kcmFnZW50ZXIiLCAiZXZlbnQucHJldmVudERlZmF1bHQoKTsiKQ0KICAgICAgICANCiAgICAgICAgLy8gRG9lcyB0aGUgY2FuZGlkYXRlIGhhdmUgYSBzdGF0ZW1lbnQ/IGlmIHNvLCBwdXQgaXQgb24gdGhlcmUNCiAgICAgICAgaWYgKHN0YXRlbWVudHNbY2hhcl0pIHsNCiAgICAgICAgICAgIHZhciBzdGF0ZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKQ0KICAgICAgICAgICAgc3RhdGVtZW50LnNldEF0dHJpYnV0ZSgiY2xhc3MiLCAic3RhdGVtZW50X21hcmtlciIpDQogICAgICAgICAgICBzdGF0ZW1lbnQuc2V0QXR0cmlidXRlKCJ0aXRsZSIsICJDbGljayB0byByZWFkICIgKyBuYW1lICsgIidzIHN0YXRlbWVudCIpDQogICAgICAgICAgICBzdGF0ZW1lbnQuaW5uZXJIVE1MID0gIjxhIGhyZWY9JyNzdGF0ZW1lbnRfIitjaGFyKyInPlN0YXRlbWVudDwvYT4iDQoNCiAgICAgICAgICAgIG91dGVyLmFwcGVuZENoaWxkKHN0YXRlbWVudCkNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgdmFyIHBvcHVwID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikNCiAgICAgICAgICAgIHBvcHVwLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCAibW9kYWwiKQ0KICAgICAgICAgICAgcG9wdXAuc2V0QXR0cmlidXRlKCJpZCIsICJzdGF0ZW1lbnRfIiArIGNoYXIpDQogICAgICAgICAgICBwb3B1cC5zZXRBdHRyaWJ1dGUoImFyaWEtaGlkZGVuIiwgInRydWUiKQ0KICAgICAgICAgICAgDQogICAgICAgICAgICB2YXIgcG9wdXBkID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IikNCiAgICAgICAgICAgIHBvcHVwZC5zZXRBdHRyaWJ1dGUoImNsYXNzIiwgIm1vZGFsLWRpYWxvZyIpDQogICAgICAgICAgICBwb3B1cC5hcHBlbmRDaGlsZChwb3B1cGQpDQogICAgICAgICAgICANCiAgICAgICAgICAgIHZhciBwb3B1cGggPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQ0KICAgICAgICAgICAgcG9wdXBoLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCAibW9kYWwtaGVhZGVyIikNCiAgICAgICAgICAgIHBvcHVwaC5pbm5lckhUTUwgPSAnPGgyPlN0YXRlbWVudCBmcm9tICcgKyBuYW1lICsgJzwvaDI+PGEgaHJlZj0iI2Nsb3NlIiBjbGFzcz0iYnRuLWNsb3NlIiBhcmlhLWhpZGRlbj0idHJ1ZSI+1zwvYT4nDQogICAgICAgICAgICANCiAgICAgICAgICAgIHZhciBwb3B1cGIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQ0KICAgICAgICAgICAgcG9wdXBiLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCAibW9kYWwtYm9keSIpDQogICAgICAgICAgICBwb3B1cGIuaW5uZXJIVE1MID0gJzxwcmU+JyArIChzdGF0ZW1lbnRzW2NoYXJdID8gc3RhdGVtZW50c1tjaGFyXSA6ICJUaGlzIGNhbmRpZGF0ZSBoYXMgbm90IHByZXBhcmVkIGEgc3RhdGVtZW50IikgKyc8L3ByZT4nDQogICAgICAgICAgICANCiAgICAgICAgICAgIHZhciBwb3B1cGYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKQ0KICAgICAgICAgICAgcG9wdXBmLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCAibW9kYWwtZm9vdGVyIikNCiAgICAgICAgICAgIHBvcHVwZi5pbm5lckhUTUwgPSAnPGEgaHJlZj0iI2Nsb3NlIiBjbGFzcz0iYnRuIj5DbG9zZSBzdGF0ZW1lbnQ8L2E+Jw0KICAgICAgICAgICAgDQogICAgICAgICAgICBwb3B1cGQuYXBwZW5kQ2hpbGQocG9wdXBoKQ0KICAgICAgICAgICAgcG9wdXBkLmFwcGVuZENoaWxkKHBvcHVwYikNCiAgICAgICAgICAgIHBvcHVwZC5hcHBlbmRDaGlsZChwb3B1cGYpDQogICAgICAgICAgICANCiAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCdib2R5JylbMF0uYXBwZW5kQ2hpbGQocG9wdXApDQogICAgICAgIH0vKiBlbHNlIHsNCiAgICAgICAgICAgIHZhciBzdGF0ZW1lbnQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKQ0KICAgICAgICAgICAgc3RhdGVtZW50LnNldEF0dHJpYnV0ZSgiY2xhc3MiLCAic3RhdGVtZW50X21hcmtlciIpDQogICAgICAgICAgICBzdGF0ZW1lbnQuc3R5bGUgPSAiYmFja2dyb3VuZDogbGluZWFyLWdyYWRpZW50KHRvIGJvdHRvbSwgI2UyZTJlMiAwJSwjZGJkYmRiIDUwJSwjZDFkMWQxIDUxJSwjZmVmZWZlIDEwMCUpICFpbXBvcnRhbnQ7Ig0KICAgICAgICAgICAgc3RhdGVtZW50LnN0eWxlLmNvbG9yID0gIiM2NjYiOw0KICAgICAgICAgICAgc3RhdGVtZW50LmlubmVySFRNTCA9ICI8aT5ObyBzdGF0ZW1lbnQ8L2k+Ig0KDQogICAgICAgICAgICBvdXRlci5hcHBlbmRDaGlsZChzdGF0ZW1lbnQpDQogICAgICAgIH0qLw0KICAgICAgICBib3guYXBwZW5kQ2hpbGQob3V0ZXIpDQogICAgICAgIA0KICAgIH0NCn0NCg0KLy8gRGlkIHdlIGRyb3AgYSB2b3RlIG9uIHRvcCBvZiBhbm90aGVyPw0KZnVuY3Rpb24gZHJvcENhbmRpZGF0ZShldikgew0KICAgIA0KICAgIGV2LnByZXZlbnREZWZhdWx0KCk7DQogICAgc291cmNlID0gZXYuZGF0YVRyYW5zZmVyLmdldERhdGEoIlRleHQiKTsNCiAgICBkZXN0ID0gZXYudGFyZ2V0LmdldEF0dHJpYnV0ZSgiZGF0YSIpDQogICAgdmFyIHogPSAwOw0KICAgIGlmIChkZXN0ID09ICJVUFBFUiIpIHsgZGVzdCA9IGJhbGxvdE5hbWVzWzBdOyB6ID0gMH0NCiAgICBpZiAoZGVzdCA9PSAiTE9XRVIiKSB7IGRlc3QgPSBiYWxsb3ROYW1lc1tiYWxsb3ROYW1lcy5sZW5ndGggLTFdOyB6ID0gMTt9DQogICAgaWYgKGRlc3QgJiYgY2FuZGlkYXRlcy5pbmRleE9mKGRlc3QpICE9IC0xKSB7DQogICAgICAgIHJldHVybjsNCiAgICB9DQogICAgaWYgKGJhbGxvdE5hbWVzLmluZGV4T2Yoc291cmNlKSA9PSAtMSAmJiBjYW5kaWRhdGVzLmluZGV4T2Yoc291cmNlKSAhPSAtMSkgew0KICAgICAgICB2YXIgeCA9IGJhbGxvdE5hbWVzLmluZGV4T2YoZGVzdCkNCiAgICAgICAgeCArPSB6DQogICAgICAgIGlmIChiYWxsb3ROYW1lcy5pbmRleE9mKGRlc3QpICE9IC0xKSB7DQogICAgICAgICAgICBiYWxsb3ROYW1lcy5zcGxpY2UoeCwwLHNvdXJjZSk7DQogICAgICAgICAgICBiYWxsb3RDaGFycy5zcGxpY2UoeCwwLGNoYXJzW2NhbmRpZGF0ZXMuaW5kZXhPZihzb3VyY2UpXSk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBiYWxsb3ROYW1lcy5wdXNoKHNvdXJjZSkNCiAgICAgICAgICAgIGJhbGxvdENoYXJzLnB1c2goY2hhcnNbY2FuZGlkYXRlcy5pbmRleE9mKHNvdXJjZSldKQ0KICAgICAgICB9DQogICAgICAgIGNoYXJzLnNwbGljZShjYW5kaWRhdGVzLmluZGV4T2Yoc291cmNlKSwgMSkNCiAgICAgICAgY2FuZGlkYXRlcy5zcGxpY2UoY2FuZGlkYXRlcy5pbmRleE9mKHNvdXJjZSksIDEpDQogICAgICAgIA0KICAgICAgICBmYWRlSW4oMCwgImJhbGxvdCIsIE1hdGgucmFuZG9tKCkpDQogICAgICAgIC8vZXYucHJldmVudERlZmF1bHQoKQ0KICAgICAgICBkcmF3Q2FuZGlkYXRlcygpOw0KICAgICAgICBkcmF3TGlzdCgpOw0KICAgICAgICANCiAgICB9DQogICAgDQp9DQoNCi8vIERpZCB3ZSBkcm9wIGEgdm90ZSBvbiB0b3Agb2YgYW5vdGhlcj8NCmZ1bmN0aW9uIGRyb3BCYWNrKGV2KSB7DQogICAgZXYucHJldmVudERlZmF1bHQoKTsNCiAgICBzb3VyY2UgPSBldi5kYXRhVHJhbnNmZXIuZ2V0RGF0YSgiVGV4dCIpOw0KICAgIGRlc3QgPSBldi50YXJnZXQuZ2V0QXR0cmlidXRlKCJkYXRhIikNCiAgICANCiAgICBpZiAoZGVzdCA9PSAiVVBQRVIiKSB7IGRlc3QgPSBiYWxsb3ROYW1lc1swXX0NCiAgICBpZiAoZGVzdCA9PSAiTE9XRVIiKSB7IGRlc3QgPSBiYWxsb3ROYW1lc1tiYWxsb3ROYW1lcy5sZW5ndGggLTFdIH0NCiAgICANCiAgICBpZiAoKCFkZXN0IHx8IGNhbmRpZGF0ZXMuaW5kZXhPZihkZXN0KSAhPSAtMSkgJiYgYmFsbG90TmFtZXMuaW5kZXhPZihzb3VyY2UpICE9IC0xKSB7DQogICAgDQogICAgICAgIGNhbmRpZGF0ZXMucHVzaChzb3VyY2UpDQogICAgICAgIGNoYXJzLnB1c2goYmFsbG90Q2hhcnNbYmFsbG90TmFtZXMuaW5kZXhPZihzb3VyY2UpXSkNCiAgICAgICAgYmFsbG90Q2hhcnMuc3BsaWNlKGJhbGxvdE5hbWVzLmluZGV4T2Yoc291cmNlKSwgMSkNCiAgICAgICAgYmFsbG90TmFtZXMuc3BsaWNlKGJhbGxvdE5hbWVzLmluZGV4T2Yoc291cmNlKSwgMSkNCiAgICAgICAgZHJhd0xpc3QoKTsNCiAgICAgICAgZHJhd0NhbmRpZGF0ZXMoKTsNCiAgICAgICAgZmFkZUluKDAsICJjYW5kaWRhdGVzIiwgTWF0aC5yYW5kb20oKSkNCiAgICAgICAgDQogICAgfSBlbHNlIHsNCiAgICAgICAgZGVzdCA9IG51bGwNCiAgICAgICAgc291cmNlID0gbnVsbA0KICAgIH0NCn0NCg0KZnVuY3Rpb24gc2hvd0xpbmVzKGV2KSB7DQogICAgDQogICAgc291cmNlID0gZXYuZGF0YVRyYW5zZmVyLmdldERhdGEoIlRleHQiKTsNCiAgICBzb3VyY2UgPSBzb3VyY2UgPyBzb3VyY2UgOiBmYWlsb3ZlcjsNCiAgICBldi5wcmV2ZW50RGVmYXVsdCgpOw0KICAgIGlmIChldi50YXJnZXQpIHsNCiAgICAgICAgdmFyIGFib3ZlID0gZmFsc2UNCiAgICAgICAgZGVzdCA9IGV2LnRhcmdldC5nZXRBdHRyaWJ1dGUoImRhdGEiKQ0KICAgICAgICB2YXIgb2Rlc3QgPSBkZXN0Ow0KICAgICAgICB2YXIgb3ZlcnJpZGUgPSBmYWxzZQ0KICAgICAgICBpZiAoZGVzdCA9PSAiVVBQRVIiKSB7IGRlc3QgPSBiYWxsb3ROYW1lc1swXTsgb3ZlcnJpZGUgPSB0cnVlOyBhYm92ZSA9IHRydWU7fQ0KICAgICAgICBpZiAoZGVzdCA9PSAiTE9XRVIiKSB7IGRlc3QgPSBiYWxsb3ROYW1lc1tiYWxsb3ROYW1lcy5sZW5ndGgtMV07IG92ZXJyaWRlID0gdHJ1ZTsgYWJvdmU9IGZhbHNlOyB9DQogICAgICAgIGZvciAoaT0wO2k8IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWxsb3QnKS5jaGlsZE5vZGVzLmxlbmd0aDtpKyspIHsNCiAgICAgICAgICAgIHZhciBlbCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWxsb3QnKS5jaGlsZE5vZGVzW2ldDQogICAgICAgICAgICBlbC5zdHlsZS5ib3JkZXJUb3AgPSAiIg0KICAgICAgICAgICAgZWwuc3R5bGUuYm9yZGVyQm90dG9tID0gIiINCiAgICAgICAgfQ0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnVVBQRVInKS5zdHlsZS5ib3JkZXJUb3AgPSAibm9uZSINCiAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ0xPV0VSJykuc3R5bGUuYm9yZGVyQm90dG9tID0gIm5vbmUiDQogICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdVUFBFUicpLnN0eWxlLmJvcmRlckJvdHRvbSA9ICJub25lIg0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgnTE9XRVInKS5zdHlsZS5ib3JkZXJUb3AgPSAibm9uZSINCiAgICAgICAgaWYgKGJhbGxvdE5hbWVzLmluZGV4T2YoZGVzdCkgIT0gLTEgJiYgZGVzdCAhPSBzb3VyY2UpIHsNCiAgICAgICAgICAgIGEgPSBiYWxsb3ROYW1lcy5pbmRleE9mKHNvdXJjZSk7DQogICAgICAgICAgICBiID0gYmFsbG90TmFtZXMuaW5kZXhPZihkZXN0KTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgb3ZlcnJpZGUgPSBmYWxzZQ0KICAgICAgICAgICAgaWYgKGEgIT0gLTEgJiYgIW92ZXJyaWRlKSB7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKGEgPiBiKSB7DQogICAgICAgICAgICAgICAgICAgIGFib3ZlID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICAgICBhYm92ZSA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgYi0tOw0KICAgICAgICAgICAgICAgIGlmIChiID09IC0xKSB7DQogICAgICAgICAgICAgICAgICAgIGFib3ZlID0gZmFsc2U7DQogICAgICAgICAgICAgICAgfSBpZiAoYiA9PSBiYWxsb3ROYW1lcy5sZW5ndGgtMSkgew0KICAgICAgICAgICAgICAgICAgICBhYm92ZSA9IGZhbHNlOw0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgIA0KICAgICAgICAgICAgaWYgKCgoYSA9PSAtMSB8fCBhYm92ZSA9PSB0cnVlKSAmJiBvZGVzdCAhPSAiVVBQRVIiKSB8fCBvZGVzdCA9PSAiTE9XRVIiKSB7DQogICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQob2Rlc3QpLnN0eWxlLmJvcmRlclRvcCA9ICIxNnB4IHNvbGlkICMwQUYiOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChvZGVzdCkuc3R5bGUuYm9yZGVyQm90dG9tID0gIjE2cHggc29saWQgIzBBRiI7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQogICAgDQp9DQoNCmZ1bmN0aW9uIGluc2VydEFmdGVyKG5ld05vZGUsIHJlZmVyZW5jZU5vZGUpIHsNCiAgICByZWZlcmVuY2VOb2RlLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKG5ld05vZGUsIHJlZmVyZW5jZU5vZGUubmV4dFNpYmxpbmcpOw0KfQ0KDQpmdW5jdGlvbiBpbnNlcnRCZWZvcmUobmV3Tm9kZSwgcmVmZXJlbmNlTm9kZSkgew0KICAgIHJlZmVyZW5jZU5vZGUucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUobmV3Tm9kZSwgcmVmZXJlbmNlTm9kZSk7DQp9DQoNCmZ1bmN0aW9uIGRyYXdMaXN0KCkgew0KICAgIA0KICAgIA0KICAgIC8vIFJlbW92ZSBkcmFnIGhlbHBlcg0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdjYW5kaWRhdGVzJykuc3R5bGUuYmFja2dyb3VuZCA9ICIiOw0KICAgIA0KICAgIC8vIEZldGNoIGJhbGxvdCBtYXN0ZXIgYW5kIGNsZWFyIGl0DQogICAgdmFyIGJhbGxvdCA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdiYWxsb3QnKQ0KICAgIGJhbGxvdC5pbm5lckhUTUwgPSAiIg0KICAgIHZhciBzID0gMDsNCiAgICANCiAgICAvLyBGb3IgZWFjaCBub21pbmVlLCBkby4uLg0KICAgIGZvciAoaSBpbiBiYWxsb3ROYW1lcykgew0KICAgICAgICBzKys7DQogICAgICAgIHZhciBlbCA9IGJhbGxvdE5hbWVzW2ldOw0KICAgICAgICB2YXIgb3V0ZXIgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdsaScpOw0KICAgICAgICAvLyBTZXQgc3R5bGUNCiAgICAgICAgb3V0ZXIuc2V0QXR0cmlidXRlKCJjbGFzcyIsICJiYWxsb3Rib3giKQ0KICAgICAgICANCiAgICAgICAgdmFyIG5vID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7DQogICAgICAgIG5vLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCAiYmFsbG90TnVtYmVyIikNCiAgICAgICAgbm8uaW5uZXJIVE1MID0gKHMpDQogICAgICAgIA0KICAgICAgICANCiAgICAgICAgLy8gQWJvdmUvYmVsb3cgY3V0YXdheSBsaW5lPyBJZiBzbywgZHJhdyBpdA0KICAgICAgICBpZiAocyA9PSBzZWF0cykgew0KICAgICAgICAgICAgb3V0ZXIuc3R5bGUuYm9yZGVyQm90dG9tID0gIjFweCBzb2xpZCAjQTAwIg0KICAgICAgICB9DQogICAgICAgIGlmIChzID09IHNlYXRzKzEpIHsNCiAgICAgICAgICAgIG91dGVyLnN0eWxlLmJvcmRlclRvcCA9ICIxcHggc29saWQgI0EwMCINCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLy8gJ2dyZXkgb3V0JyBwZW9wbGUgYmVsb3cgY3V0YXdheSBsaW5lDQogICAgICAgIGlmIChzID4gc2VhdHMpIHsNCiAgICAgICAgICAgIG91dGVyLnN0eWxlLm9wYWNpdHkgPSAiMC43NSINCiAgICAgICAgfQ0KICAgICAgICANCiAgICAgICAgLy8gQWRkIGVsZW1lbnQgYW5kIHNldCBkcmFnJ24nZHJvcCArIGRhdGENCiAgICAgICAgdmFyIGlubmVyID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnc3BhbicpDQogICAgICAgIGlubmVyLnN0eWxlLmxlZnQgPSAiMzVweCINCiAgICAgICAgaW5uZXIuc3R5bGUubWF4V2lkdGggPSAiMzAwcHgiDQogICAgICAgIGlubmVyLnN0eWxlLm1heEhlaWdodCA9ICI2MHB4Ig0KICAgICAgICBpbm5lci5zdHlsZS5vdmVyZmxvdyA9ICJoaWRkZW4iDQogICAgICAgIGlubmVyLmlubmVySFRNTCA9IGJhbGxvdENoYXJzW2ldICsgIjogIiArIGVsOw0KICAgICAgICBpbm5lci5zZXRBdHRyaWJ1dGUoIm9uZHJvcCIsICJkcm9wVm90ZShldmVudCwgdHJ1ZSkiKQ0KICAgICAgICBvdXRlci5zZXRBdHRyaWJ1dGUoImlkIiwgZWwpDQogICAgICAgIG91dGVyLnNldEF0dHJpYnV0ZSgiZGF0YSIsIGVsKQ0KICAgICAgICBpbm5lci5zZXRBdHRyaWJ1dGUoImRhdGEiLCBlbCkNCiAgICAgICAgb3V0ZXIuc2V0QXR0cmlidXRlKCJkcmFnZ2FibGUiLCAidHJ1ZSIpDQogICAgICAgIG91dGVyLnNldEF0dHJpYnV0ZSgib25kcmFnc3RhcnQiLCAiZHJhZ1ZvdGUoZXZlbnQpIikNCiAgICAgICAgb3V0ZXIuc2V0QXR0cmlidXRlKCJvbmRyYWdlbnRlciIsICJzaG93TGluZXMoZXZlbnQpIikNCiAgICAgICAgb3V0ZXIuYXBwZW5kQ2hpbGQobm8pDQogICAgICAgIG91dGVyLmFwcGVuZENoaWxkKGlubmVyKQ0KICAgICAgICBvdXRlci5zZXRBdHRyaWJ1dGUoInRpdGxlIiwgIkRyYWcgdG8gbW92ZSAiICArIGVsICsgIiB1cCBvciBkb3duIG9uIHRoZSBsaXN0IikNCiAgICAgICAgb3V0ZXIuc2V0QXR0cmlidXRlKCJvbmRyb3AiLCAiZHJvcFZvdGUoZXZlbnQsIGZhbHNlKSIpDQogICAgICAgIA0KICAgICAgICANCiAgICAgICAgaWYgKGVsID09IHNvdXJjZSkgew0KICAgICAgICAgICAgb3V0ZXIuc3R5bGUub3BhY2l0eSA9ICIwIg0KICAgICAgICB9DQogICAgICAgIA0KICAgICAgICAvLyBBZGQgdG8gYm94DQogICAgICAgIGJhbGxvdC5hcHBlbmRDaGlsZChvdXRlcikNCiAgICB9DQogICAgDQogICAgLy8gRHJvcCB1cHBlciBhbmQgbG93ZXIgZmlsbGVyIGJveGVzLCBzbyBwZW9wbGUgY2FuIGRyYWcgdG8gdGhlIHRvcC9ib3R0b20gb2YgdGhlIGxpc3QgYXMgd2VsbA0KICAgIGlmICghZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoJ1VQUEVSJykpIHsNCiAgICAgICAgdmFyIGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCiAgICAgICAgZC5zZXRBdHRyaWJ1dGUoImNsYXNzIiwgImZpbGxlcmJveCIpDQogICAgICAgIGQuc2V0QXR0cmlidXRlKCJkYXRhIiwgIlVQUEVSIik7DQogICAgICAgIGQuc2V0QXR0cmlidXRlKCJpZCIsICJVUFBFUiIpOw0KICAgICAgICBkLnNldEF0dHJpYnV0ZSgib25kcmFnZW50ZXIiLCAic2hvd0xpbmVzKGV2ZW50KSIpDQogICAgICAgIGQuc2V0QXR0cmlidXRlKCJvbmRyb3AiLCAiZHJvcFZvdGUoZXZlbnQsIGZhbHNlKSIpDQogICAgICAgIGluc2VydEJlZm9yZShkLCBiYWxsb3QpOw0KICAgICAgICANCiAgICAgICAgdmFyIGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKTsNCiAgICAgICAgZC5zZXRBdHRyaWJ1dGUoImNsYXNzIiwgImZpbGxlcmJveCIpDQogICAgICAgIGQuc2V0QXR0cmlidXRlKCJpZCIsICJMT1dFUiIpDQogICAgICAgIGQuc2V0QXR0cmlidXRlKCJkYXRhIiwgIkxPV0VSIik7DQogICAgICAgIGQuc2V0QXR0cmlidXRlKCJvbmRyb3AiLCAiZHJvcFZvdGUoZXZlbnQsIGZhbHNlKSIpDQogICAgICAgIGQuc2V0QXR0cmlidXRlKCJvbmRyYWdlbnRlciIsICJzaG93TGluZXMoZXZlbnQpIikNCiAgICAgICAgaW5zZXJ0QWZ0ZXIoZCwgYmFsbG90KTsNCiAgICB9DQogICAgDQogICAgLy8gQ2xlYXIgYW55IGJhZCBsaW5lcw0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdVUFBFUicpLnN0eWxlLmJvcmRlclRvcCA9ICJub25lIg0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdMT1dFUicpLnN0eWxlLmJvcmRlckJvdHRvbSA9ICJub25lIg0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdVUFBFUicpLnN0eWxlLmJvcmRlckJvdHRvbSA9ICJub25lIg0KICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCdMT1dFUicpLnN0eWxlLmJvcmRlclRvcCA9ICJub25lIg0KICAgIA0KICAgIC8vIFNldCB0aGUgY3VycmVudCBTVFYgb3JkZXINCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndm90ZScpLnN0eWxlLndpZHRoID0gKGNoYXJzX2NvcHkubGVuZ3RoICogOCkrICJweCINCiAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgndm90ZScpLnZhbHVlID0gYmFsbG90Q2hhcnMuam9pbigiIikNCn0NCg0KDQovLyBGYWRlIGluL291dCBtYW5ldXZyZXMNCmZ1bmN0aW9uIGZhZGVPdXQoeCkgew0KICAgIGlmIChzb3VyY2UpIHsNCiAgICAgICAgaWYgKCF4KSB7DQogICAgICAgICAgICB4ID0gMQ0KICAgICAgICB9DQogICAgICAgIGlmIChmYWRpbmcpIHsNCiAgICAgICAgICAgIHJldHVybjsNCiAgICAgICAgfQ0KICAgICAgICB4IC09IDAuMQ0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzb3VyY2UpLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCAiYmFsbG90U2VsZWN0ZWQiKQ0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzb3VyY2UpLnN0eWxlLm9wYWNpdHkgPSBTdHJpbmcoeCkNCiAgICAgICAgaWYgKHggPiAwKSB7DQogICAgICAgICAgICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsgZmFkZU91dCh4KX0sIDIwKQ0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgZHJvcENvbXBsZXRlKCJjYW5kaWRhdGVzIik7DQogICAgICAgIH0NCiAgICB9ICAgDQp9DQoNCnZhciBneiA9IDA7DQpmdW5jdGlvbiBmYWRlSW4oeCwgeSwgeikgew0KICAgIGlmIChzb3VyY2UpIHsNCiAgICAgICAgaWYgKHggPT0gMCkgew0KICAgICAgICAgICAgZ3ogPSB6Ow0KICAgICAgICB9DQogICAgICAgIGlmICh6ICE9IGd6KSB7DQogICAgICAgICAgICByZXR1cm47DQogICAgICAgIH0NCiAgICAgICAgeCArPSAwLjENCiAgICAgICAgaWYgKHggPj0gMSkgew0KICAgICAgICAgICAgeCA9IDENCiAgICAgICAgfQ0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzb3VyY2UpLnN0eWxlLm9wYWNpdHkgPSBTdHJpbmcoeCkNCiAgICAgICAgDQogICAgICAgIA0KICAgICAgICBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChzb3VyY2UpLnNldEF0dHJpYnV0ZSgiY2xhc3MiLCAiYmFsbG90U2VsZWN0ZWQiKQ0KICAgICAgICBpZiAoeCA8IDEpIHsNCiAgICAgICAgICAgIGZhZGluZyA9IHRydWUNCiAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBmYWRlSW4oeCwgeSwgeil9LCAyNSkNCiAgICAgICAgICAgIA0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkge2ZhZGluZyA9IGZhbHNlIH0sIDI1MCkNCiAgICAgICAgICAgIGlmICh5ID09ICJiYWxsb3QiKSB7DQogICAgICAgICAgICAgICAgZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoc291cmNlKS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwgImJhbGxvdGJveCIpDQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgIGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKHNvdXJjZSkuc2V0QXR0cmlidXRlKCJjbGFzcyIsICJiYWxsb3Rib3hfY2xpc3QiKQ0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgfQ0KICAgICAgICAgICAgc291cmNlID0gbnVsbA0KICAgICAgICAgICAgZHJhd0xpc3QoKTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgDQogICAgICAgIH0NCiAgICB9ICAgDQp9DQo=