ZGlmZiAtLWdpdCBhL3N1cHdpc2RvbS9zcF9tZW51LmMgYi9zdXB3aXNkb20vc3BfbWVudS5jCmluZGV4IDQ0NDdkNTIuLjdhYjY4NWUgMTAwNjQ0Ci0tLSBhL3N1cHdpc2RvbS9zcF9tZW51LmMKKysrIGIvc3Vwd2lzZG9tL3NwX21lbnUuYwpAQCAtMTE1LDcgKzExNSw3IEBACiAgIH0KIH0KIAotc3RhdGljIHVpbnQ4IHNwX2xpbmtfdGVzdChzcF9wb3NfdCogcG9zKQorc3RhdGljIHZvaWQgdGVzdF9saW5rKHNwX3Bvc190KiBwb3MpCiB7CiAgIHVpbnQ4IHJldDsKICAgc3BfcHJvdG9jb2xfcmVxdWVzdF90IHJlcTsKQEAgLTEzNywxNyArMTM3LDE2IEBACiAgICAgICBpZihzcF9jaGVja190aW1lX3ZhbGlkKHJlc3AuZGF0YSArMikpCiAgICAgICB7CiAgICAgICAgIGRpc3BfaGludF9pbmZvX3R3byhwb3MsICLBtMK3vOyy4rPJuaYiLCLKsdbTsru6z7eoIiwgREVMQVlfVElNRTNzKTsKLSAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgcmV0dXJuOwogICAgICAgfQogICAgICAgc3Bfc2V0X2JjZHRpbWUocmVzcC5kYXRhICsyKTsKICAgICAgIGRpc3BfaGludF9pbmZvX3R3byhwb3MsICLBtMK3vOyy4rPJuaYiLCLS0c2ssr3KsdbTIiwgREVMQVlfVElNRTNzKTsKLSAgICAgIHJldHVybiByZXQ7CisgICAgICByZXR1cm47CiAgICAgfQogICAgIGRpc3BfaGludF9pbmZvX3R3byhwb3MsICLBtMK3vOyy4sqnsNwiLCLK1bW9tO3O87D8IiwgREVMQVlfVElNRTNzKTsKLSAgICByZXR1cm4gMTsKKyAgICByZXR1cm47CiAgIH0KICAgZGlzcF9oaW50X2luZm9fdHdvKHBvcywgIsG0wre87LLiyqew3CIsIsfrvOyy4s/fwrciLCBERUxBWV9USU1FM3MpOwotICByZXR1cm4gcmV0OwogfQogCiBzdGF0aWMgdm9pZCBzaG93X2tleWJvYXJkX3Rlc3Qoc3BfcG9zX3QqIHBvcywgdWludDggb2Zmc2V0KQpAQCAtMTU4LDcgKzE1NywxNCBAQAogICBkaXNwX2hpbnRfaW5mb190aHJlZShwb3MsICK8/MXM0sC0zsrkyOsiLCIwMTIzNDU2Nzg5QyIsdGVtcCwwKTsKIH0KIAotc3RhdGljIHVpbnQ4IHNwX2tleWJvYXJkX3Rlc3Qoc3BfcG9zX3QqIHBvcykKK3N0YXRpYyB2b2lkIGRvX2tleWJvYXJkX2NhbGlicmF0ZShzcF9wb3NfdCogcG9zKQoreworICBkaXNwX2hpbnRfaW5mb190d28oItCj0em8/MXMIiwix+vJ1LXILi4uIiwwKTsKKyAgc3Bfa2V5X2NhbGlicmF0ZSgpOworICBkaXNwX2hpbnRfaW5mb190d28ocG9zLCAivPzFzNCj0enN6rPJIiwix+u87LLiIixERUxBWV9USU1FM3MpOworfQorCitzdGF0aWMgdWludDggZG9fa2V5Ym9hcmRfdGVzdChzcF9wb3NfdCogcG9zKQogewogICB1aW50OCBrY29kZTsKICAgdWludDMyIHRpY2s7CkBAIC0yNzYsMTIgKzI4Miw2IEBACiAKIH0KIAotc3RhdGljIHZvaWQgc3BfZmFjdG9yeV9jaGVjayhzcF9wb3NfdCogcG9zKQotewotICBzcF9saW5rX3Rlc3QocG9zKTsKLSAgc3Bfa2V5Ym9hcmRfdGVzdChwb3MpOwotfQotCiBzdGF0aWMgdm9pZCBzcF9zZXRfZGV2dGltZShzcF9wb3NfdCogcG9zKQogewogICB1aW50MzIgdGlja2VyOwpAQCAtNTgyLDYgKzU4MiwxMjAgQEAKICAgfQogfQogCitzdGF0aWMgdm9pZCB0ZXN0X3ZhbHZlX29uKHNwX3Bvc190KiBwb3MpCit7CisgIHVpbnQzMiB0aWNrZXI7CisgIHVpbnQ4IGtjb2RlOworICB1aW50MzIgY291bnQ7CisgIHVpbnQzMiB0ZW1wOworICBjaGFyIG1zZ1szMl07CisKKyAgZGlzcF9oaW50X2luZm9fdHdvKHBvcywit6fDxb+qxvTW0CIsIsihz/u8/M3Ls/YiLERFTEFZX1RJTUUycyk7CisgIHRpY2tlciA9IHNwX2dldF90aWNrZXIoKTsKKyAgc3BfZmxvd3NlbnNvcl9jb3VudF9jbGVhcigpOworICBzcF92YWx2ZV9vbigpOworICBjb3VudCA9IDA7CisgIHdoaWxlKHNwX2dldF90aWNrZXIoKSAtdGlja2VyIDwgREVMQVlfVElNRTYwcykKKyAgeworICAgIHNwX3ZhbHZlX2NvbnRyb2woKTsKKyAgICBrY29kZSA9IHNwX2dldF9rZXkoKTsKKyAgICBpZihrY29kZSAhPSBTUF9LRVlfTk9ORSkKKyAgICB7CisgICAgICBpZihrY29kZSA9PSBTUF9LRVlfQ0xFQVIpCisgICAgICB7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICAgIHRpY2tlciA9IHNwX2dldF90aWNrZXIoKTsKKyAgICB9CisgICAgdGVtcCA9IHNwX2Zsb3dzZW5zb3JfZ2V0X2NvdW50KCk7CisgICAgaWYodGVtcCAhPSBjb3VudCkKKyAgICB7CisgICAgICBjb3VudCA9IHRlbXA7CisgICAgICBzcHJpbnRmKG1zZywiwffBv7zGyv06JWQiLGNvdW50KTsKKyAgICAgIGRpc3BfaGludF9pbmZvX3R3byhwb3MsIrenw8Wy4srU1tAiLG1zZyxERUxBWV9USU1FMTAwbXMpOworICAgIH0KKyAgfQorfQorCitzdGF0aWMgdm9pZCB0ZXN0X3ZhbHZlX29mZihzcF9wb3NfdCogcG9zKQoreworICB1aW50MzIgY291bnQ7CisgIGNoYXIgbXNnWzMyXTsKKworICBzcF92YWx2ZV9vZmYoKTsKKyAgY291bnQ9IHNwX2Zsb3dzZW5zb3JfZ2V0X2NvdW50KCk7CisgIHNwcmludGYobXNnLCLB98G/vMbK/TolZCIsY291bnQpOworICBkaXNwX2hpbnRfaW5mb190d28ocG9zLCK3p8PF0tG52LHVIixtc2csREVMQVlfVElNRTNzKTsKK30KKworc3RhdGljIHZvaWQgdGVzdF9mYWN0b3J5X29wdGlvbnMoc3BfcG9zX3QqIHBvcykKK3sKKyAgdWludDMyIHRpY2tlciA9IDA7CisgIHVpbnQ4IGtleWNvZGU7CisgIHVpbnQ4IHBhZ2U7CisgIHVpbnQ4IG1heF9jbnQ7CisgIHVpbnQ4IGtleV9wcmVzcyA9IDE7CisKKyAgbWVudV90IG1lbnVzW10gPQorICB7CisgICAgeyIxLrC0vPzQo9e8IiwgZG9fa2V5Ym9hcmRfY2FsaWJyYXRlfSwKKyAgICB7IjIusLS8/LLiytQiLCBkb19rZXlib2FyZF90ZXN0fSwKKyAgICB7IjMuv6rG9Lenw8UiLCB0ZXN0X3ZhbHZlX29ufSwKKyAgICB7IjQuudix1benw8UiLCB0ZXN0X3ZhbHZlX29mZn0sCisgICAgeyI1Ls2o0bay4srUIiwgdGVzdF9saW5rfQorICB9OworICBtYXhfY250ID0gc2l6ZW9mKG1lbnVzKS9zaXplb2YobWVudV90KS8zOworICBwYWdlID0gMDsKKyAgdGlja2VyID0gc3BfZ2V0X3RpY2tlcigpOworICB3aGlsZShzcF9nZXRfdGlja2VyKCktdGlja2VyIDw9IERFTEFZX1RJTUU2MHMqNSkKKyAgeworICAgIHNwX2ZlZWRfZG9nKCk7CisgICAga2V5Y29kZSA9IHNwX2dldF9rZXkoKTsKKyAgICBpZihrZXljb2RlICE9IFNQX0tFWV9OT05FKQorICAgIHsKKyAgICAgIGtleV9wcmVzcyA9IDE7CisgICAgICBzd2l0Y2goa2V5Y29kZSkKKyAgICAgIHsKKyAgICAgIGNhc2UgU1BfS0VZXzA6CisgICAgICAgIGlmKHBhZ2UgPCAobWF4X2NudC0xKSkKKyAgICAgICAgeworICAgICAgICAgIHBhZ2UrKzsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU1BfS0VZXzE6CisgICAgICBjYXNlIFNQX0tFWV8yOgorICAgICAgY2FzZSBTUF9LRVlfMzoKKyAgICAgIGNhc2UgU1BfS0VZXzQ6CisgICAgICBjYXNlIFNQX0tFWV81OgorICAgICAgY2FzZSBTUF9LRVlfNjoKKyAgICAgIGNhc2UgU1BfS0VZXzc6CisgICAgICBjYXNlIFNQX0tFWV84OgorICAgICAgY2FzZSBTUF9LRVlfOToKKyAgICAgICAgaWYobWVudXNba2V5Y29kZS1TUF9LRVlfMV0uZnVuYyAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgbWVudXNba2V5Y29kZS1TUF9LRVlfMV0uZnVuYyhwb3MpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTUF9LRVlfQ0xFQVI6CisgICAgICAgIGlmKHBhZ2UgPT0gMCkKKyAgICAgICAgeworICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBwYWdlLS07CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICAgIGlmKGtleV9wcmVzcykKKyAgICB7CisgICAgICBkaXNwX2hpbnRfaW5mb190aHJlZShwb3MsIG1lbnVzW3BhZ2UqM10uaGl0LCBtZW51c1twYWdlKjMrMV0uaGl0LCBtZW51c1twYWdlKjMrMl0uaGl0LCAwKTsKKyAgICAgIGtleV9wcmVzcyA9IDA7CisgICAgICB0aWNrZXIgPSBzcF9nZXRfdGlja2VyKCk7CisgICAgfQorICB9Cit9CisKIHZvaWQgc3BfbWVudV9vcHRpb25zKHNwX3Bvc190KiBwb3MpCiB7CiAgIHVpbnQzMiB0aWNrZXIgPSAwOwpAQCAtNTkzLDcgKzcwNyw3IEBACiAgIG1lbnVfdCBtZW51c1tdID0KICAgewogICAgIHsiMS6y6b+0ss7K/SIsIHNwX3Nob3dfc3lzcGFyYX0sCi0gICAgeyIyLrmks6ey4srUIiwgc3BfZmFjdG9yeV9jaGVja30sCisgICAgeyIyLrmks6ey4srUIiwgdGVzdF9mYWN0b3J5X29wdGlvbnN9LAogICAgIHsiMy7J6NbDyrG85CIsIHNwX3NldF9kZXZ0aW1lfSwKICAgICB7IjQuyta2r7XHwrwiLCBzcF9tYW51YWxfbG9naW59LAogICAgIHsiNS7J6NbDzu/A7WlkIiwgc3Bfc2V0X2RldnBoeWlkfSwKQEAgLTY1MywzICs3NjcsNSBAQAogICAgIH0KICAgfQogfQorCisK