Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- -- Clarity Twisted Fate 1.7
- --added HPrediction, fixed Q only if stun, improved farm with Q
- --added range target it should be smoother tnx to letstry for suggestion
- assert(load(Base64Decode(
- "DQotLVtbVHdpc3RlZCBGYXRlIGJ5IFRlYW0gQ2xhcml0eV1dDQoNCg0KDQppZiBteUhlcm8uY2hhck5hbWUgfj0gJ1R3aXN0ZWRGYXRlJyB0aGVuIHJldHVybiBlbmQNCg0KYXNzZXJ0KGxvYWQoQmFzZTY0RGVjb2RlKCJHMHgxWVZJQUFRUUVCQWdBR1pNTkNob0tBQUFBQUFBQUFBQUFBUUlLQUFBQUJnQkFBRUZBQUFBZFFBQUJCa0JBQUdVQUFBQUtRQUNCQmtCQUFHVkFBQUFLUUlDQkh3Q0FBQVFBQUFBRUJnQUFBR05zWVhOekFBUU5BQUFBVTJOeWFYQjBVM1JoZEhWekFBUUhBQUFBWDE5cGJtbDBBQVFMQUFBQVUyVnVaRlZ3WkdGMFpRQUNBQUFBQWdBQUFBZ0FBQUFDQUFvdEFBQUFoa0JBQU1hQVFBQUd3VUFBQndGQkFrRkJBUUFkZ1FBQlJzRkFBRWNCd1FLQmdRRUFYWUVBQVliQlFBQ0hBVUVEd2NFQkFKMkJBQUhHd1VBQXh3SEJBd0VDQWdEZGdRQUJCc0pBQUFjQ1FRUkJRZ0lBSFlJQUFSWUJBZ0xkQUFBQm5ZQUFBQXFBQUlBS1FBQ0ZoZ0JEQU1IQUFnQ2RnQUFCQ29DQWhRcUF3NGFHQUVRQXg4QkNBTWZBd3dIZEFJQUFuWUFBQUFxQWdJZU1RRVFBQVlFRUFKMUFnQUdHd0VRQTVRQUFBSjFBQUFFZkFJQUFGQUFBQUFRRkFBQUFhSGRwWkFBRURRQUFBRUpoYzJVMk5FVnVZMjlrWlFBRUNRQUFBSFJ2YzNSeWFXNW5BQVFEQUFBQWIzTUFCQWNBQUFCblpYUmxibllBQkJVQUFBQlFVazlEUlZOVFQxSmZTVVJGVGxSSlJrbEZVZ0FFQ1FBQUFGVlRSVkpPUVUxRkFBUU5BQUFBUTA5TlVGVlVSVkpPUVUxRkFBUVFBQUFBVUZKUFEwVlRVMDlTWDB4RlZrVk1BQVFUQUFBQVVGSlBRMFZUVTA5U1gxSkZWa2xUU1U5T0FBUUVBQUFBUzJWNUFBUUhBQUFBYzI5amEyVjBBQVFJQUFBQWNtVnhkV2x5WlFBRUNnQUFBR2RoYldWVGRHRjBaUUFBQkFRQUFBQjBZM0FBQkFjQUFBQmhjM05sY25RQUJBc0FBQUJUWlc1a1ZYQmtZWFJsQUFNQUFBQUFBQUR3UHdRVUFBQUFRV1JrUW5WbmMzQnNZWFJEWVd4c1ltRmphd0FCQUFBQUNBQUFBQWdBQUFBQUFBTUZBQUFBQlFBQUFBd0FRQUNCUUFBQUhVQ0FBUjhBZ0FBQ0FBQUFCQXNBQUFCVFpXNWtWWEJrWVhSbEFBTUFBQUFBQUFBQVFBQUFBQUFCQUFBQUFRQVFBQUFBUUc5aVpuVnpZMkYwWldRdWJIVmhBQVVBQUFBSUFBQUFDQUFBQUFnQUFBQUlBQUFBQ0FBQUFBQUFBQUFCQUFBQUJRQUFBSE5sYkdZQUFRQUFBQUFBRUFBQUFFQnZZbVoxYzJOaGRHVmtMbXgxWVFBdEFBQUFBd0FBQUFNQUFBQUVBQUFBQkFBQUFBUUFBQUFFQUFBQUJBQUFBQVFBQUFBRUFBQUFCQUFBQUFVQUFBQUZBQUFBQlFBQUFBVUFBQUFGQUFBQUJRQUFBQVVBQUFBRkFBQUFCZ0FBQUFZQUFBQUdBQUFBQmdBQUFBVUFBQUFEQUFBQUF3QUFBQVlBQUFBR0FBQUFCZ0FBQUFZQUFBQUdBQUFBQmdBQUFBWUFBQUFIQUFBQUJ3QUFBQWNBQUFBSEFBQUFCd0FBQUFjQUFBQUhBQUFBQndBQUFBY0FBQUFJQUFBQUNBQUFBQWdBQUFBSUFBQUFBZ0FBQUFVQUFBQnpaV3htQUFBQUFBQXRBQUFBQWdBQUFHRUFBQUFBQUMwQUFBQUJBQUFBQlFBQUFGOUZUbFlBQ1FBQUFBNEFBQUFDQUEwWEFBQUFod0JBQUl4QVFBRUJnUUFBUWNFQUFKMUFBQUtIQUVBQWpBQkJBUUZCQVFCSGdVRUFnY0VCQU1jQlFnQUJ3Z0VBUUFLQUFJSENBUURHUWtJQXg0TENCUUhEQWdBV0FRTUNuVUNBQVljQVFBQ01BRU1CblVBQUFSOEFnQUFOQUFBQUJBUUFBQUIwWTNBQUJBZ0FBQUJqYjI1dVpXTjBBQVFSQUFBQWMyTnlhWEIwYzNSaGRIVnpMbTVsZEFBREFBQUFBQUFBVkVBRUJRQUFBSE5sYm1RQUJBc0FBQUJIUlZRZ0wzTjVibU10QUFRRUFBQUFTMlY1QUFRQ0FBQUFMUUFFQlFBQUFHaDNhV1FBQkFjQUFBQnRlVWhsY204QUJBa0FBQUJqYUdGeVRtRnRaUUFFSmdBQUFDQklWRlJRTHpFdU1BMEtTRzl6ZERvZ2MyTnlhWEIwYzNSaGRIVnpMbTVsZEEwS0RRb0FCQVlBQUFCamJHOXpaUUFBQUFBQUFRQUFBQUFBRUFBQUFFQnZZbVoxYzJOaGRHVmtMbXgxWVFBWEFBQUFDZ0FBQUFvQUFBQUtBQUFBQ2dBQUFBb0FBQUFMQUFBQUN3QUFBQXNBQUFBTEFBQUFEQUFBQUF3QUFBQU5BQUFBRFFBQUFBMEFBQUFPQUFBQURnQUFBQTRBQUFBT0FBQUFDd0FBQUE0QUFBQU9BQUFBRGdBQUFBNEFBQUFDQUFBQUJRQUFBSE5sYkdZQUFBQUFBQmNBQUFBQ0FBQUFZUUFBQUFBQUZ3QUFBQUVBQUFBRkFBQUFYMFZPVmdBQkFBQUFBUUFRQUFBQVFHOWlablZ6WTJGMFpXUXViSFZoQUFvQUFBQUJBQUFBQVFBQUFBRUFBQUFDQUFBQUNBQUFBQUlBQUFBSkFBQUFEZ0FBQUFrQUFBQU9BQUFBQUFBQUFBRUFBQUFGQUFBQVgwVk9WZ0E9IiksIG5pbCwgImJ0IiwgX0VOVikpKCkgU2NyaXB0U3RhdHVzKCJUR0pJRk1GS0dNTiIpIA0KDQotLWRyYXdzIFErVyBlbmVteSBIUGJhcg0KLS1sYWcgZnJlZSBjaXJjbGVzDQotLWRyYXdzIGFuZCBhbGVydCB1IGlmIHNvbWVvbmUgaXMgZ2Fua2FibGUNCi0tY29tYm8gbG9naWMgDQotLWNoYW5nZSBjYXJkIGZyb20gcmVkIHRvIGJsdWUgaWYgbG93IG1hbmEgaW4gZmFybSBtb2RlDQotLWF1dG8gZ29sZCBjYXJkIHdoZW4gdWxkDQotLWtzIHdpdGggcSBhbmQgdw0KLS1SIHJhbmdlIGluIHRoZSBtaW5pIG1hcA0KDQotLVNQcmVkaWN0aW9uIGFuZCBmaXhlZCBxIG9ubHkgaWYgc3R1biBhbmQgY2hhbmdlZCBpbiB0b2dnbGUNCg0KcmVxdWlyZSAiU3hPcmJXYWxrIg0KcmVxdWlyZSAiVlByZWRpY3Rpb24iDQpyZXF1aXJlICJIUHJlZGljdGlvbiINCg0KbG9jYWwgQUEgPSBBYQ0KbG9jYWwgUSA9IHtyYW5nZSA9IDEyMDAsIGRlbGF5ID0gMC4yNSwgc3BlZWQgPSAxNTAwLCB3aWR0aCA9IDgwLElzUmVhZHkgPSBmdW5jdGlvbigpIHJldHVybiBteUhlcm86Q2FuVXNlU3BlbGwoX1EpID09IFJFQURZIGVuZH0NCmxvY2FsIFcgPSB7cmFuZ2UgPSA1MjUsIGRlbGF5ID0gMC4yNSwgc3BlZWQgPSBtYXRoLmh1Z2UsIHdpZHRoID0gMjAwLElzUmVhZHkgPSBmdW5jdGlvbigpIHJldHVybiBteUhlcm86Q2FuVXNlU3BlbGwoX1cpID09IFJFQURZIGVuZH0NCmxvY2FsIEUgPSB7cmFuZ2UgPSA2NTAsIElzUmVhZHkgPSBmdW5jdGlvbigpIHJldHVybiBteUhlcm86Q2FuVXNlU3BlbGwoX0UpID09IFJFQURZIGVuZH0NCmxvY2FsIFIgPSB7cmFuZ2UgPSA1NTAwLCBJc1JlYWR5ID0gZnVuY3Rpb24oKSByZXR1cm4gbXlIZXJvOkNhblVzZVNwZWxsKF9SKSA9PSBSRUFEWSBlbmR9DQpsb2NhbCBpZ25pdGUgPSBuaWwNCmxvY2FsIGlEbWcgPSAwDQpsb2NhbCBpbmZvcm1hdGlvblRhYmxlID0ge30NCmxvY2FsIHNwZWxsRXhwaXJlZCA9IHRydWUNCmxvY2FsIEFudGlTcGFtID0gMA0KbG9jYWwgVWx0UGVyYyA9IDAuMw0KbG9jYWwgdHMNCmxvY2FsIHRzID0gVGFyZ2V0U2VsZWN0b3IoVEFSR0VUX0xFU1NfQ0FTVF9QUklPUklUWSwgMTMwMCwgREFNQUdFX01BR0lDLCB0cnVlKQ0KbG9jYWwgbXlUYXJnZXQgPSBuaWwNCmxvY2FsIEtpbGxhYmxlID0gZmFsc2UNCmxvY2FsIExhc3RBbGVydCA9IDANCmxvY2FsIEhQcmVkID0gSFByZWRpY3Rpb24oKQ0KDQoNCmxvY2FsIFRvSW50ZXJydXB0ID0ge30NCmxvY2FsIEludGVycnVwdExpc3QgPSB7DQogICAgeyBjaGFyTmFtZSA9ICJDYWl0bHluIiwgc3BlbGxOYW1lID0gIkNhaXRseW5BY2VpbnRoZUhvbGUifSwNCiAgICB7IGNoYXJOYW1lID0gIkZpZGRsZVN0aWNrcyIsIHNwZWxsTmFtZSA9ICJDcm93c3Rvcm0ifSwNCiAgICB7IGNoYXJOYW1lID0gIkZpZGRsZVN0aWNrcyIsIHNwZWxsTmFtZSA9ICJEcmFpbkNoYW5uZWwifSwNCiAgICB7IGNoYXJOYW1lID0gIkdhbGlvIiwgc3BlbGxOYW1lID0gIkdhbGlvSWRvbE9mRHVyYW5kIn0sDQogICAgeyBjaGFyTmFtZSA9ICJLYXJ0aHVzIiwgc3BlbGxOYW1lID0gIkZhbGxlbk9uZSJ9LA0KICAgIHsgY2hhck5hbWUgPSAiS2F0YXJpbmEiLCBzcGVsbE5hbWUgPSAiS2F0YXJpbmFSIn0sDQogICAgeyBjaGFyTmFtZSA9ICJMdWNpYW4iLCBzcGVsbE5hbWUgPSAiTHVjaWFuUiJ9LA0KICAgIHsgY2hhck5hbWUgPSAiTWFsemFoYXIiLCBzcGVsbE5hbWUgPSAiQWxaYWhhck5ldGhlckdyYXNwIn0sDQogICAgeyBjaGFyTmFtZSA9ICJNaXNzRm9ydHVuZSIsIHNwZWxsTmFtZSA9ICJNaXNzRm9ydHVuZUJ1bGxldFRpbWUifSwNCiAgICB7IGNoYXJOYW1lID0gIk51bnUiLCBzcGVsbE5hbWUgPSAiQWJzb2x1dGVaZXJvIn0sICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgIHsgY2hhck5hbWUgPSAiUGFudGhlb24iLCBzcGVsbE5hbWUgPSAiUGFudGhlb25fR3JhbmRTa3lmYWxsX0p1bXAifSwNCiAgICB7IGNoYXJOYW1lID0gIlNoZW4iLCBzcGVsbE5hbWUgPSAiU2hlblN0YW5kVW5pdGVkIn0sDQogICAgeyBjaGFyTmFtZSA9ICJVcmdvdCIsIHNwZWxsTmFtZSA9ICJVcmdvdFN3YXAyIn0sDQogICAgeyBjaGFyTmFtZSA9ICJWYXJ1cyIsIHNwZWxsTmFtZSA9ICJWYXJ1c1EifSwNCgl7IGNoYXJOYW1lID0gIldhcndpY2siLCBzcGVsbE5hbWUgPSAiSW5maW5pdGVEdXJlc3MifSwNCgl7IGNoYXJOYW1lID0gIlZlbGtveiIsIHNwZWxsTmFtZSA9ICJWZWxrb3pSIn0NCn0NCg0KDQoNClRleHRMaXN0ID0geyIiLCAiRGVhZCBNYW4gV2Fsa2luZyEifQ0KS2lsbFRleHQgPSB7fQ0KY29sb3JUZXh0ID0gQVJHQigyNTUsMjU1LDIwNCwwKQ0KDQoNCmZ1bmN0aW9uIEdldEN1c3RvbVRhcmdldCgpDQoJdHM6dXBkYXRlKCkNCglpZiBfRy5BdXRvQ2FycnkgYW5kIFZhbGlkVGFyZ2V0KF9HLkF1dG9DYXJyeS5Dcm9zc2hhaXI6R2V0VGFyZ2V0KCkpIHRoZW4gcmV0dXJuIF9HLkF1dG9DYXJyeS5Dcm9zc2hhaXI6R2V0VGFyZ2V0KCkgZW5kDQoJaWYgbm90IF9HLlJlYm9ybl9Mb2FkZWQgdGhlbiByZXR1cm4gdHMudGFyZ2V0IGVuZA0KCXJldHVybiB0cy50YXJnZXQNCmVuZA0KDQpmdW5jdGlvbiBPbkxvYWQoKQ0KCVByaW50Q2hhdCgiPGZvbnQgY29sb3I9XCIjMDBGRjAwXCI+VHdpc3RlZCBGYXRlIGJ5IFRlYW0gQ2xhcml0eS48L2ZvbnQ+IikNCglJdGVtTmFtZXMJCQkJPSB7DQoJCVszMzAzXQkJCQk9ICJBcmNoQW5nZWxzRHVtbXlTcGVsbCIsDQoJCVszMDA3XQkJCQk9ICJBcmNoQW5nZWxzRHVtbXlTcGVsbCIsDQoJCVszMTQ0XQkJCQk9ICJCaWxnZXdhdGVyQ3V0bGFzcyIsDQoJCVszMTg4XQkJCQk9ICJJdGVtQmxhY2tmaXJlVG9yY2giLA0KCQlbMzE1M10JCQkJPSAiSXRlbVN3b3JkT2ZGZWFzdEFuZEZhbWluZSIsDQoJCVszNDA1XQkJCQk9ICJUcmlua2V0U3dlZXBlckx2bDEiLA0KCQlbMzQxMV0JCQkJPSAiVHJpbmtldE9yYkx2bDEiLA0KCQlbMzE2Nl0JCQkJPSAiVHJpbmtldFRvdGVtTHZsMSIsDQoJCVszNDUwXQkJCQk9ICJPZGluVHJpbmtldFJldml2ZSIsDQoJCVsyMDQxXQkJCQk9ICJJdGVtQ3J5c3RhbEZsYXNrIiwNCgkJWzIwNTRdCQkJCT0gIkl0ZW1LaW5nUG9yb1NuYWNrIiwNCgkJWzIxMzhdCQkJCT0gIkVsaXhpck9mSXJvbiIsDQoJCVsyMTM3XQkJCQk9ICJFbGl4aXJPZlJ1aW4iLA0KCQlbMjEzOV0JCQkJPSAiRWxpeGlyT2ZTb3JjZXJ5IiwNCgkJWzIxNDBdCQkJCT0gIkVsaXhpck9mV3JhdGgiLA0KCQlbMzE4NF0JCQkJPSAiT2RpbkVudHJvcGljQ2xheW1vcmUiLA0KCQlbMjA1MF0JCQkJPSAiSXRlbU1pbmlXYXJkIiwNCgkJWzM0MDFdCQkJCT0gIkhlYWx0aEJvbWIiLA0KCQlbMzM2M10JCQkJPSAiVHJpbmtldE9yYkx2bDMiLA0KCQlbMzA5Ml0JCQkJPSAiSXRlbUdsYWNpYWxTcGlrZUNhc3QiLA0KCQlbMzQ2MF0JCQkJPSAiQXNjV2FycCIsDQoJCVszMzYxXQkJCQk9ICJUcmlua2V0VG90ZW1MdmwzIiwNCgkJWzMzNjJdCQkJCT0gIlRyaW5rZXRUb3RlbUx2bDQiLA0KCQlbMzE1OV0JCQkJPSAiSGV4dGVjaFN3ZWVwZXIiLA0KCQlbMjA1MV0JCQkJPSAiSXRlbUhvcm4iLA0KCQktLVsyMDAzXQkJCT0gIlJlZ2VuZXJhdGlvblBvdGlvbiIsDQoJCVszMTQ2XQkJCQk9ICJIZXh0ZWNoR3VuYmxhZGUiLA0KCQlbMzE4N10JCQkJPSAiSGV4dGVjaFN3ZWVwZXIiLA0KCQlbMzE5MF0JCQkJPSAiSXJvblN0eWx1cyIsDQoJCVsyMDA0XQkJCQk9ICJGbGFza09mQ3J5c3RhbFdhdGVyIiwNCgkJWzMxMzldCQkJCT0gIkl0ZW1NZXJjdXJpYWwiLA0KCQlbMzIyMl0JCQkJPSAiSXRlbU1vcmVsbG9zQmFuZSIsDQoJCVszMDQyXQkJCQk9ICJNdXJhbWFuYSIsDQoJCVszMDQzXQkJCQk9ICJNdXJhbWFuYSIsDQoJCVszMTgwXQkJCQk9ICJPZHluc1ZlaWwiLA0KCQlbMzA1Nl0JCQkJPSAiSXRlbUZhaXRoU2hha2VyIiwNCgkJWzIwNDddCQkJCT0gIk9yYWNsZUV4dHJhY3RTaWdodCIsDQoJCVszMzY0XQkJCQk9ICJUcmlua2V0U3dlZXBlckx2bDMiLA0KCQlbMjA1Ml0JCQkJPSAiSXRlbVBvcm9TbmFjayIsDQoJCVszMTQwXQkJCQk9ICJRdWlja3NpbHZlclNhc2giLA0KCQlbMzE0M10JCQkJPSAiUmFuZHVpbnNPbWVuIiwNCgkJWzMwNzRdCQkJCT0gIkl0ZW1UaWFtYXRDbGVhdmUiLA0KCQlbMzgwMF0JCQkJPSAiSXRlbVJpZ2h0ZW91c0dsb3J5IiwNCgkJWzIwNDVdCQkJCT0gIkl0ZW1HaG9zdFdhcmQiLA0KCQlbMzM0Ml0JCQkJPSAiVHJpbmtldE9yYkx2bDEiLA0KCQlbMzA0MF0JCQkJPSAiSXRlbVNlcmFwaHNFbWJyYWNlIiwNCgkJWzMwNDhdCQkJCT0gIkl0ZW1TZXJhcGhzRW1icmFjZSIsDQoJCVsyMDQ5XQkJCQk9ICJJdGVtR2hvc3RXYXJkIiwNCgkJWzMzNDVdCQkJCT0gIk9kaW5Ucmlua2V0UmV2aXZlIiwNCgkJWzIwNDRdCQkJCT0gIlNpZ2h0V2FyZCIsDQoJCVszMzQxXQkJCQk9ICJUcmlua2V0U3dlZXBlckx2bDEiLA0KCQlbMzA2OV0JCQkJPSAic2h1cmVseWFzY3Jlc3QiLA0KCQlbMzU5OV0JCQkJPSAiS2FsaXN0YVBTcGVsbENhc3QiLA0KCQlbMzE4NV0JCQkJPSAiSGV4dGVjaFN3ZWVwZXIiLA0KCQlbMzA3N10JCQkJPSAiSXRlbVRpYW1hdENsZWF2ZSIsDQoJCVsyMDA5XQkJCQk9ICJJdGVtTWluaVJlZ2VuUG90aW9uIiwNCgkJWzIwMTBdCQkJCT0gIkl0ZW1NaW5pUmVnZW5Qb3Rpb24iLA0KCQlbMzAyM10JCQkJPSAiSXRlbVdyYWl0aENvbGxhciIsDQoJCVszMjkwXQkJCQk9ICJJdGVtV3JhaXRoQ29sbGFyIiwNCgkJWzIwNDNdCQkJCT0gIlZpc2lvbldhcmQiLA0KCQlbMzM0MF0JCQkJPSAiVHJpbmtldFRvdGVtTHZsMSIsDQoJCVszMDkwXQkJCQk9ICJaaG9ueWFzSG91cmdsYXNzIiwNCgkJWzMxNTRdCQkJCT0gIndyaWdnbGVsYW50ZXJuIiwNCgkJWzMxNDJdCQkJCT0gIllvdW11c0JsYWRlIiwNCgkJWzMxNTddCQkJCT0gIlpob255YXNIb3VyZ2xhc3MiLA0KCQlbMzUxMl0JCQkJPSAiSXRlbVZvaWRHYXRlIiwNCgkJWzMxMzFdCQkJCT0gIkl0ZW1Tb1REIiwNCgkJWzMxMzddCQkJCT0gIkl0ZW1EZXJ2aXNoQmxhZGUiLA0KCQlbMzM1Ml0JCQkJPSAiUmVsaWNTcG90dGVyIiwNCgkJWzMzNTBdCQkJCT0gIlRyaW5rZXRUb3RlbUx2bDIiLA0KCX0NCglfRy5JVEVNXzEJCQkJPSAwNg0KCV9HLklURU1fMgkJCQk9IDA3DQoJX0cuSVRFTV8zCQkJCT0gMDgNCglfRy5JVEVNXzQJCQkJPSAwOQ0KCV9HLklURU1fNQkJCQk9IDEwDQoJX0cuSVRFTV82CQkJCT0gMTENCglfRy5JVEVNXzcJCQkJPSAxMg0KCQ0KCV9fX0dldEludmVudG9yeVNsb3RJdGVtCT0gcmF3Z2V0KF9HLCAiR2V0SW52ZW50b3J5U2xvdEl0ZW0iKQ0KCV9HLkdldEludmVudG9yeVNsb3RJdGVtCT0gR2V0U2xvdEl0ZW0NCgkNCgkNCgktLVNQLlNwZWxsRGF0YVtfUV0gPSB7IHNwZWVkID0gMTM1MCwgZGVsYXkgPSAwLjI1LCByYW5nZSA9IDEyMDAsIHdpZHRoID0gODUsIGNvbGxpc2lvbiA9IGZhbHNlLCBhb2UgPSB0cnVlLCB0eXBlID0gImxpbmVhciJ9DQoJSFBfUSA9IEhQU2tpbGxzaG90KHtjb2xsaXNpb25NID0gZmFsc2UsIGNvbGxpc2lvbkggPSBmYWxzZSwgZGVsYXkgPSAwLjI1LCByYW5nZSA9IDEyMDAsIHNwZWVkID0gMTM1MCwgdHlwZSA9ICJEZWxheUxpbmUiLCB3aWR0aCA9IDg1fSkNCgkNCgljaGVja0Rpc3RhbmNlID0gMzAwMCAqIDMwMDANCglJZ25pdGVDaGVjaygpDQoJRkxvYWRMaWIoKQ0KCVZQID0gVlByZWRpY3Rpb24odHJ1ZSkgICANCiAgICBfRy5vbGREcmF3Q2lyY2xlID0gcmF3Z2V0KF9HLCAnRHJhd0NpcmNsZScpDQoJX0cuRHJhd0NpcmNsZSA9IERyYXdDaXJjbGUyDQoJDQoJTWluaW9ucyA9IG1pbmlvbk1hbmFnZXIoTUlOSU9OX0VORU1ZLCBRLnJhbmdlLCBteUhlcm8sIE1JTklPTl9TT1JUX01BWEhFQUxUSF9BU0MpDQoJSnVuZ2xlTWluaW9ucyA9IG1pbmlvbk1hbmFnZXIoTUlOSU9OX0pVTkdMRSwgUS5yYW5nZSwgbXlIZXJvLCBNSU5JT05fU09SVF9NQVhIRUFMVEhfREVDKQ0KZW5kDQoNCmZ1bmN0aW9uIE9uVGljaygpDQoJdGFyZ2V0ID0gR2V0Q3VzdG9tVGFyZ2V0KCkNCglDaGVja3MoKQ0KCQ0KCQ0KLS1bWyBpZiAoU3hPcmIpIHRoZW4NCiAgICBpZiBIYXpNZW51LkNvbWJvLmRpc2FibGVBQSB0aGVuDQoJICAgIGlmIEhhek1lbnUuY29tYm9rZXkgdGhlbg0KICAgICAgICAgICBTeE9yYjpEaXNhYmxlQXR0YWNrcygpDQogDQogICAgICAgIGVsc2VpZiAoX0cuQXV0b0NhcnJ5IGFuZCBfRy5BdXRvQ2FycnkuTXlIZXJvKSB0aGVuDQogICAgICAgICAgX0cuQXV0b0NhcnJ5Lk15SGVybzpBdHRhY2tzRW5hYmxlZChmYWxzZSkNCiAgICAgICAgZW5kDQoJZW5kDQplbmRdXQ0KCSAgDQogICANCmVuZA0KDQpmdW5jdGlvbiBPbkRyYXcoKQ0KCWlmIEhhek1lbnUuRHJhdy5kcmF3cSB0aGVuDQoJCURyYXdDaXJjbGUobXlIZXJvLngsbXlIZXJvLnksbXlIZXJvLnosMTQwMCwweEZGRkYwMDAwKQ0KCWVuZCAJCQkNCglpZiBIYXpNZW51LkRyYXcuZHJhd3cgdGhlbg0KCQlEcmF3Q2lyY2xlKG15SGVyby54LG15SGVyby55LG15SGVyby56LDU5MCwweEZGRkYwMDAwKQ0KCWVuZA0KCWlmIEhhek1lbnUuRHJhdy5kcmF3ciB0aGVuDQoJCURyYXdDaXJjbGVNaW5pbWFwKG15SGVyby54LG15SGVyby55LG15SGVyby56LDU1MDApDQoJZW5kDQoJDQoJaWYgIEhhek1lbnUuRHJhdy5kcmF3SFAgdGhlbg0KCQkJZm9yIGksIGVuZW15IGluIGlwYWlycyhHZXRFbmVteUhlcm9lcygpKSBkbw0KICAgICAgIAkJCWlmIFZhbGlkVGFyZ2V0KGVuZW15KSB0aGVuDQoJCQkgICAgICAgRHJhd0luZGljYXRvcihlbmVteSkNCgkJCSAgICBlbmQNCgkgICAgICAgIGVuZA0KCWVuZAkJDQoJDQoJaWYgSGF6TWVudS5NaXNjLmtpbGx0ZXh0IHRoZW4NCgkJZm9yIGkgPSAxLCBoZXJvTWFuYWdlci5pQ291bnQgZG8NCgkJCWxvY2FsIHRhcmdldCA9IGhlcm9NYW5hZ2VyOkdldEhlcm8oaSkNCgkJCWlmIFZhbGlkVGFyZ2V0KHRhcmdldCkgYW5kIHRhcmdldCB+PSBuaWwgdGhlbg0KCQkJICAgIGlmIFIuSXNSZWFkeSgpIGFuZCBHZXREaXN0YW5jZSh0YXJnZXQsIG15SGVybykgPD0gNTUwMCB0aGVuDQoJCQkJbG9jYWwgYmFyUG9zID0gV29ybGRUb1NjcmVlbihEM0RYVkVDVE9SMyhteUhlcm8ueCwgbXlIZXJvLnksIG15SGVyby56KSkNCgkJCQlsb2NhbCBQb3NYID0gYmFyUG9zLnggLSAzNQ0KCQkJCWxvY2FsIFBvc1kgPSBiYXJQb3MueSAtIDEwDQoJCQkJDQoJCQkJRHJhd1RleHQoVGV4dExpc3RbS2lsbFRleHRbaV1dLCAyNSwgUG9zWCwgUG9zWSwgY29sb3JUZXh0KQ0KCQkJICAgIGVuZA0KCQkJICAgIGlmIFIuSXNSZWFkeSgpIGFuZCBHZXREaXN0YW5jZSh0YXJnZXQsIG15SGVybykgPD0gNzUwMCB0aGVuDQoJCQkJbG9jYWwgYmFyUG9zID0gV29ybGRUb1NjcmVlbihEM0RYVkVDVE9SMyh0YXJnZXQueCwgdGFyZ2V0LnksIHRhcmdldC56KSkNCgkJCQlsb2NhbCBQb3NYID0gYmFyUG9zLnggLSAzNQ0KCQkJCWxvY2FsIFBvc1kgPSBiYXJQb3MueSAtIDEwDQoJCQkJDQoJCQkJRHJhd1RleHQoVGV4dExpc3RbS2lsbFRleHRbaV1dLCAyMCwgUG9zWCwgUG9zWSwgY29sb3JUZXh0KQ0KCQkJICAgIGVuZA0KCQkJZW5kDQoJCWVuZA0KCWVuZCAgIA0KZW5kDQoNCg0KZnVuY3Rpb24gQ2hlY2tzKCkNCglJUkVBRFkgPSAoaWduaXRlIH49IG5pbCBhbmQgbXlIZXJvOkNhblVzZVNwZWxsKGlnbml0ZSkgPT0gUkVBRFkpDQoJUVJFQURZID0gKG15SGVybzpDYW5Vc2VTcGVsbChfUSkgPT0gUkVBRFkpDQoJV1JFQURZID0gKG15SGVybzpDYW5Vc2VTcGVsbChfVykgPT0gUkVBRFkpDQoJRVJFQURZID0gKG15SGVybzpDYW5Vc2VTcGVsbChfRSkgPT0gUkVBRFkpDQoJUlJFQURZID0gKG15SGVybzpDYW5Vc2VTcGVsbChfUikgPT0gUkVBRFkpDQoJY2FsY0RtZygpDQoJTEZDZnVuYygpDQoJU3BlbGxFeHBpcmVkKCkNCgkNCglpZiBWYWxpZFRhcmdldCh0YXJnZXQpIHRoZW4NCgkJaWYgSGF6TWVudS5NaXNjLktTIHRoZW4gS1ModGFyZ2V0KSBlbmQNCgkJaWYgSGF6TWVudS5NaXNjLklnbml0ZSB0aGVuIEF1dG9JZ25pdGUodGFyZ2V0KSBlbmQNCgkgICAgaWYgSGF6TWVudS5Db21iby5jb21ib1IgdGhlbiBLUyh0YXJnZXQpIGVuZA0KCSAgIA0KCWVuZA0KCQ0KCWlmIEhhek1lbnUuTWlzYy56aG9ueWEgdGhlbiANCiAgICBaaG9ueWEoKQ0KICAgIGVuZAkNCglpZiBIYXpNZW51LkZhcm0uTWFuYSB0aGVuIGVuZA0KCWlmIEhhek1lbnUuSGFyYXNzLk1hbmEgdGhlbiBlbmQNCglpZiBIYXpNZW51LmNvbWJva2V5IHRoZW4NCgkJQ29tYm8oKQ0KICAgIGVuZA0KCQ0KICAgaWYgSGF6TWVudS5oYXJhc3NrZXkgdGhlbg0KCQlQb2tlKCkNCiAgIGVuZA0KICAgaWYgSGF6TWVudS5mYXJta2V5IHRoZW4NCgkJRmFybSgpDQogICBlbmQNCiAgICBpZiBIYXpNZW51LktleXMuZ29sZGNhcmQgYW5kIG5vdCBIYXpNZW51LktleXMucmVkY2FyZCBhbmQgbm90IEhhek1lbnUuS2V5cy5ibHVlY2FyZCB0aGVuDQogICAgICAgIGNhc3RXZygpCQkNCgllbHNlaWYgSGF6TWVudS5LZXlzLnJlZGNhcmQgYW5kIG5vdCBIYXpNZW51LktleXMuZ29sZGNhcmQgYW5kIG5vdCBIYXpNZW51LktleXMuYmx1ZWNhcmQgdGhlbg0KCSAgICBjYXN0V3JlZCgpDQoJZWxzZWlmIEhhek1lbnUuS2V5cy5ibHVlY2FyZCBhbmQgbm90IEhhek1lbnUuS2V5cy5nb2xkY2FyZCBhbmQgbm90IEhhek1lbnUuS2V5cy5yZWRjYXJkIHRoZW4JDQoJICAgIGNhc3RXYmx1ZWZhcm0oKQ0KCWVuZAkNCiAgICAtLWlmIEhhek1lbnUucmVkY2FyZCB0aGVuDQoJICAgIC0tY2FzdFdyZWQoKQ0KCS0tZW5kDQogICAgLS1pZiBIYXpNZW51LmJsdWVjYXJkIHRoZW4NCiAgICAgICAgLS1jYXN0V2JsdWVmYXJtKCkNCiAgICAtLWVuZAkJDQplbmQNCg0KZnVuY3Rpb24gSWduaXRlQ2hlY2soKQ0KCWlmIG15SGVybzpHZXRTcGVsbERhdGEoU1VNTU9ORVJfMSkubmFtZTpmaW5kKCJzdW1tb25lcmRvdCIpIHRoZW4NCgkJaWduaXRlID0gU1VNTU9ORVJfMQ0KCWVsc2VpZiBteUhlcm86R2V0U3BlbGxEYXRhKFNVTU1PTkVSXzIpLm5hbWU6ZmluZCgic3VtbW9uZXJkb3QiKSB0aGVuDQoJCWlnbml0ZSA9IFNVTU1PTkVSXzINCgllbmQNCmVuZA0KDQpmdW5jdGlvbiBGTG9hZExpYigpDQoJRk1lbnUoKQ0KZW5kDQoNCmZ1bmN0aW9uIEZNZW51KCkNCglIYXpNZW51ID0gc2NyaXB0Q29uZmlnKCJDbGFyaXR5IFR3aXN0ZWQgRmF0ZSIsICJUd2lzdGVkIEZhdGUiKQ0KCQlIYXpNZW51OmFkZFBhcmFtKCJjb21ib2tleSIsICJDb21ibyBrZXkoU3BhY2UpIiwgU0NSSVBUX1BBUkFNX09OS0VZRE9XTiwgZmFsc2UsIDMyKQ0KCQlIYXpNZW51OmFkZFBhcmFtKCJoYXJhc3NrZXkiLCAiSGFyYXNzIGtleShDKSIsIFNDUklQVF9QQVJBTV9PTktFWURPV04sIGZhbHNlLCBzdHJpbmcuYnl0ZSgiQyIpKQ0KCQlIYXpNZW51OmFkZFBhcmFtKCJmYXJta2V5IiwgIkZhcm0ga2V5KFYpIiwgU0NSSVBUX1BBUkFNX09OS0VZRE9XTiwgZmFsc2UsIHN0cmluZy5ieXRlKCJWIikpDQoJICAgIA0KCSAgICANCgkJIA0KCQ0KCUhhek1lbnU6YWRkVFModHMpDQoJCQ0KCUhhek1lbnU6YWRkU3ViTWVudSgiQ29tYm8iLCAiQ29tYm8iKQ0KCQlIYXpNZW51LkNvbWJvOmFkZFBhcmFtKCJjb21ib1EiLCAiVXNlIFEiLCBTQ1JJUFRfUEFSQU1fT05PRkYsIHRydWUpDQoJCUhhek1lbnUuQ29tYm86YWRkUGFyYW0oImNvbWJvVyIsICJVc2UgVyIsIFNDUklQVF9QQVJBTV9PTk9GRiwgdHJ1ZSkNCgkJSGF6TWVudS5Db21ibzphZGRQYXJhbSgiY29tYm9SIiwgIkF1dG8gR29sZCBjYXJkIG9uIFIiLCBTQ1JJUFRfUEFSQU1fT05PRkYsIHRydWUpDQoJCUhhek1lbnUuQ29tYm86YWRkUGFyYW0oInN0dW5RIiwgIlVzZSBRIG9ubHkgaWYgc3R1biIsIFNDUklQVF9QQVJBTV9PTktFWVRPR0dMRSwgdHJ1ZSwgc3RyaW5nLmJ5dGUoIkoiKSkNCgkJLS1IYXpNZW51LkNvbWJvOmFkZFBhcmFtKCJkaXNhYmxlQUEiLCAiRGlzYWJsZSBBQSBpbiBDb21ibyIsIFNDUklQVF9QQVJBTV9PTk9GRiwgdHJ1ZSkNCgkJDQogICAJSGF6TWVudTphZGRTdWJNZW51KCJIYXJhc3MiLCAiSGFyYXNzIikNCgkJSGF6TWVudS5IYXJhc3M6YWRkUGFyYW0oImhhcmFzc1EiLCAiVXNlIFEiLCBTQ1JJUFRfUEFSQU1fT05PRkYsIHRydWUpCQkNCgkJSGF6TWVudS5IYXJhc3M6YWRkUGFyYW0oImhhcmFzc1ciLCAiVXNlIFciLCBTQ1JJUFRfUEFSQU1fT05PRkYsIHRydWUpDQoJICAgIEhhek1lbnUuSGFyYXNzOmFkZFBhcmFtKCJNYW5hIiwgIk1hbmEgTWFuYWdlciAlIiwgU0NSSVBUX1BBUkFNX1NMSUNFLCA1MCwgMSwgMTAwLCAwKQkNCgkJDQogICAgSGF6TWVudTphZGRTdWJNZW51KCJGYXJtIiwgIkZhcm0iKQ0KCSAgICBIYXpNZW51LkZhcm06YWRkUGFyYW0oImZhcm1RIiwgIlVzZSBRIiwgU0NSSVBUX1BBUkFNX09OT0ZGLCB0cnVlKQ0KCQlIYXpNZW51LkZhcm06YWRkUGFyYW0oImZhcm1XIiwgIlVzZSBXIiwgU0NSSVBUX1BBUkFNX09OT0ZGLCB0cnVlKQ0KCSAgICBIYXpNZW51LkZhcm06YWRkUGFyYW0oIk1hbmEiLCAiTWFuYSBNYW5hZ2VyICUiLCBTQ1JJUFRfUEFSQU1fU0xJQ0UsIDUwLCAxLCAxMDAsIDApDQoJCQ0KCUhhek1lbnU6YWRkU3ViTWVudSgiS2V5cyIsICJLZXlzIikNCgkgICAgSGF6TWVudS5LZXlzOmFkZFBhcmFtKCJnb2xkY2FyZCIsICJQaWNrIGEgR29sZCBDYXJkIChBKSIsIFNDUklQVF9QQVJBTV9PTktFWURPV04sIGZhbHNlLCBzdHJpbmcuYnl0ZSgiQSIpKQ0KCQlIYXpNZW51LktleXM6YWRkUGFyYW0oInJlZGNhcmQiLCAiUGljayBhIFJlZCBDYXJkICg4KSIsIFNDUklQVF9QQVJBTV9PTktFWURPV04sIGZhbHNlLCBzdHJpbmcuYnl0ZSgiOCIpKQ0KCQlIYXpNZW51LktleXM6YWRkUGFyYW0oImJsdWVjYXJkIiwgIlBpY2sgYSBCbHVlIENhcmQgKDkpIiwgU0NSSVBUX1BBUkFNX09OS0VZRE9XTiwgZmFsc2UsIHN0cmluZy5ieXRlKCI5IikpIAkNCgkNCglIYXpNZW51OmFkZFN1Yk1lbnUoIk1pc2MiLCAiTWlzYyIpDQoJICAgIEhhek1lbnUuTWlzYzphZGRQYXJhbSgiUHJlZCIsICJVc2UgSFByZWQiLCBTQ1JJUFRfUEFSQU1fT05PRkYsIGZhbHNlKQ0KCQlIYXpNZW51Lk1pc2M6YWRkUGFyYW0oIktTIiwgIktpbGxTdGVhbCB3aXRoIFEiLCBTQ1JJUFRfUEFSQU1fT05PRkYsIHRydWUpDQoJCUhhek1lbnUuTWlzYzphZGRQYXJhbSgiSWduaXRlIiwgIlVzZSBBdXRvIElnbml0ZSIsIFNDUklQVF9QQVJBTV9PTk9GRiwgdHJ1ZSkNCgkgICAgSGF6TWVudS5NaXNjOmFkZFBhcmFtKCJraWxsdGV4dCIsICJEcmF3IHdobyB0byBnYW5rIiwgU0NSSVBUX1BBUkFNX09OT0ZGLCB0cnVlKQ0KCQlIYXpNZW51Lk1pc2M6YWRkUGFyYW0oInpob255YSIsICJBdXRvIFpob255YXMiLCBTQ1JJUFRfUEFSQU1fT05PRkYsIHRydWUpDQoJICAgIEhhek1lbnUuTWlzYzphZGRQYXJhbSgiemhvbnlhSFAiLCAiVXNlIFpob255YXMgYXQgJSBoZWFsdGgiLCBTQ1JJUFRfUEFSQU1fU0xJQ0UsIDIwLCAwLCAxMDAgLCAwKQ0KCQlIYXpNZW51Lk1pc2M6YWRkUGFyYW0oIkFtb3VudCIsICJaaG9ueWEgaWYgeCBFbmVtaWVzIiwgU0NSSVBUX1BBUkFNX1NMSUNFLCAxLCAwLCA1LCAwKQ0KCQkNCglIYXpNZW51OmFkZFN1Yk1lbnUoIkRyYXciLCJEcmF3IikNCgkgIEhhek1lbnUuRHJhdzphZGRQYXJhbSgiZHJhd3EiLCAiRHJhdyBRIiwgU0NSSVBUX1BBUkFNX09OT0ZGLCB0cnVlKQ0KCSAgSGF6TWVudS5EcmF3OmFkZFBhcmFtKCJkcmF3dyIsICJEcmF3IFciLCBTQ1JJUFRfUEFSQU1fT05PRkYsIHRydWUpDQoJICBIYXpNZW51LkRyYXc6YWRkUGFyYW0oImRyYXdyIiwgIkRyYXcgUiIsIFNDUklQVF9QQVJBTV9PTk9GRiwgdHJ1ZSkNCgkgIEhhek1lbnUuRHJhdzphZGRQYXJhbSgiZHJhd0hQIiwgIkRyYXcgRG1nIG9uIEhQQmFyIiwgU0NSSVBUX1BBUkFNX09OT0ZGLCB0cnVlKQ0KCSAgDQoJICANCglIYXpNZW51OmFkZFBhcmFtKCJBR1AiLCAiQXV0byBXIGdhcGNsb3NlcnMiLCBTQ1JJUFRfUEFSQU1fT05PRkYsIHRydWUpCQ0KCUhhek1lbnU6YWRkUGFyYW0oIkludGVycnVwdCIsICJpbnRlcnJ1cHQgd2l0aCBXIiwgU0NSSVBUX1BBUkFNX09OT0ZGLCB0cnVlKQ0KCQ0KCQ0KCUhhek1lbnU6YWRkU3ViTWVudSgiTGFnRnJlZUNpcmNsZXMiLCAiTEZDIikNCgkgIEhhek1lbnUuTEZDOmFkZFBhcmFtKCJMYWdGcmVlIiwgIkFjdGl2YXRlIExhZyBGcmVlIENpcmNsZXMiLCBTQ1JJUFRfUEFSQU1fT05PRkYsIGZhbHNlKQ0KCSAgSGF6TWVudS5MRkM6YWRkUGFyYW0oIkNMIiwgIkxlbmd0aCBiZWZvcmUgU25hcHBpbmciLCBTQ1JJUFRfUEFSQU1fU0xJQ0UsIDM1MCwgNzUsIDIwMDAsIDApDQoJICBIYXpNZW51LkxGQzphZGRQYXJhbSgiQ0xpbmZvIiwgIkhpZ2hlciBsZW5ndGggPSBMb3dlciBGUFMgRHJvcHMiLCBTQ1JJUFRfUEFSQU1fSU5GTywgIiIpDQoJDQoJZm9yIGkgPSAxLCBoZXJvTWFuYWdlci5pQ291bnQsIDEgZG8NCgkJbG9jYWwgZW5lbXkgPSBoZXJvTWFuYWdlcjpnZXRIZXJvKGkpDQoJCWlmIGVuZW15LnRlYW0gfj0gbXlIZXJvLnRlYW0gdGhlbg0KCQkJZm9yIF8sIGNoYW1wIGluIHBhaXJzKEludGVycnVwdExpc3QpIGRvDQoJCQkJaWYgZW5lbXkuY2hhck5hbWUgPT0gY2hhbXAuY2hhck5hbWUgdGhlbg0KCQkJCQl0YWJsZS5pbnNlcnQoVG9JbnRlcnJ1cHQsIGNoYW1wLnNwZWxsTmFtZSkNCgkJCQllbmQNCgkJCWVuZA0KCQllbmQNCgllbmQNCgkNCglpZiBfRy5SZWJvcm5fTG9hZGVkIHRoZW4NCglEZWxheUFjdGlvbihmdW5jdGlvbigpDQoJCVByaW50Q2hhdCgiPGZvbnQgY29sb3IgPSBcIiNGRkZGRkZcIj5bVHdpc3RlZCBGYXRlXSA8L2ZvbnQ+PGZvbnQgY29sb3IgPSBcIiNGRjAwMDBcIj5TQUMgU3RhdHVzOjwvZm9udD4gPGZvbnQgY29sb3IgPSBcIiNGRkZGRkZcIj5TdWNjZXNzZnVsbHkgaW50ZWdyYXRlZC48L2ZvbnQ+IDwvZm9udD4iKQ0KCQlIYXpNZW51OmFkZFBhcmFtKCJTQUNPTiIsIltUd2lzdGVkIEZhdGVdIFNBQzpSIHN1cHBvcnQgaXMgYWN0aXZlLiIsIDUsICIiKQ0KCQlpc1NBQyA9IHRydWUNCgllbmQsIDEwKQ0KCWVsc2VpZiBub3QgX0cuUmVib3JuX0xvYWRlZCB0aGVuDQoJCVByaW50Q2hhdCgiPGZvbnQgY29sb3IgPSBcIiNGRkZGRkZcIj5bVHdpc3RlZCBGYXRlXSA8L2ZvbnQ+PGZvbnQgY29sb3IgPSBcIiNGRjAwMDBcIj5PcmJ3YWxrZXIgbm90IGZvdW5kOjwvZm9udD4gPGZvbnQgY29sb3IgPSBcIiNGRkZGRkZcIj5TeE9yYldhbGsgaW50ZWdyYXRlZC48L2ZvbnQ+IDwvZm9udD4iKQ0KCQlIYXpNZW51OmFkZFN1Yk1lbnUoIk9yYndhbGtlciIsICJTeE9yYiIpDQoJCVN4T3JiOkxvYWRUb01lbnUoSGF6TWVudS5TeE9yYikNCgkJaXNTWCA9IHRydWUNCgllbmQNCglIYXpNZW51OnBlcm1hU2hvdygiY29tYm9rZXkiKQ0KCUhhek1lbnU6cGVybWFTaG93KCJoYXJhc3NrZXkiKQ0KCUhhek1lbnU6cGVybWFTaG93KCJmYXJta2V5IikNCglIYXpNZW51LkNvbWJvOnBlcm1hU2hvdygic3R1blEiKQ0KZW5kDQoNCg0KDQpmdW5jdGlvbiBLUyhlbmVteSkgIA0KCWlmIFEuSXNSZWFkeSgpIGFuZCBnZXREbWcoIlEiLCBlbmVteSwgbXlIZXJvKSA+IGVuZW15LmhlYWx0aCB0aGVuDQoJCWlmIEdldERpc3RhbmNlKGVuZW15KSA8PSBRLnJhbmdlIGFuZCBIYXpNZW51Lk1pc2MuS1MgdGhlbiANCgkJCWxvY2FsIENhc3RQb3NpdGlvbiwgSGl0Q2hhbmNlLCBDYXN0UG9zID0gVlA6R2V0TGluZUNhc3RQb3NpdGlvbih0YXJnZXQsIFEuZGVsYXksIFEud2lkdGgsIFEucmFuZ2UsIFEuc3BlZWQsIG15SGVybywgZmFsc2UpDQoJCQlpZiBIaXRDaGFuY2UgPj0gMiBhbmQgR2V0RGlzdGFuY2UoQ2FzdFBvc2l0aW9uKSA8PSBRLnJhbmdlIGFuZCBHZXREaXN0YW5jZShDYXN0UG9zaXRpb24pID49IDcwMCBhbmQgUS5Jc1JlYWR5KCkgdGhlbg0KCQkJCUNhc3RTcGVsbChfUSwgQ2FzdFBvc2l0aW9uLngsIENhc3RQb3NpdGlvbi56KQ0KCQkgICAgZW5kDQoJCWVuZA0KCWVuZA0KICAgIGlmIFcuSXNSZWFkeSgpIGFuZCBnZXREbWcoIlciLCBlbmVteSwgbXlIZXJvKSA+IGVuZW15LmhlYWx0aCB0aGVuDQoJICAgIGlmIEdldERpc3RhbmNlKGVuZW15KSA8PSBXLnJhbmdlIHRoZW4NCgkJICBjYXN0VygpDQoJCWVuZA0KCWVuZAkNCmVuZA0KDQpmdW5jdGlvbiBBdXRvSWduaXRlKGVuZW15KQ0KICAJaURtZyA9ICgoSVJFQURZIGFuZCBnZXREbWcoIklHTklURSIsIGVuZW15LCBteUhlcm8pKSBvciAwKSANCglpZiBlbmVteS5oZWFsdGggPD0gaURtZyBhbmQgR2V0RGlzdGFuY2UoZW5lbXkpIDw9IDYwMCBhbmQgaWduaXRlIH49IG5pbA0KCQl0aGVuDQoJCQlpZiBJUkVBRFkgdGhlbiBDYXN0U3BlbGwoaWduaXRlLCBlbmVteSkgZW5kDQoJZW5kDQplbmQNCg0KDQotLUJpZyBUTlggdG8gTWFuY2l1enogZm9yIHRoaXMgcGFydA0KDQoNCmZ1bmN0aW9uIE9uUHJvY2Vzc1NwZWxsKHVuaXQsIHNwZWxsKSAgIA0KCWlmIEhhek1lbnUuSW50ZXJydXB0IGFuZCBXLklzUmVhZHkoKSBhbmQgI1RvSW50ZXJydXB0ID4gMCB0aGVuDQoJCWZvciBfLCBhYmlsaXR5IGluIHBhaXJzKFRvSW50ZXJydXB0KSBkbw0KCQkJaWYgc3BlbGwubmFtZSA9PSBhYmlsaXR5IGFuZCB1bml0LnRlYW0gfj0gbXlIZXJvLnRlYW0gdGhlbg0KCQkJCWlmIEdldERpc3RhbmNlKHVuaXQpIDw9IDUyNSB0aGVuIGNhc3RXKCkgZW5kDQoJCQllbmQNCgkJZW5kDQoJZW5kDQoJaWYgSGF6TWVudS5BR1AgYW5kIEUuSXNSZWFkeSgpIHRoZW4NCgkgICAgICAgIGxvY2FsIGphcnZhbkFkZGl0aW9uID0gdW5pdC5jaGFyTmFtZSA9PSAiSmFydmFuSVYiIGFuZCB1bml0OkNhblVzZVNwZWxsKF9RKSB+PSBSRUFEWSBhbmQgX1Igb3IgX1ENCgkJCWxvY2FsIGlzQUdhcGNsb3NlclVuaXQgPSB7DQoJCQkJWydBYXRyb3gnXSAgICAgID0ge3RydWUsIHNwZWxsID0gX1EsICAgICAgICAgICAgICAgICAgcmFuZ2UgPSAxMDAwLCAgcHJvalNwZWVkID0gMTIwMCwgfSwNCgkJCQlbJ0FrYWxpJ10gICAgICAgPSB7dHJ1ZSwgc3BlbGwgPSBfUiwgICAgICAgICAgICAgICAgICByYW5nZSA9IDgwMCwgICBwcm9qU3BlZWQgPSAyMjAwLCB9LCANCgkJCQlbJ0FsaXN0YXInXSAgICAgPSB7dHJ1ZSwgc3BlbGwgPSBfVywgICAgICAgICAgICAgICAgICByYW5nZSA9IDY1MCwgICBwcm9qU3BlZWQgPSAyMDAwLCB9LCANCgkJCQlbJ0RpYW5hJ10gICAgICAgPSB7dHJ1ZSwgc3BlbGwgPSBfUiwgICAgICAgICAgICAgICAgICByYW5nZSA9IDgyNSwgICBwcm9qU3BlZWQgPSAyMDAwLCB9LCANCgkJCQlbJ0dyYWdhcyddICAgICAgPSB7dHJ1ZSwgc3BlbGwgPSBfRSwgICAgICAgICAgICAgICAgICByYW5nZSA9IDYwMCwgICBwcm9qU3BlZWQgPSAyMDAwLCB9LA0KCQkJCVsnSGVjYXJpbSddICAgICA9IHt0cnVlLCBzcGVsbCA9IF9SLCAgICAgICAgICAgICAgICAgIHJhbmdlID0gMTAwMCwgIHByb2pTcGVlZCA9IDEyMDAsIH0sDQoJCQkJWydJcmVsaWEnXSAgICAgID0ge3RydWUsIHNwZWxsID0gX1EsICAgICAgICAgICAgICAgICAgcmFuZ2UgPSA2NTAsICAgcHJvalNwZWVkID0gMjIwMCwgfSwgDQoJCQkJWydKYXJ2YW5JViddICAgID0ge3RydWUsIHNwZWxsID0gamFydmFuQWRkaXRpb24sICAgICAgcmFuZ2UgPSA3NzAsICAgcHJvalNwZWVkID0gMjAwMCwgfSwgDQoJCQkJWydKYXgnXSAgICAgICAgID0ge3RydWUsIHNwZWxsID0gX1EsICAgICAgICAgICAgICAgICAgcmFuZ2UgPSA3MDAsICAgcHJvalNwZWVkID0gMjAwMCwgfSwgDQoJCQkJWydKYXljZSddICAgICAgID0ge3RydWUsIHNwZWxsID0gJ0pheWNlVG9UaGVTa2llcycsICAgcmFuZ2UgPSA2MDAsICAgcHJvalNwZWVkID0gMjAwMCwgfSwgDQoJCQkJWydLaGF6aXgnXSAgICAgID0ge3RydWUsIHNwZWxsID0gX0UsICAgICAgICAgICAgICAgICAgcmFuZ2UgPSA5MDAsICAgcHJvalNwZWVkID0gMjAwMCwgfSwNCgkJCQlbJ0xlYmxhbmMnXSAgICAgPSB7dHJ1ZSwgc3BlbGwgPSBfVywgICAgICAgICAgICAgICAgICByYW5nZSA9IDYwMCwgICBwcm9qU3BlZWQgPSAyMDAwLCB9LA0KCQkJCVsnTGVlU2luJ10gICAgICA9IHt0cnVlLCBzcGVsbCA9ICdibGluZG1vbmtxdHdvJywgICAgIHJhbmdlID0gMTMwMCwgIHByb2pTcGVlZCA9IDE4MDAsIH0sDQoJCQkJWydMZW9uYSddICAgICAgID0ge3RydWUsIHNwZWxsID0gX0UsICAgICAgICAgICAgICAgICAgcmFuZ2UgPSA5MDAsICAgcHJvalNwZWVkID0gMjAwMCwgfSwNCgkJCQlbJ01hbHBoaXRlJ10gICAgPSB7dHJ1ZSwgc3BlbGwgPSBfUiwgICAgICAgICAgICAgICAgICByYW5nZSA9IDEwMDAsICBwcm9qU3BlZWQgPSAxNTAwICsgdW5pdC5tc30sDQoJCQkJWydNYW9rYWknXSAgICAgID0ge3RydWUsIHNwZWxsID0gX1EsICAgICAgICAgICAgICAgICAgcmFuZ2UgPSA2MDAsICAgcHJvalNwZWVkID0gMTIwMCwgfSwgDQoJCQkJWydNb25rZXlLaW5nJ10gID0ge3RydWUsIHNwZWxsID0gX0UsICAgICAgICAgICAgICAgICAgcmFuZ2UgPSA2NTAsICAgcHJvalNwZWVkID0gMjIwMCwgfSwgDQoJCQkJWydQYW50aGVvbiddICAgID0ge3RydWUsIHNwZWxsID0gX1csICAgICAgICAgICAgICAgICAgcmFuZ2UgPSA2MDAsICAgcHJvalNwZWVkID0gMjAwMCwgfSwgDQoJCQkJWydQb3BweSddICAgICAgID0ge3RydWUsIHNwZWxsID0gX0UsICAgICAgICAgICAgICAgICAgcmFuZ2UgPSA1MjUsICAgcHJvalNwZWVkID0gMjAwMCwgfSwgDQoJCQkJWydSZW5la3RvbiddICAgID0ge3RydWUsIHNwZWxsID0gX0UsICAgICAgICAgICAgICAgICAgcmFuZ2UgPSA0NTAsICAgcHJvalNwZWVkID0gMjAwMCwgfSwNCgkJCQlbJ1NlanVhbmknXSAgICAgPSB7dHJ1ZSwgc3BlbGwgPSBfUSwgICAgICAgICAgICAgICAgICByYW5nZSA9IDY1MCwgICBwcm9qU3BlZWQgPSAyMDAwLCB9LA0KCQkJCVsnU2hlbiddICAgICAgICA9IHt0cnVlLCBzcGVsbCA9IF9FLCAgICAgICAgICAgICAgICAgIHJhbmdlID0gNTc1LCAgIHByb2pTcGVlZCA9IDIwMDAsIH0sDQoJCQkJWydUcmlzdGFuYSddICAgID0ge3RydWUsIHNwZWxsID0gX1csICAgICAgICAgICAgICAgICAgcmFuZ2UgPSA5MDAsICAgcHJvalNwZWVkID0gMjAwMCwgfSwNCgkJCQlbJ1RyeW5kYW1lcmUnXSAgPSB7dHJ1ZSwgc3BlbGwgPSAnU2xhc2gnLCAgICAgICAgICAgICByYW5nZSA9IDY1MCwgICBwcm9qU3BlZWQgPSAxNDUwLCB9LA0KCQkJCVsnWGluWmhhbyddICAgICA9IHt0cnVlLCBzcGVsbCA9IF9FLCAgICAgICAgICAgICAgICAgIHJhbmdlID0gNjUwLCAgIHByb2pTcGVlZCA9IDIwMDAsIH0sIA0KCQkJfQ0KCQkJaWYgdW5pdC50eXBlID09IG15SGVyby50eXBlIGFuZCB1bml0LnRlYW0gfj0gbXlIZXJvLnRlYW0gYW5kIGlzQUdhcGNsb3NlclVuaXRbdW5pdC5jaGFyTmFtZV0gYW5kIEdldERpc3RhbmNlKHVuaXQpIDwgMjAwMCBhbmQgc3BlbGwgfj0gbmlsIHRoZW4NCgkJCQlpZiBzcGVsbC5uYW1lID09ICh0eXBlKGlzQUdhcGNsb3NlclVuaXRbdW5pdC5jaGFyTmFtZV0uc3BlbGwpID09ICdudW1iZXInIGFuZCB1bml0OkdldFNwZWxsRGF0YShpc0FHYXBjbG9zZXJVbml0W3VuaXQuY2hhck5hbWVdLnNwZWxsKS5uYW1lIG9yIGlzQUdhcGNsb3NlclVuaXRbdW5pdC5jaGFyTmFtZV0uc3BlbGwpIHRoZW4NCgkJCQkJaWYgc3BlbGwudGFyZ2V0IH49IG5pbCBhbmQgc3BlbGwudGFyZ2V0LmlzTWUgb3IgaXNBR2FwY2xvc2VyVW5pdFt1bml0LmNoYXJOYW1lXS5zcGVsbCA9PSAnYmxpbmRtb25rcXR3bycgdGhlbg0KCQkJCQkJaWYgVy5Jc1JlYWR5KCkgdGhlbg0KCQkJCQkJCVcudGFyZ2V0ID0gdW5pdA0KCQkJCQkJCWNhc3RXKCkNCgkJCQkJCWVuZA0KCQkJCQllbHNlDQoJCQkJCQlzcGVsbEV4cGlyZWQgPSBmYWxzZQ0KCQkJCQkJaW5mb3JtYXRpb25UYWJsZSA9IHsNCgkJCQkJCQlzcGVsbFNvdXJjZSA9IHVuaXQsDQoJCQkJCQkJc3BlbGxDYXN0ZWRUaWNrID0gR2V0VGlja0NvdW50KCksDQoJCQkJCQkJc3BlbGxTdGFydFBvcyA9IFBvaW50KHNwZWxsLnN0YXJ0UG9zLngsIHNwZWxsLnN0YXJ0UG9zLnopLA0KCQkJCQkJCXNwZWxsRW5kUG9zID0gUG9pbnQoc3BlbGwuZW5kUG9zLngsIHNwZWxsLmVuZFBvcy56KSwNCgkJCQkJCQlzcGVsbFJhbmdlID0gaXNBR2FwY2xvc2VyVW5pdFt1bml0LmNoYXJOYW1lXS5yYW5nZSwNCgkJCQkJCQlzcGVsbFNwZWVkID0gaXNBR2FwY2xvc2VyVW5pdFt1bml0LmNoYXJOYW1lXS5wcm9qU3BlZWQNCgkJCQkJCX0NCgkJCQkJZW5kDQoJCQkJZW5kDQoJCQllbmQNCgkJDQogICAgZW5kDQogICAgaWYgdW5pdC5pc01lIGFuZCBzcGVsbC5uYW1lID09ICJEZXN0aW55IiB0aGVuIA0KICAgIAljYXN0V2coKQ0KICAgIGVsc2VpZiB1bml0LmlzTWUgYW5kIHNwZWxsLm5hbWUgPT0gImdhdGUiIHRoZW4NCgkgICAgY2FzdFdnKCkNCiAgICBlbmQNCmVuZAkJCQ0KDQoNCg0KZnVuY3Rpb24gU3BlbGxFeHBpcmVkKCkNCglpZiBIYXpNZW51LkFHUCBhbmQgbm90IHNwZWxsRXhwaXJlZCBhbmQgKEdldFRpY2tDb3VudCgpIC0gaW5mb3JtYXRpb25UYWJsZS5zcGVsbENhc3RlZFRpY2spIDw9IChpbmZvcm1hdGlvblRhYmxlLnNwZWxsUmFuZ2UgLyBpbmZvcm1hdGlvblRhYmxlLnNwZWxsU3BlZWQpICogMTAwMCB0aGVuDQoJCWxvY2FsIHNwZWxsRGlyZWN0aW9uICAgICA9IChpbmZvcm1hdGlvblRhYmxlLnNwZWxsRW5kUG9zIC0gaW5mb3JtYXRpb25UYWJsZS5zcGVsbFN0YXJ0UG9zKTpub3JtYWxpemVkKCkNCgkJbG9jYWwgc3BlbGxTdGFydFBvc2l0aW9uID0gaW5mb3JtYXRpb25UYWJsZS5zcGVsbFN0YXJ0UG9zICsgc3BlbGxEaXJlY3Rpb24NCgkJbG9jYWwgc3BlbGxFbmRQb3NpdGlvbiAgID0gaW5mb3JtYXRpb25UYWJsZS5zcGVsbFN0YXJ0UG9zICsgc3BlbGxEaXJlY3Rpb24gKiBpbmZvcm1hdGlvblRhYmxlLnNwZWxsUmFuZ2UNCgkJbG9jYWwgaGVyb1Bvc2l0aW9uID0gUG9pbnQobXlIZXJvLngsIG15SGVyby56KQ0KCQlsb2NhbCBsaW5lU2VnbWVudCA9IExpbmVTZWdtZW50KFBvaW50KHNwZWxsU3RhcnRQb3NpdGlvbi54LCBzcGVsbFN0YXJ0UG9zaXRpb24ueSksIFBvaW50KHNwZWxsRW5kUG9zaXRpb24ueCwgc3BlbGxFbmRQb3NpdGlvbi55KSkNCgkNCgkJCWxvY2FsIGxpbmVTZWdtZW50ID0gTGluZVNlZ21lbnQoUG9pbnQoc3BlbGxTdGFydFBvc2l0aW9uLngsIHNwZWxsU3RhcnRQb3NpdGlvbi55KSwgUG9pbnQoc3BlbGxFbmRQb3NpdGlvbi54LCBzcGVsbEVuZFBvc2l0aW9uLnkpKQ0KCQkJDQoNCgkJCWlmIGxpbmVTZWdtZW50OmRpc3RhbmNlKGhlcm9Qb3NpdGlvbikgPD0gMzAwIGFuZCBXLklzUmVhZHkoKSB0aGVuDQoJCQkJVy50YXJnZXQgPSB1bml0DQoJCQkJY2FzdFcoKQ0KCQkJZW5kDQoNCgkJZWxzZQ0KCQkJc3BlbGxFeHBpcmVkID0gdHJ1ZQ0KCQkJaW5mb3JtYXRpb25UYWJsZSA9IHt9DQoJCWVuZA0KICAgICAgICANCiAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgDQogICAgDQplbmQNCg0KDQotLWNvbWJvLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCg0KDQpmdW5jdGlvbiBDb21ibygpDQoJaWYgVmFsaWRUYXJnZXQodGFyZ2V0KSB0aGVuDQogICAgICAgIAlpZiBXLklzUmVhZHkoKSBhbmQgSGF6TWVudS5Db21iby5jb21ib1cgdGhlbg0KCQkJICAgIGlmIEdldERpc3RhbmNlKG15SGVybywgdGFyZ2V0KSA8PSAgMTAwMCB0aGVuDQoJCQkgICAgIGNhc3RXKCkNCgkJCSAgICBlbmQNCgkJCWVuZA0KCQkJaWYgSGF6TWVudS5Db21iby5zdHVuUSB0aGVuCQ0KICAgICAgICAgICAgICAgIGlmIFEuSXNSZWFkeSgpIGFuZCBIYXpNZW51LkNvbWJvLmNvbWJvUSB0aGVuDQoJCQkJICANCgkJCSAgICAgICBBdXRvUVN0dW4oKQ0KCQkgICAgICAgICAgDQoJCQkJZW5kCQ0KCQkJZWxzZWlmIG5vdCBIYXpNZW51LkNvbWJvLnN0dW5RIHRoZW4NCgkJCSAgICAgaWYgUS5Jc1JlYWR5KCkgYW5kIEhhek1lbnUuQ29tYm8uY29tYm9RIGFuZCBIYXpNZW51Lk1pc2MuUHJlZCB0aGVuDQoJCQkJICAgICBIUHJlZFEoKQ0KCQkJCWVsc2VpZiBub3QgSGF6TWVudS5NaXNjLlByZWQgdGhlbg0KCQkJICAgICAgICBsb2NhbCBDYXN0UG9zaXRpb24sIEhpdENoYW5jZSwgQ2FzdFBvcyA9IFZQOkdldExpbmVDYXN0UG9zaXRpb24odGFyZ2V0LCBRLmRlbGF5LCBRLndpZHRoLCBRLnJhbmdlLCBRLnNwZWVkLCBteUhlcm8sIGZhbHNlKQ0KCQkJICAgICAgICBpZiBIaXRDaGFuY2UgPj0gMiBhbmQgR2V0RGlzdGFuY2UoQ2FzdFBvc2l0aW9uKSA8PSBRLnJhbmdlIHRoZW4NCgkJCQkgLS1pZiBIYXpNZW51Lk1pc2MuUGFrIGFuZCBWSVBfVVNFUiB0aGVuDQoJCQkJICAgICAtLXBhY2tldENhc3QoX1EsIENhc3RQb3NpdGlvbi54LCBDYXN0UG9zaXRpb24ueikNCgkJCQkJLS1lbHNlDQoJCQkJICAgICAgICBDYXN0U3BlbGwoX1EsIENhc3RQb3NpdGlvbi54LCBDYXN0UG9zaXRpb24ueikNCgkJCQktLWVuZAkgDQoJCQkgICAgICAgIGVuZA0KCQkgICAgICAgIGVuZAkNCgkJCWVuZAkNCgllbmQNCmVuZA0KDQoNCi0taGFyYXNzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCg0KDQpmdW5jdGlvbiBQb2tlKCkNCglpZiBWYWxpZFRhcmdldCh0YXJnZXQpIHRoZW4gDQoJCWlmIFEuSXNSZWFkeSgpIGFuZCBIYXpNZW51LkhhcmFzcy5oYXJhc3NRIGFuZCBteUhlcm8ubWFuYSAvIG15SGVyby5tYXhNYW5hID4gSGF6TWVudS5IYXJhc3MuTWFuYSAvMTAwIHRoZW4gDQoJCSAgICBpZiBIYXpNZW51Lk1pc2MuUHJlZCB0aGVuDQoJCQkgICBIUHJlZFEoKQ0KCQkJZWxzZWlmIG5vdCBIYXpNZW51Lk1pc2MuUHJlZCB0aGVuDQoJCSAgICBsb2NhbCBDYXN0UG9zaXRpb24sIEhpdENoYW5jZSwgQ2FzdFBvcyA9IFZQOkdldExpbmVDYXN0UG9zaXRpb24odGFyZ2V0LCBRLmRlbGF5LCBRLndpZHRoLCBRLnJhbmdlLCBRLnNwZWVkLCBteUhlcm8sIGZhbHNlKQ0KCQkJICAgIGlmIEhpdENoYW5jZSA+PSAyIGFuZCBHZXREaXN0YW5jZShDYXN0UG9zaXRpb24pIDw9IFEucmFuZ2UgdGhlbg0KCQkJCSAtLWlmIEhhek1lbnUuTWlzYy5QYWsgYW5kIFZJUF9VU0VSIHRoZW4NCgkJCQkgICAgIC0tcGFja2V0Q2FzdChfUSwgQ2FzdFBvc2l0aW9uLngsIENhc3RQb3NpdGlvbi56KQ0KCQkJCQktLWVsc2UNCgkJCQkgICAgQ2FzdFNwZWxsKF9RLCBDYXN0UG9zaXRpb24ueCwgQ2FzdFBvc2l0aW9uLnopDQoJCQkJLS1lbmQNCgkJCSAgICBlbmQNCgkJCWVuZCAgDQoJCWVuZA0KCQlpZiBXLklzUmVhZHkoKSBhbmQgSGF6TWVudS5IYXJhc3MuaGFyYXNzVyB0aGVuDQoJCSAgICBpZiBteUhlcm8ubWFuYSAvIG15SGVyby5tYXhNYW5hID4gSGF6TWVudS5IYXJhc3MuTWFuYSAvMTAwIHRoZW4NCgkJICAgICAgIGlmIEdldERpc3RhbmNlKG15SGVybywgTWluaW9uKSA8PSAxMDAwIHRoZW4NCgkJCSAgICAgY2FzdFcoKQ0KCQkJICAgIGVuZA0KICAgCQkgICAgZWxzZQ0KCQkJICAgaWYgR2V0RGlzdGFuY2UobXlIZXJvLCBNaW5pb24pIDw9IDEwMDAgdGhlbg0KCQkJICAgICBjYXN0V2JsdWUoKQ0KCQkJICAgZW5kDQoJCSAgICBlbmQNCgkgICAgZW5kDQogICAgZW5kDQplbmQNCg0KDQoNCi0tZmFybS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCg0KDQpmdW5jdGlvbiBGYXJtKCkNCglNaW5pb25zOnVwZGF0ZSgpDQoJDQoJZm9yIGksIE1pbmlvbiBpbiBwYWlycyhNaW5pb25zLm9iamVjdHMpIGRvDQoJCWlmIFEuSXNSZWFkeSgpIGFuZCBIYXpNZW51LkZhcm0uZmFybVEgYW5kICNNaW5pb25zLm9iamVjdHMgPj0gMiB0aGVuDQoJCQlpZiBteUhlcm8ubWFuYSAvIG15SGVyby5tYXhNYW5hID4gSGF6TWVudS5GYXJtLk1hbmEgLzEwMCB0aGVuDQoJCQkgICAgaWYgVmFsaWRUYXJnZXQoTWluaW9uKSB0aGVuDQoJCQkgICAgICAgIGxvY2FsIEJlc3RQb3MsIEJlc3RIaXQgPSBHZXRCZXN0TGluZUZhcm1Qb3NpdGlvbihRLnJhbmdlLCBRLndpZHRoLCBNaW5pb25zLm9iamVjdHMpDQoJCQkJCQlpZiBCZXN0UG9zIH49IG5pbCB0aGVuDQoJCQkJCQkJQ2FzdFNwZWxsKF9RLCBCZXN0UG9zLngsIEJlc3RQb3MueikNCgkJCQkJCWVuZA0KCQkJCWVuZAkNCgkJCWVuZA0KICAgCQllbmQNCgkJaWYgIFcuSXNSZWFkeSgpIGFuZCBIYXpNZW51LkZhcm0uZmFybVcgdGhlbg0KCQkgICAgaWYgbXlIZXJvLm1hbmEgLyBteUhlcm8ubWF4TWFuYSA+IEhhek1lbnUuRmFybS5NYW5hIC8xMDAgdGhlbg0KCQkgICAgICAgaWYgR2V0RGlzdGFuY2UobXlIZXJvLCBNaW5pb24pIDw9IDEwMDAgdGhlbg0KCQkJICAgICBjYXN0V3JlZCgpDQoJCQkgICAgZW5kDQogICAJCSAgICBlbHNlDQoJCQkgICBpZiBHZXREaXN0YW5jZShteUhlcm8sIE1pbmlvbikgPD0gMTAwMCB0aGVuDQoJCQkgICAgIGNhc3RXYmx1ZWZhcm0oKQ0KCQkJICAgZW5kDQoJCSAgICBlbmQNCgkgICAgZW5kDQoJZW5kCQ0KICAgIEp1bmdsZU1pbmlvbnM6dXBkYXRlKCkNCglmb3IgaSwgTWluaW9uIGluIHBhaXJzKEp1bmdsZU1pbmlvbnMub2JqZWN0cykgZG8NCgkgICAgaWYgUS5Jc1JlYWR5KCkgYW5kIEhhek1lbnUuRmFybS5mYXJtUSB0aGVuDQoJCQlpZiBteUhlcm8ubWFuYSAvIG15SGVyby5tYXhNYW5hID4gSGF6TWVudS5GYXJtLk1hbmEgLzEwMCB0aGVuDQoJCQkgICAgbG9jYWwgQmVzdFBvcywgQmVzdEhpdCA9IEdldEJlc3RMaW5lRmFybVBvc2l0aW9uKFEucmFuZ2UsIFEud2lkdGgsIE1pbmlvbnMub2JqZWN0cykNCgkJCQkJCWlmIEJlc3RQb3Mgfj0gbmlsIHRoZW4NCgkJCQkJCQlDYXN0U3BlbGwoX1EsIEJlc3RQb3MueCwgQmVzdFBvcy56KQ0KCQkJCQkJZW5kDQoJCQllbmQNCiAgIAkJZW5kDQoJCWlmICBXLklzUmVhZHkoKSBhbmQgSGF6TWVudS5GYXJtLmZhcm1XIHRoZW4NCgkJICAgIGlmIG15SGVyby5tYW5hIC8gbXlIZXJvLm1heE1hbmEgPiBIYXpNZW51LkZhcm0uTWFuYSAvMTAwIHRoZW4NCgkJICAgICAgIGlmIEdldERpc3RhbmNlKG15SGVybywgTWluaW9uKSA8PSA4MDAgdGhlbg0KCQkJICAgICBjYXN0V3JlZCgpDQoJCQkgICAgZW5kDQogICAJCSAgICBlbHNlDQoJCQkgICBpZiBHZXREaXN0YW5jZShteUhlcm8sIE1pbmlvbikgPD0gODAwIHRoZW4NCgkJCSAgICAgY2FzdFdibHVlZmFybSgpDQoJCQkgICBlbmQNCgkJICAgIGVuZA0KCSAgICBlbmQNCgllbmQJDQplbmQNCg0KDQpmdW5jdGlvbiBHZXRCZXN0TGluZUZhcm1Qb3NpdGlvbihyYW5nZSwgd2lkdGgsIG9iamVjdHMpDQoJbG9jYWwgQmVzdFBvcyANCglsb2NhbCBCZXN0SGl0ID0gMA0KCWZvciBpLCBvYmplY3QgaW4gaXBhaXJzKG9iamVjdHMpIGRvDQoJCWxvY2FsIEVuZFBvcyA9IFZlY3RvcihteUhlcm8ucG9zKSArIHJhbmdlICogKFZlY3RvcihvYmplY3QpIC0gVmVjdG9yKG15SGVyby5wb3MpKTpub3JtYWxpemVkKCkNCgkJbG9jYWwgaGl0ID0gQ291bnRPYmplY3RzT25MaW5lU2VnbWVudChteUhlcm8ucG9zLCBFbmRQb3MsIHdpZHRoLCBvYmplY3RzKQ0KCQlpZiBoaXQgPiBCZXN0SGl0IHRoZW4NCgkJCUJlc3RIaXQgPSBoaXQNCgkJCUJlc3RQb3MgPSBWZWN0b3Iob2JqZWN0KQ0KCQkJaWYgQmVzdEhpdCA9PSAjb2JqZWN0cyB0aGVuDQoJCQkgICBicmVhaw0KCQkJZW5kDQoJCSBlbmQNCgllbmQNCg0KCXJldHVybiBCZXN0UG9zLCBCZXN0SGl0DQplbmQNCg0KZnVuY3Rpb24gQ291bnRPYmplY3RzT25MaW5lU2VnbWVudChTdGFydFBvcywgRW5kUG9zLCB3aWR0aCwgb2JqZWN0cykNCglsb2NhbCBuID0gMA0KCWZvciBpLCBvYmplY3QgaW4gaXBhaXJzKG9iamVjdHMpIGRvDQoJCWxvY2FsIHBvaW50U2VnbWVudCwgcG9pbnRMaW5lLCBpc09uU2VnbWVudCA9IFZlY3RvclBvaW50UHJvamVjdGlvbk9uTGluZVNlZ21lbnQoU3RhcnRQb3MsIEVuZFBvcywgb2JqZWN0KQ0KCQlpZiBpc09uU2VnbWVudCBhbmQgR2V0RGlzdGFuY2VTcXIocG9pbnRTZWdtZW50LCBvYmplY3QpIDwgd2lkdGggKiB3aWR0aCB0aGVuDQoJCQluID0gbiArIDENCgkJZW5kDQoJZW5kDQoNCglyZXR1cm4gbg0KZW5kDQoNCg0KDQpmdW5jdGlvbiBjYXN0USgpDQogICAgaWYgVmFsaWRUYXJnZXQoVGFyZ2V0KSBhbmQgSGF6TWVudS5xcG9rZSB0aGVuDQogICAJICAgIGlmIFEuSXNSZWFkeSgpIHRoZW4NCgkgICAgICAgIGxvY2FsIENhc3RQb3NpdGlvbiwgSGl0Q2hhbmNlLCBDYXN0UG9zID0gVlA6R2V0TGluZUNhc3RQb3NpdGlvbih0YXJnZXQsIFEuZGVsYXksIFEud2lkdGgsIFEucmFuZ2UsIFEuc3BlZWQsIG15SGVybywgZmFsc2UpDQoJCQlpZiBIaXRDaGFuY2UgPj0gMiBhbmQgR2V0RGlzdGFuY2UoQ2FzdFBvc2l0aW9uKSA8PSBRLnJhbmdlIHRoZW4NCgkJCQkgLS1pZiBIYXpNZW51Lk1pc2MuUGFrIGFuZCBWSVBfVVNFUiB0aGVuDQoJCQkJICAgICAtLXBhY2tldENhc3QoX1EsIENhc3RQb3NpdGlvbi54LCBDYXN0UG9zaXRpb24ueikNCgkJCQkJLS1lbHNlDQoJCQkJICAgIENhc3RTcGVsbChfUSwgQ2FzdFBvc2l0aW9uLngsIENhc3RQb3NpdGlvbi56KQ0KCQkJCS0tZW5kDQoJCQllbmQgICANCgkJZW5kDQogICAgZW5kDQplbmQNCg0KDQpmdW5jdGlvbiBTUHJlZFEodW5pdCkNCiAgICBsb2NhbCB1bml0ID0gdGFyZ2V0DQogICBDYXN0UG9zaXRpb24sIEhpdENoYW5jZSA9IFNQOlByZWRpY3QoX1EsIG15SGVybywgdGFyZ2V0KQ0KCWlmIENhc3RQb3NpdGlvbiBhbmQgSGl0Q2hhbmNlID49IDIgdGhlbg0KCQlDYXN0U3BlbGwoX1EsIENhc3RQb3NpdGlvbi54LCBDYXN0UG9zaXRpb24ueikNCgllbmQNCmVuZA0KDQpmdW5jdGlvbiBIUHJlZFEodW5pdCkNCiAgICBsb2NhbCB1bml0ID0gdGFyZ2V0DQoJbG9jYWwgUVBvcywgUUhpdENoYW5jZSA9IEhQcmVkOkdldFByZWRpY3QoSFBfUSwgdW5pdCwgbXlIZXJvKQ0KCWlmIFFIaXRDaGFuY2UgPj0gMSB0aGVuDQoJCUNhc3RTcGVsbChfUSwgUVBvcy54LCBRUG9zLnopDQoJZW5kDQogICAgDQplbmQNCg0KZnVuY3Rpb24gQXV0b1FTdHVuKCkNCiAgICANCiAgZm9yIGksIGVuZW15IGluIGlwYWlycyhHZXRFbmVteUhlcm9lcygpKSBkbw0KICAgIGlmIFEuSXNSZWFkeSgpIGFuZCBWYWxpZFRhcmdldCh0YXJnZXQpIGFuZCBHZXREaXN0YW5jZSh0YXJnZXQsIG15SGVybykgYW5kIFRhcmdldEhhdmVCdWZmKCJTdHVuIiwgdGFyZ2V0KSB0aGVuDQoJCQlsb2NhbCBBT0VDYXN0UG9zaXRpb24sIE1haW5UYXJnZXRIaXRDaGFuY2UsIG5UYXJnZXRzID0gVlA6R2V0TGluZUFPRUNhc3RQb3NpdGlvbih0YXJnZXQsIDAsIDgwLCA2MDAsIDIwMDAsIG15SGVybykNCgkJCWlmIG5UYXJnZXRzID49IDEgdGhlbg0KCQkJCWlmIEdldERpc3RhbmNlKHRhcmdldCwgbXlIZXJvKSA8PSBRLnJhbmdlIHRoZW4NCgkJCQkJQ2FzdFNwZWxsKF9RLCBBT0VDYXN0UG9zaXRpb24ueCwgQU9FQ2FzdFBvc2l0aW9uLnopDQoJCQkJZW5kDQoJCQllbmQNCgllbmQNCiAgZW5kDQplbmQNCg0KDQoNCg0KLS1jYWxjZG1nLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQpmdW5jdGlvbiBjYWxjRG1nKCkNCglmb3IgaT0xLCBoZXJvTWFuYWdlci5pQ291bnQgZG8NCgkJbG9jYWwgVGFyZ2V0ID0gaGVyb01hbmFnZXI6R2V0SGVybyhpKQ0KCQlpZiBWYWxpZFRhcmdldChUYXJnZXQpIGFuZCBUYXJnZXQgfj0gbmlsIHRoZW4NCgkJCXFEbWcgPSAoKFFSRUFEWSBhbmQgZ2V0RG1nKCJRIiwgVGFyZ2V0LCBteUhlcm8pKSBvciAwKQ0KCQkJd0RtZyA9ICgoV1JFQURZIGFuZCBnZXREbWcoIlciLCBUYXJnZXQsIG15SGVybykpIG9yIDApDQoJCQllRG1nID0gKChFUkVBRFkgYW5kIGdldERtZygiRSIsIFRhcmdldCwgbXlIZXJvKSkgb3IgMCkNCgkJCXJEbWcgPSAoKFJSRUFEWSBhbmQgZ2V0RG1nKCJSIiwgVGFyZ2V0LCBteUhlcm8pKSBvciAwKQ0KCQkJYWxsRG1nID0gKHFEbWcpICsgKHdEbWcpDQoJCQkNCgkJCWlmIFRhcmdldC5oZWFsdGggPiBhbGxEbWcgdGhlbg0KCQkJCUtpbGxUZXh0W2ldID0gMQ0KCQkJZWxzZWlmIFRhcmdldC5oZWFsdGggPD0gYWxsRG1nIHRoZW4NCgkJCQlLaWxsVGV4dFtpXSA9IDINCgkJCWVuZA0KCQllbmQNCgllbmQJDQplbmQNCg0KZnVuY3Rpb24gTEZDZnVuYygpDQoJaWYgbm90IEhhek1lbnUuTEZDLkxhZ0ZyZWUgdGhlbiBfRy5EcmF3Q2lyY2xlID0gX0cub2xkRHJhd0NpcmNsZSBlbmQNCiAgICBpZiBIYXpNZW51LkxGQy5MYWdGcmVlIHRoZW4gX0cuRHJhd0NpcmNsZSA9IERyYXdDaXJjbGUyIGVuZA0KZW5kDQoNCi0tIEJhcmFzaWEsIHZhZGFzaCwgdmlzZXZlcnNhDQoNCmZ1bmN0aW9uIERyYXdDaXJjbGVOZXh0THZsKHgsIHksIHosIHJhZGl1cywgd2lkdGgsIGNvbG9yLCBjaG9yZGxlbmd0aCkNCglyYWRpdXMgPSByYWRpdXMgb3IgMzAwDQoJcXVhbGl0eSA9IG1hdGgubWF4KDgscm91bmQoMTgwL21hdGguZGVnKChtYXRoLmFzaW4oKGNob3JkbGVuZ3RoLygyKnJhZGl1cykpKSkpKSkNCglxdWFsaXR5ID0gMiAqIG1hdGgucGkgLyBxdWFsaXR5DQoJcmFkaXVzID0gcmFkaXVzKi45Mg0KCWxvY2FsIHBvaW50cyA9IHt9DQoJZm9yIHRoZXRhID0gMCwgMiAqIG1hdGgucGkgKyBxdWFsaXR5LCBxdWFsaXR5IGRvDQoJCWxvY2FsIGMgPSBXb3JsZFRvU2NyZWVuKEQzRFhWRUNUT1IzKHggKyByYWRpdXMgKiBtYXRoLmNvcyh0aGV0YSksIHksIHogLSByYWRpdXMgKiBtYXRoLnNpbih0aGV0YSkpKQ0KCQlwb2ludHNbI3BvaW50cyArIDFdID0gRDNEWFZFQ1RPUjIoYy54LCBjLnkpDQoJZW5kDQoJRHJhd0xpbmVzMihwb2ludHMsIHdpZHRoIG9yIDEsIGNvbG9yIG9yIDQyOTQ5NjcyOTUpDQplbmQNCg0KZnVuY3Rpb24gcm91bmQobnVtKSANCglpZiBudW0gPj0gMCB0aGVuIHJldHVybiBtYXRoLmZsb29yKG51bSsuNSkgZWxzZSByZXR1cm4gbWF0aC5jZWlsKG51bS0uNSkgZW5kDQplbmQNCg0KZnVuY3Rpb24gRHJhd0NpcmNsZTIoeCwgeSwgeiwgcmFkaXVzLCBjb2xvcikNCglsb2NhbCB2UG9zMSA9IFZlY3Rvcih4LCB5LCB6KQ0KCWxvY2FsIHZQb3MyID0gVmVjdG9yKGNhbWVyYVBvcy54LCBjYW1lcmFQb3MueSwgY2FtZXJhUG9zLnopDQoJbG9jYWwgdFBvcyA9IHZQb3MxIC0gKHZQb3MxIC0gdlBvczIpOm5vcm1hbGl6ZWQoKSAqIHJhZGl1cw0KCWxvY2FsIHNQb3MgPSBXb3JsZFRvU2NyZWVuKEQzRFhWRUNUT1IzKHRQb3MueCwgdFBvcy55LCB0UG9zLnopKQ0KCWlmIE9uU2NyZWVuKHsgeCA9IHNQb3MueCwgeSA9IHNQb3MueSB9LCB7IHggPSBzUG9zLngsIHkgPSBzUG9zLnkgfSkgdGhlbg0KCQlEcmF3Q2lyY2xlTmV4dEx2bCh4LCB5LCB6LCByYWRpdXMsIDEsIGNvbG9yLCBIYXpNZW51LkxGQy5DTCkgDQoJZW5kDQplbmQNCg0KDQotLUhQYmFyIGRyYXdzLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoNCmZvciBpLCBlbmVteSBpbiBpcGFpcnMoR2V0RW5lbXlIZXJvZXMoKSkgZG8NCiAgICBlbmVteS5iYXJEYXRhID0ge1BlcmNlbnRhZ2VPZmZzZXQgPSB7eCA9IDAsIHkgPSAwfSB9DQplbmQNCg0KZnVuY3Rpb24gR2V0RW5lbXlIUEJhclBvcyhlbmVteSkNCg0KICAgIGlmIG5vdCBlbmVteS5iYXJEYXRhIHRoZW4NCiAgICAgICAgcmV0dXJuDQogICAgZW5kDQoNCiAgICBsb2NhbCBiYXJQb3MgPSBHZXRVbml0SFBCYXJQb3MoZW5lbXkpDQogICAgbG9jYWwgYmFyUG9zT2Zmc2V0ID0gR2V0VW5pdEhQQmFyT2Zmc2V0KGVuZW15KQ0KICAgIGxvY2FsIGJhck9mZnNldCA9IFBvaW50KGVuZW15LmJhckRhdGEuUGVyY2VudGFnZU9mZnNldC54LCBlbmVteS5iYXJEYXRhLlBlcmNlbnRhZ2VPZmZzZXQueSkNCiAgICBsb2NhbCBiYXJQb3NQZXJjZW50YWdlT2Zmc2V0ID0gUG9pbnQoZW5lbXkuYmFyRGF0YS5QZXJjZW50YWdlT2Zmc2V0LngsIGVuZW15LmJhckRhdGEuUGVyY2VudGFnZU9mZnNldC55KQ0KDQogICAgbG9jYWwgQmFyUG9zT2Zmc2V0WCA9IDE2OQ0KICAgIGxvY2FsIEJhclBvc09mZnNldFkgPSA0Nw0KICAgIGxvY2FsIENvcnJlY3Rpb25YID0gMTYNCiAgICBsb2NhbCBDb3JyZWN0aW9uWSA9IDQNCg0KICAgIGJhclBvcy54ID0gYmFyUG9zLnggKyAoYmFyUG9zT2Zmc2V0LnggLSAwLjUgKyBiYXJQb3NQZXJjZW50YWdlT2Zmc2V0LngpICogQmFyUG9zT2Zmc2V0WCArIENvcnJlY3Rpb25YDQogICAgYmFyUG9zLnkgPSBiYXJQb3MueSArIChiYXJQb3NPZmZzZXQueSAtIDAuNSArIGJhclBvc1BlcmNlbnRhZ2VPZmZzZXQueSkgKiBCYXJQb3NPZmZzZXRZICsgQ29ycmVjdGlvblkgDQoNCiAgICBsb2NhbCBTdGFydFBvcyA9IFBvaW50KGJhclBvcy54LCBiYXJQb3MueSkNCiAgICBsb2NhbCBFbmRQb3MgPSBQb2ludChiYXJQb3MueCArIDEwMywgYmFyUG9zLnkpDQoNCiAgICByZXR1cm4gUG9pbnQoU3RhcnRQb3MueCwgU3RhcnRQb3MueSksIFBvaW50KEVuZFBvcy54LCBFbmRQb3MueSkNCg0KZW5kDQoNCg0KZnVuY3Rpb24gRHJhd0luZGljYXRvcihlbmVteSkNCglsb2NhbCBRZG1nLCBXZG1nLCBFZG1nLCBBQWRtZyA9IGdldERtZygiUSIsIGVuZW15LCBteUhlcm8pLCBnZXREbWcoIlciLCBlbmVteSwgbXlIZXJvKSwgZ2V0RG1nKCJFIiwgZW5lbXksIG15SGVybyksIGdldERtZygiQUQiLCBlbmVteSwgbXlIZXJvKQ0KCQ0KCVFkbWcgPSAoKFEuSXNSZWFkeSBhbmQgUWRtZykgb3IgMCkNCglFZG1nID0gKChFLklzUmVhZHkgYW5kIEVkbWcpIG9yIDApDQoJUmRtZyA9ICgoUi5Jc1JlYWR5IGFuZCBSZG1nKSBvciAwKQ0KCUFBZG1nID0gKChBYWRtZykgb3IgMCkNCg0KICAgIGxvY2FsIGRhbWFnZSA9IFFkbWcgKyBFZG1nICsgUmRtZw0KDQogICAgbG9jYWwgU1BvcywgRVBvcyA9IEdldEVuZW15SFBCYXJQb3MoZW5lbXkpDQoNCiAgICBpZiBub3QgU1BvcyB0aGVuIHJldHVybiBlbmQNCg0KICAgIGxvY2FsIGJhcndpZHRoID0gRVBvcy54IC0gU1Bvcy54DQogICAgbG9jYWwgUG9zaXRpb24gPSBTUG9zLnggKyBtYXRoLm1heCgwLCAoZW5lbXkuaGVhbHRoIC0gZGFtYWdlKSAvIGVuZW15Lm1heEhlYWx0aCkgKiBiYXJ3aWR0aA0KDQoJRHJhd1RleHQoInwiLCAxNiwgbWF0aC5mbG9vcihQb3NpdGlvbiksIG1hdGguZmxvb3IoU1Bvcy55ICsgOCksIEFSR0IoMjU1LDAsMjU1LDApKQ0KICAgIERyYXdUZXh0KCJIUDogIi4ubWF0aC5mbG9vcihlbmVteS5oZWFsdGggLSBkYW1hZ2UpLCAxMiwgbWF0aC5mbG9vcihTUG9zLnggKyAyNSksIG1hdGguZmxvb3IoU1Bvcy55IC0gMTUpLCAoZW5lbXkuaGVhbHRoIC0gZGFtYWdlKSA+IDAgYW5kIEFSR0IoMjU1LCAwLCAyNTUsIDApIG9yICBBUkdCKDI1NSwgMjU1LCAwLCAwKSkNCmVuZA0KDQoNCi0tY2FyZHNlbGVjdGlvbnMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCg0KDQpmdW5jdGlvbiBjYXN0VygpDQogICAgaWYgVmFsaWRUYXJnZXQodGFyZ2V0KSB0aGVuIA0KCSAgICBsb2NhbCBOYW1lID0gbXlIZXJvOkdldFNwZWxsRGF0YShfVykubmFtZQ0KCQlzcGVsbE5hbWUgPSAiZ29sZGNhcmRsb2NrIg0KCQlpZiBOYW1lID09ICJQaWNrQUNhcmQiIHRoZW4NCgkJCUNhc3RTcGVsbChfVykNCgkJZW5kDQoJICAgIGlmIE5hbWUgPT0gc3BlbGxOYW1lIHRoZW4NCgkJQ2FzdFNwZWxsKF9XKQ0KCQlTZWxlY3RDYXJkID0gbmlsDQoJICAgIGVuZA0KCWVuZA0KZW5kCQ0KDQoNCmZ1bmN0aW9uIGNhc3RXYmx1ZSgpDQogICAgaWYgVmFsaWRUYXJnZXQodGFyZ2V0KSB0aGVuIA0KCSAgICBsb2NhbCBOYW1lID0gbXlIZXJvOkdldFNwZWxsRGF0YShfVykubmFtZQ0KCQlzcGVsbE5hbWUgPSAiYmx1ZWNhcmRsb2NrIg0KCQlpZiBOYW1lID09ICJQaWNrQUNhcmQiIHRoZW4NCgkJCUNhc3RTcGVsbChfVykNCgkJZW5kDQoJICAgIGlmIE5hbWUgPT0gc3BlbGxOYW1lIHRoZW4NCgkJQ2FzdFNwZWxsKF9XKQ0KCQlTZWxlY3RDYXJkID0gbmlsDQoJICAgIGVuZA0KCWVuZA0KZW5kCQ0KDQoNCmZ1bmN0aW9uIGNhc3RXcmVkKCkNCiAgICANCgkgICAgbG9jYWwgTmFtZSA9IG15SGVybzpHZXRTcGVsbERhdGEoX1cpLm5hbWUNCgkJc3BlbGxOYW1lID0gInJlZGNhcmRsb2NrIg0KCQlpZiBOYW1lID09ICJQaWNrQUNhcmQiIHRoZW4NCgkJCUNhc3RTcGVsbChfVykNCgkJZW5kDQoJICAgIGlmIE5hbWUgPT0gc3BlbGxOYW1lIHRoZW4NCgkJQ2FzdFNwZWxsKF9XKQ0KCQlTZWxlY3RDYXJkID0gbmlsDQoJICAgIGVuZA0KCQ0KZW5kCQ0KDQoNCmZ1bmN0aW9uIGNhc3RXYmx1ZWZhcm0oKQ0KICAgIA0KCSAgICBsb2NhbCBOYW1lID0gbXlIZXJvOkdldFNwZWxsRGF0YShfVykubmFtZQ0KCQlzcGVsbE5hbWUgPSAiYmx1ZWNhcmRsb2NrIg0KCQlpZiBOYW1lID09ICJQaWNrQUNhcmQiIHRoZW4NCgkJCUNhc3RTcGVsbChfVykNCgkJZW5kDQoJICAgIGlmIE5hbWUgPT0gc3BlbGxOYW1lIHRoZW4NCgkJQ2FzdFNwZWxsKF9XKQ0KCQlTZWxlY3RDYXJkID0gbmlsDQoJICAgIGVuZA0KCQ0KZW5kDQoNCmZ1bmN0aW9uIGNhc3RXZygpDQogICAgDQoJICAgIGxvY2FsIE5hbWUgPSBteUhlcm86R2V0U3BlbGxEYXRhKF9XKS5uYW1lDQoJCXNwZWxsTmFtZSA9ICJnb2xkY2FyZGxvY2siDQoJCWlmIE5hbWUgPT0gIlBpY2tBQ2FyZCIgdGhlbg0KCQkJQ2FzdFNwZWxsKF9XKQ0KCQllbmQNCgkgICAgaWYgTmFtZSA9PSBzcGVsbE5hbWUgdGhlbg0KCQlDYXN0U3BlbGwoX1cpDQoJCVNlbGVjdENhcmQgPSBuaWwNCgkgICAgZW5kDQoJDQplbmQNCg0KDQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1aaG9ueWEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KDQoNCmZ1bmN0aW9uIEdldFNsb3RJdGVtKGlkLCB1bml0KQ0KCQ0KCXVuaXQgCQk9IHVuaXQgb3IgbXlIZXJvDQoNCglpZiAobm90IEl0ZW1OYW1lc1tpZF0pIHRoZW4NCgkJcmV0dXJuIF9fX0dldEludmVudG9yeVNsb3RJdGVtKGlkLCB1bml0KQ0KCWVuZA0KDQoJbG9jYWwgbmFtZQk9IEl0ZW1OYW1lc1tpZF0NCgkNCglmb3Igc2xvdCA9IElURU1fMSwgSVRFTV83IGRvDQoJCWxvY2FsIGl0ZW0gPSB1bml0OkdldFNwZWxsRGF0YShzbG90KS5uYW1lDQoJCWlmICgoI2l0ZW0gPiAwKSBhbmQgKGl0ZW06bG93ZXIoKSA9PSBuYW1lOmxvd2VyKCkpKSB0aGVuDQoJCQlyZXR1cm4gc2xvdA0KCQllbmQNCgllbmQNCg0KZW5kDQoNCg0KDQpmdW5jdGlvbiBaaG9ueWEoKQ0KCWxvY2FsIFNsb3QgPSBHZXRJbnZlbnRvcnlTbG90SXRlbSgzMTU3KQ0KCQlpZiBTbG90IH49IG5pbCBhbmQgbXlIZXJvOkNhblVzZVNwZWxsKFNsb3QpID09IFJFQURZIHRoZW4NCgkJCWxvY2FsIFJhbmdlID0gOTAwDQoJCQlsb2NhbCBBbW91bnQgPSBIYXpNZW51Lk1pc2MuQW1vdW50DQoJCQlsb2NhbCBoZWFsdGggPSBteUhlcm8uaGVhbHRoDQoJCQlsb2NhbCBtYXhIZWFsdGggPSBteUhlcm8ubWF4SGVhbHRoDQoJCQkJaWYgKChoZWFsdGgvbWF4SGVhbHRoKSoxMDApIDw9IEhhek1lbnUuTWlzYy56aG9ueWFIUCBhbmQgQ291bnRFbmVteUhlcm9JblJhbmdlKFJhbmdlKSA+PSBBbW91bnQgdGhlbg0KCQkJQ2FzdFNwZWxsKFNsb3QpDQoJCWVuZA0KCWVuZA0KZW5kDQoNCg0KZnVuY3Rpb24gQ291bnRFbmVteUhlcm9JblJhbmdlKHJhbmdlKQ0KCWxvY2FsIGVuZW15SW5SYW5nZSA9IDANCgkJZm9yIGkgPSAxLCBoZXJvTWFuYWdlci5pQ291bnQsIDEgZG8NCgkJCWxvY2FsIGhlcm8gPSBoZXJvTWFuYWdlcjpnZXRIZXJvKGkpDQoJCQkJaWYgVmFsaWRUYXJnZXQoaGVybyxyYW5nZSkgdGhlbg0KCQkJZW5lbXlJblJhbmdlID0gZW5lbXlJblJhbmdlICsgMQ0KCQkJZW5kDQoJCWVuZA0KCXJldHVybiBlbmVteUluUmFuZ2UNCmVuZA0KDQoNCg0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQoNCg0KDQo="), nil, "bt", _ENV))()
Advertisement
Add Comment
Please, Sign In to add comment