LyoqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwOCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKioqKioqKioqKioqKioqKioNCiogRmlsZSBOYW1lICAgICAgICAgIDogc3RtMzJmMTB4X3VzYXJ0LmMNCiogQXV0aG9yICAgICAgICAgICAgIDogTUNEIEFwcGxpY2F0aW9uIFRlYW0NCiogVmVyc2lvbiAgICAgICAgICAgIDogVjIuMC4xDQoqIERhdGUgICAgICAgICAgICAgICA6IDA2LzEzLzIwMDgNCiogRGVzY3JpcHRpb24gICAgICAgIDogVGhpcyBmaWxlIHByb3ZpZGVzIGFsbCB0aGUgVVNBUlQgZmlybXdhcmUgZnVuY3Rpb25zLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogVEhFIFBSRVNFTlQgRklSTVdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQoqIFdJVEggQ09ESU5HIElORk9STUFUSU9OIFJFR0FSRElORyBUSEVJUiBQUk9EVUNUUyBJTiBPUkRFUiBGT1IgVEhFTSBUTyBTQVZFIFRJTUUuDQoqIEFTIEEgUkVTVUxULCBTVE1JQ1JPRUxFQ1RST05JQ1MgU0hBTEwgTk9UIEJFIEhFTEQgTElBQkxFIEZPUiBBTlkgRElSRUNULA0KKiBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORyBGUk9NIFRIRQ0KKiBDT05URU5UIE9GIFNVQ0ggRklSTVdBUkUgQU5EL09SIFRIRSBVU0UgTUFERSBCWSBDVVNUT01FUlMgT0YgVEhFIENPRElORw0KKiBJTkZPUk1BVElPTiBDT05UQUlORUQgSEVSRUlOIElOIENPTk5FQ1RJT04gV0lUSCBUSEVJUiBQUk9EVUNUUy4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQoNCi8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQojaW5jbHVkZSAic3RtMzJmMTB4X3VzYXJ0LmgiDQojaW5jbHVkZSAic3RtMzJmMTB4X3JjYy5oIg0KDQovKiBQcml2YXRlIHR5cGVkZWYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSBkZWZpbmUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFVTQVJUIFVFIE1hc2sgKi8NCiNkZWZpbmUgQ1IxX1VFX1NldCAgICAgICAgICAgICAgICAoKHUxNikweDIwMDApICAvKiBVU0FSVCBFbmFibGUgTWFzayAqLw0KI2RlZmluZSBDUjFfVUVfUmVzZXQgICAgICAgICAgICAgICgodTE2KTB4REZGRikgIC8qIFVTQVJUIERpc2FibGUgTWFzayAqLw0KDQovKiBVU0FSVCBXYWtlVXAgTWV0aG9kICAqLw0KI2RlZmluZSBDUjFfV0FLRV9NYXNrICAgICAgICAgICAgICgodTE2KTB4RjdGRikgIC8qIFVTQVJUIFdha2VVcCBNZXRob2QgTWFzayAqLw0KDQovKiBVU0FSVCBSV1UgTWFzayAqLw0KI2RlZmluZSBDUjFfUldVX1NldCAgICAgICAgICAgICAgICgodTE2KTB4MDAwMikgIC8qIFVTQVJUIG11dGUgbW9kZSBFbmFibGUgTWFzayAqLw0KI2RlZmluZSBDUjFfUldVX1Jlc2V0ICAgICAgICAgICAgICgodTE2KTB4RkZGRCkgIC8qIFVTQVJUIG11dGUgbW9kZSBFbmFibGUgTWFzayAqLw0KDQojZGVmaW5lIENSMV9TQktfU2V0ICAgICAgICAgICAgICAgKCh1MTYpMHgwMDAxKSAgLyogVVNBUlQgQnJlYWsgQ2hhcmFjdGVyIHNlbmQgTWFzayAqLw0KDQojZGVmaW5lIENSMV9DTEVBUl9NYXNrICAgICAgICAgICAgKCh1MTYpMHhFOUYzKSAgLyogVVNBUlQgQ1IxIE1hc2sgKi8NCg0KI2RlZmluZSBDUjJfQWRkcmVzc19NYXNrICAgICAgICAgICgodTE2KTB4RkZGMCkgIC8qIFVTQVJUIGFkZHJlc3MgTWFzayAqLw0KDQovKiBVU0FSVCBMSU4gTWFzayAqLw0KI2RlZmluZSBDUjJfTElORU5fU2V0ICAgICAgICAgICAgICAoKHUxNikweDQwMDApICAvKiBVU0FSVCBMSU4gRW5hYmxlIE1hc2sgKi8NCiNkZWZpbmUgQ1IyX0xJTkVOX1Jlc2V0ICAgICAgICAgICAgKCh1MTYpMHhCRkZGKSAgLyogVVNBUlQgTElOIERpc2FibGUgTWFzayAqLw0KDQovKiBVU0FSVCBMSU4gQnJlYWsgZGV0ZWN0aW9uICovDQojZGVmaW5lIENSMl9MQkRMX01hc2sgICAgICAgICAgICAgKCh1MTYpMHhGRkRGKSAgLyogVVNBUlQgTElOIEJyZWFrIGRldGVjdGlvbiBNYXNrICovDQoNCiNkZWZpbmUgQ1IyX1NUT1BfQ0xFQVJfTWFzayAgICAgICAoKHUxNikweENGRkYpICAvKiBVU0FSVCBDUjIgU1RPUCBCaXRzIE1hc2sgKi8NCiNkZWZpbmUgQ1IyX0NMT0NLX0NMRUFSX01hc2sgICAgICAoKHUxNikweEYwRkYpICAvKiBVU0FSVCBDUjIgQ2xvY2sgTWFzayAqLw0KDQovKiBVU0FSVCBTQyBNYXNrICovDQojZGVmaW5lIENSM19TQ0VOX1NldCAgICAgICAgICAgICAgKCh1MTYpMHgwMDIwKSAgLyogVVNBUlQgU0MgRW5hYmxlIE1hc2sgKi8NCiNkZWZpbmUgQ1IzX1NDRU5fUmVzZXQgICAgICAgICAgICAoKHUxNikweEZGREYpICAvKiBVU0FSVCBTQyBEaXNhYmxlIE1hc2sgKi8NCg0KLyogVVNBUlQgU0MgTkFDSyBNYXNrICovDQojZGVmaW5lIENSM19OQUNLX1NldCAgICAgICAgICAgICAgKCh1MTYpMHgwMDEwKSAgLyogVVNBUlQgU0MgTkFDSyBFbmFibGUgTWFzayAqLw0KI2RlZmluZSBDUjNfTkFDS19SZXNldCAgICAgICAgICAgICgodTE2KTB4RkZFRikgIC8qIFVTQVJUIFNDIE5BQ0sgRGlzYWJsZSBNYXNrICovDQoNCi8qIFVTQVJUIEhhbGYtRHVwbGV4IE1hc2sgKi8NCiNkZWZpbmUgQ1IzX0hEU0VMX1NldCAgICAgICAgICAgICAoKHUxNikweDAwMDgpICAvKiBVU0FSVCBIYWxmLUR1cGxleCBFbmFibGUgTWFzayAqLw0KI2RlZmluZSBDUjNfSERTRUxfUmVzZXQgICAgICAgICAgICgodTE2KTB4RkZGNykgIC8qIFVTQVJUIEhhbGYtRHVwbGV4IERpc2FibGUgTWFzayAqLw0KDQovKiBVU0FSVCBJckRBIE1hc2sgKi8NCiNkZWZpbmUgQ1IzX0lSTFBfTWFzayAgICAgICAgICAgICAoKHUxNikweEZGRkIpICAvKiBVU0FSVCBJckRBIExvd1Bvd2VyIG1vZGUgTWFzayAqLw0KDQojZGVmaW5lIENSM19DTEVBUl9NYXNrICAgICAgICAgICAgKCh1MTYpMHhGQ0ZGKSAgLyogVVNBUlQgQ1IzIE1hc2sgKi8NCg0KLyogVVNBUlQgSXJEQSBNYXNrICovDQojZGVmaW5lIENSM19JUkVOX1NldCAgICAgICAgICAgICAgKCh1MTYpMHgwMDAyKSAgLyogVVNBUlQgSXJEQSBFbmFibGUgTWFzayAqLw0KI2RlZmluZSBDUjNfSVJFTl9SZXNldCAgICAgICAgICAgICgodTE2KTB4RkZGRCkgIC8qIFVTQVJUIElyREEgRGlzYWJsZSBNYXNrICovDQoNCiNkZWZpbmUgR1RQUl9MU0JfTWFzayAgICAgICAgICAgICAoKHUxNikweDAwRkYpICAvKiBHdWFyZCBUaW1lIFJlZ2lzdGVyIExTQiBNYXNrICovDQojZGVmaW5lIEdUUFJfTVNCX01hc2sgICAgICAgICAgICAgKCh1MTYpMHhGRjAwKSAgLyogR3VhcmQgVGltZSBSZWdpc3RlciBNU0IgTWFzayAqLw0KDQojZGVmaW5lIElUX01hc2sgICAgICAgICAgICAgICAgICAgKCh1MTYpMHgwMDFGKSAgLyogVVNBUlQgSW50ZXJydXB0IE1hc2sgKi8NCg0KLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBVU0FSVF9EZUluaXQNCiogRGVzY3JpcHRpb24gICAgOiBEZWluaXRpYWxpemVzIHRoZSBVU0FSVHggcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXINCiogICAgICAgICAgICAgICAgICBkZWZhdWx0IHJlc2V0IHZhbHVlcy4NCiogSW5wdXQgICAgICAgICAgOiAtIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBvciB0aGUgVUFSVCBwZXJpcGhlcmFsLiANCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVDEsIFVTQVJUMiwgVVNBUlQzLCBVQVJUNCBvciBVQVJUNS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVVNBUlRfRGVJbml0KFVTQVJUX1R5cGVEZWYqIFVTQVJUeCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQoNCiAgc3dpdGNoICgqKHUzMiopJlVTQVJUeCkNCiAgew0KICAgIGNhc2UgVVNBUlQxX0JBU0U6DQogICAgICBSQ0NfQVBCMlBlcmlwaFJlc2V0Q21kKFJDQ19BUEIyUGVyaXBoX1VTQVJUMSwgRU5BQkxFKTsNCiAgICAgIFJDQ19BUEIyUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjJQZXJpcGhfVVNBUlQxLCBESVNBQkxFKTsNCiAgICAgIGJyZWFrOw0KDQogICAgY2FzZSBVU0FSVDJfQkFTRToNCiAgICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVVNBUlQyLCBFTkFCTEUpOw0KICAgICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9VU0FSVDIsIERJU0FCTEUpOw0KICAgICAgYnJlYWs7DQoNCiAgICBjYXNlIFVTQVJUM19CQVNFOg0KICAgICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9VU0FSVDMsIEVOQUJMRSk7DQogICAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1VTQVJUMywgRElTQUJMRSk7DQogICAgICBicmVhazsNCiAgICANCiAgICBjYXNlIFVBUlQ0X0JBU0U6DQogICAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1VBUlQ0LCBFTkFCTEUpOw0KICAgICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9VQVJUNCwgRElTQUJMRSk7DQogICAgICBicmVhazsNCiAgICANCiAgICBjYXNlIFVBUlQ1X0JBU0U6DQogICAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1VBUlQ1LCBFTkFCTEUpOw0KICAgICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9VQVJUNSwgRElTQUJMRSk7DQogICAgICBicmVhazsgICAgICAgICAgICANCg0KICAgIGRlZmF1bHQ6DQogICAgICBicmVhazsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVTQVJUX0luaXQNCiogRGVzY3JpcHRpb24gICAgOiBJbml0aWFsaXplcyB0aGUgVVNBUlR4IHBlcmlwaGVyYWwgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQNCiogICAgICAgICAgICAgICAgICBwYXJhbWV0ZXJzIGluIHRoZSBVU0FSVF9Jbml0U3RydWN0IC4NCiogSW5wdXQgICAgICAgICAgOiAtIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBvciB0aGUgVUFSVCBwZXJpcGhlcmFsLiANCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVDEsIFVTQVJUMiwgVVNBUlQzLCBVQVJUNCBvciBVQVJUNS4NCiogICAgICAgICAgICAgICAgICAtIFVTQVJUX0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBVU0FSVF9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUNCiogICAgICAgICAgICAgICAgICAgIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZQ0KKiAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIFVTQVJUIHBlcmlwaGVyYWwuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFVTQVJUX0luaXQoVVNBUlRfVHlwZURlZiogVVNBUlR4LCBVU0FSVF9Jbml0VHlwZURlZiogVVNBUlRfSW5pdFN0cnVjdCkNCnsNCiAgdTMyIHRtcHJlZyA9IDB4MDAsIGFwYmNsb2NrID0gMHgwMDsNCiAgdTMyIGludGVnZXJkaXZpZGVyID0gMHgwMDsNCiAgdTMyIGZyYWN0aW9uYWxkaXZpZGVyID0gMHgwMDsNCiAgdTMyIHVzYXJ0eGJhc2UgPSAwOw0KICBSQ0NfQ2xvY2tzVHlwZURlZiBSQ0NfQ2xvY2tzU3RhdHVzOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9BTExfUEVSSVBIKFVTQVJUeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQkFVRFJBVEUoVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfQmF1ZFJhdGUpKTsgIA0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfV09SRF9MRU5HVEgoVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfV29yZExlbmd0aCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfU1RPUEJJVFMoVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfU3RvcEJpdHMpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX1BBUklUWShVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9QYXJpdHkpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX01PREUoVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfTW9kZSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfSEFSRFdBUkVfRkxPV19DT05UUk9MKFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX0hhcmR3YXJlRmxvd0NvbnRyb2wpKTsNCiAgLyogVGhlIGhhcmR3YXJlIGZsb3cgY29udHJvbCBpcyBhdmFpbGFibGUgb25seSBmb3IgVVNBUlQxLCBVU0FSVDIgYW5kIFVTQVJUMyAqLyAgICAgICAgICANCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX1BFUklQSF9IRkMoVVNBUlR4LCBVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9IYXJkd2FyZUZsb3dDb250cm9sKSk7DQogIA0KICB1c2FydHhiYXNlID0gKCoodTMyKikmVVNBUlR4KTsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIENSMiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgdG1wcmVnID0gVVNBUlR4LT5DUjI7DQogIC8qIENsZWFyIFNUT1BbMTM6MTJdIGJpdHMgKi8NCiAgdG1wcmVnICY9IENSMl9TVE9QX0NMRUFSX01hc2s7DQoNCiAgLyogQ29uZmlndXJlIHRoZSBVU0FSVCBTdG9wIEJpdHMsIENsb2NrLCBDUE9MLCBDUEhBIGFuZCBMYXN0Qml0IC0tLS0tLS0tLS0tLSovDQogIC8qIFNldCBTVE9QWzEzOjEyXSBiaXRzIGFjY29yZGluZyB0byBVU0FSVF9TdG9wQml0cyB2YWx1ZSAqLw0KICB0bXByZWcgfD0gKHUzMilVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9TdG9wQml0czsNCiAgDQogIC8qIFdyaXRlIHRvIFVTQVJUIENSMiAqLw0KICBVU0FSVHgtPkNSMiA9ICh1MTYpdG1wcmVnOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICB0bXByZWcgPSBVU0FSVHgtPkNSMTsNCiAgLyogQ2xlYXIgTSwgUENFLCBQUywgVEUgYW5kIFJFIGJpdHMgKi8NCiAgdG1wcmVnICY9IENSMV9DTEVBUl9NYXNrOw0KDQogIC8qIENvbmZpZ3VyZSB0aGUgVVNBUlQgV29yZCBMZW5ndGgsIFBhcml0eSBhbmQgbW9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KICAvKiBTZXQgdGhlIE0gYml0cyBhY2NvcmRpbmcgdG8gVVNBUlRfV29yZExlbmd0aCB2YWx1ZSAqLw0KICAvKiBTZXQgUENFIGFuZCBQUyBiaXRzIGFjY29yZGluZyB0byBVU0FSVF9QYXJpdHkgdmFsdWUgKi8NCiAgLyogU2V0IFRFIGFuZCBSRSBiaXRzIGFjY29yZGluZyB0byBVU0FSVF9Nb2RlIHZhbHVlICovDQogIHRtcHJlZyB8PSAodTMyKVVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX1dvcmRMZW5ndGggfCBVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9QYXJpdHkgfA0KICAgICAgICAgICAgVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfTW9kZTsNCg0KICAvKiBXcml0ZSB0byBVU0FSVCBDUjEgKi8NCiAgVVNBUlR4LT5DUjEgPSAodTE2KXRtcHJlZzsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIENSMyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gIA0KICB0bXByZWcgPSBVU0FSVHgtPkNSMzsNCiAgLyogQ2xlYXIgQ1RTRSBhbmQgUlRTRSBiaXRzICovDQogIHRtcHJlZyAmPSBDUjNfQ0xFQVJfTWFzazsNCg0KICAvKiBDb25maWd1cmUgdGhlIFVTQVJUIEhGQyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgLyogU2V0IENUU0UgYW5kIFJUU0UgYml0cyBhY2NvcmRpbmcgdG8gVVNBUlRfSGFyZHdhcmVGbG93Q29udHJvbCB2YWx1ZSAqLw0KICB0bXByZWcgfD0gVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfSGFyZHdhcmVGbG93Q29udHJvbDsNCg0KICAvKiBXcml0ZSB0byBVU0FSVCBDUjMgKi8NCiAgVVNBUlR4LT5DUjMgPSAodTE2KXRtcHJlZzsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIEJSUiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgLyogQ29uZmlndXJlIHRoZSBVU0FSVCBCYXVkIFJhdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIFJDQ19HZXRDbG9ja3NGcmVxKCZSQ0NfQ2xvY2tzU3RhdHVzKTsNCiAgaWYgKHVzYXJ0eGJhc2UgPT0gVVNBUlQxX0JBU0UpDQogIHsNCiAgICBhcGJjbG9jayA9IFJDQ19DbG9ja3NTdGF0dXMuUENMSzJfRnJlcXVlbmN5Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIGFwYmNsb2NrID0gUkNDX0Nsb2Nrc1N0YXR1cy5QQ0xLMV9GcmVxdWVuY3k7DQogIH0NCg0KICAvKiBEZXRlcm1pbmUgdGhlIGludGVnZXIgcGFydCAqLw0KICBpbnRlZ2VyZGl2aWRlciA9ICgoMHgxOSAqIGFwYmNsb2NrKSAvICgweDA0ICogKFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX0JhdWRSYXRlKSkpOw0KICB0bXByZWcgPSAoaW50ZWdlcmRpdmlkZXIgLyAweDY0KSA8PCAweDA0Ow0KDQogIC8qIERldGVybWluZSB0aGUgZnJhY3Rpb25hbCBwYXJ0ICovDQogIGZyYWN0aW9uYWxkaXZpZGVyID0gaW50ZWdlcmRpdmlkZXIgLSAoMHg2NCAqICh0bXByZWcgPj4gMHgwNCkpOw0KICB0bXByZWcgfD0gKCgoKGZyYWN0aW9uYWxkaXZpZGVyICogMHgxMCkgKyAweDMyKSAvIDB4NjQpKSAmICgodTgpMHgwRik7DQoNCiAgLyogV3JpdGUgdG8gVVNBUlQgQlJSICovDQogIFVTQVJUeC0+QlJSID0gKHUxNil0bXByZWc7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVVNBUlRfU3RydWN0SW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IEZpbGxzIGVhY2ggVVNBUlRfSW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFVTQVJUX0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBVU0FSVF9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUNCiogICAgICAgICAgICAgICAgICAgIHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFVTQVJUX1N0cnVjdEluaXQoVVNBUlRfSW5pdFR5cGVEZWYqIFVTQVJUX0luaXRTdHJ1Y3QpDQp7DQogIC8qIFVTQVJUX0luaXRTdHJ1Y3QgbWVtYmVycyBkZWZhdWx0IHZhbHVlICovDQogIFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX0JhdWRSYXRlID0gOTYwMDsNCiAgVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfV29yZExlbmd0aCA9IFVTQVJUX1dvcmRMZW5ndGhfOGI7DQogIFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX1N0b3BCaXRzID0gVVNBUlRfU3RvcEJpdHNfMTsNCiAgVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfUGFyaXR5ID0gVVNBUlRfUGFyaXR5X05vIDsNCiAgVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfTW9kZSA9IFVTQVJUX01vZGVfUnggfCBVU0FSVF9Nb2RlX1R4Ow0KICBVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9IYXJkd2FyZUZsb3dDb250cm9sID0gVVNBUlRfSGFyZHdhcmVGbG93Q29udHJvbF9Ob25lOyAgDQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVVNBUlRfQ2xvY2tJbml0DQoqIERlc2NyaXB0aW9uICAgIDogSW5pdGlhbGl6ZXMgdGhlIFVTQVJUeCBwZXJpcGhlcmFsIENsb2NrIGFjY29yZGluZyB0byB0aGUgDQoqICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIHBhcmFtZXRlcnMgaW4gdGhlIFVTQVJUX0Nsb2NrSW5pdFN0cnVjdCAuDQoqIElucHV0ICAgICAgICAgIDogLSBVU0FSVHg6IHdoZXJlIHggY2FuIGJlIDEsIDIsIDMgdG8gc2VsZWN0IHRoZSBVU0FSVCBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgICAgTm90ZTogVGhlIFNtYXJ0IENhcmQgbW9kZSBpcyBub3QgYXZhaWxhYmxlIGZvciBVQVJUNCBhbmQgVUFSVDUuDQoqICAgICAgICAgICAgICAgICAgLSBVU0FSVF9DbG9ja0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBVU0FSVF9DbG9ja0luaXRUeXBlRGVmDQoqICAgICAgICAgICAgICAgICAgICBzdHJ1Y3R1cmUgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgDQoqICAgICAgICAgICAgICAgICAgICB0aGUgc3BlY2lmaWVkIFVTQVJUIHBlcmlwaGVyYWwuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFVTQVJUX0Nsb2NrSW5pdChVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIFVTQVJUX0Nsb2NrSW5pdFR5cGVEZWYqIFVTQVJUX0Nsb2NrSW5pdFN0cnVjdCkNCnsNCiAgdTMyIHRtcHJlZyA9IDB4MDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUXzEyM19QRVJJUEgoVVNBUlR4KSk7DQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9DTE9DSyhVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPlVTQVJUX0Nsb2NrKSk7DQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9DUE9MKFVTQVJUX0Nsb2NrSW5pdFN0cnVjdC0+VVNBUlRfQ1BPTCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQ1BIQShVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPlVTQVJUX0NQSEEpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0xBU1RCSVQoVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5VU0FSVF9MYXN0Qml0KSk7ICAgICAgICAgICAgICANCiAgDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IyIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICB0bXByZWcgPSBVU0FSVHgtPkNSMjsNCiAgLyogQ2xlYXIgQ0xLRU4sIENQT0wsIENQSEEgYW5kIExCQ0wgYml0cyAqLw0KICB0bXByZWcgJj0gQ1IyX0NMT0NLX0NMRUFSX01hc2s7DQoNCiAgLyogQ29uZmlndXJlIHRoZSBVU0FSVCBDbG9jaywgQ1BPTCwgQ1BIQSBhbmQgTGFzdEJpdCAtLS0tLS0tLS0tLS0qLw0KICAvKiBTZXQgQ0xLRU4gYml0IGFjY29yZGluZyB0byBVU0FSVF9DbG9jayB2YWx1ZSAqLw0KICAvKiBTZXQgQ1BPTCBiaXQgYWNjb3JkaW5nIHRvIFVTQVJUX0NQT0wgdmFsdWUgKi8NCiAgLyogU2V0IENQSEEgYml0IGFjY29yZGluZyB0byBVU0FSVF9DUEhBIHZhbHVlICovDQogIC8qIFNldCBMQkNMIGJpdCBhY2NvcmRpbmcgdG8gVVNBUlRfTGFzdEJpdCB2YWx1ZSAqLw0KICB0bXByZWcgfD0gKHUzMilVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPlVTQVJUX0Nsb2NrIHwgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5VU0FSVF9DUE9MIHwgDQogICAgICAgICAgICAgICAgIFVTQVJUX0Nsb2NrSW5pdFN0cnVjdC0+VVNBUlRfQ1BIQSB8IFVTQVJUX0Nsb2NrSW5pdFN0cnVjdC0+VVNBUlRfTGFzdEJpdDsNCg0KICAvKiBXcml0ZSB0byBVU0FSVCBDUjIgKi8NCiAgVVNBUlR4LT5DUjIgPSAodTE2KXRtcHJlZzsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBVU0FSVF9DbG9ja1N0cnVjdEluaXQNCiogRGVzY3JpcHRpb24gICAgOiBGaWxscyBlYWNoIFVTQVJUX0Nsb2NrSW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFVTQVJUX0Nsb2NrSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIFVTQVJUX0Nsb2NrSW5pdFR5cGVEZWYNCiogICAgICAgICAgICAgICAgICAgIHN0cnVjdHVyZSB3aGljaCB3aWxsIGJlIGluaXRpYWxpemVkLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVU0FSVF9DbG9ja1N0cnVjdEluaXQoVVNBUlRfQ2xvY2tJbml0VHlwZURlZiogVVNBUlRfQ2xvY2tJbml0U3RydWN0KQ0Kew0KICAvKiBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QgbWVtYmVycyBkZWZhdWx0IHZhbHVlICovDQogIFVTQVJUX0Nsb2NrSW5pdFN0cnVjdC0+VVNBUlRfQ2xvY2sgPSBVU0FSVF9DbG9ja19EaXNhYmxlOw0KICBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPlVTQVJUX0NQT0wgPSBVU0FSVF9DUE9MX0xvdzsNCiAgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5VU0FSVF9DUEhBID0gVVNBUlRfQ1BIQV8xRWRnZTsNCiAgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5VU0FSVF9MYXN0Qml0ID0gVVNBUlRfTGFzdEJpdF9EaXNhYmxlOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVTQVJUX0NtZA0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBVU0FSVCBwZXJpcGhlcmFsLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIG9yIHRoZSBVQVJUIHBlcmlwaGVyYWwuIA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAtIFVTQVJUMSwgVVNBUlQyLCBVU0FSVDMsIFVBUlQ0IG9yIFVBUlQ1Lg0KKiAgICAgICAgICAgICAgICA6IC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgVVNBUlR4IHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVU0FSVF9DbWQoVVNBUlRfVHlwZURlZiogVVNBUlR4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9BTExfUEVSSVBIKFVTQVJUeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICANCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIFVTQVJUIGJ5IHNldHRpbmcgdGhlIFVFIGJpdCBpbiB0aGUgQ1IxIHJlZ2lzdGVyICovDQogICAgVVNBUlR4LT5DUjEgfD0gQ1IxX1VFX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBVU0FSVCBieSBjbGVhcmluZyB0aGUgVUUgYml0IGluIHRoZSBDUjEgcmVnaXN0ZXIgKi8NCiAgICBVU0FSVHgtPkNSMSAmPSBDUjFfVUVfUmVzZXQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBVU0FSVF9JVENvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBVU0FSVCBpbnRlcnJ1cHRzLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIG9yIHRoZSBVQVJUIHBlcmlwaGVyYWwuIA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAtIFVTQVJUMSwgVVNBUlQyLCBVU0FSVDMsIFVBUlQ0IG9yIFVBUlQ1Lg0KKiAgICAgICAgICAgICAgICAgIC0gVVNBUlRfSVQ6IHNwZWNpZmllcyB0aGUgVVNBUlQgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUNCiogICAgICAgICAgICAgICAgICAgIGVuYWJsZWQgb3IgZGlzYWJsZWQuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9JVF9DVFM6ICBDVFMgY2hhbmdlIGludGVycnVwdCAobm90IGF2YWlsYWJsZSBmb3INCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVDQgYW5kIFVBUlQ1KQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9JVF9MQkQ6ICBMSU4gQnJlYWsgZGV0ZWN0aW9uIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9JVF9UWEU6ICBUYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0lUX1RDOiAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfSVRfUlhORTogUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSANCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0lUX0lETEU6IElkbGUgbGluZSBkZXRlY3Rpb24gaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0lUX1BFOiAgIFBhcml0eSBFcnJvciBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfSVRfRVJSOiAgRXJyb3IgaW50ZXJydXB0KEZyYW1lIGVycm9yLCBub2lzZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvciwgb3ZlcnJ1biBlcnJvcikNCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBVU0FSVHggaW50ZXJydXB0cy4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFVTQVJUX0lUQ29uZmlnKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdTE2IFVTQVJUX0lULCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIHUzMiB1c2FydHJlZyA9IDB4MDAsIGl0cG9zID0gMHgwMCwgaXRtYXNrID0gMHgwMDsNCiAgdTMyIHVzYXJ0eGJhc2UgPSAweDAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9BTExfUEVSSVBIKFVTQVJUeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQ09ORklHX0lUKFVTQVJUX0lUKSk7DQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9QRVJJUEhfSVQoVVNBUlR4LCBVU0FSVF9JVCkpOyAvKiBUaGUgQ1RTIGludGVycnVwdCBpcyBub3QgYXZhaWxhYmxlIGZvciBVQVJUNCBhbmQgVUFSVDUgKi8gICAgIA0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KDQogIHVzYXJ0eGJhc2UgPSAoKih1MzIqKSYoVVNBUlR4KSk7DQoNCiAgLyogR2V0IHRoZSBVU0FSVCByZWdpc3RlciBpbmRleCAqLw0KICB1c2FydHJlZyA9ICgoKHU4KVVTQVJUX0lUKSA+PiAweDA1KTsNCg0KICAvKiBHZXQgdGhlIGludGVycnVwdCBwb3NpdGlvbiAqLw0KICBpdHBvcyA9IFVTQVJUX0lUICYgSVRfTWFzazsNCg0KICBpdG1hc2sgPSAoKCh1MzIpMHgwMSkgPDwgaXRwb3MpOw0KICAgIA0KICBpZiAodXNhcnRyZWcgPT0gMHgwMSkgLyogVGhlIElUIGlzIGluIENSMSByZWdpc3RlciAqLw0KICB7DQogICAgdXNhcnR4YmFzZSArPSAweDBDOw0KICB9DQogIGVsc2UgaWYgKHVzYXJ0cmVnID09IDB4MDIpIC8qIFRoZSBJVCBpcyBpbiBDUjIgcmVnaXN0ZXIgKi8NCiAgew0KICAgIHVzYXJ0eGJhc2UgKz0gMHgxMDsNCiAgfQ0KICBlbHNlIC8qIFRoZSBJVCBpcyBpbiBDUjMgcmVnaXN0ZXIgKi8NCiAgew0KICAgIHVzYXJ0eGJhc2UgKz0gMHgxNDsgDQogIH0NCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAqKHZ1MzIqKXVzYXJ0eGJhc2UgIHw9IGl0bWFzazsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAqKHZ1MzIqKXVzYXJ0eGJhc2UgJj0gfml0bWFzazsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVTQVJUX0RNQUNtZA0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFVTQVJUknMgRE1BIGludGVyZmFjZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBvciB0aGUgVUFSVCBwZXJpcGhlcmFsLiANCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVDEsIFVTQVJUMiwgVVNBUlQzIG9yIFVBUlQ0Lg0KKiAgICAgICAgICAgICAgICAgICAgTm90ZTogVGhlIERNQSBtb2RlIGlzIG5vdCBhdmFpbGFibGUgZm9yIFVBUlQ1Lg0KKiAgICAgICAgICAgICAgICAgIC0gVVNBUlRfRE1BUmVxOiBzcGVjaWZpZXMgdGhlIERNQSByZXF1ZXN0Lg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfRE1BUmVxX1R4OiBVU0FSVCBETUEgdHJhbnNtaXQgcmVxdWVzdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9ETUFSZXFfUng6IFVTQVJUIERNQSByZWNlaXZlIHJlcXVlc3QNCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIERNQSBSZXF1ZXN0IHNvdXJjZXMuDQoqICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFVTQVJUX0RNQUNtZChVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIHUxNiBVU0FSVF9ETUFSZXEsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUXzEyMzRfUEVSSVBIKFVTQVJUeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfRE1BUkVRKFVTQVJUX0RNQVJlcSkpOyAgDQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7IA0KDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHNlbGVjdGVkIHJlcXVlc3RzIGJ5IHNldHRpbmcgdGhlIERNQVQgYW5kL29yDQogICAgICAgRE1BUiBiaXRzIGluIHRoZSBVU0FSVCBDUjMgcmVnaXN0ZXIgKi8NCiAgICBVU0FSVHgtPkNSMyB8PSBVU0FSVF9ETUFSZXE7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciBzZWxlY3RlZCByZXF1ZXN0cyBieSBjbGVhcmluZyB0aGUgRE1BVCBhbmQvb3INCiAgICAgICBETUFSIGJpdHMgaW4gdGhlIFVTQVJUIENSMyByZWdpc3RlciAqLw0KICAgIFVTQVJUeC0+Q1IzICY9ICh1MTYpflVTQVJUX0RNQVJlcTsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVTQVJUX1NldEFkZHJlc3MNCiogRGVzY3JpcHRpb24gICAgOiBTZXRzIHRoZSBhZGRyZXNzIG9mIHRoZSBVU0FSVCBub2RlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIG9yIHRoZSBVQVJUIHBlcmlwaGVyYWwuIA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAtIFVTQVJUMSwgVVNBUlQyLCBVU0FSVDMsIFVBUlQ0IG9yIFVBUlQ1Lg0KKiAgICAgICAgICAgICAgICAgIC0gVVNBUlRfQWRkcmVzczogSW5kaWNhdGVzIHRoZSBhZGRyZXNzIG9mIHRoZSBVU0FSVCBub2RlLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVU0FSVF9TZXRBZGRyZXNzKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdTggVVNBUlRfQWRkcmVzcykNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9BRERSRVNTKFVTQVJUX0FkZHJlc3MpKTsgDQogICAgDQogIC8qIENsZWFyIHRoZSBVU0FSVCBhZGRyZXNzICovDQogIFVTQVJUeC0+Q1IyICY9IENSMl9BZGRyZXNzX01hc2s7DQogIC8qIFNldCB0aGUgVVNBUlQgYWRkcmVzcyBub2RlICovDQogIFVTQVJUeC0+Q1IyIHw9IFVTQVJUX0FkZHJlc3M7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVVNBUlRfV2FrZVVwQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogU2VsZWN0cyB0aGUgVVNBUlQgV2FrZVVwIG1ldGhvZC4NCiogSW5wdXQgICAgICAgICAgOiAtIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBvciB0aGUgVUFSVCBwZXJpcGhlcmFsLiANCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVDEsIFVTQVJUMiwgVVNBUlQzLCBVQVJUNCBvciBVQVJUNS4NCiogICAgICAgICAgICAgICAgICAtIFVTQVJUX1dha2VVcDogc3BlY2lmaWVzIHRoZSBVU0FSVCB3YWtldXAgbWV0aG9kLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX1dha2VVcF9JZGxlTGluZTogV2FrZVVwIGJ5IGFuIGlkbGUgbGluZSBkZXRlY3Rpb24NCiogICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX1dha2VVcF9BZGRyZXNzTWFyazogV2FrZVVwIGJ5IGFuIGFkZHJlc3MgbWFyaw0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVU0FSVF9XYWtlVXBDb25maWcoVVNBUlRfVHlwZURlZiogVVNBUlR4LCB1MTYgVVNBUlRfV2FrZVVwKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUxMX1BFUklQSChVU0FSVHgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX1dBS0VVUChVU0FSVF9XYWtlVXApKTsNCiAgDQogIFVTQVJUeC0+Q1IxICY9IENSMV9XQUtFX01hc2s7DQogIFVTQVJUeC0+Q1IxIHw9IFVTQVJUX1dha2VVcDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBVU0FSVF9SZWNlaXZlcldha2VVcENtZA0KKiBEZXNjcmlwdGlvbiAgICA6IERldGVybWluZXMgaWYgdGhlIFVTQVJUIGlzIGluIG11dGUgbW9kZSBvciBub3QuDQoqIElucHV0ICAgICAgICAgIDogLSBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgb3IgdGhlIFVBUlQgcGVyaXBoZXJhbC4gDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlQxLCBVU0FSVDIsIFVTQVJUMywgVUFSVDQgb3IgVUFSVDUuDQoqICAgICAgICAgICAgICAgICAgLSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBVU0FSVCBtdXRlIG1vZGUuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVU0FSVF9SZWNlaXZlcldha2VVcENtZChVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7IA0KICANCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIFVTQVJUIG11dGUgbW9kZSAgYnkgc2V0dGluZyB0aGUgUldVIGJpdCBpbiB0aGUgQ1IxIHJlZ2lzdGVyICovDQogICAgVVNBUlR4LT5DUjEgfD0gQ1IxX1JXVV9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgVVNBUlQgbXV0ZSBtb2RlIGJ5IGNsZWFyaW5nIHRoZSBSV1UgYml0IGluIHRoZSBDUjEgcmVnaXN0ZXIgKi8NCiAgICBVU0FSVHgtPkNSMSAmPSBDUjFfUldVX1Jlc2V0Ow0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVVNBUlRfTElOQnJlYWtEZXRlY3RMZW5ndGhDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBTZXRzIHRoZSBVU0FSVCBMSU4gQnJlYWsgZGV0ZWN0aW9uIGxlbmd0aC4NCiogSW5wdXQgICAgICAgICAgOiAtIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBvciB0aGUgVUFSVCBwZXJpcGhlcmFsLiANCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVDEsIFVTQVJUMiwgVVNBUlQzLCBVQVJUNCBvciBVQVJUNS4NCiogICAgICAgICAgICAgICAgICAtIFVTQVJUX0xJTkJyZWFrRGV0ZWN0TGVuZ3RoOiBzcGVjaWZpZXMgdGhlIExJTiBicmVhaw0KKiAgICAgICAgICAgICAgICAgICAgZGV0ZWN0aW9uIGxlbmd0aC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0xJTkJyZWFrRGV0ZWN0TGVuZ3RoXzEwYjogMTAtYml0IGJyZWFrIGRldGVjdGlvbg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9MSU5CcmVha0RldGVjdExlbmd0aF8xMWI6IDExLWJpdCBicmVhayBkZXRlY3Rpb24NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVVNBUlRfTElOQnJlYWtEZXRlY3RMZW5ndGhDb25maWcoVVNBUlRfVHlwZURlZiogVVNBUlR4LCB1MTYgVVNBUlRfTElOQnJlYWtEZXRlY3RMZW5ndGgpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9BTExfUEVSSVBIKFVTQVJUeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfTElOX0JSRUFLX0RFVEVDVF9MRU5HVEgoVVNBUlRfTElOQnJlYWtEZXRlY3RMZW5ndGgpKTsNCiAgDQogIFVTQVJUeC0+Q1IyICY9IENSMl9MQkRMX01hc2s7DQogIFVTQVJUeC0+Q1IyIHw9IFVTQVJUX0xJTkJyZWFrRGV0ZWN0TGVuZ3RoOyAgDQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVVNBUlRfTElOQ21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVVNBUlSScyBMSU4gbW9kZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBvciB0aGUgVUFSVCBwZXJpcGhlcmFsLiANCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVDEsIFVTQVJUMiwgVVNBUlQzLCBVQVJUNCBvciBVQVJUNS4NCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFVTQVJUIExJTiBtb2RlLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVVNBUlRfTElOQ21kKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUxMX1BFUklQSChVU0FSVHgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBMSU4gbW9kZSBieSBzZXR0aW5nIHRoZSBMSU5FTiBiaXQgaW4gdGhlIENSMiByZWdpc3RlciAqLw0KICAgIFVTQVJUeC0+Q1IyIHw9IENSMl9MSU5FTl9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgTElOIG1vZGUgYnkgY2xlYXJpbmcgdGhlIExJTkVOIGJpdCBpbiB0aGUgQ1IyIHJlZ2lzdGVyICovDQogICAgVVNBUlR4LT5DUjIgJj0gQ1IyX0xJTkVOX1Jlc2V0Ow0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVVNBUlRfU2VuZERhdGENCiogRGVzY3JpcHRpb24gICAgOiBUcmFuc21pdHMgc2luZ2xlIGRhdGEgdGhyb3VnaCB0aGUgVVNBUlR4IHBlcmlwaGVyYWwuDQoqIElucHV0ICAgICAgICAgIDogLSBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgb3IgdGhlIFVBUlQgcGVyaXBoZXJhbC4gDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlQxLCBVU0FSVDIsIFVTQVJUMywgVUFSVDQgb3IgVUFSVDUuDQoqICAgICAgICAgICAgICAgICAgLSBEYXRhOiB0aGUgZGF0YSB0byB0cmFuc21pdC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVVNBUlRfU2VuZERhdGEoVVNBUlRfVHlwZURlZiogVVNBUlR4LCB1MTYgRGF0YSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9EQVRBKERhdGEpKTsgDQogICAgDQogIC8qIFRyYW5zbWl0IERhdGEgKi8NCiAgVVNBUlR4LT5EUiA9IChEYXRhICYgKHUxNikweDAxRkYpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVTQVJUX1JlY2VpdmVEYXRhDQoqIERlc2NyaXB0aW9uICAgIDogUmV0dXJucyB0aGUgbW9zdCByZWNlbnQgcmVjZWl2ZWQgZGF0YSBieSB0aGUgVVNBUlR4IHBlcmlwaGVyYWwuDQoqIElucHV0ICAgICAgICAgIDogLSBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgb3IgdGhlIFVBUlQgcGVyaXBoZXJhbC4gDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlQxLCBVU0FSVDIsIFVTQVJUMywgVUFSVDQgb3IgVUFSVDUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSByZWNlaXZlZCBkYXRhLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnUxNiBVU0FSVF9SZWNlaXZlRGF0YShVU0FSVF9UeXBlRGVmKiBVU0FSVHgpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9BTExfUEVSSVBIKFVTQVJUeCkpOw0KICANCiAgLyogUmVjZWl2ZSBEYXRhICovDQogIHJldHVybiAodTE2KShVU0FSVHgtPkRSICYgKHUxNikweDAxRkYpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVTQVJUX1NlbmRCcmVhaw0KKiBEZXNjcmlwdGlvbiAgICA6IFRyYW5zbWl0cyBicmVhayBjaGFyYWN0ZXJzLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIG9yIHRoZSBVQVJUIHBlcmlwaGVyYWwuIA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAtIFVTQVJUMSwgVVNBUlQyLCBVU0FSVDMsIFVBUlQ0IG9yIFVBUlQ1Lg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVU0FSVF9TZW5kQnJlYWsoVVNBUlRfVHlwZURlZiogVVNBUlR4KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUxMX1BFUklQSChVU0FSVHgpKTsNCiAgDQogIC8qIFNlbmQgYnJlYWsgY2hhcmFjdGVycyAqLw0KICBVU0FSVHgtPkNSMSB8PSBDUjFfU0JLX1NldDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBVU0FSVF9TZXRHdWFyZFRpbWUNCiogRGVzY3JpcHRpb24gICAgOiBTZXRzIHRoZSBzcGVjaWZpZWQgVVNBUlQgZ3VhcmQgdGltZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFVTQVJUeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgVVNBUlQNCiogICAgICAgICAgICAgICAgICAgIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgTm90ZTogVGhlIGd1YXJkIHRpbWUgYml0cyBhcmUgbm90IGF2YWlsYWJsZSBmb3IgVUFSVDQgYW5kIFVBUlQ1Lg0KKiAgICAgICAgICAgICAgICAgIC0gVVNBUlRfR3VhcmRUaW1lOiBzcGVjaWZpZXMgdGhlIGd1YXJkIHRpbWUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFVTQVJUX1NldEd1YXJkVGltZShVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIHU4IFVTQVJUX0d1YXJkVGltZSkNCnsgICAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19VU0FSVF8xMjNfUEVSSVBIKFVTQVJUeCkpOw0KICANCiAgLyogQ2xlYXIgdGhlIFVTQVJUIEd1YXJkIHRpbWUgKi8NCiAgVVNBUlR4LT5HVFBSICY9IEdUUFJfTFNCX01hc2s7DQogIC8qIFNldCB0aGUgVVNBUlQgZ3VhcmQgdGltZSAqLw0KICBVU0FSVHgtPkdUUFIgfD0gKHUxNikoKHUxNilVU0FSVF9HdWFyZFRpbWUgPDwgMHgwOCk7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVVNBUlRfU2V0UHJlc2NhbGVyDQoqIERlc2NyaXB0aW9uICAgIDogU2V0cyB0aGUgc3lzdGVtIGNsb2NrIHByZXNjYWxlci4NCiogSW5wdXQgICAgICAgICAgOiAtIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBvciB0aGUgVUFSVCBwZXJpcGhlcmFsLiANCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVDEsIFVTQVJUMiwgVVNBUlQzLCBVQVJUNCBvciBVQVJUNS4NCiogICAgICAgICAgICAgICAgICBOb3RlOiBUaGUgZnVuY3Rpb24gaXMgdXNlZCBmb3IgSXJEQSBtb2RlIHdpdGggVUFSVDQgYW5kIFVBUlQ1Lg0KKiAgICAgICAgICAgICAgICAgIC0gVVNBUlRfUHJlc2NhbGVyOiBzcGVjaWZpZXMgdGhlIHByZXNjYWxlciBjbG9jay4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVVNBUlRfU2V0UHJlc2NhbGVyKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdTggVVNBUlRfUHJlc2NhbGVyKQ0KeyANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQogIA0KICAvKiBDbGVhciB0aGUgVVNBUlQgcHJlc2NhbGVyICovDQogIFVTQVJUeC0+R1RQUiAmPSBHVFBSX01TQl9NYXNrOw0KICAvKiBTZXQgdGhlIFVTQVJUIHByZXNjYWxlciAqLw0KICBVU0FSVHgtPkdUUFIgfD0gVVNBUlRfUHJlc2NhbGVyOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVTQVJUX1NtYXJ0Q2FyZENtZA0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFVTQVJUknMgU21hcnQgQ2FyZCBtb2RlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVVNBUlR4OiB3aGVyZSB4IGNhbiBiZSAxLCAyIG9yIDMgdG8gc2VsZWN0IHRoZSBVU0FSVA0KKiAgICAgICAgICAgICAgICAgICAgcGVyaXBoZXJhbC4gDQoqICAgICAgICAgICAgICAgICAgICBOb3RlOiBUaGUgU21hcnQgQ2FyZCBtb2RlIGlzIG5vdCBhdmFpbGFibGUgZm9yIFVBUlQ0IGFuZCBVQVJUNS4NCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFNtYXJ0IENhcmQgbW9kZS4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFVTQVJUX1NtYXJ0Q2FyZENtZChVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUXzEyM19QRVJJUEgoVVNBUlR4KSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQoNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIFNDIG1vZGUgYnkgc2V0dGluZyB0aGUgU0NFTiBiaXQgaW4gdGhlIENSMyByZWdpc3RlciAqLw0KICAgIFVTQVJUeC0+Q1IzIHw9IENSM19TQ0VOX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBTQyBtb2RlIGJ5IGNsZWFyaW5nIHRoZSBTQ0VOIGJpdCBpbiB0aGUgQ1IzIHJlZ2lzdGVyICovDQogICAgVVNBUlR4LT5DUjMgJj0gQ1IzX1NDRU5fUmVzZXQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBVU0FSVF9TbWFydENhcmROQUNLQ21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyBOQUNLIHRyYW5zbWlzc2lvbi4NCiogSW5wdXQgICAgICAgICAgOiAtIFVTQVJUeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgVVNBUlQNCiogICAgICAgICAgICAgICAgICAgIHBlcmlwaGVyYWwuIA0KKiAgICAgICAgICAgICAgICAgICAgTm90ZTogVGhlIFNtYXJ0IENhcmQgbW9kZSBpcyBub3QgYXZhaWxhYmxlIGZvciBVQVJUNCBhbmQgVUFSVDUuDQoqICAgICAgICAgICAgICAgICAgLSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBOQUNLIHRyYW5zbWlzc2lvbi4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFVTQVJUX1NtYXJ0Q2FyZE5BQ0tDbWQoVVNBUlRfVHlwZURlZiogVVNBUlR4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19VU0FSVF8xMjNfUEVSSVBIKFVTQVJUeCkpOyAgDQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQoNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIE5BQ0sgdHJhbnNtaXNzaW9uIGJ5IHNldHRpbmcgdGhlIE5BQ0sgYml0IGluIHRoZSBDUjMgcmVnaXN0ZXIgKi8NCiAgICBVU0FSVHgtPkNSMyB8PSBDUjNfTkFDS19TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgTkFDSyB0cmFuc21pc3Npb24gYnkgY2xlYXJpbmcgdGhlIE5BQ0sgYml0IGluIHRoZSBDUjMgcmVnaXN0ZXIgKi8NCiAgICBVU0FSVHgtPkNSMyAmPSBDUjNfTkFDS19SZXNldDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVTQVJUX0hhbGZEdXBsZXhDbWQNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBVU0FSVJJzIEhhbGYgRHVwbGV4IGNvbW11bmljYXRpb24uDQoqIElucHV0ICAgICAgICAgIDogLSBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgb3IgdGhlIFVBUlQgcGVyaXBoZXJhbC4gDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlQxLCBVU0FSVDIsIFVTQVJUMywgVUFSVDQgb3IgVUFSVDUuDQoqICAgICAgICAgICAgICAgICAgLSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBVU0FSVCBDb21tdW5pY2F0aW9uLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVVNBUlRfSGFsZkR1cGxleENtZChVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIA0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgSGFsZi1EdXBsZXggbW9kZSBieSBzZXR0aW5nIHRoZSBIRFNFTCBiaXQgaW4gdGhlIENSMyByZWdpc3RlciAqLw0KICAgIFVTQVJUeC0+Q1IzIHw9IENSM19IRFNFTF9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgSGFsZi1EdXBsZXggbW9kZSBieSBjbGVhcmluZyB0aGUgSERTRUwgYml0IGluIHRoZSBDUjMgcmVnaXN0ZXIgKi8NCiAgICBVU0FSVHgtPkNSMyAmPSBDUjNfSERTRUxfUmVzZXQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBVU0FSVF9JckRBQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlcyB0aGUgVVNBUlSScyBJckRBIGludGVyZmFjZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBvciB0aGUgVUFSVCBwZXJpcGhlcmFsLiANCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVDEsIFVTQVJUMiwgVVNBUlQzLCBVQVJUNCBvciBVQVJUNS4NCiogICAgICAgICAgICAgICAgICAtIFVTQVJUX0lyREFNb2RlOiBzcGVjaWZpZXMgdGhlIElyREEgbW9kZS4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0lyREFNb2RlX0xvd1Bvd2VyDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0lyREFNb2RlX05vcm1hbA0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVU0FSVF9JckRBQ29uZmlnKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdTE2IFVTQVJUX0lyREFNb2RlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUxMX1BFUklQSChVU0FSVHgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0lSREFfTU9ERShVU0FSVF9JckRBTW9kZSkpOw0KICAgIA0KICBVU0FSVHgtPkNSMyAmPSBDUjNfSVJMUF9NYXNrOw0KICBVU0FSVHgtPkNSMyB8PSBVU0FSVF9JckRBTW9kZTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBVU0FSVF9JckRBQ21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVVNBUlSScyBJckRBIGludGVyZmFjZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBvciB0aGUgVUFSVCBwZXJpcGhlcmFsLiANCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVDEsIFVTQVJUMiwgVVNBUlQzLCBVQVJUNCBvciBVQVJUNS4NCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIElyREEgbW9kZS4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFVTQVJUX0lyREFDbWQoVVNBUlRfVHlwZURlZiogVVNBUlR4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9BTExfUEVSSVBIKFVTQVJUeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICAgIA0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgSXJEQSBtb2RlIGJ5IHNldHRpbmcgdGhlIElSRU4gYml0IGluIHRoZSBDUjMgcmVnaXN0ZXIgKi8NCiAgICBVU0FSVHgtPkNSMyB8PSBDUjNfSVJFTl9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgSXJEQSBtb2RlIGJ5IGNsZWFyaW5nIHRoZSBJUkVOIGJpdCBpbiB0aGUgQ1IzIHJlZ2lzdGVyICovDQogICAgVVNBUlR4LT5DUjMgJj0gQ1IzX0lSRU5fUmVzZXQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBVU0FSVF9HZXRGbGFnU3RhdHVzDQoqIERlc2NyaXB0aW9uICAgIDogQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVU0FSVCBmbGFnIGlzIHNldCBvciBub3QuDQoqIElucHV0ICAgICAgICAgIDogLSBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgb3IgdGhlIFVBUlQgcGVyaXBoZXJhbC4gDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlQxLCBVU0FSVDIsIFVTQVJUMywgVUFSVDQgb3IgVUFSVDUuDQoqICAgICAgICAgICAgICAgICAgLSBVU0FSVF9GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9GTEFHX0NUUzogIENUUyBDaGFuZ2UgZmxhZyAobm90IGF2YWlsYWJsZSBmb3IgDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVDQgYW5kIFVBUlQ1KQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9GTEFHX0xCRDogIExJTiBCcmVhayBkZXRlY3Rpb24gZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9GTEFHX1RYRTogIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9GTEFHX1RDOiAgIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0ZMQUdfUlhORTogUmVjZWl2ZSBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0ZMQUdfSURMRTogSWRsZSBMaW5lIGRldGVjdGlvbiBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0ZMQUdfT1JFOiAgT3ZlclJ1biBFcnJvciBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0ZMQUdfTkU6ICAgTm9pc2UgRXJyb3IgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9GTEFHX0ZFOiAgIEZyYW1pbmcgRXJyb3IgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9GTEFHX1BFOiAgIFBhcml0eSBFcnJvciBmbGFnDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBuZXcgc3RhdGUgb2YgVVNBUlRfRkxBRyAoU0VUIG9yIFJFU0VUKS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpGbGFnU3RhdHVzIFVTQVJUX0dldEZsYWdTdGF0dXMoVVNBUlRfVHlwZURlZiogVVNBUlR4LCB1MTYgVVNBUlRfRkxBRykNCnsNCiAgRmxhZ1N0YXR1cyBiaXRzdGF0dXMgPSBSRVNFVDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUxMX1BFUklQSChVU0FSVHgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0ZMQUcoVVNBUlRfRkxBRykpOw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfUEVSSVBIX0ZMQUcoVVNBUlR4LCBVU0FSVF9GTEFHKSk7IC8qIFRoZSBDVFMgZmxhZyBpcyBub3QgYXZhaWxhYmxlIGZvciBVQVJUNCBhbmQgVUFSVDUgKi8gICANCg0KICBpZiAoKFVTQVJUeC0+U1IgJiBVU0FSVF9GTEFHKSAhPSAodTE2KVJFU0VUKQ0KICB7DQogICAgYml0c3RhdHVzID0gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KICB9DQogIHJldHVybiBiaXRzdGF0dXM7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVVNBUlRfQ2xlYXJGbGFnDQoqIERlc2NyaXB0aW9uICAgIDogQ2xlYXJzIHRoZSBVU0FSVHgncyBwZW5kaW5nIGZsYWdzLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIG9yIHRoZSBVQVJUIHBlcmlwaGVyYWwuIA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAtIFVTQVJUMSwgVVNBUlQyLCBVU0FSVDMsIFVBUlQ0IG9yIFVBUlQ1Lg0KKiAgICAgICAgICAgICAgICAgIC0gVVNBUlRfRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNsZWFyLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfRkxBR19DVFM6ICBDVFMgQ2hhbmdlIGZsYWcgKG5vdCBhdmFpbGFibGUgZm9yDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVDQgYW5kIFVBUlQ1KS4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfRkxBR19MQkQ6ICBMSU4gQnJlYWsgZGV0ZWN0aW9uIGZsYWcuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0ZMQUdfVEM6ICAgVHJhbnNtaXNzaW9uIENvbXBsZXRlIGZsYWcuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0ZMQUdfUlhORTogUmVjZWl2ZSBkYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBmbGFnLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9GTEFHX0lETEU6IElkbGUgTGluZSBkZXRlY3Rpb24gZmxhZy4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfRkxBR19PUkU6ICBPdmVyUnVuIEVycm9yIGZsYWcuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0ZMQUdfTkU6ICAgTm9pc2UgRXJyb3IgZmxhZy4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfRkxBR19GRTogICBGcmFtaW5nIEVycm9yIGZsYWcuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0ZMQUdfUEU6ICAgUGFyaXR5IEVycm9yIGZsYWcuDQoqDQoqICAgICAgICAgICAgICAgICAgICBOb3RlOiAtIEZvciBJRExFLCBPUkUsIE5FLCBGRSBhbmQgUEUgZmxhZ3MgdXNlciBoYXMgdG8gcmVhZCANCiogICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBVU0FSVCBEUiByZWdpc3RlciBhZnRlciBjYWxsaW5nIHRoaXMgZnVuY3Rpb24uDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAtIFRYRSBmbGFnIGNhbid0IGJlIGNsZWFyZWQgYnkgdGhpcyBmdW5jdGlvbiwgaXQncw0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJlZCBvbmx5IGJ5IGEgd3JpdGUgdG8gdGhlIFVTQVJUIERSIHJlZ2lzdGVyLiAgICAgICAgICAgICAgICAgICAgICAgIA0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVU0FSVF9DbGVhckZsYWcoVVNBUlRfVHlwZURlZiogVVNBUlR4LCB1MTYgVVNBUlRfRkxBRykNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9DTEVBUl9GTEFHKFVTQVJUX0ZMQUcpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX1BFUklQSF9GTEFHKFVTQVJUeCwgVVNBUlRfRkxBRykpOyAvKiBUaGUgQ1RTIGZsYWcgaXMgbm90IGF2YWlsYWJsZSBmb3IgVUFSVDQgYW5kIFVBUlQ1ICovICAgDQogICANCiAgVVNBUlR4LT5TUiA9ICh1MTYpflVTQVJUX0ZMQUc7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVVNBUlRfR2V0SVRTdGF0dXMNCiogRGVzY3JpcHRpb24gICAgOiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIFVTQVJUIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIG9yIHRoZSBVQVJUIHBlcmlwaGVyYWwuIA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAtIFVTQVJUMSwgVVNBUlQyLCBVU0FSVDMsIFVBUlQ0IG9yIFVBUlQ1Lg0KKiAgICAgICAgICAgICAgICAgIC0gVVNBUlRfSVQ6IHNwZWNpZmllcyB0aGUgVVNBUlQgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0lUX0NUUzogIENUUyBjaGFuZ2UgaW50ZXJydXB0IChub3QgYXZhaWxhYmxlIGZvciANCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVDQgYW5kIFVBUlQ1KQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9JVF9MQkQ6ICBMSU4gQnJlYWsgZGV0ZWN0aW9uIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9JVF9UWEU6ICBUYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0lUX1RDOiAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfSVRfUlhORTogUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSANCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0lUX0lETEU6IElkbGUgbGluZSBkZXRlY3Rpb24gaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0lUX09SRTogIE92ZXJSdW4gRXJyb3IgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0lUX05FOiAgIE5vaXNlIEVycm9yIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9JVF9GRTogICBGcmFtaW5nIEVycm9yIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9JVF9QRTogICBQYXJpdHkgRXJyb3IgaW50ZXJydXB0DQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBuZXcgc3RhdGUgb2YgVVNBUlRfSVQgKFNFVCBvciBSRVNFVCkuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KSVRTdGF0dXMgVVNBUlRfR2V0SVRTdGF0dXMoVVNBUlRfVHlwZURlZiogVVNBUlR4LCB1MTYgVVNBUlRfSVQpDQp7DQogIHUzMiBiaXRwb3MgPSAweDAwLCBpdG1hc2sgPSAweDAwLCB1c2FydHJlZyA9IDB4MDA7DQogIElUU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9BTExfUEVSSVBIKFVTQVJUeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfSVQoVVNBUlRfSVQpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX1BFUklQSF9JVChVU0FSVHgsIFVTQVJUX0lUKSk7IC8qIFRoZSBDVFMgaW50ZXJydXB0IGlzIG5vdCBhdmFpbGFibGUgZm9yIFVBUlQ0IGFuZCBVQVJUNSAqLyAgDQogIA0KICAvKiBHZXQgdGhlIFVTQVJUIHJlZ2lzdGVyIGluZGV4ICovDQogIHVzYXJ0cmVnID0gKCgodTgpVVNBUlRfSVQpID4+IDB4MDUpOw0KDQogIC8qIEdldCB0aGUgaW50ZXJydXB0IHBvc2l0aW9uICovDQogIGl0bWFzayA9IFVTQVJUX0lUICYgSVRfTWFzazsNCg0KICBpdG1hc2sgPSAodTMyKTB4MDEgPDwgaXRtYXNrOw0KICANCiAgaWYgKHVzYXJ0cmVnID09IDB4MDEpIC8qIFRoZSBJVCAgaXMgaW4gQ1IxIHJlZ2lzdGVyICovDQogIHsNCiAgICBpdG1hc2sgJj0gVVNBUlR4LT5DUjE7DQogIH0NCiAgZWxzZSBpZiAodXNhcnRyZWcgPT0gMHgwMikgLyogVGhlIElUICBpcyBpbiBDUjIgcmVnaXN0ZXIgKi8NCiAgew0KICAgIGl0bWFzayAmPSBVU0FSVHgtPkNSMjsNCiAgfQ0KICBlbHNlIC8qIFRoZSBJVCAgaXMgaW4gQ1IzIHJlZ2lzdGVyICovDQogIHsNCiAgICBpdG1hc2sgJj0gVVNBUlR4LT5DUjM7DQogIH0NCiAgDQogIGJpdHBvcyA9IFVTQVJUX0lUID4+IDB4MDg7DQoNCiAgYml0cG9zID0gKHUzMikweDAxIDw8IGJpdHBvczsNCiAgYml0cG9zICY9IFVTQVJUeC0+U1I7DQoNCiAgaWYgKChpdG1hc2sgIT0gKHUxNilSRVNFVCkmJihiaXRwb3MgIT0gKHUxNilSRVNFVCkpDQogIHsNCiAgICBiaXRzdGF0dXMgPSBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgYml0c3RhdHVzID0gUkVTRVQ7DQogIH0NCiAgDQogIHJldHVybiBiaXRzdGF0dXM7ICANCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBVU0FSVF9DbGVhcklUUGVuZGluZ0JpdA0KKiBEZXNjcmlwdGlvbiAgICA6IENsZWFycyB0aGUgVVNBUlR4knMgaW50ZXJydXB0IHBlbmRpbmcgYml0cy4NCiogSW5wdXQgICAgICAgICAgOiAtIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBvciB0aGUgVUFSVCBwZXJpcGhlcmFsLiANCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVDEsIFVTQVJUMiwgVVNBUlQzLCBVQVJUNCBvciBVQVJUNS4NCiogICAgICAgICAgICAgICAgICAtIFVTQVJUX0lUOiBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBwZW5kaW5nIGJpdCB0byBjbGVhci4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0lUX0NUUzogIENUUyBjaGFuZ2UgaW50ZXJydXB0IChub3QgYXZhaWxhYmxlIGZvciANCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVUFSVDQgYW5kIFVBUlQ1KQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9JVF9MQkQ6ICBMSU4gQnJlYWsgZGV0ZWN0aW9uIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9JVF9UQzogICBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0LiANCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfSVRfUlhORTogUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0lUX0lETEU6IElkbGUgbGluZSBkZXRlY3Rpb24gaW50ZXJydXB0Lg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9JVF9PUkU6ICBPdmVyUnVuIEVycm9yIGludGVycnVwdC4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfSVRfTkU6ICAgTm9pc2UgRXJyb3IgaW50ZXJydXB0Lg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9JVF9GRTogICBGcmFtaW5nIEVycm9yIGludGVycnVwdC4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfSVRfUEU6ICAgUGFyaXR5IEVycm9yIGludGVycnVwdC4NCioNCiogICAgICAgICAgICAgICAgICAgIE5vdGU6IC0gRm9yIElETEUsIE9SRSwgTkUsIEZFIGFuZCBQRSBwZW5kaW5nIGJpdHMgdXNlciBoYXMgdG8gDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWQgdGhlIFVTQVJUIERSIHJlZ2lzdGVyIGFmdGVyIGNhbGxpbmcgdGhpcyBmdW5jdGlvbi4NCiogICAgICAgICAgICAgICAgICAgICAgICAgIC0gVFhFIHBlbmRpbmcgYml0IGNhbid0IGJlIGNsZWFyZWQgYnkgdGhpcyBmdW5jdGlvbiwgaXQncw0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhcmVkIG9ubHkgYnkgYSB3cml0ZSB0byB0aGUgVVNBUlQgRFIgcmVnaXN0ZXIuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFVTQVJUX0NsZWFySVRQZW5kaW5nQml0KFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdTE2IFVTQVJUX0lUKQ0Kew0KICB1MTYgYml0cG9zID0gMHgwMCwgaXRtYXNrID0gMHgwMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUxMX1BFUklQSChVU0FSVHgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0NMRUFSX0lUKFVTQVJUX0lUKSk7DQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9QRVJJUEhfSVQoVVNBUlR4LCBVU0FSVF9JVCkpOyAvKiBUaGUgQ1RTIGludGVycnVwdCBpcyBub3QgYXZhaWxhYmxlIGZvciBVQVJUNCBhbmQgVUFSVDUgKi8NCiAgDQogIGJpdHBvcyA9IFVTQVJUX0lUID4+IDB4MDg7DQoNCiAgaXRtYXNrID0gKHUxNikoKHUxNikweDAxIDw8IGJpdHBvcyk7DQogIFVTQVJUeC0+U1IgPSAodTE2KX5pdG1hc2s7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwOCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovDQo=