LyoqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwNyBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKioqKioqKioqKioqKioqKioNCiogRmlsZSBOYW1lICAgICAgICAgIDogc3RtMzJmMTB4X3VzYXJ0LmMNCiogQXV0aG9yICAgICAgICAgICAgIDogTUNEIEFwcGxpY2F0aW9uIFRlYW0NCiogRGF0ZSBGaXJzdCBJc3N1ZWQgIDogMDkvMjkvMjAwNg0KKiBEZXNjcmlwdGlvbiAgICAgICAgOiBUaGlzIGZpbGUgcHJvdmlkZXMgYWxsIHRoZSBVU0FSVCBmaXJtd2FyZSBmdW5jdGlvbnMuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBIaXN0b3J5Og0KKiAwNC8wMi8yMDA3OiBWMC4yDQoqIDAyLzA1LzIwMDc6IFYwLjENCiogMDkvMjkvMjAwNjogVjAuMDENCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIFRIRSBQUkVTRU5UIFNPRlRXQVJFIFdISUNIIElTIEZPUiBHVUlEQU5DRSBPTkxZIEFJTVMgQVQgUFJPVklESU5HIENVU1RPTUVSUw0KKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRSBUSU1FLg0KKiBBUyBBIFJFU1VMVCwgU1RNSUNST0VMRUNUUk9OSUNTIFNIQUxMIE5PVCBCRSBIRUxEIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwNCiogSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIFdJVEggUkVTUEVDVCBUTyBBTlkgQ0xBSU1TIEFSSVNJTkcgRlJPTSBUSEUNCiogQ09OVEVOVCBPRiBTVUNIIFNPRlRXQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRSBDT0RJTkcNCiogSU5GT1JNQVRJT04gQ09OVEFJTkVEIEhFUkVJTiBJTiBDT05ORUNUSU9OIFdJVEggVEhFSVIgUFJPRFVDVFMuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQovKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KI2luY2x1ZGUgInN0bTMyZjEweF91c2FydC5oIg0KI2luY2x1ZGUgInN0bTMyZjEweF9yY2MuaCINCg0KLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBVU0FSVCBSVU4gTWFzayAqLw0KI2RlZmluZSBDUjFfUlVOX1NldCAgICAgICAgICAgICAgICgodTE2KTB4MjAwMCkgIC8qIFVTQVJUIEVuYWJsZSBNYXNrICovDQojZGVmaW5lIENSMV9SVU5fUmVzZXQgICAgICAgICAgICAgKCh1MTYpMHhERkZGKSAgLyogVVNBUlQgRGlzYWJsZSBNYXNrICovDQoNCiNkZWZpbmUgQ1IyX0FkZHJlc3NfTWFzayAgICAgICAgICAoKHUxNikweEZGRjApICAvKiBVU0FSVCBhZGRyZXNzIE1hc2sgKi8NCg0KLyogVVNBUlQgUldVIE1hc2sgKi8NCiNkZWZpbmUgQ1IxX1JXVV9TZXQgICAgICAgICAgICAgICAoKHUxNikweDAwMDIpICAvKiBVU0FSVCBtdXRlIG1vZGUgRW5hYmxlIE1hc2sgKi8NCiNkZWZpbmUgQ1IxX1JXVV9SZXNldCAgICAgICAgICAgICAoKHUxNikweEZGRkQpICAvKiBVU0FSVCBtdXRlIG1vZGUgRW5hYmxlIE1hc2sgKi8NCg0KI2RlZmluZSBVU0FSVF9JVF9NYXNrICAgICAgICAgICAgICgodTE2KTB4MDAxRikgIC8qIFVTQVJUIEludGVycnVwdCBNYXNrICovDQoNCi8qIFVTQVJUIExJTiBNYXNrICovDQojZGVmaW5lIENSMl9MSU5FX1NldCAgICAgICAgICAgICAgKCh1MTYpMHg0MDAwKSAgLyogVVNBUlQgTElOIEVuYWJsZSBNYXNrICovDQojZGVmaW5lIENSMl9MSU5FX1Jlc2V0ICAgICAgICAgICAgKCh1MTYpMHhCRkZGKSAgLyogVVNBUlQgTElOIERpc2FibGUgTWFzayAqLw0KDQojZGVmaW5lIENSMV9TQktfU2V0ICAgICAgICAgICAgICAgKCh1MTYpMHgwMDAxKSAgLyogVVNBUlQgQnJlYWsgQ2hhcmFjdGVyIHNlbmQgTWFzayAqLw0KDQovKiBVU0FSVCBTQyBNYXNrICovDQojZGVmaW5lIENSM19TQ0VOX1NldCAgICAgICAgICAgICAgKCh1MTYpMHgwMDIwKSAgLyogVVNBUlQgU0MgRW5hYmxlIE1hc2sgKi8NCiNkZWZpbmUgQ1IzX1NDRU5fUmVzZXQgICAgICAgICAgICAoKHUxNikweEZGREYpICAvKiBVU0FSVCBTQyBEaXNhYmxlIE1hc2sgKi8NCg0KLyogVVNBUlQgU0MgTkFDSyBNYXNrICovDQojZGVmaW5lIENSM19OQUNLX1NldCAgICAgICAgICAgICAgKCh1MTYpMHgwMDEwKSAgLyogVVNBUlQgU0MgTkFDSyBFbmFibGUgTWFzayAqLw0KI2RlZmluZSBDUjNfTkFDS19SZXNldCAgICAgICAgICAgICgodTE2KTB4RkZFRikgIC8qIFVTQVJUIFNDIE5BQ0sgRGlzYWJsZSBNYXNrICovDQoNCi8qIFVTQVJUIEhhbGYtRHVwbGV4IE1hc2sgKi8NCiNkZWZpbmUgQ1IzX0hEU0VMX1NldCAgICAgICAgICAgICAoKHUxNikweDAwMDgpICAvKiBVU0FSVCBIYWxmLUR1cGxleCBFbmFibGUgTWFzayAqLw0KI2RlZmluZSBDUjNfSERTRUxfUmVzZXQgICAgICAgICAgICgodTE2KTB4RkZGNykgIC8qIFVTQVJUIEhhbGYtRHVwbGV4IERpc2FibGUgTWFzayAqLw0KDQovKiBVU0FSVCBJckRBIE1hc2sgKi8NCiNkZWZpbmUgQ1IzX0lSTFBfTWFzayAgICAgICAgICAgICAoKHUxNikweEZGRkIpICAvKiBVU0FSVCBJckRBIExvd1Bvd2VyIG1vZGUgTWFzayAqLw0KDQovKiBVU0FSVCBMSU4gQnJlYWsgZGV0ZWN0aW9uICovDQojZGVmaW5lIENSM19MQkRMX01hc2sgICAgICAgICAgICAgKCh1MTYpMHhGRkRGKSAgLyogVVNBUlQgTElOIEJyZWFrIGRldGVjdGlvbiBNYXNrICovDQoNCi8qIFVTQVJUIFdha2VVcCBNZXRob2QgICovDQojZGVmaW5lIENSM19XQUtFX01hc2sgICAgICAgICAgICAgKCh1MTYpMHhGN0ZGKSAgLyogVVNBUlQgV2FrZVVwIE1ldGhvZCBNYXNrICovDQoNCi8qIFVTQVJUIElyREEgTWFzayAqLw0KI2RlZmluZSBDUjNfSVJFTl9TZXQgICAgICAgICAgICAgICgodTE2KTB4MDAwMikgIC8qIFVTQVJUIElyREEgRW5hYmxlIE1hc2sgKi8NCiNkZWZpbmUgQ1IzX0lSRU5fUmVzZXQgICAgICAgICAgICAoKHUxNikweEZGRkQpICAvKiBVU0FSVCBJckRBIERpc2FibGUgTWFzayAqLw0KDQojZGVmaW5lIEdUUFJfTFNCX01hc2sgICAgICAgICAgICAgKCh1MTYpMHgwMEZGKSAgLyogR3VhcmQgVGltZSBSZWdpc3RlciBMU0IgTWFzayAqLw0KI2RlZmluZSBHVFBSX01TQl9NYXNrICAgICAgICAgICAgICgodTE2KTB4RkYwMCkgIC8qIEd1YXJkIFRpbWUgUmVnaXN0ZXIgTVNCIE1hc2sgKi8NCg0KI2RlZmluZSBDUjFfQ0xFQVJfTWFzayAgICAgICAgICAgICgodTE2KTB4RTlGMykgIC8qIFVTQVJUIENSMSBNYXNrICovDQojZGVmaW5lIENSMl9DTEVBUl9NYXNrICAgICAgICAgICAgKCh1MTYpMHhDMEZGKSAgLyogVVNBUlQgQ1IyIE1hc2sgKi8NCiNkZWZpbmUgQ1IzX0NMRUFSX01hc2sgICAgICAgICAgICAoKHUxNikweEZDRkYpICAvKiBVU0FSVCBDUjMgTWFzayAqLw0KDQoNCi8qIFByaXZhdGUgbWFjcm8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIHZhcmlhYmxlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSBmdW5jdGlvbiBwcm90b3R5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZnVuY3Rpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVVNBUlRfRGVJbml0DQoqIERlc2NyaXB0aW9uICAgIDogRGVpbml0aWFsaXplcyB0aGUgVVNBUlR4IHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyDQoqICAgICAgICAgICAgICAgICAgZGVmYXVsdCByZXNldCB2YWx1ZXMuDQoqIElucHV0ICAgICAgICAgIDogLSBVU0FSVHg6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIFVTQVJUDQoqICAgICAgICAgICAgICAgICAgICBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVU0FSVF9EZUluaXQoVVNBUlRfVHlwZURlZiogVVNBUlR4KQ0Kew0KICBzd2l0Y2ggKCoodTMyKikmVVNBUlR4KQ0KICB7DQogICAgY2FzZSBVU0FSVDFfQkFTRToNCiAgICAgIFJDQ19BUEIyUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjJQZXJpcGhfVVNBUlQxLCBFTkFCTEUpOw0KICAgICAgUkNDX0FQQjJQZXJpcGhSZXNldENtZChSQ0NfQVBCMlBlcmlwaF9VU0FSVDEsIERJU0FCTEUpOw0KICAgICAgYnJlYWs7DQoNCiAgICBjYXNlIFVTQVJUMl9CQVNFOg0KICAgICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9VU0FSVDIsIEVOQUJMRSk7DQogICAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1VTQVJUMiwgRElTQUJMRSk7DQogICAgICBicmVhazsNCg0KICAgIGNhc2UgVVNBUlQzX0JBU0U6DQogICAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1VTQVJUMywgRU5BQkxFKTsNCiAgICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVVNBUlQzLCBESVNBQkxFKTsNCiAgICAgIGJyZWFrOw0KDQogICAgZGVmYXVsdDoNCiAgICAgIGJyZWFrOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVVNBUlRfSW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IEluaXRpYWxpemVzIHRoZSBVU0FSVHggcGVyaXBoZXJhbCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZA0KKiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFVTQVJUX0luaXRTdHJ1Y3QgLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVVNBUlR4OiB3aGVyZSB4IGNhbiBiZSAxLCAyIG9yIDMgdG8gc2VsZWN0IHRoZSBVU0FSVCBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVVNBUlRfSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIFVTQVJUX0luaXRUeXBlRGVmIHN0cnVjdHVyZQ0KKiAgICAgICAgICAgICAgICAgICAgdGhhdCBjb250YWlucyB0aGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGhlDQoqICAgICAgICAgICAgICAgICAgICBzcGVjaWZpZWQgVVNBUlQgcGVyaXBoZXJhbC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVVNBUlRfSW5pdChVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIFVTQVJUX0luaXRUeXBlRGVmKiBVU0FSVF9Jbml0U3RydWN0KQ0Kew0KICB1MzIgdG1wcmVnID0gMHgwMCwgYXBiY2xvY2sgPSAweDAwOw0KICB1MzIgaW50ZWdlcmRpdmlkZXIgPSAweDAwOw0KICB1MzIgZnJhY3Rpb25hbGRpdmlkZXIgPSAweDAwOw0KICBSQ0NfQ2xvY2tzVHlwZURlZiBSQ0NfQ2xvY2tzU3RhdHVzOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19VU0FSVF9XT1JEX0xFTkdUSChVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9Xb3JkTGVuZ3RoKSk7DQogIGFzc2VydChJU19VU0FSVF9TVE9QQklUUyhVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9TdG9wQml0cykpOw0KICBhc3NlcnQoSVNfVVNBUlRfUEFSSVRZKFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX1Bhcml0eSkpOw0KICBhc3NlcnQoSVNfVVNBUlRfSEFSRFdBUkVfRkxPV19DT05UUk9MKFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX0hhcmR3YXJlRmxvd0NvbnRyb2wpKTsNCiAgYXNzZXJ0KElTX1VTQVJUX01PREUoVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfTW9kZSkpOw0KICBhc3NlcnQoSVNfVVNBUlRfQ0xPQ0soVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfQ2xvY2spKTsNCiAgYXNzZXJ0KElTX1VTQVJUX0NQT0woVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfQ1BPTCkpOw0KICBhc3NlcnQoSVNfVVNBUlRfQ1BIQShVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9DUEhBKSk7DQogIGFzc2VydChJU19VU0FSVF9MQVNUQklUKFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX0xhc3RCaXQpKTsgICAgICAgICAgICAgIA0KICANCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBDUjIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIHRtcHJlZyA9IFVTQVJUeC0+Q1IyOw0KICAvKiBDbGVhciBTVE9QWzEzOjEyXSwgQ0xLRU4sIENQT0wsIENQSEEgYW5kIExCQ0wgYml0cyAqLw0KICB0bXByZWcgJj0gQ1IyX0NMRUFSX01hc2s7DQoNCiAgLyogQ29uZmlndXJlIHRoZSBVU0FSVCBTdG9wIEJpdHMsIENsb2NrLCBDUE9MLCBDUEhBIGFuZCBMYXN0Qml0IC0tLS0tLS0tLS0tLSovDQogIC8qIFNldCBTVE9QWzEzOjEyXSBiaXRzIGFjY29yZGluZyB0byBVU0FSVF9Nb2RlIHZhbHVlICovDQogIC8qIFNldCBDUE9MIGJpdCBhY2NvcmRpbmcgdG8gVVNBUlRfQ1BPTCB2YWx1ZSAqLw0KICAvKiBTZXQgQ1BIQSBiaXQgYWNjb3JkaW5nIHRvIFVTQVJUX0NQSEEgdmFsdWUgKi8NCiAgLyogU2V0IExCQ0wgYml0IGFjY29yZGluZyB0byBVU0FSVF9MYXN0Qml0IHZhbHVlICovDQogIHRtcHJlZyB8PSAodTMyKVVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX1N0b3BCaXRzIHwgVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfQ2xvY2sgfA0KICAgICAgICAgICAgVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfQ1BPTCB8IFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX0NQSEEgfA0KICAgICAgICAgICAgVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfTGFzdEJpdDsNCg0KICAvKiBXcml0ZSB0byBVU0FSVCBDUjIgKi8NCiAgVVNBUlR4LT5DUjIgPSAodTE2KXRtcHJlZzsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIENSMSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgdG1wcmVnID0gMHgwMDsNCiAgdG1wcmVnID0gVVNBUlR4LT5DUjE7DQogIC8qIENsZWFyIE0sIFBDRSwgUFMsIFRFIGFuZCBSRSBiaXRzICovDQogIHRtcHJlZyAmPSBDUjFfQ0xFQVJfTWFzazsNCg0KICAvKiBDb25maWd1cmUgdGhlIFVTQVJUIFdvcmQgTGVuZ3RoLCBQYXJpdHkgYW5kIG1vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCiAgLyogU2V0IHRoZSBNIGJpdHMgYWNjb3JkaW5nIHRvIFVTQVJUX1dvcmRMZW5ndGggdmFsdWUgKi8NCiAgLyogU2V0IFBDRSBhbmQgUFMgYml0cyBhY2NvcmRpbmcgdG8gVVNBUlRfUGFyaXR5IHZhbHVlICovDQogIC8qIFNldCBURSBhbmQgUkUgYml0cyBhY2NvcmRpbmcgdG8gVVNBUlRfTW9kZSB2YWx1ZSAqLw0KICB0bXByZWcgfD0gKHUzMilVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9Xb3JkTGVuZ3RoIHwgVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfUGFyaXR5IHwNCiAgICAgICAgICAgIFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX01vZGU7DQoNCiAgLyogV3JpdGUgdG8gVVNBUlQgQ1IxICovDQogIFVTQVJUeC0+Q1IxID0gKHUxNil0bXByZWc7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBDUjMgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIHRtcHJlZyA9IDB4MDA7DQogIHRtcHJlZyA9IFVTQVJUeC0+Q1IzOw0KICAvKiBDbGVhciBDVFNFIGFuZCBSVFNFIGJpdHMgKi8NCiAgdG1wcmVnICY9IENSM19DTEVBUl9NYXNrOw0KDQogIC8qIENvbmZpZ3VyZSB0aGUgVVNBUlQgSEZDIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICAvKiBTZXQgQ1RTRSBhbmQgUlRTRSBiaXRzIGFjY29yZGluZyB0byBVU0FSVF9IYXJkd2FyZUZsb3dDb250cm9sIHZhbHVlICovDQogIHRtcHJlZyB8PSBVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9IYXJkd2FyZUZsb3dDb250cm9sOw0KDQogIC8qIFdyaXRlIHRvIFVTQVJUIENSMyAqLw0KICBVU0FSVHgtPkNSMyA9ICh1MTYpdG1wcmVnOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQlJSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICB0bXByZWcgPSAweDAwOw0KDQogIC8qIENvbmZpZ3VyZSB0aGUgVVNBUlQgQmF1ZCBSYXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBSQ0NfR2V0Q2xvY2tzRnJlcSgmUkNDX0Nsb2Nrc1N0YXR1cyk7DQogIGlmICgoKih1MzIqKSZVU0FSVHgpID09IFVTQVJUMV9CQVNFKQ0KICB7DQogICAgYXBiY2xvY2sgPSBSQ0NfQ2xvY2tzU3RhdHVzLlBDTEsyX0ZyZXF1ZW5jeTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBhcGJjbG9jayA9IFJDQ19DbG9ja3NTdGF0dXMuUENMSzFfRnJlcXVlbmN5Ow0KICB9DQoNCiAgLyogRGV0ZXJtaW5lIHRoZSBpbnRlZ2VyIHBhcnQgKi8NCiAgaW50ZWdlcmRpdmlkZXIgPSAoKDB4MTkgKiBhcGJjbG9jaykgLyAoMHgwNCAqIChVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9CYXVkUmF0ZSkpKTsNCiAgdG1wcmVnID0gKGludGVnZXJkaXZpZGVyIC8gMHg2NCkgPDwgMHgwNDsNCg0KICAvKiBEZXRlcm1pbmUgdGhlIGZyYWN0aW9uYWwgcGFydCAqLw0KICBmcmFjdGlvbmFsZGl2aWRlciA9IGludGVnZXJkaXZpZGVyIC0gKDB4NjQgKiAodG1wcmVnID4+IDB4MDQpKTsNCiAgdG1wcmVnIHw9ICgoKChmcmFjdGlvbmFsZGl2aWRlciAqIDB4MTApICsgMHgzMikgLyAweDY0KSkgJiAoKHU4KTB4MEYpOw0KDQogIC8qIFdyaXRlIHRvIFVTQVJUIEJSUiAqLw0KICBVU0FSVHgtPkJSUiA9ICh1MTYpdG1wcmVnOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVTQVJUX1N0cnVjdEluaXQNCiogRGVzY3JpcHRpb24gICAgOiBGaWxscyBlYWNoIFVTQVJUX0luaXRTdHJ1Y3QgbWVtYmVyIHdpdGggaXRzIGRlZmF1bHQgdmFsdWUuDQoqIElucHV0ICAgICAgICAgIDogLSBVU0FSVF9Jbml0U3RydWN0OiBwb2ludGVyIHRvIGEgVVNBUlRfSW5pdFR5cGVEZWYgc3RydWN0dXJlDQoqICAgICAgICAgICAgICAgICAgICB3aGljaCB3aWxsIGJlIGluaXRpYWxpemVkLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVU0FSVF9TdHJ1Y3RJbml0KFVTQVJUX0luaXRUeXBlRGVmKiBVU0FSVF9Jbml0U3RydWN0KQ0Kew0KICAvKiBVU0FSVF9Jbml0U3RydWN0IG1lbWJlcnMgZGVmYXVsdCB2YWx1ZSAqLw0KICBVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9CYXVkUmF0ZSA9IDB4MjU4MDsgLyogOTYwMCBCYXVkICovDQogIFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX1dvcmRMZW5ndGggPSBVU0FSVF9Xb3JkTGVuZ3RoXzhiOw0KICBVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9TdG9wQml0cyA9IFVTQVJUX1N0b3BCaXRzXzE7DQogIFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX1Bhcml0eSA9IFVTQVJUX1Bhcml0eV9ObyA7DQogIFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX0hhcmR3YXJlRmxvd0NvbnRyb2wgPSBVU0FSVF9IYXJkd2FyZUZsb3dDb250cm9sX05vbmU7DQogIFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX01vZGUgPSBVU0FSVF9Nb2RlX1J4IHwgVVNBUlRfTW9kZV9UeDsNCiAgVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfQ2xvY2sgPSBVU0FSVF9DbG9ja19EaXNhYmxlOw0KICBVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9DUE9MID0gVVNBUlRfQ1BPTF9Mb3c7DQogIFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX0NQSEEgPSBVU0FSVF9DUEhBXzFFZGdlOw0KICBVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9MYXN0Qml0ID0gVVNBUlRfTGFzdEJpdF9EaXNhYmxlOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVTQVJUX0NtZA0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBVU0FSVCBwZXJpcGhlcmFsLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVVNBUlR4OiB3aGVyZSB4IGNhbiBiZSAxLCAyIG9yIDMgdG8gc2VsZWN0IHRoZSBVU0FSVA0KKiAgICAgICAgICAgICAgICAgICAgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgOiAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFVTQVJUeCBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVVNBUlRfQ21kKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICANCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIFVTQVJUIGJ5IHNldHRpbmcgdGhlIFJVTiBiaXQgaW4gdGhlIENSMSByZWdpc3RlciAqLw0KICAgIFVTQVJUeC0+Q1IxIHw9IENSMV9SVU5fU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIFVTQVJUIGJ5IGNsZWFyaW5nIHRoZSBSVU4gYml0IGluIHRoZSBDUjEgcmVnaXN0ZXIgKi8NCiAgICBVU0FSVHgtPkNSMSAmPSBDUjFfUlVOX1Jlc2V0Ow0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVVNBUlRfSVRDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgVVNBUlQgaW50ZXJydXB0cy4NCiogSW5wdXQgICAgICAgICAgOiAtIFVTQVJUeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgVVNBUlQNCiogICAgICAgICAgICAgICAgICAgIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBVU0FSVF9JVDogc3BlY2lmaWVzIHRoZSBVU0FSVCBpbnRlcnJ1cHQgc291cmNlcyB0byBiZQ0KKiAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCBvciBkaXNhYmxlZC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0lUX1BFDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0lUX1RYRQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9JVF9UQw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9JVF9SWE5FDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0lUX0lETEUNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfSVRfTEJEDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0lUX0NUUw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9JVF9FUlINCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIHNwZWNpZmllZCBVU0FSVHggaW50ZXJydXB0cy4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFVTQVJUX0lUQ29uZmlnKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdTE2IFVTQVJUX0lULCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIHUzMiB1c2FydHJlZyA9IDB4MDAsIGl0cG9zID0gMHgwMCwgaXRtYXNrID0gMHgwMDsNCiAgdTMyIGFkZHJlc3MgPSAweDAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19VU0FSVF9DT05GSUdfSVQoVVNBUlRfSVQpKTsgIA0KICBhc3NlcnQoSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICANCiAgLyogR2V0IHRoZSBVU0FSVCByZWdpc3RlciBpbmRleCAqLw0KICB1c2FydHJlZyA9ICgoKHU4KVVTQVJUX0lUKSA+PiAweDA1KTsNCg0KICAvKiBHZXQgdGhlIGludGVycnVwdCBwb3NpdGlvbiAqLw0KICBpdHBvcyA9IFVTQVJUX0lUICYgVVNBUlRfSVRfTWFzazsNCg0KICBpdG1hc2sgPSAoKCh1MzIpMHgwMSkgPDwgaXRwb3MpOw0KICBhZGRyZXNzID0gKih1MzIqKSYoVVNBUlR4KTsNCg0KICBpZiAodXNhcnRyZWcgPT0gMHgwMSkgLyogVGhlIElUICBpcyBpbiBDUjEgcmVnaXN0ZXIgKi8NCiAgew0KICAgIGFkZHJlc3MgKz0gMHgwQzsNCiAgfQ0KICBlbHNlIGlmICh1c2FydHJlZyA9PSAweDAyKSAvKiBUaGUgSVQgIGlzIGluIENSMiByZWdpc3RlciAqLw0KICB7DQogICAgYWRkcmVzcyArPSAweDEwOw0KICB9DQogIGVsc2UgLyogVGhlIElUICBpcyBpbiBDUjMgcmVnaXN0ZXIgKi8NCiAgew0KICAgIGFkZHJlc3MgKz0gMHgxNDsgDQogIH0NCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAqKHUzMiopYWRkcmVzcyAgfD0gaXRtYXNrOw0KICB9DQogIGVsc2UNCiAgew0KICAgICoodTMyKilhZGRyZXNzICY9IH5pdG1hc2s7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBVU0FSVF9ETUFDbWQNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBVU0FSVJJzIERNQSBpbnRlcmZhY2UuDQoqIElucHV0ICAgICAgICAgIDogLSBVU0FSVHg6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIFVTQVJUDQoqICAgICAgICAgICAgICAgICAgICBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVVNBUlRfRE1BUmVxOiBzcGVjaWZpZXMgdGhlIERNQSByZXF1ZXN0Lg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfRE1BUmVxX1R4DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0RNQVJlcV9SeA0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgRE1BIFJlcXVlc3Qgc291cmNlcy4NCiogICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVVNBUlRfRE1BQ21kKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdTE2IFVTQVJUX0RNQVJlcSwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVVNBUlRfRE1BUkVRKFVTQVJUX0RNQVJlcSkpOyAgDQogIGFzc2VydChJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7IA0KICANCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIERNQSB0cmFuc2ZlciBmb3Igc2VsZWN0ZWQgcmVxdWVzdHMgYnkgc2V0dGluZyB0aGUgRE1BVCBhbmQvb3INCiAgICBETUFSIGJpdHMgaW4gdGhlIFVTQVJUIENSMyByZWdpc3RlciAqLw0KICAgIFVTQVJUeC0+Q1IzIHw9IFVTQVJUX0RNQVJlcTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHNlbGVjdGVkIHJlcXVlc3RzIGJ5IGNsZWFyaW5nIHRoZSBETUFUIGFuZC9vcg0KICAgIERNQVIgYml0cyBpbiB0aGUgVVNBUlQgQ1IzIHJlZ2lzdGVyICovDQogICAgVVNBUlR4LT5DUjMgJj0gKHUxNil+VVNBUlRfRE1BUmVxOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVVNBUlRfU2V0QWRkcmVzcw0KKiBEZXNjcmlwdGlvbiAgICA6IFNldHMgdGhlIGFkZHJlc3Mgb2YgdGhlIFVTQVJUIG5vZGUuDQoqIElucHV0ICAgICAgICAgIDogLSBVU0FSVHg6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIFVTQVJUDQoqICAgICAgICAgICAgICAgICAgICBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVVNBUlRfQWRkcmVzczogSW5kaWNhdGVzIHRoZSBhZGRyZXNzIG9mIHRoZSBVU0FSVCBub2RlLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVU0FSVF9TZXRBZGRyZXNzKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdTggVVNBUlRfQWRkcmVzcykNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1VTQVJUX0FERFJFU1MoVVNBUlRfQWRkcmVzcykpOyANCiAgICANCiAgLyogQ2xlYXIgdGhlIFVTQVJUIGFkZHJlc3MgKi8NCiAgVVNBUlR4LT5DUjIgJj0gQ1IyX0FkZHJlc3NfTWFzazsNCiAgLyogU2V0IHRoZSBVU0FSVCBhZGRyZXNzIG5vZGUgKi8NCiAgVVNBUlR4LT5DUjIgfD0gVVNBUlRfQWRkcmVzczsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBVU0FSVF9XYWtlVXBDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBTZWxlY3RzIHRoZSBVU0FSVCBXYWtlVXAgbWV0aG9kLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVVNBUlR4OiB3aGVyZSB4IGNhbiBiZSAxLCAyIG9yIDMgdG8gc2VsZWN0IHRoZSBVU0FSVA0KKiAgICAgICAgICAgICAgICAgICAgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFVTQVJUX1dha2VVcDogc3BlY2lmaWVzIHRoZSBVU0FSVCB3YWtldXAgbWV0aG9kLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX1dha2VVcF9JZGxlTGluZQ0KKiAgICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfV2FrZVVwX0FkZHJlc3NNYXJrDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFVTQVJUX1dha2VVcENvbmZpZyhVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIHUxNiBVU0FSVF9XYWtlVXApDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19VU0FSVF9XQUtFVVAoVVNBUlRfV2FrZVVwKSk7DQogIA0KICBVU0FSVHgtPkNSMSAmPSBDUjNfV0FLRV9NYXNrOw0KICBVU0FSVHgtPkNSMSB8PSBVU0FSVF9XYWtlVXA7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVVNBUlRfUmVjZWl2ZXJXYWtlVXBDbWQNCiogRGVzY3JpcHRpb24gICAgOiBEZXRlcm1pbmVzIGlmIHRoZSBVU0FSVCBpcyBpbiBtdXRlIG1vZGUgb3Igbm90Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gVVNBUlR4OiB3aGVyZSB4IGNhbiBiZSAxLCAyIG9yIDMgdG8gc2VsZWN0IHRoZSBVU0FSVA0KKiAgICAgICAgICAgICAgICAgICAgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFVTQVJUIG1vZGUuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVU0FSVF9SZWNlaXZlcldha2VVcENtZChVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsgDQogIA0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgbXV0ZSBtb2RlIFVTQVJUIGJ5IHNldHRpbmcgdGhlIFJXVSBiaXQgaW4gdGhlIENSMSByZWdpc3RlciAqLw0KICAgIFVTQVJUeC0+Q1IxIHw9IENSMV9SV1VfU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIG11dGUgbW9kZSBVU0FSVCBieSBjbGVhcmluZyB0aGUgUldVIGJpdCBpbiB0aGUgQ1IxIHJlZ2lzdGVyICovDQogICAgVVNBUlR4LT5DUjEgJj0gQ1IxX1JXVV9SZXNldDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVTQVJUX0xJTkJyZWFrRGV0ZWN0TGVuZ3RoQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogU2V0cyB0aGUgVVNBUlQgTElOIEJyZWFrIGRldGVjdGlvbiBsZW5ndGguDQoqIElucHV0ICAgICAgICAgIDogLSBVU0FSVHg6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIFVTQVJUDQoqICAgICAgICAgICAgICAgICAgICBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVVNBUlRfTElOQnJlYWtEZXRlY3RMZW5ndGg6IHNwZWNpZmllcyB0aGUgTElOIGJyZWFrDQoqICAgICAgICAgICAgICAgICAgICBkZXRlY3Rpb24gbGVuZ3RoLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfTElOQnJlYWtEZXRlY3RMZW5ndGhfMTBiDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0xJTkJyZWFrRGV0ZWN0TGVuZ3RoXzExYg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVU0FSVF9MSU5CcmVha0RldGVjdExlbmd0aENvbmZpZyhVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIHUxNiBVU0FSVF9MSU5CcmVha0RldGVjdExlbmd0aCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1VTQVJUX0xJTl9CUkVBS19ERVRFQ1RfTEVOR1RIKFVTQVJUX0xJTkJyZWFrRGV0ZWN0TGVuZ3RoKSk7DQogIA0KICBVU0FSVHgtPkNSMiAmPSBDUjNfTEJETF9NYXNrOw0KICBVU0FSVHgtPkNSMiB8PSBVU0FSVF9MSU5CcmVha0RldGVjdExlbmd0aDsgIA0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVTQVJUX0xJTkNtZA0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFVTQVJUknMgTElOIG1vZGUuDQoqIElucHV0ICAgICAgICAgIDogLSBVU0FSVHg6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIFVTQVJUDQoqICAgICAgICAgICAgICAgICAgICBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgVVNBUlQgTElOIG1vZGUuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVU0FSVF9MSU5DbWQoVVNBUlRfVHlwZURlZiogVVNBUlR4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIA0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgTElOIG1vZGUgYnkgc2V0dGluZyB0aGUgTElORSBiaXQgaW4gdGhlIENSMiByZWdpc3RlciAqLw0KICAgIFVTQVJUeC0+Q1IyIHw9IENSMl9MSU5FX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBMSU4gbW9kZSBieSBjbGVhcmluZyB0aGUgTElORSBiaXQgaW4gdGhlIENSMiByZWdpc3RlciAqLw0KICAgIFVTQVJUeC0+Q1IyICY9IENSMl9MSU5FX1Jlc2V0Ow0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVVNBUlRfU2VuZERhdGENCiogRGVzY3JpcHRpb24gICAgOiBUcmFuc21pdHMgc2lnbmxlIGRhdGEgdGhyb3VnaCB0aGUgVVNBUlR4IHBlcmlwaGVyYWwuDQoqIElucHV0ICAgICAgICAgIDogLSBVU0FSVHg6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIFVTQVJUDQoqICAgICAgICAgICAgICAgICAgICBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gRGF0YTogdGhlIGRhdGEgdG8gdHJhbnNtaXQuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFVTQVJUX1NlbmREYXRhKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdTE2IERhdGEpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19VU0FSVF9EQVRBKERhdGEpKTsgDQogICAgDQogIC8qIFRyYW5zbWl0IERhdGEgKi8NCiAgVVNBUlR4LT5EUiA9IChEYXRhICYgKHUxNikweDAxRkYpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVTQVJUX1JlY2VpdmVEYXRhDQoqIERlc2NyaXB0aW9uICAgIDogUmV0dXJucyB0aGUgbW9zdCByZWNlbnQgcmVjZWl2ZWQgZGF0YSBieSB0aGUgVVNBUlR4IHBlcmlwaGVyYWwuDQoqIElucHV0ICAgICAgICAgIDogLSBVU0FSVHg6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIFVTQVJUDQoqICAgICAgICAgICAgICAgICAgICBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBUaGUgcmVjZWl2ZWQgZGF0YS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1MTYgVVNBUlRfUmVjZWl2ZURhdGEoVVNBUlRfVHlwZURlZiogVVNBUlR4KQ0Kew0KICAvKiBSZWNlaXZlIERhdGEgKi8NCiAgcmV0dXJuICh1MTYpKFVTQVJUeC0+RFIgJiAodTE2KTB4MDFGRik7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVVNBUlRfU2VuZEJyZWFrDQoqIERlc2NyaXB0aW9uICAgIDogVHJhbnNtaXRzIGJyZWFrIGNoYXJhY3RlcnMuDQoqIElucHV0ICAgICAgICAgIDogLSBVU0FSVHg6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIFVTQVJUDQoqICAgICAgICAgICAgICAgICAgICBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVU0FSVF9TZW5kQnJlYWsoVVNBUlRfVHlwZURlZiogVVNBUlR4KQ0Kew0KICAvKiBTZW5kIGJyZWFrIGNoYXJhY3RlcnMgKi8NCiAgVVNBUlR4LT5DUjEgfD0gQ1IxX1NCS19TZXQ7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVVNBUlRfU2V0R3VhcmRUaW1lDQoqIERlc2NyaXB0aW9uICAgIDogU2V0cyB0aGUgc3BlY2lmaWVkIFVTQVJUIGd1YXJkIHRpbWUuDQoqIElucHV0ICAgICAgICAgIDogLSBVU0FSVHg6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIFVTQVJUDQoqICAgICAgICAgICAgICAgICAgICBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVVNBUlRfR3VhcmRUaW1lOiBzcGVjaWZpZXMgdGhlIGd1YXJkIHRpbWUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFVTQVJUX1NldEd1YXJkVGltZShVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIHU4IFVTQVJUX0d1YXJkVGltZSkNCnsgICAgDQogIC8qIENsZWFyIHRoZSBVU0FSVCBHdWFyZCB0aW1lICovDQogIFVTQVJUeC0+R1RQUiAmPSBHVFBSX0xTQl9NYXNrOw0KICAvKiBTZXQgdGhlIFVTQVJUIGd1YXJkIHRpbWUgKi8NCiAgVVNBUlR4LT5HVFBSIHw9ICh1MTYpKCh1MTYpVVNBUlRfR3VhcmRUaW1lIDw8IDB4MDgpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVTQVJUX1NldFByZXNjYWxlcg0KKiBEZXNjcmlwdGlvbiAgICA6IFNldHMgdGhlIHN5c3RlbSBjbG9jayBwcmVzY2FsZXIuDQoqIElucHV0ICAgICAgICAgIDogLSBVU0FSVHg6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIFVTQVJUDQoqICAgICAgICAgICAgICAgICAgICBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVVNBUlRfUHJlc2NhbGVyOiBzcGVjaWZpZXMgdGhlIHByZXNjYWxlciBjbG9jay4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVVNBUlRfU2V0UHJlc2NhbGVyKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdTggVVNBUlRfUHJlc2NhbGVyKQ0KeyANCiAgLyogQ2xlYXIgdGhlIFVTQVJUIHByZXNjYWxlciAqLw0KICBVU0FSVHgtPkdUUFIgJj0gR1RQUl9NU0JfTWFzazsNCiAgLyogU2V0IHRoZSBVU0FSVCBwcmVzY2FsZXIgKi8NCiAgVVNBUlR4LT5HVFBSIHw9IFVTQVJUX1ByZXNjYWxlcjsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBVU0FSVF9TbWFydENhcmRDbWQNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBVU0FSVJJzIFNtYXJ0IENhcmQgbW9kZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFVTQVJUeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgVVNBUlQNCiogICAgICAgICAgICAgICAgICAgIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBTbWFydCBDYXJkIG1vZGUuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVU0FSVF9TbWFydENhcmRDbWQoVVNBUlRfVHlwZURlZiogVVNBUlR4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogICAgDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBTQyBtb2RlIGJ5IHNldHRpbmcgdGhlIFNDRU4gYml0IGluIHRoZSBDUjMgcmVnaXN0ZXIgKi8NCiAgICBVU0FSVHgtPkNSMyB8PSBDUjNfU0NFTl9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgU0MgbW9kZSBieSBjbGVhcmluZyB0aGUgU0NFTiBiaXQgaW4gdGhlIENSMyByZWdpc3RlciAqLw0KICAgIFVTQVJUeC0+Q1IzICY9IENSM19TQ0VOX1Jlc2V0Ow0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVVNBUlRfU21hcnRDYXJkTkFDS0NtZA0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgTkFDSyB0cmFuc21pc3Npb24uDQoqIElucHV0ICAgICAgICAgIDogLSBVU0FSVHg6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIFVTQVJUDQoqICAgICAgICAgICAgICAgICAgICBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgTkFDSyB0cmFuc21pc3Npb24uDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVU0FSVF9TbWFydENhcmROQUNLQ21kKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICAgDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBOQUNLIHRyYW5zbWlzc2lvbiBieSBzZXR0aW5nIHRoZSBOQUNLIGJpdCBpbiB0aGUgQ1IzIHJlZ2lzdGVyICovDQogICAgVVNBUlR4LT5DUjMgfD0gQ1IzX05BQ0tfU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIE5BQ0sgdHJhbnNtaXNzaW9uIGJ5IGNsZWFyaW5nIHRoZSBOQUNLIGJpdCBpbiB0aGUgQ1IzIHJlZ2lzdGVyICovDQogICAgVVNBUlR4LT5DUjMgJj0gQ1IzX05BQ0tfUmVzZXQ7DQogIH0NCg0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVTQVJUX0hhbGZEdXBsZXhDbWQNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBVU0FSVJJzIEhhbGYgRHVwbGV4IGNvbW11bmljYXRpb24uDQoqIElucHV0ICAgICAgICAgIDogLSBVU0FSVHg6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIFVTQVJUDQoqICAgICAgICAgICAgICAgICAgICBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgVVNBUlQgQ29tbXVuaWNhdGlvbi4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFVTQVJUX0hhbGZEdXBsZXhDbWQoVVNBUlRfVHlwZURlZiogVVNBUlR4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIA0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgSGFsZi1EdXBsZXggbW9kZSBieSBzZXR0aW5nIHRoZSBIRFNFTCBiaXQgaW4gdGhlIENSMyByZWdpc3RlciAqLw0KICAgIFVTQVJUeC0+Q1IzIHw9IENSM19IRFNFTF9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgSGFsZi1EdXBsZXggbW9kZSBieSBjbGVhcmluZyB0aGUgSERTRUwgYml0IGluIHRoZSBDUjMgcmVnaXN0ZXIgKi8NCiAgICBVU0FSVHgtPkNSMyAmPSBDUjNfSERTRUxfUmVzZXQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBVU0FSVF9JckRBQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlcyB0aGUgVVNBUlSScyBJckRBIGludGVyZmFjZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFVTQVJUeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgVVNBUlQNCiogICAgICAgICAgICAgICAgICAgIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBVU0FSVF9JckRBTW9kZTogc3BlY2lmaWVzIHRoZSBJckRBIG1vZGUuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9JckRBTW9kZV9Mb3dQb3dlcg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9JckRBTW9kZV9Ob3JtYWwNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVVNBUlRfSXJEQUNvbmZpZyhVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIHUxNiBVU0FSVF9JckRBTW9kZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1VTQVJUX0lSREFfTU9ERShVU0FSVF9JckRBTW9kZSkpOw0KICAgIA0KICBVU0FSVHgtPkNSMyAmPSBDUjNfSVJMUF9NYXNrOw0KICBVU0FSVHgtPkNSMyB8PSBVU0FSVF9JckRBTW9kZTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBVU0FSVF9JckRBQ21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVVNBUlSScyBJckRBIGludGVyZmFjZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFVTQVJUeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgVVNBUlQNCiogICAgICAgICAgICAgICAgICAgIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBJckRBIG1vZGUuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVU0FSVF9JckRBQ21kKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICAgIA0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgSXJEQSBtb2RlIGJ5IHNldHRpbmcgdGhlIElSRU4gYml0IGluIHRoZSBDUjMgcmVnaXN0ZXIgKi8NCiAgICBVU0FSVHgtPkNSMyB8PSBDUjNfSVJFTl9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgSXJEQSBtb2RlIGJ5IGNsZWFyaW5nIHRoZSBJUkVOIGJpdCBpbiB0aGUgQ1IzIHJlZ2lzdGVyICovDQogICAgVVNBUlR4LT5DUjMgJj0gQ1IzX0lSRU5fUmVzZXQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBVU0FSVF9HZXRGbGFnU3RhdHVzDQoqIERlc2NyaXB0aW9uICAgIDogQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVU0FSVCBmbGFnIGlzIHNldCBvciBub3QuDQoqIElucHV0ICAgICAgICAgIDogLSBVU0FSVHg6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIFVTQVJUDQoqICAgICAgICAgICAgICAgICAgICBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVVNBUlRfRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfRkxBR19DVFMNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfRkxBR19MQkQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfRkxBR19UWEUNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfRkxBR19UQw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9GTEFHX1JYTkUNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfRkxBR19JRExFDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0ZMQUdfT1JFDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0ZMQUdfTkUNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfRkxBR19GRQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9GTEFHX1BFDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBuZXcgc3RhdGUgb2YgVVNBUlRfRkxBRyAoU0VUIG9yIFJFU0VUKS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpGbGFnU3RhdHVzIFVTQVJUX0dldEZsYWdTdGF0dXMoVVNBUlRfVHlwZURlZiogVVNBUlR4LCB1MTYgVVNBUlRfRkxBRykNCnsNCiAgRmxhZ1N0YXR1cyBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydChJU19VU0FSVF9GTEFHKFVTQVJUX0ZMQUcpKTsNCiAgDQogIGlmICgoVVNBUlR4LT5TUiAmIFVTQVJUX0ZMQUcpICE9ICh1MTYpUkVTRVQpDQogIHsNCiAgICBiaXRzdGF0dXMgPSBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgYml0c3RhdHVzID0gUkVTRVQ7DQogIH0NCiAgcmV0dXJuIGJpdHN0YXR1czsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBVU0FSVF9DbGVhckZsYWcNCiogRGVzY3JpcHRpb24gICAgOiBDbGVhcnMgdGhlIFVTQVJUeCdzIHBlbmRpbmcgZmxhZ3MuDQoqIElucHV0ICAgICAgICAgIDogLSBVU0FSVHg6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIFVTQVJUDQoqICAgICAgICAgICAgICAgICAgICBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVVNBUlRfRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNsZWFyLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfRkxBR19DVFMNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfRkxBR19MQkQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfRkxBR19UWEUNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfRkxBR19UQw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9GTEFHX1JYTkUNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfRkxBR19JRExFDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0ZMQUdfT1JFDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0ZMQUdfTkUNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfRkxBR19GRQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9GTEFHX1BFDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFVTQVJUX0NsZWFyRmxhZyhVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIHUxNiBVU0FSVF9GTEFHKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVVNBUlRfQ0xFQVJfRkxBRyhVU0FSVF9GTEFHKSk7DQogICANCiAgVVNBUlR4LT5TUiAmPSAodTE2KX5VU0FSVF9GTEFHOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVTQVJUX0dldElUU3RhdHVzDQoqIERlc2NyaXB0aW9uICAgIDogQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVU0FSVCBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4NCiogSW5wdXQgICAgICAgICAgOiAtIFVTQVJUeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgVVNBUlQNCiogICAgICAgICAgICAgICAgICAgIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBVU0FSVF9JVDogc3BlY2lmaWVzIHRoZSBVU0FSVCBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfSVRfUEUNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfSVRfVFhFDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0lUX1RDDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0lUX1JYTkUNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfSVRfSURMRQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9JVF9MQkQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfSVRfQ1RTDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0lUX09SRQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9JVF9ORQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9JVF9GRQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBUaGUgbmV3IHN0YXRlIG9mIFVTQVJUX0lUIChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCklUU3RhdHVzIFVTQVJUX0dldElUU3RhdHVzKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdTE2IFVTQVJUX0lUKQ0Kew0KICB1MzIgYml0cG9zID0gMHgwMCwgaXRtYXNrID0gMHgwMCwgdXNhcnRyZWcgPSAwOw0KICBJVFN0YXR1cyBiaXRzdGF0dXMgPSBSRVNFVDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnQoSVNfVVNBUlRfSVQoVVNBUlRfSVQpKTsNCiAgDQogIC8qIEdldCB0aGUgVVNBUlQgcmVnaXN0ZXIgaW5kZXggKi8NCiAgdXNhcnRyZWcgPSAoKCh1OClVU0FSVF9JVCkgPj4gMHgwNSk7DQoNCiAgLyogR2V0IHRoZSBpbnRlcnJ1cHQgcG9zaXRpb24gKi8NCiAgaXRtYXNrID0gVVNBUlRfSVQgJiBVU0FSVF9JVF9NYXNrOw0KDQogIGl0bWFzayA9ICh1MzIpMHgwMSA8PCBpdG1hc2s7DQogIA0KICBpZiAodXNhcnRyZWcgPT0gMHgwMSkgLyogVGhlIElUICBpcyBpbiBDUjEgcmVnaXN0ZXIgKi8NCiAgew0KICAgIGl0bWFzayAmPSBVU0FSVHgtPkNSMTsNCiAgfQ0KICBlbHNlIGlmICh1c2FydHJlZyA9PSAweDAyKSAvKiBUaGUgSVQgIGlzIGluIENSMiByZWdpc3RlciAqLw0KICB7DQogICAgaXRtYXNrICY9IFVTQVJUeC0+Q1IyOw0KICB9DQogIGVsc2UgLyogVGhlIElUICBpcyBpbiBDUjMgcmVnaXN0ZXIgKi8NCiAgew0KICAgIGl0bWFzayAmPSBVU0FSVHgtPkNSMzsNCiAgfQ0KICANCiAgYml0cG9zID0gVVNBUlRfSVQgPj4gMHgwODsNCg0KICBiaXRwb3MgPSAodTMyKTB4MDEgPDwgYml0cG9zOw0KICBiaXRwb3MgJj0gVVNBUlR4LT5TUjsNCg0KICBpZiAoKGl0bWFzayAhPSAodTE2KVJFU0VUKSYmKGJpdHBvcyAhPSAodTE2KVJFU0VUKSkNCiAgew0KICAgIGJpdHN0YXR1cyA9IFNFVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgfQ0KICByZXR1cm4gYml0c3RhdHVzOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVTQVJUX0NsZWFySVRQZW5kaW5nQml0DQoqIERlc2NyaXB0aW9uICAgIDogQ2xlYXJzIHRoZSBVU0FSVHiScyBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVVNBUlR4OiB3aGVyZSB4IGNhbiBiZSAxLCAyIG9yIDMgdG8gc2VsZWN0IHRoZSBVU0FSVA0KKiAgICAgICAgICAgICAgICAgICAgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFVTQVJUX0lUOiBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBwZW5kaW5nIGJpdCB0byBjbGVhci4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0lUX1BFDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0lUX1RYRQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9JVF9UQw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9JVF9SWE5FDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0lUX0lETEUNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfSVRfTEJEDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVTQVJUX0lUX0NUUw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVU0FSVF9JVF9PUkUNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfSVRfTkUNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVVNBUlRfSVRfRkUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVVNBUlRfQ2xlYXJJVFBlbmRpbmdCaXQoVVNBUlRfVHlwZURlZiogVVNBUlR4LCB1MTYgVVNBUlRfSVQpDQp7DQogIHUzMiBiaXRwb3MgPSAweDAwLCBpdG1hc2sgPSAweDAwOw0KICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0KElTX1VTQVJUX0lUKFVTQVJUX0lUKSk7DQogIA0KICBiaXRwb3MgPSBVU0FSVF9JVCA+PiAweDA4Ow0KDQogIGl0bWFzayA9ICh1MzIpMHgwMSA8PCBiaXRwb3M7DQogIFVTQVJUeC0+U1IgJj0gfml0bWFzazsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCAyMDA3IFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8NCg==