Ly8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi8vCi8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwovLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAovLwovLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLy8KLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQovLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAovLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAovLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KCiNpbmNsdWRlICJEaXJlY3QzRDguaHBwIgoKI2luY2x1ZGUgIkRpcmVjdDNERGV2aWNlOC5ocHAiCiNpbmNsdWRlICJDYXBhYmlsaXRpZXMuaHBwIgojaW5jbHVkZSAiQ29uZmlndXJhdG9yLmhwcCIKI2luY2x1ZGUgIkRlYnVnLmhwcCIKI2luY2x1ZGUgIkNQVUlELmhwcCIKI2luY2x1ZGUgIlZlcnNpb24uaCIKI2luY2x1ZGUgIkNvbmZpZy5ocHAiCgojZGVmaW5lIENPTVBJTEVfTVVMVElNT05fU1RVQlMKI2luY2x1ZGUgPG11bHRpbW9uLmg+CiNpbmNsdWRlIDxhc3NlcnQuaD4KCm5hbWVzcGFjZSBEM0Q4CnsKCURpcmVjdDNEODo6RGlyZWN0M0Q4KGludCB2ZXJzaW9uLCBjb25zdCBISU5TVEFOQ0UgaW5zdGFuY2UpIDogdmVyc2lvbih2ZXJzaW9uKSwgaW5zdGFuY2UoaW5zdGFuY2UpCgl7CgkJZGlzcGxheU1vZGUgPSAwOwoJCW51bURpc3BsYXlNb2RlcyA9IDA7CgoJCURFVk1PREUgZGV2bW9kZTsKCQlkZXZtb2RlLmRtU2l6ZSA9IHNpemVvZihERVZNT0RFKTsKCgkJLy8gQ291bnQgbnVtYmVyIG9mIGRpc3BsYXkgbW9kZXMKCQl3aGlsZShFbnVtRGlzcGxheVNldHRpbmdzKDAsIG51bURpc3BsYXlNb2RlcywgJmRldm1vZGUpKQoJCXsKCQkJbnVtRGlzcGxheU1vZGVzKys7CgkJfQoKCQlkaXNwbGF5TW9kZSA9IG5ldyBERVZNT0RFW251bURpc3BsYXlNb2Rlc107CgoJCS8vIFN0b3JlIGRpc3BsYXkgbW9kZXMgaW5mb3JtYXRpb24KCQlmb3IoaW50IGkgPSAwOyBpIDwgbnVtRGlzcGxheU1vZGVzOyBpKyspCgkJewoJCQlkaXNwbGF5TW9kZVtpXS5kbVNpemUgPSBzaXplb2YoREVWTU9ERSk7CgkJCUVudW1EaXNwbGF5U2V0dGluZ3MoMCwgaSwgJmRpc3BsYXlNb2RlW2ldKTsKCQl9CgoJCWQzZDhMaWIgPSAwOwoJCWQzZDggPSAwOwoKCQlzdzo6Q29uZmlndXJhdG9yIGluaSgiU3dpZnRTaGFkZXIuaW5pIik7CgoJCWludCBwcyA9IGluaS5nZXRJbnRlZ2VyKCJDYXBhYmlsaXRpZXMiLCAiUGl4ZWxTaGFkZXJWZXJzaW9uIiwgMTQpOwoJCWludCB2cyA9IGluaS5nZXRJbnRlZ2VyKCJDYXBhYmlsaXRpZXMiLCAiVmVydGV4U2hhZGVyVmVyc2lvbiIsIDExKTsKCgkJICAgICBpZihwcyA9PSAgMCkgcGl4ZWxTaGFkZXJWZXJzaW9uID0gRDNEUFNfVkVSU0lPTigwLCAwKTsKCQllbHNlIGlmKHBzIDw9IDExKSBwaXhlbFNoYWRlclZlcnNpb24gPSBEM0RQU19WRVJTSU9OKDEsIDEpOwoJCWVsc2UgaWYocHMgPD0gMTIpIHBpeGVsU2hhZGVyVmVyc2lvbiA9IEQzRFBTX1ZFUlNJT04oMSwgMik7CgkJZWxzZSBpZihwcyA8PSAxMykgcGl4ZWxTaGFkZXJWZXJzaW9uID0gRDNEUFNfVkVSU0lPTigxLCAzKTsKCQllbHNlICAgICAgICAgICAgICBwaXhlbFNoYWRlclZlcnNpb24gPSBEM0RQU19WRVJTSU9OKDEsIDQpOwoKCQkgICAgIGlmKHZzID09ICAwKSB2ZXJ0ZXhTaGFkZXJWZXJzaW9uID0gRDNEVlNfVkVSU0lPTigwLCAwKTsKCQllbHNlICAgICAgICAgICAgICB2ZXJ0ZXhTaGFkZXJWZXJzaW9uID0gRDNEVlNfVkVSU0lPTigxLCAxKTsKCgkJdGV4dHVyZU1lbW9yeSA9IDEwMjQgKiAxMDI0ICogaW5pLmdldEludGVnZXIoIkNhcGFiaWxpdGllcyIsICJUZXh0dXJlTWVtb3J5IiwgMjU2KTsKCX0KCglEaXJlY3QzRDg6On5EaXJlY3QzRDgoKQoJewoJCWRlbGV0ZVtdIGRpc3BsYXlNb2RlOwoJCWRpc3BsYXlNb2RlID0gMDsKCgkJaWYoZDNkOCkKCQl7CgkJCWQzZDgtPlJlbGVhc2UoKTsKCQkJZDNkOCA9IDA7CgkJfQoKCQlpZihkM2Q4TGliKQoJCXsKCQkJRnJlZUxpYnJhcnkoZDNkOExpYik7CgkJCWQzZDhMaWIgPSAwOwoJCX0KCX0KCglsb25nIERpcmVjdDNEODo6UXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpCgl7CgkJVFJBQ0UoIiIpOwoKCQlpZihpaWQgPT0gSUlEX0lEaXJlY3QzRDggfHwKCQkgICBpaWQgPT0gSUlEX0lVbmtub3duKQoJCXsKCQkJQWRkUmVmKCk7CgkJCSpvYmplY3QgPSB0aGlzOwoKCQkJcmV0dXJuIFNfT0s7CgkJfQoKCQkqb2JqZWN0ID0gMDsKCgkJcmV0dXJuIE5PSU5URVJGQUNFKGlpZCk7Cgl9CgoJdW5zaWduZWQgbG9uZyBEaXJlY3QzRDg6OkFkZFJlZigpCgl7CgkJVFJBQ0UoIiIpOwoKCQlyZXR1cm4gVW5rbm93bjo6QWRkUmVmKCk7Cgl9CgoJdW5zaWduZWQgbG9uZyBEaXJlY3QzRDg6OlJlbGVhc2UoKQoJewoJCVRSQUNFKCIiKTsKCgkJcmV0dXJuIFVua25vd246OlJlbGVhc2UoKTsKCX0KCglsb25nIERpcmVjdDNEODo6Q2hlY2tEZXB0aFN0ZW5jaWxNYXRjaCh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNEREVWVFlQRSBkZXZpY2VUeXBlLCBEM0RGT1JNQVQgYWRhcHRlckZvcm1hdCwgRDNERk9STUFUIHJlbmRlclRhcmdldEZvcm1hdCwgRDNERk9STUFUIGRlcHRoU3RlbmNpbEZvcm1hdCkKCXsKCQlUUkFDRSgiIik7CgoJCWlmKGRldmljZVR5cGUgIT0gRDNEREVWVFlQRV9IQUwpCgkJewoJCQlsb2FkU3lzdGVtRDNEOCgpOwoKCQkJaWYoZDNkOCkKCQkJewoJCQkJcmV0dXJuIGQzZDgtPkNoZWNrRGVwdGhTdGVuY2lsTWF0Y2goYWRhcHRlciwgZGV2aWNlVHlwZSwgYWRhcHRlckZvcm1hdCwgcmVuZGVyVGFyZ2V0Rm9ybWF0LCBkZXB0aFN0ZW5jaWxGb3JtYXQpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcmV0dXJuIENoZWNrRGVwdGhTdGVuY2lsTWF0Y2goYWRhcHRlciwgRDNEREVWVFlQRV9IQUwsIGFkYXB0ZXJGb3JtYXQsIHJlbmRlclRhcmdldEZvcm1hdCwgZGVwdGhTdGVuY2lsRm9ybWF0KTsKCQkJfQoJCX0KCgkJcmV0dXJuIEQzRF9PSzsgICAvLyBBbnkgZm9ybWF0IGNvbWJpbmF0aW9uIGlzIG9rCgl9CgoJbG9uZyBEaXJlY3QzRDg6OkNoZWNrRGV2aWNlRm9ybWF0KHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEQzREZPUk1BVCBhZGFwdGVyRm9ybWF0LCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RSRVNPVVJDRVRZUEUgcmVzb3VyY2VUeXBlLCBEM0RGT1JNQVQgY2hlY2tGb3JtYXQpCgl7CgkJVFJBQ0UoInVuc2lnbmVkIGludCBhZGFwdGVyID0gJWQsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSA9ICVkLCBEM0RGT1JNQVQgYWRhcHRlckZvcm1hdCA9ICVkLCB1bnNpZ25lZCBsb25nIHVzYWdlID0gJWQsIEQzRFJFU09VUkNFVFlQRSByZXNvdXJjZVR5cGUgPSAlZCwgRDNERk9STUFUIGNoZWNrRm9ybWF0ID0gJWQiLCBhZGFwdGVyLCBkZXZpY2VUeXBlLCBhZGFwdGVyRm9ybWF0LCB1c2FnZSwgcmVzb3VyY2VUeXBlLCBjaGVja0Zvcm1hdCk7CgoJCWlmKGRldmljZVR5cGUgIT0gRDNEREVWVFlQRV9IQUwpCgkJewoJCQlsb2FkU3lzdGVtRDNEOCgpOwoKCQkJaWYoZDNkOCkKCQkJewoJCQkJcmV0dXJuIGQzZDgtPkNoZWNrRGV2aWNlRm9ybWF0KGFkYXB0ZXIsIGRldmljZVR5cGUsIGFkYXB0ZXJGb3JtYXQsIHVzYWdlLCByZXNvdXJjZVR5cGUsIGNoZWNrRm9ybWF0KTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXJldHVybiBDaGVja0RldmljZUZvcm1hdChhZGFwdGVyLCBEM0RERVZUWVBFX0hBTCwgYWRhcHRlckZvcm1hdCwgdXNhZ2UsIHJlc291cmNlVHlwZSwgY2hlY2tGb3JtYXQpOwoJCQl9CgkJfQoKCQlzd2l0Y2gocmVzb3VyY2VUeXBlKQoJCXsKCQljYXNlIEQzRFJUWVBFX1NVUkZBQ0U6CgkJCWlmKHVzYWdlICYgRDNEVVNBR0VfUkVOREVSVEFSR0VUKQoJCQl7CgkJCQlzd2l0Y2goY2hlY2tGb3JtYXQpCgkJCQl7CgkJCQljYXNlIEQzREZNVF9SOEc4Qjg6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpSOEc4QjgpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1I1RzZCNToJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OlI1RzZCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfWDFSNUc1QjU6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OlgxUjVHNUI1KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMVI1RzVCNToJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QTFSNUc1QjUpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpBNFI0RzRCNCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfUjNHM0IyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6UjNHM0IyKQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BOFIzRzNCMjoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QThSM0czQjIpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1g0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpYNFI0RzRCNCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQThSOEc4Qjg6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkE4UjhHOEI4KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9YOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6WDhSOEc4QjgpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKCQkJCWNhc2UgRDNERk1UX0cxNlIxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkcxNlIxNikJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTJCMTBHMTBSMTA6CWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QTJCMTBHMTBSMTApCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJZGVmYXVsdDoKCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CgkJCQl9CgkJCX0KCQkJZWxzZSBpZih1c2FnZSAmIEQzRFVTQUdFX0RFUFRIU1RFTkNJTCkKCQkJewoJCQkJc3dpdGNoKGNoZWNrRm9ybWF0KQoJCQkJewoJCQkJY2FzZSBEM0RGTVRfRDMyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRlcHRoU3RlbmNpbDo6RDMyKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRDI0Uzg6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RGVwdGhTdGVuY2lsOjpEMjRTOCkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0QyNFg4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRlcHRoU3RlbmNpbDo6RDI0WDgpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RGVwdGhTdGVuY2lsOjpEMTYpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQlkZWZhdWx0OgoJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCXN3aXRjaChjaGVja0Zvcm1hdCkKCQkJCXsKCQkJCWNhc2UgRDNERk1UX0E4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9SNUc2QjU6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UjVHNkI1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfWDFSNUc1QjU6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpYMVI1RzVCNSkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTFSNUc1QjU6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBMVI1RzVCNSkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTRSNEc0QjQ6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBNFI0RzRCNCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfUjNHM0IyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlIzRzNCMikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E4UjNHM0IyOgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QThSM0czQjIpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1g0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6WDRSNEc0QjQpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1I4RzhCODoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSOEc4QjgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9YOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6Olg4UjhHOEI4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE4UjhHOEI4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQkvLyBQYWxldHRlZCBmb3JtYXRzCgkJCQljYXNlIEQzREZNVF9QODoJCQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UDgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQThQODoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBOFA4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJLy8gSW50ZWdlciBIRFIgZm9ybWF0cwoJCQkJY2FzZSBEM0RGTVRfRzE2UjE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkcxNlIxNikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOglpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBMkIxMEcxMFIxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJLy8gQ29tcHJlc3NlZCBmb3JtYXRzCgkJCQljYXNlIEQzREZNVF9EWFQxOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRYVDEpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EWFQyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRYVDIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EWFQzOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRYVDMpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EWFQ0OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRYVDQpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EWFQ1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRYVDUpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQkvLyBCdW1wIG1hcCBmb3JtYXRzCgkJCQljYXNlIEQzREZNVF9WOFU4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlY4VTgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9MNlY1VTU6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6TDZWNVU1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfWDhMOFY4VTg6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpYOEw4VjhVOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfUThXOFY4VTg6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpROFc4VjhVOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfVjE2VTE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlYxNlUxNikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0EyVzEwVjEwVTEwOglpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBMlcxMFYxMFUxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJLy8gTHVtaW5hbmNlIGZvcm1hdHMKCQkJCWNhc2UgRDNERk1UX0w4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpMOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BNEw0OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE0TDQpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BOEw4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE4TDgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQlkZWZhdWx0OgoJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKCQkJCX0KCQkJfQoJCWNhc2UgRDNEUlRZUEVfVk9MVU1FOgoJCQlzd2l0Y2goY2hlY2tGb3JtYXQpCgkJCXsKCQkJY2FzZSBEM0RGTVRfQTg6CQkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkE4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfUjVHNkI1OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlI1RzZCNSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfWDFSNUc1QjU6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpYMVI1RzVCNSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfQTFSNUc1QjU6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBMVI1RzVCNSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfQTRSNEc0QjQ6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBNFI0RzRCNCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfUjNHM0IyOgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlIzRzNCMikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfQThSM0czQjI6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBOFIzRzNCMikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfWDRSNEc0QjQ6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpYNFI0RzRCNCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfUjhHOEI4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlI4RzhCOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfWDhSOEc4Qjg6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpYOFI4RzhCOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfQThSOEc4Qjg6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBOFI4RzhCOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJLy8gUGFsZXR0ZWQgZm9ybWF0cwoJCQljYXNlIEQzREZNVF9QODoJCQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6UDgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9BOFA4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkE4UDgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkvLyBJbnRlZ2VyIEhEUiBmb3JtYXRzCgkJCWNhc2UgRDNERk1UX0cxNlIxNjoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpHMTZSMTYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOgkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBMkIxMEcxMFIxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkvLyBDb21wcmVzc2VkIGZvcm1hdHMKCQkJY2FzZSBEM0RGTVRfRFhUMToJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpEWFQxKQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfRFhUMjoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpEWFQyKQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfRFhUMzoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpEWFQzKQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfRFhUNDoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpEWFQ0KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfRFhUNToJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpEWFQ1KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJLy8gQnVtcCBtYXAgZm9ybWF0cwoJCQljYXNlIEQzREZNVF9WOFU4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlY4VTgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9MNlY1VTU6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6TDZWNVU1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9YOEw4VjhVODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6Olg4TDhWOFU4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9ROFc4VjhVODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlE4VzhWOFU4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9WMTZVMTY6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6VjE2VTE2KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9BMlcxMFYxMFUxMDoJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTJXMTBWMTBVMTApCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJLy8gTHVtaW5hbmNlIGZvcm1hdHMKCQkJY2FzZSBEM0RGTVRfTDg6CQkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6Okw4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfQTRMNDoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBNEw0KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfQThMODoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBOEw4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJZGVmYXVsdDoKCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKCQkJfQoJCWNhc2UgRDNEUlRZUEVfQ1VCRVRFWFRVUkU6CgkJCWlmKHVzYWdlICYgRDNEVVNBR0VfUkVOREVSVEFSR0VUKQoJCQl7CgkJCQlzd2l0Y2goY2hlY2tGb3JtYXQpCgkJCQl7CgkJCQljYXNlIEQzREZNVF9SOEc4Qjg6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpSOEc4QjgpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1I1RzZCNToJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OlI1RzZCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfWDFSNUc1QjU6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OlgxUjVHNUI1KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMVI1RzVCNToJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6QTFSNUc1QjUpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBNFI0RzRCNCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfUjNHM0IyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6UjNHM0IyKQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BOFIzRzNCMjoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6QThSM0czQjIpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1g0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpYNFI0RzRCNCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQThSOEc4Qjg6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkE4UjhHOEI4KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9YOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6WDhSOEc4QjgpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKCQkJCWNhc2UgRDNERk1UX0cxNlIxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkcxNlIxNikJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTJCMTBHMTBSMTA6CWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6QTJCMTBHMTBSMTApCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJZGVmYXVsdDoKCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CgkJCQl9CgkJCX0KCQkJZWxzZSBpZih1c2FnZSAmIEQzRFVTQUdFX0RFUFRIU1RFTkNJTCkKCQkJewoJCQkJc3dpdGNoKGNoZWNrRm9ybWF0KQoJCQkJewoJCQkJY2FzZSBEM0RGTVRfRDMyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRlcHRoU3RlbmNpbDo6RDMyKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRDI0Uzg6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RGVwdGhTdGVuY2lsOjpEMjRTOCkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0QyNFg4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRlcHRoU3RlbmNpbDo6RDI0WDgpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RGVwdGhTdGVuY2lsOjpEMTYpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQlkZWZhdWx0OgoJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKCQkJCX0KCQkJfQoJCQllbHNlCgkJCXsKCQkJCXN3aXRjaChjaGVja0Zvcm1hdCkKCQkJCXsKCQkJCWNhc2UgRDNERk1UX0E4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9SNUc2QjU6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UjVHNkI1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfWDFSNUc1QjU6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpYMVI1RzVCNSkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTFSNUc1QjU6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBMVI1RzVCNSkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTRSNEc0QjQ6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBNFI0RzRCNCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfUjNHM0IyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlIzRzNCMikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E4UjNHM0IyOgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6QThSM0czQjIpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1g0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6WDRSNEc0QjQpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1I4RzhCODoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSOEc4QjgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9YOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6Olg4UjhHOEI4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkE4UjhHOEI4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQkvLyBQYWxldHRlZCBmb3JtYXRzCgkJCQljYXNlIEQzREZNVF9QODoJCQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UDgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQThQODoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBOFA4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJLy8gSW50ZWdlciBIRFIgZm9ybWF0cwoJCQkJY2FzZSBEM0RGTVRfRzE2UjE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkcxNlIxNikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOglpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBMkIxMEcxMFIxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJLy8gQ29tcHJlc3NlZCBmb3JtYXRzCgkJCQljYXNlIEQzREZNVF9EWFQxOgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRYVDEpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EWFQyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRYVDIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EWFQzOgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRYVDMpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EWFQ0OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRYVDQpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EWFQ1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRYVDUpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQkvLyBCdW1wIG1hcCBmb3JtYXRzCgkJCQljYXNlIEQzREZNVF9WOFU4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlY4VTgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9MNlY1VTU6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6TDZWNVU1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfWDhMOFY4VTg6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpYOEw4VjhVOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfUThXOFY4VTg6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpROFc4VjhVOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfVjE2VTE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlYxNlUxNikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0EyVzEwVjEwVTEwOglpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBMlcxMFYxMFUxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJLy8gTHVtaW5hbmNlIGZvcm1hdHMKCQkJCWNhc2UgRDNERk1UX0w4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpMOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BNEw0OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkE0TDQpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BOEw4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkE4TDgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQlkZWZhdWx0OgoJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKCQkJCX0KCQkJfQoJCWNhc2UgRDNEUlRZUEVfVk9MVU1FVEVYVFVSRToKCQkJc3dpdGNoKGNoZWNrRm9ybWF0KQoJCQl7CgkJCWNhc2UgRDNERk1UX0E4OgkJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QTgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfUjVHNkI1OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpSNUc2QjUpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9YMVI1RzVCNToJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpYMVI1RzVCNSkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0ExUjVHNUI1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkExUjVHNUI1KQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfQTRSNEc0QjQ6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QTRSNEc0QjQpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9SM0czQjI6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlIzRzNCMikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0E4UjNHM0IyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkE4UjNHM0IyKQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfWDRSNEc0QjQ6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6WDRSNEc0QjQpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9SOEc4Qjg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlI4RzhCOCkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX1g4UjhHOEI4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6Olg4UjhHOEI4KQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfQThSOEc4Qjg6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QThSOEc4QjgpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkvLyBQYWxldHRlZCBmb3JtYXRzCgkJCWNhc2UgRDNERk1UX1A4OgkJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6UDgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfQThQODoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QThQOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkvLyBJbnRlZ2VyIEhEUiBmb3JtYXRzCgkJCWNhc2UgRDNERk1UX0cxNlIxNjoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6RzE2UjE2KQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfQTJCMTBHMTBSMTA6CQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBMkIxMEcxMFIxMCkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJLy8gQ29tcHJlc3NlZCBmb3JtYXRzCgkJCWNhc2UgRDNERk1UX0RYVDE6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkRYVDEpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfRFhUMjoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6RFhUMikJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9EWFQzOgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpEWFQzKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0RYVDQ6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkRYVDQpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfRFhUNToJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6RFhUNSkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkvLyBCdW1wIG1hcCBmb3JtYXRzCgkJCWNhc2UgRDNERk1UX1Y4VTg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlY4VTgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfTDZWNVU1OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpMNlY1VTUpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9YOEw4VjhVODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpYOEw4VjhVOCkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX1E4VzhWOFU4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlE4VzhWOFU4KQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfVjE2VTE2OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpWMTZVMTYpCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQljYXNlIEQzREZNVF9BMlcxMFYxMFUxMDoJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkEyVzEwVjEwVTEwKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkvLyBMdW1pbmFuY2UgZm9ybWF0cwoJCQljYXNlIEQzREZNVF9MODoJCQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6Okw4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCWNhc2UgRDNERk1UX0E0TDQ6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkE0TDQpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJY2FzZSBEM0RGTVRfQThMODoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QThMOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQlkZWZhdWx0OgoJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwoJCQl9CgkJY2FzZSBEM0RSVFlQRV9URVhUVVJFOgoJCQlpZih1c2FnZSAmIEQzRFVTQUdFX1JFTkRFUlRBUkdFVCkKCQkJewoJCQkJc3dpdGNoKGNoZWNrRm9ybWF0KQoJCQkJewoJCQkJY2FzZSBEM0RGTVRfUjhHOEI4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6UjhHOEI4KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9SNUc2QjU6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpSNUc2QjUpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1gxUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpYMVI1RzVCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTFSNUc1QjU6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OkExUjVHNUI1KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BNFI0RzRCNDoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6QTRSNEc0QjQpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1IzRzNCMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OlIzRzNCMikJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQThSM0czQjI6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OkE4UjNHM0IyKQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9YNFI0RzRCNDoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6WDRSNEc0QjQpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E4UjhHOEI4OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBOFI4RzhCOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfWDhSOEc4Qjg6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6Olg4UjhHOEI4KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQkvLyBJbnRlZ2VyIEhEUiBmb3JtYXRzCgkJCQljYXNlIEQzREZNVF9HMTZSMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpHMTZSMTYpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOglpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OkEyQjEwRzEwUjEwKQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWRlZmF1bHQ6CgkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwoJCQkJfQoJCQl9CgkJCWVsc2UgaWYodXNhZ2UgJiBEM0RVU0FHRV9ERVBUSFNURU5DSUwpCgkJCXsKCQkJCXN3aXRjaChjaGVja0Zvcm1hdCkKCQkJCXsKCQkJCWNhc2UgRDNERk1UX0QzMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQzMikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0QyNFM4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6RDI0UzgpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9EMjRYODoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQyNFg4KQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRDE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6RDE2KQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJZGVmYXVsdDoKCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CgkJCQl9CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlzd2l0Y2goY2hlY2tGb3JtYXQpCgkJCQl7CgkJCQljYXNlIEQzREZNVF9BODoJCQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QTgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfUjVHNkI1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlI1RzZCNSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1gxUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6WDFSNUc1QjUpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0ExUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QTFSNUc1QjUpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QTRSNEc0QjQpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1IzRzNCMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSM0czQjIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BOFIzRzNCMjoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkE4UjNHM0IyKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9YNFI0RzRCNDoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6Olg0UjRHNEI0KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9SOEc4Qjg6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UjhHOEI4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfWDhSOEc4Qjg6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpYOFI4RzhCOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQThSOEc4Qjg6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBOFI4RzhCOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJLy8gUGFsZXR0ZWQgZm9ybWF0cwoJCQkJY2FzZSBEM0RGTVRfUDg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlA4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX0E4UDg6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QThQOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKCQkJCWNhc2UgRDNERk1UX0cxNlIxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpHMTZSMTYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMkIxMEcxMFIxMDoJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QTJCMTBHMTBSMTApCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCS8vIENvbXByZXNzZWQgZm9ybWF0cwoJCQkJY2FzZSBEM0RGTVRfRFhUMToJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEWFQxKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRFhUMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEWFQyKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRFhUMzoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEWFQzKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRFhUNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEWFQ0KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfRFhUNToJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEWFQ1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJLy8gQnVtcCBtYXAgZm9ybWF0cwoJCQkJY2FzZSBEM0RGTVRfVjhVODoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpWOFU4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfTDZWNVU1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6Okw2VjVVNSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1g4TDhWOFU4OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6WDhMOFY4VTgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1E4VzhWOFU4OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UThXOFY4VTgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCWNhc2UgRDNERk1UX1YxNlUxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpWMTZVMTYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CgkJCQljYXNlIEQzREZNVF9BMlcxMFYxMFUxMDoJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QTJXMTBWMTBVMTApCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKCQkJCS8vIEx1bWluYW5jZSBmb3JtYXRzCgkJCQljYXNlIEQzREZNVF9MODoJCQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6TDgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQTRMNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBNEw0KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJY2FzZSBEM0RGTVRfQThMODoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBOEw4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOwoJCQkJZGVmYXVsdDoKCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CgkJCQl9CgkJCX0KCQljYXNlIEQzRFJUWVBFX1ZFUlRFWEJVRkZFUjoKCQkJaWYoY2hlY2tGb3JtYXQgPT0gRDNERk1UX1ZFUlRFWERBVEEpCgkJCXsKCQkJCXJldHVybiBEM0RfT0s7CgkJCX0KCQkJZWxzZQoJCQl7CgkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CgkJCX0KCQljYXNlIEQzRFJUWVBFX0lOREVYQlVGRkVSOgoJCQlzd2l0Y2goY2hlY2tGb3JtYXQpCgkJCXsKCQkJY2FzZSBEM0RGTVRfSU5ERVgxNjoKCQkJY2FzZSBEM0RGTVRfSU5ERVgzMjoKCQkJCXJldHVybiBEM0RfT0s7CgkJCWRlZmF1bHQ6CgkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CgkJCX07CgkJZGVmYXVsdDoKCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwoJCX0KCX0KCglsb25nIERpcmVjdDNEODo6Q2hlY2tEZXZpY2VNdWx0aVNhbXBsZVR5cGUodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgRDNERk9STUFUIHN1cmZhY2VGb3JtYXQsIGludCB3aW5kb3dlZCwgRDNETVVMVElTQU1QTEVfVFlQRSBtdWx0aVNhbXBsZVR5cGUpCgl7CgkJVFJBQ0UoIiIpOwoKCQlpZihkZXZpY2VUeXBlICE9IEQzRERFVlRZUEVfSEFMKQoJCXsKCQkJbG9hZFN5c3RlbUQzRDgoKTsKCgkJCWlmKGQzZDgpCgkJCXsKCQkJCXJldHVybiBkM2Q4LT5DaGVja0RldmljZU11bHRpU2FtcGxlVHlwZShhZGFwdGVyLCBkZXZpY2VUeXBlLCBzdXJmYWNlRm9ybWF0LCB3aW5kb3dlZCwgbXVsdGlTYW1wbGVUeXBlKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXJldHVybiBDaGVja0RldmljZU11bHRpU2FtcGxlVHlwZShhZGFwdGVyLCBEM0RERVZUWVBFX0hBTCwgc3VyZmFjZUZvcm1hdCwgd2luZG93ZWQsIG11bHRpU2FtcGxlVHlwZSk7CgkJCX0KCQl9CgoJCWlmKGFkYXB0ZXIgPj0gR2V0QWRhcHRlckNvdW50KCkpCgkJewoJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKCQl9CgoJCWlmKG11bHRpU2FtcGxlVHlwZSA9PSBEM0RNVUxUSVNBTVBMRV9OT05FIHx8CgkJICAgbXVsdGlTYW1wbGVUeXBlID09IEQzRE1VTFRJU0FNUExFXzJfU0FNUExFUyB8fAoJCSAgIG11bHRpU2FtcGxlVHlwZSA9PSBEM0RNVUxUSVNBTVBMRV80X1NBTVBMRVMgfHwKCQkgICBtdWx0aVNhbXBsZVR5cGUgPT0gRDNETVVMVElTQU1QTEVfOF9TQU1QTEVTIHx8CgkJICAgbXVsdGlTYW1wbGVUeXBlID09IEQzRE1VTFRJU0FNUExFXzE2X1NBTVBMRVMpCgkJewoJCQlpZihzdXJmYWNlRm9ybWF0ICE9IEQzREZNVF9VTktOT1dOKQoJCQl7CgkJCQlyZXR1cm4gRDNEX09LOwkKCQkJfQoJCX0KCgkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwoJfQoKCWxvbmcgRGlyZWN0M0Q4OjpDaGVja0RldmljZVR5cGUodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgY2hlY2tUeXBlLCBEM0RGT1JNQVQgZGlzcGxheUZvcm1hdCwgRDNERk9STUFUIGJhY2tCdWZmZXJGb3JtYXQsIGludCB3aW5kb3dlZCkKCXsKCQlUUkFDRSgiIik7CgoJCWlmKGNoZWNrVHlwZSAhPSBEM0RERVZUWVBFX0hBTCkKCQl7CgkJCWxvYWRTeXN0ZW1EM0Q4KCk7CgoJCQlpZihkM2Q4KQoJCQl7CgkJCQlyZXR1cm4gZDNkOC0+Q2hlY2tEZXZpY2VUeXBlKGFkYXB0ZXIsIGNoZWNrVHlwZSwgZGlzcGxheUZvcm1hdCwgYmFja0J1ZmZlckZvcm1hdCwgd2luZG93ZWQpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcmV0dXJuIENoZWNrRGV2aWNlVHlwZShhZGFwdGVyLCBEM0RERVZUWVBFX0hBTCwgZGlzcGxheUZvcm1hdCwgYmFja0J1ZmZlckZvcm1hdCwgd2luZG93ZWQpOwoJCQl9CgkJfQoKCQlyZXR1cm4gRDNEX09LOyAgIC8vIFRPRE8KCX0KCglsb25nIERpcmVjdDNEODo6Q3JlYXRlRGV2aWNlKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEhXTkQgZm9jdXNXaW5kb3csIHVuc2lnbmVkIGxvbmcgYmVoYXZpb3JGbGFncywgRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycywgSURpcmVjdDNERGV2aWNlOCAqKnJldHVybmVkRGV2aWNlSW50ZXJmYWNlKQoJewoJCVRSQUNFKCIiKTsKCgkJaWYoZGV2aWNlVHlwZSAhPSBEM0RERVZUWVBFX0hBTCkKCQl7CgkJCWxvYWRTeXN0ZW1EM0Q4KCk7CgoJCQlpZihkM2Q4KQoJCQl7CgkJCQlyZXR1cm4gZDNkOC0+Q3JlYXRlRGV2aWNlKGFkYXB0ZXIsIGRldmljZVR5cGUsIGZvY3VzV2luZG93LCBiZWhhdmlvckZsYWdzLCBwcmVzZW50UGFyYW1ldGVycywgcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UpOwoJCQl9CgkJCWVsc2UKCQkJewoJCQkJcmV0dXJuIENyZWF0ZURldmljZShhZGFwdGVyLCBEM0RERVZUWVBFX0hBTCwgZm9jdXNXaW5kb3csIGJlaGF2aW9yRmxhZ3MsIHByZXNlbnRQYXJhbWV0ZXJzLCByZXR1cm5lZERldmljZUludGVyZmFjZSk7CgkJCX0KCQl9CgoJCWlmKCFmb2N1c1dpbmRvdyB8fCAhcHJlc2VudFBhcmFtZXRlcnMgfHwgIXJldHVybmVkRGV2aWNlSW50ZXJmYWNlKQoJCXsKCQkJKnJldHVybmVkRGV2aWNlSW50ZXJmYWNlID0gTlVMTDsKCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CgkJfQoKCQlpZighc3c6OkNQVUlEOjpzdXBwb3J0c1NTRSgpKQoJCXsKCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwoJCX0KCgkJKnJldHVybmVkRGV2aWNlSW50ZXJmYWNlID0gbmV3IERpcmVjdDNERGV2aWNlOChpbnN0YW5jZSwgdGhpcywgYWRhcHRlciwgZGV2aWNlVHlwZSwgZm9jdXNXaW5kb3csIGJlaGF2aW9yRmxhZ3MsIHByZXNlbnRQYXJhbWV0ZXJzKTsKCgkJaWYoKnJldHVybmVkRGV2aWNlSW50ZXJmYWNlKQoJCXsKCQkJKCpyZXR1cm5lZERldmljZUludGVyZmFjZSktPkFkZFJlZigpOwoJCX0KCgkJcmV0dXJuIEQzRF9PSzsKCX0KCglsb25nIERpcmVjdDNEODo6RW51bUFkYXB0ZXJNb2Rlcyh1bnNpZ25lZCBpbnQgYWRhcHRlciwgdW5zaWduZWQgaW50IGluZGV4LCBEM0RESVNQTEFZTU9ERSAqbW9kZSkKCXsKCQlUUkFDRSgiIik7CgoJCWlmKGFkYXB0ZXIgIT0gRDNEQURBUFRFUl9ERUZBVUxUIHx8ICFtb2RlKQoJCXsKCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CgkJfQoKCQlmb3IoaW50IGkgPSAwOyBpIDwgbnVtRGlzcGxheU1vZGVzOyBpKyspCgkJewoJCQlpZihpbmRleC0tID09IDApCgkJCXsKCQkJCW1vZGUtPldpZHRoID0gZGlzcGxheU1vZGVbaV0uZG1QZWxzV2lkdGg7CgkJCQltb2RlLT5IZWlnaHQgPSBkaXNwbGF5TW9kZVtpXS5kbVBlbHNIZWlnaHQ7CgkJCQltb2RlLT5SZWZyZXNoUmF0ZSA9IGRpc3BsYXlNb2RlW2ldLmRtRGlzcGxheUZyZXF1ZW5jeTsKCgkJCQlkaXNwbGF5TW9kZVtpXS5kbUJpdHNQZXJQZWwgPSAzMjsgICAvLyBGSVhNRQoKCQkJCXN3aXRjaChkaXNwbGF5TW9kZVtpXS5kbUJpdHNQZXJQZWwpCgkJCQl7CgkJCQljYXNlIDQ6CgkJCQkJbW9kZS0+Rm9ybWF0ID0gRDNERk1UX0E0TDQ7CgkJCQkJYnJlYWs7CgkJCQljYXNlIDg6CgkJCQkJbW9kZS0+Rm9ybWF0ID0gRDNERk1UX1A4OwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAxNjoKCQkJCQltb2RlLT5Gb3JtYXQgPSBEM0RGTVRfUjVHNkI1OwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAyNDoKCQkJCQltb2RlLT5Gb3JtYXQgPSBEM0RGTVRfUjhHOEI4OwoJCQkJCWJyZWFrOwoJCQkJY2FzZSAzMjoKCQkJCQltb2RlLT5Gb3JtYXQgPSBEM0RGTVRfWDhSOEc4Qjg7CgkJCQkJYnJlYWs7CgkJCQlkZWZhdWx0OgoJCQkJCUFTU0VSVChmYWxzZSk7CgkJCQl9CgoJCQkJcmV0dXJuIEQzRF9PSzsKCQkJfQoJCX0KCgkJcmV0dXJuIElOVkFMSURDQUxMKCk7Cgl9CgoJdW5zaWduZWQgaW50IERpcmVjdDNEODo6R2V0QWRhcHRlckNvdW50KCkKCXsKCQlUUkFDRSgiIik7CgoJCXJldHVybiAxOyAgIC8vIFN3aWZ0U2hhZGVyIGRvZXMgbm90IHN1cHBvcnQgbXVsdGlwbGUgZGlzcGxheSBhZGFwdGVycwoJfQoKCWxvbmcgRGlyZWN0M0Q4OjpHZXRBZGFwdGVyRGlzcGxheU1vZGUodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERJU1BMQVlNT0RFICptb2RlKQoJewoJCVRSQUNFKCIiKTsKCgkJaWYoYWRhcHRlciAhPSBEM0RBREFQVEVSX0RFRkFVTFQgfHwgIW1vZGUpCgkJewoJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKCQl9CgoJCUhEQyBkZXZpY2VDb250ZXh0ID0gR2V0REMoMCk7CgkJCQoJCW1vZGUtPldpZHRoID0gOjpHZXREZXZpY2VDYXBzKGRldmljZUNvbnRleHQsIEhPUlpSRVMpOwoJCW1vZGUtPkhlaWdodCA9IDo6R2V0RGV2aWNlQ2FwcyhkZXZpY2VDb250ZXh0LCBWRVJUUkVTKTsKCQltb2RlLT5SZWZyZXNoUmF0ZSA9IDo6R2V0RGV2aWNlQ2FwcyhkZXZpY2VDb250ZXh0LCBWUkVGUkVTSCk7CgkJdW5zaWduZWQgaW50IGJwcCA9IDo6R2V0RGV2aWNlQ2FwcyhkZXZpY2VDb250ZXh0LCBCSVRTUElYRUwpOwoKCQlSZWxlYXNlREMoMCwgZGV2aWNlQ29udGV4dCk7CgoJCWJwcCA9IDMyOyAgIC8vIEZJWE1FCgoJCXN3aXRjaChicHApCgkJewoJCWNhc2UgMzI6IG1vZGUtPkZvcm1hdCA9IEQzREZNVF9YOFI4RzhCODsgYnJlYWs7CgkJY2FzZSAyNDogbW9kZS0+Rm9ybWF0ID0gRDNERk1UX1I4RzhCODsgYnJlYWs7CgkJY2FzZSAxNjogbW9kZS0+Rm9ybWF0ID0gRDNERk1UX1I1RzZCNTsgYnJlYWs7CgkJZGVmYXVsdDoKCQkJQVNTRVJUKGZhbHNlKTsgICAvLyBVbmV4cGVjdGVkIGRpc3BsYXkgbW9kZSBjb2xvciBkZXB0aAoJCX0KCgkJcmV0dXJuIEQzRF9PSzsKCX0KCglsb25nIERpcmVjdDNEODo6R2V0QWRhcHRlcklkZW50aWZpZXIodW5zaWduZWQgaW50IGFkYXB0ZXIsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIEQzREFEQVBURVJfSURFTlRJRklFUjggKmlkZW50aWZpZXIpCgl7CgkJVFJBQ0UoIiIpOwoKCQlpZighaWRlbnRpZmllcikKCQl7CgkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwoJCX0KCQoJCXVuc2lnbmVkIHNob3J0IHByb2R1Y3QgPSAnc3cnOwoJCXVuc2lnbmVkIHNob3J0IHZlcnNpb24gPSAzOwoJCXVuc2lnbmVkIHNob3J0IHN1YlZlcnNpb24gPSAwOwoJCXVuc2lnbmVkIHNob3J0IHJldmlzaW9uID0gQlVJTERfUkVWSVNJT047CgkJR1VJRCBndWlkID0gezB4MDAwMDAwMDAsIDB4MDAwMCwgMHgwMDAwLCB7MHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMH19OwoKCQlpZGVudGlmaWVyLT5Ecml2ZXJWZXJzaW9uLkhpZ2hQYXJ0ID0gcHJvZHVjdCA8PCAxNiB8IHZlcnNpb247CgkJaWRlbnRpZmllci0+RHJpdmVyVmVyc2lvbi5Mb3dQYXJ0ID0gc3ViVmVyc2lvbiA8PCAxNiB8IHJldmlzaW9uOwoJCXN0cmNweShpZGVudGlmaWVyLT5Ecml2ZXIsICJTd2lmdFNoYWRlciIpOwoJCXN0cmNweShpZGVudGlmaWVyLT5EZXNjcmlwdGlvbiwgIkdvb2dsZSBTd2lmdFNoYWRlciAzRCBSZW5kZXJlciIpOwoJCWlkZW50aWZpZXItPlZlbmRvcklkID0gMDsKCQlpZGVudGlmaWVyLT5EZXZpY2VJZCA9IDA7CgkJaWRlbnRpZmllci0+U3ViU3lzSWQgPSAwOwoJCWlkZW50aWZpZXItPlJldmlzaW9uID0gMDsKCQlpZGVudGlmaWVyLT5EZXZpY2VJZGVudGlmaWVyID0gZ3VpZDsKCQlpZGVudGlmaWVyLT5XSFFMTGV2ZWwgPSAwOwoKCQlyZXR1cm4gRDNEX09LOwoJfQoKCXVuc2lnbmVkIGludCBEaXJlY3QzRDg6OkdldEFkYXB0ZXJNb2RlQ291bnQodW5zaWduZWQgaW50IGFkYXB0ZXIpCgl7CgkJVFJBQ0UoIiIpOwoKCQlpZihhZGFwdGVyICE9IEQzREFEQVBURVJfREVGQVVMVCkKCQl7CgkJCXJldHVybiAwOwoJCX0KCgkJcmV0dXJuIG51bURpc3BsYXlNb2RlczsKCX0KCglITU9OSVRPUiBEaXJlY3QzRDg6OkdldEFkYXB0ZXJNb25pdG9yKHVuc2lnbmVkIGludCBhZGFwdGVyKQoJewoJCVRSQUNFKCIiKTsKCgkJUE9JTlQgcG9pbnQgPSB7MCwgMH07CgoJCXJldHVybiBNb25pdG9yRnJvbVBvaW50KHBvaW50LCBNT05JVE9SX0RFRkFVTFRUT1BSSU1BUlkpOyAgIC8vIEZJWE1FOiBJZ25vcmVzIGFkYXB0ZXIgcGFyYW1ldGVyCgl9CgoJbG9uZyBEaXJlY3QzRDg6OkdldERldmljZUNhcHModW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgRDNEQ0FQUzggKmNhcGFiaWxpdGllcykKCXsKCQlUUkFDRSgiIik7CgoJCWlmKGRldmljZVR5cGUgIT0gRDNEREVWVFlQRV9IQUwpCgkJewoJCQlsb2FkU3lzdGVtRDNEOCgpOwoKCQkJaWYoZDNkOCkKCQkJewoJCQkJcmV0dXJuIGQzZDgtPkdldERldmljZUNhcHMoYWRhcHRlciwgZGV2aWNlVHlwZSwgY2FwYWJpbGl0aWVzKTsKCQkJfQoJCQllbHNlCgkJCXsKCQkJCXJldHVybiBHZXREZXZpY2VDYXBzKGFkYXB0ZXIsIEQzRERFVlRZUEVfSEFMLCBjYXBhYmlsaXRpZXMpOwoJCQl9CgkJfQoKCQlpZighY2FwYWJpbGl0aWVzKQoJCXsKCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CgkJfQoKCQlEM0RDQVBTOCBjYXBzOwoJCVplcm9NZW1vcnkoJmNhcHMsIHNpemVvZihEM0RDQVBTOCkpOwoKCQkvLyBEZXZpY2UgaW5mbwoJCWNhcHMuRGV2aWNlVHlwZSA9IEQzRERFVlRZUEVfSEFMOwoJCWNhcHMuQWRhcHRlck9yZGluYWwgPSBEM0RBREFQVEVSX0RFRkFVTFQ7CgoJCS8vIENhcHMgZnJvbSBEWDcKCQljYXBzLkNhcHMgPQkwOwkvLwlEM0RDQVBTX1JFQURfU0NBTkxJTkUKCgkJY2Fwcy5DYXBzMiA9CS8vCUQzRENBUFMyX0NBTkNBTElCUkFURUdBTU1BIHwJLy8gVGhlIHN5c3RlbSBoYXMgYSBjYWxpYnJhdG9yIGluc3RhbGxlZCB0aGF0IGNhbiBhdXRvbWF0aWNhbGx5IGFkanVzdCB0aGUgZ2FtbWEgcmFtcCBzbyB0aGF0IHRoZSByZXN1bHQgaXMgaWRlbnRpY2FsIG9uIGFsbCBzeXN0ZW1zIHRoYXQgaGF2ZSBhIGNhbGlicmF0b3IuIFRvIGludm9rZSB0aGUgY2FsaWJyYXRvciB3aGVuIHNldHRpbmcgbmV3IGdhbW1hIGxldmVscywgdXNlIHRoZSBEM0RTR1JfQ0FMSUJSQVRFIGZsYWcgd2hlbiBjYWxsaW5nIElEaXJlY3QzRERldmljZTg6OlNldEdhbW1hUmFtcC4gQ2FsaWJyYXRpbmcgZ2FtbWEgcmFtcHMgaW5jdXJzIHNvbWUgcHJvY2Vzc2luZyBvdmVyaGVhZCBhbmQgc2hvdWxkIG5vdCBiZSB1c2VkIGZyZXF1ZW50bHkuICAKCQkJCQkJCUQzRENBUFMyX0NBTlJFTkRFUldJTkRPV0VEIHwJLy8gVGhlIGRyaXZlciBpcyBjYXBhYmxlIG9mIHJlbmRlcmluZyBpbiB3aW5kb3dlZCBtb2RlLiAKCQkJCQkJCUQzRENBUFMyX0NBTk1BTkFHRVJFU09VUkNFIHwJLy8gVGhlIGRyaXZlciBpcyBjYXBhYmxlIG9mIG1hbmFnaW5nIHJlc291cmNlcy4gT24gc3VjaCBkcml2ZXJzLCBEM0RQT09MX01BTkFHRUQgcmVzb3VyY2VzIHdpbGwgYmUgbWFuYWdlZCBieSB0aGUgZHJpdmVyLiBUbyBoYXZlIE1pY3Jvc29mdK4gRGlyZWN0M0SuIG92ZXJyaWRlIHRoZSBkcml2ZXIgc28gdGhhdCBEaXJlY3QzRCBtYW5hZ2VzIHJlc291cmNlcywgdXNlIHRoZSBEM0RDUkVBVEVfRElTQUJMRV9EUklWRVJfTUFOQUdFTUVOVCBmbGFnIHdoZW4gY2FsbGluZyBJRGlyZWN0M0Q4OjpDcmVhdGVEZXZpY2UuIAoJCQkJCQkJRDNEQ0FQUzJfRFlOQU1JQ1RFWFRVUkVTIHwJCS8vIFRoZSBkcml2ZXIgc3VwcG9ydHMgZHluYW1pYyB0ZXh0dXJlcy4gCgkJCQkJCQlEM0RDQVBTMl9GVUxMU0NSRUVOR0FNTUE7CQkvLyBUaGUgZHJpdmVyIHN1cHBvcnRzIGR5bmFtaWMgZ2FtbWEgcmFtcCBhZGp1c3RtZW50IGluIGZ1bGwtc2NyZWVuIG1vZGUuCgkJCQkJCS8vCUQzRENBUFMyX05PMkREVVJJTkczRFNDRU5FOwkJLy8gV2hlbiB0aGUgRDNEQ0FQUzJfTk8yRERVUklORzNEU0NFTkUgY2FwYWJpbGl0eSBpcyBzZXQgYnkgdGhlIGRyaXZlciwgaXQgbWVhbnMgdGhhdCAyLUQgb3BlcmF0aW9ucyBjYW5ub3QgYmUgcGVyZm9ybWVkIGJldHdlZW4gY2FsbHMgdG8gSURpcmVjdDNERGV2aWNlODo6QmVnaW5TY2VuZSBhbmQgSURpcmVjdDNERGV2aWNlODo6RW5kU2NlbmUuIAoKCQljYXBzLkNhcHMzID0gRDNEQ0FQUzNfQUxQSEFfRlVMTFNDUkVFTl9GTElQX09SX0RJU0NBUkQ7ICAgLy9UaGUgZGV2aWNlIHdpbGwgd29yayBhcyBleHBlY3RlZCB3aXRoIHRoZSBEM0RSU19BTFBIQUJMRU5ERU5BQkxFIHJlbmRlciBzdGF0ZSB3aGVuIGEgZnVsbC1zY3JlZW4gYXBwbGljYXRpb24gdXNlcyBEM0RTV0FQRUZGRUNUX0ZMSVAgb3IgRDNEUlNfU1dBUEVGRkVDVF9ESVNDQVJELiBEM0RSU19BTFBIQUJMRU5ERU5BQkxFIHdvcmtzIGFzIGV4cGVjdGVkIHdoZW4gdXNpbmcgRDNEU1dBUEVGRkVDVF9DT1BZIGFuZCBEM0RTV0FQRUZGRUNUX0NPUFlTWU5DCgoJCWNhcHMuUHJlc2VudGF0aW9uSW50ZXJ2YWxzID0JCUQzRFBSRVNFTlRfSU5URVJWQUxfSU1NRURJQVRFIHwKCQkJCQkJCQkJCQlEM0RQUkVTRU5UX0lOVEVSVkFMX09ORTsKCQkJCQkJCQkJCS8vCUQzRFBSRVNFTlRfSU5URVJWQUxfVFdPOwoJCQkJCQkJCQkJLy8JRDNEUFJFU0VOVF9JTlRFUlZBTF9USFJFRTsKCQkJCQkJCQkJCS8vCUQzRFBSRVNFTlRfSU5URVJWQUxfRk9VUjsKCgkJLy8gQ3Vyc29yIGNhcHMKCQljYXBzLkN1cnNvckNhcHMgPQlEM0RDVVJTT1JDQVBTX0NPTE9SCXwJLy8gQSBmdWxsLWNvbG9yIGN1cnNvciBpcyBzdXBwb3J0ZWQgaW4gaGFyZHdhcmUuIFNwZWNpZmljYWxseSwgdGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBkcml2ZXIgc3VwcG9ydHMgYXQgbGVhc3QgYSBoYXJkd2FyZSBjb2xvciBjdXJzb3IgaW4gaGlnaC1yZXNvbHV0aW9uIG1vZGVzICh3aXRoIHNjYW4gbGluZXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDQwMCkuIAoJCQkJCQkJRDNEQ1VSU09SQ0FQU19MT1dSRVM7CS8vIEEgZnVsbC1jb2xvciBjdXJzb3IgaXMgc3VwcG9ydGVkIGluIGhhcmR3YXJlLiBTcGVjaWZpY2FsbHksIHRoaXMgZmxhZyBpbmRpY2F0ZXMgdGhhdCB0aGUgZHJpdmVyIHN1cHBvcnRzIGEgaGFyZHdhcmUgY29sb3IgY3Vyc29yIGluIGJvdGggaGlnaC1yZXNvbHV0aW9uIGFuZCBsb3ctcmVzb2x1dGlvbiBtb2RlcyAod2l0aCBzY2FuIGxpbmVzIGxlc3MgdGhhbiA0MDApLiAKCgkJLy8gM0QgRGV2aWNlIGNhcHMKCQljYXBzLkRldkNhcHMgPQkJRDNEREVWQ0FQU19DQU5CTFRTWVNUT05PTkxPQ0FMIHwJCS8vIERldmljZSBzdXBwb3J0cyBibGl0cyBmcm9tIHN5c3RlbS1tZW1vcnkgdGV4dHVyZXMgdG8gbm9ubG9jYWwgdmlkZW8tbWVtb3J5IHRleHR1cmVzLiAKCQkJCQkJCUQzRERFVkNBUFNfQ0FOUkVOREVSQUZURVJGTElQIHwJCQkvLyBEZXZpY2UgY2FuIHF1ZXVlIHJlbmRlcmluZyBjb21tYW5kcyBhZnRlciBhIHBhZ2UgZmxpcC4gQXBwbGljYXRpb25zIGRvIG5vdCBjaGFuZ2UgdGhlaXIgYmVoYXZpb3IgaWYgdGhpcyBmbGFnIGlzIHNldDsgdGhpcyBjYXBhYmlsaXR5IG1lYW5zIHRoYXQgdGhlIGRldmljZSBpcyByZWxhdGl2ZWx5IGZhc3QuIAoJCQkJCQkJRDNEREVWQ0FQU19EUkFXUFJJTUlUSVZFUzIgfAkJCS8vIERldmljZSBjYW4gc3VwcG9ydCBEcmF3UHJpbWl0aXZlczIuCgkJCQkJCQlEM0RERVZDQVBTX0RSQVdQUklNSVRJVkVTMkVYIHwJCQkvLyBEZXZpY2UgY2FuIHN1cHBvcnQgZXh0ZW5kZWQgRHJhd1ByaW1pdGl2ZXMyOyB0aGF0IGlzLCB0aGlzIGlzIGEgRGlyZWN0WCA3LjAtY29tcGxpYW50IGRyaXZlci4KCQkJCQkJCUQzRERFVkNBUFNfRFJBV1BSSU1UTFZFUlRFWCB8CQkJLy8gRGV2aWNlIGV4cG9ydHMgYW4gSURpcmVjdDNERGV2aWNlODo6RHJhd1ByaW1pdGl2ZS1hd2FyZSBoYXJkd2FyZSBhYnN0cmFjdGlvbiBsYXllciAoSEFMKS4gCgkJCQkJCS8vCUQzRERFVkNBUFNfRVhFQ1VURVNZU1RFTU1FTU9SWSB8CQkvLyBEZXZpY2UgY2FuIHVzZSBleGVjdXRlIGJ1ZmZlcnMgZnJvbSBzeXN0ZW0gbWVtb3J5LgoJCQkJCQkvLwlEM0RERVZDQVBTX0VYRUNVVEVWSURFT01FTU9SWSB8CQkJLy8gRGV2aWNlIGNhbiB1c2UgZXhlY3V0ZSBidWZmZXJzIGZyb20gdmlkZW8gbWVtb3J5LiAKCQkJCQkJCUQzRERFVkNBUFNfSFdSQVNURVJJWkFUSU9OIHwJCQkvLyBEZXZpY2UgaGFzIGhhcmR3YXJlIGFjY2VsZXJhdGlvbiBmb3Igc2NlbmUgcmFzdGVyaXphdGlvbi4gCgkJCQkJCQlEM0RERVZDQVBTX0hXVFJBTlNGT1JNQU5ETElHSFQgfAkJLy8gRGV2aWNlIGNhbiBzdXBwb3J0IHRyYW5zZm9ybWF0aW9uIGFuZCBsaWdodGluZyBpbiBoYXJkd2FyZS4gCgkJCQkJCS8vCUQzRERFVkNBUFNfTlBBVENIRVMgfAkJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIE4gcGF0Y2hlcy4gCgkJCQkJCQlEM0RERVZDQVBTX1BVUkVERVZJQ0UgfAkJCQkJLy8gRGV2aWNlIGNhbiBzdXBwb3J0IHJhc3Rlcml6YXRpb24sIHRyYW5zZm9ybSwgbGlnaHRpbmcsIGFuZCBzaGFkaW5nIGluIGhhcmR3YXJlLiAKCQkJCQkJLy8JRDNEREVWQ0FQU19RVUlOVElDUlRQQVRDSEVTIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcXVpbnRpYyBC6XppZXIgY3VydmVzIGFuZCBCLXNwbGluZXMuIAoJCQkJCQkvLwlEM0RERVZDQVBTX1JUUEFUQ0hFUyB8CQkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcmVjdGFuZ3VsYXIgYW5kIHRyaWFuZ3VsYXIgcGF0Y2hlcy4gCgkJCQkJCQlEM0RERVZDQVBTX1JUUEFUQ0hIQU5ETEVaRVJPIHwJCQkvLyBXaGVuIHRoaXMgZGV2aWNlIGNhcGFiaWxpdHkgaXMgc2V0LCB0aGUgaGFyZHdhcmUgYXJjaGl0ZWN0dXJlIGRvZXMgbm90IHJlcXVpcmUgY2FjaGluZyBvZiBhbnkgaW5mb3JtYXRpb24gYW5kIHVuY2FjaGVkIHBhdGNoZXMgKGhhbmRsZSB6ZXJvKSB3aWxsIGJlIGRyYXduIGFzIGVmZmljaWVudGx5IGFzIGNhY2hlZCBvbmVzLiBOb3RlIHRoYXQgc2V0dGluZyBEM0RERVZDQVBTX1JUUEFUQ0hIQU5ETEVaRVJPIGRvZXMgbm90IG1lYW4gdGhhdCBhIHBhdGNoIHdpdGggaGFuZGxlIHplcm8gY2FuIGJlIGRyYXduLiBBIGhhbmRsZS16ZXJvIHBhdGNoIGNhbiBhbHdheXMgYmUgZHJhd24gd2hldGhlciB0aGlzIGNhcCBpcyBzZXQgb3Igbm90LiAKCQkJCQkJLy8JRDNEREVWQ0FQU19TRVBBUkFURVRFWFRVUkVNRU1PUklFUyB8CS8vIERldmljZSBpcyB0ZXh0dXJpbmcgZnJvbSBzZXBhcmF0ZSBtZW1vcnkgcG9vbHMuIAoJCQkJCQkJRDNEREVWQ0FQU19URVhUVVJFTk9OTE9DQUxWSURNRU0gfAkJLy8gRGV2aWNlIGNhbiByZXRyaWV2ZSB0ZXh0dXJlcyBmcm9tIG5vbi1sb2NhbCB2aWRlbyBtZW1vcnkuIAoJCQkJCQkJRDNEREVWQ0FQU19URVhUVVJFU1lTVEVNTUVNT1JZIHwJCS8vIERldmljZSBjYW4gcmV0cmlldmUgdGV4dHVyZXMgZnJvbSBzeXN0ZW0gbWVtb3J5LiAKCQkJCQkJCUQzRERFVkNBUFNfVEVYVFVSRVZJREVPTUVNT1JZIHwJCQkvLyBEZXZpY2UgY2FuIHJldHJpZXZlIHRleHR1cmVzIGZyb20gZGV2aWNlIG1lbW9yeS4gCgkJCQkJCQlEM0RERVZDQVBTX1RMVkVSVEVYU1lTVEVNTUVNT1JZIHwJCS8vIERldmljZSBjYW4gdXNlIGJ1ZmZlcnMgZnJvbSBzeXN0ZW0gbWVtb3J5IGZvciB0cmFuc2Zvcm1lZCBhbmQgbGl0IHZlcnRpY2VzLiAKCQkJCQkJCUQzRERFVkNBUFNfVExWRVJURVhWSURFT01FTU9SWTsJCQkvLyBEZXZpY2UgY2FuIHVzZSBidWZmZXJzIGZyb20gdmlkZW8gbWVtb3J5IGZvciB0cmFuc2Zvcm1lZCBhbmQgbGl0IHZlcnRpY2VzLgoKCQljYXBzLlByaW1pdGl2ZU1pc2NDYXBzID0gCQlEM0RQTUlTQ0NBUFNfQkxFTkRPUCB8IAkJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIHRoZSBhbHBoYS1ibGVuZGluZyBvcGVyYXRpb25zIGRlZmluZWQgaW4gdGhlIEQzREJMRU5ET1AgZW51bWVyYXRlZCB0eXBlLiAKCQkJCQkJCQkJCUQzRFBNSVNDQ0FQU19DTElQUExBTkVTQ0FMRURQT0lOVFMgfAkvLyBEZXZpY2UgY29ycmVjdGx5IGNsaXBzIHNjYWxlZCBwb2ludHMgb2Ygc2l6ZSBncmVhdGVyIHRoYW4gMS4wIHRvIHVzZXItZGVmaW5lZCBjbGlwcGluZyBwbGFuZXMuIAoJCQkJCQkJCQkJRDNEUE1JU0NDQVBTX0NMSVBUTFZFUlRTIHwJCQkJLy8gRGV2aWNlIGNsaXBzIHBvc3QtdHJhbnNmb3JtZWQgdmVydGV4IHByaW1pdGl2ZXMuIAoJCQkJCQkJCQkJRDNEUE1JU0NDQVBTX0NPTE9SV1JJVEVFTkFCTEUgfAkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItY2hhbm5lbCB3cml0ZXMgZm9yIHRoZSByZW5kZXIgdGFyZ2V0IGNvbG9yIGJ1ZmZlciB0aHJvdWdoIHRoZSBEM0RSU19DT0xPUldSSVRFRU5BQkxFIHN0YXRlLiAKCQkJCQkJCQkJCUQzRFBNSVNDQ0FQU19DVUxMQ0NXIHwJCQkJCS8vIFRoZSBkcml2ZXIgc3VwcG9ydHMgY291bnRlcmNsb2Nrd2lzZSBjdWxsaW5nIHRocm91Z2ggdGhlIEQzRFJTX0NVTExNT0RFIHN0YXRlLiAoVGhpcyBhcHBsaWVzIG9ubHkgdG8gdHJpYW5nbGUgcHJpbWl0aXZlcy4pIFRoaXMgZmxhZyBjb3JyZXNwb25kcyB0byB0aGUgRDNEQ1VMTF9DQ1cgbWVtYmVyIG9mIHRoZSBEM0RDVUxMIGVudW1lcmF0ZWQgdHlwZS4gCgkJCQkJCQkJCQlEM0RQTUlTQ0NBUFNfQ1VMTENXIHwJCQkJCS8vIFRoZSBkcml2ZXIgc3VwcG9ydHMgY2xvY2t3aXNlIHRyaWFuZ2xlIGN1bGxpbmcgdGhyb3VnaCB0aGUgRDNEUlNfQ1VMTE1PREUgc3RhdGUuIChUaGlzIGFwcGxpZXMgb25seSB0byB0cmlhbmdsZSBwcmltaXRpdmVzLikgVGhpcyBmbGFnIGNvcnJlc3BvbmRzIHRvIHRoZSBEM0RDVUxMX0NXIG1lbWJlciBvZiB0aGUgRDNEQ1VMTCBlbnVtZXJhdGVkIHR5cGUuIAoJCQkJCQkJCQkJRDNEUE1JU0NDQVBTX0NVTExOT05FIHwJCQkJCS8vIFRoZSBkcml2ZXIgZG9lcyBub3QgcGVyZm9ybSB0cmlhbmdsZSBjdWxsaW5nLiBUaGlzIGNvcnJlc3BvbmRzIHRvIHRoZSBEM0RDVUxMX05PTkUgbWVtYmVyIG9mIHRoZSBEM0RDVUxMIGVudW1lcmF0ZWQgdHlwZS4gCgkJCQkJCQkJCS8vCUQzRFBNSVNDQ0FQU19MSU5FUEFUVEVSTlJFUAl8CQkJLy8gVGhlIGRyaXZlciBjYW4gaGFuZGxlIHZhbHVlcyBvdGhlciB0aGFuIDEgaW4gdGhlIHdSZXBlYXRGYWN0b3IgbWVtYmVyIG9mIHRoZSBEM0RMSU5FUEFUVEVSTiBzdHJ1Y3R1cmUuIChUaGlzIGFwcGxpZXMgb25seSB0byBsaW5lLWRyYXdpbmcgcHJpbWl0aXZlcy4pIAoJCQkJCQkJCQkJRDNEUE1JU0NDQVBTX01BU0taIHwJCQkJCS8vIERldmljZSBjYW4gZW5hYmxlIGFuZCBkaXNhYmxlIG1vZGlmaWNhdGlvbiBvZiB0aGUgZGVwdGggYnVmZmVyIG9uIHBpeGVsIG9wZXJhdGlvbnMuIAoJCQkJCQkJCQkJRDNEUE1JU0NDQVBTX1RTU0FSR1RFTVA7CQkJCS8vIERldmljZSBzdXBwb3J0cyBEM0RUQV9URU1QIGZvciB0ZW1wb3JhcnkgcmVnaXN0ZXIuCgoJCWNhcHMuUmFzdGVyQ2FwcyA9CQlEM0RQUkFTVEVSQ0FQU19BTklTT1RST1BZIHwJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIGFuaXNvdHJvcGljIGZpbHRlcmluZy4gCgkJCQkJCQkvLwlEM0RQUkFTVEVSQ0FQU19BTlRJQUxJQVNFREdFUyB8CQkJLy8gRGV2aWNlIGNhbiBhbnRpYWxpYXMgbGluZXMgZm9ybWluZyB0aGUgY29udmV4IG91dGxpbmUgb2Ygb2JqZWN0cy4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBEM0RSU19FREdFQU5USUFMSUFTLgoJCQkJCQkJCUQzRFBSQVNURVJDQVBTX0NPTE9SUEVSU1BFQ1RJVkUgfAkJLy8gRGV2aWNlIGl0ZXJhdGVzIGNvbG9ycyBwZXJzcGVjdGl2ZSBjb3JyZWN0bHkuIAoJCQkJCQkJLy8JRDNEUFJBU1RFUkNBUFNfRElUSEVSIHwJCQkJCS8vIERldmljZSBjYW4gZGl0aGVyIHRvIGltcHJvdmUgY29sb3IgcmVzb2x1dGlvbi4gCgkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfWkJJQVMgfAkJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIGxlZ2FjeSBkZXB0aCBiaWFzLiBGb3IgdHJ1ZSBkZXB0aCBiaWFzLCBzZWUgRDNEUFJBU1RFUkNBUFNfU0xPUEVTQ0FMRURFUFRIQklBUy4KCQkJCQkJCQlEM0RQUkFTVEVSQ0FQU19GT0dSQU5HRSB8CQkJCS8vIERldmljZSBzdXBwb3J0cyByYW5nZS1iYXNlZCBmb2cuIEluIHJhbmdlLWJhc2VkIGZvZywgdGhlIGRpc3RhbmNlIG9mIGFuIG9iamVjdCBmcm9tIHRoZSB2aWV3ZXIgaXMgdXNlZCB0byBjb21wdXRlIGZvZyBlZmZlY3RzLCBub3QgdGhlIGRlcHRoIG9mIHRoZSBvYmplY3QgKHRoYXQgaXMsIHRoZSB6LWNvb3JkaW5hdGUpIGluIHRoZSBzY2VuZS4gCgkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfRk9HVEFCTEUgfAkJCQkvLyBEZXZpY2UgY2FsY3VsYXRlcyB0aGUgZm9nIHZhbHVlIGJ5IHJlZmVycmluZyB0byBhIGxvb2t1cCB0YWJsZSBjb250YWluaW5nIGZvZyB2YWx1ZXMgdGhhdCBhcmUgaW5kZXhlZCB0byB0aGUgZGVwdGggb2YgYSBnaXZlbiBwaXhlbC4gCgkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfRk9HVkVSVEVYIHwJCQkJLy8gRGV2aWNlIGNhbGN1bGF0ZXMgdGhlIGZvZyB2YWx1ZSBkdXJpbmcgdGhlIGxpZ2h0aW5nIG9wZXJhdGlvbiBhbmQgaW50ZXJwb2xhdGVzIHRoZSBmb2cgdmFsdWUgZHVyaW5nIHJhc3Rlcml6YXRpb24uIAoJCQkJCQkJCUQzRFBSQVNURVJDQVBTX01JUE1BUExPREJJQVMgfAkJCS8vIERldmljZSBzdXBwb3J0cyBsZXZlbCBvZiBkZXRhaWwgKExPRCkgYmlhcyBhZGp1c3RtZW50cy4gVGhlc2UgYmlhcyBhZGp1c3RtZW50cyBlbmFibGUgYW4gYXBwbGljYXRpb24gdG8gbWFrZSBhIG1pcG1hcCBhcHBlYXIgY3Jpc3BlciBvciBsZXNzIHNoYXJwIHRoYW4gaXQgbm9ybWFsbHkgd291bGQuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IExPRCBiaWFzIGluIG1pcG1hcHMsIHNlZSBEM0RTQU1QX01JUE1BUExPREJJQVMuCgkJCQkJCQkvLwlEM0RQUkFTVEVSQ0FQU19QQVQgfAkJCQkJLy8gVGhlIGRyaXZlciBjYW4gcGVyZm9ybSBwYXR0ZXJuZWQgZHJhd2luZyBsaW5lcyBvciBmaWxscyB3aXRoIEQzRFJTX0xJTkVQQVRURVJOIGZvciB0aGUgcHJpbWl0aXZlIGJlaW5nIHF1ZXJpZWQuIAoJCQkJCQkJLy8JRDNEUFJBU1RFUkNBUFNfU1RSRVRDSEJMVE1VTFRJU0FNUExFIHwJLy8gRGV2aWNlIHByb3ZpZGVzIGxpbWl0ZWQgbXVsdGlzYW1wbGUgc3VwcG9ydCB0aHJvdWdoIGEgc3RyZXRjaC1ibHQgaW1wbGVtZW50YXRpb24uIFdoZW4gdGhpcyBjYXBhYmlsaXR5IGlzIHNldCwgRDNEUlNfTVVMVElTQU1QTEVBTlRJQUxJQVMgY2Fubm90IGJlIHR1cm5lZCBvbiBhbmQgb2ZmIGluIHRoZSBtaWRkbGUgb2YgYSBzY2VuZS4gTXVsdGlzYW1wbGUgbWFza2luZyBjYW5ub3QgYmUgcGVyZm9ybWVkIGlmIHRoaXMgZmxhZyBpcyBzZXQuIAoJCQkJCQkJLy8JRDNEUFJBU1RFUkNBUFNfV0JVRkZFUiB8CQkJCS8vIERldmljZSBzdXBwb3J0cyBkZXB0aCBidWZmZXJpbmcgdXNpbmcgdy4gCgkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfV0ZPRyB8CQkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgdy1iYXNlZCBmb2cuIFctYmFzZWQgZm9nIGlzIHVzZWQgd2hlbiBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4IGlzIHNwZWNpZmllZCwgYnV0IGFmZmluZSBwcm9qZWN0aW9ucyBzdGlsbCB1c2Ugei1iYXNlZCBmb2cuIFRoZSBzeXN0ZW0gY29uc2lkZXJzIGEgcHJvamVjdGlvbiBtYXRyaXggdGhhdCBjb250YWlucyBhIG5vbnplcm8gdmFsdWUgaW4gdGhlIFszXVs0XSBlbGVtZW50IHRvIGJlIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXguIAoJCQkJCQkJCUQzRFBSQVNURVJDQVBTX1pCSUFTIHwJCQkJCS8vIERldmljZSBzdXBwb3J0cyB6LWJpYXMgdmFsdWVzLiBUaGVzZSBhcmUgaW50ZWdlciB2YWx1ZXMgYXNzaWduZWQgdG8gcG9seWdvbnMgdGhhdCBhbGxvdyBwaHlzaWNhbGx5IGNvcGxhbmFyIHBvbHlnb25zIHRvIGFwcGVhciBzZXBhcmF0ZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZSBEM0RSU19aQklBUy4gCgkJCQkJCQkvLwlEM0RQUkFTVEVSQ0FQU19aQlVGRkVSTEVTU0hTUiB8CQkJLy8gRGV2aWNlIGNhbiBwZXJmb3JtIGhpZGRlbi1zdXJmYWNlIHJlbW92YWwgKEhTUikgd2l0aG91dCByZXF1aXJpbmcgdGhlIGFwcGxpY2F0aW9uIHRvIHNvcnQgcG9seWdvbnMgYW5kIHdpdGhvdXQgcmVxdWlyaW5nIHRoZSBhbGxvY2F0aW9uIG9mIGEgZGVwdGgtYnVmZmVyLiBUaGlzIGxlYXZlcyBtb3JlIHZpZGVvIG1lbW9yeSBmb3IgdGV4dHVyZXMuIFRoZSBtZXRob2QgdXNlZCB0byBwZXJmb3JtIEhTUiBpcyBoYXJkd2FyZS1kZXBlbmRlbnQgYW5kIGlzIHRyYW5zcGFyZW50IHRvIHRoZSBhcHBsaWNhdGlvbi4gWi1idWZmZXJsZXNzIEhTUiBpcyBwZXJmb3JtZWQgaWYgbm8gZGVwdGgtYnVmZmVyIHN1cmZhY2UgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZW5kZXJpbmctdGFyZ2V0IHN1cmZhY2UgYW5kIHRoZSBkZXB0aC1idWZmZXIgY29tcGFyaXNvbiB0ZXN0IGlzIGVuYWJsZWQgKHRoYXQgaXMsIHdoZW4gdGhlIHN0YXRlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgRDNEUlNfWkVOQUJMRSBlbnVtZXJhdGlvbiBjb25zdGFudCBpcyBzZXQgdG8gVFJVRSkuCgkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfWkZPRzsJCQkJCS8vIERldmljZSBzdXBwb3J0cyB6LWJhc2VkIGZvZy4gCgkJCQkJCQkvLwlEM0RQUkFTVEVSQ0FQU19aVEVTVDsJCQkJCS8vIERldmljZSBjYW4gcGVyZm9ybSB6LXRlc3Qgb3BlcmF0aW9ucy4gVGhpcyBlZmZlY3RpdmVseSByZW5kZXJzIGEgcHJpbWl0aXZlIGFuZCBpbmRpY2F0ZXMgd2hldGhlciBhbnkgeiBwaXhlbHMgaGF2ZSBiZWVuIHJlbmRlcmVkLgoKCQljYXBzLlpDbXBDYXBzID0JCUQzRFBDTVBDQVBTX0FMV0FZUyB8CQkvLyBBbHdheXMgcGFzcyB0aGUgei10ZXN0LiAKCQkJCQkJCUQzRFBDTVBDQVBTX0VRVUFMIHwJCQkvLyBQYXNzIHRoZSB6LXRlc3QgaWYgdGhlIG5ldyB6IGVxdWFscyB0aGUgY3VycmVudCB6LiAKCQkJCQkJCUQzRFBDTVBDQVBTX0dSRUFURVIgfAkJLy8gUGFzcyB0aGUgei10ZXN0IGlmIHRoZSBuZXcgeiBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgei4gCgkJCQkJCQlEM0RQQ01QQ0FQU19HUkVBVEVSRVFVQUwgfAkvLyBQYXNzIHRoZSB6LXRlc3QgaWYgdGhlIG5ldyB6IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgY3VycmVudCB6LiAKCQkJCQkJCUQzRFBDTVBDQVBTX0xFU1MgfAkJCS8vIFBhc3MgdGhlIHotdGVzdCBpZiB0aGUgbmV3IHogaXMgbGVzcyB0aGFuIHRoZSBjdXJyZW50IHouIAoJCQkJCQkJRDNEUENNUENBUFNfTEVTU0VRVUFMIHwJCS8vIFBhc3MgdGhlIHotdGVzdCBpZiB0aGUgbmV3IHogaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjdXJyZW50IHouIAoJCQkJCQkJRDNEUENNUENBUFNfTkVWRVIgfAkJCS8vIEFsd2F5cyBmYWlsIHRoZSB6LXRlc3QuIAoJCQkJCQkJRDNEUENNUENBUFNfTk9URVFVQUw7CQkvLyBQYXNzIHRoZSB6LXRlc3QgaWYgdGhlIG5ldyB6IGRvZXMgbm90IGVxdWFsIHRoZSBjdXJyZW50IHouCgoJCWNhcHMuU3JjQmxlbmRDYXBzID0JCUQzRFBCTEVORENBUFNfQk9USElOVlNSQ0FMUEhBIHwJLy8gU291cmNlIGJsZW5kIGZhY3RvciBpcyAoMS1BcywxLUFzLDEtQXMsMS1BcykgYW5kIGRlc3RpbmF0aW9uIGJsZW5kIGZhY3RvciBpcyAoQXMsQXMsQXMsQXMpOyB0aGUgZGVzdGluYXRpb24gYmxlbmQgc2VsZWN0aW9uIGlzIG92ZXJyaWRkZW4uIAoJCQkJCQkJCUQzRFBCTEVORENBUFNfQk9USFNSQ0FMUEhBIHwJLy8gVGhlIGRyaXZlciBzdXBwb3J0cyB0aGUgRDNEQkxFTkRfQk9USFNSQ0FMUEhBIGJsZW5kIG1vZGUuIChUaGlzIGJsZW5kIG1vZGUgaXMgb2Jzb2xldGUuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgRDNEQkxFTkQuKSAKCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0RFU1RBTFBIQSB8CQkvLyBCbGVuZCBmYWN0b3IgaXMgKEFkLCBBZCwgQWQsIEFkKS4gCgkJCQkJCQkJRDNEUEJMRU5EQ0FQU19ERVNUQ09MT1IgfAkJLy8gQmxlbmQgZmFjdG9yIGlzIChSZCwgR2QsIEJkLCBBZCkuIAoJCQkJCQkJCUQzRFBCTEVORENBUFNfSU5WREVTVEFMUEhBIHwJLy8gQmxlbmQgZmFjdG9yIGlzICgxLUFkLCAxLUFkLCAxLUFkLCAxLUFkKS4gCgkJCQkJCQkJRDNEUEJMRU5EQ0FQU19JTlZERVNUQ09MT1IgfAkvLyBCbGVuZCBmYWN0b3IgaXMgKDEtUmQsIDEtR2QsIDEtQmQsIDEtQWQpLiAKCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVlNSQ0FMUEhBIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoMS1BcywgMS1BcywgMS1BcywgMS1BcykuIAoJCQkJCQkJCUQzRFBCTEVORENBUFNfSU5WU1JDQ09MT1IgfAkJLy8gQmxlbmQgZmFjdG9yIGlzICgxLVJzLCAxLUdzLCAxLUJzLCAxLUFzKS4gCgkJCQkJCQkJRDNEUEJMRU5EQ0FQU19PTkUgfAkJCQkvLyBCbGVuZCBmYWN0b3IgaXMgKDEsIDEsIDEsIDEpLiAKCQkJCQkJCQlEM0RQQkxFTkRDQVBTX1NSQ0FMUEhBIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoQXMsIEFzLCBBcywgQXMpLiAKCQkJCQkJCQlEM0RQQkxFTkRDQVBTX1NSQ0FMUEhBU0FUIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoZiwgZiwgZiwgMSk7IGYgPSBtaW4oQXMsIDEtQWQpLiAKCQkJCQkJCQlEM0RQQkxFTkRDQVBTX1NSQ0NPTE9SIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoUnMsIEdzLCBCcywgQXMpLiAKCQkJCQkJCQlEM0RQQkxFTkRDQVBTX1pFUk87CQkJCS8vIEJsZW5kIGZhY3RvciBpcyAoMCwgMCwgMCwgMCkuCgoJCWNhcHMuRGVzdEJsZW5kQ2FwcyA9IAlEM0RQQkxFTkRDQVBTX0JPVEhJTlZTUkNBTFBIQSB8CS8vIFNvdXJjZSBibGVuZCBmYWN0b3IgaXMgKDEtQXMsMS1BcywxLUFzLDEtQXMpIGFuZCBkZXN0aW5hdGlvbiBibGVuZCBmYWN0b3IgaXMgKEFzLEFzLEFzLEFzKTsgdGhlIGRlc3RpbmF0aW9uIGJsZW5kIHNlbGVjdGlvbiBpcyBvdmVycmlkZGVuLiAKCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0JPVEhTUkNBTFBIQSB8CS8vIFRoZSBkcml2ZXIgc3VwcG9ydHMgdGhlIEQzREJMRU5EX0JPVEhTUkNBTFBIQSBibGVuZCBtb2RlLiAoVGhpcyBibGVuZCBtb2RlIGlzIG9ic29sZXRlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIEQzREJMRU5ELikgCgkJCQkJCQkJRDNEUEJMRU5EQ0FQU19ERVNUQUxQSEEgfAkJLy8gQmxlbmQgZmFjdG9yIGlzIChBZCwgQWQsIEFkLCBBZCkuIAoJCQkJCQkJCUQzRFBCTEVORENBUFNfREVTVENPTE9SIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoUmQsIEdkLCBCZCwgQWQpLiAKCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVkRFU1RBTFBIQSB8CS8vIEJsZW5kIGZhY3RvciBpcyAoMS1BZCwgMS1BZCwgMS1BZCwgMS1BZCkuIAoJCQkJCQkJCUQzRFBCTEVORENBUFNfSU5WREVTVENPTE9SIHwJLy8gQmxlbmQgZmFjdG9yIGlzICgxLVJkLCAxLUdkLCAxLUJkLCAxLUFkKS4gCgkJCQkJCQkJRDNEUEJMRU5EQ0FQU19JTlZTUkNBTFBIQSB8CQkvLyBCbGVuZCBmYWN0b3IgaXMgKDEtQXMsIDEtQXMsIDEtQXMsIDEtQXMpLiAKCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVlNSQ0NPTE9SIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoMS1ScywgMS1HcywgMS1CcywgMS1BcykuIAoJCQkJCQkJCUQzRFBCTEVORENBUFNfT05FIHwJCQkJLy8gQmxlbmQgZmFjdG9yIGlzICgxLCAxLCAxLCAxKS4gCgkJCQkJCQkJRDNEUEJMRU5EQ0FQU19TUkNBTFBIQSB8CQkvLyBCbGVuZCBmYWN0b3IgaXMgKEFzLCBBcywgQXMsIEFzKS4gCgkJCQkJCQkJRDNEUEJMRU5EQ0FQU19TUkNBTFBIQVNBVCB8CQkvLyBCbGVuZCBmYWN0b3IgaXMgKGYsIGYsIGYsIDEpOyBmID0gbWluKEFzLCAxLUFkKS4gCgkJCQkJCQkJRDNEUEJMRU5EQ0FQU19TUkNDT0xPUiB8CQkvLyBCbGVuZCBmYWN0b3IgaXMgKFJzLCBHcywgQnMsIEFzKS4gCgkJCQkJCQkJRDNEUEJMRU5EQ0FQU19aRVJPOwkJCQkvLyBCbGVuZCBmYWN0b3IgaXMgKDAsIDAsIDAsIDApLgoKCQljYXBzLkFscGhhQ21wQ2FwcyA9IEQzRFBDTVBDQVBTX0FMV0FZUyB8CQkvLyBBbHdheXMgcGFzcyB0aGUgYXBoYS10ZXN0LiAKCQkJCQkJCUQzRFBDTVBDQVBTX0VRVUFMIHwJCQkvLyBQYXNzIHRoZSBhcGhhLXRlc3QgaWYgdGhlIG5ldyBhcGhhIGVxdWFscyB0aGUgY3VycmVudCBhcGhhLiAKCQkJCQkJCUQzRFBDTVBDQVBTX0dSRUFURVIgfAkJLy8gUGFzcyB0aGUgYXBoYS10ZXN0IGlmIHRoZSBuZXcgYXBoYSBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgYXBoYS4gCgkJCQkJCQlEM0RQQ01QQ0FQU19HUkVBVEVSRVFVQUwgfAkvLyBQYXNzIHRoZSBhcGhhLXRlc3QgaWYgdGhlIG5ldyBhcGhhIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgY3VycmVudCBhcGhhLiAKCQkJCQkJCUQzRFBDTVBDQVBTX0xFU1MgfAkJCS8vIFBhc3MgdGhlIGFwaGEtdGVzdCBpZiB0aGUgbmV3IGFwaGEgaXMgbGVzcyB0aGFuIHRoZSBjdXJyZW50IGFwaGEuIAoJCQkJCQkJRDNEUENNUENBUFNfTEVTU0VRVUFMIHwJCS8vIFBhc3MgdGhlIGFwaGEtdGVzdCBpZiB0aGUgbmV3IGFwaGEgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjdXJyZW50IGFwaGEuIAoJCQkJCQkJRDNEUENNUENBUFNfTkVWRVIgfAkJCS8vIEFsd2F5cyBmYWlsIHRoZSBhcGhhLXRlc3QuIAoJCQkJCQkJRDNEUENNUENBUFNfTk9URVFVQUw7CQkvLyBQYXNzIHRoZSBhcGhhLXRlc3QgaWYgdGhlIG5ldyBhcGhhIGRvZXMgbm90IGVxdWFsIHRoZSBjdXJyZW50IGFwaGEuCgoJCWNhcHMuU2hhZGVDYXBzID0JRDNEUFNIQURFQ0FQU19BTFBIQUdPVVJBVURCTEVORCB8CS8vIERldmljZSBjYW4gc3VwcG9ydCBhbiBhbHBoYSBjb21wb25lbnQgZm9yIEdvdXJhdWQtYmxlbmRlZCB0cmFuc3BhcmVuY3kgKHRoZSBEM0RTSEFERV9HT1VSQVVEIHN0YXRlIGZvciB0aGUgRDNEU0hBREVNT0RFIGVudW1lcmF0ZWQgdHlwZSkuIEluIHRoaXMgbW9kZSwgdGhlIGFscGhhIGNvbG9yIGNvbXBvbmVudCBvZiBhIHByaW1pdGl2ZSBpcyBwcm92aWRlZCBhdCB2ZXJ0aWNlcyBhbmQgaW50ZXJwb2xhdGVkIGFjcm9zcyBhIGZhY2UgYWxvbmcgd2l0aCB0aGUgb3RoZXIgY29sb3IgY29tcG9uZW50cy4gCgkJCQkJCQlEM0RQU0hBREVDQVBTX0NPTE9SR09VUkFVRFJHQiB8CQkvLyBEZXZpY2UgY2FuIHN1cHBvcnQgY29sb3JlZCBHb3VyYXVkIHNoYWRpbmcgaW4gdGhlIFJHQiBjb2xvciBtb2RlbC4gSW4gdGhpcyBtb2RlLCB0aGUgY29sb3IgY29tcG9uZW50IGZvciBhIHByaW1pdGl2ZSBpcyBwcm92aWRlZCBhdCB2ZXJ0aWNlcyBhbmQgaW50ZXJwb2xhdGVkIGFjcm9zcyBhIGZhY2UgYWxvbmcgd2l0aCB0aGUgb3RoZXIgY29sb3IgY29tcG9uZW50cy4gSW4gdGhlIFJHQiBsaWdodGluZyBtb2RlbCwgdGhlIHJlZCwgZ3JlZW4sIGFuZCBibHVlIGNvbXBvbmVudHMgYXJlIGludGVycG9sYXRlZC4gCgkJCQkJCQlEM0RQU0hBREVDQVBTX0ZPR0dPVVJBVUQgfAkJCS8vIERldmljZSBjYW4gc3VwcG9ydCBmb2cgaW4gdGhlIEdvdXJhdWQgc2hhZGluZyBtb2RlLiAKCQkJCQkJCUQzRFBTSEFERUNBUFNfU1BFQ1VMQVJHT1VSQVVEUkdCOwkvLyBEZXZpY2Ugc3VwcG9ydHMgR291cmF1ZCBzaGFkaW5nIG9mIHNwZWN1bGFyIGhpZ2hsaWdodHMuCgoJCWNhcHMuVGV4dHVyZUNhcHMgPQkJRDNEUFRFWFRVUkVDQVBTX0FMUEhBIHwJCQkJCQkvLyBBbHBoYSBpbiB0ZXh0dXJlIHBpeGVscyBpcyBzdXBwb3J0ZWQuIAoJCQkJCQkJCUQzRFBURVhUVVJFQ0FQU19BTFBIQVBBTEVUVEUgfAkJCQkvLyBEZXZpY2UgY2FuIGRyYXcgYWxwaGEgZnJvbSB0ZXh0dXJlIHBhbGV0dGVzLiAKCQkJCQkJCQlEM0RQVEVYVFVSRUNBUFNfQ1VCRU1BUCB8CQkJCQkvLyBTdXBwb3J0cyBjdWJlIHRleHR1cmVzLgoJCQkJCQkJLy8JRDNEUFRFWFRVUkVDQVBTX0NVQkVNQVBfUE9XMiB8CQkJCS8vIERldmljZSByZXF1aXJlcyB0aGF0IGN1YmUgdGV4dHVyZSBtYXBzIGhhdmUgZGltZW5zaW9ucyBzcGVjaWZpZWQgYXMgcG93ZXJzIG9mIHR3by4gCgkJCQkJCQkJRDNEUFRFWFRVUkVDQVBTX01JUENVQkVNQVAgfAkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgbWlwbWFwcGVkIGN1YmUgdGV4dHVyZXMuIAoJCQkJCQkJCUQzRFBURVhUVVJFQ0FQU19NSVBNQVAgfAkJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIG1pcG1hcHBlZCB0ZXh0dXJlcy4gCgkJCQkJCQkJRDNEUFRFWFRVUkVDQVBTX01JUFZPTFVNRU1BUCB8CQkJCS8vIERldmljZSBzdXBwb3J0cyBtaXBtYXBwZWQgdm9sdW1lIHRleHR1cmVzLiAKCQkJCQkJCS8vCUQzRFBURVhUVVJFQ0FQU19OT05QT1cyQ09ORElUSU9OQUwgfAkJLy8gQ29uZGl0aW9uYWxseSBzdXBwb3J0cyB0aGUgdXNlIG9mIDItRCB0ZXh0dXJlcyB3aXRoIGRpbWVuc2lvbnMgdGhhdCBhcmUgbm90IHBvd2VycyBvZiB0d28uIEEgZGV2aWNlIHRoYXQgZXhwb3NlcyB0aGlzIGNhcGFiaWxpdHkgY2FuIHVzZSBzdWNoIGEgdGV4dHVyZSBpZiBhbGwgb2YgdGhlIGZvbGxvd2luZyByZXF1aXJlbWVudHMgYXJlIG1ldC4uLgoJCQkJCQkJCUQzRFBURVhUVVJFQ0FQU19QRVJTUEVDVElWRSB8CQkJCS8vIFBlcnNwZWN0aXZlIGNvcnJlY3Rpb24gdGV4dHVyaW5nIGlzIHN1cHBvcnRlZC4KCQkJCQkJCS8vCUQzRFBURVhUVVJFQ0FQU19QT1cyIHwJCQkJCQkvLyBBbGwgdGV4dHVyZXMgbXVzdCBoYXZlIHdpZHRocyBhbmQgaGVpZ2h0cyBzcGVjaWZpZWQgYXMgcG93ZXJzIG9mIHR3by4gVGhpcyByZXF1aXJlbWVudCBkb2VzIG5vdCBhcHBseSB0byBlaXRoZXIgY3ViZSB0ZXh0dXJlcyBvciB2b2x1bWUgdGV4dHVyZXMuCgkJCQkJCQkJRDNEUFRFWFRVUkVDQVBTX1BST0pFQ1RFRCB8CQkJCQkvLyBTdXBwb3J0cyB0aGUgRDNEVFRGRl9QUk9KRUNURUQgdGV4dHVyZSB0cmFuc2Zvcm1hdGlvbiBmbGFnLiBXaGVuIGFwcGxpZWQsIHRoZSBkZXZpY2UgZGl2aWRlcyB0cmFuc2Zvcm1lZCB0ZXh0dXJlIGNvb3JkaW5hdGVzIGJ5IHRoZSBsYXN0IHRleHR1cmUgY29vcmRpbmF0ZS4gSWYgdGhpcyBjYXBhYmlsaXR5IGlzIHByZXNlbnQsIHRoZW4gdGhlIHByb2plY3RpdmUgZGl2aWRlIG9jY3VycyBwZXIgcGl4ZWwuIElmIHRoaXMgY2FwYWJpbGl0eSBpcyBub3QgcHJlc2VudCwgYnV0IHRoZSBwcm9qZWN0aXZlIGRpdmlkZSBuZWVkcyB0byBvY2N1ciBhbnl3YXksIHRoZW4gaXQgaXMgcGVyZm9ybWVkIG9uIGEgcGVyLXZlcnRleCBiYXNpcyBieSB0aGUgRGlyZWN0M0QgcnVudGltZS4gCgkJCQkJCQkvLwlEM0RQVEVYVFVSRUNBUFNfU1FVQVJFT05MWSB8CQkJCS8vIEFsbCB0ZXh0dXJlcyBtdXN0IGJlIHNxdWFyZS4gCgkJCQkJCQkJRDNEUFRFWFRVUkVDQVBTX1RFWFJFUEVBVE5PVFNDQUxFREJZU0laRSB8CS8vIFRleHR1cmUgaW5kaWNlcyBhcmUgbm90IHNjYWxlZCBieSB0aGUgdGV4dHVyZSBzaXplIHByaW9yIHRvIGludGVycG9sYXRpb24uCgkJCQkJCQkJRDNEUFRFWFRVUkVDQVBTX1ZPTFVNRU1BUDsJCQkJCS8vIERldmljZSBzdXBwb3J0cyB2b2x1bWUgdGV4dHVyZXMuCgkJCQkJCQkvLwlEM0RQVEVYVFVSRUNBUFNfVk9MVU1FTUFQX1BPVzI7CQkJCS8vIERldmljZSByZXF1aXJlcyB0aGF0IHZvbHVtZSB0ZXh0dXJlIG1hcHMgaGF2ZSBkaW1lbnNpb25zIHNwZWNpZmllZCBhcyBwb3dlcnMgb2YgdHdvLiAKCgkJY2Fwcy5UZXh0dXJlRmlsdGVyQ2FwcyA9CS8vCUQzRFBURklMVEVSQ0FQU19NQUdGQUZMQVRDVUJJQyB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgZmxhdCBjdWJpYyBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgdGV4dHVyZXMuIFRoZSBmbGF0IGN1YmljIG1hZ25pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0ZMQVRDVUJJQyBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCgkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NQUdGQU5JU09UUk9QSUMgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGFuaXNvdHJvcGljIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gVGhlIGFuaXNvdHJvcGljIG1hZ25pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0FOSVNPVFJPUElDIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZHQVVTU0lBTkNVQklDIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHRoZSBwZXItc3RhZ2UgR2F1c3NpYW4gY3ViaWMgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgR2F1c3NpYW4gY3ViaWMgbWFnbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfR0FVU1NJQU5DVUJJQyBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4KCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NQUdGTElORUFSIHwJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgbWlwbWFwcy4gVGhlIGJpbGluZWFyIGludGVycG9sYXRpb24gbWlwbWFwcGluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfTElORUFSIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NQUdGUE9JTlQgfAkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcG9pbnQtc2FtcGxlIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gVGhlIHBvaW50LXNhbXBsZSBtYWduaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCgkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlORkFOSVNPVFJPUElDIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBhbmlzb3Ryb3BpYyBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gVGhlIGFuaXNvdHJvcGljIG1pbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfQU5JU09UUk9QSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAoJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JTkZMSU5FQVIgfAkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBsaW5lYXIgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBsaW5lYXIgbWluaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9MSU5FQVIgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAoJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JTkZQT0lOVCB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBwb2ludC1zYW1wbGUgbWluaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCgkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlQRkxJTkVBUiB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGJpbGluZWFyIGludGVycG9sYXRpb24gZmlsdGVyaW5nIGZvciBtaXBtYXBzLiBUaGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBtaXBtYXBwaW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9MSU5FQVIgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAoJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JUEZQT0lOVDsJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHBvaW50LXNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1pcG1hcHMuIFRoZSBwb2ludC1zYW1wbGUgbWlwbWFwcGluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfUE9JTlQgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAoJCQkJCQkJCQkKCQljYXBzLkN1YmVUZXh0dXJlRmlsdGVyQ2FwcyA9CS8vCUQzRFBURklMVEVSQ0FQU19NQUdGQUZMQVRDVUJJQyB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgZmxhdCBjdWJpYyBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgdGV4dHVyZXMuIFRoZSBmbGF0IGN1YmljIG1hZ25pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0ZMQVRDVUJJQyBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCgkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUFHRkFOSVNPVFJPUElDIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBhbmlzb3Ryb3BpYyBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgdGV4dHVyZXMuIFRoZSBhbmlzb3Ryb3BpYyBtYWduaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9BTklTT1RST1BJQyBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCgkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUFHRkdBVVNTSUFOQ1VCSUMgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgdGhlIHBlci1zdGFnZSBHYXVzc2lhbiBjdWJpYyBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgdGV4dHVyZXMuIFRoZSBHYXVzc2lhbiBjdWJpYyBtYWduaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9HQVVTU0lBTkNVQklDIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLgoJCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NQUdGTElORUFSIHwJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgbWlwbWFwcy4gVGhlIGJpbGluZWFyIGludGVycG9sYXRpb24gbWlwbWFwcGluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfTElORUFSIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKCQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUFHRlBPSU5UIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHBvaW50LXNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgdGV4dHVyZXMuIFRoZSBwb2ludC1zYW1wbGUgbWFnbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfUE9JTlQgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAoJCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01JTkZBTklTT1RST1BJQyB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYW5pc290cm9waWMgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBhbmlzb3Ryb3BpYyBtaW5pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0FOSVNPVFJPUElDIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKCQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlORkxJTkVBUiB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGxpbmVhciBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gVGhlIGxpbmVhciBtaW5pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0xJTkVBUiBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCgkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JTkZQT0lOVCB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBwb2ludC1zYW1wbGUgbWluaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCgkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JUEZMSU5FQVIgfAkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGZpbHRlcmluZyBmb3IgbWlwbWFwcy4gVGhlIGJpbGluZWFyIGludGVycG9sYXRpb24gbWlwbWFwcGluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfTElORUFSIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKCQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlQRlBPSU5UOwkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcG9pbnQtc2FtcGxlIGZpbHRlcmluZyBmb3IgbWlwbWFwcy4gVGhlIHBvaW50LXNhbXBsZSBtaXBtYXBwaW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCgkJCQkJCQkJCQoJCWNhcHMuVm9sdW1lVGV4dHVyZUZpbHRlckNhcHMgPSAJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZBRkxBVENVQklDIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBmbGF0IGN1YmljIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gVGhlIGZsYXQgY3ViaWMgbWFnbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfRkxBVENVQklDIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NQUdGQU5JU09UUk9QSUMgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGFuaXNvdHJvcGljIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gVGhlIGFuaXNvdHJvcGljIG1hZ25pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0FOSVNPVFJPUElDIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NQUdGR0FVU1NJQU5DVUJJQyB8CS8vIERldmljZSBzdXBwb3J0cyB0aGUgcGVyLXN0YWdlIEdhdXNzaWFuIGN1YmljIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gVGhlIEdhdXNzaWFuIGN1YmljIG1hZ25pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0dBVVNTSUFOQ1VCSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuCgkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01BR0ZMSU5FQVIgfAkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyBtaXBtYXBzLiBUaGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBtaXBtYXBwaW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9MSU5FQVIgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAoJCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NQUdGUE9JTlQgfAkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcG9pbnQtc2FtcGxlIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gVGhlIHBvaW50LXNhbXBsZSBtYWduaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCgkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUlORkFOSVNPVFJPUElDIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBhbmlzb3Ryb3BpYyBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gVGhlIGFuaXNvdHJvcGljIG1pbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfQU5JU09UUk9QSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAoJCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NSU5GTElORUFSIHwJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgbGluZWFyIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHRleHR1cmVzLiBUaGUgbGluZWFyIG1pbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfTElORUFSIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKCQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlORlBPSU5UIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHBvaW50LXNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gVGhlIHBvaW50LXNhbXBsZSBtaW5pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BPSU5UIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKCQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlQRkxJTkVBUiB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGJpbGluZWFyIGludGVycG9sYXRpb24gZmlsdGVyaW5nIGZvciBtaXBtYXBzLiBUaGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBtaXBtYXBwaW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9MSU5FQVIgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAoJCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NSVBGUE9JTlQ7CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtaXBtYXBzLiBUaGUgcG9pbnQtc2FtcGxlIG1pcG1hcHBpbmcgZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BPSU5UIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKCQkJCQkJCQkJCgkJY2Fwcy5UZXh0dXJlQWRkcmVzc0NhcHMgPQlEM0RQVEFERFJFU1NDQVBTX0JPUkRFUiB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHNldHRpbmcgY29vcmRpbmF0ZXMgb3V0c2lkZSB0aGUgcmFuZ2UgWzAuMCwgMS4wXSB0byB0aGUgYm9yZGVyIGNvbG9yLCBhcyBzcGVjaWZpZWQgYnkgdGhlIEQzRFNBTVBfQk9SREVSQ09MT1IgdGV4dHVyZS1zdGFnZSBzdGF0ZS4gCgkJCQkJCQkJCUQzRFBUQUREUkVTU0NBUFNfQ0xBTVAgfAkJCS8vIERldmljZSBjYW4gY2xhbXAgdGV4dHVyZXMgdG8gYWRkcmVzc2VzLiAKCQkJCQkJCQkJRDNEUFRBRERSRVNTQ0FQU19JTkRFUEVOREVOVFVWIHwJLy8gRGV2aWNlIGNhbiBzZXBhcmF0ZSB0aGUgdGV4dHVyZS1hZGRyZXNzaW5nIG1vZGVzIG9mIHRoZSB1IGFuZCB2IGNvb3JkaW5hdGVzIG9mIHRoZSB0ZXh0dXJlLiBUaGlzIGFiaWxpdHkgY29ycmVzcG9uZHMgdG8gdGhlIEQzRFNBTVBfQUREUkVTU1UgYW5kIEQzRFNBTVBfQUREUkVTU1YgcmVuZGVyLXN0YXRlIHZhbHVlcy4gCgkJCQkJCQkJCUQzRFBUQUREUkVTU0NBUFNfTUlSUk9SIHwJCQkvLyBEZXZpY2UgY2FuIG1pcnJvciB0ZXh0dXJlcyB0byBhZGRyZXNzZXMuIAoJCQkJCQkJCQlEM0RQVEFERFJFU1NDQVBTX01JUlJPUk9OQ0UgfAkJLy8gRGV2aWNlIGNhbiB0YWtlIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgdGV4dHVyZSBjb29yZGluYXRlICh0aHVzLCBtaXJyb3JpbmcgYXJvdW5kIDApIGFuZCB0aGVuIGNsYW1wIHRvIHRoZSBtYXhpbXVtIHZhbHVlLiAKCQkJCQkJCQkJRDNEUFRBRERSRVNTQ0FQU19XUkFQOwkJCQkvLyBEZXZpY2UgY2FuIHdyYXAgdGV4dHVyZXMgdG8gYWRkcmVzc2VzLgoKCQljYXBzLlZvbHVtZVRleHR1cmVBZGRyZXNzQ2FwcyA9CUQzRFBUQUREUkVTU0NBUFNfQk9SREVSIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgc2V0dGluZyBjb29yZGluYXRlcyBvdXRzaWRlIHRoZSByYW5nZSBbMC4wLCAxLjBdIHRvIHRoZSBib3JkZXIgY29sb3IsIGFzIHNwZWNpZmllZCBieSB0aGUgRDNEU0FNUF9CT1JERVJDT0xPUiB0ZXh0dXJlLXN0YWdlIHN0YXRlLiAKCQkJCQkJCQkJCUQzRFBUQUREUkVTU0NBUFNfQ0xBTVAgfAkJCS8vIERldmljZSBjYW4gY2xhbXAgdGV4dHVyZXMgdG8gYWRkcmVzc2VzLiAKCQkJCQkJCQkJCUQzRFBUQUREUkVTU0NBUFNfSU5ERVBFTkRFTlRVViB8CS8vIERldmljZSBjYW4gc2VwYXJhdGUgdGhlIHRleHR1cmUtYWRkcmVzc2luZyBtb2RlcyBvZiB0aGUgdSBhbmQgdiBjb29yZGluYXRlcyBvZiB0aGUgdGV4dHVyZS4gVGhpcyBhYmlsaXR5IGNvcnJlc3BvbmRzIHRvIHRoZSBEM0RTQU1QX0FERFJFU1NVIGFuZCBEM0RTQU1QX0FERFJFU1NWIHJlbmRlci1zdGF0ZSB2YWx1ZXMuIAoJCQkJCQkJCQkJRDNEUFRBRERSRVNTQ0FQU19NSVJST1IgfAkJCS8vIERldmljZSBjYW4gbWlycm9yIHRleHR1cmVzIHRvIGFkZHJlc3Nlcy4gCgkJCQkJCQkJCQlEM0RQVEFERFJFU1NDQVBTX01JUlJPUk9OQ0UgfAkJLy8gRGV2aWNlIGNhbiB0YWtlIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgdGV4dHVyZSBjb29yZGluYXRlICh0aHVzLCBtaXJyb3JpbmcgYXJvdW5kIDApIGFuZCB0aGVuIGNsYW1wIHRvIHRoZSBtYXhpbXVtIHZhbHVlLiAKCQkJCQkJCQkJCUQzRFBUQUREUkVTU0NBUFNfV1JBUDsJCQkJLy8gRGV2aWNlIGNhbiB3cmFwIHRleHR1cmVzIHRvIGFkZHJlc3Nlcy4KCgkJY2Fwcy5MaW5lQ2FwcyA9IEQzRExJTkVDQVBTX0FMUEhBQ01QIHwJLy8gU3VwcG9ydHMgYWxwaGEtdGVzdCBjb21wYXJpc29ucy4gCgkJCQkJCUQzRExJTkVDQVBTX0JMRU5EIHwJCS8vIFN1cHBvcnRzIHNvdXJjZS1ibGVuZGluZy4gCgkJCQkJCUQzRExJTkVDQVBTX0ZPRyB8CQkvLyBTdXBwb3J0cyBmb2cuIAoJCQkJCQlEM0RMSU5FQ0FQU19URVhUVVJFIHwJLy8gU3VwcG9ydHMgdGV4dHVyZS1tYXBwaW5nLiAKCQkJCQkJRDNETElORUNBUFNfWlRFU1Q7CQkvLyBTdXBwb3J0cyB6LWJ1ZmZlciBjb21wYXJpc29ucy4KCQkKCQljYXBzLk1heFRleHR1cmVXaWR0aCA9IDEgPDwgKHN3OjpNSVBNQVBfTEVWRUxTIC0gMSk7CgkJY2Fwcy5NYXhUZXh0dXJlSGVpZ2h0ID0gMSA8PCAoc3c6Ok1JUE1BUF9MRVZFTFMgLSAxKTsKCQljYXBzLk1heFZvbHVtZUV4dGVudCA9IDEgPDwgKHN3OjpNSVBNQVBfTEVWRUxTIC0gMSk7CgkJY2Fwcy5NYXhUZXh0dXJlUmVwZWF0ID0gODE5MjsKCQljYXBzLk1heFRleHR1cmVBc3BlY3RSYXRpbyA9IDEgPDwgKHN3OjpNSVBNQVBfTEVWRUxTIC0gMSk7CgkJY2Fwcy5NYXhBbmlzb3Ryb3B5ID0gbWF4QW5pc290cm9weTsKCQljYXBzLk1heFZlcnRleFcgPSAxZSswMTA7CgoJCWNhcHMuR3VhcmRCYW5kTGVmdCA9IC0xZSswMDg7CgkJY2Fwcy5HdWFyZEJhbmRUb3AgPSAtMWUrMDA4OwoJCWNhcHMuR3VhcmRCYW5kUmlnaHQgPSAxZSswMDg7CgkJY2Fwcy5HdWFyZEJhbmRCb3R0b20gPSAxZSswMDg7CgoJCWNhcHMuRXh0ZW50c0FkanVzdCA9IDA7CgoJCWNhcHMuU3RlbmNpbENhcHMgPQkJRDNEU1RFTkNJTENBUFNfS0VFUCB8CQkvLyBEbyBub3QgdXBkYXRlIHRoZSBlbnRyeSBpbiB0aGUgc3RlbmNpbCBidWZmZXIuIFRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUuIAoJCQkJCQkJCUQzRFNURU5DSUxDQVBTX1pFUk8gfAkJLy8gU2V0IHRoZSBzdGVuY2lsLWJ1ZmZlciBlbnRyeSB0byAwLiAKCQkJCQkJCQlEM0RTVEVOQ0lMQ0FQU19SRVBMQUNFIHwJLy8gUmVwbGFjZSB0aGUgc3RlbmNpbC1idWZmZXIgZW50cnkgd2l0aCByZWZlcmVuY2UgdmFsdWUuIAoJCQkJCQkJCUQzRFNURU5DSUxDQVBTX0lOQ1JTQVQgfAkvLyBJbmNyZW1lbnQgdGhlIHN0ZW5jaWwtYnVmZmVyIGVudHJ5LCBjbGFtcGluZyB0byB0aGUgbWF4aW11bSB2YWx1ZS4gIAoJCQkJCQkJCUQzRFNURU5DSUxDQVBTX0RFQ1JTQVQgfAkvLyBEZWNyZW1lbnQgdGhlIHN0ZW5jaWwtYnVmZmVyIGVudHJ5LCBjbGFtcGluZyB0byB6ZXJvLiAKCQkJCQkJCQlEM0RTVEVOQ0lMQ0FQU19JTlZFUlQgfAkJLy8gSW52ZXJ0IHRoZSBiaXRzIGluIHRoZSBzdGVuY2lsLWJ1ZmZlciBlbnRyeS4gCgkJCQkJCQkJRDNEU1RFTkNJTENBUFNfSU5DUiB8CQkvLyBJbmNyZW1lbnQgdGhlIHN0ZW5jaWwtYnVmZmVyIGVudHJ5LCB3cmFwcGluZyB0byB6ZXJvIGlmIHRoZSBuZXcgdmFsdWUgZXhjZWVkcyB0aGUgbWF4aW11bSB2YWx1ZS4gIAoJCQkJCQkJCUQzRFNURU5DSUxDQVBTX0RFQ1I7CQkvLyBEZWNyZW1lbnQgdGhlIHN0ZW5jaWwtYnVmZmVyIGVudHJ5LCB3cmFwcGluZyB0byB0aGUgbWF4aW11bSB2YWx1ZSBpZiB0aGUgbmV3IHZhbHVlIGlzIGxlc3MgdGhhbiB6ZXJvLiAKCQkKCQljYXBzLkZWRkNhcHMgPQkJRDNERlZGQ0FQU19ET05PVFNUUklQRUxFTUVOVFMgfAkJLy8gSXQgaXMgcHJlZmVyYWJsZSB0aGF0IHZlcnRleCBlbGVtZW50cyBub3QgYmUgc3RyaXBwZWQuIFRoYXQgaXMsIGlmIHRoZSB2ZXJ0ZXggZm9ybWF0IGNvbnRhaW5zIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCB1c2VkIHdpdGggdGhlIGN1cnJlbnQgcmVuZGVyIHN0YXRlcywgdGhlcmUgaXMgbm8gbmVlZCB0byByZWdlbmVyYXRlIHRoZSB2ZXJ0aWNlcy4gSWYgdGhpcyBjYXBhYmlsaXR5IGZsYWcgaXMgbm90IHByZXNlbnQsIHN0cmlwcGluZyBleHRyYW5lb3VzIGVsZW1lbnRzIGZyb20gdGhlIHZlcnRleCBmb3JtYXQgcHJvdmlkZXMgYmV0dGVyIHBlcmZvcm1hbmNlLiAKCQkJCQkJCUQzREZWRkNBUFNfUFNJWkUgfAkJCQkJLy8gUG9pbnQgc2l6ZSBpcyBkZXRlcm1pbmVkIGJ5IGVpdGhlciB0aGUgcmVuZGVyIHN0YXRlIG9yIHRoZSB2ZXJ0ZXggZGF0YS4KCQkJCQkJLy8JRDNERlZGQ0FQU19URVhDT09SRENPVU5UTUFTSyB8CQkvLyBNYXNrcyB0aGUgbG93IFdPUkQgb2YgRlZGQ2Fwcy4gVGhlc2UgYml0cywgY2FzdCB0byB0aGUgV09SRCBkYXRhIHR5cGUsIGRlc2NyaWJlIHRoZSB0b3RhbCBudW1iZXIgb2YgdGV4dHVyZSBjb29yZGluYXRlIHNldHMgdGhhdCB0aGUgZGV2aWNlIGNhbiBzaW11bHRhbmVvdXNseSB1c2UgZm9yIG11bHRpcGxlIHRleHR1cmUgYmxlbmRpbmcuIChZb3UgY2FuIHVzZSB1cCB0byBlaWdodCB0ZXh0dXJlIGNvb3JkaW5hdGUgc2V0cyBmb3IgYW55IHZlcnRleCwgYnV0IHRoZSBkZXZpY2UgY2FuIGJsZW5kIHVzaW5nIG9ubHkgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgdGV4dHVyZSBjb29yZGluYXRlIHNldHMuKSAKCQkJCQkJCTg7CgoJCWNhcHMuVGV4dHVyZU9wQ2FwcyA9CUQzRFRFWE9QQ0FQU19BREQgfAkJCQkJCQkvLyBUaGUgRDNEVE9QX0FERCB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAoJCQkJCQkJCUQzRFRFWE9QQ0FQU19BRERTSUdORUQgfAkJCQkJLy8gVGhlIEQzRFRPUF9BRERTSUdORUQgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKCQkJCQkJCQlEM0RURVhPUENBUFNfQUREU0lHTkVEMlggfAkJCQkJLy8gVGhlIEQzRFRPUF9BRERTSUdORUQyWCB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAoJCQkJCQkJCUQzRFRFWE9QQ0FQU19BRERTTU9PVEggfAkJCQkJLy8gVGhlIEQzRFRPUF9BRERTTU9PVEggdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKCQkJCQkJCQlEM0RURVhPUENBUFNfQkxFTkRDVVJSRU5UQUxQSEEgfAkJCS8vIFRoZSBEM0RUT1BfQkxFTkRDVVJSRU5UQUxQSEEgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKCQkJCQkJCQlEM0RURVhPUENBUFNfQkxFTkRESUZGVVNFQUxQSEEgfAkJCS8vIFRoZSBEM0RUT1BfQkxFTkRESUZGVVNFQUxQSEEgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKCQkJCQkJCQlEM0RURVhPUENBUFNfQkxFTkRGQUNUT1JBTFBIQSB8CQkJCS8vIFRoZSBEM0RUT1BfQkxFTkRGQUNUT1JBTFBIQSB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAoJCQkJCQkJCUQzRFRFWE9QQ0FQU19CTEVORFRFWFRVUkVBTFBIQSB8CQkJLy8gVGhlIEQzRFRPUF9CTEVORFRFWFRVUkVBTFBIQSB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAoJCQkJCQkJCUQzRFRFWE9QQ0FQU19CTEVORFRFWFRVUkVBTFBIQVBNIHwJCQkvLyBUaGUgRDNEVE9QX0JMRU5EVEVYVFVSRUFMUEhBUE0gdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKCQkJCQkJCQlEM0RURVhPUENBUFNfQlVNUEVOVk1BUCB8CQkJCQkvLyBUaGUgRDNEVE9QX0JVTVBFTlZNQVAgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKCQkJCQkJCQlEM0RURVhPUENBUFNfQlVNUEVOVk1BUExVTUlOQU5DRSB8CQkJLy8gVGhlIEQzRFRPUF9CVU1QRU5WTUFQTFVNSU5BTkNFIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCgkJCQkJCQkJRDNEVEVYT1BDQVBTX0RJU0FCTEUgfAkJCQkJCS8vIFRoZSBEM0RUT1BfRElTQUJMRSB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAoJCQkJCQkJCUQzRFRFWE9QQ0FQU19ET1RQUk9EVUNUMyB8CQkJCQkvLyBUaGUgRDNEVE9QX0RPVFBST0RVQ1QzIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCgkJCQkJCQkJRDNEVEVYT1BDQVBTX0xFUlAgfAkJCQkJCQkvLyBUaGUgRDNEVE9QX0xFUlAgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKCQkJCQkJCQlEM0RURVhPUENBUFNfTU9EVUxBVEUgfAkJCQkJCS8vIFRoZSBEM0RUT1BfTU9EVUxBVEUgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKCQkJCQkJCQlEM0RURVhPUENBUFNfTU9EVUxBVEUyWCB8CQkJCQkvLyBUaGUgRDNEVE9QX01PRFVMQVRFMlggdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKCQkJCQkJCQlEM0RURVhPUENBUFNfTU9EVUxBVEU0WCB8CQkJCQkvLyBUaGUgRDNEVE9QX01PRFVMQVRFNFggdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKCQkJCQkJCQlEM0RURVhPUENBUFNfTU9EVUxBVEVBTFBIQV9BRERDT0xPUiB8CQkvLyBUaGUgRDNEVE9QX01PRFVMQVRFQUxQSEFfQUREQ09MT1IgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKCQkJCQkJCQlEM0RURVhPUENBUFNfTU9EVUxBVEVDT0xPUl9BRERBTFBIQSB8CQkvLyBUaGUgRDNEVE9QX01PRFVMQVRFQ09MT1JfQUREQUxQSEEgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKCQkJCQkJCQlEM0RURVhPUENBUFNfTU9EVUxBVEVJTlZBTFBIQV9BRERDT0xPUiB8CS8vIFRoZSBEM0RUT1BfTU9EVUxBVEVJTlZBTFBIQV9BRERDT0xPUiB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAoJCQkJCQkJCUQzRFRFWE9QQ0FQU19NT0RVTEFURUlOVkNPTE9SX0FEREFMUEhBIHwJLy8gVGhlIEQzRFRPUF9NT0RVTEFURUlOVkNPTE9SX0FEREFMUEhBIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCgkJCQkJCQkJRDNEVEVYT1BDQVBTX01VTFRJUExZQUREIHwJCQkJCS8vIFRoZSBEM0RUT1BfTVVMVElQTFlBREQgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKCQkJCQkJCQlEM0RURVhPUENBUFNfUFJFTU9EVUxBVEUgfAkJCQkJLy8gVGhlIEQzRFRPUF9QUkVNT0RVTEFURSB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAoJCQkJCQkJCUQzRFRFWE9QQ0FQU19TRUxFQ1RBUkcxIHwJCQkJCS8vIFRoZSBEM0RUT1BfU0VMRUNUQVJHMSB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAoJCQkJCQkJCUQzRFRFWE9QQ0FQU19TRUxFQ1RBUkcyIHwJCQkJCS8vIFRoZSBEM0RUT1BfU0VMRUNUQVJHMiB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAoJCQkJCQkJCUQzRFRFWE9QQ0FQU19TVUJUUkFDVDsJCQkJCQkvLyBUaGUgRDNEVE9QX1NVQlRSQUNUIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCgoJCWNhcHMuTWF4VGV4dHVyZUJsZW5kU3RhZ2VzID0gODsKCQljYXBzLk1heFNpbXVsdGFuZW91c1RleHR1cmVzID0gODsKCgkJY2Fwcy5WZXJ0ZXhQcm9jZXNzaW5nQ2FwcyA9CQlEM0RWVFhQQ0FQU19ESVJFQ1RJT05BTExJR0hUUyB8CQkJLy8gRGV2aWNlIGNhbiBkbyBkaXJlY3Rpb25hbCBsaWdodHMuIAoJCQkJCQkJCQkJRDNEVlRYUENBUFNfTE9DQUxWSUVXRVIgfAkJCQkvLyBEZXZpY2UgY2FuIGRvIGxvY2FsIHZpZXdlci4gCgkJCQkJCQkJCQlEM0RWVFhQQ0FQU19NQVRFUklBTFNPVVJDRTcJfAkJCS8vIERldmljZSBjYW4gZG8gTWljcm9zb2Z0riBEaXJlY3RYriA3LjAgY29sb3JtYXRlcmlhbHNvdXJjZSBvcGVyYXRpb25zLiAKCQkJCQkJCQkJCUQzRFZUWFBDQVBTX1BPU0lUSU9OQUxMSUdIVFMgfAkJCS8vIERldmljZSBjYW4gZG8gcG9zaXRpb25hbCBsaWdodHMgKGluY2x1ZGVzIHBvaW50IGFuZCBzcG90KS4gCgkJCQkJCQkJCQlEM0RWVFhQQ0FQU19URVhHRU4gfAkJCQkJLy8gRGV2aWNlIGNhbiBkbyB0ZXhnZW4uIAoJCQkJCQkJCQkJRDNEVlRYUENBUFNfVFdFRU5JTkc7CQkJCQkvLyBEZXZpY2UgY2FuIGRvIHZlcnRleCB0d2VlbmluZy4gCgkJCQkJCQkJCS8vCUQzRFZUWFBDQVBTX05PX1ZTRFRfVUJZVEU0OwkJCQkvLyBEZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCB0aGUgRDNEVlNEVF9VQllURTQgdmVydGV4IGRlY2xhcmF0aW9uIHR5cGUuICAKCgkJY2Fwcy5NYXhBY3RpdmVMaWdodHMgPSA4OwkJCQkJCS8vIE1heGltdW0gbnVtYmVyIG9mIGxpZ2h0cyB0aGF0IGNhbiBiZSBhY3RpdmUgc2ltdWx0YW5lb3VzbHkuIEZvciBhIGdpdmVuIHBoeXNpY2FsIGRldmljZSwgdGhpcyBjYXBhYmlsaXR5IG1pZ2h0IHZhcnkgYWNyb3NzIERpcmVjdDNERGV2aWNlIG9iamVjdHMgZGVwZW5kaW5nIG9uIHRoZSBwYXJhbWV0ZXJzIHN1cHBsaWVkIHRvIElEaXJlY3QzRDg6OkNyZWF0ZURldmljZS4KCQljYXBzLk1heFVzZXJDbGlwUGxhbmVzID0gNjsJCQkJCQkvLyBNYXhpbXVtIG51bWJlciBvZiB1c2VyLWRlZmluZWQgY2xpcHBpbmcgcGxhbmVzIHN1cHBvcnRlZC4gVGhpcyBtZW1iZXIgY2FuIHJhbmdlIGZyb20gMCB0aHJvdWdoIEQzRE1BWFVTRVJDTElQUExBTkVTLiBGb3IgYSBnaXZlbiBwaHlzaWNhbCBkZXZpY2UsIHRoaXMgY2FwYWJpbGl0eSBtYXkgdmFyeSBhY3Jvc3MgRGlyZWN0M0REZXZpY2Ugb2JqZWN0cyBkZXBlbmRpbmcgb24gdGhlIHBhcmFtZXRlcnMgc3VwcGxpZWQgdG8gSURpcmVjdDNEODo6Q3JlYXRlRGV2aWNlLiAKCQljYXBzLk1heFZlcnRleEJsZW5kTWF0cmljZXMgPSA0OwkJCQkvLyBNYXhpbXVtIG51bWJlciBvZiBtYXRyaWNlcyB0aGF0IHRoaXMgZGV2aWNlIGNhbiBhcHBseSB3aGVuIHBlcmZvcm1pbmcgbXVsdGltYXRyaXggdmVydGV4IGJsZW5kaW5nLiBGb3IgYSBnaXZlbiBwaHlzaWNhbCBkZXZpY2UsIHRoaXMgY2FwYWJpbGl0eSBtYXkgdmFyeSBhY3Jvc3MgRGlyZWN0M0REZXZpY2Ugb2JqZWN0cyBkZXBlbmRpbmcgb24gdGhlIHBhcmFtZXRlcnMgc3VwcGxpZWQgdG8gSURpcmVjdDNEODo6Q3JlYXRlRGV2aWNlLiAKCQljYXBzLk1heFZlcnRleEJsZW5kTWF0cml4SW5kZXggPSAxMTsJCQkvLyBEV09SRCB2YWx1ZSB0aGF0IHNwZWNpZmllcyB0aGUgbWF4aW11bSBtYXRyaXggaW5kZXggdGhhdCBjYW4gYmUgaW5kZXhlZCBpbnRvIHVzaW5nIHRoZSBwZXItdmVydGV4IGluZGljZXMuIFRoZSBudW1iZXIgb2YgbWF0cmljZXMgaXMgTWF4VmVydGV4QmxlbmRNYXRyaXhJbmRleCArIDEsIHdoaWNoIGlzIHRoZSBzaXplIG9mIHRoZSBtYXRyaXggcGFsZXR0ZS4gSWYgbm9ybWFscyBhcmUgcHJlc2VudCBpbiB0aGUgdmVydGV4IGRhdGEgdGhhdCBuZWVkcyB0byBiZSBibGVuZGVkIGZvciBsaWdodGluZywgdGhlbiB0aGUgbnVtYmVyIG9mIG1hdHJpY2VzIGlzIGhhbGYgdGhlIG51bWJlciBzcGVjaWZpZWQgYnkgdGhpcyBjYXBhYmlsaXR5IGZsYWcuIElmIE1heFZlcnRleEJsZW5kTWF0cml4SW5kZXggaXMgc2V0IHRvIHplcm8sIHRoZSBkcml2ZXIgZG9lcyBub3Qgc3VwcG9ydCBpbmRleGVkIHZlcnRleCBibGVuZGluZy4gSWYgdGhpcyB2YWx1ZSBpcyBub3QgemVybyB0aGVuIHRoZSB2YWxpZCByYW5nZSBvZiBpbmRpY2VzIGlzIHplcm8gdGhyb3VnaCBNYXhWZXJ0ZXhCbGVuZE1hdHJpeEluZGV4LgoJCWNhcHMuTWF4UG9pbnRTaXplID0gODE5Mi4wZjsJCQkJCS8vIE1heGltdW0gc2l6ZSBvZiBhIHBvaW50IHByaW1pdGl2ZS4gSWYgc2V0IHRvIDEuMGYgdGhlbiBkZXZpY2UgZG9lcyBub3Qgc3VwcG9ydCBwb2ludCBzaXplIGNvbnRyb2wuIFRoZSByYW5nZSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gMS4wZi4KCQljYXBzLk1heFByaW1pdGl2ZUNvdW50ID0gMSA8PCAyMTsJCQkJLy8gTWF4aW11bSBudW1iZXIgb2YgcHJpbWl0aXZlcyBmb3IgZWFjaCBJRGlyZWN0M0REZXZpY2U4OjpEcmF3UHJpbWl0aXZlIGNhbGwuIE5vdGUgdGhhdCB3aGVuIERpcmVjdDNEIGlzIHdvcmtpbmcgd2l0aCBhIERpcmVjdFggNi4wIG9yIERpcmVjdFggNy4wIGRyaXZlciwgdGhpcyBmaWVsZCBpcyBzZXQgdG8gMHhGRkZGLiBUaGlzIG1lYW5zIHRoYXQgbm90IG9ubHkgdGhlIG51bWJlciBvZiBwcmltaXRpdmVzIGJ1dCBhbHNvIHRoZSBudW1iZXIgb2YgdmVydGljZXMgaXMgbGltaXRlZCBieSB0aGlzIHZhbHVlLgoJCWNhcHMuTWF4VmVydGV4SW5kZXggPSAxIDw8IDI0OwkJCQkJLy8gTWF4aW11bSBzaXplIG9mIGluZGljZXMgc3VwcG9ydGVkIGZvciBoYXJkd2FyZSB2ZXJ0ZXggcHJvY2Vzc2luZy4gSXQgaXMgcG9zc2libGUgdG8gY3JlYXRlIDMyLWJpdCBpbmRleCBidWZmZXJzIGJ5IHNwZWNpZnlpbmcgRDNERk1UX0lOREVYMzI7IGhvd2V2ZXIsIHlvdSB3aWxsIG5vdCBiZSBhYmxlIHRvIHJlbmRlciB3aXRoIHRoZSBpbmRleCBidWZmZXIgdW5sZXNzIHRoaXMgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIDB4MDAwMEZGRkYuCgkJY2Fwcy5NYXhTdHJlYW1zID0gMTY7CQkJCQkJCS8vIE1heGltdW0gbnVtYmVyIG9mIGNvbmN1cnJlbnQgZGF0YSBzdHJlYW1zIGZvciBJRGlyZWN0M0REZXZpY2U4OjpTZXRTdHJlYW1Tb3VyY2UuIFRoZSB2YWxpZCByYW5nZSBpcyAxIHRvIDE2LiBOb3RlIHRoYXQgaWYgdGhpcyB2YWx1ZSBpcyAwLCB0aGVuIHRoZSBkcml2ZXIgaXMgbm90IGEgRGlyZWN0WCA5LjAgZHJpdmVyLgoJCWNhcHMuTWF4U3RyZWFtU3RyaWRlID0gNjU1MzY7CQkJCQkvLyBNYXhpbXVtIHN0cmlkZSBmb3IgSURpcmVjdDNERGV2aWNlODo6U2V0U3RyZWFtU291cmNlLgoJCWNhcHMuVmVydGV4U2hhZGVyVmVyc2lvbiA9IHZlcnRleFNoYWRlclZlcnNpb247CS8vIFR3byBudW1iZXJzIHRoYXQgcmVwcmVzZW50IHRoZSB2ZXJ0ZXggc2hhZGVyIG1haW4gYW5kIHN1YiB2ZXJzaW9ucy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGluc3RydWN0aW9ucyBzdXBwb3J0ZWQgZm9yIGVhY2ggdmVydGV4IHNoYWRlciB2ZXJzaW9uLCBzZWUgVmVyc2lvbiAxX3gsIFZlcnNpb24gMl8wLCBWZXJzaW9uIDJfMCBFeHRlbmRlZCwgb3IgVmVyc2lvbiAzXzAuCgkJY2Fwcy5NYXhWZXJ0ZXhTaGFkZXJDb25zdCA9IDI1NjsJCQkJLy8gVGhlIG51bWJlciBvZiB2ZXJ0ZXggc2hhZGVyIFJlZ2lzdGVycyB0aGF0IGFyZSByZXNlcnZlZCBmb3IgY29uc3RhbnRzLgoJCWNhcHMuUGl4ZWxTaGFkZXJWZXJzaW9uID0gcGl4ZWxTaGFkZXJWZXJzaW9uOwkvLyBUd28gbnVtYmVycyB0aGF0IHJlcHJlc2VudCB0aGUgcGl4ZWwgc2hhZGVyIG1haW4gYW5kIHN1YiB2ZXJzaW9ucy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGluc3RydWN0aW9ucyBzdXBwb3J0ZWQgZm9yIGVhY2ggcGl4ZWwgc2hhZGVyIHZlcnNpb24sIHNlZSBWZXJzaW9uIDFfeCwgVmVyc2lvbiAyXzAsIFZlcnNpb24gMl8wIEV4dGVuZGVkLCBvciBWZXJzaW9uIDNfMC4KCQljYXBzLk1heFBpeGVsU2hhZGVyVmFsdWUgPSA4LjA7CgkJCgkJKmNhcGFiaWxpdGllcyA9IGNhcHM7CgoJCXJldHVybiBEM0RfT0s7Cgl9CgoJbG9uZyBEaXJlY3QzRDg6OlJlZ2lzdGVyU29mdHdhcmVEZXZpY2Uodm9pZCAqaW5pdGlhbGl6ZUZ1bmN0aW9uKQoJewoJCVRSQUNFKCIiKTsKCgkJbG9hZFN5c3RlbUQzRDgoKTsKCgkJaWYoZDNkOCkKCQl7CgkJCXJldHVybiBkM2Q4LT5SZWdpc3RlclNvZnR3YXJlRGV2aWNlKGluaXRpYWxpemVGdW5jdGlvbik7CgkJfQoJCWVsc2UKCQl7CgkJCXJldHVybiBJTlZBTElEQ0FMTCgpOwoJCX0KCX0KCgl2b2lkIERpcmVjdDNEODo6bG9hZFN5c3RlbUQzRDgoKQoJewoJCWlmKGQzZDgpCgkJewoJCQlyZXR1cm47CgkJfQoKCQljaGFyIGQzZDhQYXRoW01BWF9QQVRIICsgMTZdOwoJCUdldFN5c3RlbURpcmVjdG9yeShkM2Q4UGF0aCwgTUFYX1BBVEgpOwoJCXN0cmNhdChkM2Q4UGF0aCwgIlxcZDNkOC5kbGwiKTsKCQlkM2Q4TGliID0gTG9hZExpYnJhcnkoZDNkOFBhdGgpOwoKCQlpZihkM2Q4TGliKQoJCXsKCQkJdHlwZWRlZiBJRGlyZWN0M0Q4KiAoX19zdGRjYWxsICpESVJFQ1QzRENSRUFURTgpKHVuc2lnbmVkIGludCk7CgkJCURJUkVDVDNEQ1JFQVRFOCBkaXJlY3QzRENyZWF0ZTggPSAoRElSRUNUM0RDUkVBVEU4KUdldFByb2NBZGRyZXNzKGQzZDhMaWIsICJEaXJlY3QzRENyZWF0ZTgiKTsKCQkJZDNkOCA9IGRpcmVjdDNEQ3JlYXRlOChEM0RfU0RLX1ZFUlNJT04pOwoJCX0KCX0KfQo=