LyoNCiAgICBGcmVlUlRPUyBWOC4wLjA6cmMxIC0gQ29weXJpZ2h0IChDKSAyMDE0IFJlYWwgVGltZSBFbmdpbmVlcnMgTHRkLiANCiAgICBBbGwgcmlnaHRzIHJlc2VydmVkDQoNCiAgICBWSVNJVCBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZyBUTyBFTlNVUkUgWU9VIEFSRSBVU0lORyBUSEUgTEFURVNUIFZFUlNJT04uDQoNCiAgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICAgICAqICAgIEZyZWVSVE9TIHByb3ZpZGVzIGNvbXBsZXRlbHkgZnJlZSB5ZXQgcHJvZmVzc2lvbmFsbHkgZGV2ZWxvcGVkLCAgICAqDQogICAgICogICAgcm9idXN0LCBzdHJpY3RseSBxdWFsaXR5IGNvbnRyb2xsZWQsIHN1cHBvcnRlZCwgYW5kIGNyb3NzICAgICAgICAgICoNCiAgICAgKiAgICBwbGF0Zm9ybSBzb2Z0d2FyZSB0aGF0IGhhcyBiZWNvbWUgYSBkZSBmYWN0byBzdGFuZGFyZC4gICAgICAgICAgICAgKg0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogICAgICogICAgSGVscCB5b3Vyc2VsZiBnZXQgc3RhcnRlZCBxdWlja2x5IGFuZCBzdXBwb3J0IHRoZSBGcmVlUlRPUyAgICAgICAgICoNCiAgICAgKiAgICBwcm9qZWN0IGJ5IHB1cmNoYXNpbmcgYSBGcmVlUlRPUyB0dXRvcmlhbCBib29rLCByZWZlcmVuY2UgICAgICAgICAgKg0KICAgICAqICAgIG1hbnVhbCwgb3IgYm90aCBmcm9tOiBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZy9Eb2N1bWVudGF0aW9uICAgICAgICAqDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAgKiAgICBUaGFuayB5b3UhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoNCiAgICBUaGlzIGZpbGUgaXMgcGFydCBvZiB0aGUgRnJlZVJUT1MgZGlzdHJpYnV0aW9uLg0KDQogICAgRnJlZVJUT1MgaXMgZnJlZSBzb2Z0d2FyZTsgeW91IGNhbiByZWRpc3RyaWJ1dGUgaXQgYW5kL29yIG1vZGlmeSBpdCB1bmRlcg0KICAgIHRoZSB0ZXJtcyBvZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UgKHZlcnNpb24gMikgYXMgcHVibGlzaGVkIGJ5IHRoZQ0KICAgIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbiA+PiFBTkQgTU9ESUZJRUQgQlkhPDwgdGhlIEZyZWVSVE9TIGV4Y2VwdGlvbi4NCg0KICAgID4+ISBOT1RFOiBUaGUgbW9kaWZpY2F0aW9uIHRvIHRoZSBHUEwgaXMgaW5jbHVkZWQgdG8gYWxsb3cgeW91IHRvIGRpc3RyaWJ1dGUNCiAgICA+PiEgYSBjb21iaW5lZCB3b3JrIHRoYXQgaW5jbHVkZXMgRnJlZVJUT1Mgd2l0aG91dCBiZWluZyBvYmxpZ2VkIHRvIHByb3ZpZGUNCiAgICA+PiEgdGhlIHNvdXJjZSBjb2RlIGZvciBwcm9wcmlldGFyeSBjb21wb25lbnRzIG91dHNpZGUgb2YgdGhlIEZyZWVSVE9TDQogICAgPj4hIGtlcm5lbC4NCg0KICAgIEZyZWVSVE9TIGlzIGRpc3RyaWJ1dGVkIGluIHRoZSBob3BlIHRoYXQgaXQgd2lsbCBiZSB1c2VmdWwsIGJ1dCBXSVRIT1VUIEFOWQ0KICAgIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4gdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MNCiAgICBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UuICBGdWxsIGxpY2Vuc2UgdGV4dCBpcyBhdmFpbGFibGUgZnJvbSB0aGUgZm9sbG93aW5nDQogICAgbGluazogaHR0cDovL3d3dy5mcmVlcnRvcy5vcmcvYTAwMTE0Lmh0bWwNCg0KICAgIDEgdGFiID09IDQgc3BhY2VzIQ0KDQogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAgKiAgICBIYXZpbmcgYSBwcm9ibGVtPyAgU3RhcnQgYnkgcmVhZGluZyB0aGUgRkFRICJNeSBhcHBsaWNhdGlvbiBkb2VzICAgKg0KICAgICAqICAgIG5vdCBydW4sIHdoYXQgY291bGQgYmUgd3Jvbmc/IiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoNCiAgICAgKiAgICBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZy9GQVFIZWxwLmh0bWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKg0KICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqDQogICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoNCiAgICBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZyAtIERvY3VtZW50YXRpb24sIGJvb2tzLCB0cmFpbmluZywgbGF0ZXN0IHZlcnNpb25zLA0KICAgIGxpY2Vuc2UgYW5kIFJlYWwgVGltZSBFbmdpbmVlcnMgTHRkLiBjb250YWN0IGRldGFpbHMuDQoNCiAgICBodHRwOi8vd3d3LkZyZWVSVE9TLm9yZy9wbHVzIC0gQSBzZWxlY3Rpb24gb2YgRnJlZVJUT1MgZWNvc3lzdGVtIHByb2R1Y3RzLA0KICAgIGluY2x1ZGluZyBGcmVlUlRPUytUcmFjZSAtIGFuIGluZGlzcGVuc2FibGUgcHJvZHVjdGl2aXR5IHRvb2wsIGEgRE9TDQogICAgY29tcGF0aWJsZSBGQVQgZmlsZSBzeXN0ZW0sIGFuZCBvdXIgdGlueSB0aHJlYWQgYXdhcmUgVURQL0lQIHN0YWNrLg0KDQogICAgaHR0cDovL3d3dy5PcGVuUlRPUy5jb20gLSBSZWFsIFRpbWUgRW5naW5lZXJzIGx0ZCBsaWNlbnNlIEZyZWVSVE9TIHRvIEhpZ2gNCiAgICBJbnRlZ3JpdHkgU3lzdGVtcyB0byBzZWxsIHVuZGVyIHRoZSBPcGVuUlRPUyBicmFuZC4gIExvdyBjb3N0IE9wZW5SVE9TDQogICAgbGljZW5zZXMgb2ZmZXIgdGlja2V0ZWQgc3VwcG9ydCwgaW5kZW1uaWZpY2F0aW9uIGFuZCBtaWRkbGV3YXJlLg0KDQogICAgaHR0cDovL3d3dy5TYWZlUlRPUy5jb20gLSBIaWdoIEludGVncml0eSBTeXN0ZW1zIGFsc28gcHJvdmlkZSBhIHNhZmV0eQ0KICAgIGVuZ2luZWVyZWQgYW5kIGluZGVwZW5kZW50bHkgU0lMMyBjZXJ0aWZpZWQgdmVyc2lvbiBmb3IgdXNlIGluIHNhZmV0eSBhbmQNCiAgICBtaXNzaW9uIGNyaXRpY2FsIGFwcGxpY2F0aW9ucyB0aGF0IHJlcXVpcmUgcHJvdmFibGUgZGVwZW5kYWJpbGl0eS4NCg0KICAgIDEgdGFiID09IDQgc3BhY2VzIQ0KKi8NCg0KLyoNCiAqIEJhc2ljIGludGVycnVwdCBkcml2ZW4gZHJpdmVyIGZvciB0aGUgRU1BQyBwZXJpcGhlcmFsLiAgVGhpcyBkcml2ZXIgaXMgbm90DQogKiByZWVudHJhbnQgYXMgd2l0aCB1SVAgdGhlIGJ1ZmZlcnMgYXJlIG9ubHkgZXZlciBhY2Nlc3NlZCBmcm9tIGEgc2luZ2xlIHRhc2suDQogKg0KICogVGhlIHNpbXBsZSBidWZmZXIgbWFuYWdlbWVudCB1c2VkIHdpdGhpbiB1SVAgYWxsb3dzIHRoZSBFTUFDIGRyaXZlciB0byBhbHNvDQogKiBiZSBzaW1wbGlzdGljLiAgVGhlIGRyaXZlciBjb250YWluZWQgd2l0aGluIHRoZSBsd0lQIGRlbW8gaXMgbW9yZQ0KICogY29tcHJlaGVuc2l2ZS4NCiAqLw0KDQoNCi8qDQpDaGFuZ2VzIGZyb20gVjMuMi4yDQoNCgkrIENvcnJlY3RlZCB0aGUgYnl0ZSBvcmRlciB3aGVuIHdyaXRpbmcgdGhlIE1BQyBhZGRyZXNzIHRvIHRoZSBNQUMuDQoJKyBTdXBwb3J0IGFkZGVkIGZvciBNSUkgaW50ZXJmYWNlcy4gIFByZXZpb3VzbHkgb25seSBSTUlJIHdhcyBzdXBwb3J0ZWQuDQoNCkNoYW5nZXMgZnJvbSBWMy4yLjMNCg0KCSsgVGhlIE1JSSBpbnRlcmZhY2UgaXMgbm93IHRoZSBkZWZhdWx0Lg0KCSsgTW9kaWZpZWQgdGhlIGluaXRpYWxpc2F0aW9uIHNlcXVlbmNlIHNsaWdodGx5IHRvIGFsbG93IGF1dG8gaW5pdCBtb3JlDQoJICB0aW1lIHRvIGNvbXBsZXRlLg0KDQpDaGFuZ2VzIGZyb20gVjMuMi40DQoNCgkrIEFsc28gcmVhZCB0aGUgRU1BQ19SU1IgcmVnaXN0ZXIgaW4gdGhlIEVNQUMgSVNSIGFzIGEgd29yayBhcm91bmQgdGhlIA0KCSAgdGhlIEVNQUMgYnVnIHRoYXQgY2FuIHJlc2V0IHRoZSBSWCBiaXQgaW4gRU1BQ19JU1IgcmVnaXN0ZXIgYmVmb3JlIHRoZQ0KCSAgYml0IGhhcyBiZWVuIHJlYWQuDQoNCkNoYW5nZXMgZnJvbSBWNC4wLjQNCg0KCSsgQ29ycmVjdGVkIHRoZSBSeCBmcmFtZSBsZW5ndGggbWFzayB3aGVuIG9idGFpbmluZyB0aGUgbGVuZ3RoIGZyb20gdGhlDQoJICByeCBkZXNjcmlwdG9yLg0KDQoqLw0KDQovKiBTdGFuZGFyZCBpbmNsdWRlcy4gKi8NCiNpbmNsdWRlIDxzdHJpbmcuaD4NCg0KLyogU2NoZWR1bGVyIGluY2x1ZGVzLiAqLw0KI2luY2x1ZGUgIkZyZWVSVE9TLmgiDQojaW5jbHVkZSAic2VtcGhyLmgiDQojaW5jbHVkZSAidGFzay5oIg0KDQovKiB1SVAgaW5jbHVkZXMuICovDQojaW5jbHVkZSAidWlwLmgiDQoNCi8qIEhhcmR3YXJlIHNwZWNpZmljIGluY2x1ZGVzLiAqLw0KI2luY2x1ZGUgIkVtYWMuaCINCiNpbmNsdWRlICJtaWkuaCINCg0KDQovKiBVU0VfUk1JSV9JTlRFUkZBQ0UgbXVzdCBiZSBkZWZpbmVkIGFzIDEgdG8gdXNlIGFuIFJNSUkgaW50ZXJmYWNlLCBvciAwDQp0byB1c2UgYW4gTUlJIGludGVyZmFjZS4gKi8NCiNkZWZpbmUgVVNFX1JNSUlfSU5URVJGQUNFIDANCg0KLyogVGhlIGJ1ZmZlciBhZGRyZXNzZXMgd3JpdHRlbiBpbnRvIHRoZSBkZXNjcmlwdG9ycyBtdXN0IGJlIGFsaWduZWQgc28gdGhlDQpsYXN0IGZldyBiaXRzIGFyZSB6ZXJvLiAgVGhlc2UgYml0cyBoYXZlIHNwZWNpYWwgbWVhbmluZyBmb3IgdGhlIEVNQUMNCnBlcmlwaGVyYWwgYW5kIGNhbm5vdCBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIGFkZHJlc3MuICovDQojZGVmaW5lIGVtYWNBRERSRVNTX01BU0sJCQkoICggdW5zaWduZWQgbG9uZyApIDB4RkZGRkZGRkMgKQ0KDQovKiBCaXQgdXNlZCB3aXRoaW4gdGhlIGFkZHJlc3Mgc3RvcmVkIGluIHRoZSBkZXNjcmlwdG9yIHRvIG1hcmsgdGhlIGxhc3QNCmRlc2NyaXB0b3IgaW4gdGhlIGFycmF5LiAqLw0KI2RlZmluZSBlbWFjUlhfV1JBUF9CSVQJCQkJKCAoIHVuc2lnbmVkIGxvbmcgKSAweDAyICkNCg0KLyogQml0IHVzZWQgd2l0aGluIHRoZSBUeCBkZXNjcmlwdG9yIHN0YXR1cyB0byBpbmRpY2F0ZSB3aGV0aGVyIHRoZQ0KZGVzY3JpcHRvciBpcyB1bmRlciB0aGUgY29udHJvbCBvZiB0aGUgRU1BQyBvciB0aGUgc29mdHdhcmUuICovDQojZGVmaW5lIGVtYWNUWF9CVUZfVVNFRAkJCQkoICggdW5zaWduZWQgbG9uZyApIDB4ODAwMDAwMDAgKQ0KDQovKiBBIHNob3J0IGRlbGF5IGlzIHVzZWQgdG8gd2FpdCBmb3IgYSBidWZmZXIgdG8gYmVjb21lIGF2YWlsYWJsZSwgc2hvdWxkDQpvbmUgbm90IGJlIGltbWVkaWF0ZWx5IGF2YWlsYWJsZSB3aGVuIHRyeWluZyB0byB0cmFuc21pdCBhIGZyYW1lLiAqLw0KI2RlZmluZSBlbWFjQlVGRkVSX1dBSVRfREVMQVkJCSggMiApDQojZGVmaW5lIGVtYWNNQVhfV0FJVF9DWUNMRVMJCQkoIGNvbmZpZ1RJQ0tfUkFURV9IWiAvIDQwICkNCg0KLyogTWlzYyBkZWZpbmVzLiAqLw0KI2RlZmluZSBlbWFjSU5URVJSVVBUX0xFVkVMCQkJKCA1ICkNCiNkZWZpbmUgZW1hY05PX0RFTEFZCQkJCSggMCApDQojZGVmaW5lIGVtYWNUT1RBTF9GUkFNRV9IRUFERVJfU0laRQkoIDU0ICkNCiNkZWZpbmUgZW1hY1BIWV9JTklUX0RFTEFZCQkJKCA1MDAwIC8gcG9ydFRJQ0tfUkFURV9NUyApDQojZGVmaW5lIGVtYWNSRVNFVF9LRVkJCQkJKCAoIHVuc2lnbmVkIGxvbmcgKSAweEE1MDAwMDAwICkNCiNkZWZpbmUgZW1hY1JFU0VUX0xFTkdUSAkJCSggKCB1bnNpZ25lZCBsb25nICkgKCAweDAxIDw8IDggKSApDQoNCi8qIFRoZSBBdG1lbCBoZWFkZXIgZmlsZSBvbmx5IGRlZmluZXMgdGhlIFRYIGZyYW1lIGxlbmd0aCBtYXNrLiAqLw0KI2RlZmluZSBlbWFjUlhfTEVOR1RIX0ZSQU1FCQkJKCAweGZmZiApDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKg0KICogUHJvdG90eXBlIGZvciB0aGUgRU1BQyBpbnRlcnJ1cHQgYXNtIHdyYXBwZXIuDQogKi8NCmV4dGVybiB2b2lkIHZFTUFDSVNSRW50cnkoIHZvaWQgKTsNCg0KLyoNCiAqIFByb3RvdHlwZSBmb3IgdGhlIEVNQUMgaW50ZXJydXB0IGZ1bmN0aW9uIC0gY2FsbGVkIGJ5IHRoZSBhc20gd3JhcHBlci4NCiAqLw0KX19hcm0gdm9pZCB2RU1BQ0lTUiggdm9pZCApOw0KDQovKg0KICogSW5pdGlhbGlzZSBib3RoIHRoZSBUeCBhbmQgUnggZGVzY3JpcHRvcnMgdXNlZCBieSB0aGUgRU1BQy4NCiAqLw0Kc3RhdGljIHZvaWQgcHJ2U2V0dXBEZXNjcmlwdG9ycyh2b2lkKTsNCg0KLyoNCiAqIFdyaXRlIG91ciBNQUMgYWRkcmVzcyBpbnRvIHRoZSBFTUFDLiAgVGhlIE1BQyBhZGRyZXNzIGlzIHNldCBhcyBvbmUgb2YgdGhlDQogKiB1aXAgb3B0aW9ucy4NCiAqLw0Kc3RhdGljIHZvaWQgcHJ2U2V0dXBNQUNBZGRyZXNzKCB2b2lkICk7DQoNCi8qDQogKiBDb25maWd1cmUgdGhlIEVNQUMgYW5kIEFJQyBmb3IgRU1BQyBpbnRlcnJ1cHRzLg0KICovDQpzdGF0aWMgdm9pZCBwcnZTZXR1cEVNQUNJbnRlcnJ1cHQoIHZvaWQgKTsNCg0KLyoNCiAqIFNvbWUgaW5pdGlhbGlzYXRpb24gZnVuY3Rpb25zIHRha2VuIGZyb20gdGhlIEF0bWVsIEVNQUMgc2FtcGxlIGNvZGUuDQogKi8NCnN0YXRpYyB2b2lkIHZSZWFkUEhZKCB1bnNpZ25lZCBjaGFyIHVjUEhZQWRkcmVzcywgdW5zaWduZWQgY2hhciB1Y0FkZHJlc3MsIHVuc2lnbmVkIGxvbmcgKnB1bFZhbHVlICk7DQojaWYgVVNFX1JNSUlfSU5URVJGQUNFICE9IDENCglzdGF0aWMgdm9pZCB2V3JpdGVQSFkoIHVuc2lnbmVkIGNoYXIgdWNQSFlBZGRyZXNzLCB1bnNpZ25lZCBjaGFyIHVjQWRkcmVzcywgdW5zaWduZWQgbG9uZyB1bFZhbHVlKTsNCiNlbmRpZg0Kc3RhdGljIHBvcnRCQVNFX1RZUEUgeEdldExpbmtTcGVlZCggdm9pZCApOw0Kc3RhdGljIHBvcnRCQVNFX1RZUEUgcHJ2UHJvYmVQSFkoIHZvaWQgKTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qIEJ1ZmZlciB3cml0dGVuIHRvIGJ5IHRoZSBFTUFDIERNQS4gIE11c3QgYmUgYWxpZ25lZCBhcyBkZXNjcmliZWQgYnkgdGhlDQpjb21tZW50IGFib3ZlIHRoZSBlbWFjQUREUkVTU19NQVNLIGRlZmluaXRpb24uICovDQojcHJhZ21hIGRhdGFfYWxpZ25tZW50PTgNCnN0YXRpYyB2b2xhdGlsZSBjaGFyIHBjUnhCdWZmZXJbIE5CX1JYX0JVRkZFUlMgKiBFVEhfUlhfQlVGRkVSX1NJWkUgXTsNCg0KLyogQnVmZmVyIHJlYWQgYnkgdGhlIEVNQUMgRE1BLiAgTXVzdCBiZSBhbGlnbmVkIGFzIGRlc2NyaWJlZCBieSBoZSBjb21tZW50DQphYm92ZSB0aGUgZW1hY0FERFJFU1NfTUFTSyBkZWZpbml0aW9uLiAqLw0KI3ByYWdtYSBkYXRhX2FsaWdubWVudD04DQpzdGF0aWMgY2hhciBwY1R4QnVmZmVyWyBOQl9UWF9CVUZGRVJTICogRVRIX1RYX0JVRkZFUl9TSVpFIF07DQoNCi8qIERlc2NyaXB0b3JzIHVzZWQgdG8gY29tbXVuaWNhdGUgYmV0d2VlbiB0aGUgcHJvZ3JhbSBhbmQgdGhlIEVNQUMgcGVyaXBoZXJhbC4NClRoZXNlIGRlc2NyaXB0b3JzIGhvbGQgdGhlIGxvY2F0aW9ucyBhbmQgc3RhdGUgb2YgdGhlIFJ4IGFuZCBUeCBidWZmZXJzLiAqLw0Kc3RhdGljIHZvbGF0aWxlIEFUOTFTX1R4VGREZXNjcmlwdG9yIHhUeERlc2NyaXB0b3JzWyBOQl9UWF9CVUZGRVJTIF07DQpzdGF0aWMgdm9sYXRpbGUgQVQ5MVNfUnhUZERlc2NyaXB0b3IgeFJ4RGVzY3JpcHRvcnNbIE5CX1JYX0JVRkZFUlMgXTsNCg0KLyogVGhlIElQIGFuZCBFdGhlcm5ldCBhZGRyZXNzZXMgYXJlIHJlYWQgZnJvbSB0aGUgdUlQIHNldHVwLiAqLw0KY29uc3QgY2hhciBjTUFDQWRkcmVzc1sgNiBdID0geyBVSVBfRVRIQUREUjAsIFVJUF9FVEhBRERSMSwgVUlQX0VUSEFERFIyLCBVSVBfRVRIQUREUjMsIFVJUF9FVEhBRERSNCwgVUlQX0VUSEFERFI1IH07DQpjb25zdCB1bnNpZ25lZCBjaGFyIHVjSVBBZGRyZXNzWyA0IF0gID0geyBVSVBfSVBBRERSMCwgVUlQX0lQQUREUjEsIFVJUF9JUEFERFIyLCBVSVBfSVBBRERSMyB9Ow0KDQovKiBUaGUgc2VtYXBob3JlIHVzZWQgYnkgdGhlIEVNQUMgSVNSIHRvIHdha2UgdGhlIEVNQUMgdGFzay4gKi8NCnN0YXRpYyB4U2VtYXBob3JlSGFuZGxlIHhTZW1hcGhvcmUgPSBOVUxMOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KeFNlbWFwaG9yZUhhbmRsZSB4RU1BQ0luaXQoIHZvaWQgKQ0Kew0KCS8qIENvZGUgc3VwcGxpZWQgYnkgQXRtZWwgKG1vZGlmaWVkKSAtLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCgkvKiBkaXNhYmxlIHB1bGwgdXAgb24gUlhEViA9PiBQSFkgbm9ybWFsIG1vZGUgKG5vdCBpbiB0ZXN0IG1vZGUpLA0KCVBIWSBoYXMgaW50ZXJuYWwgcHVsbCBkb3duLiAqLw0KCUFUOTFDX0JBU0VfUElPQi0+UElPX1BQVURSID0gMSA8PCAxNTsNCg0KCSNpZiBVU0VfUk1JSV9JTlRFUkZBQ0UgIT0gMQ0KCSAgCS8qIFBIWSBoYXMgaW50ZXJuYWwgcHVsbCBkb3duIDogc2V0IE1JSSBtb2RlLiAqLw0KCSAgCUFUOTFDX0JBU0VfUElPQi0+UElPX1BQVURSPSAxIDw8IDE2Ow0KCSNlbmRpZg0KDQoJLyogY2xlYXIgUEIxOCA8PT4gUEhZIHBvd2VyZG93bi4gKi8NCglBVDkxRl9QSU9fQ2ZnT3V0cHV0KCBBVDkxQ19CQVNFX1BJT0IsIDEgPDwgMTggKSA7DQoJQVQ5MUZfUElPX0NsZWFyT3V0cHV0KCBBVDkxQ19CQVNFX1BJT0IsICAxIDw8IDE4KSA7DQoNCgkvKiBBZnRlciBQSFkgcG93ZXIgdXAsIGhhcmR3YXJlIHJlc2V0LiAqLw0KCUFUOTFDX0JBU0VfUlNUQy0+UlNUQ19STVIgPSBlbWFjUkVTRVRfS0VZIHwgZW1hY1JFU0VUX0xFTkdUSDsNCglBVDkxQ19CQVNFX1JTVEMtPlJTVENfUkNSID0gZW1hY1JFU0VUX0tFWSB8IEFUOTFDX1JTVENfRVhUUlNUOw0KCQ0KCS8qIFdhaXQgZm9yIGhhcmR3YXJlIHJlc2V0IGVuZC4gKi8NCgl3aGlsZSggISggQVQ5MUNfQkFTRV9SU1RDLT5SU1RDX1JTUiAmIEFUOTFDX1JTVENfTlJTVEwgKSApDQoJew0KCQlfX2FzbSggIk5PUCIgKTsNCgl9DQoJX19hc20oICJOT1AiICk7DQogIAkNCgkvKiBFTUFDIElPIGluaXQgZm9yIEVNQUMtUEhZIGNvbS4gUmVtb3ZlIEVGMTAwIGNvbmZpZy4gKi8NCglBVDkxRl9FTUFDX0NmZ1BJTygpOw0KDQoJLyogRW5hYmxlIGNvbSBiZXR3ZWVuIEVNQUMgUEhZLg0KDQoJRW5hYmxlIG1hbmFnZW1lbnQgcG9ydC4gKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNSIHw9IEFUOTFDX0VNQUNfTVBFOwkNCg0KCS8qIE1EQyA9IE1DSy8zMi4gKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNGR1IgfD0gKCAyICkgPDwgMTA7CQ0KDQoJLyogV2FpdCBmb3IgUEhZIGF1dG8gaW5pdCBlbmQgKHJhdGhlciBjcnVkZSBkZWxheSEpLiAqLw0KCXZUYXNrRGVsYXkoIGVtYWNQSFlfSU5JVF9ERUxBWSApOw0KDQoJLyogUEhZIGNvbmZpZ3VyYXRpb24uICovDQoJI2lmIFVTRV9STUlJX0lOVEVSRkFDRSAhPSAxDQoJew0KCQl1bnNpZ25lZCBsb25nIHVsQ29udHJvbDsNCg0KCQkvKiBQSFkgaGFzIGludGVybmFsIHB1bGwgZG93biA6IGRpc2FibGUgTUlJIGlzb2xhdGUuICovDQoJCXZSZWFkUEhZKCBBVDkxQ19QSFlfQUREUiwgTUlJX0JNQ1IsICZ1bENvbnRyb2wgKTsNCgkJdlJlYWRQSFkoIEFUOTFDX1BIWV9BRERSLCBNSUlfQk1DUiwgJnVsQ29udHJvbCApOw0KCQl1bENvbnRyb2wgJj0gfkJNQ1JfSVNPTEFURTsNCgkJdldyaXRlUEhZKCBBVDkxQ19QSFlfQUREUiwgTUlJX0JNQ1IsIHVsQ29udHJvbCApOw0KCX0NCgkjZW5kaWYNCg0KCS8qIERpc2FibGUgbWFuYWdlbWVudCBwb3J0IGFnYWluLiAqLw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ1IgJj0gfkFUOTFDX0VNQUNfTVBFOw0KDQoJI2lmIFVTRV9STUlJX0lOVEVSRkFDRSAhPSAxDQoJCS8qIEVuYWJsZSBFTUFDIGluIE1JSSBtb2RlLCBlbmFibGUgY2xvY2sgRVJYQ0sgYW5kIEVUWENLLiAqLw0KCQlBVDkxQ19CQVNFX0VNQUMtPkVNQUNfVVNSSU8gPSBBVDkxQ19FTUFDX0NMS0VOIDsNCgkjZWxzZQ0KCQkvKiBFbmFibGUgRU1BQyBpbiBSTUlJIG1vZGUsIGVuYWJsZSBSTUlJIGNsb2NrICg1ME1IeiBmcm9tIG9zY2lsbGF0b3INCgkJb24gRVJGQ0spLiAqLw0KCQlBVDkxQ19CQVNFX0VNQUMtPkVNQUNfVVNSSU8gPSBBVDkxQ19FTUFDX1JNSUkgfCBBVDkxQ19FTUFDX0NMS0VOIDsNCgkjZW5kaWYNCg0KCS8qIEVuZCBvZiBjb2RlIHN1cHBsaWVkIGJ5IEF0bWVsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCgkvKiBTZXR1cCB0aGUgYnVmZmVycyBhbmQgZGVzY3JpcHRvcnMuICovDQoJcHJ2U2V0dXBEZXNjcmlwdG9ycygpOw0KCQ0KCS8qIExvYWQgb3VyIE1BQyBhZGRyZXNzIGludG8gdGhlIEVNQUMuICovDQoJcHJ2U2V0dXBNQUNBZGRyZXNzKCk7DQoNCgkvKiBUcnkgdG8gY29ubmVjdC4gKi8NCglpZiggcHJ2UHJvYmVQSFkoKSApDQoJew0KCQkvKiBFbmFibGUgdGhlIGludGVycnVwdCEgKi8NCgkJcHJ2U2V0dXBFTUFDSW50ZXJydXB0KCk7DQoJfQ0KDQoJcmV0dXJuIHhTZW1hcGhvcmU7DQp9DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KbG9uZyBsRU1BQ1NlbmQoIHZvaWQgKQ0Kew0Kc3RhdGljIHVuc2lnbmVkIHBvcnRCQVNFX1RZUEUgdXhUeEJ1ZmZlckluZGV4ID0gMDsNCnBvcnRCQVNFX1RZUEUgeFdhaXRDeWNsZXMgPSAwOw0KbG9uZyBsUmV0dXJuID0gcGRQQVNTOw0KY2hhciAqcGNCdWZmZXI7DQoNCgkvKiBJcyBhIGJ1ZmZlciBhdmFpbGFibGU/ICovDQoJd2hpbGUoICEoIHhUeERlc2NyaXB0b3JzWyB1eFR4QnVmZmVySW5kZXggXS5VX1N0YXR1cy5zdGF0dXMgJiBBVDkxQ19UUkFOU01JVF9PSyApICkNCgl7DQoJCS8qIFRoZXJlIGlzIG5vIHJvb20gdG8gd3JpdGUgdGhlIFR4IGRhdGEgdG8gdGhlIFR4IGJ1ZmZlci4gIFdhaXQgYQ0KCQlzaG9ydCB3aGlsZSwgdGhlbiB0cnkgYWdhaW4uICovDQoJCXhXYWl0Q3ljbGVzKys7DQoJCWlmKCB4V2FpdEN5Y2xlcyA+IGVtYWNNQVhfV0FJVF9DWUNMRVMgKQ0KCQl7DQoJCQkvKiBHaXZlIHVwLiAqLw0KCQkJbFJldHVybiA9IHBkRkFJTDsNCgkJCWJyZWFrOw0KCQl9DQoJCWVsc2UNCgkJew0KCQkJdlRhc2tEZWxheSggZW1hY0JVRkZFUl9XQUlUX0RFTEFZICk7DQoJCX0NCgl9DQoNCgkvKiBsUmV0dXJuIHdpbGwgb25seSBiZSBwZFBBU1MgaWYgYSBidWZmZXIgaXMgYXZhaWxhYmxlLiAqLw0KCWlmKCBsUmV0dXJuID09IHBkUEFTUyApDQoJew0KCQkvKiBDb3B5IHRoZSBoZWFkZXJzIGludG8gdGhlIFR4IGJ1ZmZlci4gIFRoZXNlIHdpbGwgYmUgaW4gdGhlIHVJUCBidWZmZXIuICovDQoJCXBjQnVmZmVyID0gKCBjaGFyICogKSB4VHhEZXNjcmlwdG9yc1sgdXhUeEJ1ZmZlckluZGV4IF0uYWRkcjsNCgkJbWVtY3B5KCAoIHZvaWQgKiApIHBjQnVmZmVyLCAoIHZvaWQgKiApIHVpcF9idWYsIGVtYWNUT1RBTF9GUkFNRV9IRUFERVJfU0laRSApOw0KCQlpZiggdWlwX2xlbiA+IGVtYWNUT1RBTF9GUkFNRV9IRUFERVJfU0laRSApDQoJCXsNCgkJCW1lbWNweSggKCB2b2lkICogKSAmKCBwY0J1ZmZlclsgZW1hY1RPVEFMX0ZSQU1FX0hFQURFUl9TSVpFIF0gKSwgKCB2b2lkICogKSB1aXBfYXBwZGF0YSwgKCB1aXBfbGVuIC0gZW1hY1RPVEFMX0ZSQU1FX0hFQURFUl9TSVpFICkgKTsNCgkJfQ0KDQoJCS8qIFNlbmQuICovCQ0KCQlwb3J0RU5URVJfQ1JJVElDQUwoKTsNCgkJew0KCQkJaWYoIHV4VHhCdWZmZXJJbmRleCA+PSAoIE5CX1RYX0JVRkZFUlMgLSAxICkgKQ0KCQkJew0KCQkJCS8qIEZpbGwgb3V0IHRoZSBuZWNlc3NhcnkgaW4gdGhlIGRlc2NyaXB0b3IgdG8gZ2V0IHRoZSBkYXRhIHNlbnQuICovDQoJCQkJeFR4RGVzY3JpcHRvcnNbIHV4VHhCdWZmZXJJbmRleCBdLlVfU3RhdHVzLnN0YXR1cyA9IAkoIHVpcF9sZW4gJiAoIHVuc2lnbmVkIGxvbmcgKSBBVDkxQ19MRU5HVEhfRlJBTUUgKQ0KCQkJCQkJCQkJCQkJCQkJCQkJfCBBVDkxQ19MQVNUX0JVRkZFUg0KCQkJCQkJCQkJCQkJCQkJCQkJfCBBVDkxQ19UUkFOU01JVF9XUkFQOw0KCQkJCXV4VHhCdWZmZXJJbmRleCA9IDA7DQoJCQl9DQoJCQllbHNlDQoJCQl7DQoJCQkJLyogRmlsbCBvdXQgdGhlIG5lY2Vzc2FyeSBpbiB0aGUgZGVzY3JpcHRvciB0byBnZXQgdGhlIGRhdGEgc2VudC4gKi8NCgkJCQl4VHhEZXNjcmlwdG9yc1sgdXhUeEJ1ZmZlckluZGV4IF0uVV9TdGF0dXMuc3RhdHVzID0gCSggdWlwX2xlbiAmICggdW5zaWduZWQgbG9uZyApIEFUOTFDX0xFTkdUSF9GUkFNRSApDQoJCQkJCQkJCQkJCQkJCQkJCQl8IEFUOTFDX0xBU1RfQlVGRkVSOw0KCQkJCXV4VHhCdWZmZXJJbmRleCsrOw0KCQkJfQ0KCQ0KCQkJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DUiB8PSBBVDkxQ19FTUFDX1RTVEFSVDsNCgkJfQ0KCQlwb3J0RVhJVF9DUklUSUNBTCgpOw0KCX0NCg0KCXJldHVybiBsUmV0dXJuOw0KfQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnVuc2lnbmVkIGxvbmcgdWxFTUFDUG9sbCggdm9pZCApDQp7DQpzdGF0aWMgdW5zaWduZWQgcG9ydEJBU0VfVFlQRSB1bE5leHRSeEJ1ZmZlciA9IDA7DQp1bnNpZ25lZCBsb25nIHVsU2VjdGlvbkxlbmd0aCA9IDAsIHVsTGVuZ3RoU29GYXIgPSAwLCB1bEVPRiA9IHBkRkFMU0U7DQpjaGFyICpwY1NvdXJjZTsNCg0KCS8qIFNraXAgYW55IGZyYWdtZW50cy4gKi8NCgl3aGlsZSggKCB4UnhEZXNjcmlwdG9yc1sgdWxOZXh0UnhCdWZmZXIgXS5hZGRyICYgQVQ5MUNfT1dORVJTSElQX0JJVCApICYmICEoIHhSeERlc2NyaXB0b3JzWyB1bE5leHRSeEJ1ZmZlciBdLlVfU3RhdHVzLnN0YXR1cyAmIEFUOTFDX1NPRiApICkNCgl7DQoJCS8qIE1hcmsgdGhlIGJ1ZmZlciBhcyBmcmVlIGFnYWluLiAqLw0KCQl4UnhEZXNjcmlwdG9yc1sgdWxOZXh0UnhCdWZmZXIgXS5hZGRyICY9IH4oIEFUOTFDX09XTkVSU0hJUF9CSVQgKTsJCQ0KCQl1bE5leHRSeEJ1ZmZlcisrOw0KCQlpZiggdWxOZXh0UnhCdWZmZXIgPj0gTkJfUlhfQlVGRkVSUyApDQoJCXsNCgkJCXVsTmV4dFJ4QnVmZmVyID0gMDsNCgkJfQ0KCX0NCg0KCS8qIElzIHRoZXJlIGEgcGFja2V0IHJlYWR5PyAqLw0KDQoJd2hpbGUoICggeFJ4RGVzY3JpcHRvcnNbIHVsTmV4dFJ4QnVmZmVyIF0uYWRkciAmIEFUOTFDX09XTkVSU0hJUF9CSVQgKSAmJiAhdWxTZWN0aW9uTGVuZ3RoICkNCgl7DQoJCXBjU291cmNlID0gKCBjaGFyICogKSggeFJ4RGVzY3JpcHRvcnNbIHVsTmV4dFJ4QnVmZmVyIF0uYWRkciAmIGVtYWNBRERSRVNTX01BU0sgKTsNCgkJdWxTZWN0aW9uTGVuZ3RoID0geFJ4RGVzY3JpcHRvcnNbIHVsTmV4dFJ4QnVmZmVyIF0uVV9TdGF0dXMuc3RhdHVzICYgZW1hY1JYX0xFTkdUSF9GUkFNRTsNCg0KCQlpZiggdWxTZWN0aW9uTGVuZ3RoID09IDAgKQ0KCQl7DQoJCQkvKiBUaGUgZnJhbWUgaXMgbG9uZ2VyIHRoYW4gdGhlIGJ1ZmZlciBwb2ludGVkIHRvIGJ5IHRoaXMNCgkJCWRlc2NyaXB0b3Igc28gY29weSB0aGUgZW50aXJlIGJ1ZmZlciB0byB1SVAgLSB0aGVuIG1vdmUgb250bw0KCQkJdGhlIG5leHQgZGVzY3JpcHRvciB0byBnZXQgdGhlIHJlc3Qgb2YgdGhlIGZyYW1lLiAqLw0KCQkJaWYoICggdWxMZW5ndGhTb0ZhciArIEVUSF9SWF9CVUZGRVJfU0laRSApIDw9IFVJUF9CVUZTSVpFICkNCgkJCXsNCgkJCQltZW1jcHkoICYoIHVpcF9idWZbIHVsTGVuZ3RoU29GYXIgXSApLCBwY1NvdXJjZSwgRVRIX1JYX0JVRkZFUl9TSVpFICk7DQoJCQkJdWxMZW5ndGhTb0ZhciArPSBFVEhfUlhfQlVGRkVSX1NJWkU7DQoJCQl9CQkJDQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkvKiBUaGlzIGlzIHRoZSBsYXN0IHNlY3Rpb24gb2YgdGhlIGZyYW1lLiAgQ29weSB0aGUgc2VjdGlvbiB0bw0KCQkJdUlQLiAqLw0KCQkJaWYoIHVsU2VjdGlvbkxlbmd0aCA8IFVJUF9CVUZTSVpFICkNCgkJCXsNCgkJCQkvKiBUaGUgc2VjdGlvbiBsZW5ndGggaG9sZHMgdGhlIGxlbmd0aCBvZiB0aGUgZW50aXJlIGZyYW1lLg0KCQkJCXVsTGVuZ3RoU29GYXIgaG9sZHMgdGhlIGxlbmd0aCBvZiB0aGUgZnJhbWUgc2VjdGlvbnMgYWxyZWFkeQ0KCQkJCWNvcGllZCB0byB1SVAsIHNvIHRoZSBsZW5ndGggb2YgdGhlIGZpbmFsIHNlY3Rpb24gaXMNCgkJCQl1bFNlY3Rpb25MZW5ndGggLSB1bExlbmd0aFNvRmFyOyAqLw0KCQkJCWlmKCB1bFNlY3Rpb25MZW5ndGggPiB1bExlbmd0aFNvRmFyICkNCgkJCQl7DQoJCQkJCW1lbWNweSggJiggdWlwX2J1ZlsgdWxMZW5ndGhTb0ZhciBdICksIHBjU291cmNlLCAoIHVsU2VjdGlvbkxlbmd0aCAtIHVsTGVuZ3RoU29GYXIgKSApOw0KCQkJCX0NCgkJCX0JCQkNCg0KCQkJLyogSXMgdGhpcyB0aGUgbGFzdCBidWZmZXIgZm9yIHRoZSBmcmFtZT8gIElmIG5vdCB3aHk/ICovDQoJCQl1bEVPRiA9IHhSeERlc2NyaXB0b3JzWyB1bE5leHRSeEJ1ZmZlciBdLlVfU3RhdHVzLnN0YXR1cyAmIEFUOTFDX0VPRjsNCgkJfQ0KDQoJCS8qIE1hcmsgdGhlIGJ1ZmZlciBhcyBmcmVlIGFnYWluLiAqLw0KCQl4UnhEZXNjcmlwdG9yc1sgdWxOZXh0UnhCdWZmZXIgXS5hZGRyICY9IH4oIEFUOTFDX09XTkVSU0hJUF9CSVQgKTsNCg0KCQkvKiBJbmNyZW1lbnQgdG8gdGhlIG5leHQgYnVmZmVyLCB3cmFwcGluZyBpZiBuZWNlc3NhcnkuICovDQoJCXVsTmV4dFJ4QnVmZmVyKys7DQoJCWlmKCB1bE5leHRSeEJ1ZmZlciA+PSBOQl9SWF9CVUZGRVJTICkNCgkJew0KCQkJdWxOZXh0UnhCdWZmZXIgPSAwOw0KCQl9DQoJfQ0KDQoJLyogSWYgd2Ugb2J0YWluZWQgZGF0YSBidXQgZm9yIHNvbWUgcmVhc29uIGRpZCBub3QgZmluZCB0aGUgZW5kIG9mIHRoZQ0KCWZyYW1lIHRoZW4gZGlzY2FyZCB0aGUgZGF0YSBhcyBpdCBtdXN0IGNvbnRhaW4gYW4gZXJyb3IuICovDQoJaWYoICF1bEVPRiApDQoJew0KCQl1bFNlY3Rpb25MZW5ndGggPSAwOw0KCX0NCg0KCXJldHVybiB1bFNlY3Rpb25MZW5ndGg7DQp9DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0Kc3RhdGljIHZvaWQgcHJ2U2V0dXBEZXNjcmlwdG9ycyh2b2lkKQ0Kew0KdW5zaWduZWQgcG9ydEJBU0VfVFlQRSB4SW5kZXg7DQp1bnNpZ25lZCBsb25nIHVsQWRkcmVzczsNCg0KCS8qIEluaXRpYWxpc2UgeFJ4RGVzY3JpcHRvcnMgZGVzY3JpcHRvci4gKi8NCglmb3IoIHhJbmRleCA9IDA7IHhJbmRleCA8IE5CX1JYX0JVRkZFUlM7ICsreEluZGV4ICkNCgl7DQoJCS8qIENhbGN1bGF0ZSB0aGUgYWRkcmVzcyBvZiB0aGUgbnRoIGJ1ZmZlciB3aXRoaW4gdGhlIGFycmF5LiAqLw0KCQl1bEFkZHJlc3MgPSAoIHVuc2lnbmVkIGxvbmcgKSggcGNSeEJ1ZmZlciArICggeEluZGV4ICogRVRIX1JYX0JVRkZFUl9TSVpFICkgKTsNCg0KCQkvKiBXcml0ZSB0aGUgYnVmZmVyIGFkZHJlc3MgaW50byB0aGUgZGVzY3JpcHRvci4gIFRoZSBETUEgd2lsbCBwbGFjZQ0KCQl0aGUgZGF0YSBhdCB0aGlzIGFkZHJlc3Mgd2hlbiB0aGlzIGRlc2NyaXB0b3IgaXMgYmVpbmcgdXNlZC4gIE1hc2sgb2ZmDQoJCXRoZSBib3R0b20gYml0cyBvZiB0aGUgYWRkcmVzcyBhcyB0aGVzZSBoYXZlIHNwZWNpYWwgbWVhbmluZy4gKi8NCgkJeFJ4RGVzY3JpcHRvcnNbIHhJbmRleCBdLmFkZHIgPSB1bEFkZHJlc3MgJiBlbWFjQUREUkVTU19NQVNLOw0KCX0JDQoNCgkvKiBUaGUgbGFzdCBidWZmZXIgaGFzIHRoZSB3cmFwIGJpdCBzZXQgc28gdGhlIEVNQUMga25vd3MgdG8gd3JhcCBiYWNrDQoJdG8gdGhlIGZpcnN0IGJ1ZmZlci4gKi8NCgl4UnhEZXNjcmlwdG9yc1sgTkJfUlhfQlVGRkVSUyAtIDEgXS5hZGRyIHw9IGVtYWNSWF9XUkFQX0JJVDsNCg0KCS8qIEluaXRpYWxpc2UgeFR4RGVzY3JpcHRvcnMuICovDQoJZm9yKCB4SW5kZXggPSAwOyB4SW5kZXggPCBOQl9UWF9CVUZGRVJTOyArK3hJbmRleCApDQoJew0KCQkvKiBDYWxjdWxhdGUgdGhlIGFkZHJlc3Mgb2YgdGhlIG50aCBidWZmZXIgd2l0aGluIHRoZSBhcnJheS4gKi8NCgkJdWxBZGRyZXNzID0gKCB1bnNpZ25lZCBsb25nICkoIHBjVHhCdWZmZXIgKyAoIHhJbmRleCAqIEVUSF9UWF9CVUZGRVJfU0laRSApICk7DQoNCgkJLyogV3JpdGUgdGhlIGJ1ZmZlciBhZGRyZXNzIGludG8gdGhlIGRlc2NyaXB0b3IuICBUaGUgRE1BIHdpbGwgcmVhZA0KCQlkYXRhIGZyb20gaGVyZSB3aGVuIHRoZSBkZXNjcmlwdG9yIGlzIGJlaW5nIHVzZWQuICovDQoJCXhUeERlc2NyaXB0b3JzWyB4SW5kZXggXS5hZGRyID0gdWxBZGRyZXNzICYgZW1hY0FERFJFU1NfTUFTSzsNCgkJeFR4RGVzY3JpcHRvcnNbIHhJbmRleCBdLlVfU3RhdHVzLnN0YXR1cyA9IEFUOTFDX1RSQU5TTUlUX09LOw0KCX0JDQoNCgkvKiBUaGUgbGFzdCBidWZmZXIgaGFzIHRoZSB3cmFwIGJpdCBzZXQgc28gdGhlIEVNQUMga25vd3MgdG8gd3JhcCBiYWNrDQoJdG8gdGhlIGZpcnN0IGJ1ZmZlci4gKi8NCgl4VHhEZXNjcmlwdG9yc1sgTkJfVFhfQlVGRkVSUyAtIDEgXS5VX1N0YXR1cy5zdGF0dXMgPSBBVDkxQ19UUkFOU01JVF9XUkFQIHwgQVQ5MUNfVFJBTlNNSVRfT0s7DQoNCgkvKiBUZWxsIHRoZSBFTUFDIHdoZXJlIHRvIGZpbmQgdGhlIGRlc2NyaXB0b3JzLiAqLw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19SQlFQID0gKCB1bnNpZ25lZCBsb25nICkgeFJ4RGVzY3JpcHRvcnM7DQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX1RCUVAgPSAoIHVuc2lnbmVkIGxvbmcgKSB4VHhEZXNjcmlwdG9yczsNCgkNCgkvKiBDbGVhciBhbGwgdGhlIGJpdHMgaW4gdGhlIHJlY2VpdmUgc3RhdHVzIHJlZ2lzdGVyLiAqLw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19SU1IgPSAoIEFUOTFDX0VNQUNfT1ZSIHwgQVQ5MUNfRU1BQ19SRUMgfCBBVDkxQ19FTUFDX0JOQSApOw0KDQoJLyogRW5hYmxlIHRoZSBjb3B5IG9mIGRhdGEgaW50byB0aGUgYnVmZmVycywgaWdub3JlIGJyb2FkY2FzdHMsDQoJYW5kIGRvbid0IGNvcHkgRkNTLiAqLw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ0ZHUiB8PSAoIEFUOTFDX0VNQUNfQ0FGIHwgQVQ5MUNfRU1BQ19OQkMgfCBBVDkxQ19FTUFDX0RSRkNTKTsNCg0KCS8qIEVuYWJsZSBSeCBhbmQgVHgsIHBsdXMgdGhlIHN0YXRzIHJlZ2lzdGVyLiAqLw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OQ1IgfD0gKCBBVDkxQ19FTUFDX1RFIHwgQVQ5MUNfRU1BQ19SRSB8IEFUOTFDX0VNQUNfV0VTVEFUICk7DQp9CQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnN0YXRpYyB2b2lkIHBydlNldHVwTUFDQWRkcmVzcyggdm9pZCApDQp7DQoJLyogTXVzdCBiZSB3cml0dGVuIFNBMUwgdGhlbiBTQTFILiAqLw0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19TQTFMID0JKCAoIHVuc2lnbmVkIGxvbmcgKSBjTUFDQWRkcmVzc1sgMyBdIDw8IDI0ICkgfA0KCQkJCQkJCQkJKCAoIHVuc2lnbmVkIGxvbmcgKSBjTUFDQWRkcmVzc1sgMiBdIDw8IDE2ICkgfA0KCQkJCQkJCQkJKCAoIHVuc2lnbmVkIGxvbmcgKSBjTUFDQWRkcmVzc1sgMSBdIDw8IDggICkgfA0KCQkJCQkJCQkJY01BQ0FkZHJlc3NbIDAgXTsNCg0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19TQTFIID0JKCAoIHVuc2lnbmVkIGxvbmcgKSBjTUFDQWRkcmVzc1sgNSBdIDw8IDggKSB8DQoJCQkJCQkJCQljTUFDQWRkcmVzc1sgNCBdOw0KfQ0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnN0YXRpYyB2b2lkIHBydlNldHVwRU1BQ0ludGVycnVwdCggdm9pZCApDQp7DQoJLyogQ3JlYXRlIHRoZSBzZW1hcGhvcmUgdXNlZCB0byB0cmlnZ2VyIHRoZSBFTUFDIHRhc2suICovDQoJdlNlbWFwaG9yZUNyZWF0ZUJpbmFyeSggeFNlbWFwaG9yZSApOw0KCWlmKCB4U2VtYXBob3JlICkNCgl7DQoJCS8qIFdlIHN0YXJ0IGJ5ICd0YWtpbmcnIHRoZSBzZW1hcGhvcmUgc28gdGhlIElTUiBjYW4gJ2dpdmUnIGl0IHdoZW4gdGhlDQoJCWZpcnN0IGludGVycnVwdCBvY2N1cnMuICovDQoJCXhTZW1hcGhvcmVUYWtlKCB4U2VtYXBob3JlLCBlbWFjTk9fREVMQVkgKTsNCgkJcG9ydEVOVEVSX0NSSVRJQ0FMKCk7DQoJCXsNCgkJCS8qIFdlIHdhbnQgdG8gaW50ZXJydXB0IG9uIFJ4IGV2ZW50cy4gKi8NCgkJCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19JRVIgPSBBVDkxQ19FTUFDX1JDT01QOw0KDQoJCQkvKiBFbmFibGUgdGhlIGludGVycnVwdHMgaW4gdGhlIEFJQy4gKi8NCgkJCUFUOTFGX0FJQ19Db25maWd1cmVJdCggQVQ5MUNfQkFTRV9BSUMsIEFUOTFDX0lEX0VNQUMsIGVtYWNJTlRFUlJVUFRfTEVWRUwsIEFUOTFDX0FJQ19TUkNUWVBFX0lOVF9ISUdIX0xFVkVMLCAoIHZvaWQgKCopKCB2b2lkICkgKSB2RU1BQ0lTUkVudHJ5ICk7DQoJCQlBVDkxRl9BSUNfRW5hYmxlSXQoIEFUOTFDX0JBU0VfQUlDLCBBVDkxQ19JRF9FTUFDICk7DQoJCX0NCgkJcG9ydEVYSVRfQ1JJVElDQUwoKTsNCgl9DQp9DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KX19hcm0gdm9pZCB2RU1BQ0lTUiggdm9pZCApDQp7DQp2b2xhdGlsZSB1bnNpZ25lZCBsb25nIHVsSW50U3RhdHVzLCB1bFJ4U3RhdHVzOw0KcG9ydEJBU0VfVFlQRSB4SGlnaGVyUHJpb3JpdHlUYXNrV29rZW4gPSBwZEZBTFNFOw0KDQoJdWxJbnRTdGF0dXMgPSBBVDkxQ19CQVNFX0VNQUMtPkVNQUNfSVNSOw0KCXVsUnhTdGF0dXMgPSBBVDkxQ19CQVNFX0VNQUMtPkVNQUNfUlNSOw0KDQoJaWYoICggdWxJbnRTdGF0dXMgJiBBVDkxQ19FTUFDX1JDT01QICkgfHwgKCB1bFJ4U3RhdHVzICYgQVQ5MUNfRU1BQ19SRUMgKSApDQoJew0KCQkvKiBBIGZyYW1lIGhhcyBiZWVuIHJlY2VpdmVkLCBzaWduYWwgdGhlIHVJUCB0YXNrIHNvIGl0IGNhbiBwcm9jZXNzDQoJCXRoZSBSeCBkZXNjcmlwdG9ycy4gKi8NCgkJeFNlbWFwaG9yZUdpdmVGcm9tSVNSKCB4U2VtYXBob3JlLCAmeEhpZ2hlclByaW9yaXR5VGFza1dva2VuICk7DQoJCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19SU1IgPSBBVDkxQ19FTUFDX1JFQzsNCgl9DQoNCgkvKiBJZiBhIHRhc2sgd2FzIHdva2VuIGJ5IGVpdGhlciBhIGNoYXJhY3RlciBiZWluZyByZWNlaXZlZCBvciBhIGNoYXJhY3Rlcg0KCWJlaW5nIHRyYW5zbWl0dGVkIHRoZW4gd2UgbWF5IG5lZWQgdG8gc3dpdGNoIHRvIGFub3RoZXIgdGFzay4gKi8NCglwb3J0RU5EX1NXSVRDSElOR19JU1IoIHhIaWdoZXJQcmlvcml0eVRhc2tXb2tlbiApOw0KDQoJLyogQ2xlYXIgdGhlIGludGVycnVwdC4gKi8NCglBVDkxQ19CQVNFX0FJQy0+QUlDX0VPSUNSID0gMDsNCn0NCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQoNCg0KLyoNCiAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFyZSBpbml0aWFsaXNhdGlvbiBmdW5jdGlvbnMgdGFrZW4gZnJvbSB0aGUgQXRtZWwNCiAqIEVNQUMgc2FtcGxlIGNvZGUuDQogKi8NCg0Kc3RhdGljIHBvcnRCQVNFX1RZUEUgcHJ2UHJvYmVQSFkoIHZvaWQgKQ0Kew0KdW5zaWduZWQgbG9uZyB1bFBIWUlkMSwgdWxQSFlJZDIsIHVsU3RhdHVzOw0KcG9ydEJBU0VfVFlQRSB4UmV0dXJuID0gcGRQQVNTOw0KCQ0KCS8qIENvZGUgc3VwcGxpZWQgYnkgQXRtZWwgKHJlZm9ybWF0dGVkKSAtLS0tLS0tLS0tLS0tLS0tLSovDQoNCgkvKiBFbmFibGUgbWFuYWdlbWVudCBwb3J0ICovDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DUiB8PSBBVDkxQ19FTUFDX01QRTsJDQoJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DRkdSIHw9ICggMiApIDw8IDEwOw0KDQoJLyogUmVhZCB0aGUgUEhZIElELiAqLw0KCXZSZWFkUEhZKCBBVDkxQ19QSFlfQUREUiwgTUlJX1BIWVNJRDEsICZ1bFBIWUlkMSApOw0KCXZSZWFkUEhZKCBBVDkxQ19QSFlfQUREUiwgTUlJX1BIWVNJRDIsICZ1bFBIWUlkMiApOw0KDQoJLyogQU1EIEFNNzlDODc1Og0KCQkJUEhZX0lEMSA9IDB4MDAyMg0KCQkJUEhZX0lEMiA9IDB4NTU0MQ0KCQkJQml0cyAzOjAgUmV2aXNpb24gTnVtYmVyIEZvdXIgYml0IG1hbnVmYWN0dXJlcpJzIHJldmlzaW9uIG51bWJlci4NCgkJCQkwMDAxIHN0YW5kcyBmb3IgUmV2LiBBLCBldGMuDQoJKi8NCglpZiggKCAoIHVsUEhZSWQxIDw8IDE2ICkgfCAoIHVsUEhZSWQyICYgMHhmZmYwICkgKSAhPSBNSUlfRE05MTYxX0lEICkNCgl7DQoJCS8qIERpZCBub3QgZXhwZWN0IHRoaXMgSUQuICovDQoJCXhSZXR1cm4gPSBwZEZBSUw7DQoJfQ0KCWVsc2UNCgl7DQoJCXVsU3RhdHVzID0geEdldExpbmtTcGVlZCgpOw0KDQoJCWlmKCB1bFN0YXR1cyAhPSBwZFBBU1MgKQ0KCQl7DQoJCQl4UmV0dXJuID0gcGRGQUlMOw0KCQl9DQoJfQ0KDQoJLyogRGlzYWJsZSBtYW5hZ2VtZW50IHBvcnQgKi8NCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNSICY9IH5BVDkxQ19FTUFDX01QRTsJDQoNCgkvKiBFbmQgb2YgY29kZSBzdXBwbGllZCBieSBBdG1lbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQoJcmV0dXJuIHhSZXR1cm47DQp9DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0Kc3RhdGljIHZvaWQgdlJlYWRQSFkoIHVuc2lnbmVkIGNoYXIgdWNQSFlBZGRyZXNzLCB1bnNpZ25lZCBjaGFyIHVjQWRkcmVzcywgdW5zaWduZWQgbG9uZyAqcHVsVmFsdWUgKQ0Kew0KCS8qIENvZGUgc3VwcGxpZWQgYnkgQXRtZWwgKHJlZm9ybWF0dGVkKSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KCUFUOTFDX0JBU0VfRU1BQy0+RU1BQ19NQU4gPSAJKEFUOTFDX0VNQUNfU09GICYgKDB4MDE8PDMwKSkNCgkJCQkJCQkJCXwgKDIgPDwgMTYpIHwgKDIgPDwgMjgpDQoJCQkJCQkJCQl8ICgodWNQSFlBZGRyZXNzICYgMHgxZikgPDwgMjMpDQoJCQkJCQkJCQl8ICh1Y0FkZHJlc3MgPDwgMTgpOw0KDQoJLyogV2FpdCB1bnRpbCBJRExFIGJpdCBpbiBOZXR3b3JrIFN0YXR1cyByZWdpc3RlciBpcyBjbGVhcmVkLiAqLw0KCXdoaWxlKCAhKCBBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTlNSICYgQVQ5MUNfRU1BQ19JRExFICkgKQ0KCXsNCgkJX19hc20oICJOT1AiICk7DQoJfQ0KDQoJKnB1bFZhbHVlID0gKCBBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTUFOICYgMHgwMDAwZmZmZiApOwkNCg0KCS8qIEVuZCBvZiBjb2RlIHN1cHBsaWVkIGJ5IEF0bWVsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQp9DQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KI2lmIFVTRV9STUlJX0lOVEVSRkFDRSAhPSAxDQpzdGF0aWMgdm9pZCB2V3JpdGVQSFkoIHVuc2lnbmVkIGNoYXIgdWNQSFlBZGRyZXNzLCB1bnNpZ25lZCBjaGFyIHVjQWRkcmVzcywgdW5zaWduZWQgbG9uZyB1bFZhbHVlICkNCnsNCgkvKiBDb2RlIHN1cHBsaWVkIGJ5IEF0bWVsIChyZWZvcm1hdHRlZCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCglBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTUFOID0gKCggQVQ5MUNfRU1BQ19TT0YgJiAoMHgwMTw8MzApKQ0KCQkJCQkJCQl8ICgyIDw8IDE2KSB8ICgxIDw8IDI4KQ0KCQkJCQkJCQl8ICgodWNQSFlBZGRyZXNzICYgMHgxZikgPDwgMjMpDQoJCQkJCQkJCXwgKHVjQWRkcmVzcyA8PCAxOCkpDQoJCQkJCQkJCXwgKHVsVmFsdWUgJiAweGZmZmYpOw0KDQoJLyogV2FpdCB1bnRpbCBJRExFIGJpdCBpbiBOZXR3b3JrIFN0YXR1cyByZWdpc3RlciBpcyBjbGVhcmVkICovDQoJd2hpbGUoICEoIEFUOTFDX0JBU0VfRU1BQy0+RU1BQ19OU1IgJiBBVDkxQ19FTUFDX0lETEUgKSApDQoJew0KCQlfX2FzbSggIk5PUCIgKTsNCgl9Ow0KDQoJLyogRW5kIG9mIGNvZGUgc3VwcGxpZWQgYnkgQXRtZWwgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCn0NCiNlbmRpZg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCnN0YXRpYyBwb3J0QkFTRV9UWVBFIHhHZXRMaW5rU3BlZWQoIHZvaWQgKQ0Kew0KCXVuc2lnbmVkIGxvbmcgdWxCTVNSLCB1bEJNQ1IsIHVsTFBBLCB1bE1BQ0NmZywgdWxTcGVlZCwgdWxEdXBsZXg7DQoNCgkvKiBDb2RlIHN1cHBsaWVkIGJ5IEF0bWVsIChyZWZvcm1hdHRlZCkgLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQoJLyogTGluayBzdGF0dXMgaXMgbGF0Y2hlZCwgc28gcmVhZCB0d2ljZSB0byBnZXQgY3VycmVudCB2YWx1ZSAqLw0KCXZSZWFkUEhZKEFUOTFDX1BIWV9BRERSLCBNSUlfQk1TUiwgJnVsQk1TUik7DQoJdlJlYWRQSFkoQVQ5MUNfUEhZX0FERFIsIE1JSV9CTVNSLCAmdWxCTVNSKTsNCg0KCWlmKCAhKCB1bEJNU1IgJiBCTVNSX0xTVEFUVVMgKSApDQoJewkNCgkJLyogTm8gTGluay4gKi8NCgkJcmV0dXJuIHBkRkFJTDsNCgl9DQoNCgl2UmVhZFBIWShBVDkxQ19QSFlfQUREUiwgTUlJX0JNQ1IsICZ1bEJNQ1IpOw0KCWlmICh1bEJNQ1IgJiBCTUNSX0FORU5BQkxFKQ0KCXsJCQkJDQoJCS8qIEF1dG9OZWdvdGlhdGlvbiBpcyBlbmFibGVkLiAqLw0KCQlpZiAoISh1bEJNU1IgJiBCTVNSX0FORUdDT01QTEVURSkpDQoJCXsNCgkJCS8qIEF1dG8tbmVnb3RpYXRpb24gaW4gcHJvZ3Jlc3MuICovDQoJCQlyZXR1cm4gcGRGQUlMOwkJCQkNCgkJfQkJDQoNCgkJdlJlYWRQSFkoQVQ5MUNfUEhZX0FERFIsIE1JSV9MUEEsICZ1bExQQSk7DQoJCWlmKCAoIHVsTFBBICYgTFBBXzEwMEZVTEwgKSB8fCAoIHVsTFBBICYgTFBBXzEwMEhBTEYgKSApDQoJCXsNCgkJCXVsU3BlZWQgPSBTUEVFRF8xMDA7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQl1bFNwZWVkID0gU1BFRURfMTA7DQoJCX0NCg0KCQlpZiggKCB1bExQQSAmIExQQV8xMDBGVUxMICkgfHwgKCB1bExQQSAmIExQQV8xMEZVTEwgKSApDQoJCXsNCgkJCXVsRHVwbGV4ID0gRFVQTEVYX0ZVTEw7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQl1bER1cGxleCA9IERVUExFWF9IQUxGOw0KCQl9DQoJfQ0KCWVsc2UNCgl7DQoJCXVsU3BlZWQgPSAoIHVsQk1DUiAmIEJNQ1JfU1BFRUQxMDAgKSA/IFNQRUVEXzEwMCA6IFNQRUVEXzEwOw0KCQl1bER1cGxleCA9ICggdWxCTUNSICYgQk1DUl9GVUxMRFBMWCApID8gRFVQTEVYX0ZVTEwgOiBEVVBMRVhfSEFMRjsNCgl9DQoNCgkvKiBVcGRhdGUgdGhlIE1BQyAqLw0KCXVsTUFDQ2ZnID0gQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DRkdSICYgfiggQVQ5MUNfRU1BQ19TUEQgfCBBVDkxQ19FTUFDX0ZEICk7DQoJaWYoIHVsU3BlZWQgPT0gU1BFRURfMTAwICkNCgl7DQoJCWlmKCB1bER1cGxleCA9PSBEVVBMRVhfRlVMTCApDQoJCXsNCgkJCS8qIDEwMCBGdWxsIER1cGxleCAqLw0KCQkJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DRkdSID0gdWxNQUNDZmcgfCBBVDkxQ19FTUFDX1NQRCB8IEFUOTFDX0VNQUNfRkQ7DQoJCX0NCgkJZWxzZQ0KCQl7CQkJCQkNCgkJCS8qIDEwMCBIYWxmIER1cGxleCAqLw0KCQkJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DRkdSID0gdWxNQUNDZmcgfCBBVDkxQ19FTUFDX1NQRDsNCgkJfQ0KCX0NCgllbHNlDQoJew0KCQlpZiAodWxEdXBsZXggPT0gRFVQTEVYX0ZVTEwpDQoJCXsNCgkJCS8qIDEwIEZ1bGwgRHVwbGV4ICovDQoJCQlBVDkxQ19CQVNFX0VNQUMtPkVNQUNfTkNGR1IgPSB1bE1BQ0NmZyB8IEFUOTFDX0VNQUNfRkQ7DQoJCX0NCgkJZWxzZQ0KCQl7DQoJCQkvKiAxMCBIYWxmIER1cGxleCAqLw0KCQkJQVQ5MUNfQkFTRV9FTUFDLT5FTUFDX05DRkdSID0gdWxNQUNDZmc7DQoJCX0NCgl9DQoNCgkvKiBFbmQgb2YgY29kZSBzdXBwbGllZCBieSBBdG1lbCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQoJcmV0dXJuIHBkUEFTUzsNCn0NCg==