LyoqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwNyBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKioqKioqKioqKioqKioqKioNCiogRmlsZSBOYW1lICAgICAgICAgIDogc3RtMzJmMTB4X3NwaS5jDQoqIEF1dGhvciAgICAgICAgICAgICA6IE1DRCBBcHBsaWNhdGlvbiBUZWFtDQoqIERhdGUgRmlyc3QgSXNzdWVkICA6IDA5LzI5LzIwMDYNCiogRGVzY3JpcHRpb24gICAgICAgIDogVGhpcyBmaWxlIHByb3ZpZGVzIGFsbCB0aGUgU1BJIGZpcm13YXJlIGZ1bmN0aW9ucy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEhpc3Rvcnk6DQoqIDA0LzAyLzIwMDc6IFYwLjINCiogMDIvMDUvMjAwNzogVjAuMQ0KKiAwOS8yOS8yMDA2OiBWMC4wMQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogVEhFIFBSRVNFTlQgU09GVFdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQoqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFIFRJTUUuDQoqIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkgRElSRUNULA0KKiBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORyBGUk9NIFRIRQ0KKiBDT05URU5UIE9GIFNVQ0ggU09GVFdBUkUgQU5EL09SIFRIRSBVU0UgTUFERSBCWSBDVVNUT01FUlMgT0YgVEhFIENPRElORw0KKiBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCi8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQojaW5jbHVkZSAic3RtMzJmMTB4X3NwaS5oIg0KI2luY2x1ZGUgInN0bTMyZjEweF9yY2MuaCINCg0KLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBTUEkgU1BFIG1hc2sgKi8NCiNkZWZpbmUgQ1IxX1NQRV9TZXQgICAgICAgICAgKCh1MTYpMHgwMDQwKQ0KI2RlZmluZSBDUjFfU1BFX1Jlc2V0ICAgICAgICAoKHUxNikweEZGQkYpDQoNCi8qIFNQSSBDUkNOZXh0IG1hc2sgKi8NCiNkZWZpbmUgQ1IxX0NSQ05leHRfU2V0ICAgICAgKCh1MTYpMHgxMDAwKQ0KDQovKiBTUEkgQ1JDRU4gbWFzayAqLw0KI2RlZmluZSBDUjFfQ1JDRU5fU2V0ICAgICAgICAoKHUxNikweDIwMDApDQojZGVmaW5lIENSMV9DUkNFTl9SZXNldCAgICAgICgodTE2KTB4REZGRikNCg0KLyogU1BJIFNTT0UgbWFzayAqLw0KI2RlZmluZSBDUjJfU1NPRV9TZXQgICAgICAgICgodTE2KTB4MDAwNCkNCiNkZWZpbmUgQ1IyX1NTT0VfUmVzZXQgICAgICAoKHUxNikweEZGRkIpDQoNCi8qIFNQSSByZWdpc3RlcnMgTWFza3MgKi8NCiNkZWZpbmUgQ1IxX0NMRUFSX01hc2sgICAgICAgKCh1MTYpMHgzMDQwKQ0KDQovKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFNQSV9EZUluaXQNCiogRGVzY3JpcHRpb24gICAgOiBEZWluaXRpYWxpemVzIHRoZSBTUEl4IHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQNCiogICAgICAgICAgICAgICAgICByZXNldCB2YWx1ZXMuDQoqIElucHV0ICAgICAgICAgIDogLSBTUEl4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBTUEkgcGVyaXBoZXJhbC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgU1BJX0RlSW5pdChTUElfVHlwZURlZiogU1BJeCkNCnsNCiAgc3dpdGNoICgqKHUzMiopJlNQSXgpDQogIHsNCiAgICBjYXNlIFNQSTFfQkFTRToNCiAgICAgIC8qIEVuYWJsZSBTUEkxIHJlc2V0IHN0YXRlICovDQogICAgICBSQ0NfQVBCMlBlcmlwaFJlc2V0Q21kKFJDQ19BUEIyUGVyaXBoX1NQSTEsIEVOQUJMRSk7DQogICAgICAvKiBSZWxlYXNlIFNQSTEgZnJvbSByZXNldCBzdGF0ZSAqLw0KICAgICAgUkNDX0FQQjJQZXJpcGhSZXNldENtZChSQ0NfQVBCMlBlcmlwaF9TUEkxLCBESVNBQkxFKTsNCiAgICAgIGJyZWFrOw0KDQogICAgY2FzZSBTUEkyX0JBU0U6DQogICAgICAvKiBFbmFibGUgU1BJMiByZXNldCBzdGF0ZSAqLw0KICAgICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9TUEkyLCBFTkFCTEUpOw0KICAgICAgLyogUmVsZWFzZSBTUEkyIGZyb20gcmVzZXQgc3RhdGUgKi8NCiAgICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfU1BJMiwgRElTQUJMRSk7DQogICAgICBicmVhazsNCg0KICAgIGRlZmF1bHQ6DQogICAgICBicmVhazsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFNQSV9Jbml0DQoqIERlc2NyaXB0aW9uICAgIDogSW5pdGlhbGl6ZXMgdGhlIFNQSXggYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgcGFyYW1ldGVycw0KKiAgICAgICAgICAgICAgICAgIGluIHRoZSBTUElfSW5pdFN0cnVjdC4NCiogSW5wdXQgICAgICAgICAgOiAtIFNQSXg6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gU1BJX0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBTUElfSW5pdFR5cGVEZWYgc3RydWN0dXJlIHRoYXQNCiogICAgICAgICAgICAgICAgICAgIGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkDQoqICAgICAgICAgICAgICAgICAgICBTUEkgcGVyaXBoZXJhbC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBTUElfSW5pdChTUElfVHlwZURlZiogU1BJeCwgU1BJX0luaXRUeXBlRGVmKiBTUElfSW5pdFN0cnVjdCkNCnsNCiAgdTE2IHRtcHJlZyA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1NQSV9ESVJFQ1RJT05fTU9ERShTUElfSW5pdFN0cnVjdC0+U1BJX0RpcmVjdGlvbikpOw0KICBhc3NlcnQoSVNfU1BJX01PREUoU1BJX0luaXRTdHJ1Y3QtPlNQSV9Nb2RlKSk7DQogIGFzc2VydChJU19TUElfREFUQVNJWkUoU1BJX0luaXRTdHJ1Y3QtPlNQSV9EYXRhU2l6ZSkpOw0KICBhc3NlcnQoSVNfU1BJX0NQT0woU1BJX0luaXRTdHJ1Y3QtPlNQSV9DUE9MKSk7DQogIGFzc2VydChJU19TUElfQ1BIQShTUElfSW5pdFN0cnVjdC0+U1BJX0NQSEEpKTsNCiAgYXNzZXJ0KElTX1NQSV9OU1MoU1BJX0luaXRTdHJ1Y3QtPlNQSV9OU1MpKTsNCiAgYXNzZXJ0KElTX1NQSV9CQVVEUkFURV9QUkVTQ0FMRVIoU1BJX0luaXRTdHJ1Y3QtPlNQSV9CYXVkUmF0ZVByZXNjYWxlcikpOw0KICBhc3NlcnQoSVNfU1BJX0ZJUlNUX0JJVChTUElfSW5pdFN0cnVjdC0+U1BJX0ZpcnN0Qml0KSk7DQogIGFzc2VydChJU19TUElfQ1JDX1BPTFlOT01JQUwoU1BJX0luaXRTdHJ1Y3QtPlNQSV9DUkNQb2x5bm9taWFsKSk7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTUEl4IENSMSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIC8qIEdldCB0aGUgU1BJeCBDUjEgdmFsdWUgKi8NCiAgdG1wcmVnID0gU1BJeC0+Q1IxOw0KICAvKiBDbGVhciBCSURJTW9kZSwgQklESU9FLCBSeE9OTFksIFNTTSwgU1NJLCBMU0JGaXJzdCwgQlIsIE1TVFIsIENQT0wgYW5kIENQSEEgYml0cyAqLw0KICB0bXByZWcgJj0gQ1IxX0NMRUFSX01hc2s7DQogIC8qIENvbmZpZ3VyZSBTUEl4OiBkaXJlY3Rpb24sIE5TUyBtYW5hZ2VtZW50LCBmaXJzdCB0cmFuc21pdHRlZCBiaXQsIEJhdWRSYXRlIHByZXNjYWxlcg0KICAgICBtYXN0ZXIvc2FsdmUgbW9kZSwgQ1BPTCBhbmQgQ1BIQSAqLw0KICAvKiBTZXQgQklESW1vZGUsIEJJRElPRSBhbmQgUnhPTkxZIGJpdHMgYWNjb3JkaW5nIHRvIFNQSV9EaXJlY3Rpb24gdmFsdWUgKi8NCiAgLyogU2V0IFNTTSwgU1NJIGFuZCBNU1RSIGJpdHMgYWNjb3JkaW5nIHRvIFNQSV9Nb2RlIGFuZCBTUElfTlNTIHZhbHVlcyAqLw0KICAvKiBTZXQgTFNCRmlyc3QgYml0IGFjY29yZGluZyB0byBTUElfRmlyc3RCaXQgdmFsdWUgKi8NCiAgLyogU2V0IEJSIGJpdHMgYWNjb3JkaW5nIHRvIFNQSV9CYXVkUmF0ZVByZXNjYWxlciB2YWx1ZSAqLw0KICAvKiBTZXQgQ1BPTCBiaXQgYWNjb3JkaW5nIHRvIFNQSV9DUE9MIHZhbHVlICovDQogIC8qIFNldCBDUEhBIGJpdCBhY2NvcmRpbmcgdG8gU1BJX0NQSEEgdmFsdWUgKi8NCiAgdG1wcmVnIHw9ICh1MTYpKCh1MzIpU1BJX0luaXRTdHJ1Y3QtPlNQSV9EaXJlY3Rpb24gfCBTUElfSW5pdFN0cnVjdC0+U1BJX01vZGUgfA0KICAgICAgICAgICAgICAgICAgU1BJX0luaXRTdHJ1Y3QtPlNQSV9EYXRhU2l6ZSB8IFNQSV9Jbml0U3RydWN0LT5TUElfQ1BPTCB8ICANCiAgICAgICAgICAgICAgICAgIFNQSV9Jbml0U3RydWN0LT5TUElfQ1BIQSB8IFNQSV9Jbml0U3RydWN0LT5TUElfTlNTIHwgIA0KICAgICAgICAgICAgICAgICAgU1BJX0luaXRTdHJ1Y3QtPlNQSV9CYXVkUmF0ZVByZXNjYWxlciB8IFNQSV9Jbml0U3RydWN0LT5TUElfRmlyc3RCaXQpOw0KICAvKiBXcml0ZSB0byBTUEl4IENSMSAqLw0KICBTUEl4LT5DUjEgPSB0bXByZWc7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTUEl4IENSQ1BPTFkgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIC8qIFdyaXRlIHRvIFNQSXggQ1JDUE9MWSAqLw0KICBTUEl4LT5DUkNQUiA9IFNQSV9Jbml0U3RydWN0LT5TUElfQ1JDUG9seW5vbWlhbDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBTUElfU3RydWN0SW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IEZpbGxzIGVhY2ggU1BJX0luaXRTdHJ1Y3QgbWVtYmVyIHdpdGggaXRzIGRlZmF1bHQgdmFsdWUuDQoqIElucHV0ICAgICAgICAgIDogLSBTUElfSW5pdFN0cnVjdCA6IHBvaW50ZXIgdG8gYSBTUElfSW5pdFR5cGVEZWYgc3RydWN0dXJlDQoqICAgICAgICAgICAgICAgICAgICB3aGljaCB3aWxsIGJlIGluaXRpYWxpemVkLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBTUElfU3RydWN0SW5pdChTUElfSW5pdFR5cGVEZWYqIFNQSV9Jbml0U3RydWN0KQ0Kew0KLyotLS0tLS0tLS0tLS0tLS0gUmVzZXQgU1BJIGluaXQgc3RydWN0dXJlIHBhcmFtZXRlcnMgdmFsdWVzIC0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgLyogSW5pdGlhbGl6ZSB0aGUgU1BJX0RpcmVjdGlvbiBtZW1iZXIgKi8NCiAgU1BJX0luaXRTdHJ1Y3QtPlNQSV9EaXJlY3Rpb24gPSBTUElfRGlyZWN0aW9uXzJMaW5lc19GdWxsRHVwbGV4Ow0KDQogIC8qIGluaXRpYWxpemUgdGhlIFNQSV9Nb2RlIG1lbWJlciAqLw0KICBTUElfSW5pdFN0cnVjdC0+U1BJX01vZGUgPSBTUElfTW9kZV9TbGF2ZTsNCg0KICAvKiBpbml0aWFsaXplIHRoZSBTUElfRGF0YVNpemUgbWVtYmVyICovDQogIFNQSV9Jbml0U3RydWN0LT5TUElfRGF0YVNpemUgPSBTUElfRGF0YVNpemVfOGI7DQoNCiAgLyogSW5pdGlhbGl6ZSB0aGUgU1BJX0NQT0wgbWVtYmVyICovDQogIFNQSV9Jbml0U3RydWN0LT5TUElfQ1BPTCA9IFNQSV9DUE9MX0xvdzsNCg0KICAvKiBJbml0aWFsaXplIHRoZSBTUElfQ1BIQSBtZW1iZXIgKi8NCiAgU1BJX0luaXRTdHJ1Y3QtPlNQSV9DUEhBID0gU1BJX0NQSEFfMUVkZ2U7DQoNCiAgLyogSW5pdGlhbGl6ZSB0aGUgU1BJX05TUyBtZW1iZXIgKi8NCiAgU1BJX0luaXRTdHJ1Y3QtPlNQSV9OU1MgPSBTUElfTlNTX0hhcmQ7DQoNCiAgLyogSW5pdGlhbGl6ZSB0aGUgU1BJX0JhdWRSYXRlUHJlc2NhbGVyIG1lbWJlciAqLw0KICBTUElfSW5pdFN0cnVjdC0+U1BJX0JhdWRSYXRlUHJlc2NhbGVyID0gU1BJX0JhdWRSYXRlUHJlc2NhbGVyXzI7DQoNCiAgLyogSW5pdGlhbGl6ZSB0aGUgU1BJX0ZpcnN0Qml0IG1lbWJlciAqLw0KICBTUElfSW5pdFN0cnVjdC0+U1BJX0ZpcnN0Qml0ID0gU1BJX0ZpcnN0Qml0X01TQjsNCg0KICAvKiBJbml0aWFsaXplIHRoZSBTUElfQ1JDUG9seW5vbWlhbCBtZW1iZXIgKi8NCiAgU1BJX0luaXRTdHJ1Y3QtPlNQSV9DUkNQb2x5bm9taWFsID0gNzsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBTUElfQ21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIFNQSSBwZXJpcGhlcmFsLg0KKiBJbnB1dCAgICAgICAgICA6IC0gU1BJeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBTUEl4IHBlcmlwaGVyYWwuIA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgU1BJX0NtZChTUElfVHlwZURlZiogU1BJeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBTUEkgcGVyaXBoZXJhbCAqLw0KICAgIFNQSXgtPkNSMSB8PSBDUjFfU1BFX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBTUEkgcGVyaXBoZXJhbCAqLw0KICAgIFNQSXgtPkNSMSAmPSBDUjFfU1BFX1Jlc2V0Ow0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogU1BJX0lUQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIFNQSSBpbnRlcnJ1cHRzLg0KKiBJbnB1dCAgICAgICAgICA6IC0gU1BJeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBTUElfSVQ6IHNwZWNpZmllcyB0aGUgU1BJIGludGVycnVwdHMgc291cmNlcyB0byBiZSBlbmFibGVkDQoqICAgICAgICAgICAgICAgICAgICBvciBkaXNhYmxlZC4gDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBTUElfSVRfVFhFOiBUeCBidWZmZXIgZW1wdHkgaW50ZXJydXB0IG1hc2sNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU1BJX0lUX1JYTkU6IFJ4IGJ1ZmZlciBub3QgZW1wdHkgaW50ZXJydXB0IG1hc2sNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU1BJX0lUX0VSUjogRXJyb3IgaW50ZXJydXB0IG1hc2sNCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBTUEkgaW50ZXJydXB0cy4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFNQSV9JVENvbmZpZyhTUElfVHlwZURlZiogU1BJeCwgdTggU1BJX0lULCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIHUxNiBpdHBvcyA9IDAsIGl0bWFzayA9IDAgOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIGFzc2VydChJU19TUElfQ09ORklHX0lUKFNQSV9JVCkpOw0KDQogIC8qIEdldCB0aGUgU1BJIElUIGluZGV4ICovDQogIGl0cG9zID0gU1BJX0lUID4+IDQ7DQogIC8qIFNldCB0aGUgSVQgbWFzayAqLw0KICBpdG1hc2sgPSAodTE2KSgodTE2KTEgPDwgaXRwb3MpOw0KDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBTUEkgaW50ZXJydXB0ICovDQogICAgU1BJeC0+Q1IyIHw9IGl0bWFzazsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBTUEkgaW50ZXJydXB0ICovDQogICAgU1BJeC0+Q1IyICY9ICh1MTYpfml0bWFzazsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFNQSV9ETUFDbWQNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBTUEl4knMgRE1BIGludGVyZmFjZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFNQSXg6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gU1BJX0RNQVJlcTogc3BlY2lmaWVzIHRoZSBTUEkgRE1BIHRyYW5zZmVyIHJlcXVlc3QgdG8gYmUNCiogICAgICAgICAgICAgICAgICAgIGVuYWJsZWQgb3IgZGlzYWJsZWQuIA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU1BJX0RNQVJlcV9UeDogVHggYnVmZmVyIERNQSB0cmFuc2ZlciByZXF1ZXN0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFNQSV9ETUFSZXFfUng6IFJ4IGJ1ZmZlciBETUEgdHJhbnNmZXIgcmVxdWVzdA0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc2VsZWN0ZWQgU1BJIERNQSB0cmFuc2ZlciByZXF1ZXN0Lg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgU1BJX0RNQUNtZChTUElfVHlwZURlZiogU1BJeCwgdTE2IFNQSV9ETUFSZXEsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgYXNzZXJ0KElTX1NQSV9ETUFfUkVRKFNQSV9ETUFSZXEpKTsNCg0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgU1BJIERNQSByZXF1ZXN0cyAqLw0KICAgIFNQSXgtPkNSMiB8PSBTUElfRE1BUmVxOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIFNQSSBETUEgcmVxdWVzdHMgKi8NCiAgICBTUEl4LT5DUjIgJj0gKHUxNil+U1BJX0RNQVJlcTsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFNQSV9TZW5kRGF0YQ0KKiBEZXNjcmlwdGlvbiAgICA6IFRyYW5zbWl0cyBhIERhdGEgdGhyb3VnaCB0aGUgU1BJeCBwZXJpcGhlcmFsLg0KKiBJbnB1dCAgICAgICAgICA6IC0gU1BJeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBEYXRhIDogRGF0YSB0byBiZSB0cmFuc21pdHRlZC4uDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFNQSV9TZW5kRGF0YShTUElfVHlwZURlZiogU1BJeCwgdTE2IERhdGEpDQp7DQogIC8qIFdyaXRlIGluIHRoZSBEUiByZWdpc3RlciB0aGUgZGF0YSB0byBiZSBzZW50ICovDQogIFNQSXgtPkRSID0gRGF0YTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBTUElfUmVjZWl2ZURhdGENCiogRGVzY3JpcHRpb24gICAgOiBSZXR1cm5zIHRoZSBtb3N0IHJlY2VudCByZWNlaXZlZCBkYXRhIGJ5IHRoZSBTUEl4IHBlcmlwaGVyYWwuDQoqIElucHV0ICAgICAgICAgIDogLSBTUEl4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBTUEkgcGVyaXBoZXJhbC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogVGhlIHZhbHVlIG9mIHRoZSByZWNlaXZlZCBkYXRhLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnUxNiBTUElfUmVjZWl2ZURhdGEoU1BJX1R5cGVEZWYqIFNQSXgpDQp7DQogIC8qIFJldHVybiB0aGUgZGF0YSBpbiB0aGUgRFIgcmVnaXN0ZXIgKi8NCiAgcmV0dXJuIFNQSXgtPkRSOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFNQSV9OU1NJbnRlcm5hbFNvZnR3YXJlQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlcyBpbnRlcm5hbGx5IGJ5IHNvZnR3YXJlIHRoZSBOU1MgcGluIGZvciB0aGUgc2VsZWN0ZWQgDQoqICAgICAgICAgICAgICAgICAgU1BJLg0KKiBJbnB1dCAgICAgICAgICA6IC0gU1BJeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBTUElfTlNTSW50ZXJuYWxTb2Z0OiBzcGVjaWZpZXMgdGhlIFNQSSBOU1MgaW50ZXJuYWwgc3RhdGUuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBTUElfTlNTSW50ZXJuYWxTb2Z0X1NldDogU2V0IE5TUyBwaW4gaW50ZXJuYWxseQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBTUElfTlNTSW50ZXJuYWxTb2Z0X1Jlc2V0OiBSZXNldCBOU1MgcGluIGludGVybmFsbHkNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgU1BJX05TU0ludGVybmFsU29mdHdhcmVDb25maWcoU1BJX1R5cGVEZWYqIFNQSXgsIHUxNiBTUElfTlNTSW50ZXJuYWxTb2Z0KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfU1BJX05TU19JTlRFUk5BTChTUElfTlNTSW50ZXJuYWxTb2Z0KSk7DQoNCiAgaWYgKFNQSV9OU1NJbnRlcm5hbFNvZnQgIT0gU1BJX05TU0ludGVybmFsU29mdF9SZXNldCkNCiAgew0KICAgIC8qIFNldCBOU1MgcGluIGludGVybmFsbHkgYnkgc29mdHdhcmUgKi8NCiAgICBTUEl4LT5DUjEgfD0gU1BJX05TU0ludGVybmFsU29mdF9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogUmVzZXQgTlNTIHBpbiBpbnRlcm5hbGx5IGJ5IHNvZnR3YXJlICovDQogICAgU1BJeC0+Q1IxICY9IFNQSV9OU1NJbnRlcm5hbFNvZnRfUmVzZXQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBTUElfU1NPdXRwdXRDbWQNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBTUyBvdXRwdXQgZm9yIHRoZSBzZWxlY3RlZCBTUEkuDQoqIElucHV0ICAgICAgICAgIDogLSBTUEl4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBTUEkgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFNQSXggU1Mgb3V0cHV0LiANCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFNQSV9TU091dHB1dENtZChTUElfVHlwZURlZiogU1BJeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBTUEkgU1Mgb3V0cHV0ICovDQogICAgU1BJeC0+Q1IyIHw9IENSMl9TU09FX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBTUEkgU1Mgb3V0cHV0ICovDQogICAgU1BJeC0+Q1IyICY9IENSMl9TU09FX1Jlc2V0Ow0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogU1BJX0RhdGFTaXplQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlcyB0aGUgZGF0YSBzaXplIGZvciB0aGUgc2VsZWN0ZWQgU1BJLg0KKiBJbnB1dCAgICAgICAgICA6IC0gU1BJeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBTUElfRGF0YVNpemU6IHNwZWNpZmllcyB0aGUgU1BJIGRhdGEgc2l6ZS4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFNQSV9EYXRhU2l6ZV8xNmI6IFNldCBkYXRhIGZyYW1lIGZvcm1hdCB0byAxNmJpdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBTUElfRGF0YVNpemVfOGI6IFNldCBkYXRhIGZyYW1lIGZvcm1hdCB0byA4Yml0DQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFNQSV9EYXRhU2l6ZUNvbmZpZyhTUElfVHlwZURlZiogU1BJeCwgdTE2IFNQSV9EYXRhU2l6ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1NQSV9EQVRBU0laRShTUElfRGF0YVNpemUpKTsNCg0KICBpZiAoU1BJX0RhdGFTaXplICE9IFNQSV9EYXRhU2l6ZV84YikNCiAgew0KICAgIC8qIFNldCBkYXRhIGZyYW1lIGZvcm1hdCB0byAxNmJpdCAqLw0KICAgIFNQSXgtPkNSMSB8PSBTUElfRGF0YVNpemVfMTZiOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIFNldCBkYXRhIGZyYW1lIGZvcm1hdCB0byA4Yml0ICovDQogICAgU1BJeC0+Q1IxICY9IFNQSV9EYXRhU2l6ZV84YjsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFNQSV9UcmFuc21pdENSQw0KKiBEZXNjcmlwdGlvbiAgICA6IFRyYW5zbWl0IHRoZSBTUEl4IENSQyB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFNQSXg6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBTUElfVHJhbnNtaXRDUkMoU1BJX1R5cGVEZWYqIFNQSXgpDQp7DQogIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgU1BJIENSQyB0cmFuc21pc3Npb24gKi8NCiAgU1BJeC0+Q1IxIHw9IENSMV9DUkNOZXh0X1NldDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBTUElfQ2FsY3VsYXRlQ1JDDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgQ1JDIHZhbHVlIGNhbGN1bGF0aW9uIG9mIHRoZQ0KKiAgICAgICAgICAgICAgICAgIHRyYW5zZmVyZWQgYnl0ZXMuDQoqIElucHV0ICAgICAgICAgIDogLSBTUEl4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBTUEkgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFNQSXggQ1JDIHZhbHVlIGNhbGN1bGF0aW9uLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgU1BJX0NhbGN1bGF0ZUNSQyhTUElfVHlwZURlZiogU1BJeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBTUEkgQ1JDIGNhbGN1bGF0aW9uICovDQogICAgU1BJeC0+Q1IxIHw9IENSMV9DUkNFTl9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgU1BJIENSQyBjYWxjdWxhdGlvbiAqLw0KICAgIFNQSXgtPkNSMSAmPSBDUjFfQ1JDRU5fUmVzZXQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBTUElfR2V0Q1JDDQoqIERlc2NyaXB0aW9uICAgIDogUmV0dXJucyB0aGUgdHJhbnNtaXQgb3IgdGhlIHJlY2VpdmUgQ1JDIHJlZ2lzdGVyIHZhbHVlIGZvcg0KKiAgICAgICAgICAgICAgICAgIHRoZSBzcGVjaWZpZWQgU1BJLg0KKiBJbnB1dCAgICAgICAgICA6IC0gU1BJeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBTUElfQ1JDOiBzcGVjaWZpZXMgdGhlIENSQyByZWdpc3RlciB0byBiZSByZWFkLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU1BJX0NSQ19UeDogU2VsZWN0cyBUeCBDUkMgcmVnaXN0ZXINCiogICAgICAgICAgICAgICAgICAgICAgIC0gU1BJX0NSQ19SeDogU2VsZWN0cyBSeCBDUkMgcmVnaXN0ZXINCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogVGhlIHNlbGVjdGVkIENSQyByZWdpc3RlciB2YWx1ZS4uDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdTE2IFNQSV9HZXRDUkMoU1BJX1R5cGVEZWYqIFNQSXgsIHU4IFNQSV9DUkMpDQp7DQogIHUxNiBjcmNyZWcgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19TUElfQ1JDKFNQSV9DUkMpKTsNCg0KICBpZiAoU1BJX0NSQyAhPSBTUElfQ1JDX1J4KQ0KICB7DQogICAgLyogR2V0IHRoZSBUeCBDUkMgcmVnaXN0ZXIgKi8NCiAgICBjcmNyZWcgPSBTUEl4LT5UWENSQ1I7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogR2V0IHRoZSBSeCBDUkMgcmVnaXN0ZXIgKi8NCiAgICBjcmNyZWcgPSBTUEl4LT5SWENSQ1I7DQogIH0NCg0KICAvKiBSZXR1cm4gdGhlIHNlbGVjdGVkIENSQyByZWdpc3RlciAqLw0KICByZXR1cm4gY3JjcmVnOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFNQSV9HZXRDUkNQb2x5bm9taWFsDQoqIERlc2NyaXB0aW9uICAgIDogUmV0dXJucyB0aGUgQ1JDIFBvbHlub21pYWwgcmVnaXN0ZXIgdmFsdWUgZm9yIHRoZSBzcGVjaWZpZWQgU1BJLg0KKiBJbnB1dCAgICAgICAgICA6IC0gU1BJeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgU1BJIHBlcmlwaGVyYWwuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBDUkMgUG9seW5vbWlhbCByZWdpc3RlciB2YWx1ZS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1MTYgU1BJX0dldENSQ1BvbHlub21pYWwoU1BJX1R5cGVEZWYqIFNQSXgpDQp7DQogIC8qIFJldHVybiB0aGUgQ1JDIHBvbHlub21pYWwgcmVnaXN0ZXIgKi8NCiAgcmV0dXJuIFNQSXgtPkNSQ1BSOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFNQSV9CaURpcmVjdGlvbmFsTGluZUNvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IFNlbGVjdHMgdGhlIGRhdGEgdHJhbnNmZXIgZGlyZWN0aW9uIGluIGJpLWRpcmVjdGlvbmFsIG1vZGUNCiogICAgICAgICAgICAgICAgICBmb3IgdGhlIHNwZWNpZmllZCBTUEkuDQoqIElucHV0ICAgICAgICAgIDogLSBTUEl4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBTUEkgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFNQSV9EaXJlY3Rpb246IHNwZWNpZmllcyB0aGUgZGF0YSB0cmFuc2ZlciBkaXJlY3Rpb24gaW4NCiogICAgICAgICAgICAgICAgICAgIGJpLWRpcmVjdGlvbmFsIG1vZGUuIA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU1BJX0RpcmVjdGlvbl9UeDogU2VsZWN0cyBUeCB0cmFuc21pc3Npb24gZGlyZWN0aW9uDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFNQSV9EaXJlY3Rpb25fUng6IFNlbGVjdHMgUnggcmVjZWl2ZSBkaXJlY3Rpb24NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgU1BJX0JpRGlyZWN0aW9uYWxMaW5lQ29uZmlnKFNQSV9UeXBlRGVmKiBTUEl4LCB1MTYgU1BJX0RpcmVjdGlvbikNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1NQSV9ESVJFQ1RJT04oU1BJX0RpcmVjdGlvbikpOw0KDQogIGlmIChTUElfRGlyZWN0aW9uID09IFNQSV9EaXJlY3Rpb25fVHgpDQogIHsNCiAgICAvKiBTZXQgdGhlIFR4IG9ubHkgbW9kZSAqLw0KICAgIFNQSXgtPkNSMSB8PSBTUElfRGlyZWN0aW9uX1R4Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIFNldCB0aGUgUnggb25seSBtb2RlICovDQogICAgU1BJeC0+Q1IxICY9IFNQSV9EaXJlY3Rpb25fUng7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBTUElfR2V0RmxhZ1N0YXR1cw0KKiBEZXNjcmlwdGlvbiAgICA6IENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgU1BJIGZsYWcgaXMgc2V0IG9yIG5vdC4NCiogSW5wdXQgICAgICAgICAgOiAtIFNQSXg6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gU1BJX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4gDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBTUElfRkxBR19CU1k6IEJ1c3kgZmxhZy4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gU1BJX0ZMQUdfT1ZSOiBPdmVycnVuIGZsYWcuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFNQSV9GTEFHX01PREY6IE1vZGUgRmF1bHQgZmxhZy4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gU1BJX0ZMQUdfQ1JDRVJSOiBDUkMgRXJyb3IgZmxhZy4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gU1BJX0ZMQUdfVFhFOiBUcmFuc21pdCBidWZmZXIgZW1wdHkgZmxhZy4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gU1BJX0ZMQUdfUlhORTogUmVjZWl2ZSBidWZmZXIgbm90IGVtcHR5IGZsYWcuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBuZXcgc3RhdGUgb2YgU1BJX0ZMQUcgKFNFVCBvciBSRVNFVCkuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KRmxhZ1N0YXR1cyBTUElfR2V0RmxhZ1N0YXR1cyhTUElfVHlwZURlZiogU1BJeCwgdTE2IFNQSV9GTEFHKQ0Kew0KICBGbGFnU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19TUElfR0VUX0ZMQUcoU1BJX0ZMQUcpKTsNCg0KICAvKiBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgU1BJIGZsYWcgKi8NCiAgaWYgKChTUEl4LT5TUiAmIFNQSV9GTEFHKSAhPSAodTE2KVJFU0VUKQ0KICB7DQogICAgLyogU1BJX0ZMQUcgaXMgc2V0ICovDQogICAgYml0c3RhdHVzID0gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIFNQSV9GTEFHIGlzIHJlc2V0ICovDQogICAgYml0c3RhdHVzID0gUkVTRVQ7DQogIH0NCiAgLyogUmV0dXJuIHRoZSBTUElfRkxBRyBzdGF0dXMgKi8NCiAgcmV0dXJuICBiaXRzdGF0dXM7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogU1BJX0NsZWFyRmxhZw0KKiBEZXNjcmlwdGlvbiAgICA6IENsZWFycyB0aGUgU1BJeCdzIHBlbmRpbmcgZmxhZ3MuDQoqIElucHV0ICAgICAgICAgIDogLSBTUEl4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBTUEkgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFNQSV9GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2xlYXIuIA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gU1BJX0ZMQUdfT1ZSOiBPdmVycnVuIGZsYWcuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFNQSV9GTEFHX01PREY6IE1vZGUgRmF1bHQgZmxhZy4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gU1BJX0ZMQUdfQ1JDRVJSOiBDUkMgRXJyb3IgZmxhZy4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgU1BJX0NsZWFyRmxhZyhTUElfVHlwZURlZiogU1BJeCwgdTE2IFNQSV9GTEFHKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfU1BJX0NMRUFSX0ZMQUcoU1BJX0ZMQUcpKTsNCiAgICANCiAgLyogU1BJX0ZMQUdfTU9ERiBmbGFnIGNsZWFyICovDQogIGlmKFNQSV9GTEFHID09IFNQSV9GTEFHX01PREYpDQogIHsNCiAgICAvKiBSZWFkIFNSIHJlZ2lzdGVyICovDQogICAgKHZvaWQpU1BJeC0+U1I7DQogICAgLyogV3JpdGUgb24gQ1IxIHJlZ2lzdGVyICovDQogICAgU1BJeC0+Q1IxIHw9IENSMV9TUEVfU2V0OyANCiAgfQ0KICAvKiBTUElfRkxBR19PVlIgZmxhZyBjbGVhciAqLw0KICBlbHNlIGlmKFNQSV9GTEFHID09IFNQSV9GTEFHX09WUikgIA0KICB7DQogICAgLyogUmVhZCBTUiByZWdpc3RlciAqLw0KICAgICh2b2lkKVNQSXgtPlNSOw0KICB9DQogIGVsc2UgLyogU1BJX0ZMQUdfQ1JDRVJSIGZsYWcgY2xlYXIgKi8NCiAgew0KICAgIC8qIENsZWFyIHRoZSBzZWxlY3RlZCBTUEkgZmxhZyAqLw0KICAgIFNQSXgtPlNSICY9ICh1MTYpflNQSV9GTEFHOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogU1BJX0dldElUU3RhdHVzDQoqIERlc2NyaXB0aW9uICAgIDogQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBTUEkgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuDQoqIElucHV0ICAgICAgICAgIDogLSBTUEl4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBTUEkgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFNQSV9JVDogc3BlY2lmaWVzIHRoZSBTUEkgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4gDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBTUElfSVRfT1ZSOiBPdmVycnVuIGludGVycnVwdC4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gU1BJX0lUX01PREY6IE1vZGUgRmF1bHQgaW50ZXJydXB0Lg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBTUElfSVRfQ1JDRVJSOiBDUkMgRXJyb3IgaW50ZXJydXB0Lg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBTUElfSVRfVFhFOiBUcmFuc21pdCBidWZmZXIgZW1wdHkgaW50ZXJydXB0Lg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBTUElfSVRfUlhORTogUmVjZWl2ZSBidWZmZXIgbm90IGVtcHR5IGludGVycnVwdC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogVGhlIG5ldyBzdGF0ZSBvZiBTUElfSVQgKFNFVCBvciBSRVNFVCkuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KSVRTdGF0dXMgU1BJX0dldElUU3RhdHVzKFNQSV9UeXBlRGVmKiBTUEl4LCB1OCBTUElfSVQpDQp7DQogIElUU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KICB1MTYgaXRwb3MgPSAwLCBpdG1hc2sgPSAwLCBlbmFibGVzdGF0dXMgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19TUElfR0VUX0lUKFNQSV9JVCkpOw0KDQogIC8qIEdldCB0aGUgU1BJIElUIGluZGV4ICovDQogIGl0cG9zID0gKHUxNikoKHUxNikweDAxIDw8IChTUElfSVQgJiAodTgpMHgwRikpOw0KDQogIC8qIEdldCB0aGUgU1BJIElUIGluZGV4ICovDQogIGl0bWFzayA9IFNQSV9JVCA+PiA0Ow0KICAvKiBTZXQgdGhlIElUIG1hc2sgKi8NCiAgaXRtYXNrID0gKHUxNikoKHUxNikweDAxIDw8IGl0bWFzayk7DQogIC8qIEdldCB0aGUgU1BJX0lUIGVuYWJsZSBiaXQgc3RhdHVzICovDQogIGVuYWJsZXN0YXR1cyA9IChTUEl4LT5DUjIgJiBpdG1hc2spIDsNCg0KICAvKiBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgU1BJIGludGVycnVwdCAqLw0KICBpZiAoKChTUEl4LT5TUiAmIGl0cG9zKSAhPSAodTE2KVJFU0VUKSAmJiBlbmFibGVzdGF0dXMpDQogIHsNCiAgICAvKiBTUElfSVQgaXMgc2V0ICovDQogICAgYml0c3RhdHVzID0gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIFNQSV9JVCBpcyByZXNldCAqLw0KICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KICB9DQogIC8qIFJldHVybiB0aGUgU1BJX0lUIHN0YXR1cyAqLw0KICByZXR1cm4gYml0c3RhdHVzOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFNQSV9DbGVhcklUUGVuZGluZ0JpdA0KKiBEZXNjcmlwdGlvbiAgICA6IENsZWFycyB0aGUgU1BJknMgaW50ZXJydXB0IHBlbmRpbmcgYml0cy4NCiogSW5wdXQgICAgICAgICAgOiAtIFNQSXg6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIFNQSSBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gU1BJX0lUOiBzcGVjaWZpZXMgdGhlIFNQSSBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgdG8gY2xlYXIuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBTUElfSVRfT1ZSOiBPdmVycnVuIGludGVycnVwdC4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gU1BJX0lUX01PREY6IE1vZGUgRmF1bHQgaW50ZXJydXB0Lg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBTUElfSVRfQ1JDRVJSOiBDUkMgRXJyb3IgaW50ZXJydXB0Lg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBTUElfQ2xlYXJJVFBlbmRpbmdCaXQoU1BJX1R5cGVEZWYqIFNQSXgsIHU4IFNQSV9JVCkNCnsNCiAgdTE2IGl0cG9zID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfU1BJX0NMRUFSX0lUKFNQSV9JVCkpOw0KDQogIC8qIFNQSV9JVF9NT0RGIHBlbmRpbmcgYml0IGNsZWFyICovDQogIGlmKFNQSV9JVCA9PSBTUElfSVRfTU9ERikNCiAgew0KICAgIC8qIFJlYWQgU1IgcmVnaXN0ZXIgKi8NCiAgICAodm9pZClTUEl4LT5TUjsNCiAgICAvKiBXcml0ZSBvbiBDUjEgcmVnaXN0ZXIgKi8NCiAgICBTUEl4LT5DUjEgfD0gQ1IxX1NQRV9TZXQ7IA0KICB9DQogIGVsc2UgaWYoU1BJX0lUID09IFNQSV9JVF9PVlIpICAgLyogU1BJX0lUX09WUiBwZW5kaW5nIGJpdCBjbGVhciAqLyANCiAgew0KICAgIC8qIFJlYWQgU1IgcmVnaXN0ZXIgKi8NCiAgICAodm9pZCkoU1BJeC0+U1IpOw0KICB9DQogIGVsc2UgICAvKiBTUElfSVRfQ1JDRVJSIHBlbmRpbmcgYml0IGNsZWFyICovDQogIHsNCiAgICAvKiBHZXQgdGhlIFNQSSBJVCBpbmRleCAqLw0KICAgIGl0cG9zID0gKHUxNikoKHUxNikweDAxIDw8IChTUElfSVQgJiAodTgpMHgwRikpOw0KICAgIC8qIENsZWFyIHRoZSBzZWxlY3RlZCBTUEkgaW50ZXJydXB0IHBlbmRpbmcgYml0cyAqLw0KICAgIFNQSXgtPlNSICY9ICh1MTYpfml0cG9zOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwNyBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovDQo=