LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAqIFRyYWNlIFJlY29yZGVyIExpYnJhcnkgZm9yIFRyYWNlYWx5emVyIHYzLjAuMg0KICogUGVyY2VwaW8gQUIsIHd3dy5wZXJjZXBpby5jb20NCiAqDQogKiB0cmNUQ1BJUENvbmZpZy5oDQogKg0KICogVHJhY2UgVENQL0lQIGNvbmZpZ3VyYXRpb24uIE1vZGlmeSB0aGVzZSBpbmNsdWRlcyBhbmQgZnVuY3Rpb25zIHRvIHBlcmZvcm0gDQogKiB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IHVzaW5nIHlvdXIgc3BlY2lmaWMgVENQL0lQIHN0YWNrLg0KICogV2lsbCBvbmx5IGJlIGluY2x1ZGVkIGJ5IHRyY1RDUElQLmMuDQogKg0KICogVGVybXMgb2YgVXNlDQogKiBUaGlzIHNvZnR3YXJlICh0aGUgIlRyYWNlYWx5emVyIFJlY29yZGVyIExpYnJhcnkiKSBpcyB0aGUgaW50ZWxsZWN0dWFsDQogKiBwcm9wZXJ0eSBvZiBQZXJjZXBpbyBBQiBhbmQgbWF5IG5vdCBiZSBzb2xkIG9yIGluIG90aGVyIHdheXMgY29tbWVyY2lhbGx5DQogKiByZWRpc3RyaWJ1dGVkIHdpdGhvdXQgZXhwbGljaXQgd3JpdHRlbiBwZXJtaXNzaW9uIGJ5IFBlcmNlcGlvIEFCLg0KICoNCiAqIFNlcGFyYXRlIGNvbmRpdGlvbnMgYXBwbGllcyBmb3IgdGhlIFNFR0dFUiBicmFuZGVkIHNvdXJjZSBjb2RlIGluY2x1ZGVkLg0KICoNCiAqIFRoZSByZWNvcmRlciBsaWJyYXJ5IGlzIGZyZWUgZm9yIHVzZSB0b2dldGhlciB3aXRoIFBlcmNlcGlvIHByb2R1Y3RzLg0KICogWW91IG1heSBkaXN0cmlidXRlIHRoZSByZWNvcmRlciBsaWJyYXJ5IGluIGl0cyBvcmlnaW5hbCBmb3JtLCBidXQgcHVibGljDQogKiBkaXN0cmlidXRpb24gb2YgbW9kaWZpZWQgdmVyc2lvbnMgcmVxdWlyZSBhcHByb3ZhbCBieSBQZXJjZXBpbyBBQi4NCiAqDQogKiBEaXNjbGFpbWVyDQogKiBUaGUgdHJhY2UgdG9vbCBhbmQgcmVjb3JkZXIgbGlicmFyeSBpcyBiZWluZyBkZWxpdmVyZWQgdG8geW91IEFTIElTIGFuZA0KICogUGVyY2VwaW8gQUIgbWFrZXMgbm8gd2FycmFudHkgYXMgdG8gaXRzIHVzZSBvciBwZXJmb3JtYW5jZS4gUGVyY2VwaW8gQUIgZG9lcw0KICogbm90IGFuZCBjYW5ub3Qgd2FycmFudCB0aGUgcGVyZm9ybWFuY2Ugb3IgcmVzdWx0cyB5b3UgbWF5IG9idGFpbiBieSB1c2luZyB0aGUNCiAqIHNvZnR3YXJlIG9yIGRvY3VtZW50YXRpb24uIFBlcmNlcGlvIEFCIG1ha2Ugbm8gd2FycmFudGllcywgZXhwcmVzcyBvcg0KICogaW1wbGllZCwgYXMgdG8gbm9uaW5mcmluZ2VtZW50IG9mIHRoaXJkIHBhcnR5IHJpZ2h0cywgbWVyY2hhbnRhYmlsaXR5LCBvcg0KICogZml0bmVzcyBmb3IgYW55IHBhcnRpY3VsYXIgcHVycG9zZS4gSW4gbm8gZXZlbnQgd2lsbCBQZXJjZXBpbyBBQiwgaXRzDQogKiB0ZWNobm9sb2d5IHBhcnRuZXJzLCBvciBkaXN0cmlidXRvcnMgYmUgbGlhYmxlIHRvIHlvdSBmb3IgYW55IGNvbnNlcXVlbnRpYWwsDQogKiBpbmNpZGVudGFsIG9yIHNwZWNpYWwgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBsb3N0IHByb2ZpdHMgb3IgbG9zdCBzYXZpbmdzLA0KICogZXZlbiBpZiBhIHJlcHJlc2VudGF0aXZlIG9mIFBlcmNlcGlvIEFCIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5DQogKiBvZiBzdWNoIGRhbWFnZXMsIG9yIGZvciBhbnkgY2xhaW0gYnkgYW55IHRoaXJkIHBhcnR5LiBTb21lIGp1cmlzZGljdGlvbnMgZG8NCiAqIG5vdCBhbGxvdyB0aGUgZXhjbHVzaW9uIG9yIGxpbWl0YXRpb24gb2YgaW5jaWRlbnRhbCwgY29uc2VxdWVudGlhbCBvciBzcGVjaWFsDQogKiBkYW1hZ2VzLCBvciB0aGUgZXhjbHVzaW9uIG9mIGltcGxpZWQgd2FycmFudGllcyBvciBsaW1pdGF0aW9ucyBvbiBob3cgbG9uZyBhbg0KICogaW1wbGllZCB3YXJyYW50eSBtYXkgbGFzdCwgc28gdGhlIGFib3ZlIGxpbWl0YXRpb25zIG1heSBub3QgYXBwbHkgdG8geW91Lg0KICoNCiAqIFRhYnMgYXJlIHVzZWQgZm9yIGluZGVudCBpbiB0aGlzIGZpbGUgKDEgdGFiID0gNCBzcGFjZXMpDQogKg0KICogQ29weXJpZ2h0IFBlcmNlcGlvIEFCLCAyMDE1Lg0KICogd3d3LnBlcmNlcGlvLmNvbQ0KICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KI2lmbmRlZiBUUkNfVENQSVBfQ09ORklHX0gNCiNkZWZpbmUgVFJDX1RDUElQX0NPTkZJR19IDQoNCiNpZmRlZiBfX2NwbHVzcGx1cw0KZXh0ZXJuIJNDlCB7DQojZW5kaWYNCg0KLyogVENQL0lQIGluY2x1ZGVzKi8NCiNpbmNsdWRlICJ0Y3BpcC5oIg0KDQojZGVmaW5lIFRSQ19UQ1BJUF9QT1JUIDEyMDAwDQoNCnNvY2tldCogc29jayA9IE5VTEw7DQpzb2NrZXQqIGxpc3RlbmVyU29ja2V0ID0gTlVMTDsNCg0KaW50MzJfdCB0cmNTb2NrZXRTZW5kKHZvaWQqIGRhdGEsIGludDMyX3Qgc2l6ZSwgaW50MzJfdCogYnl0ZXNXcml0dGVuKQ0Kew0KICBpbnQzMl90IGVycm9yOw0KICBpZiAoc29jayA9PSBOVUxMKQ0KICAgIHJldHVybiAxOw0KICANCiAgZXJyb3IgPSBzb2NrZXRfc2VuZChzb2NrLCBkYXRhLCBzaXplLCAoc2l6ZV90KilieXRlc1dyaXR0ZW4sIDApOw0KICBpZiAoZXJyb3IpDQogIHsNCiAgICBzb2NrZXRfY2xvc2Uoc29jayk7DQogICAgc29jayA9IE5VTEw7DQogIH0NCiAgDQogIHJldHVybiAoaW50MzJfdCllcnJvcjsNCn0NCg0KaW50MzJfdCB0cmNTb2NrZXRSZWNlaXZlKHZvaWQqIGRhdGEsIGludDMyX3Qgc2l6ZSwgaW50MzJfdCogYnl0ZXNSZWFkKQ0Kew0KICBpbnQzMl90IGVycm9yOw0KICBpZiAoc29jayA9PSBOVUxMKQ0KICAgIHJldHVybiAxOw0KICANCiAgZXJyb3IgPSBzb2NrZXRfcmVjZWl2ZShzb2NrLCBkYXRhLCBzaXplLCAoc2l6ZV90KilieXRlc1JlYWQsIFNPQ0tFVF9XQUlUX0FMTCk7DQogIGlmIChlcnJvciAhPSBFUlJPUl9OT05FICYmIGVycm9yICE9IEVSUk9SX1RJTUVPVVQpIC8qIFRpbWVvdXQgbWF5IGJlIGV4cGVjdGVkIHdoZW4gdGhlcmUgaXMgbm8gZGF0YSAqLw0KICB7DQogICAgc29ja2V0X2Nsb3NlKHNvY2spOw0KICAgIHNvY2sgPSBOVUxMOw0KICAgIHJldHVybiBlcnJvcjsNCiAgfQ0KDQogIHJldHVybiAwOw0KfQ0KDQppbnQzMl90IHRyY1NvY2tldEluaXRpYWxpemVMaXN0ZW5lcigpDQp7DQogIGludDMyX3QgZXJyb3I7DQogIA0KICBpZiAobGlzdGVuZXJTb2NrZXQpDQogICAgcmV0dXJuIDA7DQogIA0KICAvL1N0YXJ0IG9mIGV4Y2VwdGlvbiBoYW5kbGluZyBibG9jaw0KICBkbw0KICB7DQogICAgbGlzdGVuZXJTb2NrZXQgPSBzb2NrZXRfb3BlbihTT0NLRVRfU1RSRUFNLCBTT0NLRVRfVENQKTsNCiAgICBpZihsaXN0ZW5lclNvY2tldCA9PSBOVUxMKQ0KICAgIHsNCiAgICAgICBlcnJvciA9IDE7DQogICAgICAgYnJlYWs7DQogICAgfQ0KDQogICAgZXJyb3IgPSBzb2NrZXRfc2V0X3RpbWVvdXQobGlzdGVuZXJTb2NrZXQsIElORklOSVRFKTsNCiAgICBpZihlcnJvcikgYnJlYWs7DQoNCiAgICBlcnJvciA9IHNvY2tldF9zZXRfdHhfYnVmZmVyX3NpemUobGlzdGVuZXJTb2NrZXQsIDE0NDAgKiAyKTsNCiAgICBpZihlcnJvcikgYnJlYWs7DQoNCiAgICBlcnJvciA9IHNvY2tldF9zZXRfcnhfYnVmZmVyX3NpemUobGlzdGVuZXJTb2NrZXQsIDEyOCk7DQogICAgaWYoZXJyb3IpIGJyZWFrOw0KDQogICAgZXJyb3IgPSBzb2NrZXRfYmluZF90b19pbnRlcmZhY2UobGlzdGVuZXJTb2NrZXQsIHBOZXRJbnRlcmZhY2UpOw0KICAgIGlmKGVycm9yKSBicmVhazsNCg0KICAgIGVycm9yID0gc29ja2V0X2JpbmQobGlzdGVuZXJTb2NrZXQsIEFERFJfQU5ZLCBUUkNfVENQSVBfUE9SVCk7DQogICAgaWYoZXJyb3IpIGJyZWFrOw0KDQogICAgZXJyb3IgPSBzb2NrZXRfbGlzdGVuKGxpc3RlbmVyU29ja2V0KTsNCiAgICBpZihlcnJvcikgYnJlYWs7DQogICAgfSB3aGlsZSgwKTsNCg0KICAgIGlmKGVycm9yKQ0KICAgIHsNCiAgICAgICAgc29ja2V0X2Nsb3NlKGxpc3RlbmVyU29ja2V0KTsNCiAgICAgICAgbGlzdGVuZXJTb2NrZXQgPSBOVUxMOw0KICAgIH0NCiAgIA0KICAgIHJldHVybiBlcnJvcjsNCn0NCg0KaW50MzJfdCB0cmNTb2NrZXRBY2NlcHQoKQ0Kew0KICBpcF9hZGRyIGNsaWVudElwQWRkcjsNCiAgdWludDE2X3QgY2xpZW50UG9ydDsNCiAgDQogIGlmIChzb2NrICE9IE5VTEwpDQogICAgcmV0dXJuIDA7DQoNCiAgaWYgKGxpc3RlbmVyU29ja2V0ID09IE5VTEwpDQogICAgcmV0dXJuIDE7DQogIA0KICAvKiBXYWl0IGZvciBjb25uZWN0aW9uICovDQogIHNvY2sgPSBzb2NrZXRfYWNjZXB0KGxpc3RlbmVyU29ja2V0LCAmY2xpZW50SXBBZGRyLCAmY2xpZW50UG9ydCk7DQogIGlmKHNvY2sgIT0gTlVMTCkNCiAgew0KICAgIHNvY2tldF9zZXRfdGltZW91dChzb2NrLCAyMCk7DQogIH0NCiAgZWxzZQ0KICAgIHJldHVybiAxOw0KICANCiAgcmV0dXJuIDA7DQp9DQoNCiNpZmRlZiBfX2NwbHVzcGx1cw0KfQ0KI2VuZGlmDQoNCiNlbmRpZiAvKlRSQ19UQ1BJUF9DT05GSUdfSCov