LyoNCglGcmVlUlRPUyBWNS40LjEgLSBDb3B5cmlnaHQgKEMpIDIwMDkgUmVhbCBUaW1lIEVuZ2luZWVycyBMdGQuDQoNCglUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVJUT1MgZGlzdHJpYnV0aW9uLg0KDQoJRnJlZVJUT1MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdAl1bmRlciANCgl0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlICh2ZXJzaW9uIDIpIGFzIHB1Ymxpc2hlZCBieSB0aGUgDQoJRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCBtb2RpZmllZCBieSB0aGUgRnJlZVJUT1MgZXhjZXB0aW9uLg0KCSoqTk9URSoqIFRoZSBleGNlcHRpb24gdG8gdGhlIEdQTCBpcyBpbmNsdWRlZCB0byBhbGxvdyB5b3UgdG8gZGlzdHJpYnV0ZSBhDQoJY29tYmluZWQgd29yayB0aGF0IGluY2x1ZGVzIEZyZWVSVE9TIHdpdGhvdXQgYmVpbmcgb2JsaWdlZCB0byBwcm92aWRlIHRoZSANCglzb3VyY2UgY29kZSBmb3IgcHJvcHJpZXRhcnkgY29tcG9uZW50cyBvdXRzaWRlIG9mIHRoZSBGcmVlUlRPUyBrZXJuZWwuICANCglBbHRlcm5hdGl2ZSBjb21tZXJjaWFsIGxpY2Vuc2UgYW5kIHN1cHBvcnQgdGVybXMgYXJlIGFsc28gYXZhaWxhYmxlIHVwb24gDQoJcmVxdWVzdC4gIFNlZSB0aGUgbGljZW5zaW5nIHNlY3Rpb24gb2YgaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcgZm9yIGZ1bGwgDQoJbGljZW5zZSBkZXRhaWxzLg0KDQoJRnJlZVJUT1MgaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwJYnV0IFdJVEhPVVQNCglBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbiB0aGUgaW1wbGllZCB3YXJyYW50eSBvZiBNRVJDSEFOVEFCSUxJVFkgb3INCglGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRS4gIFNlZSB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgZm9yDQoJbW9yZSBkZXRhaWxzLg0KDQoJWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgYWxvbmcNCgl3aXRoIEZyZWVSVE9TOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24sIEluYy4sIDU5DQoJVGVtcGxlIFBsYWNlLCBTdWl0ZSAzMzAsIEJvc3RvbiwgTUEgIDAyMTExLTEzMDcgIFVTQS4NCg0KDQoJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoJKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoJKiBMb29raW5nIGZvciBhIHF1aWNrIHN0YXJ0PyAgVGhlbiBjaGVjayBvdXQgdGhlIEZyZWVSVE9TIGVCb29rISAgICAgICAgICAqDQoJKiBTZWUgaHR0cDovL3d3dy5GcmVlUlRPUy5vcmcvRG9jdW1lbnRhdGlvbiBmb3IgZGV0YWlscyAgICAgICAgICAgICAgICAgICAqDQoJKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQoJKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoNCgkxIHRhYiA9PSA0IHNwYWNlcyENCg0KCVBsZWFzZSBlbnN1cmUgdG8gcmVhZCB0aGUgY29uZmlndXJhdGlvbiBhbmQgcmVsZXZhbnQgcG9ydCBzZWN0aW9ucyBvZiB0aGUNCglvbmxpbmUgZG9jdW1lbnRhdGlvbi4NCg0KCWh0dHA6Ly93d3cuRnJlZVJUT1Mub3JnIC0gRG9jdW1lbnRhdGlvbiwgbGF0ZXN0IGluZm9ybWF0aW9uLCBsaWNlbnNlIGFuZA0KCWNvbnRhY3QgZGV0YWlscy4NCg0KCWh0dHA6Ly93d3cuU2FmZVJUT1MuY29tIC0gQSB2ZXJzaW9uIHRoYXQgaXMgY2VydGlmaWVkIGZvciB1c2UgaW4gc2FmZXR5DQoJY3JpdGljYWwgc3lzdGVtcy4NCg0KCWh0dHA6Ly93d3cuT3BlblJUT1MuY29tIC0gQ29tbWVyY2lhbCBzdXBwb3J0LCBkZXZlbG9wbWVudCwgcG9ydGluZywNCglsaWNlbnNpbmcgYW5kIHRyYWluaW5nIHNlcnZpY2VzLg0KKi8NCg0KLyoNCiAqIEJhc2ljIGludGVycnVwdCBkcml2ZW4gZHJpdmVyIGZvciB0aGUgRU1BQyBwZXJpcGhlcmFsLiAgVGhpcyBkcml2ZXIgaXMgbm90DQogKiByZWVudHJhbnQgYXMgd2l0aCB1SVAgdGhlIGJ1ZmZlcnMgYXJlIG9ubHkgZXZlciBhY2Nlc3NlZCBmcm9tIGEgc2luZ2xlIHRhc2suDQogKg0KICogVGhlIHNpbXBsZSBidWZmZXIgbWFuYWdlbWVudCB1c2VkIHdpdGhpbiB1SVAgYWxsb3dzIHRoZSBFTUFDIGRyaXZlciB0byBhbHNvDQogKiBiZSBzaW1wbGlzdGljLiAgVGhlIGRyaXZlciBjb250YWluZWQgd2l0aGluIHRoZSBsd0lQIGRlbW8gaXMgbW9yZQ0KICogY29tcHJlaGVuc2l2ZS4NCiAqLw0KDQoNCi8qDQpDaGFuZ2VzIGZyb20gVjMuMi4yDQoNCgkrIENvcnJlY3RlZCB0aGUgYnl0ZSBvcmRlciB3aGVuIHdyaXRpbmcgdGhlIE1BQyBhZGRyZXNzIHRvIHRoZSBNQUMuDQoJKyBTdXBwb3J0IGFkZGVkIGZvciBNSUkgaW50ZXJmYWNlcy4gIFByZXZpb3VzbHkgb25seSBSTUlJIHdhcyBzdXBwb3J0ZWQuDQoNCkNoYW5nZXMgZnJvbSBWMy4yLjMNCg0KCSsgVGhlIE1JSSBpbnRlcmZhY2UgaXMgbm93IHRoZSBkZWZhdWx0Lg0KCSsgTW9kaWZpZWQgdGhlIGluaXRpYWxpc2F0aW9uIHNlcXVlbmNlIHNsaWdodGx5IHRvIGFsbG93IGF1dG8gaW5pdCBtb3JlDQoJICB0aW1lIHRvIGNvbXBsZXRlLg0KDQpDaGFuZ2VzIGZyb20gVjMuMi40DQoNCgkrIEFsc28gcmVhZCB0aGUgRU1BQ19SU1IgcmVnaXN0ZXIgaW4gdGhlIEVNQUMgSVNSIGFzIGEgd29yayBhcm91bmQgdGhlIA0KCSAgdGhlIEVNQUMgYnVnIHRoYXQgY2FuIHJlc2V0IHRoZSBSWCBiaXQgaW4gRU1BQ19JU1IgcmVnaXN0ZXIgYmVmb3JlIHRoZQ0KCSAgYml0IGhhcyBiZWVuIHJlYWQuDQoNCkNoYW5nZXMgZnJvbSBWNC4wLjQNCg0KCSsgQ29ycmVjdGVkIHRoZSBSeCBmcmFtZSBsZW5ndGggbWFzayB3aGVuIG9idGFpbmluZyB0aGUgbGVuZ3RoIGZyb20gdGhlDQoJICByeCBkZXNjcmlwdG9yLg0KDQoqLw0KDQovKiBTdGFuZGFyZCBpbmNsdWRlcy4gKi8NCiNpbmNsdWRlIDxzdHJpbmcuaD4NCg0KLyogU2NoZWR1bGVyIGluY2x1ZGVzLiAqLw0KI2luY2x1ZGUgIkZyZWVSVE9TLmgiDQojaW5jbHVkZSAic2VtcGhyLmgiDQojaW5jbHVkZSAidGFzay5oIg0KDQovKiB1SVAgaW5jbHVkZXMuICovDQojaW5jbHVkZSAidWlwLmgiDQoNCi8qIEhhcmR3YXJlIHNwZWNpZmljIGluY2x1ZGVzLiAqLw0KI2luY2x1ZGUgIkVtYWMuaCINCiNpbmNsdWRlICJtaWkuaCINCg0KDQovKiBVU0VfUk1JSV9JTlRFUkZBQ0UgbXVzdCBiZSBkZWZpbmVkIGFzIDEgdG8gdXNlIGFuIFJNSUkgaW50ZXJmYWNlLCBvciAwDQp0byB1c2UgYW4gTUlJIGludGVyZmFjZS4gKi8NCiNkZWZpbmUgVVNFX1JNSUlfSU5URVJGQUNFIDANCg0KLyogVGhlIGJ1ZmZlciBhZGRyZXNzZXMgd3JpdHRlbiBpbnRvIHRoZSBkZXNjcmlwdG9ycyBtdXN0IGJlIGFsaWduZWQgc28gdGhlDQpsYXN0IGZldyBiaXRzIGFyZSB6ZXJvLiAgVGhlc2UgYml0cyBoYXZlIHNwZWNpYWwgbWVhbmluZyBmb3IgdGhlIEVNQUMNCnBlcmlwaGVyYWwgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIGFkZHJlc3MuICovDQojZGVmaW5lIGVtYWNBRERSRVNTX01BU0sJCQkoICggdW5zaWduZWQgcG9ydExPTkcgKSAweEZGRkZGRkZDICkNCg0KLyogQml0IHVzZWQgd2l0aGluIHRoZSBhZGRyZXNzIHN0b3JlZCBpbiB0aGUgZGVzY3JpcHRvciB0byBtYXJrIHRoZSBsYXN0DQpkZXNjcmlwdG9yIGluIHRoZSBhcnJheS4gKi8NCiNkZWZpbmUgZW1hY1JYX1dSQVBfQklUCQkJCSggKCB1bnNpZ25lZCBwb3J0TE9ORyApIDB4MDIgKQ0KDQovKiBCaXQgdXNlZCB3aXRoaW4gdGhlIFR4IGRlc2NyaXB0b3Igc3RhdHVzIHRvIGluZGljYXRlIHdoZXRoZXIgdGhlDQpkZXNjcmlwdG9yIGlzIHVuZGVyIHRoZSBjb250cm9sIG9mIHRoZSBFTUFDIG9yIHRoZSBzb2Z0d2FyZS4gKi8NCiNkZWZpbmUgZW1hY1RYX0JVRl9VU0VECQkJCSggKCB1bnNpZ25lZCBwb3J0TE9ORyApIDB4ODAwMDAwMDAgKQ0KDQovKiBBIHNob3J0IGRlbGF5IGlzIHVzZWQgdG8gd2FpdCBmb3IgYSBidWZmZXIgdG8gYmVjb21lIGF2YWlsYWJsZSwgc2hvdWxkDQpvbmUgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB3aGVuIHRyeWluZyB0byB0cmFuc21pdCBhIGZyYW1lLiAqLw0KI2RlZmluZSBlbWFjQlVGRkVSX1dBSVRfREVMQVkJCSggMiApDQojZGVmaW5lIGVtYWNNQVhfV0FJVF9DWUNMRVMJCQkoIGNvbmZpZ1RJQ0tfUkFURV9IWiAvIDQwICkNCg0KLyogTWlzYyBkZWZpbmVzLiAqLw0KI2RlZmluZSBlbWFjSU5URVJSVVBUX0xFVkVMCQkJKCA1ICkNCiNkZWZpbmUgZW1hY05PX0RFTEFZCQkJCSggMCApDQojZGVmaW5lIGVtYWNUT1RBTF9GUkFNRV9IRUFERVJfU0laRQkoIDU0ICkNCiNkZWZpbmUgZW1hY1BIWV9JTklUX0RFTEFZCQkJKCA1MDAwIC8gcG9ydFRJQ0tfUkFURV9NUyApDQojZGVmaW5lIGVtYWNSRVNFVF9LRVkJCQkJKCAoIHVuc2lnbmVkIHBvcnRMT05HICkgMHhBNTAwMDAwMCApDQojZGVmaW5lIGVtYWNSRVNFVF9MRU5HVEgJCQkoICggdW5zaWduZWQgcG9ydExPTkcgKSAoIDB4MDEgPDwgOCApICkNCg0KLyogVGhlIEF0bWVsIGhlYWRlciBmaWxlIG9ubHkgZGVmaW5lcyB0aGUgVFggZnJhbWUgbGVuZ3RoIG1hc2suICovDQojZGVmaW5lIGVtYWNSWF9MRU5HVEhfRlJBTUUJCQkoIDB4ZmZmICkNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qDQogKiBQcm90b3R5cGUgZm9yIHRoZSBFTUFDIGludGVycnVwdCBhc20gd3JhcHBlci4NCiAqLw0KZXh0ZXJuIHZvaWQgdkVNQUNJU1JFbnRyeSggdm9pZCApOw0KDQovKg0KICogUHJvdG90eXBlIGZvciB0aGUgRU1BQyBpbnRlcnJ1cHQgZnVuY3Rpb24gLSBjYWxsZWQgYnkgdGhlIGFzbSB3cmFwcGVyLg0KICovDQpfX2FybSB2b2lkIHZFTUFDSVNSKCB2b2lkICk7DQoNCi8qDQogKiBJbml0aWFsaXNlIGJvdGggdGhlIFR4IGFuZCBSeCBkZXNjcmlwdG9ycyB1c2VkIGJ5IHRoZSBFTUFDLg0KICovDQpzdGF0aWMgdm9pZCBwcnZTZXR1cERlc2NyaXB0b3JzKHZvaWQpOw0KDQovKg0KICogV3JpdGUgb3VyIE1BQyBhZGRyZXNzIGludG8gdGhlIEVNQUMuICBUaGUgTUFDIGFkZHJlc3MgaXMgc2V0IGFzIG9uZSBvZiB0aGUNCiAqIHVpcCBvcHRpb25zLg0KICovDQpzdGF0aWMgdm9pZCBwcnZTZXR1cE1BQ0FkZHJlc3MoIHZvaWQgKTsNCg0KLyoNCiAqIENvbmZpZ3VyZSB0aGUgRU1BQyBhbmQgQUlDIGZvciBFTUFDIGludGVycnVwdHMuDQogKi8NCnN0YXRpYyB2b2lkIHBydlNldHVwRU1BQ0ludGVycnVwdCggdm9pZCApOw0KDQovKg0KICogU29tZSBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbnMgdGFrZW4gZnJvbSB0aGUgQXRtZWwgRU1BQyBzYW1wbGUgY29kZS4NCiAqLw0Kc3RhdGljIHZvaWQgdlJlYWRQSFkoIHVuc2lnbmVkIHBvcnRDSEFSIHVjUEhZQWRkcmVzcywgdW5zaWduZWQgcG9ydENIQVIgdWNBZGRyZXNzLCB1bnNpZ25lZCBwb3J0TE9ORyAqcHVsVmFsdWUgKTsNCiNpZiBVU0VfUk1JSV9JTlRFUkZBQ0UgIT0gMQ0KCXN0YXRpYyB2b2lkIHZXcml0ZVBIWSggdW5zaWduZWQgcG9ydENIQVIgdWNQSFlBZGRyZXNzLCB1bnNpZ25lZCBwb3J0Q0hBUiB1Y0FkZHJlc3MsIHVuc2lnbmVkIHBvcnRMT05HIHVsVmFsdWUpOw0KI2VuZGlmDQpzdGF0aWMgcG9ydEJBU0VfVFlQRSB4R2V0TGlua1NwZWVkKCB2b2lkICk7DQpzdGF0aWMgcG9ydEJBU0VfVFlQRSBwcnZQcm9iZVBIWSggdm9pZCApOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyogQnVmZmVyIHdyaXR0ZW4gdG8gYnkgdGhlIEVNQUMgRE1BLiAgTXVzdCBiZSBhbGlnbmVkIGFzIGRlc2NyaWJlZCBieSB0aGUNCmNvbW1lbnQgYWJvdmUgdGhlIGVtYWNBRERSRVNTX01BU0sgZGVmaW5pdGlvbi4gKi8NCiNwcmFnbWEgZGF0YV9hbGlnbm1lbnQ9OA0Kc3RhdGljIHZvbGF0aWxlIHBvcnRDSEFSIHBjUnhCdWZmZXJbIE5CX1JYX0JVRkZFUlMgKiBFVEhfUlhfQlVGRkVSX1NJWkUgXTsNCg0KLyogQnVmZmVyIHJlYWQgYnkgdGhlIEVNQUMgRE1BLiAgTXVzdCBiZSBhbGlnbmVkIGFzIGRlc2NyaWJlZCBieSBoZSBjb21tZW50DQphYm92ZSB0aGUgZW1hY0FERFJFU1NfTUFTSyBkZWZpbml0aW9uLiAqLw0KI3ByYWdtYSBkYXRhX2FsaWdubWVudD04DQpzdGF0aWMgcG9ydENIQVIgcGNUeEJ1ZmZlclsgTkJfVFhfQlVGRkVSUyAqIEVUSF9UWF9CVUZGRVJfU0laRSBdOw0KDQovKiBEZXNjcmlwdG9ycyB1c2VkIHRvIGNvbW11bmljYXRlIGJldHdlZW4gdGhlIHByb2dyYW0gYW5kIHRoZSBFTUFDIHBlcmlwaGVyYWwuDQpUaGVzZSBkZXNjcmlwdG9ycyBob2xkIHRoZSBsb2NhdGlvbnMgYW5kIHN0YXRlIG9mIHRoZSBSeCBhbmQgVHggYnVmZmVycy4gKi8NCnN0YXRpYyB2b2xhdGlsZSBBVDkxU19UeFRkRGVzY3JpcHRvciB4VHhEZXNjcmlwdG9yc1sgTkJfVFhfQlVGRkVSUyBdOw0Kc3RhdGljIHZvbGF0aWxlIEFUOTFTX1J4VGREZXNjcmlwdG9yIHhSeERlc2NyaXB0b3JzWyBOQl9SWF9CVUZGRVJTIF07DQoNCi8qIFRoZSBJUCBhbmQgRXRoZXJuZXQgYWRkcmVzc2VzIGFyZSByZWFkIGZyb20gdGhlIHVJUCBzZXR1cC4gKi8NCmNvbnN0IHBvcnRDSEFSIGNNQUNBZGRyZXNzWyA2IF0gPSB7IFVJUF9FVEhBRERSMCwgVUlQX0VUSEFERFIxLCBVSVBfRVRIQUREUjIsIFVJUF9FVEhBRERSMywgVUlQX0VUSEFERFI0LCBVSVBfRVRIQUREUjUgfTsNCmNvbnN0IHVuc2lnbmVkIGNoYXIgdWNJUEFkZHJlc3NbIDQgXSAgPSB7IFVJUF9JUEFERFIwLCBVSVBfSVBBRERSMSwgVUlQX0lQQUREUjIsIFVJUF9JUEFERFIzIH07DQoNCi8qIFRoZSBzZW1hcGhvcmUgdXNlZCBieSB0aGUgRU1BQyBJU1IgdG8gd2FrZSB0aGUgRU1BQyB0YXNrLiAqLw0Kc3RhdGljIHhTZW1hcGhvcmVIYW5kbGUgeFNlbWFwaG9yZSA9IE5VTEw7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQp4U2VtYXBob3JlSGFuZGxlIHhFTUFDSW5pdCggdm9pZCApDQp7DQoJLyogQ29kZSBzdXBwbGllZCBieSBBdG1lbCAobW9kaWZpZWQpIC0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KCS8qIGRpc2FibGUgcHVsbCB1cCBvbiBSWERWID0+IFBIWSBub3JtYWwgbW9kZSAobm90IGluIHRlc3QgbW9kZSksDQoJUEhZIGhhcyBpbnRlcm5hbCBwdWxsIGRvd24uICovDQoJQVQ5MUNfQkFTRV9QSU9CLT5QSU9fUFBVRFIgPSAxIDw8IDE1Ow0KDQoJI2lmIFVTRV9STUlJX0lOVEVSRkFDRSAhPSAxDQoJICAJLyogUEhZIGhhcyBpbnRlcm5hbCBwdWxsIGRvd24gOiBzZXQgTUlJIG1vZGUuICovDQoJICAJQVQ5MUNfQkFTRV9QSU9CLT5QSU9fUFBVRFI9IDEgPDwgMTY7DQoJI2VuZGlmDQoNCgkvKiBjbGVhciBQQjE4IDw9PiBQSFkgcG93ZXJkb3duLiAqLw0KCUFUOTFGX1BJT19DZmdPdXRwdXQoIEFUOTFDX0JBU0VfUElPQiwgMSA8PCAxOCApIDsNCglBVDkxRl9QSU9fQ2xlYXJPdXRwdXQoIEFUOTFDX0JBU0VfUElPQiwgIDEgPDwgMTgpIDsNCg0KCS8qIEFmdGVyIFBIWSBwb3dlciB1cCwgaGFyZHdhcmUgcmVzZXQuICovDQoJQVQ5MUNfQkFTRV9SU1RDLT5SU1RDX1JNUiA9IGVtYWNSRVNFVF9LRVkgfCBlbWFjUkVTRVRfTEVOR1RIOw0KCUFUOTFDX0JBU0VfUlNUQy0+UlNUQ19SQ1IgPSBlbWFjUkVTRVRfS0VZIHwgQVQ5MUNfUlNUQ19FWFRSU1Q7DQoJDQoJLyogV2FpdCBmb3IgaGFyZHdhcmUgcmVzZXQgZW5kLiAqLw0KCXdoaWxlKCAhKCBBVDkxQ19CQVNFX1JTVEMtPlJTVENfUlNSICYgQVQ5MUNfUlNUQ19OUlNUTCApICkNCgl7DQoJCV9fYXNtKCAiTk9QIiApOw0KCX0NCglfX2FzbSggIk5PUCIgKTsNCiAgCQ0KCS8qIEVNQUMgSU8gaW5pdCBmb3IgRU1BQy1QSFkgY29tLiBSZW1vdmUgRUYxMDAgY29uZmlnLiAqLw0KCUFUOTFGX0VNQUNfQ2ZnUElPKCk7DQoNCgkvKiBFbmFibGUgY29tIGJldHdlZW4gRU1BQyBQSFkuDQoNCglFbmFibGUgbWFuYWdlbWVudCBwb3J0LiAqLw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ1IgfD0gQVQ5MUNfRU1BQ19NUEU7CQ0KDQoJLyogTURDID0gTUNLLzMyLiAqLw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ0ZHUiB8PSAoIDIgKSA8PCAxMDsJDQoNCgkvKiBXYWl0IGZvciBQSFkgYXV0byBpbml0IGVuZCAocmF0aGVyIGNydWRlIGRlbGF5ISkuICovDQoJdlRhc2tEZWxheSggZW1hY1BIWV9JTklUX0RFTEFZICk7DQoNCgkvKiBQSFkgY29uZmlndXJhdGlvbi4gKi8NCgkjaWYgVVNFX1JNSUlfSU5URVJGQUNFICE9IDENCgl7DQoJCXVuc2lnbmVkIHBvcnRMT05HIHVsQ29udHJvbDsNCg0KCQkvKiBQSFkgaGFzIGludGVybmFsIHB1bGwgZG93biA6IGRpc2FibGUgTUlJIGlzb2xhdGUuICovDQoJCXZSZWFkUEhZKCBBVDkxQ19QSFlfQUREUiwgTUlJX0JNQ1IsICZ1bENvbnRyb2wgKTsNCgkJdlJlYWRQSFkoIEFUOTFDX1BIWV9BRERSLCBNSUlfQk1DUiwgJnVsQ29udHJvbCApOw0KCQl1bENvbnRyb2wgJj0gfkJNQ1JfSVNPTEFURTsNCgkJdldyaXRlUEhZKCBBVDkxQ19QSFlfQUREUiwgTUlJX0JNQ1IsIHVsQ29udHJvbCApOw0KCX0NCgkjZW5kaWYNCg0KCS8qIERpc2FibGUgbWFuYWdlbWVudCBwb3J0IGFnYWluLiAqLw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ1IgJj0gfkFUOTFDX0VNQUNfTVBFOw0KDQoJI2lmIFVTRV9STUlJX0lOVEVSRkFDRSAhPSAxDQoJCS8qIEVuYWJsZSBFTUFDIGluIE1JSSBtb2RlLCBlbmFibGUgY2xvY2sgRVJYQ0sgYW5kIEVUWENLLiAqLw0KCQlBVDkxQ19CQVNFX0VNQUMtPkVNQUNfVVNSSU8gPSBBVDkxQ19FTUFDX0NMS0VOIDsNCgkjZWxzZQ0KCQkvKiBFbmFibGUgRU1BQyBpbiBSTUlJIG1vZGUsIGVuYWJsZSBSTUlJIGNsb2NrICg1ME1IeiBmcm9tIG9zY2lsbGF0b3INCgkJb24gRVJGQ0spLiAqLw0KCQlBVDkxQ19CQVNFX0VNQUMtPkVNQUNfVVNSSU8gPSBBVDkxQ19FTUFDX1JNSUkgfCBBVDkxQ19FTUFDX0NMS0VOIDsNCgkjZW5kaWYNCg0KCS8qIEVuZCBvZiBjb2RlIHN1cHBsaWVkIGJ5IEF0bWVsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCgkvKiBTZXR1cCB0aGUgYnVmZmVycyBhbmQgZGVzY3JpcHRvcnMuICovDQoJcHJ2U2V0dXBEZXNjcmlwdG9ycygpOw0KCQ0KCS8qIExvYWQgb3VyIE1BQyBhZGRyZXNzIGludG8gdGhlIEVNQUMuICovDQoJcHJ2U2V0dXBNQUNBZGRyZXNzKCk7DQoNCgkvKiBUcnkgdG8gY29ubmVjdC4gKi8NCglpZiggcHJ2UHJvYmVQSFkoKSApDQoJew0KCQkvKiBFbmFibGUgdGhlIGludGVycnVwdCEgKi8NCgkJcHJ2U2V0dXBFTUFDSW50ZXJydXB0KCk7DQoJfQ0KDQoJcmV0dXJuIHhTZW1hcGhvcmU7DQp9DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KcG9ydExPTkcgbEVNQUNTZW5kKCB2b2lkICkNCnsNCnN0YXRpYyB1bnNpZ25lZCBwb3J0QkFTRV9UWVBFIHV4VHhCdWZmZXJJbmRleCA9IDA7DQpwb3J0QkFTRV9UWVBFIHhXYWl0Q3ljbGVzID0gMDsNCnBvcnRMT05HIGxSZXR1cm4gPSBwZFBBU1M7DQpwb3J0Q0hBUiAqcGNCdWZmZXI7DQoNCgkvKiBJcyBhIGJ1ZmZlciBhdmFpbGFibGU/ICovDQoJd2hpbGUoICEoIHhUeERlc2NyaXB0b3JzWyB1eFR4QnVmZmVySW5kZXggXS5VX1N0YXR1cy5zdGF0dXMgJiBBVDkxQ19UUkFOU01JVF9PSyApICkNCgl7DQoJCS8qIFRoZXJlIGlzIG5vIHJvb20gdG8gd3JpdGUgdGhlIFR4IGRhdGEgdG8gdGhlIFR4IGJ1ZmZlci4gIFdhaXQgYQ0KCQlzaG9ydCB3aGlsZSwgdGhlbiB0cnkgYWdhaW4uICovDQoJCXhXYWl0Q3ljbGVzKys7DQoJCWlmKCB4V2FpdEN5Y2xlcyA+IGVtYWNNQVhfV0FJVF9DWUNMRVMgKQ0KCQl7DQoJCQkvKiBHaXZlIHVwLiAqLw0KCQkJbFJldHVybiA9IHBkRkFJTDsNCgkJCWJyZWFrOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJdlRhc2tEZWxheSggZW1hY0JVRkZFUl9XQUlUX0RFTEFZICk7DQoJCX0NCgl9DQoNCgkvKiBsUmV0dXJuIHdpbGwgb25seSBiZSBwZFBBU1MgaWYgYSBidWZmZXIgaXMgYXZhaWxhYmxlLiAqLw0KCWlmKCBsUmV0dXJuID09IHBkUEFTUyApDQoJew0KCQkvKiBDb3B5IHRoZSBoZWFkZXJzIGludG8gdGhlIFR4IGJ1ZmZlci4gIFRoZXNlIHdpbGwgYmUgaW4gdGhlIHVJUCBidWZmZXIuICovDQoJCXBjQnVmZmVyID0gKCBwb3J0Q0hBUiAqICkgeFR4RGVzY3JpcHRvcnNbIHV4VHhCdWZmZXJJbmRleCBdLmFkZHI7DQoJCW1lbWNweSggKCB2b2lkICogKSBwY0J1ZmZlciwgKCB2b2lkICogKSB1aXBfYnVmLCBlbWFjVE9UQUxfRlJBTUVfSEVBREVSX1NJWkUgKTsNCgkJaWYoIHVpcF9sZW4gPiBlbWFjVE9UQUxfRlJBTUVfSEVBREVSX1NJWkUgKQ0KCQl7DQoJCQltZW1jcHkoICggdm9pZCAqICkgJiggcGNCdWZmZXJbIGVtYWNUT1RBTF9GUkFNRV9IRUFERVJfU0laRSBdICksICggdm9pZCAqICkgdWlwX2FwcGRhdGEsICggdWlwX2xlbiAtIGVtYWNUT1RBTF9GUkFNRV9IRUFERVJfU0laRSApICk7DQoJCX0NCg0KCQkvKiBTZW5kLiAqLwkNCgkJcG9ydEVOVEVSX0NSSVRJQ0FMKCk7DQoJCXsNCgkJCWlmKCB1eFR4QnVmZmVySW5kZXggPj0gKCBOQl9UWF9CVUZGRVJTIC0gMSApICkNCgkJCXsNCgkJCQkvKiBGaWxsIG91dCB0aGUgbmVjZXNzYXJ5IGluIHRoZSBkZXNjcmlwdG9yIHRvIGdldCB0aGUgZGF0YSBzZW50LiAqLw0KCQkJCXhUeERlc2NyaXB0b3JzWyB1eFR4QnVmZmVySW5kZXggXS5VX1N0YXR1cy5zdGF0dXMgPSAJKCB1aXBfbGVuICYgKCB1bnNpZ25lZCBwb3J0TE9ORyApIEFUOTFDX0xFTkdUSF9GUkFNRSApDQoJCQkJCQkJCQkJCQkJCQkJCQl8IEFUOTFDX0xBU1RfQlVGRkVSDQoJCQkJCQkJCQkJCQkJCQkJCQl8IEFUOTFDX1RSQU5TTUlUX1dSQVA7DQoJCQkJdXhUeEJ1ZmZlckluZGV4ID0gMDsNCgkJCX0NCgkJCWVsc2UNCgkJCXsNCgkJCQkvKiBGaWxsIG91dCB0aGUgbmVjZXNzYXJ5IGluIHRoZSBkZXNjcmlwdG9yIHRvIGdldCB0aGUgZGF0YSBzZW50LiAqLw0KCQkJCXhUeERlc2NyaXB0b3JzWyB1eFR4QnVmZmVySW5kZXggXS5VX1N0YXR1cy5zdGF0dXMgPSAJKCB1aXBfbGVuICYgKCB1bnNpZ25lZCBwb3J0TE9ORyApIEFUOTFDX0xFTkdUSF9GUkFNRSApDQoJCQkJCQkJCQkJCQkJCQkJCQl8IEFUOTFDX0xBU1RfQlVGRkVSOw0KCQkJCXV4VHhCdWZmZXJJbmRleCsrOw0KCQkJfQ0KCQ0KCQkJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DUiB8PSBBVDkxQ19FTUFDX1RTVEFSVDsNCgkJfQ0KCQlwb3J0RVhJVF9DUklUSUNBTCgpOw0KCX0NCg0KCXJldHVybiBsUmV0dXJuOw0KfQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnVuc2lnbmVkIHBvcnRMT05HIHVsRU1BQ1BvbGwoIHZvaWQgKQ0Kew0Kc3RhdGljIHVuc2lnbmVkIHBvcnRCQVNFX1RZUEUgdWxOZXh0UnhCdWZmZXIgPSAwOw0KdW5zaWduZWQgcG9ydExPTkcgdWxTZWN0aW9uTGVuZ3RoID0gMCwgdWxMZW5ndGhTb0ZhciA9IDAsIHVsRU9GID0gcGRGQUxTRTsNCnBvcnRDSEFSICpwY1NvdXJjZTsNCg0KCS8qIFNraXAgYW55IGZyYWdtZW50cy4gKi8NCgl3aGlsZSggKCB4UnhEZXNjcmlwdG9yc1sgdWxOZXh0UnhCdWZmZXIgXS5hZGRyICYgQVQ5MUNfT1dORVJTSElQX0JJVCApICYmICEoIHhSeERlc2NyaXB0b3JzWyB1bE5leHRSeEJ1ZmZlciBdLlVfU3RhdHVzLnN0YXR1cyAmIEFUOTFDX1NPRiApICkNCgl7DQoJCS8qIE1hcmsgdGhlIGJ1ZmZlciBhcyBmcmVlIGFnYWluLiAqLw0KCQl4UnhEZXNjcmlwdG9yc1sgdWxOZXh0UnhCdWZmZXIgXS5hZGRyICY9IH4oIEFUOTFDX09XTkVSU0hJUF9CSVQgKTsJCQ0KCQl1bE5leHRSeEJ1ZmZlcisrOw0KCQlpZiggdWxOZXh0UnhCdWZmZXIgPj0gTkJfUlhfQlVGRkVSUyApDQoJCXsNCgkJCXVsTmV4dFJ4QnVmZmVyID0gMDsNCgkJfQ0KCX0NCg0KCS8qIElzIHRoZXJlIGEgcGFja2V0IHJlYWR5PyAqLw0KDQoJd2hpbGUoICggeFJ4RGVzY3JpcHRvcnNbIHVsTmV4dFJ4QnVmZmVyIF0uYWRkciAmIEFUOTFDX09XTkVSU0hJUF9CSVQgKSAmJiAhdWxTZWN0aW9uTGVuZ3RoICkNCgl7DQoJCXBjU291cmNlID0gKCBwb3J0Q0hBUiAqICkoIHhSeERlc2NyaXB0b3JzWyB1bE5leHRSeEJ1ZmZlciBdLmFkZHIgJiBlbWFjQUREUkVTU19NQVNLICk7DQoJCXVsU2VjdGlvbkxlbmd0aCA9IHhSeERlc2NyaXB0b3JzWyB1bE5leHRSeEJ1ZmZlciBdLlVfU3RhdHVzLnN0YXR1cyAmIGVtYWNSWF9MRU5HVEhfRlJBTUU7DQoNCgkJaWYoIHVsU2VjdGlvbkxlbmd0aCA9PSAwICkNCgkJew0KCQkJLyogVGhlIGZyYW1lIGlzIGxvbmdlciB0aGFuIHRoZSBidWZmZXIgcG9pbnRlZCB0byBieSB0aGlzDQoJCQlkZXNjcmlwdG9yIHNvIGNvcHkgdGhlIGVudGlyZSBidWZmZXIgdG8gdUlQIC0gdGhlbiBtb3ZlIG9udG8NCgkJCXRoZSBuZXh0IGRlc2NyaXB0b3IgdG8gZ2V0IHRoZSByZXN0IG9mIHRoZSBmcmFtZS4gKi8NCgkJCWlmKCAoIHVsTGVuZ3RoU29GYXIgKyBFVEhfUlhfQlVGRkVSX1NJWkUgKSA8PSBVSVBfQlVGU0laRSApDQoJCQl7DQoJCQkJbWVtY3B5KCAmKCB1aXBfYnVmWyB1bExlbmd0aFNvRmFyIF0gKSwgcGNTb3VyY2UsIEVUSF9SWF9CVUZGRVJfU0laRSApOw0KCQkJCXVsTGVuZ3RoU29GYXIgKz0gRVRIX1JYX0JVRkZFUl9TSVpFOw0KCQkJfQkJCQ0KCQl9DQoJCWVsc2UNCgkJew0KCQkJLyogVGhpcyBpcyB0aGUgbGFzdCBzZWN0aW9uIG9mIHRoZSBmcmFtZS4gIENvcHkgdGhlIHNlY3Rpb24gdG8NCgkJCXVJUC4gKi8NCgkJCWlmKCB1bFNlY3Rpb25MZW5ndGggPCBVSVBfQlVGU0laRSApDQoJCQl7DQoJCQkJLyogVGhlIHNlY3Rpb24gbGVuZ3RoIGhvbGRzIHRoZSBsZW5ndGggb2YgdGhlIGVudGlyZSBmcmFtZS4NCgkJCQl1bExlbmd0aFNvRmFyIGhvbGRzIHRoZSBsZW5ndGggb2YgdGhlIGZyYW1lIHNlY3Rpb25zIGFscmVhZHkNCgkJCQljb3BpZWQgdG8gdUlQLCBzbyB0aGUgbGVuZ3RoIG9mIHRoZSBmaW5hbCBzZWN0aW9uIGlzDQoJCQkJdWxTZWN0aW9uTGVuZ3RoIC0gdWxMZW5ndGhTb0ZhcjsgKi8NCgkJCQlpZiggdWxTZWN0aW9uTGVuZ3RoID4gdWxMZW5ndGhTb0ZhciApDQoJCQkJew0KCQkJCQltZW1jcHkoICYoIHVpcF9idWZbIHVsTGVuZ3RoU29GYXIgXSApLCBwY1NvdXJjZSwgKCB1bFNlY3Rpb25MZW5ndGggLSB1bExlbmd0aFNvRmFyICkgKTsNCgkJCQl9DQoJCQl9CQkJDQoNCgkJCS8qIElzIHRoaXMgdGhlIGxhc3QgYnVmZmVyIGZvciB0aGUgZnJhbWU/ICBJZiBub3Qgd2h5PyAqLw0KCQkJdWxFT0YgPSB4UnhEZXNjcmlwdG9yc1sgdWxOZXh0UnhCdWZmZXIgXS5VX1N0YXR1cy5zdGF0dXMgJiBBVDkxQ19FT0Y7DQoJCX0NCg0KCQkvKiBNYXJrIHRoZSBidWZmZXIgYXMgZnJlZSBhZ2Fpbi4gKi8NCgkJeFJ4RGVzY3JpcHRvcnNbIHVsTmV4dFJ4QnVmZmVyIF0uYWRkciAmPSB+KCBBVDkxQ19PV05FUlNISVBfQklUICk7DQoNCgkJLyogSW5jcmVtZW50IHRvIHRoZSBuZXh0IGJ1ZmZlciwgd3JhcHBpbmcgaWYgbmVjZXNzYXJ5LiAqLw0KCQl1bE5leHRSeEJ1ZmZlcisrOw0KCQlpZiggdWxOZXh0UnhCdWZmZXIgPj0gTkJfUlhfQlVGRkVSUyApDQoJCXsNCgkJCXVsTmV4dFJ4QnVmZmVyID0gMDsNCgkJfQ0KCX0NCg0KCS8qIElmIHdlIG9idGFpbmVkIGRhdGEgYnV0IGZvciBzb21lIHJlYXNvbiBkaWQgbm90IGZpbmQgdGhlIGVuZCBvZiB0aGUNCglmcmFtZSB0aGVuIGRpc2NhcmQgdGhlIGRhdGEgYXMgaXQgbXVzdCBjb250YWluIGFuIGVycm9yLiAqLw0KCWlmKCAhdWxFT0YgKQ0KCXsNCgkJdWxTZWN0aW9uTGVuZ3RoID0gMDsNCgl9DQoNCglyZXR1cm4gdWxTZWN0aW9uTGVuZ3RoOw0KfQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnN0YXRpYyB2b2lkIHBydlNldHVwRGVzY3JpcHRvcnModm9pZCkNCnsNCnVuc2lnbmVkIHBvcnRCQVNFX1RZUEUgeEluZGV4Ow0KdW5zaWduZWQgcG9ydExPTkcgdWxBZGRyZXNzOw0KDQoJLyogSW5pdGlhbGlzZSB4UnhEZXNjcmlwdG9ycyBkZXNjcmlwdG9yLiAqLw0KCWZvciggeEluZGV4ID0gMDsgeEluZGV4IDwgTkJfUlhfQlVGRkVSUzsgKyt4SW5kZXggKQ0KCXsNCgkJLyogQ2FsY3VsYXRlIHRoZSBhZGRyZXNzIG9mIHRoZSBudGggYnVmZmVyIHdpdGhpbiB0aGUgYXJyYXkuICovDQoJCXVsQWRkcmVzcyA9ICggdW5zaWduZWQgcG9ydExPTkcgKSggcGNSeEJ1ZmZlciArICggeEluZGV4ICogRVRIX1JYX0JVRkZFUl9TSVpFICkgKTsNCg0KCQkvKiBXcml0ZSB0aGUgYnVmZmVyIGFkZHJlc3MgaW50byB0aGUgZGVzY3JpcHRvci4gIFRoZSBETUEgd2lsbCBwbGFjZQ0KCQl0aGUgZGF0YSBhdCB0aGlzIGFkZHJlc3Mgd2hlbiB0aGlzIGRlc2NyaXB0b3IgaXMgYmVpbmcgdXNlZC4gIE1hc2sgb2ZmDQoJCXRoZSBib3R0b20gYml0cyBvZiB0aGUgYWRkcmVzcyBhcyB0aGVzZSBoYXZlIHNwZWNpYWwgbWVhbmluZy4gKi8NCgkJeFJ4RGVzY3JpcHRvcnNbIHhJbmRleCBdLmFkZHIgPSB1bEFkZHJlc3MgJiBlbWFjQUREUkVTU19NQVNLOw0KCX0JDQoNCgkvKiBUaGUgbGFzdCBidWZmZXIgaGFzIHRoZSB3cmFwIGJpdCBzZXQgc28gdGhlIEVNQUMga25vd3MgdG8gd3JhcCBiYWNrDQoJdG8gdGhlIGZpcnN0IGJ1ZmZlci4gKi8NCgl4UnhEZXNjcmlwdG9yc1sgTkJfUlhfQlVGRkVSUyAtIDEgXS5hZGRyIHw9IGVtYWNSWF9XUkFQX0JJVDsNCg0KCS8qIEluaXRpYWxpc2UgeFR4RGVzY3JpcHRvcnMuICovDQoJZm9yKCB4SW5kZXggPSAwOyB4SW5kZXggPCBOQl9UWF9CVUZGRVJTOyArK3hJbmRleCApDQoJew0KCQkvKiBDYWxjdWxhdGUgdGhlIGFkZHJlc3Mgb2YgdGhlIG50aCBidWZmZXIgd2l0aGluIHRoZSBhcnJheS4gKi8NCgkJdWxBZGRyZXNzID0gKCB1bnNpZ25lZCBwb3J0TE9ORyApKCBwY1R4QnVmZmVyICsgKCB4SW5kZXggKiBFVEhfVFhfQlVGRkVSX1NJWkUgKSApOw0KDQoJCS8qIFdyaXRlIHRoZSBidWZmZXIgYWRkcmVzcyBpbnRvIHRoZSBkZXNjcmlwdG9yLiAgVGhlIERNQSB3aWxsIHJlYWQNCgkJZGF0YSBmcm9tIGhlcmUgd2hlbiB0aGUgZGVzY3JpcHRvciBpcyBiZWluZyB1c2VkLiAqLw0KCQl4VHhEZXNjcmlwdG9yc1sgeEluZGV4IF0uYWRkciA9IHVsQWRkcmVzcyAmIGVtYWNBRERSRVNTX01BU0s7DQoJCXhUeERlc2NyaXB0b3JzWyB4SW5kZXggXS5VX1N0YXR1cy5zdGF0dXMgPSBBVDkxQ19UUkFOU01JVF9PSzsNCgl9CQ0KDQoJLyogVGhlIGxhc3QgYnVmZmVyIGhhcyB0aGUgd3JhcCBiaXQgc2V0IHNvIHRoZSBFTUFDIGtub3dzIHRvIHdyYXAgYmFjaw0KCXRvIHRoZSBmaXJzdCBidWZmZXIuICovDQoJeFR4RGVzY3JpcHRvcnNbIE5CX1RYX0JVRkZFUlMgLSAxIF0uVV9TdGF0dXMuc3RhdHVzID0gQVQ5MUNfVFJBTlNNSVRfV1JBUCB8IEFUOTFDX1RSQU5TTUlUX09LOw0KDQoJLyogVGVsbCB0aGUgRU1BQyB3aGVyZSB0byBmaW5kIHRoZSBkZXNjcmlwdG9ycy4gKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfUkJRUCA9ICggdW5zaWduZWQgcG9ydExPTkcgKSB4UnhEZXNjcmlwdG9yczsNCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfVEJRUCA9ICggdW5zaWduZWQgcG9ydExPTkcgKSB4VHhEZXNjcmlwdG9yczsNCgkNCgkvKiBDbGVhciBhbGwgdGhlIGJpdHMgaW4gdGhlIHJlY2VpdmUgc3RhdHVzIHJlZ2lzdGVyLiAqLw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19SU1IgPSAoIEFUOTFDX0VNQUNfT1ZSIHwgQVQ5MUNfRU1BQ19SRUMgfCBBVDkxQ19FTUFDX0JOQSApOw0KDQoJLyogRW5hYmxlIHRoZSBjb3B5IG9mIGRhdGEgaW50byB0aGUgYnVmZmVycywgaWdub3JlIGJyb2FkY2FzdHMsDQoJYW5kIGRvbid0IGNvcHkgRkNTLiAqLw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ0ZHUiB8PSAoIEFUOTFDX0VNQUNfQ0FGIHwgQVQ5MUNfRU1BQ19OQkMgfCBBVDkxQ19FTUFDX0RSRkNTKTsNCg0KCS8qIEVuYWJsZSBSeCBhbmQgVHgsIHBsdXMgdGhlIHN0YXRzIHJlZ2lzdGVyLiAqLw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ1IgfD0gKCBBVDkxQ19FTUFDX1RFIHwgQVQ5MUNfRU1BQ19SRSB8IEFUOTFDX0VNQUNfV0VTVEFUICk7DQp9CQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnN0YXRpYyB2b2lkIHBydlNldHVwTUFDQWRkcmVzcyggdm9pZCApDQp7DQoJLyogTXVzdCBiZSB3cml0dGVuIFNBMUwgdGhlbiBTQTFILiAqLw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19TQTFMID0JKCAoIHVuc2lnbmVkIHBvcnRMT05HICkgY01BQ0FkZHJlc3NbIDMgXSA8PCAyNCApIHwNCgkJCQkJCQkJCSggKCB1bnNpZ25lZCBwb3J0TE9ORyApIGNNQUNBZGRyZXNzWyAyIF0gPDwgMTYgKSB8DQoJCQkJCQkJCQkoICggdW5zaWduZWQgcG9ydExPTkcgKSBjTUFDQWRkcmVzc1sgMSBdIDw8IDggICkgfA0KCQkJCQkJCQkJY01BQ0FkZHJlc3NbIDAgXTsNCg0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19TQTFIID0JKCAoIHVuc2lnbmVkIHBvcnRMT05HICkgY01BQ0FkZHJlc3NbIDUgXSA8PCA4ICkgfA0KCQkJCQkJCQkJY01BQ0FkZHJlc3NbIDQgXTsNCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQpzdGF0aWMgdm9pZCBwcnZTZXR1cEVNQUNJbnRlcnJ1cHQoIHZvaWQgKQ0Kew0KCS8qIENyZWF0ZSB0aGUgc2VtYXBob3JlIHVzZWQgdG8gdHJpZ2dlciB0aGUgRU1BQyB0YXNrLiAqLw0KCXZTZW1hcGhvcmVDcmVhdGVCaW5hcnkoIHhTZW1hcGhvcmUgKTsNCglpZiggeFNlbWFwaG9yZSApDQoJew0KCQkvKiBXZSBzdGFydCBieSAndGFraW5nJyB0aGUgc2VtYXBob3JlIHNvIHRoZSBJU1IgY2FuICdnaXZlJyBpdCB3aGVuIHRoZQ0KCQlmaXJzdCBpbnRlcnJ1cHQgb2NjdXJzLiAqLw0KCQl4U2VtYXBob3JlVGFrZSggeFNlbWFwaG9yZSwgZW1hY05PX0RFTEFZICk7DQoJCXBvcnRFTlRFUl9DUklUSUNBTCgpOw0KCQl7DQoJCQkvKiBXZSB3YW50IHRvIGludGVycnVwdCBvbiBSeCBldmVudHMuICovDQoJCQlBVDkxQ19CQVNFX0VNQUMtPkVNQUNfSUVSID0gQVQ5MUNfRU1BQ19SQ09NUDsNCg0KCQkJLyogRW5hYmxlIHRoZSBpbnRlcnJ1cHRzIGluIHRoZSBBSUMuICovDQoJCQlBVDkxRl9BSUNfQ29uZmlndXJlSXQoIEFUOTFDX0JBU0VfQUlDLCBBVDkxQ19JRF9FTUFDLCBlbWFjSU5URVJSVVBUX0xFVkVMLCBBVDkxQ19BSUNfU1JDVFlQRV9JTlRfSElHSF9MRVZFTCwgKCB2b2lkICgqKSggdm9pZCApICkgdkVNQUNJU1JFbnRyeSApOw0KCQkJQVQ5MUZfQUlDX0VuYWJsZUl0KCBBVDkxQ19CQVNFX0FJQywgQVQ5MUNfSURfRU1BQyApOw0KCQl9DQoJCXBvcnRFWElUX0NSSVRJQ0FMKCk7DQoJfQ0KfQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCl9fYXJtIHZvaWQgdkVNQUNJU1IoIHZvaWQgKQ0Kew0Kdm9sYXRpbGUgdW5zaWduZWQgcG9ydExPTkcgdWxJbnRTdGF0dXMsIHVsUnhTdGF0dXM7DQpwb3J0QkFTRV9UWVBFIHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiA9IHBkRkFMU0U7DQoNCgl1bEludFN0YXR1cyA9IEFUOTFDX0JBU0VfRU1BQy0+RU1BQ19JU1I7DQoJdWxSeFN0YXR1cyA9IEFUOTFDX0JBU0VfRU1BQy0+RU1BQ19SU1I7DQoNCglpZiggKCB1bEludFN0YXR1cyAmIEFUOTFDX0VNQUNfUkNPTVAgKSB8fCAoIHVsUnhTdGF0dXMgJiBBVDkxQ19FTUFDX1JFQyApICkNCgl7DQoJCS8qIEEgZnJhbWUgaGFzIGJlZW4gcmVjZWl2ZWQsIHNpZ25hbCB0aGUgdUlQIHRhc2sgc28gaXQgY2FuIHByb2Nlc3MNCgkJdGhlIFJ4IGRlc2NyaXB0b3JzLiAqLw0KCQl4U2VtYXBob3JlR2l2ZUZyb21JU1IoIHhTZW1hcGhvcmUsICZ4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gKTsNCgkJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX1JTUiA9IEFUOTFDX0VNQUNfUkVDOw0KCX0NCg0KCS8qIElmIGEgdGFzayB3YXMgd29rZW4gYnkgZWl0aGVyIGEgY2hhcmFjdGVyIGJlaW5nIHJlY2VpdmVkIG9yIGEgY2hhcmFjdGVyDQoJYmVpbmcgdHJhbnNtaXR0ZWQgdGhlbiB3ZSBtYXkgbmVlZCB0byBzd2l0Y2ggdG8gYW5vdGhlciB0YXNrLiAqLw0KCXBvcnRFTkRfU1dJVENISU5HX0lTUiggeEhpZ2hlclByaW9yaXR5VGFza1dva2VuICk7DQoNCgkvKiBDbGVhciB0aGUgaW50ZXJydXB0LiAqLw0KCUFUOTFDX0JBU0VfQUlDLT5BSUNfRU9JQ1IgPSAwOw0KfQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCg0KDQovKg0KICogVGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgYXJlIGluaXRpYWxpc2F0aW9uIGZ1bmN0aW9ucyB0YWtlbiBmcm9tIHRoZSBBdG1lbA0KICogRU1BQyBzYW1wbGUgY29kZS4NCiAqLw0KDQpzdGF0aWMgcG9ydEJBU0VfVFlQRSBwcnZQcm9iZVBIWSggdm9pZCApDQp7DQp1bnNpZ25lZCBwb3J0TE9ORyB1bFBIWUlkMSwgdWxQSFlJZDIsIHVsU3RhdHVzOw0KcG9ydEJBU0VfVFlQRSB4UmV0dXJuID0gcGRQQVNTOw0KCQ0KCS8qIENvZGUgc3VwcGxpZWQgYnkgQXRtZWwgKHJlZm9ybWF0dGVkKSAtLS0tLS0tLS0tLS0tLS0tLSovDQoNCgkvKiBFbmFibGUgbWFuYWdlbWVudCBwb3J0ICovDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DUiB8PSBBVDkxQ19FTUFDX01QRTsJDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DRkdSIHw9ICggMiApIDw8IDEwOw0KDQoJLyogUmVhZCB0aGUgUEhZIElELiAqLw0KCXZSZWFkUEhZKCBBVDkxQ19QSFlfQUREUiwgTUlJX1BIWVNJRDEsICZ1bFBIWUlkMSApOw0KCXZSZWFkUEhZKCBBVDkxQ19QSFlfQUREUiwgTUlJX1BIWVNJRDIsICZ1bFBIWUlkMiApOw0KDQoJLyogQU1EIEFNNzlDODc1Og0KCQkJUEhZX0lEMSA9IDB4MDAyMg0KCQkJUEhZX0lEMiA9IDB4NTU0MQ0KCQkJQml0cyAzOjAgUmV2aXNpb24gTnVtYmVyIEZvdXIgYml0IG1hbnVmYWN0dXJlcpJzIHJldmlzaW9uIG51bWJlci4NCgkJCQkwMDAxIHN0YW5kcyBmb3IgUmV2LiBBLCBldGMuDQoJKi8NCglpZiggKCAoIHVsUEhZSWQxIDw8IDE2ICkgfCAoIHVsUEhZSWQyICYgMHhmZmYwICkgKSAhPSBNSUlfRE05MTYxX0lEICkNCgl7DQoJCS8qIERpZCBub3QgZXhwZWN0IHRoaXMgSUQuICovDQoJCXhSZXR1cm4gPSBwZEZBSUw7DQoJfQ0KCWVsc2UNCgl7DQoJCXVsU3RhdHVzID0geEdldExpbmtTcGVlZCgpOw0KDQoJCWlmKCB1bFN0YXR1cyAhPSBwZFBBU1MgKQ0KCQl7DQoJCQl4UmV0dXJuID0gcGRGQUlMOw0KCQl9DQoJfQ0KDQoJLyogRGlzYWJsZSBtYW5hZ2VtZW50IHBvcnQgKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNSICY9IH5BVDkxQ19FTUFDX01QRTsJDQoNCgkvKiBFbmQgb2YgY29kZSBzdXBwbGllZCBieSBBdG1lbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQoJcmV0dXJuIHhSZXR1cm47DQp9DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0Kc3RhdGljIHZvaWQgdlJlYWRQSFkoIHVuc2lnbmVkIHBvcnRDSEFSIHVjUEhZQWRkcmVzcywgdW5zaWduZWQgcG9ydENIQVIgdWNBZGRyZXNzLCB1bnNpZ25lZCBwb3J0TE9ORyAqcHVsVmFsdWUgKQ0Kew0KCS8qIENvZGUgc3VwcGxpZWQgYnkgQXRtZWwgKHJlZm9ybWF0dGVkKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19NQU4gPSAJKEFUOTFDX0VNQUNfU09GICYgKDB4MDE8PDMwKSkNCgkJCQkJCQkJCXwgKDIgPDwgMTYpIHwgKDIgPDwgMjgpDQoJCQkJCQkJCQl8ICgodWNQSFlBZGRyZXNzICYgMHgxZikgPDwgMjMpDQoJCQkJCQkJCQl8ICh1Y0FkZHJlc3MgPDwgMTgpOw0KDQoJLyogV2FpdCB1bnRpbCBJRExFIGJpdCBpbiBOZXR3b3JrIFN0YXR1cyByZWdpc3RlciBpcyBjbGVhcmVkLiAqLw0KCXdoaWxlKCAhKCBBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTlNSICYgQVQ5MUNfRU1BQ19JRExFICkgKQ0KCXsNCgkJX19hc20oICJOT1AiICk7DQoJfQ0KDQoJKnB1bFZhbHVlID0gKCBBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTUFOICYgMHgwMDAwZmZmZiApOwkNCg0KCS8qIEVuZCBvZiBjb2RlIHN1cHBsaWVkIGJ5IEF0bWVsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQp9DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KI2lmIFVTRV9STUlJX0lOVEVSRkFDRSAhPSAxDQpzdGF0aWMgdm9pZCB2V3JpdGVQSFkoIHVuc2lnbmVkIHBvcnRDSEFSIHVjUEhZQWRkcmVzcywgdW5zaWduZWQgcG9ydENIQVIgdWNBZGRyZXNzLCB1bnNpZ25lZCBwb3J0TE9ORyB1bFZhbHVlICkNCnsNCgkvKiBDb2RlIHN1cHBsaWVkIGJ5IEF0bWVsIChyZWZvcm1hdHRlZCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTUFOID0gKCggQVQ5MUNfRU1BQ19TT0YgJiAoMHgwMTw8MzApKQ0KCQkJCQkJCQl8ICgyIDw8IDE2KSB8ICgxIDw8IDI4KQ0KCQkJCQkJCQl8ICgodWNQSFlBZGRyZXNzICYgMHgxZikgPDwgMjMpDQoJCQkJCQkJCXwgKHVjQWRkcmVzcyA8PCAxOCkpDQoJCQkJCQkJCXwgKHVsVmFsdWUgJiAweGZmZmYpOw0KDQoJLyogV2FpdCB1bnRpbCBJRExFIGJpdCBpbiBOZXR3b3JrIFN0YXR1cyByZWdpc3RlciBpcyBjbGVhcmVkICovDQoJd2hpbGUoICEoIEFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OU1IgJiBBVDkxQ19FTUFDX0lETEUgKSApDQoJew0KCQlfX2FzbSggIk5PUCIgKTsNCgl9Ow0KDQoJLyogRW5kIG9mIGNvZGUgc3VwcGxpZWQgYnkgQXRtZWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCn0NCiNlbmRpZg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnN0YXRpYyBwb3J0QkFTRV9UWVBFIHhHZXRMaW5rU3BlZWQoIHZvaWQgKQ0Kew0KCXVuc2lnbmVkIHBvcnRMT05HIHVsQk1TUiwgdWxCTUNSLCB1bExQQSwgdWxNQUNDZmcsIHVsU3BlZWQsIHVsRHVwbGV4Ow0KDQoJLyogQ29kZSBzdXBwbGllZCBieSBBdG1lbCAocmVmb3JtYXR0ZWQpIC0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KCS8qIExpbmsgc3RhdHVzIGlzIGxhdGNoZWQsIHNvIHJlYWQgdHdpY2UgdG8gZ2V0IGN1cnJlbnQgdmFsdWUgKi8NCgl2UmVhZFBIWShBVDkxQ19QSFlfQUREUiwgTUlJX0JNU1IsICZ1bEJNU1IpOw0KCXZSZWFkUEhZKEFUOTFDX1BIWV9BRERSLCBNSUlfQk1TUiwgJnVsQk1TUik7DQoNCglpZiggISggdWxCTVNSICYgQk1TUl9MU1RBVFVTICkgKQ0KCXsJDQoJCS8qIE5vIExpbmsuICovDQoJCXJldHVybiBwZEZBSUw7DQoJfQ0KDQoJdlJlYWRQSFkoQVQ5MUNfUEhZX0FERFIsIE1JSV9CTUNSLCAmdWxCTUNSKTsNCglpZiAodWxCTUNSICYgQk1DUl9BTkVOQUJMRSkNCgl7CQkJCQ0KCQkvKiBBdXRvTmVnb3RpYXRpb24gaXMgZW5hYmxlZC4gKi8NCgkJaWYgKCEodWxCTVNSICYgQk1TUl9BTkVHQ09NUExFVEUpKQ0KCQl7DQoJCQkvKiBBdXRvLW5lZ290aWF0aW9uIGluIHByb2dyZXNzLiAqLw0KCQkJcmV0dXJuIHBkRkFJTDsJCQkJDQoJCX0JCQ0KDQoJCXZSZWFkUEhZKEFUOTFDX1BIWV9BRERSLCBNSUlfTFBBLCAmdWxMUEEpOw0KCQlpZiggKCB1bExQQSAmIExQQV8xMDBGVUxMICkgfHwgKCB1bExQQSAmIExQQV8xMDBIQUxGICkgKQ0KCQl7DQoJCQl1bFNwZWVkID0gU1BFRURfMTAwOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJdWxTcGVlZCA9IFNQRUVEXzEwOw0KCQl9DQoNCgkJaWYoICggdWxMUEEgJiBMUEFfMTAwRlVMTCApIHx8ICggdWxMUEEgJiBMUEFfMTBGVUxMICkgKQ0KCQl7DQoJCQl1bER1cGxleCA9IERVUExFWF9GVUxMOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJdWxEdXBsZXggPSBEVVBMRVhfSEFMRjsNCgkJfQ0KCX0NCgllbHNlDQoJew0KCQl1bFNwZWVkID0gKCB1bEJNQ1IgJiBCTUNSX1NQRUVEMTAwICkgPyBTUEVFRF8xMDAgOiBTUEVFRF8xMDsNCgkJdWxEdXBsZXggPSAoIHVsQk1DUiAmIEJNQ1JfRlVMTERQTFggKSA/IERVUExFWF9GVUxMIDogRFVQTEVYX0hBTEY7DQoJfQ0KDQoJLyogVXBkYXRlIHRoZSBNQUMgKi8NCgl1bE1BQ0NmZyA9IEFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ0ZHUiAmIH4oIEFUOTFDX0VNQUNfU1BEIHwgQVQ5MUNfRU1BQ19GRCApOw0KCWlmKCB1bFNwZWVkID09IFNQRUVEXzEwMCApDQoJew0KCQlpZiggdWxEdXBsZXggPT0gRFVQTEVYX0ZVTEwgKQ0KCQl7DQoJCQkvKiAxMDAgRnVsbCBEdXBsZXggKi8NCgkJCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ0ZHUiA9IHVsTUFDQ2ZnIHwgQVQ5MUNfRU1BQ19TUEQgfCBBVDkxQ19FTUFDX0ZEOw0KCQl9DQoJCWVsc2UNCgkJewkJCQkJDQoJCQkvKiAxMDAgSGFsZiBEdXBsZXggKi8NCgkJCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ0ZHUiA9IHVsTUFDQ2ZnIHwgQVQ5MUNfRU1BQ19TUEQ7DQoJCX0NCgl9DQoJZWxzZQ0KCXsNCgkJaWYgKHVsRHVwbGV4ID09IERVUExFWF9GVUxMKQ0KCQl7DQoJCQkvKiAxMCBGdWxsIER1cGxleCAqLw0KCQkJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DRkdSID0gdWxNQUNDZmcgfCBBVDkxQ19FTUFDX0ZEOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJLyogMTAgSGFsZiBEdXBsZXggKi8NCgkJCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ0ZHUiA9IHVsTUFDQ2ZnOw0KCQl9DQoJfQ0KDQoJLyogRW5kIG9mIGNvZGUgc3VwcGxpZWQgYnkgQXRtZWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KCXJldHVybiBwZFBBU1M7DQp9DQo=