I2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4KI2luY2x1ZGUgInVzYi5oIgojaW5jbHVkZSAic2NzaWdsdWUuaCIKI2luY2x1ZGUgInRyYW5zcG9ydC5oIgovLyNpbmNsdWRlICJpbml0LmgiCgovLyNpbmNsdWRlICJzdGRsaWIuaCIKLy8jaW5jbHVkZSAiRVVDUjZTSy5oIgojaW5jbHVkZSAic21jb21tb24uaCIKI2luY2x1ZGUgInNtaWwuaCIKCnZvaWQgICBfU2V0X0RfU3NmZGNSZENtZCAgICAgKEJZVEUpOwp2b2lkICAgX1NldF9EX1NzZmRjUmRBZGRyICAgIChCWVRFKTsKdm9pZCAgIF9TZXRfRF9Tc2ZkY1JkQ2hpcCAgICAodm9pZCk7CnZvaWQgICBfU2V0X0RfU3NmZGNSZFN0YW5kYnkgKHZvaWQpOwp2b2lkICAgX1N0YXJ0X0RfU3NmZGNSZEh3RUNDICh2b2lkKTsKdm9pZCAgIF9TdG9wX0RfU3NmZGNSZEh3RUNDICAodm9pZCk7CnZvaWQgICBfTG9hZF9EX1NzZmRjUmRId0VDQyAgKEJZVEUpOwp2b2lkICAgX1NldF9EX1NzZmRjV3JDbWQgICAgIChCWVRFKTsKdm9pZCAgIF9TZXRfRF9Tc2ZkY1dyQWRkciAgICAoQllURSk7CnZvaWQgICBfU2V0X0RfU3NmZGNXckJsb2NrICAgKHZvaWQpOwp2b2lkICAgX1NldF9EX1NzZmRjV3JTdGFuZGJ5ICh2b2lkKTsKdm9pZCAgIF9TdGFydF9EX1NzZmRjV3JId0VDQyAodm9pZCk7CnZvaWQgICBfTG9hZF9EX1NzZmRjV3JId0VDQyAgKEJZVEUpOwppbnQgICAgX0NoZWNrX0RfU3NmZGNCdXN5ICAgIChXT1JEKTsKaW50ICAgIF9DaGVja19EX1NzZmRjU3RhdHVzICAodm9pZCk7CnZvaWQgICBfUmVzZXRfRF9Tc2ZkY0VyciAgICAgKHZvaWQpOwp2b2lkICAgX1JlYWRfRF9Tc2ZkY0J1ZiAgICAgIChCWVRFICopOwp2b2lkICAgX1dyaXRlX0RfU3NmZGNCdWYgICAgIChCWVRFICopOwp2b2lkICAgX1JlYWRfRF9Tc2ZkY0J5dGUgICAgIChCWVRFICopOwp2b2lkICAgX1JlYWRSZWR0X0RfU3NmZGNCdWYgIChCWVRFICopOwp2b2lkICAgX1dyaXRlUmVkdF9EX1NzZmRjQnVmIChCWVRFICopOwpCWVRFICAgX0NoZWNrX0RfRGV2Q29kZSAgICAgIChCWVRFKTsKCnZvaWQgICBfU2V0X0RfRUNDZGF0YSAgICAgICAgKEJZVEUsQllURSAqKTsKdm9pZCAgIF9DYWxjX0RfRUNDZGF0YSAgICAgICAoQllURSAqKTsKCi8vdm9pZCAgIFNNX1JlYWREYXRhV2l0aERNQSAgICAgIChQRkRPX0RFVklDRV9FWFRFTlNJT04sIEJZVEUgKiwgV09SRCk7Ci8vdm9pZCAgIFNNX1dyaXRlRGF0YVdpdGhETUEgICAgIChQRkRPX0RFVklDRV9FWFRFTlNJT04sIEJZVEUgKiwgV09SRCk7Ci8vCnN0cnVjdCBTU0ZEQ1RZUEUgICAgICAgICAgICAgICAgU3NmZGM7CnN0cnVjdCBBRERSRVNTICAgICAgICAgICAgICAgICAgTWVkaWE7CnN0cnVjdCBDSVNfQVJFQSAgICAgICAgICAgICAgICAgQ2lzQXJlYTsKCnN0YXRpYyBCWVRFICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVjY0J1Zls2XTsKZXh0ZXJuIFBCWVRFICAgICAgICAgICAgICAgICAgICBTTUhvc3RBZGRyOwpleHRlcm4gRFdPUkQgICAgICAgICAgICAgICAgICAgIEVyclhEQ29kZTsKCmV4dGVybiBXT1JEICBSZWFkQmxvY2s7CmV4dGVybiBXT1JEICBXcml0ZUJsb2NrOwoKLy9LRVZFTlQgICAgICAgICAgICAgICAgICAgICAgICAgIFNNX0RNQURvbmVFdmVudDsKCiNkZWZpbmUgRVZFTiAgICAgICAgICAgICAgICAgICAgMCAgICAgICAgICAgICAvLyBFdmVuIFBhZ2UgZm9yIDI1NmJ5dGUvcGFnZQojZGVmaW5lIE9ERCAgICAgICAgICAgICAgICAgICAgIDEgICAgICAgICAgICAgLy8gT2RkIFBhZ2UgZm9yIDI1NmJ5dGUvcGFnZQoKCi8vU21hcnRNZWRpYSBSZWR1bmRhbnQgYnVmZmVyIGRhdGEgQ29udHJvbCBTdWJyb3V0aW5lCi8vLS0tLS0gQ2hlY2tfRF9EYXRhQmxhbmsoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgQ2hlY2tfRF9EYXRhQmxhbmsoQllURSAqcmVkdW5kYW50KQp7CgljaGFyIGk7CgoJZm9yKGk9MDsgaTxSRURUU0laRTsgaSsrKQoJCWlmICgqcmVkdW5kYW50KyshPTB4RkYpCgkJCXJldHVybihFUlJPUik7CgoJcmV0dXJuKFNNU1VDQ0VTUyk7Cn0KCi8vLS0tLS0gQ2hlY2tfRF9GYWlsQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgQ2hlY2tfRF9GYWlsQmxvY2soQllURSAqcmVkdW5kYW50KQp7CglyZWR1bmRhbnQrPVJFRFRfQkxPQ0s7CgoJaWYgKCpyZWR1bmRhbnQ9PTB4RkYpCgkJcmV0dXJuKFNNU1VDQ0VTUyk7CglpZiAoISpyZWR1bmRhbnQpCgkJcmV0dXJuKEVSUk9SKTsKCWlmIChod2VpZ2h0OCgqcmVkdW5kYW50KTw3KQoJCXJldHVybihFUlJPUik7CgoJcmV0dXJuKFNNU1VDQ0VTUyk7Cn0KCi8vLS0tLS0gQ2hlY2tfRF9EYXRhU3RhdHVzKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgQ2hlY2tfRF9EYXRhU3RhdHVzKEJZVEUgKnJlZHVuZGFudCkKewoJcmVkdW5kYW50Kz1SRURUX0RBVEE7CgoJaWYgKCpyZWR1bmRhbnQ9PTB4RkYpCgkJcmV0dXJuKFNNU1VDQ0VTUyk7CglpZiAoISpyZWR1bmRhbnQpCgl7CgkJRXJyWERDb2RlID0gRVJSX0RhdGFTdGF0dXM7CgkJcmV0dXJuKEVSUk9SKTsKCX0KCWVsc2UKCQlFcnJYRENvZGUgPSBOT19FUlJPUjsKCglpZiAoaHdlaWdodDgoKnJlZHVuZGFudCk8NSkKCQlyZXR1cm4oRVJST1IpOwoKCXJldHVybihTTVNVQ0NFU1MpOwp9CgovLy0tLS0tIExvYWRfRF9Mb2dCbG9ja0FkZHIoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IExvYWRfRF9Mb2dCbG9ja0FkZHIoQllURSAqcmVkdW5kYW50KQp7CglXT1JEIGFkZHIxLGFkZHIyOwoJLy9TU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKCS8vQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7CgoJYWRkcjE9KFdPUkQpKihyZWR1bmRhbnQrUkVEVF9BRERSMUgpKjB4MDEwMCsoV09SRCkqKHJlZHVuZGFudCtSRURUX0FERFIxTCk7CglhZGRyMj0oV09SRCkqKHJlZHVuZGFudCtSRURUX0FERFIySCkqMHgwMTAwKyhXT1JEKSoocmVkdW5kYW50K1JFRFRfQUREUjJMKTsKCglpZiAoYWRkcjE9PWFkZHIyKQoJCWlmICgoYWRkcjEgJjB4RjAwMCk9PTB4MTAwMCkKCQl7IE1lZGlhLkxvZ0Jsb2NrPShhZGRyMSAmMHgwRkZGKS8yOyByZXR1cm4oU01TVUNDRVNTKTsgfQoKCWlmIChod2VpZ2h0MTYoKFdPUkQpKGFkZHIxXmFkZHIyKSkhPTB4MDEpIHJldHVybihFUlJPUik7CgoJaWYgKChhZGRyMSAmMHhGMDAwKT09MHgxMDAwKQoJCWlmICghKGh3ZWlnaHQxNihhZGRyMSkgJjB4MDEpKQoJCXsgTWVkaWEuTG9nQmxvY2s9KGFkZHIxICYweDBGRkYpLzI7IHJldHVybihTTVNVQ0NFU1MpOyB9CgoJaWYgKChhZGRyMiAmMHhGMDAwKT09MHgxMDAwKQoJCWlmICghKGh3ZWlnaHQxNihhZGRyMikgJjB4MDEpKQoJCXsgTWVkaWEuTG9nQmxvY2s9KGFkZHIyICYweDBGRkYpLzI7IHJldHVybihTTVNVQ0NFU1MpOyB9CgoJcmV0dXJuKEVSUk9SKTsKfQoKLy8tLS0tLSBDbHJfRF9SZWR1bmRhbnREYXRhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnZvaWQgQ2xyX0RfUmVkdW5kYW50RGF0YShCWVRFICpyZWR1bmRhbnQpCnsKCWNoYXIgaTsKCglmb3IoaT0wOyBpPFJFRFRTSVpFOyBpKyspCgkqKHJlZHVuZGFudCtpKT0weEZGOwp9CgovLy0tLS0tIFNldF9EX0xvZ0Jsb2NrQWRkcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kdm9pZCBTZXRfRF9Mb2dCbG9ja0FkZHIoQllURSAqcmVkdW5kYW50KQp7CglXT1JEIGFkZHI7CgoJKihyZWR1bmRhbnQrUkVEVF9CTE9DSyk9MHhGRjsKCSoocmVkdW5kYW50K1JFRFRfREFUQSkgPTB4RkY7CglhZGRyPU1lZGlhLkxvZ0Jsb2NrKjIrMHgxMDAwOwoKCWlmICgoaHdlaWdodDE2KGFkZHIpJTIpKQoJCWFkZHIrKzsKCgkqKHJlZHVuZGFudCtSRURUX0FERFIxSCk9KihyZWR1bmRhbnQrUkVEVF9BRERSMkgpPShCWVRFKShhZGRyLzB4MDEwMCk7CgkqKHJlZHVuZGFudCtSRURUX0FERFIxTCk9KihyZWR1bmRhbnQrUkVEVF9BRERSMkwpPShCWVRFKWFkZHI7Cn0KCi8vLS0tLS0gU2V0X0RfRmFpbEJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIFNldF9EX0ZhaWxCbG9jayhCWVRFICpyZWR1bmRhbnQpCnsKICAgIGNoYXIgaTsKCiAgICBmb3IoaT0wOyBpPFJFRFRTSVpFOyBpKyspCiAgICAgICAgKnJlZHVuZGFudCsrPShCWVRFKSgoaT09UkVEVF9CTE9DSyk/MHhGMDoweEZGKTsKfQoKLy8tLS0tLSBTZXRfRF9EYXRhU3RhdXMoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnZvaWQgU2V0X0RfRGF0YVN0YXVzKEJZVEUgKnJlZHVuZGFudCkKewogICAgcmVkdW5kYW50Kz1SRURUX0RBVEE7CiAgICAqcmVkdW5kYW50PTB4MDA7Cn0KCi8vU21hcnRNZWRpYSBGdW5jdGlvbiBDb21tYW5kIFN1YnJvdXRpbmUKLy8gNjI1MCBDTUQgNgovLy0tLS0tIFNzZmRjX0RfUmVzZXQoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0Kdm9pZCBTc2ZkY19EX1Jlc2V0KHN0cnVjdCB1c19kYXRhICp1cykKewoJLy9OVFNUQVRVUyAgICAgICAgbnRTdGF0dXMgPSBTVEFUVVNfU1VDQ0VTUzsKCS8vUEJVTEtfQ0JXICAgICAgIHBCdWxrQ2J3ID0gZmRvRXh0LT5wQnVsa0NidzsKCS8vQllURSAgICAgICAgICAgIGJ1ZlsweDIwMF07CgoJLy9wcmludGsoIlNzZmRjX0RfUmVzZXQgLS0tIEJ1dCBkbyBub3RoaW5nICEhXG4iKTsKCXJldHVybjsKLyoJUnRsWmVyb01lbW9yeShwQnVsa0Nidywgc2l6ZW9mKHN0cnVjdCBfQlVMS19DQlcpKTsKCXBCdWxrQ2J3LT5kQ0JXU2lnbmF0dXJlICAgICAgICAgID0gQ0JXX1NJR05UVVJFOwoJcEJ1bGtDYnctPmJDQldMdW4gICAgICAgICAgICAgICAgPSBDQldfTFVOOwoJLy9wQnVsa0Nidy0+ZENCV0RhdGFUcmFuc2Zlckxlbmd0aCA9IDB4MjAwOwoJcEJ1bGtDYnctPmJtQ0JXRmxhZ3MgICAgICAgICAgICAgPSAweDgwOwoJcEJ1bGtDYnctPkNCV0NiWzBdICAgICAgICAgICAgICAgPSAweEYyOwoJcEJ1bGtDYnctPkNCV0NiWzFdICAgICAgICAgICAgICAgPSAweDA3OwoKCW50U3RhdHVzID0gRU5FX1NlbmRTY3NpQ21kKGZkb0V4dCwgRkRJUl9SRUFELCBOVUxMKTsKCglpZiAoIU5UX1NVQ0NFU1MobnRTdGF0dXMpKQoJewoJCUVORV9QcmludCgiU3NmZGNfRF9SZXNldCBGYWlsICEhXG4iKTsKCQkvL3JldHVybiBudFN0YXR1czsKCX0qLwp9CgovLy0tLS0tIFNzZmRjX0RfUmVhZENpc1NlY3QoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFNzZmRjX0RfUmVhZENpc1NlY3Qoc3RydWN0IHVzX2RhdGEgKnVzLCBCWVRFICpidWYsQllURSAqcmVkdW5kYW50KQp7CglCWVRFIHpvbmUsc2VjdG9yOwoJV09SRCBibG9jazsKCS8vU1NGRENUWVBFX1QgYWEgPSAoU1NGRENUWVBFX1QgKSAmU3NmZGM7CgkvL0FERFJFU1NfVCAgIGJiID0gKEFERFJFU1NfVCkgJk1lZGlhOwoKCXpvbmU9TWVkaWEuWm9uZTsgYmxvY2s9TWVkaWEuUGh5QmxvY2s7IHNlY3Rvcj1NZWRpYS5TZWN0b3I7CglNZWRpYS5ab25lPTA7CglNZWRpYS5QaHlCbG9jaz1DaXNBcmVhLlBoeUJsb2NrOwoJTWVkaWEuU2VjdG9yPUNpc0FyZWEuU2VjdG9yOwoKCWlmIChTc2ZkY19EX1JlYWRTZWN0KHVzLGJ1ZixyZWR1bmRhbnQpKQoJewoJCU1lZGlhLlpvbmU9em9uZTsgTWVkaWEuUGh5QmxvY2s9YmxvY2s7IE1lZGlhLlNlY3Rvcj1zZWN0b3I7CgkJcmV0dXJuKEVSUk9SKTsKCX0KCglNZWRpYS5ab25lPXpvbmU7IE1lZGlhLlBoeUJsb2NrPWJsb2NrOyBNZWRpYS5TZWN0b3I9c2VjdG9yOwoJcmV0dXJuKFNNU1VDQ0VTUyk7Cn0KLyoKLy8vLy0tLS0tIFNzZmRjX0RfV3JpdGVSZWR0TW9kZSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIFNzZmRjX0RfV3JpdGVSZWR0TW9kZSh2b2lkKQovL3sKLy8gICAgX1NldF9EX1NzZmRjUmRDbWQgICAgIChSU1RfQ0hJUCk7Ci8vICAgIF9DaGVja19EX1NzZmRjQnVzeSAgICAoQlVTWV9SRVNFVCk7Ci8vICAgIF9TZXRfRF9Tc2ZkY1JkQ21kICAgICAoUkVBRF9SRURUKTsKLy8gICAgX0NoZWNrX0RfU3NmZGNCdXN5ICAgIChCVVNZX1JFQUQpOwovLyAgICBfU2V0X0RfU3NmZGNSZFN0YW5kYnkgKCk7Ci8vfQovLwovLy8vLS0tLS0gU3NmZGNfRF9SZWFkSUQoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgU3NmZGNfRF9SZWFkSUQoQllURSAqYnVmLCBCWVRFIFJlYWRJRCkKLy97Ci8vICAgIF9TZXRfRF9Tc2ZkY1JkQ21kICAgICAoUmVhZElEKTsKLy8gICAgX1NldF9EX1NzZmRjUmRDaGlwICAgICgpOwovLyAgICBfUmVhZF9EX1NzZmRjQnl0ZSAgICAgKGJ1ZisrKTsKLy8gICAgX1JlYWRfRF9Tc2ZkY0J5dGUgICAgIChidWYrKyk7Ci8vICAgIF9SZWFkX0RfU3NmZGNCeXRlICAgICAoYnVmKyspOwovLyAgICBfUmVhZF9EX1NzZmRjQnl0ZSAgICAgKGJ1Zik7Ci8vICAgIF9TZXRfRF9Tc2ZkY1JkU3RhbmRieSAoKTsKLy99CiovCi8vIDYyNTAgQ01EIDEKLy8tLS0tLSBTc2ZkY19EX1JlYWRTZWN0KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBTc2ZkY19EX1JlYWRTZWN0KHN0cnVjdCB1c19kYXRhICp1cywgQllURSAqYnVmLEJZVEUgKnJlZHVuZGFudCkKewoJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwoJaW50CXJlc3VsdDsKCVdPUkQJYWRkcjsKCglyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIFNNX1JXX1BBVFRFUk4pOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgl7CgkJcHJpbnRrKCJMb2FkIFNNIFJXIENvZGUgRmFpbCAhIVxuIik7CgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCX0KCglhZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7CglhZGRyID0gYWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzK01lZGlhLlNlY3RvcjsKCgkvLyBSZWFkIHNlY3QgZGF0YQoJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKCWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoCT0gMHgyMDA7CgliY2ItPkZsYWdzCQkJPSAweDgwOwoJYmNiLT5DREJbMF0JCQk9IDB4RjE7CgliY2ItPkNEQlsxXQkJCT0gMHgwMjsKCWJjYi0+Q0RCWzRdCQkJPSAoQllURSlhZGRyOwoJYmNiLT5DREJbM10JCQk9IChCWVRFKShhZGRyLzB4MDEwMCk7CgliY2ItPkNEQlsyXQkJCT0gTWVkaWEuWm9uZS8yOwoKCXJlc3VsdCA9IEVORV9TZW5kU2NzaUNtZCh1cywgRkRJUl9SRUFELCBidWYsIDApOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCgkvLyBSZWFkIHJlZHVuZGFudAoJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKCWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoCT0gMHgxMDsKCWJjYi0+RmxhZ3MJCQk9IDB4ODA7CgliY2ItPkNEQlswXQkJCT0gMHhGMTsKCWJjYi0+Q0RCWzFdCQkJPSAweDAzOwoJYmNiLT5DREJbNF0JCQk9IChCWVRFKWFkZHI7CgliY2ItPkNEQlszXQkJCT0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKCWJjYi0+Q0RCWzJdCQkJPSBNZWRpYS5ab25lLzI7CgliY2ItPkNEQls4XQkJCT0gMDsKCWJjYi0+Q0RCWzldCQkJPSAxOwoKCXJlc3VsdCA9IEVORV9TZW5kU2NzaUNtZCh1cywgRkRJUl9SRUFELCByZWR1bmRhbnQsIDApOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCglyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7Cn0KCi8vLS0tLS0gU3NmZGNfRF9SZWFkQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFNzZmRjX0RfUmVhZEJsb2NrKHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBjb3VudCwgQllURSAqYnVmLEJZVEUgKnJlZHVuZGFudCkKewoJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwoJaW50CXJlc3VsdDsKCVdPUkQJYWRkcjsKCgkvL3ByaW50aygiU3NmZGNfRF9SZWFkQmxvY2tcbiIpOwoJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBTTV9SV19QQVRURVJOKTsKCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQoJewoJCXByaW50aygiTG9hZCBTTSBSVyBDb2RlIEZhaWwgISFcbiIpOwoJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7Cgl9CgoJYWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK01lZGlhLlBoeUJsb2NrOwoJYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycytNZWRpYS5TZWN0b3I7CgoJLy8gUmVhZCBzZWN0IGRhdGEKCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CgliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CgliY2ItPkRhdGFUcmFuc2Zlckxlbmd0aAk9IDB4MjAwKmNvdW50OwoJYmNiLT5GbGFncwkJCT0gMHg4MDsKCWJjYi0+Q0RCWzBdCQkJPSAweEYxOwoJYmNiLT5DREJbMV0JCQk9IDB4MDI7CgliY2ItPkNEQls0XQkJCT0gKEJZVEUpYWRkcjsKCWJjYi0+Q0RCWzNdCQkJPSAoQllURSkoYWRkci8weDAxMDApOwoJYmNiLT5DREJbMl0JCQk9IE1lZGlhLlpvbmUvMjsKCglyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfUkVBRCwgYnVmLCAwKTsKCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQoJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CgoJLy8gUmVhZCByZWR1bmRhbnQKCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CgliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CgliY2ItPkRhdGFUcmFuc2Zlckxlbmd0aAk9IDB4MTA7CgliY2ItPkZsYWdzCQkJPSAweDgwOwoJYmNiLT5DREJbMF0JCQk9IDB4RjE7CgliY2ItPkNEQlsxXQkJCT0gMHgwMzsKCWJjYi0+Q0RCWzRdCQkJPSAoQllURSlhZGRyOwoJYmNiLT5DREJbM10JCQk9IChCWVRFKShhZGRyLzB4MDEwMCk7CgliY2ItPkNEQlsyXQkJCT0gTWVkaWEuWm9uZS8yOwoJYmNiLT5DREJbOF0JCQk9IDA7CgliY2ItPkNEQls5XQkJCT0gMTsKCglyZXN1bHQgPSBFTkVfU2VuZFNjc2lDbWQodXMsIEZESVJfUkVBRCwgcmVkdW5kYW50LCAwKTsKCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQoJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CgoJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwp9Ci8qCi8vLy8tLS0tLSBTc2ZkY19EX1JlYWRTZWN0X0RNQSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBTc2ZkY19EX1JlYWRTZWN0X0RNQShQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0LCBCWVRFICpidWYsQllURSAqcmVkdW5kYW50KQovL3sKLy8gICAgV09SRCAgICBTZWN0Qnl0ZUNvdW50LCBhZGRyOwovLyAgICBEV09SRCAgIEJ1ZmZlcls0XTsKLy8gICAgV09SRCAgICBsZW47Ci8vCi8vICAgIGlmICghX0h3X0RfQ2hrQ2FyZEluKCkpCi8vICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgIGFkZHI9KFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7Ci8vICAgIGFkZHI9YWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzK01lZGlhLlNlY3RvcjsKLy8gICAgLy8gY3ljbGUgc3RhcnRpbmcgYWRkcmVzcwovLyAgICBTTV9TVEFSVEFERFJfTFNCID0gMHgwMDsKLy8gICAgU01fU1RBUlRBRERSX0lJU0IgPSAoQllURSlhZGRyOwovLyAgICBTTV9TVEFSVEFERFJfSUlJU0IgPSAoQllURSkoYWRkci8weDAxMDApOwovLyAgICBTTV9TVEFSVEFERFJfTVNCID0gTWVkaWEuWm9uZS8yOwovLwovLyAgICAvL1NlY3RvciBieXRlIGNvdW50ID0gMHgyMDAoRE1BKQovLyAgICBTZWN0Qnl0ZUNvdW50ID0gMHgyMGY7Ci8vICAgIFNNX0JZVEVDTlRfTE8gPSAoQllURSlTZWN0Qnl0ZUNvdW50OwovLyAgICBTTV9DTURfQ1RSTDMgPSAoU01fQ01EX0NUUkwzICYgMHhGQykgfCAoQllURSkoU2VjdEJ5dGVDb3VudC8weDAxMDApOwovLyAgICBpZiAoICgoZmRvRXh0LT5DaGlwSUQ9PVJFQURFUl9DQjcxMikmJihmZG9FeHQtPlJldklEPT1DSElQX0EpKSB8fCBmZG9FeHQtPklzSGliZXJuYXRlICkKLy8gICAgICAgU01fRklGT19DVFJMID0gKFNNX0FQQjA4X01BU0sgfCBTTV9ETUFFTl9NQVNLIHwgU01fRE1BX1VQU1RSRUFNX01BU0sgfCBTTV9GSUZPU0hMRFZMVV84X01BU0spOwovLyAgICBlbHNlCi8vICAgICAgIFNNX0ZJRk9fQ1RSTCA9IChTTV9BUEIzMl9NQVNLIHwgU01fRE1BRU5fTUFTSyB8IFNNX0RNQV9VUFNUUkVBTV9NQVNLIHwgU01fRklGT1NITERWTFVfOF9NQVNLKTsKLy8KLy8gICAgX0h3X0RfRWNjUmRSZXNldCgpOwovLyAgICBfSHdfRF9FY2NSZFN0YXJ0KCk7Ci8vCi8vICAgIFNNX0NNRF9DVFJMMSA9IChTTV9DTURfUkVBRF8xKTsKLy8gICAgU01fQ01EX0NUUkwxID0gKFNNX0NNRF9SRUFEXzEgfCBTTV9DTURfU1RBUlRfQklUKTsKLy8KLy8gICAgU2VjdEJ5dGVDb3VudCA9IDB4MWZmOwovLyAgICAvL1NNX1JlYWREYXRhV2l0aERNQShmZG9FeHQsIGJ1ZiwgU2VjdEJ5dGVDb3VudCk7Ci8vICAgIC8vX1JlYWRSZWR0X0RfU3NmZGNCdWYocmVkdW5kYW50KTsKLy8gICAgbGVuID0gMHgxMDAwIC0gKChXT1JEKShidWYpICYgMHgwRkZGKTsKLy8gICAgaWYgKGxlbiA8IDB4MjAwKQovLyAgICB7Ci8vICAgICAgIFNNX1JlYWREYXRhV2l0aERNQShmZG9FeHQsIGJ1ZiwgbGVuLTEpOwovLyAgICAgICBTTV9SZWFkRGF0YVdpdGhETUEoZmRvRXh0LCBidWYrbGVuLCBTZWN0Qnl0ZUNvdW50LWxlbik7Ci8vICAgICAgIC8vRU5FX1ByaW50KCJSZWFkIERNQSAhISEgYnVmMSA9ICVwLCBsZW4gPSAleCwgYnVmMiA9ICVwXG4iLCBidWYsIGxlbiwgYnVmK2xlbik7Ci8vICAgIH0KLy8gICAgZWxzZQovLyAgICAgIFNNX1JlYWREYXRhV2l0aERNQShmZG9FeHQsIGJ1ZiwgU2VjdEJ5dGVDb3VudCk7Ci8vCi8vICAgIGlmICggKChmZG9FeHQtPkNoaXBJRD09UkVBREVSX0NCNzEyKSYmKGZkb0V4dC0+UmV2SUQ9PUNISVBfQSkpIHx8IGZkb0V4dC0+SXNIaWJlcm5hdGUgKQovLyAgICB7Ci8vICAgICAgIF9SZWFkUmVkdF9EX1NzZmRjQnVmKHJlZHVuZGFudCk7Ci8vICAgIH0KLy8gICAgZWxzZQovLyAgICB7Ci8vICAgICAgIEJ1ZmZlclswXSA9IFJFQURfUE9SVF9EV09SRChTTV9SRUdfREFUQSk7Ci8vICAgICAgIEJ1ZmZlclsxXSA9IFJFQURfUE9SVF9EV09SRChTTV9SRUdfREFUQSk7Ci8vICAgICAgIEJ1ZmZlclsyXSA9IFJFQURfUE9SVF9EV09SRChTTV9SRUdfREFUQSk7Ci8vICAgICAgIEJ1ZmZlclszXSA9IFJFQURfUE9SVF9EV09SRChTTV9SRUdfREFUQSk7Ci8vICAgICAgIG1lbWNweShyZWR1bmRhbnQsIEJ1ZmZlciwgMHgxMCk7Ci8vICAgIH0KLy8KLy8gICAgd2hpbGUgKCBfSHdfRF9DaGtDYXJkSW4oKSApCi8vICAgIHsKLy8gICAgICAgIGlmKChSRUFEX1BPUlRfQllURShTTV9SRUdfSU5UX1NUQVRVUykgJiAweDEwKSkKLy8gICAgICAgIHsKLy8gICAgICAgICAgICBXUklURV9QT1JUX0JZVEUoU01fUkVHX0lOVF9TVEFUVVMsIDB4MTApOwovLyAgICAgICAgICAgIGJyZWFrOwovLyAgICAgICAgfQovLyAgICB9Ci8vICAgIF9Id19EX0VjY1JkU3RvcCgpOwovLyAgICBfSHdfRF9TZXRSZFN0YW5kYnkoKTsKLy8gICAgX0xvYWRfRF9Tc2ZkY1JkSHdFQ0MoRVZFTik7Ci8vCi8vICAgIF9DYWxjX0RfRUNDZGF0YShidWYpOwovLyAgICBfU2V0X0RfU3NmZGNSZFN0YW5kYnkoKTsKLy8KLy8gICAgaWYgKCFfSHdfRF9DaGtDYXJkSW4oKSkKLy8gICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgcmV0dXJuKFNNU1VDQ0VTUyk7Ci8vfQovLwovLy8vLS0tLS0gU3NmZGNfRF9SZWFkU2VjdF9QSU8oKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgU3NmZGNfRF9SZWFkU2VjdF9QSU8oUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCwgQllURSAqYnVmLEJZVEUgKnJlZHVuZGFudCkKLy97Ci8vICAgIF9TZXRfRF9Tc2ZkY1JkQ21kKFJFQUQpOwovLyAgICBfU2V0X0RfU3NmZGNSZEFkZHIoRVZFTik7Ci8vCi8vICAgIGlmIChfQ2hlY2tfRF9Tc2ZkY0J1c3koQlVTWV9SRUFEKSkKLy8gICAgeyBfUmVzZXRfRF9Tc2ZkY0VycigpOyByZXR1cm4oRVJST1IpOyB9Ci8vCi8vICAgIF9TdGFydF9EX1NzZmRjUmRId0VDQygpOwovLyAgICBfUmVhZF9EX1NzZmRjQnVmKGJ1Zik7Ci8vICAgIF9TdG9wX0RfU3NmZGNSZEh3RUNDKCk7Ci8vICAgIF9SZWFkUmVkdF9EX1NzZmRjQnVmKHJlZHVuZGFudCk7Ci8vICAgIF9Mb2FkX0RfU3NmZGNSZEh3RUNDKEVWRU4pOwovLwovLyAgICBpZiAoX0NoZWNrX0RfU3NmZGNCdXN5KEJVU1lfUkVBRCkpCi8vICAgIHsgX1Jlc2V0X0RfU3NmZGNFcnIoKTsgcmV0dXJuKEVSUk9SKTsgfQovLwovLyAgICBfQ2FsY19EX0VDQ2RhdGEoYnVmKTsKLy8gICAgX1NldF9EX1NzZmRjUmRTdGFuZGJ5KCk7Ci8vICAgIHJldHVybihTTVNVQ0NFU1MpOwovL30KCi8vIDYyNTAgQ01EIDMKLy8tLS0tLSBTc2ZkY19EX1dyaXRlU2VjdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBTc2ZkY19EX1dyaXRlU2VjdChQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0LCBCWVRFICpidWYsQllURSAqcmVkdW5kYW50KQp7CiAgICBQQlVMS19DQlcgICAgICAgICAgICAgICBwQnVsa0NidyA9IGZkb0V4dC0+cEJ1bGtDYnc7CiAgICBOVFNUQVRVUyAgICAgICAgICAgICAgICBudFN0YXR1czsKICAgIFdPUkQgICAgICAgICAgICAgICAgICAgIGFkZHI7CgogICAgLy9FTkVfUHJpbnQoIlNNSUxTVUIgLS0tIFNzZmRjX0RfV3JpdGVTZWN0XG4iKTsKICAgIEVORV9Mb2FkQmluQ29kZShmZG9FeHQsIFNNX1JXX1BBVFRFUk4pOwoKICAgIGFkZHIgPSAoV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcytNZWRpYS5QaHlCbG9jazsKICAgIGFkZHIgPSBhZGRyKihXT1JEKVNzZmRjLk1heFNlY3RvcnMrTWVkaWEuU2VjdG9yOwoKICAgIC8vIFdyaXRlIHNlY3QgZGF0YQogICAgUnRsWmVyb01lbW9yeShwQnVsa0Nidywgc2l6ZW9mKHN0cnVjdCBfQlVMS19DQlcpKTsKICAgIHBCdWxrQ2J3LT5kQ0JXU2lnbmF0dXJlICAgICAgICAgID0gQ0JXX1NJR05UVVJFOwogICAgcEJ1bGtDYnctPmJDQldMdW4gICAgICAgICAgICAgICAgPSBDQldfTFVOOwogICAgcEJ1bGtDYnctPmRDQldEYXRhVHJhbnNmZXJMZW5ndGggPSAweDIwMDsKICAgIHBCdWxrQ2J3LT5ibUNCV0ZsYWdzICAgICAgICAgICAgID0gMHgwMDsKICAgIHBCdWxrQ2J3LT5DQldDYlswXSAgICAgICAgICAgICAgID0gMHhGMDsKICAgIHBCdWxrQ2J3LT5DQldDYlsxXSAgICAgICAgICAgICAgID0gMHgwNDsKICAgIC8vcEJ1bGtDYnctPkNCV0NiWzRdICAgICAgICAgICAgICAgPSAoQllURSlhZGRyOwogICAgLy9wQnVsa0Nidy0+Q0JXQ2JbM10gICAgICAgICAgICAgICA9IChCWVRFKShhZGRyLzB4MDEwMCk7CiAgICAvL3BCdWxrQ2J3LT5DQldDYlsyXSAgICAgICAgICAgICAgID0gTWVkaWEuWm9uZS8yOwogICAgLy9wQnVsa0Nidy0+Q0JXQ2JbNV0gICAgICAgICAgICAgICA9ICoocmVkdW5kYW50K1JFRFRfQUREUjFIKTsKICAgIC8vcEJ1bGtDYnctPkNCV0NiWzZdICAgICAgICAgICAgICAgPSAqKHJlZHVuZGFudCtSRURUX0FERFIxTCk7CiAgICBwQnVsa0Nidy0+Q0JXQ2JbN10gICAgICAgICAgICAgICA9IChCWVRFKWFkZHI7CiAgICBwQnVsa0Nidy0+Q0JXQ2JbNl0gICAgICAgICAgICAgICA9IChCWVRFKShhZGRyLzB4MDEwMCk7CiAgICBwQnVsa0Nidy0+Q0JXQ2JbNV0gICAgICAgICAgICAgICA9IE1lZGlhLlpvbmUvMjsKICAgIHBCdWxrQ2J3LT5DQldDYls4XSAgICAgICAgICAgICAgID0gKihyZWR1bmRhbnQrUkVEVF9BRERSMUgpOwogICAgcEJ1bGtDYnctPkNCV0NiWzldICAgICAgICAgICAgICAgPSAqKHJlZHVuZGFudCtSRURUX0FERFIxTCk7CgogICAgbnRTdGF0dXMgPSBFTkVfU2VuZFNjc2lDbWQoZmRvRXh0LCBGRElSX1dSSVRFLCBidWYpOwoKICAgIGlmICghTlRfU1VDQ0VTUyhudFN0YXR1cykpCiAgICAgICByZXR1cm4oRVJST1IpOwoKLy8gIC8vIEZvciBUZXN0Ci8vICB7Ci8vICAgICBCWVRFICAgYmZbMHgyMDBdLCByZGRbMHgxMF07Ci8vICAgICBVTE9ORyAgaTsKLy8KLy8gICAgIFJ0bFplcm9NZW1vcnkoYmYsIDB4MjAwKTsKLy8gICAgIFJ0bFplcm9NZW1vcnkocmRkLCAweDEwKTsKLy8gICAgIG50U3RhdHVzID0gU01fUmVhZEJsb2NrKGZkb0V4dCwgYmYsIHJkZCk7Ci8vICAgICBmb3IgKGk9MDsgaTwweDIwMDsgaSsrKQovLyAgICAgewovLyAgICAgICAgIGlmIChidWZbaV0gIT0gYmZbaV0pCi8vICAgICAgICAgICAgRU5FX1ByaW50KCJidWZbJXhdID0gJXgsIGJmWyV4XSA9ICV4XG4iLCBidWYsIGJmKTsKLy8gICAgIH0KLy8gICAgIGlmICghTlRfU1VDQ0VTUyhudFN0YXR1cykpCi8vICAgICAgICBFTkVfUHJpbnQoIkVycm9yXG4iKTsKLy8gIH0KCiAgICByZXR1cm4oU01TVUNDRVNTKTsKfQoqLwovLy0tLS0tIFNzZmRjX0RfQ29weUJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFNzZmRjX0RfQ29weUJsb2NrKHN0cnVjdCB1c19kYXRhICp1cywgV09SRCBjb3VudCwgQllURSAqYnVmLEJZVEUgKnJlZHVuZGFudCkKewoJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwoJaW50CXJlc3VsdDsKICAgIC8vUEJVTEtfQ0JXICAgICAgICAgICAgICAgcEJ1bGtDYncgPSBmZG9FeHQtPnBCdWxrQ2J3OwogICAgLy9OVFNUQVRVUyAgICAgICAgICAgICAgICBudFN0YXR1czsKCVdPUkQJUmVhZEFkZHIsIFdyaXRlQWRkcjsKCgkvL3ByaW50aygiU3NmZGNfRF9Xcml0ZVNlY3QgLS0tIFpPTkUgPSAleCwgUmVhZEJsb2NrID0gJXgsIFdyaXRlQmxvY2sgPSAleFxuIiwgTWVkaWEuWm9uZSwgUmVhZEJsb2NrLCBXcml0ZUJsb2NrKTsKCglyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIFNNX1JXX1BBVFRFUk4pOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgl7CgkJcHJpbnRrKCJMb2FkIFNNIFJXIENvZGUgRmFpbCAhIVxuIik7CgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCX0KCglSZWFkQWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK1JlYWRCbG9jazsKCVJlYWRBZGRyID0gUmVhZEFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9yczsKCVdyaXRlQWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK1dyaXRlQmxvY2s7CglXcml0ZUFkZHIgPSBXcml0ZUFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9yczsKCgkvLyBXcml0ZSBzZWN0IGRhdGEKCW1lbXNldChiY2IsIDAsIHNpemVvZihzdHJ1Y3QgYnVsa19jYl93cmFwKSk7CgliY2ItPlNpZ25hdHVyZSA9IGNwdV90b19sZTMyKFVTX0JVTEtfQ0JfU0lHTik7CgliY2ItPkRhdGFUcmFuc2Zlckxlbmd0aAk9IDB4MjAwKmNvdW50OwoJYmNiLT5GbGFncwkJCT0gMHgwMDsKCWJjYi0+Q0RCWzBdCQkJPSAweEYwOwoJYmNiLT5DREJbMV0JCQk9IDB4MDg7CgliY2ItPkNEQls3XQkJCT0gKEJZVEUpV3JpdGVBZGRyOwoJYmNiLT5DREJbNl0JCQk9IChCWVRFKShXcml0ZUFkZHIvMHgwMTAwKTsKCWJjYi0+Q0RCWzVdCQkJPSBNZWRpYS5ab25lLzI7CgliY2ItPkNEQls4XQkJCT0gKihyZWR1bmRhbnQrUkVEVF9BRERSMUgpOwoJYmNiLT5DREJbOV0JCQk9ICoocmVkdW5kYW50K1JFRFRfQUREUjFMKTsKCWJjYi0+Q0RCWzEwXQkJPSBNZWRpYS5TZWN0b3I7CgoJaWYgKFJlYWRCbG9jayAhPSBOT19BU1NJR04pCgl7CgkJYmNiLT5DREJbNF0JCT0gKEJZVEUpUmVhZEFkZHI7CgkJYmNiLT5DREJbM10JCT0gKEJZVEUpKFJlYWRBZGRyLzB4MDEwMCk7CgkJYmNiLT5DREJbMl0JCT0gTWVkaWEuWm9uZS8yOwoJfQoJZWxzZQoJCWJjYi0+Q0RCWzExXQk9IDE7CgoJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1dSSVRFLCBidWYsIDApOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCglyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7Cn0KLyoKLy8tLS0tLSBTc2ZkY19EX1dyaXRlQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgU3NmZGNfRF9Xcml0ZUJsb2NrKFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQsIFdPUkQgY291bnQsIEJZVEUgKmJ1ZixCWVRFICpyZWR1bmRhbnQpCnsKICAgIFBCVUxLX0NCVyAgICAgICAgICAgICAgIHBCdWxrQ2J3ID0gZmRvRXh0LT5wQnVsa0NidzsKICAgIE5UU1RBVFVTICAgICAgICAgICAgICAgIG50U3RhdHVzOwogICAgV09SRCAgICAgICAgICAgICAgICAgICAgYWRkcjsKCiAgICAvL0VORV9QcmludCgiU01JTFNVQiAtLS0gU3NmZGNfRF9Xcml0ZVNlY3RcbiIpOwogICAgRU5FX0xvYWRCaW5Db2RlKGZkb0V4dCwgU01fUldfUEFUVEVSTik7CgogICAgYWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK01lZGlhLlBoeUJsb2NrOwogICAgYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycytNZWRpYS5TZWN0b3I7CgogICAgLy8gV3JpdGUgc2VjdCBkYXRhCiAgICBSdGxaZXJvTWVtb3J5KHBCdWxrQ2J3LCBzaXplb2Yoc3RydWN0IF9CVUxLX0NCVykpOwogICAgcEJ1bGtDYnctPmRDQldTaWduYXR1cmUgICAgICAgICAgPSBDQldfU0lHTlRVUkU7CiAgICBwQnVsa0Nidy0+YkNCV0x1biAgICAgICAgICAgICAgICA9IENCV19MVU47CiAgICBwQnVsa0Nidy0+ZENCV0RhdGFUcmFuc2Zlckxlbmd0aCA9IDB4MjAwKmNvdW50OwogICAgcEJ1bGtDYnctPmJtQ0JXRmxhZ3MgICAgICAgICAgICAgPSAweDAwOwogICAgcEJ1bGtDYnctPkNCV0NiWzBdICAgICAgICAgICAgICAgPSAweEYwOwogICAgcEJ1bGtDYnctPkNCV0NiWzFdICAgICAgICAgICAgICAgPSAweDA0OwogICAgcEJ1bGtDYnctPkNCV0NiWzddICAgICAgICAgICAgICAgPSAoQllURSlhZGRyOwogICAgcEJ1bGtDYnctPkNCV0NiWzZdICAgICAgICAgICAgICAgPSAoQllURSkoYWRkci8weDAxMDApOwogICAgcEJ1bGtDYnctPkNCV0NiWzVdICAgICAgICAgICAgICAgPSBNZWRpYS5ab25lLzI7CiAgICBwQnVsa0Nidy0+Q0JXQ2JbOF0gICAgICAgICAgICAgICA9ICoocmVkdW5kYW50K1JFRFRfQUREUjFIKTsKICAgIHBCdWxrQ2J3LT5DQldDYls5XSAgICAgICAgICAgICAgID0gKihyZWR1bmRhbnQrUkVEVF9BRERSMUwpOwoKICAgIG50U3RhdHVzID0gRU5FX1NlbmRTY3NpQ21kKGZkb0V4dCwgRkRJUl9XUklURSwgYnVmKTsKCiAgICBpZiAoIU5UX1NVQ0NFU1MobnRTdGF0dXMpKQogICAgICAgcmV0dXJuKEVSUk9SKTsKCi8vICAvLyBGb3IgVGVzdAovLyAgewovLyAgICAgQllURSAgIGJmWzB4MjAwXSwgcmRkWzB4MTBdOwovLyAgICAgVUxPTkcgIGk7Ci8vCi8vICAgICBSdGxaZXJvTWVtb3J5KGJmLCAweDIwMCk7Ci8vICAgICBSdGxaZXJvTWVtb3J5KHJkZCwgMHgxMCk7Ci8vICAgICBudFN0YXR1cyA9IFNNX1JlYWRCbG9jayhmZG9FeHQsIGJmLCByZGQpOwovLyAgICAgZm9yIChpPTA7IGk8MHgyMDA7IGkrKykKLy8gICAgIHsKLy8gICAgICAgICBpZiAoYnVmW2ldICE9IGJmW2ldKQovLyAgICAgICAgICAgIEVORV9QcmludCgiYnVmWyV4XSA9ICV4LCBiZlsleF0gPSAleFxuIiwgYnVmLCBiZik7Ci8vICAgICB9Ci8vICAgICBpZiAoIU5UX1NVQ0NFU1MobnRTdGF0dXMpKQovLyAgICAgICAgRU5FX1ByaW50KCJFcnJvclxuIik7Ci8vICB9CgogICAgcmV0dXJuKFNNU1VDQ0VTUyk7Cn0KLy8KLy8vLy0tLS0tIFNzZmRjX0RfV3JpdGVTZWN0X0RNQSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IFNzZmRjX0RfV3JpdGVTZWN0X0RNQShQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0LCBCWVRFICpidWYsQllURSAqcmVkdW5kYW50KQovL3sKLy8gICAgV09SRCAgICBTZWN0Qnl0ZUNvdW50LCBhZGRyOwovLyAgICBEV09SRCAgIEJ1ZmZlcls0XTsKLy8gICAgV09SRCAgICBsZW47Ci8vCi8vICAgIGlmICghX0h3X0RfQ2hrQ2FyZEluKCkpCi8vICAgICAgIHJldHVybihFUlJPUik7Ci8vICAgIGFkZHI9KFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7Ci8vICAgIGFkZHI9YWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzK01lZGlhLlNlY3RvcjsKLy8gICAgLy8gY3ljbGUgc3RhcnRpbmcgYWRkcmVzcwovLyAgICBTTV9TVEFSVEFERFJfTFNCID0gMHgwMDsKLy8gICAgU01fU1RBUlRBRERSX0lJU0IgPSAoQllURSlhZGRyOwovLyAgICBTTV9TVEFSVEFERFJfSUlJU0IgPSAoQllURSkoYWRkci8weDAxMDApOwovLyAgICBTTV9TVEFSVEFERFJfTVNCID0gTWVkaWEuWm9uZS8yOwovLwovLyAgICAvL1NlY3RvciBieXRlIGNvdW50IChETUEpCi8vICAgIFNlY3RCeXRlQ291bnQgPSAweDIwZjsKLy8gICAgU01fQllURUNOVF9MTyA9IChCWVRFKVNlY3RCeXRlQ291bnQ7Ci8vICAgIFNNX0NNRF9DVFJMMyA9IChTTV9DTURfQ1RSTDMgJiAweEZDKSB8IDB4MjAgfCAoQllURSkoU2VjdEJ5dGVDb3VudC8weDAxMDApOwovLyAgICBpZiAoICgoZmRvRXh0LT5DaGlwSUQ9PVJFQURFUl9DQjcxMikmJihmZG9FeHQtPlJldklEPT1DSElQX0EpKSB8fCBmZG9FeHQtPklzSGliZXJuYXRlICkKLy8gICAgICAgU01fRklGT19DVFJMID0gKFNNX0FQQjA4X01BU0sgfCBTTV9ETUFFTl9NQVNLIHwgU01fRE1BX0RPV05TVFJFQU1fTUFTSyB8IFNNX0ZJRk9TSExEVkxVXzhfTUFTSyk7Ci8vICAgIGVsc2UKLy8gICAgICAgU01fRklGT19DVFJMID0gKFNNX0FQQjMyX01BU0sgfCBTTV9ETUFFTl9NQVNLIHwgU01fRE1BX0RPV05TVFJFQU1fTUFTSyB8IFNNX0ZJRk9TSExEVkxVXzhfTUFTSyk7Ci8vCi8vICAgIF9Id19EX0VjY1JkUmVzZXQoKTsKLy8gICAgX0h3X0RfRWNjUmRTdGFydCgpOwovLwovLyAgICBTTV9DTURfQ1RSTDEgPSBTTV9DTURfUEFHUFJHTV9UUlVFOwovLyAgICBTTV9DTURfQ1RSTDEgPSAoU01fQ01EX1BBR1BSR01fVFJVRSB8IFNNX0NNRF9TVEFSVF9CSVQpOwovLwovLyAgICBTZWN0Qnl0ZUNvdW50ID0gMHgxZmY7Ci8vICAgIC8vU01fV3JpdGVEYXRhV2l0aERNQShmZG9FeHQsIGJ1ZiwgU2VjdEJ5dGVDb3VudCk7Ci8vICAgIC8vX1dyaXRlUmVkdF9EX1NzZmRjQnVmKHJlZHVuZGFudCk7Ci8vICAgIGxlbiA9IDB4MTAwMCAtICgoV09SRCkoYnVmKSAmIDB4MEZGRik7Ci8vICAgIGlmIChsZW4gPCAweDIwMCkKLy8gICAgewovLyAgICAgICBTTV9Xcml0ZURhdGFXaXRoRE1BKGZkb0V4dCwgYnVmLCBsZW4tMSk7Ci8vICAgICAgIFNNX1dyaXRlRGF0YVdpdGhETUEoZmRvRXh0LCBidWYrbGVuLCBTZWN0Qnl0ZUNvdW50LWxlbik7Ci8vICAgICAgIC8vRU5FX1ByaW50KCJSZWFkIERNQSAhISEgYnVmMSA9ICVwLCBsZW4gPSAleCwgYnVmMiA9ICVwXG4iLCBidWYsIGxlbiwgYnVmK2xlbik7Ci8vICAgIH0KLy8gICAgZWxzZQovLyAgICAgIFNNX1dyaXRlRGF0YVdpdGhETUEoZmRvRXh0LCBidWYsIFNlY3RCeXRlQ291bnQpOwovLwovLyAgICAvL1QxID0gKFVMT05HTE9ORylidWYgJiAweEZGRkZGRkZGRkZGRkYwMDA7Ci8vICAgIC8vVDIgPSAoKFVMT05HTE9ORylidWYgKyAweDFGRikgJiAweEZGRkZGRkZGRkZGRkYwMDA7Ci8vICAgIC8vaWYgKFQxICE9IFQyKQovLyAgICAvLyAgIEVORV9QcmludCgiU3NmZGNfRF9Xcml0ZVNlY3RfRE1BICEhISBidWYgPSAlcCwgVDEgPSAlcCwgVDIgPSAlcFxuIiwgYnVmLCBUMSwgVDIpOwovLyAgICAvL2lmIChUMi1UMSkKLy8gICAgLy97Ci8vICAgIC8vICAgbDEgPSAoV09SRCkoVDIgLSAoVUxPTkdMT05HKWJ1Zik7Ci8vICAgIC8vICAgU01fV3JpdGVEYXRhV2l0aERNQShmZG9FeHQsIGJ1ZiwgbDEtMSk7Ci8vICAgIC8vICAgU01fV3JpdGVEYXRhV2l0aERNQShmZG9FeHQsIChQQllURSlUMiwgU2VjdEJ5dGVDb3VudC1sMSk7Ci8vICAgIC8vfQovLyAgICAvL2Vsc2UKLy8gICAgLy8gIFNNX1dyaXRlRGF0YVdpdGhETUEoZmRvRXh0LCBidWYsIFNlY3RCeXRlQ291bnQpOwovLwovLyAgICBpZiAoICgoZmRvRXh0LT5DaGlwSUQ9PVJFQURFUl9DQjcxMikmJihmZG9FeHQtPlJldklEPT1DSElQX0EpKSB8fCBmZG9FeHQtPklzSGliZXJuYXRlICkKLy8gICAgewovLyAgICAgICBfV3JpdGVSZWR0X0RfU3NmZGNCdWYocmVkdW5kYW50KTsKLy8gICAgfQovLyAgICBlbHNlCi8vICAgIHsKLy8gICAgICAgbWVtY3B5KEJ1ZmZlciwgcmVkdW5kYW50LCAweDEwKTsKLy8gICAgICAgV1JJVEVfUE9SVF9EV09SRChTTV9SRUdfREFUQSwgQnVmZmVyWzBdKTsKLy8gICAgICAgV1JJVEVfUE9SVF9EV09SRChTTV9SRUdfREFUQSwgQnVmZmVyWzFdKTsKLy8gICAgICAgV1JJVEVfUE9SVF9EV09SRChTTV9SRUdfREFUQSwgQnVmZmVyWzJdKTsKLy8gICAgICAgV1JJVEVfUE9SVF9EV09SRChTTV9SRUdfREFUQSwgQnVmZmVyWzNdKTsKLy8gICAgfQovLwovLyAgICB3aGlsZSAoIF9Id19EX0Noa0NhcmRJbigpICkKLy8gICAgewovLyAgICAgICBpZiAoKFJFQURfUE9SVF9CWVRFKFNNX1JFR19JTlRfU1RBVFVTKSAmIDB4MTApKQovLyAgICAgICB7Ci8vICAgICAgICAgICBXUklURV9QT1JUX0JZVEUoU01fUkVHX0lOVF9TVEFUVVMsIDB4MTApOwovLyAgICAgICAgICAgYnJlYWs7Ci8vICAgICAgIH0KLy8gICAgfQovLyAgICBfSHdfRF9FY2NSZFN0b3AoKTsKLy8gICAgX0h3X0RfU2V0UmRTdGFuZGJ5KCk7Ci8vCi8vICAgIF9TZXRfRF9Tc2ZkY1dyU3RhbmRieSgpOwovLyAgICBfU2V0X0RfU3NmZGNSZFN0YW5kYnkoKTsKLy8gICAgaWYgKCFfSHdfRF9DaGtDYXJkSW4oKSkKLy8gICAgICAgcmV0dXJuKEVSUk9SKTsKLy8KLy8gICAgcmV0dXJuKFNNU1VDQ0VTUyk7Ci8vfQovLwovLy8vLS0tLS0gU3NmZGNfRF9Xcml0ZVNlY3RfUElPKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgU3NmZGNfRF9Xcml0ZVNlY3RfUElPKFBGRE9fREVWSUNFX0VYVEVOU0lPTiBmZG9FeHQsIEJZVEUgKmJ1ZixCWVRFICpyZWR1bmRhbnQpCi8vewovLyAgICBfQ2FsY19EX0VDQ2RhdGEoYnVmKTsKLy8gICAgX1NldF9EX1NzZmRjV3JDbWQoV1JEQVRBKTsKLy8gICAgX1NldF9EX1NzZmRjV3JBZGRyKEVWRU4pOwovLyAgICBfU3RhcnRfRF9Tc2ZkY1dySHdFQ0MoKTsKLy8KLy8gICAgX1dyaXRlX0RfU3NmZGNCdWYoYnVmKTsKLy8KLy8gICAgX0xvYWRfRF9Tc2ZkY1dySHdFQ0MoRVZFTik7Ci8vICAgIF9TZXRfRF9FQ0NkYXRhKEVWRU4scmVkdW5kYW50KTsKLy8KLy8gICAgX1dyaXRlUmVkdF9EX1NzZmRjQnVmKHJlZHVuZGFudCk7Ci8vCi8vICAgIF9TZXRfRF9Tc2ZkY1dyQ21kKFdSSVRFKTsKLy8KLy8gICAgaWYgKF9DaGVja19EX1NzZmRjQnVzeShCVVNZX1BST0cpKQovLyAgICB7IF9SZXNldF9EX1NzZmRjRXJyKCk7IHJldHVybihFUlJPUik7IH0KLy8KLy8gICAgX1NldF9EX1NzZmRjV3JTdGFuZGJ5KCk7Ci8vICAgIF9TZXRfRF9Tc2ZkY1JkU3RhbmRieSgpOwovLyAgICByZXR1cm4oU01TVUNDRVNTKTsKLy99CiovCi8vLS0tLS0gU3NmZGNfRF9Xcml0ZVNlY3RGb3JDb3B5KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgU3NmZGNfRF9Xcml0ZVNlY3RGb3JDb3B5KHN0cnVjdCB1c19kYXRhICp1cywgQllURSAqYnVmLCBCWVRFICpyZWR1bmRhbnQpCnsKCXN0cnVjdCBidWxrX2NiX3dyYXAgKmJjYiA9IChzdHJ1Y3QgYnVsa19jYl93cmFwICopIHVzLT5pb2J1ZjsKCWludAlyZXN1bHQ7CgkvL1BCVUxLX0NCVyAgICAgICAgICAgICAgIHBCdWxrQ2J3ID0gZmRvRXh0LT5wQnVsa0NidzsKCS8vTlRTVEFUVVMgICAgICAgICAgICAgICAgbnRTdGF0dXM7CglXT1JEICAgICAgICAgICAgICAgICAgICBhZGRyOwoKCS8vcHJpbnRrKCJTTUlMU1VCIC0tLSBTc2ZkY19EX1dyaXRlU2VjdEZvckNvcHlcbiIpOwoJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBTTV9SV19QQVRURVJOKTsKCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQoJewoJCXByaW50aygiTG9hZCBTTSBSVyBDb2RlIEZhaWwgISFcbiIpOwoJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7Cgl9CgoKCWFkZHIgPSAoV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcytNZWRpYS5QaHlCbG9jazsKCWFkZHIgPSBhZGRyKihXT1JEKVNzZmRjLk1heFNlY3RvcnMrTWVkaWEuU2VjdG9yOwoKCS8vIFdyaXRlIHNlY3QgZGF0YQoJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKCWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoCT0gMHgyMDA7CgliY2ItPkZsYWdzCQkJPSAweDAwOwoJYmNiLT5DREJbMF0JCQk9IDB4RjA7CgliY2ItPkNEQlsxXQkJCT0gMHgwNDsKCWJjYi0+Q0RCWzddCQkJPSAoQllURSlhZGRyOwoJYmNiLT5DREJbNl0JCQk9IChCWVRFKShhZGRyLzB4MDEwMCk7CgliY2ItPkNEQls1XQkJCT0gTWVkaWEuWm9uZS8yOwoJYmNiLT5DREJbOF0JCQk9ICoocmVkdW5kYW50K1JFRFRfQUREUjFIKTsKCWJjYi0+Q0RCWzldCQkJPSAqKHJlZHVuZGFudCtSRURUX0FERFIxTCk7CgoJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1dSSVRFLCBidWYsIDApOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCglyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7Cn0KCi8vIDYyNTAgQ01EIDUKLy8tLS0tLSBTc2ZkY19EX0VyYXNlQmxvY2soKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBTc2ZkY19EX0VyYXNlQmxvY2soc3RydWN0IHVzX2RhdGEgKnVzKQp7CglzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CglpbnQJcmVzdWx0OwoJV09SRAlhZGRyOwoKCXJlc3VsdCA9IEVORV9Mb2FkQmluQ29kZSh1cywgU01fUldfUEFUVEVSTik7CglpZiAocmVzdWx0ICE9IFVTQl9TVE9SX1hGRVJfR09PRCkKCXsKCQlwcmludGsoIkxvYWQgU00gUlcgQ29kZSBGYWlsICEhXG4iKTsKCQlyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0VSUk9SOwoJfQoKCWFkZHI9KFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7CglhZGRyPWFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9yczsKCgltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwoJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwoJYmNiLT5EYXRhVHJhbnNmZXJMZW5ndGgJPSAweDIwMDsKCWJjYi0+RmxhZ3MJCQk9IDB4ODA7CgliY2ItPkNEQlswXQkJCT0gMHhGMjsKCWJjYi0+Q0RCWzFdCQkJPSAweDA2OwoJYmNiLT5DREJbN10JCQk9IChCWVRFKWFkZHI7CgliY2ItPkNEQls2XQkJCT0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKCWJjYi0+Q0RCWzVdCQkJPSBNZWRpYS5ab25lLzI7CgoJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsIE5VTEwsIDApOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCglyZXR1cm4gVVNCX1NUT1JfVFJBTlNQT1JUX0dPT0Q7Cn0KCi8vIDYyNTAgQ01EIDIKLy8tLS0tLSBTc2ZkY19EX1JlYWRSZWR0RGF0YSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBTc2ZkY19EX1JlYWRSZWR0RGF0YShzdHJ1Y3QgdXNfZGF0YSAqdXMsIEJZVEUgKnJlZHVuZGFudCkKewoJc3RydWN0IGJ1bGtfY2Jfd3JhcCAqYmNiID0gKHN0cnVjdCBidWxrX2NiX3dyYXAgKikgdXMtPmlvYnVmOwoJaW50CXJlc3VsdDsKCVdPUkQJYWRkcjsKCUJZVEUgICpidWY7CgoJcmVzdWx0ID0gRU5FX0xvYWRCaW5Db2RlKHVzLCBTTV9SV19QQVRURVJOKTsKCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQoJewoJCXByaW50aygiTG9hZCBTTSBSVyBDb2RlIEZhaWwgISFcbiIpOwoJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7Cgl9CgoJYWRkciA9IChXT1JEKU1lZGlhLlpvbmUqU3NmZGMuTWF4QmxvY2tzK01lZGlhLlBoeUJsb2NrOwoJYWRkciA9IGFkZHIqKFdPUkQpU3NmZGMuTWF4U2VjdG9ycytNZWRpYS5TZWN0b3I7CgoJbWVtc2V0KGJjYiwgMCwgc2l6ZW9mKHN0cnVjdCBidWxrX2NiX3dyYXApKTsKCWJjYi0+U2lnbmF0dXJlID0gY3B1X3RvX2xlMzIoVVNfQlVMS19DQl9TSUdOKTsKCWJjYi0+RGF0YVRyYW5zZmVyTGVuZ3RoCT0gMHgxMDsKCWJjYi0+RmxhZ3MJCQk9IDB4ODA7CgliY2ItPkNEQlswXQkJCT0gMHhGMTsKCWJjYi0+Q0RCWzFdCQkJPSAweDAzOwoJYmNiLT5DREJbNF0JCQk9IChCWVRFKWFkZHI7CgliY2ItPkNEQlszXQkJCT0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKCWJjYi0+Q0RCWzJdCQkJPSBNZWRpYS5ab25lLzI7CgliY2ItPkNEQls4XQkJCT0gMDsKCWJjYi0+Q0RCWzldCQkJPSAxOwoKCWJ1ZiA9IGttYWxsb2MoMHgxMCwgR0ZQX0tFUk5FTCk7CgkvL3Jlc3VsdCA9IEVORV9TZW5kU2NzaUNtZCh1cywgRkRJUl9SRUFELCByZWR1bmRhbnQsIDApOwoJcmVzdWx0ID0gRU5FX1NlbmRTY3NpQ21kKHVzLCBGRElSX1JFQUQsIGJ1ZiwgMCk7CgltZW1jcHkocmVkdW5kYW50LCBidWYsIDB4MTApOwoJa2ZyZWUoYnVmKTsKCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQoJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CgoJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwp9CgovLyA2MjUwIENNRCA0Ci8vLS0tLS0gU3NmZGNfRF9Xcml0ZVJlZHREYXRhKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgU3NmZGNfRF9Xcml0ZVJlZHREYXRhKHN0cnVjdCB1c19kYXRhICp1cywgQllURSAqcmVkdW5kYW50KQp7CglzdHJ1Y3QgYnVsa19jYl93cmFwICpiY2IgPSAoc3RydWN0IGJ1bGtfY2Jfd3JhcCAqKSB1cy0+aW9idWY7CglpbnQJcmVzdWx0OwoJLy9QQlVMS19DQlcgICAgICAgICAgICAgICBwQnVsa0NidyA9IGZkb0V4dC0+cEJ1bGtDYnc7CgkvL05UU1RBVFVTICAgICAgICAgICAgICAgIG50U3RhdHVzOwoJV09SRCAgICAgICAgICAgICAgICAgICAgYWRkcjsKCglyZXN1bHQgPSBFTkVfTG9hZEJpbkNvZGUodXMsIFNNX1JXX1BBVFRFUk4pOwoJaWYgKHJlc3VsdCAhPSBVU0JfU1RPUl9YRkVSX0dPT0QpCgl7CgkJcHJpbnRrKCJMb2FkIFNNIFJXIENvZGUgRmFpbCAhIVxuIik7CgkJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9FUlJPUjsKCX0KCglhZGRyID0gKFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7CglhZGRyID0gYWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzK01lZGlhLlNlY3RvcjsKCgltZW1zZXQoYmNiLCAwLCBzaXplb2Yoc3RydWN0IGJ1bGtfY2Jfd3JhcCkpOwoJYmNiLT5TaWduYXR1cmUgPSBjcHVfdG9fbGUzMihVU19CVUxLX0NCX1NJR04pOwoJYmNiLT5EYXRhVHJhbnNmZXJMZW5ndGgJPSAweDEwOwoJYmNiLT5GbGFncwkJCT0gMHg4MDsKCWJjYi0+Q0RCWzBdCQkJPSAweEYyOwoJYmNiLT5DREJbMV0JCQk9IDB4MDU7CgliY2ItPkNEQls3XQkJCT0gKEJZVEUpYWRkcjsKCWJjYi0+Q0RCWzZdCQkJPSAoQllURSkoYWRkci8weDAxMDApOwoJYmNiLT5DREJbNV0JCQk9IE1lZGlhLlpvbmUvMjsKCWJjYi0+Q0RCWzhdCQkJPSAqKHJlZHVuZGFudCtSRURUX0FERFIxSCk7CgliY2ItPkNEQls5XQkJCT0gKihyZWR1bmRhbnQrUkVEVF9BRERSMUwpOwoKCXJlc3VsdCA9IEVORV9TZW5kU2NzaUNtZCh1cywgRkRJUl9SRUFELCBOVUxMLCAwKTsKCWlmIChyZXN1bHQgIT0gVVNCX1NUT1JfWEZFUl9HT09EKQoJCXJldHVybiBVU0JfU1RPUl9UUkFOU1BPUlRfRVJST1I7CgoJcmV0dXJuIFVTQl9TVE9SX1RSQU5TUE9SVF9HT09EOwp9CgovLy0tLS0tIFNzZmRjX0RfQ2hlY2tTdGF0dXMoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IFNzZmRjX0RfQ2hlY2tTdGF0dXModm9pZCkKewogICAgLy8gRHJpdmVyIKSjsLUKICAgIHJldHVybihTTVNVQ0NFU1MpOwogICAgLy9fU2V0X0RfU3NmZGNSZENtZChSRFNUQVRVUyk7CiAgICAvLwogICAgLy9pZiAoX0NoZWNrX0RfU3NmZGNTdGF0dXMoKSkKICAgIC8veyBfU2V0X0RfU3NmZGNSZFN0YW5kYnkoKTsgcmV0dXJuKEVSUk9SKTsgfQogICAgLy8KICAgIC8vX1NldF9EX1NzZmRjUmRTdGFuZGJ5KCk7CiAgICAvL3JldHVybihTTVNVQ0NFU1MpOwp9Ci8qCi8vLy9OQU5EIE1lbW9yeSAoU21hcnRNZWRpYSkgQ29udHJvbCBTdWJyb3V0aW5lIGZvciBSZWFkIERhdGEKLy8vLy0tLS0tIF9TZXRfRF9Tc2ZkY1JkQ21kKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9TZXRfRF9Tc2ZkY1JkQ21kKEJZVEUgY21kKQovL3sKLy8gICAgX0h3X0RfU2V0UmRDbWQoKTsKLy8gICAgX0h3X0RfT3V0RGF0YShjbWQpOwovLyAgICBfSHdfRF9TZXRSZERhdGEoKTsKLy99Ci8vCi8vLy8tLS0tLSBfU2V0X0RfU3NmZGNSZEFkZHIoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBfU2V0X0RfU3NmZGNSZEFkZHIoQllURSBhZGQpCi8vewovLyAgICBXT1JEIGFkZHI7Ci8vICAgIFNTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwovLyAgICBBRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKLy8KLy8gICAgYWRkcj0oV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcytNZWRpYS5QaHlCbG9jazsKLy8gICAgYWRkcj1hZGRyKihXT1JEKVNzZmRjLk1heFNlY3RvcnMrTWVkaWEuU2VjdG9yOwovLwovLyAgICAvL2lmICgoU3NmZGMuQXR0cmlidXRlICZNUFMpPT1QUzI1NikgLy8gZm9yIDI1NmJ5dGUvcGFnZQovLyAgICAvLyAgICBhZGRyPWFkZHIqMisoV09SRClhZGQ7Ci8vCi8vICAgIF9Id19EX1NldFJkQWRkcigpOwovLyAgICBfSHdfRF9PdXREYXRhKDB4MDApOwovLyAgICBfSHdfRF9PdXREYXRhKChCWVRFKWFkZHIpOwovLyAgICBfSHdfRF9PdXREYXRhKChCWVRFKShhZGRyLzB4MDEwMCkpOwovLwovLyAgICBpZiAoKFNzZmRjLkF0dHJpYnV0ZSAmTUFEQyk9PUFENENZQykKLy8gICAgICAgIF9Id19EX091dERhdGEoKEJZVEUpKE1lZGlhLlpvbmUvMikpOyAvLyBQYXRjaAovLwovLyAgICBfSHdfRF9TZXRSZERhdGEoKTsKLy99Ci8vCi8vLy8tLS0tLSBfU2V0X0RfU3NmZGNSZENoaXAoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBfU2V0X0RfU3NmZGNSZENoaXAodm9pZCkKLy97Ci8vICAgIF9Id19EX1NldFJkQWRkcigpOwovLyAgICBfSHdfRF9PdXREYXRhKDB4MDApOwovLyAgICBfSHdfRF9TZXRSZERhdGEoKTsKLy99Ci8vCi8vLy8tLS0tLSBfU2V0X0RfU3NmZGNSZFN0YW5kYnkoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBfU2V0X0RfU3NmZGNSZFN0YW5kYnkodm9pZCkKLy97Ci8vICAgIF9Id19EX1NldFJkU3RhbmRieSgpOwovL30KLy8KLy8vLy0tLS0tIF9TdGFydF9EX1NzZmRjUmRId0VDQygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9TdGFydF9EX1NzZmRjUmRId0VDQyh2b2lkKQovL3sKLy8jaWZkZWYgSFdfRUNDX1NVUFBPUlRFRAovLyAgICBfSHdfRF9FY2NSZFJlc2V0KCk7Ci8vICAgIF9Id19EX0luRGF0YSgpOwovLyAgICBfSHdfRF9FY2NSZFN0YXJ0KCk7Ci8vI2VuZGlmCi8vfQovLwovLy8vLS0tLS0gX1N0b3BfRF9Tc2ZkY1JkSHdFQ0MoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgX1N0b3BfRF9Tc2ZkY1JkSHdFQ0Modm9pZCkKLy97Ci8vI2lmZGVmIEhXX0VDQ19TVVBQT1JURUQKLy8gICAgX0h3X0RfRWNjUmRTdG9wKCk7Ci8vI2VuZGlmCi8vfQovLwovLy8vLS0tLS0gX0xvYWRfRF9Tc2ZkY1JkSHdFQ0MoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgX0xvYWRfRF9Tc2ZkY1JkSHdFQ0MoQllURSBhZGQpCi8vewovLyNpZmRlZiBIV19FQ0NfU1VQUE9SVEVECi8vICAgIF9Id19EX0VjY1JkUmVhZCgpOwovLyAgICAvL2lmICghKGFkZD09T0REICYmIChTc2ZkYy5BdHRyaWJ1dGUgJk1QUyk9PVBTMjU2KSkKLy8gICAgewovLyAgICAgICAgRWNjQnVmWzBdPV9Id19EX0luRGF0YSgpOwovLyAgICAgICAgRWNjQnVmWzFdPV9Id19EX0luRGF0YSgpOwovLyAgICAgICAgRWNjQnVmWzJdPV9Id19EX0luRGF0YSgpOwovLyAgICB9Ci8vCi8vICAgIC8vaWYgKCEoYWRkPT1FVkVOICYmIChTc2ZkYy5BdHRyaWJ1dGUgJk1QUyk9PVBTMjU2KSkKLy8gICAgewovLyAgICAgICAgRWNjQnVmWzNdPV9Id19EX0luRGF0YSgpOwovLyAgICAgICAgRWNjQnVmWzRdPV9Id19EX0luRGF0YSgpOwovLyAgICAgICAgRWNjQnVmWzVdPV9Id19EX0luRGF0YSgpOwovLyAgICB9Ci8vCi8vICAgIF9Id19EX0VjY1JkU3RvcCgpOwovLyNlbmRpZgovL30KLy8KLy8vL05BTkQgTWVtb3J5IChTbWFydE1lZGlhKSBDb250cm9sIFN1YnJvdXRpbmUgZm9yIFdyaXRlIERhdGEKLy8KLy8vLy0tLS0tIF9TZXRfRF9Tc2ZkY1dyQ21kKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9TZXRfRF9Tc2ZkY1dyQ21kKEJZVEUgY21kKQovL3sKLy8gICAgX0h3X0RfU2V0V3JDbWQoKTsKLy8gICAgX0h3X0RfT3V0RGF0YShjbWQpOwovLyAgICBfSHdfRF9TZXRXckRhdGEoKTsKLy99Ci8vCi8vLy8tLS0tLSBfU2V0X0RfU3NmZGNXckFkZHIoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgX1NldF9EX1NzZmRjV3JBZGRyKEJZVEUgYWRkKQovL3sKLy8gICAgV09SRCBhZGRyOwovLyAgICBTU0ZEQ1RZUEVfVCBhYSA9IChTU0ZEQ1RZUEVfVCApICZTc2ZkYzsKLy8gICAgQUREUkVTU19UICAgYmIgPSAoQUREUkVTU19UKSAmTWVkaWE7Ci8vCi8vICAgIGFkZHI9KFdPUkQpTWVkaWEuWm9uZSpTc2ZkYy5NYXhCbG9ja3MrTWVkaWEuUGh5QmxvY2s7Ci8vICAgIGFkZHI9YWRkciooV09SRClTc2ZkYy5NYXhTZWN0b3JzK01lZGlhLlNlY3RvcjsKLy8KLy8gICAgLy9pZiAoKFNzZmRjLkF0dHJpYnV0ZSAmTVBTKT09UFMyNTYpIC8vIGZvciAyNTZieXRlL3BhZ2UKLy8gICAgLy8gICAgYWRkcj1hZGRyKjIrKFdPUkQpYWRkOwovLwovLyAgICBfSHdfRF9TZXRXckFkZHIoKTsKLy8gICAgX0h3X0RfT3V0RGF0YSgweDAwKTsKLy8gICAgX0h3X0RfT3V0RGF0YSgoQllURSlhZGRyKTsKLy8gICAgX0h3X0RfT3V0RGF0YSgoQllURSkoYWRkci8weDAxMDApKTsKLy8KLy8gICAgaWYgKChTc2ZkYy5BdHRyaWJ1dGUgJk1BREMpPT1BRDRDWUMpCi8vICAgICAgICBfSHdfRF9PdXREYXRhKChCWVRFKShNZWRpYS5ab25lLzIpKTsgLy8gUGF0Y2gKLy8KLy8gICAgX0h3X0RfU2V0V3JEYXRhKCk7Ci8vfQovLwovLy8vLS0tLS0gX1NldF9EX1NzZmRjV3JCbG9jaygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBfU2V0X0RfU3NmZGNXckJsb2NrKHZvaWQpCi8vewovLyAgICBXT1JEIGFkZHI7Ci8vICAgIFNTRkRDVFlQRV9UIGFhID0gKFNTRkRDVFlQRV9UICkgJlNzZmRjOwovLyAgICBBRERSRVNTX1QgICBiYiA9IChBRERSRVNTX1QpICZNZWRpYTsKLy8KLy8gICAgYWRkcj0oV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcytNZWRpYS5QaHlCbG9jazsKLy8gICAgYWRkcj1hZGRyKihXT1JEKVNzZmRjLk1heFNlY3RvcnM7Ci8vCi8vICAgIC8vaWYgKChTc2ZkYy5BdHRyaWJ1dGUgJk1QUyk9PVBTMjU2KSAvLyBmb3IgMjU2Ynl0ZS9wYWdlCi8vICAgIC8vICAgIGFkZHI9YWRkcioyOwovLwovLyAgICBfSHdfRF9TZXRXckFkZHIoKTsKLy8gICAgX0h3X0RfT3V0RGF0YSgoQllURSlhZGRyKTsKLy8gICAgX0h3X0RfT3V0RGF0YSgoQllURSkoYWRkci8weDAxMDApKTsKLy8KLy8gICAgaWYgKChTc2ZkYy5BdHRyaWJ1dGUgJk1BREMpPT1BRDRDWUMpCi8vICAgICAgICBfSHdfRF9PdXREYXRhKChCWVRFKShNZWRpYS5ab25lLzIpKTsgLy8gUGF0Y2gKLy8KLy8gICAgX0h3X0RfU2V0V3JEYXRhKCk7Ci8vfQovLwovLy8vLS0tLS0gX1NldF9EX1NzZmRjV3JTdGFuZGJ5KCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9TZXRfRF9Tc2ZkY1dyU3RhbmRieSh2b2lkKQovL3sKLy8gICAgX0h3X0RfU2V0V3JTdGFuZGJ5KCk7Ci8vfQovLwovLy8vLS0tLS0gX1N0YXJ0X0RfU3NmZGNXckh3RUNDKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9TdGFydF9EX1NzZmRjV3JId0VDQyh2b2lkKQovL3sKLy8jaWZkZWYgSFdfRUNDX1NVUFBPUlRFRAovLyAgICBfSHdfRF9FY2NXclJlc2V0KCk7Ci8vICAgIF9Id19EX0luRGF0YSgpOwovLyAgICBfSHdfRF9FY2NXclN0YXJ0KCk7Ci8vI2VuZGlmCi8vfQovLwovLy8vLS0tLS0gX0xvYWRfRF9Tc2ZkY1dySHdFQ0MoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgX0xvYWRfRF9Tc2ZkY1dySHdFQ0MoQllURSBhZGQpCi8vewovLyNpZmRlZiBIV19FQ0NfU1VQUE9SVEVECi8vICAgIF9Id19EX0VjY1dyUmVhZCgpOwovLyAgICAvL2lmICghKGFkZD09T0REICYmIChTc2ZkYy5BdHRyaWJ1dGUgJk1QUyk9PVBTMjU2KSkKLy8gICAgewovLyAgICAgICAgRWNjQnVmWzBdPV9Id19EX0luRGF0YSgpOwovLyAgICAgICAgRWNjQnVmWzFdPV9Id19EX0luRGF0YSgpOwovLyAgICAgICAgRWNjQnVmWzJdPV9Id19EX0luRGF0YSgpOwovLyAgICB9Ci8vCi8vICAgIC8vaWYgKCEoYWRkPT1FVkVOICYmIChTc2ZkYy5BdHRyaWJ1dGUgJk1QUyk9PVBTMjU2KSkKLy8gICAgewovLyAgICAgICAgRWNjQnVmWzNdPV9Id19EX0luRGF0YSgpOwovLyAgICAgICAgRWNjQnVmWzRdPV9Id19EX0luRGF0YSgpOwovLyAgICAgICAgRWNjQnVmWzVdPV9Id19EX0luRGF0YSgpOwovLyAgICB9Ci8vCi8vICAgIF9Id19EX0VjY1dyU3RvcCgpOwovLyNlbmRpZgovL30KLy8KLy8vL05BTkQgTWVtb3J5IChTbWFydE1lZGlhKSBDb250cm9sIFN1YnJvdXRpbmUKLy8vLy0tLS0tIF9DaGVja19EX1NzZmRjQnVzeSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgX0NoZWNrX0RfU3NmZGNCdXN5KFdPUkQgdGltZSkKLy97Ci8vICAgIFdPUkQgIGNvdW50ID0gMDsKLy8KLy8gICAgZG8gewovLyAgICAgICAgaWYgKCFfSHdfRF9DaGtCdXN5KCkpCi8vICAgICAgICAgICAgcmV0dXJuKFNNU1VDQ0VTUyk7Ci8vICAgICAgICBFRGVsYXkoMTAwKTsKLy8gICAgICAgIGNvdW50Kys7Ci8vICAgIH0gd2hpbGUgKGNvdW50PD10aW1lKTsKLy8KLy8gICAgcmV0dXJuKEVSUk9SKTsKLy99Ci8vCi8vLy8tLS0tLSBfQ2hlY2tfRF9Tc2ZkY1N0YXR1cygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IF9DaGVja19EX1NzZmRjU3RhdHVzKHZvaWQpCi8vewovLyAgICBpZiAoX0h3X0RfSW5EYXRhKCkgJiBXUl9GQUlMKQovLyAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8KLy8gICAgcmV0dXJuKFNNU1VDQ0VTUyk7Ci8vfQovLwovLy8vIEZvciA3MTIKLy8vLy0tLS0tIF9SZXNldF9EX1NzZmRjRXJyKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9SZXNldF9EX1NzZmRjRXJyKHZvaWQpCi8vewovLyAgICBXT1JEICBjb3VudCA9IDA7Ci8vCi8vICAgIF9Id19EX1NldFJkQ21kKCk7Ci8vICAgIF9Id19EX091dERhdGEoUlNUX0NISVApOwovLyAgICBfSHdfRF9TZXRSZERhdGEoKTsKLy8KLy8gICAgZG8gewovLyAgICAgICAgaWYgKCFfSHdfRF9DaGtCdXN5KCkpCi8vICAgICAgICAgICAgYnJlYWs7Ci8vICAgICAgICBFRGVsYXkoMTAwKTsKLy8gICAgICAgIGNvdW50Kys7Ci8vICAgIH0gd2hpbGUgKGNvdW50PD1CVVNZX1JFU0VUKTsKLy8KLy8gICAgX0h3X0RfU2V0UmRTdGFuZGJ5KCk7Ci8vfQovLwovLy8vTkFORCBNZW1vcnkgKFNtYXJ0TWVkaWEpIEJ1ZmZlciBEYXRhIFhmZXIgU3Vicm91dGluZQovLy8vLS0tLS0gU01fUmVhZERhdGFXaXRoRE1BKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIFNNX1JlYWREYXRhV2l0aERNQShQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0LCBCWVRFICpkYXRhYnVmLCBXT1JEIFNlY3RCeXRlQ291bnQpCi8vewovLyAgICBQSFlTSUNBTF9BRERSRVNTICAgICAgICBBZGRyOwovLyAgICBMQVJHRV9JTlRFR0VSICAgICAgICAgICBwdGltZW91dCA7Ci8vCi8vICAgIEtlQ2xlYXJFdmVudCgmZmRvRXh0LT5TTV9ETUFEb25lRXZlbnQpOwovLwovLyAgICBBZGRyID0gTW1HZXRQaHlzaWNhbEFkZHJlc3MoZGF0YWJ1Zik7Ci8vCi8vICAgIFdSSVRFX1BPUlRfRFdPUkQoU01fRE1BX0FERFJfUkVHLCAoRFdPUkQpQWRkci5Mb3dQYXJ0KTsKLy8gICAgV1JJVEVfUE9SVF9CWVRFKFNNX0RNQV9EQVRBX0NUUkwsIDApOwovLyAgICBXUklURV9QT1JUX1dPUkQoU01fRE1BX0JZVEVfQ09VTlRfUkVHLCBTZWN0Qnl0ZUNvdW50KTsKLy8KLy8gICAgd2hpbGUgKCBfSHdfRF9DaGtDYXJkSW4oKSApCi8vICAgIHsKLy8gICAgICAgIGlmICgoUkVBRF9QT1JUX0JZVEUoU01fUkVHX0ZJRk9fU1RBVFVTKSAmIDB4ODApKQovLyAgICAgICAgICAgYnJlYWs7Ci8vICAgIH0KLy8gICAgaWYgKCFfSHdfRF9DaGtDYXJkSW4oKSkgICAgICByZXR1cm47Ci8vICAgIFdSSVRFX1BPUlRfQllURShTTV9ETUFfREFUQV9DVFJMLCAweDAxKTsKLy8KLy8gICAgcHRpbWVvdXQuUXVhZFBhcnQgPSAyMDAwICogKC0xMDAwMCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMiBzZWMKLy8gICAgS2VXYWl0Rm9yU2luZ2xlT2JqZWN0KCZmZG9FeHQtPlNNX0RNQURvbmVFdmVudCwgRXhlY3V0aXZlLCBLZXJuZWxNb2RlLCBGQUxTRSwgJnB0aW1lb3V0KTsKLy8gICAgX0h3X0RfU2V0RE1BSW50TWFzaygpOwovL30KLy8KLy8vLy0tLS0tIFNNX1dyaXRlRGF0YVdpdGhETUEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgU01fV3JpdGVEYXRhV2l0aERNQShQRkRPX0RFVklDRV9FWFRFTlNJT04gZmRvRXh0LCBCWVRFICpkYXRhYnVmLCBXT1JEIFNlY3RCeXRlQ291bnQpCi8vewovLyAgICBQSFlTSUNBTF9BRERSRVNTICAgICAgICBBZGRyOwovLyAgICBMQVJHRV9JTlRFR0VSICAgICAgICAgICBwdGltZW91dCA7Ci8vCi8vICAgIEtlQ2xlYXJFdmVudCgmZmRvRXh0LT5TTV9ETUFEb25lRXZlbnQpOwovLwovLyAgICBBZGRyID0gTW1HZXRQaHlzaWNhbEFkZHJlc3MoZGF0YWJ1Zik7Ci8vCi8vICAgIFdSSVRFX1BPUlRfRFdPUkQoU01fRE1BX0FERFJfUkVHLCAoRFdPUkQpQWRkci5Mb3dQYXJ0KTsKLy8gICAgV1JJVEVfUE9SVF9CWVRFKFNNX0RNQV9EQVRBX0NUUkwsIDIpOwovLyAgICBXUklURV9QT1JUX1dPUkQoU01fRE1BX0JZVEVfQ09VTlRfUkVHLCBTZWN0Qnl0ZUNvdW50KTsKLy8KLy8gICAgd2hpbGUgKCBfSHdfRF9DaGtDYXJkSW4oKSApCi8vICAgIHsKLy8gICAgICAgaWYgKChSRUFEX1BPUlRfQllURShTTV9SRUdfRklGT19TVEFUVVMpICYgMHg0MCkpCi8vICAgICAgICAgICBicmVhazsKLy8gICAgfQovLyAgICBpZiAoIV9Id19EX0Noa0NhcmRJbigpKSAgICAgIHJldHVybjsKLy8gICAgV1JJVEVfUE9SVF9CWVRFKFNNX0RNQV9EQVRBX0NUUkwsIDB4MDMpOwovLwovLyAgICBwdGltZW91dC5RdWFkUGFydCA9IDIwMDAgKiAoLTEwMDAwKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAyIHNlYwovLyAgICBLZVdhaXRGb3JTaW5nbGVPYmplY3QoJmZkb0V4dC0+U01fRE1BRG9uZUV2ZW50LCBFeGVjdXRpdmUsIEtlcm5lbE1vZGUsIEZBTFNFLCAmcHRpbWVvdXQpOwovLyAgICBfSHdfRF9TZXRETUFJbnRNYXNrKCk7Ci8vfQovLwovLy8vLS0tLS0gX1JlYWRfRF9Tc2ZkY0J1ZigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBfUmVhZF9EX1NzZmRjQnVmKEJZVEUgKmRhdGFidWYpCi8vewovLyAgICBpbnQgaTsKLy8KLy8gICAgLy9mb3IoaT0weDAwMDA7aTwoKChTc2ZkYy5BdHRyaWJ1dGUgJk1QUyk9PVBTMjU2KT8weDAxMDA6MHgwMjAwKTtpKyspCi8vICAgIGZvcihpPTA7IGk8MHgyMDA7IGkrKykKLy8gICAgICAgICpkYXRhYnVmKysgPV9Id19EX0luRGF0YSgpOwovL30KLy8KLy8vLy0tLS0tIF9Xcml0ZV9EX1NzZmRjQnVmKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9Xcml0ZV9EX1NzZmRjQnVmKEJZVEUgKmRhdGFidWYpCi8vewovLyAgICBpbnQgaTsKLy8KLy8gICAgLy9mb3IoaT0weDAwMDA7aTwoKChTc2ZkYy5BdHRyaWJ1dGUgJk1QUyk9PVBTMjU2KT8weDAxMDA6MHgwMjAwKTtpKyspCi8vICAgIGZvcihpPTA7IGk8MHgyMDA7IGkrKykKLy8gICAgICAgIF9Id19EX091dERhdGEoKmRhdGFidWYrKyk7Ci8vfQovLwovLy8vLS0tLS0gX1JlYWRfRF9Tc2ZkY0J5dGUoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgX1JlYWRfRF9Tc2ZkY0J5dGUoQllURSAqZGF0YWJ1ZikKLy97Ci8vICAgICpkYXRhYnVmPShCWVRFKV9Id19EX0luRGF0YSgpOwovL30KLy8KLy8vLy0tLS0tIF9SZWFkUmVkdF9EX1NzZmRjQnVmKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9SZWFkUmVkdF9EX1NzZmRjQnVmKEJZVEUgKnJlZHVuZGFudCkKLy97Ci8vICAgIGNoYXIgaTsKLy8KLy8gICAgLy9mb3IoaT0weDAwO2k8KCgoU3NmZGMuQXR0cmlidXRlICZNUFMpPT1QUzI1Nik/MHgwODoweDEwKTtpKyspCi8vICAgIGZvcihpPTA7IGk8MHgxMDsgaSsrKQovLyAgICAgICAgcmVkdW5kYW50W2ldID1fSHdfRF9JbkRhdGEoKTsKLy99Ci8vCi8vLy8tLS0tLSBfV3JpdGVSZWR0X0RfU3NmZGNCdWYoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL3ZvaWQgX1dyaXRlUmVkdF9EX1NzZmRjQnVmKEJZVEUgKnJlZHVuZGFudCkKLy97Ci8vICAgIGNoYXIgaTsKLy8KLy8gICAgLy9mb3IoaT0weDAwO2k8KCgoU3NmZGMuQXR0cmlidXRlICZNUFMpPT1QUzI1Nik/MHgwODoweDEwKTtpKyspCi8vICAgIGZvcihpPTA7IGk8MHgxMDsgaSsrKQovLyAgICAgICAgX0h3X0RfT3V0RGF0YSgqcmVkdW5kYW50KyspOwovL30KKi8KLy9TbWFydE1lZGlhIElEIENvZGUgQ2hlY2sgJiBNb2RlIFNldCBTdWJyb3V0aW5lCi8vLS0tLS0gU2V0X0RfU3NmZGNNb2RlbCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgU2V0X0RfU3NmZGNNb2RlbChCWVRFIGRjb2RlKQp7CiAgICBzd2l0Y2ggKF9DaGVja19EX0RldkNvZGUoZGNvZGUpKSB7CiAgICAgICAgY2FzZSBTU0ZEQzFNQjoKICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREMxTUI7CiAgICAgICAgICAgIFNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQzQ1lDIHwgQlMxNiB8IFBTMjU2OwogICAgICAgICAgICBTc2ZkYy5NYXhab25lcyAgICAgPSAxOwogICAgICAgICAgICBTc2ZkYy5NYXhCbG9ja3MgICAgPSAyNTY7CiAgICAgICAgICAgIFNzZmRjLk1heExvZ0Jsb2NrcyA9IDI1MDsKICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gODsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBTU0ZEQzJNQjoKICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREMyTUI7CiAgICAgICAgICAgIFNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQzQ1lDIHwgQlMxNiB8IFBTMjU2OwogICAgICAgICAgICBTc2ZkYy5NYXhab25lcyAgICAgPSAxOwogICAgICAgICAgICBTc2ZkYy5NYXhCbG9ja3MgICAgPSA1MTI7CiAgICAgICAgICAgIFNzZmRjLk1heExvZ0Jsb2NrcyA9IDUwMDsKICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gODsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBTU0ZEQzRNQjoKICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREM0TUI7CiAgICAgICAgICAgIFNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQzQ1lDIHwgQlMxNiB8IFBTNTEyOwogICAgICAgICAgICBTc2ZkYy5NYXhab25lcyAgICAgPSAxOwogICAgICAgICAgICBTc2ZkYy5NYXhCbG9ja3MgICAgPSA1MTI7CiAgICAgICAgICAgIFNzZmRjLk1heExvZ0Jsb2NrcyA9IDUwMDsKICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gMTY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU1NGREM4TUI6CiAgICAgICAgICAgIFNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDOE1COwogICAgICAgICAgICBTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFEM0NZQyB8IEJTMTYgfCBQUzUxMjsKICAgICAgICAgICAgU3NmZGMuTWF4Wm9uZXMgICAgID0gMTsKICAgICAgICAgICAgU3NmZGMuTWF4QmxvY2tzICAgID0gMTAyNDsKICAgICAgICAgICAgU3NmZGMuTWF4TG9nQmxvY2tzID0gMTAwMDsKICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gMTY7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU1NGREMxNk1COgogICAgICAgICAgICBTc2ZkYy5Nb2RlbCAgICAgICAgPSBTU0ZEQzE2TUI7CiAgICAgICAgICAgIFNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQzQ1lDIHwgQlMzMiB8IFBTNTEyOwogICAgICAgICAgICBTc2ZkYy5NYXhab25lcyAgICAgPSAxOwogICAgICAgICAgICBTc2ZkYy5NYXhCbG9ja3MgICAgPSAxMDI0OwogICAgICAgICAgICBTc2ZkYy5NYXhMb2dCbG9ja3MgPSAxMDAwOwogICAgICAgICAgICBTc2ZkYy5NYXhTZWN0b3JzICAgPSAzMjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBTU0ZEQzMyTUI6CiAgICAgICAgICAgIFNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDMzJNQjsKICAgICAgICAgICAgU3NmZGMuQXR0cmlidXRlICAgID0gRkxBU0ggfCBBRDNDWUMgfCBCUzMyIHwgUFM1MTI7CiAgICAgICAgICAgIFNzZmRjLk1heFpvbmVzICAgICA9IDI7CiAgICAgICAgICAgIFNzZmRjLk1heEJsb2NrcyAgICA9IDEwMjQ7CiAgICAgICAgICAgIFNzZmRjLk1heExvZ0Jsb2NrcyA9IDEwMDA7CiAgICAgICAgICAgIFNzZmRjLk1heFNlY3RvcnMgICA9IDMyOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFNTRkRDNjRNQjoKICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREM2NE1COwogICAgICAgICAgICBTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFENENZQyB8IEJTMzIgfCBQUzUxMjsKICAgICAgICAgICAgU3NmZGMuTWF4Wm9uZXMgICAgID0gNDsKICAgICAgICAgICAgU3NmZGMuTWF4QmxvY2tzICAgID0gMTAyNDsKICAgICAgICAgICAgU3NmZGMuTWF4TG9nQmxvY2tzID0gMTAwMDsKICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gMzI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU1NGREMxMjhNQjoKICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREMxMjhNQjsKICAgICAgICAgICAgU3NmZGMuQXR0cmlidXRlICAgID0gRkxBU0ggfCBBRDRDWUMgfCBCUzMyIHwgUFM1MTI7CiAgICAgICAgICAgIFNzZmRjLk1heFpvbmVzICAgICA9IDg7CiAgICAgICAgICAgIFNzZmRjLk1heEJsb2NrcyAgICA9IDEwMjQ7CiAgICAgICAgICAgIFNzZmRjLk1heExvZ0Jsb2NrcyA9IDEwMDA7CiAgICAgICAgICAgIFNzZmRjLk1heFNlY3RvcnMgICA9IDMyOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIFNTRkRDMjU2TUI6CiAgICAgICAgICAgIFNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDMjU2TUI7CiAgICAgICAgICAgIFNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQ0Q1lDIHwgQlMzMiB8IFBTNTEyOwogICAgICAgICAgICBTc2ZkYy5NYXhab25lcyAgICAgPSAxNjsKICAgICAgICAgICAgU3NmZGMuTWF4QmxvY2tzICAgID0gMTAyNDsKICAgICAgICAgICAgU3NmZGMuTWF4TG9nQmxvY2tzID0gMTAwMDsKICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gMzI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU1NGREM1MTJNQjoKICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREM1MTJNQjsKICAgICAgICAgICAgU3NmZGMuQXR0cmlidXRlICAgID0gRkxBU0ggfCBBRDRDWUMgfCBCUzMyIHwgUFM1MTI7CiAgICAgICAgICAgIFNzZmRjLk1heFpvbmVzICAgICA9IDMyOwogICAgICAgICAgICBTc2ZkYy5NYXhCbG9ja3MgICAgPSAxMDI0OwogICAgICAgICAgICBTc2ZkYy5NYXhMb2dCbG9ja3MgPSAxMDAwOwogICAgICAgICAgICBTc2ZkYy5NYXhTZWN0b3JzICAgPSAzMjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSBTU0ZEQzFHQjoKICAgICAgICAgICAgU3NmZGMuTW9kZWwgICAgICAgID0gU1NGREMxR0I7CiAgICAgICAgICAgIFNzZmRjLkF0dHJpYnV0ZSAgICA9IEZMQVNIIHwgQUQ0Q1lDIHwgQlMzMiB8IFBTNTEyOwogICAgICAgICAgICBTc2ZkYy5NYXhab25lcyAgICAgPSA2NDsKICAgICAgICAgICAgU3NmZGMuTWF4QmxvY2tzICAgID0gMTAyNDsKICAgICAgICAgICAgU3NmZGMuTWF4TG9nQmxvY2tzID0gMTAwMDsKICAgICAgICAgICAgU3NmZGMuTWF4U2VjdG9ycyAgID0gMzI7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgU1NGREMyR0I6CiAgICAgICAgICAgIFNzZmRjLk1vZGVsICAgICAgICA9IFNTRkRDMkdCOwogICAgICAgICAgICBTc2ZkYy5BdHRyaWJ1dGUgICAgPSBGTEFTSCB8IEFENENZQyB8IEJTMzIgfCBQUzUxMjsKICAgICAgICAgICAgU3NmZGMuTWF4Wm9uZXMgICAgID0gMTI4OwogICAgICAgICAgICBTc2ZkYy5NYXhCbG9ja3MgICAgPSAxMDI0OwogICAgICAgICAgICBTc2ZkYy5NYXhMb2dCbG9ja3MgPSAxMDAwOwogICAgICAgICAgICBTc2ZkYy5NYXhTZWN0b3JzICAgPSAzMjsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgU3NmZGMuTW9kZWwgPSBOT1NTRkRDOwogICAgICAgICAgICByZXR1cm4oRVJST1IpOwogICAgfQoKICAgIHJldHVybihTTVNVQ0NFU1MpOwp9CgovLy0tLS0tIF9DaGVja19EX0RldkNvZGUoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQllURSBfQ2hlY2tfRF9EZXZDb2RlKEJZVEUgZGNvZGUpCnsKICAgIHN3aXRjaChkY29kZSl7CiAgICAgICAgY2FzZSAweDZFOgogICAgICAgIGNhc2UgMHhFODoKICAgICAgICBjYXNlIDB4RUM6IHJldHVybihTU0ZEQzFNQik7ICAgLy8gOE1iaXQgKDFNKSBOQU5ECiAgICAgICAgY2FzZSAweDY0OgogICAgICAgIGNhc2UgMHhFQTogcmV0dXJuKFNTRkRDMk1CKTsgICAvLyAxNk1iaXQgKDJNKSBOQU5ECiAgICAgICAgY2FzZSAweDZCOgogICAgICAgIGNhc2UgMHhFMzoKICAgICAgICBjYXNlIDB4RTU6IHJldHVybihTU0ZEQzRNQik7ICAgLy8gMzJNYml0ICg0TSkgTkFORAogICAgICAgIGNhc2UgMHhFNjogcmV0dXJuKFNTRkRDOE1CKTsgICAvLyA2NE1iaXQgKDhNKSBOQU5ECiAgICAgICAgY2FzZSAweDczOiByZXR1cm4oU1NGREMxNk1CKTsgIC8vIDEyOE1iaXQgKDE2TSlOQU5ECiAgICAgICAgY2FzZSAweDc1OiByZXR1cm4oU1NGREMzMk1CKTsgIC8vIDI1Nk1iaXQgKDMyTSlOQU5ECiAgICAgICAgY2FzZSAweDc2OiByZXR1cm4oU1NGREM2NE1CKTsgIC8vIDUxMk1iaXQgKDY0TSlOQU5ECiAgICAgICAgY2FzZSAweDc5OiByZXR1cm4oU1NGREMxMjhNQik7IC8vIDFHYml0KDEyOE0pTkFORAogICAgICAgIGNhc2UgMHg3MTogcmV0dXJuKFNTRkRDMjU2TUIpOwogICAgICAgIGNhc2UgMHhEQzogcmV0dXJuKFNTRkRDNTEyTUIpOwogICAgICAgIGNhc2UgMHhEMzogcmV0dXJuKFNTRkRDMUdCKTsKICAgICAgICBjYXNlIDB4RDU6IHJldHVybihTU0ZEQzJHQik7CiAgICAgICAgZGVmYXVsdDogcmV0dXJuKE5PU1NGREMpOwogICAgfQp9Ci8qCi8vLy9TbWFydE1lZGlhIFBvd2VyIENvbnRyb2wgU3Vicm91dGluZQovLy8vLS0tLS0gQ250X0RfUmVzZXQoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBDbnRfRF9SZXNldCh2b2lkKQovL3sKLy8gICAgX0h3X0RfTGVkT2ZmKCk7Ci8vICAgIF9Id19EX1NldFJkU3RhbmRieSgpOwovLyAgICBfSHdfRF9WY2NPZmYoKTsKLy99Ci8vCi8vLy8tLS0tLSBDbnRfRF9Qb3dlck9uKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBDbnRfRF9Qb3dlck9uKHZvaWQpCi8vewovLyAgICAvLyBObyBzdXBwb3J0IDVWLgovLyAgICBfSHdfRF9FbmFibGVWY2MzVk9uKCk7ICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBTTV9SRUdfQ1RSTF81IFJlZy4gdG8gM1YKLy8gICAgX0h3X0RfVmNjT24oKTsKLy8gICAgX0h3X0RfU2V0UmRTdGFuZGJ5KCk7Ci8vICAgIF9XYWl0X0RfVGltZXIoVElNRV9QT04pOwovLwovLyAgICBpZiAoX0h3X0RfQ2hrUG93ZXIoKSkKLy8gICAgewovLyAgICAgICAgX0h3X0RfRW5hYmxlT0IoKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldCBTTV9SRUdfQ1RSTF81IFJlZy4gdG8gMHg4MwovLyAgICAgICAgcmV0dXJuKFNNU1VDQ0VTUyk7Ci8vICAgIH0KLy8KLy8gICAgX0h3X0RfU2V0VmNjT2ZmKCk7Ci8vICAgIHJldHVybihFUlJPUik7Ci8vfQovLwovLy8vLS0tLS0gQ250X0RfUG93ZXJPZmYoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBDbnRfRF9Qb3dlck9mZih2b2lkKQovL3sKLy8gICAgX0h3X0RfU2V0UmRTdGFuZGJ5KCk7Ci8vICAgIF9Id19EX1NldFZjY09mZigpOwovLyAgICBfSHdfRF9WY2NPZmYoKTsKLy99Ci8vCi8vLy8tLS0tLSBDbnRfRF9MZWRPbigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIENudF9EX0xlZE9uKHZvaWQpCi8vewovLyAgICBfSHdfRF9MZWRPbigpOwovL30KLy8KLy8vLy0tLS0tIENudF9EX0xlZE9mZigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIENudF9EX0xlZE9mZih2b2lkKQovL3sKLy8gICAgX0h3X0RfTGVkT2ZmKCk7Ci8vfQovLwovLy8vLS0tLS0gQ2hlY2tfRF9DbnRQb3dlcigpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgQ2hlY2tfRF9DbnRQb3dlcih2b2lkKQovL3sKLy8gICAgaWYgKF9Id19EX0Noa1Bvd2VyKCkpCi8vICAgICAgICByZXR1cm4oU01TVUNDRVNTKTsgLy8gUG93ZXIgT24KLy8KLy8gICAgcmV0dXJuKEVSUk9SKTsgICAgICAgLy8gUG93ZXIgT2ZmCi8vfQovLwovLy8vLS0tLS0gQ2hlY2tfRF9DYXJkRXhpc3QoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vaW50IENoZWNrX0RfQ2FyZEV4aXN0KHZvaWQpCi8vewovLyAgICBjaGFyIGksaixrOwovLwovLyAgICBpZiAoIV9Id19EX0Noa1N0YXR1cygpKSAvLyBOb3QgU3RhdHVzIENoYW5nZQovLyAgICAgICAgaWYgKF9Id19EX0Noa0NhcmRJbigpKQovLyAgICAgICAgICAgIHJldHVybihTTVNVQ0NFU1MpOyAvLyBDYXJkIGV4aXN0IGluIFNsb3QKLy8KLy8gICAgZm9yKGk9MCxqPTAsaz0wOyBpPDE2OyBpKyspIHsKLy8gICAgICAgIGlmIChfSHdfRF9DaGtDYXJkSW4oKSkgLy8gU3RhdHVzIENoYW5nZQovLyAgICAgICAgewovLyAgICAgICAgICAgIGorKzsgaz0wOwovLyAgICAgICAgfQovLyAgICAgICAgZWxzZQovLyAgICAgICAgewovLyAgICAgICAgICAgIGo9MDsgaysrOwovLyAgICAgICAgfQovLwovLyAgICAgICAgaWYgKGo+MykKLy8gICAgICAgICAgICByZXR1cm4oU01TVUNDRVNTKTsgLy8gQ2FyZCBleGlzdCBpbiBTbG90Ci8vICAgICAgICBpZiAoaz4zKQovLyAgICAgICAgICAgIHJldHVybihFUlJPUik7IC8vIE5PIENhcmQgZXhpc3QgaW4gU2xvdAovLwovLyAgICAgICAgX1dhaXRfRF9UaW1lcihUSU1FX0NEQ0hLKTsKLy8gICAgfQovLwovLyAgICByZXR1cm4oRVJST1IpOwovL30KLy8KLy8vLy0tLS0tIENoZWNrX0RfQ2FyZFN0c0NoZygpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy9pbnQgQ2hlY2tfRF9DYXJkU3RzQ2hnKHZvaWQpCi8vewovLyAgICBpZiAoX0h3X0RfQ2hrU3RhdHVzKCkpCi8vICAgICAgICByZXR1cm4oRVJST1IpOyAvLyBTdGF0dXMgQ2hhbmdlCi8vCi8vICAgIHJldHVybihTTVNVQ0NFU1MpOyAgIC8vIE5vdCBTdGF0dXMgQ2hhbmdlCi8vfQovLwovLy8vLS0tLS0gQ2hlY2tfRF9Tc2ZkY1dQKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQovL2ludCBDaGVja19EX1NzZmRjV1Aodm9pZCkKLy97IC8vIEVSUk9SOiBXUCwgU01TVUNDRVNTOiBOb3QgV1AKLy8gICAgY2hhciBpOwovLwovLyAgICBmb3IoaT0wOyBpPDg7IGkrKykgewovLyAgICAgICAgaWYgKF9Id19EX0Noa1dQKCkpCi8vICAgICAgICAgICAgcmV0dXJuKEVSUk9SKTsKLy8gICAgICAgIF9XYWl0X0RfVGltZXIoVElNRV9XUENISyk7Ci8vICAgIH0KLy8KLy8gICAgcmV0dXJuKFNNU1VDQ0VTUyk7Ci8vfQovLwoqLwovL1NtYXJ0TWVkaWEgRUNDIENvbnRyb2wgU3Vicm91dGluZQovLy0tLS0tIENoZWNrX0RfUmVhZEVycm9yKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQppbnQgQ2hlY2tfRF9SZWFkRXJyb3IoQllURSAqcmVkdW5kYW50KQp7CglyZXR1cm4gU01TVUNDRVNTOwp9CgovLy0tLS0tIENoZWNrX0RfQ29ycmVjdCgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IENoZWNrX0RfQ29ycmVjdChCWVRFICpidWYsQllURSAqcmVkdW5kYW50KQp7CglyZXR1cm4gU01TVUNDRVNTOwp9CgovLy0tLS0tIENoZWNrX0RfQ0lTZGF0YSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KaW50IENoZWNrX0RfQ0lTZGF0YShCWVRFICpidWYsIEJZVEUgKnJlZHVuZGFudCkKewoJQllURSBjaXNbXSA9IHsweDAxLCAweDAzLCAweEQ5LCAweDAxLCAweEZGLCAweDE4LCAweDAyLAoJCSAgICAgIDB4REYsIDB4MDEsIDB4MjB9OwoKCWludCBjaXNfbGVuID0gc2l6ZW9mKGNpcyk7CgoJaWYgKCFJc1NTRkRDQ29tcGxpYW5jZSAmJiAhSXNYRENvbXBsaWFuY2UpCgkJcmV0dXJuIFNNU1VDQ0VTUzsKCglpZiAoIW1lbWNtcChyZWR1bmRhbnQgKyAweDBELCBFY2NCdWYsIDMpKQoJCXJldHVybiBtZW1jbXAoYnVmLCBjaXMsIGNpc19sZW4pOwoKCWlmICghX0NvcnJlY3RfRF9Td0VDQyhidWYsIHJlZHVuZGFudCArIDB4MEQsIEVjY0J1ZikpCgkJcmV0dXJuIG1lbWNtcChidWYsIGNpcywgY2lzX2xlbik7CgoJYnVmICs9IDB4MTAwOwoJaWYgKCFtZW1jbXAocmVkdW5kYW50ICsgMHgwOCwgRWNjQnVmICsgMHgwMywgMykpCgkJcmV0dXJuIG1lbWNtcChidWYsIGNpcywgY2lzX2xlbik7CgoJaWYgKCFfQ29ycmVjdF9EX1N3RUNDKGJ1ZiwgcmVkdW5kYW50ICsgMHgwOCwgRWNjQnVmICsgMHgwMykpCgkJcmV0dXJuIG1lbWNtcChidWYsIGNpcywgY2lzX2xlbik7CgoJcmV0dXJuIEVSUk9SOwp9CgovLy0tLS0tIFNldF9EX1JpZ2h0RUNDKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQp2b2lkIFNldF9EX1JpZ2h0RUNDKEJZVEUgKnJlZHVuZGFudCkKewogICAgLy8gRHJpdmVyIKSjsLUgRUNDIENoZWNrCiAgICByZXR1cm47CiAgICAvL1N0cmluZ0NvcHkoKGNoYXIgKikocmVkdW5kYW50KzB4MEQpLChjaGFyICopRWNjQnVmLDMpOwogICAgLy9TdHJpbmdDb3B5KChjaGFyICopKHJlZHVuZGFudCsweDA4KSwoY2hhciAqKShFY2NCdWYrMHgwMyksMyk7Cn0KLyoKLy8vLy0tLS0tIF9DYWxjX0RfRUNDZGF0YSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLy92b2lkIF9DYWxjX0RfRUNDZGF0YShCWVRFICpidWYpCi8vewovLyNpZmRlZiBIV19FQ0NfU1VQUE9SVEVECi8vI2Vsc2UKLy8gICAgX0NhbGN1bGF0ZV9EX1N3RUNDKGJ1ZixFY2NCdWYpOwovLyAgICBidWYrPTB4MDEwMDsKLy8gICAgX0NhbGN1bGF0ZV9EX1N3RUNDKGJ1ZixFY2NCdWYrMHgwMyk7Ci8vI2VuZGlmCi8vfQovLwovLy8vLS0tLS0gX1NldF9EX0VDQ2RhdGEoKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi8vdm9pZCBfU2V0X0RfRUNDZGF0YShCWVRFIGFkZCxCWVRFICpyZWR1bmRhbnQpCi8vewovLyAgICAvL2lmIChhZGQ9PUVWRU4gJiYgKFNzZmRjLkF0dHJpYnV0ZSAmTVBTKT09UFMyNTYpCi8vICAgIC8vICAgIHJldHVybjsKLy8KLy8gICAgLy8gZm9yIDI1NmJ5dGUvcGFnZQovLyAgICBTdHJpbmdDb3B5KChjaGFyICopKHJlZHVuZGFudCsweDBEKSwoY2hhciAqKUVjY0J1ZiwzKTsKLy8gICAgU3RyaW5nQ29weSgoY2hhciAqKShyZWR1bmRhbnQrMHgwOCksKGNoYXIgKikoRWNjQnVmKzB4MDMpLDMpOwovL30KKi8KCi8qCi8vLS0tLS0gU01fUmVhZEJsb2NrKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCmludCBTTV9SZWFkQmxvY2soUEZET19ERVZJQ0VfRVhURU5TSU9OIGZkb0V4dCwgQllURSAqYnVmLEJZVEUgKnJlZHVuZGFudCkKewogICAgUEJVTEtfQ0JXICAgICAgICAgICAgICAgcEJ1bGtDYncgPSBmZG9FeHQtPnBCdWxrQ2J3OwogICAgTlRTVEFUVVMgICAgICAgICAgICAgICAgbnRTdGF0dXM7CiAgICBXT1JEICAgICAgICAgICAgICAgICAgICBhZGRyOwoKICAgIEVORV9Mb2FkQmluQ29kZShmZG9FeHQsIFNNX1JXX1BBVFRFUk4pOwoKICAgIGFkZHIgPSAoV09SRClNZWRpYS5ab25lKlNzZmRjLk1heEJsb2NrcytNZWRpYS5QaHlCbG9jazsKICAgIGFkZHIgPSBhZGRyKihXT1JEKVNzZmRjLk1heFNlY3RvcnMrTWVkaWEuU2VjdG9yOwoKICAgIC8vIFJlYWQgc2VjdCBkYXRhCiAgICBSdGxaZXJvTWVtb3J5KHBCdWxrQ2J3LCBzaXplb2Yoc3RydWN0IF9CVUxLX0NCVykpOwogICAgcEJ1bGtDYnctPmRDQldTaWduYXR1cmUgICAgICAgICAgPSBDQldfU0lHTlRVUkU7CiAgICBwQnVsa0Nidy0+YkNCV0x1biAgICAgICAgICAgICAgICA9IENCV19MVU47CiAgICBwQnVsa0Nidy0+ZENCV0RhdGFUcmFuc2Zlckxlbmd0aCA9IDB4MjAwOwogICAgcEJ1bGtDYnctPmJtQ0JXRmxhZ3MgICAgICAgICAgICAgPSAweDgwOwogICAgcEJ1bGtDYnctPkNCV0NiWzBdICAgICAgICAgICAgICAgPSAweEYxOwogICAgcEJ1bGtDYnctPkNCV0NiWzFdICAgICAgICAgICAgICAgPSAweDAyOwogICAgcEJ1bGtDYnctPkNCV0NiWzRdICAgICAgICAgICAgICAgPSAoQllURSlhZGRyOwogICAgcEJ1bGtDYnctPkNCV0NiWzNdICAgICAgICAgICAgICAgPSAoQllURSkoYWRkci8weDAxMDApOwogICAgcEJ1bGtDYnctPkNCV0NiWzJdICAgICAgICAgICAgICAgPSBNZWRpYS5ab25lLzI7CgogICAgbnRTdGF0dXMgPSBFTkVfU2VuZFNjc2lDbWQoZmRvRXh0LCBGRElSX1JFQUQsIGJ1Zik7CgogICAgaWYgKCFOVF9TVUNDRVNTKG50U3RhdHVzKSkKICAgICAgIHJldHVybihFUlJPUik7CgogICAgLy8gUmVhZCByZWR1bmRhbnQKICAgIFJ0bFplcm9NZW1vcnkocEJ1bGtDYncsIHNpemVvZihzdHJ1Y3QgX0JVTEtfQ0JXKSk7CiAgICBwQnVsa0Nidy0+ZENCV1NpZ25hdHVyZSAgICAgICAgICA9IENCV19TSUdOVFVSRTsKICAgIHBCdWxrQ2J3LT5iQ0JXTHVuICAgICAgICAgICAgICAgID0gQ0JXX0xVTjsKICAgIHBCdWxrQ2J3LT5kQ0JXRGF0YVRyYW5zZmVyTGVuZ3RoID0gMHgxMDsKICAgIHBCdWxrQ2J3LT5ibUNCV0ZsYWdzICAgICAgICAgICAgID0gMHg4MDsKICAgIHBCdWxrQ2J3LT5DQldDYlswXSAgICAgICAgICAgICAgID0gMHhGMTsKICAgIHBCdWxrQ2J3LT5DQldDYlsxXSAgICAgICAgICAgICAgID0gMHgwMzsKICAgIHBCdWxrQ2J3LT5DQldDYls0XSAgICAgICAgICAgICAgID0gKEJZVEUpYWRkcjsKICAgIHBCdWxrQ2J3LT5DQldDYlszXSAgICAgICAgICAgICAgID0gKEJZVEUpKGFkZHIvMHgwMTAwKTsKICAgIHBCdWxrQ2J3LT5DQldDYlsyXSAgICAgICAgICAgICAgID0gTWVkaWEuWm9uZS8yOwogICAgcEJ1bGtDYnctPkNCV0NiWzVdICAgICAgICAgICAgICAgPSAwOwogICAgcEJ1bGtDYnctPkNCV0NiWzZdICAgICAgICAgICAgICAgPSAxOwoKICAgIG50U3RhdHVzID0gRU5FX1NlbmRTY3NpQ21kKGZkb0V4dCwgRkRJUl9SRUFELCByZWR1bmRhbnQpOwoKICAgIGlmICghTlRfU1VDQ0VTUyhudFN0YXR1cykpCiAgICAgICByZXR1cm4oRVJST1IpOwoKICAgIHJldHVybihTTVNVQ0NFU1MpOwp9Ki8K