LyoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiBDT1BZUklHSFQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiAgIChDKSBDb3B5cmlnaHQgVGFsaWdlbnQsIEluYy4sICAxOTk3ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiAgIChDKSBDb3B5cmlnaHQgSW50ZXJuYXRpb25hbCBCdXNpbmVzcyBNYWNoaW5lcyBDb3Jwb3JhdGlvbiwgIDE5OTctMTk5OCAgICAgICAgICAgICAgICoKKiAgIExpY2Vuc2VkIE1hdGVyaWFsIC0gUHJvZ3JhbS1Qcm9wZXJ0eSBvZiBJQk0gLSBBbGwgUmlnaHRzIFJlc2VydmVkLiAgICAgICAgICAgICAgICAgICoKKiAgIFVTIEdvdmVybm1lbnQgVXNlcnMgUmVzdHJpY3RlZCBSaWdodHMgLSBVc2UsIGR1cGxpY2F0aW9uLCBvciBkaXNjbG9zdXJlICAgICAgICAgICAgICoKKiAgIHJlc3RyaWN0ZWQgYnkgR1NBIEFEUCBTY2hlZHVsZSBDb250cmFjdCB3aXRoIElCTSBDb3JwLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKi8KCiNpbmNsdWRlICJ1c3RydGVzdC5oIgojaW5jbHVkZSAidW5pc3RyLmgiCiNpbmNsdWRlICJsb2NpZC5oIgojaW5jbHVkZSA8c3RkaW8uaD4KClVuaWNvZGVTdHJpbmdUZXN0OjpVbmljb2RlU3RyaW5nVGVzdCgpCnsKfQoKVW5pY29kZVN0cmluZ1Rlc3Q6On5Vbmljb2RlU3RyaW5nVGVzdCgpCnsKfQoKdm9pZCBVbmljb2RlU3RyaW5nVGVzdDo6cnVuSW5kZXhlZFRlc3QoIGludDMyX3QgaW5kZXgsIGJvb2xfdCBleGVjLCBjaGFyKiAmbmFtZSwgY2hhciogcGFyICkKewogICAgaWYgKGV4ZWMpIGxvZ2xuKCJUZXN0U3VpdGUgTG9jYWxlVGVzdDogIik7CiAgICBzd2l0Y2ggKGluZGV4KSB7CiAgICAgICAgY2FzZSAwOiBuYW1lID0gIlRlc3RCYXNpY01hbmlwdWxhdGlvbiI7IGlmIChleGVjKSBUZXN0QmFzaWNNYW5pcHVsYXRpb24oKTsgYnJlYWs7CiAgICAgICAgY2FzZSAxOiBuYW1lID0gIlRlc3RDb21wYXJlIjsgaWYgKGV4ZWMpIFRlc3RDb21wYXJlKCk7IGJyZWFrOwogICAgICAgIGNhc2UgMjogbmFtZSA9ICJUZXN0RXh0cmFjdCI7IGlmIChleGVjKSBUZXN0RXh0cmFjdCgpOyBicmVhazsKICAgICAgICBjYXNlIDM6IG5hbWUgPSAiVGVzdFJlbW92ZVJlcGxhY2UiOyBpZiAoZXhlYykgVGVzdFJlbW92ZVJlcGxhY2UoKTsgYnJlYWs7CiAgICAgICAgY2FzZSA0OiBuYW1lID0gIlRlc3RDYXNlQ29udmVyc2lvbiI7IGlmIChleGVjKSBUZXN0Q2FzZUNvbnZlcnNpb24oKTsgYnJlYWs7CiAgICAgICAgY2FzZSA2OiBuYW1lID0gIlRlc3RTZWFyY2hpbmciOyBpZiAoZXhlYykgVGVzdFNlYXJjaGluZygpOyBicmVhazsKICAgICAgICBjYXNlIDc6IG5hbWUgPSAiVGVzdFNwYWNlUGFkZGluZyI7IGlmIChleGVjKSBUZXN0U3BhY2VQYWRkaW5nKCk7IGJyZWFrOwogICAgICAgIGNhc2UgODogbmFtZSA9ICJUZXN0UHJlZml4QW5kU3VmZml4IjsgaWYgKGV4ZWMpIFRlc3RQcmVmaXhBbmRTdWZmaXgoKTsgYnJlYWs7CiAgICAgICAgY2FzZSA5OiBuYW1lID0gIlRlc3RGaW5kQW5kUmVwbGFjZSI7IGlmIChleGVjKSBUZXN0RmluZEFuZFJlcGxhY2UoKTsgYnJlYWs7CiAgICAgICAgY2FzZSAxMDogbmFtZSA9ICJUZXN0Q2VsbFdpZHRoIjsgaWYgKGV4ZWMpIFRlc3RDZWxsV2lkdGgoKTsgYnJlYWs7CiAgICAgICAgY2FzZSAxMTogbmFtZSA9ICJUZXN0UmV2ZXJzZSI7IGlmIChleGVjKSBUZXN0UmV2ZXJzZSgpOyBicmVhazsKICAgICAgICBjYXNlIDEyOiBuYW1lID0gIlRlc3RNaXNjZWxsYW5lb3VzIjsgaWYgKGV4ZWMpIFRlc3RNaXNjZWxsYW5lb3VzKCk7IGJyZWFrOwogICAgICAgIGNhc2UgMTM6IG5hbWUgPSAiVGVzdFN0YWNrQWxsb2NhdGlvbiI7IGlmIChleGVjKSBUZXN0U3RhY2tBbGxvY2F0aW9uKCk7IGJyZWFrOwoKICAgICAgICBkZWZhdWx0OiBuYW1lID0gIiI7IGJyZWFrOyAvL25lZWRlZCB0byBlbmQgbG9vcAogICAgfQp9Cgp2b2lkClVuaWNvZGVTdHJpbmdUZXN0OjpUZXN0QmFzaWNNYW5pcHVsYXRpb24oKQp7CiAgICBVbmljb2RlU3RyaW5nICAgdGVzdDEoIk5vdyBpcyB0aGUgdGltZSBmb3IgYWxsIG1lbiB0byBjb21lIHN3aWZ0bHkgdG8gdGhlIGFpZCBvZiB0aGUgcGFydHkuXG4iKTsKICAgIFVuaWNvZGVTdHJpbmcgICBleHBlY3RlZFZhbHVlOwoKICAgIHRlc3QxLmluc2VydCgyNCwgImdvb2QgIik7CiAgICBleHBlY3RlZFZhbHVlID0gIk5vdyBpcyB0aGUgdGltZSBmb3IgYWxsIGdvb2QgbWVuIHRvIGNvbWUgc3dpZnRseSB0byB0aGUgYWlkIG9mIHRoZSBwYXJ0eS5cbiI7CiAgICBpZiAodGVzdDEgIT0gZXhwZWN0ZWRWYWx1ZSkKICAgICAgICBlcnJsbigiaW5zZXJ0KCkgZmFpbGVkOiAgZXhwZWN0ZWQgXCIiICsgZXhwZWN0ZWRWYWx1ZSArICJcIlxuLGdvdCBcIiIgKyB0ZXN0MSArICJcIiIpOwoKICAgIHRlc3QxLnJlbW92ZSg0MSwgOCk7CiAgICBleHBlY3RlZFZhbHVlID0gIk5vdyBpcyB0aGUgdGltZSBmb3IgYWxsIGdvb2QgbWVuIHRvIGNvbWUgdG8gdGhlIGFpZCBvZiB0aGUgcGFydHkuXG4iOwogICAgaWYgKHRlc3QxICE9IGV4cGVjdGVkVmFsdWUpCiAgICAgICAgZXJybG4oInJlbW92ZSgpIGZhaWxlZDogIGV4cGVjdGVkIFwiIiArIGV4cGVjdGVkVmFsdWUgKyAiXCJcbixnb3QgXCIiICsgdGVzdDEgKyAiXCIiKTsKICAgIAogICAgdGVzdDEucmVwbGFjZSg1OCwgNiwgImlyIGNvdW50cnkiKTsKICAgIGV4cGVjdGVkVmFsdWUgPSAiTm93IGlzIHRoZSB0aW1lIGZvciBhbGwgZ29vZCBtZW4gdG8gY29tZSB0byB0aGUgYWlkIG9mIHRoZWlyIGNvdW50cnkuXG4iOwogICAgaWYgKHRlc3QxICE9IGV4cGVjdGVkVmFsdWUpCiAgICAgICAgZXJybG4oInJlcGxhY2UoKSBmYWlsZWQ6ICBleHBlY3RlZCBcIiIgKyBleHBlY3RlZFZhbHVlICsgIlwiXG4sZ290IFwiIiArIHRlc3QxICsgIlwiIik7CiAgICAKICAgIFVDaGFyICAgICB0ZW1wWzgwXTsKICAgIHRlc3QxLmV4dHJhY3QoMCwgMTUsIHRlbXApOwogICAgCiAgICBVbmljb2RlU3RyaW5nICAgICAgIHRlc3QyKHRlbXAsIDE1KTsKICAgIAogICAgZXhwZWN0ZWRWYWx1ZSA9ICJOb3cgaXMgdGhlIHRpbWUiOwogICAgaWYgKHRlc3QyICE9IGV4cGVjdGVkVmFsdWUpCiAgICAgICAgZXJybG4oImV4dHJhY3QoKSBmYWlsZWQ6ICBleHBlY3RlZCBcIiIgKyBleHBlY3RlZFZhbHVlICsgIlwiXG4sZ290IFwiIiArIHRlc3QyICsgIlwiIik7CiAgICAKICAgIHRlc3QyICs9ICIgZm9yIG1lIHRvIGdvIVxuIjsKICAgIGV4cGVjdGVkVmFsdWUgPSAiTm93IGlzIHRoZSB0aW1lIGZvciBtZSB0byBnbyFcbiI7CiAgICBpZiAodGVzdDIgIT0gZXhwZWN0ZWRWYWx1ZSkKICAgICAgICBlcnJsbigib3BlcmF0b3IrPSgpIGZhaWxlZDogIGV4cGVjdGVkIFwiIiArIGV4cGVjdGVkVmFsdWUgKyAiXCJcbixnb3QgXCIiICsgdGVzdDIgKyAiXCIiKTsKICAgIAogICAgaWYgKHRlc3QxLnNpemUoKSAhPSA3MCkKICAgICAgICBlcnJsbigic2l6ZSgpIGZhaWxlZDogZXhwZWN0ZWQgNzAsIGdvdCAiICsgdGVzdDEuc2l6ZSgpKTsKICAgIGlmICh0ZXN0Mi5zaXplKCkgIT0gMzApCiAgICAgICAgZXJybG4oInNpemUoKSBmYWlsZWQ6IGV4cGVjdGVkIDMwLCBnb3QgIiArIHRlc3QyLnNpemUoKSk7Cn0KCnZvaWQKVW5pY29kZVN0cmluZ1Rlc3Q6OlRlc3RDb21wYXJlKCkKewogICAgVW5pY29kZVN0cmluZyAgIHRlc3QxKCJ0aGlzIGlzIGEgdGVzdCIpOwogICAgVW5pY29kZVN0cmluZyAgIHRlc3QyKCJ0aGlzIGlzIGEgdGVzdCIpOwogICAgVW5pY29kZVN0cmluZyAgIHRlc3QzKCJ0aGlzIGlzIGEgdGVzdCBvZiB0aGUgZW1lcmdlbmN5IGJyb2FkY2FzdCBzeXN0ZW0iKTsKICAgIFVuaWNvZGVTdHJpbmcgICB0ZXN0NCgibmV2ZXIgc2F5LCBcInRoaXMgaXMgYSB0ZXN0XCIhISIpOwoKICAgIFVDaGFyICAgICAgICAgdW5pQ2hhcnNbXSA9IHsgJ3QnLCAnaCcsICdpJywgJ3MnLCAnICcsICdpJywgJ3MnLCAKICAgICAgICAgICAgICAgICAnICcsICdhJywgJyAnLCAndCcsICdlJywgJ3MnLCAndCcsIDAgfTsKICAgIGNoYXIgICAgICAgICAgICBjaGFyc1tdID0gInRoaXMgaXMgYSB0ZXN0IjsKCiAgICAvLyB0ZXN0IG9wZXJhdG9yPT0gYW5kIG9wZXJhdG9yIT0KICAgIGlmICh0ZXN0MSAhPSB0ZXN0MiB8fCB0ZXN0MSA9PSB0ZXN0MyB8fCB0ZXN0MSA9PSB0ZXN0NCkKICAgICAgICBlcnJsbigib3BlcmF0b3I9PSBvciBvcGVyYXRvciE9IGZhaWxlZCIpOwoKICAgIC8vIHRlc3Qgb3BlcmF0b3I+IGFuZCBvcGVyYXRvcjwKICAgIGlmICh0ZXN0MSA+IHRlc3QyIHx8IHRlc3QxIDwgdGVzdDIgfHwgdGVzdDEgPiB0ZXN0MyB8fCB0ZXN0MSA8IHRlc3Q0KQogICAgICAgIGVycmxuKCJvcGVyYXRvcj4gb3Igb3BlcmF0b3I8IGZhaWxlZCIpOwoKICAgIC8vIHRlc3Qgb3BlcmF0b3I+PSBhbmQgb3BlcmF0b3I8PQogICAgaWYgKCEodGVzdDEgPj0gdGVzdDIpIHx8ICEodGVzdDEgPD0gdGVzdDIpIHx8ICEodGVzdDEgPD0gdGVzdDMpIHx8ICEodGVzdDEgPj0gdGVzdDQpKQogICAgICAgIGVycmxuKCJvcGVyYXRvcj49IG9yIG9wZXJhdG9yPD0gZmFpbGVkIik7CgogICAgLy8gdGVzdCBjb21wYXJlKFVuaWNvZGVTdHJpbmcpCiAgICBpZiAodGVzdDEuY29tcGFyZSh0ZXN0MikgIT0gMCB8fCB0ZXN0MS5jb21wYXJlKHRlc3QzKSA+PSAwIHx8IHRlc3QxLmNvbXBhcmUodGVzdDQpIDw9IDApCiAgICAgICAgZXJybG4oImNvbXBhcmUoVW5pY29kZVN0cmluZykgZmFpbGVkIik7CgogICAgLy90ZXN0IGNvbXBhcmUob2Zmc2V0LCBsZW5ndGgsIFVuaWNvZGVTdHJpbmcpCiAgICBpZih0ZXN0MS5jb21wYXJlKDAsIDE0LCB0ZXN0MikgIT0gMCB8fAogICAgICAgIHRlc3QzLmNvbXBhcmUoMCwgMTQsIHRlc3QyKSAhPSAwIHx8CiAgICAgICAgdGVzdDQuY29tcGFyZSgxMiwgMTQsIHRlc3QyKSAhPSAwIHx8CiAgICAgICAgdGVzdDMuY29tcGFyZSgwLCAxOCwgdGVzdDEpIDw9MCAgKQogICAgICAgIGVycmxuKCJjb21wYXJlKG9mZnNldCwgbGVuZ3RoLCBVbmljb2RlU3RyaW5nKSBmYWlsZXMiKTsKCiAgICAvLyB0ZXN0IGNvbXBhcmUoVUNoYXIqKQogICAgaWYgKHRlc3QyLmNvbXBhcmUodW5pQ2hhcnMpICE9IDAgfHwgdGVzdDMuY29tcGFyZSh1bmlDaGFycykgPD0gMCB8fCB0ZXN0NC5jb21wYXJlKHVuaUNoYXJzKSA+PSAwKQogICAgICAgIGVycmxuKCJjb21wYXJlKFVDaGFyKikgZmFpbGVkIik7CgogICAgLy8gdGVzdCBjb21wYXJlKGNoYXIqKQogICAgaWYgKHRlc3QyLmNvbXBhcmUoY2hhcnMpICE9IDAgfHwgdGVzdDMuY29tcGFyZShjaGFycykgPD0gMCB8fCB0ZXN0NC5jb21wYXJlKGNoYXJzKSA+PSAwKQogICAgICAgIGVycmxuKCJjb21wYXJlKGNoYXIqKSBmYWlsZWQiKTsKCiAgICAvLyB0ZXN0IGNvbXBhcmUoVUNoYXIqLCBsZW5ndGgpCiAgICBpZiAodGVzdDEuY29tcGFyZSh1bmlDaGFycywgNCkgPD0gMCB8fCB0ZXN0MS5jb21wYXJlKHVuaUNoYXJzLCA0KSA8PSAwKQogICAgICAgIGVycmxuKCJjb21wYXJlKFVDaGFyKiwgbGVuZ3RoKSBmYWlsZWQiKTsKCiAgICAvLyB0ZXN0IGNvbXBhcmUodGhpc09mZnNldCwgdGhpc0xlbmd0aCwgdGhhdCwgdGhhdE9mZnNldCwgdGhhdExlbmd0aCkKICAgIGlmICh0ZXN0MS5jb21wYXJlKDAsIDE0LCB0ZXN0MiwgMCwgMTQpICE9IDAgCiAgICB8fCB0ZXN0MS5jb21wYXJlKDAsIDE0LCB0ZXN0MywgMCwgMTQpICE9IDAKICAgIHx8IHRlc3QxLmNvbXBhcmUoMCwgMTQsIHRlc3Q0LCAxMiwgMTQpICE9IDApCiAgICAgICAgZXJybG4oIjEuIGNvbXBhcmUodGhpc09mZnNldCwgdGhpc0xlbmd0aCwgdGhhdCwgdGhhdE9mZnNldCwgdGhhdExlbmd0aCkgZmFpbGVkIik7CgogICAgaWYgKHRlc3QxLmNvbXBhcmUoMTAsIDQsIHRlc3QyLCAwLCA0KSA+PSAwIAogICAgfHwgdGVzdDEuY29tcGFyZSgxMCwgNCwgdGVzdDMsIDIyLCA5KSA8PSAwCiAgICB8fCB0ZXN0MS5jb21wYXJlKDEwLCA0LCB0ZXN0NCwgMjIsIDQpICE9IDApCiAgICAgICAgZXJybG4oIjIuIGNvbXBhcmUodGhpc09mZnNldCwgdGhpc0xlbmd0aCwgdGhhdCwgdGhhdE9mZnNldCwgdGhhdExlbmd0aCkgZmFpbGVkIik7CgogICAgLy8gdGVzdCBjb21wYXJlQmV0d2VlbgogICAgaWYgKHRlc3QxLmNvbXBhcmVCZXR3ZWVuKDAsIDE0LCB0ZXN0MiwgMCwgMTQpICE9IDAgfHwgdGVzdDEuY29tcGFyZUJldHdlZW4oMCwgMTQsIHRlc3QzLCAwLCAxNCkgIT0gMAogICAgICAgICAgICAgICAgICAgIHx8IHRlc3QxLmNvbXBhcmVCZXR3ZWVuKDAsIDE0LCB0ZXN0NCwgMTIsIDI2KSAhPSAwKQogICAgICAgIGVycmxuKCJjb21wYXJlQmV0d2VlbiBmYWlsZWQiKTsKCiAgICBpZiAodGVzdDEuY29tcGFyZUJldHdlZW4oMTAsIDE0LCB0ZXN0MiwgMCwgNCkgPj0gMCB8fCB0ZXN0MS5jb21wYXJlQmV0d2VlbigxMCwgMTQsIHRlc3QzLCAyMiwgMzEpIDw9IDAKICAgICAgICAgICAgICAgICAgICB8fCB0ZXN0MS5jb21wYXJlQmV0d2VlbigxMCwgMTQsIHRlc3Q0LCAyMiwgMjYpICE9IDApCiAgICAgICAgZXJybG4oImNvbXBhcmVCZXR3ZWVuIGZhaWxlZCIpOwp9Cgp2b2lkClVuaWNvZGVTdHJpbmdUZXN0OjpUZXN0RXh0cmFjdCgpCnsKICAgIFVuaWNvZGVTdHJpbmcgICB0ZXN0MSgiTm93IGlzIHRoZSB0aW1lIGZvciBhbGwgZ29vZCBtZW4gdG8gY29tZSB0byB0aGUgYWlkIG9mIHRoZWlyIGNvdW50cnkuIik7CiAgICBVbmljb2RlU3RyaW5nICAgdGVzdDI7CiAgICBVQ2hhciAgICAgICAgIHRlc3QzWzEzXTsKICAgIGNoYXIgICAgICAgICAgICB0ZXN0NFsxM107CiAgICBVbmljb2RlU3RyaW5nICAgdGVzdDU7CgogICAgdGVzdDEuZXh0cmFjdCgxMSwgMTIsIHRlc3QyKTsKICAgIHRlc3QxLmV4dHJhY3QoMTEsIDEyLCB0ZXN0Myk7CiAgICB0ZXN0MS5leHRyYWN0KDExLCAxMiwgdGVzdDQpOwogICAgdGVzdDEuZXh0cmFjdEJldHdlZW4oMTEsIDIzLCB0ZXN0NSk7CgogICAgZm9yIChVVGV4dE9mZnNldCBpID0gMDsgaSA8IDEyOyBpKyspIHsKICAgICAgICBpZiAodGVzdDFbKFVUZXh0T2Zmc2V0KSgxMSArIGkpXSAhPSB0ZXN0MltpXSkgewogICAgICAgICAgICBlcnJsbihVbmljb2RlU3RyaW5nKCJleHRyYWN0aW5nIGludG8gYSBVbmljb2RlU3RyaW5nIGZhaWxlZCBhdCBwb3NpdGlvbiAiKSArIGkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKHRlc3QxWyhVVGV4dE9mZnNldCkoMTEgKyBpKV0gIT0gdGVzdDNbaV0pIHsKICAgICAgICAgICAgZXJybG4oVW5pY29kZVN0cmluZygiZXh0cmFjdGluZyBpbnRvIGFuIGFycmF5IG9mIFVDaGFyIGZhaWxlZCBhdCBwb3NpdGlvbiAiKSArIGkpOwogICAgICAgICAgICBicmVhazsKICAgICAgICB9CiAgICAgICAgaWYgKCgoKGNoYXIpdGVzdDFbKFVUZXh0T2Zmc2V0KSgxMSArIGkpXSkgJiAweGZmKSAhPSB0ZXN0NFtpXSkgewogICAgICAgICAgICBlcnJsbihVbmljb2RlU3RyaW5nKCJleHRyYWN0aW5nIGludG8gYW4gYXJyYXkgb2YgY2hhciBmYWlsZWQgYXQgcG9zaXRpb24gIikgKyBpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIGlmICh0ZXN0MVsoVVRleHRPZmZzZXQpKDExICsgaSldICE9IHRlc3Q1W2ldKSB7CiAgICAgICAgICAgIGVycmxuKFVuaWNvZGVTdHJpbmcoImV4dHJhY3Rpbmcgd2l0aCBleHRyYWN0QmV0d2VlbiBmYWlsZWQgYXQgcG9zaXRpb24gIikgKyBpKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQp9Cgp2b2lkClVuaWNvZGVTdHJpbmdUZXN0OjpUZXN0UmVtb3ZlUmVwbGFjZSgpCnsKICAgIFVuaWNvZGVTdHJpbmcgICB0ZXN0MSgiVGhlIHJhaW4gaW4gU3BhaW4gc3RheXMgbWFpbmx5IG9uIHRoZSBwbGFpbiIpOwogICAgVW5pY29kZVN0cmluZyAgIHRlc3QyKCJlYXQgU1BBTWJ1cmdlcnMhIik7CiAgICBVQ2hhciAgICAgICAgIHRlc3QzW10gPSB7ICdTJywgJ1AnLCAnQScsICdNJywgJ00nLCAwIH07CiAgICBjaGFyICAgICAgICAgICAgdGVzdDRbXSA9ICJTUEFNIjsKICAgIFVuaWNvZGVTdHJpbmcmICB0ZXN0NSA9IHRlc3QxOwoKICAgIHRlc3QxLnJlcGxhY2UoNCwgNCwgdGVzdDIsIDQsIDQpOwogICAgdGVzdDEucmVwbGFjZSgxMiwgNSwgdGVzdDMsIDQpOwogICAgdGVzdDNbNF0gPSAwOwogICAgdGVzdDEucmVwbGFjZSgxNywgNCwgdGVzdDMpOwogICAgdGVzdDEucmVwbGFjZSgyMywgNCwgdGVzdDQpOwogICAgdGVzdDEucmVwbGFjZUJldHdlZW4oMzcsIDQyLCB0ZXN0MiwgNCwgOCk7CgogICAgaWYgKHRlc3QxICE9ICJUaGUgU1BBTSBpbiBTUEFNIFNQQU1zIFNQQU1seSBvbiB0aGUgU1BBTSIpCiAgICAgICAgZXJybG4oIk9uZSBvZiB0aGUgcmVwbGFjZSBtZXRob2RzIGZhaWxlZDpcbiIKICAgICAgICAgICAgICAiICBleHBlY3RlZCBcIlRoZSBTUEFNIGluIFNQQU0gU1BBTXMgU1BBTWx5IG9uIHRoZSBTUEFNXCIsXG4iCiAgICAgICAgICAgICAgIiAgZ290IFwiIiArIHRlc3QxICsgIlwiIik7CgogICAgdGVzdDEucmVtb3ZlKDIxLCAxKTsKICAgIHRlc3QxLnJlbW92ZUJldHdlZW4oMjYsIDI4KTsKCiAgICBpZiAodGVzdDEgIT0gIlRoZSBTUEFNIGluIFNQQU0gU1BBTSBTUEFNIG9uIHRoZSBTUEFNIikKICAgICAgICBlcnJsbigiT25lIG9mIHRoZSByZW1vdmUgbWV0aG9kcyBmYWlsZWQ6XG4iCiAgICAgICAgICAgICAgIiAgZXhwZWN0ZWQgXCJUaGUgU1BBTSBpbiBTUEFNIFNQQU0gU1BBTSBvbiB0aGUgU1BBTVwiLFxuIgogICAgICAgICAgICAgICIgIGdvdCBcIiIgKyB0ZXN0MSArICJcIiIpOwoKICAgIGZvciAoVVRleHRPZmZzZXQgaSA9IDA7IGkgPCB0ZXN0MS5zaXplKCk7IGkrKykKICAgICAgICBpZiAodGVzdDVbaV0gIT0gJ1MnICYmIHRlc3Q1W2ldICE9ICdQJyAmJiB0ZXN0NVtpXSAhPSAnQScgJiYgdGVzdDVbaV0gIT0gJ00nICYmIHRlc3Q1W2ldICE9ICcgJykKICAgICAgICAgICAgdGVzdDFbaV0gPSAneCc7CgogICAgaWYgKHRlc3QxICE9ICJ4eHggU1BBTSB4eCBTUEFNIFNQQU0gU1BBTSB4eCB4eHggU1BBTSIpCiAgICAgICAgZXJybG4oIk9uZSBvZiB0aGUgcmVtb3ZlIG1ldGhvZHMgZmFpbGVkOlxuIgogICAgICAgICAgICAgICIgIGV4cGVjdGVkIFwieHh4IFNQQU0geHggU1BBTSBTUEFNIFNQQU0geHggeHh4IFNQQU1cIixcbiIKICAgICAgICAgICAgICAiICBnb3QgXCIiICsgdGVzdDEgKyAiXCIiKTsKCiAgICB0ZXN0MS5yZW1vdmUoKTsKICAgIGlmICh0ZXN0MS5zaXplKCkgIT0gMCkKICAgICAgICBlcnJsbigiUmVtb3ZlKCkgZmFpbGVkOiBleHBlY3RlZCBlbXB0eSBzdHJpbmcsIGdvdCBcIiIgKyB0ZXN0MSArICJcIiIpOwp9Cgp2b2lkClVuaWNvZGVTdHJpbmdUZXN0OjpUZXN0Q2FzZUNvbnZlcnNpb24oKQp7CiAgICBVQ2hhciB1cHBlcmNhc2VHcmVla1tdID0KICAgICAgICB7IDB4Mzk5LCAweDM5NSwgMHgzYTMsIDB4M2E1LCAweDNhMywgJyAnLCAweDAzYTcsIDB4M2ExLCAweDM5OSwgMHgzYTMsIDB4M2E0LAogICAgICAgIDB4MzlmLCAweDNhMywgMCB9OwogICAgICAgIC8vICJJRVNVUyBDSFJJU1RPUyIKCiAgICBVQ2hhciBsb3dlcmNhc2VHcmVla1tdID0gCiAgICAgICAgeyAweDNiOSwgMHgzYjUsIDB4M2MzLCAweDNjNSwgMHgzYzIsICcgJywgMHgwM2M3LCAweDNjMSwgMHgzYjksIDB4M2MzLCAweDNjNCwKICAgICAgICAweDNiZiwgMHgzYzIsIDAgfTsKICAgICAgICAvLyAiaWVzdXMgY2hyaXN0b3MiCgogICAgVUNoYXIgbG93ZXJjYXNlVHVya2lzaFtdID0gCiAgICAgICAgeyAnaScsICdzJywgJ3QnLCAnYScsICduJywgJ2InLCAndScsICdsJywgJywnLCAnICcsICduJywgJ28nLCAndCcsICcgJywgJ2MnLCAnbycsIAogICAgICAgICduJywgJ3MnLCAndCcsICdhJywgJ24nLCAndCcsIDB4MDEzMSwgJ24nLCAnbycsICdwJywgJ2wnLCAnZScsICchJywgMCB9OwoKICAgIFVDaGFyIHVwcGVyY2FzZVR1cmtpc2hbXSA9IAogICAgICAgIHsgJ1QnLCAnTycsICdQJywgJ0snLCAnQScsICdQJywgJ0knLCAnICcsICdQJywgJ0EnLCAnTCcsICdBJywgJ0MnLCAnRScsICcsJywgJyAnLAogICAgICAgIDB4MDEzMCwgJ1MnLCAnVCcsICdBJywgJ04nLCAnQicsICdVJywgJ0wnLCAwIH07CiAgICAKICAgIFVuaWNvZGVTdHJpbmcgZXhwZWN0ZWRSZXN1bHQ7CiAgICBVbmljb2RlU3RyaW5nICAgdGVzdDM7CgogICAgdGVzdDMgKz0gMHgwMTMwOwogICAgdGVzdDMgKz0gIlNUQU5CVUwsIE5PVCBDT05TVEFOVElOT1BMRSEiOwoKICAgIFVuaWNvZGVTdHJpbmcgICB0ZXN0NCh0ZXN0Myk7CiAgICB0ZXN0NC50b0xvd2VyKCk7CiAgICBleHBlY3RlZFJlc3VsdCA9ICJpc3RhbmJ1bCwgbm90IGNvbnN0YW50aW5vcGxlISI7CiAgICBpZiAodGVzdDQgIT0gZXhwZWN0ZWRSZXN1bHQpCiAgICAgICAgZXJybG4oIjEuIHRvTG93ZXIgZmFpbGVkOiBleHBlY3RlZCBcIiIgKyBleHBlY3RlZFJlc3VsdCArICJcIiwgZ290IFwiIiArIHRlc3Q0ICsgIlwiLiIpOwoKICAgIHRlc3Q0ID0gdGVzdDM7CiAgICB0ZXN0NC50b0xvd2VyKExvY2FsZSgidHIiLCAiVFIiKSk7CiAgICBleHBlY3RlZFJlc3VsdCA9IGxvd2VyY2FzZVR1cmtpc2g7CiAgICBpZiAodGVzdDQgIT0gZXhwZWN0ZWRSZXN1bHQpCiAgICAgICAgZXJybG4oIjIuIHRvTG93ZXIgZmFpbGVkOiBleHBlY3RlZCBcIiIgKyBleHBlY3RlZFJlc3VsdCArICJcIiwgZ290IFwiIiArIHRlc3Q0ICsgIlwiLiIpOwoKICAgIHRlc3QzID0gInRvcGthcCI7CiAgICB0ZXN0MyArPSAweDAxMzE7CiAgICB0ZXN0MyArPSAiIHBhbGFjZSwgaXN0YW5idWwiOwogICAgdGVzdDQgPSB0ZXN0MzsKCiAgICB0ZXN0NC50b1VwcGVyKCk7CiAgICBleHBlY3RlZFJlc3VsdCA9ICJUT1BLQVBJIFBBTEFDRSwgSVNUQU5CVUwiOwogICAgaWYgKHRlc3Q0ICE9IGV4cGVjdGVkUmVzdWx0KQogICAgICAgIGVycmxuKCJ0b1VwcGVyIGZhaWxlZDogZXhwZWN0ZWQgXCIiICsgZXhwZWN0ZWRSZXN1bHQgKyAiXCIsIGdvdCBcIiIgKyB0ZXN0NCArICJcIi4iKTsKCiAgICB0ZXN0NCA9IHRlc3QzOwogICAgdGVzdDQudG9VcHBlcihMb2NhbGUoInRyIiwgIlRSIikpOwogICAgZXhwZWN0ZWRSZXN1bHQgPSB1cHBlcmNhc2VUdXJraXNoOwogICAgaWYgKHRlc3Q0ICE9IGV4cGVjdGVkUmVzdWx0KQogICAgICAgIGVycmxuKCJ0b1VwcGVyIGZhaWxlZDogZXhwZWN0ZWQgXCIiICsgZXhwZWN0ZWRSZXN1bHQgKyAiXCIsIGdvdCBcIiIgKyB0ZXN0NCArICJcIi4iKTsKCiAgICB0ZXN0MyA9ICJT/N9tYXlyc3RyYd9lIjsKCiAgICB0ZXN0My50b1VwcGVyKExvY2FsZSgiZGUiLCAiREUiKSk7CiAgICBleHBlY3RlZFJlc3VsdCA9ICJT3FNTTUFZUlNUUkFTU0UiOwogICAgaWYgKHRlc3QzICE9IGV4cGVjdGVkUmVzdWx0KQogICAgICAgIGVycmxuKCJ0b1VwcGVyIGZhaWxlZDogZXhwZWN0ZWQgXCIiICsgZXhwZWN0ZWRSZXN1bHQgKyAiXCIsIGdvdCBcIiIgKyB0ZXN0MyArICJcIi4iKTsKICAgIAogICAgdGVzdDQucmVwbGFjZSgwLCB0ZXN0NC5zaXplKCksIHVwcGVyY2FzZUdyZWVrKTsKCiAgICB0ZXN0NC50b0xvd2VyKExvY2FsZSgiZWwiLCAiR1IiKSk7CiAgICBleHBlY3RlZFJlc3VsdCA9IGxvd2VyY2FzZUdyZWVrOwogICAgaWYgKHRlc3Q0ICE9IGV4cGVjdGVkUmVzdWx0KQogICAgICAgIGVycmxuKCJ0b0xvd2VyIGZhaWxlZDogZXhwZWN0ZWQgXCIiICsgZXhwZWN0ZWRSZXN1bHQgKyAiXCIsIGdvdCBcIiIgKyB0ZXN0NCArICJcIi4iKTsKICAgIAogICAgdGVzdDQucmVwbGFjZSgwLCB0ZXN0NC5zaXplKCksIGxvd2VyY2FzZUdyZWVrKTsKCiAgICB0ZXN0NC50b1VwcGVyKCk7CiAgICBleHBlY3RlZFJlc3VsdCA9IHVwcGVyY2FzZUdyZWVrOwogICAgaWYgKHRlc3Q0ICE9IGV4cGVjdGVkUmVzdWx0KQogICAgICAgIGVycmxuKCJ0b1VwcGVyIGZhaWxlZDogZXhwZWN0ZWQgXCIiICsgZXhwZWN0ZWRSZXN1bHQgKyAiXCIsIGdvdCBcIiIgKyB0ZXN0NCArICJcIi4iKTsKfQoKdm9pZApVbmljb2RlU3RyaW5nVGVzdDo6VGVzdFNlYXJjaGluZygpCnsKICAgIFVuaWNvZGVTdHJpbmcgdGVzdDEoInRlc3QgdGVzdCB0dGVzdCB0ZXRlc3QgdGVzdGVzdGVzdHN0dCIpOwogICAgVW5pY29kZVN0cmluZyB0ZXN0MigidGVzdCIpOwogICAgVUNoYXIgdGVzdENoYXIgPSAndCc7CgogICAgdWludDE2X3Qgb2NjdXJyZW5jZXMgPSAwOwogICAgVVRleHRPZmZzZXQgc3RhcnRQb3MgPSAwOwogICAgZm9yICggOwogICAgICAgICAgc3RhcnRQb3MgIT0gLTEgJiYgc3RhcnRQb3MgPCB0ZXN0MS5zaXplKCk7CiAgICAgICAgICAoc3RhcnRQb3MgPSB0ZXN0MS5pbmRleE9mKHRlc3QyLCBzdGFydFBvcykpICE9IC0xID8gKCsrb2NjdXJyZW5jZXMsIHN0YXJ0UG9zICs9IDQpIDogMCkKICAgICAgICA7CiAgICBpZiAob2NjdXJyZW5jZXMgIT0gNikKICAgICAgICBlcnJsbigiaW5kZXhPZiBmYWlsZWQ6IGV4cGVjdGVkIHRvIGZpbmQgNiBvY2N1cnJlbmNlcywgZm91bmQgIiArIG9jY3VycmVuY2VzKTsKCiAgICBmb3IgKCBvY2N1cnJlbmNlcyA9IDAsIHN0YXJ0UG9zID0gMTA7CiAgICAgICAgICBzdGFydFBvcyAhPSAtMSAmJiBzdGFydFBvcyA8IHRlc3QxLnNpemUoKTsKICAgICAgICAgIChzdGFydFBvcyA9IHRlc3QxLmluZGV4T2YodGVzdDIsIHN0YXJ0UG9zKSkgIT0gLTEgPyAoKytvY2N1cnJlbmNlcywgc3RhcnRQb3MgKz0gNCkgOiAwKQogICAgICAgIDsKICAgIGlmIChvY2N1cnJlbmNlcyAhPSA0KQogICAgICAgIGVycmxuKCJpbmRleE9mIHdpdGggc3RhcnRpbmcgb2Zmc2V0IGZhaWxlZDogZXhwZWN0ZWQgdG8gZmluZCA0IG9jY3VycmVuY2VzLCBmb3VuZCAiICsgb2NjdXJyZW5jZXMpOwoKICAgIFVUZXh0T2Zmc2V0IGVuZFBvcyA9IDI4OwogICAgZm9yICggb2NjdXJyZW5jZXMgPSAwLCBzdGFydFBvcyA9IDU7CiAgICAgICAgICBzdGFydFBvcyAhPSAtMSAmJiBzdGFydFBvcyA8IHRlc3QxLnNpemUoKTsKICAgICAgICAgIChzdGFydFBvcyA9IHRlc3QxLmluZGV4T2YodGVzdDIsIHN0YXJ0UG9zLCBlbmRQb3MgLSBzdGFydFBvcykpICE9IC0xID8gKCsrb2NjdXJyZW5jZXMsIHN0YXJ0UG9zICs9IDQpIDogMCkKICAgICAgICA7CiAgICBpZiAob2NjdXJyZW5jZXMgIT0gNCkKICAgICAgICBlcnJsbigiaW5kZXhPZiB3aXRoIHN0YXJ0aW5nIGFuZCBlbmRpbmcgb2Zmc2V0cyBmYWlsZWQ6IGV4cGVjdGVkIHRvIGZpbmQgNCBvY2N1cnJlbmNlcywgZm91bmQgIiArIG9jY3VycmVuY2VzKTsKCiAgICBmb3IgKCBvY2N1cnJlbmNlcyA9IDAsIHN0YXJ0UG9zID0gMDsKICAgICAgICAgIHN0YXJ0UG9zICE9IC0xICYmIHN0YXJ0UG9zIDwgdGVzdDEuc2l6ZSgpOwogICAgICAgICAgKHN0YXJ0UG9zID0gdGVzdDEuaW5kZXhPZih0ZXN0Q2hhciwgc3RhcnRQb3MpKSAhPSAtMSA/ICgrK29jY3VycmVuY2VzLCBzdGFydFBvcyArPSAxKSA6IDApCiAgICAgICAgOwogICAgaWYgKG9jY3VycmVuY2VzICE9IDE2KQogICAgICAgIGVycmxuKCJpbmRleE9mIHdpdGggY2hhcmFjdGVyIGZhaWxlZDogZXhwZWN0ZWQgdG8gZmluZCAxNiBvY2N1cnJlbmNlcywgZm91bmQgIiArIG9jY3VycmVuY2VzKTsKCiAgICBmb3IgKCBvY2N1cnJlbmNlcyA9IDAsIHN0YXJ0UG9zID0gMTA7CiAgICAgICAgICBzdGFydFBvcyAhPSAtMSAmJiBzdGFydFBvcyA8IHRlc3QxLnNpemUoKTsKICAgICAgICAgIChzdGFydFBvcyA9IHRlc3QxLmluZGV4T2YodGVzdENoYXIsIHN0YXJ0UG9zKSkgIT0gLTEgPyAoKytvY2N1cnJlbmNlcywgc3RhcnRQb3MgKz0gMSkgOiAwKQogICAgICAgIDsKICAgIGlmIChvY2N1cnJlbmNlcyAhPSAxMikKICAgICAgICBlcnJsbigiaW5kZXhPZiB3aXRoIGNoYXJhY3RlciAmIHN0YXJ0IG9mZnNldCBmYWlsZWQ6IGV4cGVjdGVkIHRvIGZpbmQgMTIgb2NjdXJyZW5jZXMsIGZvdW5kICIgKyBvY2N1cnJlbmNlcyk7CgogICAgZm9yICggb2NjdXJyZW5jZXMgPSAwLCBzdGFydFBvcyA9IDUsIGVuZFBvcyA9IDI4OwogICAgICAgICAgc3RhcnRQb3MgIT0gLTEgJiYgc3RhcnRQb3MgPCB0ZXN0MS5zaXplKCk7CiAgICAgICAgICAoc3RhcnRQb3MgPSB0ZXN0MS5pbmRleE9mKHRlc3RDaGFyLCBzdGFydFBvcywgZW5kUG9zIC0gc3RhcnRQb3MpKSAhPSAtMSA/ICgrK29jY3VycmVuY2VzLCBzdGFydFBvcyArPSAxKSA6IDApCiAgICAgICAgOwogICAgaWYgKG9jY3VycmVuY2VzICE9IDEwKQogICAgICAgIGVycmxuKCJpbmRleE9mIHdpdGggY2hhcmFjdGVyICYgc3RhcnQgJiBlbmQgb2Zmc2V0cyBmYWlsZWQ6IGV4cGVjdGVkIHRvIGZpbmQgMTAgb2NjdXJyZW5jZXMsIGZvdW5kICIgKyBvY2N1cnJlbmNlcyk7CgogICAgZm9yICggb2NjdXJyZW5jZXMgPSAwLCBzdGFydFBvcyA9IDk5OTk7CiAgICAgICAgICBzdGFydFBvcyAhPSAtMTsKICAgICAgICAgIChzdGFydFBvcyA9IHRlc3QxLmxhc3RJbmRleE9mKHRlc3QyLCBzdGFydFBvcykpICE9IC0xID8gKytvY2N1cnJlbmNlcyA6IDApCiAgICAgICAgOwogICAgaWYgKG9jY3VycmVuY2VzICE9IDYpCiAgICAgICAgZXJybG4oImxhc3RJbmRleE9mIGZhaWxlZDogZXhwZWN0ZWQgdG8gZmluZCA2IG9jY3VycmVuY2VzLCBmb3VuZCAiICsgb2NjdXJyZW5jZXMpOwoKICAgIGZvciAoIG9jY3VycmVuY2VzID0gMCwgc3RhcnRQb3MgPSAzMjsKICAgICAgICAgIHN0YXJ0UG9zICE9IC0xOwogICAgICAgICAgKHN0YXJ0UG9zID0gdGVzdDEubGFzdEluZGV4T2YodGVzdDIsIHN0YXJ0UG9zKSkgIT0gLTEgPyArK29jY3VycmVuY2VzIDogMCkKICAgICAgICA7CiAgICBpZiAob2NjdXJyZW5jZXMgIT0gNSkKICAgICAgICBlcnJsbigibGFzdEluZGV4T2Ygd2l0aCBzdGFydGluZyBvZmZzZXQgZmFpbGVkOiBleHBlY3RlZCB0byBmaW5kIDUgb2NjdXJyZW5jZXMsIGZvdW5kICIgKyBvY2N1cnJlbmNlcyk7CgogICAgZm9yICggb2NjdXJyZW5jZXMgPSAwLCBzdGFydFBvcyA9IDMyLCBlbmRQb3MgPSA1OwogICAgICAgICAgc3RhcnRQb3MgIT0gLTE7CiAgICAgICAgICAoc3RhcnRQb3MgPSB0ZXN0MS5sYXN0SW5kZXhPZih0ZXN0Miwgc3RhcnRQb3MsIHN0YXJ0UG9zIC0gZW5kUG9zKSkgIT0gLTEgPyArK29jY3VycmVuY2VzIDogMCkKICAgICAgICA7CiAgICBpZiAob2NjdXJyZW5jZXMgIT0gNCkKICAgICAgICBlcnJsbigibGFzdEluZGV4T2Ygd2l0aCBzdGFydGluZyBhbmQgZW5kaW5nIG9mZnNldHMgZmFpbGVkOiBleHBlY3RlZCB0byBmaW5kIDQgb2NjdXJyZW5jZXMsIGZvdW5kICIgKyBvY2N1cnJlbmNlcyk7CgogICAgZm9yICggb2NjdXJyZW5jZXMgPSAwLCBzdGFydFBvcyA9IDk5OTk7CiAgICAgICAgICBzdGFydFBvcyAhPSAtMTsKICAgICAgICAgIChzdGFydFBvcyA9IHRlc3QxLmxhc3RJbmRleE9mKHRlc3RDaGFyLCBzdGFydFBvcykpICE9IC0xID8gKytvY2N1cnJlbmNlcyA6IDApCiAgICAgICAgOwogICAgaWYgKG9jY3VycmVuY2VzICE9IDE2KQogICAgICAgIGVycmxuKCJsYXN0SW5kZXhPZiB3aXRoIGNoYXJhY3RlciBmYWlsZWQ6IGV4cGVjdGVkIHRvIGZpbmQgMTYgb2NjdXJyZW5jZXMsIGZvdW5kICIgKyBvY2N1cnJlbmNlcyk7CgogICAgZm9yICggb2NjdXJyZW5jZXMgPSAwLCBzdGFydFBvcyA9IDMyOwogICAgICAgICAgc3RhcnRQb3MgIT0gLTEgJiYgc3RhcnRQb3MgPCB0ZXN0MS5zaXplKCk7CiAgICAgICAgICAoc3RhcnRQb3MgPSB0ZXN0MS5sYXN0SW5kZXhPZih0ZXN0Q2hhciwgc3RhcnRQb3MpKSAhPSAtMSA/ICsrb2NjdXJyZW5jZXMgOiAwKQogICAgICAgIDsKICAgIGlmIChvY2N1cnJlbmNlcyAhPSAxMykKICAgICAgICBlcnJsbigibGFzdEluZGV4T2Ygd2l0aCBjaGFyYWN0ZXIgJiBzdGFydCBvZmZzZXQgZmFpbGVkOiBleHBlY3RlZCB0byBmaW5kIDEzIG9jY3VycmVuY2VzLCBmb3VuZCAiICsgb2NjdXJyZW5jZXMpOwoKICAgIGZvciAoIG9jY3VycmVuY2VzID0gMCwgc3RhcnRQb3MgPSAzMiwgZW5kUG9zID0gNTsKICAgICAgICAgIHN0YXJ0UG9zICE9IC0xICYmIHN0YXJ0UG9zIDwgdGVzdDEuc2l6ZSgpOwogICAgICAgICAgKHN0YXJ0UG9zID0gdGVzdDEubGFzdEluZGV4T2YodGVzdENoYXIsIHN0YXJ0UG9zLCBzdGFydFBvcyAtIGVuZFBvcykpICE9IC0xID8gKytvY2N1cnJlbmNlcyA6IDApCiAgICAgICAgOwogICAgaWYgKG9jY3VycmVuY2VzICE9IDExKQogICAgICAgIGVycmxuKCJsYXN0SW5kZXhPZiB3aXRoIGNoYXJhY3RlciAmIHN0YXJ0ICYgZW5kIG9mZnNldHMgZmFpbGVkOiBleHBlY3RlZCB0byBmaW5kIDExIG9jY3VycmVuY2VzLCBmb3VuZCAiICsgb2NjdXJyZW5jZXMpOwp9Cgp2b2lkClVuaWNvZGVTdHJpbmdUZXN0OjpUZXN0U3BhY2VQYWRkaW5nKCkKewogICAgVW5pY29kZVN0cmluZyB0ZXN0MSgiaGVsbG8iKTsKICAgIFVuaWNvZGVTdHJpbmcgdGVzdDIoIiAgIHRoZXJlIik7CiAgICBVbmljb2RlU3RyaW5nIHRlc3QzKCJIaSEgIEhvdyB5YSBkb2luJz8gIEJlYXV0aWZ1bCBkYXksIGlzbid0IGl0PyIpOwogICAgVW5pY29kZVN0cmluZyB0ZXN0NDsKICAgIGJvb2xfdCByZXR1cm5WYWw7CiAgICBVbmljb2RlU3RyaW5nIGV4cGVjdGVkVmFsdWU7CgogICAgcmV0dXJuVmFsID0gdGVzdDEucGFkTGVhZGluZygxNSk7CiAgICBleHBlY3RlZFZhbHVlID0gIiAgICAgICAgICBoZWxsbyI7CiAgICBpZiAocmV0dXJuVmFsID09IEZBTFNFIHx8IHRlc3QxICE9IGV4cGVjdGVkVmFsdWUpCiAgICAgICAgZXJybG4oInBhZExlYWRpbmcoKSBmYWlsZWQ6IGV4cGVjdGVkIFwiIiArIGV4cGVjdGVkVmFsdWUgKyAiXCIsIGdvdCBcIiIgKyB0ZXN0MSArICJcIi4iKTsKCiAgICByZXR1cm5WYWwgPSB0ZXN0Mi5wYWRUcmFpbGluZygxNSk7CiAgICBleHBlY3RlZFZhbHVlID0gIiAgIHRoZXJlICAgICAgICI7CiAgICBpZiAocmV0dXJuVmFsID09IEZBTFNFIHx8IHRlc3QyICE9IGV4cGVjdGVkVmFsdWUpCiAgICAgICAgZXJybG4oInBhZFRyYWlsaW5nKCkgZmFpbGVkOiBleHBlY3RlZCBcIiIgKyBleHBlY3RlZFZhbHVlICsgIlwiLCBnb3QgXCIiICsgdGVzdDIgKyAiXCIuIik7CgogICAgZXhwZWN0ZWRWYWx1ZSA9IHRlc3QzOwogICAgcmV0dXJuVmFsID0gdGVzdDMucGFkVHJhaWxpbmcoMTUpOwogICAgaWYgKHJldHVyblZhbCA9PSBUUlVFIHx8IHRlc3QzICE9IGV4cGVjdGVkVmFsdWUpCiAgICAgICAgZXJybG4oInBhZFRyYWlsaW5nKCkgZmFpbGVkOiBleHBlY3RlZCBcIiIgKyBleHBlY3RlZFZhbHVlICsgIlwiLCBnb3QgXCIiICsgdGVzdDMgKyAiXCIuIik7CgogICAgZXhwZWN0ZWRWYWx1ZSA9ICJoZWxsbyI7CiAgICB0ZXN0NC5zZXRUbyh0ZXN0MSkudHJpbSgpOwoKICAgIGlmICh0ZXN0NCAhPSBleHBlY3RlZFZhbHVlIHx8IHRlc3QxID09IGV4cGVjdGVkVmFsdWUgfHwgdGVzdDQgIT0gZXhwZWN0ZWRWYWx1ZSkKICAgICAgICBlcnJsbigidHJpbShVbmljb2RlU3RyaW5nJikgZmFpbGVkIik7CiAgICAKICAgIHRlc3QxLnRyaW0oKTsKICAgIGlmICh0ZXN0MSAhPSBleHBlY3RlZFZhbHVlKQogICAgICAgIGVycmxuKCJ0cmltKCkgZmFpbGVkOiBleHBlY3RlZCBcIiIgKyBleHBlY3RlZFZhbHVlICsgIlwiLCBnb3QgXCIiICsgdGVzdDEgKyAiXCIuIik7CgogICAgdGVzdDIudHJpbSgpOwogICAgZXhwZWN0ZWRWYWx1ZSA9ICJ0aGVyZSI7CiAgICBpZiAodGVzdDIgIT0gZXhwZWN0ZWRWYWx1ZSkKICAgICAgICBlcnJsbigidHJpbSgpIGZhaWxlZDogZXhwZWN0ZWQgXCIiICsgZXhwZWN0ZWRWYWx1ZSArICJcIiwgZ290IFwiIiArIHRlc3QyICsgIlwiLiIpOwoKICAgIHRlc3QzLnRyaW0oKTsKICAgIGV4cGVjdGVkVmFsdWUgPSAiSGkhICBIb3cgeWEgZG9pbic/ICBCZWF1dGlmdWwgZGF5LCBpc24ndCBpdD8iOwogICAgaWYgKHRlc3QzICE9IGV4cGVjdGVkVmFsdWUpCiAgICAgICAgZXJybG4oInRyaW0oKSBmYWlsZWQ6IGV4cGVjdGVkIFwiIiArIGV4cGVjdGVkVmFsdWUgKyAiXCIsIGdvdCBcIiIgKyB0ZXN0MyArICJcIi4iKTsKCiAgICByZXR1cm5WYWwgPSB0ZXN0MS50cnVuY2F0ZSgxNSk7CiAgICBleHBlY3RlZFZhbHVlID0gImhlbGxvIjsKICAgIGlmIChyZXR1cm5WYWwgPT0gVFJVRSB8fCB0ZXN0MSAhPSBleHBlY3RlZFZhbHVlKQogICAgICAgIGVycmxuKCJ0cnVuY2F0ZSgpIGZhaWxlZDogZXhwZWN0ZWQgXCIiICsgZXhwZWN0ZWRWYWx1ZSArICJcIiwgZ290IFwiIiArIHRlc3QxICsgIlwiLiIpOwoKICAgIHJldHVyblZhbCA9IHRlc3QyLnRydW5jYXRlKDE1KTsKICAgIGV4cGVjdGVkVmFsdWUgPSAidGhlcmUiOwogICAgaWYgKHJldHVyblZhbCA9PSBUUlVFIHx8IHRlc3QyICE9IGV4cGVjdGVkVmFsdWUpCiAgICAgICAgZXJybG4oInRydW5jYXRlKCkgZmFpbGVkOiBleHBlY3RlZCBcIiIgKyBleHBlY3RlZFZhbHVlICsgIlwiLCBnb3QgXCIiICsgdGVzdDIgKyAiXCIuIik7CgogICAgcmV0dXJuVmFsID0gdGVzdDMudHJ1bmNhdGUoMTUpOwogICAgZXhwZWN0ZWRWYWx1ZSA9ICJIaSEgIEhvdyB5YSBkb2kiOwogICAgaWYgKHJldHVyblZhbCA9PSBGQUxTRSB8fCB0ZXN0MyAhPSBleHBlY3RlZFZhbHVlKQogICAgICAgIGVycmxuKCJ0cnVuY2F0ZSgpIGZhaWxlZDogZXhwZWN0ZWQgXCIiICsgZXhwZWN0ZWRWYWx1ZSArICJcIiwgZ290IFwiIiArIHRlc3QzICsgIlwiLiIpOwp9Cgp2b2lkClVuaWNvZGVTdHJpbmdUZXN0OjpUZXN0UHJlZml4QW5kU3VmZml4KCkKewogICAgVW5pY29kZVN0cmluZyB0ZXN0MSgiTm93IGlzIHRoZSB0aW1lIGZvciBhbGwgZ29vZCBtZW4gdG8gY29tZSB0byB0aGUgYWlkIG9mIHRoZWlyIGNvdW50cnkuIik7CiAgICBVbmljb2RlU3RyaW5nIHRlc3QyKCJOb3ciKTsKICAgIFVuaWNvZGVTdHJpbmcgdGVzdDMoImNvdW50cnkuIik7CiAgICBVbmljb2RlU3RyaW5nIHRlc3Q0KCJjb3VudCIpOwoKICAgIGlmICghdGVzdDEuc3RhcnRzV2l0aCh0ZXN0MikpCiAgICAgICAgZXJybG4oInN0YXJ0c1dpdGgoKSBmYWlsZWQ6IFwiIiArIHRlc3QyICsgIlwiIHNob3VsZCBiZSBhIHByZWZpeCBvZiBcIiIgKyB0ZXN0MSArICJcIi4iKTsKCiAgICBpZiAodGVzdDEuc3RhcnRzV2l0aCh0ZXN0MykpCiAgICAgICAgZXJybG4oInN0YXJ0c1dpdGgoKSBmYWlsZWQ6IFwiIiArIHRlc3QzICsgIlwiIHNob3VsZG4ndCBiZSBhIHByZWZpeCBvZiBcIiIgKyB0ZXN0MSArICJcIi4iKTsKCiAgICBpZiAodGVzdDEuZW5kc1dpdGgodGVzdDIpKQogICAgICAgIGVycmxuKCJlbmRzV2l0aCgpIGZhaWxlZDogXCIiICsgdGVzdDIgKyAiXCIgc2hvdWxkbid0IGJlIGEgc3VmZml4IG9mIFwiIiArIHRlc3QxICsgIlwiLiIpOwoKICAgIGlmICghdGVzdDEuZW5kc1dpdGgodGVzdDMpKQogICAgICAgIGVycmxuKCJlbmRzV2l0aCgpIGZhaWxlZDogXCIiICsgdGVzdDMgKyAiXCIgc2hvdWxkIGJlIGEgc3VmZml4IG9mIFwiIiArIHRlc3QxICsgIlwiLiIpOwoKICAgIGlmICghdGVzdDMuc3RhcnRzV2l0aCh0ZXN0NCkpCiAgICAgICAgZXJybG4oInN0YXJ0c1dpdGgoKSBmYWlsZWQ6IFwiIiArIHRlc3Q0ICsgIlwiIHNob3VsZCBiZSBhIHByZWZpeCBvZiBcIiIgKyB0ZXN0MyArICJcIi4iKTsKCiAgICBpZiAodGVzdDQuc3RhcnRzV2l0aCh0ZXN0MykpCiAgICAgICAgZXJybG4oInN0YXJ0c1dpdGgoKSBmYWlsZWQ6IFwiIiArIHRlc3QzICsgIlwiIHNob3VsZG4ndCBiZSBhIHByZWZpeCBvZiBcIiIgKyB0ZXN0NCArICJcIi4iKTsKfQoKdm9pZApVbmljb2RlU3RyaW5nVGVzdDo6VGVzdEZpbmRBbmRSZXBsYWNlKCkKewogICAgVW5pY29kZVN0cmluZyB0ZXN0MSgiT25lIHBvdGF0bywgdHdvIHBvdGF0bywgdGhyZWUgcG90YXRvLCBmb3VyXG4iKTsKICAgIFVuaWNvZGVTdHJpbmcgdGVzdDIoInBvdGF0byIpOwogICAgVW5pY29kZVN0cmluZyB0ZXN0MygiTUlTU0lTU0lQUEkiKTsKCiAgICBVbmljb2RlU3RyaW5nIGV4cGVjdGVkVmFsdWU7CgogICAgdGVzdDEuZmluZEFuZFJlcGxhY2UodGVzdDIsIHRlc3QzKTsKICAgIGV4cGVjdGVkVmFsdWUgPSAiT25lIE1JU1NJU1NJUFBJLCB0d28gTUlTU0lTU0lQUEksIHRocmVlIE1JU1NJU1NJUFBJLCBmb3VyXG4iOwogICAgaWYgKHRlc3QxICE9IGV4cGVjdGVkVmFsdWUpCiAgICAgICAgZXJybG4oImZpbmRBbmRSZXBsYWNlIGZhaWxlZDogZXhwZWN0ZWQgXCIiICsgZXhwZWN0ZWRWYWx1ZSArICJcIiwgZ290IFwiIiArIHRlc3QxICsgIlwiLiIpOwogICAgdGVzdDEuZmluZEFuZFJlcGxhY2UodGVzdDMsIHRlc3QyLCAyLCAzMik7CiAgICBleHBlY3RlZFZhbHVlID0gIk9uZSBwb3RhdG8sIHR3byBwb3RhdG8sIHRocmVlIE1JU1NJU1NJUFBJLCBmb3VyXG4iOwogICAgaWYgKHRlc3QxICE9IGV4cGVjdGVkVmFsdWUpCiAgICAgICAgZXJybG4oImZpbmRBbmRSZXBsYWNlIGZhaWxlZDogZXhwZWN0ZWQgXCIiICsgZXhwZWN0ZWRWYWx1ZSArICJcIiwgZ290IFwiIiArIHRlc3QxICsgIlwiLiIpOwp9Cgp2b2lkClVuaWNvZGVTdHJpbmdUZXN0OjpUZXN0Q2VsbFdpZHRoKCkKewogICAgVUNoYXIgICAgIHRlc3REYXRhMltdID0geyAnTScsICdvJywgMHgzMDgsICd0JywgJ2wnLCAnZScsICd5JywgJyAnLCAnQycsICdyJywgJ3UnLCAweDMwOCwgJ2UnLCAweDAwMDAgfTsKICAgIFVDaGFyICAgICB0ZXN0RGF0YTNbXSA9IHsgJzEnLCAnOScsICc5JywgJzcnLCAweDVlNzQsICcgJywgMHg1MTZkLCAweDY3MDgsICcgJywgJzAnLCAnMycsIDB4NjVlNSwgMHg1ZTczLCAweDYyMTAsIDB4MDAwMCB9OwogICAgVUNoYXIgICAgIHRlc3REYXRhNFtdID0geyAnOScsICc3JywgMHhiMTQ0LCAnNicsIDB4YzZkNCwgJzAnLCAnMycsIDB4Yzc3YywgMHgwMDAwIH07CiAgICBVQ2hhciAgICAgdGVzdERhdGE1W10gPSB7ICc5JywgJzcnLCAweDExMDMsIDB4MTE2NywgMHgxMWFiLCAnNicsIDB4MTEwYiwgMHgxMTdiLCAweDExYWYsICcwJywgJzMnLCAweDExMGIsIDB4MTE3NSwgMHgxMWFmLCAweDAwMDAgfTsKICAgIAogICAgVW5pY29kZVN0cmluZyAgIHRlc3QxKCJUaGUgcmFpbiBpbiBTcGFpbiBzdGF5cyBtYWlubHkgb24gdGhlIHBsYWluLiIpOwogICAgVW5pY29kZVN0cmluZyAgIHRlc3QyKHRlc3REYXRhMik7CiAgICBVbmljb2RlU3RyaW5nICAgdGVzdDModGVzdERhdGEzKTsKICAgIFVuaWNvZGVTdHJpbmcgICB0ZXN0NCh0ZXN0RGF0YTQpOwogICAgVW5pY29kZVN0cmluZyAgIHRlc3Q1KHRlc3REYXRhNSk7CgogICAgaWYgKHRlc3QxLm51bURpc3BsYXlDZWxscygpICE9IDQ0KQogICAgICAgIGVycmxuKCJudW1EaXNwbGF5Q2VsbHMoKSBmYWlsZWQ6IGV4cGVjdGVkIDQ0LCBnb3QgIiArIHRlc3QxLm51bURpc3BsYXlDZWxscygpKTsKICAgIGlmICh0ZXN0Mi5udW1EaXNwbGF5Q2VsbHMoKSAhPSAxMSkKICAgICAgICBlcnJsbigibnVtRGlzcGxheUNlbGxzKCkgZmFpbGVkOiBleHBlY3RlZCAxMSwgZ290ICIgKyB0ZXN0Mi5udW1EaXNwbGF5Q2VsbHMoKSk7CiAgICBpZiAodGVzdDMubnVtRGlzcGxheUNlbGxzKCkgIT0gMjApCiAgICAgICAgZXJybG4oIm51bURpc3BsYXlDZWxscygpIGZhaWxlZDogZXhwZWN0ZWQgMjAsIGdvdCAiICsgdGVzdDMubnVtRGlzcGxheUNlbGxzKCkpOwogICAgaWYgKHRlc3Q0Lm51bURpc3BsYXlDZWxscygpICE9IDExKQogICAgICAgIGVycmxuKCJudW1EaXNwbGF5Q2VsbHMoKSBmYWlsZWQ6IGV4cGVjdGVkIDExLCBnb3QgIiArIHRlc3Q0Lm51bURpc3BsYXlDZWxscygpKTsKICAgIGlmICh0ZXN0NS5udW1EaXNwbGF5Q2VsbHMoKSAhPSAxMSkKICAgICAgICBlcnJsbigibnVtRGlzcGxheUNlbGxzKCkgZmFpbGVkOiBleHBlY3RlZCAxMSwgZ290ICIgKyB0ZXN0NS5udW1EaXNwbGF5Q2VsbHMoKSk7Cn0KCnZvaWQKVW5pY29kZVN0cmluZ1Rlc3Q6OlRlc3RSZXZlcnNlKCkKewogICAgVW5pY29kZVN0cmluZyB0ZXN0KCJiYWNrd2FyZHMgd29yZHMgc2F5IHRvIHVzZWQgSSIpOwoKICAgIHRlc3QucmV2ZXJzZSgpOwogICAgdGVzdC5yZXZlcnNlKDIsIDYpOwogICAgdGVzdC5yZXZlcnNlKDcsIDkpOwogICAgdGVzdC5yZXZlcnNlKDEwLCAxMyk7CiAgICB0ZXN0LnJldmVyc2UoMTQsIDE5KTsKICAgIHRlc3QucmV2ZXJzZSgyMCwgMjkpOwoKICAgIGlmICh0ZXN0ICE9ICJJIHVzZWQgdG8gc2F5IHdvcmRzIGJhY2t3YXJkcyIpCiAgICAgICAgZXJybG4oInJldmVyc2UoKSBmYWlsZWQ6ICBFeHBlY3RlZCBcIkkgdXNlZCB0byBzYXkgd29yZHMgYmFja3dhcmRzXCIsXG4gZ290IFwiIgogICAgICAgICAgICArIHRlc3QgKyAiXCIiKTsKfQoKdm9pZApVbmljb2RlU3RyaW5nVGVzdDo6VGVzdE1pc2NlbGxhbmVvdXMoKQp7CiAgICBVbmljb2RlU3RyaW5nICAgdGVzdDEoIlRoaXMgaXMgYSB0ZXN0Iik7CiAgICBVbmljb2RlU3RyaW5nICAgdGVzdDIoIlRoaXMgaXMgYSB0ZXN0Iik7CiAgICBVbmljb2RlU3RyaW5nICAgdGVzdDMoIk1lIHRvbyEiKTsKICAgIGNvbnN0IFVDaGFyKiAgdGVzdDQ7CgogICAgaWYgKHRlc3QxLmlzQm9ndXMoKSB8fCB0ZXN0Mi5pc0JvZ3VzKCkgfHwgdGVzdDMuaXNCb2d1cygpKQogICAgICAgIGVycmxuKCJBIHN0cmluZyByZXR1cm5lZCB0cnVlIGZvciBpc0JvZ3VzKCkhIik7CgogICAgaWYgKHRlc3QxLmhhc2hDb2RlKCkgIT0gdGVzdDIuaGFzaENvZGUoKSB8fCB0ZXN0MS5oYXNoQ29kZSgpID09IHRlc3QzLmhhc2hDb2RlKCkpCiAgICAgICAgZXJybG4oImhhc2hDb2RlKCkgZmFpbGVkIik7CgogICAgdGVzdDQgPSB0ZXN0MS5nZXRVQ2hhcnMoKTsKCiAgICBpZiAodGVzdDEgIT0gdGVzdDIpCiAgICAgICAgZXJybG4oImdldFVDaGFycygpIGFmZmVjdGVkIHRoZSBzdHJpbmchIik7CgogICAgVVRleHRPZmZzZXQgaTsKICAgIGZvciAoaSA9IDA7IGkgPCB0ZXN0Mi5zaXplKCk7IGkrKykKICAgICAgICBpZiAodGVzdDJbaV0gIT0gdGVzdDRbaV0pCiAgICAgICAgICAgIGVycmxuKFVuaWNvZGVTdHJpbmcoImdldFVDaGFycygpIGZhaWxlZDogc3RyaW5ncyBkaWZmZXIgYXQgcG9zaXRpb24gIikgKyBpKTsKCiAgICB0ZXN0NCA9IHRlc3QxLm9ycGhhblN0b3JhZ2UoKTsKCiAgICBpZiAodGVzdDEuc2l6ZSgpICE9IDApCiAgICAgICAgZXJybG4oIm9ycGhhblN0b3JhZ2UoKSBmYWlsZWQ6IG9ycGhhbmVkIHN0cmluZydzIGNvbnRlbnRzIGlzICIgKyB0ZXN0MSk7CgogICAgZm9yIChpID0gMDsgaSA8IHRlc3QyLnNpemUoKTsgaSsrKQogICAgICAgIGlmICh0ZXN0MltpXSAhPSB0ZXN0NFtpXSkKICAgICAgICAgICAgZXJybG4oVW5pY29kZVN0cmluZygib3JwaGFuU3RvcmFnZSgpIGZhaWxlZDogc3RyaW5ncyBkaWZmZXIgYXQgcG9zaXRpb24gIikgKyBpKTsKCiAgICBkZWxldGUgKFVDaGFyKil0ZXN0NDsKfQoKdm9pZApVbmljb2RlU3RyaW5nVGVzdDo6VGVzdFN0YWNrQWxsb2NhdGlvbigpCnsKICAgICBVQ2hhciAgICAgICAgICAgIHRlc3RTdHJpbmdbXSA9eyAKICAgICAgICAnVCcsICdoJywgJ2knLCAncycsICcgJywgJ2knLCAncycsICcgJywgJ2EnLCAnICcsICdjJywgJ3InLCAnYScsICd6JywgJ3knLCAnICcsICd0JywgJ2UnLCAncycsICd0JywnLid9OwogICAgVUNoYXIgICAgICAgICAgIGd1YXJkV29yZCA9IDB4NERFRDsKICAgIFVuaWNvZGVTdHJpbmcqICB0ZXN0ID0gMDsKCiAgICB0ZXN0ID0gbmV3ICBVbmljb2RlU3RyaW5nKHRlc3RTdHJpbmcpOwogICAgaWYgKCp0ZXN0ICE9ICJUaGlzIGlzIGEgY3JhenkgdGVzdC4iKQogICAgICAgIGVycmxuKCJUZXN0IHN0cmluZyBmYWlsZWQgdG8gaW5pdGlhbGl6ZSBwcm9wZXJseS4iKTsKICAgIGlmIChndWFyZFdvcmQgIT0gMHgwNERFRCkKICAgICAgICBlcnJsbigiVGVzdCBzdHJpbmcgaW5pdGlhbGl6YXRpb24gb3Zlcndyb3RlIGd1YXJkIHdvcmQhIik7CgogICAgdGVzdC0+aW5zZXJ0KDgsICJvbmx5ICIpOwogICAgdGVzdC0+cmVtb3ZlKDE1LCA2KTsKICAgIGlmICgqdGVzdCAhPSAiVGhpcyBpcyBvbmx5IGEgdGVzdC4iKQogICAgICAgIGVycmxuKCJNYW5pcHVsYXRpb24gb2YgdGVzdCBzdHJpbmcgZmFpbGVkIHRvIHdvcmsgcmlnaHQuIik7CiAgICBpZiAoZ3VhcmRXb3JkICE9IDB4NERFRCkKICAgICAgICBlcnJsbigiTWFuaXB1bGF0aW9uIG9mIHRlc3Qgc3RyaW5nIG92ZXJ3cm90ZSBndWFyZCB3b3JkISIpOwoKICAgIC8vIHdlIGhhdmUgdG8gZGVpbml0aWFsaXplIGFuZCByZWxlYXNlIHRoZSBiYWNraW5nIHN0b3JlIGJ5IGNhbGxpbmcgdGhlIGRlc3RydWN0b3IKICAgIC8vIGV4cGxpY2l0bHksIHNpbmNlIHdlIGNhbid0IG92ZXJsb2FkIG9wZXJhdG9yIGRlbGV0ZQogICAgdGVzdC0+flVuaWNvZGVTdHJpbmcoKTsKCiAgICBVQ2hhciB3b3JraW5nQnVmZmVyW10gPSB7CiAgICAgICAgJ04nLCAnbycsICd3JywgJyAnLCAnaScsICdzJywgJyAnLCAndCcsICdoJywgJ2UnLCAnICcsICd0JywgJ2knLCAnbScsICdlJywgJyAnLAogICAgICAgICdmJywgJ28nLCAncicsICcgJywgJ2EnLCAnbCcsICdsJywgJyAnLCAnbScsICdlJywgJ24nLCAnICcsICd0JywgJ28nLCAnICcsCiAgICAgICAgJ2MnLCAnbycsICdtJywgJ2UnLCAweGZmZmYsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAgfTsKICAgIFVDaGFyIGd1YXJkV29yZDIgPSAweDRERUQ7CgogICAgdGVzdCA9IG5ldyBVbmljb2RlU3RyaW5nKHdvcmtpbmdCdWZmZXIsIDM1LCA1MCk7CiAgICBpZiAoKnRlc3QgIT0gIk5vdyBpcyB0aGUgdGltZSBmb3IgYWxsIG1lbiB0byBjb21lIikKICAgICAgICBlcnJsbigiU3RhY2stYWxsb2NhdGVkIGJhY2tpbmcgc3RvcmUgZmFpbGVkIHRvIGluaXRpYWxpemUgY29ycmVjdGx5LiIpOwogICAgaWYgKGd1YXJkV29yZDIgIT0gMHg0REVEKQogICAgICAgIGVycmxuKCJTdGFjay1hbGxvY2F0ZWQgYmFja2luZyBzdG9yZSBvdmVyd3JvdGUgZ3VhcmQgd29yZCEiKTsKCiAgICB0ZXN0LT5pbnNlcnQoMjQsICJnb29kICIpOwogICAgaWYgKCp0ZXN0ICE9ICJOb3cgaXMgdGhlIHRpbWUgZm9yIGFsbCBnb29kIG1lbiB0byBjb21lIikKICAgICAgICBlcnJsbigiaW5zZXJ0KCkgb24gc3RhY2stYWxsb2NhdGVkIFVuaWNvZGVTdHJpbmcgZGlkbid0IHdvcmsgcmlnaHQiKTsKICAgIGlmIChndWFyZFdvcmQyICE9IDB4NERFRCkKICAgICAgICBlcnJsbigiaW5zZXJ0KCkgb24gc3RhY2stYWxsb2NhdGVkIFVuaWNvZGVTdHJpbmcgb3Zlcndyb3RlIGd1YXJkIHdvcmQhIik7CiAgICBpZiAod29ya2luZ0J1ZmZlclsyNF0gIT0gJ2cnKQogICAgICAgIGVycmxuKCJpbnNlcnQoKSBvbiBzdGFjay1hbGxvY2F0ZWQgVW5pY29kZVN0cmluZyBkaWRuJ3QgYWZmZWN0IGJhY2tpbmcgc3RvcmUiKTsKCiAgICAqdGVzdCArPSAiIHRvIHRoZSBhaWQgb2YgdGhlaXIgY291bnRyeS4iOwogICAgaWYgKCp0ZXN0ICE9ICJOb3cgaXMgdGhlIHRpbWUgZm9yIGFsbCBnb29kIG1lbiB0byBjb21lIHRvIHRoZSBhaWQgb2YgdGhlaXIgY291bnRyeS4iKQogICAgICAgIGVycmxuKCJTdGFjay1hbGxvY2F0ZWQgVW5pY29kZVN0cmluZyBvdmVyZmxvdyBkaWRuJ3Qgd29yayIpOwogICAgaWYgKGd1YXJkV29yZDIgIT0gMHg0REVEKQogICAgICAgIGVycmxuKCJTdGFjay1hbGxvY2F0ZWQgVW5pY29kZVN0cmluZyBvdmVyZmxvdyBvdmVyd3JvdGUgZ3VhcmQgd29yZCEiKTsKCiAgICAqdGVzdCA9ICJoYSEiOwogICAgaWYgKCp0ZXN0ICE9ICJoYSEiKQogICAgICAgIGVycmxuKCJBc3NpZ25tZW50IHRvIHN0YWNrLWFsbG9jYXRlZCBVbmljb2RlU3RyaW5nIGRpZG4ndCB3b3JrIik7CiAgICBpZiAod29ya2luZ0J1ZmZlclswXSAhPSAnTicpCiAgICAgICAgZXJybG4oIkNoYW5nZSB0byBVbmljb2RlU3RyaW5nIGFmdGVyIG92ZXJmbG93IGFyZSBzdGlsIGFmZmVjdGluZyBvcmlnaW5hbCBidWZmZXIiKTsKICAgIGlmIChndWFyZFdvcmQyICE9IDB4NERFRCkKICAgICAgICBlcnJsbigiQ2hhbmdlIHRvIFVuaWNvZGVTdHJpbmcgYWZ0ZXIgb3ZlcmZsb3cgb3Zlcndyb3RlIGd1YXJkIHdvcmQhIik7CiNpZmRlZiBfV0lOMzIKICAgIHRlc3QtPn5Vbmljb2RlU3RyaW5nKCk7CiNlbmRpZgp9Cg==