Ly8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQovLyBmaXBJbWFnZSBjbGFzcyBpbXBsZW1lbnRhdGlvbgovLwovLyBEZXNpZ24gYW5kIGltcGxlbWVudGF0aW9uIGJ5Ci8vIC0gSGVydukgRHJvbG9uIChkcm9sb25AaW5mb25pZS5mcikKLy8KLy8gVGhpcyBmaWxlIGlzIHBhcnQgb2YgRnJlZUltYWdlIDMKLy8KLy8gQ09WRVJFRCBDT0RFIElTIFBST1ZJREVEIFVOREVSIFRISVMgTElDRU5TRSBPTiBBTiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRZCi8vIE9GIEFOWSBLSU5ELCBFSVRIRVIgRVhQUkVTU0VEIE9SIElNUExJRUQsIElOQ0xVRElORywgV0lUSE9VVCBMSU1JVEFUSU9OLCBXQVJSQU5USUVTCi8vIFRIQVQgVEhFIENPVkVSRUQgQ09ERSBJUyBGUkVFIE9GIERFRkVDVFMsIE1FUkNIQU5UQUJMRSwgRklUIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRQovLyBPUiBOT04tSU5GUklOR0lORy4gVEhFIEVOVElSRSBSSVNLIEFTIFRPIFRIRSBRVUFMSVRZIEFORCBQRVJGT1JNQU5DRSBPRiBUSEUgQ09WRVJFRAovLyBDT0RFIElTIFdJVEggWU9VLiBTSE9VTEQgQU5ZIENPVkVSRUQgQ09ERSBQUk9WRSBERUZFQ1RJVkUgSU4gQU5ZIFJFU1BFQ1QsIFlPVSAoTk9UCi8vIFRIRSBJTklUSUFMIERFVkVMT1BFUiBPUiBBTlkgT1RIRVIgQ09OVFJJQlVUT1IpIEFTU1VNRSBUSEUgQ09TVCBPRiBBTlkgTkVDRVNTQVJZCi8vIFNFUlZJQ0lORywgUkVQQUlSIE9SIENPUlJFQ1RJT04uIFRISVMgRElTQ0xBSU1FUiBPRiBXQVJSQU5UWSBDT05TVElUVVRFUyBBTiBFU1NFTlRJQUwKLy8gUEFSVCBPRiBUSElTIExJQ0VOU0UuIE5PIFVTRSBPRiBBTlkgQ09WRVJFRCBDT0RFIElTIEFVVEhPUklaRUQgSEVSRVVOREVSIEVYQ0VQVCBVTkRFUgovLyBUSElTIERJU0NMQUlNRVIuCi8vCi8vIFVzZSBhdCB5b3VyIG93biByaXNrIQovLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CgojaW5jbHVkZSAiRnJlZUltYWdlUGx1cy5oIgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgIAovLyBQcm90ZWN0ZWQgZnVuY3Rpb25zCgpCT09MIGZpcEltYWdlOjpyZXBsYWNlKEZJQklUTUFQICpuZXdfZGliKSB7CglpZihuZXdfZGliID09IE5VTEwpIAoJCXJldHVybiBGQUxTRTsKCWlmKF9kaWIpCgkJRnJlZUltYWdlX1VubG9hZChfZGliKTsKCV9kaWIgPSBuZXdfZGliOwoJX2JIYXNDaGFuZ2VkID0gVFJVRTsKCXJldHVybiBUUlVFOwp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIENyZWF0aW9uICYgRGVzdHJ1Y3Rpb24KCmZpcEltYWdlOjpmaXBJbWFnZShGUkVFX0lNQUdFX1RZUEUgaW1hZ2VfdHlwZSwgdW5zaWduZWQgd2lkdGgsIHVuc2lnbmVkIGhlaWdodCwgdW5zaWduZWQgYnBwKSB7CglfZGliID0gTlVMTDsKCV9iSGFzQ2hhbmdlZCA9IEZBTFNFOwoJaWYod2lkdGggJiYgaGVpZ2h0ICYmIGJwcCkKCQlzZXRTaXplKGltYWdlX3R5cGUsIHdpZHRoLCBoZWlnaHQsIGJwcCk7Cn0KCmZpcEltYWdlOjp+ZmlwSW1hZ2UoKSB7CglpZihfZGliKSB7CgkJRnJlZUltYWdlX1VubG9hZChfZGliKTsKCQlfZGliID0gTlVMTDsKCX0KfQoKQk9PTCBmaXBJbWFnZTo6c2V0U2l6ZShGUkVFX0lNQUdFX1RZUEUgaW1hZ2VfdHlwZSwgdW5zaWduZWQgd2lkdGgsIHVuc2lnbmVkIGhlaWdodCwgdW5zaWduZWQgYnBwLCB1bnNpZ25lZCByZWRfbWFzaywgdW5zaWduZWQgZ3JlZW5fbWFzaywgdW5zaWduZWQgYmx1ZV9tYXNrKSB7CglpZihfZGliKSB7CgkJRnJlZUltYWdlX1VubG9hZChfZGliKTsKCX0KCWlmKChfZGliID0gRnJlZUltYWdlX0FsbG9jYXRlVChpbWFnZV90eXBlLCB3aWR0aCwgaGVpZ2h0LCBicHAsIHJlZF9tYXNrLCBncmVlbl9tYXNrLCBibHVlX21hc2spKSA9PSBOVUxMKQoJCXJldHVybiBGQUxTRTsKCglpZihpbWFnZV90eXBlID09IEZJVF9CSVRNQVApIHsKCQkvLyBDcmVhdGUgcGFsZXR0ZSBpZiBuZWVkZWQKCQlzd2l0Y2goYnBwKQl7CgkJCWNhc2UgMToKCQkJY2FzZSA0OgoJCQljYXNlIDg6CgkJCQlSR0JRVUFEICpwYWwgPSBGcmVlSW1hZ2VfR2V0UGFsZXR0ZShfZGliKTsKCQkJCWZvcih1bnNpZ25lZCBpID0gMDsgaSA8IEZyZWVJbWFnZV9HZXRDb2xvcnNVc2VkKF9kaWIpOyBpKyspIHsKCQkJCQlwYWxbaV0ucmdiUmVkID0gaTsKCQkJCQlwYWxbaV0ucmdiR3JlZW4gPSBpOwoJCQkJCXBhbFtpXS5yZ2JCbHVlID0gaTsKCQkJCX0KCQkJCWJyZWFrOwoJCX0KCX0KCglfYkhhc0NoYW5nZWQgPSBUUlVFOwoKCXJldHVybiBUUlVFOwp9Cgp2b2lkIGZpcEltYWdlOjpjbGVhcigpIHsKCWlmKF9kaWIpIHsKCQlGcmVlSW1hZ2VfVW5sb2FkKF9kaWIpOwoJCV9kaWIgPSBOVUxMOwoJfQoJX2JIYXNDaGFuZ2VkID0gVFJVRTsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBDb3B5aW5nCgpmaXBJbWFnZTo6ZmlwSW1hZ2UoY29uc3QgZmlwSW1hZ2UmIEltYWdlKSB7CglfZGliID0gTlVMTDsKCV9maWYgPSBGSUZfVU5LTk9XTjsKCUZJQklUTUFQICpjbG9uZSA9IEZyZWVJbWFnZV9DbG9uZSgoRklCSVRNQVAqKUltYWdlLl9kaWIpOwoJcmVwbGFjZShjbG9uZSk7Cn0KCmZpcEltYWdlJiBmaXBJbWFnZTo6b3BlcmF0b3I9KGNvbnN0IGZpcEltYWdlJiBJbWFnZSkgewoJaWYodGhpcyAhPSAmSW1hZ2UpIHsKCQlGSUJJVE1BUCAqY2xvbmUgPSBGcmVlSW1hZ2VfQ2xvbmUoKEZJQklUTUFQKilJbWFnZS5fZGliKTsKCQlyZXBsYWNlKGNsb25lKTsKCX0KCXJldHVybiAqdGhpczsKfQoKZmlwSW1hZ2UmIGZpcEltYWdlOjpvcGVyYXRvcj0oRklCSVRNQVAgKmRpYikgewoJaWYoX2RpYiAhPSBkaWIpIHsKCQlyZXBsYWNlKGRpYik7Cgl9CglyZXR1cm4gKnRoaXM7Cn0KCkJPT0wgZmlwSW1hZ2U6OmNvcHlTdWJJbWFnZShmaXBJbWFnZSYgZHN0LCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IHJpZ2h0LCBpbnQgYm90dG9tKSBjb25zdCB7CglpZihfZGliKSB7CgkJZHN0ID0gRnJlZUltYWdlX0NvcHkoX2RpYiwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKCQlyZXR1cm4gZHN0LmlzVmFsaWQoKTsKCX0KCXJldHVybiBGQUxTRTsKfQoKQk9PTCBmaXBJbWFnZTo6cGFzdGVTdWJJbWFnZShmaXBJbWFnZSYgc3JjLCBpbnQgbGVmdCwgaW50IHRvcCwgaW50IGFscGhhKSB7CglpZihfZGliKSB7CgkJQk9PTCBiUmVzdWx0ID0gRnJlZUltYWdlX1Bhc3RlKF9kaWIsIHNyYy5fZGliLCBsZWZ0LCB0b3AsIGFscGhhKTsKCQlfYkhhc0NoYW5nZWQgPSBUUlVFOwoJCXJldHVybiBiUmVzdWx0OwoJfQoJcmV0dXJuIEZBTFNFOwp9CgpCT09MIGZpcEltYWdlOjpjcm9wKGludCBsZWZ0LCBpbnQgdG9wLCBpbnQgcmlnaHQsIGludCBib3R0b20pIHsKCWlmKF9kaWIpIHsKCQlGSUJJVE1BUCAqZHN0ID0gRnJlZUltYWdlX0NvcHkoX2RpYiwgbGVmdCwgdG9wLCByaWdodCwgYm90dG9tKTsKCQlyZXR1cm4gcmVwbGFjZShkc3QpOwoJfQoJcmV0dXJuIEZBTFNFOwp9CgoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwovLyBJbmZvcm1hdGlvbiBmdW5jdGlvbnMKCkZSRUVfSU1BR0VfVFlQRSBmaXBJbWFnZTo6Z2V0SW1hZ2VUeXBlKCkgY29uc3QgewoJcmV0dXJuIEZyZWVJbWFnZV9HZXRJbWFnZVR5cGUoX2RpYik7Cn0KCnVuc2lnbmVkIGZpcEltYWdlOjpnZXRXaWR0aCgpIGNvbnN0IHsKCXJldHVybiBGcmVlSW1hZ2VfR2V0V2lkdGgoX2RpYik7IAp9Cgp1bnNpZ25lZCBmaXBJbWFnZTo6Z2V0SGVpZ2h0KCkgY29uc3QgewoJcmV0dXJuIEZyZWVJbWFnZV9HZXRIZWlnaHQoX2RpYik7IAp9Cgp1bnNpZ25lZCBmaXBJbWFnZTo6Z2V0U2NhbldpZHRoKCkgY29uc3QgewoJcmV0dXJuIEZyZWVJbWFnZV9HZXRQaXRjaChfZGliKTsKfQoKQk9PTCBmaXBJbWFnZTo6aXNWYWxpZCgpIGNvbnN0IHsKCXJldHVybiAoX2RpYiAhPSBOVUxMKSA/IFRSVUU6RkFMU0U7Cn0KCkJJVE1BUElORk8qIGZpcEltYWdlOjpnZXRJbmZvKCkgY29uc3QgewoJcmV0dXJuIEZyZWVJbWFnZV9HZXRJbmZvKF9kaWIpOwp9CgpCSVRNQVBJTkZPSEVBREVSKiBmaXBJbWFnZTo6Z2V0SW5mb0hlYWRlcigpIGNvbnN0IHsKCXJldHVybiBGcmVlSW1hZ2VfR2V0SW5mb0hlYWRlcihfZGliKTsKfQoKdW5zaWduZWQgZmlwSW1hZ2U6OmdldEltYWdlU2l6ZSgpIGNvbnN0IHsKCXJldHVybiBGcmVlSW1hZ2VfR2V0RElCU2l6ZShfZGliKTsKfQoKdW5zaWduZWQgZmlwSW1hZ2U6OmdldEltYWdlTWVtb3J5U2l6ZSgpIGNvbnN0IHsKCXJldHVybiBGcmVlSW1hZ2VfR2V0TWVtb3J5U2l6ZShfZGliKTsKfQoKdW5zaWduZWQgZmlwSW1hZ2U6OmdldEJpdHNQZXJQaXhlbCgpIGNvbnN0IHsKCXJldHVybiBGcmVlSW1hZ2VfR2V0QlBQKF9kaWIpOwp9Cgp1bnNpZ25lZCBmaXBJbWFnZTo6Z2V0TGluZSgpIGNvbnN0IHsKCXJldHVybiBGcmVlSW1hZ2VfR2V0TGluZShfZGliKTsKfQoKZG91YmxlIGZpcEltYWdlOjpnZXRIb3Jpem9udGFsUmVzb2x1dGlvbigpIGNvbnN0IHsKCXJldHVybiAoRnJlZUltYWdlX0dldERvdHNQZXJNZXRlclgoX2RpYikgLyAoZG91YmxlKTEwMCk7IAp9Cgpkb3VibGUgZmlwSW1hZ2U6OmdldFZlcnRpY2FsUmVzb2x1dGlvbigpIGNvbnN0IHsKCXJldHVybiAoRnJlZUltYWdlX0dldERvdHNQZXJNZXRlclkoX2RpYikgLyAoZG91YmxlKTEwMCk7Cn0KCnZvaWQgZmlwSW1hZ2U6OnNldEhvcml6b250YWxSZXNvbHV0aW9uKGRvdWJsZSB2YWx1ZSkgewoJRnJlZUltYWdlX1NldERvdHNQZXJNZXRlclgoX2RpYiwgKHVuc2lnbmVkKSh2YWx1ZSAqIDEwMCArIDAuNSkpOwp9Cgp2b2lkIGZpcEltYWdlOjpzZXRWZXJ0aWNhbFJlc29sdXRpb24oZG91YmxlIHZhbHVlKSB7CglGcmVlSW1hZ2VfU2V0RG90c1Blck1ldGVyWShfZGliLCAodW5zaWduZWQpKHZhbHVlICogMTAwICsgMC41KSk7Cn0KCgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIFBhbGV0dGUgb3BlcmF0aW9ucwoKUkdCUVVBRCogZmlwSW1hZ2U6OmdldFBhbGV0dGUoKSBjb25zdCB7CglyZXR1cm4gRnJlZUltYWdlX0dldFBhbGV0dGUoX2RpYik7Cn0KCnVuc2lnbmVkIGZpcEltYWdlOjpnZXRQYWxldHRlU2l6ZSgpIGNvbnN0IHsKCXJldHVybiBGcmVlSW1hZ2VfR2V0Q29sb3JzVXNlZChfZGliKSAqIHNpemVvZihSR0JRVUFEKTsKfQoKdW5zaWduZWQgZmlwSW1hZ2U6OmdldENvbG9yc1VzZWQoKSBjb25zdCB7CglyZXR1cm4gRnJlZUltYWdlX0dldENvbG9yc1VzZWQoX2RpYik7Cn0KCkZSRUVfSU1BR0VfQ09MT1JfVFlQRSBmaXBJbWFnZTo6Z2V0Q29sb3JUeXBlKCkgY29uc3QgeyAKCXJldHVybiBGcmVlSW1hZ2VfR2V0Q29sb3JUeXBlKF9kaWIpOwp9CgpCT09MIGZpcEltYWdlOjppc0dyYXlzY2FsZSgpIGNvbnN0IHsKCXJldHVybiAoKEZyZWVJbWFnZV9HZXRCUFAoX2RpYikgPT0gOCkgJiYgKEZyZWVJbWFnZV9HZXRDb2xvclR5cGUoX2RpYikgIT0gRklDX1BBTEVUVEUpKTsgCn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gVGh1bWJuYWlsIGFjY2VzcwoKQk9PTCBmaXBJbWFnZTo6Z2V0VGh1bWJuYWlsKGZpcEltYWdlJiBpbWFnZSkgY29uc3QgewoJaW1hZ2UgPSBGcmVlSW1hZ2VfQ2xvbmUoIEZyZWVJbWFnZV9HZXRUaHVtYm5haWwoX2RpYikgKTsKCXJldHVybiBpbWFnZS5pc1ZhbGlkKCk7Cn0KCkJPT0wgZmlwSW1hZ2U6OnNldFRodW1ibmFpbChjb25zdCBmaXBJbWFnZSYgaW1hZ2UpIHsKCXJldHVybiBGcmVlSW1hZ2VfU2V0VGh1bWJuYWlsKF9kaWIsIChGSUJJVE1BUCopaW1hZ2UuX2RpYik7Cn0KCkJPT0wgZmlwSW1hZ2U6Omhhc1RodW1ibmFpbCgpIGNvbnN0IHsKCXJldHVybiAoRnJlZUltYWdlX0dldFRodW1ibmFpbChfZGliKSAhPSBOVUxMKTsKfQoKQk9PTCBmaXBJbWFnZTo6Y2xlYXJUaHVtYm5haWwoKSB7CglyZXR1cm4gRnJlZUltYWdlX1NldFRodW1ibmFpbChfZGliLCBOVUxMKTsKfQoKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gUGl4ZWwgYWNjZXNzCgpCWVRFKiBmaXBJbWFnZTo6YWNjZXNzUGl4ZWxzKCkgY29uc3QgewoJcmV0dXJuIEZyZWVJbWFnZV9HZXRCaXRzKF9kaWIpOyAKfQoKQllURSogZmlwSW1hZ2U6OmdldFNjYW5MaW5lKHVuc2lnbmVkIHNjYW5saW5lKSBjb25zdCB7CglpZihzY2FubGluZSA8IEZyZWVJbWFnZV9HZXRIZWlnaHQoX2RpYikpIHsKCQlyZXR1cm4gRnJlZUltYWdlX0dldFNjYW5MaW5lKF9kaWIsIHNjYW5saW5lKTsKCX0KCXJldHVybiBOVUxMOwp9CgpCT09MIGZpcEltYWdlOjpnZXRQaXhlbEluZGV4KHVuc2lnbmVkIHgsIHVuc2lnbmVkIHksIEJZVEUgKnZhbHVlKSBjb25zdCB7CglyZXR1cm4gRnJlZUltYWdlX0dldFBpeGVsSW5kZXgoX2RpYiwgeCwgeSwgdmFsdWUpOwp9CgpCT09MIGZpcEltYWdlOjpnZXRQaXhlbENvbG9yKHVuc2lnbmVkIHgsIHVuc2lnbmVkIHksIFJHQlFVQUQgKnZhbHVlKSBjb25zdCB7CglyZXR1cm4gRnJlZUltYWdlX0dldFBpeGVsQ29sb3IoX2RpYiwgeCwgeSwgdmFsdWUpOwp9CgpCT09MIGZpcEltYWdlOjpzZXRQaXhlbEluZGV4KHVuc2lnbmVkIHgsIHVuc2lnbmVkIHksIEJZVEUgKnZhbHVlKSB7CglfYkhhc0NoYW5nZWQgPSBUUlVFOwoJcmV0dXJuIEZyZWVJbWFnZV9TZXRQaXhlbEluZGV4KF9kaWIsIHgsIHksIHZhbHVlKTsKfQoKQk9PTCBmaXBJbWFnZTo6c2V0UGl4ZWxDb2xvcih1bnNpZ25lZCB4LCB1bnNpZ25lZCB5LCBSR0JRVUFEICp2YWx1ZSkgewoJX2JIYXNDaGFuZ2VkID0gVFJVRTsKCXJldHVybiBGcmVlSW1hZ2VfU2V0UGl4ZWxDb2xvcihfZGliLCB4LCB5LCB2YWx1ZSk7Cn0KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gRmlsZSB0eXBlIGlkZW50aWZpY2F0aW9uCgpGUkVFX0lNQUdFX0ZPUk1BVCBmaXBJbWFnZTo6aWRlbnRpZnlGSUYoY29uc3QgY2hhciogbHBzelBhdGhOYW1lKSB7CglGUkVFX0lNQUdFX0ZPUk1BVCBmaWYgPSBGSUZfVU5LTk9XTjsKCgkvLyBjaGVjayB0aGUgZmlsZSBzaWduYXR1cmUgYW5kIGdldCBpdHMgZm9ybWF0CgkvLyAodGhlIHNlY29uZCBhcmd1bWVudCBpcyBjdXJyZW50bHkgbm90IHVzZWQgYnkgRnJlZUltYWdlKQoJZmlmID0gRnJlZUltYWdlX0dldEZpbGVUeXBlKGxwc3pQYXRoTmFtZSwgMCk7CglpZihmaWYgPT0gRklGX1VOS05PV04pIHsKCQkvLyBubyBzaWduYXR1cmUgPwoJCS8vIHRyeSB0byBndWVzcyB0aGUgZmlsZSBmb3JtYXQgZnJvbSB0aGUgZmlsZSBleHRlbnNpb24KCQlmaWYgPSBGcmVlSW1hZ2VfR2V0RklGRnJvbUZpbGVuYW1lKGxwc3pQYXRoTmFtZSk7Cgl9CgoJcmV0dXJuIGZpZjsKfQoKRlJFRV9JTUFHRV9GT1JNQVQgZmlwSW1hZ2U6OmlkZW50aWZ5RklGVShjb25zdCB3Y2hhcl90KiBscHN6UGF0aE5hbWUpIHsKCUZSRUVfSU1BR0VfRk9STUFUIGZpZiA9IEZJRl9VTktOT1dOOwoKCS8vIGNoZWNrIHRoZSBmaWxlIHNpZ25hdHVyZSBhbmQgZ2V0IGl0cyBmb3JtYXQKCS8vICh0aGUgc2Vjb25kIGFyZ3VtZW50IGlzIGN1cnJlbnRseSBub3QgdXNlZCBieSBGcmVlSW1hZ2UpCglmaWYgPSBGcmVlSW1hZ2VfR2V0RmlsZVR5cGVVKGxwc3pQYXRoTmFtZSwgMCk7CglpZihmaWYgPT0gRklGX1VOS05PV04pIHsKCQkvLyBubyBzaWduYXR1cmUgPwoJCS8vIHRyeSB0byBndWVzcyB0aGUgZmlsZSBmb3JtYXQgZnJvbSB0aGUgZmlsZSBleHRlbnNpb24KCQlmaWYgPSBGcmVlSW1hZ2VfR2V0RklGRnJvbUZpbGVuYW1lVShscHN6UGF0aE5hbWUpOwoJfQoKCXJldHVybiBmaWY7Cn0KCkZSRUVfSU1BR0VfRk9STUFUIGZpcEltYWdlOjppZGVudGlmeUZJRkZyb21IYW5kbGUoRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlKSB7CglpZihpbyAmJiBoYW5kbGUpIHsKCQkvLyBjaGVjayB0aGUgZmlsZSBzaWduYXR1cmUgYW5kIGdldCBpdHMgZm9ybWF0CgkJcmV0dXJuIEZyZWVJbWFnZV9HZXRGaWxlVHlwZUZyb21IYW5kbGUoaW8sIGhhbmRsZSwgMTYpOwoJfQoJcmV0dXJuIEZJRl9VTktOT1dOOwp9CgpGUkVFX0lNQUdFX0ZPUk1BVCBmaXBJbWFnZTo6aWRlbnRpZnlGSUZGcm9tTWVtb3J5KEZJTUVNT1JZICpobWVtKSB7CglpZihobWVtICE9IE5VTEwpIHsKCQlyZXR1cm4gRnJlZUltYWdlX0dldEZpbGVUeXBlRnJvbU1lbW9yeShobWVtLCAwKTsKCX0KCXJldHVybiBGSUZfVU5LTk9XTjsKfQoKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLy8gTG9hZGluZyAmIFNhdmluZwoKQk9PTCBmaXBJbWFnZTo6bG9hZChjb25zdCBjaGFyKiBscHN6UGF0aE5hbWUsIGludCBmbGFnKSB7CglGUkVFX0lNQUdFX0ZPUk1BVCBmaWYgPSBGSUZfVU5LTk9XTjsKCgkvLyBjaGVjayB0aGUgZmlsZSBzaWduYXR1cmUgYW5kIGdldCBpdHMgZm9ybWF0CgkvLyAodGhlIHNlY29uZCBhcmd1bWVudCBpcyBjdXJyZW50bHkgbm90IHVzZWQgYnkgRnJlZUltYWdlKQoJZmlmID0gRnJlZUltYWdlX0dldEZpbGVUeXBlKGxwc3pQYXRoTmFtZSwgMCk7CglpZihmaWYgPT0gRklGX1VOS05PV04pIHsKCQkvLyBubyBzaWduYXR1cmUgPwoJCS8vIHRyeSB0byBndWVzcyB0aGUgZmlsZSBmb3JtYXQgZnJvbSB0aGUgZmlsZSBleHRlbnNpb24KCQlmaWYgPSBGcmVlSW1hZ2VfR2V0RklGRnJvbUZpbGVuYW1lKGxwc3pQYXRoTmFtZSk7Cgl9CgkvLyBjaGVjayB0aGF0IHRoZSBwbHVnaW4gaGFzIHJlYWRpbmcgY2FwYWJpbGl0aWVzIC4uLgoJaWYoKGZpZiAhPSBGSUZfVU5LTk9XTikgJiYgRnJlZUltYWdlX0ZJRlN1cHBvcnRzUmVhZGluZyhmaWYpKSB7CgkJLy8gRnJlZSB0aGUgcHJldmlvdXMgZGliCgkJaWYoX2RpYikgewoJCQlGcmVlSW1hZ2VfVW5sb2FkKF9kaWIpOwkJCQoJCX0KCQkvLyBMb2FkIHRoZSBmaWxlCgkJX2RpYiA9IEZyZWVJbWFnZV9Mb2FkKGZpZiwgbHBzelBhdGhOYW1lLCBmbGFnKTsKCQlfYkhhc0NoYW5nZWQgPSBUUlVFOwoJCWlmKF9kaWIgPT0gTlVMTCkKCQkJcmV0dXJuIEZBTFNFOwoJCXJldHVybiBUUlVFOwoJfQoJcmV0dXJuIEZBTFNFOwp9CgpCT09MIGZpcEltYWdlOjpsb2FkVShjb25zdCB3Y2hhcl90KiBscHN6UGF0aE5hbWUsIGludCBmbGFnKSB7CglGUkVFX0lNQUdFX0ZPUk1BVCBmaWYgPSBGSUZfVU5LTk9XTjsKCgkvLyBjaGVjayB0aGUgZmlsZSBzaWduYXR1cmUgYW5kIGdldCBpdHMgZm9ybWF0CgkvLyAodGhlIHNlY29uZCBhcmd1bWVudCBpcyBjdXJyZW50bHkgbm90IHVzZWQgYnkgRnJlZUltYWdlKQoJZmlmID0gRnJlZUltYWdlX0dldEZpbGVUeXBlVShscHN6UGF0aE5hbWUsIDApOwoJaWYoZmlmID09IEZJRl9VTktOT1dOKSB7CgkJLy8gbm8gc2lnbmF0dXJlID8KCQkvLyB0cnkgdG8gZ3Vlc3MgdGhlIGZpbGUgZm9ybWF0IGZyb20gdGhlIGZpbGUgZXh0ZW5zaW9uCgkJZmlmID0gRnJlZUltYWdlX0dldEZJRkZyb21GaWxlbmFtZVUobHBzelBhdGhOYW1lKTsKCX0KCS8vIGNoZWNrIHRoYXQgdGhlIHBsdWdpbiBoYXMgcmVhZGluZyBjYXBhYmlsaXRpZXMgLi4uCglpZigoZmlmICE9IEZJRl9VTktOT1dOKSAmJiBGcmVlSW1hZ2VfRklGU3VwcG9ydHNSZWFkaW5nKGZpZikpIHsKCQkvLyBGcmVlIHRoZSBwcmV2aW91cyBkaWIKCQlpZihfZGliKSB7CgkJCUZyZWVJbWFnZV9VbmxvYWQoX2RpYik7CQkJCgkJfQoJCS8vIExvYWQgdGhlIGZpbGUKCQlfZGliID0gRnJlZUltYWdlX0xvYWRVKGZpZiwgbHBzelBhdGhOYW1lLCBmbGFnKTsKCQlfYkhhc0NoYW5nZWQgPSBUUlVFOwoJCWlmKF9kaWIgPT0gTlVMTCkKCQkJcmV0dXJuIEZBTFNFOwoJCXJldHVybiBUUlVFOwoJfQoJcmV0dXJuIEZBTFNFOwp9CgpCT09MIGZpcEltYWdlOjpsb2FkRnJvbUhhbmRsZShGcmVlSW1hZ2VJTyAqaW8sIGZpX2hhbmRsZSBoYW5kbGUsIGludCBmbGFnKSB7CglGUkVFX0lNQUdFX0ZPUk1BVCBmaWYgPSBGSUZfVU5LTk9XTjsKCgkvLyBjaGVjayB0aGUgZmlsZSBzaWduYXR1cmUgYW5kIGdldCBpdHMgZm9ybWF0CglmaWYgPSBGcmVlSW1hZ2VfR2V0RmlsZVR5cGVGcm9tSGFuZGxlKGlvLCBoYW5kbGUsIDE2KTsKCWlmKChmaWYgIT0gRklGX1VOS05PV04pICYmIEZyZWVJbWFnZV9GSUZTdXBwb3J0c1JlYWRpbmcoZmlmKSkgewoJCS8vIEZyZWUgdGhlIHByZXZpb3VzIGRpYgoJCWlmKF9kaWIpIHsKCQkJRnJlZUltYWdlX1VubG9hZChfZGliKTsJCQkKCQl9CgkJLy8gTG9hZCB0aGUgZmlsZQoJCV9kaWIgPSBGcmVlSW1hZ2VfTG9hZEZyb21IYW5kbGUoZmlmLCBpbywgaGFuZGxlLCBmbGFnKTsKCQlfYkhhc0NoYW5nZWQgPSBUUlVFOwoJCWlmKF9kaWIgPT0gTlVMTCkKCQkJcmV0dXJuIEZBTFNFOwoJCXJldHVybiBUUlVFOwoJfQoJcmV0dXJuIEZBTFNFOwp9CgpCT09MIGZpcEltYWdlOjpsb2FkRnJvbU1lbW9yeShmaXBNZW1vcnlJTyYgbWVtSU8sIGludCBmbGFnKSB7CglGUkVFX0lNQUdFX0ZPUk1BVCBmaWYgPSBGSUZfVU5LTk9XTjsKCgkvLyBjaGVjayB0aGUgZmlsZSBzaWduYXR1cmUgYW5kIGdldCBpdHMgZm9ybWF0CglmaWYgPSBtZW1JTy5nZXRGaWxlVHlwZSgpOwoJaWYoKGZpZiAhPSBGSUZfVU5LTk9XTikgJiYgRnJlZUltYWdlX0ZJRlN1cHBvcnRzUmVhZGluZyhmaWYpKSB7CgkJLy8gRnJlZSB0aGUgcHJldmlvdXMgZGliCgkJaWYoX2RpYikgewoJCQlGcmVlSW1hZ2VfVW5sb2FkKF9kaWIpOwkJCQoJCX0KCQkvLyBMb2FkIHRoZSBmaWxlCgkJX2RpYiA9IG1lbUlPLmxvYWQoZmlmLCBmbGFnKTsKCQlfYkhhc0NoYW5nZWQgPSBUUlVFOwoJCWlmKF9kaWIgPT0gTlVMTCkKCQkJcmV0dXJuIEZBTFNFOwoJCXJldHVybiBUUlVFOwoJfQoJcmV0dXJuIEZBTFNFOwp9CgpCT09MIGZpcEltYWdlOjpzYXZlKGNvbnN0IGNoYXIqIGxwc3pQYXRoTmFtZSwgaW50IGZsYWcpIGNvbnN0IHsKCUZSRUVfSU1BR0VfRk9STUFUIGZpZiA9IEZJRl9VTktOT1dOOwoJQk9PTCBiU3VjY2VzcyA9IEZBTFNFOwoKCS8vIFRyeSB0byBndWVzcyB0aGUgZmlsZSBmb3JtYXQgZnJvbSB0aGUgZmlsZSBleHRlbnNpb24KCWZpZiA9IEZyZWVJbWFnZV9HZXRGSUZGcm9tRmlsZW5hbWUobHBzelBhdGhOYW1lKTsKCWlmKGZpZiAhPSBGSUZfVU5LTk9XTiApIHsKCQkvLyBDaGVjayB0aGF0IHRoZSBkaWIgY2FuIGJlIHNhdmVkIGluIHRoaXMgZm9ybWF0CgkJQk9PTCBiQ2FuU2F2ZTsKCgkJRlJFRV9JTUFHRV9UWVBFIGltYWdlX3R5cGUgPSBGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKF9kaWIpOwoJCWlmKGltYWdlX3R5cGUgPT0gRklUX0JJVE1BUCkgewoJCQkvLyBzdGFuZGFyZCBiaXRtYXAgdHlwZQoJCQlXT1JEIGJwcCA9IEZyZWVJbWFnZV9HZXRCUFAoX2RpYik7CgkJCWJDYW5TYXZlID0gKEZyZWVJbWFnZV9GSUZTdXBwb3J0c1dyaXRpbmcoZmlmKSAmJiBGcmVlSW1hZ2VfRklGU3VwcG9ydHNFeHBvcnRCUFAoZmlmLCBicHApKTsKCQl9IGVsc2UgewoJCQkvLyBzcGVjaWFsIGJpdG1hcCB0eXBlCgkJCWJDYW5TYXZlID0gRnJlZUltYWdlX0ZJRlN1cHBvcnRzRXhwb3J0VHlwZShmaWYsIGltYWdlX3R5cGUpOwoJCX0KCgkJaWYoYkNhblNhdmUpIHsKCQkJYlN1Y2Nlc3MgPSBGcmVlSW1hZ2VfU2F2ZShmaWYsIF9kaWIsIGxwc3pQYXRoTmFtZSwgZmxhZyk7CgkJCXJldHVybiBiU3VjY2VzczsKCQl9Cgl9CglyZXR1cm4gYlN1Y2Nlc3M7Cn0KCkJPT0wgZmlwSW1hZ2U6OnNhdmVVKGNvbnN0IHdjaGFyX3QqIGxwc3pQYXRoTmFtZSwgaW50IGZsYWcpIGNvbnN0IHsKCUZSRUVfSU1BR0VfRk9STUFUIGZpZiA9IEZJRl9VTktOT1dOOwoJQk9PTCBiU3VjY2VzcyA9IEZBTFNFOwoKCS8vIFRyeSB0byBndWVzcyB0aGUgZmlsZSBmb3JtYXQgZnJvbSB0aGUgZmlsZSBleHRlbnNpb24KCWZpZiA9IEZyZWVJbWFnZV9HZXRGSUZGcm9tRmlsZW5hbWVVKGxwc3pQYXRoTmFtZSk7CglpZihmaWYgIT0gRklGX1VOS05PV04gKSB7CgkJLy8gQ2hlY2sgdGhhdCB0aGUgZGliIGNhbiBiZSBzYXZlZCBpbiB0aGlzIGZvcm1hdAoJCUJPT0wgYkNhblNhdmU7CgoJCUZSRUVfSU1BR0VfVFlQRSBpbWFnZV90eXBlID0gRnJlZUltYWdlX0dldEltYWdlVHlwZShfZGliKTsKCQlpZihpbWFnZV90eXBlID09IEZJVF9CSVRNQVApIHsKCQkJLy8gc3RhbmRhcmQgYml0bWFwIHR5cGUKCQkJV09SRCBicHAgPSBGcmVlSW1hZ2VfR2V0QlBQKF9kaWIpOwoJCQliQ2FuU2F2ZSA9IChGcmVlSW1hZ2VfRklGU3VwcG9ydHNXcml0aW5nKGZpZikgJiYgRnJlZUltYWdlX0ZJRlN1cHBvcnRzRXhwb3J0QlBQKGZpZiwgYnBwKSk7CgkJfSBlbHNlIHsKCQkJLy8gc3BlY2lhbCBiaXRtYXAgdHlwZQoJCQliQ2FuU2F2ZSA9IEZyZWVJbWFnZV9GSUZTdXBwb3J0c0V4cG9ydFR5cGUoZmlmLCBpbWFnZV90eXBlKTsKCQl9CgoJCWlmKGJDYW5TYXZlKSB7CgkJCWJTdWNjZXNzID0gRnJlZUltYWdlX1NhdmVVKGZpZiwgX2RpYiwgbHBzelBhdGhOYW1lLCBmbGFnKTsKCQkJcmV0dXJuIGJTdWNjZXNzOwoJCX0KCX0KCXJldHVybiBiU3VjY2VzczsKfQoKQk9PTCBmaXBJbWFnZTo6c2F2ZVRvSGFuZGxlKEZSRUVfSU1BR0VfRk9STUFUIGZpZiwgRnJlZUltYWdlSU8gKmlvLCBmaV9oYW5kbGUgaGFuZGxlLCBpbnQgZmxhZykgY29uc3QgewoJQk9PTCBiU3VjY2VzcyA9IEZBTFNFOwoKCWlmKGZpZiAhPSBGSUZfVU5LTk9XTiApIHsKCQkvLyBDaGVjayB0aGF0IHRoZSBkaWIgY2FuIGJlIHNhdmVkIGluIHRoaXMgZm9ybWF0CgkJQk9PTCBiQ2FuU2F2ZTsKCgkJRlJFRV9JTUFHRV9UWVBFIGltYWdlX3R5cGUgPSBGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKF9kaWIpOwoJCWlmKGltYWdlX3R5cGUgPT0gRklUX0JJVE1BUCkgewoJCQkvLyBzdGFuZGFyZCBiaXRtYXAgdHlwZQoJCQlXT1JEIGJwcCA9IEZyZWVJbWFnZV9HZXRCUFAoX2RpYik7CgkJCWJDYW5TYXZlID0gKEZyZWVJbWFnZV9GSUZTdXBwb3J0c1dyaXRpbmcoZmlmKSAmJiBGcmVlSW1hZ2VfRklGU3VwcG9ydHNFeHBvcnRCUFAoZmlmLCBicHApKTsKCQl9IGVsc2UgewoJCQkvLyBzcGVjaWFsIGJpdG1hcCB0eXBlCgkJCWJDYW5TYXZlID0gRnJlZUltYWdlX0ZJRlN1cHBvcnRzRXhwb3J0VHlwZShmaWYsIGltYWdlX3R5cGUpOwoJCX0KCgkJaWYoYkNhblNhdmUpIHsKCQkJYlN1Y2Nlc3MgPSBGcmVlSW1hZ2VfU2F2ZVRvSGFuZGxlKGZpZiwgX2RpYiwgaW8sIGhhbmRsZSwgZmxhZyk7CgkJCXJldHVybiBiU3VjY2VzczsKCQl9Cgl9CglyZXR1cm4gYlN1Y2Nlc3M7Cn0KCkJPT0wgZmlwSW1hZ2U6OnNhdmVUb01lbW9yeShGUkVFX0lNQUdFX0ZPUk1BVCBmaWYsIGZpcE1lbW9yeUlPJiBtZW1JTywgaW50IGZsYWcpIGNvbnN0IHsKCUJPT0wgYlN1Y2Nlc3MgPSBGQUxTRTsKCglpZihmaWYgIT0gRklGX1VOS05PV04gKSB7CgkJLy8gQ2hlY2sgdGhhdCB0aGUgZGliIGNhbiBiZSBzYXZlZCBpbiB0aGlzIGZvcm1hdAoJCUJPT0wgYkNhblNhdmU7CgoJCUZSRUVfSU1BR0VfVFlQRSBpbWFnZV90eXBlID0gRnJlZUltYWdlX0dldEltYWdlVHlwZShfZGliKTsKCQlpZihpbWFnZV90eXBlID09IEZJVF9CSVRNQVApIHsKCQkJLy8gc3RhbmRhcmQgYml0bWFwIHR5cGUKCQkJV09SRCBicHAgPSBGcmVlSW1hZ2VfR2V0QlBQKF9kaWIpOwoJCQliQ2FuU2F2ZSA9IChGcmVlSW1hZ2VfRklGU3VwcG9ydHNXcml0aW5nKGZpZikgJiYgRnJlZUltYWdlX0ZJRlN1cHBvcnRzRXhwb3J0QlBQKGZpZiwgYnBwKSk7CgkJfSBlbHNlIHsKCQkJLy8gc3BlY2lhbCBiaXRtYXAgdHlwZQoJCQliQ2FuU2F2ZSA9IEZyZWVJbWFnZV9GSUZTdXBwb3J0c0V4cG9ydFR5cGUoZmlmLCBpbWFnZV90eXBlKTsKCQl9CgoJCWlmKGJDYW5TYXZlKSB7CgkJCWJTdWNjZXNzID0gbWVtSU8uc2F2ZShmaWYsIF9kaWIsIGZsYWcpOwoJCQlyZXR1cm4gYlN1Y2Nlc3M7CgkJfQoJfQoJcmV0dXJuIGJTdWNjZXNzOwp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vICAgCi8vIENvbnZlcnNpb24gcm91dGluZXMKCkJPT0wgZmlwSW1hZ2U6OmNvbnZlcnRUb1R5cGUoRlJFRV9JTUFHRV9UWVBFIGltYWdlX3R5cGUsIEJPT0wgc2NhbGVfbGluZWFyKSB7CglpZihfZGliKSB7CgkJRklCSVRNQVAgKmRpYiA9IEZyZWVJbWFnZV9Db252ZXJ0VG9UeXBlKF9kaWIsIGltYWdlX3R5cGUsIHNjYWxlX2xpbmVhcik7CgkJcmV0dXJuIHJlcGxhY2UoZGliKTsKCX0KCXJldHVybiBGQUxTRTsKfQoKQk9PTCBmaXBJbWFnZTo6dGhyZXNob2xkKEJZVEUgVCkgewoJaWYoX2RpYikgewoJCUZJQklUTUFQICpkaWIxID0gRnJlZUltYWdlX1RocmVzaG9sZChfZGliLCBUKTsKCQlyZXR1cm4gcmVwbGFjZShkaWIxKTsKCX0KCXJldHVybiBGQUxTRTsKfQoKQk9PTCBmaXBJbWFnZTo6Y29udmVydFRvNEJpdHMoKSB7CglpZihfZGliKSB7CgkJRklCSVRNQVAgKmRpYjQgPSBGcmVlSW1hZ2VfQ29udmVydFRvNEJpdHMoX2RpYik7CgkJcmV0dXJuIHJlcGxhY2UoZGliNCk7Cgl9CglyZXR1cm4gRkFMU0U7Cn0KCkJPT0wgZmlwSW1hZ2U6OmNvbnZlcnRUbzhCaXRzKCkgewoJaWYoX2RpYikgewoJCUZJQklUTUFQICpkaWI4ID0gRnJlZUltYWdlX0NvbnZlcnRUbzhCaXRzKF9kaWIpOwoJCXJldHVybiByZXBsYWNlKGRpYjgpOwoJfQoJcmV0dXJuIEZBTFNFOwp9CgpCT09MIGZpcEltYWdlOjpjb252ZXJ0VG8xNkJpdHM1NTUoKSB7CglpZihfZGliKSB7CgkJRklCSVRNQVAgKmRpYjE2XzU1NSA9IEZyZWVJbWFnZV9Db252ZXJ0VG8xNkJpdHM1NTUoX2RpYik7CgkJcmV0dXJuIHJlcGxhY2UoZGliMTZfNTU1KTsKCX0KCXJldHVybiBGQUxTRTsKfQoKQk9PTCBmaXBJbWFnZTo6Y29udmVydFRvMTZCaXRzNTY1KCkgewoJaWYoX2RpYikgewoJCUZJQklUTUFQICpkaWIxNl81NjUgPSBGcmVlSW1hZ2VfQ29udmVydFRvMTZCaXRzNTY1KF9kaWIpOwoJCXJldHVybiByZXBsYWNlKGRpYjE2XzU2NSk7Cgl9CglyZXR1cm4gRkFMU0U7Cn0KCkJPT0wgZmlwSW1hZ2U6OmNvbnZlcnRUbzI0Qml0cygpIHsKCWlmKF9kaWIpIHsKCQlGSUJJVE1BUCAqZGliUkdCID0gRnJlZUltYWdlX0NvbnZlcnRUbzI0Qml0cyhfZGliKTsKCQlyZXR1cm4gcmVwbGFjZShkaWJSR0IpOwoJfQoJcmV0dXJuIEZBTFNFOwp9CgpCT09MIGZpcEltYWdlOjpjb252ZXJ0VG8zMkJpdHMoKSB7CglpZihfZGliKSB7CgkJRklCSVRNQVAgKmRpYjMyID0gRnJlZUltYWdlX0NvbnZlcnRUbzMyQml0cyhfZGliKTsKCQlyZXR1cm4gcmVwbGFjZShkaWIzMik7Cgl9CglyZXR1cm4gRkFMU0U7Cn0KCkJPT0wgZmlwSW1hZ2U6OmNvbnZlcnRUb0dyYXlzY2FsZSgpIHsKCWlmKF9kaWIpIHsKCQlGSUJJVE1BUCAqZGliOCA9IEZyZWVJbWFnZV9Db252ZXJ0VG9HcmV5c2NhbGUoX2RpYik7CgkJcmV0dXJuIHJlcGxhY2UoZGliOCk7Cgl9CglyZXR1cm4gRkFMU0U7Cn0KCkJPT0wgZmlwSW1hZ2U6OmNvbG9yUXVhbnRpemUoRlJFRV9JTUFHRV9RVUFOVElaRSBhbGdvcml0aG0pIHsKCWlmKF9kaWIpIHsKCQlGSUJJVE1BUCAqZGliOCA9IEZyZWVJbWFnZV9Db2xvclF1YW50aXplKF9kaWIsIGFsZ29yaXRobSk7CgkJcmV0dXJuIHJlcGxhY2UoZGliOCk7Cgl9CglyZXR1cm4gRkFMU0U7Cn0KCkJPT0wgZmlwSW1hZ2U6OmRpdGhlcihGUkVFX0lNQUdFX0RJVEhFUiBhbGdvcml0aG0pIHsKCWlmKF9kaWIpIHsKCQlGSUJJVE1BUCAqZGliID0gRnJlZUltYWdlX0RpdGhlcihfZGliLCBhbGdvcml0aG0pOwoJCXJldHVybiByZXBsYWNlKGRpYik7Cgl9CglyZXR1cm4gRkFMU0U7Cn0KCkJPT0wgZmlwSW1hZ2U6OmNvbnZlcnRUb0Zsb2F0KCkgewoJaWYoX2RpYikgewoJCUZJQklUTUFQICpkaWIgPSBGcmVlSW1hZ2VfQ29udmVydFRvRmxvYXQoX2RpYik7CgkJcmV0dXJuIHJlcGxhY2UoZGliKTsKCX0KCXJldHVybiBGQUxTRTsKfQoKQk9PTCBmaXBJbWFnZTo6Y29udmVydFRvUkdCRigpIHsKCWlmKF9kaWIpIHsKCQlGSUJJVE1BUCAqZGliID0gRnJlZUltYWdlX0NvbnZlcnRUb1JHQkYoX2RpYik7CgkJcmV0dXJuIHJlcGxhY2UoZGliKTsKCX0KCXJldHVybiBGQUxTRTsKfQoKQk9PTCBmaXBJbWFnZTo6Y29udmVydFRvUkdCQUYoKSB7CglpZihfZGliKSB7CgkJRklCSVRNQVAgKmRpYiA9IEZyZWVJbWFnZV9Db252ZXJ0VG9SR0JBRihfZGliKTsKCQlyZXR1cm4gcmVwbGFjZShkaWIpOwoJfQoJcmV0dXJuIEZBTFNFOwp9CgpCT09MIGZpcEltYWdlOjpjb252ZXJ0VG9VSU5UMTYoKSB7CglpZihfZGliKSB7CgkJRklCSVRNQVAgKmRpYiA9IEZyZWVJbWFnZV9Db252ZXJ0VG9VSU5UMTYoX2RpYik7CgkJcmV0dXJuIHJlcGxhY2UoZGliKTsKCX0KCXJldHVybiBGQUxTRTsKfQoKQk9PTCBmaXBJbWFnZTo6Y29udmVydFRvUkdCMTYoKSB7CglpZihfZGliKSB7CgkJRklCSVRNQVAgKmRpYiA9IEZyZWVJbWFnZV9Db252ZXJ0VG9SR0IxNihfZGliKTsKCQlyZXR1cm4gcmVwbGFjZShkaWIpOwoJfQoJcmV0dXJuIEZBTFNFOwp9CgpCT09MIGZpcEltYWdlOjpjb252ZXJ0VG9SR0JBMTYoKSB7CglpZihfZGliKSB7CgkJRklCSVRNQVAgKmRpYiA9IEZyZWVJbWFnZV9Db252ZXJ0VG9SR0JBMTYoX2RpYik7CgkJcmV0dXJuIHJlcGxhY2UoZGliKTsKCX0KCXJldHVybiBGQUxTRTsKfQoKQk9PTCBmaXBJbWFnZTo6dG9uZU1hcHBpbmcoRlJFRV9JTUFHRV9UTU8gdG1vLCBkb3VibGUgZmlyc3RfcGFyYW0sIGRvdWJsZSBzZWNvbmRfcGFyYW0sIGRvdWJsZSB0aGlyZF9wYXJhbSwgZG91YmxlIGZvdXJ0aF9wYXJhbSkgewoJaWYoX2RpYikgewoJCUZJQklUTUFQICpkc3QgPSBOVUxMOwoJCS8vIEFwcGx5IGEgdG9uZSBtYXBwaW5nIGFsZ29yaXRobSBhbmQgY29udmVydCB0byAyNC1iaXQgCgkJc3dpdGNoKHRtbykgewoJCQljYXNlIEZJVE1PX1JFSU5IQVJEMDU6CgkJCQlkc3QgPSBGcmVlSW1hZ2VfVG1vUmVpbmhhcmQwNUV4KF9kaWIsIGZpcnN0X3BhcmFtLCBzZWNvbmRfcGFyYW0sIHRoaXJkX3BhcmFtLCBmb3VydGhfcGFyYW0pOwoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQlkc3QgPSBGcmVlSW1hZ2VfVG9uZU1hcHBpbmcoX2RpYiwgdG1vLCBmaXJzdF9wYXJhbSwgc2Vjb25kX3BhcmFtKTsKCQkJCWJyZWFrOwoJCX0KCgkJcmV0dXJuIHJlcGxhY2UoZHN0KTsKCX0KCXJldHVybiBGQUxTRTsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgIAovLyBUcmFuc3BhcmVuY3kgc3VwcG9ydDogYmFja2dyb3VuZCBjb2xvdXIgYW5kIGFscGhhIGNoYW5uZWwKCkJPT0wgZmlwSW1hZ2U6OmlzVHJhbnNwYXJlbnQoKSBjb25zdCB7CglyZXR1cm4gRnJlZUltYWdlX0lzVHJhbnNwYXJlbnQoX2RpYik7Cn0KCnVuc2lnbmVkIGZpcEltYWdlOjpnZXRUcmFuc3BhcmVuY3lDb3VudCgpIGNvbnN0IHsKCXJldHVybiBGcmVlSW1hZ2VfR2V0VHJhbnNwYXJlbmN5Q291bnQoX2RpYik7Cn0KCkJZVEUqIGZpcEltYWdlOjpnZXRUcmFuc3BhcmVuY3lUYWJsZSgpIGNvbnN0IHsKCXJldHVybiBGcmVlSW1hZ2VfR2V0VHJhbnNwYXJlbmN5VGFibGUoX2RpYik7Cn0KCnZvaWQgZmlwSW1hZ2U6OnNldFRyYW5zcGFyZW5jeVRhYmxlKEJZVEUgKnRhYmxlLCBpbnQgY291bnQpIHsKCUZyZWVJbWFnZV9TZXRUcmFuc3BhcmVuY3lUYWJsZShfZGliLCB0YWJsZSwgY291bnQpOwoJX2JIYXNDaGFuZ2VkID0gVFJVRTsKfQoKQk9PTCBmaXBJbWFnZTo6aGFzRmlsZUJrQ29sb3IoKSBjb25zdCB7CglyZXR1cm4gRnJlZUltYWdlX0hhc0JhY2tncm91bmRDb2xvcihfZGliKTsKfQoKQk9PTCBmaXBJbWFnZTo6Z2V0RmlsZUJrQ29sb3IoUkdCUVVBRCAqYmtjb2xvcikgY29uc3QgewoJcmV0dXJuIEZyZWVJbWFnZV9HZXRCYWNrZ3JvdW5kQ29sb3IoX2RpYiwgYmtjb2xvcik7Cn0KCkJPT0wgZmlwSW1hZ2U6OnNldEZpbGVCa0NvbG9yKFJHQlFVQUQgKmJrY29sb3IpIHsKCV9iSGFzQ2hhbmdlZCA9IFRSVUU7CglyZXR1cm4gRnJlZUltYWdlX1NldEJhY2tncm91bmRDb2xvcihfZGliLCBia2NvbG9yKTsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgIAovLyBDaGFubmVsIHByb2Nlc3Npbmcgc3VwcG9ydAoKQk9PTCBmaXBJbWFnZTo6Z2V0Q2hhbm5lbChmaXBJbWFnZSYgaW1hZ2UsIEZSRUVfSU1BR0VfQ09MT1JfQ0hBTk5FTCBjaGFubmVsKSBjb25zdCB7CglpZihfZGliKSB7CgkJaW1hZ2UgPSBGcmVlSW1hZ2VfR2V0Q2hhbm5lbChfZGliLCBjaGFubmVsKTsKCQlyZXR1cm4gaW1hZ2UuaXNWYWxpZCgpOwoJfQoJcmV0dXJuIEZBTFNFOwp9CgpCT09MIGZpcEltYWdlOjpzZXRDaGFubmVsKGZpcEltYWdlJiBpbWFnZSwgRlJFRV9JTUFHRV9DT0xPUl9DSEFOTkVMIGNoYW5uZWwpIHsKCWlmKF9kaWIpIHsKCQlfYkhhc0NoYW5nZWQgPSBUUlVFOwoJCXJldHVybiBGcmVlSW1hZ2VfU2V0Q2hhbm5lbChfZGliLCBpbWFnZS5fZGliLCBjaGFubmVsKTsKCX0KCXJldHVybiBGQUxTRTsKfQoKQk9PTCBmaXBJbWFnZTo6c3BsaXRDaGFubmVscyhmaXBJbWFnZSYgUmVkQ2hhbm5lbCwgZmlwSW1hZ2UmIEdyZWVuQ2hhbm5lbCwgZmlwSW1hZ2UmIEJsdWVDaGFubmVsKSB7CglpZihfZGliKSB7CgkJUmVkQ2hhbm5lbCA9IEZyZWVJbWFnZV9HZXRDaGFubmVsKF9kaWIsIEZJQ0NfUkVEKTsKCQlHcmVlbkNoYW5uZWwgPSBGcmVlSW1hZ2VfR2V0Q2hhbm5lbChfZGliLCBGSUNDX0dSRUVOKTsKCQlCbHVlQ2hhbm5lbCA9IEZyZWVJbWFnZV9HZXRDaGFubmVsKF9kaWIsIEZJQ0NfQkxVRSk7CgoJCXJldHVybiAoUmVkQ2hhbm5lbC5pc1ZhbGlkKCkgJiYgR3JlZW5DaGFubmVsLmlzVmFsaWQoKSAmJiBCbHVlQ2hhbm5lbC5pc1ZhbGlkKCkpOwoJfQoJcmV0dXJuIEZBTFNFOwp9CgpCT09MIGZpcEltYWdlOjpjb21iaW5lQ2hhbm5lbHMoZmlwSW1hZ2UmIHJlZCwgZmlwSW1hZ2UmIGdyZWVuLCBmaXBJbWFnZSYgYmx1ZSkgewoJaWYoIV9kaWIpIHsKCQlpbnQgd2lkdGggPSByZWQuZ2V0V2lkdGgoKTsKCQlpbnQgaGVpZ2h0ID0gcmVkLmdldEhlaWdodCgpOwoJCV9kaWIgPSBGcmVlSW1hZ2VfQWxsb2NhdGUod2lkdGgsIGhlaWdodCwgMjQsIEZJX1JHQkFfUkVEX01BU0ssIEZJX1JHQkFfR1JFRU5fTUFTSywgRklfUkdCQV9CTFVFX01BU0spOwoJfQoKCWlmKF9kaWIpIHsKCQlCT09MIGJSZXN1bHQgPSBUUlVFOwoJCWJSZXN1bHQgJj0gRnJlZUltYWdlX1NldENoYW5uZWwoX2RpYiwgcmVkLl9kaWIsIEZJQ0NfUkVEKTsKCQliUmVzdWx0ICY9IEZyZWVJbWFnZV9TZXRDaGFubmVsKF9kaWIsIGdyZWVuLl9kaWIsIEZJQ0NfR1JFRU4pOwoJCWJSZXN1bHQgJj0gRnJlZUltYWdlX1NldENoYW5uZWwoX2RpYiwgYmx1ZS5fZGliLCBGSUNDX0JMVUUpOwoKCQlfYkhhc0NoYW5nZWQgPSBUUlVFOwoKCQlyZXR1cm4gYlJlc3VsdDsKCX0KCXJldHVybiBGQUxTRTsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgIAovLyBSb3RhdGlvbiBhbmQgZmxpcHBpbmcKCkJPT0wgZmlwSW1hZ2U6OnJvdGF0ZUV4KGRvdWJsZSBhbmdsZSwgZG91YmxlIHhfc2hpZnQsIGRvdWJsZSB5X3NoaWZ0LCBkb3VibGUgeF9vcmlnaW4sIGRvdWJsZSB5X29yaWdpbiwgQk9PTCB1c2VfbWFzaykgewoJaWYoX2RpYikgewoJCWlmKEZyZWVJbWFnZV9HZXRCUFAoX2RpYikgPj0gOCkgewoJCQlGSUJJVE1BUCAqcm90YXRlZCA9IEZyZWVJbWFnZV9Sb3RhdGVFeChfZGliLCBhbmdsZSwgeF9zaGlmdCwgeV9zaGlmdCwgeF9vcmlnaW4sIHlfb3JpZ2luLCB1c2VfbWFzayk7CgkJCXJldHVybiByZXBsYWNlKHJvdGF0ZWQpOwoJCX0KCX0KCXJldHVybiBGQUxTRTsKfQoKQk9PTCBmaXBJbWFnZTo6cm90YXRlKGRvdWJsZSBhbmdsZSwgY29uc3Qgdm9pZCAqYmtjb2xvcikgewoJaWYoX2RpYikgewoJCXN3aXRjaChGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKF9kaWIpKSB7CgkJCWNhc2UgRklUX0JJVE1BUDoKCQkJCXN3aXRjaChGcmVlSW1hZ2VfR2V0QlBQKF9kaWIpKSB7CgkJCQkJY2FzZSAxOgoJCQkJCWNhc2UgODoKCQkJCQljYXNlIDI0OgoJCQkJCWNhc2UgMzI6CgkJCQkJCWJyZWFrOwoJCQkJCWRlZmF1bHQ6CgkJCQkJCXJldHVybiBGQUxTRTsKCQkJCX0KCQkJCWJyZWFrOwoKCQkJY2FzZSBGSVRfVUlOVDE2OgoJCQljYXNlIEZJVF9SR0IxNjoKCQkJY2FzZSBGSVRfUkdCQTE2OgoJCQljYXNlIEZJVF9GTE9BVDoKCQkJY2FzZSBGSVRfUkdCRjoKCQkJY2FzZSBGSVRfUkdCQUY6CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCXJldHVybiBGQUxTRTsKCQkJCWJyZWFrOwoJCX0KCgkJRklCSVRNQVAgKnJvdGF0ZWQgPSBGcmVlSW1hZ2VfUm90YXRlKF9kaWIsIGFuZ2xlLCBia2NvbG9yKTsKCQlyZXR1cm4gcmVwbGFjZShyb3RhdGVkKTsKCgl9CglyZXR1cm4gRkFMU0U7Cn0KCkJPT0wgZmlwSW1hZ2U6OmZsaXBWZXJ0aWNhbCgpIHsKCWlmKF9kaWIpIHsKCQlfYkhhc0NoYW5nZWQgPSBUUlVFOwoKCQlyZXR1cm4gRnJlZUltYWdlX0ZsaXBWZXJ0aWNhbChfZGliKTsKCX0KCXJldHVybiBGQUxTRTsKfQoKQk9PTCBmaXBJbWFnZTo6ZmxpcEhvcml6b250YWwoKSB7CglpZihfZGliKSB7CgkJX2JIYXNDaGFuZ2VkID0gVFJVRTsKCgkJcmV0dXJuIEZyZWVJbWFnZV9GbGlwSG9yaXpvbnRhbChfZGliKTsKCX0KCXJldHVybiBGQUxTRTsKfQoKLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAgIAovLyBDb2xvciBtYW5pcHVsYXRpb24gcm91dGluZXMKCkJPT0wgZmlwSW1hZ2U6OmludmVydCgpIHsKCWlmKF9kaWIpIHsKCQlfYkhhc0NoYW5nZWQgPSBUUlVFOwoKCQlyZXR1cm4gRnJlZUltYWdlX0ludmVydChfZGliKTsKCX0KCXJldHVybiBGQUxTRTsKfQoKQk9PTCBmaXBJbWFnZTo6YWRqdXN0Q3VydmUoQllURSAqTFVULCBGUkVFX0lNQUdFX0NPTE9SX0NIQU5ORUwgY2hhbm5lbCkgewoJaWYoX2RpYikgewoJCV9iSGFzQ2hhbmdlZCA9IFRSVUU7CgoJCXJldHVybiBGcmVlSW1hZ2VfQWRqdXN0Q3VydmUoX2RpYiwgTFVULCBjaGFubmVsKTsKCX0KCXJldHVybiBGQUxTRTsKfQoKQk9PTCBmaXBJbWFnZTo6YWRqdXN0R2FtbWEoZG91YmxlIGdhbW1hKSB7CglpZihfZGliKSB7CgkJX2JIYXNDaGFuZ2VkID0gVFJVRTsKCgkJcmV0dXJuIEZyZWVJbWFnZV9BZGp1c3RHYW1tYShfZGliLCBnYW1tYSk7Cgl9CglyZXR1cm4gRkFMU0U7Cn0KCkJPT0wgZmlwSW1hZ2U6OmFkanVzdEJyaWdodG5lc3MoZG91YmxlIHBlcmNlbnRhZ2UpIHsKCWlmKF9kaWIpIHsKCQlfYkhhc0NoYW5nZWQgPSBUUlVFOwoKCQlyZXR1cm4gRnJlZUltYWdlX0FkanVzdEJyaWdodG5lc3MoX2RpYiwgcGVyY2VudGFnZSk7Cgl9CglyZXR1cm4gRkFMU0U7Cn0KCkJPT0wgZmlwSW1hZ2U6OmFkanVzdENvbnRyYXN0KGRvdWJsZSBwZXJjZW50YWdlKSB7CglpZihfZGliKSB7CgkJX2JIYXNDaGFuZ2VkID0gVFJVRTsKCgkJcmV0dXJuIEZyZWVJbWFnZV9BZGp1c3RDb250cmFzdChfZGliLCBwZXJjZW50YWdlKTsKCX0KCXJldHVybiBGQUxTRTsKfQoKQk9PTCBmaXBJbWFnZTo6YWRqdXN0QnJpZ2h0bmVzc0NvbnRyYXN0R2FtbWEoZG91YmxlIGJyaWdodG5lc3MsIGRvdWJsZSBjb250cmFzdCwgZG91YmxlIGdhbW1hKSB7CglpZihfZGliKSB7CgkJX2JIYXNDaGFuZ2VkID0gVFJVRTsKCgkJcmV0dXJuIEZyZWVJbWFnZV9BZGp1c3RDb2xvcnMoX2RpYiwgYnJpZ2h0bmVzcywgY29udHJhc3QsIGdhbW1hLCBGQUxTRSk7Cgl9CglyZXR1cm4gRkFMU0U7Cn0KCkJPT0wgZmlwSW1hZ2U6OmdldEhpc3RvZ3JhbShEV09SRCAqaGlzdG8sIEZSRUVfSU1BR0VfQ09MT1JfQ0hBTk5FTCBjaGFubmVsKSBjb25zdCB7CglpZihfZGliKSB7CgkJcmV0dXJuIEZyZWVJbWFnZV9HZXRIaXN0b2dyYW0oX2RpYiwgaGlzdG8sIGNoYW5uZWwpOwoJfQoJcmV0dXJuIEZBTFNFOwp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIFVwc2FtcGxpbmcgLyBkb3duc2FtcGxpbmcgcm91dGluZQoKQk9PTCBmaXBJbWFnZTo6cmVzY2FsZSh1bnNpZ25lZCBuZXdfd2lkdGgsIHVuc2lnbmVkIG5ld19oZWlnaHQsIEZSRUVfSU1BR0VfRklMVEVSIGZpbHRlcikgewoJaWYoX2RpYikgewoJCXN3aXRjaChGcmVlSW1hZ2VfR2V0SW1hZ2VUeXBlKF9kaWIpKSB7CgkJCWNhc2UgRklUX0JJVE1BUDoKCQkJY2FzZSBGSVRfVUlOVDE2OgoJCQljYXNlIEZJVF9SR0IxNjoKCQkJY2FzZSBGSVRfUkdCQTE2OgoJCQljYXNlIEZJVF9GTE9BVDoKCQkJY2FzZSBGSVRfUkdCRjoKCQkJY2FzZSBGSVRfUkdCQUY6CgkJCQlicmVhazsKCQkJZGVmYXVsdDoKCQkJCXJldHVybiBGQUxTRTsKCQkJCWJyZWFrOwoJCX0KCgkJLy8gUGVyZm9ybSB1cHNhbXBsaW5nIC8gZG93bnNhbXBsaW5nCgkJRklCSVRNQVAgKmRzdCA9IEZyZWVJbWFnZV9SZXNjYWxlKF9kaWIsIG5ld193aWR0aCwgbmV3X2hlaWdodCwgZmlsdGVyKTsKCQlyZXR1cm4gcmVwbGFjZShkc3QpOwoJfQoJcmV0dXJuIEZBTFNFOwp9CgpCT09MIGZpcEltYWdlOjptYWtlVGh1bWJuYWlsKHVuc2lnbmVkIG1heF9zaXplLCBCT09MIGNvbnZlcnQpIHsKCWlmKF9kaWIpIHsKCQlzd2l0Y2goRnJlZUltYWdlX0dldEltYWdlVHlwZShfZGliKSkgewoJCQljYXNlIEZJVF9CSVRNQVA6CgkJCWNhc2UgRklUX1VJTlQxNjoKCQkJY2FzZSBGSVRfUkdCMTY6CgkJCWNhc2UgRklUX1JHQkExNjoKCQkJY2FzZSBGSVRfRkxPQVQ6CgkJCWNhc2UgRklUX1JHQkY6CgkJCWNhc2UgRklUX1JHQkFGOgoJCQkJYnJlYWs7CgkJCWRlZmF1bHQ6CgkJCQlyZXR1cm4gRkFMU0U7CgkJCQlicmVhazsKCQl9CgoJCS8vIFBlcmZvcm0gZG93bnNhbXBsaW5nCgkJRklCSVRNQVAgKmRzdCA9IEZyZWVJbWFnZV9NYWtlVGh1bWJuYWlsKF9kaWIsIG1heF9zaXplLCBjb252ZXJ0KTsKCQlyZXR1cm4gcmVwbGFjZShkc3QpOwoJfQoJcmV0dXJuIEZBTFNFOwp9CgovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi8vIE1ldGFkYXRhCgp1bnNpZ25lZCBmaXBJbWFnZTo6Z2V0TWV0YWRhdGFDb3VudChGUkVFX0lNQUdFX01ETU9ERUwgbW9kZWwpIGNvbnN0IHsKCXJldHVybiBGcmVlSW1hZ2VfR2V0TWV0YWRhdGFDb3VudChtb2RlbCwgX2RpYik7Cn0KCkJPT0wgZmlwSW1hZ2U6OmdldE1ldGFkYXRhKEZSRUVfSU1BR0VfTURNT0RFTCBtb2RlbCwgY29uc3QgY2hhciAqa2V5LCBmaXBUYWcmIHRhZykgY29uc3QgewoJRklUQUcgKnNlYXJjaGVkVGFnID0gTlVMTDsKCUZyZWVJbWFnZV9HZXRNZXRhZGF0YShtb2RlbCwgX2RpYiwga2V5LCAmc2VhcmNoZWRUYWcpOwoJaWYoc2VhcmNoZWRUYWcgIT0gTlVMTCkgewoJCXRhZyA9IEZyZWVJbWFnZV9DbG9uZVRhZyhzZWFyY2hlZFRhZyk7CgkJcmV0dXJuIFRSVUU7Cgl9IGVsc2UgewoJCS8vIGNsZWFyIHRoZSB0YWcKCQl0YWcgPSAoRklUQUcqKU5VTEw7Cgl9CglyZXR1cm4gRkFMU0U7Cn0KCkJPT0wgZmlwSW1hZ2U6OnNldE1ldGFkYXRhKEZSRUVfSU1BR0VfTURNT0RFTCBtb2RlbCwgY29uc3QgY2hhciAqa2V5LCBmaXBUYWcmIHRhZykgewoJcmV0dXJuIEZyZWVJbWFnZV9TZXRNZXRhZGF0YShtb2RlbCwgX2RpYiwga2V5LCB0YWcpOwp9Cgo=