LyoNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqKg0KKiogIEZpbGUgICAgICAgIDogU1RNMzJGMTAwWEVfRkxBU0gubGQNCioqDQoqKiAgQWJzdHJhY3QgICAgOiBMaW5rZXIgc2NyaXB0IGZvciBTVE0zMkYxMDB4RSBEZXZpY2Ugd2l0aA0KKiogICAgICAgICAgICAgICAgNTEyS0J5dGUgRkxBU0gsIDMyS0J5dGUgUkFNDQoqKg0KKiogICAgICAgICAgICAgICAgU2V0IGhlYXAgc2l6ZSwgc3RhY2sgc2l6ZSBhbmQgc3RhY2sgbG9jYXRpb24gYWNjb3JkaW5nDQoqKiAgICAgICAgICAgICAgICB0byBhcHBsaWNhdGlvbiByZXF1aXJlbWVudHMuDQoqKg0KKiogICAgICAgICAgICAgICAgU2V0IG1lbW9yeSBiYW5rIGFyZWEgYW5kIHNpemUgaWYgZXh0ZXJuYWwgbWVtb3J5IGlzIHVzZWQuDQoqKg0KKiogIFRhcmdldCAgICAgIDogU1RNaWNyb2VsZWN0cm9uaWNzIFNUTTMyDQoqKg0KKiogIEVudmlyb25tZW50IDogQXRvbGxpYyBUcnVlU1RVRElPKFIpDQoqKg0KKiogIERpc3RyaWJ1dGlvbjogVGhlIGZpbGUgaXMgZGlzdHJpYnV0ZWQgk2FzIGlzLJQgd2l0aG91dCBhbnkgd2FycmFudHkNCioqICAgICAgICAgICAgICAgIG9mIGFueSBraW5kLg0KKioNCioqICAoYylDb3B5cmlnaHQgQXRvbGxpYyBBQi4NCioqICBZb3UgbWF5IHVzZSB0aGlzIGZpbGUgYXMtaXMgb3IgbW9kaWZ5IGl0IGFjY29yZGluZyB0byB0aGUgbmVlZHMgb2YgeW91cg0KKiogIHByb2plY3QuIFRoaXMgZmlsZSBtYXkgb25seSBiZSBidWlsdCAoYXNzZW1ibGVkIG9yIGNvbXBpbGVkIGFuZCBsaW5rZWQpDQoqKiAgdXNpbmcgdGhlIEF0b2xsaWMgVHJ1ZVNUVURJTyhSKSBwcm9kdWN0LiBUaGUgdXNlIG9mIHRoaXMgZmlsZSB0b2dldGhlcg0KKiogIHdpdGggb3RoZXIgdG9vbHMgdGhhbiBBdG9sbGljIFRydWVTVFVESU8oUikgaXMgbm90IHBlcm1pdHRlZC4NCioqDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKi8NCjANCi8qIEVudHJ5IFBvaW50ICovDQpFTlRSWShSZXNldF9IYW5kbGVyKQ0KMA0KLyogSGlnaGVzdCBhZGRyZXNzIG9mIHRoZSB1c2VyIG1vZGUgc3RhY2sgKi8NCl9lc3RhY2sgPSAweDIwMDA3RkZGOyAgICAvKiBlbmQgb2YgUkFNICovDQowDQovKiBHZW5lcmF0ZSBhIGxpbmsgZXJyb3IgaWYgaGVhcCBhbmQgc3RhY2sgZG9uJ3QgZml0IGludG8gUkFNICovDQpfTWluX0hlYXBfU2l6ZSA9IDB4MjAwOyAgICAgIC8qIHJlcXVpcmVkIGFtb3VudCBvZiBoZWFwICAqLw0KX01pbl9TdGFja19TaXplID0gMHg0MDA7IC8qIHJlcXVpcmVkIGFtb3VudCBvZiBzdGFjayAqLw0KMA0KLyogU3BlY2lmeSB0aGUgbWVtb3J5IGFyZWFzICovDQpNRU1PUlkNCnsNCkZMQVNIIChyeCkgICAgICA6IE9SSUdJTiA9IDB4MDgwMDAwMDAsIExFTkdUSCA9IDUxMksNClJBTSAoeHJ3KSAgICAgICA6IE9SSUdJTiA9IDB4MjAwMDAwMDAsIExFTkdUSCA9IDMySw0KfQ0KMA0KLyogRGVmaW5lIG91dHB1dCBzZWN0aW9ucyAqLw0KU0VDVElPTlMNCnsNCiAgLyogVGhlIHN0YXJ0dXAgY29kZSBnb2VzIGZpcnN0IGludG8gRkxBU0ggKi8NCiAgLmlzcl92ZWN0b3IgOg0KICB7DQogICAgLiA9IEFMSUdOKDQpOw0KICAgIEtFRVAoKiguaXNyX3ZlY3RvcikpIC8qIFN0YXJ0dXAgY29kZSAqLw0KICAgIC4gPSBBTElHTig0KTsNCiAgfSA+RkxBU0gNCjANCiAgLyogVGhlIHByb2dyYW0gY29kZSBhbmQgb3RoZXIgZGF0YSBnb2VzIGludG8gRkxBU0ggKi8NCiAgLnRleHQgOg0KICB7DQogICAgLiA9IEFMSUdOKDQpOw0KICAgICooLnRleHQpICAgICAgICAgICAvKiAudGV4dCBzZWN0aW9ucyAoY29kZSkgKi8NCiAgICAqKC50ZXh0KikgICAgICAgICAgLyogLnRleHQqIHNlY3Rpb25zIChjb2RlKSAqLw0KICAgICooLmdsdWVfNykgICAgICAgICAvKiBnbHVlIGFybSB0byB0aHVtYiBjb2RlICovDQogICAgKiguZ2x1ZV83dCkgICAgICAgIC8qIGdsdWUgdGh1bWIgdG8gYXJtIGNvZGUgKi8NCiAgICAqKC5laF9mcmFtZSkNCjANCiAgICBLRUVQICgqKC5pbml0KSkNCiAgICBLRUVQICgqKC5maW5pKSkNCjANCiAgICAuID0gQUxJR04oNCk7DQogICAgX2V0ZXh0ID0gLjsgICAgICAgIC8qIGRlZmluZSBhIGdsb2JhbCBzeW1ib2xzIGF0IGVuZCBvZiBjb2RlICovDQogIH0gPkZMQVNIDQowDQogIC8qIENvbnN0YW50IGRhdGEgZ29lcyBpbnRvIEZMQVNIICovDQogIC5yb2RhdGEgOg0KICB7DQogICAgLiA9IEFMSUdOKDQpOw0KICAgICooLnJvZGF0YSkgICAgICAgICAvKiAucm9kYXRhIHNlY3Rpb25zIChjb25zdGFudHMsIHN0cmluZ3MsIGV0Yy4pICovDQogICAgKigucm9kYXRhKikgICAgICAgIC8qIC5yb2RhdGEqIHNlY3Rpb25zIChjb25zdGFudHMsIHN0cmluZ3MsIGV0Yy4pICovDQogICAgLiA9IEFMSUdOKDQpOw0KICB9ID5GTEFTSA0KMA0KICAuQVJNLmV4dGFiICAgOiB7ICooLkFSTS5leHRhYiogLmdudS5saW5rb25jZS5hcm1leHRhYi4qKSB9ID5GTEFTSA0KICAuQVJNIDogew0KICAgIF9fZXhpZHhfc3RhcnQgPSAuOw0KICAgICooLkFSTS5leGlkeCopDQogICAgX19leGlkeF9lbmQgPSAuOw0KICB9ID5GTEFTSA0KMA0KICAucHJlaW5pdF9hcnJheSAgICAgOg0KICB7DQogICAgUFJPVklERV9ISURERU4gKF9fcHJlaW5pdF9hcnJheV9zdGFydCA9IC4pOw0KICAgIEtFRVAgKCooLnByZWluaXRfYXJyYXkqKSkNCiAgICBQUk9WSURFX0hJRERFTiAoX19wcmVpbml0X2FycmF5X2VuZCA9IC4pOw0KICB9ID5GTEFTSA0KICAuaW5pdF9hcnJheSA6DQogIHsNCiAgICBQUk9WSURFX0hJRERFTiAoX19pbml0X2FycmF5X3N0YXJ0ID0gLik7DQogICAgS0VFUCAoKihTT1JUKC5pbml0X2FycmF5LiopKSkNCiAgICBLRUVQICgqKC5pbml0X2FycmF5KikpDQogICAgUFJPVklERV9ISURERU4gKF9faW5pdF9hcnJheV9lbmQgPSAuKTsNCiAgfSA+RkxBU0gNCiAgLmZpbmlfYXJyYXkgOg0KICB7DQogICAgUFJPVklERV9ISURERU4gKF9fZmluaV9hcnJheV9zdGFydCA9IC4pOw0KICAgIEtFRVAgKCooU09SVCguZmluaV9hcnJheS4qKSkpDQogICAgS0VFUCAoKiguZmluaV9hcnJheSopKQ0KICAgIFBST1ZJREVfSElEREVOIChfX2ZpbmlfYXJyYXlfZW5kID0gLik7DQogIH0gPkZMQVNIDQowDQogIC8qIHVzZWQgYnkgdGhlIHN0YXJ0dXAgdG8gaW5pdGlhbGl6ZSBkYXRhICovDQogIF9zaWRhdGEgPSBMT0FEQUREUiguZGF0YSk7DQowDQogIC8qIEluaXRpYWxpemVkIGRhdGEgc2VjdGlvbnMgZ29lcyBpbnRvIFJBTSwgbG9hZCBMTUEgY29weSBhZnRlciBjb2RlICovDQogIC5kYXRhIDogDQogIHsNCiAgICAuID0gQUxJR04oNCk7DQogICAgX3NkYXRhID0gLjsgICAgICAgIC8qIGNyZWF0ZSBhIGdsb2JhbCBzeW1ib2wgYXQgZGF0YSBzdGFydCAqLw0KICAgICooLmRhdGEpICAgICAgICAgICAvKiAuZGF0YSBzZWN0aW9ucyAqLw0KICAgICooLmRhdGEqKSAgICAgICAgICAvKiAuZGF0YSogc2VjdGlvbnMgKi8NCjANCiAgICAuID0gQUxJR04oNCk7DQogICAgX2VkYXRhID0gLjsgICAgICAgIC8qIGRlZmluZSBhIGdsb2JhbCBzeW1ib2wgYXQgZGF0YSBlbmQgKi8NCiAgfSA+UkFNIEFUPiBGTEFTSA0KMA0KICANCiAgLyogVW5pbml0aWFsaXplZCBkYXRhIHNlY3Rpb24gKi8NCiAgLiA9IEFMSUdOKDQpOw0KICAuYnNzIDoNCiAgew0KICAgIC8qIFRoaXMgaXMgdXNlZCBieSB0aGUgc3RhcnR1cCBpbiBvcmRlciB0byBpbml0aWFsaXplIHRoZSAuYnNzIHNlY2lvbiAqLw0KICAgIF9zYnNzID0gLjsgICAgICAgICAvKiBkZWZpbmUgYSBnbG9iYWwgc3ltYm9sIGF0IGJzcyBzdGFydCAqLw0KICAgIF9fYnNzX3N0YXJ0X18gPSBfc2JzczsNCiAgICAqKC5ic3MpDQogICAgKiguYnNzKikNCiAgICAqKENPTU1PTikNCjANCiAgICAuID0gQUxJR04oNCk7DQogICAgX2Vic3MgPSAuOyAgICAgICAgIC8qIGRlZmluZSBhIGdsb2JhbCBzeW1ib2wgYXQgYnNzIGVuZCAqLw0KICAgIF9fYnNzX2VuZF9fID0gX2Vic3M7DQogIH0gPlJBTQ0KMA0KICAvKiBVc2VyX2hlYXBfc3RhY2sgc2VjdGlvbiwgdXNlZCB0byBjaGVjayB0aGF0IHRoZXJlIGlzIGVub3VnaCBSQU0gbGVmdCAqLw0KICAuX3VzZXJfaGVhcF9zdGFjayA6DQogIHsNCiAgICAuID0gQUxJR04oNCk7DQogICAgUFJPVklERSAoIGVuZCA9IC4gKTsNCiAgICBQUk9WSURFICggX2VuZCA9IC4gKTsNCiAgICAuID0gLiArIF9NaW5fSGVhcF9TaXplOw0KICAgIC4gPSAuICsgX01pbl9TdGFja19TaXplOw0KICAgIC4gPSBBTElHTig0KTsNCiAgfSA+UkFNDQowDQogIA0KMA0KICAvKiBSZW1vdmUgaW5mb3JtYXRpb24gZnJvbSB0aGUgc3RhbmRhcmQgbGlicmFyaWVzICovDQogIC9ESVNDQVJELyA6DQogIHsNCiAgICBsaWJjLmEgKCAqICkNCiAgICBsaWJtLmEgKCAqICkNCiAgICBsaWJnY2MuYSAoICogKQ0KICB9DQowDQogIC5BUk0uYXR0cmlidXRlcyAwIDogeyAqKC5BUk0uYXR0cmlidXRlcykgfQ0KfQ0K