LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLy8qKg0KICogQGZpbGUgICAgIHN5c3RlbV9YTUM0NTAwLmMNCiAqIEBicmllZiAgICBDTVNJUyBDb3J0ZXgtTTQgRGV2aWNlIFBlcmlwaGVyYWwgQWNjZXNzIExheWVyIEhlYWRlciBGaWxlDQogKiAgICAgICAgICAgZm9yIHRoZSBJbmZpbmVvbiBYTUM0NTAwIERldmljZSBTZXJpZXMNCiAqIEB2ZXJzaW9uICBWMy4wLjEgQWxwaGENCiAqIEBkYXRlICAgICAxNy4gU2VwdGVtYmVyIDIwMTINCiAqDQogKiBAbm90ZQ0KICogQ29weXJpZ2h0IChDKSAyMDExIEFSTSBMaW1pdGVkLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KICoNCiAqIEBwYXINCiAqIEFSTSBMaW1pdGVkIChBUk0pIGlzIHN1cHBseWluZyB0aGlzIHNvZnR3YXJlIGZvciB1c2Ugd2l0aCBDb3J0ZXgtTSANCiAqIHByb2Nlc3NvciBiYXNlZCBtaWNyb2NvbnRyb2xsZXJzLiAgVGhpcyBmaWxlIGNhbiBiZSBmcmVlbHkgZGlzdHJpYnV0ZWQgDQogKiB3aXRoaW4gZGV2ZWxvcG1lbnQgdG9vbHMgdGhhdCBhcmUgc3VwcG9ydGluZyBzdWNoIEFSTSBiYXNlZCBwcm9jZXNzb3JzLiANCiAqDQogKiBAcGFyDQogKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIuICBOTyBXQVJSQU5USUVTLCBXSEVUSEVSIEVYUFJFU1MsIElNUExJRUQNCiAqIE9SIFNUQVRVVE9SWSwgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIElNUExJRUQgV0FSUkFOVElFUyBPRg0KICogTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUFBMWSBUTyBUSElTIFNPRlRXQVJFLg0KICogQVJNIFNIQUxMIE5PVCwgSU4gQU5ZIENJUkNVTVNUQU5DRVMsIEJFIExJQUJMRSBGT1IgU1BFQ0lBTCwgSU5DSURFTlRBTCwgT1INCiAqIENPTlNFUVVFTlRJQUwgREFNQUdFUywgRk9SIEFOWSBSRUFTT04gV0hBVFNPRVZFUi4NCiAqDQogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQojaW5jbHVkZSAic3lzdGVtX1hNQzQ1MDAuaCINCiNpbmNsdWRlIDxYTUM0NTAwLmg+DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KICBDbG9jayBWYXJpYWJsZSBkZWZpbml0aW9ucw0KICotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qITwgU3lzdGVtIENsb2NrIEZyZXF1ZW5jeSAoQ29yZSBDbG9jaykqLw0KdWludDMyX3QgU3lzdGVtQ29yZUNsb2NrOw0KDQovKiBjbG9jayBkZWZpbml0aW9ucywgZG8gbm90IG1vZGlmeSEgKi8NCiNkZWZpbmUgU0NVX0NMT0NLX0NSWVNUQUwgICAgICAgICAgICAgIAkxDQojZGVmaW5lIFNDVV9DTE9DS19CQUNLX1VQX0ZBQ1RPUlkJCSAgIAkyDQojZGVmaW5lIFNDVV9DTE9DS19CQUNLX1VQX0FVVE9NQVRJQwkgICAJMw0KDQoNCiNkZWZpbmUgSElCX0NMT0NLX0ZPU0kJCQkJCTEJCQkJIA0KI2RlZmluZSBISUJfQ0xPQ0tfT1NDVUxQCQkJCTINCg0KDQoNCg0KLyoNCi8vLS0tLS0tLS0gPDw8IFVzZSBDb25maWd1cmF0aW9uIFdpemFyZCBpbiBDb250ZXh0IE1lbnUgPj4+IC0tLS0tLS0tLS0tLS0tLS0tLQ0KKi8NCg0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFdhdGNoZG9nIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8NCi8vIDxlPiBXYXRjaGRvZyBDb25maWd1cmF0aW9uDQovLyAgICAgPG8xLjA+IERpc2FibGUgV2F0Y2hkb2cNCi8vDQovLyA8L2U+DQoqLw0KI2RlZmluZSBXRFRfU0VUVVAgICAgICAgICAgICAgICAxDQojZGVmaW5lIFdEVEVOQl9uVmFsICAgICAgICAgICAgIDB4MDAwMDAwMDENCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0gQ0xPQ0sgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLw0KLy8gPGU+IE1haW4gQ2xvY2sgQ29uZmlndXJhdGlvbg0KLy8gICAgIDxvMS4wLi4xPiBDUFUgY2xvY2sgZGl2aWRlcg0KLy8gICAgICAgICAgICAgICAgICAgICA8MD0+IGZDUFUgPSBmU1lTIA0KLy8gICAgICAgICAgICAgICAgICAgICA8MT0+IGZDUFUgPSBmU1lTIC8gMg0KLy8gICAgIDxvMi4wLi4xPiAgUGVyaXBoZXJhbCBCdXMgY2xvY2sgZGl2aWRlcg0KLy8gICAgICAgICAgICAgICAgICAgICA8MD0+IGZQQgk9IGZDUFUNCi8vICAgICAgICAgICAgICAgICAgICAgPDE9PiBmUEIJPSBmQ1BVIC8gMg0KLy8gICAgIDxvMy4wLi4xPiAgQ0NVIEJ1cyBjbG9jayBkaXZpZGVyDQovLyAgICAgICAgICAgICAgICAgICAgIDwwPT4gZkNDVSA9IGZDUFUNCi8vICAgICAgICAgICAgICAgICAgICAgPDE9PiBmQ0NVID0gZkNQVSAvIDINCi8vDQovLyA8L2U+DQovLyANCiovDQoNCiNkZWZpbmUgU0NVX0NMT0NLX1NFVFVQICAgICAgICAgICAgICAgMQ0KI2RlZmluZQlTQ1VfQ1BVQ0xLQ1JfRElWCQkweDAwMDAwMDAwDQojZGVmaW5lCVNDVV9QQkNMS0NSX0RJVgkJICAgIDB4MDAwMDAwMDANCiNkZWZpbmUJU0NVX0NDVUNMS0NSX0RJVgkJMHgwMDAwMDAwMA0KLyogbm90IGF2YWxpYmxlIGluIGNvbmZpZyB3aXp6YXJkKi8NCi8qCQkJCQ0KKiBtYW5kYXRvcnkgY2xvY2sgcGFyYW1ldGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgkJCQkNCioJCQkJDQoqIHNvdXJjZSBmb3IgY2xvY2sgZ2VuZXJhdGlvbgkJCQkNCiogcmFuZ2U6IFNDVV9DTE9DS19DUllTVEFMIChjcnlzdGFsIG9yIGV4dGVybmFsIGNsb2NrIGF0IGNyeXN0YWwgaW5wdXQpCQkJCQ0KKgkJCQkNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwkJCQkNCi8vIFNlbGVjdGlvbiBvZiBpbXB1dCBsb2NrIGZvciBQTEwJCQkJDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiNkZWZpbmUJU0NVX1BMTF9DTE9DS19JTlBVVAlTQ1VfQ0xPQ0tfQ1JZU1RBTA0KLy8jZGVmaW5lCVNDVV9QTExfQ0xPQ0tfSU5QVVQJU0NVX0NMT0NLX0JBQ0tfVVBfRkFDVE9SWQ0KLy8jZGVmaW5lCVNDVV9QTExfQ0xPQ0tfSU5QVVQJU0NVX0NMT0NLX0JBQ0tfVVBfQVVUT01BVElDDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLy8gU3RhbmRieSBjbG9jayBzZWxlY3Rpb24gZm9yIEJhY2t1cCBjbG9jayBzb3VyY2UgdHJpbW1pbmcNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2RlZmluZQlTQ1VfU1RBTkRCWV9DTE9DSyAgSElCX0NMT0NLX09TQ1VMUA0KLy8jZGVmaW5lCVNDVV9TVEFOREJZX0NMT0NLICBISUJfQ0xPQ0tfRk9TSQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8vIEdsb2JhbCBjbG9jayBwYXJhbWV0ZXJzDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCiNkZWZpbmUgQ0xPQ0tfRlNZUwkJCQkJCQkxMjAwMDAwMDANCiNkZWZpbmUJQ0xPQ0tfQ1JZU1RBTF9GUkVRVUVOQ1kJMTIwMDAwMDAJCQ0KI2RlZmluZQlDTE9DS19CQUNLX1VQCQkJCQkJMjQwMDAwMDAJCQ0KCQkJCQ0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQovKiBPU0NfSFAgc2V0dXAgcGFyYW1ldGVycyAqLwkJCQkNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2RlZmluZQlTQ1VfT1NDX0hQX01PREUJMHhGMA0KI2RlZmluZQlTQ1VfT1NDSFBXREdESVYJMgkJDQoJCQkJDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8qIE1BSU4gUExMIHNldHVwIHBhcmFtZXRlcnMgKi8JCQkJDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8vRGl2aWRlciBzZXR0aW5ncyBmb3IgZXh0ZXJuYWwgY3J5c3RhbCBAIDEyIE1IeiANCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KI2RlZmluZSAJU0NVX1BMTF9LMURJVgkxDQojZGVmaW5lIAlTQ1VfUExMX0syRElWCTMNCiNkZWZpbmUgCVNDVV9QTExfUERJVgkxDQojZGVmaW5lIAlTQ1VfUExMX05ESVYJNzkNCgkJCQkNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KLy9EaXZpZGVyIHNldHRpbmdzIGZvciB1c2Ugb2YgYmFja3VwIGNsb2NrIHNvdXJjZSB0cmltbWVkDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCi8vI2RlZmluZSAJU0NVX1BMTF9LMURJVgkxCQkNCi8vI2RlZmluZSAJU0NVX1BMTF9LMkRJVgkzCQkNCi8vI2RlZmluZSAJU0NVX1BMTF9QRElWCTMJCQ0KLy8jZGVmaW5lIAlTQ1VfUExMX05ESVYJNzkJCQ0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQiBDTE9DSyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8NCi8vIDxlPiBVU0IgQ2xvY2sgQ29uZmlndXJhdGlvbg0KLy8NCi8vIDwvZT4NCi8vIA0KKi8NCg0KI2RlZmluZSBTQ1VfVVNCX0NMT0NLX1NFVFVQICAgICAgICAgICAgICAwDQovKiBub3QgYXZhbGlibGUgaW4gY29uZmlnIHdpenphcmQqLw0KI2RlZmluZSAJU0NVX1VTQlBMTF9QRElWCTAJCQ0KI2RlZmluZSAJU0NVX1VTQlBMTF9ORElWCTMxCQkNCiNkZWZpbmUgCVNDVV9VU0JESVYJMwkJDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEZsYXNoIFdhaXQgU3RhdGUgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQovLw0KLy8gPGU+IEZsYXNoIFdhaXQgU3RhdGUgQ29uZmlndXJhdGlvbg0KLy8gICAgIDxvMS4wLi4zPiAgIEZsYXNoIFdhaXQgU3RhdGUNCi8vICAgICAgICAgICAgICAgICAgICAgPDA9PiAzIFdTDQovLyAgICAgICAgICAgICAgICAgICAgIDwxPT4gNCBXUw0KLy8gICAgICAgICAgICAgICAgICAgICA8Mj0+IDUgV1MgICAgIA0KLy8JCQkJCQkJCQkJIDwzPT4gNiBXUw0KLy8gPC9lPg0KLy8gDQoqLw0KDQojZGVmaW5lIFBNVV9GTEFTSCAgICAgICAgICAgICAxDQojZGVmaW5lCVBNVV9GTEFTSF9XUwkJCQkJMHgwMDAwMDAwMA0KDQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tIENMT0NLT1VUIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLy8NCi8vIDxlPiBDbG9jayBPVVQgQ29uZmlndXJhdGlvbg0KLy8gICAgIDxvMS4wLi4xPiAgIENsb2Nrb3V0IFNvdXJjZSBTZWxlY3Rpb24NCi8vICAgICAgICAgICAgICAgICAgICAgPDA9PiBTeXN0ZW0gQ2xvY2sNCi8vICAgICAgICAgICAgICAgICAgICAgPDI9PiBEaXZpZGVkIHZhbHVlIG9mIFVTQiBQTEwgb3V0cHV0DQovLyAgICAgICAgICAgICAgICAgICAgIDwzPT4gRGl2aWRlZCB2YWx1ZSBvZiBQTEwgQ2xvY2sNCi8vICAgICA8bzIuMC4uND4gICBDbG9ja291dCBkaXZpZGVyIDwxLTEwPjwjLTE+DQovLyAgICAgPG8zLjAuLjE+ICAgQ2xvY2tvdXQgUGluIFNlbGVjdGlvbg0KLy8gICAgICAgICAgICAgICAgICAgICA8MD0+IFAxLjE1DQovLyAgICAgICAgICAgICAgICAgICAgIDwxPT4gUDAuOA0KLy8gICAgICAgICAgICAgICAgICAgICANCi8vDQovLyA8L2U+DQovLyANCiovDQoNCiNkZWZpbmUgU0NVX0NMT0NLT1VUX1NFVFVQICAgICAgICAgICAgICAgMA0KI2RlZmluZQlTQ1VfQ0xPQ0tPVVRfU09VUkNFCQkweDAwMDAwMDAzDQojZGVmaW5lCVNDVV9DTE9DS09VVF9ESVYJCTB4MDAwMDAwMDkNCiNkZWZpbmUJU0NVX0NMT0NLT1VUX1BJTgkJMHgwMDAwMDAwMQ0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgQ2xvY2sgVmFyaWFibGUgZGVmaW5pdGlvbnMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiE8IFN5c3RlbSBDbG9jayBGcmVxdWVuY3kgKENvcmUgQ2xvY2spKi8NCiNpZiBTQ1VfQ0xPQ0tfU0VUVVANCnVpbnQzMl90IFN5c3RlbUNvcmVDbG9jayA9IENMT0NLX0ZTWVM7DQojZWxzZQ0KdWludDMyX3QgU3lzdGVtQ29yZUNsb2NrID0gQ0xPQ0tfQkFDS19VUDsNCiNlbmRpZg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgc3RhdGljIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQojaWYgKFNDVV9DTE9DS19TRVRVUCA9PSAxKQ0Kc3RhdGljIGludCBTeXN0ZW1DbG9ja1NldHVwKHZvaWQpOw0KI2VuZGlmDQoNCiNpZiAoU0NVX1VTQl9DTE9DS19TRVRVUCA9PSAxKQ0Kc3RhdGljIGludCBVU0JDbG9ja1NldHVwKHZvaWQpOw0KI2VuZGlmDQoNCg0KLyoqDQogICogQGJyaWVmICBTZXR1cCB0aGUgbWljcm9jb250cm9sbGVyIHN5c3RlbS4NCiAgKiAgICAgICAgIEluaXRpYWxpemUgdGhlIFBMTCBhbmQgdXBkYXRlIHRoZSANCiAgKiAgICAgICAgIFN5c3RlbUNvcmVDbG9jayB2YXJpYWJsZS4NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgU3lzdGVtSW5pdCh2b2lkKQ0Kew0KaW50IHRlbXA7DQoJDQojaWYgKF9fRlBVX1BSRVNFTlQgPT0gMSkgJiYgKF9fRlBVX1VTRUQgPT0gMSkNClNDQi0+Q1BBQ1IgfD0gKCgzVUwgPDwgMTAqMikgfCAgICAgICAgICAgICAgICAgLyogc2V0IENQMTAgRnVsbCBBY2Nlc3MgKi8NCiAgICAgICAgICAgICAgICgzVUwgPDwgMTEqMikgICk7ICAgICAgICAgICAgICAgLyogc2V0IENQMTEgRnVsbCBBY2Nlc3MgKi8NCiNlbmRpZg0KDQovKiBFbmFibGUgdW5hbGlnbmVkIG1lbW9yeSBhY2Nlc3MgLSBTQ0JfQ0NSLlVOQUxJR05fVFJQID0gMCAqLw0KU0NCLT5DQ1IgJj0gfihTQ0JfQ0NSX1VOQUxJR05fVFJQX01zayk7DQoJDQovKiBTZXR1cCB0aGUgV0RUICovDQojaWYgV0RUX1NFVFVQDQoNCldEVC0+Q1RSICY9IH5XRFRFTkJfblZhbDsgDQoNCiNlbmRpZg0KDQovKiBTZXR1cCB0aGUgRmxhc2ggV2FpdCBTdGF0ZSAqLw0KI2lmIFBNVV9GTEFTSA0KdGVtcCA9IEZMQVNIMC0+RkNPTjsgDQp0ZW1wICY9IH5GTEFTSF9GQ09OX1dTUEZMQVNIX01zazsNCnRlbXAgfD0gUE1VX0ZMQVNIX1dTKzM7DQpGTEFTSDAtPkZDT04gPSB0ZW1wOw0KI2VuZGlmDQoNCgkNCi8qIFNldHVwIHRoZSBjbG9ja291dCAqLw0KI2lmIFNDVV9DTE9DS09VVF9TRVRVUA0KDQpTQ1VfQ0xLLT5FWFRDTEtDUgl8PSBTQ1VfQ0xPQ0tPVVRfU09VUkNFOw0KLypzZXQgUExMIGRpdiBmb3IgY2xrb3V0ICovDQpTQ1VfQ0xLLT5FWFRDTEtDUgl8PSBTQ1VfQ0xPQ0tPVVRfRElWPDwxNjsNCg0KaWYgKFNDVV9DTE9DS09VVF9QSU4pIHsNCgkJCQkJCVBPUlQwLT5JT0NSOCA9IDB4MDAwMDAwODg7ICAgLypQMC44IC0tPiBBTFQxIHNlbGVjdCArICBIV1NFTCAqLw0KCQkJCQkgICAgUE9SVDAtPkhXU0VMICY9ICh+UE9SVDBfSFdTRUxfSFc4X01zayk7DQoJCQkJCSAgICAvL1BPUlQwLT5QRFIxICY9ICh+UE9SVDBfUERSMV9QRDhfTXNrKTsgIC8qc2V0IHRvIHN0cm9uZyBkcml2ZXIgKi8NCgkJCQkJCX0NCmVsc2Ugew0KCQlQT1JUMS0+SU9DUjEyID0gMHg4ODAwMDAwMDsgICAgICAgICAgICAgICAgICAgIC8qUDEuMTUtLT4gQUxUMSBzZWxlY3QgKi8NCgkgICAgLy9QT1JUMS0+UERSMSAmPSAoflBPUlQxX1BEUjFfUEQxNV9Nc2spOyAgLypzZXQgdG8gc3Ryb25nIGRyaXZlciAqLw0KCQl9DQoNCiNlbmRpZg0KDQoNCi8qIFNldHVwIHRoZSBTeXN0ZW0gY2xvY2sgKi8gDQojaWYgU0NVX0NMT0NLX1NFVFVQDQpTeXN0ZW1DbG9ja1NldHVwKCk7DQojZW5kaWYNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQogIENsb2NrIFZhcmlhYmxlIGRlZmluaXRpb25zDQogKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KU3lzdGVtQ29yZUNsb2NrVXBkYXRlKCk7LyohPCBTeXN0ZW0gQ2xvY2sgRnJlcXVlbmN5IChDb3JlIENsb2NrKSovDQoNCg0KLyogU2V0dXAgdGhlIFVTQiBQTCAqLyANCiNpZiBTQ1VfVVNCX0NMT0NLX1NFVFVQDQpVU0JDbG9ja1NldHVwKCk7DQojZW5kaWYNCg0KDQoNCn0NCg0KDQovKioNCiAgKiBAYnJpZWYgIFVwZGF0ZSBTeXN0ZW1Db3JlQ2xvY2sgYWNjb3JkaW5nIHRvIENsb2NrIFJlZ2lzdGVyIFZhbHVlcw0KICAqIEBub3RlICAgLSAgDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFN5c3RlbUNvcmVDbG9ja1VwZGF0ZSh2b2lkKQ0Kew0KdW5zaWduZWQgaW50IFBESVY7DQp1bnNpZ25lZCBpbnQgTkRJVjsNCnVuc2lnbmVkIGludCBLMkRJVjsNCnVuc2lnbmVkIGludCBsb25nIFZDTzsNCg0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCiAgQ2xvY2sgVmFyaWFibGUgZGVmaW5pdGlvbnMNCiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQppZiAoU0NVX0NMSy0+U1lTQ0xLQ1IgPT0gIDB4MDAwMTAwMDApDQp7DQoJaWYgKFNDVV9QTEwtPlBMTFNUQVQgJiBTQ1VfUExMX1BMTFNUQVRfVkNPTE9DS19Nc2spew0KCQkvKiBjaGVjayBpZiBQTEwgaXMgbG9ja2VkICovDQoJCS8qIHJlYWQgYmFjayBkaXZpZGVyIHNldHRpbmdzICovDQoJCSBQRElWID0gKChTQ1VfUExMLT5QTExDT04xICYgU0NVX1BMTF9QTExDT04xX1BESVZfTXNrKT4+MjQpKzE7DQoJCSBORElWID0gKChTQ1VfUExMLT5QTExDT04xICYgU0NVX1BMTF9QTExDT04xX05ESVZfTXNrKT4+OCkrMTsNCgkJIEsyRElWICA9ICgoU0NVX1BMTC0+UExMQ09OMSAmIFNDVV9QTExfUExMQ09OMV9LMkRJVl9Nc2spPj4xNikrMTsNCg0KCQlpZihTQ1VfUExMLT5QTExDT04yICYgU0NVX1BMTF9QTExDT04yX1BJTlNFTF9Nc2spew0KCQkvKiB0aGUgc2VsZWN0ZWQgY2xvY2sgaXMgdGhlIEJhY2t1cCBjbG9jayBmb2ZpICovDQoJCVZDTyA9IChDTE9DS19CQUNLX1VQL1BESVYpKk5ESVY7DQoJCVN5c3RlbUNvcmVDbG9jayA9IFZDTy9LMkRJVjsNCgkJLyogaW4gY2FzZSB0aGUgc3lzY2xvY2sgZGl2IGlzIHVzZWQgKi8NCgkJU3lzdGVtQ29yZUNsb2NrID0gU3lzdGVtQ29yZUNsb2NrLygoU0NVX0NMSy0+U1lTQ0xLQ1IgJiBTQ1VfQ0xLX1NZU0NMS0NSX1NZU0RJVl9Nc2spKzEpOw0KCQkNCgkJfQ0KCQllbHNlDQoJCXsNCgkJLyogdGhlIHNlbGVjdGVkIGNsb2NrIGlzIHRoZSBQTEwgZXh0ZXJuYWwgb3NjaWxsYXRvciAqLwkJDQoJCVZDTyA9IChDTE9DS19DUllTVEFMX0ZSRVFVRU5DWS9QRElWKSpORElWOw0KCQlTeXN0ZW1Db3JlQ2xvY2sgPSBWQ08vSzJESVY7DQoJCS8qIGluIGNhc2UgdGhlIHN5c2Nsb2NrIGRpdiBpcyB1c2VkICovDQoJCVN5c3RlbUNvcmVDbG9jayA9IFN5c3RlbUNvcmVDbG9jay8oKFNDVV9DTEstPlNZU0NMS0NSICYgU0NVX0NMS19TWVNDTEtDUl9TWVNESVZfTXNrKSsxKTsNCgkJfSANCgkNCgkNCgl9DQp9DQplbHNlDQp7DQpTeXN0ZW1Db3JlQ2xvY2sgPSBDTE9DS19CQUNLX1VQOw0KfQ0KDQoNCn0NCg0KDQovKioNCiAgKiBAYnJpZWYgIC0NCiAgKiBAbm90ZSAgIC0gIA0KICAqIEBwYXJhbSAgTm9uZQ0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0KI2lmIChTQ1VfQ0xPQ0tfU0VUVVAgPT0gMSkNCnN0YXRpYyBpbnQgU3lzdGVtQ2xvY2tTZXR1cCh2b2lkKQ0Kew0KaW50IHRlbXA7DQp1bnNpZ25lZCBpbnQgbG9uZyBWQ087DQppbnQgc3RlcHBpbmdfSzJESVY7CQ0KDQovKiB0aGlzIHdlYWsgZnVuY3Rpb24gZW5hYmxlcyBEQVZFMyBjbG9jayBBcHAgdXNhZ2UgKi8JDQppZihBbGxvd1BMTEluaXRCeVN0YXJ0dXAoKSl7DQoJDQovKiBjaGVjayBpZiBQTEwgaXMgc3dpdGNoZWQgb24gKi8NCmlmICgoU0NVX1BMTC0+UExMQ09OMCAmKFNDVV9QTExfUExMQ09OMF9WQ09QV0RfTXNrIHwgU0NVX1BMTF9QTExDT04wX1BMTFBXRF9Nc2spKSAhPSAwKXsNCi8qIGVuYWJsZSBQTEwgZmlyc3QgKi8NCiAgU0NVX1BMTC0+UExMQ09OMCAmPSB+KFNDVV9QTExfUExMQ09OMF9WQ09QV0RfTXNrIHwgU0NVX1BMTF9QTExDT04wX1BMTFBXRF9Nc2spOw0KDQp9DQoNCi8qIEVuYWJsZSBPU0NfSFAgaWYgbm90IGFscmVhZHkgb24qLw0KICBpZiAoU0NVX1BMTF9DTE9DS19JTlBVVCA9PSBTQ1VfQ0xPQ0tfQ1JZU1RBTCkNCiAgew0KCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkvKiAgIFVzZSBleHRlcm5hbCBjcnlzdGFsIGZvciBQTEwgY2xvY2sgaW5wdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCiAgIGlmIChTQ1VfT1NDLT5PU0NIUENUUkwgJiBTQ1VfT1NDX09TQ0hQQ1RSTF9NT0RFX01zayl7DQoJICAgU0NVX09TQy0+T1NDSFBDVFJMICY9IH4oU0NVX09TQ19IUF9NT0RFKTsJIC8qZW5hYmxlIHRoZSBPU0NfSFAqLw0KCSAgIC8qIHNldHVwIE9TQyBXREcgZGV2aWRlciAqLw0KCSAgIFNDVV9PU0MtPk9TQ0hQQ1RSTCB8PSAoU0NVX09TQ0hQV0RHRElWPDwxNik7ICAgICAgICAgDQoJICAgLyogc2VsZWN0IGV4dGVybmFsIE9TQyBhcyBQTEwgaW5wdXQgKi8NCgkgICBTQ1VfUExMLT5QTExDT04yICY9IH5TQ1VfUExMX1BMTENPTjJfUElOU0VMX01zazsNCgkgICAvKiByZXN0YXJ0IE9TQyBXYXRjaGRvZyAqLw0KCSAgIFNDVV9QTEwtPlBMTENPTjAgJj0gflNDVV9QTExfUExMQ09OMF9PU0NSRVNfTXNrOyAgDQoNCiAgICAgICAvKiBUaW1lb3V0IGZvciB3YWl0IGxvb3AgfjE1MG1zICovDQoJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCSAgIFN5c1RpY2stPkxPQUQgID0gKCg1MDAwMDAwKzEwMCkgJiBTeXNUaWNrX0xPQURfUkVMT0FEX01zaykgLSAxOy8qIHNldCByZWxvYWQgcmVnaXN0ZXIgKi8NCgkgICBTeXNUaWNrLT5WQUwgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb2FkIHRoZSBTeXNUaWNrIENvdW50ZXIgVmFsdWUgKi8NCgkgICBTeXNUaWNrLT5DVFJMICA9IFN5c1RpY2tfQ1RSTF9DTEtTT1VSQ0VfTXNrIHwNCgkgICAgICAgICAgICAgICAgICAgU3lzVGlja19DVFJMX0VOQUJMRV9Nc2s7ICAgICAgICAgICAgICAgICAgICAvKiBFbmFibGUgU3lzVGljayBJUlEgYW5kIFN5c1RpY2sgVGltZXIgKi8JCSAgDQoJICAgZG8gDQoJICAgew0KICAgICAgIDsvKiB3YWl0IGZvciB+MTUwbXMgICovDQoJICAgfXdoaWxlKCgoKFNDVV9QTEwtPlBMTFNUQVQpICYgKFNDVV9QTExfUExMU1RBVF9QTExIVl9Nc2sgfCBTQ1VfUExMX1BMTFNUQVRfUExMTFZfTXNrIHxTQ1VfUExMX1BMTFNUQVRfUExMU1BfTXNrKSkgIT0gMHgzODApJiYoU3lzVGljay0+VkFMID49IDUwMCkpOyANCg0KCSAgIFN5c1RpY2stPkNUUkwgICY9IH5TeXNUaWNrX0NUUkxfRU5BQkxFX01zazsgICAgICAgICAgICAgICAgIC8qIFN0b3AgU3lzVGljayBUaW1lciAqLw0KCSAgIGlmICgoKFNDVV9QTEwtPlBMTFNUQVQpICYgKFNDVV9QTExfUExMU1RBVF9QTExIVl9Nc2sgfCBTQ1VfUExMX1BMTFNUQVRfUExMTFZfTXNrIHxTQ1VfUExMX1BMTFNUQVRfUExMU1BfTXNrKSkgIT0gMHgzODApDQoJICAgcmV0dXJuKDApOy8qIFJldHVybiBFcnJvciAqLw0KDQogICAgfQ0KICB9DQogIGVsc2UgaWYgKFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0JBQ0tfVVBfRkFDVE9SWSkNCgl7DQoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCS8qICAgVXNlIGZhY3RvcnkgdHJpbW1pbmcgQmFjay11cCBjbG9jayBmb3IgUExMIGNsb2NrIGlucHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQkvKiBQTEwgQmFjayB1cCBjbG9jayBzZWxlY3RlZCAqLw0KCQlTQ1VfUExMLT5QTExDT04yIHw9IFNDVV9QTExfUExMQ09OMl9QSU5TRUxfTXNrOw0KCQkJDQoJfQ0KICBlbHNlIGlmIChTQ1VfUExMX0NMT0NLX0lOUFVUID09IFNDVV9DTE9DS19CQUNLX1VQX0FVVE9NQVRJQykNCiAgew0KCS8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkvKiAgIFVzZSBhdXRvbWF0aWMgdHJpbW1pbmcgQmFjay11cCBjbG9jayBmb3IgUExMIGNsb2NrIGlucHV0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovDQoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCS8qIGNoZWNrIGZvciBISUIgRG9tYWluIGVuYWJsZWQgICovDQoJaWYoKFNDVV9QT1dFUi0+UFdSU1RBVCAmIFNDVV9QT1dFUl9QV1JTVEFUX0hJQkVOX01zaykgPT0gMCkNCgkJU0NVX1BPV0VSLT5QV1JTRVQgfD0gU0NVX1BPV0VSX1BXUlNFVF9ISUJfTXNrOyAvKmVuYWJsZSBIaWJlcm5hdGUgZG9tYWluKi8NCg0KICAgLyogY2hlY2sgZm9yIEhJQiBEb21haW4gaXMgbm90IGluIHJlc2V0IHN0YXRlICAqLw0KCWlmICgoU0NVX1JFU0VULT5SU1RTVEFUICYgU0NVX1JFU0VUX1JTVFNUQVRfSElCUlNfTXNrKT09IDEpDQoJICAgIFNDVV9SRVNFVC0+UlNUQ0xSIHw9IFNDVV9SRVNFVF9SU1RDTFJfSElCUlNfTXNrOyAvKmRlLWFzc2VydCBoaWJlcm5hdGUgcmVzZXQqLw0KDQoJCQkvKiBQTEwgQmFjayB1cCBjbG9jayBzZWxlY3RlZCAqLw0KCQlTQ1VfUExMLT5QTExDT04yIHw9IFNDVV9QTExfUExMQ09OMl9QSU5TRUxfTXNrOw0KCQ0KCQlpZiAoU0NVX1NUQU5EQllfQ0xPQ0sgPT0gSElCX0NMT0NLX0ZPU0kpDQoJCQl7DQoJCQkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkJCS8qICAgVXNlIGZPU0kgYXMgc291cmNlIG9mIHRoZSBzdGFuZGJ5IGNsb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCQlTQ1VfSElCRVJOQVRFLT5IRENSICY9IH5TQ1VfSElCRVJOQVRFX0hEQ1JfU1REQllTRUxfTXNrOw0KCQkJDQoJCQlTQ1VfUExMLT5QTExDT04wICY9IH5TQ1VfUExMX1BMTENPTjBfRk9UUl9Nc2s7DQoJCQlmb3IodGVtcD0wO3RlbXA8PTB4RkZGRjt0ZW1wKyspOw0KDQoJCQlTQ1VfUExMLT5QTExDT04wIHw9IFNDVV9QTExfUExMQ09OMF9BT1RSRU5fTXNrOw0KCQkJfQ0KCQllbHNlIGlmIChTQ1VfU1RBTkRCWV9DTE9DSyA9PSBISUJfQ0xPQ0tfT1NDVUxQKQ0KCQkJew0KCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCQkvKiAgIFVzZSBmVUxQIGFzIHNvdXJjZSBvZiB0aGUgc3RhbmRieSBjbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLw0KCQkJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJCQkvKmNoZWNrIE9TQ1VMIGlmIHJ1bm5pbmcgY29ycmVjdCovDQoJCQlpZiAoKFNDVV9ISUJFUk5BVEUtPk9TQ1VMQ1RSTCAmIFNDVV9ISUJFUk5BVEVfT1NDVUxDVFJMX01PREVfTXNrKSE9IDApDQoJCQkJew0KCQkJCQl3aGlsZSAoU0NVX0dFTkVSQUwtPk1JUlJTVFMgJiBTQ1VfR0VORVJBTF9NSVJSU1RTX09TQ1VMQ1RSTF9Nc2spOw0KDQoJCQkJCVNDVV9ISUJFUk5BVEUtPk9TQ1VMQ1RSTCAmPSB+U0NVX0hJQkVSTkFURV9PU0NVTENUUkxfTU9ERV9Nc2s7IC8qZW5hYmxlIE9TQ1VMKi8NCgkJCQkJLypub3cgY2VjayBpZiB0aGUgY2xvY2sgaXMgT0sgdXNpbmcgT1NDVUxQIE9zY2lsbGF0b3IgV2F0Y2hkb2cgKFVMUFdERykqLw0KCQkJCQkvKiBzZWxlY3QgT1NDVUwgY2xvY2sgZm9yIFJUQyovDQoJCQkJCVNDVV9ISUJFUk5BVEUtPkhEQ1IgfD0gU0NVX0hJQkVSTkFURV9IRENSX1JDU19Nc2s7DQoJCQkJCXdoaWxlIChTQ1VfR0VORVJBTC0+TUlSUlNUUyAmIFNDVV9HRU5FUkFMX01JUlJTVFNfSERDUl9Nc2spOw0KCQkJCQkvKmVuYWJsZSBPU0NVTFAgV0RHIEFsYXJtIEVuYWJsZSovDQoJCQkJCVNDVV9ISUJFUk5BVEUtPkhEQ1IgfD0gU0NVX0hJQkVSTkFURV9IRENSX1VMUFdER0VOX01zazsNCgkJCQkJd2hpbGUgKFNDVV9HRU5FUkFMLT5NSVJSU1RTICYgU0NVX0dFTkVSQUxfTUlSUlNUU19IRENSX01zayk7DQoJCQkJCS8qd2FpdCBub3cgZm9yIGNsb2NrIGlzIHN0YWJsZSAqLw0KCQkJCQlkbw0KCQkJCQl7DQoJCQkJCVNDVV9ISUJFUk5BVEUtPkhEQ0xSIHw9IFNDVV9ISUJFUk5BVEVfSERDTFJfVUxQV0RHX01zazsNCgkJCQkJd2hpbGUgKFNDVV9HRU5FUkFMLT5NSVJSU1RTICYgU0NVX0dFTkVSQUxfTUlSUlNUU19IRENMUl9Nc2spOw0KCQkJCQlmb3IodGVtcD0wO3RlbXA8PTB4RkZGRjt0ZW1wKyspOw0KCQkJCQl9DQoJCQkJCXdoaWxlICgoU0NVX0hJQkVSTkFURS0+SERTVEFUICYgU0NVX0hJQkVSTkFURV9IRFNUQVRfVUxQV0RHX01zayk9PVNDVV9ISUJFUk5BVEVfSERTVEFUX1VMUFdER19Nc2spOyANCg0KCQkJCQlTQ1VfSElCRVJOQVRFLT5IRENMUiB8PSBTQ1VfSElCRVJOQVRFX0hEQ0xSX1VMUFdER19Nc2s7DQoJCQkJCXdoaWxlIChTQ1VfR0VORVJBTC0+TUlSUlNUUyAmIFNDVV9HRU5FUkFMX01JUlJTVFNfSERDTFJfTXNrKTsNCgkJCQl9CQ0KCQkJLy8gbm93IE9TQ1VMUCBpcyBydW5uaW5nIGFuZCBjYW4gYmUgdXNlZAkgCSANCgkJCVNDVV9ISUJFUk5BVEUtPkhEQ1IgfD0gU0NVX0hJQkVSTkFURV9IRENSX1NUREJZU0VMX01zazsNCgkJCXdoaWxlIChTQ1VfR0VORVJBTC0+TUlSUlNUUyAmIFNDVV9HRU5FUkFMX01JUlJTVFNfSERDUl9Nc2spOw0KCQkJDQoJCQlTQ1VfUExMLT5QTExDT04wICY9IH5TQ1VfUExMX1BMTENPTjBfRk9UUl9Nc2s7DQoJCQkvKlRSSUFMIGZvciBkZWxheSBsb29wKi8NCgkJCWZvcih0ZW1wPTA7dGVtcDw9MHhGRkZGO3RlbXArKyk7DQoJCQkNCgkJCVNDVV9QTEwtPlBMTENPTjAgfD0gU0NVX1BMTF9QTExDT04wX0FPVFJFTl9Nc2s7DQoJCQkvKlRSSUFMIGZvciBkZWxheSBsb29wKi8NCgkJCWZvcih0ZW1wPTA7dGVtcDw9MHhGRkZGO3RlbXArKyk7DQoJCQkNCgkJCX0NCiAgfQ0KDQoJLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCS8qICAgU2V0dXAgYW5kIGxvb2sgdGhlIG1haW4gUExMICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8NCgkvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCmlmICghKFNDVV9QTEwtPlBMTFNUQVQgJiBTQ1VfUExMX1BMTFNUQVRfVkNPTE9DS19Nc2spKXsNCgkvKiBTeXN0ZW4gaXMgc3RpbGwgcnVubmluZyBmcm9tIGludGVybmFsIGNsb2NrICovDQoJCSAgIC8qIHNlbGVjdCBGT0ZJIGFzIHN5c3RlbSBjbG9jayAqLw0KCQkgICBpZigoU0NVX0NMSy0+U1lTQ0xLQ1IgJiBTQ1VfQ0xLX1NZU0NMS0NSX1NZU1NFTF9Nc2spICE9IDB4MClTQ1VfQ0xLLT5TWVNDTEtDUiAmPSB+U0NVX0NMS19TWVNDTEtDUl9TWVNTRUxfTXNrOyAvKlNlbGVjdCBGT0ZJKi8NCg0KDQoJCQkgLypjYWx1bGF0aW9uIGZvciBzdGVwcGluZyovDQoJCQkgaWYgKFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0NSWVNUQUwpVkNPID0gKENMT0NLX0NSWVNUQUxfRlJFUVVFTkNZLyhTQ1VfUExMX1BESVYrMSkpKihTQ1VfUExMX05ESVYrMSk7DQoJCQkgaWYgKChTQ1VfUExMX0NMT0NLX0lOUFVUID09IFNDVV9DTE9DS19CQUNLX1VQX0FVVE9NQVRJQykgfHwoU0NVX1BMTF9DTE9DS19JTlBVVCA9PSBTQ1VfQ0xPQ0tfQkFDS19VUF9GQUNUT1JZKSkNCgkJCQkJVkNPID0gKENMT0NLX0JBQ0tfVVAvKFNDVV9QTExfUERJVisxKSkqKFNDVV9QTExfTkRJVisxKTsNCgkgDQoJCQkgc3RlcHBpbmdfSzJESVYgPSAoVkNPLzI0MDAwMDAwKS0xOwkNCgkJCSAvKiBHbyB0byBieXBhc3MgdGhlIE1haW4gUExMICovDQoJCSAgIFNDVV9QTEwtPlBMTENPTjAgfD0gU0NVX1BMTF9QTExDT04wX1ZDT0JZUF9Nc2s7DQoJCSAgIC8qIGRpc2Nvbm5lY3QgT1NDX0hQIHRvIFBMTCAqLw0KCQkgICBTQ1VfUExMLT5QTExDT04wIHw9IFNDVV9QTExfUExMQ09OMF9GSU5ESVNfTXNrOw0KCQkgICAvKiBTZXR1cCBkZXZpZGVyIHNldHRpbmdzIGZvciBtYWluIFBMTCAqLw0KCQkgICBTQ1VfUExMLT5QTExDT04xID0gKChTQ1VfUExMX0sxRElWKSB8IChTQ1VfUExMX05ESVY8PDgpIHwgKHN0ZXBwaW5nX0syRElWPDwxNikgfCAoU0NVX1BMTF9QRElWPDwyNCkpOw0KCQkgICAvKiB3ZSBtYXkgaGF2ZSB0byBzZXQgT1NDRElTQ0RJUyAqLw0KCQkgICBTQ1VfUExMLT5QTExDT04wIHw9IFNDVV9QTExfUExMQ09OMF9PU0NESVNDRElTX01zazsNCgkJICAgLyogY29ubmVjdCBPU0NfSFAgdG8gUExMICovDQoJCSAgIFNDVV9QTEwtPlBMTENPTjAgJj0gflNDVV9QTExfUExMQ09OMF9GSU5ESVNfTXNrOw0KCQkgICAvKiByZXN0YXJ0IFBMTCBMb2NrIGRldGVjdGlvbiAqLw0KCQkgICBTQ1VfUExMLT5QTExDT04wIHw9IFNDVV9QTExfUExMQ09OMF9SRVNMRF9Nc2s7DQoJCSAgIC8qIHdhaXQgZm9yIFBMTCBMb2NrICovDQoJCSAgIC8qIHNldHVwIHRpbWUgb3V0IGxvb3AgKi8NCgkgICAgICAgLyogVGltZW91dCBmb3Igd2FpdCBsb28gfjE1MG1zICovDQoJCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkJICAgU3lzVGljay0+TE9BRCAgPSAoKDUwMDAwMDArMTAwKSAmIFN5c1RpY2tfTE9BRF9SRUxPQURfTXNrKSAtIDE7Lyogc2V0IHJlbG9hZCByZWdpc3RlciAqLw0KCQkgICBTeXNUaWNrLT5WQUwgICA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBMb2FkIHRoZSBTeXNUaWNrIENvdW50ZXIgVmFsdWUgKi8NCgkJICAgU3lzVGljay0+Q1RSTCAgPSBTeXNUaWNrX0NUUkxfQ0xLU09VUkNFX01zayB8DQoJCSAgICAgICAgICAgICAgICAgICBTeXNUaWNrX0NUUkxfRU5BQkxFX01zazsgICAgICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBTeXNUaWNrIElSUSBhbmQgU3lzVGljayBUaW1lciAqLwkJICANCgkJICAgDQoJCSAgIHdoaWxlICgoIShTQ1VfUExMLT5QTExTVEFUICYgU0NVX1BMTF9QTExTVEFUX1ZDT0xPQ0tfTXNrKSkmJihTeXNUaWNrLT5WQUwgPj0gNTAwKSk7DQoJICAgICAgIFN5c1RpY2stPkNUUkwgICY9IH5TeXNUaWNrX0NUUkxfRU5BQkxFX01zazsgICAgICAgICAgICAgICAgIC8qIFN0b3AgU3lzVGljayBUaW1lciAqLw0KDQoJCSAgIGlmICgoU0NVX1BMTC0+UExMU1RBVCAmIFNDVV9QTExfUExMU1RBVF9WQ09MT0NLX01zayk9PVNDVV9QTExfUExMU1RBVF9WQ09MT0NLX01zaykNCgkJICAgCQl7DQoJCQkJLyogR28gYmFjayB0byB0aGUgTWFpbiBQTEwgKi8NCgkJCQlTQ1VfUExMLT5QTExDT04wICY9IH5TQ1VfUExMX1BMTENPTjBfVkNPQllQX01zazsNCgkJCQl9DQoJCQkJZWxzZSByZXR1cm4oMCk7DQoJCSANCgkNCgkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoJICAgaGVyZSB3ZSBuZWVkIHRvIHNldHVwIHRoZSBzeXN0ZW0gY2xvY2sgZGl2aWRlcg0KCSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkNCgkJU0NVX0NMSy0+Q1BVQ0xLQ1IgPSBTQ1VfQ1BVQ0xLQ1JfRElWOw0KCQlTQ1VfQ0xLLT5QQkNMS0NSID0gU0NVX1BCQ0xLQ1JfRElWOwkNCgkJU0NVX0NMSy0+Q0NVQ0xLQ1IgPSBTQ1VfQ0NVQ0xLQ1JfRElWOw0KCQ0KDQoJCSAvKiBTd2l0Y2ggc3lzdGVtIGNsb2NrIHRvIFBMTCAqLw0KCSAgIFNDVV9DTEstPlNZU0NMS0NSIHw9ICAweDAwMDEwMDAwOyANCgkJCQkNCgkgICAvKiB3ZSBtYXkgaGF2ZSB0byByZXNldCBPU0NESVNDRElTICovDQoJICAgU0NVX1BMTC0+UExMQ09OMCAmPSB+U0NVX1BMTF9QTExDT04wX09TQ0RJU0NESVNfTXNrOw0KCQkJCQ0KCQkJCQkJCQkJCQkJCQkJCSAgDQoJCSAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQkgLyogRGVsYXkgZm9yIG5leHQgSzIgc3RlcCB+NTC1cyAqLw0KCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkJIFN5c1RpY2stPkxPQUQgID0gKCgxMjUwKzEwMCkgJiBTeXNUaWNrX0xPQURfUkVMT0FEX01zaykgLSAxOy8qIHNldCByZWxvYWQgcmVnaXN0ZXIgKi8NCgkJIFN5c1RpY2stPlZBTCAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvYWQgdGhlIFN5c1RpY2sgQ291bnRlciBWYWx1ZSAqLw0KCQkgU3lzVGljay0+Q1RSTCAgPSBTeXNUaWNrX0NUUkxfQ0xLU09VUkNFX01zayB8DQoJCQkJCQkJCQkJIFN5c1RpY2tfQ1RSTF9FTkFCTEVfTXNrOyAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIFN5c1RpY2sgSVJRIGFuZCBTeXNUaWNrIFRpbWVyICovDQoJDQoJCSB3aGlsZSAoU3lzVGljay0+VkFMID49IDEwMCk7CQkJCQkJCQkgICAvKiB3YWl0IGZvciB+NTC1cyAgKi8NCgkJIFN5c1RpY2stPkNUUkwgICY9IH5TeXNUaWNrX0NUUkxfRU5BQkxFX01zazsgICAgICAgICAgICAgICAgIC8qIFN0b3AgU3lzVGljayBUaW1lciAqLw0KCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KCSAgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCgkgICBoZXJlIHRoZSByYW1wIHVwIG9mIHRoZSBzeXN0ZW0gY2xvY2sgc3RhcnRzIEZTeXMgPCA2ME1Ieg0KCSAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkJaWYgKENMT0NLX0ZTWVMgPiA2MDAwMDAwMCl7DQoJCQkgLypjYWx1bGF0aW9uIGZvciBzdGVwcGluZyovDQoJCQkgaWYgKFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0NSWVNUQUwpVkNPID0gKENMT0NLX0NSWVNUQUxfRlJFUVVFTkNZLyhTQ1VfUExMX1BESVYrMSkpKihTQ1VfUExMX05ESVYrMSk7DQoJCQkgaWYgKChTQ1VfUExMX0NMT0NLX0lOUFVUID09IFNDVV9DTE9DS19CQUNLX1VQX0FVVE9NQVRJQykgfHwoU0NVX1BMTF9DTE9DS19JTlBVVCA9PSBTQ1VfQ0xPQ0tfQkFDS19VUF9GQUNUT1JZKSkNCgkJCQkJVkNPID0gKENMT0NLX0JBQ0tfVVAvKFNDVV9QTExfUERJVisxKSkqKFNDVV9QTExfTkRJVisxKTsNCgkgDQoJCQkgc3RlcHBpbmdfSzJESVYgPSAoVkNPLzYwMDAwMDAwKS0xOwkNCg0KCQkJIC8qIFNldHVwIGRldmlkZXIgc2V0dGluZ3MgZm9yIG1haW4gUExMICovDQoJCQkJU0NVX1BMTC0+UExMQ09OMSA9ICgoU0NVX1BMTF9LMURJVikgfCAoU0NVX1BMTF9ORElWPDw4KSB8IChzdGVwcGluZ19LMkRJVjw8MTYpIHwgKFNDVV9QTExfUERJVjw8MjQpKTsNCgkJIH0NCgkJIGVsc2UNCgkJIHsNCgkJCQkvKiBTZXR1cCBkZXZpZGVyIHNldHRpbmdzIGZvciBtYWluIFBMTCAqLw0KCQkJCVNDVV9QTEwtPlBMTENPTjEgPSAoKFNDVV9QTExfSzFESVYpIHwgKFNDVV9QTExfTkRJVjw8OCkgfCAoU0NVX1BMTF9LMkRJVjw8MTYpIHwgKFNDVV9QTExfUERJVjw8MjQpKTsNCgkJICAgIFNDVV9UUkFQLT5UUkFQQ0xSID0gU0NVX1RSQVBfVFJBUENMUl9TT1NDV0RHVF9Nc2sgfCBTQ1VfVFJBUF9UUkFQQ0xSX1NWQ09MQ0tUX01zazsgIC8qIGNsZWFyIHJlcXVlc3QgZm9yIFN5c3RlbSBPQ1MgV2F0Y2hkb2cgVHJhcCBhbmQgU3lzdGVtIFZDTyBMb2NrIFRyYXAgICovDQoJCQkgIHJldHVybigxKTsNCgkJIH0NCg0KCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkJIC8qIERlbGF5IGZvciBuZXh0IEsyIHN0ZXAgfjUwtXMgKi8NCgkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJICAgU3lzVGljay0+TE9BRCAgPSAoKDMwMDArMTAwKSAmIFN5c1RpY2tfTE9BRF9SRUxPQURfTXNrKSAtIDE7DQoJICAgU3lzVGljay0+VkFMICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9hZCB0aGUgU3lzVGljayBDb3VudGVyIFZhbHVlICovDQoJICAgU3lzVGljay0+Q1RSTCAgPSBTeXNUaWNrX0NUUkxfQ0xLU09VUkNFX01zayB8DQoJICAgICAgICAgICAgICAgICAgIFN5c1RpY2tfQ1RSTF9FTkFCTEVfTXNrOyAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIFN5c1RpY2sgSVJRIGFuZCBTeXNUaWNrIFRpbWVyICovDQoJDQoJICAgd2hpbGUgKFN5c1RpY2stPlZBTCA+PSAxMDApOwkJCQkJCQkJICAgLyogd2FpdCBmb3IgfjUwtXMgICovDQoJICAgU3lzVGljay0+Q1RSTCAgJj0gflN5c1RpY2tfQ1RSTF9FTkFCTEVfTXNrOyAgICAgICAgICAgICAgICAgLyogU3RvcCBTeXNUaWNrIFRpbWVyICovDQoJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQ0KICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KCSAgIGhlcmUgdGhlIHJhbXAgdXAgb2YgdGhlIHN5c3RlbSBjbG9jayBzdGFydHMgRlN5cyA8IDkwTUh6DQoJICAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQlpZiAoQ0xPQ0tfRlNZUyA+IDkwMDAwMDAwKXsNCgkJCSAvKmNhbHVsYXRpb24gZm9yIHN0ZXBwaW5nKi8NCgkJCSBpZiAoU0NVX1BMTF9DTE9DS19JTlBVVCA9PSBTQ1VfQ0xPQ0tfQ1JZU1RBTClWQ08gPSAoQ0xPQ0tfQ1JZU1RBTF9GUkVRVUVOQ1kvKFNDVV9QTExfUERJVisxKSkqKFNDVV9QTExfTkRJVisxKTsNCgkJCSBpZiAoKFNDVV9QTExfQ0xPQ0tfSU5QVVQgPT0gU0NVX0NMT0NLX0JBQ0tfVVBfQVVUT01BVElDKSB8fChTQ1VfUExMX0NMT0NLX0lOUFVUID09IFNDVV9DTE9DS19CQUNLX1VQX0ZBQ1RPUlkpKQ0KCQkJCQlWQ08gPSAoQ0xPQ0tfQkFDS19VUC8oU0NVX1BMTF9QRElWKzEpKSooU0NVX1BMTF9ORElWKzEpOw0KDQoJCQkgc3RlcHBpbmdfSzJESVYgPSAoVkNPLzkwMDAwMDAwKS0xOwkJCQ0KDQoJCQkgLyogU2V0dXAgZGV2aWRlciBzZXR0aW5ncyBmb3IgbWFpbiBQTEwgKi8NCgkJCQlTQ1VfUExMLT5QTExDT04xID0gKChTQ1VfUExMX0sxRElWKSB8IChTQ1VfUExMX05ESVY8PDgpIHwgKHN0ZXBwaW5nX0syRElWPDwxNikgfCAoU0NVX1BMTF9QRElWPDwyNCkpOw0KCQkgfQ0KCQkgZWxzZQ0KCQkgew0KCQkJCS8qIFNldHVwIGRldmlkZXIgc2V0dGluZ3MgZm9yIG1haW4gUExMICovDQoJCQkJU0NVX1BMTC0+UExMQ09OMSA9ICgoU0NVX1BMTF9LMURJVikgfCAoU0NVX1BMTF9ORElWPDw4KSB8IChTQ1VfUExMX0syRElWPDwxNikgfCAoU0NVX1BMTF9QRElWPDwyNCkpOw0KCSAgICAgIFNDVV9UUkFQLT5UUkFQQ0xSID0gU0NVX1RSQVBfVFJBUENMUl9TT1NDV0RHVF9Nc2sgfCBTQ1VfVFJBUF9UUkFQQ0xSX1NWQ09MQ0tUX01zazsgIC8qIGNsZWFyIHJlcXVlc3QgZm9yIFN5c3RlbSBPQ1MgV2F0Y2hkb2cgVHJhcCBhbmQgU3lzdGVtIFZDTyBMb2NrIFRyYXAgICovDQoJCQkJcmV0dXJuKDEpOw0KCQkgfQ0KCQ0KCQkgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCgkJIC8qIERlbGF5IGZvciBuZXh0IEsyIHN0ZXAgfjUwtXMgKi8NCgkJIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJICAgU3lzVGljay0+TE9BRCAgPSAoKDQ4MDArMTAwKSAmIFN5c1RpY2tfTE9BRF9SRUxPQURfTXNrKSAtIDE7DQoJICAgU3lzVGljay0+VkFMICAgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTG9hZCB0aGUgU3lzVGljayBDb3VudGVyIFZhbHVlICovDQoJICAgU3lzVGljay0+Q1RSTCAgPSBTeXNUaWNrX0NUUkxfQ0xLU09VUkNFX01zayB8DQoJICAgICAgICAgICAgICAgICAgIFN5c1RpY2tfQ1RSTF9FTkFCTEVfTXNrOyAgICAgICAgICAgICAgICAgICAgLyogRW5hYmxlIFN5c1RpY2sgSVJRIGFuZCBTeXNUaWNrIFRpbWVyICovDQoJDQoJICAgd2hpbGUgKFN5c1RpY2stPlZBTCA+PSAxMDApOwkJCQkJCQkJICAgLyogd2FpdCBmb3IgfjUwtXMgICovDQoJICAgU3lzVGljay0+Q1RSTCAgJj0gflN5c1RpY2tfQ1RSTF9FTkFCTEVfTXNrOyAgICAgICAgICAgICAgICAgLyogU3RvcCBTeXNUaWNrIFRpbWVyICovDQoJICAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KCQ0KCSAgIC8qIFNldHVwIGRldmlkZXIgc2V0dGluZ3MgZm9yIG1haW4gUExMICovDQoJICAgU0NVX1BMTC0+UExMQ09OMSA9ICgoU0NVX1BMTF9LMURJVikgfCAoU0NVX1BMTF9ORElWPDw4KSB8IChTQ1VfUExMX0syRElWPDwxNikgfCAoU0NVX1BMTF9QRElWPDwyNCkpOw0KCQ0KCSAgIFNDVV9UUkFQLT5UUkFQQ0xSID0gU0NVX1RSQVBfVFJBUENMUl9TT1NDV0RHVF9Nc2sgfCBTQ1VfVFJBUF9UUkFQQ0xSX1NWQ09MQ0tUX01zazsgIC8qIGNsZWFyIHJlcXVlc3QgZm9yIFN5c3RlbSBPQ1MgV2F0Y2hkb2cgVHJhcCBhbmQgU3lzdGVtIFZDTyBMb2NrIFRyYXAgICovDQoJfQ0KIH0vKiBlbmQgdGhpcyB3ZWFrIGZ1bmN0aW9uIGVuYWJsZXMgREFWRTMgY2xvY2sgQXBwIHVzYWdlICovCQ0KICAgcmV0dXJuKDEpOw0KDQp9DQojZW5kaWYNCg0KLyoqDQogICogQGJyaWVmICAtDQogICogQG5vdGUgICAtICANCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCiNpZiAoU0NVX1VTQl9DTE9DS19TRVRVUCA9PSAxKQ0Kc3RhdGljIGludCBVU0JDbG9ja1NldHVwKHZvaWQpDQp7DQovKiB0aGlzIHdlYWsgZnVuY3Rpb24gZW5hYmxlcyBEQVZFMyBjbG9jayBBcHAgdXNhZ2UgKi8JDQppZihBbGxvd1BMTEluaXRCeVN0YXJ0dXAoKSl7DQoNCgkvKiBjaGVjayBpZiBQTEwgaXMgc3dpdGNoZWQgb24gKi8NCmlmICgoU0NVX1BMTC0+VVNCUExMQ09OICYoU0NVX1BMTF9VU0JQTExDT05fVkNPUFdEX01zayB8IFNDVV9QTExfVVNCUExMQ09OX1BMTFBXRF9Nc2spKSAhPSAwKXsNCgkvKiBlbmFibGUgUExMIGZpcnN0ICovDQogIFNDVV9QTEwtPlVTQlBMTENPTiAmPSB+KFNDVV9QTExfVVNCUExMQ09OX1ZDT1BXRF9Nc2sgfCBTQ1VfUExMX1VTQlBMTENPTl9QTExQV0RfTXNrKTsNCn0NCg0KLyogY2hlY2sgYW5kIGlmIG5vdCBhbHJlYWR5IHJ1bm5pbmcgZW5hYmxlIE9TQ19IUCAqLw0KICAgaWYgKFNDVV9PU0MtPk9TQ0hQQ1RSTCAmIFNDVV9PU0NfT1NDSFBDVFJMX01PREVfTXNrKXsNCgkJIC8qIGNoZWNrIGlmIE1haW4gUExMIGlzIHN3aXRjaGVkIG9uIGZvciBPU0MgV0QqLw0KCQkgaWYgKChTQ1VfUExMLT5QTExDT04wICYoU0NVX1BMTF9QTExDT04wX1ZDT1BXRF9Nc2sgfCBTQ1VfUExMX1BMTENPTjBfUExMUFdEX01zaykpICE9IDApew0KCQkJLyogZW5hYmxlIFBMTCBmaXJzdCAqLw0KICAJCQlTQ1VfUExMLT5QTExDT04wICY9IH4oU0NVX1BMTF9QTExDT04wX1ZDT1BXRF9Nc2sgfCBTQ1VfUExMX1BMTENPTjBfUExMUFdEX01zayk7DQoJCSB9DQoJICAgU0NVX09TQy0+T1NDSFBDVFJMICY9IH4oU0NVX09TQ19IUF9NT0RFKTsJIC8qZW5hYmxlIHRoZSBPU0NfSFAqLw0KCSAgIC8qIHNldHVwIE9TQyBXREcgZGV2aWRlciAqLw0KCSAgIFNDVV9PU0MtPk9TQ0hQQ1RSTCB8PSAoU0NVX09TQ0hQV0RHRElWPDwxNik7ICAgICAgICAgDQoJICAgLyogcmVzdGFydCBPU0MgV2F0Y2hkb2cgKi8NCgkgICBTQ1VfUExMLT5QTExDT04wICY9IH5TQ1VfUExMX1BMTENPTjBfT1NDUkVTX01zazsgIA0KCQ0KICAgICAgIC8qIFRpbWVvdXQgZm9yIHdhaXQgbG9vcCB+MTUwbXMgKi8NCgkgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoJICAgU3lzVGljay0+TE9BRCAgPSAoKDUwMDAwMDArMTAwKSAmIFN5c1RpY2tfTE9BRF9SRUxPQURfTXNrKSAtIDE7Lyogc2V0IHJlbG9hZCByZWdpc3RlciAqLw0KCSAgIFN5c1RpY2stPlZBTCAgID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExvYWQgdGhlIFN5c1RpY2sgQ291bnRlciBWYWx1ZSAqLw0KCSAgIFN5c1RpY2stPkNUUkwgID0gU3lzVGlja19DVFJMX0NMS1NPVVJDRV9Nc2sgfA0KCSAgICAgICAgICAgICAgICAgICBTeXNUaWNrX0NUUkxfRU5BQkxFX01zazsgICAgICAgICAgICAgICAgICAgIC8qIEVuYWJsZSBTeXNUaWNrIElSUSBhbmQgU3lzVGljayBUaW1lciAqLwkJICANCgkgICBkbyANCgkgICB7DQogICAgICAgOy8qIHdhaXQgZm9yIH4xNTBtcyAgKi8NCgkgICB9d2hpbGUoKCgoU0NVX1BMTC0+UExMU1RBVCkgJiAoU0NVX1BMTF9QTExTVEFUX1BMTEhWX01zayB8IFNDVV9QTExfUExMU1RBVF9QTExMVl9Nc2sgfFNDVV9QTExfUExMU1RBVF9QTExTUF9Nc2spKSAhPSAweDM4MCkmJihTeXNUaWNrLT5WQUwgPj0gNTAwKSk7IA0KDQoJICAgU3lzVGljay0+Q1RSTCAgJj0gflN5c1RpY2tfQ1RSTF9FTkFCTEVfTXNrOyAgICAgICAgICAgICAgICAgLyogU3RvcCBTeXNUaWNrIFRpbWVyICovDQoJICAgaWYgKCgoU0NVX1BMTC0+UExMU1RBVCkgJiAoU0NVX1BMTF9QTExTVEFUX1BMTEhWX01zayB8IFNDVV9QTExfUExMU1RBVF9QTExMVl9Nc2sgfFNDVV9QTExfUExMU1RBVF9QTExTUF9Nc2spKSAhPSAweDM4MCkNCgkgICByZXR1cm4oMCk7LyogUmV0dXJuIEVycm9yICovDQoJDQogIH0NCg0KDQovKiBTZXR1cCBVU0IgUExMICovDQogICAvKiBHbyB0byBieXBhc3MgdGhlIE1haW4gUExMICovDQogICBTQ1VfUExMLT5VU0JQTExDT04gfD0gU0NVX1BMTF9VU0JQTExDT05fVkNPQllQX01zazsNCiAgIC8qIGRpc2Nvbm5lY3QgT1NDX0ZJIHRvIFBMTCAqLw0KICAgU0NVX1BMTC0+VVNCUExMQ09OIHw9IFNDVV9QTExfVVNCUExMQ09OX0ZJTkRJU19Nc2s7DQogICAvKiBTZXR1cCBkZXZpZGVyIHNldHRpbmdzIGZvciBtYWluIFBMTCAqLw0KICAgU0NVX1BMTC0+VVNCUExMQ09OID0gKChTQ1VfVVNCUExMX05ESVY8PDgpIHwgKFNDVV9VU0JQTExfUERJVjw8MjQpKTsNCiAgIC8qIFNldHVwIFVTQkRJViBzZXR0aW5ncyBVU0IgY2xvY2sgKi8NCiAgIFNDVV9DTEstPlVTQkNMS0NSID0gU0NVX1VTQkRJVjsNCiAgIC8qIHdlIG1heSBoYXZlIHRvIHNldCBPU0NESVNDRElTICovDQogICBTQ1VfUExMLT5VU0JQTExDT04gfD0gU0NVX1BMTF9VU0JQTExDT05fT1NDRElTQ0RJU19Nc2s7DQogICAvKiBjb25uZWN0IE9TQ19GSSB0byBQTEwgKi8NCiAgIFNDVV9QTEwtPlVTQlBMTENPTiAmPSB+U0NVX1BMTF9VU0JQTExDT05fRklORElTX01zazsNCiAgIC8qIHJlc3RhcnQgUExMIExvY2sgZGV0ZWN0aW9uICovDQogICBTQ1VfUExMLT5VU0JQTExDT04gfD0gU0NVX1BMTF9VU0JQTExDT05fUkVTTERfTXNrOw0KICAgLyogd2FpdCBmb3IgUExMIExvY2sgKi8NCiAgIHdoaWxlICghKFNDVV9QTEwtPlVTQlBMTFNUQVQgJiBTQ1VfUExMX1VTQlBMTFNUQVRfVkNPTE9DS19Nc2spKTsNCgkNCiAgfS8qIGVuZCB0aGlzIHdlYWsgZnVuY3Rpb24gZW5hYmxlcyBEQVZFMyBjbG9jayBBcHAgdXNhZ2UgKi8JICANCiAgIHJldHVybigxKTsNCg0KfQ0KI2VuZGlmDQoNCg==