LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAqIAogKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCiAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQogKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgogKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCiAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQogKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CiAqIAogKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAogKiAKICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAogKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgogKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCiAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKICogdW5kZXIgdGhlIExpY2Vuc2UuCiAqIAogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCgoKLy8gTUFSS0VSKHVwZGF0ZV9wcmVjb21wLnB5KTogYXV0b2dlbiBpbmNsdWRlIHN0YXRlbWVudCwgZG8gbm90IHJlbW92ZQojaW5jbHVkZSAicHJlY29tcGlsZWRfc2FsLmh4eCIKI2luY2x1ZGUgPHN0cmluZy5oPgoKI2lmbmRlZiBfU0FMX1RZUEVTX0hfCiAgICAjaW5jbHVkZSA8c2FsL3R5cGVzLmg+CiNlbmRpZgoKLy8gI2lmbmRlZiBfUlRMX1RSRVNfSF8KLy8gICAgICNpbmNsdWRlIDxydGwvdHJlcy5oPgovLyAjZW5kaWYKCiNpbmNsdWRlIDx0ZXN0c2hsL3RyZXNzdGF0ZXdyYXBwZXIuaHh4PgoKI2lmbmRlZiBfUlRMX1NUUklOR19IWFhfCiAgICAjaW5jbHVkZSA8cnRsL3N0cmluZy5oeHg+CiNlbmRpZgoKI2lmbmRlZiBfUlRMX1NUUklOR19DT05TVF9IXwogICAgI2luY2x1ZGUgPHJ0bF9TdHJpbmdfQ29uc3QuaD4KI2VuZGlmCgojaWZuZGVmIF9SVExfU1RSSU5HX1VUSUxTX0hYWF8KICAgICNpbmNsdWRlIDxydGxfU3RyaW5nX1V0aWxzLmh4eD4KI2VuZGlmCiNpbmNsdWRlIDxydGwvdXN0cmluZy5oPgoKdXNpbmcgbmFtZXNwYWNlIHJ0bDsKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIHRlc3QgY2xhc3NlcwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpjb25zdCBpbnQgTUFYQlVGTEVOR1RIID0gMjU1OwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBoZWxwZXIgZnVuY3Rpb25zCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpzdGF0aWMgdm9pZCB1bnVzZWQoKQp7CiAgICB0ZXN0X2luaV91U3RyaW5nKCk7CiAgICAodm9pZClpbnB1dENoYXI7CiAgICAodm9pZClpbnB1dDFTdHJEZWZhdWx0OwogICAgKHZvaWQpaW5wdXQxU3RyTm9ybWFsOwogICAgKHZvaWQpaW5wdXQxU3RyTGFzdERlZmF1bHQ7CiAgICAodm9pZClpbnB1dDFTdHJMYXN0Tm9ybWFsOwogICAgdW51c2VkKCk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIHRlc3RpbmcgY29uc3RydWN0b3JzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyBzYWxfQm9vbCB0ZXN0X3J0bF9PU3RyaW5nX2N0b3JfMDAxKCBoVGVzdFJlc3VsdCBoUnRsVGVzdFJlc3VsdCApCnsKICAgIDo6cnRsOjpPU3RyaW5nIGFTdHI7CiAgICBydGxfU3RyaW5nKiBwRGF0YSA9IGFTdHIucERhdGE7CgoKICAgIHJldHVybgogICAgKAogICAgICAgIGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAoCiAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgICAgICBwRGF0YS0+bGVuZ3RoID09IDAgJiYKICAgICAgICAgICAgISAqcERhdGEtPmJ1ZmZlciwKICAgICAgICAgICAgIk5ldyBPU3RyaW5nIGNvbnRhaW5pbmcgbm8gY2hhcmFjdGVycyIsCiAgICAgICAgICAgICJjdG9yXzAwMSIKICAgICAgICApCiAgICApOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc3RhdGljIHNhbF9Cb29sIFNBTF9DQUxMIHRlc3RfcnRsX09TdHJpbmdfY3Rvcl8wMDIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRlc3RSZXN1bHQgaFJ0bFRlc3RSZXN1bHQgKQp7CiAgICA6OnJ0bDo6T1N0cmluZyBhU3RyKGtUZXN0U3RyMSk7CiAgICBydGxfU3RyaW5nKiBwRGF0YSA9IGFTdHIucERhdGE7CgogICAgcmV0dXJuCiAgICAoCiAgICAgICAgY19ydGxfdHJlc19zdGF0ZQogICAgICAgICgKICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgIHBEYXRhLT5yZWZDb3VudCA9PSAxICYmCiAgICAgICAgICAgIHBEYXRhLT5sZW5ndGggPT0ga1Rlc3RTdHIxTGVuICYmCiAgICAgICAgICAgIGNtcHN0ciggKGNvbnN0IHNhbF9DaGFyKilwRGF0YS0+YnVmZmVyLCBrVGVzdFN0cjEsIGtUZXN0U3RyMUxlbiApLAogICAgICAgICAgICAiTmV3IE9TdHJpbmcgZnJvbSBhIGNoYXJhY3RlciBidWZmZXIgYXJyYXkiLAogICAgICAgICAgICAiY3Rvcl8wMDIiCiAgICAgICAgKQogICAgKTsKfQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc3RhdGljIHNhbF9Cb29sIFNBTF9DQUxMIHRlc3RfcnRsX09TdHJpbmdfY3Rvcl8wMDMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUZXN0UmVzdWx0IGhSdGxUZXN0UmVzdWx0ICApCnsKICAgIDo6cnRsOjpPU3RyaW5nIGFTdHIoa1Rlc3RTdHIyLCBrVGVzdFN0cjFMZW4pOwogICAgcnRsX1N0cmluZyogcERhdGEgPSBhU3RyLnBEYXRhOwoKICAgIHJldHVybgogICAgKAogICAgICAgY19ydGxfdHJlc19zdGF0ZQogICAgICAgICgKICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgIHBEYXRhLT5yZWZDb3VudCA9PSAxICYmCiAgICAgICAgICAgIHBEYXRhLT5sZW5ndGggPT0ga1Rlc3RTdHIxTGVuICYmCiAgICAgICAgICAgIGNtcHN0ciggKGNvbnN0IHNhbF9DaGFyKilwRGF0YS0+YnVmZmVyLCBrVGVzdFN0cjIsIGtUZXN0U3RyMUxlbiApLAogICAgICAgICAgICAiTmV3IE9TdHJpbmcgZnJvbSB0aGUgZmlyc3QgbiBjaGFycyBvZiBhc2NpaSBzdHJpbmciLAogICAgICAgICAgICAiY3Rvcl8wMDMiCiAgICAgICAgKQogICAgKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCnN0YXRpYyBzYWxfQm9vbCBTQUxfQ0FMTCB0ZXN0X3J0bF9PU3RyaW5nX2N0b3JfMDA0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGVzdFJlc3VsdCBoUnRsVGVzdFJlc3VsdCkKewogICAgOjpydGw6Ok9TdHJpbmcgYVN0cjEoa1Rlc3RTdHIxKTsKICAgIDo6cnRsOjpPU3RyaW5nIGFTdHIyKGFTdHIxKTsKICAgIHJ0bF9TdHJpbmcqIHBEYXRhMSA9IGFTdHIxLnBEYXRhOwogICAgcnRsX1N0cmluZyogcERhdGEyID0gYVN0cjIucERhdGE7CgogICAgcmV0dXJuCiAgICAoCiAgICAgICAgY19ydGxfdHJlc19zdGF0ZQogICAgICAgICgKICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgIHBEYXRhMS0+cmVmQ291bnQgPT0gcERhdGEyLT5yZWZDb3VudCAmJgogICAgICAgICAgICBwRGF0YTEtPmxlbmd0aCA9PSBrVGVzdFN0cjFMZW4gJiYKICAgICAgICAgICAgcERhdGExLT5idWZmZXIgPT0gcERhdGEyLT5idWZmZXIsCiAgICAgICAgICAgICJOZXcgT1N0cmluZyBmcm9tIGFuIE9TdHJpbmciLAogICAgICAgICAgICAiY3Rvcl8wMDQiCiAgICAgICAgKQogICAgKTsKfQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKc3RhdGljIHNhbF9Cb29sIHRlc3RfcnRsX09TdHJpbmdfY3Rvcl8wMDUoIGhUZXN0UmVzdWx0IGhSdGxUZXN0UmVzdWx0ICkKewogICAgcnRsX1N0cmluZyAqYVN0cjEgPSBOVUxMOwoKICAgIHJ0bF9zdHJpbmdfbmV3RnJvbVN0ciggJmFTdHIxLCBrVGVzdFN0cjEgKTsKCiAgICBpZiAoIGFTdHIxICE9IE5VTEwgKQogICAgewogICAgICAgIDo6cnRsOjpPU3RyaW5nIGFTdHIyKGFTdHIxKTsKICAgICAgICBydGxfU3RyaW5nKiBwRGF0YTIgPSBhU3RyMi5wRGF0YTsKCiAgICAgICAgc2FsX0Jvb2wgYk9LID0gIGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhU3RyMS0+cmVmQ291bnQgPT0gcERhdGEyLT5yZWZDb3VudCAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgcERhdGEyLT5sZW5ndGggPT0ga1Rlc3RTdHIxTGVuICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhU3RyMS0+YnVmZmVyID09IHBEYXRhMi0+YnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5ldyBPU3RyaW5nIGZyb20gYSBSVEwgU3RyaW5nIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjdG9yXzAwNSIKICAgICAgICAgICAgICAgICAgICAgICAgKTsKCiAgICAgICAgcnRsX3N0cmluZ19yZWxlYXNlKCBhU3RyMSApOwogICAgICAgIGFTdHIxID0gTlVMTDsKICAgICAgICByZXR1cm4gKCBiT0sgKTsKICAgIH0KICAgIHJldHVybgogICAgKAogICAgICAgIGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAoCiAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgICAgICBzYWxfRmFsc2UsCiAgICAgICAgICAgICJjb3B5aW5nIGFuIGFzY2lpIHN0cmluZyB0byBhIFJUTCBTdHJpbmchIiwKICAgICAgICAgICAgImN0b3JfMDA1IgogICAgICAgICkKICAgICk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpzdGF0aWMgc2FsX0Jvb2wgdGVzdF9ydGxfT1N0cmluZ19jdG9yXzAwNiggaFRlc3RSZXN1bHQgaFJ0bFRlc3RSZXN1bHQgKQp7CgogICAgc2FsX1VuaWNvZGUgYVN0cjFba1Rlc3RTdHIxTGVuKzFdOwoKICAgIGlmICggQVN0cmluZ1RvVVN0cmluZ05Db3B5KCBhU3RyMSwga1Rlc3RTdHIxLCBrVGVzdFN0cjFMZW4gKSApCiAgICB7CiAgICAgICAgaWYgKCBBU3RyaW5nVG9VU3RyaW5nTkNvbXBhcmUoIGFTdHIxLCBrVGVzdFN0cjEsIGtUZXN0U3RyMUxlbiApID09IDAgKQogICAgICAgIHsKICAgICAgICAgICAgLy8gY29uc3Qgc2FsX0NoYXIgICprVENNZXNzYWdlWzJdID0geyAiIiwgImFycmF5LiIgfTsKCiAgICAgICAgICAgIDo6cnRsOjpPU3RyaW5nIGFTdHIyCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgIGFTdHIxLAogICAgICAgICAgICAgICAga1Rlc3RTdHIxTGVuLAogICAgICAgICAgICAgICAga0VuY29kaW5nUlRMVGV4dFVTQVNDSUksCiAgICAgICAgICAgICAgICBrQ29udmVydEZsYWdzT1VTdHJpbmdUb09TdHJpbmcKICAgICAgICAgICAgKTsKCiAgICAgICAgICAgIHJldHVybgogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBjX3J0bF90cmVzX3N0YXRlCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgYVN0cjIgPT0ga1Rlc3RTdHIxLAogICAgICAgICAgICAgICAgICAgICJuZXcgT1N0cmluZyBmcm9tIGEgdW5pY29kZSBjaGFyYWN0ZXIgYnVmZmVyIiwKICAgICAgICAgICAgICAgICAgICAiY3Rvcl8wMDYiCiAgICAgICAgICAgICAgICApCiAgICAgICAgICAgICk7CiAgICAgICAgfSAvLy8gZW5kIGlmIEFTdHJpbmdUb1VTdHJpbmdOQ29tcGFyZQoKICAgICAgICByZXR1cm4KICAgICAgICAoCiAgICAgICAgICAgICBjX3J0bF90cmVzX3N0YXRlCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgICAgICAgICAgc2FsX0ZhbHNlLAogICAgICAgICAgICAgICAgImNvbXBhcmUgYXNjaWkgc3RyaW5nIHdpdGggdW5pY29kZSBzdHJpbmchIiwKICAgICAgICAgICAgICAgICJjdG9yXzAwNiIKICAgICAgICAgICAgKQogICAgICAgICk7CiAgICB9IC8vLyBlbmQgaWYgQVN0cmluZ1RvVVN0cmluZ05Db3B5CgogICAgcmV0dXJuCiAgICAoCiAgICAgICAgY19ydGxfdHJlc19zdGF0ZQogICAgICAgICgKICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgIHNhbF9GYWxzZSwKICAgICAgICAgICAgImNvcHkgYXNjaWkgc3RyaW5nIHRvIHVuaWNvZGUgc3RyaW5nISIsCiAgICAgICAgICAgICJjdG9yXzAwNiIKICAgICAgICApCiAgICApOwp9CmV4dGVybiAiQyIgdm9pZCAvKiBzYWxfQm9vbCAqLyBTQUxfQ0FMTCB0ZXN0X3J0bF9PU3RyaW5nX2N0b3JzKCAKCQkJCQloVGVzdFJlc3VsdCBoUnRsVGVzdFJlc3VsdCApCnsKCiAgICBjX3J0bF90cmVzX3N0YXRlX3N0YXJ0KGhSdGxUZXN0UmVzdWx0LCAiY3RvciIpOwogICAgc2FsX0Jvb2wgYlRTU3RhdGUgPSB0ZXN0X3J0bF9PU3RyaW5nX2N0b3JfMDAxKCBoUnRsVGVzdFJlc3VsdCApOwoKICAgIGJUU1N0YXRlICY9IHRlc3RfcnRsX09TdHJpbmdfY3Rvcl8wMDIoIGhSdGxUZXN0UmVzdWx0KTsKICAgIGJUU1N0YXRlICY9IHRlc3RfcnRsX09TdHJpbmdfY3Rvcl8wMDMoIGhSdGxUZXN0UmVzdWx0KTsKICAgIGJUU1N0YXRlICY9IHRlc3RfcnRsX09TdHJpbmdfY3Rvcl8wMDQoIGhSdGxUZXN0UmVzdWx0KTsKICAgIGJUU1N0YXRlICY9IHRlc3RfcnRsX09TdHJpbmdfY3Rvcl8wMDUoIGhSdGxUZXN0UmVzdWx0KTsKICAgIGJUU1N0YXRlICY9IHRlc3RfcnRsX09TdHJpbmdfY3Rvcl8wMDYoIGhSdGxUZXN0UmVzdWx0KTsKCiAgICBjX3J0bF90cmVzX3N0YXRlX2VuZChoUnRsVGVzdFJlc3VsdCwgImN0b3IiKTsKCi8vICAgIHJldHVybiggYlRTU3RhdGUgKTsKfQoKCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyB0ZXN0aW5nIHRoZSBtZXRob2QgZ2V0TGVuZ3RoCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpleHRlcm4gIkMiIHZvaWQgLyogc2FsX0Jvb2wgKi8gU0FMX0NBTEwgdGVzdF9ydGxfT1N0cmluZ19nZXRMZW5ndGgoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRlc3RSZXN1bHQgaFJ0bFRlc3RSZXN1bHQpCnsKICAgIHNhbF9DaGFyIG1ldGhOYW1lW01BWEJVRkxFTkdUSF07CiAgICBzYWxfQ2hhciogcE1ldGggPSBtZXRoTmFtZTsKCiAgICBjX3J0bF90cmVzX3N0YXRlX3N0YXJ0KGhSdGxUZXN0UmVzdWx0LCAiZ2V0TGVuZ3RoIik7Cgp0eXBlZGVmIHN0cnVjdCBUZXN0Q2FzZQp7CiAgICBzYWxfQ2hhciogICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzOwogICAgc2FsX0ludDMyICAgICAgICAgICAgICAgICAgICBleHBWYWw7CiAgICBPU3RyaW5nKiAgICAgICAgICAgICAgICAgICAgIGlucHV0OwogICAgflRlc3RDYXNlKCkgeyBkZWxldGUgaW5wdXQ7fQp9IFRlc3RDYXNlOwoKVGVzdENhc2UgYXJyVGVzdENhc2VbXT17CgogICAgeyJsZW5ndGggb2YgYXNjaWkgc3RyaW5nIiwga1Rlc3RTdHIxTGVuLCBuZXcgT1N0cmluZyhrVGVzdFN0cjEpfSwKICAgIHsibGVuZ3RoIG9mIGFzY2NpIHN0cmluZyBvZiBzaXplIDEiLCAxLCBuZXcgT1N0cmluZygiMSIpfSwKICAgIHsibGVuZ3RoIG9mIGVtcHR5IHN0cmluZyAoZGVmYXVsdCBjb25zdHJ1Y3RvcikiLCAwLCBuZXcgT1N0cmluZygpfSwKICAgIHsibGVuZ3RoIG9mIGVtcHR5IHN0cmluZyAoZW1wdHkgYXNjaWkgc3RyaW5nIGFyZykiLDAsbmV3IE9TdHJpbmcoIiIpfSwKICAgIHsibGVuZ3RoIG9mIGVtcHR5IHN0cmluZyAoc3RyaW5nIGFyZyA9ICdcXDAnKSIsMCxuZXcgT1N0cmluZygiXDAiKX0KICAgIH07CgoKICAgIHNhbF9Cb29sIHJlcyA9IHNhbF9UcnVlOwogICAgc2FsX3VJbnQzMiBpOwoKICAgIGZvciAoaSA9IDA7IGkgPCAoc2l6ZW9mIChhcnJUZXN0Q2FzZSkpLyhzaXplb2YgKFRlc3RDYXNlKSk7IGkrKykKICAgIHsKICAgICAgICBzYWxfSW50MzIgbGVuZ3RoID0gYXJyVGVzdENhc2VbaV0uaW5wdXQtPmdldExlbmd0aCgpOwogICAgICAgIHNhbF9Cb29sIGxhc3RSZXMgPSAobGVuZ3RoID09IGFyclRlc3RDYXNlW2ldLmV4cFZhbCk7CiAgICAgICAgY19ydGxfdHJlc19zdGF0ZQogICAgICAgICgKICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgIGxhc3RSZXMsCiAgICAgICAgICAgIGFyclRlc3RDYXNlW2ldLmNvbW1lbnRzLAogICAgICAgICAgICBjcmVhdGVOYW1lKCBwTWV0aCwgImdldExlbmd0aCIsIGkgKQoKICAgICAgICApOwogICAgICAgIHJlcyAmPSBsYXN0UmVzOwogICAgfQogICAgY19ydGxfdHJlc19zdGF0ZV9lbmQoaFJ0bFRlc3RSZXN1bHQsICJnZXRMZW5ndGgiKTsKLy8gICAgcmV0dXJuICggcmVzICk7Cn0KCgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gdGVzdGluZyB0aGUgbWV0aG9kIGVxdWFscyggY29uc3QgT1N0cmluZyAmIGFTdHIgKQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpleHRlcm4gIkMiIHZvaWQgLyogc2FsX0Jvb2wgKi8gU0FMX0NBTEwgdGVzdF9ydGxfT1N0cmluZ19lcXVhbHMoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUZXN0UmVzdWx0IGhSdGxUZXN0UmVzdWx0ICkKewogICAgc2FsX0NoYXIgbWV0aE5hbWVbTUFYQlVGTEVOR1RIXTsKICAgIHNhbF9DaGFyKiBwTWV0aCA9IG1ldGhOYW1lOwoKICAgIGNfcnRsX3RyZXNfc3RhdGVfc3RhcnQoaFJ0bFRlc3RSZXN1bHQsICJlcXVhbHMiKTsKCiAgICB0eXBlZGVmIHN0cnVjdCBUZXN0Q2FzZQp7CiAgICBzYWxfQ2hhciogICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzOwogICAgc2FsX0Jvb2wgICAgICAgICAgICAgICAgICAgICBleHBWYWw7CiAgICBPU3RyaW5nKiAgICAgICAgICAgICAgICAgICAgIGlucHV0MTsKICAgIE9TdHJpbmcqICAgICAgICAgICAgICAgICAgICAgaW5wdXQyOwogICAgflRlc3RDYXNlKCkgeyBkZWxldGUgaW5wdXQxO2RlbGV0ZSBpbnB1dDI7fQp9IFRlc3RDYXNlOwoKVGVzdENhc2UgYXJyVGVzdENhc2VbXT17CgogICAgeyJzYW1lIHNpemUiLCBzYWxfVHJ1ZSwgbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKSxuZXcgT1N0cmluZyhrVGVzdFN0cjEpfSwKICAgIHsiZGlmZmVyZW50IHNpemUiLCBzYWxfRmFsc2UsIG5ldyBPU3RyaW5nKGtUZXN0U3RyMSksCiAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHIyKX0sCiAgICB7InNhbWUgc2l6ZSwgbm8gY2FzZSBtYXRjaCIsIHNhbF9GYWxzZSwgbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKSwKICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjMpfSwKICAgIHsidHdvIGVtcHR5IHN0cmluZ3MoZGVmLiBjb25zdHJ1Y3RvcikiLCBzYWxfVHJ1ZSwgbmV3IE9TdHJpbmcoKSwKICAgICAgICBuZXcgT1N0cmluZygpfSwKICAgIHsiZW1wdHkoZGVmLmNvbnN0cnVjdG9yKSBhbmQgbm9uIGVtcHR5Iiwgc2FsX0ZhbHNlLCBuZXcgT1N0cmluZygpLAogICAgICAgIG5ldyBPU3RyaW5nKGtUZXN0U3RyMil9LAogICAgeyJub24gZW1wdHkgYW5kIGVtcHR5KGRlZi4gY29uc3RydWN0b3IpIiwgc2FsX0ZhbHNlLCAKICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjEpLG5ldyBPU3RyaW5nKCl9LAogICAgeyJ0d28gZW1wdHkgc3RyaW5ncyhzdHJpbmcgYXJnID0gJ1xcMCcpIiwgc2FsX1RydWUsIAogICAgICAgIG5ldyBPU3RyaW5nKCIiKSxuZXcgT1N0cmluZygiIil9LAogICAgeyJlbXB0eShzdHJpbmcgYXJnID0gJ1xcMCcpIGFuZCBub24gZW1wdHkiLCBzYWxfRmFsc2UsIAogICAgICAgIG5ldyBPU3RyaW5nKCIiKSxuZXcgT1N0cmluZyhrVGVzdFN0cjIpfSwKICAgIHsibm9uIGVtcHR5IGFuZCBlbXB0eShzdHJpbmcgYXJnID0gJ1xcMCcpIiwgc2FsX0ZhbHNlLCAKICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjEpLG5ldyBPU3RyaW5nKCIiKX0KICAgIH07CgogICAgc2FsX0Jvb2wgcmVzID0gc2FsX1RydWU7CiAgICBzYWxfdUludDMyIGk7CgogICAgZm9yKGkgPSAwOyBpIDwgKHNpemVvZiAoYXJyVGVzdENhc2UpKS8oc2l6ZW9mIChUZXN0Q2FzZSkpOyBpKyspCiAgICB7CiAgICAgICAgc2FsX0Jvb2wgbGFzdFJlcyA9CiAgICAgICAgICAgICAgICAgKCBhcnJUZXN0Q2FzZVtpXS5pbnB1dDEtPmVxdWFscygqKGFyclRlc3RDYXNlW2ldLmlucHV0MikpID09ICAKICAgICAgICAgICAgICAgICAgICBhcnJUZXN0Q2FzZVtpXS5leHBWYWwgKTsKCiAgICAgICAgICBjX3J0bF90cmVzX3N0YXRlCiAgICAgICAgKAogICAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgICAgICBsYXN0UmVzLAogICAgICAgICAgICBhcnJUZXN0Q2FzZVtpXS5jb21tZW50cywKICAgICAgICAgICAgY3JlYXRlTmFtZSggcE1ldGgsICJlcXVhbHMiLCBpICkKICAgICAgICApOwoKICAgICAgICByZXMgJj0gbGFzdFJlczsKICAgIH0KICAgIGNfcnRsX3RyZXNfc3RhdGVfZW5kKGhSdGxUZXN0UmVzdWx0LCAiZXF1YWxzIik7Ci8vICAgIHJldHVybiAocmVzKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gdGVzdGluZyB0aGUgbWV0aG9kIGVxdWFsc0lnbm9yZUFzY2lpQ2FzZSggY29uc3QgT1N0cmluZyAmIGFTdHIgKQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKZXh0ZXJuICJDIiB2b2lkIC8qIHNhbF9Cb29sICovIFNBTF9DQUxMIHRlc3RfcnRsX09TdHJpbmdfZXF1YWxzSWdub3JlQXNjaWlDYXNlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGVzdFJlc3VsdCBoUnRsVGVzdFJlc3VsdCApCnsKICAgIHNhbF9DaGFyIG1ldGhOYW1lW01BWEJVRkxFTkdUSF07CiAgICBzYWxfQ2hhciogcE1ldGggPSBtZXRoTmFtZTsKCiAgICBjX3J0bF90cmVzX3N0YXRlX3N0YXJ0KGhSdGxUZXN0UmVzdWx0LCAiZXF1YWxzSWdub3JlQXNjaWlDYXNlIik7CiAgICB0eXBlZGVmIHN0cnVjdCBUZXN0Q2FzZQp7CiAgICBzYWxfQ2hhciogICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzOwogICAgc2FsX0Jvb2wgICAgICAgICAgICAgICAgICAgICBleHBWYWw7CiAgICBPU3RyaW5nKiAgICAgICAgICAgICAgICAgICAgIGlucHV0MTsKICAgIE9TdHJpbmcqICAgICAgICAgICAgICAgICAgICAgaW5wdXQyOwogICAgflRlc3RDYXNlKCkgeyBkZWxldGUgaW5wdXQxO2RlbGV0ZSBpbnB1dDI7fQp9IFRlc3RDYXNlOwoKVGVzdENhc2UgYXJyVGVzdENhc2VbXT17CiAgICAgICAgeyJzYW1lIHN0cmluZ3MgYnV0IGRpZmZlcmVudCBjYXNlcyIsc2FsX1RydWUsbmV3IE9TdHJpbmcoa1Rlc3RTdHI0KSwgCiAgICAgICAgICAgIG5ldyBPU3RyaW5nKGtUZXN0U3RyNSl9LAogICAgICAgIHsic2FtZSBzdHJpbmdzIixzYWxfVHJ1ZSxuZXcgT1N0cmluZyhrVGVzdFN0cjQpLCAKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHI0KX0sCiAgICAgICAgeyJ3aXRoIGVxdWFsIGJlZ2lubmluZyIsc2FsX0ZhbHNlLG5ldyBPU3RyaW5nKGtUZXN0U3RyMiksIAogICAgICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjQpfSwKICAgICAgICB7ImVtcHR5KGRlZi5jb25zdHJ1Y3RvcikgYW5kIG5vbiBlbXB0eSIsc2FsX0ZhbHNlLG5ldyBPU3RyaW5nKCksIAogICAgICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjUpfSwKICAgICAgICB7Im5vbiBlbXB0eSBhbmQgZW1wdHkoZGVmLmNvbnN0cnVjdG9yKSIsc2FsX0ZhbHNlLAogICAgICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjQpLCBuZXcgT1N0cmluZygpfSwKICAgICAgICB7InR3byBlbXB0eSBzdHJpbmdzKGRlZi5jb25zdHJ1Y3RvcikiLHNhbF9UcnVlLG5ldyBPU3RyaW5nKCksIAogICAgICAgICAgICBuZXcgT1N0cmluZygpfSwKICAgICAgICB7ImRpZmZlcmVudCBzdHJpbmdzIHdpdGggZXF1YWwgbGVuZ3RoIixzYWxfRmFsc2UsCiAgICAgICAgICAgIG5ldyBPU3RyaW5nKGtUZXN0U3RyMTApLCBuZXcgT1N0cmluZyhrVGVzdFN0cjExKX0KICAgIH07CgogICAgc2FsX0Jvb2wgcmVzID0gc2FsX1RydWU7CiAgICBzYWxfdUludDMyIGk7CgogICAgZm9yKGkgPSAwOyBpIDwgKHNpemVvZiAoYXJyVGVzdENhc2UpKS8oc2l6ZW9mIChUZXN0Q2FzZSkpOyBpKyspCiAgICB7CiAgICAgICAgc2FsX0Jvb2wgbGFzdFJlcyA9CiAgICAgICAgKGFyclRlc3RDYXNlW2ldLmlucHV0MS0+ZXF1YWxzSWdub3JlQXNjaWlDYXNlKCphcnJUZXN0Q2FzZVtpXS5pbnB1dDIpIAogICAgICAgICAgICA9PSBhcnJUZXN0Q2FzZVtpXS5leHBWYWwpOwoKICAgICAgICAgY19ydGxfdHJlc19zdGF0ZQogICAgICAgICgKICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgIGxhc3RSZXMsCiAgICAgICAgICAgIGFyclRlc3RDYXNlW2ldLmNvbW1lbnRzLAogICAgICAgICAgICBjcmVhdGVOYW1lKCBwTWV0aCwgImVxdWFsc0lnbm9yZUFzY2lpQ2FzZSIsIGkgKQogICAgICAgICk7CgogICAgICAgIHJlcyAmPSBsYXN0UmVzOwogICAgfQogICAgY19ydGxfdHJlc19zdGF0ZV9lbmQoaFJ0bFRlc3RSZXN1bHQsICJlcXVhbHNJZ25vcmVBc2NpaUNhc2UiKTsKCi8vICAgIHJldHVybiAocmVzKTsKfQoKc3RhdGljIHNhbF9Cb29sIFNBTF9DQUxMIHRlc3RfcnRsX09TdHJpbmdfY29tcGFyZVRvXzAwMSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRlc3RSZXN1bHQgaFJ0bFRlc3RSZXN1bHQgKQp7CiAgICBzYWxfQ2hhciBtZXRoTmFtZVtNQVhCVUZMRU5HVEhdOwogICAgc2FsX0NoYXIqIHBNZXRoID0gbWV0aE5hbWU7CgogICAgdHlwZWRlZiBzdHJ1Y3QgVGVzdENhc2UKewogICAgc2FsX0NoYXIqICAgICAgICAgICAgICAgICAgICAgY29tbWVudHM7CiAgICBzYWxfSW50MzIgICAgICAgICAgICAgICAgICAgICBleHBWYWw7CiAgICBPU3RyaW5nKiAgICAgICAgICAgICAgICAgICAgICBpbnB1dDE7CiAgICBPU3RyaW5nKiAgICAgICAgICAgICAgICAgICAgICBpbnB1dDI7CiAgICB+VGVzdENhc2UoKSB7IGRlbGV0ZSBpbnB1dDE7ZGVsZXRlIGlucHV0Mjt9Cn0gVGVzdENhc2U7CgpUZXN0Q2FzZSBhcnJUZXN0Q2FzZVtdPXsKCiAgICAgICAgeyJzaW1wbGUgY29tcGFyZSwgc3RyMSB0byBzdHI1IiwtMSxuZXcgT1N0cmluZyhrVGVzdFN0cjEpLCAKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHI1KX0sCiAgICAgICAgeyJzaW1wbGUgY29tcGFyZSwgc3RyMiB0byBzdHI1IiwtMSxuZXcgT1N0cmluZyhrVGVzdFN0cjIpLCAKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHI1KX0sCiAgICAgICAgeyJzaW1wbGUgY29tcGFyZSwgc3RyMSB0byBzdHI5IiwtMSxuZXcgT1N0cmluZyhrVGVzdFN0cjEpLCAKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHI5KX0sCiAgICAgICAgeyJzaW1wbGUgY29tcGFyZSwgc3RyMSB0byBzdHIyIiwtMSxuZXcgT1N0cmluZyhrVGVzdFN0cjEpLCAKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHIyKX0sCiAgICAgICAgeyJzaW1wbGUgY29tcGFyZSwgc3RyNCB0byBzdHI1IiwtMSxuZXcgT1N0cmluZyhrVGVzdFN0cjQpLCAKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHI1KX0sCiAgICAgICAgeyJzaW1wbGUgY29tcGFyZSwgc3RyMSB0byBzdHIzIiwtMSxuZXcgT1N0cmluZyhrVGVzdFN0cjEpLCAKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHIzKX0sCiAgICAgICAgeyJzaW1wbGUgY29tcGFyZSwgc3RyNSB0byBzdHIxIiwrMSxuZXcgT1N0cmluZyhrVGVzdFN0cjUpLCAKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKX0sCiAgICAgICAgeyJzaW1wbGUgY29tcGFyZSwgc3RyMiB0byBzdHIxIiwrMSxuZXcgT1N0cmluZyhrVGVzdFN0cjIpLCAKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKX0sCiAgICAgICAgeyJzaW1wbGUgY29tcGFyZSwgc3RyOSB0byBzdHI1IiwrMSxuZXcgT1N0cmluZyhrVGVzdFN0cjkpLCAKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHI1KX0sCiAgICAgICAgeyJzaW1wbGUgY29tcGFyZSwgc3RyNSB0byBzdHI0IiwrMSxuZXcgT1N0cmluZyhrVGVzdFN0cjUpLCAKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHI0KX0sCiAgICAgICAgeyJzaW1wbGUgY29tcGFyZSwgc3RyMSB0byBzdHIxIiwwLG5ldyBPU3RyaW5nKGtUZXN0U3RyMSksIAogICAgICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjEpfSwKICAgICAgICB7InNpbXBsZSBjb21wYXJlLCBudWxsU3RyaW5nIHRvIG51bGxTdHJpbmciLDAsbmV3IE9TdHJpbmcoKSwgCiAgICAgICAgICAgIG5ldyBPU3RyaW5nKCl9LAogICAgICAgIHsic2ltcGxlIGNvbXBhcmUsIG51bGxTdHJpbmcgdG8gc3RyMiIsLTEsbmV3IE9TdHJpbmcoKSwgCiAgICAgICAgICAgIG5ldyBPU3RyaW5nKGtUZXN0U3RyMil9LAogICAgICAgIHsic2ltcGxlIGNvbXBhcmUsIHN0cjEgdG8gbnVsbFN0cmluZyIsKzEsbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKSwgCiAgICAgICAgICAgIG5ldyBPU3RyaW5nKCl9CiAgICB9OwoKICAgIHNhbF9Cb29sIHJlcyA9IHNhbF9UcnVlOwogICAgc2FsX3VJbnQzMiBpOwoKICAgIGZvcihpID0gMDsgaSA8IChzaXplb2YgKGFyclRlc3RDYXNlKSkvKHNpemVvZiAoVGVzdENhc2UpKTsgaSsrKQogICAgewogICAgICAgIHNhbF9JbnQzMiBjbXBSZXMgPSAKICAgICAgICAgICAgYXJyVGVzdENhc2VbaV0uaW5wdXQxLT5jb21wYXJlVG8oKmFyclRlc3RDYXNlW2ldLmlucHV0Mik7CiAgICAgICAgY21wUmVzID0gKCBjbXBSZXMgPT0gMCApID8gMCA6ICggY21wUmVzID4gMCApID8gKzEgOiAtMSA7CiAgICAgICAgc2FsX0Jvb2wgbGFzdFJlcyA9ICggY21wUmVzID09IGFyclRlc3RDYXNlW2ldLmV4cFZhbCk7CgogICAgICAgIGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAoCiAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgICAgICBsYXN0UmVzLAogICAgICAgICAgICBhcnJUZXN0Q2FzZVtpXS5jb21tZW50cywKICAgICAgICAgICAgY3JlYXRlTmFtZSggcE1ldGgsICJjb21wYXJlVG8oY29uc3QgT1N0cmluZyYpIiwgaSApCiAgICAgICAgKTsKCiAgICAgICAgcmVzICY9IGxhc3RSZXM7CiAgICB9CgogICAgcmV0dXJuIChyZXMpOwp9CgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gIHRlc3RpbmcgdGhlIG1ldGhvZCBjb21wYXJlVG8oIGNvbnN0IE9TdHJpbmcgJiByT2JqLCBzYWxfSW50MzIgbGVuZ3RoICkKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc3RhdGljIHNhbF9Cb29sIFNBTF9DQUxMIHRlc3RfcnRsX09TdHJpbmdfY29tcGFyZVRvXzAwMigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRlc3RSZXN1bHQgaFJ0bFRlc3RSZXN1bHQgKQp7CiAgICBzYWxfQ2hhciBtZXRoTmFtZVtNQVhCVUZMRU5HVEhdOwogICAgc2FsX0NoYXIqIHBNZXRoID0gbWV0aE5hbWU7CgogICAgdHlwZWRlZiBzdHJ1Y3QgVGVzdENhc2UKICAgIHsKICAgIHNhbF9DaGFyKiAgICAgICAgICAgICAgICAgICAgY29tbWVudHM7CiAgICBzYWxfSW50MzIgICAgICAgICAgICAgICAgICAgIGV4cFZhbDsKICAgIHNhbF9JbnQzMiAgICAgICAgICAgICAgICAgICAgbWF4TGVuZ3RoOwogICAgT1N0cmluZyogICAgICAgICAgICAgICAgICAgICBpbnB1dDE7CiAgICBPU3RyaW5nKiAgICAgICAgICAgICAgICAgICAgIGlucHV0MjsKICAgIH5UZXN0Q2FzZSgpIHsgZGVsZXRlIGlucHV0MTtkZWxldGUgaW5wdXQyO30KICAgIH0gVGVzdENhc2U7CgogICAgVGVzdENhc2UgYXJyVGVzdENhc2VbXSA9CiAgICB7CiAgICAgICAgeyJjb21wYXJlIHdpdGggbWF4bGVuZ3RoLCBzdHIxIHRvIHN0cjksIDE2IiwtMSwxNiwKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKSwgbmV3IE9TdHJpbmcoa1Rlc3RTdHI5KX0sCiAgICAgICAgeyJjb21wYXJlIHdpdGggbWF4bGVuZ3RoLCBzdHIyIHRvIHN0cjksIDMyIiwtMSwzMiwKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHIyKSwgbmV3IE9TdHJpbmcoa1Rlc3RTdHI5KX0sCiAgICAgICAgeyJjb21wYXJlIHdpdGggbWF4bGVuZ3RoLCBzdHI5IHRvIHN0cjQsIDE2IiwrMSwxNiwKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHI5KSwgbmV3IE9TdHJpbmcoa1Rlc3RTdHI0KX0sCiAgICAgICAgeyJjb21wYXJlIHdpdGggbWF4bGVuZ3RoLCBzdHI5IHRvIHN0cjIyLCAzMiIsKzEsMzIsCiAgICAgICAgICAgIG5ldyBPU3RyaW5nKGtUZXN0U3RyOSksIG5ldyBPU3RyaW5nKGtUZXN0U3RyMjIpfSwKICAgICAgICB7ImNvbXBhcmUgd2l0aCBtYXhsZW5ndGgsIHN0cjkgdG8gc3RyNSwgMTYiLDAsMTYsCiAgICAgICAgICAgIG5ldyBPU3RyaW5nKGtUZXN0U3RyOSksIG5ldyBPU3RyaW5nKGtUZXN0U3RyNSl9LAogICAgICAgIHsiY29tcGFyZSB3aXRoIG1heGxlbmd0aCwgc3RyOSB0byBzdHI5LCAzMiIsMCwzMiwKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHI5KSwgbmV3IE9TdHJpbmcoa1Rlc3RTdHI5KX0sCiAgICAgICAgeyJjb21wYXJlIHdpdGggbWF4bGVuZ3RoLCBzdHIxIHRvIHN0cjIsIDMyIiwtMSwzMiwKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKSwgbmV3IE9TdHJpbmcoa1Rlc3RTdHIyKX0sCiAgICAgICAgeyJjb21wYXJlIHdpdGggbWF4bGVuZ3RoLCBzdHIxIHRvIHN0cjIsIDMyIiwtMSwzMiwKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKSwgbmV3IE9TdHJpbmcoa1Rlc3RTdHIyKX0KICAgIH07CgogICAgc2FsX0Jvb2wgcmVzID0gc2FsX1RydWU7CiAgICBzYWxfdUludDMyIGk7CgogICAgZm9yKGkgPSAwOyBpIDwgKHNpemVvZiAoYXJyVGVzdENhc2UpKS8oc2l6ZW9mIChUZXN0Q2FzZSkpOyBpKyspCiAgICB7CiAgICAgICAgc2FsX0ludDMyIGNtcFJlcyA9CiAgICAgICAgICAgICAgICAgICAgYXJyVGVzdENhc2VbaV0uaW5wdXQxLT5jb21wYXJlVG8oKmFyclRlc3RDYXNlW2ldLmlucHV0MiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJUZXN0Q2FzZVtpXS5tYXhMZW5ndGgpOwogICAgICAgIGNtcFJlcyA9IChjbXBSZXMgPT0gMCkgPyAwIDogKGNtcFJlcyA+IDApID8gKzEgOiAtMSA7CiAgICAgICAgc2FsX0Jvb2wgbGFzdFJlcyA9IChjbXBSZXMgPT0gYXJyVGVzdENhc2VbaV0uZXhwVmFsKTsKCiAgICAgICAgY19ydGxfdHJlc19zdGF0ZQogICAgICAgICgKICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgIGxhc3RSZXMsCiAgICAgICAgICAgIGFyclRlc3RDYXNlW2ldLmNvbW1lbnRzLAogICAgICAgICAgICBjcmVhdGVOYW1lKCBwTWV0aCwgImNvbXBhcmVUbyhjb25zdCBPU3RyaW5nJiwgc2FsX0ludDMyKSIsIGkgKQogICAgICAgICk7CgogICAgICAgIHJlcyAmPSBsYXN0UmVzOwogICAgfQoKICAgIHJldHVybiAocmVzKTsKfQoKZXh0ZXJuICJDIiB2b2lkIC8qIHNhbF9Cb29sICovIFNBTF9DQUxMIHRlc3RfcnRsX09TdHJpbmdfY29tcGFyZVRvKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGVzdFJlc3VsdCBoUnRsVGVzdFJlc3VsdCApCnsKICAgIGNfcnRsX3RyZXNfc3RhdGVfc3RhcnQoaFJ0bFRlc3RSZXN1bHQsICJjb21wYXJlVG8iKTsKICAgIHNhbF9Cb29sIHJlcyA9IHRlc3RfcnRsX09TdHJpbmdfY29tcGFyZVRvXzAwMShoUnRsVGVzdFJlc3VsdCk7CiAgICByZXMgJj0gdGVzdF9ydGxfT1N0cmluZ19jb21wYXJlVG9fMDAyKGhSdGxUZXN0UmVzdWx0KTsKICAgIGNfcnRsX3RyZXNfc3RhdGVfZW5kKGhSdGxUZXN0UmVzdWx0LCAiY29tcGFyZVRvIik7Ci8vICAgIHJldHVybiAocmVzKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gdGVzdGluZyB0aGUgb3BlcmF0b3IgPT0gKCBjb25zdCBPU3RyaW5nJiByU3RyMSwgY29uc3QgT1N0cmluZyYgclN0cjIgKQovLyB0ZXN0aW5nIHRoZSBvcGVyYXRvciA9PSAoIGNvbnN0IE9TdHJpbmcmIHJTdHIxLCBjb25zdCBzYWxfQ2hhciAqclN0cjIgKQovLyB0ZXN0aW5nIHRoZSBvcGVyYXRvciA9PSAoIGNvbnN0IHNhbF9DaGFyICpyU3RyMSwgY29uc3QgT1N0cmluZyYgclN0cjIgKQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpleHRlcm4gIkMiIHZvaWQgLyogc2FsX0Jvb2wgKi8gU0FMX0NBTEwgdGVzdF9ydGxfT1N0cmluZ19vcF9jbXAoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUZXN0UmVzdWx0IGhSdGxUZXN0UmVzdWx0ICkKewogICAgY19ydGxfdHJlc19zdGF0ZV9zdGFydChoUnRsVGVzdFJlc3VsdCwgIm9wX2NtcCIpOwogICAgY29uc3Qgc2FsX0ludDE2IE5DQVNFUyA9IDc7CiAgICBzYWxfQ2hhciBtZXRoTmFtZVtNQVhCVUZMRU5HVEhdOwogICAgc2FsX0NoYXIqIHBNZXRoID0gbWV0aE5hbWU7CiAgICBjb25zdCBzYWxfQ2hhciAqYXJyT1N0cltOQ0FTRVNdWzJdID0KICAgIHsKICAgICAgICB7a1Rlc3RTdHIxLCBrVGVzdFN0cjF9LAogICAgICAgIHtrVGVzdFN0cjEsIGtUZXN0U3RyM30sCiAgICAgICAge2tUZXN0U3RyMSwga1Rlc3RTdHIyfSwKICAgICAgICB7MCwgMH0sCiAgICAgICAgezAsIGtUZXN0U3RyMn0sCiAgICAgICAge2tUZXN0U3RyMSwgMH0sCiAgICAgICAgeyIiLCAiIn0KICAgIH07CgogICAgc2FsX0Jvb2wgYXJyRXhwVmFsW05DQVNFU10gPQogICAgewogICAgICAgIHNhbF9UcnVlLAogICAgICAgIHNhbF9GYWxzZSwKICAgICAgICBzYWxfRmFsc2UsCiAgICAgICAgc2FsX1RydWUsCiAgICAgICAgc2FsX0ZhbHNlLAogICAgICAgIHNhbF9GYWxzZSwKICAgICAgICBzYWxfVHJ1ZQogICAgfTsKCiAgICBzYWxfQ2hhciAqYXJyQ29tbWVudHNbTkNBU0VTXSA9CiAgICB7CiAgICAgICAgIidTdW4gTWljcm9zeXN0ZW1zJz09J1N1biBNaWNyb3N5c3RlbXMnIiwKICAgICAgICAiISgnU3VuIE1pY3Jvc3lzdGVtcyc9PSdTdW4gbWljcm9zeXN0ZW1zJykiLAogICAgICAgICIhKCdTdW4gTWljcm9zeXN0ZW1zJz09J1N1biBNaWNyb3N5c3RlbXMgSmF2YSBUZWNobm9sb2d5JykiLAogICAgICAgICJ0d28gZW1wdHkgc3RyaW5ncyhkZWYuY29uc3RydWN0b3IpIiwKICAgICAgICAiIShlbXB0eSBzdHJpbmc9PSdTdW4gTWljcm9zeXN0ZW1zIEphdmEgVGVjaG5vbG9neScpIiwKICAgICAgICAiISgnU3VuIE1pY3Jvc3lzdGVtcyBKYXZhIFRlY2hub2xvZ3knPT1lbXB0eSBzdHJpbmcpIiwKICAgICAgICAiJyc9PScnIgogICAgfTsKCiAgICBzYWxfQm9vbCByZXMgPSBzYWxfVHJ1ZTsKICAgIHNhbF9JbnQzMiBpOwoKICAgIGZvcihpID0gMDsgaSA8IE5DQVNFUzsgaSsrKQogICAgewogICAgICAgIE9TdHJpbmcgKnN0cjEsICpzdHIyOwogICAgICAgIHN0cjEgPSAoYXJyT1N0cltpXVswXSkgPyBuZXcgT1N0cmluZyhhcnJPU3RyW2ldWzBdKSA6IG5ldyBPU3RyaW5nKCkgOwogICAgICAgIHN0cjIgPSAoYXJyT1N0cltpXVsxXSkgPyBuZXcgT1N0cmluZyhhcnJPU3RyW2ldWzFdKSA6IG5ldyBPU3RyaW5nKCkgOwoKICAgICAgICBzYWxfQm9vbCBjbXBSZXMgPSAoKnN0cjEgPT0gKnN0cjIpOwogICAgICAgIHNhbF9Cb29sIGxhc3RSZXMgPSAoY21wUmVzID09IGFyckV4cFZhbFtpXSk7CiAgICAgICAgcmVzICY9IGxhc3RSZXM7CgogICAgICAgIGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAoCiAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgICAgICBsYXN0UmVzLAogICAgICAgICAgICBhcnJDb21tZW50c1tpXSwKICAgICAgICAgICAgY3JlYXRlTmFtZSggcE1ldGgsICJvcGVyYXRvciA9PShPU3RyaW5nJiwgT1N0cmluZyYpIiwgaSApCiAgICAgICAgKTsKCiAgICAgICAgY21wUmVzID0gKCpzdHIxID09IGFyck9TdHJbaV1bMV0pOwogICAgICAgIGxhc3RSZXMgPSAoY21wUmVzID09IGFyckV4cFZhbFtpXSk7CiAgICAgICAgcmVzICY9IGxhc3RSZXM7CiAgICAgICAgY19ydGxfdHJlc19zdGF0ZQogICAgICAgICgKICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgIGxhc3RSZXMsCiAgICAgICAgICAgIGFyckNvbW1lbnRzW2ldLAogICAgICAgICAgICBjcmVhdGVOYW1lKCBwTWV0aCwgIm9wZXJhdG9yID09KE9TdHJpbmcmLCBzYWxfQ2hhciAqKSIsIGkgKQogICAgICAgICk7CgogICAgICAgIGNtcFJlcyA9IChhcnJPU3RyW2ldWzBdID09ICpzdHIyKTsKICAgICAgICBsYXN0UmVzID0gKGNtcFJlcyA9PSBhcnJFeHBWYWxbaV0pOwogICAgICAgIHJlcyAmPSBsYXN0UmVzOwogICAgICAgIGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAoCiAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgICAgICBsYXN0UmVzLAogICAgICAgICAgICBhcnJDb21tZW50c1tpXSwKICAgICAgICAgICAgY3JlYXRlTmFtZSggcE1ldGgsICJvcGVyYXRvciA9PShzYWxfQ2hhciAqLCBPU3RyaW5nJikiLCBpICkKICAgICAgICApOwoKICAgICAgICBkZWxldGUgc3RyMjsKICAgICAgICBkZWxldGUgc3RyMTsKICAgIH0KCiAgICBjX3J0bF90cmVzX3N0YXRlX2VuZChoUnRsVGVzdFJlc3VsdCwgIm9wX2NtcCIpOwovLyAgICByZXR1cm4gKCByZXMgKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gdGVzdGluZyB0aGUgb3BlcmF0b3IgIT0gKGNvbnN0IE9TdHJpbmcmIHJTdHIxLCBjb25zdCBPU3RyaW5nJiByU3RyMikKLy8gdGVzdGluZyB0aGUgb3BlcmF0b3IgIT0gKGNvbnN0IE9TdHJpbmcmIHJTdHIxLCBjb25zdCBzYWxfQ2hhciAqclN0cjIpCi8vIHRlc3RpbmcgdGhlIG9wZXJhdG9yICE9IChjb25zdCBzYWxfQ2hhciAqclN0cjEsIGNvbnN0IE9TdHJpbmcmIHJTdHIyKQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpleHRlcm4gIkMiIHZvaWQgLyogc2FsX0Jvb2wgKi8gU0FMX0NBTEwgdGVzdF9ydGxfT1N0cmluZ19vcF9uZXEoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUZXN0UmVzdWx0IGhSdGxUZXN0UmVzdWx0ICkKewogICAgY19ydGxfdHJlc19zdGF0ZV9zdGFydChoUnRsVGVzdFJlc3VsdCwgIm9wX25lcSIpOwogICAgY29uc3Qgc2FsX0ludDE2IE5DQVNFUyA9IDY7CiAgICBzYWxfQ2hhciBtZXRoTmFtZVtNQVhCVUZMRU5HVEhdOwogICAgc2FsX0NoYXIqIHBNZXRoID0gbWV0aE5hbWU7CgogICAgY29uc3Qgc2FsX0NoYXIgKmFyck9TdHJbTkNBU0VTXVsyXSA9CiAgICB7CiAgICAgICAge2tUZXN0U3RyMSwga1Rlc3RTdHIzfSwKICAgICAgICB7a1Rlc3RTdHIxLCBrVGVzdFN0cjJ9LAogICAgICAgIHtrVGVzdFN0cjEsIGtUZXN0U3RyMX0sCiAgICAgICAgezAsIGtUZXN0U3RyMn0sCiAgICAgICAge2tUZXN0U3RyMSwgMH0sCiAgICAgICAgezAsIDB9CiAgICB9OwoKICAgIHNhbF9Cb29sIGFyckV4cFZhbFtOQ0FTRVNdID0KICAgIHsKICAgICAgICBzYWxfVHJ1ZSwKICAgICAgICBzYWxfVHJ1ZSwKICAgICAgICBzYWxfRmFsc2UsCiAgICAgICAgc2FsX1RydWUsCiAgICAgICAgc2FsX1RydWUsCiAgICAgICAgc2FsX0ZhbHNlCiAgICB9OwoKICAgIHNhbF9DaGFyICphcnJDb21tZW50c1tOQ0FTRVNdID0KICAgIHsKICAgICAgICAiJ1N1biBNaWNyb3N5c3RlbXMnIT0nU3VuIG1pY3Jvc3lzdGVtcyciLAogICAgICAgICInU3VuIE1pY3Jvc3lzdGVtcychPSdTdW4gTWljcm9zeXN0ZW1zIEphdmEgVGVjaG5vbG9neSciLAogICAgICAgICIhKCdTdW4gTWljcm9zeXN0ZW1zJyE9J1N1biBNaWNyb3N5c3RlbXMnKSIsCiAgICAgICAgImVtcHR5IHN0cmluZyE9J1N1biBNaWNyb3N5c3RlbXMgSmF2YSBUZWNobm9sb2d5JyIsCiAgICAgICAgIidTdW4gTWljcm9zeXN0ZW1zIEphdmEgVGVjaG5vbG9neSchPWVtcHR5IHN0cmluZyIsICIhKCcnIT0nJykiCiAgICB9OwoKICAgIHNhbF9Cb29sIHJlcyA9IHNhbF9UcnVlOwogICAgc2FsX0ludDMyIGk7CgogICAgZm9yKGkgPSAwOyBpIDwgTkNBU0VTOyBpKyspCiAgICB7CiAgICAgICAgT1N0cmluZyAqc3RyMSwgKnN0cjI7CiAgICAgICAgc3RyMSA9IChhcnJPU3RyW2ldWzBdKSA/IG5ldyBPU3RyaW5nKGFyck9TdHJbaV1bMF0pIDogbmV3IE9TdHJpbmcoKSA7CiAgICAgICAgc3RyMiA9IChhcnJPU3RyW2ldWzFdKSA/IG5ldyBPU3RyaW5nKGFyck9TdHJbaV1bMV0pIDogbmV3IE9TdHJpbmcoKSA7CgogICAgICAgIHNhbF9Cb29sIGNtcFJlcyA9ICgqc3RyMSAhPSAqc3RyMik7CiAgICAgICAgc2FsX0Jvb2wgbGFzdFJlcyA9IChjbXBSZXMgPT0gYXJyRXhwVmFsW2ldKTsKICAgICAgICByZXMgJj0gbGFzdFJlczsKICAgICAgICBjX3J0bF90cmVzX3N0YXRlCiAgICAgICAgKAogICAgICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICAgICAgbGFzdFJlcywKICAgICAgICAgICAgYXJyQ29tbWVudHNbaV0sCiAgICAgICAgICAgIGNyZWF0ZU5hbWUoIHBNZXRoLCAib3BlcmF0b3IgIT0oT1N0cmluZyYsIE9TdHJpbmcmKSIsIGkgKQogICAgICAgICk7CgogICAgICAgIGNtcFJlcyA9ICgqc3RyMSAhPSBhcnJPU3RyW2ldWzFdKTsKICAgICAgICBsYXN0UmVzID0gKGNtcFJlcyA9PSBhcnJFeHBWYWxbaV0pOwogICAgICAgIHJlcyAmPSBsYXN0UmVzOwogICAgICAgIGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAoCiAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgICAgICBsYXN0UmVzLAogICAgICAgICAgICBhcnJDb21tZW50c1tpXSwKICAgICAgICAgICAgY3JlYXRlTmFtZSggcE1ldGgsICJvcGVyYXRvciAhPShPU3RyaW5nJiwgc2FsX0NoYXIgKikiLCBpICkKICAgICAgICApOwoKICAgICAgICBjbXBSZXMgPSAoYXJyT1N0cltpXVswXSAhPSAqc3RyMik7CiAgICAgICAgbGFzdFJlcyA9IChjbXBSZXMgPT0gYXJyRXhwVmFsW2ldKTsKICAgICAgICByZXMgJj0gbGFzdFJlczsKICAgICAgICBjX3J0bF90cmVzX3N0YXRlCiAgICAgICAgKAogICAgICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICAgICAgbGFzdFJlcywKICAgICAgICAgICAgYXJyQ29tbWVudHNbaV0sCiAgICAgICAgICAgIGNyZWF0ZU5hbWUoIHBNZXRoLCAib3BlcmF0b3IgIT0oc2FsX0NoYXIgKiwgT1N0cmluZyYpIiwgaSApCiAgICAgICAgKTsKCiAgICAgICAgZGVsZXRlIHN0cjI7CiAgICAgICAgZGVsZXRlIHN0cjE7CiAgICB9CgogICAgY19ydGxfdHJlc19zdGF0ZV9lbmQoaFJ0bFRlc3RSZXN1bHQsICJvcF9uZXEiKTsKLy8gICByZXR1cm4gKCByZXMgKTsKfQoKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIHRlc3RpbmcgdGhlIG9wZXJhdG9yID4gKGNvbnN0IE9TdHJpbmcmIHJTdHIxLCBjb25zdCBPU3RyaW5nJiByU3RyMikKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZXh0ZXJuICJDIiB2b2lkIC8qIHNhbF9Cb29sICovIFNBTF9DQUxMIHRlc3RfcnRsX09TdHJpbmdfb3BfZygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRlc3RSZXN1bHQgaFJ0bFRlc3RSZXN1bHQgKQp7CiAgICBzYWxfQ2hhciBtZXRoTmFtZVtNQVhCVUZMRU5HVEhdOwogICAgc2FsX0NoYXIqIHBNZXRoID0gbWV0aE5hbWU7CiAgICAKICAgIGNfcnRsX3RyZXNfc3RhdGVfc3RhcnQoaFJ0bFRlc3RSZXN1bHQsICJvcF9nIik7CiAgICB0eXBlZGVmIHN0cnVjdCBUZXN0Q2FzZQogICAgewogICAgc2FsX0NoYXIqICAgICAgICAgICAgICAgICAgICBjb21tZW50czsKICAgIHNhbF9Cb29sICAgICAgICAgICAgICAgICAgICAgZXhwVmFsOwogICAgT1N0cmluZyogICAgICAgICAgICAgICAgICAgICBpbnB1dDE7CiAgICBPU3RyaW5nKiAgICAgICAgICAgICAgICAgICAgIGlucHV0MjsKICAgIH5UZXN0Q2FzZSgpIHsgZGVsZXRlIGlucHV0MTtkZWxldGUgaW5wdXQyO30KICAgIH0gVGVzdENhc2U7CgogICAgVGVzdENhc2UgYXJyVGVzdENhc2VbXSA9CiAgICB7CiAgICAgICAgeyAiJ1N1biBtaWNyb3N5c3RlbXMnPidTdW4gTWljcm9zeXN0ZW1zJyIsc2FsX1RydWUsCiAgICAgICAgICAgIG5ldyBPU3RyaW5nKGtUZXN0U3RyMyksIG5ldyBPU3RyaW5nKGtUZXN0U3RyMSl9LAogICAgICAgIHsiISgnU3VuIE1pY3Jvc3lzdGVtcyc+J1N1biBtaWNyb3N5c3RlbXMnKSIsc2FsX0ZhbHNlLAogICAgICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjEpLCBuZXcgT1N0cmluZyhrVGVzdFN0cjMpfSwKICAgICAgICB7IidTdW4gTWljcm9zeXN0ZW1zIEphdmEgVGVjaG5vbG9neSc+J1N1biBNaWNyb3N5c3RlbXMnIixzYWxfVHJ1ZSwKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHIyKSwgbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKX0sCiAgICAgICAgeyIhKCdTdW4gTWljcm9zeXN0ZW1zJz4nU3VuIE1pY3Jvc3lzdGVtcyBKYXZhIFRlY2hub2xvZ3knKSIsc2FsX0ZhbHNlLAogICAgICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjEpLCBuZXcgT1N0cmluZyhrVGVzdFN0cjIpfSwKICAgICAgICB7IiEoJ1N1biBNaWNyb3N5c3RlbXMnPidTdW4gTWljcm9zeXN0ZW1zJyIsc2FsX0ZhbHNlLAogICAgICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjEpLCBuZXcgT1N0cmluZyhrVGVzdFN0cjEpfSwKICAgICAgICB7IidTdW4gTWljcm9zeXN0ZW1zJz4nJyIsc2FsX1RydWUsbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKSwgCiAgICAgICAgICAgIG5ldyBPU3RyaW5nKCl9LAogICAgICAgIHsiISgnJz4nU3VuIE1pY3Jvc3lzdGVtcycpIixzYWxfRmFsc2UsbmV3IE9TdHJpbmcoKSwgCiAgICAgICAgICAgIG5ldyBPU3RyaW5nKGtUZXN0U3RyMSl9LAogICAgICAgIHsiISgnJz4nJykiLHNhbF9GYWxzZSxuZXcgT1N0cmluZygpLCBuZXcgT1N0cmluZygpfQp9OwoKICAgIHNhbF9Cb29sIHJlcyA9IHNhbF9UcnVlOwogICAgc2FsX3VJbnQzMiBpOwoKICAgIGZvcihpID0gMDsgaSA8IChzaXplb2YgKGFyclRlc3RDYXNlKSkvKHNpemVvZiAoVGVzdENhc2UpKTsgaSsrKQogICAgewogICAgICAgIHNhbF9Cb29sIGNtcFJlcyA9ICgqYXJyVGVzdENhc2VbaV0uaW5wdXQxID4gKmFyclRlc3RDYXNlW2ldLmlucHV0Mik7CiAgICAgICAgc2FsX0Jvb2wgbGFzdFJlcyA9IChjbXBSZXMgPT0gYXJyVGVzdENhc2VbaV0uZXhwVmFsKTsKCiAgICAgICAgY19ydGxfdHJlc19zdGF0ZQogICAgICAgICgKICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgIGxhc3RSZXMsCiAgICAgICAgICAgIGFyclRlc3RDYXNlW2ldLmNvbW1lbnRzLAogICAgICAgICAgICBjcmVhdGVOYW1lKCBwTWV0aCwgIm9wZXJhdG9yID4iLCBpICkKICAgICAgICApOwoKICAgICAgICByZXMgJj0gbGFzdFJlczsKCiAgICB9CgogICAgY19ydGxfdHJlc19zdGF0ZV9lbmQoaFJ0bFRlc3RSZXN1bHQsICJvcF9nIik7Ci8vICAgIHJldHVybiAoIHJlcyApOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyB0ZXN0aW5nIHRoZSBvcGVyYXRvciA8IChjb25zdCBPU3RyaW5nJiByU3RyMSwgY29uc3QgT1N0cmluZyYgclN0cjIpCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCgpleHRlcm4gIkMiIHZvaWQgLyogc2FsX0Jvb2wgKi8gU0FMX0NBTEwgdGVzdF9ydGxfT1N0cmluZ19vcF9sKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGVzdFJlc3VsdCBoUnRsVGVzdFJlc3VsdCApCnsKICAgIHNhbF9DaGFyIG1ldGhOYW1lW01BWEJVRkxFTkdUSF07CiAgICBzYWxfQ2hhciogcE1ldGggPSBtZXRoTmFtZTsKCiAgICBjX3J0bF90cmVzX3N0YXRlX3N0YXJ0KGhSdGxUZXN0UmVzdWx0LCAib3BfbCIpOwogICAgdHlwZWRlZiBzdHJ1Y3QgVGVzdENhc2UKICAgIHsKICAgIHNhbF9DaGFyKiAgICAgICAgICAgICAgICAgICAgY29tbWVudHM7CiAgICBzYWxfQm9vbCAgICAgICAgICAgICAgICAgICAgIGV4cFZhbDsKICAgIE9TdHJpbmcqICAgICAgICAgICAgICAgICAgICAgaW5wdXQxOwogICAgT1N0cmluZyogICAgICAgICAgICAgICAgICAgICBpbnB1dDI7CiAgICB+VGVzdENhc2UoKSB7IGRlbGV0ZSBpbnB1dDE7ZGVsZXRlIGlucHV0Mjt9CiAgICB9IFRlc3RDYXNlOwoKICAgIFRlc3RDYXNlIGFyclRlc3RDYXNlW10gPQogICAgewogICAgICAgIHsiISgnU3VuIG1pY3Jvc3lzdGVtcyc8J1N1biBNaWNyb3N5c3RlbXMnKSIsc2FsX0ZhbHNlLAogICAgICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjMpLCBuZXcgT1N0cmluZyhrVGVzdFN0cjEpfSwKICAgICAgICB7IidTdW4gTWljcm9zeXN0ZW1zJzwnU3VuIG1pY3Jvc3lzdGVtcyciLHNhbF9UcnVlLAogICAgICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjEpLCBuZXcgT1N0cmluZyhrVGVzdFN0cjMpfSwKICAgICAgICB7IidTdW4gTWljcm9zeXN0ZW1zJzwnU3VuIE1pY3Jvc3lzdGVtcyBKYXZhIFRlY2hub2xvZ3knIixzYWxfVHJ1ZSwKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKSwgbmV3IE9TdHJpbmcoa1Rlc3RTdHIyKX0sCiAgICAgICAgeyIhKCdTdW4gTWljcm9zeXN0ZW1zIEphdmEgVGVjaG5vbG9neSc8J1N1biBNaWNyb3N5c3RlbXMnKSIsc2FsX0ZhbHNlLAogICAgICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjIpLCBuZXcgT1N0cmluZyhrVGVzdFN0cjEpfSwKICAgICAgICB7IiEoJ1N1biBNaWNyb3N5c3RlbXMnPCdTdW4gTWljcm9zeXN0ZW1zJyIsIHNhbF9GYWxzZSwKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKSwgbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKX0sCiAgICAgICAgeyInU3VuIE1pY3Jvc3lzdGVtcyc8JyciLHNhbF9GYWxzZSxuZXcgT1N0cmluZyhrVGVzdFN0cjEpLCAKICAgICAgICAgICAgbmV3IE9TdHJpbmcoKX0sCiAgICAgICAgeyInJzwnU3VuIE1pY3Jvc3lzdGVtcyBKYXZhIFRlY2hub2xvZ3knIixzYWxfVHJ1ZSxuZXcgT1N0cmluZygpLCAKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHIyKX0sCiAgICAgICAgeyIhKCcnPCcnKSIsc2FsX0ZhbHNlLG5ldyBPU3RyaW5nKCksIG5ldyBPU3RyaW5nKCl9CiAgICB9OwoKICAgIHNhbF9Cb29sIHJlcyA9IHNhbF9UcnVlOwogICAgc2FsX3VJbnQzMiBpOwoKICAgIGZvcihpID0gMDsgaSA8IChzaXplb2YgKGFyclRlc3RDYXNlKSkvKHNpemVvZiAoVGVzdENhc2UpKTsgaSsrKQogICAgewogICAgICAgIHNhbF9Cb29sIGNtcFJlcyA9ICgqYXJyVGVzdENhc2VbaV0uaW5wdXQxIDwgKmFyclRlc3RDYXNlW2ldLmlucHV0Mik7CiAgICAgICAgc2FsX0Jvb2wgbGFzdFJlcyA9IChjbXBSZXMgPT0gYXJyVGVzdENhc2VbaV0uZXhwVmFsKTsKCiAgICAgICAgY19ydGxfdHJlc19zdGF0ZQogICAgICAgICgKICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgIGxhc3RSZXMsCiAgICAgICAgICAgIGFyclRlc3RDYXNlW2ldLmNvbW1lbnRzLAogICAgICAgICAgICBjcmVhdGVOYW1lKCBwTWV0aCwgIm9wZXJhdG9yIDwiLCBpICkKICAgICAgICApOwoKICAgICAgICByZXMgJj0gbGFzdFJlczsKCiAgICB9CgogICAgY19ydGxfdHJlc19zdGF0ZV9lbmQoaFJ0bFRlc3RSZXN1bHQsICJvcF9sIik7Ci8vICAgcmV0dXJuICggcmVzICk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIHRlc3RpbmcgdGhlIG9wZXJhdG9yID49IChjb25zdCBPU3RyaW5nJiByU3RyMSwgY29uc3QgT1N0cmluZyYgclN0cjIpCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmV4dGVybiAiQyIgdm9pZCAvKiBzYWxfQm9vbCAqLyBTQUxfQ0FMTCB0ZXN0X3J0bF9PU3RyaW5nX29wX2dlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGVzdFJlc3VsdCBoUnRsVGVzdFJlc3VsdCApCnsKICAgIHNhbF9DaGFyIG1ldGhOYW1lW01BWEJVRkxFTkdUSF07CiAgICBzYWxfQ2hhciogcE1ldGggPSBtZXRoTmFtZTsKCiAgICBjX3J0bF90cmVzX3N0YXRlX3N0YXJ0KGhSdGxUZXN0UmVzdWx0LCAib3BfZ2UiKTsKICAgdHlwZWRlZiBzdHJ1Y3QgVGVzdENhc2UKICAgIHsKICAgIHNhbF9DaGFyKiAgICAgICAgICAgICAgICAgICAgY29tbWVudHM7CiAgICBzYWxfQm9vbCAgICAgICAgICAgICAgICAgICAgIGV4cFZhbDsKICAgIE9TdHJpbmcqICAgICAgICAgICAgICAgICAgICAgaW5wdXQxOwogICAgT1N0cmluZyogICAgICAgICAgICAgICAgICAgICBpbnB1dDI7CiAgICB+VGVzdENhc2UoKSB7IGRlbGV0ZSBpbnB1dDE7ZGVsZXRlIGlucHV0Mjt9CiAgICB9IFRlc3RDYXNlOwoKICAgIFRlc3RDYXNlIGFyclRlc3RDYXNlW10gPQogICAgewogICAgICAgIHsiJ1N1biBtaWNyb3N5c3RlbXMnPj0nU3VuIE1pY3Jvc3lzdGVtcyciLHNhbF9UcnVlLAogICAgICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjMpLCBuZXcgT1N0cmluZyhrVGVzdFN0cjEpfSwKICAgICAgICB7IiEoJ1N1biBNaWNyb3N5c3RlbXMnPj0nU3VuIG1pY3Jvc3lzdGVtcycpIixzYWxfRmFsc2UsCiAgICAgICAgICAgIG5ldyBPU3RyaW5nKGtUZXN0U3RyMSksIG5ldyBPU3RyaW5nKGtUZXN0U3RyMyl9LAogICAgICAgIHsiISgnU3VuIE1pY3Jvc3lzdGVtcyc+PSdTdW4gTWljcm9zeXN0ZW1zIEphdmEgVGVjaG5vbG9neScpIixzYWxfRmFsc2UsCiAgICAgICAgICAgIG5ldyBPU3RyaW5nKGtUZXN0U3RyMSksIG5ldyBPU3RyaW5nKGtUZXN0U3RyMil9LAogICAgICAgIHsiJ1N1biBNaWNyb3N5c3RlbXMgSmF2YSBUZWNobm9sb2d5Jz49J1N1biBNaWNyb3N5c3RlbXMnIixzYWxfVHJ1ZSwKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHIyKSwgbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKX0sCiAgICAgICAgeyInU3VuIE1pY3Jvc3lzdGVtcyc+PSdTdW4gTWljcm9zeXN0ZW1zJyIsIHNhbF9UcnVlLAogICAgICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjEpLCBuZXcgT1N0cmluZyhrVGVzdFN0cjEpfSwKICAgICAgICB7IidTdW4gTWljcm9zeXN0ZW1zJz49JyciLHNhbF9UcnVlLG5ldyBPU3RyaW5nKGtUZXN0U3RyMSksIAogICAgICAgICAgICBuZXcgT1N0cmluZygpfSwKICAgICAgICB7ICInJz49J1N1biBtaWNyb3N5c3RlbXMnIixzYWxfRmFsc2UsbmV3IE9TdHJpbmcoKSwgCiAgICAgICAgICAgIG5ldyBPU3RyaW5nKGtUZXN0U3RyMyl9LAogICAgICAgIHsiJyc+PScnIixzYWxfVHJ1ZSxuZXcgT1N0cmluZygpLCBuZXcgT1N0cmluZygpfQogICAgfTsKCiAgICBzYWxfQm9vbCByZXMgPSBzYWxfVHJ1ZTsKICAgIHNhbF91SW50MzIgaTsKCiAgICBmb3IoaSA9IDA7IGkgPCAoc2l6ZW9mIChhcnJUZXN0Q2FzZSkpLyhzaXplb2YgKFRlc3RDYXNlKSk7IGkrKykKICAgIHsKICAgICAgICBzYWxfQm9vbCBjbXBSZXMgPSAoKmFyclRlc3RDYXNlW2ldLmlucHV0MSA+PSAqYXJyVGVzdENhc2VbaV0uaW5wdXQyKTsKICAgICAgICBzYWxfQm9vbCBsYXN0UmVzID0gKGNtcFJlcyA9PSBhcnJUZXN0Q2FzZVtpXS5leHBWYWwpOwoKICAgICAgICBjX3J0bF90cmVzX3N0YXRlCiAgICAgICAgKAogICAgICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICAgICAgbGFzdFJlcywKICAgICAgICAgICAgYXJyVGVzdENhc2VbaV0uY29tbWVudHMsCiAgICAgICAgICAgIGNyZWF0ZU5hbWUoIHBNZXRoLCAib3BlcmF0b3IgPj0iLCBpICkKICAgICAgICApOwoKICAgICAgICByZXMgJj0gbGFzdFJlczsKCiAgICB9CgogICAgY19ydGxfdHJlc19zdGF0ZV9lbmQoaFJ0bFRlc3RSZXN1bHQsICJvcF9nZSIpOwovLyAgICByZXR1cm4gKCByZXMgKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gdGVzdGluZyB0aGUgb3BlcmF0b3IgPD0gKGNvbnN0IE9TdHJpbmcmIHJTdHIxLCBjb25zdCBPU3RyaW5nJiByU3RyMikKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZXh0ZXJuICJDIiB2b2lkIC8qIHNhbF9Cb29sICovIFNBTF9DQUxMIHRlc3RfcnRsX09TdHJpbmdfb3BfbGUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUZXN0UmVzdWx0IGhSdGxUZXN0UmVzdWx0ICkKewogICAgc2FsX0NoYXIgbWV0aE5hbWVbTUFYQlVGTEVOR1RIXTsKICAgIHNhbF9DaGFyKiBwTWV0aCA9IG1ldGhOYW1lOwoKICAgIGNfcnRsX3RyZXNfc3RhdGVfc3RhcnQoaFJ0bFRlc3RSZXN1bHQsICJvcF9sZSIpOwogICAgdHlwZWRlZiBzdHJ1Y3QgVGVzdENhc2UKICAgIHsKICAgIHNhbF9DaGFyKiAgICAgICAgICAgICAgICAgICAgY29tbWVudHM7CiAgICBzYWxfQm9vbCAgICAgICAgICAgICAgICAgICAgIGV4cFZhbDsKICAgIE9TdHJpbmcqICAgICAgICAgICAgICAgICAgICAgaW5wdXQxOwogICAgT1N0cmluZyogICAgICAgICAgICAgICAgICAgICBpbnB1dDI7CiAgICB+VGVzdENhc2UoKSB7IGRlbGV0ZSBpbnB1dDE7ZGVsZXRlIGlucHV0Mjt9CiAgICB9IFRlc3RDYXNlOwoKICAgIFRlc3RDYXNlIGFyclRlc3RDYXNlW10gPQogICAgewogICAgICAgIHsiISgnU3VuIG1pY3Jvc3lzdGVtcyc8PSdTdW4gTWljcm9zeXN0ZW1zJykiLHNhbF9GYWxzZSwKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHIzKSwgbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKX0sCiAgICAgICAgeyInU3VuIE1pY3Jvc3lzdGVtcyc8PSdTdW4gbWljcm9zeXN0ZW1zJyIsc2FsX1RydWUsCiAgICAgICAgICAgIG5ldyBPU3RyaW5nKGtUZXN0U3RyMSksIG5ldyBPU3RyaW5nKGtUZXN0U3RyMyl9LAogICAgICAgIHsiJ1N1biBNaWNyb3N5c3RlbXMnPD0nU3VuIE1pY3Jvc3lzdGVtcyBKYXZhIFRlY2hub2xvZ3knIixzYWxfVHJ1ZSwKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKSwgCiAgICAgICAgICAgIG5ldyBPU3RyaW5nKGtUZXN0U3RyMil9LAogICAgICAgIHsiISgnU3VuIE1pY3Jvc3lzdGVtcyBKYXZhIFRlY2hub2xvZ3knPD0nU3VuIE1pY3Jvc3lzdGVtcycpIixzYWxfRmFsc2UsCiAgICAgICAgICAgIG5ldyBPU3RyaW5nKGtUZXN0U3RyMiksIAogICAgICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjEpfSwKICAgICAgICB7IiEoJ1N1biBNaWNyb3N5c3RlbXMnPD0nU3VuIE1pY3Jvc3lzdGVtcyciLCBzYWxfVHJ1ZSwKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKSwgbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKX0sCiAgICAgICAgeyInU3VuIE1pY3Jvc3lzdGVtcyc8PScnIixzYWxfRmFsc2UsbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKSwgCiAgICAgICAgICAgIG5ldyBPU3RyaW5nKCl9LAogICAgICAgIHsiJyc8PSdTdW4gTWljcm9zeXN0ZW1zIEphdmEgVGVjaG5vbG9neSciLHNhbF9UcnVlLG5ldyBPU3RyaW5nKCksIAogICAgICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjIpfSwKICAgICAgICB7IiEoJyc8PScnKSIsc2FsX1RydWUsbmV3IE9TdHJpbmcoKSwgbmV3IE9TdHJpbmcoKX0KICAgIH07CgogICAgc2FsX0Jvb2wgcmVzID0gc2FsX1RydWU7CiAgICBzYWxfdUludDMyIGk7CgogICAgZm9yKGkgPSAwOyBpIDwgKHNpemVvZiAoYXJyVGVzdENhc2UpKS8oc2l6ZW9mIChUZXN0Q2FzZSkpOyBpKyspCiAgICB7CiAgICAgICAgc2FsX0Jvb2wgY21wUmVzID0gKCphcnJUZXN0Q2FzZVtpXS5pbnB1dDEgPD0gKmFyclRlc3RDYXNlW2ldLmlucHV0Mik7CiAgICAgICAgc2FsX0Jvb2wgbGFzdFJlcyA9IChjbXBSZXMgPT0gYXJyVGVzdENhc2VbaV0uZXhwVmFsKTsKCiAgICAgICAgY19ydGxfdHJlc19zdGF0ZQogICAgICAgICgKICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgIGxhc3RSZXMsCiAgICAgICAgICAgIGFyclRlc3RDYXNlW2ldLmNvbW1lbnRzLAogICAgICAgICAgICBjcmVhdGVOYW1lKCBwTWV0aCwgIm9wZXJhdG9yIDw9IiwgaSApCiAgICAgICAgKTsKCiAgICAgICAgcmVzICY9IGxhc3RSZXM7CgogICAgfQoKICAgIGNfcnRsX3RyZXNfc3RhdGVfZW5kKGhSdGxUZXN0UmVzdWx0LCAib3BfbGUiKTsKLy8gICAgcmV0dXJuICggcmVzICk7Cn0KCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyB0ZXN0aW5nIHRoZSBvcGVyYXRvciA9Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyBzYWxfQm9vbCB0ZXN0X3J0bF9PU3RyaW5nX29wX2VxXzAwMSggaFRlc3RSZXN1bHQgaFJ0bFRlc3RSZXN1bHQgKQp7CiAgICBzYWxfQ2hhciBtZXRoTmFtZVtNQVhCVUZMRU5HVEhdOwogICAgc2FsX0NoYXIqIHBNZXRoID0gbWV0aE5hbWU7CgogICAgdHlwZWRlZiBzdHJ1Y3QgVGVzdENhc2UKICAgIHsKICAgIHNhbF9DaGFyKiAgICAgICAgICAgICAgICAgICAgY29tbWVudHM7CiAgICBzYWxfQm9vbCAgICAgICAgICAgICAgICAgICAgIGV4cFZhbDsKICAgIE9TdHJpbmcqICAgICAgICAgICAgICAgICAgICAgaW5wdXQxOwogICAgT1N0cmluZyogICAgICAgICAgICAgICAgICAgICBpbnB1dDI7CiAgICB+VGVzdENhc2UoKSB7IGRlbGV0ZSBpbnB1dDE7ZGVsZXRlIGlucHV0Mjt9CiAgICB9IFRlc3RDYXNlOwoKICAgIFRlc3RDYXNlIGFyclRlc3RDYXNlW10gPQogICAgewogICAgICAgIHsiJycgPSBzdHIxLCBzdHIxID09IHN0cjIiLHNhbF9UcnVlLG5ldyBPU3RyaW5nKGtUZXN0U3RyMSksIAogICAgICAgICAgICBuZXcgT1N0cmluZygpfSwKICAgICAgICB7InN0cjEgPSBzdHIyLCBzdHIxID09IHN0cjIiLHNhbF9UcnVlLG5ldyBPU3RyaW5nKGtUZXN0U3RyMSksIAogICAgICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjYpfSwKICAgICAgICB7InN0cjIgPSAnJywgc3RyMSA9PSBzdHIyIixzYWxfVHJ1ZSxuZXcgT1N0cmluZygpLCAKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHIyKX0sCiAgICAgICAgeyInJyA9ICcnLCBzdHIxID09IHN0cjIiLHNhbF9UcnVlLG5ldyBPU3RyaW5nKCksIAogICAgICAgICAgICBuZXcgT1N0cmluZygpfQogICAgfTsKCiAgICBzYWxfQm9vbCByZXMgPSBzYWxfVHJ1ZTsKICAgIHNhbF91SW50MzIgaTsKCiAgICBmb3IoaSA9IDA7IGkgPCAoc2l6ZW9mIChhcnJUZXN0Q2FzZSkpLyhzaXplb2YgKFRlc3RDYXNlKSk7IGkrKykKICAgIHsKICAgICAgICooYXJyVGVzdENhc2VbaV0uaW5wdXQxKSA9ICooYXJyVGVzdENhc2VbaV0uaW5wdXQyKTsKCiAgICAgICAgc2FsX0Jvb2wgY21wUmVzID0gCiAgICAgICAgICAgICgqKGFyclRlc3RDYXNlW2ldLmlucHV0MSkgPT0gKihhcnJUZXN0Q2FzZVtpXS5pbnB1dDIpKTsKICAgICAgICBzYWxfQm9vbCBsYXN0UmVzID0gKGNtcFJlcyA9PSBhcnJUZXN0Q2FzZVtpXS5leHBWYWwpOwoKICAgICAgICBjX3J0bF90cmVzX3N0YXRlCiAgICAgICAgKAogICAgICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICAgICAgbGFzdFJlcywKICAgICAgICAgICAgYXJyVGVzdENhc2VbaV0uY29tbWVudHMsCiAgICAgICAgICAgIGNyZWF0ZU5hbWUoIHBNZXRoLCAib3BlcmF0b3IgPSIsIGkgKQogICAgICAgICk7CgogICAgICAgIHJlcyAmPSBsYXN0UmVzOwogICAgfQoKICAgIHJldHVybiAoIHJlcyApOwp9CgpzdGF0aWMgc2FsX0Jvb2wgdGVzdF9ydGxfT1N0cmluZ19vcF9lcV8wMDIoIAogICAgICAgICAgICAgICAgICAgIGhUZXN0UmVzdWx0IGhSdGxUZXN0UmVzdWx0ICkKewogICAgOjpydGw6Ok9TdHJpbmcgYVN0cjsKICAgIGFTdHIgPSBPU3RyaW5nKGtUZXN0U3RyMSk7CgogICAgcmV0dXJuCiAgICAoCiAgICAgICAgY19ydGxfdHJlc19zdGF0ZQogICAgICAgICgKICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgIGFTdHIgPT0ga1Rlc3RTdHIxLAogICAgICAgICAgICAic3RyID0gT1N0cmluZyhcIiVzXCIpLCBzdHIgPT0gXCIlc1wiIiwKICAgICAgICAgICAgIm9wZXJhdG9yID0iCiAgICAgICAgKQogICAgKTsKfQoKc3RhdGljIHNhbF9Cb29sIHRlc3RfcnRsX09TdHJpbmdfb3BfZXFfMDAzKCAKICAgICAgICAgICAgICAgICAgICBoVGVzdFJlc3VsdCBoUnRsVGVzdFJlc3VsdCApCnsKICAgIHNhbF9Cb29sIGJUQ1N0YXRlID0gZmFsc2U7CgogICAgOjpydGw6Ok9TdHJpbmcgYVN0cjEoa1Rlc3RTdHIxKTsKICAgIDo6cnRsOjpPU3RyaW5nIGFTdHIyOwogICAgOjpydGw6Ok9TdHJpbmcgYVN0cjM7CgogICAgYVN0cjMgPSBhU3RyMiA9IGFTdHIxOwoKICAgIGJUQ1N0YXRlID0gICAgKCBhU3RyMSA9PSBhU3RyMiApCiAgICAgICAgICAgICAgICYmICggYVN0cjEgPT0gYVN0cjMgKQogICAgICAgICAgICAgICAmJiAoIGFTdHIyID09IGFTdHIzICk7CgogICAgY19ydGxfdHJlc19zdGF0ZQogICAgKAogICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgIGJUQ1N0YXRlLAogICAgICAgICJzdHIzPXN0cjI9c3RyMSwoc3RyMSA9PSBzdHIyKSYmKHN0cjEgPT0gc3RyMykmJihzdHIyID09IHN0cjMpIiwKICAgICAgICAib3BlcmF0b3IgPSIKICAgICk7CgogICAgcmV0dXJuIGJUQ1N0YXRlOwp9CgpleHRlcm4gIkMiIHZvaWQgLyogc2FsX0Jvb2wgKi8gU0FMX0NBTEwgdGVzdF9ydGxfT1N0cmluZ19vcF9lcSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGVzdFJlc3VsdCBoUnRsVGVzdFJlc3VsdCApCnsKICAgIGNfcnRsX3RyZXNfc3RhdGVfc3RhcnQoaFJ0bFRlc3RSZXN1bHQsICJvcF9lcSIpOwogICAgc2FsX0Jvb2wgcmVzID0gdGVzdF9ydGxfT1N0cmluZ19vcF9lcV8wMDEoIGhSdGxUZXN0UmVzdWx0ICk7CiAgICByZXMgJj0gdGVzdF9ydGxfT1N0cmluZ19vcF9lcV8wMDIoIGhSdGxUZXN0UmVzdWx0ICk7CiAgICByZXMgJj0gdGVzdF9ydGxfT1N0cmluZ19vcF9lcV8wMDMoIGhSdGxUZXN0UmVzdWx0ICk7CiAgICBjX3J0bF90cmVzX3N0YXRlX2VuZChoUnRsVGVzdFJlc3VsdCwgIm9wX2VxIik7CgovLyAgICByZXR1cm4gKCByZXMgKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gdGVzdGluZyB0aGUgb3BlcmF0b3IgKwovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpleHRlcm4gIkMiIHZvaWQgLyogc2FsX0Jvb2wgKi8gU0FMX0NBTEwgdGVzdF9ydGxfT1N0cmluZ19vcF9wbHVzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGVzdFJlc3VsdCBoUnRsVGVzdFJlc3VsdCApCnsKICAgIHNhbF9DaGFyIG1ldGhOYW1lW01BWEJVRkxFTkdUSF07CiAgICBzYWxfQ2hhciogcE1ldGggPSBtZXRoTmFtZTsKCiAgICBjX3J0bF90cmVzX3N0YXRlX3N0YXJ0KGhSdGxUZXN0UmVzdWx0LCAib3BfcGx1cyIpOwogICAgdHlwZWRlZiBzdHJ1Y3QgVGVzdENhc2UKICAgIHsKICAgIHNhbF9DaGFyKiAgICAgICAgICAgICAgICAgICAgY29tbWVudHM7CiAgICBPU3RyaW5nKiAgICAgICAgICAgICAgICAgICAgIGV4cFZhbDsKICAgIE9TdHJpbmcqICAgICAgICAgICAgICAgICAgICAgaW5wdXQxOwogICAgT1N0cmluZyogICAgICAgICAgICAgICAgICAgICBpbnB1dDI7CiAgICB+VGVzdENhc2UoKSB7IGRlbGV0ZSBpbnB1dDE7ZGVsZXRlIGlucHV0MjsgZGVsZXRlIGV4cFZhbDt9CiAgICB9IFRlc3RDYXNlOwoKICAgIFRlc3RDYXNlIGFyclRlc3RDYXNlW10gPQogICAgewogICAgICAgIHsic3RyMSA9IHN0cjcgKyBzdHI4IixuZXcgT1N0cmluZyhrVGVzdFN0cjEpLAogICAgICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjcpLCBuZXcgT1N0cmluZyhrVGVzdFN0cjgpfSwKICAgICAgICB7InN0cjEgPSBzdHIxICsgJycgIixuZXcgT1N0cmluZyhrVGVzdFN0cjEpLAogICAgICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjEpLCBuZXcgT1N0cmluZygiIil9LAogICAgICAgIHsic3RyMSA9ICcnICsgc3RyMSIsIG5ldyBPU3RyaW5nKGtUZXN0U3RyMSksCiAgICAgICAgICAgIG5ldyBPU3RyaW5nKCIiKSwgbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKX0sCiAgICAgICAgeyIgJycgPSAnJyArICcnICIsIG5ldyBPU3RyaW5nKCIiKSxuZXcgT1N0cmluZygiIiksIAogICAgICAgICAgICBuZXcgT1N0cmluZygiIil9LAogICAgICAgIHsic3RyMSA9IHN0cjEgKyBkZWYuY29uc3RyIiwgbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKSwKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKSwgbmV3IE9TdHJpbmcoKX0sCiAgICAgICAgeyIgc3RyMSA9IGRlZi5jb25zdHIgKyBzdHIxICIsbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKSwKICAgICAgICAgICAgbmV3IE9TdHJpbmcoKSwgbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKX0sCiAgICAgICAgeyIgZGVmLmNvbnN0cj0gZGVmLmNvbnN0ciArIGRlZi5jb25zdHIiLCBuZXcgT1N0cmluZygpLAogICAgICAgICAgICBuZXcgT1N0cmluZygpLCBuZXcgT1N0cmluZygpfQogICAgfTsKCiAgICBzYWxfQm9vbCByZXMgPSBzYWxfVHJ1ZTsKICAgIHNhbF91SW50MzIgaTsKICAgIGZvcihpID0gMDsgaSA8IChzaXplb2YgKGFyclRlc3RDYXNlKSkvKHNpemVvZiAoVGVzdENhc2UpKTsgaSsrKQogICAgewogICAgICAgIE9TdHJpbmcgc3RyID0gKCphcnJUZXN0Q2FzZVtpXS5pbnB1dDEpICsgKCphcnJUZXN0Q2FzZVtpXS5pbnB1dDIpOwogICAgICAgIHNhbF9Cb29sIGxhc3RSZXMgPSAoc3RyID09ICphcnJUZXN0Q2FzZVtpXS5leHBWYWwpOwoKICAgICAgICBjX3J0bF90cmVzX3N0YXRlCiAgICAgICAgKAogICAgICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICAgICAgbGFzdFJlcywKICAgICAgICAgICAgYXJyVGVzdENhc2VbaV0uY29tbWVudHMsCiAgICAgICAgICAgIGNyZWF0ZU5hbWUoIHBNZXRoLCAib3BlcmF0b3IgKyIsIGkgKQogICAgICAgICk7CgogICAgICAgIHJlcyAmPSBsYXN0UmVzOwoKICAgIH0KCiAgICBjX3J0bF90cmVzX3N0YXRlX2VuZChoUnRsVGVzdFJlc3VsdCwgIm9wX3BsdXMiKTsKLy8gICByZXR1cm4gKCByZXMgKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gdGVzdGluZyB0aGUgb3BlcmF0b3IgKz0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZXh0ZXJuICJDIiB2b2lkIC8qIHNhbF9Cb29sICovIFNBTF9DQUxMIHRlc3RfcnRsX09TdHJpbmdfb3BfcGVxKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGVzdFJlc3VsdCBoUnRsVGVzdFJlc3VsdCApCnsKICAgIHNhbF9DaGFyIG1ldGhOYW1lW01BWEJVRkxFTkdUSF07CiAgICBzYWxfQ2hhciogcE1ldGggPSBtZXRoTmFtZTsKCiAgICBjX3J0bF90cmVzX3N0YXRlX3N0YXJ0KGhSdGxUZXN0UmVzdWx0LCAib3BfcGVxIik7CiAgICB0eXBlZGVmIHN0cnVjdCBUZXN0Q2FzZQogICAgewogICAgc2FsX0NoYXIqICAgICAgICAgICAgICAgICAgICBjb21tZW50czsKICAgIE9TdHJpbmcqICAgICAgICAgICAgICAgICAgICAgZXhwVmFsOwogICAgT1N0cmluZyogICAgICAgICAgICAgICAgICAgICBpbnB1dDE7CiAgICBPU3RyaW5nKiAgICAgICAgICAgICAgICAgICAgIGlucHV0MjsKICAgIH5UZXN0Q2FzZSgpIHsgZGVsZXRlIGlucHV0MTtkZWxldGUgaW5wdXQyOyBkZWxldGUgZXhwVmFsO30KICAgIH0gVGVzdENhc2U7CgogICAgVGVzdENhc2UgYXJyVGVzdENhc2VbXSA9CiAgICB7CiAgICAgICAgeyJzdHIxID09IChzdHI3ICs9IHN0cjgpIixuZXcgT1N0cmluZyhrVGVzdFN0cjEpLAogICAgICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjcpLCBuZXcgT1N0cmluZyhrVGVzdFN0cjgpfSwKICAgICAgICB7InN0cjEgPT0gKHN0cjEgKz0gJycpIixuZXcgT1N0cmluZyhrVGVzdFN0cjEpLAogICAgICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjEpLCBuZXcgT1N0cmluZygiIil9LAogICAgICAgIHsic3RyMSA9PSAoJycgKz0gc3RyMSkiLCBuZXcgT1N0cmluZyhrVGVzdFN0cjEpLAogICAgICAgICAgICBuZXcgT1N0cmluZygiIiksIG5ldyBPU3RyaW5nKGtUZXN0U3RyMSl9LAogICAgICAgIHsiICcnID09ICgnJyArPSAnJykiLCBuZXcgT1N0cmluZygiIiksCiAgICAgICAgICAgIG5ldyBPU3RyaW5nKCIiKSwgbmV3IE9TdHJpbmcoIiIpfSwKICAgICAgICB7InN0cjEgPT0gKHN0cjEgKz0gZGVmLmNvbnN0cikiLCBuZXcgT1N0cmluZyhrVGVzdFN0cjEpLAogICAgICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjEpLCBuZXcgT1N0cmluZygpfSwKICAgICAgICB7IiBzdHIxID09IChkZWYuY29uc3RyICs9IHN0cjEpIixuZXcgT1N0cmluZyhrVGVzdFN0cjEpLAogICAgICAgICAgICBuZXcgT1N0cmluZygpLCBuZXcgT1N0cmluZyhrVGVzdFN0cjEpfSwKICAgICAgICB7IiBkZWYuY29uc3RyPT0gKGRlZi5jb25zdHIgKz0gZGVmLmNvbnN0cikiLCAKICAgICAgICAgICAgbmV3IE9TdHJpbmcoKSxuZXcgT1N0cmluZygpLCBuZXcgT1N0cmluZygpfQogICAgfTsKCiAgICBzYWxfQm9vbCByZXMgPSBzYWxfVHJ1ZTsKICAgIHNhbF91SW50MzIgaTsKICAgIGZvcihpID0gMDsgaSA8IChzaXplb2YgKGFyclRlc3RDYXNlKSkvKHNpemVvZiAoVGVzdENhc2UpKTsgaSsrKQogICAgeyAgIE9TdHJpbmcgc3RyOwogICAgICAgIHN0ciArPSAoKmFyclRlc3RDYXNlW2ldLmlucHV0MSk7IHN0ciArPSAoKmFyclRlc3RDYXNlW2ldLmlucHV0Mik7CiAgICAgICAgc2FsX0Jvb2wgbGFzdFJlcyA9IChzdHIgPT0gKmFyclRlc3RDYXNlW2ldLmV4cFZhbCk7CgogICAgICAgIGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAoCiAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgICAgICBsYXN0UmVzLAogICAgICAgICAgICBhcnJUZXN0Q2FzZVtpXS5jb21tZW50cywKICAgICAgICAgICAgY3JlYXRlTmFtZSggcE1ldGgsICJvcGVyYXRvciArIiwgaSApCiAgICAgICAgKTsKCiAgICAgICAgcmVzICY9IGxhc3RSZXM7CgogICAgfQoKICAgIGNfcnRsX3RyZXNfc3RhdGVfZW5kKGhSdGxUZXN0UmVzdWx0LCAib3BfcGVxIik7Ci8vICAgcmV0dXJuICggcmVzICk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIHRlc3RpbmcgdGhlIG9wZXJhdG9yIGNvbnN0IHNhbF9DaGFyICogKGNzY3MgZm9yIHNob3J0KQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpleHRlcm4gIkMiIHZvaWQgLyogc2FsX0Jvb2wgKi8gU0FMX0NBTEwgdGVzdF9ydGxfT1N0cmluZ19vcF9jc2NzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGVzdFJlc3VsdCBoUnRsVGVzdFJlc3VsdCApCnsKc2FsX0NoYXIgbWV0aE5hbWVbTUFYQlVGTEVOR1RIXTsKc2FsX0NoYXIqIHBNZXRoID0gbWV0aE5hbWU7CgogY19ydGxfdHJlc19zdGF0ZV9zdGFydChoUnRsVGVzdFJlc3VsdCwgIm9wX2NzY3MiKTsKdHlwZWRlZiBzdHJ1Y3QgVGVzdENhc2UKICAgIHsKICAgICAgICBzYWxfQ2hhciogICAgICAgICAgICAgICAgICAgY29tbWVudHM7CiAgICAgICAgY29uc3Qgc2FsX0NoYXIqICAgICAgICAgICAgICBleHBWYWw7CiAgICAgICAgc2FsX0ludDMyICAgICAgICAgICAgICAgICAgICBjbXBMZW47CiAgICAgICAgT1N0cmluZyogICAgICAgICAgICAgICAgICAgIGlucHV0MTsKICAgICAgICB+VGVzdENhc2UoKSB7IGRlbGV0ZSBpbnB1dDE7fQogICAgfSBUZXN0Q2FzZTsKCiAgICBUZXN0Q2FzZSBhcnJUZXN0Q2FzZVtdID0KICAgIHsKICAgICAgICB7InRlc3Qgbm9ybWFsIHN0cmluZyIsa1Rlc3RTdHIxLGtUZXN0U3RyMUxlbixuZXcgT1N0cmluZyhrVGVzdFN0cjEpfSwKICAgICAgICB7InRlc3QgZW1wdHkgc3RyaW5nIiwiIiwxLG5ldyBPU3RyaW5nKCl9CiAgICB9OwoKICAgIHNhbF9Cb29sIHJlcyA9IHNhbF9UcnVlOwogICAgc2FsX3VJbnQzMiBpOwogICAgZm9yKGkgPSAwOyBpIDwgKHNpemVvZiAoYXJyVGVzdENhc2UpKS8oc2l6ZW9mIChUZXN0Q2FzZSkpOyBpKyspCiAgICB7CiAgICAgICAgY29uc3Qgc2FsX0NoYXIqIHBzdHIgPSAoKmFyclRlc3RDYXNlW2ldLmlucHV0MSk7CgogICAgICAgIHJlcyAmPSBjX3J0bF90cmVzX3N0YXRlCiAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgY21wc3RyKChzYWxfQ2hhciopcHN0ciwoc2FsX0NoYXIqKWFyclRlc3RDYXNlW2ldLmV4cFZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgYXJyVGVzdENhc2VbaV0uY21wTGVuKSwKICAgICAgICAgICAgICAgICAgICBhcnJUZXN0Q2FzZVtpXS5jb21tZW50cywKICAgICAgICAgICAgICAgICAgICBjcmVhdGVOYW1lKCBwTWV0aCwgImNvbnN0IHNhbF9DaGFyKiIsIGkgKQogICAgICAgICAgICAgICAgKTsKICAgIH0KICAgIGNfcnRsX3RyZXNfc3RhdGVfZW5kKGhSdGxUZXN0UmVzdWx0LCAib3BfY3NjcyIpOwovLyAgICByZXR1cm4gKCByZXMgKTsKfQoKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIHRlc3RpbmcgdGhlIG1ldGhvZCBnZXRTdHIoKQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCmV4dGVybiAiQyIgdm9pZCAvKiBzYWxfQm9vbCAqLyBTQUxfQ0FMTCB0ZXN0X3J0bF9PU3RyaW5nX2dldFN0cigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRlc3RSZXN1bHQgaFJ0bFRlc3RSZXN1bHQgKQp7CiAgICBzYWxfQ2hhciBtZXRoTmFtZVtNQVhCVUZMRU5HVEhdOwogICAgc2FsX0NoYXIqIHBNZXRoID0gbWV0aE5hbWU7CgogICAgY19ydGxfdHJlc19zdGF0ZV9zdGFydChoUnRsVGVzdFJlc3VsdCwgImdldFN0ciIpOwogICAgdHlwZWRlZiBzdHJ1Y3QgVGVzdENhc2UKICAgIHsKICAgICAgICBzYWxfQ2hhciogICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzOwogICAgICAgIGNvbnN0IHNhbF9DaGFyKiAgICAgICAgICAgICAgZXhwVmFsOwogICAgICAgIHNhbF9JbnQzMiAgICAgICAgICAgICAgICAgICAgY21wTGVuOwogICAgICAgIE9TdHJpbmcqICAgICAgICAgICAgICAgICAgICAgaW5wdXQxOwogICAgICAgIH5UZXN0Q2FzZSgpIHsgZGVsZXRlIGlucHV0MTt9CiAgICB9IFRlc3RDYXNlOwoKICAgIFRlc3RDYXNlIGFyclRlc3RDYXNlW10gPQogICAgewogICAgICAgIHsidGVzdCBub3JtYWwgc3RyaW5nIixrVGVzdFN0cjEsa1Rlc3RTdHIxTGVuLG5ldyBPU3RyaW5nKGtUZXN0U3RyMSl9LAogICAgICAgIHsidGVzdCBlbXB0eSBzdHJpbmciLCIiLDAsbmV3IE9TdHJpbmcoKX0KICAgIH07CgogICAgc2FsX0Jvb2wgcmVzID0gc2FsX1RydWU7CiAgICBzYWxfdUludDMyIGk7CiAgICBmb3IoaSA9IDA7IGkgPCAoc2l6ZW9mIChhcnJUZXN0Q2FzZSkpLyhzaXplb2YgKFRlc3RDYXNlKSk7IGkrKykKICAgIHsKICAgICAgICBjb25zdCBzYWxfQ2hhciogcHN0ciA9IGFyclRlc3RDYXNlW2ldLmlucHV0MS0+Z2V0U3RyKCk7CiAgICAgICAgcmVzICY9IGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAgICAgICAgICAgICAoCiAgICAgICAgICAgICAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgICAgICAgICAgICAgICAgICBjbXBzdHIocHN0ciwgYXJyVGVzdENhc2VbaV0uZXhwVmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyVGVzdENhc2VbaV0uY21wTGVuKSwKICAgICAgICAgICAgICAgICAgICAgICAgYXJyVGVzdENhc2VbaV0uY29tbWVudHMsCiAgICAgICAgICAgICAgICAgICAgICAgIGNyZWF0ZU5hbWUoIHBNZXRoLCAiZ2V0U3RyIiwgaSApCiAgICAgICAgICAgICAgICAgICAgKTsKICAgIH0KICAgIGNfcnRsX3RyZXNfc3RhdGVfZW5kKGhSdGxUZXN0UmVzdWx0LCAiZ2V0U3RyIik7Ci8vICAgIHJldHVybiAoIHJlcyApOwp9CgoKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIHRlc3RpbmcgdGhlIG1ldGhvZCBjb3B5KCBzYWxfSW50MzIgYmVnaW5JbmRleCApCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyBzYWxfQm9vbCBTQUxfQ0FMTCB0ZXN0X3J0bF9PU3RyaW5nX2NvcHlfMDAxKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGVzdFJlc3VsdCBoUnRsVGVzdFJlc3VsdCApCnsKICAgIHNhbF9DaGFyIG1ldGhOYW1lW01BWEJVRkxFTkdUSF07CiAgICBzYWxfQ2hhciogcE1ldGggPSBtZXRoTmFtZTsKCiAgICB0eXBlZGVmIHN0cnVjdCBUZXN0Q2FzZQogICAgewogICAgc2FsX0NoYXIqICAgICAgICAgICAgICAgICAgICBjb21tZW50czsKICAgIGNvbnN0IHNhbF9DaGFyKiAgICAgICAgICAgICAgc3JjU3RyOwogICAgY29uc3Qgc2FsX0NoYXIqICAgICAgICAgICAgICBhcnJFeHBTdHI7ICAgCiAgICAgICAgICAgICAgICAgICAgLy8gc3RyaW5nIGZvciBjb21wYXJpbmcgd2l0aCByZXN1bHQKICAgIHNhbF9JbnQzMiAgICAgICAgICAgICAgICAgICAgYmVnaW5JbmRleDsgIAogICAgICAgICAgICAgICAgICAgIC8vIGJlZ2luSW5kZXggZm9yIHRoZSBtZXRob2QgY29weQogICAgc2FsX0ludDMyICAgICAgICAgICAgICAgICAgICBsZW5ndGhGb3JDbXA7CiAgICAgICAgICAgICAgICAgICAgLy8gbnVtYmVyIG9mIHN5bWJvbHMgZm9yIGNvbXBhcmluZwogICAgLy8gKGlmIHZhbHVlIGlzIGVxdWFsIHRvIDAgdGhlbiBwb2ludGVycyB0byBidWZmZXJzIG11c3QgYmUgZXF1YWwpCiAgICBzYWxfSW50MzIgICAgICAgICAgICAgICAgICAgIGV4cExlbmd0aDsgICAKICAgICAgICAgICAgICAgICAgICAvL2V4cGVjdGVkIGxlbmd0aCBvZiB0aGUgcmVzdWx0IHN0cmluZwogICAgfSBUZXN0Q2FzZTsKCiAgICBUZXN0Q2FzZSBhcnJUZXN0Q2FzZVtdID0KICAgIHsKICAgICAgICB7ImJlZ2luSW5kZXggPT0gMCAoIHdob2xlIHN0cmluZyApIiwga1Rlc3RTdHIyLGtUZXN0U3RyMiwgCiAgICAgICAgIDAsIGtUZXN0U3RyMkxlbiwga1Rlc3RTdHIyTGVufSwKICAgICAgICB7ImJlZ2luSW5kZXggPT0gc3RybGVuLTIgKCBsYXN0IHR3byBjaGFyICkiLCAga1Rlc3RTdHIyLCJneSIsCiAgICAgICAgICAgICAgICAgICAga1Rlc3RTdHIyTGVuLTIsIDIsIDJ9LAogICAgICAgIHsiYmVnaW5JbmRleCA9PSBzdHJsZW4tMSggbGFzdCBjaGFyICkiLCBrVGVzdFN0cjIsICJ5IiwKICAgICAgICAgICAga1Rlc3RTdHIyTGVuLTEsIDEsIDF9CiAgICB9OwoKICAgIHNhbF9Cb29sIHJlcyA9IHNhbF9UcnVlOwogICAgc2FsX3VJbnQzMiBpOwoKICAgIGZvcihpID0gMDsgaSA8KHNpemVvZiAoYXJyVGVzdENhc2UpKS8oc2l6ZW9mIChUZXN0Q2FzZSkpOyBpKyspCiAgICB7CiAgICAgICAgT1N0cmluZyBzcmMoYXJyVGVzdENhc2VbaV0uc3JjU3RyKTsKICAgICAgICBPU3RyaW5nIGRzdDsKICAgICAgICAvLyBydGxfU3RyaW5nKiBwRGF0YVNyYyA9IHNyYy5wRGF0YTsKCiAgICAgICAgZHN0ID0gc3JjLmNvcHkoYXJyVGVzdENhc2VbaV0uYmVnaW5JbmRleCk7CgogICAgICAgIC8vIHJ0bF9TdHJpbmcqIHBEYXRhRHN0ID0gZHN0LnBEYXRhOwoKICAgICAgICBzYWxfQm9vbCBsYXN0UmVzOwogICAgIAogICAgICAgIGxhc3RSZXM9IChkc3Q9PSBhcnJUZXN0Q2FzZVtpXS5hcnJFeHBTdHIpOwogICAgICAgICAgCgogICAgICAgIGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAoCiAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgICAgICBsYXN0UmVzLAogICAgICAgICAgICBhcnJUZXN0Q2FzZVtpXS5jb21tZW50cywKICAgICAgICAgICAgY3JlYXRlTmFtZSggcE1ldGgsIAogICAgICAgICAgICAgICAgImNvcHlfMDAxKGJlZ2luSW5kZXgpKGNoZWNrIGJ1ZmZlciBhbmQgbGVuZ3RoKSIsIGkgKQogICAgICAgICk7CgogICAgICAgIHJlcyAmPSBsYXN0UmVzOwogICAgICAgICAgICAgICAKICAgIH0KCiAgICByZXR1cm4gKHJlcyk7Cn0KCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyB0ZXN0aW5nIHRoZSBtZXRob2QgY29weSggc2FsX0ludDMyIGJlZ2luSW5kZXgsIHNhbF9JbnQzMiBjb3VudCApCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnN0YXRpYyBzYWxfQm9vbCBTQUxfQ0FMTCB0ZXN0X3J0bF9PU3RyaW5nX2NvcHlfMDAyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGVzdFJlc3VsdCBoUnRsVGVzdFJlc3VsdCApCnsKICAgIHNhbF9DaGFyIG1ldGhOYW1lW01BWEJVRkxFTkdUSF07CiAgICBzYWxfQ2hhciogcE1ldGggPSBtZXRoTmFtZTsKCiAgICB0eXBlZGVmIHN0cnVjdCBUZXN0Q2FzZQogICAgewogICAgc2FsX0NoYXIqICAgICAgICAgICAgICAgY29tbWVudHM7CiAgICBjb25zdCBzYWxfQ2hhciogICAgICAgICAgYXJyRXhwU3RyOyAgIAogICAgc2FsX0ludDMyICAgICAgICAgICAgICAgIGJlZ2luSW5kZXg7IAogICAgc2FsX0ludDMyICAgICAgICAgICAgICAgIGNvdW50OyAgICAgICAKICAgIHNhbF9JbnQzMiAgICAgICAgICAgICAgICBleHBMZW47CiAgICAgICAgICAgICAgIAogICAgfSBUZXN0Q2FzZTsKCiAgICBUZXN0Q2FzZSBhcnJUZXN0Q2FzZVtdID17CgogICAgICAgIHsiY29weSBzdWJzdHJpbmciLCAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVGVzdFN0cjYsIGtUZXN0U3RyMTFMZW4sIGtUZXN0U3RyMkxlbiAtIGtUZXN0U3RyMTFMZW4sa1Rlc3RTdHI2TGVufSwKICAgICAgICAvKiBMTEE6IGl0IGlzIGEgYnVnLCBiZWdpbkluZGV4ICsgY291bnQgPiBrVGVzdFN0cjIuZ2V0TGVuZ3RoKCkgKi8KICAgICAgICAvKiB7ImNvcHkgbm9ybWFsIHN1YnN0cmluZyB3aXRoIGluY29ycmVjdCBjb3VudCIsa1Rlc3RTdHI2LCBrVGVzdFN0cjExTGVuLCAzMSwgMTV9LCAqLwogICAgICAgIHsiY29weSB3aG9sZSBzdHJpbmciLCBrVGVzdFN0cjIsIDAsIGtUZXN0U3RyMkxlbiwga1Rlc3RTdHIyTGVufSwKICAgICAgICAvKiB7ImNvcHkgd2hvbGUgc3RyaW5nIHdpdGggaW5jb3JyZWN0IGNvdW50IGxhcmdlciB0aGFuIGxlbiBhbmQgaW5kZXggMCIsIGtUZXN0U3RyMiwgMCwgNDAsIDMyfSwgKi8KICAgICAgICAvKiBMTEE6IGJ1ZyBiZWdpbkluZGV4ICsgY291bnQgPiBrVGVzdFN0cjIgeyJjb3B5IGxhc3QgY2hhcmFjdGVyIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ5IixrVGVzdFN0cjJMZW4gLSAxLCAzMSwxfSwgKi8KICAgICAgICB7ImNvcHkgbGFzdCBjaGFyYWN0ZXIiLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInkiLGtUZXN0U3RyMkxlbiAtIDEsIDEsMX0sCiAgICAgICAgLyogTExBOiBidWcsIGJlZ2luSW5kZXggPiBrVGVzdFN0cjIgeyJiZWdpbmluZGV4IGxhcmdlciB0aGFuIGxlbiIsIiIsNjAsIDAsMH0sICovCiAgICAgICAgeyJiZWdpbmluZGV4IGV4YWN0IGFzIGxhcmdlIGFzIGl0J3MgbGVuZ3RoIiwiIixrVGVzdFN0cjJMZW4sIDAsMH0KICAgICAgICAvKiBMTEE6IGJ1ZywgbmVnYXRpdmUgY291bnQgaXMgbm90IGFsbG93ZWQuIHsiY291bnQgaXMgbmFnYXRpdmUgaW50IiwiIiwzLCAtMSwwfSAqLwogICAgfTsKICAgIHNhbF9Cb29sIHJlcyA9IHNhbF9UcnVlOwoKICAgIHNhbF91SW50MzIgaTsKICAgIGZvcihpID0gMDsgaSA8IChzaXplb2YgKGFyclRlc3RDYXNlKSkvKHNpemVvZiAoVGVzdENhc2UpKTsgaSsrKSB7CiAgICAgICAgT1N0cmluZyBzcmMoa1Rlc3RTdHIyKTsKICAgICAgICBPU3RyaW5nIGRzdDsKICAgICAgICBkc3QgPSBzcmMuY29weShhcnJUZXN0Q2FzZVtpXS5iZWdpbkluZGV4LCBhcnJUZXN0Q2FzZVtpXS5jb3VudCk7CiAgICAgICAgLy8gcnRsX1N0cmluZyogcERhdGFTcmMgPSBzcmMucERhdGE7CiAgICAgICAgLy8gcnRsX1N0cmluZyogcERhdGFEc3QgPSBkc3QucERhdGE7CgogICAgICAgIHNhbF9Cb29sIGxhc3RSZXM9c2FsX1RydWU7CiAgICAgICAgLy8gY2hlY2tzIGJ1ZmZlciBhbmQgbGVuZ3RoCiAgICAgICAgLy90X3ByaW50KCJ0aGlzIGlzIGNvcHlfXzAwMiAjJWRcbiIsIGkpOwogICAgICAgIC8vdF9wcmludCgiZHN0IGJ1ZmZlciA9JXNcbiIsIHBEYXRhRHN0LT5idWZmZXIpOwogICAgICAgIC8vdF9wcmludCgiZXhwU3RyID0lc1xuIiwgYXJyVGVzdENhc2VbaV0uYXJyRXhwU3RyKTsKICAgICAgICAvL3RfcHJpbnQoImRzdCBsZW5ndGggPSVkXG4iLCBwRGF0YURzdC0+bGVuZ3RoKTsKICAgICAgICAvL3RfcHJpbnQoImNvdW50ID0lZFxuIiwgYXJyVGVzdENhc2VbaV0uY291bnQpOwogICAgICAgIC8vdF9wcmludCgiZXhwTGVuID0lZFxuIiwgYXJyVGVzdENhc2VbaV0uZXhwTGVuKTsKICAgICAgICAKICAgICAgICBsYXN0UmVzID0gKGRzdC5lcXVhbHMoYXJyVGVzdENhc2VbaV0uYXJyRXhwU3RyKSkgPyBzYWxfVHJ1ZSA6IHNhbF9GYWxzZTsKICAgICAgICAgICAgICAgIAogICAgICAgIGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAoCiAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgICAgICBsYXN0UmVzLAogICAgICAgICAgICBhcnJUZXN0Q2FzZVtpXS5jb21tZW50cywKICAgICAgICAgICAgY3JlYXRlTmFtZSggcE1ldGgsIAogICAgICAgICAgICAgICAgImNvcHlfMDAyKGJlZ2luSW5kZXgsY291bnQpKGNoZWNrIGJ1ZmZlciBhbmQgbGVuZ3RoKSIsIGkpCiAgICAgICAgKTsKICAgICAgICByZXMgJj0gbGFzdFJlczsKICAgICAgICAKICAgICAgICAKICAgIH0KCiAgICByZXR1cm4gKHJlcyk7Cn0KCgpzdGF0aWMgc2FsX0Jvb2wgU0FMX0NBTEwgdGVzdF9ydGxfT1N0cmluZ19jb3B5XzAwMygKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRlc3RSZXN1bHQgaFJ0bFRlc3RSZXN1bHQgKQp7CiAgICBzYWxfQm9vbCByZXMgPSBzYWxfVHJ1ZTsKICAgIGNoYXIgY29tbWVudFtdID0gImNvcHkgd2hvbGUgc2hvcnQgc3RyaW5nIHRvIGxvbmcgc3RyaW5nIjsKCiAgICBPU3RyaW5nIHNyYyhrVGVzdFN0cjEpOwogICAgLy8gcnRsX1N0cmluZyogcERhdGFTcmMgPSBzcmMucERhdGE7CiAgICBPU3RyaW5nIGRzdChrVGVzdFN0cjIpOwoKICAgIGRzdCA9IHNyYy5jb3B5KDApOwogICAgLy8gcnRsX1N0cmluZyogcERhdGFEc3QgPSBkc3QucERhdGE7CiAgICAvL2NoZWNrIGJ1ZmZlciBhbmQgbGVuZ3RoCiAgICBzYWxfQm9vbCBsYXN0UmVzID0oZHN0PT1zcmMpOwogICAgY19ydGxfdHJlc19zdGF0ZQogICAgKAogICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgIGxhc3RSZXMsCiAgICAgICAgY29tbWVudCwKICAgICAgICAiY29weV8wMDMoYmVnaW5JbmRleCkoY2hlY2sgYnVmZmVyIGFuZCBsZW5ndGgpIgogICAgKTsKICAgIHJlcyAmPSBsYXN0UmVzOwoKICAgIHJldHVybiAocmVzKTsKfQoKCnN0YXRpYyBzYWxfQm9vbCBTQUxfQ0FMTCB0ZXN0X3J0bF9PU3RyaW5nX2NvcHlfMDA0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGVzdFJlc3VsdCBoUnRsVGVzdFJlc3VsdCApCnsKICAgIHNhbF9Cb29sIHJlcyA9IHNhbF9UcnVlOwogICAgc2FsX0NoYXIgY29tbWVudFtdID0gImNvcHkgd2hvbGUgbG9uZyBzdHJpbmcgdG8gc2hvcnQgc3RyaW5nIjsKCiAgICBPU3RyaW5nIHNyYyhrVGVzdFN0cjIpOwogICAgLy8gcnRsX1N0cmluZyogcERhdGFTcmMgPSBzcmMucERhdGE7CiAgICBPU3RyaW5nIGRzdChrVGVzdFN0cjEpOwoKICAgIGRzdCA9IHNyYy5jb3B5KDApOwogICAgLy8gcnRsX1N0cmluZyogcERhdGFEc3QgPSBkc3QucERhdGE7CiAgICAvL2NoZWNrIGJ1ZmZlciBhbmQgbGVuZ3RoCiAgICBzYWxfQm9vbCBsYXN0UmVzID0oZHN0PT1zcmMpOwogICAgY19ydGxfdHJlc19zdGF0ZQogICAgKAogICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgIGxhc3RSZXMsCiAgICAgICAgY29tbWVudCwKICAgICAgICAiY29weV8wMDQoYmVnaW5JbmRleCkoY2hlY2sgYnVmZmVyIGFuZCBsZW5ndGgpIgogICAgKTsKCiAgICByZXMgJj0gbGFzdFJlczsKICAgIHJldHVybiAocmVzKTsKfQoKZXh0ZXJuICJDIiB2b2lkIC8qIHNhbF9Cb29sICovIFNBTF9DQUxMIHRlc3RfcnRsX09TdHJpbmdfY29weSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRlc3RSZXN1bHQgaFJ0bFRlc3RSZXN1bHQgKQp7CiAgICBjX3J0bF90cmVzX3N0YXRlX3N0YXJ0KGhSdGxUZXN0UmVzdWx0LCAiY29weSIpOwogICAgc2FsX0Jvb2wgcmVzID0gdGVzdF9ydGxfT1N0cmluZ19jb3B5XzAwMShoUnRsVGVzdFJlc3VsdCk7CiAgICByZXMgJj0gdGVzdF9ydGxfT1N0cmluZ19jb3B5XzAwMihoUnRsVGVzdFJlc3VsdCk7CiAgICByZXMgJj0gdGVzdF9ydGxfT1N0cmluZ19jb3B5XzAwMyhoUnRsVGVzdFJlc3VsdCk7CiAgICByZXMgJj0gdGVzdF9ydGxfT1N0cmluZ19jb3B5XzAwNChoUnRsVGVzdFJlc3VsdCk7CiAgICBjX3J0bF90cmVzX3N0YXRlX2VuZChoUnRsVGVzdFJlc3VsdCwgImNvcHkiKTsKIAovLyAgICByZXR1cm4gKCByZXMgKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gdGVzdGluZyB0aGUgbWV0aG9kIGNvbmNhdCggY29uc3QgT1N0cmluZyAmIGFTdHIgKQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpleHRlcm4gIkMiIHZvaWQgLyogc2FsX0Jvb2wgKi8gU0FMX0NBTEwgdGVzdF9ydGxfT1N0cmluZ19jb25jYXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUZXN0UmVzdWx0IGhSdGxUZXN0UmVzdWx0ICkKewogICAgc2FsX0NoYXIgbWV0aE5hbWVbTUFYQlVGTEVOR1RIXTsKICAgIHNhbF9DaGFyKiBwTWV0aCA9bWV0aE5hbWU7CgogICAgY19ydGxfdHJlc19zdGF0ZV9zdGFydChoUnRsVGVzdFJlc3VsdCwgImNvbmNhdCIpOwogICAgdHlwZWRlZiBzdHJ1Y3QgVGVzdENhc2UKICAgIHsKICAgIHNhbF9DaGFyKiAgICAgICAgICAgICAgICAgICAgY29tbWVudHM7CiAgICBPU3RyaW5nKiAgICAgICAgICAgICAgICAgICAgIGV4cFZhbDsKICAgIE9TdHJpbmcqICAgICAgICAgICAgICAgICAgICAgaW5wdXQxOwogICAgT1N0cmluZyogICAgICAgICAgICAgICAgICAgICBpbnB1dDI7CiAgICB+VGVzdENhc2UoKSB7IGRlbGV0ZSBpbnB1dDE7ZGVsZXRlIGlucHV0MjsgZGVsZXRlIGV4cFZhbDt9CiAgICB9IFRlc3RDYXNlOwoKICAgIFRlc3RDYXNlIGFyclRlc3RDYXNlW10gPQogICAgewogICAgICAgIHsiY29uY2F0ZW5hdGVzIHR3byBzdHJpbmdzIixuZXcgT1N0cmluZyhrVGVzdFN0cjEpLAogICAgICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjcpLCAKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHI4KX0sCiAgICAgICAgeyJjb25jYXRlbmF0ZXMgZW1wdHkgc3RyaW5nIixuZXcgT1N0cmluZyhrVGVzdFN0cjEpLAogICAgICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjEpLCAKICAgICAgICAgICAgbmV3IE9TdHJpbmcoIiIpfSwKICAgICAgICB7ImNvbmNhdGVuYXRlcyB0byBlbXB0eSBzdHJpbmciLG5ldyBPU3RyaW5nKGtUZXN0U3RyMSksCiAgICAgICAgICAgIG5ldyBPU3RyaW5nKCIiKSwgCiAgICAgICAgICAgIG5ldyBPU3RyaW5nKGtUZXN0U3RyMSl9LAogICAgICAgIHsiY29uY2F0ZW5hdGVzIHR3byBlbXB0eSBzdHJpbmdzIixuZXcgT1N0cmluZygiIiksbmV3IE9TdHJpbmcoIiIpLAogICAgICAgICAgICAgbmV3IE9TdHJpbmcoIiIpfSwKICAgICAgICB7ImNvbmNhdGVuYXRlcyBzdHJpbmcgY29uc3RydWN0ZWQgYnkgZGVmYXVsdCBjb25zdHJ1Y3RvciIsCiAgICAgICAgICAgIG5ldyBPU3RyaW5nKGtUZXN0U3RyMSksCiAgICAgICAgICAgIG5ldyBPU3RyaW5nKGtUZXN0U3RyMSksIG5ldyBPU3RyaW5nKCl9LAogICAgICAgIHsiY29uY2F0ZW5hdGVzIHRvIHN0cmluZyBjb25zdHJ1Y3RlZCBieSBkZWZhdWx0IGNvbnN0cnVjdG9yIiwKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKSwKICAgICAgICAgICAgbmV3IE9TdHJpbmcoKSwgbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKX0sCiAgICAgICAgeyJjb25jYXRlbmF0ZXMgdHdvIHN0cmluZ3MgY29uc3RydWN0ZWQgYnkgZGVmYXVsdCBjb25zdHJ1Y3RvciIsCiAgICAgICAgICAgIG5ldyBPU3RyaW5nKCksCiAgICAgICAgICAgIG5ldyBPU3RyaW5nKCksIG5ldyBPU3RyaW5nKCl9CiAgICB9OwoKICAgIHNhbF9Cb29sIHJlcyA9IHNhbF9UcnVlOwogICAgc2FsX3VJbnQzMiBpOwogICAgZm9yKGkgPSAwOyBpIDwgKHNpemVvZiAoYXJyVGVzdENhc2UpKS8oc2l6ZW9mIChUZXN0Q2FzZSkpOyBpKyspCiAgICB7CiAgICAgICAgT1N0cmluZyBzdHIgPSAKICAgICAgICAgICAgYXJyVGVzdENhc2VbaV0uaW5wdXQxLT5jb25jYXQoKmFyclRlc3RDYXNlW2ldLmlucHV0Mik7CiAgICAgICAgc2FsX0Jvb2wgbGFzdFJlcyA9IChzdHIgPT0gKmFyclRlc3RDYXNlW2ldLmV4cFZhbCk7CgogICAgICAgIGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAoCiAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgICAgICBsYXN0UmVzLAogICAgICAgICAgICBhcnJUZXN0Q2FzZVtpXS5jb21tZW50cywKICAgICAgICAgICAgY3JlYXRlTmFtZSggcE1ldGgsICJjb25jYXQiLCBpKQogICAgICAgICk7CgogICAgICAgIHJlcyAmPSBsYXN0UmVzOwoKICAgICB9CgogICAgY19ydGxfdHJlc19zdGF0ZV9lbmQoaFJ0bFRlc3RSZXN1bHQsICJjb25jYXQiKTsKLy8gICAgcmV0dXJuICggcmVzICk7Cn0KCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyB0ZXN0aW5nIHRoZSBtZXRob2QgdG9Bc2NpaUxvd2VyQ2FzZSgpCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZXh0ZXJuICJDIiB2b2lkIC8qIHNhbF9Cb29sICovIFNBTF9DQUxMIHRlc3RfcnRsX09TdHJpbmdfdG9Bc2NpaUxvd2VyQ2FzZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGVzdFJlc3VsdCBoUnRsVGVzdFJlc3VsdCApCnsKICAgIHNhbF9DaGFyIG1ldGhOYW1lW01BWEJVRkxFTkdUSF07CiAgICBzYWxfQ2hhciogcE1ldGggPW1ldGhOYW1lOwoKICAgIGNfcnRsX3RyZXNfc3RhdGVfc3RhcnQoaFJ0bFRlc3RSZXN1bHQsICJ0b0FzY2lpTG93ZXJDYXNlIik7CiAgICB0eXBlZGVmIHN0cnVjdCBUZXN0Q2FzZQogICAgewogICAgc2FsX0NoYXIqICAgICAgICAgICAgICAgICAgICBjb21tZW50czsKICAgIE9TdHJpbmcqICAgICAgICAgICAgICAgICAgICAgZXhwVmFsOwogICAgT1N0cmluZyogICAgICAgICAgICAgICAgICAgICBpbnB1dDE7CiAgICB+VGVzdENhc2UoKSB7IGRlbGV0ZSBpbnB1dDE7IGRlbGV0ZSBleHBWYWw7fQogICAgfSBUZXN0Q2FzZTsKCiAgICBUZXN0Q2FzZSBhcnJUZXN0Q2FzZVtdID0KICAgIHsKCiAgICAgICAgeyJvbmx5IHVwcGVyY2FzZSIsbmV3IE9TdHJpbmcoa1Rlc3RTdHI1KSxuZXcgT1N0cmluZyhrVGVzdFN0cjQpfSwKICAgICAgICB7ImRpZmZlcmVudCBjYXNlcyIsbmV3IE9TdHJpbmcoa1Rlc3RTdHI1KSxuZXcgT1N0cmluZyhrVGVzdFN0cjEpfSwKICAgICAgICB7ImRpZmZlcmVudCBjYXNlcyIsbmV3IE9TdHJpbmcoa1Rlc3RTdHI1KSxuZXcgT1N0cmluZyhrVGVzdFN0cjMpfSwKICAgICAgICB7Im9ubHkgbG93ZXJjYXNlIixuZXcgT1N0cmluZyhrVGVzdFN0cjUpLG5ldyBPU3RyaW5nKGtUZXN0U3RyNSl9LAogICAgICAgIHsiZW1wdHkgc3RyaW5nIixuZXcgT1N0cmluZygiIiksbmV3IE9TdHJpbmcoIiIpfSwKICAgICAgICB7InN0cmluZyBjb25zdHJ1Y3RlZCBieSBkZWZhdWx0IGNvbnN0cnVjdG9yIiwKICAgICAgICAgICAgbmV3IE9TdHJpbmcoKSxuZXcgT1N0cmluZygpfQogICAgfTsKCiAgICBzYWxfQm9vbCByZXMgPSBzYWxfVHJ1ZTsKICAgIHNhbF91SW50MzIgaTsKCiAgICBmb3IoaSA9IDA7IGkgPCAoc2l6ZW9mIChhcnJUZXN0Q2FzZSkpLyhzaXplb2YgKFRlc3RDYXNlKSk7IGkrKykKICAgIHsKICAgICAgICBPU3RyaW5nIHN0ciA9IGFyclRlc3RDYXNlW2ldLmlucHV0MS0+dG9Bc2NpaUxvd2VyQ2FzZSgpOwogICAgICAgIHNhbF9Cb29sIGxhc3RSZXMgPSAoc3RyID09KiBhcnJUZXN0Q2FzZVtpXS5leHBWYWwpOwoKICAgICAgICBjX3J0bF90cmVzX3N0YXRlCiAgICAgICAgKAogICAgICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICAgICAgbGFzdFJlcywKICAgICAgICAgICAgYXJyVGVzdENhc2VbaV0uY29tbWVudHMsCiAgICAgICAgICAgIGNyZWF0ZU5hbWUoIHBNZXRoLCAidG9Bc2NpaUxvd2VyQ2FzZSIsIGkpCiAgICAgICAgKTsKCiAgICAgICAgcmVzICY9IGxhc3RSZXM7CiAgICB9CgogICAgY19ydGxfdHJlc19zdGF0ZV9lbmQoaFJ0bFRlc3RSZXN1bHQsICJ0b0FzY2lpTG93ZXJDYXNlIik7Ci8vICAgIHJldHVybiAoIHJlcyApOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyB0ZXN0aW5nIHRoZSBtZXRob2QgdG9Bc2NpaVVwcGVyQ2FzZSgpCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmV4dGVybiAiQyIgdm9pZCAvKiBzYWxfQm9vbCAqLyBTQUxfQ0FMTCB0ZXN0X3J0bF9PU3RyaW5nX3RvQXNjaWlVcHBlckNhc2UoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRlc3RSZXN1bHQgaFJ0bFRlc3RSZXN1bHQgKQp7CiAgICBzYWxfQ2hhciBtZXRoTmFtZVtNQVhCVUZMRU5HVEhdOwogICAgc2FsX0NoYXIqIHBNZXRoID1tZXRoTmFtZTsKCiAgICBjX3J0bF90cmVzX3N0YXRlX3N0YXJ0KGhSdGxUZXN0UmVzdWx0LCAidG9Bc2NpaVVwcGVyQ2FzZSIpOwogICAgdHlwZWRlZiBzdHJ1Y3QgVGVzdENhc2UKICAgIHsKICAgIHNhbF9DaGFyKiAgICAgICAgICAgICAgICAgICAgY29tbWVudHM7CiAgICBPU3RyaW5nKiAgICAgICAgICAgICAgICAgICAgIGV4cFZhbDsKICAgIE9TdHJpbmcqICAgICAgICAgICAgICAgICAgICAgaW5wdXQxOwogICAgflRlc3RDYXNlKCkgeyBkZWxldGUgaW5wdXQxOyBkZWxldGUgZXhwVmFsO30KICAgIH0gVGVzdENhc2U7CgogICAgVGVzdENhc2UgYXJyVGVzdENhc2VbXSA9CiAgICB7CiAgICAgICAgeyJvbmx5IGxvd2VyY2FzZSIsbmV3IE9TdHJpbmcoa1Rlc3RTdHI0KSxuZXcgT1N0cmluZyhrVGVzdFN0cjUpfSwKICAgICAgICB7Im1peGVkIGNhc2VzIixuZXcgT1N0cmluZyhrVGVzdFN0cjQpLG5ldyBPU3RyaW5nKGtUZXN0U3RyMyl9LAogICAgICAgIHsibWljZWQgY2FzZXMiLG5ldyBPU3RyaW5nKGtUZXN0U3RyNCksbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKX0sCiAgICAgICAgeyJvbmx5IHVwcGVyY2FzZSIsbmV3IE9TdHJpbmcoa1Rlc3RTdHI0KSxuZXcgT1N0cmluZyhrVGVzdFN0cjQpfSwKICAgICAgICB7ImVtcHR5IHN0cmluZyIsbmV3IE9TdHJpbmcoIiIpLG5ldyBPU3RyaW5nKCIiKX0sCiAgICAgICAgeyJzdHJpbmcgY29uc3RydWN0ZWQgYnkgZGVmYXVsdCBjb25zdHJ1Y3RvciIsCiAgICAgICAgICAgIG5ldyBPU3RyaW5nKCksbmV3IE9TdHJpbmcoKX0KICAgIH07CgogICAgc2FsX0Jvb2wgcmVzID0gc2FsX1RydWU7CiAgICBzYWxfdUludDMyIGk7CgogICAgZm9yKGkgPSAwOyBpIDwgKHNpemVvZiAoYXJyVGVzdENhc2UpKS8oc2l6ZW9mIChUZXN0Q2FzZSkpOyBpKyspCiAgICB7CiAgICAgICAgT1N0cmluZyBzdHIgPSBhcnJUZXN0Q2FzZVtpXS5pbnB1dDEtPnRvQXNjaWlVcHBlckNhc2UoKTsKICAgICAgICBzYWxfQm9vbCBsYXN0UmVzID0gKHN0ciA9PSAqYXJyVGVzdENhc2VbaV0uZXhwVmFsKTsKCiAgICAgICAgY19ydGxfdHJlc19zdGF0ZQogICAgICAgICgKICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgIGxhc3RSZXMsCiAgICAgICAgICAgIGFyclRlc3RDYXNlW2ldLmNvbW1lbnRzLAogICAgICAgICAgICBjcmVhdGVOYW1lKCBwTWV0aCwgInRvQXNjaWlMb3dlckNhc2UiLCBpKQogICAgICAgICk7CgogICAgICAgIHJlcyAmPSBsYXN0UmVzOwogICAgfQogICAgY19ydGxfdHJlc19zdGF0ZV9lbmQoaFJ0bFRlc3RSZXN1bHQsICJ0b0FzY2lpVXBwZXJDYXNlIik7CgovLyAgICByZXR1cm4gKCByZXMgKTsKfQoKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIHRlc3RpbmcgdGhlIG1ldGhvZCB0cmltKCkKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZXh0ZXJuICJDIiB2b2lkIC8qIHNhbF9Cb29sICovIFNBTF9DQUxMIHRlc3RfcnRsX09TdHJpbmdfdHJpbSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUZXN0UmVzdWx0IGhSdGxUZXN0UmVzdWx0ICkKewogICAgc2FsX0NoYXIgbWV0aE5hbWVbTUFYQlVGTEVOR1RIXTsKICAgIHNhbF9DaGFyKiBwTWV0aCA9bWV0aE5hbWU7CgogICAgY19ydGxfdHJlc19zdGF0ZV9zdGFydChoUnRsVGVzdFJlc3VsdCwgInRyaW0iKTsKICAgIHR5cGVkZWYgc3RydWN0IFRlc3RDYXNlCiAgICB7CiAgICBzYWxfQ2hhciogICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzOwogICAgT1N0cmluZyogICAgICAgICAgICAgICAgICAgICBleHBWYWw7CiAgICBPU3RyaW5nKiAgICAgICAgICAgICAgICAgICAgIGlucHV0MTsKICAgIH5UZXN0Q2FzZSgpIHsgZGVsZXRlIGlucHV0MTsgZGVsZXRlIGV4cFZhbDt9CiAgICB9IFRlc3RDYXNlOwoKICAgIFRlc3RDYXNlIGFyclRlc3RDYXNlW10gPQogICAgewogICAgICAgIHsicmVtb3ZlcyBzcGFjZSBmcm9tIHRoZSBmcm9udCIsbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKSwKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHIxMCl9LAogICAgICAgIHsicmVtb3ZlcyBzcGFjZSBmcm9tIHRoZSBlbmQiLG5ldyBPU3RyaW5nKGtUZXN0U3RyMSksCiAgICAgICAgICAgIG5ldyBPU3RyaW5nKGtUZXN0U3RyMTEpfSwKICAgICAgICB7InJlbW92ZXMgc3BhY2UgZnJvbSB0aGUgZnJvbnQgYW5kIGVuZCIsbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKSwKICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHIxMil9LAogICAgICAgIHsicmVtb3ZlcyBzZXZlcmFsIHNwYWNlcyBmcm9tIHRoZSBlbmQiLG5ldyBPU3RyaW5nKGtUZXN0U3RyMSksCiAgICAgICAgICAgIG5ldyBPU3RyaW5nKGtUZXN0U3RyMTMpfSwKICAgICAgICB7InJlbW92ZXMgc2V2ZXJhbCBzcGFjZXMgZnJvbSB0aGUgZnJvbnQiLG5ldyBPU3RyaW5nKGtUZXN0U3RyMSksCiAgICAgICAgICAgIG5ldyBPU3RyaW5nKGtUZXN0U3RyMTQpfSwKICAgICAgICB7InJlbW92ZXMgc2V2ZXJhbCBzcGFjZXMgZnJvbSB0aGUgZnJvbnQgYW5kIG9uZSBmcm9tIHRoZSBlbmQiLAogICAgICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjEpLAogICAgICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjE1KX0sCiAgICAgICAgeyJyZW1vdmVzIG9uZSBzcGFjZSBmcm9tIHRoZSBmcm9udCBhbmQgc2V2ZXJhbCBmcm9tIHRoZSBlbmQiLAogICAgICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjEpLAogICAgICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjE2KX0sCiAgICAgICAgeyJyZW1vdmVzIHNldmVyYWwgc3BhY2VzIGZyb20gdGhlIGZyb250IGFuZCBlbmQiLAogICAgICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjEpLAogICAgICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjE3KX0sCiAgICAgICAgeyJyZW1vdmVzIGNoYXJhY3RlcnMgdGhhdCBoYXZlIGNvZGVzIDw9IDMyIixuZXcgT1N0cmluZyhrVGVzdFN0cjIwKSwKICAgICAgICAgICAgbmV3IE9TdHJpbmcoIlwxXDNcNVw3XDExXDEzXDE1XDE3c3VuXDIxXDIzXDI1XDI3XDMxXDMzXDQwIil9LAogICAgICAgIHsibm8gc3BhY2VzIixuZXcgT1N0cmluZyhrVGVzdFN0cjgpLG5ldyBPU3RyaW5nKGtUZXN0U3RyOCl9CiAgICB9OwoKICAgIHNhbF9Cb29sIHJlcyA9IHNhbF9UcnVlOwogICAgc2FsX3VJbnQzMiBpOwoKICAgIGZvcihpID0gMDsgaSA8IChzaXplb2YgKGFyclRlc3RDYXNlKSkvKHNpemVvZiAoVGVzdENhc2UpKTsgaSsrKQogICAgewogICAgICAgIE9TdHJpbmcgc3RyUmVzID0gYXJyVGVzdENhc2VbaV0uaW5wdXQxLT50cmltKCk7CiAgICAgICAgc2FsX0Jvb2wgbGFzdFJlcyA9IChzdHJSZXMgPT0gKmFyclRlc3RDYXNlW2ldLmV4cFZhbCk7CgogICAgICAgIGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAoCiAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgICAgICBsYXN0UmVzLAogICAgICAgICAgICBhcnJUZXN0Q2FzZVtpXS5jb21tZW50cywKICAgICAgICAgICAgY3JlYXRlTmFtZSggcE1ldGgsICJ0cmltIiwgaSkKICAgICAgICApOwoKICAgICAgICByZXMgJj0gbGFzdFJlczsKCiAgICB9CgogICAgY19ydGxfdHJlc19zdGF0ZV9lbmQoaFJ0bFRlc3RSZXN1bHQsICJ0cmltIik7Ci8vICAgIHJldHVybiAoIHJlcyApOwp9CgoKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIHRlc3RpbmcgdGhlIG1ldGhvZCB2YWx1ZU9mKCBzYWxfQm9vbCBiICkKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc2FsX0Jvb2wgU0FMX0NBTEwgdGVzdF9ydGxfT1N0cmluZ192YWx1ZU9mX3NhbF9Cb29sKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGVzdFJlc3VsdCBoUnRsVGVzdFJlc3VsdCApCnsKICAgIHNhbF9DaGFyIG1ldGhOYW1lW01BWEJVRkxFTkdUSF07CiAgICBzYWxfQ2hhciogcE1ldGggPW1ldGhOYW1lOwoKICAgIHR5cGVkZWYgc3RydWN0IFRlc3RDYXNlCiAgICB7CiAgICBzYWxfQ2hhciogICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzOwogICAgc2FsX0Jvb2wgICAgICAgICAgICAgICAgICAgICBpbnB1dDE7CiAgICBPU3RyaW5nKiAgICAgICAgICAgICAgICAgICAgIGV4cFZhbDsKICAgIH5UZXN0Q2FzZSgpIHtkZWxldGUgZXhwVmFsO30KICAgIH0gVGVzdENhc2U7CgogICAgVGVzdENhc2UgYXJyVGVzdENhc2VbXSA9CiAgICB7CiAgICAgICAgeyJ0cnVlIixzYWxfVHJ1ZSxuZXcgT1N0cmluZygidHJ1ZSIpfSwKICAgICAgICB7ImZhbHNlIixzYWxfRmFsc2UsIG5ldyBPU3RyaW5nKCJmYWxzZSIpfQogICAgfTsKCiAgICBzYWxfQm9vbCByZXMgPSBzYWxfVHJ1ZTsKICAgIHNhbF91SW50MzIgaTsKCiAgICBmb3IoaSA9IDA7IGkgPCAoc2l6ZW9mIChhcnJUZXN0Q2FzZSkpLyhzaXplb2YgKFRlc3RDYXNlKSk7IGkrKykKICAgIHsKICAgICAgICA6OnJ0bDo6T1N0cmluZyBhU3RyMTsKICAgICAgICBhU3RyMSA9IGFTdHIxLnZhbHVlT2YoIGFyclRlc3RDYXNlW2ldLmlucHV0MSApOwogICAgICAgIHNhbF9Cb29sIGxhc3RSZXMgPSAoYXJyVGVzdENhc2VbaV0uZXhwVmFsLT5jb21wYXJlVG8oYVN0cjEpID09IDApOwoKICAgICAgICBjX3J0bF90cmVzX3N0YXRlCiAgICAgICAgKAogICAgICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICAgICAgbGFzdFJlcywKICAgICAgICAgICAgYXJyVGVzdENhc2VbaV0uY29tbWVudHMsCiAgICAgICAgICAgIGNyZWF0ZU5hbWUoIHBNZXRoLCAidmFsdWVvZl9ib29sIiwgaSkKICAgICAgICApOwoKICAgICAgICByZXMgJj0gbGFzdFJlczsKCiAgICB9CgogICAgcmV0dXJuICggcmVzICk7Cn0KCnNhbF9Cb29sIFNBTF9DQUxMIHRlc3RfcnRsX09TdHJpbmdfdmFsdWVPZl9zYWxfQ2hhciggCiAgICAgICAgICAgICAgICAgICAgaFRlc3RSZXN1bHQgaFJ0bFRlc3RSZXN1bHQgKQp7CiAgICBzYWxfQ2hhciBtZXRoTmFtZVtNQVhCVUZMRU5HVEhdOwogICAgc2FsX0NoYXIqIHBNZXRoID1tZXRoTmFtZTsKCiAgICB0eXBlZGVmIHN0cnVjdCBUZXN0Q2FzZQogICAgewogICAgc2FsX0NoYXIqICAgICAgICAgICAgICAgICAgICBjb21tZW50czsKICAgIHNhbF9DaGFyICAgICAgICAgICAgICAgICAgICAgaW5wdXQxOwogICAgT1N0cmluZyogICAgICAgICAgICAgICAgICAgICBleHBWYWw7CiAgICB+VGVzdENhc2UoKSB7ZGVsZXRlIGV4cFZhbDt9CiAgICB9IFRlc3RDYXNlOwoKICAgIFRlc3RDYXNlIGFyclRlc3RDYXNlW10gPQogICAgewogICAgICAgIHsiQSIsJ0EnLG5ldyBPU3RyaW5nKCJBIil9LAogICAgICAgIHsiYSIsJ2EnLCBuZXcgT1N0cmluZygiYSIpfSwKICAgICAgICB7IjAiLCcwJywgbmV3IE9TdHJpbmcoIjAiKX0sCiAgICAgICAgeyItIiwnLScsIG5ldyBPU3RyaW5nKCItIil9LAogICAgICAgIHsiXyIsJ18nLCBuZXcgT1N0cmluZygiXyIpfSwKICAgICAgICB7InwiLCd8JywgbmV3IE9TdHJpbmcoInwiKX0sCiAgICAgICAgeyI/IiwnPycsIG5ldyBPU3RyaW5nKCI/Iil9LAogICAgICAgIHsiPyIsJz8nLCBuZXcgT1N0cmluZygiPyIpfSwKICAgICAgICB7IlxuIiwnXG4nLCBuZXcgT1N0cmluZygiXG4iKX0sCiAgICAgICAgeyJcJyIsJ1wnJywgbmV3IE9TdHJpbmcoIlwnIil9LAogICAgICAgIHsiXCIiLCdcIicsIG5ldyBPU3RyaW5nKCJcIiIpfQogICAgICAgIAogICAgfTsKCiAgICBzYWxfQm9vbCByZXMgPSBzYWxfVHJ1ZTsKICAgIHNhbF91SW50MzIgaTsKCiAgICBmb3IoaSA9IDA7IGkgPCAoc2l6ZW9mIChhcnJUZXN0Q2FzZSkpLyhzaXplb2YgKFRlc3RDYXNlKSk7IGkrKykKICAgIHsKICAgICAgICA6OnJ0bDo6T1N0cmluZyBhU3RyMTsKICAgICAgICBhU3RyMSA9IGFTdHIxLnZhbHVlT2YoIGFyclRlc3RDYXNlW2ldLmlucHV0MSApOwogICAgICAgIHNhbF9Cb29sIGxhc3RSZXMgPSAoYXJyVGVzdENhc2VbaV0uZXhwVmFsLT5jb21wYXJlVG8oYVN0cjEpID09IDApOwoKICAgICAgICBjX3J0bF90cmVzX3N0YXRlCiAgICAgICAgKAogICAgICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICAgICAgbGFzdFJlcywKICAgICAgICAgICAgYXJyVGVzdENhc2VbaV0uY29tbWVudHMsCiAgICAgICAgICAgIGNyZWF0ZU5hbWUoIHBNZXRoLCAidmFsdWVvZl9jaGFyIiwgaSkKICAgICAgICApOwoKICAgICAgICByZXMgJj0gbGFzdFJlczsKCiAgICB9CgogICAgcmV0dXJuICggcmVzICk7Cn0KCi8qKgogKiBDYWxscyB0aGUgbWV0aG9kIHZhbHVlT2YoVCwgcmFkaXgpIGFuZCBjb21wYXJlcwogKiByZXR1cm5lZCBzdHJpbmdzIHdpdGggc3RyaW5ncyB0aGF0IHBhc3NlZCBpbiB0aGUgYXJyYXkgcmVzQXJyYXkuCiAqCiAqIEBwYXJhbSBULCB0eXBlIG9mIGFyZ3VtZW50LCBwYXNzZWQgdG8gdmFsdWVPZgogKiBAcGFyYW0gcmVzQXJyYXksIGFycmF5IG9mIHJlc3VsdCBzdHJpbmdzIHRvIGNvbXBhcmUgdG8KICogQHBhcmFtIG4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgYXJyYXkgcmVzQXJyYXkgKHRlc3RjYXNlcykKICogQHBhcmFtIHBUZXN0UmVzdWx0IHRoZSBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgVGVzdFJlc3VsdAogKiBAcGFyYW0gaW5BcnJheSBbb3B0aW9uYWxdLCBhcnJheSBvZiB2YWx1ZSB0aGF0IGlzIHBhc3NlZCBhcyBmaXJzdCBhcmd1bWVudAogKiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byB2YWx1ZU9mCiAqCiAqIEByZXR1cm4gdHJ1ZSwgaWYgYWxsIHJldHVybmVkIHN0cmluZ3MgYXJlIGVxdWFsIHRvIGNvcnJlc3BvbmRpbmcgc3RyaW5nIGluCiAqICAgICAgICAgICAgICAgcmVzQXJyYXkgZWxzZSwgZmFsc2UuCiAqLwp0ZW1wbGF0ZSA8Y2xhc3MgVD4Kc2FsX0Jvb2wgdGVzdF92YWx1ZU9mKCBjb25zdCBjaGFyKiogcmVzQXJyYXksIGludCBuLCBzYWxfSW50MTYgcmFkaXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGVzdFJlc3VsdCBoUnRsVGVzdFJlc3VsdCwgY29uc3QgVCAqaW5BcnJheSApCnsKICAgIHNhbF9Cb29sIGJSZXMgPSBzYWxfVHJ1ZTsKCiAgICBzYWxfQ2hhciBtZXRoTmFtZVtNQVhCVUZMRU5HVEhdOwogICAgc2FsX0NoYXIqIHBNZXRoID0gbWV0aE5hbWU7CiAgICBzYWxfSW50MzIgaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQogICAgewogICAgICAgIDo6cnRsOjpPU3RyaW5nIGFTdHIxOwogICAgICAgIDo6cnRsOjpPU3RyaW5nIGFTdHIyKCByZXNBcnJheVtpXSApOwoKICAgICAgICBpZiAoaW5BcnJheSA9PSAwKQogICAgICAgICAgICBhU3RyMSA9IDo6cnRsOjpPU3RyaW5nOjp2YWx1ZU9mKChUKWksIHJhZGl4KTsKICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBpZiAoIGluQXJyYXlbaV0gPCAwICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYVN0cjIgPSAiLSI7CiAgICAgICAgICAgICAgICBhU3RyMiArPSByZXNBcnJheVtpXTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhU3RyMSA9IDo6cnRsOjpPU3RyaW5nOjp2YWx1ZU9mKChUKWluQXJyYXlbaV0sIHJhZGl4KTsKICAgICAgICB9CgogICAgICAgIGJSZXMgJj0gY19ydGxfdHJlc19zdGF0ZQogICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgICAgICAgICAgICAgIGFTdHIyLmNvbXBhcmVUbyhhU3RyMSkgPT0gMCwKICAgICAgICAgICAgICAgICAgICAoc2FsX0NoYXIqKXJlc0FycmF5W2ldLAogICAgICAgICAgICAgICAgICAgIGNyZWF0ZU5hbWUoIHBNZXRoLCAidmFsdWVPZiIsIGkgKQogICAgICAgICAgICAgICAgKTsKICAgIH0KCiAgICByZXR1cm4gKGJSZXMpOwp9CgoKI2RlZmluZSB0ZXN0X3ZhbHVlT2ZfSW50MzIgICAgICB0ZXN0X3ZhbHVlT2Y8c2FsX0ludDMyPgojZGVmaW5lIHRlc3RfdmFsdWVPZl9JbnQ2NCAgICAgIHRlc3RfdmFsdWVPZjxzYWxfSW50NjQ+Ci8vIExMQTogI2RlZmluZSB0ZXN0X3ZhbHVlT2ZfZmxvYXQgICAgICB0ZXN0X3ZhbHVlT2Y8ZmxvYXQ+Ci8vIExMQTogI2RlZmluZSB0ZXN0X3ZhbHVlT2ZfZG91YmxlICAgICB0ZXN0X3ZhbHVlT2Y8ZG91YmxlPgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gdGVzdGluZyB0aGUgbWV0aG9kIHZhbHVlT2YoIHNhbF9JbnQzMiBpLCBzYWxfSW50MTYgcmFkaXg9MiApCi8vIHRlc3RpbmcgdGhlIG1ldGhvZCB2YWx1ZU9mKCBzYWxfSW50MzIgaSwgc2FsX0ludDE2IHJhZGl4PTggKQovLyB0ZXN0aW5nIHRoZSBtZXRob2QgdmFsdWVPZiggc2FsX0ludDMyIGksIHNhbF9JbnQxNiByYWRpeD0xMCApCi8vIHRlc3RpbmcgdGhlIG1ldGhvZCB2YWx1ZU9mKCBzYWxfSW50MzIgaSwgc2FsX0ludDE2IHJhZGl4PTE2ICkKLy8gdGVzdGluZyB0aGUgbWV0aG9kIHZhbHVlT2YoIHNhbF9JbnQzMiBpLCBzYWxfSW50MTYgcmFkaXg9MzYgKQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzYWxfQm9vbCBTQUxfQ0FMTCB0ZXN0X3J0bF9PU3RyaW5nX3ZhbHVlT2ZfSW50MzIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUZXN0UmVzdWx0IGhSdGxUZXN0UmVzdWx0ICkKewogICAgc2FsX0Jvb2wgYlJlcyA9IHNhbF9GYWxzZTsKCiAgICBiUmVzID0gY19ydGxfdHJlc19zdGF0ZQogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICAgICAgICAgIHRlc3RfdmFsdWVPZl9JbnQzMigoY29uc3QgY2hhcioqKWtCaW5hcnlOdW1zU3RyLAogICAgICAgICAgICAgICAgICAgICAgICBrQmluYXJ5TnVtc0NvdW50LCBrUmFkaXhCaW5hcnksIGhSdGxUZXN0UmVzdWx0LCAwICksCiAgICAgICAgICAgICAgICAia1JhZGl4QmluYXJ5IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU9mKHNhbF9JbnQzMiwgcmFkaXggMikiCiAgICAgICAgICAgICk7CgoKICAgIGJSZXMgJj0gY19ydGxfdHJlc19zdGF0ZQogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICAgICAgICAgIHRlc3RfdmFsdWVPZl9JbnQzMigoY29uc3QgY2hhcioqKWtPY3RvbE51bXNTdHIsCiAgICAgICAgICAgICAgICAgICAgICAgIGtPY3RvbE51bXNDb3VudCwga1JhZGl4T2N0b2wsIGhSdGxUZXN0UmVzdWx0LCAwKSwKICAgICAgICAgICAgICAgICJrUmFkaXhPY3RvbCIsCiAgICAgICAgICAgICAgICAidmFsdWVPZihzYWxfSW50MzIsIHJhZGl4IDgpIgogICAgICAgICAgICApOwoKICAgIGJSZXMgJj0gY19ydGxfdHJlc19zdGF0ZQogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICAgICAgICAgIHRlc3RfdmFsdWVPZl9JbnQzMigoY29uc3QgY2hhcioqKWtEZWNpbWFsTnVtc1N0ciwKICAgICAgICAgICAgICAgICAgICAgICAga0RlY2ltYWxOdW1zQ291bnQsIGtSYWRpeERlY2ltYWwsIGhSdGxUZXN0UmVzdWx0LCAwKSwKICAgICAgICAgICAgICAgICJrUmFkaXhEZWNpbWFsIiwKICAgICAgICAgICAgICAgICJ2YWx1ZU9mKHNhbF9JbnQzMiwgcmFkaXggMTApIgogICAgICAgICAgICApOwoKICAgIGJSZXMgJj0gY19ydGxfdHJlc19zdGF0ZQogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICAgICAgICAgIHRlc3RfdmFsdWVPZl9JbnQzMigoY29uc3QgY2hhcioqKWtIZXhEZWNpbWFsTnVtc1N0ciwKICAgICAgICAgICAgICAgIGtIZXhEZWNpbWFsTnVtc0NvdW50LCBrUmFkaXhIZXhkZWNpbWFsLCBoUnRsVGVzdFJlc3VsdCwgMCksCiAgICAgICAgICAgICAgICAia1JhZGl4SGV4ZGVjaW1hbCIsCiAgICAgICAgICAgICAgICAidmFsdWVPZihzYWxfSW50MzIsIHJhZGl4IDE2KSIKICAgICAgICAgICAgKTsKCiAgICBiUmVzICY9IGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgICAgICB0ZXN0X3ZhbHVlT2ZfSW50MzIoKGNvbnN0IGNoYXIqKilrQmFzZTM2TnVtc1N0ciwKICAgICAgICAgICAgICAgICAgICAgICAga0Jhc2UzNk51bXNDb3VudCwga1JhZGl4QmFzZTM2LCBoUnRsVGVzdFJlc3VsdCwgMCksCiAgICAgICAgICAgICAgICAia1JhZGl4QmFzZTM2IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU9mKHNhbF9JbnQzMiwgcmFkaXggMzYpIgogICAgICAgICAgICApOwoKCiAgICByZXR1cm4gKCBiUmVzICk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIHRlc3RpbmcgdGhlIG1ldGhvZCB2YWx1ZU9mKCBzYWxfSW50MzIgbCwgc2FsX0ludDMyIHJhZGl4PTIgKQovLyB3aGVyZSBsID0gbGFyZ2UgY29uc3RhbnRzCi8vIHRlc3RpbmcgdGhlIG1ldGhvZCB2YWx1ZU9mKCBzYWxfSW50MzIgbCwgc2FsX0ludDMyIHJhZGl4PTggKQovLyB3aGVyZSBsID0gbGFyZ2UgY29uc3RhbnRzCi8vIHRlc3RpbmcgdGhlIG1ldGhvZCB2YWx1ZU9mKCBzYWxfSW50MzIgbCwgc2FsX0ludDMyIHJhZGl4PTEwICkKLy8gd2hlcmUgbCA9IGxhcmdlIGNvbnN0YW50cwovLyB0ZXN0aW5nIHRoZSBtZXRob2QgdmFsdWVPZiggc2FsX0ludDMyIGwsIHNhbF9JbnQzMiByYWRpeD0xNiApCi8vIHdoZXJlIGwgPSBsYXJnZSBjb25zdGFudHMKLy8gdGVzdGluZyB0aGUgbWV0aG9kIHZhbHVlT2YoIHNhbF9JbnQzMiBsLCBzYWxfSW50MzIgcmFkaXg9MzYgKQovLyB3aGVyZSBsID0gbGFyZ2UgY29uc3RhbnRzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnNhbF9Cb29sIFNBTF9DQUxMIHRlc3RfcnRsX09TdHJpbmdfdmFsdWVPZl9JbnQzMl9Cb3VuZGVyaWVzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGVzdFJlc3VsdCBoUnRsVGVzdFJlc3VsdCApCnsKICAgIHNhbF9Cb29sIGJSZXMgPSBzYWxfRmFsc2U7CgogICAgYlJlcyA9ICBjX3J0bF90cmVzX3N0YXRlCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgICAgICAgICAgdGVzdF92YWx1ZU9mX0ludDMyKChjb25zdCBjaGFyKiopa0JpbmFyeU1heE51bXNTdHIsCiAgICAgICAgICAgICAgICBrSW50MzJNYXhOdW1zQ291bnQsIGtSYWRpeEJpbmFyeSwgaFJ0bFRlc3RSZXN1bHQsIAogICAgICAgICAgICAgICAgICAgIGtJbnQzMk1heE51bXMpLAogICAgICAgICAgICAgICAgImtSYWRpeEJpbmFyeSIsCiAgICAgICAgICAgICAgICAidmFsdWVPZihzYWxJbnQzMiwgcmFkaXggMikgQm91bmRlcmllcyIKICAgICAgICAgICAgKTsKCiAgICBiUmVzICY9IGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgICAgICB0ZXN0X3ZhbHVlT2ZfSW50MzIoKGNvbnN0IGNoYXIqKilrT2N0b2xNYXhOdW1zU3RyLAogICAgICAgICAgICAgICAgIGtJbnQzMk1heE51bXNDb3VudCwga1JhZGl4T2N0b2wsIGhSdGxUZXN0UmVzdWx0LCAKICAgICAgICAgICAgICAgICAgICBrSW50MzJNYXhOdW1zKSwKICAgICAgICAgICAgICAgICJrUmFkaXhPY3RvbCIsCiAgICAgICAgICAgICAgICAidmFsdWVPZihzYWxJbnQzMiwgcmFkaXggOCkgQm91bmRlcmllcyIKICAgICAgICAgICAgKTsKCiAgICBiUmVzICY9IGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgICAgICB0ZXN0X3ZhbHVlT2ZfSW50MzIoKGNvbnN0IGNoYXIqKilrRGVjaW1hbE1heE51bXNTdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtJbnQzMk1heE51bXNDb3VudCwga1JhZGl4RGVjaW1hbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsIGtJbnQzMk1heE51bXMpLAogICAgICAgICAgICAgICAgImtSYWRpeERlY2ltYWwiLAogICAgICAgICAgICAgICAgInZhbHVlT2Yoc2FsSW50MzIsIHJhZGl4IDEwKSBCb3VuZGVyaWVzIgogICAgICAgICAgICApOwoKICAgIGJSZXMgJj0gY19ydGxfdHJlc19zdGF0ZQogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICAgICAgICAgIHRlc3RfdmFsdWVPZl9JbnQzMigoY29uc3QgY2hhcioqKWtIZXhEZWNpbWFsTWF4TnVtc1N0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSW50MzJNYXhOdW1zQ291bnQsIGtSYWRpeEhleGRlY2ltYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsIGtJbnQzMk1heE51bXMpLAogICAgICAgICAgICAgICAgImtSYWRpeEhleGRlY2ltYWwiLAogICAgICAgICAgICAgICAgInZhbHVlT2Yoc2FsSW50MzIsIHJhZGl4IDE2KSBCb3VuZGVyaWVzIgogICAgICAgICAgICApOwoKICAgIGJSZXMgJj0gY19ydGxfdHJlc19zdGF0ZQogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICAgICAgICAgIHRlc3RfdmFsdWVPZl9JbnQzMigoY29uc3QgY2hhcioqKWtCYXNlMzZNYXhOdW1zU3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSW50MzJNYXhOdW1zQ291bnQsIGtSYWRpeEJhc2UzNiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsIGtJbnQzMk1heE51bXMpLAogICAgICAgICAgICAgICAgImtSYWRpeEJhc2UzNiIsCiAgICAgICAgICAgICAgICAidmFsdWVPZihzYWxJbnQzMiwgcmFkaXggMzYpIEJvdW5kZXJpZXMiCiAgICAgICAgICAgICk7CgogICAgcmV0dXJuICggYlJlcyApOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyB0ZXN0aW5nIHRoZSBtZXRob2QgdmFsdWVPZiggc2FsX0ludDMyIGksIHNhbF9JbnQxNiByYWRpeD0yICkKLy8gZm9yIG5lZ2F0aXZlIHZhbHVlCi8vIHRlc3RpbmcgdGhlIG1ldGhvZCB2YWx1ZU9mKCBzYWxfSW50MzIgaSwgc2FsX0ludDE2IHJhZGl4PTggKQovLyBmb3IgbmVnYXRpdmUgdmFsdWUKLy8gdGVzdGluZyB0aGUgbWV0aG9kIHZhbHVlT2YoIHNhbF9JbnQzMiBpLCBzYWxfSW50MTYgcmFkaXg9MTAgKQovLyBmb3IgbmVnYXRpdmUgdmFsdWUKLy8gdGVzdGluZyB0aGUgbWV0aG9kIHZhbHVlT2YoIHNhbF9JbnQzMiBpLCBzYWxfSW50MTYgcmFkaXg9MTYgKQovLyBmb3IgbmVnYXRpdmUgdmFsdWUKLy8gdGVzdGluZyB0aGUgbWV0aG9kIHZhbHVlT2YoIHNhbF9JbnQzMiBpLCBzYWxfSW50MTYgcmFkaXg9MzYgKQovLyBmb3IgbmVnYXRpdmUgdmFsdWUKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc2FsX0Jvb2wgU0FMX0NBTEwgdGVzdF9ydGxfT1N0cmluZ192YWx1ZU9mX0ludDMyX05lZ2F0aXZlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGVzdFJlc3VsdCBoUnRsVGVzdFJlc3VsdCApCnsKICAgIHNhbF9Cb29sIGJSZXMgPSBzYWxfRmFsc2U7CiAgICBzYWxfSW50MzIgaW5BcnJba0Jhc2UzNk51bXNDb3VudF07CiAgICBzYWxfSW50MzIgaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwga0Jhc2UzNk51bXNDb3VudDsgaSsrICkKICAgICAgICBpbkFycltpXSA9IC1pOwoKICAgIGJSZXMgPSAgY19ydGxfdHJlc19zdGF0ZQogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICAgICAgICAgIHRlc3RfdmFsdWVPZl9JbnQzMigga0JpbmFyeU51bXNTdHIsIGtCaW5hcnlOdW1zQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSYWRpeEJpbmFyeSwgaFJ0bFRlc3RSZXN1bHQsIGluQXJyICksCiAgICAgICAgICAgICAgICAibmVnYXRpdmUgSW50MzIsIGtSYWRpeEJpbmFyeSIsCiAgICAgICAgICAgICAgICAidmFsdWVPZiggbmVnYXRpdmUgSW50MzIsIHJhZGl4IDIgKSIKICAgICAgICAgICAgKTsKCiAgICBiUmVzICY9IGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgICAgICB0ZXN0X3ZhbHVlT2ZfSW50MzIoIGtPY3RvbE51bXNTdHIsIGtPY3RvbE51bXNDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1JhZGl4T2N0b2wsIGhSdGxUZXN0UmVzdWx0LCBpbkFyciApLAogICAgICAgICAgICAgICAgIm5lZ2F0aXZlIEludDMyLCBrUmFkaXhPY3RvbCIsCiAgICAgICAgICAgICAgICAidmFsdWVPZiggbmVnYXRpdmUgSW50MzIsIHJhZGl4IDggKSIKICAgICAgICAgICAgKTsKCgogICAgYlJlcyAmPSBjX3J0bF90cmVzX3N0YXRlCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgICAgICAgICAgdGVzdF92YWx1ZU9mX0ludDMyKCBrRGVjaW1hbE51bXNTdHIsIGtEZWNpbWFsTnVtc0NvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSYWRpeERlY2ltYWwsIGhSdGxUZXN0UmVzdWx0LCBpbkFyciApLAogICAgICAgICAgICAgICAgIm5lZ2F0aXZlIEludDMyLCBrUmFkaXhEZWNpbWFsIiwKICAgICAgICAgICAgICAgICJ2YWx1ZU9mKCBuZWdhdGl2ZSBJbnQzMiwgcmFkaXggMTAgKSIKICAgICAgICAgICAgKTsKCiAgICBiUmVzICY9IGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgICAgICB0ZXN0X3ZhbHVlT2ZfSW50MzIoIGtIZXhEZWNpbWFsTnVtc1N0ciwga0hleERlY2ltYWxOdW1zQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1JhZGl4SGV4ZGVjaW1hbCwgaFJ0bFRlc3RSZXN1bHQsIGluQXJyICksCiAgICAgICAgICAgICAgICAibmVnYXRpdmUgSW50MzIsIGtSYWRpeEhleGRlY2ltYWwiLAogICAgICAgICAgICAgICAgInZhbHVlT2YoIG5lZ2F0aXZlIEludDMyLCByYWRpeCAxNiApIgogICAgICAgICAgICApOwoKCiAgICBiUmVzICY9IGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgICAgICB0ZXN0X3ZhbHVlT2ZfSW50MzIoIGtCYXNlMzZOdW1zU3RyLCBrQmFzZTM2TnVtc0NvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1JhZGl4QmFzZTM2LCBoUnRsVGVzdFJlc3VsdCwgaW5BcnIgKSwKICAgICAgICAgICAgICAgICJuZWdhdGl2ZSBJbnQzMiwga1JhZGl4QmFzZTM2IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU9mKCBuZWdhdGl2ZSBJbnQzMiwgcmFkaXggMzYgKSIKICAgICAgICAgICAgKTsKCiAgICByZXR1cm4gKCBiUmVzICk7Cn0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gdGVzdGluZyB0aGUgbWV0aG9kIHZhbHVlT2YoIHNhbF9JbnQzMiBsLCBzYWxfSW50MzIgcmFkaXggKSB3aGVyZSByYWRpeCA9IC01Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnNhbF9Cb29sIFNBTF9DQUxMIHRlc3RfcnRsX09TdHJpbmdfdmFsdWVPZl9JbnQzMl9Xcm9uZ1JhZGl4KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGVzdFJlc3VsdCBoUnRsVGVzdFJlc3VsdCApCnsKICAgIHNhbF9Cb29sIGJSZXMgPSBzYWxfRmFsc2U7CgogICAgc2FsX0ludDMyIGludFZhbCA9IDExOwoKICAgIDo6cnRsOjpPU3RyaW5nIGFTdHIxOwogICAgOjpydGw6Ok9TdHJpbmcgYVN0cjIoIjExIik7CgogICAgYVN0cjEgPSBhU3RyMS52YWx1ZU9mKCBpbnRWYWwsIC01ICk7CgogICAgYlJlcyA9IGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgICAgICBhU3RyMi5jb21wYXJlVG8oIGFTdHIxICkgPT0gMCwKICAgICAgICAgICAgICAgICJpZiByYWRpeCBub3QgdmFsaWQgdGhlbiByYWRpeCBtdXN0IGJlIDEwIiwKICAgICAgICAgICAgICAgICJ2YWx1ZU9mKHNhbF9JbnQzMiwgc2FsX0ludDMyIHJhZGl4KTogcmFkaXggPSAtNSIKICAgICAgICAgICAgKTsKCiAgICByZXR1cm4gKGJSZXMpOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyB0ZXN0aW5nIHRoZSBtZXRob2QgdmFsdWVPZiggc2FsX0ludDMyIGwsIHNhbF9JbnQzMiByYWRpeCApCi8vIHdoZXJlIGwgPSAtMjE0NzQ4MzY0OCAoc21hbGxlc3QgbmVnYXRpdmUgdmFsdWUpCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnNhbF9Cb29sIFNBTF9DQUxMIHRlc3RfcnRsX09TdHJpbmdfdmFsdWVPZl9JbnQzMl9TbWFsbGVzdE5lZ2F0aXZlVmFsdWUoCiAgICBoVGVzdFJlc3VsdCAgaFJ0bFRlc3RSZXN1bHQpCnsKICAgIC8vIFN0YW5kYXJkLWNvbmZvcm1pbmcgd2F5IHRvIGFzc2lnbiAtMjE0NzQ4MzY0OCB0byBuOgogICAgc2FsX0ludDMyIG4gPSAtMTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgMzI7ICsraSkKICAgICAgICBuICo9IDI7CiAgICByZXR1cm4gY19ydGxfdHJlc19zdGF0ZQogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICAgICAgICAgIDo6cnRsOjpPU3RyaW5nOjp2YWx1ZU9mKG4pID09ICItMjE0NzQ4MzY0OCIsCiAgICAgICAgICAgICAgICAiLTIxNDc0ODM2NDgiLAogICAgICAgICAgICAgICAgInZhbHVlT2Yoc2FsX0ludDMyIC0yMTQ3NDgzNjQ4KSIKICAgICAgICAgICAgKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gdGVzdGluZyB0aGUgbWV0aG9kIHZhbHVlT2YoIHNhbF9JbnQ2NCBsLCBzYWxfSW50MTYgcmFkaXg9MiApCi8vIHRlc3RpbmcgdGhlIG1ldGhvZCB2YWx1ZU9mKCBzYWxfSW50NjQgbCwgc2FsX0ludDE2IHJhZGl4PTggKQovLyB0ZXN0aW5nIHRoZSBtZXRob2QgdmFsdWVPZiggc2FsX0ludDY0IGwsIHNhbF9JbnQxNiByYWRpeD0xMCApCi8vIHRlc3RpbmcgdGhlIG1ldGhvZCB2YWx1ZU9mKCBzYWxfSW50NjQgbCwgc2FsX0ludDE2IHJhZGl4PTE2ICkKLy8gdGVzdGluZyB0aGUgbWV0aG9kIHZhbHVlT2YoIHNhbF9JbnQ2NCBsLCBzYWxfSW50MTYgcmFkaXg9MzYgKQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzYWxfQm9vbCBTQUxfQ0FMTCB0ZXN0X3J0bF9PU3RyaW5nX3ZhbHVlT2ZfSW50NjQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUZXN0UmVzdWx0IGhSdGxUZXN0UmVzdWx0ICkKewogICAgc2FsX0Jvb2wgYlJlcyA9IHNhbF9GYWxzZTsKCiAgICBiUmVzID0gIGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgICAgICB0ZXN0X3ZhbHVlT2ZfSW50NjQoKGNvbnN0IGNoYXIqKilrQmluYXJ5TnVtc1N0ciwKICAgICAgICAgICAgICAgICAgICAgICAga0JpbmFyeU51bXNDb3VudCwga1JhZGl4QmluYXJ5LCBoUnRsVGVzdFJlc3VsdCwgMCksCiAgICAgICAgICAgICAgICAia1JhZGl4QmluYXJ5IiwKICAgICAgICAgICAgICAgICJ2YWx1ZU9mKHNhbF9JbnQ2NCwgcmFkaXggMilfIgogICAgICAgICAgICApOwoKICAgIGJSZXMgJj0gIGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgICAgICB0ZXN0X3ZhbHVlT2ZfSW50NjQoKGNvbnN0IGNoYXIqKilrT2N0b2xOdW1zU3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAga09jdG9sTnVtc0NvdW50LCBrUmFkaXhPY3RvbCwgaFJ0bFRlc3RSZXN1bHQsIDApLAogICAgICAgICAgICAgICAgImtSYWRpeE9jdG9sIiwKICAgICAgICAgICAgICAgICJ2YWx1ZU9mKHNhbF9JbnQ2NCwgcmFkaXggOClfIgogICAgICAgICAgICApOwoKICAgIGJSZXMgJj0gIGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgICAgICB0ZXN0X3ZhbHVlT2ZfSW50NjQoKGNvbnN0IGNoYXIqKilrRGVjaW1hbE51bXNTdHIsCiAgICAgICAgICAgICAgICAgICAgICAgIGtEZWNpbWFsTnVtc0NvdW50LCBrUmFkaXhEZWNpbWFsLCBoUnRsVGVzdFJlc3VsdCwgMCksCiAgICAgICAgICAgICAgICAia1JhZGl4RGVjaW1hbCIsCiAgICAgICAgICAgICAgICAidmFsdWVPZihzYWxfSW50NjQsIHJhZGl4IDEwKV8iCiAgICAgICAgICAgICk7CiAgICBiUmVzICY9ICBjX3J0bF90cmVzX3N0YXRlCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgICAgICAgICAgdGVzdF92YWx1ZU9mX0ludDY0KChjb25zdCBjaGFyKiopa0hleERlY2ltYWxOdW1zU3RyLAogICAgICAgICAgICAgICAgICBrSGV4RGVjaW1hbE51bXNDb3VudCwga1JhZGl4SGV4ZGVjaW1hbCwgaFJ0bFRlc3RSZXN1bHQsIDApLAogICAgICAgICAgICAgICAgImtSYWRpeEhleGRlY2ltYWwiLAogICAgICAgICAgICAgICAgInZhbHVlT2Yoc2FsX0ludDY0LCByYWRpeCAxNilfIgogICAgICAgICAgICApOwoKICAgIGJSZXMgJj0gIGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgICAgICB0ZXN0X3ZhbHVlT2ZfSW50NjQoKGNvbnN0IGNoYXIqKilrQmFzZTM2TnVtc1N0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICBrQmFzZTM2TnVtc0NvdW50LCBrUmFkaXhCYXNlMzYsIGhSdGxUZXN0UmVzdWx0LCAwKSwKICAgICAgICAgICAgICAgICJrUmFkaXhCYXNlMzYiLAogICAgICAgICAgICAgICAgInZhbHVlT2Yoc2FsX0ludDY0LCByYWRpeCAzNilfIgogICAgICAgICAgICApOwoKICAgIHJldHVybiAoYlJlcyk7Cn0KCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIHRlc3RpbmcgdGhlIG1ldGhvZCB2YWx1ZU9mKCBzYWxfSW50NjQgbCwgc2FsX0ludDMyIHJhZGl4PTIgKQovLyB3aGVyZSBsID0gbGFyZ2UgY29uc3RhbnRzCi8vIHRlc3RpbmcgdGhlIG1ldGhvZCB2YWx1ZU9mKCBzYWxfSW50NjQgbCwgc2FsX0ludDMyIHJhZGl4PTggKQovLyB3aGVyZSBsID0gbGFyZ2UgY29uc3RhbnRzCi8vIHRlc3RpbmcgdGhlIG1ldGhvZCB2YWx1ZU9mKCBzYWxfSW50NjQgbCwgc2FsX0ludDMyIHJhZGl4PTEwICkKLy8gd2hlcmUgbCA9IGxhcmdlIGNvbnN0YW50cwovLyB0ZXN0aW5nIHRoZSBtZXRob2QgdmFsdWVPZiggc2FsX0ludDY0IGwsIHNhbF9JbnQzMiByYWRpeD0xNiApCi8vIHdoZXJlIGwgPSBsYXJnZSBjb25zdGFudHMKLy8gdGVzdGluZyB0aGUgbWV0aG9kIHZhbHVlT2YoIHNhbF9JbnQ2NCBsLCBzYWxfSW50MzIgcmFkaXg9MzYgKQovLyB3aGVyZSBsID0gbGFyZ2UgY29uc3RhbnRzCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnNhbF9Cb29sIFNBTF9DQUxMIHRlc3RfcnRsX09TdHJpbmdfdmFsdWVPZl9JbnQ2NF9Cb3VuZGVyaWVzKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGVzdFJlc3VsdCBoUnRsVGVzdFJlc3VsdCApCnsKICAgIHNhbF9Cb29sIGJSZXMgPSBzYWxfRmFsc2U7CgogICAgYlJlcyA9ICBjX3J0bF90cmVzX3N0YXRlCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgICAgICAgICAgdGVzdF92YWx1ZU9mX0ludDY0KChjb25zdCBjaGFyKiopa0JpbmFyeU1heE51bXNTdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtJbnQ2NE1heE51bXNDb3VudCwga1JhZGl4QmluYXJ5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LCBrSW50NjRNYXhOdW1zKSwKICAgICAgICAgICAgICAgICJrUmFkaXhCaW5hcnkiLAogICAgICAgICAgICAgICAgInZhbHVlT2Yoc2FsSW50NjQsIHJhZGl4IDIpIEJvdW5kZXJpZXMiCiAgICAgICAgICAgICk7CgogICAgYlJlcyAmPSBjX3J0bF90cmVzX3N0YXRlCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgICAgICAgICAgdGVzdF92YWx1ZU9mX0ludDY0KChjb25zdCBjaGFyKiopa09jdG9sTWF4TnVtc1N0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ludDY0TWF4TnVtc0NvdW50LCBrUmFkaXhPY3RvbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoUnRsVGVzdFJlc3VsdCwga0ludDY0TWF4TnVtcyksCiAgICAgICAgICAgICAgICAia1JhZGl4T2N0b2wiLAogICAgICAgICAgICAgICAgInZhbHVlT2Yoc2FsSW50NjQsIHJhZGl4IDgpIEJvdW5kZXJpZXMiCiAgICAgICAgICAgICk7CgogICAgYlJlcyAmPSBjX3J0bF90cmVzX3N0YXRlCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgICAgICAgICAgdGVzdF92YWx1ZU9mX0ludDY0KChjb25zdCBjaGFyKiopa0RlY2ltYWxNYXhOdW1zU3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrSW50NjRNYXhOdW1zQ291bnQsIGtSYWRpeERlY2ltYWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsIGtJbnQ2NE1heE51bXMpLAogICAgICAgICAgICAgICAgImtSYWRpeERlY2ltYWwiLAogICAgICAgICAgICAgICAgInZhbHVlT2Yoc2FsSW50NjQsIHJhZGl4IDEwKSBCb3VuZGVyaWVzIgogICAgICAgICAgICApOwoKICAgIGJSZXMgJj0gY19ydGxfdHJlc19zdGF0ZQogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICAgICAgICAgIHRlc3RfdmFsdWVPZl9JbnQ2NCgoY29uc3QgY2hhcioqKWtIZXhEZWNpbWFsTWF4TnVtc1N0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ludDY0TWF4TnVtc0NvdW50LCBrUmFkaXhIZXhkZWNpbWFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LCBrSW50NjRNYXhOdW1zKSwKICAgICAgICAgICAgICAgICJrUmFkaXhIZXhkZWNpbWFsIiwKICAgICAgICAgICAgICAgICJ2YWx1ZU9mKHNhbEludDY0LCByYWRpeCAxNikgQm91bmRlcmllcyIKICAgICAgICAgICAgKTsKCiAgICBiUmVzICY9IGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgICAgICB0ZXN0X3ZhbHVlT2ZfSW50NjQoKGNvbnN0IGNoYXIqKilrQmFzZTM2TWF4TnVtc1N0ciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0ludDY0TWF4TnVtc0NvdW50LCBrUmFkaXhCYXNlMzYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsIGtJbnQ2NE1heE51bXMpLAogICAgICAgICAgICAgICAgImtSYWRpeEJhc2UzNiIsCiAgICAgICAgICAgICAgICAidmFsdWVPZihzYWxJbnQ2NCwgcmFkaXggMzYpIEJvdW5kZXJpZXMiCiAgICAgICAgICAgICk7CgogICAgcmV0dXJuICggYlJlcyApOwp9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyB0ZXN0aW5nIHRoZSBtZXRob2QgdmFsdWVPZiggc2FsX0ludDY0IGwsIHNhbF9JbnQxNiByYWRpeD0yICkKLy8gZm9yIG5lZ2F0aXZlIHZhbHVlCi8vIHRlc3RpbmcgdGhlIG1ldGhvZCB2YWx1ZU9mKCBzYWxfSW50NjQgbCwgc2FsX0ludDE2IHJhZGl4PTggKQovLyBmb3IgbmVnYXRpdmUgdmFsdWUKLy8gdGVzdGluZyB0aGUgbWV0aG9kIHZhbHVlT2YoIHNhbF9JbnQ2NCBsLCBzYWxfSW50MTYgcmFkaXg9MTAgKQovLyBmb3IgbmVnYXRpdmUgdmFsdWUKLy8gdGVzdGluZyB0aGUgbWV0aG9kIHZhbHVlT2YoIHNhbF9JbnQ2NCBsLCBzYWxfSW50MTYgcmFkaXg9MTYgKQovLyBmb3IgbmVnYXRpdmUgdmFsdWUKLy8gdGVzdGluZyB0aGUgbWV0aG9kIHZhbHVlT2YoIHNhbF9JbnQ2NCBsLCBzYWxfSW50MTYgcmFkaXg9MzYgKQovLyBmb3IgbmVnYXRpdmUgdmFsdWUKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kc2FsX0Jvb2wgU0FMX0NBTEwgdGVzdF9ydGxfT1N0cmluZ192YWx1ZU9mX0ludDY0X05lZ2F0aXZlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGVzdFJlc3VsdCBoUnRsVGVzdFJlc3VsdCApCnsKICAgIHNhbF9Cb29sIGJSZXMgPSBzYWxfRmFsc2U7CgogICAgc2FsX0ludDY0IGluQXJyWzM2XTsKICAgIHNhbF9JbnQzMiBpOwoKICAgIGZvciAoaSA9IDA7IGkgPCAzNjsgaSsrKSB7CiAgICAgICAgaW5BcnJbaV0gPSAtaTsKICAgIH0KCgogICAgYlJlcyA9IGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgICAgICB0ZXN0X3ZhbHVlT2ZfSW50NjQoIGtCaW5hcnlOdW1zU3RyLCBrQmluYXJ5TnVtc0NvdW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmFkaXhCaW5hcnksIGhSdGxUZXN0UmVzdWx0LCBpbkFyciApLAogICAgICAgICAgICAgICAgIm5lZ2F0aXZlIEludDY0LCBrUmFkaXhCaW5hcnkiLAogICAgICAgICAgICAgICAgInZhbHVlT2YoIG5lZ2F0aXZlIEludDY0LCByYWRpeCAyICkiCiAgICAgICAgICAgICk7CgogICAgYlJlcyAmPSBjX3J0bF90cmVzX3N0YXRlCiAgICAgICAgICAgICgKICAgICAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgICAgICAgICAgdGVzdF92YWx1ZU9mX0ludDY0KCBrT2N0b2xOdW1zU3RyLCBrT2N0b2xOdW1zQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmFkaXhPY3RvbCwgaFJ0bFRlc3RSZXN1bHQsIGluQXJyICksCiAgICAgICAgICAgICAgICAibmVnYXRpdmUgSW50NjQsIGtSYWRpeE9jdG9sIiwKICAgICAgICAgICAgICAgICJ2YWx1ZU9mKCBuZWdhdGl2ZSBJbnQ2NCwgcmFkaXggOCApIgogICAgICAgICAgICApOwoKICAgIGJSZXMgJj0gY19ydGxfdHJlc19zdGF0ZQogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICAgICAgICAgIHRlc3RfdmFsdWVPZl9JbnQ2NCgga0RlY2ltYWxOdW1zU3RyLCBrRGVjaW1hbE51bXNDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1JhZGl4RGVjaW1hbCwgaFJ0bFRlc3RSZXN1bHQsIGluQXJyICksCiAgICAgICAgICAgICAgICAibmVnYXRpdmUgSW50NjQsIGtSYWRpeERlY2ltYWwiLAogICAgICAgICAgICAgICAgInZhbHVlT2YoIG5lZ2F0aXZlIEludDY0LCByYWRpeCAxMCApIgogICAgICAgICAgICApOwoKICAgIGJSZXMgJj0gY19ydGxfdHJlc19zdGF0ZQogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICAgICAgICAgIHRlc3RfdmFsdWVPZl9JbnQ2NCgga0hleERlY2ltYWxOdW1zU3RyLCBrSGV4RGVjaW1hbE51bXNDb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1JhZGl4SGV4ZGVjaW1hbCwgaFJ0bFRlc3RSZXN1bHQsIGluQXJyICksCiAgICAgICAgICAgICAgICAibmVnYXRpdmUgSW50NjQsIGtSYWRpeEhleERlY2ltYWwiLAogICAgICAgICAgICAgICAgInZhbHVlT2YoIG5lZ2F0aXZlIEludDY0LCByYWRpeCAxNiApIgogICAgICAgICAgICApOwoKICAgIGJSZXMgJj0gY19ydGxfdHJlc19zdGF0ZQogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICAgICAgICAgIHRlc3RfdmFsdWVPZl9JbnQ2NCgga0Jhc2UzNk51bXNTdHIsIGtCYXNlMzZOdW1zQ291bnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1JhZGl4QmFzZTM2LCBoUnRsVGVzdFJlc3VsdCwgaW5BcnIpLAogICAgICAgICAgICAgICAgIm5lZ2F0aXZlIEludDY0LCBrUmFkaXhCYXNlMzYiLAogICAgICAgICAgICAgICAgInZhbHVlT2YoIG5lZ2F0aXZlIEludDY0LCByYWRpeCAzNiApIgogICAgICAgICAgICApOwoKICAgIHJldHVybiAoYlJlcyk7Cn0KLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gdGVzdGluZyB0aGUgbWV0aG9kIHZhbHVlT2YoIHNhbF9JbnQ2NCBsLCBzYWxfSW50MzIgcmFkaXggKQovLyB3aGVyZSByYWRpeCA9IC01Ci8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnNhbF9Cb29sIFNBTF9DQUxMIHRlc3RfcnRsX09TdHJpbmdfdmFsdWVPZl9JbnQ2NF9Xcm9uZ1JhZGl4KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGVzdFJlc3VsdCBoUnRsVGVzdFJlc3VsdCApCnsKICAgIHNhbF9Cb29sIGJSZXMgPSBzYWxfRmFsc2U7CgogICAgc2FsX0ludDY0IGludFZhbCA9IDExOwoKICAgIDo6cnRsOjpPU3RyaW5nIGFTdHIxOwogICAgOjpydGw6Ok9TdHJpbmcgYVN0cjIoIjExIik7CgogICAgYVN0cjEgPSBhU3RyMS52YWx1ZU9mKCBpbnRWYWwsIC01ICk7CgogICAgYlJlcyA9IGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgICAgICBhU3RyMi5jb21wYXJlVG8oYVN0cjEpID09IDAsCiAgICAgICAgICAgICAgICAiaWYgcmFkaXggbm90IHZhbGlkIHRoZW4gcmFkaXggbXVzdCBiZSAxMCIsCiAgICAgICAgICAgICAgICAidmFsdWVPZihzYWxfSW50NjQsIHNhbF9JbnQzMiByYWRpeCk6IHJhZGl4ID0gLTUiCiAgICAgICAgICAgICk7CgogICAgcmV0dXJuIChiUmVzKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gdGVzdGluZyB0aGUgbWV0aG9kIHZhbHVlT2YoIHNhbF9JbnQ2NCBsLCBzYWxfSW50MzIgcmFkaXggKQovLyB3aGVyZSBsID0gLTkyMjMzNzIwMzY4NTQ3NzU4MDggKHNtYWxsZXN0IG5lZ2F0aXZlIHZhbHVlKQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpzYWxfQm9vbCBTQUxfQ0FMTCB0ZXN0X3J0bF9PU3RyaW5nX3ZhbHVlT2ZfSW50NjRfU21hbGxlc3ROZWdhdGl2ZVZhbHVlKAogICAgaFRlc3RSZXN1bHQgaFJ0bFRlc3RSZXN1bHQpCnsKICAgIC8vIFN0YW5kYXJkLWNvbmZvcm1pbmcgd2F5IHRvIGFzc2lnbiAtOTIyMzM3MjAzNjg1NDc3NTgwOCB0byBuOgogICAgc2FsX0ludDY0IG4gPSAtMTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDwgNjQ7ICsraSkKICAgICAgICBuICo9IDI7CiAgICByZXR1cm4gY19ydGxfdHJlc19zdGF0ZQogICAgICAgICAgICAoCiAgICAgICAgICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICAgICAgICAgIDo6cnRsOjpPU3RyaW5nOjp2YWx1ZU9mKG4pID09ICItOTIyMzM3MjAzNjg1NDc3NTgwOCIsCiAgICAgICAgICAgICAgICAiLTkyMjMzNzIwMzY4NTQ3NzU4MDgiLAogICAgICAgICAgICAgICAgInZhbHVlT2Yoc2FsX0ludDY0IC05MjIzMzcyMDM2ODU0Nzc1ODA4KSIKICAgICAgICAgICAgKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gdGVzdGluZyB0aGUgbWV0aG9kIHZhbHVlT2YoIGZsb2F0IGYgKQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBMTEE6IHNhbF9Cb29sIFNBTF9DQUxMIHRlc3RfcnRsX09TdHJpbmdfdmFsdWVPZl9mbG9hdCgKLy8gTExBOiAgICAgICAgICAgICAgICAgICAgICAgICBoVGVzdFJlc3VsdCBoUnRsVGVzdFJlc3VsdCApCi8vIExMQTogewovLyBMTEE6ICAgICBzYWxfQ2hhciBtZXRoTmFtZVtNQVhCVUZMRU5HVEhdOwovLyBMTEE6ICAgICBzYWxfQ2hhciogcE1ldGggPW1ldGhOYW1lOwovLyBMTEE6IAovLyBMTEE6ICAgICB0eXBlZGVmIHN0cnVjdCBUZXN0Q2FzZQovLyBMTEE6ICAgICB7Ci8vIExMQTogICAgIHNhbF9DaGFyKiAgICAgICAgICAgICAgICAgICAgY29tbWVudHM7Ci8vIExMQTogICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0MTsKLy8gTExBOiAgICAgT1N0cmluZyogICAgICAgICAgICAgICAgICAgICBleHBWYWw7Ci8vIExMQTogCi8vIExMQTogICAgIH5UZXN0Q2FzZSgpIHtkZWxldGUgZXhwVmFsO30KLy8gTExBOiAgICAgfSBUZXN0Q2FzZTsKLy8gTExBOiAKLy8gTExBOiAgICAgVGVzdENhc2UgYXJyVGVzdENhc2VbXSA9Ci8vIExMQTogICAgIHsKLy8gTExBOiAgICAgICAgIHsgIjMuMCIsIDMuMCwgbmV3IE9TdHJpbmcoIjMuMCIpIH0sCi8vIExMQTogICAgICAgICB7ICIzLjUiLCAzLjVmLCBuZXcgT1N0cmluZygiMy41Iil9LAovLyBMTEE6ICAgICAgICAgeyAiMy4wNjI1IiwgMy4wNjI1ZiwgbmV3IE9TdHJpbmcoIjMuMDYyNSIpfSwKLy8gTExBOiAgICAgICAgIHsgIjMuNTAyNTI1IiwgMy41MDI1MjVmLCBuZXcgT1N0cmluZygiMy41MDI1MjUiKSB9LAovLyBMTEE6ICAgICAgICAgeyAiMy4xNDE1OTIiLCAzLjE0MTU5MmYsIG5ldyBPU3RyaW5nKCIzLjE0MTU5MiIpIH0sCi8vIExMQTogICAgICAgICB7ICIzLjUwMjUyNTUiLCAzLjUwMjUyNTVmLCBuZXcgT1N0cmluZygiMy41MDI1MjU1IikgfSwKLy8gTExBOiAgICAgICAgIHsgIjMuMDAzOTA2MiIsIDMuMDAzOTA2MjVmLCBuZXcgT1N0cmluZygiMy4wMDM5MDYyIikgfQovLyBMTEE6ICAgICB9OwovLyBMTEE6IAovLyBMTEE6ICAgICBzYWxfQm9vbCByZXMgPSBzYWxfVHJ1ZTsKLy8gTExBOiAgICAgc2FsX0ludDMyIGk7Ci8vIExMQTogCi8vIExMQTogICAgIGZvcihpID0gMDsgaSA8IChzaXplb2YgKGFyclRlc3RDYXNlKSkvKHNpemVvZiAoVGVzdENhc2UpKTsgaSsrKQovLyBMTEE6ICAgICB7Ci8vIExMQTogICAgICAgICA6OnJ0bDo6T1N0cmluZyBhU3RyMTsKLy8gTExBOiAgICAgICAgIGFTdHIxID0gYVN0cjEudmFsdWVPZiggYXJyVGVzdENhc2VbaV0uaW5wdXQxICk7Ci8vIExMQTogICAgICAgICBzYWxfQm9vbCBsYXN0UmVzID0gKGFyclRlc3RDYXNlW2ldLmV4cFZhbC0+Y29tcGFyZVRvKGFTdHIxKSA9PSAwKTsKLy8gTExBOiAKLy8gTExBOiAgICAgICAgIGNfcnRsX3RyZXNfc3RhdGUKLy8gTExBOiAgICAgICAgICgKLy8gTExBOiAgICAgICAgICAgICBoUnRsVGVzdFJlc3VsdCwKLy8gTExBOiAgICAgICAgICAgICBsYXN0UmVzLAovLyBMTEE6ICAgICAgICAgICAgIGFyclRlc3RDYXNlW2ldLmNvbW1lbnRzLAovLyBMTEE6ICAgICAgICAgICAgIGNyZWF0ZU5hbWUoIHBNZXRoLCAidmFsdWVvZl9mbG9hdCIsIGkpCi8vIExMQTogICAgICAgICApOwovLyBMTEE6IAovLyBMTEE6ICAgICAgICAgcmVzICY9IGxhc3RSZXM7Ci8vIExMQTogCi8vIExMQTogICAgIH0KLy8gTExBOiAKLy8gTExBOiAgICAgcmV0dXJuICggcmVzICk7Ci8vIExMQTogfQoKCgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gdGVzdGluZyB0aGUgbWV0aG9kIHZhbHVlT2YoIGZsb2F0IGYgKSBmb3IgbmVnYXRpdmUgdmFsdWUKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gTExBOiBzYWxfQm9vbCBTQUxfQ0FMTCB0ZXN0X3J0bF9PU3RyaW5nX3ZhbHVlT2ZfRmxvYXRfTmVnYXRpdmUoCi8vIExMQTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUZXN0UmVzdWx0IGhSdGxUZXN0UmVzdWx0ICkKLy8gTExBOiB7Ci8vIExMQTogICAgIHNhbF9DaGFyIG1ldGhOYW1lW01BWEJVRkxFTkdUSF07Ci8vIExMQTogICAgIHNhbF9DaGFyKiBwTWV0aCA9bWV0aE5hbWU7Ci8vIExMQTogCi8vIExMQTogICAgIHR5cGVkZWYgc3RydWN0IFRlc3RDYXNlCi8vIExMQTogICAgIHsKLy8gTExBOiAgICAgc2FsX0NoYXIqICAgICAgICAgICAgICAgICAgICBjb21tZW50czsKLy8gTExBOiAgICAgZmxvYXQgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQxOwovLyBMTEE6ICAgICBPU3RyaW5nKiAgICAgICAgICAgICAgICAgICAgIGV4cFZhbDsKLy8gTExBOiAKLy8gTExBOiAgICAgflRlc3RDYXNlKCkge2RlbGV0ZSBleHBWYWw7fQovLyBMTEE6ICAgICB9IFRlc3RDYXNlOwovLyBMTEE6IAovLyBMTEE6ICAgICBUZXN0Q2FzZSBhcnJUZXN0Q2FzZVtdID0KLy8gTExBOiAgICAgewovLyBMTEE6ICAgICAgICAgeyAiLTMuMCIsIC0zLjAsIG5ldyBPU3RyaW5nKCItMy4wIikgfSwKLy8gTExBOiAgICAgICAgIHsgIi0zLjUiLCAtMy41ZiwgbmV3IE9TdHJpbmcoIi0zLjUiKX0sCi8vIExMQTogICAgICAgICB7ICItMy4wNjI1IiwgLTMuMDYyNWYsIG5ldyBPU3RyaW5nKCItMy4wNjI1Iil9LAovLyBMTEE6ICAgICAgICAgeyAiLTMuNTAyNTI1IiwgLTMuNTAyNTI1ZiwgbmV3IE9TdHJpbmcoIi0zLjUwMjUyNSIpIH0sCi8vIExMQTogICAgICAgICB7ICItMy4xNDE1OTIiLCAtMy4xNDE1OTJmLCBuZXcgT1N0cmluZygiLTMuMTQxNTkyIikgfSwKLy8gTExBOiAgICAgICAgIHsgIi0zLjUwMjUyNTUiLCAtMy41MDI1MjU1ZiwgbmV3IE9TdHJpbmcoIi0zLjUwMjUyNTUiKSB9LAovLyBMTEE6ICAgICAgICAgeyAiLTMuMDAzOTA2MiIsIC0zLjAwMzkwNjI1ZiwgbmV3IE9TdHJpbmcoIi0zLjAwMzkwNjIiKSB9Ci8vIExMQTogICAgIH07Ci8vIExMQTogCi8vIExMQTogICAgIHNhbF9Cb29sIHJlcyA9IHNhbF9UcnVlOwovLyBMTEE6ICAgICBzYWxfSW50MzIgaTsKLy8gTExBOiAKLy8gTExBOiAgICAgZm9yKGkgPSAwOyBpIDwgKHNpemVvZiAoYXJyVGVzdENhc2UpKS8oc2l6ZW9mIChUZXN0Q2FzZSkpOyBpKyspCi8vIExMQTogICAgIHsKLy8gTExBOiAgICAgICAgIDo6cnRsOjpPU3RyaW5nIGFTdHIxOwovLyBMTEE6ICAgICAgICAgYVN0cjEgPSBhU3RyMS52YWx1ZU9mKCBhcnJUZXN0Q2FzZVtpXS5pbnB1dDEgKTsKLy8gTExBOiAgICAgICAgIHNhbF9Cb29sIGxhc3RSZXMgPSAoYXJyVGVzdENhc2VbaV0uZXhwVmFsLT5jb21wYXJlVG8oYVN0cjEpID09IDApOwovLyBMTEE6IAovLyBMTEE6ICAgICAgICAgY19ydGxfdHJlc19zdGF0ZQovLyBMTEE6ICAgICAgICAgKAovLyBMTEE6ICAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LAovLyBMTEE6ICAgICAgICAgICAgIGxhc3RSZXMsCi8vIExMQTogICAgICAgICAgICAgYXJyVGVzdENhc2VbaV0uY29tbWVudHMsCi8vIExMQTogICAgICAgICAgICAgY3JlYXRlTmFtZSggcE1ldGgsICJ2YWx1ZW9mX25lZ2F0aXZlIGZsb2F0IiwgaSkKLy8gTExBOiAgICAgICAgICk7Ci8vIExMQTogCi8vIExMQTogICAgICAgICByZXMgJj0gbGFzdFJlczsKLy8gTExBOiAKLy8gTExBOiAgICAgfQovLyBMTEE6IAovLyBMTEE6ICAgICByZXR1cm4gKCByZXMgKTsKLy8gTExBOiB9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyB0ZXN0aW5nIHRoZSBtZXRob2QgdmFsdWVPZiggZG91YmxlIGYgKQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBMTEE6IHNhbF9Cb29sIFNBTF9DQUxMIHRlc3RfcnRsX09TdHJpbmdfdmFsdWVPZl9kb3VibGUoCi8vIExMQTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRlc3RSZXN1bHQgaFJ0bFRlc3RSZXN1bHQgKQovLyBMTEE6IHsKLy8gTExBOiAgICAgc2FsX0NoYXIgbWV0aE5hbWVbTUFYQlVGTEVOR1RIXTsKLy8gTExBOiAgICAgc2FsX0NoYXIqIHBNZXRoID1tZXRoTmFtZTsKLy8gTExBOiAKLy8gTExBOiAgICAgdHlwZWRlZiBzdHJ1Y3QgVGVzdENhc2UKLy8gTExBOiAgICAgewovLyBMTEE6ICAgICBzYWxfQ2hhciogICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzOwovLyBMTEE6ICAgICBkb3VibGUgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQxOwovLyBMTEE6ICAgICBPU3RyaW5nKiAgICAgICAgICAgICAgICAgICAgIGV4cFZhbDsKLy8gTExBOiAKLy8gTExBOiAgICAgflRlc3RDYXNlKCkge2RlbGV0ZSBleHBWYWw7fQovLyBMTEE6ICAgICB9IFRlc3RDYXNlOwovLyBMTEE6IAovLyBMTEE6ICAgICBUZXN0Q2FzZSBhcnJUZXN0Q2FzZVtdID0KLy8gTExBOiAgICAgewovLyBMTEE6ICAgICAgICAgeyIzLjAiLCAzLjAsIG5ldyBPU3RyaW5nKCIzLjAiKX0sCi8vIExMQTogICAgICAgICB7IjMuNSIsIDMuNSwgbmV3IE9TdHJpbmcoIjMuNSIpfSwKLy8gTExBOiAgICAgICAgIHsiMy4wNjI1IiwgMy4wNjI1LCBuZXcgT1N0cmluZygiMy4wNjI1Iil9LAovLyBMTEE6ICAgICAgICAgeyIzLjE0MTU5MjY1MzUiLCAzLjE0MTU5MjY1MzUsIG5ldyBPU3RyaW5nKCIzLjE0MTU5MjY1MzUiKX0sCi8vIExMQTogICAgICAgICB7IjMuMTQxNTkyNjUzNTg5NzkzMSIsIDMuMTQxNTkyNjUzNTg5NzkzLCAKLy8gTExBOiAgICAgICAgICAgICBuZXcgT1N0cmluZygiMy4xNDE1OTI2NTM1ODk3OTMxIil9LAovLyBMTEE6ICAgICAgICAgeyIzLjE0MTU5MjY1MzU4OTc5MzEiLCAzLjE0MTU5MjY1MzU4OTc5MzIsIAovLyBMTEE6ICAgICAgICAgICAgIG5ldyBPU3RyaW5nKCIzLjE0MTU5MjY1MzU4OTc5MzEiKX0sCi8vIExMQTogICAgICAgICB7IjMuMTQxNTkyNjUzNTg5NzkzMSIsIDMuMTQxNTkyNjUzNTg5NzkzMjMsIAovLyBMTEE6ICAgICAgICAgICAgIG5ldyBPU3RyaW5nKCIzLjE0MTU5MjY1MzU4OTc5MzEiKX0sCi8vIExMQTogICAgICAgICB7IjMuMTQxNTkyNjUzNTg5NzkzMSIsIDMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzLCAKLy8gTExBOiAgICAgICAgICAgICBuZXcgT1N0cmluZygiMy4xNDE1OTI2NTM1ODk3OTMxIil9Ci8vIExMQTogICAgIH07Ci8vIExMQTogCi8vIExMQTogICAgIHNhbF9Cb29sIHJlcyA9IHNhbF9UcnVlOwovLyBMTEE6ICAgICBzYWxfSW50MzIgaTsKLy8gTExBOiAKLy8gTExBOiAgICAgZm9yKGkgPSAwOyBpIDwgKHNpemVvZiAoYXJyVGVzdENhc2UpKS8oc2l6ZW9mIChUZXN0Q2FzZSkpOyBpKyspCi8vIExMQTogICAgIHsKLy8gTExBOiAgICAgICAgIDo6cnRsOjpPU3RyaW5nIGFTdHIxOwovLyBMTEE6ICAgICAgICAgYVN0cjEgPSBhU3RyMS52YWx1ZU9mKCBhcnJUZXN0Q2FzZVtpXS5pbnB1dDEgKTsKLy8gTExBOiAgICAgICAgIHNhbF9Cb29sIGxhc3RSZXMgPSAoYXJyVGVzdENhc2VbaV0uZXhwVmFsLT5jb21wYXJlVG8oYVN0cjEpID09IDApOwovLyBMTEE6IAovLyBMTEE6ICAgICAgICAgY19ydGxfdHJlc19zdGF0ZQovLyBMTEE6ICAgICAgICAgKAovLyBMTEE6ICAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LAovLyBMTEE6ICAgICAgICAgICAgIGxhc3RSZXMsCi8vIExMQTogICAgICAgICAgICAgYXJyVGVzdENhc2VbaV0uY29tbWVudHMsCi8vIExMQTogICAgICAgICAgICAgY3JlYXRlTmFtZSggcE1ldGgsICJ2YWx1ZW9mX2RvdWJsZSIsIGkpCi8vIExMQTogICAgICAgICApOwovLyBMTEE6IAovLyBMTEE6ICAgICAgICAgcmVzICY9IGxhc3RSZXM7Ci8vIExMQTogCi8vIExMQTogICAgIH0KLy8gTExBOiAKLy8gTExBOiAgICAgcmV0dXJuICggcmVzICk7Ci8vIExMQTogfQoKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIHRlc3RpbmcgdGhlIG1ldGhvZCB2YWx1ZU9mKCBkb3VibGUgZiApIGZvciBuZWdhdGl2ZSB2YWx1ZQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyBMTEE6IHNhbF9Cb29sIFNBTF9DQUxMIHRlc3RfcnRsX09TdHJpbmdfdmFsdWVPZl9Eb3VibGVfTmVnYXRpdmUoCi8vIExMQTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRlc3RSZXN1bHQgaFJ0bFRlc3RSZXN1bHQgKQovLyBMTEE6IHsKLy8gTExBOiAgICAgc2FsX0NoYXIgbWV0aE5hbWVbTUFYQlVGTEVOR1RIXTsKLy8gTExBOiAgICAgc2FsX0NoYXIqIHBNZXRoID1tZXRoTmFtZTsKLy8gTExBOiAKLy8gTExBOiAgICAgdHlwZWRlZiBzdHJ1Y3QgVGVzdENhc2UKLy8gTExBOiAgICAgewovLyBMTEE6ICAgICBzYWxfQ2hhciogICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzOwovLyBMTEE6ICAgICBkb3VibGUgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQxOwovLyBMTEE6ICAgICBPU3RyaW5nKiAgICAgICAgICAgICAgICAgICAgIGV4cFZhbDsKLy8gTExBOiAKLy8gTExBOiAgICAgflRlc3RDYXNlKCkge2RlbGV0ZSBleHBWYWw7fQovLyBMTEE6ICAgICB9IFRlc3RDYXNlOwovLyBMTEE6IAovLyBMTEE6ICAgICBUZXN0Q2FzZSBhcnJUZXN0Q2FzZVtdID0KLy8gTExBOiAgICAgewovLyBMTEE6ICAgICAgICAgeyItMy4wIiwgLTMuMCwgbmV3IE9TdHJpbmcoIi0zLjAiKX0sCi8vIExMQTogICAgICAgICB7Ii0zLjUiLCAtMy41LCBuZXcgT1N0cmluZygiLTMuNSIpfSwKLy8gTExBOiAgICAgICAgIHsiLTMuMDYyNSIsIC0zLjA2MjUsIG5ldyBPU3RyaW5nKCItMy4wNjI1Iil9LAovLyBMTEE6ICAgICAgICAgeyItMy4xNDE1OTI2NTM1IiwgLTMuMTQxNTkyNjUzNSwgbmV3IE9TdHJpbmcoIi0zLjE0MTU5MjY1MzUiKX0sCi8vIExMQTogICAgICAgICB7Ii0zLjE0MTU5MjY1MzU4OTc5MzEiLCAtMy4xNDE1OTI2NTM1ODk3OTMsIAovLyBMTEE6ICAgICAgICAgICAgIG5ldyBPU3RyaW5nKCItMy4xNDE1OTI2NTM1ODk3OTMxIil9LAovLyBMTEE6ICAgICAgICAgeyItMy4xNDE1OTI2NTM1ODk3OTMxIiwgLTMuMTQxNTkyNjUzNTg5NzkzMiwgCi8vIExMQTogICAgICAgICAgICAgbmV3IE9TdHJpbmcoIi0zLjE0MTU5MjY1MzU4OTc5MzEiKX0sCi8vIExMQTogICAgICAgICB7Ii0zLjE0MTU5MjY1MzU4OTc5MzEiLCAtMy4xNDE1OTI2NTM1ODk3OTMyMywgCi8vIExMQTogICAgICAgICAgICAgbmV3IE9TdHJpbmcoIi0zLjE0MTU5MjY1MzU4OTc5MzEiKX0sCi8vIExMQTogICAgICAgICB7Ii0zLjE0MTU5MjY1MzU4OTc5MzEiLCAtMy4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDMsIAovLyBMTEE6ICAgICAgICAgICAgIG5ldyBPU3RyaW5nKCItMy4xNDE1OTI2NTM1ODk3OTMxIil9Ci8vIExMQTogICAgIH07Ci8vIExMQTogCi8vIExMQTogICAgIHNhbF9Cb29sIHJlcyA9IHNhbF9UcnVlOwovLyBMTEE6ICAgICBzYWxfSW50MzIgaTsKLy8gTExBOiAKLy8gTExBOiAgICAgZm9yKGkgPSAwOyBpIDwgKHNpemVvZiAoYXJyVGVzdENhc2UpKS8oc2l6ZW9mIChUZXN0Q2FzZSkpOyBpKyspCi8vIExMQTogICAgIHsKLy8gTExBOiAgICAgICAgIDo6cnRsOjpPU3RyaW5nIGFTdHIxOwovLyBMTEE6ICAgICAgICAgYVN0cjEgPSBhU3RyMS52YWx1ZU9mKCBhcnJUZXN0Q2FzZVtpXS5pbnB1dDEgKTsKLy8gTExBOiAgICAgICAgIHNhbF9Cb29sIGxhc3RSZXMgPSAoYXJyVGVzdENhc2VbaV0uZXhwVmFsLT5jb21wYXJlVG8oYVN0cjEpID09IDApOwovLyBMTEE6IAovLyBMTEE6ICAgICAgICAgY19ydGxfdHJlc19zdGF0ZQovLyBMTEE6ICAgICAgICAgKAovLyBMTEE6ICAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LAovLyBMTEE6ICAgICAgICAgICAgIGxhc3RSZXMsCi8vIExMQTogICAgICAgICAgICAgYXJyVGVzdENhc2VbaV0uY29tbWVudHMsCi8vIExMQTogICAgICAgICAgICAgY3JlYXRlTmFtZSggcE1ldGgsICJ2YWx1ZW9mX25hZ2F0aXZlIGRvdWJsZSIsIGkpCi8vIExMQTogICAgICAgICApOwovLyBMTEE6IAovLyBMTEE6ICAgICAgICAgcmVzICY9IGxhc3RSZXM7Ci8vIExMQTogCi8vIExMQTogICAgIH0KLy8gTExBOiAKLy8gTExBOiAgICAgcmV0dXJuICggcmVzICk7Ci8vIExMQTogfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gdGVzdGluZyB0aGUgbWV0aG9kIHZhbHVlT2YoKQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpleHRlcm4gIkMiIHZvaWQgLyogc2FsX0Jvb2wgKi8gU0FMX0NBTEwgdGVzdF9ydGxfT1N0cmluZ192YWx1ZU9mKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGVzdFJlc3VsdCBoUnRsVGVzdFJlc3VsdCApCnsKICAgIGNfcnRsX3RyZXNfc3RhdGVfc3RhcnQoaFJ0bFRlc3RSZXN1bHQsICJ2YWx1ZU9mIik7CiAgICBzYWxfQm9vbCBiVFN0YXRlID0gdGVzdF9ydGxfT1N0cmluZ192YWx1ZU9mX3NhbF9Cb29sKCBoUnRsVGVzdFJlc3VsdCApOwoKICAgIGJUU3RhdGUgJj0gdGVzdF9ydGxfT1N0cmluZ192YWx1ZU9mX3NhbF9DaGFyKCBoUnRsVGVzdFJlc3VsdCApOwoKICAgIGJUU3RhdGUgJj0gdGVzdF9ydGxfT1N0cmluZ192YWx1ZU9mX0ludDMyKCBoUnRsVGVzdFJlc3VsdCApOwogICAgYlRTdGF0ZSAmPSB0ZXN0X3J0bF9PU3RyaW5nX3ZhbHVlT2ZfSW50MzJfQm91bmRlcmllcyggaFJ0bFRlc3RSZXN1bHQgKTsKICAgIGJUU3RhdGUgJj0gdGVzdF9ydGxfT1N0cmluZ192YWx1ZU9mX0ludDMyX05lZ2F0aXZlKCBoUnRsVGVzdFJlc3VsdCApOwogICAgYlRTdGF0ZSAmPSB0ZXN0X3J0bF9PU3RyaW5nX3ZhbHVlT2ZfSW50MzJfV3JvbmdSYWRpeCggaFJ0bFRlc3RSZXN1bHQgKTsKICAgIGJUU3RhdGUgJj0gdGVzdF9ydGxfT1N0cmluZ192YWx1ZU9mX0ludDMyX1NtYWxsZXN0TmVnYXRpdmVWYWx1ZSgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQgKTsKCiAgICBiVFN0YXRlICY9IHRlc3RfcnRsX09TdHJpbmdfdmFsdWVPZl9JbnQ2NCggaFJ0bFRlc3RSZXN1bHQgKTsKICAgIGJUU3RhdGUgJj0gdGVzdF9ydGxfT1N0cmluZ192YWx1ZU9mX0ludDY0X0JvdW5kZXJpZXMoIGhSdGxUZXN0UmVzdWx0ICk7CiAgICBiVFN0YXRlICY9IHRlc3RfcnRsX09TdHJpbmdfdmFsdWVPZl9JbnQ2NF9OZWdhdGl2ZSggaFJ0bFRlc3RSZXN1bHQgKTsKICAgIGJUU3RhdGUgJj0gdGVzdF9ydGxfT1N0cmluZ192YWx1ZU9mX0ludDY0X1dyb25nUmFkaXgoIGhSdGxUZXN0UmVzdWx0ICk7CiAgICBiVFN0YXRlICY9IHRlc3RfcnRsX09TdHJpbmdfdmFsdWVPZl9JbnQ2NF9TbWFsbGVzdE5lZ2F0aXZlVmFsdWUoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0ICk7CgogICAgLy8gTExBOiB0aGUgdGVzdHMgZm9yIHZhbHVlT2YoZmxvYXQpIGFuZCB2YWx1ZU9mKGRvdWJsZSkgYXJlIG1vdmVkIHRvIGZpbGUKICAgIC8vICAgICAgc2FsL3FhL3J0bC9vc3RyaW5nL3J0bF9PU3RyaW5nMi5jeHgKCiAgICAvLyBMTEE6IGJUU3RhdGUgJj0gdGVzdF9ydGxfT1N0cmluZ192YWx1ZU9mX2Zsb2F0KCBoUnRsVGVzdFJlc3VsdCApOwogICAgLy8gTExBOiBiVFN0YXRlICY9IHRlc3RfcnRsX09TdHJpbmdfdmFsdWVPZl9GbG9hdF9OZWdhdGl2ZSggaFJ0bFRlc3RSZXN1bHQgKTsKCiAgICAvLyBMTEE6IGJUU3RhdGUgJj0gdGVzdF9ydGxfT1N0cmluZ192YWx1ZU9mX2RvdWJsZSggaFJ0bFRlc3RSZXN1bHQgKTsKICAgIC8vIExMQTogYlRTdGF0ZSAmPSB0ZXN0X3J0bF9PU3RyaW5nX3ZhbHVlT2ZfRG91YmxlX05lZ2F0aXZlKCBoUnRsVGVzdFJlc3VsdCApOwoKICAgIGNfcnRsX3RyZXNfc3RhdGVfZW5kKGhSdGxUZXN0UmVzdWx0LCAidmFsdWVPZiIpOwovLyAgICByZXR1cm4gKCBiVFN0YXRlICk7Cn0KCgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyB0ZXN0aW5nIHRoZSBtZXRob2QgdG9DaGFyKCkKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KZXh0ZXJuICJDIiB2b2lkIC8qIHNhbF9Cb29sICovIFNBTF9DQUxMIHRlc3RfcnRsX09TdHJpbmdfdG9DaGFyKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGVzdFJlc3VsdCBoUnRsVGVzdFJlc3VsdCApCnsKICAgIHNhbF9DaGFyIG1ldGhOYW1lW01BWEJVRkxFTkdUSF07CiAgICBzYWxfQ2hhciogcE1ldGggPSBtZXRoTmFtZTsKCiAgICBjX3J0bF90cmVzX3N0YXRlX3N0YXJ0KGhSdGxUZXN0UmVzdWx0LCAidG9DaGFyIik7CiAgICB0eXBlZGVmIHN0cnVjdCBUZXN0Q2FzZQogICAgewogICAgc2FsX0NoYXIqICAgICAgICAgICAgICAgICAgICBjb21tZW50czsKICAgIHNhbF9DaGFyICAgICAgICAgICAgICAgICAgICAgZXhwVmFsOwogICAgT1N0cmluZyogICAgICAgICAgICAgICAgICAgICBpbnB1dDE7CiAgICB+VGVzdENhc2UoKSB7ZGVsZXRlIGlucHV0MTt9CiAgICB9IFRlc3RDYXNlOwoKCiAgICBUZXN0Q2FzZSBhcnJUZXN0Q2FzZVtdID0KICAgIHsKICAgICAgICB7IkEiLCAnQScsIG5ldyBPU3RyaW5nKCJBIil9LAogICAgICAgIHsiYSIsICdhJywgbmV3IE9TdHJpbmcoImEiKX0sCiAgICAgICAgeyIwIiwgJzAnLG5ldyBPU3RyaW5nKCIwIil9LAogICAgICAgIHsiLSIsICctJyxuZXcgT1N0cmluZygiLSIpfSwKICAgICAgICB7Il8iLCAnXycsbmV3IE9TdHJpbmcoIl8iKX0sCgovLyAgVE9ETzogbWF5IGJlIFVURi04IHZhbHVlcyAKLy8gICAgICAgIHsigTCENiIsICeBMIQ2JyxuZXcgT1N0cmluZygigTCENiIpfSwKLy8gICAgICAgIHsgIoEwhDciLCAngTCENycsbmV3IE9TdHJpbmcoIoEwhDciKX0sCi8vICAgICAgICB7IoEwizAiLCAngTCLMCcsbmV3IE9TdHJpbmcoIoEwizAiKX0sCi8vICAgICAgICB7IoEwgTYiLCAngTCBNicsbmV3IE9TdHJpbmcoIoEwgTYiKX0sCiAgICAgICAgeyJcbiIsICdcbicsbmV3IE9TdHJpbmcoIlxuIil9LAogICAgICAgIHsiXCciLCAnXCcnLG5ldyBPU3RyaW5nKCJcJyIpfSwKICAgICAgICB7IlwiIiwgJ1wiJyxuZXcgT1N0cmluZygiXCIiKX0sCiAgICAgICAgeyJcMCIsICdcMCcsbmV3IE9TdHJpbmcoIlwwIil9LAogICAgICAgIHsiIiwgJ1wwJyxuZXcgT1N0cmluZygiIil9LAogICAgICAgIHsiU3VuIE1pY3Jvc3lzdGVtcyIsICdTJywgbmV3IE9TdHJpbmcoa1Rlc3RTdHIxKX0KICAgIH07CgoKICAgIC8vIHNhbF9Cb29sIHJlcyA9IHNhbF9UcnVlOwogICAgc2FsX3VJbnQzMiBpOwoKICAgIGZvcihpID0gMDsgaSA8IChzaXplb2YgKGFyclRlc3RDYXNlKSkvKHNpemVvZiAoVGVzdENhc2UpKTsgaSsrICkKICAgIHsKICAgICAgICBzYWxfQ2hhciBzdHJSZXMgPSBhcnJUZXN0Q2FzZVtpXS5pbnB1dDEtPnRvQ2hhcigpOwogICAgICAgIHNhbF9Cb29sIGxhc3RSZXMgPSAoIHN0clJlcyA9PSBhcnJUZXN0Q2FzZVtpXS5leHBWYWwgKTsKCiAgICAgICAgY2hhciBjb21bTUFYQlVGTEVOR1RIXTsKICAgICAgICBjb21bMF0gPSAnXCcnOwogICAgICAgIGNweW5zdHIoY29tICsgMSwgKCphcnJUZXN0Q2FzZVtpXS5pbnB1dDEpLCBNQVhCVUZMRU5HVEgpOwogICAgICAgIGludCBsZW5ndGggPSBBU3RyaW5nTGVuKCAoKmFyclRlc3RDYXNlW2ldLmlucHV0MSkgKTsKICAgICAgICBjb21bbGVuZ3RoICsgMV0gPSAnXCcnOwogICAgICAgIGNvbVtsZW5ndGggKyAyXSA9IDA7CgogICAgICAgIGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAoCiAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgICAgICBsYXN0UmVzLAogICAgICAgICAgICBjb20sCiAgICAgICAgICAgIGNyZWF0ZU5hbWUoIHBNZXRoLCAidG9DaGFyIiwgaSApCiAgICAgICAgKTsKCiAgICB9CgogICAgY19ydGxfdHJlc19zdGF0ZV9lbmQoaFJ0bFRlc3RSZXN1bHQsICJ0b0NoYXIiKTsKLy8gICAgcmV0dXJuIChyZXMpOwp9CgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gdGVzdGluZyB0aGUgbWV0aG9kIHRvRmxvYXQoKQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpleHRlcm4gIkMiIHZvaWQgLyogc2FsX0Jvb2wgKi8gU0FMX0NBTEwgdGVzdF9ydGxfT1N0cmluZ190b0Zsb2F0KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUZXN0UmVzdWx0IGhSdGxUZXN0UmVzdWx0ICkKewogICAgc2FsX0NoYXIgbWV0aE5hbWVbTUFYQlVGTEVOR1RIXTsKICAgIHNhbF9DaGFyKiBwTWV0aCA9IG1ldGhOYW1lOwoKICAgIGNfcnRsX3RyZXNfc3RhdGVfc3RhcnQoaFJ0bFRlc3RSZXN1bHQsICJ0b0Zsb2F0Iik7CiAgICB0eXBlZGVmIHN0cnVjdCBUZXN0Q2FzZQogICAgewogICAgICAgIGZsb2F0ICAgICAgICAgICAgICAgICAgICAgICAgZXhwVmFsOwogICAgICAgIE9TdHJpbmcqICAgICAgICAgICAgICAgICAgICAgaW5wdXQxOwogICAgICAgIGZsb2F0ICAgICAgICAgbV9uUHJlY2lzaW9uOwogICAgICAgIH5UZXN0Q2FzZSgpIHtkZWxldGUgaW5wdXQxO30KICAgIH0gVGVzdENhc2U7CgoKICAgIFRlc3RDYXNlIGFyclRlc3RDYXNlW10gPQogICAgewogICAgICAgIHszLjBmLCBuZXcgT1N0cmluZygiMyIpLCAzZS03Zn0sCiAgICAgICAgezMuMWYsIG5ldyBPU3RyaW5nKCIzLjEiKSwgM2UtN2Z9LAogICAgICAgIHszLjE0MTVmLCBuZXcgT1N0cmluZygiMy4xNDE1IiksIDNlLTdmfSwKICAgICAgICB7My4xNDE1OWYsIG5ldyBPU3RyaW5nKCIzLjE0MTU5IiksIDNlLTdmfSwKICAgICAgICB7My4xNDE1OTJmLCBuZXcgT1N0cmluZygiMy4xNDE1OTIiKSwgM2UtN2Z9LAogICAgICAgIHszLjE0MTU5MjZmLCBuZXcgT1N0cmluZygiMy4xNDE1OTI2IiksIDNlLTdmfSwKICAgICAgICB7My4xNDE1OTI2NWYsIG5ldyBPU3RyaW5nKCIzLjE0MTU5MjY1IiksIDNlLTdmfSwKICAgICAgICB7My4xNDE1OTI2NTM1ODk3OTMyMzg0NjI2NDNmLCAKICAgICAgICAgICAgbmV3IE9TdHJpbmcoIjMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzIiksIDNlLTdmfSwKICAgICAgICB7Ni41ODIyZS0xNmYsIG5ldyBPU3RyaW5nKCI2LjU4MjJlLTE2IiksIDZlLTE2ZiAqIDFlLTdmfSwKICAgICAgICB7OS4xMDk2ZS0zMWYsIG5ldyBPU3RyaW5nKCI5LjEwOTZlLTMxIiksIDllLTMxZiAqIDFlLTdmfSwKICAgICAgICB7Mi45OTc5MjVlOGYsIG5ldyBPU3RyaW5nKCIyLjk5NzkyNWU4IiksIDNlOGYgKiAxZS03Zn0sCiAgICAgICAgezYuMjQxZTE4ZiwgbmV3IE9TdHJpbmcoIjYuMjQxZTE4IiksIDZlMThmICogMWUtN2Z9LAogICAgICAgIHszLjFmLCBuZXcgT1N0cmluZygiMDMuMSIpLCAzZS03Zn0sCiAgICAgICAgezMuMWYsIG5ldyBPU3RyaW5nKCIgMy4xIiksIDNlLTdmfSwKICAgICAgICB7LTMuMWYsIG5ldyBPU3RyaW5nKCItMy4xIiksIDNlLTdmfSwKICAgICAgICB7My4xZiwgbmV3IE9TdHJpbmcoIiszLjEiKSwgM2UtN2Z9LAogICAgICAgIHswLjBmLCBuZXcgT1N0cmluZygiLTAuMCIpLCAxZS03Zn0KICAgIH07CgoKICAgIC8vIHNhbF9Cb29sIHJlcyA9IHNhbF9UcnVlOwogICAgc2FsX3VJbnQzMiBpOwoKICAgIHRfcHJpbnQoInNpemVvZihmbG9hdCk9JWQsIHNpemVvZihkb3VibGUpPSVkXG4iLCBzaXplb2YoZmxvYXQpLCBzaXplb2YoZG91YmxlKSk7CgogICAgZm9yKGkgPSAwOyBpIDwgKHNpemVvZiAoYXJyVGVzdENhc2UpKS8oc2l6ZW9mIChUZXN0Q2FzZSkpOyBpKysgKQogICAgewogICAgICAgIGZsb2F0IGZBID0gYXJyVGVzdENhc2VbaV0uaW5wdXQxLT50b0Zsb2F0KCk7CiAgICAgICAgZmxvYXQgZkIgPSBhcnJUZXN0Q2FzZVtpXS5leHBWYWw7CiAgICAgICAgZmxvYXQgZlByZWMgPSBhcnJUZXN0Q2FzZVtpXS5tX25QcmVjaXNpb247CiAgICAgICAgZmxvYXQgZlJlc3VsdCA9IChmbG9hdCkgZmFicyhmQSAtIGZCKTsKICAgICAgICAvLyB0X3ByaW50KCJmbG9hdCByZXN1bHQ6IEE6KCUuOWYpIEI6KCUuOWYpIGZhYnMoQS1CKTolRVxuIiwgZkEsIGZCLCBmUmVzdWx0KTsKICAgICAgICB0X3ByaW50KCJmbG9hdCByZXN1bHQ6IEE6KCVFKSBCOiglRSkgZmFicyhBLUIpOiVFXG4iLCBmQSwgZkIsIChmbG9hdCkgZlJlc3VsdCk7CiAgICAgICAgc2FsX0Jvb2wgbGFzdFJlcyA9ICggZlJlc3VsdCA8PSBmUHJlYyApOwoKICAgICAgICBjaGFyIGNvbVtNQVhCVUZMRU5HVEhdOwogICAgICAgIGNvbVswXSA9ICdcJyc7CiAgICAgICAgY3B5bnN0cihjb20gKyAxLCAoKmFyclRlc3RDYXNlW2ldLmlucHV0MSksIE1BWEJVRkxFTkdUSCk7CiAgICAgICAgaW50IGxlbmd0aCA9IEFTdHJpbmdMZW4oICgqYXJyVGVzdENhc2VbaV0uaW5wdXQxKSApOwogICAgICAgIGNvbVtsZW5ndGggKyAxXSA9ICdcJyc7CiAgICAgICAgY29tW2xlbmd0aCArIDJdID0gMDsKCiAgICAgICAgY19ydGxfdHJlc19zdGF0ZQogICAgICAgICgKICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgIGxhc3RSZXMsCiAgICAgICAgICAgIGNvbSwKICAgICAgICAgICAgY3JlYXRlTmFtZSggcE1ldGgsICJ0b0Zsb2F0IiwgaSApCiAgICAgICAgKTsKCiAgICB9CgogICAgY19ydGxfdHJlc19zdGF0ZV9lbmQoaFJ0bFRlc3RSZXN1bHQsICJ0b0Zsb2F0Iik7Ci8vICAgIHJldHVybiAocmVzKTsKfQoKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIHRlc3RpbmcgdGhlIG1ldGhvZCB0b0RvdWJsZSgpCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIExMQTogZXh0ZXJuICJDIiB2b2lkIC8qIHNhbF9Cb29sICovIFNBTF9DQUxMIHRlc3RfcnRsX09TdHJpbmdfdG9Eb3VibGUoCi8vIExMQTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRlc3RSZXN1bHQgaFJ0bFRlc3RSZXN1bHQgKQovLyBMTEE6IHsKLy8gTExBOiAgICAgc2FsX0NoYXIgbWV0aE5hbWVbTUFYQlVGTEVOR1RIXTsKLy8gTExBOiAgICAgc2FsX0NoYXIqIHBNZXRoID0gbWV0aE5hbWU7Ci8vIExMQTogCi8vIExMQTogICAgIGNfcnRsX3RyZXNfc3RhdGVfc3RhcnQoaFJ0bFRlc3RSZXN1bHQsICJ0b0RvdWJsZSIpOwovLyBMTEE6ICAgICB0eXBlZGVmIHN0cnVjdCBUZXN0Q2FzZQovLyBMTEE6ICAgICB7Ci8vIExMQTogICAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICAgICAgZXhwVmFsOwovLyBMTEE6ICAgICBkb3VibGUgICAgICAgICAgICAgICAgICAgICAgIGV4cERpZmY7Ci8vIExMQTogICAgIE9TdHJpbmcqICAgICAgICAgICAgICAgICAgICAgaW5wdXQxOwovLyBMTEE6ICAgICB+VGVzdENhc2UoKSB7ZGVsZXRlIGlucHV0MTt9Ci8vIExMQTogICAgIH0gVGVzdENhc2U7Ci8vIExMQTogCi8vIExMQTogCi8vIExMQTogICAgIFRlc3RDYXNlIGFyclRlc3RDYXNlW10gPQovLyBMTEE6ICAgICB7Ci8vIExMQTogICAgICAgICB7My4wLCAxZS0zNSwgbmV3IE9TdHJpbmcoIjMiKX0sCi8vIExMQTogICAgICAgICB7My4xLCAxZS0yLCBuZXcgT1N0cmluZygiMy4xIil9LAovLyBMTEE6ICAgICAgICAgezMuMTQxNSwgMWUtNSwgbmV3IE9TdHJpbmcoIjMuMTQxNSIpfSwKLy8gTExBOiAgICAgICAgIHszLjE0MTU5MjY1MzUsIDFlLTExLCBuZXcgT1N0cmluZygiMy4xNDE1OTI2NTM1Iil9LAovLyBMTEE6ICAgICAgICAgezMuMTQxNTkyNjUzNTg5NzkzLCAxZS0xNSwgCi8vIExMQTogICAgICAgICAgICAgbmV3IE9TdHJpbmcoIjMuMTQxNTkyNjUzNTg5NzkzIil9LAovLyBMTEE6ICAgICAgICAgezMuMTQxNTkyNjUzNTg5NzkzMiwgMWUtMTYsIAovLyBMTEE6ICAgICAgICAgICAgIG5ldyBPU3RyaW5nKCIzLjE0MTU5MjY1MzU4OTc5MzIiKX0sCi8vIExMQTogICAgICAgICB7My4xNDE1OTI2NTM1ODk3OTMyMywgMWUtMTUsIAovLyBMTEE6ICAgICAgICAgICAgIG5ldyBPU3RyaW5nKCIzLjE0MTU5MjY1MzU4OTc5MzIzIil9LAovLyBMTEE6ICAgICAgICAgezMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzLCAxZS0xNSwgCi8vIExMQTogICAgICAgICAgICAgbmV3IE9TdHJpbmcoIjMuMTQxNTkyNjUzNTg5NzkzMjM4NDYyNjQzIil9LAovLyBMTEE6ICAgICAgICAgezYuNTgyMmUtMTYsIDFlLTIwLCBuZXcgT1N0cmluZygiNi41ODIyZS0xNiIpfSwKLy8gTExBOiAgICAgICAgIHs5LjEwOTZlLTMxLCAxZS0zNSwgbmV3IE9TdHJpbmcoIjkuMTA5NmUtMzEiKX0sCi8vIExMQTogICAgICAgICB7Mi45OTc5MjVlOCwgMTAsIG5ldyBPU3RyaW5nKCIyLjk5NzkyNWU4Iil9LAovLyBMTEE6ICAgICAgICAgezYuMjQxZTE4LCAxMDAsIG5ldyBPU3RyaW5nKCI2LjI0MWUxOCIpfSwKLy8gTExBOiAgICAgICAgIHsxLjdlLTMwOCwgMWUtMzUsIG5ldyBPU3RyaW5nKCIxLjdlLTMwOCIpfSwKLy8gTExBOiAgICAgICAgIHsxLjdlKzMwOCwgMTAwLCBuZXcgT1N0cmluZygiMS43ZSszMDgiKX0sCi8vIExMQTogICAgICAgICB7My4xLCAxZS0yLCBuZXcgT1N0cmluZygiMDMuMSIpfSwKLy8gTExBOiAgICAgICAgIHszLjEsIDFlLTIsIG5ldyBPU3RyaW5nKCIgMy4xIil9LAovLyBMTEE6ICAgICAgICAgey0zLjEsIDFlLTIsIG5ldyBPU3RyaW5nKCItMy4xIil9LAovLyBMTEE6ICAgICAgICAgezMuMSwgMWUtMiwgbmV3IE9TdHJpbmcoIiszLjEiKX0sCi8vIExMQTogICAgICAgICB7MC4wLCAxZS0yLCBuZXcgT1N0cmluZygiLTAuMCIpfQovLyBMTEE6ICAgICB9OwovLyBMTEE6IAovLyBMTEE6ICAgICBzYWxfQm9vbCByZXMgPSBzYWxfVHJ1ZTsKLy8gTExBOiAgICAgc2FsX0ludDMyIGk7Ci8vIExMQTogCi8vIExMQTogICAgIGZvcihpID0gMDsgaSA8IChzaXplb2YgKGFyclRlc3RDYXNlKSkvKHNpemVvZiAoVGVzdENhc2UpKTsgaSsrICkKLy8gTExBOiAgICAgewovLyBMTEE6ICAgICAgICAgZG91YmxlIGRSZXMgPSBhcnJUZXN0Q2FzZVtpXS5pbnB1dDEtPnRvRG91YmxlKCk7Ci8vIExMQTogICAgICAgICBkb3VibGUgZEVyZyA9IGRSZXMgLSBhcnJUZXN0Q2FzZVtpXS5leHBWYWwgOwovLyBMTEE6ICAgICAgICAgZG91YmxlIGRDb21wID0gZmFicyggZEVyZyApOwovLyBMTEE6ICAgICAgICAgc2FsX0Jvb2wgbGFzdFJlcyA9ICggZENvbXAgPD0gYXJyVGVzdENhc2VbaV0uZXhwRGlmZiApOwovLyBMTEE6IAovLyBMTEE6ICAgICAgICAgY2hhciBjb21bTUFYQlVGTEVOR1RIXTsKLy8gTExBOiAgICAgICAgIGNvbVswXSA9ICdcJyc7Ci8vIExMQTogICAgICAgICBjcHluc3RyKGNvbSArIDEsICgqYXJyVGVzdENhc2VbaV0uaW5wdXQxKSwgTUFYQlVGTEVOR1RIKTsKLy8gTExBOiAgICAgICAgIGludCBsZW5ndGggPSBBU3RyaW5nTGVuKCAoKmFyclRlc3RDYXNlW2ldLmlucHV0MSkgKTsKLy8gTExBOiAgICAgICAgIGNvbVtsZW5ndGggKyAxXSA9ICdcJyc7Ci8vIExMQTogICAgICAgICBjb21bbGVuZ3RoICsgMl0gPSAwOwovLyBMTEE6IAovLyBMTEE6ICAgICAgICAgY19ydGxfdHJlc19zdGF0ZQovLyBMTEE6ICAgICAgICAgKAovLyBMTEE6ICAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LAovLyBMTEE6ICAgICAgICAgICAgIGxhc3RSZXMsCi8vIExMQTogICAgICAgICAgICAgY29tLAovLyBMTEE6ICAgICAgICAgICAgIGNyZWF0ZU5hbWUoIHBNZXRoLCAidG9Eb3VibGUiLCBpICkKLy8gTExBOiAgICAgICAgICk7Ci8vIExMQTogCi8vIExMQTogICAgIH0KLy8gTExBOiAKLy8gTExBOiAgICAgY19ydGxfdHJlc19zdGF0ZV9lbmQoaFJ0bFRlc3RSZXN1bHQsICJ0b0RvdWJsZSIpOwovLyBMTEE6IC8vICAgIHJldHVybiAocmVzKTsKLy8gTExBOiB9CgovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovLyB0ZXN0aW5nIHRoZSBtZXRob2QgdG9Cb29sZWFuKCkKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCmV4dGVybiAiQyIgdm9pZCAvKiBzYWxfQm9vbCAqLyBTQUxfQ0FMTCB0ZXN0X3J0bF9PU3RyaW5nX3RvQm9vbGVhbigKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGVzdFJlc3VsdCBoUnRsVGVzdFJlc3VsdCkKewogICAgc2FsX0NoYXIgbWV0aE5hbWVbTUFYQlVGTEVOR1RIXTsKICAgIHNhbF9DaGFyKiBwTWV0aCA9IG1ldGhOYW1lOwoKICAgIGNfcnRsX3RyZXNfc3RhdGVfc3RhcnQoaFJ0bFRlc3RSZXN1bHQsICJ0b0Jvb2xlYW4iKTsKICAgIHR5cGVkZWYgc3RydWN0IFRlc3RDYXNlCiAgICB7CiAgICBzYWxfQ2hhciogICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzOwogICAgc2FsX0Jvb2wgICAgICAgICAgICAgICAgICAgICBleHBWYWw7CiAgICBPU3RyaW5nKiAgICAgICAgICAgICAgICAgICAgIGlucHV0OwoKICAgIH0gVGVzdENhc2U7CgogICAgVGVzdENhc2UgYXJyVGVzdENhc2VbXT17CgogICAgeyJleHBlY3RlZCB0cnVlIiwgc2FsX1RydWUsIG5ldyBPU3RyaW5nKCJUcnVlIil9LAogICAgeyJleHBlY3RlZCBmYWxzZSIsIHNhbF9GYWxzZSwgbmV3IE9TdHJpbmcoIkZhbHNlIil9LAogICAgeyJleHBlY3RlZCB0cnVlIiwgc2FsX1RydWUsIG5ldyBPU3RyaW5nKCIxIil9CiAgICB9OwoKCiAgICBzYWxfQm9vbCByZXMgPSBzYWxfVHJ1ZTsKICAgIHNhbF91SW50MzIgaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgKHNpemVvZiAoYXJyVGVzdENhc2UpKS8oc2l6ZW9mIChUZXN0Q2FzZSkpOyBpKyspCiAgICB7CiAgICAgICAgc2FsX0Jvb2wgYlJlcyA9IGFyclRlc3RDYXNlW2ldLmlucHV0LT50b0Jvb2xlYW4oKTsKICAgICAgICBzYWxfQm9vbCBsYXN0UmVzID0gKGJSZXMgPT0gYXJyVGVzdENhc2VbaV0uZXhwVmFsKTsKICAgICAgICBjX3J0bF90cmVzX3N0YXRlCiAgICAgICAgKAogICAgICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICAgICAgbGFzdFJlcywKICAgICAgICAgICAgYXJyVGVzdENhc2VbaV0uY29tbWVudHMsCiAgICAgICAgICAgIGNyZWF0ZU5hbWUoIHBNZXRoLCAidG9Cb29sZWFuIiwgaSApCgogICAgICAgICk7CiAgICAgICAgcmVzICY9IGxhc3RSZXM7CiAgICB9CiAgICBjX3J0bF90cmVzX3N0YXRlX2VuZChoUnRsVGVzdFJlc3VsdCwgInRvQm9vbGVhbiIpOwovLyAgICAgcmV0dXJuICggcmVzICk7Cn0KCgoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gdGVzdGluZyB0aGUgbWV0aG9kIHRvSW50MzIoIHNhbF9JbnQxNiByYWRpeCA9IDIsOCwxMCwxNiwzNiApCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnNhbF9Cb29sIHRlc3RfdG9JbnQzMiggIGludCBudW0sIGNvbnN0IHNhbF9DaGFyKiogaW4sIApjb25zdCBzYWxfSW50MzIgKmV4cFZhbCxzYWxfSW50MTYgcmFkaXgsIGhUZXN0UmVzdWx0IGhSdGxUZXN0UmVzdWx0ICkKewogICAgc2FsX0Jvb2wgcmVzID0gc2FsX1RydWU7CiAgICBzYWxfQ2hhciBtZXRoTmFtZVtNQVhCVUZMRU5HVEhdOwogICAgc2FsX0NoYXIqIHBNZXRoID0gbWV0aE5hbWU7CiAgICBzYWxfSW50MzIgaTsKCiAgICBmb3IoIGkgPSAwOyBpIDwgbnVtOyBpKysgKQogICAgewogICAgICAgIE9TdHJpbmcgc3RyKGluW2ldKTsKICAgICAgICBzYWxfSW50MzIgaW50UmVzID0gc3RyLnRvSW50MzIocmFkaXgpOwogICAgICAgIHNhbF9Cb29sIGxhc3RSZXMgPSAoaW50UmVzID09IGV4cFZhbFtpXSk7CgogICAgICAgIGNoYXIgYnVmW01BWEJVRkxFTkdUSF07CiAgICAgICAgYnVmWzBdID0gJ1wnJzsKICAgICAgICBjcHluc3RyKCBidWYgKyAxLCBpbltpXSwgTUFYQlVGTEVOR1RIICk7CiAgICAgICAgaW50IGxlbmd0aCA9IEFTdHJpbmdMZW4oIGluW2ldICk7CiAgICAgICAgYnVmW2xlbmd0aCArIDFdID0gJ1wnJzsKICAgICAgICBidWZbbGVuZ3RoICsgMl0gPSAwOwoKICAgICAgICBjX3J0bF90cmVzX3N0YXRlCiAgICAgICAgKAogICAgICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICAgICAgbGFzdFJlcywKICAgICAgICAgICAgYnVmLAogICAgICAgICAgICBjcmVhdGVOYW1lKCBwTWV0aCwidG9JbnQzMiIsIGkgKQogICAgICAgICk7CgogICAgICAgIHJlcyAmPSBsYXN0UmVzOwogICAgfQoKICAgIHJldHVybiggcmVzICk7Cn0KCnNhbF9Cb29sIFNBTF9DQUxMIHRlc3RfcnRsX09TdHJpbmdfdG9JbnQzMl93cm9uZ1JhZGl4KAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoVGVzdFJlc3VsdCBoUnRsVGVzdFJlc3VsdCApCnsKICAgIDo6cnRsOjpPU3RyaW5nIHN0cigiMCIpOwoKICAgIHNhbF9JbnQzMiBpUmVzID0gc3RyLnRvSW50MzIoLTEpOwoKICAgIHJldHVybgogICAgKAogICAgICAgIGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAoCiAgICAgICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgICAgICBpUmVzID09IDAsCiAgICAgICAgICAgICJ3cm9uZyByYWRpeCAtMSIsCiAgICAgICAgICAgICJ0b0ludDMyKCAwLCB3cm9uZyByYWRpeCAtMSApIgogICAgICAgICkKICAgICk7Cn0KCmV4dGVybiAiQyIgdm9pZCAvKiBzYWxfQm9vbCAqLyBTQUxfQ0FMTCB0ZXN0X3J0bF9PU3RyaW5nX3RvSW50MzIoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUZXN0UmVzdWx0IGhSdGxUZXN0UmVzdWx0ICkKewogICAgc2FsX0ludDMyIGV4cFZhbHVlc1trQmFzZTM2TnVtc0NvdW50XTsKICAgIHNhbF9JbnQzMiBpOwoKICAgIGNfcnRsX3RyZXNfc3RhdGVfc3RhcnQoaFJ0bFRlc3RSZXN1bHQsICJ0b0ludDMyIik7CiAgICBmb3IgKCBpID0gMDsgaSA8IGtCYXNlMzZOdW1zQ291bnQ7IGkrKyApCiAgICAgICAgICAgIGV4cFZhbHVlc1tpXSA9IGk7CgogICAgc2FsX0Jvb2wgcmVzID0gY19ydGxfdHJlc19zdGF0ZQogICAgKAogICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgIHRlc3RfdG9JbnQzMigga0JpbmFyeU51bXNDb3VudCwga0JpbmFyeU51bXNTdHIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwVmFsdWVzLCBrUmFkaXhCaW5hcnksIGhSdGxUZXN0UmVzdWx0ICksCiAgICAgICAgImtCaW5hcnlOdW1zU3RyIiwKICAgICAgICAidG9JbnQzMiggcmFkaXggMiApIgogICAgKTsKICAgIHJlcyAmPSBjX3J0bF90cmVzX3N0YXRlCiAgICAoCiAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgdGVzdF90b0ludDMyKCBrSW50MzJNYXhOdW1zQ291bnQsIGtCaW5hcnlNYXhOdW1zU3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAga0ludDMyTWF4TnVtcywga1JhZGl4QmluYXJ5LCBoUnRsVGVzdFJlc3VsdCApLAogICAgICAgICJrQmluYXJ5TWF4TnVtc1N0ciIsCiAgICAgICAgInRvSW50MzJfQm91bmRhcmllcyggcmFkaXggMiApIgogICAgKTsKCiAgICByZXMgJj0gY19ydGxfdHJlc19zdGF0ZQogICAgKAogICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgIHRlc3RfdG9JbnQzMigga09jdG9sTnVtc0NvdW50LCBrT2N0b2xOdW1zU3RyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhwVmFsdWVzLCBrUmFkaXhPY3RvbCwgaFJ0bFRlc3RSZXN1bHQgKSwKICAgICAgICAia09jdG9sTnVtc1N0ciIsCiAgICAgICAgInRvSW50MzIoIHJhZGl4IDggKSIKICAgICk7CgogICAgcmVzICY9IGNfcnRsX3RyZXNfc3RhdGUKICAgICgKICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICB0ZXN0X3RvSW50MzIoIGtJbnQzMk1heE51bXNDb3VudCwga09jdG9sTWF4TnVtc1N0ciwKICAgICAgICAgICAgICAgICAgICAoc2FsX0ludDMyKilrSW50MzJNYXhOdW1zLCBrUmFkaXhPY3RvbCwgaFJ0bFRlc3RSZXN1bHQgKSwKICAgICAgICAia09jdG9sTWF4TnVtc1N0ciIsCiAgICAgICAgInRvSW50MzJfQm91bmRhcmllcyggcmFkaXggOCApIgogICAgKTsKCiAgICByZXMgJj0gY19ydGxfdHJlc19zdGF0ZQogICAgKAogICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgIHRlc3RfdG9JbnQzMigga0RlY2ltYWxOdW1zQ291bnQsIGtEZWNpbWFsTnVtc1N0ciwgZXhwVmFsdWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSYWRpeERlY2ltYWwsIGhSdGxUZXN0UmVzdWx0ICksCiAgICAgICAgImtEZWNpbWFsTnVtc1N0ciIsCiAgICAgICAgInRvSW50MzIoIHJhZGl4IDEwICkiCiAgICApOwoKICAgIHJlcyAmPSBjX3J0bF90cmVzX3N0YXRlCiAgICAoCiAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgdGVzdF90b0ludDMyKCBrSW50MzJNYXhOdW1zQ291bnQsIGtEZWNpbWFsTWF4TnVtc1N0ciwKICAgICAgICAgICAgICAgIChzYWxfSW50MzIqKWtJbnQzMk1heE51bXMsIGtSYWRpeERlY2ltYWwsIGhSdGxUZXN0UmVzdWx0ICksCiAgICAgICAgImtEZWNpbWFsTWF4TnVtc1N0ciIsCiAgICAgICAgInRvSW50MzJfQm91bmRhcmllcyggcmFkaXggMTAgKSIKICAgICk7CgogICAgcmVzICY9IGNfcnRsX3RyZXNfc3RhdGUKICAgICgKICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICB0ZXN0X3RvSW50MzIoIGtIZXhEZWNpbWFsTnVtc0NvdW50LCBrSGV4RGVjaW1hbE51bXNTdHIsIGV4cFZhbHVlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSYWRpeEhleGRlY2ltYWwsIGhSdGxUZXN0UmVzdWx0ICksCiAgICAgICAgImtIZXhEZWNpbWFsTnVtc1N0ciIsCiAgICAgICAgInRvSW50MzIoIHJhZGl4IDE2ICkiCiAgICApOwoKICAgIHJlcyAmPSBjX3J0bF90cmVzX3N0YXRlCiAgICAoCiAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgdGVzdF90b0ludDMyKCBrSW50MzJNYXhOdW1zQ291bnQsIGtIZXhEZWNpbWFsTWF4TnVtc1N0ciwKICAgICAgICAgICAgKHNhbF9JbnQzMiopa0ludDMyTWF4TnVtcywga1JhZGl4SGV4ZGVjaW1hbCwgaFJ0bFRlc3RSZXN1bHQgKSwKICAgICAgICAia0hleERlY2ltYWxNYXhOdW1zU3RyIiwKICAgICAgICAidG9JbnQzMl9Cb3VuZGFyaWVzKCByYWRpeCAxNiApIgogICAgKTsKCiAgICByZXMgJj0gY19ydGxfdHJlc19zdGF0ZQogICAgKAogICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgIHRlc3RfdG9JbnQzMigga0Jhc2UzNk51bXNDb3VudCwga0Jhc2UzNk51bXNTdHIsIGV4cFZhbHVlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmFkaXhCYXNlMzYsIGhSdGxUZXN0UmVzdWx0ICksCiAgICAgICAgImtCYXNlMzZOdW1zU3RyIiwKICAgICAgICAidG9JbnQzMiggcmFkaXggMzYgKSIKICAgICk7CgogICAgcmVzICY9IGNfcnRsX3RyZXNfc3RhdGUKICAgICgKICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICB0ZXN0X3RvSW50MzIoIGtJbnQzMk1heE51bXNDb3VudCwga0Jhc2UzNk1heE51bXNTdHIsCiAgICAgICAgICAgICAgICAoc2FsX0ludDMyKilrSW50MzJNYXhOdW1zLCBrUmFkaXhCYXNlMzYsIGhSdGxUZXN0UmVzdWx0ICksCiAgICAgICAgImtCYXNlMzZNYXhOdW1zU3RyIiwKICAgICAgICAidG9JbnQzMl9Cb3VuZGFyaWVzKCByYWRpeCAzNiApIgogICAgKTsKCiAgICBjb25zdCBzYWxfSW50MTYgblNwZWNDYXNlcyA9IDU7CiAgICBzdGF0aWMgY29uc3Qgc2FsX0NoYXIgKnNwU3RyaW5nW25TcGVjQ2FzZXNdID0KICAgIHsKICAgICAgICAiLTEiLAogICAgICAgICIrMSIsCiAgICAgICAgIiAxIiwKICAgICAgICAiIC0xIiwKICAgICAgICAiMDAxIgogICAgfTsKCiAgICBzYWxfSW50MzIgZXhwU3BlY1ZhbFtuU3BlY0Nhc2VzXSA9CiAgICB7CiAgICAgICAgLTEsCiAgICAgICAgMSwKICAgICAgICAxLAogICAgICAgIC0xLAogICAgICAgIDEKICAgIH07CgogICAgcmVzICY9IGNfcnRsX3RyZXNfc3RhdGUKICAgICgKICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICB0ZXN0X3RvSW50MzIoIG5TcGVjQ2FzZXMsIHNwU3RyaW5nLCBleHBTcGVjVmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSYWRpeERlY2ltYWwsIGhSdGxUZXN0UmVzdWx0ICksCiAgICAgICAgInNwZWNpYWwgY2FzZXMiLAogICAgICAgICJ0b0ludDMyKCBzcGVjaWFsY2FzZXMgKSIKICAgICk7CgogICAgcmVzICY9IHRlc3RfcnRsX09TdHJpbmdfdG9JbnQzMl93cm9uZ1JhZGl4KCBoUnRsVGVzdFJlc3VsdCApOwoKICAgIGNfcnRsX3RyZXNfc3RhdGVfZW5kKGhSdGxUZXN0UmVzdWx0LCAidG9JbnQzMiIpOwovLyAgICByZXR1cm4gKCByZXMgKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gdGVzdGluZyB0aGUgbWV0aG9kIHRvSW50NjQoIHNhbF9JbnQxNiByYWRpeCA9IDIsOCwxMCwxNiwzNiApCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnNhbF9Cb29sIHRlc3RfdG9JbnQ2NCggaW50IG51bSwgY29uc3Qgc2FsX0NoYXIqKiBpbiwgCmNvbnN0IHNhbF9JbnQ2NCAqZXhwVmFsLHNhbF9JbnQxNiByYWRpeCwgaFRlc3RSZXN1bHQgaFJ0bFRlc3RSZXN1bHQgKQp7CiAgICBzYWxfQm9vbCByZXMgPSBzYWxfVHJ1ZTsKICAgIHNhbF9DaGFyIG1ldGhOYW1lW01BWEJVRkxFTkdUSF07CiAgICBzYWxfQ2hhciogcE1ldGggPSBtZXRoTmFtZTsKICAgIHNhbF9JbnQzMiBpOwoKICAgIGZvciggaSA9IDA7IGkgPCBudW07IGkrKyApCiAgICB7CiAgICAgICAgT1N0cmluZyBzdHIoIGluW2ldICk7CiAgICAgICAgc2FsX0ludDY0IGludFJlcyA9IHN0ci50b0ludDY0KCByYWRpeCApOwogICAgICAgIHNhbF9Cb29sIGxhc3RSZXMgPSAoIGludFJlcyA9PSBleHBWYWxbaV0gKTsKCiAgICAgICAgY2hhciBidWZbTUFYQlVGTEVOR1RIXTsKICAgICAgICBidWZbMF0gPSAnXCcnOwogICAgICAgIGNweW5zdHIoIGJ1ZiArIDEsIGluW2ldLCBNQVhCVUZMRU5HVEggKTsKICAgICAgICBpbnQgbGVuZ3RoID0gQVN0cmluZ0xlbihpbltpXSk7CiAgICAgICAgYnVmW2xlbmd0aCArIDFdID0gJ1wnJzsKICAgICAgICBidWZbbGVuZ3RoICsgMl0gPSAwOwoKICAgICAgICBjX3J0bF90cmVzX3N0YXRlCiAgICAgICAgKAogICAgICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICAgICAgbGFzdFJlcywKICAgICAgICAgICAgYnVmLAogICAgICAgICAgICBjcmVhdGVOYW1lKCBwTWV0aCwgInRvSW50NjQiLCBpICkKICAgICAgICApOwoKICAgICAgICByZXMgJj0gbGFzdFJlczsKICAgIH0KICAgIHJldHVybiAocmVzKTsKfQoKc2FsX0Jvb2wgU0FMX0NBTEwgdGVzdF9ydGxfT1N0cmluZ190b0ludDY0X3dyb25nUmFkaXgoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUZXN0UmVzdWx0IGhSdGxUZXN0UmVzdWx0ICkKewogICAgOjpydGw6Ok9TdHJpbmcgc3RyKCIwIik7CgogICAgc2FsX0ludDY0IGlSZXMgPSBzdHIudG9JbnQ2NCgtMSk7CgogICAgcmV0dXJuICgKCiAgICAgICAgY19ydGxfdHJlc19zdGF0ZQogICAgICAgICggaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICBpUmVzID09IDAsCiAgICAgICAgICAid3JvbmcgcmFkaXggLTEiLAogICAgICAgICAgInRvSW50NjQoIHdyb25nIHJhZGl4IC0xKSIKICAgICAgICApCiAgICAgKTsKfQoKZXh0ZXJuICJDIiB2b2lkIC8qIHNhbF9Cb29sICovIFNBTF9DQUxMIHRlc3RfcnRsX09TdHJpbmdfdG9JbnQ2NCgKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaFRlc3RSZXN1bHQgaFJ0bFRlc3RSZXN1bHQgKQp7CiAgICBzYWxfSW50NjQgZXhwVmFsdWVzW2tCYXNlMzZOdW1zQ291bnRdOwogICAgc2FsX0ludDMyIGk7CgogICAgY19ydGxfdHJlc19zdGF0ZV9zdGFydChoUnRsVGVzdFJlc3VsdCwgInRvSW50NjQiKTsKICAgIGZvciAoaSA9IDA7IGkgPCBrQmFzZTM2TnVtc0NvdW50OyBleHBWYWx1ZXNbaV0gPSBpLCBpKyspOwoKICAgIHNhbF9Cb29sIHJlcyA9IGNfcnRsX3RyZXNfc3RhdGUKICAgICgKICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICB0ZXN0X3RvSW50NjQoIGtCaW5hcnlOdW1zQ291bnQsIGtCaW5hcnlOdW1zU3RyLCBleHBWYWx1ZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1JhZGl4QmluYXJ5LCBoUnRsVGVzdFJlc3VsdCApLAogICAgICAgICJrQmluYXJ5TnVtc1N0ciIsCiAgICAgICAgInRvSW50NjQoIHJhZGl4IDIgKSIKICAgICk7CgogICAgcmVzICY9IGNfcnRsX3RyZXNfc3RhdGUKICAgICgKICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICB0ZXN0X3RvSW50NjQoIGtJbnQzMk1heE51bXNDb3VudCwga0JpbmFyeU1heE51bXNTdHIsCiAgICAgICAgICAgICAgICAoc2FsX0ludDY0KilrSW50NjRNYXhOdW1zLCBrUmFkaXhCaW5hcnksIGhSdGxUZXN0UmVzdWx0ICksCiAgICAgICAgImtCaW5hcnlNYXhOdW1zU3RyIiwKICAgICAgICAidG9JbnQ2NF9Cb3VuZGFyaWVzKCByYWRpeCAyICkiCiAgICApOwoKICAgIHJlcyAmPSBjX3J0bF90cmVzX3N0YXRlCiAgICAoCiAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgdGVzdF90b0ludDY0KCBrT2N0b2xOdW1zQ291bnQsIGtPY3RvbE51bXNTdHIsIGV4cFZhbHVlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrUmFkaXhPY3RvbCwgaFJ0bFRlc3RSZXN1bHQgKSwKICAgICAgICAia09jdG9sTnVtc1N0ciIsCiAgICAgICAgInRvSW50NjQoIHJhZGl4IDggKSIKICAgICk7CgogICAgcmVzICY9IGNfcnRsX3RyZXNfc3RhdGUKICAgICgKICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICB0ZXN0X3RvSW50NjQoIGtJbnQzMk1heE51bXNDb3VudCwga09jdG9sTWF4TnVtc1N0ciwKICAgICAgICAgICAgICAgICAgICAoc2FsX0ludDY0KilrSW50NjRNYXhOdW1zLCBrUmFkaXhPY3RvbCwgaFJ0bFRlc3RSZXN1bHQgKSwKICAgICAgICAia09jdG9sTWF4TnVtc1N0ciIsCiAgICAgICAgInRvSW50NjRfQm91bmRhcmllcyggcmFkaXggOCApIgogICAgKTsKCiAgICByZXMgJj0gY19ydGxfdHJlc19zdGF0ZQogICAgKAogICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgIHRlc3RfdG9JbnQ2NCgga0RlY2ltYWxOdW1zQ291bnQsIGtEZWNpbWFsTnVtc1N0ciwgZXhwVmFsdWVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSYWRpeERlY2ltYWwsIGhSdGxUZXN0UmVzdWx0ICksCiAgICAgICAgImtEZWNpbWFsTnVtc1N0ciIsCiAgICAgICAgInRvSW50NjQoIHJhZGl4IDEwICkiCiAgICApOwoKICAgIHJlcyAmPSBjX3J0bF90cmVzX3N0YXRlCiAgICAoCiAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgdGVzdF90b0ludDY0KCBrSW50MzJNYXhOdW1zQ291bnQsIGtEZWNpbWFsTWF4TnVtc1N0ciwKICAgICAgICAgICAgICAgIChzYWxfSW50NjQqKWtJbnQ2NE1heE51bXMsIGtSYWRpeERlY2ltYWwsIGhSdGxUZXN0UmVzdWx0ICksCiAgICAgICAgImtEZWNpbWFsTWF4TnVtc1N0ciIsCiAgICAgICAgInRvSW50NjRfQm91bmRhcmllcyggcmFkaXggMTAgKSIKICAgICk7CgogICAgcmVzICY9IGNfcnRsX3RyZXNfc3RhdGUKICAgICgKICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICB0ZXN0X3RvSW50NjQoIGtIZXhEZWNpbWFsTnVtc0NvdW50LCBrSGV4RGVjaW1hbE51bXNTdHIsIGV4cFZhbHVlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSYWRpeEhleGRlY2ltYWwsIGhSdGxUZXN0UmVzdWx0ICksCiAgICAgICAgImtIZXhEZWNpbWFsTnVtc1N0ciIsCiAgICAgICAgInRvSW50NjQoIHJhZGl4IDE2ICkiCiAgICApOwoKICAgIHJlcyAmPSBjX3J0bF90cmVzX3N0YXRlCiAgICAoCiAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgdGVzdF90b0ludDY0KCBrSW50MzJNYXhOdW1zQ291bnQsIGtIZXhEZWNpbWFsTWF4TnVtc1N0ciwKICAgICAgICAgICAgKHNhbF9JbnQ2NCopa0ludDY0TWF4TnVtcywga1JhZGl4SGV4ZGVjaW1hbCwgaFJ0bFRlc3RSZXN1bHQgKSwKICAgICAgICAia0hleERlY2ltYWxNYXhOdW1zU3RyIiwKICAgICAgICAidG9JbnQ2NF9Cb3VuZGFyaWVzKCByYWRpeCAxNiApIgogICAgKTsKCiAgICByZXMgJj0gY19ydGxfdHJlc19zdGF0ZQogICAgKAogICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgIHRlc3RfdG9JbnQ2NCgga0Jhc2UzNk51bXNDb3VudCwga0Jhc2UzNk51bXNTdHIsIGV4cFZhbHVlcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtSYWRpeEJhc2UzNiwgaFJ0bFRlc3RSZXN1bHQgKSwKICAgICAgICAia0Jhc2UzNk51bXNTdHIiLAogICAgICAgICJ0b0ludDY0KCByYWRpeCAzNiApIgogICAgKTsKCiAgICByZXMgJj0gY19ydGxfdHJlc19zdGF0ZQogICAgKAogICAgICAgIGhSdGxUZXN0UmVzdWx0LAogICAgICAgIHRlc3RfdG9JbnQ2NCgga0ludDMyTWF4TnVtc0NvdW50LCBrQmFzZTM2TWF4TnVtc1N0ciwKICAgICAgICAgICAgKHNhbF9JbnQ2NCopa0ludDY0TWF4TnVtcywga1JhZGl4QmFzZTM2LCBoUnRsVGVzdFJlc3VsdCApLAogICAgICAgICJrQmFzZTM2TWF4TnVtc1N0ciIsCiAgICAgICAgInRvSW50NjRfQm91bmRhcmllcyggcmFkaXggMzYgKSIKICAgICk7CgoKCiAgICBjb25zdCBzYWxfSW50MTYgblNwZWNDYXNlcyA9IDU7CiAgICBzdGF0aWMgY29uc3Qgc2FsX0NoYXIgKnNwU3RyaW5nW25TcGVjQ2FzZXNdID0KICAgIHsKICAgICAgICAiLTEiLAogICAgICAgICIrMSIsCiAgICAgICAgIiAxIiwKICAgICAgICAiIC0xIiwKICAgICAgICAiMDAxIgogICAgfTsKCiAgICBzYWxfSW50NjQgZXhwU3BlY1ZhbFtuU3BlY0Nhc2VzXSA9CiAgICB7CiAgICAgICAgLTEsCiAgICAgICAgMSwKICAgICAgICAxLAogICAgICAgIC0xLAogICAgICAgIDEKICAgIH07CgogICAgcmVzICY9IGNfcnRsX3RyZXNfc3RhdGUKICAgICgKICAgICAgICBoUnRsVGVzdFJlc3VsdCwKICAgICAgICB0ZXN0X3RvSW50NjQoIG5TcGVjQ2FzZXMsIHNwU3RyaW5nLCBleHBTcGVjVmFsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1JhZGl4RGVjaW1hbCwgaFJ0bFRlc3RSZXN1bHQgKSwKICAgICAgICAic3BlY2lhbCBjYXNlcyIsCiAgICAgICAgInRvSW50NjQoIHNwZWNpYWxjYXNlcyApIgogICAgKTsKCiAgICByZXMgJj0gdGVzdF9ydGxfT1N0cmluZ190b0ludDY0X3dyb25nUmFkaXgoIGhSdGxUZXN0UmVzdWx0ICk7CgogICAgY19ydGxfdHJlc19zdGF0ZV9lbmQoaFJ0bFRlc3RSZXN1bHQsICJ0b0ludDY0Iik7Ci8vICAgIHJldHVybiAocmVzKTsKfQoKLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy8gdGVzdGluZyB0aGUgbWV0aG9kIHJlcGxhY2UoIHNhbF9DaGFyIG9sZENoYXIsIHNhbF9DaGFyIG5ld0NoYXIgKQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpleHRlcm4gIkMiIHZvaWQgLyogc2FsX0Jvb2wgKi8gU0FMX0NBTEwgdGVzdF9ydGxfT1N0cmluZ19yZXBsYWNlKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUZXN0UmVzdWx0IGhSdGxUZXN0UmVzdWx0KQp7CiAgICBzYWxfQ2hhciBtZXRoTmFtZVtNQVhCVUZMRU5HVEhdOwogICAgc2FsX0NoYXIqIHBNZXRoID0gbWV0aE5hbWU7CgogICAgY19ydGxfdHJlc19zdGF0ZV9zdGFydChoUnRsVGVzdFJlc3VsdCwgInJlcGxhY2UiKTsKdHlwZWRlZiBzdHJ1Y3QgVGVzdENhc2UKewogICAgc2FsX0NoYXIqICAgICAgICAgICAgICAgICAgICBjb21tZW50czsKICAgIE9TdHJpbmcqICAgICAgICAgICAgICAgICAgICAgZXhwVmFsOwogICAgT1N0cmluZyogICAgICAgICAgICAgICAgICAgICBpbnB1dDsKICAgIHNhbF9DaGFyICAgICAgICAgICAgICAgICAgICAgb2xkQ2hhcjsKICAgIHNhbF9DaGFyICAgICAgICAgICAgICAgICAgICAgbmV3Q2hhcjsKCiAgICB+VGVzdENhc2UoKSB7IGRlbGV0ZSBpbnB1dDsgZGVsZXRlIGV4cFZhbDt9Cn0gVGVzdENhc2U7CgpUZXN0Q2FzZSBhcnJUZXN0Q2FzZVtdPXsKCiAgICB7InN0cmluZyBkaWZmZXJzIiwgbmV3IE9TdHJpbmcoa1Rlc3RTdHIxOCksCiAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHI0KSwnUycsJ3MnfSwKICAgIHsic3RyaW5nIGRpZmZlcnMiLCBuZXcgT1N0cmluZyhrVGVzdFN0cjE5KSwgCiAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHIxNyksKHNhbF9DaGFyKScgJywoc2FsX0NoYXIpJy0nfSwKICAgIHsic2FtZSBzdHJpbmcsIG5vIHJlcGxhY2UgIiwgbmV3IE9TdHJpbmcoa1Rlc3RTdHIyMiksIAogICAgICAgIG5ldyBPU3RyaW5nKGtUZXN0U3RyMjIpLCcqJywnOCd9CiAgICB9OwoKCiAgICBzYWxfQm9vbCByZXMgPSBzYWxfVHJ1ZTsKICAgIHNhbF91SW50MzIgaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgKHNpemVvZiAoYXJyVGVzdENhc2UpKS8oc2l6ZW9mIChUZXN0Q2FzZSkpOyBpKyspCiAgICB7CiAgICAgICAgOjpydGw6Ok9TdHJpbmcgYVN0cjE7CiAgICAgICAgYVN0cjE9IGFyclRlc3RDYXNlW2ldLmlucHV0LT5yZXBsYWNlKGFyclRlc3RDYXNlW2ldLm9sZENoYXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcnJUZXN0Q2FzZVtpXS5uZXdDaGFyKTsKCiAgICAgICAgcmVzICY9IGNfcnRsX3RyZXNfc3RhdGUKICAgICAgICAgICAgICAgICAgICAgICAgKAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYXJyVGVzdENhc2VbaV0uZXhwVmFsLT5jb21wYXJlVG8oYVN0cjEpID09IDApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyVGVzdENhc2VbaV0uY29tbWVudHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjcmVhdGVOYW1lKCBwTWV0aCwgInJlcGxhY2UiLCBpICkKCiAgICAgICAgICAgICAgICAgICAgICAgICk7CiAgICB9CiAgICBjX3J0bF90cmVzX3N0YXRlX2VuZChoUnRsVGVzdFJlc3VsdCwgInJlcGxhY2UiKTsKLy8gICAgIHJldHVybiAoIHJlcyApOwp9CgoKCi8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vIHRlc3RpbmcgdGhlIG1ldGhvZCByZXBsYWNlQXQoIHNhbF9JbnQzMiBpbmRleCwgc2FsX0ludDMyIGNvdW50LAovLyBjb25zdCBPU3RyaW5nJiBuZXdTdHIgKQovLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpleHRlcm4gIkMiIHZvaWQgLyogc2FsX0Jvb2wgKi8gU0FMX0NBTEwgdGVzdF9ydGxfT1N0cmluZ19yZXBsYWNlQXQoCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhUZXN0UmVzdWx0IGhSdGxUZXN0UmVzdWx0KQp7CiAgICBzYWxfQ2hhciBtZXRoTmFtZVtNQVhCVUZMRU5HVEhdOwogICAgc2FsX0NoYXIqIHBNZXRoID0gbWV0aE5hbWU7CgogICAgY19ydGxfdHJlc19zdGF0ZV9zdGFydChoUnRsVGVzdFJlc3VsdCwgInJlcGxhY2VBdCIpOwogICAgdHlwZWRlZiBzdHJ1Y3QgVGVzdENhc2UKICAgIHsKICAgICAgICBzYWxfQ2hhciogICAgICAgICAgICAgICAgICAgIGNvbW1lbnRzOwogICAgICAgIE9TdHJpbmcqICAgICAgICAgICAgICAgICAgICAgZXhwVmFsOwogICAgICAgIE9TdHJpbmcqICAgICAgICAgICAgICAgICAgICAgaW5wdXQ7CiAgICAgICAgT1N0cmluZyogICAgICAgICAgICAgICAgICAgICBuZXdTdHI7CiAgICAgICAgc2FsX0ludDMyICAgICAgICAgICAgICAgICAgICBpbmRleDsKICAgICAgICBzYWxfSW50MzIgICAgICAgICAgICAgICAgICAgIGNvdW50OwoKICAgICAgICB+VGVzdENhc2UoKSB7IGRlbGV0ZSBpbnB1dDsgZGVsZXRlIGV4cFZhbDsgZGVsZXRlIG5ld1N0cjt9CiAgICB9IFRlc3RDYXNlOwoKICAgIFRlc3RDYXNlIGFyclRlc3RDYXNlW109CiAgICB7CgogICAgICAgIHsgInN0cmluZyBkaWZmZXJzIiwgbmV3IE9TdHJpbmcoa1Rlc3RTdHIyKSwgbmV3IE9TdHJpbmcoa1Rlc3RTdHIyMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHIyKSwgMCwga1Rlc3RTdHIyMkxlbiB9LAoKICAgICAgICB7ICJsYXJnZXIgaW5kZXgiLCBuZXcgT1N0cmluZyhrVGVzdFN0cjEpLCBuZXcgT1N0cmluZyhrVGVzdFN0cjcpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPU3RyaW5nKGtUZXN0U3RyOCksIDY0LCBrVGVzdFN0cjhMZW4gfSwKCiAgICAgICAgeyAibGFyZ2VyIGNvdW50IiwgbmV3IE9TdHJpbmcoa1Rlc3RTdHIyKSwgbmV3IE9TdHJpbmcoa1Rlc3RTdHIyMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE9TdHJpbmcoa1Rlc3RTdHIyKSwwLCA2NCB9LAoKICAgICAgICB7ICJuYXZpZ2F0ZSBpbmRleCIsIG5ldyBPU3RyaW5nKGtUZXN0U3RyMiksIG5ldyBPU3RyaW5nKGtUZXN0U3RyMjIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBPU3RyaW5nKGtUZXN0U3RyMiksIC02NCwgNjQgfSwKCiAgICAgICAgeyAibnVsbCBzdHJpbmciLCBuZXcgT1N0cmluZygiIiksCiAgICAgICAgICAgICAgICBuZXcgT1N0cmluZyhrVGVzdFN0cjE0KSxuZXcgT1N0cmluZygiIiksIDAsIGtUZXN0U3RyMTRMZW4gfQogICAgfTsKCiAgICBzYWxfQm9vbCByZXMgPSBzYWxfVHJ1ZTsKICAgIHNhbF91SW50MzIgaTsKCiAgICBmb3IgKGkgPSAwOyBpIDwgKHNpemVvZiAoYXJyVGVzdENhc2UpKS8oc2l6ZW9mIChUZXN0Q2FzZSkpOyBpKyspCiAgICB7CiAgICAgICAgOjpydGw6Ok9TdHJpbmcgYVN0cjE7CiAgICAgICAgYVN0cjE9IGFyclRlc3RDYXNlW2ldLmlucHV0LT5yZXBsYWNlQXQoIGFyclRlc3RDYXNlW2ldLmluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyVGVzdENhc2VbaV0uY291bnQsICphcnJUZXN0Q2FzZVtpXS5uZXdTdHIgKTsKCiAgICAgICAgc2FsX0Jvb2wgbGFzdFJlcyA9ICggYXJyVGVzdENhc2VbaV0uZXhwVmFsLT5jb21wYXJlVG8oYVN0cjEpID09IDAgKTsKCiAgICAgICAgY19ydGxfdHJlc19zdGF0ZQogICAgICAgICgKICAgICAgICAgICAgaFJ0bFRlc3RSZXN1bHQsCiAgICAgICAgICAgIGxhc3RSZXMsCiAgICAgICAgICAgIGFyclRlc3RDYXNlW2ldLmNvbW1lbnRzLAogICAgICAgICAgICBjcmVhdGVOYW1lKCBwTWV0aCwgInJlcGxhY2VBdCIsIGkgKQoKICAgICAgICApOwogICAgICAgIHJlcyAmPSBsYXN0UmVzOwogICAgfQogICAgY19ydGxfdHJlc19zdGF0ZV9lbmQoaFJ0bFRlc3RSZXN1bHQsICJyZXBsYWNlQXQiKTsKLy8gICAgIHJldHVybiAoIHJlcyApOwp9CgpleHRlcm4gIkMiIHZvaWQgLyogc2FsX0Jvb2wgKi8gU0FMX0NBTEwgdGVzdF9ydGxfT1N0cmluZyggaFRlc3RSZXN1bHQgaFJ0bFRlc3RSZXN1bHQgKQp7CgogICAgY19ydGxfdHJlc19zdGF0ZV9zdGFydChoUnRsVGVzdFJlc3VsdCwgInJ0bF9PU3RyaW5nIiApOwoKICAgIHRlc3RfcnRsX09TdHJpbmdfY3RvcnMoIGhSdGxUZXN0UmVzdWx0ICk7CiAgICB0ZXN0X3J0bF9PU3RyaW5nX2dldExlbmd0aCggaFJ0bFRlc3RSZXN1bHQgKTsKICAgIHRlc3RfcnRsX09TdHJpbmdfZXF1YWxzKCBoUnRsVGVzdFJlc3VsdCApOwogICAgdGVzdF9ydGxfT1N0cmluZ19lcXVhbHNJZ25vcmVBc2NpaUNhc2UoIGhSdGxUZXN0UmVzdWx0ICk7CiAgICB0ZXN0X3J0bF9PU3RyaW5nX2NvbXBhcmVUbyggaFJ0bFRlc3RSZXN1bHQgKTsKICAgIHRlc3RfcnRsX09TdHJpbmdfb3BfY21wKCBoUnRsVGVzdFJlc3VsdCApOwogICAgdGVzdF9ydGxfT1N0cmluZ19vcF9uZXEoIGhSdGxUZXN0UmVzdWx0ICk7CiAgICB0ZXN0X3J0bF9PU3RyaW5nX29wX2coIGhSdGxUZXN0UmVzdWx0ICk7CiAgICB0ZXN0X3J0bF9PU3RyaW5nX29wX2woIGhSdGxUZXN0UmVzdWx0ICk7CiAgICB0ZXN0X3J0bF9PU3RyaW5nX29wX2dlKCBoUnRsVGVzdFJlc3VsdCApOwogICAgdGVzdF9ydGxfT1N0cmluZ19vcF9sZSggaFJ0bFRlc3RSZXN1bHQgKTsKICAgIHRlc3RfcnRsX09TdHJpbmdfb3BfZXEoIGhSdGxUZXN0UmVzdWx0ICk7CiAgICB0ZXN0X3J0bF9PU3RyaW5nX29wX3BsdXMoIGhSdGxUZXN0UmVzdWx0ICk7CiAgICB0ZXN0X3J0bF9PU3RyaW5nX29wX3BlcSggaFJ0bFRlc3RSZXN1bHQgKTsKICAgIHRlc3RfcnRsX09TdHJpbmdfb3BfY3NjcyggaFJ0bFRlc3RSZXN1bHQgKTsKICAgIHRlc3RfcnRsX09TdHJpbmdfZ2V0U3RyKCBoUnRsVGVzdFJlc3VsdCApOwogICAgdGVzdF9ydGxfT1N0cmluZ19jb3B5KCBoUnRsVGVzdFJlc3VsdCApOwogICAgdGVzdF9ydGxfT1N0cmluZ19jb25jYXQoIGhSdGxUZXN0UmVzdWx0ICk7CiAgICB0ZXN0X3J0bF9PU3RyaW5nX3RvQXNjaWlMb3dlckNhc2UoIGhSdGxUZXN0UmVzdWx0ICk7CiAgICB0ZXN0X3J0bF9PU3RyaW5nX3RvQXNjaWlVcHBlckNhc2UoIGhSdGxUZXN0UmVzdWx0ICk7CiAgICB0ZXN0X3J0bF9PU3RyaW5nX3RyaW0oIGhSdGxUZXN0UmVzdWx0ICk7CiAgICB0ZXN0X3J0bF9PU3RyaW5nX3ZhbHVlT2YoIGhSdGxUZXN0UmVzdWx0ICk7CiAgICB0ZXN0X3J0bF9PU3RyaW5nX3RvQ2hhciggaFJ0bFRlc3RSZXN1bHQgKTsKICAgIHRlc3RfcnRsX09TdHJpbmdfdG9GbG9hdCggaFJ0bFRlc3RSZXN1bHQgKTsKICAgIC8vIExMQTogdGVzdF9ydGxfT1N0cmluZ190b0RvdWJsZSggaFJ0bFRlc3RSZXN1bHQgKTsKICAgIHRlc3RfcnRsX09TdHJpbmdfdG9Cb29sZWFuKCBoUnRsVGVzdFJlc3VsdCApOwogICAgdGVzdF9ydGxfT1N0cmluZ190b0ludDMyKCBoUnRsVGVzdFJlc3VsdCApOwogICAgdGVzdF9ydGxfT1N0cmluZ190b0ludDY0KCBoUnRsVGVzdFJlc3VsdCApOwogICAgdGVzdF9ydGxfT1N0cmluZ19yZXBsYWNlKCBoUnRsVGVzdFJlc3VsdCApOwogICAgdGVzdF9ydGxfT1N0cmluZ19yZXBsYWNlQXQoIGhSdGxUZXN0UmVzdWx0ICk7CgogICAgY19ydGxfdHJlc19zdGF0ZV9lbmQoaFJ0bFRlc3RSZXN1bHQsICJydGxfT1N0cmluZyIpOwp9CgoKLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kdm9pZCBSZWdpc3RlckFkZGl0aW9uYWxGdW5jdGlvbnMoRmt0UmVnRnVuY1B0ciBfcEZ1bmMpCnsKICAgIGlmIChfcEZ1bmMpCiAgICB7CiAgICAgICAgKF9wRnVuYykoJnRlc3RfcnRsX09TdHJpbmcsICIiKTsKCiAgICAgICAgLy8jIChfcEZ1bmMpKCZ0ZXN0X3J0bF9PU3RyaW5nX2N0b3JzLCAgICAgICAgICAgICAgICAgIiIpOwogICAgICAgIC8vIyAoX3BGdW5jKSgmdGVzdF9ydGxfT1N0cmluZ19nZXRMZW5ndGgsICIiKTsKICAgICAgICAvLyMgKF9wRnVuYykoJnRlc3RfcnRsX09TdHJpbmdfZXF1YWxzLCAiIik7CiAgICAgICAgLy8jIChfcEZ1bmMpKCZ0ZXN0X3J0bF9PU3RyaW5nX2VxdWFsc0lnbm9yZUFzY2lpQ2FzZSwgIiIpOwogICAgICAgIC8vIyAoX3BGdW5jKSgmdGVzdF9ydGxfT1N0cmluZ19jb21wYXJlVG8sICIiKTsKICAgICAgICAvLyMgKF9wRnVuYykoJnRlc3RfcnRsX09TdHJpbmdfb3BfY21wLCAiIik7CiAgICAgICAgLy8jIChfcEZ1bmMpKCZ0ZXN0X3J0bF9PU3RyaW5nX29wX25lcSwgIiIpOwogICAgICAgIC8vIyAoX3BGdW5jKSgmdGVzdF9ydGxfT1N0cmluZ19vcF9nLCAiIik7CiAgICAgICAgLy8jIChfcEZ1bmMpKCZ0ZXN0X3J0bF9PU3RyaW5nX29wX2wsICIiKTsKICAgICAgICAvLyMgKF9wRnVuYykoJnRlc3RfcnRsX09TdHJpbmdfb3BfZ2UsICIiKTsKICAgICAgICAvLyMgKF9wRnVuYykoJnRlc3RfcnRsX09TdHJpbmdfb3BfbGUsICIiKTsKICAgICAgICAvLyMgKF9wRnVuYykoJnRlc3RfcnRsX09TdHJpbmdfb3BfZXEsICIiKTsKICAgICAgICAvLyMgKF9wRnVuYykoJnRlc3RfcnRsX09TdHJpbmdfb3BfcGx1cywgIiIpOwogICAgICAgIC8vIyAoX3BGdW5jKSgmdGVzdF9ydGxfT1N0cmluZ19vcF9wZXEsICIiKTsKICAgICAgICAvLyMgKF9wRnVuYykoJnRlc3RfcnRsX09TdHJpbmdfb3BfY3NjcywgIiIpOwogICAgICAgIC8vIyAoX3BGdW5jKSgmdGVzdF9ydGxfT1N0cmluZ19nZXRTdHIsICIiKTsKICAgICAgICAvLyMgKF9wRnVuYykoJnRlc3RfcnRsX09TdHJpbmdfY29weSwgIiIpOwogICAgICAgIC8vIyAoX3BGdW5jKSgmdGVzdF9ydGxfT1N0cmluZ19jb25jYXQsICIiKTsKICAgICAgICAvLyMgKF9wRnVuYykoJnRlc3RfcnRsX09TdHJpbmdfdG9Bc2NpaUxvd2VyQ2FzZSwgIiIpOwogICAgICAgIC8vIyAoX3BGdW5jKSgmdGVzdF9ydGxfT1N0cmluZ190b0FzY2lpVXBwZXJDYXNlLCAiIik7CiAgICAgICAgLy8jIChfcEZ1bmMpKCZ0ZXN0X3J0bF9PU3RyaW5nX3RyaW0sICIiKTsKICAgICAgICAvLyMgKF9wRnVuYykoJnRlc3RfcnRsX09TdHJpbmdfdmFsdWVPZiwgIiIpOwogICAgICAgIC8vIyAoX3BGdW5jKSgmdGVzdF9ydGxfT1N0cmluZ190b0NoYXIsICIiKTsKICAgICAgICAvLyMgKF9wRnVuYykoJnRlc3RfcnRsX09TdHJpbmdfdG9GbG9hdCwgIiIpOwogICAgICAgIC8vIyAoX3BGdW5jKSgmdGVzdF9ydGxfT1N0cmluZ190b0RvdWJsZSwgIiIpOwogICAgICAgIC8vIyAoX3BGdW5jKSgmdGVzdF9ydGxfT1N0cmluZ190b0Jvb2xlYW4sICIiKTsKICAgICAgICAvLyMgKF9wRnVuYykoJnRlc3RfcnRsX09TdHJpbmdfdG9JbnQzMiwgIiIpOwogICAgICAgIC8vIyAoX3BGdW5jKSgmdGVzdF9ydGxfT1N0cmluZ190b0ludDY0LCAiIik7CiAgICAgICAgLy8jIChfcEZ1bmMpKCZ0ZXN0X3J0bF9PU3RyaW5nX3JlcGxhY2UsICIiKTsKICAgICAgICAvLyMgKF9wRnVuYykoJnRlc3RfcnRsX09TdHJpbmdfcmVwbGFjZUF0LCAiIik7CiAgICB9Cn0KCi8qCkQ6XGxvY2FsXDY0NFxTUlg2NDRcc2FsXHFhXHJ0bF9PU3RyaW5nLmN4eCgzNTU5KSA6IGVycm9yIEMyNjY0OiAKJ3Vuc2lnbmVkIGNoYXIgKHZvaWQgKF9fY2RlY2wgKikodm9pZCAqKSxjb25zdCBjaGFyICopJwogOiBjYW5ub3QgY29udmVydCBwYXJhbWV0ZXIgMSBmcm9tIAondW5zaWduZWQgY2hhciAoX19jZGVjbCAqKSh2b2lkICopJyB0byAndm9pZCAoX19jZGVjbCAqKSh2b2lkICopJwoKICAgICAgICBUaGlzIGNvbnZlcnNpb24gcmVxdWlyZXMgYSByZWludGVycHJldF9jYXN0LCBhIEMtc3R5bGUgY2FzdCBvciBmdW5jdGlvbi0Kc3R5bGUgY2FzdAoqLwo=