LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICogQGZpbGUgICAgIHN5c3RlbV9YTUM0MjAwLmMNCiAqIEBicmllZiAgICBDTVNJUyBDb3J0ZXgtTTQgRGV2aWNlIFBlcmlwaGVyYWwgQWNjZXNzIExheWVyIEhlYWRlciBGaWxlDQogKiAgICAgICAgICAgZm9yIHRoZSBJbmZpbmVvbiBYTUM0MDAwIERldmljZSBTZXJpZXMNCiAqIEB2ZXJzaW9uICBWMy4wLjEgQWxwaGENCiAqIEBkYXRlICAgICAyNi4gU2VwdGVtYmVyIDIwMTINCiAqDQogKiBAbm90ZQ0KICogQ29weXJpZ2h0IChDKSAyMDExIEFSTSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICoNCiAqIEBwYXINCiAqIEFSTSBMaW1pdGVkIChBUk0pIGlzIHN1cHBseWluZyB0aGlzIHNvZnR3YXJlIGZvciB1c2Ugd2l0aCBDb3J0ZXgtTSANCiAqIHByb2Nlc3NvciBiYXNlZCBtaWNyb2NvbnRyb2xsZXJzLiAgVGhpcyBmaWxlIGNhbiBiZSBmcmVlbHkgZGlzdHJpYnV0ZWQgDQogKiB3aXRoaW4gZGV2ZWxvcG1lbnQgdG9vbHMgdGhhdCBhcmUgc3VwcG9ydGluZyBzdWNoIEFSTSBiYXNlZCBwcm9jZXNzb3JzLiANCiAqDQogKiBAcGFyDQogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIuICBOTyBXQVJSQU5USUVTLCBXSEVUSEVSIEVYUFJFU1MsIElNUExJRUQNCiAqIE9SIFNUQVRVVE9SWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElNUExJRUQgV0FSUkFOVElFUyBPRg0KICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUFBMWSBUTyBUSElTIFNPRlRXQVJFLg0KICogQVJNIFNIQUxMIE5PVCwgSU4gQU5ZIENJUkNVTVNUQU5DRVMsIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1INCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUywgRk9SIEFOWSBSRUFTT04gV0hBVFNPRVZFUi4NCiAqDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojaW5jbHVkZSA8c3lzdGVtX1hNQzQyMDAuaD4NCiNpbmNsdWRlIDxYTUM0MjAwLmg+DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBDbG9jayBWYXJpYWJsZSBkZWZpbml0aW9ucw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qITwgU3lzdGVtIENsb2NrIEZyZXF1ZW5jeSAoQ29yZSBDbG9jaykqLw0KdWludDMyX3QgU3lzdGVtQ29yZUNsb2NrOw0KDQovKiBjbG9jayBkZWZpbml0aW9ucywgZG8gbm90IG1vZGlmeSEgKi8NCiNkZWZpbmUgU0NVX0NMT0NLX0NSWVNUQUwgICAgICAgICAgICAgIAkxDQojZGVmaW5lIFNDVV9DTE9DS19CQUNLX1VQX0ZBQ1RPUlkJCSAgIAkyDQojZGVmaW5lIFNDVV9DTE9DS19CQUNLX1VQX0FVVE9NQVRJQwkgICAJMw0KDQoNCiNkZWZpbmUgSElCX0NMT0NLX0ZPU0kJCQkJCTEJCQkJIA0KI2RlZmluZSBISUJfQ0xPQ0tfT1NDVUxQCQkJCTINCg0KDQoNCg0KLyoNCi8vLS0tLS0tLS0gPDw8IFVzZSBDb25maWd1cmF0aW9uIFdpemFyZCBpbiBDb250ZXh0IE1lbnUgPj4+IC0tLS0tLS0tLS0tLS0tLS0tLQ0KKi8NCg0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhdGNoZG9nIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8NCi8vIDxlPiBXYXRjaGRvZyBDb25maWd1cmF0aW9uDQovLyAgICAgPG8xLjA+IERpc2FibGUgV2F0Y2hkb2cNCi8vDQovLyA8L2U+DQoqLw0KI2RlZmluZSBXRFRfU0VUVVAgICAgICAgICAgICAgICAxDQojZGVmaW5lIFdEVEVOQl9uVmFsICAgICAgICAgICAgIDB4MDAwMDAwMDENCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0xPQ0sgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLw0KLy8gPGU+IE1haW4gQ2xvY2sgQ29uZmlndXJhdGlvbg0KLy8gICAgIDxvMS4wLi4xPiBDUFUgY2xvY2sgZGl2aWRlcg0KLy8gICAgICAgICAgICAgICAgICAgICA8MD0+IGZDUFUgPSBmU1lTIA0KLy8gICAgICAgICAgICAgICAgICAgICA8MT0+IGZDUFUgPSBmU1lTIC8gMg0KLy8gICAgIDxvMi4wLi4xPiAgUGVyaXBoZXJhbCBCdXMgY2xvY2sgZGl2aWRlcg0KLy8gICAgICAgICAgICAgICAgICAgICA8MD0+IGZQQgk9IGZDUFUNCi8vICAgICAgICAgICAgICAgICAgICAgPDE9PiBmUEIJPSBmQ1BVIC8gMg0KLy8gICAgIDxvMy4wLi4xPiAgQ0NVIEJ1cyBjbG9jayBkaXZpZGVyDQovLyAgICAgICAgICAgICAgICAgICAgIDwwPT4gZkNDVSA9IGZDUFUNCi8vICAgICAgICAgICAgICAgICAgICAgPDE9PiBmQ0NVID0gZkNQVSAvIDINCi8vDQovLyA8L2U+DQovLyANCiovDQoNCiNkZWZpbmUgU0NVX0NMT0NLX1NFVFVQICAgICAgICAgICAgICAgMQ0KI2RlZmluZQlTQ1VfQ1BVQ0xLQ1JfRElWCQkweDAwMDAwMDAwDQojZGVmaW5lCVNDVV9QQkNMS0NSX0RJVgkJICAgIDB4MDAwMDAwMDANCiNkZWZpbmUJU0NVX0NDVUNMS0NSX0RJVgkJMHgwMDAwMDAwMA0KLyogbm90IGF2YWxpYmxlIGluIGNvbmZpZyB3aXp6YXJkKi8NCi8qCQkJCQ0KKiBtYW5kYXRvcnkgY2xvY2sgcGFyYW1ldGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgkJCQkNCioJCQkJDQoqIHNvdXJjZSBmb3IgY2xvY2sgZ2VuZXJhdGlvbgkJCQkNCiogcmFuZ2U6IFNDVV9DTE9DS19DUllTVEFMIChjcnlzdGFsIG9yIGV4dGVybmFsIGNsb2NrIGF0IGNyeXN0YWwgaW5wdXQpCQkJCQ0KKgkJCQkNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwkJCQkNCi8vIFNlbGVjdGlvbiBvZiBpbXB1dCBsb2NrIGZvciBQTEwJDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiNkZWZpbmUJU0NVX1BMTF9DTE9DS19JTlBVVAlTQ1VfQ0xPQ0tfQ1JZU1RBTA0KLy8jZGVmaW5lCVNDVV9QTExfQ0xPQ0tfSU5QVVQJU0NVX0NMT0NLX0JBQ0tfVVBfRkFDVE9SWQ0KLy8jZGVmaW5lCVNDVV9QTExfQ0xPQ0tfSU5QVVQJU0NVX0NMT0NLX0JBQ0tfVVBfQVVUT01BVElDDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLy8gU3RhbmRieSBjbG9jayBzZWxlY3Rpb24gZm9yIEJhY2t1cCBjbG9jayBzb3VyY2UgdHJpbW1pbmcNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2RlZmluZQlTQ1VfU1RBTkRCWV9DTE9DSyAgSElCX0NMT0NLX09TQ1VMUA0KLy8jZGVmaW5lCVNDVV9TVEFOREJZX0NMT0NLICBISUJfQ0xPQ0tfRk9TSQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8vIEdsb2JhbCBjbG9jayBwYXJhbWV0ZXJzDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiNkZWZpbmUgQ0xPQ0tfRlNZUwkJCQkJCQk4MDAwMDAwMA0KI2RlZmluZQlDTE9DS19DUllTVEFMX0ZSRVFVRU5DWQkxMjAwMDAwMAkJDQojZGVmaW5lCUNMT0NLX0JBQ0tfVVAJCQkJCQkyNDAwMDAwMAkJDQoJCQkJDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qIE9TQ19IUCBzZXR1cCBwYXJhbWV0ZXJzICovCQkJCQ0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQojZGVmaW5lCVNDVV9PU0NfSFBfTU9ERQkweEYwDQojZGVmaW5lCVNDVV9PU0NIUFdER0RJVgkyCQkNCgkJCQkNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLyogTUFJTiBQTEwgc2V0dXAgcGFyYW1ldGVycyAqLwkJCQkNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLy9EaXZpZGVyIHNldHRpbmdzIGZvciBleHRlcm5hbCBjcnlzdGFsIEAgMTIgTUh6IA0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQojZGVmaW5lIAlTQ1VfUExMX0sxRElWCTENCiNkZWZpbmUgCVNDVV9QTExfSzFESVYJMQkJDQojZGVmaW5lIAlTQ1VfUExMX0syRElWCTUJCQ0KI2RlZmluZSAJU0NVX1BMTF9QRElWCTEJCQ0KI2RlZmluZSAJU0NVX1BMTF9ORElWCTc5CQkNCgkJCQkNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLy9EaXZpZGVyIHNldHRpbmdzIGZvciB1c2Ugb2YgYmFja3VwIGNsb2NrIHNvdXJjZSB0cmltbWVkDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8vI2RlZmluZSAJU0NVX1BMTF9LMURJVgkxCQkNCi8vI2RlZmluZSAJU0NVX1BMTF9LMkRJVgk1CQkNCi8vI2RlZmluZSAJU0NVX1BMTF9QRElWCTMJCQ0KLy8jZGVmaW5lIAlTQ1VfUExMX05ESVYJNzkJCQ0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQiBDTE9DSyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8NCi8vIDxlPiBVU0IgQ2xvY2sgQ29uZmlndXJhdGlvbg0KLy8NCi8vIDwvZT4NCi8vIA0KKi8NCg0KI2RlZmluZSBTQ1VfVVNCX0NMT0NLX1NFVFVQICAgICAgICAgICAgICAwDQovKiBub3QgYXZhbGlibGUgaW4gY29uZmlnIHdpenphcmQqLw0KI2RlZmluZSAJU0NVX1VTQlBMTF9QRElWCTAJCQ0KI2RlZmluZSAJU0NVX1VTQlBMTF9ORElWCTMxCQkNCiNkZWZpbmUgCVNDVV9VU0JESVYJMwkJDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZsYXNoIFdhaXQgU3RhdGUgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLw0KLy8gPGU+IEZsYXNoIFdhaXQgU3RhdGUgQ29uZmlndXJhdGlvbg0KLy8gICAgIDxvMS4wLi4zPiAgIEZsYXNoIFdhaXQgU3RhdGUNCi8vICAgICAgICAgICAgICAgICAgICAgPDA9PiAzIFdTDQovLyAgICAgICAgICAgICAgICAgICAgIDwxPT4gNCBXUw0KLy8gICAgICAgICAgICAgICAgICAgICA8Mj0+IDUgV1MgICAgIA0KLy8JCQkJCQkJCQkJIDwzPT4gNiBXUw0KLy8gPC9lPg0KLy8gDQoqLw0KDQojZGVmaW5lIFBNVV9GTEFTSCAgICAgICAgICAgICAxDQojZGVmaW5lCVBNVV9GTEFTSF9XUwkJCQkJMHgwMDAwMDAwMA0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENMT0NLT1VUIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8NCi8vIDxlPiBDbG9jayBPVVQgQ29uZmlndXJhdGlvbg0KLy8gICAgIDxvMS4wLi4xPiAgIENsb2Nrb3V0IFNvdXJjZSBTZWxlY3Rpb24NCi8vICAgICAgICAgICAgICAgICAgICAgPDA9PiBTeXN0ZW0gQ2xvY2sNCi8vICAgICAgICAgICAgICAgICAgICAgPDI9PiBEaXZpZGVkIHZhbHVlIG9mIFVTQiBQTEwgb3V0cHV0DQovLyAgICAgICAgICAgICAgICAgICAgIDwzPT4gRGl2aWRlZCB2YWx1ZSBvZiBQTEwgQ2xvY2sNCi8vICAgICA8bzIuMC4uND4gICBDbG9ja291dCBkaXZpZGVyIDwxLTEwPjwjLTE+DQovLyAgICAgPG8zLjAuLjE+ICAgQ2xvY2tvdXQgUGluIFNlbGVjdGlvbg0KLy8gICAgICAgICAgICAgICAgICAgICA8MD0+IFAxLjE1DQovLyAgICAgICAgICAgICAgICAgICAgIDwxPT4gUDAuOA0KLy8gICAgICAgICAgICAgICAgICAgICANCi8vDQovLyA8L2U+DQovLyANCiovDQoNCiNkZWZpbmUgU0NVX0NMT0NLT1VUX1NFVFVQICAgICAgICAgICAgICAgMA0KI2RlZmluZQlTQ1VfQ0xPQ0tPVVRfU09VUkNFCQkweDAwMDAwMDAwDQojZGVmaW5lCVNDVV9DTE9DS09VVF9ESVYJCTB4MDAwMDAwMDkNCiNkZWZpbmUJU0NVX0NMT0NLT1VUX1BJTgkJMHgwMDAwMDAwMQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgQ2xvY2sgVmFyaWFibGUgZGVmaW5pdGlvbnMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiE8IFN5c3RlbSBDbG9jayBGcmVxdWVuY3kgKENvcmUgQ2xvY2spKi8NCiNpZiBTQ1VfQ0xPQ0tfU0VUVVANCnVpbnQzMl90IFN5c3RlbUNvcmVDbG9jayA9IENMT0NLX0ZTWVM7DQojZWxzZQ0KdWludDMyX3QgU3lzdGVtQ29yZUNsb2NrID0gQ0xPQ0tfQkFDS19VUDsNCiNlbmRpZg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgc3RhdGljIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQojaWYgKFNDVV9DTE9DS19TRVRVUCA9PSAxKQ0Kc3RhdGljIGludCBTeXN0ZW1DbG9ja1NldHVwKHZvaWQpOw0KI2VuZGlmDQoNCiNpZiAoU0NVX1VTQl9DTE9DS19TRVRVUCA9PSAxKQ0Kc3RhdGljIGludCBVU0JDbG9ja1NldHVwKHZvaWQpOw0KI2VuZGlmDQoNCg0KLyoqDQogICogQGJyaWVmICBTZXR1cCB0aGUgbWljcm9jb250cm9sbGVyIHN5c3RlbS4NCiAgKiAgICAgICAgIEluaXRpYWxpemUgdGhlIFBMTCBhbmQgdXBkYXRlIHRoZSANCiAgKiAgICAgICAgIFN5c3RlbUNvcmVDbG9jayB2YXJpYWJsZS4NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgU3lzdGVtSW5pdCh2b2lkKQ0Kew0KaW50IHRlbXA7DQoJDQojaWYgKF9fRlBVX1BSRVNFTlQgPT0gMSkgJiYgKF9fRlBVX1VTRUQgPT0gMSkNClNDQi0+Q1BBQ1IgfD0gKCgzVUwgPDwgMTAqMikgfCAgICAgICAgICAgICAgICAgLyogc2V0IENQMTAgRnVsbCBBY2Nlc3MgKi8NCiAgICAgICAgICAgICAgICgzVUwgPDwgMTEqMikgICk7ICAgICAgICAgICAgICAgLyogc2V0IENQMTEgRnVsbCBBY2Nlc3MgKi8NCiNlbmRpZg0KCQ0KLyogRW5hYmxlIHVuYWxpZ25lZCBtZW1vcnkgYWNjZXNzIC0gU0NCX0NDUi5VTkFMSUdOX1RSUCA9IDAgKi8NClNDQi0+Q0NSICY9IH4oU0NCX0NDUl9VTkFMSUdOX1RSUF9Nc2spOw0KCQ0KLyogU2V0dXAgdGhlIFdEVCAqLw0KI2lmIFdEVF9TRVRVUA0KDQpXRFQtPkNUUiAmPSB+V0RURU5CX25WYWw7IA0KDQojZW5kaWYNCg0KDQovKiBTZXR1cCB0aGUgRmxhc2ggV2FpdCBTdGF0ZSAqLw0KI2lmIFBNVV9GTEFTSA0KdGVtcCA9IEZMQVNIMC0+RkNPTjsgDQp0ZW1wICY9IH5GTEFTSF9GQ09OX1dTUEZMQVNIX01zazsNCnRlbXAgfD0gUE1VX0ZMQVNIX1dTKzM7DQpGTEFTSDAtPkZDT04gPSB0ZW1wOw0KI2VuZGlmDQoNCgkNCi8qIFNldHVwIHRoZSBjbG9ja291dCAqLw0KI2lmIFNDVV9DTE9DS09VVF9TRVRVUA0KDQpTQ1VfQ0xLLT5FWFRDTEtDUgl8PSBTQ1VfQ0xPQ0tPVVRfU09VUkNFOw0KLypzZXQgUExMIGRpdiBmb3IgY2xrb3V0ICovDQpTQ1VfQ0xLLT5FWFRDTEtDUgl8PSBTQ1VfQ0xPQ0tPVVRfRElWPDwxNjsNCg0KaWYgKFNDVV9DTE9DS09VVF9QSU4pIHsNCgkJCQkJCVBPUlQwLT5JT0NSOCA9IDB4MDAwMDAwODg7ICAgLypQMC44IC0tPiBBTFQxIHNlbGVjdCArICBIV1NFTCAqLw0KCQkJCQkgICAgUE9SVDAtPkhXU0VMICY9ICh+UE9SVDBfSFdTRUxfSFc4X01zayk7DQoJCQkJCSAgICBQT1JUMC0+UERSMSAmPSAoflBPUlQwX1BEUjFfUEQ4X01zayk7ICAvKnNldCB0byBzdHJvbmcgZHJpdmVyICovDQoJCQkJCQl9DQplbHNlIHsNCgkJUE9SVDEtPklPQ1IxMiA9IDB4ODgwMDAwMDA7ICAgICAgICAgICAgICAgICAgICAvKlAxLjE1LS0+IEFMVDEgc2VsZWN0ICovDQoJICAgIFBPUlQxLT5QRFIxICY9ICh+UE9SVDFfUERSMV9QRDE1X01zayk7ICAvKnNldCB0byBzdHJvbmcgZHJpdmVyICovDQoJCX0NCg0KI2VuZGlmDQoNCg0KLyogU2V0dXAgdGhlIFN5c3RlbSBjbG9jayAqLyANCiNpZiBTQ1VfQ0xPQ0tfU0VUVVANClN5c3RlbUNsb2NrU2V0dXAoKTsNCiNlbmRpZg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgQ2xvY2sgVmFyaWFibGUgZGVmaW5pdGlvbnMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQpTeXN0ZW1Db3JlQ2xvY2tVcGRhdGUoKTsvKiE8IFN5c3RlbSBDbG9jayBGcmVxdWVuY3kgKENvcmUgQ2xvY2spKi8NCg0KDQovKiBTZXR1cCB0aGUgVVNCIFBMICovIA0KI2lmIFNDVV9VU0JfQ0xPQ0tfU0VUVVANClVTQkNsb2NrU2V0dXAoKTsNCiNlbmRpZg0KDQoNCg0KfQ0KDQoNCi8qKg0KICAqIEBicmllZiAgVXBkYXRlIFN5c3RlbUNvcmVDbG9jayBhY2NvcmRpbmcgdG8gQ2xvY2sgUmVnaXN0ZXIgVmFsdWVzDQogICogQG5vdGUgICAtICANCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgU3lzdGVtQ29yZUNsb2NrVXBkYXRlKHZvaWQpDQp7DQp1bnNpZ25lZCBpbnQgUERJVjsNCnVuc2lnbmVkIGludCBORElWOw0KdW5zaWduZWQgaW50IEsyRElWOw0KdW5zaWduZWQgaW50IGxvbmcgVkNPOw0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBDbG9jayBWYXJpYWJsZSBkZWZpbml0aW9ucw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCmlmIChTQ1VfQ0xLLT5TWVNDTEtDUiA9PSAgMHgwMDAxMDAwMCkNCnsNCglpZiAoU0NVX1BMTC0+UExMU1RBVCAmIFNDVV9QTExfUExMU1RBVF9WQ09MT0NLX01zayl7DQoJCS8qIGNoZWNrIGlmIFBMTCBpcyBsb2NrZWQgKi8NCgkJLyogcmVhZCBiYWNrIGRpdmlkZXIgc2V0dGluZ3MgKi8NCgkJIFBESVYgPSAoKFNDVV9QTEwtPlBMTENPTjEgJiBTQ1VfUExMX1BMTENPTjFfUERJVl9Nc2spPj4yNCkrMTsNCgkJIE5ESVYgPSAoKFNDVV9QTEwtPlBMTENPTjEgJiBTQ1VfUExMX1BMTENPTjFfTkRJVl9Nc2spPj44KSsxOw0KCQkgSzJESVYgID0gKChTQ1VfUExMLT5QTExDT04xICYgU0NVX1BMTF9QTExDT04xX0syRElWX01zayk+PjE2KSsxOw0KDQoJCWlmKFNDVV9QTEwtPlBMTENPTjIgJiBTQ1VfUExMX1BMTENPTjJfUElOU0VMX01zayl7DQoJCS8qIHRoZSBzZWxlY3RlZCBjbG9jayBpcyB0aGUgQmFja3VwIGNsb2NrIGZvZmkgKi8NCgkJVkNPID0gKENMT0NLX0JBQ0tfVVAvUERJVikqTkRJVjsNCgkJU3lzdGVtQ29yZUNsb2NrID0gVkNPL0syRElWOw0KCQkvKiBpbiBjYXNlIHRoZSBzeXNjbG9jayBkaXYgaXMgdXNlZCAqLw0KCQlTeXN0ZW1Db3JlQ2xvY2sgPSBTeXN0ZW1Db3JlQ2xvY2svKChTQ1VfQ0xLLT5TWVNDTEtDUiAmIFNDVV9DTEtfU1lTQ0xLQ1JfU1lTRElWX01zaykrMSk7DQoJCQ0KCQl9DQoJCWVsc2UNCgkJew0KCQkvKiB0aGUgc2VsZWN0ZWQgY2xvY2sgaXMgdGhlIFBMTCBleHRlcm5hbCBvc2NpbGxhdG9yICovCQkNCgkJVkNPID0gKENMT0NLX0NSWVNUQUxfRlJFUVVFTkNZL1BESVYpKk5ESVY7DQoJCVN5c3RlbUNvcmVDbG9jayA9IFZDTy9LMkRJVjsNCgkJLyogaW4gY2FzZSB0aGUgc3lzY2xvY2sgZGl2IGlzIHVzZWQgKi8NCgkJU3lzdGVtQ29yZUNsb2NrID0gU3lzdGVtQ29yZUNsb2NrLygoU0NVX0NMSy0+U1lTQ0xLQ1IgJiBTQ1VfQ0xLX1NZU0NMS0NSX1NZU0RJVl9Nc2spKzEpOw0KCQl9IA0KCQ0KCQ0KCX0NCn0NCmVsc2UNCnsNClN5c3RlbUNvcmVDbG9jayA9IENMT0NLX0JBQ0tfVVA7DQp9DQoNCg0KfQ0KDQoNCi8qKg0KICAqIEBicmllZiAgLQ0KICAqIEBub3RlICAgLSAgDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCBOb25lDQogICovDQojaWYgKFNDVV9DTE9DS19TRVRVUCA9PSAxKQ0Kc3RhdGljIGludCBTeXN0ZW1DbG9ja1NldHVwKHZvaWQpDQp7DQppbnQgdGVtcDsNCnVuc2lnbmVkIGludCBsb25nIFZDTz0wOw0KaW50IHN0ZXBwaW5nX0syRElWOwkNCg0KLyogdGhpcyB3ZWFrIGZ1bmN0aW9uIGVuYWJsZXMgREFWRTMgY2xvY2sgQXBwIHVzYWdlICovCQ0KaWYoQWxsb3dQTExJbml0QnlTdGFydHVwKCkpew0KCSANCi8qIGNoZWNrIGlmIFBMTCBpcyBzd2l0Y2hlZCBvbiAqLw0KaWYgKChTQ1VfUExMLT5QTExDT04wICYoU0NVX1BMTF9QTExDT04wX1ZDT1BXRF9Nc2sgfCBTQ1VfUExMX1BMTENPTjBfUExMUFdEX01zaykpICE9IDApew0KLyogZW5hYmxlIFBMTCBmaXJzdCAqLw0KICBTQ1VfUExMLT5QTExDT04wICY9IH4oU0NVX1BMTF9QTExDT04wX1ZDT1BXRF9Nc2sgfCBTQ1VfUExMX1BMTENPTjBfUExMUFdEX01zayk7DQoNCn0gDQoNCi8qIEVuYWJsZSBPU0NfSFAgaWYgbm90IGFscmVhZHkgb24qLw0KICBpZiAoU0NVX1BMTF9DTE9DS19JTlBVVCA9PSBTQ1VfQ0xPQ0tfQ1JZU1RBTCkNCiAgew0KCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkvKiAgIFVzZSBleHRlcm5hbCBjcnlzdGFsIGZvciBQTEwgY2xvY2sgaW5wdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCiAgIGlmIChTQ1VfT1NDLT5PU0NIUENUUkwgJiBTQ1VfT1NDX09TQ0hQQ1RSTF9NT0RFX01zayl7DQoJICAgU0NVX09TQy0+T1NDSFBDVFJMICY9IH4oU0NVX09TQ19IUF9NT0RFKTsJIC8qZW5hYmxlIHRoZSBPU0NfSFAqLw0KCSAgIC8qIHNldHVwIE9TQyBXREcgZGV2aWRlciAqLw0KCSAgIFNDVV9PU0MtPk9TQ0hQQ1RSTCB8PSAoU0NVX09TQ0hQV0RHRElWPDwxNik7ICAgICAgICAgDQoJICAgLyogc2VsZWN0IGV4dGVybmFsIE9TQyBhcyBQTEwgaW5wdXQgKi8NCgkgICBTQ1VfUExMLT5QTExDT04yICY9IH5TQ1VfUExMX1BMTENPTjJfUElOU0VMX01zazsNCgkgICAvKiByZXN0YXJ0IE9TQyBXYXRjaGRvZyAqLw0KCSAgIFNDVV9QTEwtPlBMTENPTjAgJj0gflNDVV9QTExfUExMQ09OMF9PU0NSRVNfTXNrOyAgDQoNCiAgICAgICAvKiBUaW1lb3V0IGZvciB3YWl0IGxvb3AgfjE1MG1zICovDQoJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCSAgIFN5c1RpY2stPkxPQUQgID0gKCg1MDAwMDAwKzEwMCkgJiBTeXNUaWNrX0xPQURfUkVMT0FEX01zaykgLSAxOy8qIHNldCByZWxvYWQgcmVnaXN0ZXIgKi8NCgkgICBTeXNUaWNrLT5WQUwgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb2FkIHRoZSBTeXNUaWNrIENvdW50ZXIgVmFsdWUgKi8NCgkgICBTeXNUaWNrLT5DVFJMICA9IFN5c1RpY2tfQ1RSTF9DTEtTT1VSQ0VfTXNrIHwNCgkgICAgICAgICAgICAgICAgICAgU3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgU3lzVGljayBJUlEgYW5kIFN5c1RpY2sgVGltZXIgKi8JCSAgDQoJICAgZG8gDQoJICAgew0KICAgICAgIDsvKiB3YWl0IGZvciB+MTUwbXMgICovDQoJICAgfXdoaWxlKCgoKFNDVV9QTEwtPlBMTFNUQVQpICYgKFNDVV9QTExfUExMU1RBVF9QTExIVl9Nc2sgfCBTQ1VfUExMX1BMTFNUQVRfUExMTFZfTXNrIHxTQ1VfUExMX1BMTFNUQVRfUExMU1BfTXNrKSkgIT0gMHgzODApJiYoU3lzVGljay0+VkFMID49IDUwMCkpOyANCg0KCSAgIFN5c1RpY2stPkNUUkwgICY9IH5TeXNUaWNrX0NUUkxfRU5BQkxFX01zazsgICAgICAgICAgICAgICAgIC8qIFN0b3AgU3lzVGljayBUaW1lciAqLw0KCSAgIGlmICgoKFNDVV9QTEwtPlBMTFNUQVQpICYgKFNDVV9QTExfUExMU1RBVF9QTExIVl9Nc2sgfCBTQ1VfUExMX1BMTFNUQVRfUExMTFZfTXNrIHxTQ1VfUExMX1BMTFNUQVRfUExMU1BfTXNrKSkgIT0gMHgzODApDQoJICAgcmV0dXJuKDApOy8qIFJldHVybiBFcnJvciAqLw0KDQogICAgfQ0KICB9DQogIGVsc2UgaWYgKFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0JBQ0tfVVBfRkFDVE9SWSkNCgl7DQoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCS8qICAgVXNlIGZhY3RvcnkgdHJpbW1pbmcgQmFjay11cCBjbG9jayBmb3IgUExMIGNsb2NrIGlucHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQkvKiBQTEwgQmFjayB1cCBjbG9jayBzZWxlY3RlZCAqLw0KCQlTQ1VfUExMLT5QTExDT04yIHw9IFNDVV9QTExfUExMQ09OMl9QSU5TRUxfTXNrOw0KCQkJDQoJfQ0KICBlbHNlIGlmIChTQ1VfUExMX0NMT0NLX0lOUFVUID09IFNDVV9DTE9DS19CQUNLX1VQX0FVVE9NQVRJQykNCiAgew0KCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkvKiAgIFVzZSBhdXRvbWF0aWMgdHJpbW1pbmcgQmFjay11cCBjbG9jayBmb3IgUExMIGNsb2NrIGlucHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCS8qIGNoZWNrIGZvciBISUIgRG9tYWluIGVuYWJsZWQgICovDQoJaWYoKFNDVV9QT1dFUi0+UFdSU1RBVCAmIFNDVV9QT1dFUl9QV1JTVEFUX0hJQkVOX01zaykgPT0gMCkNCgkJU0NVX1BPV0VSLT5QV1JTRVQgfD0gU0NVX1BPV0VSX1BXUlNFVF9ISUJfTXNrOyAvKmVuYWJsZSBIaWJlcm5hdGUgZG9tYWluKi8NCg0KICAgLyogY2hlY2sgZm9yIEhJQiBEb21haW4gaXMgbm90IGluIHJlc2V0IHN0YXRlICAqLw0KCWlmICgoU0NVX1JFU0VULT5SU1RTVEFUICYgU0NVX1JFU0VUX1JTVFNUQVRfSElCUlNfTXNrKT09IDEpDQoJICAgIFNDVV9SRVNFVC0+UlNUQ0xSIHw9IFNDVV9SRVNFVF9SU1RDTFJfSElCUlNfTXNrOyAvKmRlLWFzc2VydCBoaWJlcm5hdGUgcmVzZXQqLw0KDQoJCQkvKiBQTEwgQmFjayB1cCBjbG9jayBzZWxlY3RlZCAqLw0KCQlTQ1VfUExMLT5QTExDT04yIHw9IFNDVV9QTExfUExMQ09OMl9QSU5TRUxfTXNrOw0KCQ0KCQlpZiAoU0NVX1NUQU5EQllfQ0xPQ0sgPT0gSElCX0NMT0NLX0ZPU0kpDQoJCQl7DQoJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkJCS8qICAgVXNlIGZPU0kgYXMgc291cmNlIG9mIHRoZSBzdGFuZGJ5IGNsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCQlTQ1VfSElCRVJOQVRFLT5IRENSICY9IH5TQ1VfSElCRVJOQVRFX0hEQ1JfU1REQllTRUxfTXNrOw0KCQkJDQoJCQlTQ1VfUExMLT5QTExDT04wICY9IH5TQ1VfUExMX1BMTENPTjBfRk9UUl9Nc2s7DQoJCQlmb3IodGVtcD0wO3RlbXA8PTB4RkZGRjt0ZW1wKyspOw0KDQoJCQlTQ1VfUExMLT5QTExDT04wIHw9IFNDVV9QTExfUExMQ09OMF9BT1RSRU5fTXNrOw0KCQkJfQ0KCQllbHNlIGlmIChTQ1VfU1RBTkRCWV9DTE9DSyA9PSBISUJfQ0xPQ0tfT1NDVUxQKQ0KCQkJew0KCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCQkvKiAgIFVzZSBmVUxQIGFzIHNvdXJjZSBvZiB0aGUgc3RhbmRieSBjbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCQkvKmNoZWNrIE9TQ1VMIGlmIHJ1bm5pbmcgY29ycmVjdCovDQoJCQlpZiAoKFNDVV9ISUJFUk5BVEUtPk9TQ1VMQ1RSTCAmIFNDVV9ISUJFUk5BVEVfT1NDVUxDVFJMX01PREVfTXNrKSE9IDApDQoJCQkJew0KCQkJCQl3aGlsZSAoU0NVX0dFTkVSQUwtPk1JUlJTVFMgJiBTQ1VfR0VORVJBTF9NSVJSU1RTX09TQ1VMQ1RSTF9Nc2spOw0KDQoJCQkJCVNDVV9ISUJFUk5BVEUtPk9TQ1VMQ1RSTCAmPSB+U0NVX0hJQkVSTkFURV9PU0NVTENUUkxfTU9ERV9Nc2s7IC8qZW5hYmxlIE9TQ1VMKi8NCgkJCQkJLypub3cgY2VjayBpZiB0aGUgY2xvY2sgaXMgT0sgdXNpbmcgT1NDVUxQIE9zY2lsbGF0b3IgV2F0Y2hkb2cgKFVMUFdERykqLw0KCQkJCQkvKiBzZWxlY3QgT1NDVUwgY2xvY2sgZm9yIFJUQyovDQoJCQkJCVNDVV9ISUJFUk5BVEUtPkhEQ1IgfD0gU0NVX0hJQkVSTkFURV9IRENSX1JDU19Nc2s7DQoJCQkJCXdoaWxlIChTQ1VfR0VORVJBTC0+TUlSUlNUUyAmIFNDVV9HRU5FUkFMX01JUlJTVFNfSERDUl9Nc2spOw0KCQkJCQkvKmVuYWJsZSBPU0NVTFAgV0RHIEFsYXJtIEVuYWJsZSovDQoJCQkJCVNDVV9ISUJFUk5BVEUtPkhEQ1IgfD0gU0NVX0hJQkVSTkFURV9IRENSX1VMUFdER0VOX01zazsNCgkJCQkJd2hpbGUgKFNDVV9HRU5FUkFMLT5NSVJSU1RTICYgU0NVX0dFTkVSQUxfTUlSUlNUU19IRENSX01zayk7DQoJCQkJCS8qd2FpdCBub3cgZm9yIGNsb2NrIGlzIHN0YWJsZSAqLw0KCQkJCQlkbw0KCQkJCQl7DQoJCQkJCVNDVV9ISUJFUk5BVEUtPkhEQ0xSIHw9IFNDVV9ISUJFUk5BVEVfSERDTFJfVUxQV0RHX01zazsNCgkJCQkJd2hpbGUgKFNDVV9HRU5FUkFMLT5NSVJSU1RTICYgU0NVX0dFTkVSQUxfTUlSUlNUU19IRENMUl9Nc2spOw0KCQkJCQlmb3IodGVtcD0wO3RlbXA8PTB4RkZGRjt0ZW1wKyspOw0KCQkJCQl9DQoJCQkJCXdoaWxlICgoU0NVX0hJQkVSTkFURS0+SERTVEFUICYgU0NVX0hJQkVSTkFURV9IRFNUQVRfVUxQV0RHX01zayk9PVNDVV9ISUJFUk5BVEVfSERTVEFUX1VMUFdER19Nc2spOyANCg0KCQkJCQlTQ1VfSElCRVJOQVRFLT5IRENMUiB8PSBTQ1VfSElCRVJOQVRFX0hEQ0xSX1VMUFdER19Nc2s7DQoJCQkJCXdoaWxlIChTQ1VfR0VORVJBTC0+TUlSUlNUUyAmIFNDVV9HRU5FUkFMX01JUlJTVFNfSERDTFJfTXNrKTsNCgkJCQl9CQ0KCQkJLy8gbm93IE9TQ1VMUCBpcyBydW5uaW5nIGFuZCBjYW4gYmUgdXNlZAkgCSANCgkJCVNDVV9ISUJFUk5BVEUtPkhEQ1IgfD0gU0NVX0hJQkVSTkFURV9IRENSX1NUREJZU0VMX01zazsNCgkJCXdoaWxlIChTQ1VfR0VORVJBTC0+TUlSUlNUUyAmIFNDVV9HRU5FUkFMX01JUlJTVFNfSERDUl9Nc2spOw0KCQkJDQoJCQlTQ1VfUExMLT5QTExDT04wICY9IH5TQ1VfUExMX1BMTENPTjBfRk9UUl9Nc2s7DQoJCQkvKlRSSUFMIGZvciBkZWxheSBsb29wKi8NCgkJCWZvcih0ZW1wPTA7dGVtcDw9MHhGRkZGO3RlbXArKyk7DQoJCQkNCgkJCVNDVV9QTEwtPlBMTENPTjAgfD0gU0NVX1BMTF9QTExDT04wX0FPVFJFTl9Nc2s7DQoJCQkvKlRSSUFMIGZvciBkZWxheSBsb29wKi8NCgkJCWZvcih0ZW1wPTA7dGVtcDw9MHhGRkZGO3RlbXArKyk7DQoJCQkNCgkJCX0NCiAgfQ0KDQoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCS8qICAgU2V0dXAgYW5kIGxvb2sgdGhlIG1haW4gUExMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCmlmICghKFNDVV9QTEwtPlBMTFNUQVQgJiBTQ1VfUExMX1BMTFNUQVRfVkNPTE9DS19Nc2spKXsNCgkvKiBTeXN0ZW4gaXMgc3RpbGwgcnVubmluZyBmcm9tIGludGVybmFsIGNsb2NrICovDQoJCSAgIC8qIHNlbGVjdCBGT0ZJIGFzIHN5c3RlbSBjbG9jayAqLw0KCQkgICBpZigoU0NVX0NMSy0+U1lTQ0xLQ1IgJiBTQ1VfQ0xLX1NZU0NMS0NSX1NZU1NFTF9Nc2spICE9IDB4MClTQ1VfQ0xLLT5TWVNDTEtDUiAmPSB+U0NVX0NMS19TWVNDTEtDUl9TWVNTRUxfTXNrOyAvKlNlbGVjdCBGT0ZJKi8NCg0KDQoJCQkgLypjYWx1bGF0aW9uIGZvciBzdGVwcGluZyovDQoJCQkgaWYgKFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0NSWVNUQUwpVkNPID0gKENMT0NLX0NSWVNUQUxfRlJFUVVFTkNZLyhTQ1VfUExMX1BESVYrMSkpKihTQ1VfUExMX05ESVYrMSk7DQoJCQkgaWYgKChTQ1VfUExMX0NMT0NLX0lOUFVUID09IFNDVV9DTE9DS19CQUNLX1VQX0FVVE9NQVRJQykgfHwoU0NVX1BMTF9DTE9DS19JTlBVVCA9PSBTQ1VfQ0xPQ0tfQkFDS19VUF9GQUNUT1JZKSkNCgkJCQkJVkNPID0gKENMT0NLX0JBQ0tfVVAvKFNDVV9QTExfUERJVisxKSkqKFNDVV9QTExfTkRJVisxKTsNCgkgDQoJCQkgc3RlcHBpbmdfSzJESVYgPSAoVkNPLzI0MDAwMDAwKS0xOwkNCgkJCSAvKiBHbyB0byBieXBhc3MgdGhlIE1haW4gUExMICovDQoJCSAgIFNDVV9QTEwtPlBMTENPTjAgfD0gU0NVX1BMTF9QTExDT04wX1ZDT0JZUF9Nc2s7DQoJCSAgIC8qIGRpc2Nvbm5lY3QgT1NDX0hQIHRvIFBMTCAqLw0KCQkgICBTQ1VfUExMLT5QTExDT04wIHw9IFNDVV9QTExfUExMQ09OMF9GSU5ESVNfTXNrOw0KCQkgICAvKiBTZXR1cCBkZXZpZGVyIHNldHRpbmdzIGZvciBtYWluIFBMTCAqLw0KCQkgICBTQ1VfUExMLT5QTExDT04xID0gKChTQ1VfUExMX0sxRElWKSB8IChTQ1VfUExMX05ESVY8PDgpIHwgKHN0ZXBwaW5nX0syRElWPDwxNikgfCAoU0NVX1BMTF9QRElWPDwyNCkpOw0KCQkgICAvKiB3ZSBtYXkgaGF2ZSB0byBzZXQgT1NDRElTQ0RJUyAqLw0KCQkgICBTQ1VfUExMLT5QTExDT04wIHw9IFNDVV9QTExfUExMQ09OMF9PU0NESVNDRElTX01zazsNCgkJICAgLyogY29ubmVjdCBPU0NfSFAgdG8gUExMICovDQoJCSAgIFNDVV9QTEwtPlBMTENPTjAgJj0gflNDVV9QTExfUExMQ09OMF9GSU5ESVNfTXNrOw0KCQkgICAvKiByZXN0YXJ0IFBMTCBMb2NrIGRldGVjdGlvbiAqLw0KCQkgICBTQ1VfUExMLT5QTExDT04wIHw9IFNDVV9QTExfUExMQ09OMF9SRVNMRF9Nc2s7DQoJCSAgIC8qIHdhaXQgZm9yIFBMTCBMb2NrICovDQoJCSAgIC8qIHNldHVwIHRpbWUgb3V0IGxvb3AgKi8NCgkgICAgICAgLyogVGltZW91dCBmb3Igd2FpdCBsb28gfjE1MG1zICovDQoJCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkJICAgU3lzVGljay0+TE9BRCAgPSAoKDUwMDAwMDArMTAwKSAmIFN5c1RpY2tfTE9BRF9SRUxPQURfTXNrKSAtIDE7Lyogc2V0IHJlbG9hZCByZWdpc3RlciAqLw0KCQkgICBTeXNUaWNrLT5WQUwgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb2FkIHRoZSBTeXNUaWNrIENvdW50ZXIgVmFsdWUgKi8NCgkJICAgU3lzVGljay0+Q1RSTCAgPSBTeXNUaWNrX0NUUkxfQ0xLU09VUkNFX01zayB8DQoJCSAgICAgICAgICAgICAgICAgICBTeXNUaWNrX0NUUkxfRU5BQkxFX01zazsgICAgICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBTeXNUaWNrIElSUSBhbmQgU3lzVGljayBUaW1lciAqLwkJICANCgkJICAgDQoJCSAgIHdoaWxlICgoIShTQ1VfUExMLT5QTExTVEFUICYgU0NVX1BMTF9QTExTVEFUX1ZDT0xPQ0tfTXNrKSkmJihTeXNUaWNrLT5WQUwgPj0gNTAwKSk7DQoJICAgICAgIFN5c1RpY2stPkNUUkwgICY9IH5TeXNUaWNrX0NUUkxfRU5BQkxFX01zazsgICAgICAgICAgICAgICAgIC8qIFN0b3AgU3lzVGljayBUaW1lciAqLw0KDQoJCSAgIGlmICgoU0NVX1BMTC0+UExMU1RBVCAmIFNDVV9QTExfUExMU1RBVF9WQ09MT0NLX01zayk9PVNDVV9QTExfUExMU1RBVF9WQ09MT0NLX01zaykNCgkJICAgCQl7DQoJCQkJLyogR28gYmFjayB0byB0aGUgTWFpbiBQTEwgKi8NCgkJCQlTQ1VfUExMLT5QTExDT04wICY9IH5TQ1VfUExMX1BMTENPTjBfVkNPQllQX01zazsNCgkJCQl9DQoJCQkJZWxzZSByZXR1cm4oMCk7DQoJCSANCgkNCgkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoJICAgaGVyZSB3ZSBuZWVkIHRvIHNldHVwIHRoZSBzeXN0ZW0gY2xvY2sgZGl2aWRlcg0KCSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkNCgkJU0NVX0NMSy0+Q1BVQ0xLQ1IgPSBTQ1VfQ1BVQ0xLQ1JfRElWOw0KCQlTQ1VfQ0xLLT5QQkNMS0NSID0gU0NVX1BCQ0xLQ1JfRElWOwkNCgkJU0NVX0NMSy0+Q0NVQ0xLQ1IgPSBTQ1VfQ0NVQ0xLQ1JfRElWOw0KCQ0KDQogIAkJLyogU3dpdGNoIHN5c3RlbSBjbG9jayB0byBQTEwgKi8NCgkgICBTQ1VfQ0xLLT5TWVNDTEtDUiB8PSAgMHgwMDAxMDAwMDsgDQoJCQkJDQoJICAgLyogd2UgbWF5IGhhdmUgdG8gcmVzZXQgT1NDRElTQ0RJUyAqLw0KCSAgIFNDVV9QTEwtPlBMTENPTjAgJj0gflNDVV9QTExfUExMQ09OMF9PU0NESVNDRElTX01zazsNCgkJCQkNCgkJCQkJCQkJCQkJCQkJCQkgIA0KCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkJIC8qIERlbGF5IGZvciBuZXh0IEsyIHN0ZXAgfjUwtXMgKi8NCgkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCSBTeXNUaWNrLT5MT0FEICA9ICgoMTI1MCsxMDApICYgU3lzVGlja19MT0FEX1JFTE9BRF9Nc2spIC0gMTsvKiBzZXQgcmVsb2FkIHJlZ2lzdGVyICovDQoJCSBTeXNUaWNrLT5WQUwgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb2FkIHRoZSBTeXNUaWNrIENvdW50ZXIgVmFsdWUgKi8NCgkJIFN5c1RpY2stPkNUUkwgID0gU3lzVGlja19DVFJMX0NMS1NPVVJDRV9Nc2sgfA0KCQkJCQkJCQkJCSBTeXNUaWNrX0NUUkxfRU5BQkxFX01zazsgICAgICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBTeXNUaWNrIElSUSBhbmQgU3lzVGljayBUaW1lciAqLw0KCQ0KCQkgd2hpbGUgKFN5c1RpY2stPlZBTCA+PSAxMDApOwkJCQkJCQkJICAgLyogd2FpdCBmb3IgfjUwtXMgICovDQoJCSBTeXNUaWNrLT5DVFJMICAmPSB+U3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAvKiBTdG9wIFN5c1RpY2sgVGltZXIgKi8NCgkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCgkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoJICAgaGVyZSB0aGUgcmFtcCB1cCBvZiB0aGUgc3lzdGVtIGNsb2NrIHN0YXJ0cyBGU3lzIDwgNjBNSHoNCgkgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCWlmIChDTE9DS19GU1lTID4gNjAwMDAwMDApew0KCQkJIC8qY2FsdWxhdGlvbiBmb3Igc3RlcHBpbmcqLw0KCQkJIGlmIChTQ1VfUExMX0NMT0NLX0lOUFVUID09IFNDVV9DTE9DS19DUllTVEFMKVZDTyA9IChDTE9DS19DUllTVEFMX0ZSRVFVRU5DWS8oU0NVX1BMTF9QRElWKzEpKSooU0NVX1BMTF9ORElWKzEpOw0KCQkJIGlmICgoU0NVX1BMTF9DTE9DS19JTlBVVCA9PSBTQ1VfQ0xPQ0tfQkFDS19VUF9BVVRPTUFUSUMpIHx8KFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0JBQ0tfVVBfRkFDVE9SWSkpDQoJCQkJCVZDTyA9IChDTE9DS19CQUNLX1VQLyhTQ1VfUExMX1BESVYrMSkpKihTQ1VfUExMX05ESVYrMSk7DQoJIA0KCQkJIHN0ZXBwaW5nX0syRElWID0gKFZDTy82MDAwMDAwMCktMTsJDQoNCgkJCSAvKiBTZXR1cCBkZXZpZGVyIHNldHRpbmdzIGZvciBtYWluIFBMTCAqLw0KCQkJCVNDVV9QTEwtPlBMTENPTjEgPSAoKFNDVV9QTExfSzFESVYpIHwgKFNDVV9QTExfTkRJVjw8OCkgfCAoc3RlcHBpbmdfSzJESVY8PDE2KSB8IChTQ1VfUExMX1BESVY8PDI0KSk7DQoJCSB9DQoJCSBlbHNlDQoJCSB7DQoJCQkJLyogU2V0dXAgZGV2aWRlciBzZXR0aW5ncyBmb3IgbWFpbiBQTEwgKi8NCgkJCQlTQ1VfUExMLT5QTExDT04xID0gKChTQ1VfUExMX0sxRElWKSB8IChTQ1VfUExMX05ESVY8PDgpIHwgKFNDVV9QTExfSzJESVY8PDE2KSB8IChTQ1VfUExMX1BESVY8PDI0KSk7DQoJCSAgICBTQ1VfVFJBUC0+VFJBUENMUiA9IFNDVV9UUkFQX1RSQVBDTFJfU09TQ1dER1RfTXNrIHwgU0NVX1RSQVBfVFJBUENMUl9TVkNPTENLVF9Nc2s7ICAvKiBjbGVhciByZXF1ZXN0IGZvciBTeXN0ZW0gT0NTIFdhdGNoZG9nIFRyYXAgYW5kIFN5c3RlbSBWQ08gTG9jayBUcmFwICAqLw0KCQkJICByZXR1cm4oMSk7DQoJCSB9DQoNCgkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCSAvKiBEZWxheSBmb3IgbmV4dCBLMiBzdGVwIH41MLVzICovDQoJCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCSAgIFN5c1RpY2stPkxPQUQgID0gKCgzMDAwKzEwMCkgJiBTeXNUaWNrX0xPQURfUkVMT0FEX01zaykgLSAxOw0KCSAgIFN5c1RpY2stPlZBTCAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvYWQgdGhlIFN5c1RpY2sgQ291bnRlciBWYWx1ZSAqLw0KCSAgIFN5c1RpY2stPkNUUkwgID0gU3lzVGlja19DVFJMX0NMS1NPVVJDRV9Nc2sgfA0KCSAgICAgICAgICAgICAgICAgICBTeXNUaWNrX0NUUkxfRU5BQkxFX01zazsgICAgICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBTeXNUaWNrIElSUSBhbmQgU3lzVGljayBUaW1lciAqLw0KCQ0KCSAgIHdoaWxlIChTeXNUaWNrLT5WQUwgPj0gMTAwKTsJCQkJCQkJCSAgIC8qIHdhaXQgZm9yIH41MLVzICAqLw0KCSAgIFN5c1RpY2stPkNUUkwgICY9IH5TeXNUaWNrX0NUUkxfRU5BQkxFX01zazsgICAgICAgICAgICAgICAgIC8qIFN0b3AgU3lzVGljayBUaW1lciAqLw0KCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkNCiAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCgkgICBoZXJlIHRoZSByYW1wIHVwIG9mIHRoZSBzeXN0ZW0gY2xvY2sgc3RhcnRzIEZTeXMgPCA5ME1Ieg0KCSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkJaWYgKENMT0NLX0ZTWVMgPiA5MDAwMDAwMCl7DQoJCQkgLypjYWx1bGF0aW9uIGZvciBzdGVwcGluZyovDQoJCQkgaWYgKFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0NSWVNUQUwpVkNPID0gKENMT0NLX0NSWVNUQUxfRlJFUVVFTkNZLyhTQ1VfUExMX1BESVYrMSkpKihTQ1VfUExMX05ESVYrMSk7DQoJCQkgaWYgKChTQ1VfUExMX0NMT0NLX0lOUFVUID09IFNDVV9DTE9DS19CQUNLX1VQX0FVVE9NQVRJQykgfHwoU0NVX1BMTF9DTE9DS19JTlBVVCA9PSBTQ1VfQ0xPQ0tfQkFDS19VUF9GQUNUT1JZKSkNCgkJCQkJVkNPID0gKENMT0NLX0JBQ0tfVVAvKFNDVV9QTExfUERJVisxKSkqKFNDVV9QTExfTkRJVisxKTsNCg0KCQkJIHN0ZXBwaW5nX0syRElWID0gKFZDTy85MDAwMDAwMCktMTsJCQkNCg0KCQkJIC8qIFNldHVwIGRldmlkZXIgc2V0dGluZ3MgZm9yIG1haW4gUExMICovDQoJCQkJU0NVX1BMTC0+UExMQ09OMSA9ICgoU0NVX1BMTF9LMURJVikgfCAoU0NVX1BMTF9ORElWPDw4KSB8IChzdGVwcGluZ19LMkRJVjw8MTYpIHwgKFNDVV9QTExfUERJVjw8MjQpKTsNCgkJIH0NCgkJIGVsc2UNCgkJIHsNCgkJCQkvKiBTZXR1cCBkZXZpZGVyIHNldHRpbmdzIGZvciBtYWluIFBMTCAqLw0KCQkJCVNDVV9QTEwtPlBMTENPTjEgPSAoKFNDVV9QTExfSzFESVYpIHwgKFNDVV9QTExfTkRJVjw8OCkgfCAoU0NVX1BMTF9LMkRJVjw8MTYpIHwgKFNDVV9QTExfUERJVjw8MjQpKTsNCgkgICAgICBTQ1VfVFJBUC0+VFJBUENMUiA9IFNDVV9UUkFQX1RSQVBDTFJfU09TQ1dER1RfTXNrIHwgU0NVX1RSQVBfVFJBUENMUl9TVkNPTENLVF9Nc2s7ICAvKiBjbGVhciByZXF1ZXN0IGZvciBTeXN0ZW0gT0NTIFdhdGNoZG9nIFRyYXAgYW5kIFN5c3RlbSBWQ08gTG9jayBUcmFwICAqLw0KCQkJCXJldHVybigxKTsNCgkJIH0NCgkNCgkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCSAvKiBEZWxheSBmb3IgbmV4dCBLMiBzdGVwIH41MLVzICovDQoJCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCSAgIFN5c1RpY2stPkxPQUQgID0gKCg0ODAwKzEwMCkgJiBTeXNUaWNrX0xPQURfUkVMT0FEX01zaykgLSAxOw0KCSAgIFN5c1RpY2stPlZBTCAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvYWQgdGhlIFN5c1RpY2sgQ291bnRlciBWYWx1ZSAqLw0KCSAgIFN5c1RpY2stPkNUUkwgID0gU3lzVGlja19DVFJMX0NMS1NPVVJDRV9Nc2sgfA0KCSAgICAgICAgICAgICAgICAgICBTeXNUaWNrX0NUUkxfRU5BQkxFX01zazsgICAgICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBTeXNUaWNrIElSUSBhbmQgU3lzVGljayBUaW1lciAqLw0KCQ0KCSAgIHdoaWxlIChTeXNUaWNrLT5WQUwgPj0gMTAwKTsJCQkJCQkJCSAgIC8qIHdhaXQgZm9yIH41MLVzICAqLw0KCSAgIFN5c1RpY2stPkNUUkwgICY9IH5TeXNUaWNrX0NUUkxfRU5BQkxFX01zazsgICAgICAgICAgICAgICAgIC8qIFN0b3AgU3lzVGljayBUaW1lciAqLw0KCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkNCgkgICAvKiBTZXR1cCBkZXZpZGVyIHNldHRpbmdzIGZvciBtYWluIFBMTCAqLw0KCSAgIFNDVV9QTEwtPlBMTENPTjEgPSAoKFNDVV9QTExfSzFESVYpIHwgKFNDVV9QTExfTkRJVjw8OCkgfCAoU0NVX1BMTF9LMkRJVjw8MTYpIHwgKFNDVV9QTExfUERJVjw8MjQpKTsNCgkNCgkgICBTQ1VfVFJBUC0+VFJBUENMUiA9IFNDVV9UUkFQX1RSQVBDTFJfU09TQ1dER1RfTXNrIHwgU0NVX1RSQVBfVFJBUENMUl9TVkNPTENLVF9Nc2s7ICAvKiBjbGVhciByZXF1ZXN0IGZvciBTeXN0ZW0gT0NTIFdhdGNoZG9nIFRyYXAgYW5kIFN5c3RlbSBWQ08gTG9jayBUcmFwICAqLw0KCX0NCiB9LyogZW5kIHRoaXMgd2VhayBmdW5jdGlvbiBlbmFibGVzIERBVkUzIGNsb2NrIEFwcCB1c2FnZSAqLwkNCiAgIHJldHVybigxKTsNCg0KfQ0KI2VuZGlmDQoNCi8qKg0KICAqIEBicmllZiAgLQ0KICAqIEBub3RlICAgLSAgDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCBOb25lDQogICovDQojaWYgKFNDVV9VU0JfQ0xPQ0tfU0VUVVAgPT0gMSkNCnN0YXRpYyBpbnQgVVNCQ2xvY2tTZXR1cCh2b2lkKQ0Kew0KLyogdGhpcyB3ZWFrIGZ1bmN0aW9uIGVuYWJsZXMgREFWRTMgY2xvY2sgQXBwIHVzYWdlICovCQ0KaWYoQWxsb3dQTExJbml0QnlTdGFydHVwKCkpew0KCQ0KLyogY2hlY2sgaWYgUExMIGlzIHN3aXRjaGVkIG9uICovDQppZiAoKFNDVV9QTEwtPlVTQlBMTENPTiAmKFNDVV9QTExfVVNCUExMQ09OX1ZDT1BXRF9Nc2sgfCBTQ1VfUExMX1VTQlBMTENPTl9QTExQV0RfTXNrKSkgIT0gMCl7DQoJLyogZW5hYmxlIFBMTCBmaXJzdCAqLw0KICBTQ1VfUExMLT5VU0JQTExDT04gJj0gfihTQ1VfUExMX1VTQlBMTENPTl9WQ09QV0RfTXNrIHwgU0NVX1BMTF9VU0JQTExDT05fUExMUFdEX01zayk7DQp9DQoNCi8qIGNoZWNrIGFuZCBpZiBub3QgYWxyZWFkeSBydW5uaW5nIGVuYWJsZSBPU0NfSFAgKi8NCiAgIGlmIChTQ1VfT1NDLT5PU0NIUENUUkwgJiBTQ1VfT1NDX09TQ0hQQ1RSTF9NT0RFX01zayl7DQoJCSAvKiBjaGVjayBpZiBNYWluIFBMTCBpcyBzd2l0Y2hlZCBvbiBmb3IgT1NDIFdEKi8NCgkJIGlmICgoU0NVX1BMTC0+UExMQ09OMCAmKFNDVV9QTExfUExMQ09OMF9WQ09QV0RfTXNrIHwgU0NVX1BMTF9QTExDT04wX1BMTFBXRF9Nc2spKSAhPSAwKXsNCgkJCS8qIGVuYWJsZSBQTEwgZmlyc3QgKi8NCiAgCQkJU0NVX1BMTC0+UExMQ09OMCAmPSB+KFNDVV9QTExfUExMQ09OMF9WQ09QV0RfTXNrIHwgU0NVX1BMTF9QTExDT04wX1BMTFBXRF9Nc2spOw0KCQkgfQ0KCSAgIFNDVV9PU0MtPk9TQ0hQQ1RSTCAmPSB+KFNDVV9PU0NfSFBfTU9ERSk7CSAvKmVuYWJsZSB0aGUgT1NDX0hQKi8NCgkgICAvKiBzZXR1cCBPU0MgV0RHIGRldmlkZXIgKi8NCgkgICBTQ1VfT1NDLT5PU0NIUENUUkwgfD0gKFNDVV9PU0NIUFdER0RJVjw8MTYpOyAgICAgICAgIA0KCSAgIC8qIHJlc3RhcnQgT1NDIFdhdGNoZG9nICovDQoJICAgU0NVX1BMTC0+UExMQ09OMCAmPSB+U0NVX1BMTF9QTExDT04wX09TQ1JFU19Nc2s7ICANCgkNCiAgICAgICAvKiBUaW1lb3V0IGZvciB3YWl0IGxvb3AgfjE1MG1zICovDQoJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCSAgIFN5c1RpY2stPkxPQUQgID0gKCg1MDAwMDAwKzEwMCkgJiBTeXNUaWNrX0xPQURfUkVMT0FEX01zaykgLSAxOy8qIHNldCByZWxvYWQgcmVnaXN0ZXIgKi8NCgkgICBTeXNUaWNrLT5WQUwgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb2FkIHRoZSBTeXNUaWNrIENvdW50ZXIgVmFsdWUgKi8NCgkgICBTeXNUaWNrLT5DVFJMICA9IFN5c1RpY2tfQ1RSTF9DTEtTT1VSQ0VfTXNrIHwNCgkgICAgICAgICAgICAgICAgICAgU3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgU3lzVGljayBJUlEgYW5kIFN5c1RpY2sgVGltZXIgKi8JCSAgDQoJICAgZG8gDQoJICAgew0KICAgICAgIDsvKiB3YWl0IGZvciB+MTUwbXMgICovDQoJICAgfXdoaWxlKCgoKFNDVV9QTEwtPlBMTFNUQVQpICYgKFNDVV9QTExfUExMU1RBVF9QTExIVl9Nc2sgfCBTQ1VfUExMX1BMTFNUQVRfUExMTFZfTXNrIHxTQ1VfUExMX1BMTFNUQVRfUExMU1BfTXNrKSkgIT0gMHgzODApJiYoU3lzVGljay0+VkFMID49IDUwMCkpOyANCg0KCSAgIFN5c1RpY2stPkNUUkwgICY9IH5TeXNUaWNrX0NUUkxfRU5BQkxFX01zazsgICAgICAgICAgICAgICAgIC8qIFN0b3AgU3lzVGljayBUaW1lciAqLw0KCSAgIGlmICgoKFNDVV9QTEwtPlBMTFNUQVQpICYgKFNDVV9QTExfUExMU1RBVF9QTExIVl9Nc2sgfCBTQ1VfUExMX1BMTFNUQVRfUExMTFZfTXNrIHxTQ1VfUExMX1BMTFNUQVRfUExMU1BfTXNrKSkgIT0gMHgzODApDQoJICAgcmV0dXJuKDApOy8qIFJldHVybiBFcnJvciAqLw0KCQ0KICB9DQoNCg0KLyogU2V0dXAgVVNCIFBMTCAqLw0KICAgLyogR28gdG8gYnlwYXNzIHRoZSBNYWluIFBMTCAqLw0KICAgU0NVX1BMTC0+VVNCUExMQ09OIHw9IFNDVV9QTExfVVNCUExMQ09OX1ZDT0JZUF9Nc2s7DQogICAvKiBkaXNjb25uZWN0IE9TQ19GSSB0byBQTEwgKi8NCiAgIFNDVV9QTEwtPlVTQlBMTENPTiB8PSBTQ1VfUExMX1VTQlBMTENPTl9GSU5ESVNfTXNrOw0KICAgLyogU2V0dXAgZGV2aWRlciBzZXR0aW5ncyBmb3IgbWFpbiBQTEwgKi8NCiAgIFNDVV9QTEwtPlVTQlBMTENPTiA9ICgoU0NVX1VTQlBMTF9ORElWPDw4KSB8IChTQ1VfVVNCUExMX1BESVY8PDI0KSk7DQogICAvKiBTZXR1cCBVU0JESVYgc2V0dGluZ3MgVVNCIGNsb2NrICovDQogICBTQ1VfQ0xLLT5VU0JDTEtDUiA9IFNDVV9VU0JESVY7DQogICAvKiB3ZSBtYXkgaGF2ZSB0byBzZXQgT1NDRElTQ0RJUyAqLw0KICAgU0NVX1BMTC0+VVNCUExMQ09OIHw9IFNDVV9QTExfVVNCUExMQ09OX09TQ0RJU0NESVNfTXNrOw0KICAgLyogY29ubmVjdCBPU0NfRkkgdG8gUExMICovDQogICBTQ1VfUExMLT5VU0JQTExDT04gJj0gflNDVV9QTExfVVNCUExMQ09OX0ZJTkRJU19Nc2s7DQogICAvKiByZXN0YXJ0IFBMTCBMb2NrIGRldGVjdGlvbiAqLw0KICAgU0NVX1BMTC0+VVNCUExMQ09OIHw9IFNDVV9QTExfVVNCUExMQ09OX1JFU0xEX01zazsNCiAgIC8qIHdhaXQgZm9yIFBMTCBMb2NrICovDQogICB3aGlsZSAoIShTQ1VfUExMLT5VU0JQTExTVEFUICYgU0NVX1BMTF9VU0JQTExTVEFUX1ZDT0xPQ0tfTXNrKSk7DQogICANCiB9LyogZW5kIHRoaXMgd2VhayBmdW5jdGlvbiBlbmFibGVzIERBVkUzIGNsb2NrIEFwcCB1c2FnZSAqLwkNCiAgIHJldHVybigxKTsNCg0KfQ0KI2VuZGlmDQoNCg==