IyEvdXNyL2Jpbi9weXRob24gLXUKIwojIHRoaXMgdGVzdHMgdGhlIGJhc2ljIEFQSXMgb2YgdGhlIFhtbFRleHRSZWFkZXIgaW50ZXJmYWNlCiMKaW1wb3J0IGxpYnhtbDIKaW1wb3J0IFN0cmluZ0lPCmltcG9ydCBzeXMKCiMgTWVtb3J5IGRlYnVnIHNwZWNpZmljCmxpYnhtbDIuZGVidWdNZW1vcnkoMSkKCmYgPSBTdHJpbmdJTy5TdHJpbmdJTygiIiI8YT48YiBiMT0iYjEiLz48Yz5jb250ZW50IG9mIGM8L2M+PC9hPiIiIikKaW5wdXQgPSBsaWJ4bWwyLmlucHV0QnVmZmVyKGYpCnJlYWRlciA9IGlucHV0Lm5ld1RleHRSZWFkZXIoInRlc3QxIikKcmV0ID0gcmVhZGVyLlJlYWQoKQppZiByZXQgIT0gMToKICAgIHByaW50ICJ0ZXN0MTogRXJyb3IgcmVhZGluZyB0byBmaXJzdCBlbGVtZW50IgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAiYSIgb3IgcmVhZGVyLklzRW1wdHlFbGVtZW50KCkgIT0gMCBvciBcCiAgIHJlYWRlci5Ob2RlVHlwZSgpICE9IDEgb3IgcmVhZGVyLkhhc0F0dHJpYnV0ZXMoKSAhPSAwOgogICAgcHJpbnQgInRlc3QxOiBFcnJvciByZWFkaW5nIHRoZSBmaXJzdCBlbGVtZW50IgogICAgc3lzLmV4aXQoMSkKcmV0ID0gcmVhZGVyLlJlYWQoKQppZiByZXQgIT0gMToKICAgIHByaW50ICJ0ZXN0MTogRXJyb3IgcmVhZGluZyB0byBzZWNvbmQgZWxlbWVudCIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gImIiIG9yIHJlYWRlci5Jc0VtcHR5RWxlbWVudCgpICE9IDEgb3IgXAogICByZWFkZXIuTm9kZVR5cGUoKSAhPSAxIG9yIHJlYWRlci5IYXNBdHRyaWJ1dGVzKCkgIT0gMToKICAgIHByaW50ICJ0ZXN0MTogRXJyb3IgcmVhZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQiCiAgICBzeXMuZXhpdCgxKQpyZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQgInRlc3QxOiBFcnJvciByZWFkaW5nIHRvIHRoaXJkIGVsZW1lbnQiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZSgpICE9ICJjIiBvciByZWFkZXIuSXNFbXB0eUVsZW1lbnQoKSAhPSAwIG9yIFwKICAgcmVhZGVyLk5vZGVUeXBlKCkgIT0gMSBvciByZWFkZXIuSGFzQXR0cmlidXRlcygpICE9IDA6CiAgICBwcmludCAidGVzdDE6IEVycm9yIHJlYWRpbmcgdGhlIHRoaXJkIGVsZW1lbnQiCiAgICBzeXMuZXhpdCgxKQpyZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQgInRlc3QxOiBFcnJvciByZWFkaW5nIHRvIHRleHQgbm9kZSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gIiN0ZXh0IiBvciByZWFkZXIuSXNFbXB0eUVsZW1lbnQoKSAhPSAwIG9yIFwKICAgcmVhZGVyLk5vZGVUeXBlKCkgIT0gMyBvciByZWFkZXIuSGFzQXR0cmlidXRlcygpICE9IDAgb3IgXAogICByZWFkZXIuVmFsdWUoKSAhPSAiY29udGVudCBvZiBjIjoKICAgIHByaW50ICJ0ZXN0MTogRXJyb3IgcmVhZGluZyB0aGUgdGV4dCBub2RlIgogICAgc3lzLmV4aXQoMSkKcmV0ID0gcmVhZGVyLlJlYWQoKQppZiByZXQgIT0gMToKICAgIHByaW50ICJ0ZXN0MTogRXJyb3IgcmVhZGluZyB0byBlbmQgb2YgdGhpcmQgZWxlbWVudCIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gImMiIG9yIHJlYWRlci5Jc0VtcHR5RWxlbWVudCgpICE9IDAgb3IgXAogICByZWFkZXIuTm9kZVR5cGUoKSAhPSAxNSBvciByZWFkZXIuSGFzQXR0cmlidXRlcygpICE9IDA6CiAgICBwcmludCAidGVzdDE6IEVycm9yIHJlYWRpbmcgdGhlIGVuZCBvZiB0aGlyZCBlbGVtZW50IgogICAgc3lzLmV4aXQoMSkKcmV0ID0gcmVhZGVyLlJlYWQoKQppZiByZXQgIT0gMToKICAgIHByaW50ICJ0ZXN0MTogRXJyb3IgcmVhZGluZyB0byBlbmQgb2YgZmlyc3QgZWxlbWVudCIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gImEiIG9yIHJlYWRlci5Jc0VtcHR5RWxlbWVudCgpICE9IDAgb3IgXAogICByZWFkZXIuTm9kZVR5cGUoKSAhPSAxNSBvciByZWFkZXIuSGFzQXR0cmlidXRlcygpICE9IDA6CiAgICBwcmludCAidGVzdDE6IEVycm9yIHJlYWRpbmcgdGhlIGVuZCBvZiBmaXJzdCBlbGVtZW50IgogICAgc3lzLmV4aXQoMSkKcmV0ID0gcmVhZGVyLlJlYWQoKQppZiByZXQgIT0gMDoKICAgIHByaW50ICJ0ZXN0MTogRXJyb3IgcmVhZGluZyB0byBlbmQgb2YgZG9jdW1lbnQiCiAgICBzeXMuZXhpdCgxKQoKIwojIGV4YW1wbGUgZnJvbSB0aGUgWG1sVGV4dFJlYWRlciBkb2NzCiMKZiA9IFN0cmluZ0lPLlN0cmluZ0lPKCIiIjx0ZXN0IHhtbG5zOmR0PSJ1cm46ZGF0YXR5cGVzIiBkdDp0eXBlPSJpbnQiLz4iIiIpCmlucHV0ID0gbGlieG1sMi5pbnB1dEJ1ZmZlcihmKQpyZWFkZXIgPSBpbnB1dC5uZXdUZXh0UmVhZGVyKCJ0ZXN0MiIpCgpyZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQgIkVycm9yIHJlYWRpbmcgdGVzdCBlbGVtZW50IgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLkdldEF0dHJpYnV0ZU5vKDApICE9ICJ1cm46ZGF0YXR5cGVzIiBvciBcCiAgIHJlYWRlci5HZXRBdHRyaWJ1dGVObygxKSAhPSAiaW50IiBvciBcCiAgIHJlYWRlci5HZXRBdHRyaWJ1dGVOcygidHlwZSIsICJ1cm46ZGF0YXR5cGVzIikgIT0gImludCIgb3IgXAogICByZWFkZXIuR2V0QXR0cmlidXRlKCJkdDp0eXBlIikgIT0gImludCI6CiAgICBwcmludCAiZXJyb3IgcmVhZGluZyB0ZXN0IGF0dHJpYnV0ZXMiCiAgICBzeXMuZXhpdCgxKQoKIwojIGV4YW1wbGUgZnJvbSB0aGUgWG1sVGV4dFJlYWRlciBkb2NzCiMKZiA9IFN0cmluZ0lPLlN0cmluZ0lPKCIiIjxyb290IHhtbG5zOmE9InVybjo0NTYiPgo8aXRlbT4KPHJlZiBocmVmPSJhOmIiLz4KPC9pdGVtPgo8L3Jvb3Q+IiIiKQppbnB1dCA9IGxpYnhtbDIuaW5wdXRCdWZmZXIoZikKcmVhZGVyID0gaW5wdXQubmV3VGV4dFJlYWRlcigidGVzdDMiKQoKcmV0ID0gcmVhZGVyLlJlYWQoKQp3aGlsZSByZXQgPT0gMToKICAgIGlmIHJlYWRlci5OYW1lKCkgPT0gInJlZiI6CiAgICAgICAgaWYgcmVhZGVyLkxvb2t1cE5hbWVzcGFjZSgiYSIpICE9ICJ1cm46NDU2IjoKCSAgICBwcmludCAiZXJyb3IgcmVzb2x2aW5nIG5hbWVzcGFjZSBwcmVmaXgiCgkgICAgc3lzLmV4aXQoMSkKCWJyZWFrCiAgICByZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQgIkVycm9yIGZpbmRpbmcgdGhlIHJlZiBlbGVtZW50IgogICAgc3lzLmV4aXQoMSkKCiMKIyBIb21lIG1hZGUgZXhhbXBsZSBmb3IgdGhlIHZhcmlvdXMgYXR0cmlidXRlIGFjY2VzcyBmdW5jdGlvbnMKIwpmID0gU3RyaW5nSU8uU3RyaW5nSU8oIiIiPHRlc3RhdHRyIHhtbG5zPSJ1cm46MSIgeG1sbnM6YT0idXJuOjIiIGI9ImIiIGE6Yj0iYTpiIi8+IiIiKQppbnB1dCA9IGxpYnhtbDIuaW5wdXRCdWZmZXIoZikKcmVhZGVyID0gaW5wdXQubmV3VGV4dFJlYWRlcigidGVzdDQiKQpyZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQgIkVycm9yIHJlYWRpbmcgdGhlIHRlc3RhdHRyIGVsZW1lbnQiCiAgICBzeXMuZXhpdCgxKQojCiMgQXR0cmlidXRlIGV4cGxvcmF0aW9uIGJ5IGluZGV4CiMKaWYgcmVhZGVyLk1vdmVUb0F0dHJpYnV0ZU5vKDApICE9IDE6CiAgICBwcmludCAiRmFpbGVkIG1vdmVUb0F0dHJpYnV0ZSgwKSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5WYWx1ZSgpICE9ICJ1cm46MSI6CiAgICBwcmludCAiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDApIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAieG1sbnMiOgogICAgcHJpbnQgIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgwKSBuYW1lIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk1vdmVUb0F0dHJpYnV0ZU5vKDEpICE9IDE6CiAgICBwcmludCAiRmFpbGVkIG1vdmVUb0F0dHJpYnV0ZSgxKSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5WYWx1ZSgpICE9ICJ1cm46MiI6CiAgICBwcmludCAiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDEpIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAieG1sbnM6YSI6CiAgICBwcmludCAiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDEpIG5hbWUiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTW92ZVRvQXR0cmlidXRlTm8oMikgIT0gMToKICAgIHByaW50ICJGYWlsZWQgbW92ZVRvQXR0cmlidXRlKDIpIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gImIiOgogICAgcHJpbnQgIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgyKSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gImIiOgogICAgcHJpbnQgIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgyKSBuYW1lIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk1vdmVUb0F0dHJpYnV0ZU5vKDMpICE9IDE6CiAgICBwcmludCAiRmFpbGVkIG1vdmVUb0F0dHJpYnV0ZSgzKSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5WYWx1ZSgpICE9ICJhOmIiOgogICAgcHJpbnQgIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgzKSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gImE6YiI6CiAgICBwcmludCAiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDMpIG5hbWUiCiAgICBzeXMuZXhpdCgxKQojCiMgQXR0cmlidXRlIGV4cGxvcmF0aW9uIGJ5IG5hbWUKIwppZiByZWFkZXIuTW92ZVRvQXR0cmlidXRlKCJ4bWxucyIpICE9IDE6CiAgICBwcmludCAiRmFpbGVkIG1vdmVUb0F0dHJpYnV0ZSgneG1sbnMnKSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5WYWx1ZSgpICE9ICJ1cm46MSI6CiAgICBwcmludCAiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKCd4bWxucycpIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk1vdmVUb0F0dHJpYnV0ZSgieG1sbnM6YSIpICE9IDE6CiAgICBwcmludCAiRmFpbGVkIG1vdmVUb0F0dHJpYnV0ZSgneG1sbnMnKSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5WYWx1ZSgpICE9ICJ1cm46MiI6CiAgICBwcmludCAiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKCd4bWxuczphJykiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTW92ZVRvQXR0cmlidXRlKCJiIikgIT0gMToKICAgIHByaW50ICJGYWlsZWQgbW92ZVRvQXR0cmlidXRlKCdiJykiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuVmFsdWUoKSAhPSAiYiI6CiAgICBwcmludCAiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKCdiJykiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTW92ZVRvQXR0cmlidXRlKCJhOmIiKSAhPSAxOgogICAgcHJpbnQgIkZhaWxlZCBtb3ZlVG9BdHRyaWJ1dGUoJ2E6YicpIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gImE6YiI6CiAgICBwcmludCAiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKCdhOmInKSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5Nb3ZlVG9BdHRyaWJ1dGVOcygiYiIsICJ1cm46MiIpICE9IDE6CiAgICBwcmludCAiRmFpbGVkIG1vdmVUb0F0dHJpYnV0ZSgnYicsICd1cm46MicpIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gImE6YiI6CiAgICBwcmludCAiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKCdiJywgJ3VybjoyJykiCiAgICBzeXMuZXhpdCgxKQojCiMgR28gYmFjayBhbmQgcmVhZCBpbiBzZXF1ZW5jZQojCmlmIHJlYWRlci5Nb3ZlVG9FbGVtZW50KCkgIT0gMToKICAgIHByaW50ICJGYWlsZWQgdG8gbW92ZSBiYWNrIHRvIGVsZW1lbnQiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTW92ZVRvRmlyc3RBdHRyaWJ1dGUoKSAhPSAxOgogICAgcHJpbnQgIkZhaWxlZCB0byBtb3ZlIHRvIGZpcnN0IGF0dHJpYnV0ZSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5WYWx1ZSgpICE9ICJ1cm46MSI6CiAgICBwcmludCAiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDApIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAieG1sbnMiOgogICAgcHJpbnQgIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgwKSBuYW1lIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk1vdmVUb05leHRBdHRyaWJ1dGUoKSAhPSAxOgogICAgcHJpbnQgIkZhaWxlZCB0byBtb3ZlIHRvIG5leHQgYXR0cmlidXRlIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gInVybjoyIjoKICAgIHByaW50ICJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMSkiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZSgpICE9ICJ4bWxuczphIjoKICAgIHByaW50ICJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMSkgbmFtZSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5Nb3ZlVG9OZXh0QXR0cmlidXRlKCkgIT0gMToKICAgIHByaW50ICJGYWlsZWQgdG8gbW92ZSB0byBuZXh0IGF0dHJpYnV0ZSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5WYWx1ZSgpICE9ICJiIjoKICAgIHByaW50ICJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMikiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZSgpICE9ICJiIjoKICAgIHByaW50ICJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMikgbmFtZSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5Nb3ZlVG9OZXh0QXR0cmlidXRlKCkgIT0gMToKICAgIHByaW50ICJGYWlsZWQgdG8gbW92ZSB0byBuZXh0IGF0dHJpYnV0ZSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5WYWx1ZSgpICE9ICJhOmIiOgogICAgcHJpbnQgIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgzKSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gImE6YiI6CiAgICBwcmludCAiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDMpIG5hbWUiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTW92ZVRvTmV4dEF0dHJpYnV0ZSgpICE9IDA6CiAgICBwcmludCAiRmFpbGVkIHRvIGRldGVjdCBsYXN0IGF0dHJpYnV0ZSIKICAgIHN5cy5leGl0KDEpCgogICAgCiMKIyBhIGNvdXBsZSBvZiB0ZXN0cyBmb3IgbmFtZXNwYWNlIG5vZGVzCiMKZiA9IFN0cmluZ0lPLlN0cmluZ0lPKCIiIjxhIHhtbG5zPSJodHRwOi8vZXhhbXBsZS5jb20vZm9vIi8+IiIiKQppbnB1dCA9IGxpYnhtbDIuaW5wdXRCdWZmZXIoZikKcmVhZGVyID0gaW5wdXQubmV3VGV4dFJlYWRlcigidGVzdDYiKQpyZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQgInRlc3Q2OiBmYWlsZWQgdG8gUmVhZCgpIgogICAgc3lzLmV4aXQoMSkKcmV0ID0gcmVhZGVyLk1vdmVUb0ZpcnN0QXR0cmlidXRlKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCAidGVzdDY6IGZhaWxlZCB0byBNb3ZlVG9GaXJzdEF0dHJpYnV0ZSgpIgogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWVzcGFjZVVyaSgpICE9ICJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3htbG5zLyIgb3IgXAogICByZWFkZXIuTG9jYWxOYW1lKCkgIT0gInhtbG5zIiBvciByZWFkZXIuTmFtZSgpICE9ICJ4bWxucyIgb3IgXAogICByZWFkZXIuVmFsdWUoKSAhPSAiaHR0cDovL2V4YW1wbGUuY29tL2ZvbyIgb3IgcmVhZGVyLk5vZGVUeXBlKCkgIT0gMjoKICAgIHByaW50ICJ0ZXN0NjogZmFpbGVkIHRvIHJlYWQgdGhlIG5hbWVzcGFjZSBub2RlIgogICAgc3lzLmV4aXQoMSkKCmYgPSBTdHJpbmdJTy5TdHJpbmdJTygiIiI8YSB4bWxuczpwcmVmaXg9Imh0dHA6Ly9leGFtcGxlLmNvbS9mb28iLz4iIiIpCmlucHV0ID0gbGlieG1sMi5pbnB1dEJ1ZmZlcihmKQpyZWFkZXIgPSBpbnB1dC5uZXdUZXh0UmVhZGVyKCJ0ZXN0NyIpCnJldCA9IHJlYWRlci5SZWFkKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCAidGVzdDc6IGZhaWxlZCB0byBSZWFkKCkiCiAgICBzeXMuZXhpdCgxKQpyZXQgPSByZWFkZXIuTW92ZVRvRmlyc3RBdHRyaWJ1dGUoKQppZiByZXQgIT0gMToKICAgIHByaW50ICJ0ZXN0NzogZmFpbGVkIHRvIE1vdmVUb0ZpcnN0QXR0cmlidXRlKCkiCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZXNwYWNlVXJpKCkgIT0gImh0dHA6Ly93d3cudzMub3JnLzIwMDAveG1sbnMvIiBvciBcCiAgIHJlYWRlci5Mb2NhbE5hbWUoKSAhPSAicHJlZml4IiBvciByZWFkZXIuTmFtZSgpICE9ICJ4bWxuczpwcmVmaXgiIG9yIFwKICAgcmVhZGVyLlZhbHVlKCkgIT0gImh0dHA6Ly9leGFtcGxlLmNvbS9mb28iIG9yIHJlYWRlci5Ob2RlVHlwZSgpICE9IDI6CiAgICBwcmludCAidGVzdDc6IGZhaWxlZCB0byByZWFkIHRoZSBuYW1lc3BhY2Ugbm9kZSIKICAgIHN5cy5leGl0KDEpCgojCiMgVGVzdCBmb3IgYSBsaW1pdCBjYXNlOgojCmYgPSBTdHJpbmdJTy5TdHJpbmdJTygiIiI8YS8+IiIiKQppbnB1dCA9IGxpYnhtbDIuaW5wdXRCdWZmZXIoZikKcmVhZGVyID0gaW5wdXQubmV3VGV4dFJlYWRlcigidGVzdDgiKQpyZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQgInRlc3Q4OiBmYWlsZWQgdG8gcmVhZCB0aGUgbm9kZSIKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gImEiIG9yIHJlYWRlci5Jc0VtcHR5RWxlbWVudCgpICE9IDE6CiAgICBwcmludCAidGVzdDg6IGZhaWxlZCB0byBhbmFseXplIHRoZSBub2RlIgogICAgc3lzLmV4aXQoMSkKcmV0ID0gcmVhZGVyLlJlYWQoKQppZiByZXQgIT0gMDoKICAgIHByaW50ICJ0ZXN0ODogZmFpbGVkIHRvIGRldGVjdCB0aGUgRU9GIgogICAgc3lzLmV4aXQoMSkKCiMKIyBBbm90aGVyIHRlc3QgcHJvdmlkZWQgYnkgU3TpcGhhbmUgQmlkb3VsIGFuZCBjaGVja2VkIHdpdGggQyMKIwpkZWYgdHN0X3JlYWRlcihzKToKICAgIGYgPSBTdHJpbmdJTy5TdHJpbmdJTyhzKQogICAgaW5wdXQgPSBsaWJ4bWwyLmlucHV0QnVmZmVyKGYpCiAgICByZWFkZXIgPSBpbnB1dC5uZXdUZXh0UmVhZGVyKCJ0c3QiKQogICAgcmVzID0gIiIKICAgIHdoaWxlIHJlYWRlci5SZWFkKCk6CglyZXM9cmVzICsgIiVzICglcykgWyVzXSAlZCAlZFxuIiAlIChyZWFkZXIuTm9kZVR5cGUoKSxyZWFkZXIuTmFtZSgpLAoJCQkJICAgICAgcmVhZGVyLlZhbHVlKCksIHJlYWRlci5Jc0VtcHR5RWxlbWVudCgpLAoJCQkJICAgICAgcmVhZGVyLkRlcHRoKCkpCglpZiByZWFkZXIuTm9kZVR5cGUoKSA9PSAxOiAjIEVsZW1lbnQKCSAgICB3aGlsZSByZWFkZXIuTW92ZVRvTmV4dEF0dHJpYnV0ZSgpOgoJCXJlcyA9IHJlcyArICItLSAlcyAoJXMpIFslc10gJWQgJWRcbiIgJSAocmVhZGVyLk5vZGVUeXBlKCksCgkJCQkgICAgICAgcmVhZGVyLk5hbWUoKSxyZWFkZXIuVmFsdWUoKSwKCQkJCSAgICAgICByZWFkZXIuSXNFbXB0eUVsZW1lbnQoKSwgcmVhZGVyLkRlcHRoKCkpCiAgICByZXR1cm4gcmVzCiAgICAKZG9jPSIiIjxhPjxiIGIxPSJiMSIvPjxjPmNvbnRlbnQgb2YgYzwvYz48L2E+IiIiCmV4cGVjdD0iIiIxIChhKSBbTm9uZV0gMCAwCjEgKGIpIFtOb25lXSAxIDEKLS0gMiAoYjEpIFtiMV0gMCAyCjEgKGMpIFtOb25lXSAwIDEKMyAoI3RleHQpIFtjb250ZW50IG9mIGNdIDAgMgoxNSAoYykgW05vbmVdIDAgMQoxNSAoYSkgW05vbmVdIDAgMAoiIiIKcmVzID0gdHN0X3JlYWRlcihkb2MpCmlmIHJlcyAhPSBleHBlY3Q6CiAgICBwcmludCAidGVzdDUgZmFpbGVkIgogICAgcHJpbnQgcmVzCiAgICBzeXMuZXhpdCgxKQoKZG9jPSIiIjx0ZXN0PjxiLz48Yy8+PC90ZXN0PiIiIgpleHBlY3Q9IiIiMSAodGVzdCkgW05vbmVdIDAgMAoxIChiKSBbTm9uZV0gMSAxCjEgKGMpIFtOb25lXSAxIDEKMTUgKHRlc3QpIFtOb25lXSAwIDAKIiIiCnJlcyA9IHRzdF9yZWFkZXIoZG9jKQppZiByZXMgIT0gZXhwZWN0OgogICAgcHJpbnQgInRlc3Q5IGZhaWxlZCIKICAgIHByaW50IHJlcwogICAgc3lzLmV4aXQoMSkKCmRvYz0iIiI8YT48Yj5iYmI8L2I+PGM+Y2NjPC9jPjwvYT4iIiIKZXhwZWN0PSIiIjEgKGEpIFtOb25lXSAwIDAKMSAoYikgW05vbmVdIDAgMQozICgjdGV4dCkgW2JiYl0gMCAyCjE1IChiKSBbTm9uZV0gMCAxCjEgKGMpIFtOb25lXSAwIDEKMyAoI3RleHQpIFtjY2NdIDAgMgoxNSAoYykgW05vbmVdIDAgMQoxNSAoYSkgW05vbmVdIDAgMAoiIiIKcmVzID0gdHN0X3JlYWRlcihkb2MpCmlmIHJlcyAhPSBleHBlY3Q6CiAgICBwcmludCAidGVzdDEwIGZhaWxlZCIKICAgIHByaW50IHJlcwogICAgc3lzLmV4aXQoMSkKCmRvYz0iIiI8dGVzdCBhPSJhIi8+IiIiCmV4cGVjdD0iIiIxICh0ZXN0KSBbTm9uZV0gMSAwCi0tIDIgKGEpIFthXSAwIDEKIiIiCnJlcyA9IHRzdF9yZWFkZXIoZG9jKQppZiByZXMgIT0gZXhwZWN0OgogICAgcHJpbnQgInRlc3QxMSBmYWlsZWQiCiAgICBwcmludCByZXMKICAgIHN5cy5leGl0KDEpCgpkb2M9IiIiPHRlc3Q+PGE+YWFhPC9hPjxiLz48L3Rlc3Q+IiIiCmV4cGVjdD0iIiIxICh0ZXN0KSBbTm9uZV0gMCAwCjEgKGEpIFtOb25lXSAwIDEKMyAoI3RleHQpIFthYWFdIDAgMgoxNSAoYSkgW05vbmVdIDAgMQoxIChiKSBbTm9uZV0gMSAxCjE1ICh0ZXN0KSBbTm9uZV0gMCAwCiIiIgpyZXMgPSB0c3RfcmVhZGVyKGRvYykKaWYgcmVzICE9IGV4cGVjdDoKICAgIHByaW50ICJ0ZXN0MTIgZmFpbGVkIgogICAgcHJpbnQgcmVzCiAgICBzeXMuZXhpdCgxKQoKZG9jPSIiIjx0ZXN0PjxwPjwvcD48L3Rlc3Q+IiIiCmV4cGVjdD0iIiIxICh0ZXN0KSBbTm9uZV0gMCAwCjEgKHApIFtOb25lXSAwIDEKMTUgKHApIFtOb25lXSAwIDEKMTUgKHRlc3QpIFtOb25lXSAwIDAKIiIiCnJlcyA9IHRzdF9yZWFkZXIoZG9jKQppZiByZXMgIT0gZXhwZWN0OgogICAgcHJpbnQgInRlc3QxMyBmYWlsZWQiCiAgICBwcmludCByZXMKICAgIHN5cy5leGl0KDEpCgpkb2M9IiIiPHA+PC9wPiIiIgpleHBlY3Q9IiIiMSAocCkgW05vbmVdIDAgMAoxNSAocCkgW05vbmVdIDAgMAoiIiIKcmVzID0gdHN0X3JlYWRlcihkb2MpCmlmIHJlcyAhPSBleHBlY3Q6CiAgICBwcmludCAidGVzdDE0IGZhaWxlZCIKICAgIHByaW50IHJlcwogICAgc3lzLmV4aXQoMSkKCiMKIyB0ZXN0IGZyb20gYnVnICMxMDg4MDEgCiMKZG9jPSIiIjw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ibm8iPz4KPCFET0NUWVBFIGFydGljbGUgUFVCTElDICItLy9PQVNJUy8vRFREIERvY0Jvb2sgWE1MIFY0LjEuMi8vRU4iCiAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3Lm9hc2lzLW9wZW4ub3JnL2RvY2Jvb2sveG1sLzQuMS4yL2RvY2Jvb2t4LmR0ZCIgWwpdPgoKPGFydGljbGU+Cnh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4CjwvYXJ0aWNsZT4KIiIiCmV4cGVjdD0iIiIxMCAoYXJ0aWNsZSkgW05vbmVdIDAgMAoxIChhcnRpY2xlKSBbTm9uZV0gMCAwCjMgKCN0ZXh0KSBbCnh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4Cl0gMCAxCjE1IChhcnRpY2xlKSBbTm9uZV0gMCAwCiIiIgpyZXMgPSB0c3RfcmVhZGVyKGRvYykKaWYgcmVzICE9IGV4cGVjdDoKICAgIHByaW50ICJ0ZXN0MTUgZmFpbGVkIgogICAgcHJpbnQgcmVzCiAgICBzeXMuZXhpdCgxKQoKIwojIGNsZWFudXAgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGNvdW50aW5nCiMKZGVsIGYKZGVsIGlucHV0CmRlbCByZWFkZXIKCiMgTWVtb3J5IGRlYnVnIHNwZWNpZmljCmxpYnhtbDIuY2xlYW51cFBhcnNlcigpCmlmIGxpYnhtbDIuZGVidWdNZW1vcnkoMSkgPT0gMDoKICAgIHByaW50ICJPSyIKZWxzZToKICAgIHByaW50ICJNZW1vcnkgbGVhayAlZCBieXRlcyIgJSAobGlieG1sMi5kZWJ1Z01lbW9yeSgxKSkKICAgIGxpYnhtbDIuZHVtcE1lbW9yeSgpCg==