LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMybDR4eF9oYWxfc3dwbWkuYw0KICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQogICogQHZlcnNpb24gVjEuNy4xDQogICogQGRhdGUgICAgMjEtQXByaWwtMjAxNw0KICAqIEBicmllZiAgIFNXUE1JIEhBTCBtb2R1bGUgZHJpdmVyLg0KICAqICAgICAgICAgIFRoaXMgZmlsZSBwcm92aWRlcyBmaXJtd2FyZSBmdW5jdGlvbnMgdG8gbWFuYWdlIHRoZSBmb2xsb3dpbmcNCiAgKiAgICAgICAgICBmdW5jdGlvbmFsaXRpZXMgb2YgdGhlIFNpbmdsZSBXaXJlIFByb3RvY29sIE1hc3RlciBJbnRlcmZhY2UgKFNXUE1JKS4NCiAgKiAgICAgICAgICAgKyBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbg0KICAqICAgICAgICAgICArIERhdGEgdHJhbnNmZXJzIGZ1bmN0aW9ucw0KICAqICAgICAgICAgICArIERNQSB0cmFuc2ZlcnMgbWFuYWdlbWVudA0KICAqICAgICAgICAgICArIEludGVycnVwdHMgYW5kIGZsYWdzIG1hbmFnZW1lbnQNCiAgQHZlcmJhdGltDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgICAgICAgICAgICAgICAgICAgICAgIyMjIyMgSG93IHRvIHVzZSB0aGlzIGRyaXZlciAjIyMjIw0KID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCiAgWy4uXQ0KICAgICBUaGUgU1dQTUkgSEFMIGRyaXZlciBjYW4gYmUgdXNlZCBhcyBmb2xsb3dzOg0KDQogICAgKCMpIERlY2xhcmUgYSBTV1BNSV9IYW5kbGVUeXBlRGVmIGhhbmRsZSBzdHJ1Y3R1cmUgKGVnLiBTV1BNSV9IYW5kbGVUeXBlRGVmIGhzd3BtaSkuDQoNCiAgICAoIykgSW5pdGlhbGl6ZSB0aGUgU1dQTUkgbG93IGxldmVsIHJlc291cmNlcyBieSBpbXBsZW1lbnRpbmcgdGhlIEhBTF9TV1BNSV9Nc3BJbml0KCkgQVBJOg0KICAgICAgICAoIyMpIEVuYWJsZSB0aGUgU1dQTUl4IGludGVyZmFjZSBjbG9jayB3aXRoIF9fSEFMX1JDQ19TV1BNSXhfQ0xLX0VOQUJMRSgpLg0KICAgICAgICAoIyMpIFNXUE1JIElPIGNvbmZpZ3VyYXRpb246DQogICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIGNsb2NrIGZvciB0aGUgU1dQTUkgR1BJTy4NCiAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGVzZSBTV1BNSSBwaW5zIGFzIGFsdGVybmF0ZSBmdW5jdGlvbiBwdWxsLXVwLg0KICAgICAgICAoIyMpIE5WSUMgY29uZmlndXJhdGlvbiBpZiB5b3UgbmVlZCB0byB1c2UgaW50ZXJydXB0IHByb2Nlc3MgKEhBTF9TV1BNSV9UcmFuc21pdF9JVCgpDQogICAgICAgICAgICAgYW5kIEhBTF9TV1BNSV9SZWNlaXZlX0lUKCkgQVBJcyk6DQogICAgICAgICAgICAoKysrKSBDb25maWd1cmUgdGhlIFNXUE1JeCBpbnRlcnJ1cHQgcHJpb3JpdHkgd2l0aCBIQUxfTlZJQ19TZXRQcmlvcml0eSgpLg0KICAgICAgICAgICAgKCsrKykgRW5hYmxlIHRoZSBOVklDIFNXUE1JIElSUSBoYW5kbGUgd2l0aCBIQUxfTlZJQ19FbmFibGVJUlEoKS4NCg0KICAgICAgICAoIyMpIERNQSBDb25maWd1cmF0aW9uIGlmIHlvdSBuZWVkIHRvIHVzZSBETUEgcHJvY2VzcyAoSEFMX1NXUE1JX1RyYW5zbWl0X0RNQSgpDQogICAgICAgICAgICAgYW5kIEhBTF9TV1BNSV9SZWNlaXZlX0RNQSgpIEFQSXMpOg0KICAgICAgICAgICAgKCsrKykgRGVjbGFyZSBhIERNQSBoYW5kbGUgc3RydWN0dXJlIGZvciB0aGUgVHgvUnggY2hhbm5lbHMuDQogICAgICAgICAgICAoKysrKSBFbmFibGUgdGhlIERNQXggaW50ZXJmYWNlIGNsb2NrLg0KICAgICAgICAgICAgKCsrKykgQ29uZmlndXJlIHRoZSBkZWNsYXJlZCBETUEgaGFuZGxlIHN0cnVjdHVyZSB3aXRoIHRoZSByZXF1aXJlZA0KICAgICAgICAgICAgICAgICAgVHgvUnggcGFyYW1ldGVycy4NCiAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgRE1BIFR4L1J4IGNoYW5uZWxzIGFuZCByZXF1ZXN0cy4NCiAgICAgICAgICAgICgrKyspIEFzc29jaWF0ZSB0aGUgaW5pdGlhbGl6ZWQgRE1BIGhhbmRsZSB0byB0aGUgU1dQTUkgRE1BIFR4L1J4IGhhbmRsZS4NCiAgICAgICAgICAgICgrKyspIENvbmZpZ3VyZSB0aGUgcHJpb3JpdHkgYW5kIGVuYWJsZSB0aGUgTlZJQyBmb3IgdGhlIHRyYW5zZmVyIGNvbXBsZXRlDQogICAgICAgICAgICAgICAgICBpbnRlcnJ1cHQgb24gdGhlIERNQSBUeC9SeCBjaGFubmVscy4NCg0KICAgICgjKSBQcm9ncmFtIHRoZSBCaXRlIFJhdGUsIFR4IEJ1ZmZlcmluZyBtb2RlLCBSeCBCdWZmZXJpbmcgbW9kZSBpbiB0aGUgSW5pdCBzdHJ1Y3R1cmUuDQoNCiAgICAoIykgRW5hYmxlIHRoZSBTV1BNSSBwZXJpcGhlcmFsIGJ5IGNhbGxpbmcgdGhlIEhBTF9TV1BNSV9Jbml0KCkgZnVuY3Rpb24uDQogICAgDQogIEBlbmR2ZXJiYXRpbQ0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgKiBAYXR0ZW50aW9uDQogICoNCiAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUKGMpIDIwMTcgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4NCiAgKg0KICAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sDQogICogYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0Og0KICAqICAgMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLA0KICAqICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4NCiAgKiAgIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSwNCiAgKiAgICAgIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlIGRvY3VtZW50YXRpb24NCiAgKiAgICAgIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLg0KICAqICAgMy4gTmVpdGhlciB0aGUgbmFtZSBvZiBTVE1pY3JvZWxlY3Ryb25pY3Mgbm9yIHRoZSBuYW1lcyBvZiBpdHMgY29udHJpYnV0b3JzDQogICogICAgICBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUNCiAgKiAgICAgIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLg0KICAqDQogICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUyAiQVMgSVMiDQogICogQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQ0KICAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQ0KICAqIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUNCiAgKiBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTA0KICAqIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SDQogICogU0VSVklDRVM7IExPU1MgT0YgVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVINCiAgKiBDQVVTRUQgQU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLA0KICAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFDQogICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4NCiAgKg0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgKi8NCg0KLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNpbmNsdWRlICJzdG0zMmw0eHhfaGFsLmgiDQoNCiNpZiBkZWZpbmVkKFNUTTMyTDQzMXh4KSB8fCBkZWZpbmVkKFNUTTMyTDQzMnh4KSB8fCBkZWZpbmVkKFNUTTMyTDQzM3h4KSB8fCBkZWZpbmVkKFNUTTMyTDQ0Mnh4KSB8fCBkZWZpbmVkKFNUTTMyTDQ0M3h4KSB8fCBcDQogICAgZGVmaW5lZChTVE0zMkw0NzF4eCkgfHwgZGVmaW5lZChTVE0zMkw0NzV4eCkgfHwgZGVmaW5lZChTVE0zMkw0NzZ4eCkgfHwgZGVmaW5lZChTVE0zMkw0ODV4eCkgfHwgZGVmaW5lZChTVE0zMkw0ODZ4eCkgfHwgXA0KICAgIGRlZmluZWQoU1RNMzJMNDk2eHgpIHx8IGRlZmluZWQoU1RNMzJMNEE2eHgpDQoNCi8qKiBAYWRkdG9ncm91cCBTVE0zMkw0eHhfSEFMX0RyaXZlcg0KICAqIEB7DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgU1dQTUkgU1dQTUkNCiAgKiBAYnJpZWYgSEFMIFNXUE1JIG1vZHVsZSBkcml2ZXINCiAgKiBAew0KICAqLw0KI2lmZGVmIEhBTF9TV1BNSV9NT0RVTEVfRU5BQkxFRA0KDQovKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgY29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiogQGFkZHRvZ3JvdXAgU1dQTUlfUHJpdmF0ZV9Db25zdGFudHMgU1dQTUkgUHJpdmF0ZSBDb25zdGFudHMNCiAgKiBAew0KICAqLw0KI2RlZmluZSBTV1BNSV9USU1FT1VUX1ZBTFVFICAgICAgICgodWludDMyX3QpIDIyMDAwKQ0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiBQcml2YXRlIG1hY3JvcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpzdGF0aWMgdm9pZCBTV1BNSV9ETUFUcmFuc21pdENwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpOw0Kc3RhdGljIHZvaWQgU1dQTUlfRE1BVHhIYWxmQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7DQpzdGF0aWMgdm9pZCBTV1BNSV9ETUFSZWNlaXZlQ3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7DQpzdGF0aWMgdm9pZCBTV1BNSV9ETUFSeEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsNCnN0YXRpYyB2b2lkIFNXUE1JX0RNQUVycm9yKERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKTsNCnN0YXRpYyB2b2lkIFNXUE1JX0RNQUFib3J0T25FcnJvcihETUFfSGFuZGxlVHlwZURlZiAqaGRtYSk7DQpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1dQTUlfVHJhbnNtaXRfSVQoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKTsNCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTV1BNSV9FbmRUcmFuc21pdF9JVChTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpOw0Kc3RhdGljIEhBTF9TdGF0dXNUeXBlRGVmIFNXUE1JX1JlY2VpdmVfSVQoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKTsNCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTV1BNSV9FbmRSZWNlaXZlX0lUKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSk7DQpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1dQTUlfRW5kVHJhbnNtaXRSZWNlaXZlX0lUKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSk7DQpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1dQTUlfV2FpdE9uRmxhZ1NldFVudGlsVGltZW91dChTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWksIHVpbnQzMl90IEZsYWcsIHVpbnQzMl90IFRpY2tzdGFydCwgdWludDMyX3QgVGltZW91dCk7DQoNCi8qIEV4cG9ydGVkIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qKiBAZGVmZ3JvdXAgU1dQTUlfRXhwb3J0ZWRfRnVuY3Rpb25zIFNXUE1JIEV4cG9ydGVkIEZ1bmN0aW9ucw0KICAqIEB7DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgU1dQTUlfRXhwb3J0ZWRfR3JvdXAxIEluaXRpYWxpemF0aW9uL2RlLWluaXRpYWxpemF0aW9uIG1ldGhvZHMNCiAgKiAgQGJyaWVmICAgIEluaXRpYWxpemF0aW9uIGFuZCBDb25maWd1cmF0aW9uIGZ1bmN0aW9ucw0KICAqDQpAdmVyYmF0aW0NCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICAgICAgICAgICAjIyMjIyBJbml0aWFsaXphdGlvbiBhbmQgQ29uZmlndXJhdGlvbiBmdW5jdGlvbnMgIyMjIyMNCiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICAgWy4uXSAgVGhpcyBzZWN0aW9uIHByb3ZpZGVzIGZ1bmN0aW9ucyBhbGxvd2luZyB0bzoNCiAgICAgICgrKSBJbml0aWFsaXplIGFuZCBjb25maWd1cmUgdGhlIFNXUE1JIHBlcmlwaGVyYWwuDQogICAgICAoKykgRGUtaW5pdGlhbGl6ZSB0aGUgU1dQTUkgcGVyaXBoZXJhbC4NCg0KQGVuZHZlcmJhdGltDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQGJyaWVmIEluaXRpYWxpemUgdGhlIFNXUE1JIHBlcmlwaGVyYWwgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycyBpbiB0aGUgU1dQTUlfSW5pdFR5cGVEZWYuDQogICogQHBhcmFtIGhzd3BtaTogU1dQTUkgaGFuZGxlDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1dQTUlfSW5pdChTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpDQp7DQogIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCiAgX19JTyB1aW50MzJfdCB3YWl0X2xvb3BfaW5kZXggPSAwOw0KDQogIC8qIENoZWNrIHRoZSBTV1BNSSBoYW5kbGUgYWxsb2NhdGlvbiAqLw0KICBpZihoc3dwbWkgPT0gTlVMTCkNCiAgew0KICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICAgIGFzc2VydF9wYXJhbShJU19TV1BNSV9WT0xUQUdFX0NMQVNTKGhzd3BtaS0+SW5pdC5Wb2x0YWdlQ2xhc3MpKTsNCiAgICBhc3NlcnRfcGFyYW0oSVNfU1dQTUlfQklUUkFURV9WQUxVRShoc3dwbWktPkluaXQuQml0UmF0ZSkpOw0KICAgIGFzc2VydF9wYXJhbShJU19TV1BNSV9UWF9CVUZGRVJJTkdfTU9ERShoc3dwbWktPkluaXQuVHhCdWZmZXJpbmdNb2RlKSk7DQogICAgYXNzZXJ0X3BhcmFtKElTX1NXUE1JX1JYX0JVRkZFUklOR19NT0RFKGhzd3BtaS0+SW5pdC5SeEJ1ZmZlcmluZ01vZGUpKTsNCg0KICAgIGlmKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX1JFU0VUKQ0KICAgIHsNCiAgICAgIC8qIEFsbG9jYXRlIGxvY2sgcmVzb3VyY2UgYW5kIGluaXRpYWxpemUgaXQgKi8NCiAgICAgIGhzd3BtaS0+TG9jayA9IEhBTF9VTkxPQ0tFRDsNCiAgICANCiAgICAgIC8qIEluaXQgdGhlIGxvdyBsZXZlbCBoYXJkd2FyZSA6IEdQSU8sIENMT0NLLCBDT1JURVggKi8NCiAgICAgIEhBTF9TV1BNSV9Nc3BJbml0KGhzd3BtaSk7DQogICAgfQ0KDQogICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZOw0KDQogICAgLyogRGlzYWJsZSBTV1BNSSBpbnRlcmZhY2UgKi8NCiAgICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1NXUEFDVCk7DQoNCiAgICAvKiBDbGVhciBhbGwgU1dQTUkgaW50ZXJmYWNlIGZsYWdzICovDQogICAgV1JJVEVfUkVHKGhzd3BtaS0+SW5zdGFuY2UtPklDUiwgMHgwMTlGKTsNCg0KICAgIC8qIEFwcGx5IFZvbHRhZ2UgY2xhc3Mgc2VsZWN0aW9uICovDQogICAgTU9ESUZZX1JFRyhoc3dwbWktPkluc3RhbmNlLT5PUiwgU1dQTUlfT1JfQ0xBU1MsIGhzd3BtaS0+SW5pdC5Wb2x0YWdlQ2xhc3MpOw0KDQogICAgLyogSWYgVm9sdGFnZSBjbGFzcyBCLCBhcHBseSAzMDAgtXMgZGVsYXkgKi8NCiAgICBpZihoc3dwbWktPkluaXQuVm9sdGFnZUNsYXNzID09IFNXUE1JX1ZPTFRBR0VfQ0xBU1NfQikNCiAgICB7DQogICAgICAvKiBJbnN1cmUgMzAwILVzIHdhaXQgdG8gaW5zdXJlIFNXUE1JX0lPIG91dHB1dCBub3QgaGlnaGVyIHRoYW4gMS44ViAqLw0KICAgICAgLyogV2FpdCBsb29wIGluaXRpYWxpemF0aW9uIGFuZCBleGVjdXRpb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCiAgICAgIC8qIE5vdGU6IFZhcmlhYmxlIGRpdmlkZWQgYnkgNCB0byBjb21wZW5zYXRlIHBhcnRpYWxseSBDUFUgcHJvY2Vzc2luZyBjeWNsZXMuICovDQogICAgICB3YWl0X2xvb3BfaW5kZXggPSAoMzAwICogKFN5c3RlbUNvcmVDbG9jayAvICgxMDAwMDAwICogNCkpKSArIDE1MDsNCiAgICAgIHdoaWxlKHdhaXRfbG9vcF9pbmRleCAhPSAwKQ0KICAgICAgew0KICAgICAgICB3YWl0X2xvb3BfaW5kZXgtLTsNCiAgICAgIH0NCiAgICB9DQoNCiAgICAvKiBDb25maWd1cmUgdGhlIEJSUiByZWdpc3RlciAoQml0cmF0ZSkgKi8NCiAgICBXUklURV9SRUcoaHN3cG1pLT5JbnN0YW5jZS0+QlJSLCBoc3dwbWktPkluaXQuQml0UmF0ZSk7DQoNCiAgICAvKiBBcHBseSBTV1BNSSBDUiBjb25maWd1cmF0aW9uICovDQogICAgTU9ESUZZX1JFRyhoc3dwbWktPkluc3RhbmNlLT5DUiwgXA0KICAgICAgICAgICAgICAgU1dQTUlfQ1JfUlhETUEgfCBTV1BNSV9DUl9UWERNQSAgfCBTV1BNSV9DUl9SWE1PREUgfCBTV1BNSV9DUl9UWE1PREUsIFwNCiAgICAgICAgICAgICAgIGhzd3BtaS0+SW5pdC5UeEJ1ZmZlcmluZ01vZGUgfCBoc3dwbWktPkluaXQuUnhCdWZmZXJpbmdNb2RlKTsNCg0KICAgIGhzd3BtaS0+RXJyb3JDb2RlID0gSEFMX1NXUE1JX0VSUk9SX05PTkU7DQogICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9SRUFEWTsNCg0KICAgIC8qIEVuYWJsZSBTV1BNSSBwZXJpcGhlcmFsIGlmIG5vdCAqLw0KICAgIFNFVF9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1NXUEFDVCk7DQogIH0NCg0KICByZXR1cm4gc3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgRGUtaW5pdGlhbGl6ZSB0aGUgU1dQTUkgcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gaHN3cG1pOiBTV1BNSSBoYW5kbGUNCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TV1BNSV9EZUluaXQoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKQ0Kew0KICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQoNCiAgLyogQ2hlY2sgdGhlIFNXUE1JIGhhbmRsZSBhbGxvY2F0aW9uICovDQogIGlmKGhzd3BtaSA9PSBOVUxMKQ0KICB7DQogICAgc3RhdHVzID0gSEFMX0VSUk9SOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogICAgYXNzZXJ0X3BhcmFtKElTX1NXUE1JX0lOU1RBTkNFKGhzd3BtaS0+SW5zdGFuY2UpKTsNCg0KICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfQlVTWTsNCg0KICAgIC8qIERpc2FibGUgU1dQTUkgaW50ZXJmYWNlICovDQogICAgQ0xFQVJfQklUKGhzd3BtaS0+SW5zdGFuY2UtPkNSLCBTV1BNSV9DUl9TV1BBQ1QpOw0KDQogICAgLyogRGVJbml0IHRoZSBsb3cgbGV2ZWwgaGFyZHdhcmUgKi8NCiAgICBIQUxfU1dQTUlfTXNwRGVJbml0KGhzd3BtaSk7DQoNCiAgICBoc3dwbWktPkVycm9yQ29kZSA9IEhBTF9TV1BNSV9FUlJPUl9OT05FOw0KDQogICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9SRVNFVDsNCg0KICAgIC8qIFJlbGVhc2UgTG9jayAqLw0KICAgIF9fSEFMX1VOTE9DSyhoc3dwbWkpOw0KICB9DQoNCiAgcmV0dXJuIHN0YXR1czsNCn0NCg0KLyoqDQogICogQGJyaWVmIEluaXRpYWxpemUgdGhlIFNXUE1JIE1TUC4NCiAgKiBAcGFyYW0gaHN3cG1pOiBTV1BNSSBoYW5kbGUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCl9fd2VhayB2b2lkIEhBTF9TV1BNSV9Nc3BJbml0KFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSkNCnsNCiAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KICBVTlVTRUQoaHN3cG1pKTsNCg0KICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQogICAgICAgICAgICB0aGUgSEFMX1NXUE1JX01zcEluaXQgY2FuIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCiAgICovDQp9DQoNCi8qKg0KICAqIEBicmllZiBEZUluaXRpYWxpemUgdGhlIFNXUE1JIE1TUC4NCiAgKiBAcGFyYW0gaHN3cG1pOiBTV1BNSSBoYW5kbGUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCl9fd2VhayB2b2lkIEhBTF9TV1BNSV9Nc3BEZUluaXQoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKQ0Kew0KICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQogIFVOVVNFRChoc3dwbWkpOw0KDQogIC8qIE5PVEUgOiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBub3QgYmUgbW9kaWZpZWQsIHdoZW4gdGhlIGNhbGxiYWNrIGlzIG5lZWRlZCwNCiAgICAgICAgICAgIHRoZSBIQUxfU1dQTUlfTXNwRGVJbml0IGNhbiBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlDQogICAqLw0KfQ0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIFNXUE1JX0V4cG9ydGVkX0dyb3VwMiBJTyBvcGVyYXRpb24gbWV0aG9kcw0KICAqICBAYnJpZWYgU1dQTUkgVHJhbnNtaXQvUmVjZWl2ZSBmdW5jdGlvbnMNCiAgKg0KQHZlcmJhdGltDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgICAgICAgICAgICAgICAgICAgICMjIyMjIElPIG9wZXJhdGlvbiBtZXRob2RzICMjIyMjDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KIFsuLl0NCiAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIG1hbmFnZSB0aGUgU1dQTUkNCiAgICAgZGF0YSB0cmFuc2ZlcnMuDQoNCiAgICAoIykgVGhlcmUgYXJlIHR3byBtb2RlcyBvZiB0cmFuc2ZlcjoNCiAgICAgICAoKyspIEJsb2NraW5nIG1vZGU6IFRoZSBjb21tdW5pY2F0aW9uIGlzIHBlcmZvcm1lZCBpbiBwb2xsaW5nIG1vZGUuDQogICAgICAgICAgICBUaGUgSEFMIHN0YXR1cyBvZiBhbGwgZGF0YSBwcm9jZXNzaW5nIGlzIHJldHVybmVkIGJ5IHRoZSBzYW1lIGZ1bmN0aW9uDQogICAgICAgICAgICBhZnRlciBmaW5pc2hpbmcgdHJhbnNmZXIuDQogICAgICAgKCsrKSBOb24tQmxvY2tpbmcgbW9kZTogVGhlIGNvbW11bmljYXRpb24gaXMgcGVyZm9ybWVkIHVzaW5nIEludGVycnVwdHMNCiAgICAgICAgICAgb3IgRE1BLiBUaGUgZW5kIG9mIHRoZSBkYXRhIHByb2Nlc3Npbmcgd2lsbCBiZSBpbmRpY2F0ZWQgdGhyb3VnaCB0aGUNCiAgICAgICAgICAgZGVkaWNhdGVkIFNXUE1JIEludGVycnVwdCBoYW5kbGVyIChIQUxfU1dQTUlfSVJRSGFuZGxlcigpKSB3aGVuIHVzaW5nIEludGVycnVwdCBtb2RlIG9yDQogICAgICAgICAgIHRoZSBzZWxlY3RlZCBETUEgY2hhbm5lbCBpbnRlcnJ1cHQgaGFuZGxlciB3aGVuIHVzaW5nIERNQSBtb2RlLg0KICAgICAgICAgICBUaGUgSEFMX1NXUE1JX1R4Q3BsdENhbGxiYWNrKCksIEhBTF9TV1BNSV9SeENwbHRDYWxsYmFjaygpIHVzZXIgY2FsbGJhY2tzDQogICAgICAgICAgIHdpbGwgYmUgZXhlY3V0ZWQgcmVzcGVjdGl2ZWx5IGF0IHRoZSBlbmQgb2YgdGhlIHRyYW5zbWl0IG9yIHJlY2VpdmUgcHJvY2Vzcy4NCiAgICAgICAgICAgVGhlIEhBTF9TV1BNSV9FcnJvckNhbGxiYWNrKCkgdXNlciBjYWxsYmFjayB3aWxsIGJlIGV4ZWN1dGVkIHdoZW4gYSBjb21tdW5pY2F0aW9uIGVycm9yIGlzIGRldGVjdGVkLg0KDQogICAgKCMpIEJsb2NraW5nIG1vZGUgQVBJJ3MgYXJlOg0KICAgICAgICAoKyspIEhBTF9TV1BNSV9UcmFuc21pdCgpDQogICAgICAgICgrKykgSEFMX1NXUE1JX1JlY2VpdmUoKQ0KDQogICAgKCMpIE5vbi1CbG9ja2luZyBtb2RlIEFQSSdzIHdpdGggSW50ZXJydXB0IGFyZToNCiAgICAgICAgKCsrKSBIQUxfU1dQTUlfVHJhbnNtaXRfSVQoKQ0KICAgICAgICAoKyspIEhBTF9TV1BNSV9SZWNlaXZlX0lUKCkNCiAgICAgICAgKCsrKSBIQUxfU1dQTUlfSVJRSGFuZGxlcigpDQoNCiAgICAoIykgTm9uLUJsb2NraW5nIG1vZGUgQVBJJ3Mgd2l0aCBETUEgYXJlOg0KICAgICAgICAoKyspIEhBTF9TV1BNSV9UcmFuc21pdF9ETUEoKQ0KICAgICAgICAoKyspIEhBTF9TV1BNSV9SZWNlaXZlX0RNQSgpDQogICAgICAgICgrKykgSEFMX1NXUE1JX0RNQVBhdXNlKCkNCiAgICAgICAgKCsrKSBIQUxfU1dQTUlfRE1BUmVzdW1lKCkNCiAgICAgICAgKCsrKSBIQUxfU1dQTUlfRE1BU3RvcCgpDQoNCiAgICAoIykgQSBzZXQgb2YgVHJhbnNmZXIgQ29tcGxldGUgQ2FsbGJhY2tzIGFyZSBwcm92aWRlZCBpbiBOb24tQmxvY2tpbmcgbW9kZToNCiAgICAgICAgKCsrKSBIQUxfU1dQTUlfVHhIYWxmQ3BsdENhbGxiYWNrKCkNCiAgICAgICAgKCsrKSBIQUxfU1dQTUlfVHhDcGx0Q2FsbGJhY2soKQ0KICAgICAgICAoKyspIEhBTF9TV1BNSV9SeEhhbGZDcGx0Q2FsbGJhY2soKQ0KICAgICAgICAoKyspIEhBTF9TV1BNSV9SeENwbHRDYWxsYmFjaygpDQogICAgICAgICgrKykgSEFMX1NXUE1JX0Vycm9yQ2FsbGJhY2soKQ0KDQogICAgKCMpIFRoZSBjYXBhYmlsaXR5IHRvIGxhdW5jaCB0aGUgYWJvdmUgSU8gb3BlcmF0aW9ucyBpbiBsb29wYmFjayBtb2RlIGZvciANCiAgICAgICAgdXNlciBhcHBsaWNhdGlvbiB2ZXJpZmljYXRpb246ICAgIA0KICAgICAgICAoKyspIEhBTF9TV1BNSV9FbmFibGVMb29wYmFjaygpDQogICAgICAgICgrKykgSEFMX1NXUE1JX0Rpc2FibGVMb29wYmFjaygpDQogICAgICAgIA0KQGVuZHZlcmJhdGltDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQGJyaWVmICBUcmFuc21pdCBhbiBhbW91bnQgb2YgZGF0YSBpbiBibG9ja2luZyBtb2RlLg0KICAqIEBwYXJhbSAgaHN3cG1pOiBwb2ludGVyIHRvIGEgU1dQTUlfSGFuZGxlVHlwZURlZiBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucw0KICAqICAgICAgICAgICAgICAgIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciBTV1BNSSBtb2R1bGUuDQogICogQHBhcmFtICBwRGF0YTogUG9pbnRlciB0byBkYXRhIGJ1ZmZlcg0KICAqIEBwYXJhbSAgU2l6ZTogQW1vdW50IG9mIGRhdGEgdG8gYmUgc2VudA0KICAqIEBwYXJhbSAgVGltZW91dDogVGltZW91dCBkdXJhdGlvbg0KICAqIEByZXR2YWwgSEFMIHN0YXR1cw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NXUE1JX1RyYW5zbWl0KFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSwgdWludDMyX3QqIHBEYXRhLCB1aW50MTZfdCBTaXplLCB1aW50MzJfdCBUaW1lb3V0KQ0Kew0KICB1aW50MzJfdCB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOw0KICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQoNCiAgaWYoKHBEYXRhID09IE5VTEwgKSB8fCAoU2l6ZSA9PSAwKSkNCiAgew0KICAgIHN0YXR1cyA9IEhBTF9FUlJPUjsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KICAgIF9fSEFMX0xPQ0soaHN3cG1pKTsNCg0KICAgIGlmKChoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9SRUFEWSkgfHwgKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfUlgpKQ0KICAgIHsNCiAgICAgIC8qIENoZWNrIGlmIGEgbm9uLWJsb2NraW5nIHJlY2VpdmUgcHJvY2VzcyBpcyBvbmdvaW5nIG9yIG5vdCAqLw0KICAgICAgaWYoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfUkVBRFkpDQogICAgICB7DQogICAgICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9UWDsNCg0KICAgICAgICAvKiBEaXNhYmxlIGFueSB0cmFuc21pdHRlciBpbnRlcnJ1cHRzICovDQogICAgICAgIF9fSEFMX1NXUE1JX0RJU0FCTEVfSVQoaHN3cG1pLCBTV1BNSV9JVF9UQ0lFIHwgU1dQTUlfSVRfVElFIHwgU1dQTUlfSVRfVFhVTlJJRSB8IFNXUE1JX0lUX1RYQkVJRSk7DQoNCiAgICAgICAgLyogRGlzYWJsZSBhbnkgdHJhbnNtaXR0ZXIgZmxhZ3MgKi8NCiAgICAgICAgX19IQUxfU1dQTUlfQ0xFQVJfRkxBRyhoc3dwbWksIFNXUE1JX0ZMQUdfVFhCRUYgfCBTV1BNSV9GTEFHX1RYVU5SRiB8IFNXUE1JX0ZMQUdfVENGKTsNCg0KICAgICAgICAvKiBFbmFibGUgU1dQTUkgcGVyaXBoZXJhbCBpZiBub3QgKi8NCiAgICAgICAgU0VUX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfU1dQQUNUKTsNCiAgICAgIH0NCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYX1JYOw0KICAgICAgfQ0KDQogICAgICBkbw0KICAgICAgew0KICAgICAgICAvKiBXYWl0IHRoZSBUWEUgdG8gd3JpdGUgZGF0YSAqLw0KICAgICAgICBpZihIQUxfSVNfQklUX1NFVChoc3dwbWktPkluc3RhbmNlLT5JU1IsIFNXUE1JX0ZMQUdfVFhFKSkNCiAgICAgICAgew0KICAgICAgICAgIGhzd3BtaS0+SW5zdGFuY2UtPlREUiA9ICgqcERhdGErKyk7DQogICAgICAgICAgU2l6ZS0tOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLw0KICAgICAgICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkNCiAgICAgICAgICB7DQogICAgICAgICAgICBpZigoVGltZW91dCA9PSAwKSB8fCAoKEhBTF9HZXRUaWNrKCkgLSB0aWNrc3RhcnQpID4gVGltZW91dCkpDQogICAgICAgICAgICB7DQogICAgICAgICAgICAgIHN0YXR1cyA9IEhBTF9USU1FT1VUOw0KICAgICAgICAgICAgICBicmVhazsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgIH0gd2hpbGUoU2l6ZSAhPSAwKTsNCg0KICAgICAgLyogV2FpdCBvbiBUWEJFRiBmbGFnIHRvIGJlIGFibGUgdG8gc3RhcnQgYSBzZWNvbmQgdHJhbnNmZXIgKi8NCiAgICAgIGlmKFNXUE1JX1dhaXRPbkZsYWdTZXRVbnRpbFRpbWVvdXQoaHN3cG1pLCBTV1BNSV9GTEFHX1RYQkVGLCB0aWNrc3RhcnQsIFRpbWVvdXQpICE9IEhBTF9PSykNCiAgICAgIHsNCiAgICAgICAgc3RhdHVzID0gSEFMX1RJTUVPVVQ7DQogICAgICB9DQoNCiAgICAgIGlmKHN0YXR1cyA9PSBIQUxfT0spDQogICAgICB7DQogICAgICAgIC8qIENoZWNrIGlmIGEgbm9uLWJsb2NraW5nIHJlY2VpdmUgUHJvY2VzcyBpcyBvbmdvaW5nIG9yIG5vdCAqLw0KICAgICAgICBpZihoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYX1JYKQ0KICAgICAgICB7DQogICAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZX1JYOw0KICAgICAgICB9DQogICAgICAgIGVsc2UNCiAgICAgICAgew0KICAgICAgICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfUkVBRFk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIHN0YXR1cyA9IEhBTF9CVVNZOw0KICAgIH0NCiAgfQ0KDQogIGlmKChzdGF0dXMgIT0gSEFMX09LKSAmJiAoc3RhdHVzICE9IEhBTF9CVVNZKSkNCiAgew0KICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfUkVBRFk7DQogIH0NCiAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLw0KICBfX0hBTF9VTkxPQ0soaHN3cG1pKTsNCg0KICByZXR1cm4gc3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gYmxvY2tpbmcgbW9kZS4NCiAgKiBAcGFyYW0gIGhzd3BtaTogcG9pbnRlciB0byBhIFNXUE1JX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgICB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgU1dQTUkgbW9kdWxlLg0KICAqIEBwYXJhbSAgcERhdGE6IFBvaW50ZXIgdG8gZGF0YSBidWZmZXINCiAgKiBAcGFyYW0gIFNpemU6IEFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkDQogICogQHBhcmFtICBUaW1lb3V0OiBUaW1lb3V0IGR1cmF0aW9uDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1dQTUlfUmVjZWl2ZShTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWksIHVpbnQzMl90ICpwRGF0YSwgdWludDE2X3QgU2l6ZSwgdWludDMyX3QgVGltZW91dCkNCnsNCiAgdWludDMyX3QgdGlja3N0YXJ0ID0gSEFMX0dldFRpY2soKTsNCiAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KDQogIGlmKChwRGF0YSA9PSBOVUxMICkgfHwgKFNpemUgPT0gMCkpDQogIHsNCiAgICBzdGF0dXMgPSBIQUxfRVJST1I7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogUHJvY2VzcyBMb2NrZWQgKi8NCiAgICBfX0hBTF9MT0NLKGhzd3BtaSk7DQoNCiAgICBpZigoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfUkVBRFkpIHx8IChoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYKSkNCiAgICB7DQogICAgICAvKiBDaGVjayBpZiBhIG5vbi1ibG9ja2luZyB0cmFuc21pdCBwcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90ICovDQogICAgICBpZihoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9SRUFEWSkNCiAgICAgIHsNCiAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZX1JYOw0KDQogICAgICAgIC8qIERpc2FibGUgYW55IHJlY2VpdmVyIGludGVycnVwdHMgKi8NCiAgICAgICAgQ0xFQVJfQklUKGhzd3BtaS0+SW5zdGFuY2UtPklFUiwgU1dQTUlfSVRfU1JJRSB8IFNXUE1JX0lUX1JJRSB8IFNXUE1JX0lUX1JYQkVSSUUgfCBTV1BNSV9JVF9SWE9WUklFIHwgU1dQTUlfSVRfUlhCRklFKTsNCg0KICAgICAgICAvKiBFbmFibGUgU1dQTUkgcGVyaXBoZXJhbCBpZiBub3QgKi8NCiAgICAgICAgU0VUX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfU1dQQUNUKTsNCiAgICAgIH0NCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYX1JYOw0KICAgICAgfQ0KDQogICAgICBkbw0KICAgICAgew0KICAgICAgICAvKiBXYWl0IHRoZSBSWE5FIHRvIHJlYWQgZGF0YSAqLw0KICAgICAgICBpZihIQUxfSVNfQklUX1NFVChoc3dwbWktPkluc3RhbmNlLT5JU1IsIFNXUE1JX0ZMQUdfUlhORSkpDQogICAgICAgIHsNCiAgICAgICAgICAoKnBEYXRhKyspID0gaHN3cG1pLT5JbnN0YW5jZS0+UkRSOw0KICAgICAgICAgIFNpemUtLTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAvKiBDaGVjayBmb3IgdGhlIFRpbWVvdXQgKi8NCiAgICAgICAgICBpZihUaW1lb3V0ICE9IEhBTF9NQVhfREVMQVkpDQogICAgICAgICAgew0KICAgICAgICAgICAgaWYoKFRpbWVvdXQgPT0gMCkgfHwgKChIQUxfR2V0VGljaygpIC0gdGlja3N0YXJ0KSA+IFRpbWVvdXQpKQ0KICAgICAgICAgICAgew0KICAgICAgICAgICAgICBzdGF0dXMgPSBIQUxfVElNRU9VVDsNCiAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICB9DQogICAgICAgICAgfQ0KICAgICAgICB9DQogICAgICB9IHdoaWxlKFNpemUgIT0gMCk7DQogICAgICANCiAgICAgIGlmKHN0YXR1cyA9PSBIQUxfT0spDQogICAgICB7DQogICAgICAgIGlmKEhBTF9JU19CSVRfU0VUKGhzd3BtaS0+SW5zdGFuY2UtPklTUiwgU1dQTUlfRkxBR19SWEJGRikpDQogICAgICAgIHsNCiAgICAgICAgICAvKiBDbGVhciBSWEJGRiBhdCBlbmQgb2YgcmVjZXB0aW9uICovDQogICAgICAgICAgV1JJVEVfUkVHKGhzd3BtaS0+SW5zdGFuY2UtPklDUiwgU1dQTUlfRkxBR19SWEJGRik7DQogICAgICAgIH0NCg0KICAgICAgICAvKiBDaGVjayBpZiBhIG5vbi1ibG9ja2luZyB0cmFuc21pdCBQcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90ICovDQogICAgICAgIGlmKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFhfUlgpDQogICAgICAgIHsNCiAgICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFg7DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9SRUFEWTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgc3RhdHVzID0gSEFMX0JVU1k7DQogICAgfQ0KICB9DQoNCiAgaWYoKHN0YXR1cyAhPSBIQUxfT0spICYmIChzdGF0dXMgIT0gSEFMX0JVU1kpKQ0KICB7DQogICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9SRUFEWTsNCiAgfQ0KICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQogIF9fSEFMX1VOTE9DSyhoc3dwbWkpOw0KDQogIHJldHVybiBzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgVHJhbnNtaXQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBpbnRlcnJ1cHQuDQogICogQHBhcmFtICBoc3dwbWk6IHBvaW50ZXIgdG8gYSBTV1BNSV9IYW5kbGVUeXBlRGVmIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zDQogICogICAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIFNXUE1JIG1vZHVsZS4NCiAgKiBAcGFyYW0gIHBEYXRhOiBQb2ludGVyIHRvIGRhdGEgYnVmZmVyDQogICogQHBhcmFtICBTaXplOiBBbW91bnQgb2YgZGF0YSB0byBiZSBzZW50DQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1dQTUlfVHJhbnNtaXRfSVQoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pLCB1aW50MzJfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpDQp7DQogIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCg0KICBpZigocERhdGEgPT0gTlVMTCApIHx8IChTaXplID09IDApKQ0KICB7DQogICAgc3RhdHVzID0gIEhBTF9FUlJPUjsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KICAgIF9fSEFMX0xPQ0soaHN3cG1pKTsNCg0KICAgIGlmKChoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9SRUFEWSkgfHwgKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfUlgpKQ0KICAgIHsNCiAgICAgIC8qIFVwZGF0ZSBoYW5kbGUgKi8NCiAgICAgIGhzd3BtaS0+cFR4QnVmZlB0ciA9IHBEYXRhOw0KICAgICAgaHN3cG1pLT5UeFhmZXJTaXplID0gU2l6ZTsNCiAgICAgIGhzd3BtaS0+VHhYZmVyQ291bnQgPSBTaXplOw0KICAgICAgaHN3cG1pLT5FcnJvckNvZGUgPSBIQUxfU1dQTUlfRVJST1JfTk9ORTsNCg0KICAgICAgLyogQ2hlY2sgaWYgYSByZWNlaXZlIHByb2Nlc3MgaXMgb25nb2luZyBvciBub3QgKi8NCiAgICAgIGlmKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX1JFQURZKQ0KICAgICAgew0KICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFg7DQoNCiAgICAgICAgLyogRW5hYmxlIFNXUE1JIHBlcmlwaGVyYWwgaWYgbm90ICovDQogICAgICAgIFNFVF9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1NXUEFDVCk7DQogICAgICB9DQogICAgICBlbHNlDQogICAgICB7DQogICAgICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9UWF9SWDsNCiAgICAgIH0NCg0KICAgICAgLyogRW5hYmxlIHRoZSBTV1BNSSB0cmFuc21pdCB1bmRlcnJ1biBlcnJvciAqLw0KICAgICAgX19IQUxfU1dQTUlfRU5BQkxFX0lUKGhzd3BtaSwgU1dQTUlfSVRfVFhVTlJJRSk7DQoNCiAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCiAgICAgIF9fSEFMX1VOTE9DSyhoc3dwbWkpOw0KDQogICAgICAvKiBFbmFibGUgdGhlIFNXUE1JIGludGVycnVwdHM6ICAgICAgKi8NCiAgICAgIC8qIC0gVHJhbnNtaXQgZGF0YSByZWdpc3RlciBlbXB0eSAgICAqLw0KICAgICAgLyogLSBUcmFuc21pdCBidWZmZXIgZW1wdHkgICAgICAgICAgICovDQogICAgICAvKiAtIFRyYW5zbWl0L1JlY2VwdGlvbiBjb21wbGV0aW9uICAgKi8NCiAgICAgIF9fSEFMX1NXUE1JX0VOQUJMRV9JVChoc3dwbWksIFNXUE1JX0lUX1RJRSB8IFNXUE1JX0lUX1RYQkVJRSB8IFNXUE1JX0lUX1RDSUUpOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgc3RhdHVzID0gIEhBTF9CVVNZOw0KICAgICAgDQogICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQogICAgICBfX0hBTF9VTkxPQ0soaHN3cG1pKTsNCiAgICB9DQogIH0NCg0KICByZXR1cm4gc3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIGludGVycnVwdC4NCiAgKiBAcGFyYW0gaHN3cG1pOiBTV1BNSSBoYW5kbGUNCiAgKiBAcGFyYW0gcERhdGE6IHBvaW50ZXIgdG8gZGF0YSBidWZmZXINCiAgKiBAcGFyYW0gU2l6ZTogYW1vdW50IG9mIGRhdGEgdG8gYmUgcmVjZWl2ZWQNCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCkhBTF9TdGF0dXNUeXBlRGVmIEhBTF9TV1BNSV9SZWNlaXZlX0lUKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSwgdWludDMyX3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQ0Kew0KICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQoNCiAgaWYoKHBEYXRhID09IE5VTEwgKSB8fCAoU2l6ZSA9PSAwKSkNCiAgew0KICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogUHJvY2VzcyBMb2NrZWQgKi8NCiAgICBfX0hBTF9MT0NLKGhzd3BtaSk7DQoNCiAgICBpZigoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfUkVBRFkpIHx8IChoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYKSkNCiAgICB7DQogICAgICAvKiBVcGRhdGUgaGFuZGxlICovDQogICAgICBoc3dwbWktPnBSeEJ1ZmZQdHIgPSBwRGF0YTsNCiAgICAgIGhzd3BtaS0+UnhYZmVyU2l6ZSA9IFNpemU7DQogICAgICBoc3dwbWktPlJ4WGZlckNvdW50ID0gU2l6ZTsNCiAgICAgIGhzd3BtaS0+RXJyb3JDb2RlID0gSEFMX1NXUE1JX0VSUk9SX05PTkU7DQoNCiAgICAgIC8qIENoZWNrIGlmIGEgdHJhbnNtaXQgcHJvY2VzcyBpcyBvbmdvaW5nIG9yIG5vdCAqLw0KICAgICAgaWYoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfUkVBRFkpDQogICAgICB7DQogICAgICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9SWDsNCg0KICAgICAgICAvKiBFbmFibGUgU1dQTUkgcGVyaXBoZXJhbCBpZiBub3QgKi8NCiAgICAgICAgU0VUX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfU1dQQUNUKTsNCiAgICAgIH0NCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYX1JYOw0KICAgICAgfQ0KDQogICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQogICAgICBfX0hBTF9VTkxPQ0soaHN3cG1pKTsNCg0KICAgICAgLyogRW5hYmxlIHRoZSBTV1BNSSBzbGF2ZSByZXN1bWUgKi8NCiAgICAgIC8qIEVuYWJsZSB0aGUgU1dQTUkgRGF0YSBSZWdpc3RlciBub3QgZW1wdHkgSW50ZXJydXB0LCByZWNlaXZlIENSQyBFcnJvciwgcmVjZWl2ZSBvdmVycnVuIGFuZCBSeEJ1ZiBJbnRlcnJ1cHQgKi8NCiAgICAgIC8qICBFbmFibGUgdGhlIFNXUE1JIFRyYW5zbWl0L1JlY2VwdGlvbiBjb21wbGV0aW9uICAgKi8NCiAgICAgIF9fSEFMX1NXUE1JX0VOQUJMRV9JVChoc3dwbWksIFNXUE1JX0lUX1JJRSB8IFNXUE1JX0lUX1JYQkVSSUUgfCBTV1BNSV9JVF9SWE9WUklFIHwgU1dQTUlfSVRfUlhCRklFKTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIHN0YXR1cyA9IEhBTF9CVVNZOw0KICAgICAgDQogICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQogICAgICBfX0hBTF9VTkxPQ0soaHN3cG1pKTsNCiAgICB9DQogIH0NCg0KICByZXR1cm4gc3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgVHJhbnNtaXQgYW4gYW1vdW50IG9mIGRhdGEgaW4gbm9uLWJsb2NraW5nIG1vZGUgd2l0aCBETUEgaW50ZXJydXB0Lg0KICAqIEBwYXJhbSBoc3dwbWk6IFNXUE1JIGhhbmRsZQ0KICAqIEBwYXJhbSBwRGF0YTogcG9pbnRlciB0byBkYXRhIGJ1ZmZlcg0KICAqIEBwYXJhbSBTaXplOiBhbW91bnQgb2YgZGF0YSB0byBiZSBzZW50DQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1dQTUlfVHJhbnNtaXRfRE1BKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSwgdWludDMyX3QgKnBEYXRhLCB1aW50MTZfdCBTaXplKQ0Kew0KICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQoNCiAgaWYoKHBEYXRhID09IE5VTEwgKSB8fCAoU2l6ZSA9PSAwKSkNCiAgew0KICAgIHN0YXR1cyA9ICBIQUxfRVJST1I7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogUHJvY2VzcyBMb2NrZWQgKi8NCiAgICBfX0hBTF9MT0NLKGhzd3BtaSk7DQoNCiAgICBpZigoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfUkVBRFkpIHx8IChoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9CVVNZX1JYKSkNCiAgICB7DQogICAgICAvKiBVcGRhdGUgaGFuZGxlICovDQogICAgICBoc3dwbWktPnBUeEJ1ZmZQdHIgPSBwRGF0YTsNCiAgICAgIGhzd3BtaS0+VHhYZmVyU2l6ZSA9IFNpemU7DQogICAgICBoc3dwbWktPlR4WGZlckNvdW50ID0gU2l6ZTsNCiAgICAgIGhzd3BtaS0+RXJyb3JDb2RlID0gSEFMX1NXUE1JX0VSUk9SX05PTkU7DQoNCiAgICAgIC8qIENoZWNrIGlmIGEgcmVjZWl2ZSBwcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90ICovDQogICAgICBpZihoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9SRUFEWSkNCiAgICAgIHsNCiAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYOw0KDQogICAgICAgIC8qIEVuYWJsZSBTV1BNSSBwZXJpcGhlcmFsIGlmIG5vdCAqLw0KICAgICAgICBTRVRfQklUKGhzd3BtaS0+SW5zdGFuY2UtPkNSLCBTV1BNSV9DUl9TV1BBQ1QpOw0KICAgICAgfQ0KICAgICAgZWxzZQ0KICAgICAgew0KICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFhfUlg7DQogICAgICB9DQoNCiAgICAgIC8qIFNldCB0aGUgU1dQTUkgRE1BIHRyYW5zZmVyIGNvbXBsZXRlIGNhbGxiYWNrICovDQogICAgICBoc3dwbWktPmhkbWF0eC0+WGZlckNwbHRDYWxsYmFjayA9IFNXUE1JX0RNQVRyYW5zbWl0Q3BsdDsNCg0KICAgICAgLyogU2V0IHRoZSBTV1BNSSBETUEgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLw0KICAgICAgaHN3cG1pLT5oZG1hdHgtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gU1dQTUlfRE1BVHhIYWxmQ3BsdDsNCg0KICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8NCiAgICAgIGhzd3BtaS0+aGRtYXR4LT5YZmVyRXJyb3JDYWxsYmFjayA9IFNXUE1JX0RNQUVycm9yOw0KDQogICAgICAvKiBFbmFibGUgdGhlIFNXUE1JIHRyYW5zbWl0IERNQSBDaGFubmVsICovDQogICAgICBIQUxfRE1BX1N0YXJ0X0lUKGhzd3BtaS0+aGRtYXR4LCAodWludDMyX3QpaHN3cG1pLT5wVHhCdWZmUHRyLCAodWludDMyX3QpJmhzd3BtaS0+SW5zdGFuY2UtPlREUiwgU2l6ZSk7DQoNCiAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCiAgICAgIF9fSEFMX1VOTE9DSyhoc3dwbWkpOw0KDQogICAgICAvKiBFbmFibGUgdGhlIFNXUE1JIHRyYW5zbWl0IHVuZGVycnVuIGVycm9yICovDQogICAgICBfX0hBTF9TV1BNSV9FTkFCTEVfSVQoaHN3cG1pLCBTV1BNSV9JVF9UWFVOUklFKTsNCg0KICAgICAgLyogRW5hYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHRyYW5zbWl0IHJlcXVlc3QgYnkgc2V0dGluZyB0aGUgVFhETUEgYml0DQogICAgICAgICBpbiB0aGUgU1dQTUkgQ1IgcmVnaXN0ZXIgKi8NCiAgICAgIFNFVF9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1RYRE1BKTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIHN0YXR1cyA9IEhBTF9CVVNZOw0KICAgICAgDQogICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQogICAgICBfX0hBTF9VTkxPQ0soaHN3cG1pKTsNCiAgICB9DQogIH0NCg0KICByZXR1cm4gc3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgUmVjZWl2ZSBhbiBhbW91bnQgb2YgZGF0YSBpbiBub24tYmxvY2tpbmcgbW9kZSB3aXRoIERNQSBpbnRlcnJ1cHQuDQogICogQHBhcmFtIGhzd3BtaTogU1dQTUkgaGFuZGxlDQogICogQHBhcmFtIHBEYXRhOiBwb2ludGVyIHRvIGRhdGEgYnVmZmVyDQogICogQHBhcmFtIFNpemU6IGFtb3VudCBvZiBkYXRhIHRvIGJlIHJlY2VpdmVkDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1dQTUlfUmVjZWl2ZV9ETUEoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pLCB1aW50MzJfdCAqcERhdGEsIHVpbnQxNl90IFNpemUpDQp7DQogIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCg0KICBpZigocERhdGEgPT0gTlVMTCApIHx8IChTaXplID09IDApKQ0KICB7DQogICAgc3RhdHVzID0gIEhBTF9FUlJPUjsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KICAgIF9fSEFMX0xPQ0soaHN3cG1pKTsNCg0KICAgIGlmKChoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9SRUFEWSkgfHwgKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFgpKQ0KICAgIHsNCiAgICAgIC8qIFVwZGF0ZSBoYW5kbGUgKi8NCiAgICAgIGhzd3BtaS0+cFJ4QnVmZlB0ciA9IHBEYXRhOw0KICAgICAgaHN3cG1pLT5SeFhmZXJTaXplID0gU2l6ZTsNCiAgICAgIGhzd3BtaS0+RXJyb3JDb2RlID0gSEFMX1NXUE1JX0VSUk9SX05PTkU7DQoNCiAgICAgIC8qIENoZWNrIGlmIGEgdHJhbnNtaXQgcHJvY2VzcyBpcyBvbmdvaW5nIG9yIG5vdCAqLw0KICAgICAgaWYoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfUkVBRFkpDQogICAgICB7DQogICAgICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9SWDsNCg0KICAgICAgICAvKiBFbmFibGUgU1dQTUkgcGVyaXBoZXJhbCBpZiBub3QgKi8NCiAgICAgICAgU0VUX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfU1dQQUNUKTsNCiAgICAgIH0NCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYX1JYOw0KICAgICAgfQ0KDQogICAgICAvKiBTZXQgdGhlIFNXUE1JIERNQSB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLw0KICAgICAgaHN3cG1pLT5oZG1hcngtPlhmZXJDcGx0Q2FsbGJhY2sgPSBTV1BNSV9ETUFSZWNlaXZlQ3BsdDsNCg0KICAgICAgLyogU2V0IHRoZSBTV1BNSSBETUEgSGFsZiB0cmFuc2ZlciBjb21wbGV0ZSBjYWxsYmFjayAqLw0KICAgICAgaHN3cG1pLT5oZG1hcngtPlhmZXJIYWxmQ3BsdENhbGxiYWNrID0gU1dQTUlfRE1BUnhIYWxmQ3BsdDsNCg0KICAgICAgLyogU2V0IHRoZSBETUEgZXJyb3IgY2FsbGJhY2sgKi8NCiAgICAgIGhzd3BtaS0+aGRtYXJ4LT5YZmVyRXJyb3JDYWxsYmFjayA9IFNXUE1JX0RNQUVycm9yOw0KDQogICAgICAvKiBFbmFibGUgdGhlIERNQSByZXF1ZXN0ICovDQogICAgICBIQUxfRE1BX1N0YXJ0X0lUKGhzd3BtaS0+aGRtYXJ4LCAodWludDMyX3QpJmhzd3BtaS0+SW5zdGFuY2UtPlJEUiwgKHVpbnQzMl90KWhzd3BtaS0+cFJ4QnVmZlB0ciwgU2l6ZSk7DQoNCiAgICAgIC8qIFByb2Nlc3MgVW5sb2NrZWQgKi8NCiAgICAgIF9fSEFMX1VOTE9DSyhoc3dwbWkpOw0KDQogICAgICAvKiBFbmFibGUgdGhlIFNXUE1JIHJlY2VpdmUgQ1JDIEVycm9yIGFuZCByZWNlaXZlIG92ZXJydW4gaW50ZXJydXB0cyAqLw0KICAgICAgX19IQUxfU1dQTUlfRU5BQkxFX0lUKGhzd3BtaSwgU1dQTUlfSVRfUlhCRVJJRSB8IFNXUE1JX0lUX1JYT1ZSSUUpOw0KDQogICAgICAvKiBFbmFibGUgdGhlIERNQSB0cmFuc2ZlciBmb3IgdGhlIHJlY2VpdmVyIHJlcXVlc3QgYnkgc2V0dGluZyB0aGUgUlhETUEgYml0DQogICAgICAgICBpbiB0aGUgU1dQTUkgQ1IgcmVnaXN0ZXIgKi8NCiAgICAgIFNFVF9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1JYRE1BKTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIHN0YXR1cyA9IEhBTF9CVVNZOw0KDQogICAgICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQogICAgICBfX0hBTF9VTkxPQ0soaHN3cG1pKTsNCiAgICB9DQogIH0NCg0KICByZXR1cm4gc3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgU3RvcCBhbGwgRE1BIHRyYW5zZmVycy4NCiAgKiBAcGFyYW0gaHN3cG1pOiBTV1BNSSBoYW5kbGUNCiAgKiBAcmV0dmFsIEhBTF9PSw0KICAqLw0KSEFMX1N0YXR1c1R5cGVEZWYgSEFMX1NXUE1JX0RNQVN0b3AoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKQ0Kew0KICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KICBfX0hBTF9MT0NLKGhzd3BtaSk7DQoNCiAgLyogRGlzYWJsZSB0aGUgU1dQTUkgVHgvUnggRE1BIHJlcXVlc3RzICovDQogIENMRUFSX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgKFNXUE1JX0NSX1RYRE1BIHwgU1dQTUlfQ1JfUlhETUEpKTsNCg0KICAvKiBBYm9ydCB0aGUgU1dQTUkgRE1BIHR4IGNoYW5uZWwgKi8NCiAgaWYoaHN3cG1pLT5oZG1hdHggIT0gTlVMTCkNCiAgew0KICAgIEhBTF9ETUFfQWJvcnQoaHN3cG1pLT5oZG1hdHgpOw0KICB9DQogIC8qIEFib3J0IHRoZSBTV1BNSSBETUEgcnggY2hhbm5lbCAqLw0KICBpZihoc3dwbWktPmhkbWFyeCAhPSBOVUxMKQ0KICB7DQogICAgSEFMX0RNQV9BYm9ydChoc3dwbWktPmhkbWFyeCk7DQogIH0NCg0KICAvKiBEaXNhYmxlIFNXUE1JIGludGVyZmFjZSAqLw0KICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1NXUEFDVCk7DQoNCiAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9SRUFEWTsNCg0KICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQogIF9fSEFMX1VOTE9DSyhoc3dwbWkpOw0KDQogIHJldHVybiBIQUxfT0s7DQp9DQoNCg0KLyoqDQogICogQGJyaWVmIEVuYWJsZSB0aGUgTG9vcGJhY2sgbW9kZS4NCiAgKiBAcGFyYW0gaHN3cG1pOiBTV1BNSSBoYW5kbGUNCiAgKiBAbm90ZSAgTG9vcGJhY2sgbW9kZSBpcyB0byBiZSB1c2VkIG9ubHkgZm9yIHRlc3QgcHVycG9zZXMNCiAgKiBAcmV0dmFsIEhBTF9PSyAvIEhBTF9CVVNZDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1dQTUlfRW5hYmxlTG9vcGJhY2soU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKQ0Kew0KICBIQUxfU3RhdHVzVHlwZURlZiAgc3RhdHVzID0gSEFMX09LOw0KDQogIC8qIFByb2Nlc3MgTG9ja2VkICovDQogIF9fSEFMX0xPQ0soaHN3cG1pKTsNCg0KICAvKiBDaGVjayBTV1BNSSBub3QgZW5hYmxlZCAqLw0KICBpZihSRUFEX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfU1dQQUNUKSAhPSBSRVNFVCkNCiAgew0KICAgIHN0YXR1cyA9IEhBTF9CVVNZOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIFNldCBMb29wYmFjayAqLw0KICAgIFNFVF9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX0xQQkspOw0KICB9DQoNCiAgLyogUHJvY2VzcyBVbmxvY2tlZCAqLw0KICBfX0hBTF9VTkxPQ0soaHN3cG1pKTsNCg0KICByZXR1cm4gc3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgRGlzYWJsZSB0aGUgTG9vcGJhY2sgbW9kZS4NCiAgKiBAcGFyYW0gaHN3cG1pOiBTV1BNSSBoYW5kbGUNCiAgKiBAbm90ZSAgTG9vcGJhY2sgbW9kZSBpcyB0byBiZSB1c2VkIG9ubHkgZm9yIHRlc3QgcHVycG9zZXMNCiAgKiBAcmV0dmFsIEhBTF9PSyAvIEhBTF9CVVNZDQogICovDQpIQUxfU3RhdHVzVHlwZURlZiBIQUxfU1dQTUlfRGlzYWJsZUxvb3BiYWNrKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSkNCnsNCiAgSEFMX1N0YXR1c1R5cGVEZWYgIHN0YXR1cyA9IEhBTF9PSzsNCg0KICAvKiBQcm9jZXNzIExvY2tlZCAqLw0KICBfX0hBTF9MT0NLKGhzd3BtaSk7DQoNCiAgLyogQ2hlY2sgU1dQTUkgbm90IGVuYWJsZWQgKi8NCiAgaWYoUkVBRF9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1NXUEFDVCkgIT0gUkVTRVQpDQogIHsNCiAgICBzdGF0dXMgPSBIQUxfQlVTWTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBSZXNldCBMb29wYmFjayAqLw0KICAgIENMRUFSX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfTFBCSyk7DQogIH0NCg0KICAvKiBQcm9jZXNzIFVubG9ja2VkICovDQogIF9fSEFMX1VOTE9DSyhoc3dwbWkpOw0KDQogIHJldHVybiBzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgU1dQTUlfRXhwb3J0ZWRfR3JvdXAzIFNXUE1JIElSUSBoYW5kbGVyIGFuZCBjYWxsYmFja3MNCiAqICBAYnJpZWYgIFNXUE1JICBJUlEgaGFuZGxlci4NCiAqDQpAdmVyYmF0aW0gICANCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQogICAgICAgICAgICAgICAgICAgICAgIyMjIyMgU1dQTUkgSVJRIGhhbmRsZXIgYW5kIGNhbGxiYWNrcyAgIyMjIyMNCiAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICANClsuLl0gIFRoaXMgc2VjdGlvbiBwcm92aWRlcyBTV1BNSSBJUlEgaGFuZGxlciBhbmQgY2FsbGJhY2sgZnVuY3Rpb25zIGNhbGxlZCB3aXRoaW4gDQogICAgICB0aGUgSVJRIGhhbmRsZXIuDQoNCkBlbmR2ZXJiYXRpbQ0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEBicmllZiBIYW5kbGUgU1dQTUkgaW50ZXJydXB0IHJlcXVlc3QuDQogICogQHBhcmFtIGhzd3BtaTogU1dQTUkgaGFuZGxlDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIEhBTF9TV1BNSV9JUlFIYW5kbGVyKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSkNCnsNCiAgdWludDMyX3QgcmVnaXNyID0gUkVBRF9SRUcoaHN3cG1pLT5JbnN0YW5jZS0+SVNSKTsNCiAgdWludDMyX3QgcmVnaWVyID0gUkVBRF9SRUcoaHN3cG1pLT5JbnN0YW5jZS0+SUVSKTsNCiAgdWludDMyX3QgZXJyY29kZSA9IEhBTF9TV1BNSV9FUlJPUl9OT05FOw0KDQogIC8qIFNXUE1JIENSQyBlcnJvciBpbnRlcnJ1cHQgb2NjdXJyZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBpZigoKHJlZ2lzciAmIFNXUE1JX0ZMQUdfUlhCRVJGKSAhPSBSRVNFVCkgJiYgKChyZWdpZXIgJiBTV1BNSV9JVF9SWEJFUklFKSAhPSBSRVNFVCkpDQogIHsNCiAgICAvKiBEaXNhYmxlIFJlY2VpdmUgQ1JDIGludGVycnVwdCAqLw0KICAgIENMRUFSX0JJVChoc3dwbWktPkluc3RhbmNlLT5JRVIsIFNXUE1JX0lUX1JYQkVSSUUgfCBTV1BNSV9JVF9SWEJGSUUpOw0KICAgIC8qIENsZWFyIFJlY2VpdmUgQ1JDIGFuZCBSZWNlaXZlIGJ1ZmZlciBmdWxsIGZsYWcgKi8NCiAgICBXUklURV9SRUcoaHN3cG1pLT5JbnN0YW5jZS0+SUNSLCBTV1BNSV9GTEFHX1JYQkVSRiB8IFNXUE1JX0ZMQUdfUlhCRkYpOw0KDQogICAgZXJyY29kZSB8PSBIQUxfU1dQTUlfRVJST1JfQ1JDOw0KICB9DQoNCiAgLyogU1dQTUkgT3Zlci1SdW4gaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgaWYoKChyZWdpc3IgJiBTV1BNSV9GTEFHX1JYT1ZSRikgIT0gUkVTRVQpICYmICgocmVnaWVyICYgU1dQTUlfSVRfUlhPVlJJRSkgIT0gUkVTRVQpKQ0KICB7DQogICAgLyogRGlzYWJsZSBSZWNlaXZlIG92ZXJydW4gaW50ZXJydXB0ICovDQogICAgQ0xFQVJfQklUKGhzd3BtaS0+SW5zdGFuY2UtPklFUiwgU1dQTUlfSVRfUlhPVlJJRSk7DQogICAgLyogQ2xlYXIgUmVjZWl2ZSBvdmVycnVuIGZsYWcgKi8NCiAgICBXUklURV9SRUcoaHN3cG1pLT5JbnN0YW5jZS0+SUNSLCBTV1BNSV9GTEFHX1JYT1ZSRik7DQoNCiAgICBlcnJjb2RlIHw9IEhBTF9TV1BNSV9FUlJPUl9PVlI7DQogIH0NCg0KICAvKiBTV1BNSSBVbmRlci1SdW4gaW50ZXJydXB0IG9jY3VycmVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgaWYoKChyZWdpc3IgJiBTV1BNSV9GTEFHX1RYVU5SRikgIT0gUkVTRVQpICYmICgocmVnaWVyICYgU1dQTUlfSVRfVFhVTlJJRSkgIT0gUkVTRVQpKQ0KICB7DQogICAgLyogRGlzYWJsZSBUcmFuc21pdCB1bmRlciBydW4gaW50ZXJydXB0ICovDQogICAgQ0xFQVJfQklUKGhzd3BtaS0+SW5zdGFuY2UtPklFUiwgU1dQTUlfSVRfVFhVTlJJRSk7DQogICAgLyogQ2xlYXIgVHJhbnNtaXQgdW5kZXIgcnVuIGZsYWcgKi8NCiAgICBXUklURV9SRUcoaHN3cG1pLT5JbnN0YW5jZS0+SUNSLCBTV1BNSV9GTEFHX1RYVU5SRik7DQoNCiAgICBlcnJjb2RlIHw9IEhBTF9TV1BNSV9FUlJPUl9VRFI7DQogIH0NCg0KICAgLyogQ2FsbCBTV1BNSSBFcnJvciBDYWxsIGJhY2sgZnVuY3Rpb24gaWYgbmVlZGVkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgaWYoZXJyY29kZSAhPSBIQUxfU1dQTUlfRVJST1JfTk9ORSkNCiAgew0KICAgIGhzd3BtaS0+RXJyb3JDb2RlIHw9IGVycmNvZGU7DQogICAgDQogICAgaWYoKGVycmNvZGUgJiBIQUxfU1dQTUlfRVJST1JfVURSKSAhPSBSRVNFVCkNCiAgICB7DQogICAgICAvKiBDaGVjayBUWERNQSB0cmFuc2ZlciB0byBhYm9ydCAqLw0KICAgICAgaWYoSEFMX0lTX0JJVF9TRVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1RYRE1BKSkNCiAgICAgIHsNCiAgICAgICAgLyogRGlzYWJsZSBETUEgVFggYXQgU1dQTUkgbGV2ZWwgKi8NCiAgICAgICAgQ0xFQVJfQklUKGhzd3BtaS0+SW5zdGFuY2UtPkNSLCBTV1BNSV9DUl9UWERNQSk7DQogICAgICAgIA0KICAgICAgICAvKiBBYm9ydCB0aGUgVVNBUlQgRE1BIFR4IGNoYW5uZWwgKi8NCiAgICAgICAgaWYoaHN3cG1pLT5oZG1hdHggIT0gTlVMTCkNCiAgICAgICAgew0KICAgICAgICAgIC8qIFNldCB0aGUgU1dQTUkgVHggRE1BIEFib3J0IGNhbGxiYWNrIDogDQogICAgICAgICAgICAgd2lsbCBsZWFkIHRvIGNhbGwgSEFMX1NXUE1JX0Vycm9yQ2FsbGJhY2soKSBhdCBlbmQgb2YgRE1BIGFib3J0IHByb2NlZHVyZSAqLw0KICAgICAgICAgIGhzd3BtaS0+aGRtYXR4LT5YZmVyQWJvcnRDYWxsYmFjayA9IFNXUE1JX0RNQUFib3J0T25FcnJvcjsNCiAgICAgICAgICAvKiBBYm9ydCBETUEgVFggKi8NCiAgICAgICAgICBpZihIQUxfRE1BX0Fib3J0X0lUKGhzd3BtaS0+aGRtYXR4KSAhPSBIQUxfT0spDQogICAgICAgICAgew0KICAgICAgICAgICAgLyogQ2FsbCBEaXJlY3RseSBoc3dwbWktPmhkbWF0eC0+WGZlckFib3J0Q2FsbGJhY2sgZnVuY3Rpb24gaW4gY2FzZSBvZiBlcnJvciAqLw0KICAgICAgICAgICAgaHN3cG1pLT5oZG1hdHgtPlhmZXJBYm9ydENhbGxiYWNrKGhzd3BtaS0+aGRtYXR4KTsNCiAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgZWxzZQ0KICAgICAgICB7DQogICAgICAgICAgLyogU2V0IHRoZSBTV1BNSSBzdGF0ZSByZWFkeSB0byBiZSBhYmxlIHRvIHN0YXJ0IGFnYWluIHRoZSBwcm9jZXNzICovDQogICAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9SRUFEWTsNCg0KICAgICAgICAgIEhBTF9TV1BNSV9FcnJvckNhbGxiYWNrKGhzd3BtaSk7DQogICAgICAgIH0NCiAgICAgIH0NCiAgICAgIGVsc2UNCiAgICAgIHsNCiAgICAgICAgLyogU2V0IHRoZSBTV1BNSSBzdGF0ZSByZWFkeSB0byBiZSBhYmxlIHRvIHN0YXJ0IGFnYWluIHRoZSBwcm9jZXNzICovDQogICAgICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfUkVBRFk7DQoNCiAgICAgICAgSEFMX1NXUE1JX0Vycm9yQ2FsbGJhY2soaHN3cG1pKTsNCiAgICAgIH0NCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIC8qIENoZWNrIFJYRE1BIHRyYW5zZmVyIHRvIGFib3J0ICovDQogICAgICBpZihIQUxfSVNfQklUX1NFVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfUlhETUEpKQ0KICAgICAgew0KICAgICAgICAvKiBEaXNhYmxlIERNQSBSWCBhdCBTV1BNSSBsZXZlbCAqLw0KICAgICAgICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1JYRE1BKTsNCiAgICAgICAgDQogICAgICAgIC8qIEFib3J0IHRoZSBVU0FSVCBETUEgUnggY2hhbm5lbCAqLw0KICAgICAgICBpZihoc3dwbWktPmhkbWFyeCAhPSBOVUxMKQ0KICAgICAgICB7DQogICAgICAgICAgLyogU2V0IHRoZSBTV1BNSSBSeCBETUEgQWJvcnQgY2FsbGJhY2sgOiANCiAgICAgICAgICAgICB3aWxsIGxlYWQgdG8gY2FsbCBIQUxfU1dQTUlfRXJyb3JDYWxsYmFjaygpIGF0IGVuZCBvZiBETUEgYWJvcnQgcHJvY2VkdXJlICovDQogICAgICAgICAgaHN3cG1pLT5oZG1hcngtPlhmZXJBYm9ydENhbGxiYWNrID0gU1dQTUlfRE1BQWJvcnRPbkVycm9yOw0KICAgICAgICAgIC8qIEFib3J0IERNQSBSWCAqLw0KICAgICAgICAgIGlmKEhBTF9ETUFfQWJvcnRfSVQoaHN3cG1pLT5oZG1hcngpICE9IEhBTF9PSykNCiAgICAgICAgICB7DQogICAgICAgICAgICAvKiBDYWxsIERpcmVjdGx5IGhzd3BtaS0+aGRtYXJ4LT5YZmVyQWJvcnRDYWxsYmFjayBmdW5jdGlvbiBpbiBjYXNlIG9mIGVycm9yICovDQogICAgICAgICAgICBoc3dwbWktPmhkbWFyeC0+WGZlckFib3J0Q2FsbGJhY2soaHN3cG1pLT5oZG1hcngpOw0KICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgICAgICBlbHNlDQogICAgICAgIHsNCiAgICAgICAgICAvKiBTZXQgdGhlIFNXUE1JIHN0YXRlIHJlYWR5IHRvIGJlIGFibGUgdG8gc3RhcnQgYWdhaW4gdGhlIHByb2Nlc3MgKi8NCiAgICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX1JFQURZOw0KDQogICAgICAgICAgSEFMX1NXUE1JX0Vycm9yQ2FsbGJhY2soaHN3cG1pKTsNCiAgICAgICAgfQ0KICAgICAgfQ0KICAgICAgZWxzZQ0KICAgICAgew0KICAgICAgICAvKiBTZXQgdGhlIFNXUE1JIHN0YXRlIHJlYWR5IHRvIGJlIGFibGUgdG8gc3RhcnQgYWdhaW4gdGhlIHByb2Nlc3MgKi8NCiAgICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9SRUFEWTsNCg0KICAgICAgICBIQUxfU1dQTUlfRXJyb3JDYWxsYmFjayhoc3dwbWkpOw0KICAgICAgfQ0KICAgIH0NCiAgfQ0KDQogIC8qIFNXUE1JIGluIG1vZGUgUmVjZWl2ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgaWYoKChyZWdpc3IgJiBTV1BNSV9GTEFHX1JYTkUpICE9IFJFU0VUKSAmJiAoKHJlZ2llciAmIFNXUE1JX0lUX1JJRSkgICE9IFJFU0VUKSkNCiAgew0KICAgIFNXUE1JX1JlY2VpdmVfSVQoaHN3cG1pKTsNCiAgfQ0KDQogIC8qIFNXUE1JIGluIG1vZGUgVHJhbnNtaXR0ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgaWYoKChyZWdpc3IgJiBTV1BNSV9GTEFHX1RYRSkgIT0gUkVTRVQpICYmICgocmVnaWVyICYgU1dQTUlfSVRfVElFKSAhPSBSRVNFVCkpDQogIHsNCiAgICBTV1BNSV9UcmFuc21pdF9JVChoc3dwbWkpOw0KICB9DQoNCiAgLyogU1dQTUkgaW4gbW9kZSBUcmFuc21pdHRlciAoVHJhbnNtaXQgYnVmZmVyIGVtcHR5KSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBpZigoKHJlZ2lzciAmIFNXUE1JX0ZMQUdfVFhCRUYpICE9IFJFU0VUKSAmJiAoKHJlZ2llciAmIFNXUE1JX0lUX1RYQkVJRSkgIT0gUkVTRVQpKQ0KICB7DQogICAgU1dQTUlfRW5kVHJhbnNtaXRfSVQoaHN3cG1pKTsNCiAgfQ0KDQogIC8qIFNXUE1JIGluIG1vZGUgUmVjZWl2ZXIgKFJlY2VpdmUgYnVmZmVyIGZ1bGwpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgaWYoKChyZWdpc3IgJiBTV1BNSV9GTEFHX1JYQkZGKSAhPSBSRVNFVCkgJiYgKChyZWdpZXIgJiBTV1BNSV9JVF9SWEJGSUUpICE9IFJFU0VUKSkNCiAgew0KICAgIFNXUE1JX0VuZFJlY2VpdmVfSVQoaHN3cG1pKTsNCiAgfQ0KDQogIC8qIEJvdGggVHJhbnNtaXNzaW9uIGFuZCByZWNlcHRpb24gY29tcGxldGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgaWYoKChyZWdpc3IgJiBTV1BNSV9GTEFHX1RDRikgIT0gUkVTRVQpICYmICgocmVnaWVyICYgU1dQTUlfSVRfVENJRSkgIT0gUkVTRVQpKQ0KICB7DQogICAgU1dQTUlfRW5kVHJhbnNtaXRSZWNlaXZlX0lUKGhzd3BtaSk7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmIFR4IFRyYW5zZmVyIGNvbXBsZXRlZCBjYWxsYmFjay4NCiAgKiBAcGFyYW0gaHN3cG1pOiBTV1BNSSBoYW5kbGUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCl9fd2VhayB2b2lkIEhBTF9TV1BNSV9UeENwbHRDYWxsYmFjayhTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpDQp7DQogIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCiAgVU5VU0VEKGhzd3BtaSk7DQoNCiAgLyogTk9URSA6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KICAgICAgICAgICAgdGhlIEhBTF9TV1BNSV9UeENwbHRDYWxsYmFjayBpcyB0byBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlDQogICAqLw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFR4IEhhbGYgVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLg0KICAqIEBwYXJhbSAgaHN3cG1pOiBTV1BNSSBoYW5kbGUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCl9fd2VhayB2b2lkIEhBTF9TV1BNSV9UeEhhbGZDcGx0Q2FsbGJhY2soU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKQ0Kew0KICAvKiBQcmV2ZW50IHVudXNlZCBhcmd1bWVudChzKSBjb21waWxhdGlvbiB3YXJuaW5nICovDQogIFVOVVNFRChoc3dwbWkpOw0KDQogIC8qIE5PVEU6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIG5vdCBiZSBtb2RpZmllZCwgd2hlbiB0aGUgY2FsbGJhY2sgaXMgbmVlZGVkLA0KICAgICAgICAgICB0aGUgSEFMX1NXUE1JX1R4SGFsZkNwbHRDYWxsYmFjayBpcyB0byBiZSBpbXBsZW1lbnRlZCBpbiB0aGUgdXNlciBmaWxlDQogICAqLw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgUnggVHJhbnNmZXIgY29tcGxldGVkIGNhbGxiYWNrLg0KICAqIEBwYXJhbSBoc3dwbWk6IFNXUE1JIGhhbmRsZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0KX193ZWFrIHZvaWQgSEFMX1NXUE1JX1J4Q3BsdENhbGxiYWNrKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSkNCnsNCiAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KICBVTlVTRUQoaHN3cG1pKTsNCg0KICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQogICAgICAgICAgICB0aGUgSEFMX1NXUE1JX1J4Q3BsdENhbGxiYWNrIGlzIHRvIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCiAgICovDQp9DQoNCi8qKg0KICAqIEBicmllZiAgUnggSGFsZiBUcmFuc2ZlciBjb21wbGV0ZWQgY2FsbGJhY2suDQogICogQHBhcmFtICBoc3dwbWk6IFNXUE1JIGhhbmRsZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0KX193ZWFrIHZvaWQgSEFMX1NXUE1JX1J4SGFsZkNwbHRDYWxsYmFjayhTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpDQp7DQogIC8qIFByZXZlbnQgdW51c2VkIGFyZ3VtZW50KHMpIGNvbXBpbGF0aW9uIHdhcm5pbmcgKi8NCiAgVU5VU0VEKGhzd3BtaSk7DQoNCiAgLyogTk9URTogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQogICAgICAgICAgIHRoZSBIQUxfU1dQTUlfUnhIYWxmQ3BsdENhbGxiYWNrIGlzIHRvIGJlIGltcGxlbWVudGVkIGluIHRoZSB1c2VyIGZpbGUNCiAgICovDQp9DQoNCi8qKg0KICAqIEBicmllZiBTV1BNSSBlcnJvciBjYWxsYmFjay4NCiAgKiBAcGFyYW0gaHN3cG1pOiBTV1BNSSBoYW5kbGUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCl9fd2VhayB2b2lkIEhBTF9TV1BNSV9FcnJvckNhbGxiYWNrKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSkNCnsNCiAgLyogUHJldmVudCB1bnVzZWQgYXJndW1lbnQocykgY29tcGlsYXRpb24gd2FybmluZyAqLw0KICBVTlVTRUQoaHN3cG1pKTsNCg0KICAvKiBOT1RFIDogVGhpcyBmdW5jdGlvbiBzaG91bGQgbm90IGJlIG1vZGlmaWVkLCB3aGVuIHRoZSBjYWxsYmFjayBpcyBuZWVkZWQsDQogICAgICAgICAgICB0aGUgSEFMX1NXUE1JX0Vycm9yQ2FsbGJhY2sgaXMgdG8gYmUgaW1wbGVtZW50ZWQgaW4gdGhlIHVzZXIgZmlsZQ0KICAgKi8NCn0NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBTV1BNSV9FeHBvcnRlZF9Hcm91cDQgUGVyaXBoZXJhbCBDb250cm9sIG1ldGhvZHMNCiAgKiAgQGJyaWVmICAgU1dQTUkgY29udHJvbCBmdW5jdGlvbnMNCiAgKg0KQHZlcmJhdGltDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgICAgICAgICAgICAgICAgICAgICMjIyMjIFBlcmlwaGVyYWwgQ29udHJvbCBtZXRob2RzICMjIyMjDQogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KICAgIFsuLl0NCiAgICBUaGlzIHN1YnNlY3Rpb24gcHJvdmlkZXMgYSBzZXQgb2YgZnVuY3Rpb25zIGFsbG93aW5nIHRvIGNvbnRyb2wgdGhlIFNXUE1JLg0KICAgICAoKykgSEFMX1NXUE1JX0dldFN0YXRlKCkgQVBJIGlzIGhlbHBmdWwgdG8gY2hlY2sgaW4gcnVuLXRpbWUgdGhlIHN0YXRlIG9mIHRoZSBTV1BNSSBwZXJpcGhlcmFsDQogICAgICgrKSBIQUxfU1dQTUlfR2V0RXJyb3IoKSBBUEkgaXMgaGVscGZ1bCB0byBjaGVjayBpbiBydW4tdGltZSB0aGUgZXJyb3Igc3RhdGUgb2YgdGhlIFNXUE1JIHBlcmlwaGVyYWwNCkBlbmR2ZXJiYXRpbQ0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEBicmllZiBSZXR1cm4gdGhlIFNXUE1JIGhhbmRsZSBzdGF0ZS4NCiAgKiBAcGFyYW0gaHN3cG1pOiBTV1BNSSBoYW5kbGUNCiAgKiBAcmV0dmFsIEhBTCBzdGF0ZQ0KICAqLw0KSEFMX1NXUE1JX1N0YXRlVHlwZURlZiBIQUxfU1dQTUlfR2V0U3RhdGUoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKQ0Kew0KICAvKiBSZXR1cm4gU1dQTUkgaGFuZGxlIHN0YXRlICovDQogIHJldHVybiBoc3dwbWktPlN0YXRlOw0KfQ0KDQovKioNCiogQGJyaWVmICBSZXR1cm4gdGhlIFNXUE1JIGVycm9yIGNvZGUuDQoqIEBwYXJhbSAgaHN3cG1pIDogcG9pbnRlciB0byBhIFNXUE1JX0hhbmRsZVR5cGVEZWYgc3RydWN0dXJlIHRoYXQgY29udGFpbnMNCiAgKiAgICAgICAgICAgICAgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgU1dQTUkuDQoqIEByZXR2YWwgU1dQTUkgRXJyb3IgQ29kZQ0KKi8NCnVpbnQzMl90IEhBTF9TV1BNSV9HZXRFcnJvcihTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpDQp7DQogIHJldHVybiBoc3dwbWktPkVycm9yQ29kZTsNCn0NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyoqIEBkZWZncm91cCBTV1BNSV9Qcml2YXRlX0Z1bmN0aW9ucyBTV1BNSSBQcml2YXRlIEZ1bmN0aW9ucw0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEBicmllZiBUcmFuc21pdCBhbiBhbW91bnQgb2YgZGF0YSBpbiBpbnRlcnJ1cHQgbW9kZS4NCiAgKiBAbm90ZSAgRnVuY3Rpb24gY2FsbGVkIHVuZGVyIGludGVycnVwdGlvbiBvbmx5LCBvbmNlIGludGVycnVwdGlvbnMgaGF2ZSBiZWVuIGVuYWJsZWQgYnkgSEFMX1NXUE1JX1RyYW5zbWl0X0lUKCkNCiAgKiBAcGFyYW0gIGhzd3BtaTogU1dQTUkgaGFuZGxlDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1dQTUlfVHJhbnNtaXRfSVQoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKQ0Kew0KICBIQUxfU3RhdHVzVHlwZURlZiBzdGF0dXMgPSBIQUxfT0s7DQoNCiAgaWYgKChoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYKSB8fCAoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9UWF9SWCkpDQogIHsNCiAgICBpZihoc3dwbWktPlR4WGZlckNvdW50ID09IDApDQogICAgew0KICAgICAgLyogRGlzYWJsZSB0aGUgU1dQTUkgVFhFIGFuZCBVbmRlcnJ1biBJbnRlcnJ1cHRzICovDQogICAgICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+SUVSLCAoU1dQTUlfSVRfVElFIHwgU1dQTUlfSVRfVFhVTlJJRSkpOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgaHN3cG1pLT5JbnN0YW5jZS0+VERSID0gKHVpbnQzMl90KSgqaHN3cG1pLT5wVHhCdWZmUHRyKyspOw0KICAgICAgaHN3cG1pLT5UeFhmZXJDb3VudC0tOw0KICAgIH0NCiAgfQ0KICBlbHNlDQogIHsNCiAgICBzdGF0dXMgPSBIQUxfQlVTWTsNCiAgfQ0KDQogIHJldHVybiBzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgV3JhcHMgdXAgdHJhbnNtaXNzaW9uIGluIG5vbi1ibG9ja2luZyBtb2RlLg0KICAqIEBwYXJhbSAgaHN3cG1pOiBTV1BNSSBoYW5kbGUNCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTV1BNSV9FbmRUcmFuc21pdF9JVChTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpDQp7DQogIC8qIENsZWFyIHRoZSBTV1BNSSBUcmFuc21pdCBidWZmZXIgZW1wdHkgRmxhZyAqLw0KICBXUklURV9SRUcoaHN3cG1pLT5JbnN0YW5jZS0+SUNSLCBTV1BNSV9GTEFHX1RYQkVGKTsNCiAgLyogRGlzYWJsZSB0aGUgYWxsIFNXUE1JIFRyYW5zbWl0IEludGVycnVwdHMgICovDQogIENMRUFSX0JJVChoc3dwbWktPkluc3RhbmNlLT5JRVIsIFNXUE1JX0lUX1RJRSB8IFNXUE1JX0lUX1RYVU5SSUUgfCBTV1BNSV9JVF9UWEJFSUUpOw0KDQogIC8qIENoZWNrIGlmIGEgcmVjZWl2ZSBQcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90ICovDQogIGlmKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFhfUlgpDQogIHsNCiAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfUlg7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9SRUFEWTsNCiAgfQ0KICANCiAgSEFMX1NXUE1JX1R4Q3BsdENhbGxiYWNrKGhzd3BtaSk7DQoNCiAgcmV0dXJuIEhBTF9PSzsNCn0NCg0KLyoqDQogICogQGJyaWVmIFJlY2VpdmUgYW4gYW1vdW50IG9mIGRhdGEgaW4gaW50ZXJydXB0IG1vZGUuDQogICogQG5vdGUgIEZ1bmN0aW9uIGNhbGxlZCB1bmRlciBpbnRlcnJ1cHRpb24gb25seSwgb25jZSBpbnRlcnJ1cHRpb25zIGhhdmUgYmVlbiBlbmFibGVkIGJ5IEhBTF9TV1BNSV9SZWNlaXZlX0lUKCkNCiAgKiBAcGFyYW0gIGhzd3BtaTogU1dQTUkgaGFuZGxlDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1dQTUlfUmVjZWl2ZV9JVChTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWkpDQp7DQogIEhBTF9TdGF0dXNUeXBlRGVmIHN0YXR1cyA9IEhBTF9PSzsNCg0KICBpZigoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9SWCkgfHwgKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFhfUlgpKQ0KICB7DQogICAgKmhzd3BtaS0+cFJ4QnVmZlB0cisrID0gKHVpbnQzMl90KShoc3dwbWktPkluc3RhbmNlLT5SRFIpOw0KDQogICAgaWYoLS1oc3dwbWktPlJ4WGZlckNvdW50ID09IDApDQogICAgew0KICAgICAgLyogV2FpdCBmb3IgUlhCRkYgZmxhZyB0byB1cGRhdGUgc3RhdGUgKi8NCiAgICAgIEhBTF9TV1BNSV9SeENwbHRDYWxsYmFjayhoc3dwbWkpOw0KICAgIH0NCiAgfQ0KICBlbHNlDQogIHsNCiAgICBzdGF0dXMgPSBIQUxfQlVTWTsNCiAgfQ0KDQogIHJldHVybiBzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgV3JhcHMgdXAgcmVjZXB0aW9uIGluIG5vbi1ibG9ja2luZyBtb2RlLg0KICAqIEBwYXJhbSAgaHN3cG1pOiBTV1BNSSBoYW5kbGUNCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTV1BNSV9FbmRSZWNlaXZlX0lUKFNXUE1JX0hhbmRsZVR5cGVEZWYgKmhzd3BtaSkNCnsNCiAgLyogQ2xlYXIgdGhlIFNXUE1JIFJlY2VpdmUgYnVmZmVyIGZ1bGwgRmxhZyAqLw0KICBXUklURV9SRUcoaHN3cG1pLT5JbnN0YW5jZS0+SUNSLCBTV1BNSV9GTEFHX1JYQkZGKTsNCiAgLyogRGlzYWJsZSB0aGUgYWxsIFNXUE1JIFJlY2VpdmUgSW50ZXJydXB0cyAgKi8NCiAgQ0xFQVJfQklUKGhzd3BtaS0+SW5zdGFuY2UtPklFUiwgU1dQTUlfSVRfUklFIHwgU1dQTUlfSVRfUlhCRVJJRSB8IFNXUE1JX0lUX1JYT1ZSSUUgfCBTV1BNSV9JVF9SWEJGSUUpOw0KDQogIC8qIENoZWNrIGlmIGEgdHJhbnNtaXQgUHJvY2VzcyBpcyBvbmdvaW5nIG9yIG5vdCAqLw0KICBpZihoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYX1JYKQ0KICB7DQogICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYOw0KICB9DQogIGVsc2UNCiAgew0KICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfUkVBRFk7DQogIH0NCg0KICByZXR1cm4gSEFMX09LOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFdyYXBzIHVwIHRyYW5zbWlzc2lvbiBhbmQgcmVjZXB0aW9uIGluIG5vbi1ibG9ja2luZyBtb2RlLg0KICAqIEBwYXJhbSAgaHN3cG1pOiBTV1BNSSBoYW5kbGUNCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKiBAcmV0dmFsIEhBTCBzdGF0dXMNCiAgKi8NCnN0YXRpYyBIQUxfU3RhdHVzVHlwZURlZiBTV1BNSV9FbmRUcmFuc21pdFJlY2VpdmVfSVQoU1dQTUlfSGFuZGxlVHlwZURlZiAqaHN3cG1pKQ0Kew0KICAvKiBDbGVhciB0aGUgU1dQTUkgVHJhbnNtaXNzaW9uIENvbXBsZXRlIEZsYWcgKi8NCiAgV1JJVEVfUkVHKGhzd3BtaS0+SW5zdGFuY2UtPklDUiwgU1dQTUlfRkxBR19UQ0YpOw0KICAvKiBEaXNhYmxlIHRoZSBTV1BNSSBUcmFuc21pc3Npb24gIENvbXBsZXRlIEludGVycnVwdCAqLw0KICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+SUVSLCBTV1BNSV9JVF9UQ0lFKTsNCg0KICAvKiBDaGVjayBpZiBhIHJlY2VpdmUgUHJvY2VzcyBpcyBvbmdvaW5nIG9yIG5vdCAqLw0KICBpZihoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYX1JYKQ0KICB7DQogICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZX1JYOw0KICB9DQogIGVsc2UgaWYoaHN3cG1pLT5TdGF0ZSA9PSBIQUxfU1dQTUlfU1RBVEVfQlVTWV9UWCkNCiAgew0KICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfUkVBRFk7DQogIH0NCg0KICByZXR1cm4gSEFMX09LOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgRE1BIFNXUE1JIHRyYW5zbWl0IHByb2Nlc3MgY29tcGxldGUgY2FsbGJhY2suDQogICogQHBhcmFtIGhkbWE6IERNQSBoYW5kbGUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnN0YXRpYyB2b2lkIFNXUE1JX0RNQVRyYW5zbWl0Q3BsdChETUFfSGFuZGxlVHlwZURlZiAqaGRtYSkNCnsNCiAgU1dQTUlfSGFuZGxlVHlwZURlZiogaHN3cG1pID0gKCBTV1BNSV9IYW5kbGVUeXBlRGVmKiApKChETUFfSGFuZGxlVHlwZURlZiogKWhkbWEpLT5QYXJlbnQ7DQogIHVpbnQzMl90IHRpY2tzdGFydCA9IDA7DQoNCiAgLyogRE1BIE5vcm1hbCBtb2RlKi8NCiAgaWYoKGhkbWEtPkluc3RhbmNlLT5DQ1IgJiBETUFfQ0NSX0NJUkMpICE9IFNFVCkNCiAgew0KICAgIGhzd3BtaS0+VHhYZmVyQ291bnQgPSAwOw0KDQogICAgLyogRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0cmFuc21pdCByZXF1ZXN0IGJ5IHNldHRpbmcgdGhlIFRYRE1BIGJpdA0KICAgIGluIHRoZSBTV1BNSSBDUiByZWdpc3RlciAqLw0KICAgIENMRUFSX0JJVChoc3dwbWktPkluc3RhbmNlLT5DUiwgU1dQTUlfQ1JfVFhETUEpOw0KDQogICAgLyogSW5pdCB0aWNrc3RhcnQgZm9yIHRpbWVvdXQgbWFuYWdtZW50Ki8NCiAgICB0aWNrc3RhcnQgPSBIQUxfR2V0VGljaygpOw0KDQogICAgLyogV2FpdCB0aGUgVFhCRUYgKi8NCiAgICBpZihTV1BNSV9XYWl0T25GbGFnU2V0VW50aWxUaW1lb3V0KGhzd3BtaSwgU1dQTUlfRkxBR19UWEJFRiwgdGlja3N0YXJ0LCBTV1BNSV9USU1FT1VUX1ZBTFVFKSAhPSBIQUxfT0spDQogICAgew0KICAgICAgLyogVGltZW91dCBvY2N1cnJlZCAqLw0KICAgICAgSEFMX1NXUE1JX0Vycm9yQ2FsbGJhY2soaHN3cG1pKTsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIC8qIE5vIFRpbWVvdXQgKi8NCiAgICAgIC8qIENoZWNrIGlmIGEgcmVjZWl2ZSBwcm9jZXNzIGlzIG9uZ29pbmcgb3Igbm90ICovDQogICAgICBpZihoc3dwbWktPlN0YXRlID09IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYX1JYKQ0KICAgICAgew0KICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfUlg7DQogICAgICB9DQogICAgICBlbHNlDQogICAgICB7DQogICAgICAgIGhzd3BtaS0+U3RhdGUgPSBIQUxfU1dQTUlfU1RBVEVfUkVBRFk7DQogICAgICB9DQoNCiAgICAgIEhBTF9TV1BNSV9UeENwbHRDYWxsYmFjayhoc3dwbWkpOw0KICAgIH0NCiAgfQ0KICAvKiBETUEgQ2lyY3VsYXIgbW9kZSAqLw0KICBlbHNlDQogIHsNCiAgICBIQUxfU1dQTUlfVHhDcGx0Q2FsbGJhY2soaHN3cG1pKTsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgRE1BIFNXUE1JIHRyYW5zbWl0IHByb2Nlc3MgaGFsZiBjb21wbGV0ZSBjYWxsYmFjay4NCiAgKiBAcGFyYW0gaGRtYSA6IERNQSBoYW5kbGUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnN0YXRpYyB2b2lkIFNXUE1JX0RNQVR4SGFsZkNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpDQp7DQogIFNXUE1JX0hhbmRsZVR5cGVEZWYqIGhzd3BtaSA9IChTV1BNSV9IYW5kbGVUeXBlRGVmKikoKERNQV9IYW5kbGVUeXBlRGVmKiloZG1hKS0+UGFyZW50Ow0KDQogIEhBTF9TV1BNSV9UeEhhbGZDcGx0Q2FsbGJhY2soaHN3cG1pKTsNCn0NCg0KDQovKioNCiAgKiBAYnJpZWYgRE1BIFNXUE1JIHJlY2VpdmUgcHJvY2VzcyBjb21wbGV0ZSBjYWxsYmFjay4NCiAgKiBAcGFyYW0gaGRtYTogRE1BIGhhbmRsZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kc3RhdGljIHZvaWQgU1dQTUlfRE1BUmVjZWl2ZUNwbHQoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpDQp7DQogIFNXUE1JX0hhbmRsZVR5cGVEZWYqIGhzd3BtaSA9ICggU1dQTUlfSGFuZGxlVHlwZURlZiogKSgoRE1BX0hhbmRsZVR5cGVEZWYqICloZG1hKS0+UGFyZW50Ow0KDQogIC8qIERNQSBOb3JtYWwgbW9kZSovDQogIGlmKChoZG1hLT5JbnN0YW5jZS0+Q0NSICYgRE1BX0NDUl9DSVJDKSA9PSBSRVNFVCkNCiAgew0KICAgIGhzd3BtaS0+UnhYZmVyQ291bnQgPSAwOw0KDQogICAgLyogRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciB0aGUgcmVjZWl2ZXIgcmVxdWVzdCBieSBzZXR0aW5nIHRoZSBSWERNQSBiaXQNCiAgICBpbiB0aGUgU1dQTUkgQ1IgcmVnaXN0ZXIgKi8NCiAgICBDTEVBUl9CSVQoaHN3cG1pLT5JbnN0YW5jZS0+Q1IsIFNXUE1JX0NSX1JYRE1BKTsNCg0KICAgIC8qIENoZWNrIGlmIGEgdHJhbnNtaXQgUHJvY2VzcyBpcyBvbmdvaW5nIG9yIG5vdCAqLw0KICAgIGlmKGhzd3BtaS0+U3RhdGUgPT0gSEFMX1NXUE1JX1NUQVRFX0JVU1lfVFhfUlgpDQogICAgew0KICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9CVVNZX1RYOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgaHN3cG1pLT5TdGF0ZSA9IEhBTF9TV1BNSV9TVEFURV9SRUFEWTsNCiAgICB9DQogIH0NCiAgSEFMX1NXUE1JX1J4Q3BsdENhbGxiYWNrKGhzd3BtaSk7DQp9DQoNCi8qKg0KICAqIEBicmllZiBETUEgU1dQTUkgcmVjZWl2ZSBwcm9jZXNzIGhhbGYgY29tcGxldGUgY2FsbGJhY2suDQogICogQHBhcmFtIGhkbWEgOiBETUEgaGFuZGxlDQogICogQHJldHZhbCBOb25lDQogICovDQpzdGF0aWMgdm9pZCBTV1BNSV9ETUFSeEhhbGZDcGx0KERNQV9IYW5kbGVUeXBlRGVmICpoZG1hKQ0Kew0KICBTV1BNSV9IYW5kbGVUeXBlRGVmKiBoc3dwbWkgPSAoU1dQTUlfSGFuZGxlVHlwZURlZiopKChETUFfSGFuZGxlVHlwZURlZiopaGRtYSktPlBhcmVudDsNCg0KICBIQUxfU1dQTUlfUnhIYWxmQ3BsdENhbGxiYWNrKGhzd3BtaSk7DQp9DQoNCi8qKg0KICAqIEBicmllZiBETUEgU1dQTUkgY29tbXVuaWNhdGlvbiBlcnJvciBjYWxsYmFjay4NCiAgKiBAcGFyYW0gaGRtYTogRE1BIGhhbmRsZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kc3RhdGljIHZvaWQgU1dQTUlfRE1BRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpDQp7DQogIFNXUE1JX0hhbmRsZVR5cGVEZWYqIGhzd3BtaSA9ICggU1dQTUlfSGFuZGxlVHlwZURlZiogKSgoRE1BX0hhbmRsZVR5cGVEZWYqICloZG1hKS0+UGFyZW50Ow0KDQogIC8qIFVwZGF0ZSBoYW5kbGUgKi8NCiAgaHN3cG1pLT5SeFhmZXJDb3VudCA9IDA7DQogIGhzd3BtaS0+VHhYZmVyQ291bnQgPSAwOw0KICBoc3dwbWktPlN0YXRlPSBIQUxfU1dQTUlfU1RBVEVfUkVBRFk7DQogIGhzd3BtaS0+RXJyb3JDb2RlIHw9IEhBTF9TV1BNSV9FUlJPUl9ETUE7DQoNCiAgSEFMX1NXUE1JX0Vycm9yQ2FsbGJhY2soaHN3cG1pKTsNCn0NCg0KLyoqDQogICogQGJyaWVmIERNQSBTV1BNSSBjb21tdW5pY2F0aW9uIGFib3J0IGNhbGxiYWNrLg0KICAqIEBwYXJhbSBoZG1hOiBETUEgaGFuZGxlDQogICogQHJldHZhbCBOb25lDQogICovDQpzdGF0aWMgdm9pZCBTV1BNSV9ETUFBYm9ydE9uRXJyb3IoRE1BX0hhbmRsZVR5cGVEZWYgKmhkbWEpDQp7DQogIFNXUE1JX0hhbmRsZVR5cGVEZWYqIGhzd3BtaSA9ICggU1dQTUlfSGFuZGxlVHlwZURlZiogKSgoRE1BX0hhbmRsZVR5cGVEZWYqICloZG1hKS0+UGFyZW50Ow0KDQogIC8qIFVwZGF0ZSBoYW5kbGUgKi8NCiAgaHN3cG1pLT5SeFhmZXJDb3VudCA9IDA7DQogIGhzd3BtaS0+VHhYZmVyQ291bnQgPSAwOw0KICBoc3dwbWktPlN0YXRlPSBIQUxfU1dQTUlfU1RBVEVfUkVBRFk7DQoNCiAgSEFMX1NXUE1JX0Vycm9yQ2FsbGJhY2soaHN3cG1pKTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBIYW5kbGUgU1dQTUkgQ29tbXVuaWNhdGlvbiBUaW1lb3V0Lg0KICAqIEBwYXJhbSAgaHN3cG1pOiBTV1BNSSBoYW5kbGUNCiAgKiBAcGFyYW0gIEZsYWc6IHNwZWNpZmllcyB0aGUgU1dQTUkgZmxhZyB0byBjaGVjay4NCiAgKiBAcGFyYW0gIFRpY2tzdGFydCBUaWNrIHN0YXJ0IHZhbHVlDQogICogQHBhcmFtICBUaW1lb3V0IHRpbWVvdXQgZHVyYXRpb24uDQogICogQHJldHZhbCBIQUwgc3RhdHVzDQogICovDQpzdGF0aWMgSEFMX1N0YXR1c1R5cGVEZWYgU1dQTUlfV2FpdE9uRmxhZ1NldFVudGlsVGltZW91dChTV1BNSV9IYW5kbGVUeXBlRGVmICpoc3dwbWksIHVpbnQzMl90IEZsYWcsIHVpbnQzMl90IFRpY2tzdGFydCwgdWludDMyX3QgVGltZW91dCkNCnsNCiAgSEFMX1N0YXR1c1R5cGVEZWYgc3RhdHVzID0gSEFMX09LOw0KDQogIC8qIFdhaXQgdW50aWwgZmxhZyBpcyBzZXQgKi8NCiAgd2hpbGUoIShIQUxfSVNfQklUX1NFVChoc3dwbWktPkluc3RhbmNlLT5JU1IsIEZsYWcpKSkNCiAgew0KICAgIC8qIENoZWNrIGZvciB0aGUgVGltZW91dCAqLw0KICAgIGlmKFRpbWVvdXQgIT0gSEFMX01BWF9ERUxBWSkNCiAgICB7DQogICAgICBpZigoVGltZW91dCA9PSAwKSB8fCAoKEhBTF9HZXRUaWNrKCktVGlja3N0YXJ0KSA+IFRpbWVvdXQpKQ0KICAgICAgew0KICAgICAgICBoc3dwbWktPlN0YXRlID0gSEFMX1NXUE1JX1NUQVRFX1JFQURZOw0KDQogICAgICAgIHN0YXR1cyA9IEhBTF9USU1FT1VUOw0KICAgICAgICBicmVhazsNCiAgICAgIH0NCiAgICB9DQogIH0NCg0KICByZXR1cm4gc3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQojZW5kaWYgLyogSEFMX1NXUE1JX01PRFVMRV9FTkFCTEVEICovDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQojZW5kaWYgLyogU1RNMzJMNDMxeHggfHwgU1RNMzJMNDMyeHggfHwgU1RNMzJMNDMzeHggfHwgU1RNMzJMNDQyeHggfHwgU1RNMzJMNDQzeHggfHwgKi8NCiAgICAgICAvKiBTVE0zMkw0NzF4eCB8fCBTVE0zMkw0NzV4eCB8fCBTVE0zMkw0NzZ4eCB8fCBTVE0zMkw0ODV4eCB8fCBTVE0zMkw0ODZ4eCB8fCAqLw0KICAgICAgIC8qIFNUTTMyTDQ5Nnh4IHx8IFNUTTMyTDRBNnh4ICovDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovDQo=