IyEvdXNyL2Jpbi9lbnYgcHl0aG9uCiMgLSotIGNvZGluZzogSVNPLTg4NTktMSAtKi0KIwojIHRoaXMgdGVzdHMgdGhlIGJhc2ljIEFQSXMgb2YgdGhlIFhtbFRleHRSZWFkZXIgaW50ZXJmYWNlCiMKaW1wb3J0IGxpYnhtbDIKaW1wb3J0IHN5cwp0cnk6CiAgICBpbXBvcnQgU3RyaW5nSU8KICAgIHN0cl9pbyA9IFN0cmluZ0lPLlN0cmluZ0lPCmV4Y2VwdDoKICAgIGltcG9ydCBpbwogICAgc3RyX2lvID0gaW8uU3RyaW5nSU8KCiMgTWVtb3J5IGRlYnVnIHNwZWNpZmljCmxpYnhtbDIuZGVidWdNZW1vcnkoMSkKCmYgPSBzdHJfaW8oIiIiPGE+PGIgYjE9ImIxIi8+PGM+Y29udGVudCBvZiBjPC9jPjwvYT4iIiIpCmlucHV0ID0gbGlieG1sMi5pbnB1dEJ1ZmZlcihmKQpyZWFkZXIgPSBpbnB1dC5uZXdUZXh0UmVhZGVyKCJ0ZXN0MSIpCnJldCA9IHJlYWRlci5SZWFkKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCgidGVzdDE6IEVycm9yIHJlYWRpbmcgdG8gZmlyc3QgZWxlbWVudCIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZSgpICE9ICJhIiBvciByZWFkZXIuSXNFbXB0eUVsZW1lbnQoKSAhPSAwIG9yIFwKICAgcmVhZGVyLk5vZGVUeXBlKCkgIT0gMSBvciByZWFkZXIuSGFzQXR0cmlidXRlcygpICE9IDA6CiAgICBwcmludCgidGVzdDE6IEVycm9yIHJlYWRpbmcgdGhlIGZpcnN0IGVsZW1lbnQiKQogICAgc3lzLmV4aXQoMSkKcmV0ID0gcmVhZGVyLlJlYWQoKQppZiByZXQgIT0gMToKICAgIHByaW50KCJ0ZXN0MTogRXJyb3IgcmVhZGluZyB0byBzZWNvbmQgZWxlbWVudCIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZSgpICE9ICJiIiBvciByZWFkZXIuSXNFbXB0eUVsZW1lbnQoKSAhPSAxIG9yIFwKICAgcmVhZGVyLk5vZGVUeXBlKCkgIT0gMSBvciByZWFkZXIuSGFzQXR0cmlidXRlcygpICE9IDE6CiAgICBwcmludCgidGVzdDE6IEVycm9yIHJlYWRpbmcgdGhlIHNlY29uZCBlbGVtZW50IikKICAgIHN5cy5leGl0KDEpCnJldCA9IHJlYWRlci5SZWFkKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCgidGVzdDE6IEVycm9yIHJlYWRpbmcgdG8gdGhpcmQgZWxlbWVudCIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZSgpICE9ICJjIiBvciByZWFkZXIuSXNFbXB0eUVsZW1lbnQoKSAhPSAwIG9yIFwKICAgcmVhZGVyLk5vZGVUeXBlKCkgIT0gMSBvciByZWFkZXIuSGFzQXR0cmlidXRlcygpICE9IDA6CiAgICBwcmludCgidGVzdDE6IEVycm9yIHJlYWRpbmcgdGhlIHRoaXJkIGVsZW1lbnQiKQogICAgc3lzLmV4aXQoMSkKcmV0ID0gcmVhZGVyLlJlYWQoKQppZiByZXQgIT0gMToKICAgIHByaW50KCJ0ZXN0MTogRXJyb3IgcmVhZGluZyB0byB0ZXh0IG5vZGUiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAiI3RleHQiIG9yIHJlYWRlci5Jc0VtcHR5RWxlbWVudCgpICE9IDAgb3IgXAogICByZWFkZXIuTm9kZVR5cGUoKSAhPSAzIG9yIHJlYWRlci5IYXNBdHRyaWJ1dGVzKCkgIT0gMCBvciBcCiAgIHJlYWRlci5WYWx1ZSgpICE9ICJjb250ZW50IG9mIGMiOgogICAgcHJpbnQoInRlc3QxOiBFcnJvciByZWFkaW5nIHRoZSB0ZXh0IG5vZGUiKQogICAgc3lzLmV4aXQoMSkKcmV0ID0gcmVhZGVyLlJlYWQoKQppZiByZXQgIT0gMToKICAgIHByaW50KCJ0ZXN0MTogRXJyb3IgcmVhZGluZyB0byBlbmQgb2YgdGhpcmQgZWxlbWVudCIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZSgpICE9ICJjIiBvciByZWFkZXIuSXNFbXB0eUVsZW1lbnQoKSAhPSAwIG9yIFwKICAgcmVhZGVyLk5vZGVUeXBlKCkgIT0gMTUgb3IgcmVhZGVyLkhhc0F0dHJpYnV0ZXMoKSAhPSAwOgogICAgcHJpbnQoInRlc3QxOiBFcnJvciByZWFkaW5nIHRoZSBlbmQgb2YgdGhpcmQgZWxlbWVudCIpCiAgICBzeXMuZXhpdCgxKQpyZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQoInRlc3QxOiBFcnJvciByZWFkaW5nIHRvIGVuZCBvZiBmaXJzdCBlbGVtZW50IikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gImEiIG9yIHJlYWRlci5Jc0VtcHR5RWxlbWVudCgpICE9IDAgb3IgXAogICByZWFkZXIuTm9kZVR5cGUoKSAhPSAxNSBvciByZWFkZXIuSGFzQXR0cmlidXRlcygpICE9IDA6CiAgICBwcmludCgidGVzdDE6IEVycm9yIHJlYWRpbmcgdGhlIGVuZCBvZiBmaXJzdCBlbGVtZW50IikKICAgIHN5cy5leGl0KDEpCnJldCA9IHJlYWRlci5SZWFkKCkKaWYgcmV0ICE9IDA6CiAgICBwcmludCgidGVzdDE6IEVycm9yIHJlYWRpbmcgdG8gZW5kIG9mIGRvY3VtZW50IikKICAgIHN5cy5leGl0KDEpCgojCiMgZXhhbXBsZSBmcm9tIHRoZSBYbWxUZXh0UmVhZGVyIGRvY3MKIwpmID0gc3RyX2lvKCIiIjx0ZXN0IHhtbG5zOmR0PSJ1cm46ZGF0YXR5cGVzIiBkdDp0eXBlPSJpbnQiLz4iIiIpCmlucHV0ID0gbGlieG1sMi5pbnB1dEJ1ZmZlcihmKQpyZWFkZXIgPSBpbnB1dC5uZXdUZXh0UmVhZGVyKCJ0ZXN0MiIpCgpyZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQoIkVycm9yIHJlYWRpbmcgdGVzdCBlbGVtZW50IikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5HZXRBdHRyaWJ1dGVObygwKSAhPSAidXJuOmRhdGF0eXBlcyIgb3IgXAogICByZWFkZXIuR2V0QXR0cmlidXRlTm8oMSkgIT0gImludCIgb3IgXAogICByZWFkZXIuR2V0QXR0cmlidXRlTnMoInR5cGUiLCAidXJuOmRhdGF0eXBlcyIpICE9ICJpbnQiIG9yIFwKICAgcmVhZGVyLkdldEF0dHJpYnV0ZSgiZHQ6dHlwZSIpICE9ICJpbnQiOgogICAgcHJpbnQoImVycm9yIHJlYWRpbmcgdGVzdCBhdHRyaWJ1dGVzIikKICAgIHN5cy5leGl0KDEpCgojCiMgZXhhbXBsZSBmcm9tIHRoZSBYbWxUZXh0UmVhZGVyIGRvY3MKIwpmID0gc3RyX2lvKCIiIjxyb290IHhtbG5zOmE9InVybjo0NTYiPgo8aXRlbT4KPHJlZiBocmVmPSJhOmIiLz4KPC9pdGVtPgo8L3Jvb3Q+IiIiKQppbnB1dCA9IGxpYnhtbDIuaW5wdXRCdWZmZXIoZikKcmVhZGVyID0gaW5wdXQubmV3VGV4dFJlYWRlcigidGVzdDMiKQoKcmV0ID0gcmVhZGVyLlJlYWQoKQp3aGlsZSByZXQgPT0gMToKICAgIGlmIHJlYWRlci5OYW1lKCkgPT0gInJlZiI6CiAgICAgICAgaWYgcmVhZGVyLkxvb2t1cE5hbWVzcGFjZSgiYSIpICE9ICJ1cm46NDU2IjoKICAgICAgICAgICAgcHJpbnQoImVycm9yIHJlc29sdmluZyBuYW1lc3BhY2UgcHJlZml4IikKICAgICAgICAgICAgc3lzLmV4aXQoMSkKICAgICAgICBicmVhawogICAgcmV0ID0gcmVhZGVyLlJlYWQoKQppZiByZXQgIT0gMToKICAgIHByaW50KCJFcnJvciBmaW5kaW5nIHRoZSByZWYgZWxlbWVudCIpCiAgICBzeXMuZXhpdCgxKQoKIwojIEhvbWUgbWFkZSBleGFtcGxlIGZvciB0aGUgdmFyaW91cyBhdHRyaWJ1dGUgYWNjZXNzIGZ1bmN0aW9ucwojCmYgPSBzdHJfaW8oIiIiPHRlc3RhdHRyIHhtbG5zPSJ1cm46MSIgeG1sbnM6YT0idXJuOjIiIGI9ImIiIGE6Yj0iYTpiIi8+IiIiKQppbnB1dCA9IGxpYnhtbDIuaW5wdXRCdWZmZXIoZikKcmVhZGVyID0gaW5wdXQubmV3VGV4dFJlYWRlcigidGVzdDQiKQpyZXQgPSByZWFkZXIuUmVhZCgpCmlmIHJldCAhPSAxOgogICAgcHJpbnQoIkVycm9yIHJlYWRpbmcgdGhlIHRlc3RhdHRyIGVsZW1lbnQiKQogICAgc3lzLmV4aXQoMSkKIwojIEF0dHJpYnV0ZSBleHBsb3JhdGlvbiBieSBpbmRleAojCmlmIHJlYWRlci5Nb3ZlVG9BdHRyaWJ1dGVObygwKSAhPSAxOgogICAgcHJpbnQoIkZhaWxlZCBtb3ZlVG9BdHRyaWJ1dGUoMCkiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gInVybjoxIjoKICAgIHByaW50KCJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMCkiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAieG1sbnMiOgogICAgcHJpbnQoIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgwKSBuYW1lIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5Nb3ZlVG9BdHRyaWJ1dGVObygxKSAhPSAxOgogICAgcHJpbnQoIkZhaWxlZCBtb3ZlVG9BdHRyaWJ1dGUoMSkiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gInVybjoyIjoKICAgIHByaW50KCJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMSkiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAieG1sbnM6YSI6CiAgICBwcmludCgiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDEpIG5hbWUiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk1vdmVUb0F0dHJpYnV0ZU5vKDIpICE9IDE6CiAgICBwcmludCgiRmFpbGVkIG1vdmVUb0F0dHJpYnV0ZSgyKSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuVmFsdWUoKSAhPSAiYiI6CiAgICBwcmludCgiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDIpIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gImIiOgogICAgcHJpbnQoIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgyKSBuYW1lIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5Nb3ZlVG9BdHRyaWJ1dGVObygzKSAhPSAxOgogICAgcHJpbnQoIkZhaWxlZCBtb3ZlVG9BdHRyaWJ1dGUoMykiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gImE6YiI6CiAgICBwcmludCgiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDMpIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gImE6YiI6CiAgICBwcmludCgiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDMpIG5hbWUiKQogICAgc3lzLmV4aXQoMSkKIwojIEF0dHJpYnV0ZSBleHBsb3JhdGlvbiBieSBuYW1lCiMKaWYgcmVhZGVyLk1vdmVUb0F0dHJpYnV0ZSgieG1sbnMiKSAhPSAxOgogICAgcHJpbnQoIkZhaWxlZCBtb3ZlVG9BdHRyaWJ1dGUoJ3htbG5zJykiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLlZhbHVlKCkgIT0gInVybjoxIjoKICAgIHByaW50KCJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoJ3htbG5zJykiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk1vdmVUb0F0dHJpYnV0ZSgieG1sbnM6YSIpICE9IDE6CiAgICBwcmludCgiRmFpbGVkIG1vdmVUb0F0dHJpYnV0ZSgneG1sbnMnKSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuVmFsdWUoKSAhPSAidXJuOjIiOgogICAgcHJpbnQoIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgneG1sbnM6YScpIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5Nb3ZlVG9BdHRyaWJ1dGUoImIiKSAhPSAxOgogICAgcHJpbnQoIkZhaWxlZCBtb3ZlVG9BdHRyaWJ1dGUoJ2InKSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuVmFsdWUoKSAhPSAiYiI6CiAgICBwcmludCgiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKCdiJykiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk1vdmVUb0F0dHJpYnV0ZSgiYTpiIikgIT0gMToKICAgIHByaW50KCJGYWlsZWQgbW92ZVRvQXR0cmlidXRlKCdhOmInKSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuVmFsdWUoKSAhPSAiYTpiIjoKICAgIHByaW50KCJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoJ2E6YicpIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5Nb3ZlVG9BdHRyaWJ1dGVOcygiYiIsICJ1cm46MiIpICE9IDE6CiAgICBwcmludCgiRmFpbGVkIG1vdmVUb0F0dHJpYnV0ZSgnYicsICd1cm46MicpIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5WYWx1ZSgpICE9ICJhOmIiOgogICAgcHJpbnQoIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgnYicsICd1cm46MicpIikKICAgIHN5cy5leGl0KDEpCiMKIyBHbyBiYWNrIGFuZCByZWFkIGluIHNlcXVlbmNlCiMKaWYgcmVhZGVyLk1vdmVUb0VsZW1lbnQoKSAhPSAxOgogICAgcHJpbnQoIkZhaWxlZCB0byBtb3ZlIGJhY2sgdG8gZWxlbWVudCIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTW92ZVRvRmlyc3RBdHRyaWJ1dGUoKSAhPSAxOgogICAgcHJpbnQoIkZhaWxlZCB0byBtb3ZlIHRvIGZpcnN0IGF0dHJpYnV0ZSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuVmFsdWUoKSAhPSAidXJuOjEiOgogICAgcHJpbnQoIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgwKSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTmFtZSgpICE9ICJ4bWxucyI6CiAgICBwcmludCgiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDApIG5hbWUiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk1vdmVUb05leHRBdHRyaWJ1dGUoKSAhPSAxOgogICAgcHJpbnQoIkZhaWxlZCB0byBtb3ZlIHRvIG5leHQgYXR0cmlidXRlIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5WYWx1ZSgpICE9ICJ1cm46MiI6CiAgICBwcmludCgiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDEpIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gInhtbG5zOmEiOgogICAgcHJpbnQoIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgxKSBuYW1lIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5Nb3ZlVG9OZXh0QXR0cmlidXRlKCkgIT0gMToKICAgIHByaW50KCJGYWlsZWQgdG8gbW92ZSB0byBuZXh0IGF0dHJpYnV0ZSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuVmFsdWUoKSAhPSAiYiI6CiAgICBwcmludCgiRmFpbGVkIHRvIHJlYWQgYXR0cmlidXRlKDIpIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lKCkgIT0gImIiOgogICAgcHJpbnQoIkZhaWxlZCB0byByZWFkIGF0dHJpYnV0ZSgyKSBuYW1lIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5Nb3ZlVG9OZXh0QXR0cmlidXRlKCkgIT0gMToKICAgIHByaW50KCJGYWlsZWQgdG8gbW92ZSB0byBuZXh0IGF0dHJpYnV0ZSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuVmFsdWUoKSAhPSAiYTpiIjoKICAgIHByaW50KCJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMykiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAiYTpiIjoKICAgIHByaW50KCJGYWlsZWQgdG8gcmVhZCBhdHRyaWJ1dGUoMykgbmFtZSIpCiAgICBzeXMuZXhpdCgxKQppZiByZWFkZXIuTW92ZVRvTmV4dEF0dHJpYnV0ZSgpICE9IDA6CiAgICBwcmludCgiRmFpbGVkIHRvIGRldGVjdCBsYXN0IGF0dHJpYnV0ZSIpCiAgICBzeXMuZXhpdCgxKQoKICAgIAojCiMgYSBjb3VwbGUgb2YgdGVzdHMgZm9yIG5hbWVzcGFjZSBub2RlcwojCmYgPSBzdHJfaW8oIiIiPGEgeG1sbnM9Imh0dHA6Ly9leGFtcGxlLmNvbS9mb28iLz4iIiIpCmlucHV0ID0gbGlieG1sMi5pbnB1dEJ1ZmZlcihmKQpyZWFkZXIgPSBpbnB1dC5uZXdUZXh0UmVhZGVyKCJ0ZXN0NiIpCnJldCA9IHJlYWRlci5SZWFkKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCgidGVzdDY6IGZhaWxlZCB0byBSZWFkKCkiKQogICAgc3lzLmV4aXQoMSkKcmV0ID0gcmVhZGVyLk1vdmVUb0ZpcnN0QXR0cmlidXRlKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCgidGVzdDY6IGZhaWxlZCB0byBNb3ZlVG9GaXJzdEF0dHJpYnV0ZSgpIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lc3BhY2VVcmkoKSAhPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iIG9yIFwKICAgcmVhZGVyLkxvY2FsTmFtZSgpICE9ICJ4bWxucyIgb3IgcmVhZGVyLk5hbWUoKSAhPSAieG1sbnMiIG9yIFwKICAgcmVhZGVyLlZhbHVlKCkgIT0gImh0dHA6Ly9leGFtcGxlLmNvbS9mb28iIG9yIHJlYWRlci5Ob2RlVHlwZSgpICE9IDI6CiAgICBwcmludCgidGVzdDY6IGZhaWxlZCB0byByZWFkIHRoZSBuYW1lc3BhY2Ugbm9kZSIpCiAgICBzeXMuZXhpdCgxKQoKZiA9IHN0cl9pbygiIiI8YSB4bWxuczpwcmVmaXg9Imh0dHA6Ly9leGFtcGxlLmNvbS9mb28iLz4iIiIpCmlucHV0ID0gbGlieG1sMi5pbnB1dEJ1ZmZlcihmKQpyZWFkZXIgPSBpbnB1dC5uZXdUZXh0UmVhZGVyKCJ0ZXN0NyIpCnJldCA9IHJlYWRlci5SZWFkKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCgidGVzdDc6IGZhaWxlZCB0byBSZWFkKCkiKQogICAgc3lzLmV4aXQoMSkKcmV0ID0gcmVhZGVyLk1vdmVUb0ZpcnN0QXR0cmlidXRlKCkKaWYgcmV0ICE9IDE6CiAgICBwcmludCgidGVzdDc6IGZhaWxlZCB0byBNb3ZlVG9GaXJzdEF0dHJpYnV0ZSgpIikKICAgIHN5cy5leGl0KDEpCmlmIHJlYWRlci5OYW1lc3BhY2VVcmkoKSAhPSAiaHR0cDovL3d3dy53My5vcmcvMjAwMC94bWxucy8iIG9yIFwKICAgcmVhZGVyLkxvY2FsTmFtZSgpICE9ICJwcmVmaXgiIG9yIHJlYWRlci5OYW1lKCkgIT0gInhtbG5zOnByZWZpeCIgb3IgXAogICByZWFkZXIuVmFsdWUoKSAhPSAiaHR0cDovL2V4YW1wbGUuY29tL2ZvbyIgb3IgcmVhZGVyLk5vZGVUeXBlKCkgIT0gMjoKICAgIHByaW50KCJ0ZXN0NzogZmFpbGVkIHRvIHJlYWQgdGhlIG5hbWVzcGFjZSBub2RlIikKICAgIHN5cy5leGl0KDEpCgojCiMgVGVzdCBmb3IgYSBsaW1pdCBjYXNlOgojCmYgPSBzdHJfaW8oIiIiPGEvPiIiIikKaW5wdXQgPSBsaWJ4bWwyLmlucHV0QnVmZmVyKGYpCnJlYWRlciA9IGlucHV0Lm5ld1RleHRSZWFkZXIoInRlc3Q4IikKcmV0ID0gcmVhZGVyLlJlYWQoKQppZiByZXQgIT0gMToKICAgIHByaW50KCJ0ZXN0ODogZmFpbGVkIHRvIHJlYWQgdGhlIG5vZGUiKQogICAgc3lzLmV4aXQoMSkKaWYgcmVhZGVyLk5hbWUoKSAhPSAiYSIgb3IgcmVhZGVyLklzRW1wdHlFbGVtZW50KCkgIT0gMToKICAgIHByaW50KCJ0ZXN0ODogZmFpbGVkIHRvIGFuYWx5emUgdGhlIG5vZGUiKQogICAgc3lzLmV4aXQoMSkKcmV0ID0gcmVhZGVyLlJlYWQoKQppZiByZXQgIT0gMDoKICAgIHByaW50KCJ0ZXN0ODogZmFpbGVkIHRvIGRldGVjdCB0aGUgRU9GIikKICAgIHN5cy5leGl0KDEpCgojCiMgQW5vdGhlciB0ZXN0IHByb3ZpZGVkIGJ5IFN06XBoYW5lIEJpZG91bCBhbmQgY2hlY2tlZCB3aXRoIEMjCiMKZGVmIHRzdF9yZWFkZXIocyk6CiAgICBmID0gc3RyX2lvKHMpCiAgICBpbnB1dCA9IGxpYnhtbDIuaW5wdXRCdWZmZXIoZikKICAgIHJlYWRlciA9IGlucHV0Lm5ld1RleHRSZWFkZXIoInRzdCIpCiAgICByZXMgPSAiIgogICAgd2hpbGUgcmVhZGVyLlJlYWQoKToKICAgICAgICByZXM9cmVzICsgIiVzICglcykgWyVzXSAlZCAlZFxuIiAlIChyZWFkZXIuTm9kZVR5cGUoKSxyZWFkZXIuTmFtZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5WYWx1ZSgpLCByZWFkZXIuSXNFbXB0eUVsZW1lbnQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFkZXIuRGVwdGgoKSkKICAgICAgICBpZiByZWFkZXIuTm9kZVR5cGUoKSA9PSAxOiAjIEVsZW1lbnQKICAgICAgICAgICAgd2hpbGUgcmVhZGVyLk1vdmVUb05leHRBdHRyaWJ1dGUoKToKICAgICAgICAgICAgICAgIHJlcyA9IHJlcyArICItLSAlcyAoJXMpIFslc10gJWQgJWRcbiIgJSAocmVhZGVyLk5vZGVUeXBlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5OYW1lKCkscmVhZGVyLlZhbHVlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRlci5Jc0VtcHR5RWxlbWVudCgpLCByZWFkZXIuRGVwdGgoKSkKICAgIHJldHVybiByZXMKICAgIApkb2M9IiIiPGE+PGIgYjE9ImIxIi8+PGM+Y29udGVudCBvZiBjPC9jPjwvYT4iIiIKZXhwZWN0PSIiIjEgKGEpIFtOb25lXSAwIDAKMSAoYikgW05vbmVdIDEgMQotLSAyIChiMSkgW2IxXSAwIDIKMSAoYykgW05vbmVdIDAgMQozICgjdGV4dCkgW2NvbnRlbnQgb2YgY10gMCAyCjE1IChjKSBbTm9uZV0gMCAxCjE1IChhKSBbTm9uZV0gMCAwCiIiIgpyZXMgPSB0c3RfcmVhZGVyKGRvYykKaWYgcmVzICE9IGV4cGVjdDoKICAgIHByaW50KCJ0ZXN0NSBmYWlsZWQiKQogICAgcHJpbnQocmVzKQogICAgc3lzLmV4aXQoMSkKCmRvYz0iIiI8dGVzdD48Yi8+PGMvPjwvdGVzdD4iIiIKZXhwZWN0PSIiIjEgKHRlc3QpIFtOb25lXSAwIDAKMSAoYikgW05vbmVdIDEgMQoxIChjKSBbTm9uZV0gMSAxCjE1ICh0ZXN0KSBbTm9uZV0gMCAwCiIiIgpyZXMgPSB0c3RfcmVhZGVyKGRvYykKaWYgcmVzICE9IGV4cGVjdDoKICAgIHByaW50KCJ0ZXN0OSBmYWlsZWQiKQogICAgcHJpbnQocmVzKQogICAgc3lzLmV4aXQoMSkKCmRvYz0iIiI8YT48Yj5iYmI8L2I+PGM+Y2NjPC9jPjwvYT4iIiIKZXhwZWN0PSIiIjEgKGEpIFtOb25lXSAwIDAKMSAoYikgW05vbmVdIDAgMQozICgjdGV4dCkgW2JiYl0gMCAyCjE1IChiKSBbTm9uZV0gMCAxCjEgKGMpIFtOb25lXSAwIDEKMyAoI3RleHQpIFtjY2NdIDAgMgoxNSAoYykgW05vbmVdIDAgMQoxNSAoYSkgW05vbmVdIDAgMAoiIiIKcmVzID0gdHN0X3JlYWRlcihkb2MpCmlmIHJlcyAhPSBleHBlY3Q6CiAgICBwcmludCgidGVzdDEwIGZhaWxlZCIpCiAgICBwcmludChyZXMpCiAgICBzeXMuZXhpdCgxKQoKZG9jPSIiIjx0ZXN0IGE9ImEiLz4iIiIKZXhwZWN0PSIiIjEgKHRlc3QpIFtOb25lXSAxIDAKLS0gMiAoYSkgW2FdIDAgMQoiIiIKcmVzID0gdHN0X3JlYWRlcihkb2MpCmlmIHJlcyAhPSBleHBlY3Q6CiAgICBwcmludCgidGVzdDExIGZhaWxlZCIpCiAgICBwcmludChyZXMpCiAgICBzeXMuZXhpdCgxKQoKZG9jPSIiIjx0ZXN0PjxhPmFhYTwvYT48Yi8+PC90ZXN0PiIiIgpleHBlY3Q9IiIiMSAodGVzdCkgW05vbmVdIDAgMAoxIChhKSBbTm9uZV0gMCAxCjMgKCN0ZXh0KSBbYWFhXSAwIDIKMTUgKGEpIFtOb25lXSAwIDEKMSAoYikgW05vbmVdIDEgMQoxNSAodGVzdCkgW05vbmVdIDAgMAoiIiIKcmVzID0gdHN0X3JlYWRlcihkb2MpCmlmIHJlcyAhPSBleHBlY3Q6CiAgICBwcmludCgidGVzdDEyIGZhaWxlZCIpCiAgICBwcmludChyZXMpCiAgICBzeXMuZXhpdCgxKQoKZG9jPSIiIjx0ZXN0PjxwPjwvcD48L3Rlc3Q+IiIiCmV4cGVjdD0iIiIxICh0ZXN0KSBbTm9uZV0gMCAwCjEgKHApIFtOb25lXSAwIDEKMTUgKHApIFtOb25lXSAwIDEKMTUgKHRlc3QpIFtOb25lXSAwIDAKIiIiCnJlcyA9IHRzdF9yZWFkZXIoZG9jKQppZiByZXMgIT0gZXhwZWN0OgogICAgcHJpbnQoInRlc3QxMyBmYWlsZWQiKQogICAgcHJpbnQocmVzKQogICAgc3lzLmV4aXQoMSkKCmRvYz0iIiI8cD48L3A+IiIiCmV4cGVjdD0iIiIxIChwKSBbTm9uZV0gMCAwCjE1IChwKSBbTm9uZV0gMCAwCiIiIgpyZXMgPSB0c3RfcmVhZGVyKGRvYykKaWYgcmVzICE9IGV4cGVjdDoKICAgIHByaW50KCJ0ZXN0MTQgZmFpbGVkIikKICAgIHByaW50KHJlcykKICAgIHN5cy5leGl0KDEpCgojCiMgdGVzdCBmcm9tIGJ1ZyAjMTA4ODAxIAojCmRvYz0iIiI8P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9Im5vIj8+CjwhRE9DVFlQRSBhcnRpY2xlIFBVQkxJQyAiLS8vT0FTSVMvL0RURCBEb2NCb29rIFhNTCBWNC4xLjIvL0VOIgogICAgICAgICAgICAgICAgICAiaHR0cDovL3d3dy5vYXNpcy1vcGVuLm9yZy9kb2Nib29rL3htbC80LjEuMi9kb2Nib29reC5kdGQiIFsKXT4KCjxhcnRpY2xlPgp4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eAo8L2FydGljbGU+CiIiIgpleHBlY3Q9IiIiMTAgKGFydGljbGUpIFtOb25lXSAwIDAKMSAoYXJ0aWNsZSkgW05vbmVdIDAgMAozICgjdGV4dCkgWwp4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eHh4eApdIDAgMQoxNSAoYXJ0aWNsZSkgW05vbmVdIDAgMAoiIiIKcmVzID0gdHN0X3JlYWRlcihkb2MpCmlmIHJlcyAhPSBleHBlY3Q6CiAgICBwcmludCgidGVzdDE1IGZhaWxlZCIpCiAgICBwcmludChyZXMpCiAgICBzeXMuZXhpdCgxKQoKIwojIGNsZWFudXAgZm9yIG1lbW9yeSBhbGxvY2F0aW9uIGNvdW50aW5nCiMKZGVsIGYKZGVsIGlucHV0CmRlbCByZWFkZXIKCiMgTWVtb3J5IGRlYnVnIHNwZWNpZmljCmxpYnhtbDIuY2xlYW51cFBhcnNlcigpCmlmIGxpYnhtbDIuZGVidWdNZW1vcnkoMSkgPT0gMDoKICAgIHByaW50KCJPSyIpCmVsc2U6CiAgICBwcmludCgiTWVtb3J5IGxlYWsgJWQgYnl0ZXMiICUgKGxpYnhtbDIuZGVidWdNZW1vcnkoMSkpKQogICAgbGlieG1sMi5kdW1wTWVtb3J5KCkK