LyoqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwOCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKioqKioqKioqKioqKioqKioNCiogRmlsZSBOYW1lICAgICAgICAgIDogc3RtMzJmMTB4X252aWMuYw0KKiBBdXRob3IgICAgICAgICAgICAgOiBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KKiBWZXJzaW9uICAgICAgICAgICAgOiBWMi4wLjENCiogRGF0ZSAgICAgICAgICAgICAgIDogMDYvMTMvMjAwOA0KKiBEZXNjcmlwdGlvbiAgICAgICAgOiBUaGlzIGZpbGUgcHJvdmlkZXMgYWxsIHRoZSBOVklDIGZpcm13YXJlIGZ1bmN0aW9ucy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIFRIRSBQUkVTRU5UIEZJUk1XQVJFIFdISUNIIElTIEZPUiBHVUlEQU5DRSBPTkxZIEFJTVMgQVQgUFJPVklESU5HIENVU1RPTUVSUw0KKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRSBUSU1FLg0KKiBBUyBBIFJFU1VMVCwgU1RNSUNST0VMRUNUUk9OSUNTIFNIQUxMIE5PVCBCRSBIRUxEIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwNCiogSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIFdJVEggUkVTUEVDVCBUTyBBTlkgQ0xBSU1TIEFSSVNJTkcgRlJPTSBUSEUNCiogQ09OVEVOVCBPRiBTVUNIIEZJUk1XQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRSBDT0RJTkcNCiogSU5GT1JNQVRJT04gQ09OVEFJTkVEIEhFUkVJTiBJTiBDT05ORUNUSU9OIFdJVEggVEhFSVIgUFJPRFVDVFMuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQovKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KI2luY2x1ZGUgInN0bTMyZjEweF9udmljLmgiDQoNCi8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KI2RlZmluZSBBSVJDUl9WRUNUS0VZX01BU0sgICAgKCh1MzIpMHgwNUZBMDAwMCkNCg0KLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBOVklDX0RlSW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IERlaW5pdGlhbGl6ZXMgdGhlIE5WSUMgcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdA0KKiAgICAgICAgICAgICAgICAgIHJlc2V0IHZhbHVlcy4NCiogSW5wdXQgICAgICAgICAgOiBOb25lDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIE5WSUNfRGVJbml0KHZvaWQpDQp7DQogIHUzMiBpbmRleCA9IDA7DQogIA0KICBOVklDLT5JQ0VSWzBdID0gMHhGRkZGRkZGRjsNCiAgTlZJQy0+SUNFUlsxXSA9IDB4MEZGRkZGRkY7DQogIE5WSUMtPklDUFJbMF0gPSAweEZGRkZGRkZGOw0KICBOVklDLT5JQ1BSWzFdID0gMHgwRkZGRkZGRjsNCiAgDQogIGZvcihpbmRleCA9IDA7IGluZGV4IDwgMHgwRjsgaW5kZXgrKykNCiAgew0KICAgICBOVklDLT5JUFJbaW5kZXhdID0gMHgwMDAwMDAwMDsNCiAgfSANCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBOVklDX1NDQkRlSW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IERlaW5pdGlhbGl6ZXMgdGhlIFNDQiBwZXJpcGhlcmFsIHJlZ2lzdGVycyB0byB0aGVpciBkZWZhdWx0IA0KKiAgICAgICAgICAgICAgICAgIHJlc2V0IHZhbHVlcy4NCiogSW5wdXQgICAgICAgICAgOiBOb25lDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIE5WSUNfU0NCRGVJbml0KHZvaWQpDQp7DQogIHUzMiBpbmRleCA9IDB4MDA7DQogIA0KICBTQ0ItPklDU1IgPSAweDBBMDAwMDAwOw0KICBTQ0ItPlZUT1IgPSAweDAwMDAwMDAwOw0KICBTQ0ItPkFJUkNSID0gQUlSQ1JfVkVDVEtFWV9NQVNLOw0KICBTQ0ItPlNDUiA9IDB4MDAwMDAwMDA7DQogIFNDQi0+Q0NSID0gMHgwMDAwMDAwMDsNCiAgZm9yKGluZGV4ID0gMDsgaW5kZXggPCAweDAzOyBpbmRleCsrKQ0KICB7DQogICAgIFNDQi0+U0hQUltpbmRleF0gPSAwOw0KICB9DQogIFNDQi0+U0hDU1IgPSAweDAwMDAwMDAwOw0KICBTQ0ItPkNGU1IgPSAweEZGRkZGRkZGOw0KICBTQ0ItPkhGU1IgPSAweEZGRkZGRkZGOw0KICBTQ0ItPkRGU1IgPSAweEZGRkZGRkZGOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IE5WSUNfUHJpb3JpdHlHcm91cENvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IENvbmZpZ3VyZXMgdGhlIHByaW9yaXR5IGdyb3VwaW5nOiBwcmUtZW1wdGlvbiBwcmlvcml0eQ0KKiAgICAgICAgICAgICAgICAgIGFuZCBzdWJwcmlvcml0eS4NCiogSW5wdXQgICAgICAgICAgOiAtIE5WSUNfUHJpb3JpdHlHcm91cDogc3BlY2lmaWVzIHRoZSBwcmlvcml0eSBncm91cGluZyBiaXRzDQoqICAgICAgICAgICAgICAgICAgICBsZW5ndGguIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIE5WSUNfUHJpb3JpdHlHcm91cF8wOiAwIGJpdHMgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5DQoqICAgICAgICAgICAgICAgICAgICAgICAgIDQgYml0cyBmb3Igc3VicHJpb3JpdHkNCiogICAgICAgICAgICAgICAgICAgICAgIC0gTlZJQ19Qcmlvcml0eUdyb3VwXzE6IDEgYml0cyBmb3IgcHJlLWVtcHRpb24gcHJpb3JpdHkNCiogICAgICAgICAgICAgICAgICAgICAgICAgMyBiaXRzIGZvciBzdWJwcmlvcml0eQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBOVklDX1ByaW9yaXR5R3JvdXBfMjogMiBiaXRzIGZvciBwcmUtZW1wdGlvbiBwcmlvcml0eQ0KKiAgICAgICAgICAgICAgICAgICAgICAgICAyIGJpdHMgZm9yIHN1YnByaW9yaXR5DQoqICAgICAgICAgICAgICAgICAgICAgICAtIE5WSUNfUHJpb3JpdHlHcm91cF8zOiAzIGJpdHMgZm9yIHByZS1lbXB0aW9uIHByaW9yaXR5DQoqICAgICAgICAgICAgICAgICAgICAgICAgIDEgYml0cyBmb3Igc3VicHJpb3JpdHkNCiogICAgICAgICAgICAgICAgICAgICAgIC0gTlZJQ19Qcmlvcml0eUdyb3VwXzQ6IDQgYml0cyBmb3IgcHJlLWVtcHRpb24gcHJpb3JpdHkNCiogICAgICAgICAgICAgICAgICAgICAgICAgMCBiaXRzIGZvciBzdWJwcmlvcml0eQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBOVklDX1ByaW9yaXR5R3JvdXBDb25maWcodTMyIE5WSUNfUHJpb3JpdHlHcm91cCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX05WSUNfUFJJT1JJVFlfR1JPVVAoTlZJQ19Qcmlvcml0eUdyb3VwKSk7DQogIA0KICAvKiBTZXQgdGhlIFBSSUdST1VQWzEwOjhdIGJpdHMgYWNjb3JkaW5nIHRvIE5WSUNfUHJpb3JpdHlHcm91cCB2YWx1ZSAqLw0KICBTQ0ItPkFJUkNSID0gQUlSQ1JfVkVDVEtFWV9NQVNLIHwgTlZJQ19Qcmlvcml0eUdyb3VwOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IE5WSUNfSW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IEluaXRpYWxpemVzIHRoZSBOVklDIHBlcmlwaGVyYWwgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCiogICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBOVklDX0luaXRTdHJ1Y3QuDQoqIElucHV0ICAgICAgICAgIDogLSBOVklDX0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBOVklDX0luaXRUeXBlRGVmIHN0cnVjdHVyZQ0KKiAgICAgICAgICAgICAgICAgICAgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlDQoqICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgTlZJQyBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBOVklDX0luaXQoTlZJQ19Jbml0VHlwZURlZiogTlZJQ19Jbml0U3RydWN0KQ0Kew0KICB1MzIgdG1wcHJpb3JpdHkgPSAweDAwLCB0bXByZWcgPSAweDAwLCB0bXBtYXNrID0gMHgwMDsNCiAgdTMyIHRtcHByZSA9IDAsIHRtcHN1YiA9IDB4MEY7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTlZJQ19Jbml0U3RydWN0LT5OVklDX0lSUUNoYW5uZWxDbWQpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX05WSUNfSVJRX0NIQU5ORUwoTlZJQ19Jbml0U3RydWN0LT5OVklDX0lSUUNoYW5uZWwpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX05WSUNfUFJFRU1QVElPTl9QUklPUklUWShOVklDX0luaXRTdHJ1Y3QtPk5WSUNfSVJRQ2hhbm5lbFByZWVtcHRpb25Qcmlvcml0eSkpOyAgDQogIGFzc2VydF9wYXJhbShJU19OVklDX1NVQl9QUklPUklUWShOVklDX0luaXRTdHJ1Y3QtPk5WSUNfSVJRQ2hhbm5lbFN1YlByaW9yaXR5KSk7DQogICAgDQogIGlmIChOVklDX0luaXRTdHJ1Y3QtPk5WSUNfSVJRQ2hhbm5lbENtZCAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogQ29tcHV0ZSB0aGUgQ29ycmVzcG9uZGluZyBJUlEgUHJpb3JpdHkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLyAgICANCiAgICB0bXBwcmlvcml0eSA9ICgweDcwMCAtIChTQ0ItPkFJUkNSICYgKHUzMikweDcwMCkpPj4gMHgwODsNCiAgICB0bXBwcmUgPSAoMHg0IC0gdG1wcHJpb3JpdHkpOw0KICAgIHRtcHN1YiA9IHRtcHN1YiA+PiB0bXBwcmlvcml0eTsNCiAgICANCiAgICB0bXBwcmlvcml0eSA9ICh1MzIpTlZJQ19Jbml0U3RydWN0LT5OVklDX0lSUUNoYW5uZWxQcmVlbXB0aW9uUHJpb3JpdHkgPDwgdG1wcHJlOw0KICAgIHRtcHByaW9yaXR5IHw9ICBOVklDX0luaXRTdHJ1Y3QtPk5WSUNfSVJRQ2hhbm5lbFN1YlByaW9yaXR5ICYgdG1wc3ViOw0KDQogICAgdG1wcHJpb3JpdHkgPSB0bXBwcmlvcml0eSA8PCAweDA0Ow0KICAgIHRtcHByaW9yaXR5ID0gKCh1MzIpdG1wcHJpb3JpdHkpIDw8ICgoTlZJQ19Jbml0U3RydWN0LT5OVklDX0lSUUNoYW5uZWwgJiAodTgpMHgwMykgKiAweDA4KTsNCiAgICANCiAgICB0bXByZWcgPSBOVklDLT5JUFJbKE5WSUNfSW5pdFN0cnVjdC0+TlZJQ19JUlFDaGFubmVsID4+IDB4MDIpXTsNCiAgICB0bXBtYXNrID0gKHUzMikweEZGIDw8ICgoTlZJQ19Jbml0U3RydWN0LT5OVklDX0lSUUNoYW5uZWwgJiAodTgpMHgwMykgKiAweDA4KTsNCiAgICB0bXByZWcgJj0gfnRtcG1hc2s7DQogICAgdG1wcHJpb3JpdHkgJj0gdG1wbWFzazsgIA0KICAgIHRtcHJlZyB8PSB0bXBwcmlvcml0eTsNCg0KICAgIE5WSUMtPklQUlsoTlZJQ19Jbml0U3RydWN0LT5OVklDX0lSUUNoYW5uZWwgPj4gMHgwMildID0gdG1wcmVnOw0KICAgIA0KICAgIC8qIEVuYWJsZSB0aGUgU2VsZWN0ZWQgSVJRIENoYW5uZWxzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgICBOVklDLT5JU0VSWyhOVklDX0luaXRTdHJ1Y3QtPk5WSUNfSVJRQ2hhbm5lbCA+PiAweDA1KV0gPQ0KICAgICAgKHUzMikweDAxIDw8IChOVklDX0luaXRTdHJ1Y3QtPk5WSUNfSVJRQ2hhbm5lbCAmICh1OCkweDFGKTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBTZWxlY3RlZCBJUlEgQ2hhbm5lbHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogICAgTlZJQy0+SUNFUlsoTlZJQ19Jbml0U3RydWN0LT5OVklDX0lSUUNoYW5uZWwgPj4gMHgwNSldID0NCiAgICAgICh1MzIpMHgwMSA8PCAoTlZJQ19Jbml0U3RydWN0LT5OVklDX0lSUUNoYW5uZWwgJiAodTgpMHgxRik7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBOVklDX1N0cnVjdEluaXQNCiogRGVzY3JpcHRpb24gICAgOiBGaWxscyBlYWNoIE5WSUNfSW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiAtIE5WSUNfSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIE5WSUNfSW5pdFR5cGVEZWYgc3RydWN0dXJlIHdoaWNoDQoqICAgICAgICAgICAgICAgICAgICB3aWxsIGJlIGluaXRpYWxpemVkLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBOVklDX1N0cnVjdEluaXQoTlZJQ19Jbml0VHlwZURlZiogTlZJQ19Jbml0U3RydWN0KQ0Kew0KICAvKiBOVklDX0luaXRTdHJ1Y3QgbWVtYmVycyBkZWZhdWx0IHZhbHVlICovDQogIE5WSUNfSW5pdFN0cnVjdC0+TlZJQ19JUlFDaGFubmVsID0gMHgwMDsNCiAgTlZJQ19Jbml0U3RydWN0LT5OVklDX0lSUUNoYW5uZWxQcmVlbXB0aW9uUHJpb3JpdHkgPSAweDAwOw0KICBOVklDX0luaXRTdHJ1Y3QtPk5WSUNfSVJRQ2hhbm5lbFN1YlByaW9yaXR5ID0gMHgwMDsNCiAgTlZJQ19Jbml0U3RydWN0LT5OVklDX0lSUUNoYW5uZWxDbWQgPSBESVNBQkxFOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IE5WSUNfU0VUUFJJTUFTSw0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgdGhlIFBSSU1BU0sgcHJpb3JpdHk6IFJhaXNlcyB0aGUgZXhlY3V0aW9uIHByaW9yaXR5IHRvIDAuDQoqIElucHV0ICAgICAgICAgIDogTm9uZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBOVklDX1NFVFBSSU1BU0sodm9pZCkNCnsNCiAgX19TRVRQUklNQVNLKCk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogTlZJQ19SRVNFVFBSSU1BU0sNCiogRGVzY3JpcHRpb24gICAgOiBEaXNhYmxlcyB0aGUgUFJJTUFTSyBwcmlvcml0eS4NCiogSW5wdXQgICAgICAgICAgOiBOb25lDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIE5WSUNfUkVTRVRQUklNQVNLKHZvaWQpDQp7DQogIF9fUkVTRVRQUklNQVNLKCk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogTlZJQ19TRVRGQVVMVE1BU0sNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIHRoZSBGQVVMVE1BU0sgcHJpb3JpdHk6IFJhaXNlcyB0aGUgZXhlY3V0aW9uIHByaW9yaXR5IHRvIC0xLg0KKiBJbnB1dCAgICAgICAgICA6IE5vbmUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgTlZJQ19TRVRGQVVMVE1BU0sodm9pZCkNCnsNCiAgX19TRVRGQVVMVE1BU0soKTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBOVklDX1JFU0VURkFVTFRNQVNLDQoqIERlc2NyaXB0aW9uICAgIDogRGlzYWJsZXMgdGhlIEZBVUxUTUFTSyBwcmlvcml0eS4NCiogSW5wdXQgICAgICAgICAgOiBOb25lDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIE5WSUNfUkVTRVRGQVVMVE1BU0sodm9pZCkNCnsNCiAgX19SRVNFVEZBVUxUTUFTSygpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IE5WSUNfQkFTRVBSSUNPTkZJRw0KKiBEZXNjcmlwdGlvbiAgICA6IFRoZSBleGVjdXRpb24gcHJpb3JpdHkgY2FuIGJlIGNoYW5nZWQgZnJvbSAxNSAobG93ZXN0IA0KICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZSBwcmlvcml0eSkgdG8gMS4gV3JpdGluZyBhIHplcm8gIHZhbHVlIHdpbGwgZGlzYWJsZSANCiogICAgICAgICAgICAgICAgICB0aGUgbWFzayBvZiBleGVjdXRpb24gcHJpb3JpdHkuDQoqIElucHV0ICAgICAgICAgIDogTm9uZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBOVklDX0JBU0VQUklDT05GSUcodTMyIE5ld1ByaW9yaXR5KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfTlZJQ19CQVNFX1BSSShOZXdQcmlvcml0eSkpOw0KICANCiAgX19CQVNFUFJJQ09ORklHKE5ld1ByaW9yaXR5IDw8IDB4MDQpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IE5WSUNfR2V0QkFTRVBSSQ0KKiBEZXNjcmlwdGlvbiAgICA6IFJldHVybnMgdGhlIEJBU0VQUkkgbWFzayB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiBOb25lDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IEJBU0VQUkkgcmVnaXN0ZXIgdmFsdWUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1MzIgTlZJQ19HZXRCQVNFUFJJKHZvaWQpDQp7DQogIHJldHVybiAoX19HZXRCQVNFUFJJKCkpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IE5WSUNfR2V0Q3VycmVudFBlbmRpbmdJUlFDaGFubmVsDQoqIERlc2NyaXB0aW9uICAgIDogUmV0dXJucyB0aGUgY3VycmVudCBwZW5kaW5nIElSUSBjaGFubmVsIGlkZW50aWZpZXIuDQoqIElucHV0ICAgICAgICAgIDogTm9uZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBQZW5kaW5nIElSUSBDaGFubmVsIElkZW50aWZpZXIuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdTE2IE5WSUNfR2V0Q3VycmVudFBlbmRpbmdJUlFDaGFubmVsKHZvaWQpDQp7DQogIHJldHVybiAoKHUxNikoKFNDQi0+SUNTUiAmICh1MzIpMHgwMDNGRjAwMCkgPj4gMHgwQykpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IE5WSUNfR2V0SVJRQ2hhbm5lbFBlbmRpbmdCaXRTdGF0dXMNCiogRGVzY3JpcHRpb24gICAgOiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIElSUSBDaGFubmVsIHBlbmRpbmcgYml0IGlzIHNldA0KKiAgICAgICAgICAgICAgICAgIG9yIG5vdC4NCiogSW5wdXQgICAgICAgICAgOiAtIE5WSUNfSVJRQ2hhbm5lbDogc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgdG8gY2hlY2suDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBuZXcgc3RhdGUgb2YgSVJRIENoYW5uZWwgcGVuZGluZyBiaXQoU0VUIG9yIFJFU0VUKS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpJVFN0YXR1cyBOVklDX0dldElSUUNoYW5uZWxQZW5kaW5nQml0U3RhdHVzKHU4IE5WSUNfSVJRQ2hhbm5lbCkNCnsNCiAgSVRTdGF0dXMgcGVuZGluZ2lycXN0YXR1cyA9IFJFU0VUOw0KICB1MzIgdG1wID0gMHgwMDsNCiAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19OVklDX0lSUV9DSEFOTkVMKE5WSUNfSVJRQ2hhbm5lbCkpOw0KICANCiAgdG1wID0gKCh1MzIpMHgwMSA8PCAoTlZJQ19JUlFDaGFubmVsICYgKHUzMikweDFGKSk7DQoNCiAgaWYgKCgoTlZJQy0+SVNQUlsoTlZJQ19JUlFDaGFubmVsID4+IDB4MDUpXSkgJiB0bXApID09IHRtcCkNCiAgew0KICAgIHBlbmRpbmdpcnFzdGF0dXMgPSBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgcGVuZGluZ2lycXN0YXR1cyA9IFJFU0VUOw0KICB9DQogIHJldHVybiBwZW5kaW5naXJxc3RhdHVzOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IE5WSUNfU2V0SVJRQ2hhbm5lbFBlbmRpbmdCaXQNCiogRGVzY3JpcHRpb24gICAgOiBTZXRzIHRoZSBOVklDknMgaW50ZXJydXB0IHBlbmRpbmcgYml0Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gTlZJQ19JUlFDaGFubmVsOiBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBwZW5kaW5nIGJpdCB0byBTZXQuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIE5WSUNfU2V0SVJRQ2hhbm5lbFBlbmRpbmdCaXQodTggTlZJQ19JUlFDaGFubmVsKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfTlZJQ19JUlFfQ0hBTk5FTChOVklDX0lSUUNoYW5uZWwpKTsNCiAgDQogICoodnUzMiopIDB4RTAwMEVGMDAgPSAodTMyKU5WSUNfSVJRQ2hhbm5lbDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBOVklDX0NsZWFySVJRQ2hhbm5lbFBlbmRpbmdCaXQNCiogRGVzY3JpcHRpb24gICAgOiBDbGVhcnMgdGhlIE5WSUOScyBpbnRlcnJ1cHQgcGVuZGluZyBiaXQuDQoqIElucHV0ICAgICAgICAgIDogLSBOVklDX0lSUUNoYW5uZWw6IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIGNsZWFyLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBOVklDX0NsZWFySVJRQ2hhbm5lbFBlbmRpbmdCaXQodTggTlZJQ19JUlFDaGFubmVsKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfTlZJQ19JUlFfQ0hBTk5FTChOVklDX0lSUUNoYW5uZWwpKTsNCiAgDQogIE5WSUMtPklDUFJbKE5WSUNfSVJRQ2hhbm5lbCA+PiAweDA1KV0gPSAodTMyKTB4MDEgPDwgKE5WSUNfSVJRQ2hhbm5lbCAmICh1MzIpMHgxRik7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogTlZJQ19HZXRDdXJyZW50QWN0aXZlSGFuZGxlcg0KKiBEZXNjcmlwdGlvbiAgICA6IFJldHVybnMgdGhlIGN1cnJlbnQgYWN0aXZlIEhhbmRsZXIgKElSUSBDaGFubmVsIGFuZA0KKiAgICAgICAgICAgICAgICAgIFN5c3RlbUhhbmRsZXIpIGlkZW50aWZpZXIuDQoqIElucHV0ICAgICAgICAgIDogTm9uZQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBBY3RpdmUgSGFuZGxlciBJZGVudGlmaWVyLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnUxNiBOVklDX0dldEN1cnJlbnRBY3RpdmVIYW5kbGVyKHZvaWQpDQp7DQogIHJldHVybiAoKHUxNikoU0NCLT5JQ1NSICYgKHUzMikweDNGRikpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IE5WSUNfR2V0SVJRQ2hhbm5lbEFjdGl2ZUJpdFN0YXR1cw0KKiBEZXNjcmlwdGlvbiAgICA6IENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgSVJRIENoYW5uZWwgYWN0aXZlIGJpdCBpcyBzZXQNCiogICAgICAgICAgICAgICAgICBvciBub3QuDQoqIElucHV0ICAgICAgICAgIDogLSBOVklDX0lSUUNoYW5uZWw6IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IGFjdGl2ZSBiaXQgdG8gY2hlY2suDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBuZXcgc3RhdGUgb2YgSVJRIENoYW5uZWwgYWN0aXZlIGJpdChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCklUU3RhdHVzIE5WSUNfR2V0SVJRQ2hhbm5lbEFjdGl2ZUJpdFN0YXR1cyh1OCBOVklDX0lSUUNoYW5uZWwpDQp7DQogIElUU3RhdHVzIGFjdGl2ZWlycXN0YXR1cyA9IFJFU0VUOw0KICB1MzIgdG1wID0gMHgwMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfTlZJQ19JUlFfQ0hBTk5FTChOVklDX0lSUUNoYW5uZWwpKTsNCiAgDQogIHRtcCA9ICgodTMyKTB4MDEgPDwgKE5WSUNfSVJRQ2hhbm5lbCAmICh1MzIpMHgxRikpOw0KDQogIGlmICgoKE5WSUMtPklBQlJbKE5WSUNfSVJRQ2hhbm5lbCA+PiAweDA1KV0pICYgdG1wKSA9PSB0bXAgKQ0KICB7DQogICAgYWN0aXZlaXJxc3RhdHVzID0gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIGFjdGl2ZWlycXN0YXR1cyA9IFJFU0VUOw0KICB9DQogIHJldHVybiBhY3RpdmVpcnFzdGF0dXM7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogTlZJQ19HZXRDUFVJRA0KKiBEZXNjcmlwdGlvbiAgICA6IFJldHVybnMgdGhlIElEIG51bWJlciwgdGhlIHZlcnNpb24gbnVtYmVyIGFuZCB0aGUgaW1wbGVtZW50YXRpb24NCiogICAgICAgICAgICAgICAgICBkZXRhaWxzIG9mIHRoZSBDb3J0ZXgtTTMgY29yZS4NCiogSW5wdXQgICAgICAgICAgOiBOb25lDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IENQVSBJRC4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1MzIgTlZJQ19HZXRDUFVJRCh2b2lkKQ0Kew0KICByZXR1cm4gKFNDQi0+Q1BVSUQpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IE5WSUNfU2V0VmVjdG9yVGFibGUNCiogRGVzY3JpcHRpb24gICAgOiBTZXRzIHRoZSB2ZWN0b3IgdGFibGUgbG9jYXRpb24gYW5kIE9mZnNldC4NCiogSW5wdXQgICAgICAgICAgOiAtIE5WSUNfVmVjdFRhYjogc3BlY2lmaWVzIGlmIHRoZSB2ZWN0b3IgdGFibGUgaXMgaW4gUkFNIG9yDQoqICAgICAgICAgICAgICAgICAgICBGTEFTSCBtZW1vcnkuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBOVklDX1ZlY3RUYWJfUkFNDQoqICAgICAgICAgICAgICAgICAgICAgICAtIE5WSUNfVmVjdFRhYl9GTEFTSA0KKiAgICAgICAgICAgICAgICAgIC0gT2Zmc2V0OiBWZWN0b3IgVGFibGUgYmFzZSBvZmZzZXQgZmllbGQuIA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHZhbHVlIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAweDEwMC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgTlZJQ19TZXRWZWN0b3JUYWJsZSh1MzIgTlZJQ19WZWN0VGFiLCB1MzIgT2Zmc2V0KQ0KeyANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX05WSUNfVkVDVFRBQihOVklDX1ZlY3RUYWIpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX05WSUNfT0ZGU0VUKE9mZnNldCkpOyAgDQogICANCiAgU0NCLT5WVE9SID0gTlZJQ19WZWN0VGFiIHwgKE9mZnNldCAmICh1MzIpMHgxRkZGRkY4MCk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogTlZJQ19HZW5lcmF0ZVN5c3RlbVJlc2V0DQoqIERlc2NyaXB0aW9uICAgIDogR2VuZXJhdGVzIGEgc3lzdGVtIHJlc2V0Lg0KKiBJbnB1dCAgICAgICAgICA6IE5vbmUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgTlZJQ19HZW5lcmF0ZVN5c3RlbVJlc2V0KHZvaWQpDQp7DQogIFNDQi0+QUlSQ1IgPSBBSVJDUl9WRUNUS0VZX01BU0sgfCAodTMyKTB4MDQ7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogTlZJQ19HZW5lcmF0ZUNvcmVSZXNldA0KKiBEZXNjcmlwdGlvbiAgICA6IEdlbmVyYXRlcyBhIENvcmUgKENvcmUgKyBOVklDKSByZXNldC4NCiogSW5wdXQgICAgICAgICAgOiBOb25lDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIE5WSUNfR2VuZXJhdGVDb3JlUmVzZXQodm9pZCkNCnsNCiAgU0NCLT5BSVJDUiA9IEFJUkNSX1ZFQ1RLRVlfTUFTSyB8ICh1MzIpMHgwMTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBOVklDX1N5c3RlbUxQQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogU2VsZWN0cyB0aGUgY29uZGl0aW9uIGZvciB0aGUgc3lzdGVtIHRvIGVudGVyIGxvdyBwb3dlciBtb2RlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gTG93UG93ZXJNb2RlOiBTcGVjaWZpZXMgdGhlIG5ldyBtb2RlIGZvciB0aGUgc3lzdGVtIHRvIGVudGVyDQoqICAgICAgICAgICAgICAgICAgICBsb3cgcG93ZXIgbW9kZS4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIE5WSUNfTFBfU0VWT05QRU5EDQoqICAgICAgICAgICAgICAgICAgICAgICAtIE5WSUNfTFBfU0xFRVBERUVQDQoqICAgICAgICAgICAgICAgICAgICAgICAtIE5WSUNfTFBfU0xFRVBPTkVYSVQNCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgTFAgY29uZGl0aW9uLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgTlZJQ19TeXN0ZW1MUENvbmZpZyh1OCBMb3dQb3dlck1vZGUsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX05WSUNfTFAoTG93UG93ZXJNb2RlKSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7ICANCiAgDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgU0NCLT5TQ1IgfD0gTG93UG93ZXJNb2RlOw0KICB9DQogIGVsc2UNCiAgew0KICAgIFNDQi0+U0NSICY9ICh1MzIpKH4odTMyKUxvd1Bvd2VyTW9kZSk7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBOVklDX1N5c3RlbUhhbmRsZXJDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgU3lzdGVtIEhhbmRsZXJzLg0KKiBJbnB1dCAgICAgICAgICA6IC0gU3lzdGVtSGFuZGxlcjogc3BlY2lmaWVzIHRoZSBzeXN0ZW0gaGFuZGxlciB0byBiZSBlbmFibGVkDQoqICAgICAgICAgICAgICAgICAgICBvciBkaXNhYmxlZC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFN5c3RlbUhhbmRsZXJfTWVtb3J5TWFuYWdlDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFN5c3RlbUhhbmRsZXJfQnVzRmF1bHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU3lzdGVtSGFuZGxlcl9Vc2FnZUZhdWx0DQoqICAgICAgICAgICAgICAgICAgLSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mICBzcGVjaWZpZWQgU3lzdGVtIEhhbmRsZXJzLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgTlZJQ19TeXN0ZW1IYW5kbGVyQ29uZmlnKHUzMiBTeXN0ZW1IYW5kbGVyLCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIHUzMiB0bXByZWcgPSAweDAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19DT05GSUdfU1lTVEVNX0hBTkRMRVIoU3lzdGVtSGFuZGxlcikpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOyANCiAgDQogIHRtcHJlZyA9ICAodTMyKTB4MDEgPDwgKFN5c3RlbUhhbmRsZXIgJiAodTMyKTB4MUYpOw0KDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgU0NCLT5TSENTUiB8PSB0bXByZWc7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgU0NCLT5TSENTUiAmPSB+dG1wcmVnOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogTlZJQ19TeXN0ZW1IYW5kbGVyUHJpb3JpdHlDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBDb25maWd1cmVzIHRoZSBzcGVjaWZpZWQgU3lzdGVtIEhhbmRsZXJzIHByaW9yaXR5Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gU3lzdGVtSGFuZGxlcjogc3BlY2lmaWVzIHRoZSBzeXN0ZW0gaGFuZGxlciB0byBiZQ0KKiAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCBvciBkaXNhYmxlZC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFN5c3RlbUhhbmRsZXJfTWVtb3J5TWFuYWdlDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFN5c3RlbUhhbmRsZXJfQnVzRmF1bHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU3lzdGVtSGFuZGxlcl9Vc2FnZUZhdWx0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFN5c3RlbUhhbmRsZXJfU1ZDYWxsDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFN5c3RlbUhhbmRsZXJfRGVidWdNb25pdG9yDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFN5c3RlbUhhbmRsZXJfUFNWDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFN5c3RlbUhhbmRsZXJfU3lzVGljaw0KKiAgICAgICAgICAgICAgICAgIC0gU3lzdGVtSGFuZGxlclByZWVtcHRpb25Qcmlvcml0eTogbmV3IHByaW9yaXR5IGdyb3VwIG9mIHRoZQ0KKiAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIHN5c3RlbSBoYW5kbGVycy4NCiogICAgICAgICAgICAgICAgICAtIFN5c3RlbUhhbmRsZXJTdWJQcmlvcml0eTogbmV3IHN1YiBwcmlvcml0eSBvZiB0aGUgc3BlY2lmaWVkDQoqICAgICAgICAgICAgICAgICAgICBzeXN0ZW0gaGFuZGxlcnMuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIE5WSUNfU3lzdGVtSGFuZGxlclByaW9yaXR5Q29uZmlnKHUzMiBTeXN0ZW1IYW5kbGVyLCB1OCBTeXN0ZW1IYW5kbGVyUHJlZW1wdGlvblByaW9yaXR5LA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1OCBTeXN0ZW1IYW5kbGVyU3ViUHJpb3JpdHkpDQp7DQogIHUzMiB0bXAxID0gMHgwMCwgdG1wMiA9IDB4RkYsIGhhbmRsZXJtYXNrID0gMHgwMDsNCiAgdTMyIHRtcHByaW9yaXR5ID0gMHgwMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfUFJJT1JJVFlfU1lTVEVNX0hBTkRMRVIoU3lzdGVtSGFuZGxlcikpOw0KICBhc3NlcnRfcGFyYW0oSVNfTlZJQ19QUkVFTVBUSU9OX1BSSU9SSVRZKFN5c3RlbUhhbmRsZXJQcmVlbXB0aW9uUHJpb3JpdHkpKTsgIA0KICBhc3NlcnRfcGFyYW0oSVNfTlZJQ19TVUJfUFJJT1JJVFkoU3lzdGVtSGFuZGxlclN1YlByaW9yaXR5KSk7DQogICAgDQogIHRtcHByaW9yaXR5ID0gKDB4NzAwIC0gKFNDQi0+QUlSQ1IgJiAodTMyKTB4NzAwKSk+PiAweDA4Ow0KICB0bXAxID0gKDB4NCAtIHRtcHByaW9yaXR5KTsNCiAgdG1wMiA9IHRtcDIgPj4gdG1wcHJpb3JpdHk7DQogICAgDQogIHRtcHByaW9yaXR5ID0gKHUzMilTeXN0ZW1IYW5kbGVyUHJlZW1wdGlvblByaW9yaXR5IDw8IHRtcDE7DQogIHRtcHByaW9yaXR5IHw9ICBTeXN0ZW1IYW5kbGVyU3ViUHJpb3JpdHkgJiB0bXAyOw0KDQogIHRtcHByaW9yaXR5ID0gdG1wcHJpb3JpdHkgPDwgMHgwNDsNCiAgdG1wMSA9IFN5c3RlbUhhbmRsZXIgJiAodTMyKTB4QzA7DQogIHRtcDEgPSB0bXAxID4+IDB4MDY7IA0KICB0bXAyID0gKFN5c3RlbUhhbmRsZXIgPj4gMHgwOCkgJiAodTMyKTB4MDM7DQogIHRtcHByaW9yaXR5ID0gdG1wcHJpb3JpdHkgPDwgKHRtcDIgKiAweDA4KTsNCiAgaGFuZGxlcm1hc2sgPSAodTMyKTB4RkYgPDwgKHRtcDIgKiAweDA4KTsNCiAgDQogIFNDQi0+U0hQUlt0bXAxXSAmPSB+aGFuZGxlcm1hc2s7DQogIFNDQi0+U0hQUlt0bXAxXSB8PSB0bXBwcmlvcml0eTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBOVklDX0dldFN5c3RlbUhhbmRsZXJQZW5kaW5nQml0U3RhdHVzDQoqIERlc2NyaXB0aW9uICAgIDogQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBTeXN0ZW0gaGFuZGxlcnMgcGVuZGluZyBiaXQgaXMNCiogICAgICAgICAgICAgICAgICBzZXQgb3Igbm90Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gU3lzdGVtSGFuZGxlcjogc3BlY2lmaWVzIHRoZSBzeXN0ZW0gaGFuZGxlciBwZW5kaW5nIGJpdCB0bw0KKiAgICAgICAgICAgICAgICAgICAgY2hlY2suDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBTeXN0ZW1IYW5kbGVyX01lbW9yeU1hbmFnZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBTeXN0ZW1IYW5kbGVyX0J1c0ZhdWx0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFN5c3RlbUhhbmRsZXJfU1ZDYWxsDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBuZXcgc3RhdGUgb2YgU3lzdGVtIEhhbmRsZXIgcGVuZGluZyBiaXQoU0VUIG9yIFJFU0VUKS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpJVFN0YXR1cyBOVklDX0dldFN5c3RlbUhhbmRsZXJQZW5kaW5nQml0U3RhdHVzKHUzMiBTeXN0ZW1IYW5kbGVyKQ0Kew0KICBJVFN0YXR1cyBiaXRzdGF0dXMgID0gUkVTRVQ7DQogIHUzMiB0bXAgPSAweDAwLCB0bXBwb3MgPSAweDAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19HRVRfUEVORElOR19TWVNURU1fSEFORExFUihTeXN0ZW1IYW5kbGVyKSk7DQogIA0KICB0bXBwb3MgPSAoU3lzdGVtSGFuZGxlciA+PiAweDBBKTsNCiAgdG1wcG9zICY9ICh1MzIpMHgwRjsNCg0KICB0bXBwb3MgPSAodTMyKTB4MDEgPDwgdG1wcG9zOw0KDQogIHRtcCA9IFNDQi0+U0hDU1IgJiB0bXBwb3M7DQoNCiAgaWYgKHRtcCA9PSB0bXBwb3MpDQogIHsNCiAgICBiaXRzdGF0dXMgPSBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgYml0c3RhdHVzID0gUkVTRVQ7DQogIH0NCiAgcmV0dXJuIGJpdHN0YXR1czsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBOVklDX1NldFN5c3RlbUhhbmRsZXJQZW5kaW5nQml0DQoqIERlc2NyaXB0aW9uICAgIDogU2V0cyBTeXN0ZW0gSGFuZGxlciBwZW5kaW5nIGJpdC4NCiogSW5wdXQgICAgICAgICAgOiAtIFN5c3RlbUhhbmRsZXI6IHNwZWNpZmllcyB0aGUgc3lzdGVtIGhhbmRsZXIgcGVuZGluZyBiaXQNCiogICAgICAgICAgICAgICAgICAgIHRvIGJlIHNldC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFN5c3RlbUhhbmRsZXJfTk1JDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFN5c3RlbUhhbmRsZXJfUFNWDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFN5c3RlbUhhbmRsZXJfU3lzVGljaw0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBOVklDX1NldFN5c3RlbUhhbmRsZXJQZW5kaW5nQml0KHUzMiBTeXN0ZW1IYW5kbGVyKQ0Kew0KICB1MzIgdG1wID0gMHgwMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfU0VUX1BFTkRJTkdfU1lTVEVNX0hBTkRMRVIoU3lzdGVtSGFuZGxlcikpOw0KICANCiAgLyogR2V0IHRoZSBTeXN0ZW0gSGFuZGxlciBwZW5kaW5nIGJpdCBwb3NpdGlvbiAqLw0KICB0bXAgPSBTeXN0ZW1IYW5kbGVyICYgKHUzMikweDFGOw0KICAvKiBTZXQgdGhlIGNvcnJlc3BvbmRpbmcgU3lzdGVtIEhhbmRsZXIgcGVuZGluZyBiaXQgKi8NCiAgU0NCLT5JQ1NSIHw9ICgodTMyKTB4MDEgPDwgdG1wKTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBOVklDX0NsZWFyU3lzdGVtSGFuZGxlclBlbmRpbmdCaXQNCiogRGVzY3JpcHRpb24gICAgOiBDbGVhcnMgU3lzdGVtIEhhbmRsZXIgcGVuZGluZyBiaXQuDQoqIElucHV0ICAgICAgICAgIDogLSBTeXN0ZW1IYW5kbGVyOiBzcGVjaWZpZXMgdGhlIHN5c3RlbSBoYW5kbGVyIHBlbmRpbmcgYml0IHRvDQoqICAgICAgICAgICAgICAgICAgICBiZSBjbGVhci4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFN5c3RlbUhhbmRsZXJfUFNWDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFN5c3RlbUhhbmRsZXJfU3lzVGljaw0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBOVklDX0NsZWFyU3lzdGVtSGFuZGxlclBlbmRpbmdCaXQodTMyIFN5c3RlbUhhbmRsZXIpDQp7DQogIHUzMiB0bXAgPSAweDAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19DTEVBUl9TWVNURU1fSEFORExFUihTeXN0ZW1IYW5kbGVyKSk7DQogIA0KICAvKiBHZXQgdGhlIFN5c3RlbSBIYW5kbGVyIHBlbmRpbmcgYml0IHBvc2l0aW9uICovDQogIHRtcCA9IFN5c3RlbUhhbmRsZXIgJiAodTMyKTB4MUY7DQogIC8qIENsZWFyIHRoZSBjb3JyZXNwb25kaW5nIFN5c3RlbSBIYW5kbGVyIHBlbmRpbmcgYml0ICovDQogIFNDQi0+SUNTUiB8PSAoKHUzMikweDAxIDw8ICh0bXAgLSAweDAxKSk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogTlZJQ19HZXRTeXN0ZW1IYW5kbGVyQWN0aXZlQml0U3RhdHVzDQoqIERlc2NyaXB0aW9uICAgIDogQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBTeXN0ZW0gaGFuZGxlcnMgYWN0aXZlIGJpdCBpcw0KKiAgICAgICAgICAgICAgICAgIHNldCBvciBub3QuDQoqIElucHV0ICAgICAgICAgIDogLSBTeXN0ZW1IYW5kbGVyOiBzcGVjaWZpZXMgdGhlIHN5c3RlbSBoYW5kbGVyIGFjdGl2ZSBiaXQgdG8NCiogICAgICAgICAgICAgICAgICAgIGNoZWNrLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU3lzdGVtSGFuZGxlcl9NZW1vcnlNYW5hZ2UNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU3lzdGVtSGFuZGxlcl9CdXNGYXVsdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBTeXN0ZW1IYW5kbGVyX1VzYWdlRmF1bHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU3lzdGVtSGFuZGxlcl9TVkNhbGwNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU3lzdGVtSGFuZGxlcl9EZWJ1Z01vbml0b3INCiogICAgICAgICAgICAgICAgICAgICAgIC0gU3lzdGVtSGFuZGxlcl9QU1YNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU3lzdGVtSGFuZGxlcl9TeXNUaWNrDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBuZXcgc3RhdGUgb2YgU3lzdGVtIEhhbmRsZXIgYWN0aXZlIGJpdChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCklUU3RhdHVzIE5WSUNfR2V0U3lzdGVtSGFuZGxlckFjdGl2ZUJpdFN0YXR1cyh1MzIgU3lzdGVtSGFuZGxlcikNCnsNCiAgSVRTdGF0dXMgYml0c3RhdHVzICA9IFJFU0VUOw0KDQogIHUzMiB0bXAgPSAweDAwLCB0bXBwb3MgPSAweDAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19HRVRfQUNUSVZFX1NZU1RFTV9IQU5ETEVSKFN5c3RlbUhhbmRsZXIpKTsNCiAgDQogIHRtcHBvcyA9IChTeXN0ZW1IYW5kbGVyID4+IDB4MEUpICYgKHUzMikweDBGOw0KDQogIHRtcHBvcyA9ICh1MzIpMHgwMSA8PCB0bXBwb3M7DQoNCiAgdG1wID0gU0NCLT5TSENTUiAmIHRtcHBvczsNCg0KICBpZiAodG1wID09IHRtcHBvcykNCiAgew0KICAgIGJpdHN0YXR1cyA9IFNFVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgfQ0KICByZXR1cm4gYml0c3RhdHVzOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IE5WSUNfR2V0RmF1bHRIYW5kbGVyU291cmNlcw0KKiBEZXNjcmlwdGlvbiAgICA6IFJldHVybnMgdGhlIHN5c3RlbSBmYXVsdCBoYW5kbGVycyBzb3VyY2VzLg0KKiBJbnB1dCAgICAgICAgICA6IC0gU3lzdGVtSGFuZGxlcjogc3BlY2lmaWVzIHRoZSBzeXN0ZW0gaGFuZGxlciB0byBnZXQgaXRzIGZhdWx0DQoqICAgICAgICAgICAgICAgICAgICBzb3VyY2VzLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU3lzdGVtSGFuZGxlcl9IYXJkRmF1bHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU3lzdGVtSGFuZGxlcl9NZW1vcnlNYW5hZ2UNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU3lzdGVtSGFuZGxlcl9CdXNGYXVsdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBTeXN0ZW1IYW5kbGVyX1VzYWdlRmF1bHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU3lzdGVtSGFuZGxlcl9EZWJ1Z01vbml0b3INCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogU291cmNlIG9mIHRoZSBmYXVsdCBoYW5kbGVyLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnUzMiBOVklDX0dldEZhdWx0SGFuZGxlclNvdXJjZXModTMyIFN5c3RlbUhhbmRsZXIpDQp7DQogIHUzMiBmYXVsdHNvdXJjZXMgPSAweDAwOw0KICB1MzIgdG1wcmVnID0gMHgwMCwgdG1wcG9zID0gMHgwMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRkFVTFRfU09VUkNFX1NZU1RFTV9IQU5ETEVSKFN5c3RlbUhhbmRsZXIpKTsNCiAgDQogIHRtcHJlZyA9IChTeXN0ZW1IYW5kbGVyID4+IDB4MTIpICYgKHUzMikweDAzOw0KICB0bXBwb3MgPSAoU3lzdGVtSGFuZGxlciA+PiAweDE0KSAmICh1MzIpMHgwMzsNCg0KICBpZiAodG1wcmVnID09IDB4MDApDQogIHsNCiAgICBmYXVsdHNvdXJjZXMgPSBTQ0ItPkhGU1I7DQogIH0NCiAgZWxzZSBpZiAodG1wcmVnID09IDB4MDEpDQogIHsNCiAgICBmYXVsdHNvdXJjZXMgPSBTQ0ItPkNGU1IgPj4gKHRtcHBvcyAqIDB4MDgpOw0KICAgIGlmICh0bXBwb3MgIT0gMHgwMikNCiAgICB7DQogICAgICBmYXVsdHNvdXJjZXMgJj0gKHUzMikweDBGOw0KICAgIH0NCiAgICBlbHNlDQogICAgew0KICAgICAgZmF1bHRzb3VyY2VzICY9ICh1MzIpMHhGRjsNCiAgICB9DQogIH0NCiAgZWxzZQ0KICB7DQogICAgZmF1bHRzb3VyY2VzID0gU0NCLT5ERlNSOw0KICB9DQogIHJldHVybiBmYXVsdHNvdXJjZXM7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogTlZJQ19HZXRGYXVsdEFkZHJlc3MNCiogRGVzY3JpcHRpb24gICAgOiBSZXR1cm5zIHRoZSBhZGRyZXNzIG9mIHRoZSBsb2NhdGlvbiB0aGF0IGdlbmVyYXRlZCBhIGZhdWx0DQoqICAgICAgICAgICAgICAgICAgaGFuZGxlci4NCiogSW5wdXQgICAgICAgICAgOiAtIFN5c3RlbUhhbmRsZXI6IHNwZWNpZmllcyB0aGUgc3lzdGVtIGhhbmRsZXIgdG8gZ2V0IGl0cw0KKiAgICAgICAgICAgICAgICAgICAgZmF1bHQgYWRkcmVzcy4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFN5c3RlbUhhbmRsZXJfTWVtb3J5TWFuYWdlDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFN5c3RlbUhhbmRsZXJfQnVzRmF1bHQNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogRmF1bHQgYWRkcmVzcy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1MzIgTlZJQ19HZXRGYXVsdEFkZHJlc3ModTMyIFN5c3RlbUhhbmRsZXIpDQp7DQogIHUzMiBmYXVsdGFkZHJlc3MgPSAweDAwOw0KICB1MzIgdG1wID0gMHgwMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfRkFVTFRfQUREUkVTU19TWVNURU1fSEFORExFUihTeXN0ZW1IYW5kbGVyKSk7DQogIA0KICB0bXAgPSAoU3lzdGVtSGFuZGxlciA+PiAweDE2KSAmICh1MzIpMHgwMTsNCg0KICBpZiAodG1wID09IDB4MDApDQogIHsNCiAgICBmYXVsdGFkZHJlc3MgPSBTQ0ItPk1NRkFSOw0KICB9DQogIGVsc2UNCiAgew0KICAgIGZhdWx0YWRkcmVzcyA9IFNDQi0+QkZBUjsNCiAgfQ0KICByZXR1cm4gZmF1bHRhZGRyZXNzOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMDggU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0K