LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogKgogKiBDb3B5cmlnaHQoYykgMjAxNiAtIDIwMTcgUmVhbHRlayBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICoKICogVGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vciBtb2RpZnkgaXQKICogdW5kZXIgdGhlIHRlcm1zIG9mIHZlcnNpb24gMiBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYXMKICogcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24uCiAqCiAqIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUgaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVAogKiBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3IKICogRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yCiAqIG1vcmUgZGV0YWlscy4KICoKICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KCiNpbmNsdWRlICJoYWxtYWNfY2ZnX3dtYWNfODh4eC5oIgojaW5jbHVkZSAiaGFsbWFjXzg4eHhfY2ZnLmgiCgojaWYgSEFMTUFDXzg4WFhfU1VQUE9SVAoKLyoqCiAqIGhhbG1hY19jZmdfbWFjX2FkZHJfODh4eCgpIC0gY29uZmlnIG1hYyBhZGRyZXNzCiAqIEBwSGFsbWFjX2FkYXB0ZXIgOiB0aGUgYWRhcHRlciBvZiBoYWxtYWMKICogQGhhbG1hY19wb3J0IDogMCBmb3IgcG9ydDAsIDEgZm9yIHBvcnQxLCAyIGZvciBwb3J0MiwgMyBmb3IgcG9ydDMsIDQgZm9yIHBvcnQ0CiAqIEBwSGFsX2FkZHJlc3MgOiBtYWMgYWRkcmVzcwogKiBBdXRob3IgOiBLYWlZdWFuIENoYW5nL0l2YW4gTGluCiAqIFJldHVybiA6IEhBTE1BQ19SRVRfU1RBVFVTCiAqIE1vcmUgZGV0YWlscyBvZiBzdGF0dXMgY29kZSBjYW4gYmUgZm91bmQgaW4gcHJvdG90eXBlIGRvY3VtZW50CiAqLwpIQUxNQUNfUkVUX1NUQVRVUwpoYWxtYWNfY2ZnX21hY19hZGRyXzg4eHgoCglJTiBQSEFMTUFDX0FEQVBURVIgcEhhbG1hY19hZGFwdGVyLAoJSU4gdTggaGFsbWFjX3BvcnQsCglJTiBQSEFMTUFDX1dMQU5fQUREUiBwSGFsX2FkZHJlc3MKKQp7Cgl1MTYgbWFjX2FkZHJlc3NfSDsKCXUzMiBtYWNfYWRkcmVzc19MOwoJVk9JRCAqcERyaXZlcl9hZGFwdGVyID0gTlVMTDsKCVBIQUxNQUNfQVBJIHBIYWxtYWNfYXBpOwoKCWlmIChoYWxtYWNfYWRhcHRlcl92YWxpZGF0ZShwSGFsbWFjX2FkYXB0ZXIpICE9IEhBTE1BQ19SRVRfU1VDQ0VTUykKCQlyZXR1cm4gSEFMTUFDX1JFVF9BREFQVEVSX0lOVkFMSUQ7CgoJaWYgKGhhbG1hY19hcGlfdmFsaWRhdGUocEhhbG1hY19hZGFwdGVyKSAhPSBIQUxNQUNfUkVUX1NVQ0NFU1MpCgkJcmV0dXJuIEhBTE1BQ19SRVRfQVBJX0lOVkFMSUQ7CgoJcERyaXZlcl9hZGFwdGVyID0gcEhhbG1hY19hZGFwdGVyLT5wRHJpdmVyX2FkYXB0ZXI7CglwSGFsbWFjX2FwaSA9IChQSEFMTUFDX0FQSSlwSGFsbWFjX2FkYXB0ZXItPnBIYWxtYWNfYXBpOwoKCVBMQVRGT1JNX01TR19QUklOVChwRHJpdmVyX2FkYXB0ZXIsIEhBTE1BQ19NU0dfSU5JVCwgSEFMTUFDX0RCR19UUkFDRSwgIltUUkFDRV1oYWxtYWNfY2ZnX21hY19hZGRyXzg4eHggPT09PT09PT09PT5cbiIpOwoKCWlmIChoYWxtYWNfcG9ydCA+PSBIQUxNQUNfUE9SVElETUFYKSB7CgkJUExBVEZPUk1fTVNHX1BSSU5UKHBEcml2ZXJfYWRhcHRlciwgSEFMTUFDX01TR19JTklULCBIQUxNQUNfREJHX0VSUiwgIltFUlJdcG9ydCBpbmRleCA+PSA1XG4iKTsKCQlyZXR1cm4gSEFMTUFDX1JFVF9QT1JUX05PVF9TVVBQT1JUOwoJfQoKCW1hY19hZGRyZXNzX0wgPSBwSGFsX2FkZHJlc3MtPkFkZHJlc3NfTF9ILkFkZHJlc3NfTG93OwoJbWFjX2FkZHJlc3NfSCA9IHBIYWxfYWRkcmVzcy0+QWRkcmVzc19MX0guQWRkcmVzc19IaWdoOwoKCW1hY19hZGRyZXNzX0wgPSBydGtfbGUzMl90b19jcHUobWFjX2FkZHJlc3NfTCk7CgltYWNfYWRkcmVzc19IID0gcnRrX2xlMTZfdG9fY3B1KG1hY19hZGRyZXNzX0gpOwoKCXBIYWxtYWNfYWRhcHRlci0+cEhhbF9tYWNfYWRkcltoYWxtYWNfcG9ydF0uQWRkcmVzc19MX0guQWRkcmVzc19Mb3cgPSBtYWNfYWRkcmVzc19MOwoJcEhhbG1hY19hZGFwdGVyLT5wSGFsX21hY19hZGRyW2hhbG1hY19wb3J0XS5BZGRyZXNzX0xfSC5BZGRyZXNzX0hpZ2ggPSBtYWNfYWRkcmVzc19IOwoKCXN3aXRjaCAoaGFsbWFjX3BvcnQpIHsKCWNhc2UgSEFMTUFDX1BPUlRJRDA6CgkJSEFMTUFDX1JFR19XUklURV8zMihwSGFsbWFjX2FkYXB0ZXIsIFJFR19NQUNJRCwgbWFjX2FkZHJlc3NfTCk7CgkJSEFMTUFDX1JFR19XUklURV8xNihwSGFsbWFjX2FkYXB0ZXIsIFJFR19NQUNJRCArIDQsIG1hY19hZGRyZXNzX0gpOwoJCWJyZWFrOwoKCWNhc2UgSEFMTUFDX1BPUlRJRDE6CgkJSEFMTUFDX1JFR19XUklURV8zMihwSGFsbWFjX2FkYXB0ZXIsIFJFR19NQUNJRDEsIG1hY19hZGRyZXNzX0wpOwoJCUhBTE1BQ19SRUdfV1JJVEVfMTYocEhhbG1hY19hZGFwdGVyLCBSRUdfTUFDSUQxICsgNCwgbWFjX2FkZHJlc3NfSCk7CgkJYnJlYWs7CgoJY2FzZSBIQUxNQUNfUE9SVElEMjoKCQlIQUxNQUNfUkVHX1dSSVRFXzMyKHBIYWxtYWNfYWRhcHRlciwgUkVHX01BQ0lEMiwgbWFjX2FkZHJlc3NfTCk7CgkJSEFMTUFDX1JFR19XUklURV8xNihwSGFsbWFjX2FkYXB0ZXIsIFJFR19NQUNJRDIgKyA0LCBtYWNfYWRkcmVzc19IKTsKCQlicmVhazsKCgljYXNlIEhBTE1BQ19QT1JUSUQzOgoJCUhBTE1BQ19SRUdfV1JJVEVfMzIocEhhbG1hY19hZGFwdGVyLCBSRUdfTUFDSUQzLCBtYWNfYWRkcmVzc19MKTsKCQlIQUxNQUNfUkVHX1dSSVRFXzE2KHBIYWxtYWNfYWRhcHRlciwgUkVHX01BQ0lEMyArIDQsIG1hY19hZGRyZXNzX0gpOwoJCWJyZWFrOwoKCWNhc2UgSEFMTUFDX1BPUlRJRDQ6CgkJSEFMTUFDX1JFR19XUklURV8zMihwSGFsbWFjX2FkYXB0ZXIsIFJFR19NQUNJRDQsIG1hY19hZGRyZXNzX0wpOwoJCUhBTE1BQ19SRUdfV1JJVEVfMTYocEhhbG1hY19hZGFwdGVyLCBSRUdfTUFDSUQ0ICsgNCwgbWFjX2FkZHJlc3NfSCk7CgkJYnJlYWs7CgoJZGVmYXVsdDoKCQlicmVhazsKCX0KCglQTEFURk9STV9NU0dfUFJJTlQocERyaXZlcl9hZGFwdGVyLCBIQUxNQUNfTVNHX0lOSVQsIEhBTE1BQ19EQkdfVFJBQ0UsICJbVFJBQ0VdaGFsbWFjX2NmZ19tYWNfYWRkcl84OHh4IDw9PT09PT09PT09XG4iKTsKCglyZXR1cm4gSEFMTUFDX1JFVF9TVUNDRVNTOwp9CgovKioKICogaGFsbWFjX2NmZ19ic3NpZF84OHh4KCkgLSBjb25maWcgQlNTSUQKICogQHBIYWxtYWNfYWRhcHRlciA6IHRoZSBhZGFwdGVyIG9mIGhhbG1hYwogKiBAaGFsbWFjX3BvcnQgOiAwIGZvciBwb3J0MCwgMSBmb3IgcG9ydDEsIDIgZm9yIHBvcnQyLCAzIGZvciBwb3J0MywgNCBmb3IgcG9ydDQKICogQHBIYWxfYWRkcmVzcyA6IGJzc2lkCiAqIEF1dGhvciA6IEthaVl1YW4gQ2hhbmcvSXZhbiBMaW4KICogUmV0dXJuIDogSEFMTUFDX1JFVF9TVEFUVVMKICogTW9yZSBkZXRhaWxzIG9mIHN0YXR1cyBjb2RlIGNhbiBiZSBmb3VuZCBpbiBwcm90b3R5cGUgZG9jdW1lbnQKICovCkhBTE1BQ19SRVRfU1RBVFVTCmhhbG1hY19jZmdfYnNzaWRfODh4eCgKCUlOIFBIQUxNQUNfQURBUFRFUiBwSGFsbWFjX2FkYXB0ZXIsCglJTiB1OCBoYWxtYWNfcG9ydCwKCUlOIFBIQUxNQUNfV0xBTl9BRERSIHBIYWxfYWRkcmVzcwopCnsKCXUxNiBic3NpZF9hZGRyZXNzX0g7Cgl1MzIgYnNzaWRfYWRkcmVzc19MOwoJVk9JRCAqcERyaXZlcl9hZGFwdGVyID0gTlVMTDsKCVBIQUxNQUNfQVBJIHBIYWxtYWNfYXBpOwoKCWlmIChoYWxtYWNfYWRhcHRlcl92YWxpZGF0ZShwSGFsbWFjX2FkYXB0ZXIpICE9IEhBTE1BQ19SRVRfU1VDQ0VTUykKCQlyZXR1cm4gSEFMTUFDX1JFVF9BREFQVEVSX0lOVkFMSUQ7CgoJaWYgKGhhbG1hY19hcGlfdmFsaWRhdGUocEhhbG1hY19hZGFwdGVyKSAhPSBIQUxNQUNfUkVUX1NVQ0NFU1MpCgkJcmV0dXJuIEhBTE1BQ19SRVRfQVBJX0lOVkFMSUQ7CgoJcERyaXZlcl9hZGFwdGVyID0gcEhhbG1hY19hZGFwdGVyLT5wRHJpdmVyX2FkYXB0ZXI7CglwSGFsbWFjX2FwaSA9IChQSEFMTUFDX0FQSSlwSGFsbWFjX2FkYXB0ZXItPnBIYWxtYWNfYXBpOwoKCVBMQVRGT1JNX01TR19QUklOVChwRHJpdmVyX2FkYXB0ZXIsIEhBTE1BQ19NU0dfSU5JVCwgSEFMTUFDX0RCR19UUkFDRSwgIltUUkFDRV1oYWxtYWNfY2ZnX2Jzc2lkXzg4eHggPT09PT09PT09PT5cbiIpOwoKCWlmIChoYWxtYWNfcG9ydCA+PSBIQUxNQUNfUE9SVElETUFYKSB7CgkJUExBVEZPUk1fTVNHX1BSSU5UKHBEcml2ZXJfYWRhcHRlciwgSEFMTUFDX01TR19JTklULCBIQUxNQUNfREJHX0VSUiwgIltFUlJdcG9ydCBpbmRleCA+IDVcbiIpOwoJCXJldHVybiBIQUxNQUNfUkVUX1BPUlRfTk9UX1NVUFBPUlQ7Cgl9CgoJYnNzaWRfYWRkcmVzc19MID0gcEhhbF9hZGRyZXNzLT5BZGRyZXNzX0xfSC5BZGRyZXNzX0xvdzsKCWJzc2lkX2FkZHJlc3NfSCA9IHBIYWxfYWRkcmVzcy0+QWRkcmVzc19MX0guQWRkcmVzc19IaWdoOwoKCWJzc2lkX2FkZHJlc3NfTCA9IHJ0a19sZTMyX3RvX2NwdShic3NpZF9hZGRyZXNzX0wpOwoJYnNzaWRfYWRkcmVzc19IID0gcnRrX2xlMTZfdG9fY3B1KGJzc2lkX2FkZHJlc3NfSCk7CgoJcEhhbG1hY19hZGFwdGVyLT5wSGFsX2Jzc19hZGRyW2hhbG1hY19wb3J0XS5BZGRyZXNzX0xfSC5BZGRyZXNzX0xvdyA9IGJzc2lkX2FkZHJlc3NfTDsKCXBIYWxtYWNfYWRhcHRlci0+cEhhbF9ic3NfYWRkcltoYWxtYWNfcG9ydF0uQWRkcmVzc19MX0guQWRkcmVzc19IaWdoID0gYnNzaWRfYWRkcmVzc19IOwoKCXN3aXRjaCAoaGFsbWFjX3BvcnQpIHsKCWNhc2UgSEFMTUFDX1BPUlRJRDA6CgkJSEFMTUFDX1JFR19XUklURV8zMihwSGFsbWFjX2FkYXB0ZXIsIFJFR19CU1NJRCwgYnNzaWRfYWRkcmVzc19MKTsKCQlIQUxNQUNfUkVHX1dSSVRFXzE2KHBIYWxtYWNfYWRhcHRlciwgUkVHX0JTU0lEICsgNCwgYnNzaWRfYWRkcmVzc19IKTsKCQlicmVhazsKCgljYXNlIEhBTE1BQ19QT1JUSUQxOgoJCUhBTE1BQ19SRUdfV1JJVEVfMzIocEhhbG1hY19hZGFwdGVyLCBSRUdfQlNTSUQxLCBic3NpZF9hZGRyZXNzX0wpOwoJCUhBTE1BQ19SRUdfV1JJVEVfMTYocEhhbG1hY19hZGFwdGVyLCBSRUdfQlNTSUQxICsgNCwgYnNzaWRfYWRkcmVzc19IKTsKCQlicmVhazsKCgljYXNlIEhBTE1BQ19QT1JUSUQyOgoJCUhBTE1BQ19SRUdfV1JJVEVfMzIocEhhbG1hY19hZGFwdGVyLCBSRUdfQlNTSUQyLCBic3NpZF9hZGRyZXNzX0wpOwoJCUhBTE1BQ19SRUdfV1JJVEVfMTYocEhhbG1hY19hZGFwdGVyLCBSRUdfQlNTSUQyICsgNCwgYnNzaWRfYWRkcmVzc19IKTsKCQlicmVhazsKCgljYXNlIEhBTE1BQ19QT1JUSUQzOgoJCUhBTE1BQ19SRUdfV1JJVEVfMzIocEhhbG1hY19hZGFwdGVyLCBSRUdfQlNTSUQzLCBic3NpZF9hZGRyZXNzX0wpOwoJCUhBTE1BQ19SRUdfV1JJVEVfMTYocEhhbG1hY19hZGFwdGVyLCBSRUdfQlNTSUQzICsgNCwgYnNzaWRfYWRkcmVzc19IKTsKCQlicmVhazsKCgljYXNlIEhBTE1BQ19QT1JUSUQ0OgoJCUhBTE1BQ19SRUdfV1JJVEVfMzIocEhhbG1hY19hZGFwdGVyLCBSRUdfQlNTSUQ0LCBic3NpZF9hZGRyZXNzX0wpOwoJCUhBTE1BQ19SRUdfV1JJVEVfMTYocEhhbG1hY19hZGFwdGVyLCBSRUdfQlNTSUQ0ICsgNCwgYnNzaWRfYWRkcmVzc19IKTsKCQlicmVhazsKCglkZWZhdWx0OgoJCWJyZWFrOwoJfQoKCVBMQVRGT1JNX01TR19QUklOVChwRHJpdmVyX2FkYXB0ZXIsIEhBTE1BQ19NU0dfSU5JVCwgSEFMTUFDX0RCR19UUkFDRSwgIltUUkFDRV1oYWxtYWNfY2ZnX2Jzc2lkXzg4eHggPD09PT09PT09PT1cbiIpOwoKCXJldHVybiBIQUxNQUNfUkVUX1NVQ0NFU1M7Cn0KCi8qKgogKiBoYWxtYWNfY2ZnX3RyYW5zbWl0dGVyX2FkZHJfODh4eCgpIC0gY29uZmlnIHRyYW5zbWl0dGVyIGFkZHJlc3MKICogQHBIYWxtYWNfYWRhcHRlcgogKiBAaGFsbWFjX3BvcnQgOiAgMCBmb3IgcG9ydDAsIDEgZm9yIHBvcnQxLCAyIGZvciBwb3J0MiwgMyBmb3IgcG9ydDMsIDQgZm9yIHBvcnQ0CiAqIEBwSGFsX2FkZHJlc3MKICogQXV0aG9yIDogQWxhbgogKiBSZXR1cm4gOiBIQUxNQUNfUkVUX1NUQVRVUwogKi8KSEFMTUFDX1JFVF9TVEFUVVMKaGFsbWFjX2NmZ190cmFuc21pdHRlcl9hZGRyXzg4eHgoCglJTiBQSEFMTUFDX0FEQVBURVIgcEhhbG1hY19hZGFwdGVyLAoJSU4gdTggaGFsbWFjX3BvcnQsCglJTiBQSEFMTUFDX1dMQU5fQUREUiBwSGFsX2FkZHJlc3MKKQp7Cgl1MTYgbWFjX2FkZHJlc3NfSDsKCXUzMiBtYWNfYWRkcmVzc19MOwoJVk9JRCAqcERyaXZlcl9hZGFwdGVyID0gTlVMTDsKCVBIQUxNQUNfQVBJIHBIYWxtYWNfYXBpOwoKCWlmIChoYWxtYWNfYWRhcHRlcl92YWxpZGF0ZShwSGFsbWFjX2FkYXB0ZXIpICE9IEhBTE1BQ19SRVRfU1VDQ0VTUykKCQlyZXR1cm4gSEFMTUFDX1JFVF9BREFQVEVSX0lOVkFMSUQ7CgoJaWYgKGhhbG1hY19hcGlfdmFsaWRhdGUocEhhbG1hY19hZGFwdGVyKSAhPSBIQUxNQUNfUkVUX1NVQ0NFU1MpCgkJcmV0dXJuIEhBTE1BQ19SRVRfQVBJX0lOVkFMSUQ7CgoJcERyaXZlcl9hZGFwdGVyID0gcEhhbG1hY19hZGFwdGVyLT5wRHJpdmVyX2FkYXB0ZXI7CglwSGFsbWFjX2FwaSA9IChQSEFMTUFDX0FQSSlwSGFsbWFjX2FkYXB0ZXItPnBIYWxtYWNfYXBpOwoKCVBMQVRGT1JNX01TR19QUklOVChwRHJpdmVyX2FkYXB0ZXIsIEhBTE1BQ19NU0dfSU5JVCwgSEFMTUFDX0RCR19UUkFDRSwgIltUUkFDRV1oYWxtYWNfY2ZnX3RyYW5zbWl0dGVyX2FkZHJfODh4eCA9PT09PT09PT09PlxuIik7CgoJaWYgKGhhbG1hY19wb3J0ID49IEhBTE1BQ19QT1JUSURNQVgpIHsKCQlQTEFURk9STV9NU0dfUFJJTlQocERyaXZlcl9hZGFwdGVyLCBIQUxNQUNfTVNHX0lOSVQsIEhBTE1BQ19EQkdfRVJSLCAiW0VSUl1wb3J0IGluZGV4ID4gNVxuIik7CgkJcmV0dXJuIEhBTE1BQ19SRVRfUE9SVF9OT1RfU1VQUE9SVDsKCX0KCgltYWNfYWRkcmVzc19MID0gcEhhbF9hZGRyZXNzLT5BZGRyZXNzX0xfSC5BZGRyZXNzX0xvdzsKCW1hY19hZGRyZXNzX0ggPSBwSGFsX2FkZHJlc3MtPkFkZHJlc3NfTF9ILkFkZHJlc3NfSGlnaDsKCgltYWNfYWRkcmVzc19MID0gcnRrX2xlMzJfdG9fY3B1KG1hY19hZGRyZXNzX0wpOwoJbWFjX2FkZHJlc3NfSCA9IHJ0a19sZTE2X3RvX2NwdShtYWNfYWRkcmVzc19IKTsKCglwSGFsbWFjX2FkYXB0ZXItPnBIYWxfdHhfYWRkcltoYWxtYWNfcG9ydF0uQWRkcmVzc19MX0guQWRkcmVzc19Mb3cgPSBtYWNfYWRkcmVzc19MOwoJcEhhbG1hY19hZGFwdGVyLT5wSGFsX3R4X2FkZHJbaGFsbWFjX3BvcnRdLkFkZHJlc3NfTF9ILkFkZHJlc3NfSGlnaCA9IG1hY19hZGRyZXNzX0g7CgoJc3dpdGNoIChoYWxtYWNfcG9ydCkgewoJY2FzZSBIQUxNQUNfUE9SVElEMDoKCQlIQUxNQUNfUkVHX1dSSVRFXzMyKHBIYWxtYWNfYWRhcHRlciwgUkVHX1RSQU5TTUlUX0FERFJTU18wLCBtYWNfYWRkcmVzc19MKTsKCQlIQUxNQUNfUkVHX1dSSVRFXzE2KHBIYWxtYWNfYWRhcHRlciwgUkVHX1RSQU5TTUlUX0FERFJTU18wICsgNCwgbWFjX2FkZHJlc3NfSCk7CgkJYnJlYWs7CgoJY2FzZSBIQUxNQUNfUE9SVElEMToKCQlIQUxNQUNfUkVHX1dSSVRFXzMyKHBIYWxtYWNfYWRhcHRlciwgUkVHX1RSQU5TTUlUX0FERFJTU18xLCBtYWNfYWRkcmVzc19MKTsKCQlIQUxNQUNfUkVHX1dSSVRFXzE2KHBIYWxtYWNfYWRhcHRlciwgUkVHX1RSQU5TTUlUX0FERFJTU18xICsgNCwgbWFjX2FkZHJlc3NfSCk7CgkJYnJlYWs7CgoJY2FzZSBIQUxNQUNfUE9SVElEMjoKCQlIQUxNQUNfUkVHX1dSSVRFXzMyKHBIYWxtYWNfYWRhcHRlciwgUkVHX1RSQU5TTUlUX0FERFJTU18yLCBtYWNfYWRkcmVzc19MKTsKCQlIQUxNQUNfUkVHX1dSSVRFXzE2KHBIYWxtYWNfYWRhcHRlciwgUkVHX1RSQU5TTUlUX0FERFJTU18yICsgNCwgbWFjX2FkZHJlc3NfSCk7CgkJYnJlYWs7CgoJY2FzZSBIQUxNQUNfUE9SVElEMzoKCQlIQUxNQUNfUkVHX1dSSVRFXzMyKHBIYWxtYWNfYWRhcHRlciwgUkVHX1RSQU5TTUlUX0FERFJTU18zLCBtYWNfYWRkcmVzc19MKTsKCQlIQUxNQUNfUkVHX1dSSVRFXzE2KHBIYWxtYWNfYWRhcHRlciwgUkVHX1RSQU5TTUlUX0FERFJTU18zICsgNCwgbWFjX2FkZHJlc3NfSCk7CgkJYnJlYWs7CgoJY2FzZSBIQUxNQUNfUE9SVElENDoKCQlIQUxNQUNfUkVHX1dSSVRFXzMyKHBIYWxtYWNfYWRhcHRlciwgUkVHX1RSQU5TTUlUX0FERFJTU180LCBtYWNfYWRkcmVzc19MKTsKCQlIQUxNQUNfUkVHX1dSSVRFXzE2KHBIYWxtYWNfYWRhcHRlciwgUkVHX1RSQU5TTUlUX0FERFJTU180ICsgNCwgbWFjX2FkZHJlc3NfSCk7CgkJYnJlYWs7CgoJZGVmYXVsdDoKCQlicmVhazsKCX0KCglQTEFURk9STV9NU0dfUFJJTlQocERyaXZlcl9hZGFwdGVyLCBIQUxNQUNfTVNHX0lOSVQsIEhBTE1BQ19EQkdfVFJBQ0UsICJbVFJBQ0VdaGFsbWFjX2NmZ190cmFuc21pdHRlcl9hZGRyXzg4eHggPD09PT09PT09PT1cbiIpOwoKCXJldHVybiBIQUxNQUNfUkVUX1NVQ0NFU1M7Cn0KCi8qKgogKiBoYWxtYWNfY2ZnX25ldF90eXBlXzg4eHgoKSAtIGNvbmZpZyBuZXR3b3JrIHR5cGUKICogQHBIYWxtYWNfYWRhcHRlcgogKiBAaGFsbWFjX3BvcnQgOiAgMCBmb3IgcG9ydDAsIDEgZm9yIHBvcnQxLCAyIGZvciBwb3J0MiwgMyBmb3IgcG9ydDMsIDQgZm9yIHBvcnQ0CiAqIEBwSGFsX2FkZHJlc3MgOiBtYWMgYWRkcmVzcwogKiBBdXRob3IgOiBBbGFuCiAqIFJldHVybiA6IEhBTE1BQ19SRVRfU1RBVFVTCiAqLwpIQUxNQUNfUkVUX1NUQVRVUwpoYWxtYWNfY2ZnX25ldF90eXBlXzg4eHgoCglJTiBQSEFMTUFDX0FEQVBURVIgcEhhbG1hY19hZGFwdGVyLAoJSU4gdTggaGFsbWFjX3BvcnQsCglJTiBIQUxNQUNfTkVUV09SS19UWVBFX1NFTEVDVCBuZXRfdHlwZQopCnsKCVZPSUQgKnBEcml2ZXJfYWRhcHRlciA9IE5VTEw7CglQSEFMTUFDX0FQSSBwSGFsbWFjX2FwaTsKCXU4CW5ldHdvcmt0eXBlID0gMDsKCXU4CW5ldF90eXBlX3RlbXAgPSAwOwoKCWlmIChoYWxtYWNfYWRhcHRlcl92YWxpZGF0ZShwSGFsbWFjX2FkYXB0ZXIpICE9IEhBTE1BQ19SRVRfU1VDQ0VTUykKCQlyZXR1cm4gSEFMTUFDX1JFVF9BREFQVEVSX0lOVkFMSUQ7CgoJaWYgKGhhbG1hY19hcGlfdmFsaWRhdGUocEhhbG1hY19hZGFwdGVyKSAhPSBIQUxNQUNfUkVUX1NVQ0NFU1MpCgkJcmV0dXJuIEhBTE1BQ19SRVRfQVBJX0lOVkFMSUQ7CgoJcERyaXZlcl9hZGFwdGVyID0gcEhhbG1hY19hZGFwdGVyLT5wRHJpdmVyX2FkYXB0ZXI7CglwSGFsbWFjX2FwaSA9IChQSEFMTUFDX0FQSSlwSGFsbWFjX2FkYXB0ZXItPnBIYWxtYWNfYXBpOwoKCVBMQVRGT1JNX01TR19QUklOVChwRHJpdmVyX2FkYXB0ZXIsIEhBTE1BQ19NU0dfSU5JVCwgSEFMTUFDX0RCR19UUkFDRSwgIltUUkFDRV1oYWxtYWNfY2ZnX25ldF90eXBlXzg4eHggPT09PT09PT09PT5cbiIpOwoKCWlmIChuZXRfdHlwZSA9PSBIQUxNQUNfTkVUV09SS19BUCkgewoJCWlmIChoYWxtYWNfcG9ydCA+PSBIQUxNQUNfUE9SVElEMSkgewoJCQlQTEFURk9STV9NU0dfUFJJTlQocERyaXZlcl9hZGFwdGVyLCBIQUxNQUNfTVNHX0lOSVQsIEhBTE1BQ19EQkdfRVJSLCAiW0VSUl1BUCBwb3J0IGluZGV4ID4gMVxuIik7CgkJCXJldHVybiBIQUxNQUNfUkVUX1BPUlRfTk9UX1NVUFBPUlQ7CgkJfQoJfQoKCXN3aXRjaCAoaGFsbWFjX3BvcnQpIHsKCWNhc2UgSEFMTUFDX1BPUlRJRDA6CgkJLyogcmVnIDB4MTAwWzE3OjE2XSovCgkJbmV0X3R5cGVfdGVtcCA9IG5ldF90eXBlOwoJCW5ldHdvcmt0eXBlID0gKChIQUxNQUNfUkVHX1JFQURfOChwSGFsbWFjX2FkYXB0ZXIsIFJFR19DUiArIDIpICYgMHhGQykgfCBuZXRfdHlwZV90ZW1wKTsKCQlIQUxNQUNfUkVHX1dSSVRFXzgocEhhbG1hY19hZGFwdGVyLCBSRUdfQ1IgKyAyLCBuZXR3b3JrdHlwZSk7CgkJYnJlYWs7CgljYXNlIEhBTE1BQ19QT1JUSUQxOgoJCS8qIHJlZyAweDEwMFsxOToxOF0qLwoJCW5ldF90eXBlX3RlbXAgPSAobmV0X3R5cGUgPDwgMik7CgkJbmV0d29ya3R5cGUgPSAoKEhBTE1BQ19SRUdfUkVBRF84KHBIYWxtYWNfYWRhcHRlciwgUkVHX0NSICsgMikgJiAweEYzKSB8IG5ldF90eXBlX3RlbXApOwoJCUhBTE1BQ19SRUdfV1JJVEVfOChwSGFsbWFjX2FkYXB0ZXIsIFJFR19DUiArIDIsIG5ldHdvcmt0eXBlKTsKCQlicmVhazsKCWNhc2UgSEFMTUFDX1BPUlRJRDI6CgkJLyogcmVnIDB4MTEwMFsxOjBdKi8KCQluZXRfdHlwZV90ZW1wID0gbmV0X3R5cGU7CgkJbmV0d29ya3R5cGUgPSAoKEhBTE1BQ19SRUdfUkVBRF84KHBIYWxtYWNfYWRhcHRlciwgUkVHX0NSX0VYVCkgJiAweEZDKSB8IG5ldF90eXBlX3RlbXApOwoJCUhBTE1BQ19SRUdfV1JJVEVfOChwSGFsbWFjX2FkYXB0ZXIsIFJFR19DUl9FWFQsIG5ldHdvcmt0eXBlKTsKCQlicmVhazsKCWNhc2UgSEFMTUFDX1BPUlRJRDM6CgkJLyogcmVnIDB4MTEwMFszOjJdKi8KCQluZXRfdHlwZV90ZW1wID0gKG5ldF90eXBlIDw8IDIpOwoJCW5ldHdvcmt0eXBlID0gKChIQUxNQUNfUkVHX1JFQURfOChwSGFsbWFjX2FkYXB0ZXIsIFJFR19DUl9FWFQpICYgMHhGMykgfCBuZXRfdHlwZV90ZW1wKTsKCQlIQUxNQUNfUkVHX1dSSVRFXzgocEhhbG1hY19hZGFwdGVyLCBSRUdfQ1JfRVhULCBuZXR3b3JrdHlwZSk7CgkJYnJlYWs7CgljYXNlIEhBTE1BQ19QT1JUSUQ0OgoJCS8qIHJlZyAweDExMDBbNTo0XSovCgkJbmV0X3R5cGVfdGVtcCA9IChuZXRfdHlwZSA8PCA0KTsKCQluZXR3b3JrdHlwZSA9ICgoSEFMTUFDX1JFR19SRUFEXzgocEhhbG1hY19hZGFwdGVyLCBSRUdfQ1JfRVhUKSAmIDB4Q0YpIHwgbmV0X3R5cGVfdGVtcCk7CgkJSEFMTUFDX1JFR19XUklURV84KHBIYWxtYWNfYWRhcHRlciwgUkVHX0NSX0VYVCwgbmV0d29ya3R5cGUpOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQlicmVhazsKCX0KCglQTEFURk9STV9NU0dfUFJJTlQocERyaXZlcl9hZGFwdGVyLCBIQUxNQUNfTVNHX0lOSVQsIEhBTE1BQ19EQkdfVFJBQ0UsICJbVFJBQ0VdaGFsbWFjX2NmZ19uZXRfdHlwZV84OHh4IDw9PT09PT09PT09XG4iKTsKCglyZXR1cm4gSEFMTUFDX1JFVF9TVUNDRVNTOwp9CgovKioKICogaGFsbWFjX2NmZ190c2ZfcnN0Xzg4eHgoKSAtIHRzZiByZXNldAogKiBAcEhhbG1hY19hZGFwdGVyCiAqIEBoYWxtYWNfcG9ydCA6ICAwIGZvciBwb3J0MCwgMSBmb3IgcG9ydDEsIDIgZm9yIHBvcnQyLCAzIGZvciBwb3J0MywgNCBmb3IgcG9ydDQKICogQXV0aG9yIDogQWxhbgogKiBSZXR1cm4gOiBIQUxNQUNfUkVUX1NUQVRVUwogKi8KSEFMTUFDX1JFVF9TVEFUVVMKaGFsbWFjX2NmZ190c2ZfcnN0Xzg4eHgoCglJTiBQSEFMTUFDX0FEQVBURVIgcEhhbG1hY19hZGFwdGVyLAoJSU4gdTggaGFsbWFjX3BvcnQKKQp7CglWT0lEICpwRHJpdmVyX2FkYXB0ZXIgPSBOVUxMOwoJUEhBTE1BQ19BUEkgcEhhbG1hY19hcGk7CgoJaWYgKGhhbG1hY19hZGFwdGVyX3ZhbGlkYXRlKHBIYWxtYWNfYWRhcHRlcikgIT0gSEFMTUFDX1JFVF9TVUNDRVNTKQoJCXJldHVybiBIQUxNQUNfUkVUX0FEQVBURVJfSU5WQUxJRDsKCglpZiAoaGFsbWFjX2FwaV92YWxpZGF0ZShwSGFsbWFjX2FkYXB0ZXIpICE9IEhBTE1BQ19SRVRfU1VDQ0VTUykKCQlyZXR1cm4gSEFMTUFDX1JFVF9BUElfSU5WQUxJRDsKCglwRHJpdmVyX2FkYXB0ZXIgPSBwSGFsbWFjX2FkYXB0ZXItPnBEcml2ZXJfYWRhcHRlcjsKCXBIYWxtYWNfYXBpID0gKFBIQUxNQUNfQVBJKXBIYWxtYWNfYWRhcHRlci0+cEhhbG1hY19hcGk7CgoJUExBVEZPUk1fTVNHX1BSSU5UKHBEcml2ZXJfYWRhcHRlciwgSEFMTUFDX01TR19JTklULCBIQUxNQUNfREJHX1RSQUNFLCAiW1RSQUNFXWhhbG1hY19jZmdfdHNmX3JzdF84OHh4ID09PT09PT09PT0+XG4iKTsKCglzd2l0Y2ggKGhhbG1hY19wb3J0KSB7CgljYXNlIEhBTE1BQ19QT1JUSUQwOgoJCUhBTE1BQ19SRUdfV1JJVEVfOChwSGFsbWFjX2FkYXB0ZXIsIFJFR19EVUFMX1RTRl9SU1QsIEhBTE1BQ19SRUdfUkVBRF84KHBIYWxtYWNfYWRhcHRlciwgUkVHX0RVQUxfVFNGX1JTVCkgfCBCSVRfVFNGVFJfUlNUKTsKCQlicmVhazsKCWNhc2UgSEFMTUFDX1BPUlRJRDE6CgkJSEFMTUFDX1JFR19XUklURV84KHBIYWxtYWNfYWRhcHRlciwgUkVHX0RVQUxfVFNGX1JTVCwgSEFMTUFDX1JFR19SRUFEXzgocEhhbG1hY19hZGFwdGVyLCBSRUdfRFVBTF9UU0ZfUlNUKSB8IEJJVF9UU0ZUUl9DTEkwX1JTVCk7CgkJYnJlYWs7CgljYXNlIEhBTE1BQ19QT1JUSUQyOgoJCUhBTE1BQ19SRUdfV1JJVEVfOChwSGFsbWFjX2FkYXB0ZXIsIFJFR19EVUFMX1RTRl9SU1QsIEhBTE1BQ19SRUdfUkVBRF84KHBIYWxtYWNfYWRhcHRlciwgUkVHX0RVQUxfVFNGX1JTVCkgfCBCSVRfVFNGVFJfQ0xJMV9SU1QpOwoJCWJyZWFrOwoJY2FzZSBIQUxNQUNfUE9SVElEMzoKCQlIQUxNQUNfUkVHX1dSSVRFXzgocEhhbG1hY19hZGFwdGVyLCBSRUdfRFVBTF9UU0ZfUlNULCBIQUxNQUNfUkVHX1JFQURfOChwSGFsbWFjX2FkYXB0ZXIsIFJFR19EVUFMX1RTRl9SU1QpIHwgQklUX1RTRlRSX0NMSTJfUlNUKTsKCQlicmVhazsKCWNhc2UgSEFMTUFDX1BPUlRJRDQ6CgkJSEFMTUFDX1JFR19XUklURV84KHBIYWxtYWNfYWRhcHRlciwgUkVHX0RVQUxfVFNGX1JTVCwgSEFMTUFDX1JFR19SRUFEXzgocEhhbG1hY19hZGFwdGVyLCBSRUdfRFVBTF9UU0ZfUlNUKSB8IEJJVF9UU0ZUUl9DTEkzX1JTVCk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCWJyZWFrOwoJfQoKCVBMQVRGT1JNX01TR19QUklOVChwRHJpdmVyX2FkYXB0ZXIsIEhBTE1BQ19NU0dfSU5JVCwgSEFMTUFDX0RCR19UUkFDRSwgIltUUkFDRV1oYWxtYWNfY2ZnX3RzZl9yc3RfODh4eCA8PT09PT09PT09PVxuIik7CgoJcmV0dXJuIEhBTE1BQ19SRVRfU1VDQ0VTUzsKfQoKLyoqCiAqIGhhbG1hY19jZmdfYmNuX3NwYWNlXzg4eHgoKSAtIGNvbmZpZyBiZWFjb24gc3BhY2UKICogQHBIYWxtYWNfYWRhcHRlcgogKiBAaGFsbWFjX3BvcnQgOiAgMCBmb3IgcG9ydDAsIDEgZm9yIHBvcnQxLCAyIGZvciBwb3J0MiwgMyBmb3IgcG9ydDMsIDQgZm9yIHBvcnQ0CiAqIEBiY25fc3BhY2UgOiBiZWFjb24gc3BhY2UKICogQXV0aG9yIDogQWxhbgogKiBSZXR1cm4gOiBIQUxNQUNfUkVUX1NUQVRVUwogKi8KSEFMTUFDX1JFVF9TVEFUVVMKaGFsbWFjX2NmZ19iY25fc3BhY2VfODh4eCgKCUlOIFBIQUxNQUNfQURBUFRFUiBwSGFsbWFjX2FkYXB0ZXIsCglJTiB1OCBoYWxtYWNfcG9ydCwKCUlOIHUzMiBiY25fc3BhY2UKKQp7CglWT0lEICpwRHJpdmVyX2FkYXB0ZXIgPSBOVUxMOwoJUEhBTE1BQ19BUEkgcEhhbG1hY19hcGk7Cgl1MTYJYmNuX3NwYWNlX3JlYWwgPSAwOwoJdTE2CWJjbl9zcGFjZV90ZW1wID0gMDsKCglpZiAoaGFsbWFjX2FkYXB0ZXJfdmFsaWRhdGUocEhhbG1hY19hZGFwdGVyKSAhPSBIQUxNQUNfUkVUX1NVQ0NFU1MpCgkJcmV0dXJuIEhBTE1BQ19SRVRfQURBUFRFUl9JTlZBTElEOwoKCWlmIChoYWxtYWNfYXBpX3ZhbGlkYXRlKHBIYWxtYWNfYWRhcHRlcikgIT0gSEFMTUFDX1JFVF9TVUNDRVNTKQoJCXJldHVybiBIQUxNQUNfUkVUX0FQSV9JTlZBTElEOwoKCXBEcml2ZXJfYWRhcHRlciA9IHBIYWxtYWNfYWRhcHRlci0+cERyaXZlcl9hZGFwdGVyOwoJcEhhbG1hY19hcGkgPSAoUEhBTE1BQ19BUEkpcEhhbG1hY19hZGFwdGVyLT5wSGFsbWFjX2FwaTsKCglQTEFURk9STV9NU0dfUFJJTlQocERyaXZlcl9hZGFwdGVyLCBIQUxNQUNfTVNHX0lOSVQsIEhBTE1BQ19EQkdfVFJBQ0UsICJbVFJBQ0VdaGFsbWFjX2NmZ19iY25fc3BhY2VfODh4eCA9PT09PT09PT09PlxuIik7CgoJYmNuX3NwYWNlX3JlYWwgPSAoKHUxNiliY25fc3BhY2UpOwoKCXN3aXRjaCAoaGFsbWFjX3BvcnQpIHsKCWNhc2UgSEFMTUFDX1BPUlRJRDA6CgkJLypyZWcgMHg1NTRbMTU6MF0qLwoJCUhBTE1BQ19SRUdfV1JJVEVfMTYocEhhbG1hY19hZGFwdGVyLCBSRUdfTUJTU0lEX0JDTl9TUEFDRSwgYmNuX3NwYWNlX3JlYWwpOwoJCWJyZWFrOwoKCWNhc2UgSEFMTUFDX1BPUlRJRDE6CgkJLypyZWcgMHg1NTRbMjc6MTZdKi8KCQliY25fc3BhY2VfdGVtcCA9ICgoSEFMTUFDX1JFR19SRUFEXzE2KHBIYWxtYWNfYWRhcHRlciwgUkVHX01CU1NJRF9CQ05fU1BBQ0UgKyAyKSAmIDB4RjAwMCkgfCBiY25fc3BhY2VfcmVhbCk7CgkJSEFMTUFDX1JFR19XUklURV8xNihwSGFsbWFjX2FkYXB0ZXIsIFJFR19NQlNTSURfQkNOX1NQQUNFICsgMiwgYmNuX3NwYWNlX3RlbXApOwoJCWJyZWFrOwoKCWNhc2UgSEFMTUFDX1BPUlRJRDI6CgkJLypyZWcgMHg1QjhbMTE6MF0qLwoJCWJjbl9zcGFjZV90ZW1wID0gKChIQUxNQUNfUkVHX1JFQURfMTYocEhhbG1hY19hZGFwdGVyLCBSRUdfTUJTU0lEX0JDTl9TUEFDRTIpICYgMHhGMDAwKSB8IGJjbl9zcGFjZV9yZWFsKTsKCQlIQUxNQUNfUkVHX1dSSVRFXzE2KHBIYWxtYWNfYWRhcHRlciwgUkVHX01CU1NJRF9CQ05fU1BBQ0UyLCBiY25fc3BhY2VfdGVtcCk7CgkJYnJlYWs7CgoJY2FzZSBIQUxNQUNfUE9SVElEMzoKCQkvKnJlZyAweDVCOFsyNzoxNl0qLwoJCWJjbl9zcGFjZV90ZW1wID0gKChIQUxNQUNfUkVHX1JFQURfMTYocEhhbG1hY19hZGFwdGVyLCBSRUdfTUJTU0lEX0JDTl9TUEFDRTIgKyAyKSAmIDB4RjAwMCkgfCBiY25fc3BhY2VfcmVhbCk7CgkJSEFMTUFDX1JFR19XUklURV8xNihwSGFsbWFjX2FkYXB0ZXIsIFJFR19NQlNTSURfQkNOX1NQQUNFMiArIDIsIGJjbl9zcGFjZV90ZW1wKTsKCQlicmVhazsKCgljYXNlIEhBTE1BQ19QT1JUSUQ0OgoJCS8qcmVnIDB4NUJDWzExOjBdKi8KCQliY25fc3BhY2VfdGVtcCA9ICgoSEFMTUFDX1JFR19SRUFEXzE2KHBIYWxtYWNfYWRhcHRlciwgUkVHX01CU1NJRF9CQ05fU1BBQ0UzKSAmIDB4RjAwMCkgfCBiY25fc3BhY2VfcmVhbCk7CgkJSEFMTUFDX1JFR19XUklURV8xNihwSGFsbWFjX2FkYXB0ZXIsIFJFR19NQlNTSURfQkNOX1NQQUNFMywgYmNuX3NwYWNlX3RlbXApOwoJCWJyZWFrOwoKCWRlZmF1bHQ6CgkJYnJlYWs7Cgl9CgoJUExBVEZPUk1fTVNHX1BSSU5UKHBEcml2ZXJfYWRhcHRlciwgSEFMTUFDX01TR19JTklULCBIQUxNQUNfREJHX1RSQUNFLCAiW1RSQUNFXWhhbG1hY19jZmdfYmNuX3NwYWNlXzg4eHggPD09PT09PT09PT1cbiIpOwoKCXJldHVybiBIQUxNQUNfUkVUX1NVQ0NFU1M7Cn0KCi8qKgogKiBoYWxtYWNfcndfYmNuX2N0cmxfODh4eCgpIC0gci93IGJlYWNvbiBjb250cm9sCiAqIEBwSGFsbWFjX2FkYXB0ZXIKICogQGhhbG1hY19wb3J0IDogIDAgZm9yIHBvcnQwLCAxIGZvciBwb3J0MSwgMiBmb3IgcG9ydDIsIDMgZm9yIHBvcnQzLCA0IGZvciBwb3J0NAogKiBAd3JpdGVfZW4gOiAxLT53cml0ZSBiZWFjb24gZnVuY3Rpb24gMC0+cmVhZCBiZWFjb24gZnVuY3Rpb24KICogQHBCY25fY3RybCA6IGJlYWNvbiBjb250cm9sIGluZm8KICogQXV0aG9yIDogS2FpWXVhbiBDaGFuZy9JdmFuIExpbgogKiBSZXR1cm4gOiBIQUxNQUNfUkVUX1NUQVRVUwogKi8KSEFMTUFDX1JFVF9TVEFUVVMKaGFsbWFjX3J3X2Jjbl9jdHJsXzg4eHgoCglJTiBQSEFMTUFDX0FEQVBURVIgcEhhbG1hY19hZGFwdGVyLAoJSU4gdTggaGFsbWFjX3BvcnQsCglJTiB1OCB3cml0ZV9lbiwKCUlOT1VUIFBIQUxNQUNfQkNOX0NUUkwgcEJjbl9jdHJsCikKewoJVk9JRCAqcERyaXZlcl9hZGFwdGVyID0gTlVMTDsKCVBIQUxNQUNfQVBJIHBIYWxtYWNfYXBpOwoJdTgJQkNOX0NUUkxfVmFsdWUgPSAwOwoKCWlmIChoYWxtYWNfYWRhcHRlcl92YWxpZGF0ZShwSGFsbWFjX2FkYXB0ZXIpICE9IEhBTE1BQ19SRVRfU1VDQ0VTUykKCQlyZXR1cm4gSEFMTUFDX1JFVF9BREFQVEVSX0lOVkFMSUQ7CgoJaWYgKGhhbG1hY19hcGlfdmFsaWRhdGUocEhhbG1hY19hZGFwdGVyKSAhPSBIQUxNQUNfUkVUX1NVQ0NFU1MpCgkJcmV0dXJuIEhBTE1BQ19SRVRfQVBJX0lOVkFMSUQ7CgoJcERyaXZlcl9hZGFwdGVyID0gcEhhbG1hY19hZGFwdGVyLT5wRHJpdmVyX2FkYXB0ZXI7CglwSGFsbWFjX2FwaSA9IChQSEFMTUFDX0FQSSlwSGFsbWFjX2FkYXB0ZXItPnBIYWxtYWNfYXBpOwoKCVBMQVRGT1JNX01TR19QUklOVChwRHJpdmVyX2FkYXB0ZXIsIEhBTE1BQ19NU0dfSU5JVCwgSEFMTUFDX0RCR19UUkFDRSwgIltUUkFDRV1oYWxtYWNfcndfYmNuX2N0cmxfODh4eCA9PT09PT09PT09PlxuIik7CgoJaWYgKHdyaXRlX2VuKSB7CgkJaWYgKHBCY25fY3RybC0+ZGlzX3J4X2Jzc2lkX2ZpdCA9PSBfVFJVRSkKCQkJQkNOX0NUUkxfVmFsdWUgPSAoQkNOX0NUUkxfVmFsdWUgfCBCSVRfRElTX1JYX0JTU0lEX0ZJVCk7CgoJCWlmIChwQmNuX2N0cmwtPmVuX3R4YmNuX3JwdCA9PSBfVFJVRSkKCQkJQkNOX0NUUkxfVmFsdWUgPSAoQkNOX0NUUkxfVmFsdWUgfCBCSVRfUDBfRU5fVFhCQ05fUlBUKTsKCgkJaWYgKHBCY25fY3RybC0+ZGlzX3RzZl91ZHQgPT0gX1RSVUUpCgkJCUJDTl9DVFJMX1ZhbHVlID0gKEJDTl9DVFJMX1ZhbHVlIHwgQklUX0RJU19UU0ZfVURUKTsKCgkJaWYgKHBCY25fY3RybC0+ZW5fYmNuID09IF9UUlVFKQoJCQlCQ05fQ1RSTF9WYWx1ZSA9IChCQ05fQ1RSTF9WYWx1ZSB8IEJJVF9FTl9CQ05fRlVOQ1RJT04pOwoKCQlpZiAocEJjbl9jdHJsLT5lbl9yeGJjbl9ycHQgPT0gX1RSVUUpCgkJCUJDTl9DVFJMX1ZhbHVlID0gKEJDTl9DVFJMX1ZhbHVlIHwgQklUX1AwX0VOX1JYQkNOX1JQVCk7CgoJCWlmIChwQmNuX2N0cmwtPmVuX3AycF9jdHdpbiA9PSBfVFJVRSkKCQkJQkNOX0NUUkxfVmFsdWUgPSAoQkNOX0NUUkxfVmFsdWUgfCBCSVRfRU5fUDJQX0NUV0lORE9XKTsKCgkJaWYgKHBCY25fY3RybC0+ZW5fcDJwX2Jjbl9hcmVhID09IF9UUlVFKQoJCQlCQ05fQ1RSTF9WYWx1ZSA9IChCQ05fQ1RSTF9WYWx1ZSB8IEJJVF9FTl9QMlBfQkNOUV9BUkVBKTsKCgkJc3dpdGNoIChoYWxtYWNfcG9ydCkgewoJCWNhc2UgSEFMTUFDX1BPUlRJRDA6CgkJCUhBTE1BQ19SRUdfV1JJVEVfOChwSGFsbWFjX2FkYXB0ZXIsIFJFR19CQ05fQ1RSTCwgQkNOX0NUUkxfVmFsdWUpOwoJCQlicmVhazsKCgkJY2FzZSBIQUxNQUNfUE9SVElEMToKCQkJSEFMTUFDX1JFR19XUklURV84KHBIYWxtYWNfYWRhcHRlciwgUkVHX0JDTl9DVFJMX0NMSU5UMCwgQkNOX0NUUkxfVmFsdWUpOwoJCQlicmVhazsKCgkJY2FzZSBIQUxNQUNfUE9SVElEMjoKCQkJSEFMTUFDX1JFR19XUklURV84KHBIYWxtYWNfYWRhcHRlciwgUkVHX0JDTl9DVFJMX0NMSU5UMSwgQkNOX0NUUkxfVmFsdWUpOwoJCQlicmVhazsKCgkJY2FzZSBIQUxNQUNfUE9SVElEMzoKCQkJSEFMTUFDX1JFR19XUklURV84KHBIYWxtYWNfYWRhcHRlciwgUkVHX0JDTl9DVFJMX0NMSU5UMiwgQkNOX0NUUkxfVmFsdWUpOwoJCQlicmVhazsKCgkJY2FzZSBIQUxNQUNfUE9SVElENDoKCQkJSEFMTUFDX1JFR19XUklURV84KHBIYWxtYWNfYWRhcHRlciwgUkVHX0JDTl9DVFJMX0NMSU5UMywgQkNOX0NUUkxfVmFsdWUpOwoJCQlicmVhazsKCgkJZGVmYXVsdDoKCQkJYnJlYWs7CgkJfQoKCX0gZWxzZSB7CgkJc3dpdGNoIChoYWxtYWNfcG9ydCkgewoJCWNhc2UgSEFMTUFDX1BPUlRJRDA6CgkJCUJDTl9DVFJMX1ZhbHVlID0gSEFMTUFDX1JFR19SRUFEXzgocEhhbG1hY19hZGFwdGVyLCBSRUdfQkNOX0NUUkwpOwoJCQlicmVhazsKCgkJY2FzZSBIQUxNQUNfUE9SVElEMToKCQkJQkNOX0NUUkxfVmFsdWUgPSBIQUxNQUNfUkVHX1JFQURfOChwSGFsbWFjX2FkYXB0ZXIsIFJFR19CQ05fQ1RSTF9DTElOVDApOwoJCQlicmVhazsKCgkJY2FzZSBIQUxNQUNfUE9SVElEMjoKCQkJQkNOX0NUUkxfVmFsdWUgPSBIQUxNQUNfUkVHX1JFQURfOChwSGFsbWFjX2FkYXB0ZXIsIFJFR19CQ05fQ1RSTF9DTElOVDEpOwoJCQlicmVhazsKCgkJY2FzZSBIQUxNQUNfUE9SVElEMzoKCQkJQkNOX0NUUkxfVmFsdWUgPSBIQUxNQUNfUkVHX1JFQURfOChwSGFsbWFjX2FkYXB0ZXIsIFJFR19CQ05fQ1RSTF9DTElOVDIpOwoJCQlicmVhazsKCgkJY2FzZSBIQUxNQUNfUE9SVElENDoKCQkJQkNOX0NUUkxfVmFsdWUgPSBIQUxNQUNfUkVHX1JFQURfOChwSGFsbWFjX2FkYXB0ZXIsIFJFR19CQ05fQ1RSTF9DTElOVDMpOwoJCQlicmVhazsKCgkJZGVmYXVsdDoKCQkJYnJlYWs7CgkJfQoKCQlpZiAoQkNOX0NUUkxfVmFsdWUgJiBCSVRfRU5fUDJQX0JDTlFfQVJFQSkKCQkJcEJjbl9jdHJsLT5lbl9wMnBfYmNuX2FyZWEgPSBfVFJVRTsKCQllbHNlCgkJCXBCY25fY3RybC0+ZW5fcDJwX2Jjbl9hcmVhID0gX0ZBTFNFOwoKCQlpZiAoQkNOX0NUUkxfVmFsdWUgJiBCSVRfRU5fUDJQX0NUV0lORE9XKQoJCQlwQmNuX2N0cmwtPmVuX3AycF9jdHdpbiA9IF9UUlVFOwoJCWVsc2UKCQkJcEJjbl9jdHJsLT5lbl9wMnBfY3R3aW4gPSBfRkFMU0U7CgoJCWlmIChCQ05fQ1RSTF9WYWx1ZSAmIEJJVF9QMF9FTl9SWEJDTl9SUFQpCgkJCXBCY25fY3RybC0+ZW5fcnhiY25fcnB0ID0gX1RSVUU7CgkJZWxzZQoJCQlwQmNuX2N0cmwtPmVuX3J4YmNuX3JwdCA9IF9GQUxTRTsKCgkJaWYgKEJDTl9DVFJMX1ZhbHVlICYgQklUX0VOX0JDTl9GVU5DVElPTikKCQkJcEJjbl9jdHJsLT5lbl9iY24gPSBfVFJVRTsKCQllbHNlCgkJCXBCY25fY3RybC0+ZW5fYmNuID0gX0ZBTFNFOwoKCQlpZiAoQkNOX0NUUkxfVmFsdWUgJiBCSVRfRElTX1RTRl9VRFQpCgkJCXBCY25fY3RybC0+ZGlzX3RzZl91ZHQgPSBfVFJVRTsKCQllbHNlCgkJCXBCY25fY3RybC0+ZGlzX3RzZl91ZHQgPSBfRkFMU0U7CgoJCWlmIChCQ05fQ1RSTF9WYWx1ZSAmIEJJVF9QMF9FTl9UWEJDTl9SUFQpCgkJCXBCY25fY3RybC0+ZW5fdHhiY25fcnB0ID0gX1RSVUU7CgkJZWxzZQoJCQlwQmNuX2N0cmwtPmVuX3R4YmNuX3JwdCA9IF9GQUxTRTsKCgkJaWYgKEJDTl9DVFJMX1ZhbHVlICYgQklUX0RJU19SWF9CU1NJRF9GSVQpCgkJCXBCY25fY3RybC0+ZGlzX3J4X2Jzc2lkX2ZpdCA9IF9UUlVFOwoJCWVsc2UKCQkJcEJjbl9jdHJsLT5kaXNfcnhfYnNzaWRfZml0ID0gX0ZBTFNFOwoJfQoKCVBMQVRGT1JNX01TR19QUklOVChwRHJpdmVyX2FkYXB0ZXIsIEhBTE1BQ19NU0dfSU5JVCwgSEFMTUFDX0RCR19UUkFDRSwgIltUUkFDRV1oYWxtYWNfcndfYmNuX2N0cmxfODh4eCA8PT09PT09PT09PVxuIik7CgoJcmV0dXJuIEhBTE1BQ19SRVRfU1VDQ0VTUzsKfQoKLyoqCiAqIGhhbG1hY19jZmdfbXVsdGljYXN0X2FkZHJfODh4eCgpIC0gY29uZmlnIG11bHRpY2FzdCBhZGRyZXNzCiAqIEBwSGFsbWFjX2FkYXB0ZXIgOiB0aGUgYWRhcHRlciBvZiBoYWxtYWMKICogQHBIYWxfYWRkcmVzcyA6IG11bHRpY2FzdCBhZGRyZXNzCiAqIEF1dGhvciA6IEthaVl1YW4gQ2hhbmcvSXZhbiBMaW4KICogUmV0dXJuIDogSEFMTUFDX1JFVF9TVEFUVVMKICogTW9yZSBkZXRhaWxzIG9mIHN0YXR1cyBjb2RlIGNhbiBiZSBmb3VuZCBpbiBwcm90b3R5cGUgZG9jdW1lbnQKICovCkhBTE1BQ19SRVRfU1RBVFVTCmhhbG1hY19jZmdfbXVsdGljYXN0X2FkZHJfODh4eCgKCUlOIFBIQUxNQUNfQURBUFRFUiBwSGFsbWFjX2FkYXB0ZXIsCglJTiBQSEFMTUFDX1dMQU5fQUREUiBwSGFsX2FkZHJlc3MKKQp7Cgl1MTYgYWRkcmVzc19IOwoJdTMyIGFkZHJlc3NfTDsKCVZPSUQgKnBEcml2ZXJfYWRhcHRlciA9IE5VTEw7CglQSEFMTUFDX0FQSSBwSGFsbWFjX2FwaTsKCglpZiAoaGFsbWFjX2FkYXB0ZXJfdmFsaWRhdGUocEhhbG1hY19hZGFwdGVyKSAhPSBIQUxNQUNfUkVUX1NVQ0NFU1MpCgkJcmV0dXJuIEhBTE1BQ19SRVRfQURBUFRFUl9JTlZBTElEOwoKCWlmIChoYWxtYWNfYXBpX3ZhbGlkYXRlKHBIYWxtYWNfYWRhcHRlcikgIT0gSEFMTUFDX1JFVF9TVUNDRVNTKQoJCXJldHVybiBIQUxNQUNfUkVUX0FQSV9JTlZBTElEOwoKCXBEcml2ZXJfYWRhcHRlciA9IHBIYWxtYWNfYWRhcHRlci0+cERyaXZlcl9hZGFwdGVyOwoJcEhhbG1hY19hcGkgPSAoUEhBTE1BQ19BUEkpcEhhbG1hY19hZGFwdGVyLT5wSGFsbWFjX2FwaTsKCglQTEFURk9STV9NU0dfUFJJTlQocERyaXZlcl9hZGFwdGVyLCBIQUxNQUNfTVNHX0lOSVQsIEhBTE1BQ19EQkdfVFJBQ0UsICJbVFJBQ0VdaGFsbWFjX2NmZ19tdWx0aWNhc3RfYWRkcl84OHh4ID09PT09PT09PT0+XG4iKTsKCglhZGRyZXNzX0wgPSBwSGFsX2FkZHJlc3MtPkFkZHJlc3NfTF9ILkFkZHJlc3NfTG93OwoJYWRkcmVzc19IID0gcEhhbF9hZGRyZXNzLT5BZGRyZXNzX0xfSC5BZGRyZXNzX0hpZ2g7CgoJYWRkcmVzc19MID0gcnRrX2xlMzJfdG9fY3B1KGFkZHJlc3NfTCk7CglhZGRyZXNzX0ggPSBydGtfbGUxNl90b19jcHUoYWRkcmVzc19IKTsKCglIQUxNQUNfUkVHX1dSSVRFXzMyKHBIYWxtYWNfYWRhcHRlciwgUkVHX01BUiwgYWRkcmVzc19MKTsKCUhBTE1BQ19SRUdfV1JJVEVfMTYocEhhbG1hY19hZGFwdGVyLCBSRUdfTUFSICsgNCwgYWRkcmVzc19IKTsKCglQTEFURk9STV9NU0dfUFJJTlQocERyaXZlcl9hZGFwdGVyLCBIQUxNQUNfTVNHX0lOSVQsIEhBTE1BQ19EQkdfVFJBQ0UsICJbVFJBQ0VdaGFsbWFjX2NmZ19tdWx0aWNhc3RfYWRkcl84OHh4IDw9PT09PT09PT09XG4iKTsKCglyZXR1cm4gSEFMTUFDX1JFVF9TVUNDRVNTOwp9CgovKioKICogaGFsbWFjX2NmZ19vcGVyYXRpb25fbW9kZV84OHh4KCkgLSBjb25maWcgb3BlcmF0aW9uIG1vZGUKICogQHBIYWxtYWNfYWRhcHRlciA6IHRoZSBhZGFwdGVyIG9mIGhhbG1hYwogKiBAd2lyZWxlc3NfbW9kZSA6IDgwMi4xMSBzdGFuZGFyZChiL2cvbi9hY6FLKQogKiBBdXRob3IgOiBLYWlZdWFuIENoYW5nL0l2YW4gTGluCiAqIFJldHVybiA6IEhBTE1BQ19SRVRfU1RBVFVTCiAqIE1vcmUgZGV0YWlscyBvZiBzdGF0dXMgY29kZSBjYW4gYmUgZm91bmQgaW4gcHJvdG90eXBlIGRvY3VtZW50CiAqLwpIQUxNQUNfUkVUX1NUQVRVUwpoYWxtYWNfY2ZnX29wZXJhdGlvbl9tb2RlXzg4eHgoCglJTiBQSEFMTUFDX0FEQVBURVIgcEhhbG1hY19hZGFwdGVyLAoJSU4gSEFMTUFDX1dJUkVMRVNTX01PREUgd2lyZWxlc3NfbW9kZQopCnsKCXJldHVybiBIQUxNQUNfUkVUX1NVQ0NFU1M7Cn0KCi8qKgogKiBoYWxtYWNfY2ZnX2NoX2J3Xzg4eHgoKSAtIGNvbmZpZyBjaGFubmVsICYgYmFuZHdpZHRoCiAqIEBwSGFsbWFjX2FkYXB0ZXIgOiB0aGUgYWRhcHRlciBvZiBoYWxtYWMKICogQGNoYW5uZWwgOiBXTEFOIGNoYW5uZWwsIHN1cHBvcnQgMi40RyAmIDVHCiAqIEBwcmlfY2hfaWR4IDogcHJpbWFyeSBjaGFubmVsIGluZGV4LCBpZHgxLCBpZHgyLCBpZHgzLCBpZHg0CiAqIEBidyA6IGJhbmQgd2lkdGgsIDIwLCA0MCwgODAsIDE2MCwgNSAsMTAKICogQXV0aG9yIDogS2FpWXVhbiBDaGFuZwogKiBSZXR1cm4gOiBIQUxNQUNfUkVUX1NUQVRVUwogKiBNb3JlIGRldGFpbHMgb2Ygc3RhdHVzIGNvZGUgY2FuIGJlIGZvdW5kIGluIHByb3RvdHlwZSBkb2N1bWVudAogKi8KSEFMTUFDX1JFVF9TVEFUVVMKaGFsbWFjX2NmZ19jaF9id184OHh4KAoJSU4gUEhBTE1BQ19BREFQVEVSIHBIYWxtYWNfYWRhcHRlciwKCUlOIHU4IGNoYW5uZWwsCglJTiBIQUxNQUNfUFJJX0NIX0lEWCBwcmlfY2hfaWR4LAoJSU4gSEFMTUFDX0JXIGJ3CikKewoJVk9JRCAqcERyaXZlcl9hZGFwdGVyID0gTlVMTDsKCglpZiAoaGFsbWFjX2FkYXB0ZXJfdmFsaWRhdGUocEhhbG1hY19hZGFwdGVyKSAhPSBIQUxNQUNfUkVUX1NVQ0NFU1MpCgkJcmV0dXJuIEhBTE1BQ19SRVRfQURBUFRFUl9JTlZBTElEOwoKCWlmIChoYWxtYWNfYXBpX3ZhbGlkYXRlKHBIYWxtYWNfYWRhcHRlcikgIT0gSEFMTUFDX1JFVF9TVUNDRVNTKQoJCXJldHVybiBIQUxNQUNfUkVUX0FQSV9JTlZBTElEOwoKCXBEcml2ZXJfYWRhcHRlciA9IHBIYWxtYWNfYWRhcHRlci0+cERyaXZlcl9hZGFwdGVyOwoKCVBMQVRGT1JNX01TR19QUklOVChwRHJpdmVyX2FkYXB0ZXIsIEhBTE1BQ19NU0dfSU5JVCwgSEFMTUFDX0RCR19UUkFDRSwgIltUUkFDRV1oYWxtYWNfY2ZnX2NoX2J3Xzg4eHggPT09PT09PT09PT5cbiIpOwoJUExBVEZPUk1fTVNHX1BSSU5UKHBEcml2ZXJfYWRhcHRlciwgSEFMTUFDX01TR19JTklULCBIQUxNQUNfREJHX1RSQUNFLCAiW1RSQUNFXWNoID0gJWQsIGlkeD0lZCwgYnc9JWRcbiIsIGNoYW5uZWwsIHByaV9jaF9pZHgsIGJ3KTsKCgloYWxtYWNfY2ZnX3ByaV9jaF9pZHhfODh4eChwSGFsbWFjX2FkYXB0ZXIsICBwcmlfY2hfaWR4KTsKCgloYWxtYWNfY2ZnX2J3Xzg4eHgocEhhbG1hY19hZGFwdGVyLCBidyk7CgoJaGFsbWFjX2NmZ19jaF84OHh4KHBIYWxtYWNfYWRhcHRlciwgIGNoYW5uZWwpOwoKCVBMQVRGT1JNX01TR19QUklOVChwRHJpdmVyX2FkYXB0ZXIsIEhBTE1BQ19NU0dfSU5JVCwgSEFMTUFDX0RCR19UUkFDRSwgIltUUkFDRV1oYWxtYWNfY2ZnX2NoX2J3Xzg4eHggPD09PT09PT09PT1cbiIpOwoKCXJldHVybiBIQUxNQUNfUkVUX1NVQ0NFU1M7Cn0KCkhBTE1BQ19SRVRfU1RBVFVTCmhhbG1hY19jZmdfY2hfODh4eCgKCUlOIFBIQUxNQUNfQURBUFRFUiBwSGFsbWFjX2FkYXB0ZXIsCglJTiB1OCBjaGFubmVsCikKewoJdTggdmFsdWU4OwoJVk9JRCAqcERyaXZlcl9hZGFwdGVyID0gTlVMTDsKCVBIQUxNQUNfQVBJIHBIYWxtYWNfYXBpOwoKCWlmIChoYWxtYWNfYWRhcHRlcl92YWxpZGF0ZShwSGFsbWFjX2FkYXB0ZXIpICE9IEhBTE1BQ19SRVRfU1VDQ0VTUykKCQlyZXR1cm4gSEFMTUFDX1JFVF9BREFQVEVSX0lOVkFMSUQ7CgoJaWYgKGhhbG1hY19hcGlfdmFsaWRhdGUocEhhbG1hY19hZGFwdGVyKSAhPSBIQUxNQUNfUkVUX1NVQ0NFU1MpCgkJcmV0dXJuIEhBTE1BQ19SRVRfQVBJX0lOVkFMSUQ7CgoJcERyaXZlcl9hZGFwdGVyID0gcEhhbG1hY19hZGFwdGVyLT5wRHJpdmVyX2FkYXB0ZXI7CglwSGFsbWFjX2FwaSA9IChQSEFMTUFDX0FQSSlwSGFsbWFjX2FkYXB0ZXItPnBIYWxtYWNfYXBpOwoKCVBMQVRGT1JNX01TR19QUklOVChwRHJpdmVyX2FkYXB0ZXIsIEhBTE1BQ19NU0dfSU5JVCwgSEFMTUFDX0RCR19UUkFDRSwgIltUUkFDRV1oYWxtYWNfY2ZnX2NoXzg4eHggPT09PT09PT09PT5cbiIpOwoJUExBVEZPUk1fTVNHX1BSSU5UKHBEcml2ZXJfYWRhcHRlciwgSEFMTUFDX01TR19JTklULCBIQUxNQUNfREJHX1RSQUNFLCAiW1RSQUNFXWNoID0gJWRcbiIsIGNoYW5uZWwpOwoKCXZhbHVlOCA9IEhBTE1BQ19SRUdfUkVBRF84KHBIYWxtYWNfYWRhcHRlciwgUkVHX0NDS19DSEVDSyk7Cgl2YWx1ZTggPSB2YWx1ZTggJiAofihCSVQoNykpKTsKCglpZiAoY2hhbm5lbCA+IDM1KQoJCXZhbHVlOCA9IHZhbHVlOCB8IEJJVCg3KTsKCglIQUxNQUNfUkVHX1dSSVRFXzgocEhhbG1hY19hZGFwdGVyLCBSRUdfQ0NLX0NIRUNLLCB2YWx1ZTgpOwoKCVBMQVRGT1JNX01TR19QUklOVChwRHJpdmVyX2FkYXB0ZXIsIEhBTE1BQ19NU0dfSU5JVCwgSEFMTUFDX0RCR19UUkFDRSwgIltUUkFDRV1oYWxtYWNfY2ZnX2NoXzg4eHggPD09PT09PT09PT1cbiIpOwoKCXJldHVybiBIQUxNQUNfUkVUX1NVQ0NFU1M7Cn0KCkhBTE1BQ19SRVRfU1RBVFVTCmhhbG1hY19jZmdfcHJpX2NoX2lkeF84OHh4KAoJSU4gUEhBTE1BQ19BREFQVEVSIHBIYWxtYWNfYWRhcHRlciwKCUlOIEhBTE1BQ19QUklfQ0hfSURYIHByaV9jaF9pZHgKKQp7Cgl1OCB0eHNjXzQwID0gMCwgdHhzY18yMCA9IDA7CglWT0lEICpwRHJpdmVyX2FkYXB0ZXIgPSBOVUxMOwoJUEhBTE1BQ19BUEkgcEhhbG1hY19hcGk7CgoJaWYgKGhhbG1hY19hZGFwdGVyX3ZhbGlkYXRlKHBIYWxtYWNfYWRhcHRlcikgIT0gSEFMTUFDX1JFVF9TVUNDRVNTKQoJCXJldHVybiBIQUxNQUNfUkVUX0FEQVBURVJfSU5WQUxJRDsKCglpZiAoaGFsbWFjX2FwaV92YWxpZGF0ZShwSGFsbWFjX2FkYXB0ZXIpICE9IEhBTE1BQ19SRVRfU1VDQ0VTUykKCQlyZXR1cm4gSEFMTUFDX1JFVF9BUElfSU5WQUxJRDsKCglwRHJpdmVyX2FkYXB0ZXIgPSBwSGFsbWFjX2FkYXB0ZXItPnBEcml2ZXJfYWRhcHRlcjsKCXBIYWxtYWNfYXBpID0gKFBIQUxNQUNfQVBJKXBIYWxtYWNfYWRhcHRlci0+cEhhbG1hY19hcGk7CgoJUExBVEZPUk1fTVNHX1BSSU5UKHBEcml2ZXJfYWRhcHRlciwgSEFMTUFDX01TR19JTklULCBIQUxNQUNfREJHX1RSQUNFLCAiW1RSQUNFXWhhbG1hY19jZmdfcHJpX2NoX2lkeF84OHh4ID09PT09PT09PT0+XG4iKTsKCVBMQVRGT1JNX01TR19QUklOVChwRHJpdmVyX2FkYXB0ZXIsIEhBTE1BQ19NU0dfSU5JVCwgSEFMTUFDX0RCR19UUkFDRSwgIltUUkFDRV1pZHg9JWRcbiIsICBwcmlfY2hfaWR4KTsKCgl0eHNjXzIwID0gcHJpX2NoX2lkeDsKCWlmICgodHhzY18yMCA9PSBIQUxNQUNfQ0hfSURYXzEpIHx8ICh0eHNjXzIwID09IEhBTE1BQ19DSF9JRFhfMykpCgkJdHhzY180MCA9IDk7CgllbHNlCgkJdHhzY180MCA9IDEwOwoKCUhBTE1BQ19SRUdfV1JJVEVfOChwSGFsbWFjX2FkYXB0ZXIsIFJFR19EQVRBX1NDLCBCSVRfVFhTQ18yME0odHhzY18yMCkgfCBCSVRfVFhTQ180ME0odHhzY180MCkpOwoKCVBMQVRGT1JNX01TR19QUklOVChwRHJpdmVyX2FkYXB0ZXIsIEhBTE1BQ19NU0dfSU5JVCwgSEFMTUFDX0RCR19UUkFDRSwgIltUUkFDRV1oYWxtYWNfY2ZnX3ByaV9jaF9pZHhfODh4eCA8PT09PT09PT09PVxuIik7CgoJcmV0dXJuIEhBTE1BQ19SRVRfU1VDQ0VTUzsKfQoKLyoqCiAqIGhhbG1hY19jZmdfYndfODh4eCgpIC0gY29uZmlnIGJhbmR3aWR0aAogKiBAcEhhbG1hY19hZGFwdGVyIDogdGhlIGFkYXB0ZXIgb2YgaGFsbWFjCiAqIEBidyA6IGJhbmQgd2lkdGgsIDIwLCA0MCwgODAsIDE2MCwgNSAsMTAKICogQXV0aG9yIDogS2FpWXVhbiBDaGFuZwogKiBSZXR1cm4gOiBIQUxNQUNfUkVUX1NUQVRVUwogKiBNb3JlIGRldGFpbHMgb2Ygc3RhdHVzIGNvZGUgY2FuIGJlIGZvdW5kIGluIHByb3RvdHlwZSBkb2N1bWVudAogKi8KSEFMTUFDX1JFVF9TVEFUVVMKaGFsbWFjX2NmZ19id184OHh4KAoJSU4gUEhBTE1BQ19BREFQVEVSIHBIYWxtYWNfYWRhcHRlciwKCUlOIEhBTE1BQ19CVyBidwopCnsKCXUzMiB2YWx1ZTMyOwoJVk9JRCAqcERyaXZlcl9hZGFwdGVyID0gTlVMTDsKCVBIQUxNQUNfQVBJIHBIYWxtYWNfYXBpOwoKCWlmIChoYWxtYWNfYWRhcHRlcl92YWxpZGF0ZShwSGFsbWFjX2FkYXB0ZXIpICE9IEhBTE1BQ19SRVRfU1VDQ0VTUykKCQlyZXR1cm4gSEFMTUFDX1JFVF9BREFQVEVSX0lOVkFMSUQ7CgoJaWYgKGhhbG1hY19hcGlfdmFsaWRhdGUocEhhbG1hY19hZGFwdGVyKSAhPSBIQUxNQUNfUkVUX1NVQ0NFU1MpCgkJcmV0dXJuIEhBTE1BQ19SRVRfQVBJX0lOVkFMSUQ7CgoJcERyaXZlcl9hZGFwdGVyID0gcEhhbG1hY19hZGFwdGVyLT5wRHJpdmVyX2FkYXB0ZXI7CglwSGFsbWFjX2FwaSA9IChQSEFMTUFDX0FQSSlwSGFsbWFjX2FkYXB0ZXItPnBIYWxtYWNfYXBpOwoKCVBMQVRGT1JNX01TR19QUklOVChwRHJpdmVyX2FkYXB0ZXIsIEhBTE1BQ19NU0dfSU5JVCwgSEFMTUFDX0RCR19UUkFDRSwgIltUUkFDRV1oYWxtYWNfY2ZnX2J3Xzg4eHggPT09PT09PT09PT5cbiIpOwoJUExBVEZPUk1fTVNHX1BSSU5UKHBEcml2ZXJfYWRhcHRlciwgSEFMTUFDX01TR19JTklULCBIQUxNQUNfREJHX1RSQUNFLCAiW1RSQUNFXWJ3PSVkXG4iLCBidyk7CgoJLyogUkYgTW9kZSAqLwoJdmFsdWUzMiA9IEhBTE1BQ19SRUdfUkVBRF8zMihwSGFsbWFjX2FkYXB0ZXIsIFJFR19XTUFDX1RSWFBUQ0xfQ1RMKTsKCXZhbHVlMzIgPSB2YWx1ZTMyICYgKH4oQklUKDcpIHwgQklUKDgpKSk7CgoJc3dpdGNoIChidykgewoJY2FzZSBIQUxNQUNfQldfODA6CgkJdmFsdWUzMiA9IHZhbHVlMzIgfCBCSVQoNyk7CgkJYnJlYWs7CgljYXNlIEhBTE1BQ19CV180MDoKCQl2YWx1ZTMyID0gdmFsdWUzMiB8IEJJVCg4KTsKCQlicmVhazsKCWNhc2UgSEFMTUFDX0JXXzIwOgoJY2FzZSBIQUxNQUNfQldfMTA6CgljYXNlIEhBTE1BQ19CV181OgoJCWJyZWFrOwoJZGVmYXVsdDoKCQlQTEFURk9STV9NU0dfUFJJTlQocERyaXZlcl9hZGFwdGVyLCBIQUxNQUNfTVNHX0lOSVQsIEhBTE1BQ19EQkdfRVJSLCAiW0VSUl1oYWxtYWNfY2ZnX2J3Xzg4eHggc3dpdGNoIGNhc2Ugbm90IHN1cHBvcnRcbiIpOwoJCWJyZWFrOwoJfQoJSEFMTUFDX1JFR19XUklURV8zMihwSGFsbWFjX2FkYXB0ZXIsIFJFR19XTUFDX1RSWFBUQ0xfQ1RMLCB2YWx1ZTMyKTsKCgkvKiBNQUMgQ0xLICovCgkvKiBUT0RPOk1vdmUgdG8gY2hhbmdlIG1hYyBjbGsgYXBpIGxhdGVyLi4uICovCgl2YWx1ZTMyID0gSEFMTUFDX1JFR19SRUFEXzMyKHBIYWxtYWNfYWRhcHRlciwgUkVHX0FGRV9DVFJMMSk7Cgl2YWx1ZTMyID0gKHZhbHVlMzIgJiAofihCSVQoMjApIHwgQklUKDIxKSkpKSB8IChIQUxNQUNfTUFDX0NMT0NLX0hXX0RFRl84ME0gPDwgQklUX1NISUZUX01BQ19DTEtfU0VMKTsKCUhBTE1BQ19SRUdfV1JJVEVfMzIocEhhbG1hY19hZGFwdGVyLCBSRUdfQUZFX0NUUkwxLCB2YWx1ZTMyKTsKCglIQUxNQUNfUkVHX1dSSVRFXzgocEhhbG1hY19hZGFwdGVyLCBSRUdfVVNUSU1FX1RTRiwgSEFMTUFDX01BQ19DTE9DS184OFhYKTsKCUhBTE1BQ19SRUdfV1JJVEVfOChwSGFsbWFjX2FkYXB0ZXIsIFJFR19VU1RJTUVfRURDQSwgSEFMTUFDX01BQ19DTE9DS184OFhYKTsKCglQTEFURk9STV9NU0dfUFJJTlQocERyaXZlcl9hZGFwdGVyLCBIQUxNQUNfTVNHX0lOSVQsIEhBTE1BQ19EQkdfVFJBQ0UsICJbVFJBQ0VdaGFsbWFjX2NmZ19id184OHh4IDw9PT09PT09PT09XG4iKTsKCglyZXR1cm4gSEFMTUFDX1JFVF9TVUNDRVNTOwp9CgpWT0lECmhhbG1hY19lbmFibGVfYmJfcmZfODh4eCgKCUlOIFBIQUxNQUNfQURBUFRFUiBwSGFsbWFjX2FkYXB0ZXIsCglJTiB1OCBlbmFibGUKKQp7Cgl1OCB2YWx1ZTg7Cgl1MzIgdmFsdWUzMjsKCVBIQUxNQUNfQVBJIHBIYWxtYWNfYXBpOwoKCXBIYWxtYWNfYXBpID0gKFBIQUxNQUNfQVBJKXBIYWxtYWNfYWRhcHRlci0+cEhhbG1hY19hcGk7CgoJaWYgKGVuYWJsZSA9PSAxKSB7CgkJdmFsdWU4ID0gSEFMTUFDX1JFR19SRUFEXzgocEhhbG1hY19hZGFwdGVyLCBSRUdfU1lTX0ZVTkNfRU4pOwoJCXZhbHVlOCA9IHZhbHVlOCB8IEJJVCgwKSB8IEJJVCgxKTsKCQlIQUxNQUNfUkVHX1dSSVRFXzgocEhhbG1hY19hZGFwdGVyLCBSRUdfU1lTX0ZVTkNfRU4sIHZhbHVlOCk7CgoJCXZhbHVlOCA9IEhBTE1BQ19SRUdfUkVBRF84KHBIYWxtYWNfYWRhcHRlciwgUkVHX1JGX0NUUkwpOwoJCXZhbHVlOCA9IHZhbHVlOCB8IEJJVCgwKSB8IEJJVCgxKSB8IEJJVCgyKTsKCQlIQUxNQUNfUkVHX1dSSVRFXzgocEhhbG1hY19hZGFwdGVyLCBSRUdfUkZfQ1RSTCwgdmFsdWU4KTsKCgkJdmFsdWUzMiA9IEhBTE1BQ19SRUdfUkVBRF8zMihwSGFsbWFjX2FkYXB0ZXIsIFJFR19XTFJGMSk7CgkJdmFsdWUzMiA9IHZhbHVlMzIgfCBCSVQoMjQpIHwgQklUKDI1KSB8IEJJVCgyNik7CgkJSEFMTUFDX1JFR19XUklURV8zMihwSGFsbWFjX2FkYXB0ZXIsIFJFR19XTFJGMSwgdmFsdWUzMik7Cgl9IGVsc2UgewoJCXZhbHVlOCA9IEhBTE1BQ19SRUdfUkVBRF84KHBIYWxtYWNfYWRhcHRlciwgUkVHX1NZU19GVU5DX0VOKTsKCQl2YWx1ZTggPSB2YWx1ZTggJiAofihCSVQoMCkgfCBCSVQoMSkpKTsKCQlIQUxNQUNfUkVHX1dSSVRFXzgocEhhbG1hY19hZGFwdGVyLCBSRUdfU1lTX0ZVTkNfRU4sIHZhbHVlOCk7CgoJCXZhbHVlOCA9IEhBTE1BQ19SRUdfUkVBRF84KHBIYWxtYWNfYWRhcHRlciwgUkVHX1JGX0NUUkwpOwoJCXZhbHVlOCA9IHZhbHVlOCAmICh+KEJJVCgwKSB8IEJJVCgxKSB8IEJJVCgyKSkpOwoJCUhBTE1BQ19SRUdfV1JJVEVfOChwSGFsbWFjX2FkYXB0ZXIsIFJFR19SRl9DVFJMLCB2YWx1ZTgpOwoKCQl2YWx1ZTMyID0gSEFMTUFDX1JFR19SRUFEXzMyKHBIYWxtYWNfYWRhcHRlciwgUkVHX1dMUkYxKTsKCQl2YWx1ZTMyID0gdmFsdWUzMiAmICh+KEJJVCgyNCkgfCBCSVQoMjUpIHwgQklUKDI2KSkpOwoJCUhBTE1BQ19SRUdfV1JJVEVfMzIocEhhbG1hY19hZGFwdGVyLCBSRUdfV0xSRjEsIHZhbHVlMzIpOwoJfQp9CgpWT0lECmhhbG1hY19jb25maWdfYW1wZHVfODh4eCgKCUlOIFBIQUxNQUNfQURBUFRFUiBwSGFsbWFjX2FkYXB0ZXIsCglJTiBQSEFMTUFDX0FNUERVX0NPTkZJRyBwQW1wZHVfY29uZmlnCikKewoJUEhBTE1BQ19BUEkgcEhhbG1hY19hcGk7CgoJcEhhbG1hY19hcGkgPSAoUEhBTE1BQ19BUEkpcEhhbG1hY19hZGFwdGVyLT5wSGFsbWFjX2FwaTsKCglIQUxNQUNfUkVHX1dSSVRFXzgocEhhbG1hY19hZGFwdGVyLCBSRUdfUFJPVF9NT0RFX0NUUkwgKyAyLCBwQW1wZHVfY29uZmlnLT5tYXhfYWdnX251bSk7CglIQUxNQUNfUkVHX1dSSVRFXzgocEhhbG1hY19hZGFwdGVyLCBSRUdfUFJPVF9NT0RFX0NUUkwgKyAzLCBwQW1wZHVfY29uZmlnLT5tYXhfYWdnX251bSk7Cn0KCi8qKgogKiBoYWxtYWNfY2ZnX2xhX21vZGVfODh4eCgpIC0gY29uZmlnIGxhIG1vZGUKICogQHBIYWxtYWNfYWRhcHRlciA6IHRoZSBhZGFwdGVyIG9mIGhhbG1hYwogKiBAbGFfbW9kZSA6CiAqCWRpc2FibGUgOiBubyBUWEZGIHNwYWNlIHJlc2VydmVkIGZvciBMQSBkZWJ1ZwogKglwYXJ0aWFsIDogcGFydGlhbCBUWEZGIHNwYWNlIGlzIHJlc2VydmVkIGZvciBMQSBkZWJ1ZwogKglmdWxsIDogYWxsIFRYRkYgc3BhY2UgaXMgcmVzZXJ2ZWQgZm9yIExBIGRlYnVnCiAqIEF1dGhvciA6IEthaVl1YW4gQ2hhbmcKICogUmV0dXJuIDogSEFMTUFDX1JFVF9TVEFUVVMKICogTW9yZSBkZXRhaWxzIG9mIHN0YXR1cyBjb2RlIGNhbiBiZSBmb3VuZCBpbiBwcm90b3R5cGUgZG9jdW1lbnQKICovCkhBTE1BQ19SRVRfU1RBVFVTCmhhbG1hY19jZmdfbGFfbW9kZV84OHh4KAoJSU4gUEhBTE1BQ19BREFQVEVSIHBIYWxtYWNfYWRhcHRlciwKCUlOIEhBTE1BQ19MQV9NT0RFIGxhX21vZGUKKQp7CglWT0lEICpwRHJpdmVyX2FkYXB0ZXIgPSBOVUxMOwoKCWlmIChoYWxtYWNfYWRhcHRlcl92YWxpZGF0ZShwSGFsbWFjX2FkYXB0ZXIpICE9IEhBTE1BQ19SRVRfU1VDQ0VTUykKCQlyZXR1cm4gSEFMTUFDX1JFVF9BREFQVEVSX0lOVkFMSUQ7CgoJaWYgKGhhbG1hY19hcGlfdmFsaWRhdGUocEhhbG1hY19hZGFwdGVyKSAhPSBIQUxNQUNfUkVUX1NVQ0NFU1MpCgkJcmV0dXJuIEhBTE1BQ19SRVRfQVBJX0lOVkFMSUQ7CgoJaWYgKHBIYWxtYWNfYWRhcHRlci0+YXBpX3JlZ2lzdHJ5LmxhX21vZGVfZW4gPT0gMCkKCQlyZXR1cm4gSEFMTUFDX1JFVF9OT1RfU1VQUE9SVDsKCglwRHJpdmVyX2FkYXB0ZXIgPSBwSGFsbWFjX2FkYXB0ZXItPnBEcml2ZXJfYWRhcHRlcjsKCglQTEFURk9STV9NU0dfUFJJTlQocERyaXZlcl9hZGFwdGVyLCBIQUxNQUNfTVNHX0gyQywgSEFMTUFDX0RCR19UUkFDRSwgIltUUkFDRV1oYWxtYWNfY2ZnX2xhX21vZGVfODh4eCA9PT09PT09PT09PmxhX21vZGUgPSAlZFxuIiwgbGFfbW9kZSk7CgoJcEhhbG1hY19hZGFwdGVyLT50eGZmX2FsbG9jYXRpb24ubGFfbW9kZSA9IGxhX21vZGU7CgoJUExBVEZPUk1fTVNHX1BSSU5UKHBEcml2ZXJfYWRhcHRlciwgSEFMTUFDX01TR19IMkMsIEhBTE1BQ19EQkdfVFJBQ0UsICJbVFJBQ0VdaGFsbWFjX2NmZ19sYV9tb2RlXzg4eHggPD09PT09PT09PT1cbiIpOwoKCXJldHVybiBIQUxNQUNfUkVUX1NVQ0NFU1M7Cn0KCi8qKgogKiBoYWxtYWNfY2ZnX3J4X2ZpZm9fZXhwYW5kaW5nX21vZGVfODh4eCgpIC0gcnggZmlmbyBleHBhbmRpbmcKICogQHBIYWxtYWNfYWRhcHRlciA6IHRoZSBhZGFwdGVyIG9mIGhhbG1hYwogKiBAbGFfbW9kZSA6CiAqCWRpc2FibGUgOiBub3JtYWwgbW9kZQogKgkxIGJsb2NrIDogUnggRklGTyArIDEgRklGTyBibG9jazsgVHggZmlmbyAtIDEgRklGTyBibG9jawogKgkyIGJsb2NrIDogUnggRklGTyArIDIgRklGTyBibG9jazsgVHggZmlmbyAtIDIgRklGTyBibG9jawogKgkzIGJsb2NrIDogUnggRklGTyArIDMgRklGTyBibG9jazsgVHggZmlmbyAtIDMgRklGTyBibG9jawogKiBBdXRob3IgOiBTb2FyCiAqIFJldHVybiA6IEhBTE1BQ19SRVRfU1RBVFVTCiAqIE1vcmUgZGV0YWlscyBvZiBzdGF0dXMgY29kZSBjYW4gYmUgZm91bmQgaW4gcHJvdG90eXBlIGRvY3VtZW50CiAqLwpIQUxNQUNfUkVUX1NUQVRVUwpoYWxtYWNfY2ZnX3J4X2ZpZm9fZXhwYW5kaW5nX21vZGVfODh4eCgKCUlOIFBIQUxNQUNfQURBUFRFUiBwSGFsbWFjX2FkYXB0ZXIsCglJTiBIQUxNQUNfUlhfRklGT19FWFBBTkRJTkdfTU9ERSByeF9maWZvX2V4cGFuZGluZ19tb2RlCikKewoJVk9JRCAqcERyaXZlcl9hZGFwdGVyID0gTlVMTDsKCglpZiAoaGFsbWFjX2FkYXB0ZXJfdmFsaWRhdGUocEhhbG1hY19hZGFwdGVyKSAhPSBIQUxNQUNfUkVUX1NVQ0NFU1MpCgkJcmV0dXJuIEhBTE1BQ19SRVRfQURBUFRFUl9JTlZBTElEOwoKCWlmIChoYWxtYWNfYXBpX3ZhbGlkYXRlKHBIYWxtYWNfYWRhcHRlcikgIT0gSEFMTUFDX1JFVF9TVUNDRVNTKQoJCXJldHVybiBIQUxNQUNfUkVUX0FQSV9JTlZBTElEOwoKCWlmIChwSGFsbWFjX2FkYXB0ZXItPmFwaV9yZWdpc3RyeS5yeF9leHBhbmRfbW9kZV9lbiA9PSAwKQoJCXJldHVybiBIQUxNQUNfUkVUX05PVF9TVVBQT1JUOwoKCXBEcml2ZXJfYWRhcHRlciA9IHBIYWxtYWNfYWRhcHRlci0+cERyaXZlcl9hZGFwdGVyOwoKCVBMQVRGT1JNX01TR19QUklOVChwRHJpdmVyX2FkYXB0ZXIsIEhBTE1BQ19NU0dfSDJDLCBIQUxNQUNfREJHX1RSQUNFLCAiW1RSQUNFXWhhbG1hY19jZmdfcnhfZmlmb19leHBhbmRpbmdfbW9kZV84OHh4ID09PT09PT09PT0+cnhfZmlmb19leHBhbmRpbmdfbW9kZSA9ICVkXG4iLCByeF9maWZvX2V4cGFuZGluZ19tb2RlKTsKCglwSGFsbWFjX2FkYXB0ZXItPnR4ZmZfYWxsb2NhdGlvbi5yeF9maWZvX2V4cGFuZGluZ19tb2RlID0gcnhfZmlmb19leHBhbmRpbmdfbW9kZTsKCglQTEFURk9STV9NU0dfUFJJTlQocERyaXZlcl9hZGFwdGVyLCBIQUxNQUNfTVNHX0gyQywgSEFMTUFDX0RCR19UUkFDRSwgIltUUkFDRV1oYWxtYWNfY2ZnX3J4X2ZpZm9fZXhwYW5kaW5nX21vZGVfODh4eCA8PT09PT09PT09PVxuIik7CgoJcmV0dXJuIEhBTE1BQ19SRVRfU1VDQ0VTUzsKfQoKSEFMTUFDX1JFVF9TVEFUVVMKaGFsbWFjX2NvbmZpZ19zZWN1cml0eV84OHh4KAoJSU4gUEhBTE1BQ19BREFQVEVSIHBIYWxtYWNfYWRhcHRlciwKCUlOIFBIQUxNQUNfU0VDVVJJVFlfU0VUVElORyBwU2VjX3NldHRpbmcKKQp7CglQSEFMTUFDX0FQSSBwSGFsbWFjX2FwaTsKCVZPSUQgKnBEcml2ZXJfYWRhcHRlciA9IE5VTEw7CgoJaWYgKGhhbG1hY19hZGFwdGVyX3ZhbGlkYXRlKHBIYWxtYWNfYWRhcHRlcikgIT0gSEFMTUFDX1JFVF9TVUNDRVNTKQoJCXJldHVybiBIQUxNQUNfUkVUX0FEQVBURVJfSU5WQUxJRDsKCglpZiAoaGFsbWFjX2FwaV92YWxpZGF0ZShwSGFsbWFjX2FkYXB0ZXIpICE9IEhBTE1BQ19SRVRfU1VDQ0VTUykKCQlyZXR1cm4gSEFMTUFDX1JFVF9BUElfSU5WQUxJRDsKCglwSGFsbWFjX2FwaSA9IChQSEFMTUFDX0FQSSlwSGFsbWFjX2FkYXB0ZXItPnBIYWxtYWNfYXBpOwoJcERyaXZlcl9hZGFwdGVyID0gcEhhbG1hY19hZGFwdGVyLT5wRHJpdmVyX2FkYXB0ZXI7CgoJUExBVEZPUk1fTVNHX1BSSU5UKHBEcml2ZXJfYWRhcHRlciwgSEFMTUFDX01TR19DT01NT04sIEhBTE1BQ19EQkdfVFJBQ0UsICJbVFJBQ0VdaGFsbWFjX2NvbmZpZ19zZWN1cml0eV84OHh4ID09PT09PT09PT0+XG4iKTsKCglIQUxNQUNfUkVHX1dSSVRFXzE2KHBIYWxtYWNfYWRhcHRlciwgUkVHX0NSLCAodTE2KShIQUxNQUNfUkVHX1JFQURfMTYocEhhbG1hY19hZGFwdGVyLCBSRUdfQ1IpIHwgQklUX01BQ19TRUNfRU4pKTsKCglpZiAocFNlY19zZXR0aW5nLT5jb21wYXJlX2tleWlkID09IDEpIHsKCQlIQUxNQUNfUkVHX1dSSVRFXzgocEhhbG1hY19hZGFwdGVyLCBSRUdfU0VDQ0ZHICsgMSwgSEFMTUFDX1JFR19SRUFEXzgocEhhbG1hY19hZGFwdGVyLCBSRUdfU0VDQ0ZHICsgMSkgfCBCSVQoMCkpOwoJCXBIYWxtYWNfYWRhcHRlci0+aHdfY29uZmlnX2luZm8uc2VjdXJpdHlfY2hlY2tfa2V5aWQgPSAxOwoJfSBlbHNlIHsKCQlwSGFsbWFjX2FkYXB0ZXItPmh3X2NvbmZpZ19pbmZvLnNlY3VyaXR5X2NoZWNrX2tleWlkID0gMDsKCX0KCgkvKiBCQy9NQyB1c2UgZGVmYXVsdCBrZXkoY2FtIGVudHJ5IDB+Mywga2VpIGlkID0gMCAtPiBlbnRyeTAsIGtlaSBpZCA9IDEgLT4gZW50cnkxLi4uICkgKi8KCUhBTE1BQ19SRUdfV1JJVEVfOChwSGFsbWFjX2FkYXB0ZXIsIFJFR19TRUNDRkcsIEhBTE1BQ19SRUdfUkVBRF84KHBIYWxtYWNfYWRhcHRlciwgUkVHX1NFQ0NGRykgfCBCSVQoNikgfCBCSVQoNykpOwoKCWlmIChwU2VjX3NldHRpbmctPnR4X2VuY3J5cHRpb24gPT0gMSkKCQlIQUxNQUNfUkVHX1dSSVRFXzgocEhhbG1hY19hZGFwdGVyLCBSRUdfU0VDQ0ZHLCBIQUxNQUNfUkVHX1JFQURfOChwSGFsbWFjX2FkYXB0ZXIsIFJFR19TRUNDRkcpIHwgQklUKDIpKTsKCWVsc2UKCQlIQUxNQUNfUkVHX1dSSVRFXzgocEhhbG1hY19hZGFwdGVyLCBSRUdfU0VDQ0ZHLCBIQUxNQUNfUkVHX1JFQURfOChwSGFsbWFjX2FkYXB0ZXIsIFJFR19TRUNDRkcpICYgfihCSVQoMikpKTsKCglpZiAocFNlY19zZXR0aW5nLT5yeF9kZWNyeXB0aW9uID09IDEpCgkJSEFMTUFDX1JFR19XUklURV84KHBIYWxtYWNfYWRhcHRlciwgUkVHX1NFQ0NGRywgSEFMTUFDX1JFR19SRUFEXzgocEhhbG1hY19hZGFwdGVyLCBSRUdfU0VDQ0ZHKSB8IEJJVCgzKSk7CgllbHNlCgkJSEFMTUFDX1JFR19XUklURV84KHBIYWxtYWNfYWRhcHRlciwgUkVHX1NFQ0NGRywgSEFMTUFDX1JFR19SRUFEXzgocEhhbG1hY19hZGFwdGVyLCBSRUdfU0VDQ0ZHKSAmIH4oQklUKDMpKSk7CgoJaWYgKHBTZWNfc2V0dGluZy0+YmlwX2VuYWJsZSA9PSAxKSB7CgkJaWYgKHBIYWxtYWNfYWRhcHRlci0+Y2hpcF9pZCA9PSBIQUxNQUNfQ0hJUF9JRF84ODIyQikKCQkJcmV0dXJuIEhBTE1BQ19SRVRfQklQX05PX1NVUFBPUlQ7CiNpZiBIQUxNQUNfODgyMUNfU1VQUE9SVAoJCWlmIChwU2VjX3NldHRpbmctPnR4X2VuY3J5cHRpb24gPT0gMSkKCQkJSEFMTUFDX1JFR19XUklURV84KHBIYWxtYWNfYWRhcHRlciwgUkVHX1dTRUNfT1BUSU9OICsgMiwgSEFMTUFDX1JFR19SRUFEXzgocEhhbG1hY19hZGFwdGVyLCBSRUdfV1NFQ19PUFRJT04gKyAyKSB8IChCSVQoMykgfCBCSVQoNSkpKTsKCQllbHNlCgkJCUhBTE1BQ19SRUdfV1JJVEVfOChwSGFsbWFjX2FkYXB0ZXIsIFJFR19XU0VDX09QVElPTiArIDIsIEhBTE1BQ19SRUdfUkVBRF84KHBIYWxtYWNfYWRhcHRlciwgUkVHX1dTRUNfT1BUSU9OICsgMikgJiB+KEJJVCgzKSB8IEJJVCg1KSkpOwoKCQlpZiAocFNlY19zZXR0aW5nLT5yeF9kZWNyeXB0aW9uID09IDEpCgkJCUhBTE1BQ19SRUdfV1JJVEVfOChwSGFsbWFjX2FkYXB0ZXIsIFJFR19XU0VDX09QVElPTiArIDIsIEhBTE1BQ19SRUdfUkVBRF84KHBIYWxtYWNfYWRhcHRlciwgUkVHX1dTRUNfT1BUSU9OICsgMikgfCAoQklUKDQpIHwgQklUKDYpKSk7CgkJZWxzZQoJCQlIQUxNQUNfUkVHX1dSSVRFXzgocEhhbG1hY19hZGFwdGVyLCBSRUdfV1NFQ19PUFRJT04gKyAyLCBIQUxNQUNfUkVHX1JFQURfOChwSGFsbWFjX2FkYXB0ZXIsIFJFR19XU0VDX09QVElPTiArIDIpICYgfihCSVQoNCkgfCBCSVQoNikpKTsKI2VuZGlmCgl9CgoJUExBVEZPUk1fTVNHX1BSSU5UKHBEcml2ZXJfYWRhcHRlciwgSEFMTUFDX01TR19DT01NT04sIEhBTE1BQ19EQkdfVFJBQ0UsICJbVFJBQ0VdaGFsbWFjX2NvbmZpZ19zZWN1cml0eV84OHh4IDw9PT09PT09PT09XG4iKTsKCglyZXR1cm4gSEFMTUFDX1JFVF9TVUNDRVNTOwp9Cgp1OApoYWxtYWNfZ2V0X3VzZWRfY2FtX2VudHJ5X251bV84OHh4KAoJSU4gUEhBTE1BQ19BREFQVEVSIHBIYWxtYWNfYWRhcHRlciwKCUlOIEhBTF9TRUNVUklUWV9UWVBFIHNlY190eXBlCikKewoJdTggZW50cnlfbnVtOwoJVk9JRCAqcERyaXZlcl9hZGFwdGVyID0gTlVMTDsKCglwRHJpdmVyX2FkYXB0ZXIgPSBwSGFsbWFjX2FkYXB0ZXItPnBEcml2ZXJfYWRhcHRlcjsKCglQTEFURk9STV9NU0dfUFJJTlQocERyaXZlcl9hZGFwdGVyLCBIQUxNQUNfTVNHX0NPTU1PTiwgSEFMTUFDX0RCR19UUkFDRSwgIltUUkFDRV1oYWxtYWNfZ2V0X3VzZWRfY2FtX2VudHJ5X251bV84OHh4ID09PT09PT09PT0+XG4iKTsKCglzd2l0Y2ggKHNlY190eXBlKSB7CgljYXNlIEhBTF9TRUNVUklUWV9UWVBFX1dFUDQwOgoJY2FzZSBIQUxfU0VDVVJJVFlfVFlQRV9XRVAxMDQ6CgljYXNlIEhBTF9TRUNVUklUWV9UWVBFX1RLSVA6CgljYXNlIEhBTF9TRUNVUklUWV9UWVBFX0FFUzEyODoKCWNhc2UgSEFMX1NFQ1VSSVRZX1RZUEVfR0NNUDEyODoKCWNhc2UgSEFMX1NFQ1VSSVRZX1RZUEVfR0NNU01TNDoKCWNhc2UgSEFMX1NFQ1VSSVRZX1RZUEVfQklQOgoJCWVudHJ5X251bSA9IDE7CgkJYnJlYWs7CgljYXNlIEhBTF9TRUNVUklUWV9UWVBFX1dBUEk6CgljYXNlIEhBTF9TRUNVUklUWV9UWVBFX0FFUzI1NjoKCWNhc2UgSEFMX1NFQ1VSSVRZX1RZUEVfR0NNUDI1NjoKCQllbnRyeV9udW0gPSAyOwoJCWJyZWFrOwoJZGVmYXVsdDoKCQllbnRyeV9udW0gPSAwOwoJCWJyZWFrOwoJfQoKCVBMQVRGT1JNX01TR19QUklOVChwRHJpdmVyX2FkYXB0ZXIsIEhBTE1BQ19NU0dfQ09NTU9OLCBIQUxNQUNfREJHX1RSQUNFLCAiW1RSQUNFXWhhbG1hY19nZXRfdXNlZF9jYW1fZW50cnlfbnVtXzg4eHggPD09PT09PT09PT1cbiIpOwoKCXJldHVybiBlbnRyeV9udW07Cn0KCkhBTE1BQ19SRVRfU1RBVFVTCmhhbG1hY193cml0ZV9jYW1fODh4eCgKCUlOIFBIQUxNQUNfQURBUFRFUglwSGFsbWFjX2FkYXB0ZXIsCglJTiB1MzIgZW50cnlfaW5kZXgsCglJTiBQSEFMTUFDX0NBTV9FTlRSWV9JTkZPIHBDYW1fZW50cnlfaW5mbwopCnsKCXUzMiBpOwoJdTMyIGNvbW1hbmQgPSAweDgwMDEwMDAwOwoJUEhBTE1BQ19BUEkgcEhhbG1hY19hcGk7CglWT0lEICpwRHJpdmVyX2FkYXB0ZXIgPSBOVUxMOwoJUEhBTE1BQ19DQU1fRU5UUllfRk9STUFUIHBDYW1fZW50cnlfZm9ybWF0ID0gTlVMTDsKCglwRHJpdmVyX2FkYXB0ZXIgPSBwSGFsbWFjX2FkYXB0ZXItPnBEcml2ZXJfYWRhcHRlcjsKCXBIYWxtYWNfYXBpID0gKFBIQUxNQUNfQVBJKXBIYWxtYWNfYWRhcHRlci0+cEhhbG1hY19hcGk7CgoJUExBVEZPUk1fTVNHX1BSSU5UKHBEcml2ZXJfYWRhcHRlciwgSEFMTUFDX01TR19DT01NT04sIEhBTE1BQ19EQkdfVFJBQ0UsICJbVFJBQ0VdaGFsbWFjX3dyaXRlX2NhbV84OHh4ID09PT09PT09PT0+XG4iKTsKCglpZiAoZW50cnlfaW5kZXggPj0gcEhhbG1hY19hZGFwdGVyLT5od19jb25maWdfaW5mby5jYW1fZW50cnlfbnVtKQoJCXJldHVybiBIQUxNQUNfUkVUX0VOVFJZX0lOREVYX0VSUk9SOwoKCWlmIChwQ2FtX2VudHJ5X2luZm8tPmtleV9pZCA+IDMpCgkJcmV0dXJuIEhBTE1BQ19SRVRfRkFJTDsKCglwQ2FtX2VudHJ5X2Zvcm1hdCA9IChQSEFMTUFDX0NBTV9FTlRSWV9GT1JNQVQpUExBVEZPUk1fUlRMX01BTExPQyhwRHJpdmVyX2FkYXB0ZXIsIHNpemVvZigqcENhbV9lbnRyeV9mb3JtYXQpKTsKCWlmIChwQ2FtX2VudHJ5X2Zvcm1hdCA9PSBOVUxMKQoJCXJldHVybiBIQUxNQUNfUkVUX05VTExfUE9JTlRFUjsKCVBMQVRGT1JNX1JUTF9NRU1TRVQocERyaXZlcl9hZGFwdGVyLCBwQ2FtX2VudHJ5X2Zvcm1hdCwgMHgwMCwgc2l6ZW9mKCpwQ2FtX2VudHJ5X2Zvcm1hdCkpOwoKCWlmIChwSGFsbWFjX2FkYXB0ZXItPmh3X2NvbmZpZ19pbmZvLnNlY3VyaXR5X2NoZWNrX2tleWlkID09IDEpCgkJcENhbV9lbnRyeV9mb3JtYXQtPmtleV9pZCA9IHBDYW1fZW50cnlfaW5mby0+a2V5X2lkOwoJcENhbV9lbnRyeV9mb3JtYXQtPnZhbGlkID0gcENhbV9lbnRyeV9pbmZvLT52YWxpZDsKCVBMQVRGT1JNX1JUTF9NRU1DUFkocERyaXZlcl9hZGFwdGVyLCBwQ2FtX2VudHJ5X2Zvcm1hdC0+bWFjX2FkZHJlc3MsIHBDYW1fZW50cnlfaW5mby0+bWFjX2FkZHJlc3MsIDYpOwoJUExBVEZPUk1fUlRMX01FTUNQWShwRHJpdmVyX2FkYXB0ZXIsIHBDYW1fZW50cnlfZm9ybWF0LT5rZXksIHBDYW1fZW50cnlfaW5mby0+a2V5LCAxNik7CgoJc3dpdGNoIChwQ2FtX2VudHJ5X2luZm8tPnNlY3VyaXR5X3R5cGUpIHsKCWNhc2UgSEFMX1NFQ1VSSVRZX1RZUEVfTk9ORToKCQlwQ2FtX2VudHJ5X2Zvcm1hdC0+dHlwZSA9IDA7CgkJYnJlYWs7CgljYXNlIEhBTF9TRUNVUklUWV9UWVBFX1dFUDQwOgoJCXBDYW1fZW50cnlfZm9ybWF0LT50eXBlID0gMTsKCQlicmVhazsKCWNhc2UgSEFMX1NFQ1VSSVRZX1RZUEVfV0VQMTA0OgoJCXBDYW1fZW50cnlfZm9ybWF0LT50eXBlID0gNTsKCQlicmVhazsKCWNhc2UgSEFMX1NFQ1VSSVRZX1RZUEVfVEtJUDoKCQlwQ2FtX2VudHJ5X2Zvcm1hdC0+dHlwZSA9IDI7CgkJYnJlYWs7CgljYXNlIEhBTF9TRUNVUklUWV9UWVBFX0FFUzEyODoKCQlwQ2FtX2VudHJ5X2Zvcm1hdC0+dHlwZSA9IDQ7CgkJYnJlYWs7CgljYXNlIEhBTF9TRUNVUklUWV9UWVBFX1dBUEk6CgkJcENhbV9lbnRyeV9mb3JtYXQtPnR5cGUgPSA2OwoJCWJyZWFrOwoJY2FzZSBIQUxfU0VDVVJJVFlfVFlQRV9BRVMyNTY6CgkJcENhbV9lbnRyeV9mb3JtYXQtPnR5cGUgPSA0OwoJCXBDYW1fZW50cnlfZm9ybWF0LT5leHRfc2VjdHlwZSA9IDE7CgkJYnJlYWs7CgljYXNlIEhBTF9TRUNVUklUWV9UWVBFX0dDTVAxMjg6CgkJcENhbV9lbnRyeV9mb3JtYXQtPnR5cGUgPSA3OwoJCWJyZWFrOwoJY2FzZSBIQUxfU0VDVVJJVFlfVFlQRV9HQ01QMjU2OgoJY2FzZSBIQUxfU0VDVVJJVFlfVFlQRV9HQ01TTVM0OgoJCXBDYW1fZW50cnlfZm9ybWF0LT50eXBlID0gNzsKCQlwQ2FtX2VudHJ5X2Zvcm1hdC0+ZXh0X3NlY3R5cGUgPSAxOwoJCWJyZWFrOwoJY2FzZSBIQUxfU0VDVVJJVFlfVFlQRV9CSVA6CgkJcENhbV9lbnRyeV9mb3JtYXQtPnR5cGUgPSAocENhbV9lbnRyeV9pbmZvLT51bmljYXN0ID09IDEpID8gNCA6IDA7CgkJcENhbV9lbnRyeV9mb3JtYXQtPm1nbnQgPSAxOwoJCXBDYW1fZW50cnlfZm9ybWF0LT5ncnAgPSAocENhbV9lbnRyeV9pbmZvLT51bmljYXN0ID09IDEpID8gMCA6IDE7CgkJYnJlYWs7CglkZWZhdWx0OgoJCVBMQVRGT1JNX1JUTF9GUkVFKHBEcml2ZXJfYWRhcHRlciwgcENhbV9lbnRyeV9mb3JtYXQsIHNpemVvZigqcENhbV9lbnRyeV9mb3JtYXQpKTsKCQlyZXR1cm4gSEFMTUFDX1JFVF9GQUlMOwoJfQoKCglmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CgkJSEFMTUFDX1JFR19XUklURV8zMihwSGFsbWFjX2FkYXB0ZXIsIFJFR19DQU1XUklURSwgKigodTMyICopcENhbV9lbnRyeV9mb3JtYXQgKyBpKSk7CgkJSEFMTUFDX1JFR19XUklURV8zMihwSGFsbWFjX2FkYXB0ZXIsIFJFR19DQU1DTUQsIGNvbW1hbmQgfCAoKGVudHJ5X2luZGV4IDw8IDMpICsgaSkpOwoJCVBMQVRGT1JNX01TR19QUklOVChwRHJpdmVyX2FkYXB0ZXIsIEhBTE1BQ19NU0dfQ09NTU9OLCBIQUxNQUNfREJHX1RSQUNFLCAiW1RSQUNFXTEgLSBDQU0gZW50cnkgZm9ybWF0IDogJVhcbiIsICooKHUzMiAqKXBDYW1fZW50cnlfZm9ybWF0ICsgaSkpOwoJCVBMQVRGT1JNX01TR19QUklOVChwRHJpdmVyX2FkYXB0ZXIsIEhBTE1BQ19NU0dfQ09NTU9OLCBIQUxNQUNfREJHX1RSQUNFLCAiW1RSQUNFXTEgLSBSRUdfQ0FNQ01EIDogJVhcbiIsIGNvbW1hbmQgfCAoKGVudHJ5X2luZGV4IDw8IDMpICsgaSkpOwoJfQoKCWlmIChIQUxfU0VDVVJJVFlfVFlQRV9XQVBJID09IHBDYW1fZW50cnlfaW5mby0+c2VjdXJpdHlfdHlwZSB8fCBIQUxfU0VDVVJJVFlfVFlQRV9BRVMyNTYgPT0gcENhbV9lbnRyeV9pbmZvLT5zZWN1cml0eV90eXBlIHx8CgkJCUhBTF9TRUNVUklUWV9UWVBFX0dDTVAyNTYgPT0gcENhbV9lbnRyeV9pbmZvLT5zZWN1cml0eV90eXBlIHx8IEhBTF9TRUNVUklUWV9UWVBFX0dDTVNNUzQgPT0gcENhbV9lbnRyeV9pbmZvLT5zZWN1cml0eV90eXBlKSB7CgkJcENhbV9lbnRyeV9mb3JtYXQtPm1pYyA9IDE7CgkJUExBVEZPUk1fUlRMX01FTUNQWShwRHJpdmVyX2FkYXB0ZXIsIHBDYW1fZW50cnlfZm9ybWF0LT5rZXksIHBDYW1fZW50cnlfaW5mby0+a2V5X2V4dCwgMTYpOwoKCQlmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CgkJCUhBTE1BQ19SRUdfV1JJVEVfMzIocEhhbG1hY19hZGFwdGVyLCBSRUdfQ0FNV1JJVEUsICooKHUzMiAqKXBDYW1fZW50cnlfZm9ybWF0ICsgaSkpOwoJCQlIQUxNQUNfUkVHX1dSSVRFXzMyKHBIYWxtYWNfYWRhcHRlciwgUkVHX0NBTUNNRCwgY29tbWFuZCB8ICgoKGVudHJ5X2luZGV4ICsgMSkgPDwgMykgKyBpKSk7CgkJCVBMQVRGT1JNX01TR19QUklOVChwRHJpdmVyX2FkYXB0ZXIsIEhBTE1BQ19NU0dfQ09NTU9OLCBIQUxNQUNfREJHX1RSQUNFLCAiW1RSQUNFXTIgLSBDQU0gZW50cnkgZm9ybWF0IDogJVhcbiIsICooKHUzMiAqKXBDYW1fZW50cnlfZm9ybWF0ICsgaSkpOwoJCQlQTEFURk9STV9NU0dfUFJJTlQocERyaXZlcl9hZGFwdGVyLCBIQUxNQUNfTVNHX0NPTU1PTiwgSEFMTUFDX0RCR19UUkFDRSwgIltUUkFDRV0yIC0gUkVHX0NBTUNNRCA6ICVYXG4iLCBjb21tYW5kIHwgKCgoZW50cnlfaW5kZXggKyAxKSA8PCAzKSArIGkpKTsKCQl9Cgl9CgoJUExBVEZPUk1fUlRMX0ZSRUUocERyaXZlcl9hZGFwdGVyLCBwQ2FtX2VudHJ5X2Zvcm1hdCwgc2l6ZW9mKCpwQ2FtX2VudHJ5X2Zvcm1hdCkpOwoKCVBMQVRGT1JNX01TR19QUklOVChwRHJpdmVyX2FkYXB0ZXIsIEhBTE1BQ19NU0dfQ09NTU9OLCBIQUxNQUNfREJHX1RSQUNFLCAiW1RSQUNFXWhhbG1hY193cml0ZV9jYW1fODh4eCA8PT09PT09PT09PVxuIik7CgoJcmV0dXJuIEhBTE1BQ19SRVRfU1VDQ0VTUzsKfQoKSEFMTUFDX1JFVF9TVEFUVVMKaGFsbWFjX3JlYWRfY2FtX2VudHJ5Xzg4eHgoCglJTiBQSEFMTUFDX0FEQVBURVIJcEhhbG1hY19hZGFwdGVyLAoJSU4gdTMyIGVudHJ5X2luZGV4LAoJT1VUIFBIQUxNQUNfQ0FNX0VOVFJZX0ZPUk1BVCBwQ29udGVudAopCnsKCXUzMiBpOwoJdTMyIGNvbW1hbmQgPSAweDgwMDAwMDAwOwoJUEhBTE1BQ19BUEkgcEhhbG1hY19hcGk7CglWT0lEICpwRHJpdmVyX2FkYXB0ZXIgPSBOVUxMOwoKCXBEcml2ZXJfYWRhcHRlciA9IHBIYWxtYWNfYWRhcHRlci0+cERyaXZlcl9hZGFwdGVyOwoJcEhhbG1hY19hcGkgPSAoUEhBTE1BQ19BUEkpcEhhbG1hY19hZGFwdGVyLT5wSGFsbWFjX2FwaTsKCglQTEFURk9STV9NU0dfUFJJTlQocERyaXZlcl9hZGFwdGVyLCBIQUxNQUNfTVNHX0NPTU1PTiwgSEFMTUFDX0RCR19UUkFDRSwgIltUUkFDRV1oYWxtYWNfcmVhZF9jYW1fZW50cnlfODh4eCA9PT09PT09PT09PlxuIik7CgoJaWYgKGVudHJ5X2luZGV4ID49IHBIYWxtYWNfYWRhcHRlci0+aHdfY29uZmlnX2luZm8uY2FtX2VudHJ5X251bSkKCQlyZXR1cm4gSEFMTUFDX1JFVF9FTlRSWV9JTkRFWF9FUlJPUjsKCglmb3IgKGkgPSAwOyBpIDwgODsgaSsrKSB7CgkJSEFMTUFDX1JFR19XUklURV8zMihwSGFsbWFjX2FkYXB0ZXIsIFJFR19DQU1DTUQsIGNvbW1hbmQgfCAoKGVudHJ5X2luZGV4IDw8IDMpICsgaSkpOwoJCSooKHUzMiAqKXBDb250ZW50ICsgaSkgPSBIQUxNQUNfUkVHX1JFQURfMzIocEhhbG1hY19hZGFwdGVyLCBSRUdfQ0FNUkVBRCk7Cgl9CgoJUExBVEZPUk1fTVNHX1BSSU5UKHBEcml2ZXJfYWRhcHRlciwgSEFMTUFDX01TR19DT01NT04sIEhBTE1BQ19EQkdfVFJBQ0UsICJbVFJBQ0VdaGFsbWFjX3JlYWRfY2FtX2VudHJ5Xzg4eHggPD09PT09PT09PT1cbiIpOwoKCXJldHVybiBIQUxNQUNfUkVUX1NVQ0NFU1M7Cn0KCkhBTE1BQ19SRVRfU1RBVFVTCmhhbG1hY19jbGVhcl9jYW1fZW50cnlfODh4eCgKCUlOIFBIQUxNQUNfQURBUFRFUiBwSGFsbWFjX2FkYXB0ZXIsCglJTiB1MzIgZW50cnlfaW5kZXgKKQp7Cgl1MzIgaTsKCXUzMiBjb21tYW5kID0gMHg4MDAxMDAwMDsKCVZPSUQgKnBEcml2ZXJfYWRhcHRlciA9IE5VTEw7CglQSEFMTUFDX0FQSSBwSGFsbWFjX2FwaTsKCVBIQUxNQUNfQ0FNX0VOVFJZX0ZPUk1BVCBwQ2FtX2VudHJ5X2Zvcm1hdDsKCglpZiAoaGFsbWFjX2FkYXB0ZXJfdmFsaWRhdGUocEhhbG1hY19hZGFwdGVyKSAhPSBIQUxNQUNfUkVUX1NVQ0NFU1MpCgkJcmV0dXJuIEhBTE1BQ19SRVRfQURBUFRFUl9JTlZBTElEOwoKCWlmIChoYWxtYWNfYXBpX3ZhbGlkYXRlKHBIYWxtYWNfYWRhcHRlcikgIT0gSEFMTUFDX1JFVF9TVUNDRVNTKQoJCXJldHVybiBIQUxNQUNfUkVUX0FQSV9JTlZBTElEOwoKCXBEcml2ZXJfYWRhcHRlciA9IHBIYWxtYWNfYWRhcHRlci0+cERyaXZlcl9hZGFwdGVyOwoJcEhhbG1hY19hcGkgPSAoUEhBTE1BQ19BUEkpcEhhbG1hY19hZGFwdGVyLT5wSGFsbWFjX2FwaTsKCglQTEFURk9STV9NU0dfUFJJTlQocERyaXZlcl9hZGFwdGVyLCBIQUxNQUNfTVNHX0lOSVQsIEhBTE1BQ19EQkdfVFJBQ0UsICJbVFJBQ0VdaGFsbWFjX2NsZWFyX3NlY3VyaXR5X2NhbV84OHh4ID09PT09PT09PT0+XG4iKTsKCglpZiAoZW50cnlfaW5kZXggPj0gcEhhbG1hY19hZGFwdGVyLT5od19jb25maWdfaW5mby5jYW1fZW50cnlfbnVtKQoJCXJldHVybiBIQUxNQUNfUkVUX0VOVFJZX0lOREVYX0VSUk9SOwoKCXBDYW1fZW50cnlfZm9ybWF0ID0gKFBIQUxNQUNfQ0FNX0VOVFJZX0ZPUk1BVClQTEFURk9STV9SVExfTUFMTE9DKHBEcml2ZXJfYWRhcHRlciwgc2l6ZW9mKCpwQ2FtX2VudHJ5X2Zvcm1hdCkpOwoJaWYgKHBDYW1fZW50cnlfZm9ybWF0ID09IE5VTEwpCgkJcmV0dXJuIEhBTE1BQ19SRVRfTlVMTF9QT0lOVEVSOwoJUExBVEZPUk1fUlRMX01FTVNFVChwRHJpdmVyX2FkYXB0ZXIsIHBDYW1fZW50cnlfZm9ybWF0LCAweDAwLCBzaXplb2YoKnBDYW1fZW50cnlfZm9ybWF0KSk7CgoJZm9yIChpID0gMDsgaSA8IDg7IGkrKykgewoJCUhBTE1BQ19SRUdfV1JJVEVfMzIocEhhbG1hY19hZGFwdGVyLCBSRUdfQ0FNV1JJVEUsICooKHUzMiAqKXBDYW1fZW50cnlfZm9ybWF0ICsgaSkpOwoJCUhBTE1BQ19SRUdfV1JJVEVfMzIocEhhbG1hY19hZGFwdGVyLCBSRUdfQ0FNQ01ELCBjb21tYW5kIHwgKChlbnRyeV9pbmRleCA8PCAzKSArIGkpKTsKCX0KCglQTEFURk9STV9SVExfRlJFRShwRHJpdmVyX2FkYXB0ZXIsIHBDYW1fZW50cnlfZm9ybWF0LCBzaXplb2YoKnBDYW1fZW50cnlfZm9ybWF0KSk7CgoJUExBVEZPUk1fTVNHX1BSSU5UKHBEcml2ZXJfYWRhcHRlciwgSEFMTUFDX01TR19JTklULCBIQUxNQUNfREJHX1RSQUNFLCAiW1RSQUNFXWhhbG1hY19jbGVhcl9zZWN1cml0eV9jYW1fODh4eCA8PT09PT09PT09PVxuIik7CgoJcmV0dXJuIEhBTE1BQ19SRVRfU1VDQ0VTUzsKfQoKVk9JRApoYWxtYWNfcnhfc2hpZnRfODh4eCgKCUlOIFBIQUxNQUNfQURBUFRFUiBwSGFsbWFjX2FkYXB0ZXIsCglJTiB1OCBlbmFibGUKKQp7CglQSEFMTUFDX0FQSSBwSGFsbWFjX2FwaTsKCglwSGFsbWFjX2FwaSA9IChQSEFMTUFDX0FQSSlwSGFsbWFjX2FkYXB0ZXItPnBIYWxtYWNfYXBpOwoKCWlmIChlbmFibGUgPT0gMSkKCQlIQUxNQUNfUkVHX1dSSVRFXzgocEhhbG1hY19hZGFwdGVyLCBSRUdfVFhETUFfUFFfTUFQLCBIQUxNQUNfUkVHX1JFQURfOChwSGFsbWFjX2FkYXB0ZXIsIFJFR19UWERNQV9QUV9NQVApIHwgQklUKDEpKTsKCWVsc2UKCQlIQUxNQUNfUkVHX1dSSVRFXzgocEhhbG1hY19hZGFwdGVyLCBSRUdfVFhETUFfUFFfTUFQLCBIQUxNQUNfUkVHX1JFQURfOChwSGFsbWFjX2FkYXB0ZXIsIFJFR19UWERNQV9QUV9NQVApICYgfihCSVQoMSkpKTsKfQoKLyoqCiAqIGhhbG1hY19jZmdfZWRjYV9wYXJhXzg4eHgoKSAtIGNvbmZpZyBlZGNhIHBhcmFtZXRlcgogKiBAcEhhbG1hY19hZGFwdGVyIDogdGhlIGFkYXB0ZXIgb2YgaGFsbWFjCiAqIEBhY3FfaWQgOiBWTy9WSS9CRS9CSwogKiBAcEVkY2FfcGFyYSA6IGFpZnMsIGN3LCB0eG9wIGxpbWl0CiAqIEF1dGhvciA6IEl2YW4gTGluCiAqIFJldHVybiA6IEhBTE1BQ19SRVRfU1RBVFVTCiAqIE1vcmUgZGV0YWlscyBvZiBzdGF0dXMgY29kZSBjYW4gYmUgZm91bmQgaW4gcHJvdG90eXBlIGRvY3VtZW50CiAqLwpIQUxNQUNfUkVUX1NUQVRVUwpoYWxtYWNfY2ZnX2VkY2FfcGFyYV84OHh4KAoJSU4gUEhBTE1BQ19BREFQVEVSIHBIYWxtYWNfYWRhcHRlciwKCUlOIEhBTE1BQ19BQ1FfSUQgYWNxX2lkLAoJSU4gUEhBTE1BQ19FRENBX1BBUkEgcEVkY2FfcGFyYQopCnsKCXUzMiBvZmZzZXQsIHZhbHVlMzI7CglWT0lEICpwRHJpdmVyX2FkYXB0ZXIgPSBOVUxMOwoJUEhBTE1BQ19BUEkgcEhhbG1hY19hcGk7CgoJaWYgKGhhbG1hY19hZGFwdGVyX3ZhbGlkYXRlKHBIYWxtYWNfYWRhcHRlcikgIT0gSEFMTUFDX1JFVF9TVUNDRVNTKQoJCXJldHVybiBIQUxNQUNfUkVUX0FEQVBURVJfSU5WQUxJRDsKCglpZiAoaGFsbWFjX2FwaV92YWxpZGF0ZShwSGFsbWFjX2FkYXB0ZXIpICE9IEhBTE1BQ19SRVRfU1VDQ0VTUykKCQlyZXR1cm4gSEFMTUFDX1JFVF9BUElfSU5WQUxJRDsKCglwRHJpdmVyX2FkYXB0ZXIgPSBwSGFsbWFjX2FkYXB0ZXItPnBEcml2ZXJfYWRhcHRlcjsKCXBIYWxtYWNfYXBpID0gKFBIQUxNQUNfQVBJKXBIYWxtYWNfYWRhcHRlci0+cEhhbG1hY19hcGk7CgoJUExBVEZPUk1fTVNHX1BSSU5UKHBEcml2ZXJfYWRhcHRlciwgSEFMTUFDX01TR19DT01NT04sIEhBTE1BQ19EQkdfVFJBQ0UsICJbVFJBQ0VdaGFsbWFjX2NmZ19lZGNhXzg4eHggPT09PT09PT09PT5cbiIpOwoKCXN3aXRjaCAoYWNxX2lkKSB7CgljYXNlIEhBTE1BQ19BQ1FfSURfVk86CgkJb2Zmc2V0ID0gUkVHX0VEQ0FfVk9fUEFSQU07CgkJYnJlYWs7CgljYXNlIEhBTE1BQ19BQ1FfSURfVkk6CgkJb2Zmc2V0ID0gUkVHX0VEQ0FfVklfUEFSQU07CgkJYnJlYWs7CgljYXNlIEhBTE1BQ19BQ1FfSURfQkU6CgkJb2Zmc2V0ID0gUkVHX0VEQ0FfQkVfUEFSQU07CgkJYnJlYWs7CgljYXNlIEhBTE1BQ19BQ1FfSURfQks6CgkJb2Zmc2V0ID0gUkVHX0VEQ0FfQktfUEFSQU07CgkJYnJlYWs7CglkZWZhdWx0OgoJCXJldHVybiBIQUxNQUNfUkVUX1NXSVRDSF9DQVNFX0VSUk9SOwoJfQoKCXZhbHVlMzIgPSAocEVkY2FfcGFyYS0+YWlmcyAmIDB4RkYpIHwgKChwRWRjYV9wYXJhLT5jdyAmIDB4RkYpIDw8IDgpIHwgKChwRWRjYV9wYXJhLT50eG9wX2xpbWl0ICYgMHg3RkYpIDw8IDE2KTsKCglIQUxNQUNfUkVHX1dSSVRFXzMyKHBIYWxtYWNfYWRhcHRlciwgb2Zmc2V0LCB2YWx1ZTMyKTsKCglQTEFURk9STV9NU0dfUFJJTlQocERyaXZlcl9hZGFwdGVyLCBIQUxNQUNfTVNHX0NPTU1PTiwgSEFMTUFDX0RCR19UUkFDRSwgIltUUkFDRV1oYWxtYWNfY2ZnX2VkY2FfODh4eCA8PT09PT09PT09PVxuIik7CgoJcmV0dXJuIEhBTE1BQ19SRVRfU1VDQ0VTUzsKfQoKVk9JRApoYWxtYWNfcnhfY2xrX2dhdGVfODh4eCgKCUlOIFBIQUxNQUNfQURBUFRFUiBwSGFsbWFjX2FkYXB0ZXIsCglJTiB1OCBlbmFibGUKKQp7CglQSEFMTUFDX0FQSSBwSGFsbWFjX2FwaTsKCglwSGFsbWFjX2FwaSA9IChQSEFMTUFDX0FQSSlwSGFsbWFjX2FkYXB0ZXItPnBIYWxtYWNfYXBpOwoKCWlmIChlbmFibGUgPT0gX1RSVUUpCgkJSEFMTUFDX1JFR19XUklURV84KHBIYWxtYWNfYWRhcHRlciwgUkVHX1JDUiArIDIsIEhBTE1BQ19SRUdfUkVBRF84KHBIYWxtYWNfYWRhcHRlciwgUkVHX1JDUiArIDIpICYgfihCSVQoMykpKTsKCWVsc2UKCQlIQUxNQUNfUkVHX1dSSVRFXzgocEhhbG1hY19hZGFwdGVyLCBSRUdfUkNSICsgMiwgSEFMTUFDX1JFR19SRUFEXzgocEhhbG1hY19hZGFwdGVyLCBSRUdfUkNSICsgMikgfCBCSVQoMykpOwp9CgpIQUxNQUNfUkVUX1NUQVRVUwpoYWxtYWNfcnhfY3V0X2Ftc2R1X2NmZ184OHh4KAoJSU4gUEhBTE1BQ19BREFQVEVSIHBIYWxtYWNfYWRhcHRlciwKCUlOIFBIQUxNQUNfQ1VUX0FNU0RVX0NGRyBwQ3V0X2Ftc2R1X2NmZwopCnsKCXJldHVybiBIQUxNQUNfUkVUX05PVF9TVVBQT1JUOwp9CgovKioKICogaGFsbWFjX2dldF9tYWNfYWRkcl84OHh4KCkgLSBnZXQgbWFjIGFkZHJlc3MKICogQHBIYWxtYWNfYWRhcHRlciA6IHRoZSBhZGFwdGVyIG9mIGhhbG1hYwogKiBAaGFsbWFjX3BvcnQgOiAwIGZvciBwb3J0MCwgMSBmb3IgcG9ydDEsIDIgZm9yIHBvcnQyLCAzIGZvciBwb3J0MywgNCBmb3IgcG9ydDQKICogQHBIYWxfYWRkcmVzcyA6IG1hYyBhZGRyZXNzCiAqIEF1dGhvciA6IEl2YW4gTGluCiAqIFJldHVybiA6IEhBTE1BQ19SRVRfU1RBVFVTCiAqIE1vcmUgZGV0YWlscyBvZiBzdGF0dXMgY29kZSBjYW4gYmUgZm91bmQgaW4gcHJvdG90eXBlIGRvY3VtZW50CiAqLwpIQUxNQUNfUkVUX1NUQVRVUwpoYWxtYWNfZ2V0X21hY19hZGRyXzg4eHgoCglJTiBQSEFMTUFDX0FEQVBURVIgcEhhbG1hY19hZGFwdGVyLAoJSU4gdTggaGFsbWFjX3BvcnQsCglPVVQgUEhBTE1BQ19XTEFOX0FERFIgcEhhbF9hZGRyZXNzCikKewoJdTE2IG1hY19hZGRyZXNzX0g7Cgl1MzIgbWFjX2FkZHJlc3NfTDsKCVZPSUQgKnBEcml2ZXJfYWRhcHRlciA9IE5VTEw7CglQSEFMTUFDX0FQSSBwSGFsbWFjX2FwaTsKCglpZiAoaGFsbWFjX2FkYXB0ZXJfdmFsaWRhdGUocEhhbG1hY19hZGFwdGVyKSAhPSBIQUxNQUNfUkVUX1NVQ0NFU1MpCgkJcmV0dXJuIEhBTE1BQ19SRVRfQURBUFRFUl9JTlZBTElEOwoKCWlmIChoYWxtYWNfYXBpX3ZhbGlkYXRlKHBIYWxtYWNfYWRhcHRlcikgIT0gSEFMTUFDX1JFVF9TVUNDRVNTKQoJCXJldHVybiBIQUxNQUNfUkVUX0FQSV9JTlZBTElEOwoKCXBEcml2ZXJfYWRhcHRlciA9IHBIYWxtYWNfYWRhcHRlci0+cERyaXZlcl9hZGFwdGVyOwoJcEhhbG1hY19hcGkgPSAoUEhBTE1BQ19BUEkpcEhhbG1hY19hZGFwdGVyLT5wSGFsbWFjX2FwaTsKCglQTEFURk9STV9NU0dfUFJJTlQocERyaXZlcl9hZGFwdGVyLCBIQUxNQUNfTVNHX0lOSVQsIEhBTE1BQ19EQkdfVFJBQ0UsICJbVFJBQ0VdaGFsbWFjX2dldF9tYWNfYWRkcl84OHh4ID09PT09PT09PT0+XG4iKTsKCglpZiAoaGFsbWFjX3BvcnQgPj0gSEFMTUFDX1BPUlRJRE1BWCkgewoJCVBMQVRGT1JNX01TR19QUklOVChwRHJpdmVyX2FkYXB0ZXIsIEhBTE1BQ19NU0dfSU5JVCwgSEFMTUFDX0RCR19FUlIsICJbRVJSXXBvcnQgaW5kZXggPj0gNVxuIik7CgkJcmV0dXJuIEhBTE1BQ19SRVRfUE9SVF9OT1RfU1VQUE9SVDsKCX0KCglzd2l0Y2ggKGhhbG1hY19wb3J0KSB7CgljYXNlIEhBTE1BQ19QT1JUSUQwOgoJCW1hY19hZGRyZXNzX0wgPSBIQUxNQUNfUkVHX1JFQURfMzIocEhhbG1hY19hZGFwdGVyLCBSRUdfTUFDSUQpOwoJCW1hY19hZGRyZXNzX0ggPSBIQUxNQUNfUkVHX1JFQURfMTYocEhhbG1hY19hZGFwdGVyLCBSRUdfTUFDSUQgKyA0KTsKCQlicmVhazsKCWNhc2UgSEFMTUFDX1BPUlRJRDE6CgkJbWFjX2FkZHJlc3NfTCA9IEhBTE1BQ19SRUdfUkVBRF8zMihwSGFsbWFjX2FkYXB0ZXIsIFJFR19NQUNJRDEpOwoJCW1hY19hZGRyZXNzX0ggPSBIQUxNQUNfUkVHX1JFQURfMTYocEhhbG1hY19hZGFwdGVyLCBSRUdfTUFDSUQxICsgNCk7CgkJYnJlYWs7CgljYXNlIEhBTE1BQ19QT1JUSUQyOgoJCW1hY19hZGRyZXNzX0wgPSBIQUxNQUNfUkVHX1JFQURfMzIocEhhbG1hY19hZGFwdGVyLCBSRUdfTUFDSUQyKTsKCQltYWNfYWRkcmVzc19IID0gSEFMTUFDX1JFR19SRUFEXzE2KHBIYWxtYWNfYWRhcHRlciwgUkVHX01BQ0lEMiArIDQpOwoJCWJyZWFrOwoJY2FzZSBIQUxNQUNfUE9SVElEMzoKCQltYWNfYWRkcmVzc19MID0gSEFMTUFDX1JFR19SRUFEXzMyKHBIYWxtYWNfYWRhcHRlciwgUkVHX01BQ0lEMyk7CgkJbWFjX2FkZHJlc3NfSCA9IEhBTE1BQ19SRUdfUkVBRF8xNihwSGFsbWFjX2FkYXB0ZXIsIFJFR19NQUNJRDMgKyA0KTsKCQlicmVhazsKCWNhc2UgSEFMTUFDX1BPUlRJRDQ6CgkJbWFjX2FkZHJlc3NfTCA9IEhBTE1BQ19SRUdfUkVBRF8zMihwSGFsbWFjX2FkYXB0ZXIsIFJFR19NQUNJRDQpOwoJCW1hY19hZGRyZXNzX0ggPSBIQUxNQUNfUkVHX1JFQURfMTYocEhhbG1hY19hZGFwdGVyLCBSRUdfTUFDSUQ0ICsgNCk7CgkJYnJlYWs7CglkZWZhdWx0OgoJCXJldHVybiBIQUxNQUNfUkVUX1BPUlRfTk9UX1NVUFBPUlQ7Cgl9CgoJbWFjX2FkZHJlc3NfTCA9IHJ0a19sZTMyX3RvX2NwdShtYWNfYWRkcmVzc19MKTsKCW1hY19hZGRyZXNzX0ggPSBydGtfbGUxNl90b19jcHUobWFjX2FkZHJlc3NfSCk7CgoJcEhhbF9hZGRyZXNzLT5BZGRyZXNzX0xfSC5BZGRyZXNzX0xvdyA9IG1hY19hZGRyZXNzX0w7CglwSGFsX2FkZHJlc3MtPkFkZHJlc3NfTF9ILkFkZHJlc3NfSGlnaCA9IG1hY19hZGRyZXNzX0g7CgoJUExBVEZPUk1fTVNHX1BSSU5UKHBEcml2ZXJfYWRhcHRlciwgSEFMTUFDX01TR19JTklULCBIQUxNQUNfREJHX1RSQUNFLCAiW1RSQUNFXWhhbG1hY19nZXRfbWFjX2FkZHJfODh4eCA8PT09PT09PT09PVxuIik7CgoJcmV0dXJuIEhBTE1BQ19SRVRfU1VDQ0VTUzsKfQoKI2VuZGlmIC8qIEhBTE1BQ184OFhYX1NVUFBPUlQgKi8K