IyBjb3B5cmlnaHQgMTk5Ny0yMDAwIEp1c3QgdmFuIFJvc3N1bSwgTGV0dGVycm9yLiBqdXN0QGxldHRlcnJvci5jb20KCmltcG9ydCBTcGxhc2gKCmltcG9ydCBGcmFtZVdvcmsKaW1wb3J0IFdhcHBsaWNhdGlvbgppbXBvcnQgVwppbXBvcnQgb3MKaW1wb3J0IG1hY2ZzCgoKY2xhc3MgUHl0aG9uSURFKFdhcHBsaWNhdGlvbi5BcHBsaWNhdGlvbik6CgkKCWRlZiBfX2luaXRfXyhzZWxmKToKCQlzZWxmLnByZWZmaWxlcGF0aCA9ICI6UHl0aG9uOlB5dGhvbklERSBwcmVmZXJlbmNlcyIKCQlXYXBwbGljYXRpb24uQXBwbGljYXRpb24uX19pbml0X18oc2VsZiwgJ1BpZGUnKQoJCWltcG9ydCBBRSwgQXBwbGVFdmVudHMKCQkKCQlBRS5BRUluc3RhbGxFdmVudEhhbmRsZXIoQXBwbGVFdmVudHMua0NvcmVFdmVudENsYXNzLCBBcHBsZUV2ZW50cy5rQUVPcGVuQXBwbGljYXRpb24sIAoJCQkJc2VsZi5pZ25vcmVldmVudCkKCQlBRS5BRUluc3RhbGxFdmVudEhhbmRsZXIoQXBwbGVFdmVudHMua0NvcmVFdmVudENsYXNzLCBBcHBsZUV2ZW50cy5rQUVQcmludERvY3VtZW50cywgCgkJCQlzZWxmLmlnbm9yZWV2ZW50KQoJCUFFLkFFSW5zdGFsbEV2ZW50SGFuZGxlcihBcHBsZUV2ZW50cy5rQ29yZUV2ZW50Q2xhc3MsIEFwcGxlRXZlbnRzLmtBRU9wZW5Eb2N1bWVudHMsIAoJCQkJc2VsZi5vcGVuZG9jc2V2ZW50KQoJCUFFLkFFSW5zdGFsbEV2ZW50SGFuZGxlcihBcHBsZUV2ZW50cy5rQ29yZUV2ZW50Q2xhc3MsIEFwcGxlRXZlbnRzLmtBRVF1aXRBcHBsaWNhdGlvbiwgCgkJCQlzZWxmLnF1aXRldmVudCkKCQlpbXBvcnQgUHlDb25zb2xlLCBQeUVkaXQKCQlTcGxhc2gud2FpdCgpCgkJU3BsYXNoLnVuaW5zdGFsbF9pbXBvcnRob29rKCkKCQlQeUNvbnNvbGUuaW5zdGFsbG91dHB1dCgpCgkJUHlDb25zb2xlLmluc3RhbGxjb25zb2xlKCkKCQlpbXBvcnQgc3lzCgkJZm9yIHBhdGggaW4gc3lzLmFyZ3ZbMTpdOgoJCQlzZWxmLm9wZW5kb2MocGF0aCkKCQl0cnk6CgkJCWltcG9ydCBXdGhyZWFkaW5nCgkJZXhjZXB0IEltcG9ydEVycm9yOgoJCQlzZWxmLm1haW5sb29wKCkKCQllbHNlOgoJCQlpZiBXdGhyZWFkaW5nLmhhdmVUaHJlYWRpbmc6CgkJCQlzZWxmLm1haW50aHJlYWQgPSBXdGhyZWFkaW5nLlRocmVhZCgiSURFIGV2ZW50IGxvb3AiLCBzZWxmLm1haW5sb29wKQoJCQkJc2VsZi5tYWludGhyZWFkLnN0YXJ0KCkKCQkJCSNzZWxmLm1haW50aHJlYWQuc2V0UmVzaXN0YW50KDEpCgkJCQlXdGhyZWFkaW5nLnJ1bigpCgkJCWVsc2U6CgkJCQlzZWxmLm1haW5sb29wKCkKCQoJZGVmIG1ha2V1c2VybWVudXMoc2VsZik6CgkJbSA9IFdhcHBsaWNhdGlvbi5NZW51KHNlbGYubWVudWJhciwgIkZpbGUiKQoJCW5ld2l0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIk5ldyIsICJOIiwgJ25ldycpCgkJb3Blbml0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIk9wZW6KIiwgIk8iLCAnb3BlbicpCgkJRnJhbWVXb3JrLlNlcGFyYXRvcihtKQoJCWNsb3NlaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiQ2xvc2UiLCAiVyIsICdjbG9zZScpCgkJc2F2ZWl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlNhdmUiLCAiUyIsICdzYXZlJykKCQlzYXZlYXNpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJTYXZlIGFziiIsIE5vbmUsICdzYXZlX2FzJykKCQlGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCgkJc2F2ZWFzYXBwbGV0aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiU2F2ZSBhcyBBcHBsZXSKIiwgTm9uZSwgJ3NhdmVfYXNfYXBwbGV0JykKCQlGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCgkJcXVpdGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlF1aXQiLCAiUSIsICdxdWl0JykKCQkKCQltID0gV2FwcGxpY2F0aW9uLk1lbnUoc2VsZi5tZW51YmFyLCAiRWRpdCIpCgkJdW5kb2l0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlVuZG8iLCAnWicsICJ1bmRvIikKCQlGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCgkJY3V0aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiQ3V0IiwgJ1gnLCAiY3V0IikKCQljb3B5aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiQ29weSIsICJDIiwgImNvcHkiKQoJCXBhc3RlaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUGFzdGUiLCAiViIsICJwYXN0ZSIpCgkJRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJDbGVhciIsIE5vbmUsICAiY2xlYXIiKQoJCUZyYW1lV29yay5TZXBhcmF0b3IobSkKCQlzZWxhbGxpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJTZWxlY3QgYWxsIiwgIkEiLCAic2VsZWN0YWxsIikKCQlzZWxsaW5laXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiU2VsZWN0IGxpbmUiLCAiTCIsICJzZWxlY3RsaW5lIikKCQlGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCgkJZmluZGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIkZpbmSKIiwgIkYiLCAiZmluZCIpCgkJZmluZGFnYWluaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiRmluZCBhZ2FpbiIsICdHJywgImZpbmRuZXh0IikKCQllbnRlcnNlbGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIkVudGVyIHNlYXJjaCBzdHJpbmciLCAiRSIsICJlbnRlcnNlYXJjaHN0cmluZyIpCgkJcmVwbGFjZWl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlJlcGxhY2UiLCBOb25lLCAicmVwbGFjZSIpCgkJcmVwbGFjZWZpbmRpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJSZXBsYWNlICYgZmluZCBhZ2FpbiIsICdUJywgInJlcGxhY2VmaW5kIikKCQlGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCgkJc2hpZnRsZWZ0aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiU2hpZnQgbGVmdCIsICJbIiwgInNoaWZ0bGVmdCIpCgkJc2hpZnRyaWdodGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlNoaWZ0IHJpZ2h0IiwgIl0iLCAic2hpZnRyaWdodCIpCgkJCgkJbSA9IFdhcHBsaWNhdGlvbi5NZW51KHNlbGYubWVudWJhciwgIlB5dGhvbiIpCgkJcnVuaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUnVuIHdpbmRvdyIsICJSIiwgJ3J1bicpCgkJcnVuc2VsaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUnVuIHNlbGVjdGlvbiIsIE5vbmUsICdydW5zZWxlY3Rpb24nKQoJCUZyYW1lV29yay5TZXBhcmF0b3IobSkKCQltb2RpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJNb2R1bGUgYnJvd3NlcooiLCAiTSIsIHNlbGYuZG9tZW51X21vZHVsZWJyb3dzZXIpCgkJRnJhbWVXb3JrLlNlcGFyYXRvcihtKQoJCW1tID0gRnJhbWVXb3JrLlN1Yk1lbnUobSwgIlByZWZlcmVuY2VzIikKCQlGcmFtZVdvcmsuTWVudUl0ZW0obW0sICJTZXQgU2NyaXB0cyBmb2xkZXKKIiwgTm9uZSwgc2VsZi5kb19zZXRzY3JpcHRzZm9sZGVyKQoJCUZyYW1lV29yay5NZW51SXRlbShtbSwgIkVkaXRvciBkZWZhdWx0IHNldHRpbmdziiIsIE5vbmUsIHNlbGYuZG9fZWRpdG9ycHJlZnMpCgkJRnJhbWVXb3JrLk1lbnVJdGVtKG1tLCAiU2V0IGRlZmF1bHQgd2luZG93IGZvbnSKIiwgTm9uZSwgc2VsZi5kb19zZXR3aW5kb3dmb250KQoJCQoJCXNlbGYub3BlbndpbmRvd3NtZW51ID0gV2FwcGxpY2F0aW9uLk1lbnUoc2VsZi5tZW51YmFyLCAnV2luZG93cycpCgkJc2VsZi5tYWtlb3BlbndpbmRvd3NtZW51KCkKCQlzZWxmLl9tZW51c3RvY2hlY2sgPSBbY2xvc2VpdGVtLCBzYXZlaXRlbSwgc2F2ZWFzaXRlbSwgc2F2ZWFzYXBwbGV0aXRlbSwKCQkJCXVuZG9pdGVtLCBjdXRpdGVtLCBjb3B5aXRlbSwgcGFzdGVpdGVtLCAKCQkJCXNlbGFsbGl0ZW0sIHNlbGxpbmVpdGVtLCAKCQkJCWZpbmRpdGVtLCBmaW5kYWdhaW5pdGVtLCBlbnRlcnNlbGl0ZW0sIHJlcGxhY2VpdGVtLCByZXBsYWNlZmluZGl0ZW0sCgkJCQlzaGlmdGxlZnRpdGVtLCBzaGlmdHJpZ2h0aXRlbSwgCgkJCQlydW5pdGVtLCBydW5zZWxpdGVtXQoJCQoJCXByZWZzID0gc2VsZi5nZXRwcmVmcygpCgkJdHJ5OgoJCQlmc3MsIGZzc19jaGFuZ2VkID0gbWFjZnMuUmF3QWxpYXMocHJlZnMuc2NyaXB0c2ZvbGRlcikuUmVzb2x2ZSgpCgkJCXNlbGYuc2NyaXB0c2ZvbGRlciA9IGZzcy5OZXdBbGlhcygpCgkJZXhjZXB0OgoJCQlwYXRoID0gb3MucGF0aC5qb2luKG9zLmdldGN3ZCgpLCAiOk1hYzpJREUgc2NyaXB0cyIpCgkJCWlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKToKCQkJCXBhdGggPSBvcy5wYXRoLmpvaW4ob3MuZ2V0Y3dkKCksICJTY3JpcHRzIikKCQkJCWlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKToKCQkJCQlvcy5ta2RpcihwYXRoKQoJCQkJCWYgPSBvcGVuKG9zLnBhdGguam9pbihwYXRoLCAiUGxhY2UgeW91ciBzY3JpcHRzIGhlcmWKIiksICJ3IikKCQkJCQlmLmNsb3NlKCkKCQkJZnNzID0gbWFjZnMuRlNTcGVjKHBhdGgpCgkJCXNlbGYuc2NyaXB0c2ZvbGRlciA9IGZzcy5OZXdBbGlhcygpCgkJCXNlbGYuc2NyaXB0c2ZvbGRlcm1vZHRpbWUgPSBmc3MuR2V0RGF0ZXMoKVsxXQoJCWVsc2U6CgkJCXNlbGYuc2NyaXB0c2ZvbGRlcm1vZHRpbWUgPSBmc3MuR2V0RGF0ZXMoKVsxXQoJCXByZWZzLnNjcmlwdHNmb2xkZXIgPSBzZWxmLnNjcmlwdHNmb2xkZXIuZGF0YQoJCXNlbGYuX3NjcmlwdHMgPSB7fQoJCXNlbGYuc2NyaXB0c21lbnUgPSBOb25lCgkJc2VsZi5tYWtlc2NyaXB0c21lbnUoKQoJCglkZWYgcXVpdGV2ZW50KHNlbGYsIHRoZUFwcGxlRXZlbnQsIHRoZVJlcGx5KToKCQlpbXBvcnQgQUUKCQlBRS5BRUludGVyYWN0V2l0aFVzZXIoNTAwMDAwMDApCgkJc2VsZi5fcXVpdCgpCgkKCWRlZiBzdXNwZW5kcmVzdW1lKHNlbGYsIG9ub2ZmKToKCQlpZiBvbm9mZjoKCQkJZnNzLCBmc3NfY2hhbmdlZCA9IHNlbGYuc2NyaXB0c2ZvbGRlci5SZXNvbHZlKCkKCQkJbW9kdGltZSA9IGZzcy5HZXREYXRlcygpWzFdCgkJCWlmIHNlbGYuc2NyaXB0c2ZvbGRlcm1vZHRpbWUgPD4gbW9kdGltZSBvciBmc3NfY2hhbmdlZDoKCQkJCXNlbGYuc2NyaXB0c2ZvbGRlcm1vZHRpbWUgPSBtb2R0aW1lCgkJCQlXLlNldEN1cnNvcignd2F0Y2gnKQoJCQkJc2VsZi5tYWtlc2NyaXB0c21lbnUoKQoJCglkZWYgaWdub3JlZXZlbnQoc2VsZiwgdGhlQXBwbGVFdmVudCwgdGhlUmVwbHkpOgoJCXBhc3MKCQoJZGVmIG9wZW5kb2NzZXZlbnQoc2VsZiwgdGhlQXBwbGVFdmVudCwgdGhlUmVwbHkpOgoJCVcuU2V0Q3Vyc29yKCd3YXRjaCcpCgkJaW1wb3J0IGFldG9vbHMKCQlwYXJhbWV0ZXJzLCBhcmdzID0gYWV0b29scy51bnBhY2tldmVudCh0aGVBcHBsZUV2ZW50KQoJCWRvY3MgPSBwYXJhbWV0ZXJzWyctLS0tJ10KCQlpZiB0eXBlKGRvY3MpIDw+IHR5cGUoW10pOgoJCQlkb2NzID0gW2RvY3NdCgkJZm9yIGRvYyBpbiBkb2NzOgoJCQlmc3MsIGEgPSBkb2MuUmVzb2x2ZSgpCgkJCXBhdGggPSBmc3MuYXNfcGF0aG5hbWUoKQoJCQlzZWxmLm9wZW5kb2MocGF0aCkKCQoJZGVmIG9wZW5kb2Moc2VsZiwgcGF0aCk6CgkJZmNyZWF0b3IsIGZ0eXBlID0gbWFjZnMuRlNTcGVjKHBhdGgpLkdldENyZWF0b3JUeXBlKCkKCQlpZiBmdHlwZSA9PSAnVEVYVCc6CgkJCXNlbGYub3BlbnNjcmlwdChwYXRoKQoJCWVsc2U6CgkJCVcuTWVzc2FnZSgiQ2FuuXQgb3BlbiBmaWxlIG9mIHR5cGUgJyVzJy4iICUgZnR5cGUpCgkKCWRlZiBnZXRhYm91dHRleHQoc2VsZik6CgkJcmV0dXJuICJBYm91dCBQeXRob24gSURFiiIKCQoJZGVmIGRvX2Fib3V0KHNlbGYsIGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KToKCQlTcGxhc2guYWJvdXQoKQoJCglkZWYgZG9fc2V0c2NyaXB0c2ZvbGRlcihzZWxmLCAqYXJncyk6CgkJZnNzLCBvayA9IG1hY2ZzLkdldERpcmVjdG9yeSgiU2VsZWN0IFNjcmlwdHMgRm9sZGVyIikKCQlpZiBvazoKCQkJcHJlZnMgPSBzZWxmLmdldHByZWZzKCkKCQkJYWxpcyA9IGZzcy5OZXdBbGlhcygpCgkJCXByZWZzLnNjcmlwdHNmb2xkZXIgPSBhbGlzLmRhdGEKCQkJc2VsZi5zY3JpcHRzZm9sZGVyID0gYWxpcwoJCQlzZWxmLm1ha2VzY3JpcHRzbWVudSgpCgkJCXByZWZzLnNhdmUoKQoJCglkZWYgZG9tZW51X21vZHVsZWJyb3dzZXIoc2VsZiwgKmFyZ3MpOgoJCVcuU2V0Q3Vyc29yKCd3YXRjaCcpCgkJaW1wb3J0IE1vZHVsZUJyb3dzZXIKCQlNb2R1bGVCcm93c2VyLk1vZHVsZUJyb3dzZXIoKQoJCglkZWYgZG9tZW51X29wZW4oc2VsZiwgKmFyZ3MpOgoJCWZzcywgb2sgPSBtYWNmcy5TdGFuZGFyZEdldEZpbGUoIlRFWFQiKQoJCWlmIG9rOgoJCQlzZWxmLm9wZW5zY3JpcHQoZnNzLmFzX3BhdGhuYW1lKCkpCgkKCWRlZiBkb21lbnVfbmV3KHNlbGYsICphcmdzKToKCQlXLlNldEN1cnNvcignd2F0Y2gnKQoJCWltcG9ydCBQeUVkaXQKCQlyZXR1cm4gUHlFZGl0LkVkaXRvcigpCgkKCWRlZiBtYWtlc2NyaXB0c21lbnUoc2VsZik6CgkJVy5TZXRDdXJzb3IoJ3dhdGNoJykKCQlpZiBzZWxmLl9zY3JpcHRzOgoJCQlmb3IgaWQsIGl0ZW0gaW4gc2VsZi5fc2NyaXB0cy5rZXlzKCk6CgkJCQlpZiBzZWxmLm1lbnViYXIubWVudXMuaGFzX2tleShpZCk6CgkJCQkJbSA9IHNlbGYubWVudWJhci5tZW51c1tpZF0KCQkJCQltLmRlbGV0ZSgpCgkJCXNlbGYuX3NjcmlwdHMgPSB7fQoJCWlmIHNlbGYuc2NyaXB0c21lbnU6CgkJCWlmIGhhc2F0dHIoc2VsZi5zY3JpcHRzbWVudSwgJ2lkJykgYW5kIHNlbGYubWVudWJhci5tZW51cy5oYXNfa2V5KHNlbGYuc2NyaXB0c21lbnUuaWQpOgoJCQkJc2VsZi5zY3JpcHRzbWVudS5kZWxldGUoKQoJCXNlbGYuc2NyaXB0c21lbnUgPSBGcmFtZVdvcmsuTWVudShzZWxmLm1lbnViYXIsICJTY3JpcHRzIikKCQkjRnJhbWVXb3JrLk1lbnVJdGVtKHNlbGYuc2NyaXB0c21lbnUsICJOZXcgc2NyaXB0IiwgTm9uZSwgc2VsZi5kb21lbnVfbmV3KQoJCSNzZWxmLnNjcmlwdHNtZW51LmFkZHNlcGFyYXRvcigpCgkJZnNzLCBmc3NfY2hhbmdlZCA9IHNlbGYuc2NyaXB0c2ZvbGRlci5SZXNvbHZlKCkKCQlzZWxmLnNjcmlwdHN3YWxrKGZzcy5hc19wYXRobmFtZSgpLCBzZWxmLnNjcmlwdHNtZW51KQoJCglkZWYgbWFrZW9wZW53aW5kb3dzbWVudShzZWxmKToKCQlmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5vcGVud2luZG93c21lbnUuaXRlbXMpKToKCQkJc2VsZi5vcGVud2luZG93c21lbnUubWVudS5EZWxldGVNZW51SXRlbSgxKQoJCQlzZWxmLm9wZW53aW5kb3dzbWVudS5pdGVtcyA9IFtdCgkJd2luZG93cyA9IFtdCgkJc2VsZi5fb3BlbndpbmRvd3MgPSB7fQoJCWZvciB3aW5kb3cgaW4gc2VsZi5fd2luZG93cy5rZXlzKCk6CgkJCXRpdGxlID0gd2luZG93LkdldFdUaXRsZSgpCgkJCWlmIG5vdCB0aXRsZToKCQkJCXRpdGxlID0gIjxubyB0aXRsZT4iCgkJCXdpbmRvd3MuYXBwZW5kKCh0aXRsZSwgd2luZG93KSkKCQl3aW5kb3dzLnNvcnQoKQoJCWZvciB0aXRsZSwgd2luZG93IGluIHdpbmRvd3M6CgkJCWlmIHRpdGxlID09ICJQeXRob24gSW50ZXJhY3RpdmUiOgkjIHVnbHkgYnV0IHVzZWZ1bCBoYWNrIGJ5IEpvZSBTdHJvdXQKCQkJCXNob3J0Y3V0ID0gJzAnCgkJCWVsc2U6IAoJCQkJc2hvcnRjdXQgPSBOb25lCgkJCWl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0oc2VsZi5vcGVud2luZG93c21lbnUsIHRpdGxlLCBzaG9ydGN1dCwgY2FsbGJhY2sgPSBzZWxmLmRvbWVudV9vcGVud2luZG93cykKCQkJc2VsZi5fb3BlbndpbmRvd3NbaXRlbS5pdGVtXSA9IHdpbmRvdwoJCXNlbGYuX29wZW53aW5kb3dzY2hlY2ttYXJrID0gMAoJCXNlbGYuY2hlY2tvcGVud2luZG93c21lbnUoKQoJCQoJZGVmIGRvbWVudV9vcGVud2luZG93cyhzZWxmLCBpZCwgaXRlbSwgd2luZG93LCBldmVudCk6CgkJdyA9IHNlbGYuX29wZW53aW5kb3dzW2l0ZW1dCgkJdy5TaG93V2luZG93KCkKCQl3LlNlbGVjdFdpbmRvdygpCgkKCWRlZiBkb21lbnVfcXVpdChzZWxmKToKCQlzZWxmLl9xdWl0KCkKCQoJZGVmIGRvbWVudV9zYXZlKHNlbGYsICphcmdzKToKCQlwcmludCAiU2F2ZSIKCQoJZGVmIF9xdWl0KHNlbGYpOgoJCWltcG9ydCBQeUNvbnNvbGUsIFB5RWRpdAoJCVB5Q29uc29sZS5jb25zb2xlLndyaXRlcHJlZnMoKQoJCVB5Q29uc29sZS5vdXRwdXQud3JpdGVwcmVmcygpCgkJUHlFZGl0LnNlYXJjaGVuZ2luZS53cml0ZXByZWZzKCkKCQlmb3Igd2luZG93IGluIHNlbGYuX3dpbmRvd3MudmFsdWVzKCk6CgkJCXRyeToKCQkJCXJ2ID0gd2luZG93LmNsb3NlKCkgIyBpZ25vcmUgYW55IGVycm9ycyB3aGlsZSBxdWl0dGluZwoJCQlleGNlcHQ6CgkJCQlydiA9IDAgICAjIChvdGhlcndpc2UsIHdlIGNhbiBnZXQgc3R1Y2shKQoJCQlpZiBydiBhbmQgcnYgPiAwOgoJCQkJcmV0dXJuCgkJc2VsZi5xdWl0dGluZyA9IDEKClB5dGhvbklERSgpCgo=