LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMyZjEweF9ydGMuYw0KICAqIEBhdXRob3IgIE1DRCBBcHBsaWNhdGlvbiBUZWFtDQogICogQHZlcnNpb24gVjMuNC4wDQogICogQGRhdGUgICAgMTAvMTUvMjAxMA0KICAqIEBicmllZiAgIFRoaXMgZmlsZSBwcm92aWRlcyBhbGwgdGhlIFJUQyBmaXJtd2FyZSBmdW5jdGlvbnMuDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBjb3B5DQogICoNCiAgKiBUSEUgUFJFU0VOVCBGSVJNV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCiAgKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRQ0KICAqIFRJTUUuIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkNCiAgKiBESVJFQ1QsIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HDQogICogRlJPTSBUSEUgQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRQ0KICAqIENPRElORyBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCiAgKg0KICAqIDxoMj48Y2VudGVyPiZjb3B5OyBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3M8L2NlbnRlcj48L2gyPg0KICAqLyANCg0KLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNpbmNsdWRlICJzdG0zMmYxMHhfcnRjLmgiDQoNCi8qKiBAYWRkdG9ncm91cCBTVE0zMkYxMHhfU3RkUGVyaXBoX0RyaXZlcg0KICAqIEB7DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgUlRDIA0KICAqIEBicmllZiBSVEMgZHJpdmVyIG1vZHVsZXMNCiAgKiBAew0KICAqLw0KDQovKiogQGRlZmdyb3VwIFJUQ19Qcml2YXRlX1R5cGVzRGVmaW5pdGlvbnMNCiAgKiBAew0KICAqLyANCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgUlRDX1ByaXZhdGVfRGVmaW5lcw0KICAqIEB7DQogICovDQojZGVmaW5lIFJUQ19MU0JfTUFTSyAgICAgKCh1aW50MzJfdCkweDAwMDBGRkZGKSAgLyohPCBSVEMgTFNCIE1hc2sgKi8NCiNkZWZpbmUgUFJMSF9NU0JfTUFTSyAgICAoKHVpbnQzMl90KTB4MDAwRjAwMDApICAvKiE8IFJUQyBQcmVzY2FsZXIgTVNCIE1hc2sgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBSVENfUHJpdmF0ZV9NYWNyb3MNCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIFJUQ19Qcml2YXRlX1ZhcmlhYmxlcw0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgUlRDX1ByaXZhdGVfRnVuY3Rpb25Qcm90b3R5cGVzDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBSVENfUHJpdmF0ZV9GdW5jdGlvbnMNCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBSVEMgaW50ZXJydXB0cy4NCiAgKiBAcGFyYW0gIFJUQ19JVDogc3BlY2lmaWVzIHRoZSBSVEMgaW50ZXJydXB0cyBzb3VyY2VzIHRvIGJlIGVuYWJsZWQgb3IgZGlzYWJsZWQuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFJUQ19JVF9PVzogT3ZlcmZsb3cgaW50ZXJydXB0DQogICogICAgIEBhcmcgUlRDX0lUX0FMUjogQWxhcm0gaW50ZXJydXB0DQogICogICAgIEBhcmcgUlRDX0lUX1NFQzogU2Vjb25kIGludGVycnVwdA0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIFJUQyBpbnRlcnJ1cHRzLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUlRDX0lUQ29uZmlnKHVpbnQxNl90IFJUQ19JVCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfUlRDX0lUKFJUQ19JVCkpOyAgDQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIA0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIFJUQy0+Q1JIIHw9IFJUQ19JVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBSVEMtPkNSSCAmPSAodWludDE2X3QpflJUQ19JVDsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVudGVycyB0aGUgUlRDIGNvbmZpZ3VyYXRpb24gbW9kZS4NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUlRDX0VudGVyQ29uZmlnTW9kZSh2b2lkKQ0Kew0KICAvKiBTZXQgdGhlIENORiBmbGFnIHRvIGVudGVyIGluIHRoZSBDb25maWd1cmF0aW9uIE1vZGUgKi8NCiAgUlRDLT5DUkwgfD0gUlRDX0NSTF9DTkY7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRXhpdHMgZnJvbSB0aGUgUlRDIGNvbmZpZ3VyYXRpb24gbW9kZS4NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUlRDX0V4aXRDb25maWdNb2RlKHZvaWQpDQp7DQogIC8qIFJlc2V0IHRoZSBDTkYgZmxhZyB0byBleGl0IGZyb20gdGhlIENvbmZpZ3VyYXRpb24gTW9kZSAqLw0KICBSVEMtPkNSTCAmPSAodWludDE2X3QpfigodWludDE2X3QpUlRDX0NSTF9DTkYpOyANCn0NCg0KLyoqDQogICogQGJyaWVmICBHZXRzIHRoZSBSVEMgY291bnRlciB2YWx1ZS4NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIFJUQyBjb3VudGVyIHZhbHVlLg0KICAqLw0KdWludDMyX3QgUlRDX0dldENvdW50ZXIodm9pZCkNCnsNCiAgdWludDE2X3QgdG1wID0gMDsNCiAgdG1wID0gUlRDLT5DTlRMOw0KICByZXR1cm4gKCgodWludDMyX3QpUlRDLT5DTlRIIDw8IDE2ICkgfCB0bXApIDsNCn0NCg0KLyoqDQogICogQGJyaWVmICBTZXRzIHRoZSBSVEMgY291bnRlciB2YWx1ZS4NCiAgKiBAcGFyYW0gIENvdW50ZXJWYWx1ZTogUlRDIGNvdW50ZXIgbmV3IHZhbHVlLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBSVENfU2V0Q291bnRlcih1aW50MzJfdCBDb3VudGVyVmFsdWUpDQp7IA0KICBSVENfRW50ZXJDb25maWdNb2RlKCk7DQogIC8qIFNldCBSVEMgQ09VTlRFUiBNU0Igd29yZCAqLw0KICBSVEMtPkNOVEggPSBDb3VudGVyVmFsdWUgPj4gMTY7DQogIC8qIFNldCBSVEMgQ09VTlRFUiBMU0Igd29yZCAqLw0KICBSVEMtPkNOVEwgPSAoQ291bnRlclZhbHVlICYgUlRDX0xTQl9NQVNLKTsNCiAgUlRDX0V4aXRDb25maWdNb2RlKCk7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU2V0cyB0aGUgUlRDIHByZXNjYWxlciB2YWx1ZS4NCiAgKiBAcGFyYW0gIFByZXNjYWxlclZhbHVlOiBSVEMgcHJlc2NhbGVyIG5ldyB2YWx1ZS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUlRDX1NldFByZXNjYWxlcih1aW50MzJfdCBQcmVzY2FsZXJWYWx1ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1JUQ19QUkVTQ0FMRVIoUHJlc2NhbGVyVmFsdWUpKTsNCiAgDQogIFJUQ19FbnRlckNvbmZpZ01vZGUoKTsNCiAgLyogU2V0IFJUQyBQUkVTQ0FMRVIgTVNCIHdvcmQgKi8NCiAgUlRDLT5QUkxIID0gKFByZXNjYWxlclZhbHVlICYgUFJMSF9NU0JfTUFTSykgPj4gMTY7DQogIC8qIFNldCBSVEMgUFJFU0NBTEVSIExTQiB3b3JkICovDQogIFJUQy0+UFJMTCA9IChQcmVzY2FsZXJWYWx1ZSAmIFJUQ19MU0JfTUFTSyk7DQogIFJUQ19FeGl0Q29uZmlnTW9kZSgpOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNldHMgdGhlIFJUQyBhbGFybSB2YWx1ZS4NCiAgKiBAcGFyYW0gIEFsYXJtVmFsdWU6IFJUQyBhbGFybSBuZXcgdmFsdWUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFJUQ19TZXRBbGFybSh1aW50MzJfdCBBbGFybVZhbHVlKQ0KeyAgDQogIFJUQ19FbnRlckNvbmZpZ01vZGUoKTsNCiAgLyogU2V0IHRoZSBBTEFSTSBNU0Igd29yZCAqLw0KICBSVEMtPkFMUkggPSBBbGFybVZhbHVlID4+IDE2Ow0KICAvKiBTZXQgdGhlIEFMQVJNIExTQiB3b3JkICovDQogIFJUQy0+QUxSTCA9IChBbGFybVZhbHVlICYgUlRDX0xTQl9NQVNLKTsNCiAgUlRDX0V4aXRDb25maWdNb2RlKCk7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgR2V0cyB0aGUgUlRDIGRpdmlkZXIgdmFsdWUuDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCBSVEMgRGl2aWRlciB2YWx1ZS4NCiAgKi8NCnVpbnQzMl90IFJUQ19HZXREaXZpZGVyKHZvaWQpDQp7DQogIHVpbnQzMl90IHRtcCA9IDB4MDA7DQogIHRtcCA9ICgodWludDMyX3QpUlRDLT5ESVZIICYgKHVpbnQzMl90KTB4MDAwRikgPDwgMTY7DQogIHRtcCB8PSBSVEMtPkRJVkw7DQogIHJldHVybiB0bXA7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgV2FpdHMgdW50aWwgbGFzdCB3cml0ZSBvcGVyYXRpb24gb24gUlRDIHJlZ2lzdGVycyBoYXMgZmluaXNoZWQuDQogICogQG5vdGUgICBUaGlzIGZ1bmN0aW9uIG11c3QgYmUgY2FsbGVkIGJlZm9yZSBhbnkgd3JpdGUgdG8gUlRDIHJlZ2lzdGVycy4NCiAgKiBAcGFyYW0gIE5vbmUNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUlRDX1dhaXRGb3JMYXN0VGFzayh2b2lkKQ0Kew0KICAvKiBMb29wIHVudGlsIFJUT0ZGIGZsYWcgaXMgc2V0ICovDQogIHdoaWxlICgoUlRDLT5DUkwgJiBSVENfRkxBR19SVE9GRikgPT0gKHVpbnQxNl90KVJFU0VUKQ0KICB7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBXYWl0cyB1bnRpbCB0aGUgUlRDIHJlZ2lzdGVycyAoUlRDX0NOVCwgUlRDX0FMUiBhbmQgUlRDX1BSTCkNCiAgKiAgIGFyZSBzeW5jaHJvbml6ZWQgd2l0aCBSVEMgQVBCIGNsb2NrLg0KICAqIEBub3RlICAgVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBiZWZvcmUgYW55IHJlYWQgb3BlcmF0aW9uIGFmdGVyIGFuIEFQQiByZXNldA0KICAqICAgb3IgYW4gQVBCIGNsb2NrIHN0b3AuDQogICogQHBhcmFtICBOb25lDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFJUQ19XYWl0Rm9yU3luY2hybyh2b2lkKQ0Kew0KICAvKiBDbGVhciBSU0YgZmxhZyAqLw0KICBSVEMtPkNSTCAmPSAodWludDE2X3QpflJUQ19GTEFHX1JTRjsNCiAgLyogTG9vcCB1bnRpbCBSU0YgZmxhZyBpcyBzZXQgKi8NCiAgd2hpbGUgKChSVEMtPkNSTCAmIFJUQ19GTEFHX1JTRikgPT0gKHVpbnQxNl90KVJFU0VUKQ0KICB7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIFJUQyBmbGFnIGlzIHNldCBvciBub3QuDQogICogQHBhcmFtICBSVENfRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBSVENfRkxBR19SVE9GRjogUlRDIE9wZXJhdGlvbiBPRkYgZmxhZw0KICAqICAgICBAYXJnIFJUQ19GTEFHX1JTRjogUmVnaXN0ZXJzIFN5bmNocm9uaXplZCBmbGFnDQogICogICAgIEBhcmcgUlRDX0ZMQUdfT1c6IE92ZXJmbG93IGZsYWcNCiAgKiAgICAgQGFyZyBSVENfRkxBR19BTFI6IEFsYXJtIGZsYWcNCiAgKiAgICAgQGFyZyBSVENfRkxBR19TRUM6IFNlY29uZCBmbGFnDQogICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIFJUQ19GTEFHIChTRVQgb3IgUkVTRVQpLg0KICAqLw0KRmxhZ1N0YXR1cyBSVENfR2V0RmxhZ1N0YXR1cyh1aW50MTZfdCBSVENfRkxBRykNCnsNCiAgRmxhZ1N0YXR1cyBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19SVENfR0VUX0ZMQUcoUlRDX0ZMQUcpKTsgDQogIA0KICBpZiAoKFJUQy0+Q1JMICYgUlRDX0ZMQUcpICE9ICh1aW50MTZfdClSRVNFVCkNCiAgew0KICAgIGJpdHN0YXR1cyA9IFNFVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgfQ0KICByZXR1cm4gYml0c3RhdHVzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENsZWFycyB0aGUgUlRDknMgcGVuZGluZyBmbGFncy4NCiAgKiBAcGFyYW0gIFJUQ19GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2xlYXIuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFJUQ19GTEFHX1JTRjogUmVnaXN0ZXJzIFN5bmNocm9uaXplZCBmbGFnLiBUaGlzIGZsYWcgaXMgY2xlYXJlZCBvbmx5IGFmdGVyDQogICogICAgICAgICAgICAgICAgICAgICAgICBhbiBBUEIgcmVzZXQgb3IgYW4gQVBCIENsb2NrIHN0b3AuDQogICogICAgIEBhcmcgUlRDX0ZMQUdfT1c6IE92ZXJmbG93IGZsYWcNCiAgKiAgICAgQGFyZyBSVENfRkxBR19BTFI6IEFsYXJtIGZsYWcNCiAgKiAgICAgQGFyZyBSVENfRkxBR19TRUM6IFNlY29uZCBmbGFnDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFJUQ19DbGVhckZsYWcodWludDE2X3QgUlRDX0ZMQUcpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19SVENfQ0xFQVJfRkxBRyhSVENfRkxBRykpOyANCiAgICANCiAgLyogQ2xlYXIgdGhlIGNvcmVzc3BvbmRpbmcgUlRDIGZsYWcgKi8NCiAgUlRDLT5DUkwgJj0gKHVpbnQxNl90KX5SVENfRkxBRzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIFJUQyBpbnRlcnJ1cHQgaGFzIG9jY3VyZWQgb3Igbm90Lg0KICAqIEBwYXJhbSAgUlRDX0lUOiBzcGVjaWZpZXMgdGhlIFJUQyBpbnRlcnJ1cHRzIHNvdXJjZXMgdG8gY2hlY2suDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFJUQ19JVF9PVzogT3ZlcmZsb3cgaW50ZXJydXB0DQogICogICAgIEBhcmcgUlRDX0lUX0FMUjogQWxhcm0gaW50ZXJydXB0DQogICogICAgIEBhcmcgUlRDX0lUX1NFQzogU2Vjb25kIGludGVycnVwdA0KICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiB0aGUgUlRDX0lUIChTRVQgb3IgUkVTRVQpLg0KICAqLw0KSVRTdGF0dXMgUlRDX0dldElUU3RhdHVzKHVpbnQxNl90IFJUQ19JVCkNCnsNCiAgSVRTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19SVENfR0VUX0lUKFJUQ19JVCkpOyANCiAgDQogIGJpdHN0YXR1cyA9IChJVFN0YXR1cykoUlRDLT5DUkwgJiBSVENfSVQpOw0KICBpZiAoKChSVEMtPkNSSCAmIFJUQ19JVCkgIT0gKHVpbnQxNl90KVJFU0VUKSAmJiAoYml0c3RhdHVzICE9ICh1aW50MTZfdClSRVNFVCkpDQogIHsNCiAgICBiaXRzdGF0dXMgPSBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgYml0c3RhdHVzID0gUkVTRVQ7DQogIH0NCiAgcmV0dXJuIGJpdHN0YXR1czsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDbGVhcnMgdGhlIFJUQ5JzIGludGVycnVwdCBwZW5kaW5nIGJpdHMuDQogICogQHBhcmFtICBSVENfSVQ6IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIGNsZWFyLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBSVENfSVRfT1c6IE92ZXJmbG93IGludGVycnVwdA0KICAqICAgICBAYXJnIFJUQ19JVF9BTFI6IEFsYXJtIGludGVycnVwdA0KICAqICAgICBAYXJnIFJUQ19JVF9TRUM6IFNlY29uZCBpbnRlcnJ1cHQNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgUlRDX0NsZWFySVRQZW5kaW5nQml0KHVpbnQxNl90IFJUQ19JVCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1JUQ19JVChSVENfSVQpKTsgIA0KICANCiAgLyogQ2xlYXIgdGhlIGNvcmVzc3BvbmRpbmcgUlRDIHBlbmRpbmcgYml0ICovDQogIFJUQy0+Q1JMICY9ICh1aW50MTZfdCl+UlRDX0lUOw0KfQ0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0K