LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMyZjEweF91c2FydC5jDQogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCiAgKiBAdmVyc2lvbiBWMy40LjANCiAgKiBAZGF0ZSAgICAxMC8xNS8yMDEwDQogICogQGJyaWVmICAgVGhpcyBmaWxlIHByb3ZpZGVzIGFsbCB0aGUgVVNBUlQgZmlybXdhcmUgZnVuY3Rpb25zLg0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgKiBAY29weQ0KICAqDQogICogVEhFIFBSRVNFTlQgRklSTVdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQogICogV0lUSCBDT0RJTkcgSU5GT1JNQVRJT04gUkVHQVJESU5HIFRIRUlSIFBST0RVQ1RTIElOIE9SREVSIEZPUiBUSEVNIFRPIFNBVkUNCiAgKiBUSU1FLiBBUyBBIFJFU1VMVCwgU1RNSUNST0VMRUNUUk9OSUNTIFNIQUxMIE5PVCBCRSBIRUxEIExJQUJMRSBGT1IgQU5ZDQogICogRElSRUNULCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORw0KICAqIEZST00gVEhFIENPTlRFTlQgT0YgU1VDSCBGSVJNV0FSRSBBTkQvT1IgVEhFIFVTRSBNQURFIEJZIENVU1RPTUVSUyBPRiBUSEUNCiAgKiBDT0RJTkcgSU5GT1JNQVRJT04gQ09OVEFJTkVEIEhFUkVJTiBJTiBDT05ORUNUSU9OIFdJVEggVEhFSVIgUFJPRFVDVFMuDQogICoNCiAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4NCiAgKi8gDQoNCi8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQojaW5jbHVkZSAic3RtMzJmMTB4X3VzYXJ0LmgiDQojaW5jbHVkZSAic3RtMzJmMTB4X3JjYy5oIg0KDQovKiogQGFkZHRvZ3JvdXAgU1RNMzJGMTB4X1N0ZFBlcmlwaF9Ecml2ZXINCiAgKiBAew0KICAqLw0KDQovKiogQGRlZmdyb3VwIFVTQVJUIA0KICAqIEBicmllZiBVU0FSVCBkcml2ZXIgbW9kdWxlcw0KICAqIEB7DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgVVNBUlRfUHJpdmF0ZV9UeXBlc0RlZmluaXRpb25zDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBVU0FSVF9Qcml2YXRlX0RlZmluZXMNCiAgKiBAew0KICAqLw0KDQojZGVmaW5lIENSMV9VRV9TZXQgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDIwMDApICAvKiE8IFVTQVJUIEVuYWJsZSBNYXNrICovDQojZGVmaW5lIENSMV9VRV9SZXNldCAgICAgICAgICAgICAgKCh1aW50MTZfdCkweERGRkYpICAvKiE8IFVTQVJUIERpc2FibGUgTWFzayAqLw0KDQojZGVmaW5lIENSMV9XQUtFX01hc2sgICAgICAgICAgICAgKCh1aW50MTZfdCkweEY3RkYpICAvKiE8IFVTQVJUIFdha2VVcCBNZXRob2QgTWFzayAqLw0KDQojZGVmaW5lIENSMV9SV1VfU2V0ICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDIpICAvKiE8IFVTQVJUIG11dGUgbW9kZSBFbmFibGUgTWFzayAqLw0KI2RlZmluZSBDUjFfUldVX1Jlc2V0ICAgICAgICAgICAgICgodWludDE2X3QpMHhGRkZEKSAgLyohPCBVU0FSVCBtdXRlIG1vZGUgRW5hYmxlIE1hc2sgKi8NCiNkZWZpbmUgQ1IxX1NCS19TZXQgICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDAwMSkgIC8qITwgVVNBUlQgQnJlYWsgQ2hhcmFjdGVyIHNlbmQgTWFzayAqLw0KI2RlZmluZSBDUjFfQ0xFQVJfTWFzayAgICAgICAgICAgICgodWludDE2X3QpMHhFOUYzKSAgLyohPCBVU0FSVCBDUjEgTWFzayAqLw0KI2RlZmluZSBDUjJfQWRkcmVzc19NYXNrICAgICAgICAgICgodWludDE2X3QpMHhGRkYwKSAgLyohPCBVU0FSVCBhZGRyZXNzIE1hc2sgKi8NCg0KI2RlZmluZSBDUjJfTElORU5fU2V0ICAgICAgICAgICAgICAoKHVpbnQxNl90KTB4NDAwMCkgIC8qITwgVVNBUlQgTElOIEVuYWJsZSBNYXNrICovDQojZGVmaW5lIENSMl9MSU5FTl9SZXNldCAgICAgICAgICAgICgodWludDE2X3QpMHhCRkZGKSAgLyohPCBVU0FSVCBMSU4gRGlzYWJsZSBNYXNrICovDQoNCiNkZWZpbmUgQ1IyX0xCRExfTWFzayAgICAgICAgICAgICAoKHVpbnQxNl90KTB4RkZERikgIC8qITwgVVNBUlQgTElOIEJyZWFrIGRldGVjdGlvbiBNYXNrICovDQojZGVmaW5lIENSMl9TVE9QX0NMRUFSX01hc2sgICAgICAgKCh1aW50MTZfdCkweENGRkYpICAvKiE8IFVTQVJUIENSMiBTVE9QIEJpdHMgTWFzayAqLw0KI2RlZmluZSBDUjJfQ0xPQ0tfQ0xFQVJfTWFzayAgICAgICgodWludDE2X3QpMHhGMEZGKSAgLyohPCBVU0FSVCBDUjIgQ2xvY2sgTWFzayAqLw0KDQojZGVmaW5lIENSM19TQ0VOX1NldCAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMjApICAvKiE8IFVTQVJUIFNDIEVuYWJsZSBNYXNrICovDQojZGVmaW5lIENSM19TQ0VOX1Jlc2V0ICAgICAgICAgICAgKCh1aW50MTZfdCkweEZGREYpICAvKiE8IFVTQVJUIFNDIERpc2FibGUgTWFzayAqLw0KDQojZGVmaW5lIENSM19OQUNLX1NldCAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMTApICAvKiE8IFVTQVJUIFNDIE5BQ0sgRW5hYmxlIE1hc2sgKi8NCiNkZWZpbmUgQ1IzX05BQ0tfUmVzZXQgICAgICAgICAgICAoKHVpbnQxNl90KTB4RkZFRikgIC8qITwgVVNBUlQgU0MgTkFDSyBEaXNhYmxlIE1hc2sgKi8NCg0KI2RlZmluZSBDUjNfSERTRUxfU2V0ICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDA4KSAgLyohPCBVU0FSVCBIYWxmLUR1cGxleCBFbmFibGUgTWFzayAqLw0KI2RlZmluZSBDUjNfSERTRUxfUmVzZXQgICAgICAgICAgICgodWludDE2X3QpMHhGRkY3KSAgLyohPCBVU0FSVCBIYWxmLUR1cGxleCBEaXNhYmxlIE1hc2sgKi8NCg0KI2RlZmluZSBDUjNfSVJMUF9NYXNrICAgICAgICAgICAgICgodWludDE2X3QpMHhGRkZCKSAgLyohPCBVU0FSVCBJckRBIExvd1Bvd2VyIG1vZGUgTWFzayAqLw0KI2RlZmluZSBDUjNfQ0xFQVJfTWFzayAgICAgICAgICAgICgodWludDE2X3QpMHhGQ0ZGKSAgLyohPCBVU0FSVCBDUjMgTWFzayAqLw0KDQojZGVmaW5lIENSM19JUkVOX1NldCAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMDIpICAvKiE8IFVTQVJUIElyREEgRW5hYmxlIE1hc2sgKi8NCiNkZWZpbmUgQ1IzX0lSRU5fUmVzZXQgICAgICAgICAgICAoKHVpbnQxNl90KTB4RkZGRCkgIC8qITwgVVNBUlQgSXJEQSBEaXNhYmxlIE1hc2sgKi8NCiNkZWZpbmUgR1RQUl9MU0JfTWFzayAgICAgICAgICAgICAoKHVpbnQxNl90KTB4MDBGRikgIC8qITwgR3VhcmQgVGltZSBSZWdpc3RlciBMU0IgTWFzayAqLw0KI2RlZmluZSBHVFBSX01TQl9NYXNrICAgICAgICAgICAgICgodWludDE2X3QpMHhGRjAwKSAgLyohPCBHdWFyZCBUaW1lIFJlZ2lzdGVyIE1TQiBNYXNrICovDQojZGVmaW5lIElUX01hc2sgICAgICAgICAgICAgICAgICAgKCh1aW50MTZfdCkweDAwMUYpICAvKiE8IFVTQVJUIEludGVycnVwdCBNYXNrICovDQoNCi8qIFVTQVJUIE92ZXJTYW1wbGluZy04IE1hc2sgKi8NCiNkZWZpbmUgQ1IxX09WRVI4X1NldCAgICAgICAgICAgICAoKHUxNikweDgwMDApICAvKiBVU0FSVCBPVkVSOCBtb2RlIEVuYWJsZSBNYXNrICovDQojZGVmaW5lIENSMV9PVkVSOF9SZXNldCAgICAgICAgICAgKCh1MTYpMHg3RkZGKSAgLyogVVNBUlQgT1ZFUjggbW9kZSBEaXNhYmxlIE1hc2sgKi8NCg0KLyogVVNBUlQgT25lIEJpdCBTYW1wbGluZyBNYXNrICovDQojZGVmaW5lIENSM19PTkVCSVRFX1NldCAgICAgICAgICAgKCh1MTYpMHgwODAwKSAgLyogVVNBUlQgT05FQklURSBtb2RlIEVuYWJsZSBNYXNrICovDQojZGVmaW5lIENSM19PTkVCSVRFX1Jlc2V0ICAgICAgICAgKCh1MTYpMHhGN0ZGKSAgLyogVVNBUlQgT05FQklURSBtb2RlIERpc2FibGUgTWFzayAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIFVTQVJUX1ByaXZhdGVfTWFjcm9zDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBVU0FSVF9Qcml2YXRlX1ZhcmlhYmxlcw0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgVVNBUlRfUHJpdmF0ZV9GdW5jdGlvblByb3RvdHlwZXMNCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIFVTQVJUX1ByaXZhdGVfRnVuY3Rpb25zDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQGJyaWVmICBEZWluaXRpYWxpemVzIHRoZSBVU0FSVHggcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuDQogICogQHBhcmFtICBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgb3IgdGhlIFVBUlQgcGVyaXBoZXJhbC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiBVU0FSVDEsIFVTQVJUMiwgVVNBUlQzLCBVQVJUNCBvciBVQVJUNS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVVNBUlRfRGVJbml0KFVTQVJUX1R5cGVEZWYqIFVTQVJUeCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQoNCiAgaWYgKFVTQVJUeCA9PSBVU0FSVDEpDQogIHsNCiAgICBSQ0NfQVBCMlBlcmlwaFJlc2V0Q21kKFJDQ19BUEIyUGVyaXBoX1VTQVJUMSwgRU5BQkxFKTsNCiAgICBSQ0NfQVBCMlBlcmlwaFJlc2V0Q21kKFJDQ19BUEIyUGVyaXBoX1VTQVJUMSwgRElTQUJMRSk7DQogIH0NCiAgZWxzZSBpZiAoVVNBUlR4ID09IFVTQVJUMikNCiAgew0KICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVVNBUlQyLCBFTkFCTEUpOw0KICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVVNBUlQyLCBESVNBQkxFKTsNCiAgfQ0KICBlbHNlIGlmIChVU0FSVHggPT0gVVNBUlQzKQ0KICB7DQogICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9VU0FSVDMsIEVOQUJMRSk7DQogICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9VU0FSVDMsIERJU0FCTEUpOw0KICB9ICAgIA0KICBlbHNlIGlmIChVU0FSVHggPT0gVUFSVDQpDQogIHsNCiAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1VBUlQ0LCBFTkFCTEUpOw0KICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVUFSVDQsIERJU0FCTEUpOw0KICB9ICAgIA0KICBlbHNlDQogIHsNCiAgICBpZiAoVVNBUlR4ID09IFVBUlQ1KQ0KICAgIHsgDQogICAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1VBUlQ1LCBFTkFCTEUpOw0KICAgICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9VQVJUNSwgRElTQUJMRSk7DQogICAgfQ0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFVTQVJUeCBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQogICogICBwYXJhbWV0ZXJzIGluIHRoZSBVU0FSVF9Jbml0U3RydWN0IC4NCiAgKiBAcGFyYW0gIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBvciB0aGUgVUFSVCBwZXJpcGhlcmFsLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICBVU0FSVDEsIFVTQVJUMiwgVVNBUlQzLCBVQVJUNCBvciBVQVJUNS4NCiAgKiBAcGFyYW0gIFVTQVJUX0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBVU0FSVF9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUNCiAgKiAgIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQgVVNBUlQgcGVyaXBoZXJhbC4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVVNBUlRfSW5pdChVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIFVTQVJUX0luaXRUeXBlRGVmKiBVU0FSVF9Jbml0U3RydWN0KQ0Kew0KICB1aW50MzJfdCB0bXByZWcgPSAweDAwLCBhcGJjbG9jayA9IDB4MDA7DQogIHVpbnQzMl90IGludGVnZXJkaXZpZGVyID0gMHgwMDsNCiAgdWludDMyX3QgZnJhY3Rpb25hbGRpdmlkZXIgPSAweDAwOw0KICB1aW50MzJfdCB1c2FydHhiYXNlID0gMDsNCiAgUkNDX0Nsb2Nrc1R5cGVEZWYgUkNDX0Nsb2Nrc1N0YXR1czsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9CQVVEUkFURShVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9CYXVkUmF0ZSkpOyAgDQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9XT1JEX0xFTkdUSChVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9Xb3JkTGVuZ3RoKSk7DQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9TVE9QQklUUyhVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9TdG9wQml0cykpOw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfUEFSSVRZKFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX1Bhcml0eSkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfTU9ERShVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9Nb2RlKSk7DQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9IQVJEV0FSRV9GTE9XX0NPTlRST0woVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfSGFyZHdhcmVGbG93Q29udHJvbCkpOw0KICAvKiBUaGUgaGFyZHdhcmUgZmxvdyBjb250cm9sIGlzIGF2YWlsYWJsZSBvbmx5IGZvciBVU0FSVDEsIFVTQVJUMiBhbmQgVVNBUlQzICovDQogIGlmIChVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9IYXJkd2FyZUZsb3dDb250cm9sICE9IFVTQVJUX0hhcmR3YXJlRmxvd0NvbnRyb2xfTm9uZSkNCiAgew0KICAgIGFzc2VydF9wYXJhbShJU19VU0FSVF8xMjNfUEVSSVBIKFVTQVJUeCkpOw0KICB9DQoNCiAgdXNhcnR4YmFzZSA9ICh1aW50MzJfdClVU0FSVHg7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBDUjIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIHRtcHJlZyA9IFVTQVJUeC0+Q1IyOw0KICAvKiBDbGVhciBTVE9QWzEzOjEyXSBiaXRzICovDQogIHRtcHJlZyAmPSBDUjJfU1RPUF9DTEVBUl9NYXNrOw0KICAvKiBDb25maWd1cmUgdGhlIFVTQVJUIFN0b3AgQml0cywgQ2xvY2ssIENQT0wsIENQSEEgYW5kIExhc3RCaXQgLS0tLS0tLS0tLS0tKi8NCiAgLyogU2V0IFNUT1BbMTM6MTJdIGJpdHMgYWNjb3JkaW5nIHRvIFVTQVJUX1N0b3BCaXRzIHZhbHVlICovDQogIHRtcHJlZyB8PSAodWludDMyX3QpVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfU3RvcEJpdHM7DQogIA0KICAvKiBXcml0ZSB0byBVU0FSVCBDUjIgKi8NCiAgVVNBUlR4LT5DUjIgPSAodWludDE2X3QpdG1wcmVnOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQ1IxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICB0bXByZWcgPSBVU0FSVHgtPkNSMTsNCiAgLyogQ2xlYXIgTSwgUENFLCBQUywgVEUgYW5kIFJFIGJpdHMgKi8NCiAgdG1wcmVnICY9IENSMV9DTEVBUl9NYXNrOw0KICAvKiBDb25maWd1cmUgdGhlIFVTQVJUIFdvcmQgTGVuZ3RoLCBQYXJpdHkgYW5kIG1vZGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8NCiAgLyogU2V0IHRoZSBNIGJpdHMgYWNjb3JkaW5nIHRvIFVTQVJUX1dvcmRMZW5ndGggdmFsdWUgKi8NCiAgLyogU2V0IFBDRSBhbmQgUFMgYml0cyBhY2NvcmRpbmcgdG8gVVNBUlRfUGFyaXR5IHZhbHVlICovDQogIC8qIFNldCBURSBhbmQgUkUgYml0cyBhY2NvcmRpbmcgdG8gVVNBUlRfTW9kZSB2YWx1ZSAqLw0KICB0bXByZWcgfD0gKHVpbnQzMl90KVVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX1dvcmRMZW5ndGggfCBVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9QYXJpdHkgfA0KICAgICAgICAgICAgVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfTW9kZTsNCiAgLyogV3JpdGUgdG8gVVNBUlQgQ1IxICovDQogIFVTQVJUeC0+Q1IxID0gKHVpbnQxNl90KXRtcHJlZzsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIENSMyBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8gIA0KICB0bXByZWcgPSBVU0FSVHgtPkNSMzsNCiAgLyogQ2xlYXIgQ1RTRSBhbmQgUlRTRSBiaXRzICovDQogIHRtcHJlZyAmPSBDUjNfQ0xFQVJfTWFzazsNCiAgLyogQ29uZmlndXJlIHRoZSBVU0FSVCBIRkMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIC8qIFNldCBDVFNFIGFuZCBSVFNFIGJpdHMgYWNjb3JkaW5nIHRvIFVTQVJUX0hhcmR3YXJlRmxvd0NvbnRyb2wgdmFsdWUgKi8NCiAgdG1wcmVnIHw9IFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX0hhcmR3YXJlRmxvd0NvbnRyb2w7DQogIC8qIFdyaXRlIHRvIFVTQVJUIENSMyAqLw0KICBVU0FSVHgtPkNSMyA9ICh1aW50MTZfdCl0bXByZWc7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBCUlIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIC8qIENvbmZpZ3VyZSB0aGUgVVNBUlQgQmF1ZCBSYXRlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICBSQ0NfR2V0Q2xvY2tzRnJlcSgmUkNDX0Nsb2Nrc1N0YXR1cyk7DQogIGlmICh1c2FydHhiYXNlID09IFVTQVJUMV9CQVNFKQ0KICB7DQogICAgYXBiY2xvY2sgPSBSQ0NfQ2xvY2tzU3RhdHVzLlBDTEsyX0ZyZXF1ZW5jeTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBhcGJjbG9jayA9IFJDQ19DbG9ja3NTdGF0dXMuUENMSzFfRnJlcXVlbmN5Ow0KICB9DQogIA0KICAvKiBEZXRlcm1pbmUgdGhlIGludGVnZXIgcGFydCAqLw0KICBpZiAoKFVTQVJUeC0+Q1IxICYgQ1IxX09WRVI4X1NldCkgIT0gMCkNCiAgew0KICAgIC8qIEludGVnZXIgcGFydCBjb21wdXRpbmcgaW4gY2FzZSBPdmVyc2FtcGxpbmcgbW9kZSBpcyA4IFNhbXBsZXMgKi8NCiAgICBpbnRlZ2VyZGl2aWRlciA9ICgoMjUgKiBhcGJjbG9jaykgLyAoMiAqIChVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9CYXVkUmF0ZSkpKTsgICAgDQogIH0NCiAgZWxzZSAvKiBpZiAoKFVTQVJUeC0+Q1IxICYgQ1IxX09WRVI4X1NldCkgPT0gMCkgKi8NCiAgew0KICAgIC8qIEludGVnZXIgcGFydCBjb21wdXRpbmcgaW4gY2FzZSBPdmVyc2FtcGxpbmcgbW9kZSBpcyAxNiBTYW1wbGVzICovDQogICAgaW50ZWdlcmRpdmlkZXIgPSAoKDI1ICogYXBiY2xvY2spIC8gKDQgKiAoVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfQmF1ZFJhdGUpKSk7ICAgIA0KICB9DQogIHRtcHJlZyA9IChpbnRlZ2VyZGl2aWRlciAvIDEwMCkgPDwgNDsNCg0KICAvKiBEZXRlcm1pbmUgdGhlIGZyYWN0aW9uYWwgcGFydCAqLw0KICBmcmFjdGlvbmFsZGl2aWRlciA9IGludGVnZXJkaXZpZGVyIC0gKDEwMCAqICh0bXByZWcgPj4gNCkpOw0KDQogIC8qIEltcGxlbWVudCB0aGUgZnJhY3Rpb25hbCBwYXJ0IGluIHRoZSByZWdpc3RlciAqLw0KICBpZiAoKFVTQVJUeC0+Q1IxICYgQ1IxX09WRVI4X1NldCkgIT0gMCkNCiAgew0KICAgIHRtcHJlZyB8PSAoKCgoZnJhY3Rpb25hbGRpdmlkZXIgKiA4KSArIDUwKSAvIDEwMCkpICYgKCh1aW50OF90KTB4MDcpOw0KICB9DQogIGVsc2UgLyogaWYgKChVU0FSVHgtPkNSMSAmIENSMV9PVkVSOF9TZXQpID09IDApICovDQogIHsNCiAgICB0bXByZWcgfD0gKCgoKGZyYWN0aW9uYWxkaXZpZGVyICogMTYpICsgNTApIC8gMTAwKSkgJiAoKHVpbnQ4X3QpMHgwRik7DQogIH0NCiAgDQogIC8qIFdyaXRlIHRvIFVTQVJUIEJSUiAqLw0KICBVU0FSVHgtPkJSUiA9ICh1aW50MTZfdCl0bXByZWc7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRmlsbHMgZWFjaCBVU0FSVF9Jbml0U3RydWN0IG1lbWJlciB3aXRoIGl0cyBkZWZhdWx0IHZhbHVlLg0KICAqIEBwYXJhbSAgVVNBUlRfSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIFVTQVJUX0luaXRUeXBlRGVmIHN0cnVjdHVyZQ0KICAqICAgd2hpY2ggd2lsbCBiZSBpbml0aWFsaXplZC4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVVNBUlRfU3RydWN0SW5pdChVU0FSVF9Jbml0VHlwZURlZiogVVNBUlRfSW5pdFN0cnVjdCkNCnsNCiAgLyogVVNBUlRfSW5pdFN0cnVjdCBtZW1iZXJzIGRlZmF1bHQgdmFsdWUgKi8NCiAgVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfQmF1ZFJhdGUgPSA5NjAwOw0KICBVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9Xb3JkTGVuZ3RoID0gVVNBUlRfV29yZExlbmd0aF84YjsNCiAgVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfU3RvcEJpdHMgPSBVU0FSVF9TdG9wQml0c18xOw0KICBVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9QYXJpdHkgPSBVU0FSVF9QYXJpdHlfTm8gOw0KICBVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9Nb2RlID0gVVNBUlRfTW9kZV9SeCB8IFVTQVJUX01vZGVfVHg7DQogIFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX0hhcmR3YXJlRmxvd0NvbnRyb2wgPSBVU0FSVF9IYXJkd2FyZUZsb3dDb250cm9sX05vbmU7ICANCn0NCg0KLyoqDQogICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVVNBUlR4IHBlcmlwaGVyYWwgQ2xvY2sgYWNjb3JkaW5nIHRvIHRoZSANCiAgKiAgIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIHRoZSBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QgLg0KICAqIEBwYXJhbSAgVVNBUlR4OiB3aGVyZSB4IGNhbiBiZSAxLCAyLCAzIHRvIHNlbGVjdCB0aGUgVVNBUlQgcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFVTQVJUX0Nsb2NrSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIFVTQVJUX0Nsb2NrSW5pdFR5cGVEZWYNCiAgKiAgIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIA0KICAqICAgVVNBUlQgcGVyaXBoZXJhbC4gIA0KICAqIEBub3RlIFRoZSBTbWFydCBDYXJkIG1vZGUgaXMgbm90IGF2YWlsYWJsZSBmb3IgVUFSVDQgYW5kIFVBUlQ1Lg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBVU0FSVF9DbG9ja0luaXQoVVNBUlRfVHlwZURlZiogVVNBUlR4LCBVU0FSVF9DbG9ja0luaXRUeXBlRGVmKiBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QpDQp7DQogIHVpbnQzMl90IHRtcHJlZyA9IDB4MDA7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19VU0FSVF8xMjNfUEVSSVBIKFVTQVJUeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQ0xPQ0soVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5VU0FSVF9DbG9jaykpOw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQ1BPTChVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPlVTQVJUX0NQT0wpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0NQSEEoVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5VU0FSVF9DUEhBKSk7DQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9MQVNUQklUKFVTQVJUX0Nsb2NrSW5pdFN0cnVjdC0+VVNBUlRfTGFzdEJpdCkpOw0KICANCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBDUjIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIHRtcHJlZyA9IFVTQVJUeC0+Q1IyOw0KICAvKiBDbGVhciBDTEtFTiwgQ1BPTCwgQ1BIQSBhbmQgTEJDTCBiaXRzICovDQogIHRtcHJlZyAmPSBDUjJfQ0xPQ0tfQ0xFQVJfTWFzazsNCiAgLyogQ29uZmlndXJlIHRoZSBVU0FSVCBDbG9jaywgQ1BPTCwgQ1BIQSBhbmQgTGFzdEJpdCAtLS0tLS0tLS0tLS0qLw0KICAvKiBTZXQgQ0xLRU4gYml0IGFjY29yZGluZyB0byBVU0FSVF9DbG9jayB2YWx1ZSAqLw0KICAvKiBTZXQgQ1BPTCBiaXQgYWNjb3JkaW5nIHRvIFVTQVJUX0NQT0wgdmFsdWUgKi8NCiAgLyogU2V0IENQSEEgYml0IGFjY29yZGluZyB0byBVU0FSVF9DUEhBIHZhbHVlICovDQogIC8qIFNldCBMQkNMIGJpdCBhY2NvcmRpbmcgdG8gVVNBUlRfTGFzdEJpdCB2YWx1ZSAqLw0KICB0bXByZWcgfD0gKHVpbnQzMl90KVVTQVJUX0Nsb2NrSW5pdFN0cnVjdC0+VVNBUlRfQ2xvY2sgfCBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPlVTQVJUX0NQT0wgfCANCiAgICAgICAgICAgICAgICAgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5VU0FSVF9DUEhBIHwgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5VU0FSVF9MYXN0Qml0Ow0KICAvKiBXcml0ZSB0byBVU0FSVCBDUjIgKi8NCiAgVVNBUlR4LT5DUjIgPSAodWludDE2X3QpdG1wcmVnOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEZpbGxzIGVhY2ggVVNBUlRfQ2xvY2tJbml0U3RydWN0IG1lbWJlciB3aXRoIGl0cyBkZWZhdWx0IHZhbHVlLg0KICAqIEBwYXJhbSAgVVNBUlRfQ2xvY2tJbml0U3RydWN0OiBwb2ludGVyIHRvIGEgVVNBUlRfQ2xvY2tJbml0VHlwZURlZg0KICAqICAgc3RydWN0dXJlIHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFVTQVJUX0Nsb2NrU3RydWN0SW5pdChVU0FSVF9DbG9ja0luaXRUeXBlRGVmKiBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QpDQp7DQogIC8qIFVTQVJUX0Nsb2NrSW5pdFN0cnVjdCBtZW1iZXJzIGRlZmF1bHQgdmFsdWUgKi8NCiAgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5VU0FSVF9DbG9jayA9IFVTQVJUX0Nsb2NrX0Rpc2FibGU7DQogIFVTQVJUX0Nsb2NrSW5pdFN0cnVjdC0+VVNBUlRfQ1BPTCA9IFVTQVJUX0NQT0xfTG93Ow0KICBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPlVTQVJUX0NQSEEgPSBVU0FSVF9DUEhBXzFFZGdlOw0KICBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPlVTQVJUX0xhc3RCaXQgPSBVU0FSVF9MYXN0Qml0X0Rpc2FibGU7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIFVTQVJUIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgb3IgdGhlIFVBUlQgcGVyaXBoZXJhbC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgVVNBUlQxLCBVU0FSVDIsIFVTQVJUMywgVUFSVDQgb3IgVUFSVDUuDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBVU0FSVHggcGVyaXBoZXJhbC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFVTQVJUX0NtZChVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIA0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgVVNBUlQgYnkgc2V0dGluZyB0aGUgVUUgYml0IGluIHRoZSBDUjEgcmVnaXN0ZXIgKi8NCiAgICBVU0FSVHgtPkNSMSB8PSBDUjFfVUVfU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIFVTQVJUIGJ5IGNsZWFyaW5nIHRoZSBVRSBiaXQgaW4gdGhlIENSMSByZWdpc3RlciAqLw0KICAgIFVTQVJUeC0+Q1IxICY9IENSMV9VRV9SZXNldDsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBVU0FSVCBpbnRlcnJ1cHRzLg0KICAqIEBwYXJhbSAgVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIG9yIHRoZSBVQVJUIHBlcmlwaGVyYWwuIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgIFVTQVJUMSwgVVNBUlQyLCBVU0FSVDMsIFVBUlQ0IG9yIFVBUlQ1Lg0KICAqIEBwYXJhbSAgVVNBUlRfSVQ6IHNwZWNpZmllcyB0aGUgVVNBUlQgaW50ZXJydXB0IHNvdXJjZXMgdG8gYmUgZW5hYmxlZCBvciBkaXNhYmxlZC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVVNBUlRfSVRfQ1RTOiAgQ1RTIGNoYW5nZSBpbnRlcnJ1cHQgKG5vdCBhdmFpbGFibGUgZm9yIFVBUlQ0IGFuZCBVQVJUNSkNCiAgKiAgICAgQGFyZyBVU0FSVF9JVF9MQkQ6ICBMSU4gQnJlYWsgZGV0ZWN0aW9uIGludGVycnVwdA0KICAqICAgICBAYXJnIFVTQVJUX0lUX1RYRTogIFRhbnNtaXQgRGF0YSBSZWdpc3RlciBlbXB0eSBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBVU0FSVF9JVF9UQzogICBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0DQogICogICAgIEBhcmcgVVNBUlRfSVRfUlhORTogUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBVU0FSVF9JVF9JRExFOiBJZGxlIGxpbmUgZGV0ZWN0aW9uIGludGVycnVwdA0KICAqICAgICBAYXJnIFVTQVJUX0lUX1BFOiAgIFBhcml0eSBFcnJvciBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBVU0FSVF9JVF9FUlI6ICBFcnJvciBpbnRlcnJ1cHQoRnJhbWUgZXJyb3IsIG5vaXNlIGVycm9yLCBvdmVycnVuIGVycm9yKQ0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIFVTQVJUeCBpbnRlcnJ1cHRzLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVVNBUlRfSVRDb25maWcoVVNBUlRfVHlwZURlZiogVVNBUlR4LCB1aW50MTZfdCBVU0FSVF9JVCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICB1aW50MzJfdCB1c2FydHJlZyA9IDB4MDAsIGl0cG9zID0gMHgwMCwgaXRtYXNrID0gMHgwMDsNCiAgdWludDMyX3QgdXNhcnR4YmFzZSA9IDB4MDA7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9BTExfUEVSSVBIKFVTQVJUeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQ09ORklHX0lUKFVTQVJUX0lUKSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIC8qIFRoZSBDVFMgaW50ZXJydXB0IGlzIG5vdCBhdmFpbGFibGUgZm9yIFVBUlQ0IGFuZCBVQVJUNSAqLw0KICBpZiAoVVNBUlRfSVQgPT0gVVNBUlRfSVRfQ1RTKQ0KICB7DQogICAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUXzEyM19QRVJJUEgoVVNBUlR4KSk7DQogIH0gICANCiAgDQogIHVzYXJ0eGJhc2UgPSAodWludDMyX3QpVVNBUlR4Ow0KDQogIC8qIEdldCB0aGUgVVNBUlQgcmVnaXN0ZXIgaW5kZXggKi8NCiAgdXNhcnRyZWcgPSAoKCh1aW50OF90KVVTQVJUX0lUKSA+PiAweDA1KTsNCg0KICAvKiBHZXQgdGhlIGludGVycnVwdCBwb3NpdGlvbiAqLw0KICBpdHBvcyA9IFVTQVJUX0lUICYgSVRfTWFzazsNCiAgaXRtYXNrID0gKCgodWludDMyX3QpMHgwMSkgPDwgaXRwb3MpOw0KICAgIA0KICBpZiAodXNhcnRyZWcgPT0gMHgwMSkgLyogVGhlIElUIGlzIGluIENSMSByZWdpc3RlciAqLw0KICB7DQogICAgdXNhcnR4YmFzZSArPSAweDBDOw0KICB9DQogIGVsc2UgaWYgKHVzYXJ0cmVnID09IDB4MDIpIC8qIFRoZSBJVCBpcyBpbiBDUjIgcmVnaXN0ZXIgKi8NCiAgew0KICAgIHVzYXJ0eGJhc2UgKz0gMHgxMDsNCiAgfQ0KICBlbHNlIC8qIFRoZSBJVCBpcyBpbiBDUjMgcmVnaXN0ZXIgKi8NCiAgew0KICAgIHVzYXJ0eGJhc2UgKz0gMHgxNDsgDQogIH0NCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAqKF9fSU8gdWludDMyX3QqKXVzYXJ0eGJhc2UgIHw9IGl0bWFzazsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAqKF9fSU8gdWludDMyX3QqKXVzYXJ0eGJhc2UgJj0gfml0bWFzazsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFVTQVJUknMgRE1BIGludGVyZmFjZS4NCiAgKiBAcGFyYW0gIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBvciB0aGUgVUFSVCBwZXJpcGhlcmFsLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICBVU0FSVDEsIFVTQVJUMiwgVVNBUlQzLCBVQVJUNCBvciBVQVJUNS4NCiAgKiBAcGFyYW0gIFVTQVJUX0RNQVJlcTogc3BlY2lmaWVzIHRoZSBETUEgcmVxdWVzdC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVVNBUlRfRE1BUmVxX1R4OiBVU0FSVCBETUEgdHJhbnNtaXQgcmVxdWVzdA0KICAqICAgICBAYXJnIFVTQVJUX0RNQVJlcV9SeDogVVNBUlQgRE1BIHJlY2VpdmUgcmVxdWVzdA0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgRE1BIFJlcXVlc3Qgc291cmNlcy4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQG5vdGUgVGhlIERNQSBtb2RlIGlzIG5vdCBhdmFpbGFibGUgZm9yIFVBUlQ1IGV4Y2VwdCBpbiB0aGUgU1RNMzINCiAgKiAgICAgICBIaWdoIGRlbnNpdHkgdmFsdWUgbGluZSBkZXZpY2VzKFNUTTMyRjEwWF9IRF9WTCkuICANCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVVNBUlRfRE1BQ21kKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdWludDE2X3QgVVNBUlRfRE1BUmVxLCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9BTExfUEVSSVBIKFVTQVJUeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfRE1BUkVRKFVTQVJUX0RNQVJlcSkpOyAgDQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7IA0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgRE1BIHRyYW5zZmVyIGZvciBzZWxlY3RlZCByZXF1ZXN0cyBieSBzZXR0aW5nIHRoZSBETUFUIGFuZC9vcg0KICAgICAgIERNQVIgYml0cyBpbiB0aGUgVVNBUlQgQ1IzIHJlZ2lzdGVyICovDQogICAgVVNBUlR4LT5DUjMgfD0gVVNBUlRfRE1BUmVxOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIERNQSB0cmFuc2ZlciBmb3Igc2VsZWN0ZWQgcmVxdWVzdHMgYnkgY2xlYXJpbmcgdGhlIERNQVQgYW5kL29yDQogICAgICAgRE1BUiBiaXRzIGluIHRoZSBVU0FSVCBDUjMgcmVnaXN0ZXIgKi8NCiAgICBVU0FSVHgtPkNSMyAmPSAodWludDE2X3QpflVTQVJUX0RNQVJlcTsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNldHMgdGhlIGFkZHJlc3Mgb2YgdGhlIFVTQVJUIG5vZGUuDQogICogQHBhcmFtICBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgb3IgdGhlIFVBUlQgcGVyaXBoZXJhbC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgVVNBUlQxLCBVU0FSVDIsIFVTQVJUMywgVUFSVDQgb3IgVUFSVDUuDQogICogQHBhcmFtICBVU0FSVF9BZGRyZXNzOiBJbmRpY2F0ZXMgdGhlIGFkZHJlc3Mgb2YgdGhlIFVTQVJUIG5vZGUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFVTQVJUX1NldEFkZHJlc3MoVVNBUlRfVHlwZURlZiogVVNBUlR4LCB1aW50OF90IFVTQVJUX0FkZHJlc3MpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9BTExfUEVSSVBIKFVTQVJUeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUREUkVTUyhVU0FSVF9BZGRyZXNzKSk7IA0KICAgIA0KICAvKiBDbGVhciB0aGUgVVNBUlQgYWRkcmVzcyAqLw0KICBVU0FSVHgtPkNSMiAmPSBDUjJfQWRkcmVzc19NYXNrOw0KICAvKiBTZXQgdGhlIFVTQVJUIGFkZHJlc3Mgbm9kZSAqLw0KICBVU0FSVHgtPkNSMiB8PSBVU0FSVF9BZGRyZXNzOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNlbGVjdHMgdGhlIFVTQVJUIFdha2VVcCBtZXRob2QuDQogICogQHBhcmFtICBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgb3IgdGhlIFVBUlQgcGVyaXBoZXJhbC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgVVNBUlQxLCBVU0FSVDIsIFVTQVJUMywgVUFSVDQgb3IgVUFSVDUuDQogICogQHBhcmFtICBVU0FSVF9XYWtlVXA6IHNwZWNpZmllcyB0aGUgVVNBUlQgd2FrZXVwIG1ldGhvZC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVVNBUlRfV2FrZVVwX0lkbGVMaW5lOiBXYWtlVXAgYnkgYW4gaWRsZSBsaW5lIGRldGVjdGlvbg0KICAqICAgICBAYXJnIFVTQVJUX1dha2VVcF9BZGRyZXNzTWFyazogV2FrZVVwIGJ5IGFuIGFkZHJlc3MgbWFyaw0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBVU0FSVF9XYWtlVXBDb25maWcoVVNBUlRfVHlwZURlZiogVVNBUlR4LCB1aW50MTZfdCBVU0FSVF9XYWtlVXApDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9BTExfUEVSSVBIKFVTQVJUeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfV0FLRVVQKFVTQVJUX1dha2VVcCkpOw0KICANCiAgVVNBUlR4LT5DUjEgJj0gQ1IxX1dBS0VfTWFzazsNCiAgVVNBUlR4LT5DUjEgfD0gVVNBUlRfV2FrZVVwOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIERldGVybWluZXMgaWYgdGhlIFVTQVJUIGlzIGluIG11dGUgbW9kZSBvciBub3QuDQogICogQHBhcmFtICBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgb3IgdGhlIFVBUlQgcGVyaXBoZXJhbC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgVVNBUlQxLCBVU0FSVDIsIFVTQVJUMywgVUFSVDQgb3IgVUFSVDUuDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBVU0FSVCBtdXRlIG1vZGUuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBVU0FSVF9SZWNlaXZlcldha2VVcENtZChVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7IA0KICANCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIFVTQVJUIG11dGUgbW9kZSAgYnkgc2V0dGluZyB0aGUgUldVIGJpdCBpbiB0aGUgQ1IxIHJlZ2lzdGVyICovDQogICAgVVNBUlR4LT5DUjEgfD0gQ1IxX1JXVV9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgVVNBUlQgbXV0ZSBtb2RlIGJ5IGNsZWFyaW5nIHRoZSBSV1UgYml0IGluIHRoZSBDUjEgcmVnaXN0ZXIgKi8NCiAgICBVU0FSVHgtPkNSMSAmPSBDUjFfUldVX1Jlc2V0Ow0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgU2V0cyB0aGUgVVNBUlQgTElOIEJyZWFrIGRldGVjdGlvbiBsZW5ndGguDQogICogQHBhcmFtICBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgb3IgdGhlIFVBUlQgcGVyaXBoZXJhbC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgVVNBUlQxLCBVU0FSVDIsIFVTQVJUMywgVUFSVDQgb3IgVUFSVDUuDQogICogQHBhcmFtICBVU0FSVF9MSU5CcmVha0RldGVjdExlbmd0aDogc3BlY2lmaWVzIHRoZSBMSU4gYnJlYWsgZGV0ZWN0aW9uIGxlbmd0aC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVVNBUlRfTElOQnJlYWtEZXRlY3RMZW5ndGhfMTBiOiAxMC1iaXQgYnJlYWsgZGV0ZWN0aW9uDQogICogICAgIEBhcmcgVVNBUlRfTElOQnJlYWtEZXRlY3RMZW5ndGhfMTFiOiAxMS1iaXQgYnJlYWsgZGV0ZWN0aW9uDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFVTQVJUX0xJTkJyZWFrRGV0ZWN0TGVuZ3RoQ29uZmlnKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdWludDE2X3QgVVNBUlRfTElOQnJlYWtEZXRlY3RMZW5ndGgpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9BTExfUEVSSVBIKFVTQVJUeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfTElOX0JSRUFLX0RFVEVDVF9MRU5HVEgoVVNBUlRfTElOQnJlYWtEZXRlY3RMZW5ndGgpKTsNCiAgDQogIFVTQVJUeC0+Q1IyICY9IENSMl9MQkRMX01hc2s7DQogIFVTQVJUeC0+Q1IyIHw9IFVTQVJUX0xJTkJyZWFrRGV0ZWN0TGVuZ3RoOyAgDQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVVNBUlSScyBMSU4gbW9kZS4NCiAgKiBAcGFyYW0gIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBvciB0aGUgVUFSVCBwZXJpcGhlcmFsLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICBVU0FSVDEsIFVTQVJUMiwgVVNBUlQzLCBVQVJUNCBvciBVQVJUNS4NCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFVTQVJUIExJTiBtb2RlLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVVNBUlRfTElOQ21kKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUxMX1BFUklQSChVU0FSVHgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBMSU4gbW9kZSBieSBzZXR0aW5nIHRoZSBMSU5FTiBiaXQgaW4gdGhlIENSMiByZWdpc3RlciAqLw0KICAgIFVTQVJUeC0+Q1IyIHw9IENSMl9MSU5FTl9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgTElOIG1vZGUgYnkgY2xlYXJpbmcgdGhlIExJTkVOIGJpdCBpbiB0aGUgQ1IyIHJlZ2lzdGVyICovDQogICAgVVNBUlR4LT5DUjIgJj0gQ1IyX0xJTkVOX1Jlc2V0Ow0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgVHJhbnNtaXRzIHNpbmdsZSBkYXRhIHRocm91Z2ggdGhlIFVTQVJUeCBwZXJpcGhlcmFsLg0KICAqIEBwYXJhbSAgVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIG9yIHRoZSBVQVJUIHBlcmlwaGVyYWwuIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgIFVTQVJUMSwgVVNBUlQyLCBVU0FSVDMsIFVBUlQ0IG9yIFVBUlQ1Lg0KICAqIEBwYXJhbSAgRGF0YTogdGhlIGRhdGEgdG8gdHJhbnNtaXQuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFVTQVJUX1NlbmREYXRhKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdWludDE2X3QgRGF0YSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9EQVRBKERhdGEpKTsgDQogICAgDQogIC8qIFRyYW5zbWl0IERhdGEgKi8NCiAgVVNBUlR4LT5EUiA9IChEYXRhICYgKHVpbnQxNl90KTB4MDFGRik7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgUmV0dXJucyB0aGUgbW9zdCByZWNlbnQgcmVjZWl2ZWQgZGF0YSBieSB0aGUgVVNBUlR4IHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgb3IgdGhlIFVBUlQgcGVyaXBoZXJhbC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgVVNBUlQxLCBVU0FSVDIsIFVTQVJUMywgVUFSVDQgb3IgVUFSVDUuDQogICogQHJldHZhbCBUaGUgcmVjZWl2ZWQgZGF0YS4NCiAgKi8NCnVpbnQxNl90IFVTQVJUX1JlY2VpdmVEYXRhKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQogIA0KICAvKiBSZWNlaXZlIERhdGEgKi8NCiAgcmV0dXJuICh1aW50MTZfdCkoVVNBUlR4LT5EUiAmICh1aW50MTZfdCkweDAxRkYpOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFRyYW5zbWl0cyBicmVhayBjaGFyYWN0ZXJzLg0KICAqIEBwYXJhbSAgVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIG9yIHRoZSBVQVJUIHBlcmlwaGVyYWwuIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgIFVTQVJUMSwgVVNBUlQyLCBVU0FSVDMsIFVBUlQ0IG9yIFVBUlQ1Lg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBVU0FSVF9TZW5kQnJlYWsoVVNBUlRfVHlwZURlZiogVVNBUlR4KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUxMX1BFUklQSChVU0FSVHgpKTsNCiAgDQogIC8qIFNlbmQgYnJlYWsgY2hhcmFjdGVycyAqLw0KICBVU0FSVHgtPkNSMSB8PSBDUjFfU0JLX1NldDsNCn0NCg0KLyoqDQogICogQGJyaWVmICBTZXRzIHRoZSBzcGVjaWZpZWQgVVNBUlQgZ3VhcmQgdGltZS4NCiAgKiBAcGFyYW0gIFVTQVJUeDogd2hlcmUgeCBjYW4gYmUgMSwgMiBvciAzIHRvIHNlbGVjdCB0aGUgVVNBUlQgcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFVTQVJUX0d1YXJkVGltZTogc3BlY2lmaWVzIHRoZSBndWFyZCB0aW1lLg0KICAqIEBub3RlIFRoZSBndWFyZCB0aW1lIGJpdHMgYXJlIG5vdCBhdmFpbGFibGUgZm9yIFVBUlQ0IGFuZCBVQVJUNS4gICANCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVVNBUlRfU2V0R3VhcmRUaW1lKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdWludDhfdCBVU0FSVF9HdWFyZFRpbWUpDQp7ICAgIA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfMTIzX1BFUklQSChVU0FSVHgpKTsNCiAgDQogIC8qIENsZWFyIHRoZSBVU0FSVCBHdWFyZCB0aW1lICovDQogIFVTQVJUeC0+R1RQUiAmPSBHVFBSX0xTQl9NYXNrOw0KICAvKiBTZXQgdGhlIFVTQVJUIGd1YXJkIHRpbWUgKi8NCiAgVVNBUlR4LT5HVFBSIHw9ICh1aW50MTZfdCkoKHVpbnQxNl90KVVTQVJUX0d1YXJkVGltZSA8PCAweDA4KTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBTZXRzIHRoZSBzeXN0ZW0gY2xvY2sgcHJlc2NhbGVyLg0KICAqIEBwYXJhbSAgVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIG9yIHRoZSBVQVJUIHBlcmlwaGVyYWwuIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgIFVTQVJUMSwgVVNBUlQyLCBVU0FSVDMsIFVBUlQ0IG9yIFVBUlQ1Lg0KICAqIEBwYXJhbSAgVVNBUlRfUHJlc2NhbGVyOiBzcGVjaWZpZXMgdGhlIHByZXNjYWxlciBjbG9jay4gIA0KICAqIEBub3RlICAgVGhlIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIElyREEgbW9kZSB3aXRoIFVBUlQ0IGFuZCBVQVJUNS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVVNBUlRfU2V0UHJlc2NhbGVyKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdWludDhfdCBVU0FSVF9QcmVzY2FsZXIpDQp7IA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUxMX1BFUklQSChVU0FSVHgpKTsNCiAgDQogIC8qIENsZWFyIHRoZSBVU0FSVCBwcmVzY2FsZXIgKi8NCiAgVVNBUlR4LT5HVFBSICY9IEdUUFJfTVNCX01hc2s7DQogIC8qIFNldCB0aGUgVVNBUlQgcHJlc2NhbGVyICovDQogIFVTQVJUeC0+R1RQUiB8PSBVU0FSVF9QcmVzY2FsZXI7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVVNBUlSScyBTbWFydCBDYXJkIG1vZGUuDQogICogQHBhcmFtICBVU0FSVHg6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIFVTQVJUIHBlcmlwaGVyYWwuDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBTbWFydCBDYXJkIG1vZGUuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLiAgICAgDQogICogQG5vdGUgVGhlIFNtYXJ0IENhcmQgbW9kZSBpcyBub3QgYXZhaWxhYmxlIGZvciBVQVJUNCBhbmQgVUFSVDUuIA0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBVU0FSVF9TbWFydENhcmRDbWQoVVNBUlRfVHlwZURlZiogVVNBUlR4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19VU0FSVF8xMjNfUEVSSVBIKFVTQVJUeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgU0MgbW9kZSBieSBzZXR0aW5nIHRoZSBTQ0VOIGJpdCBpbiB0aGUgQ1IzIHJlZ2lzdGVyICovDQogICAgVVNBUlR4LT5DUjMgfD0gQ1IzX1NDRU5fU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIFNDIG1vZGUgYnkgY2xlYXJpbmcgdGhlIFNDRU4gYml0IGluIHRoZSBDUjMgcmVnaXN0ZXIgKi8NCiAgICBVU0FSVHgtPkNSMyAmPSBDUjNfU0NFTl9SZXNldDsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgTkFDSyB0cmFuc21pc3Npb24uDQogICogQHBhcmFtICBVU0FSVHg6IHdoZXJlIHggY2FuIGJlIDEsIDIgb3IgMyB0byBzZWxlY3QgdGhlIFVTQVJUIHBlcmlwaGVyYWwuIA0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgTkFDSyB0cmFuc21pc3Npb24uDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLiAgDQogICogQG5vdGUgVGhlIFNtYXJ0IENhcmQgbW9kZSBpcyBub3QgYXZhaWxhYmxlIGZvciBVQVJUNCBhbmQgVUFSVDUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFVTQVJUX1NtYXJ0Q2FyZE5BQ0tDbWQoVVNBUlRfVHlwZURlZiogVVNBUlR4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19VU0FSVF8xMjNfUEVSSVBIKFVTQVJUeCkpOyAgDQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBOQUNLIHRyYW5zbWlzc2lvbiBieSBzZXR0aW5nIHRoZSBOQUNLIGJpdCBpbiB0aGUgQ1IzIHJlZ2lzdGVyICovDQogICAgVVNBUlR4LT5DUjMgfD0gQ1IzX05BQ0tfU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIE5BQ0sgdHJhbnNtaXNzaW9uIGJ5IGNsZWFyaW5nIHRoZSBOQUNLIGJpdCBpbiB0aGUgQ1IzIHJlZ2lzdGVyICovDQogICAgVVNBUlR4LT5DUjMgJj0gQ1IzX05BQ0tfUmVzZXQ7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBVU0FSVJJzIEhhbGYgRHVwbGV4IGNvbW11bmljYXRpb24uDQogICogQHBhcmFtICBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgb3IgdGhlIFVBUlQgcGVyaXBoZXJhbC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgVVNBUlQxLCBVU0FSVDIsIFVTQVJUMywgVUFSVDQgb3IgVUFSVDUuDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBVU0FSVCBDb21tdW5pY2F0aW9uLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVVNBUlRfSGFsZkR1cGxleENtZChVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIA0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgSGFsZi1EdXBsZXggbW9kZSBieSBzZXR0aW5nIHRoZSBIRFNFTCBiaXQgaW4gdGhlIENSMyByZWdpc3RlciAqLw0KICAgIFVTQVJUeC0+Q1IzIHw9IENSM19IRFNFTF9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgSGFsZi1EdXBsZXggbW9kZSBieSBjbGVhcmluZyB0aGUgSERTRUwgYml0IGluIHRoZSBDUjMgcmVnaXN0ZXIgKi8NCiAgICBVU0FSVHgtPkNSMyAmPSBDUjNfSERTRUxfUmVzZXQ7DQogIH0NCn0NCg0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFVTQVJUJ3MgOHggb3ZlcnNhbXBsaW5nIG1vZGUuDQogICogQHBhcmFtICBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgb3IgdGhlIFVBUlQgcGVyaXBoZXJhbC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICBVU0FSVDEsIFVTQVJUMiwgVVNBUlQzLCBVQVJUNCBvciBVQVJUNS4NCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFVTQVJUIG9uZSBiaXQgc2FtcGxpbmcgbWV0aG9kZS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQG5vdGUNCiAgKiAgICAgVGhpcyBmdW5jdGlvbiBoYXMgdG8gYmUgY2FsbGVkIGJlZm9yZSBjYWxsaW5nIFVTQVJUX0luaXQoKQ0KICAqICAgICBmdW5jdGlvbiBpbiBvcmRlciB0byBoYXZlIGNvcnJlY3QgYmF1ZHJhdGUgRGl2aWRlciB2YWx1ZS4gICANCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVVNBUlRfT3ZlclNhbXBsaW5nOENtZChVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIA0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgOHggT3ZlcnNhbXBsaW5nIG1vZGUgYnkgc2V0dGluZyB0aGUgT1ZFUjggYml0IGluIHRoZSBDUjEgcmVnaXN0ZXIgKi8NCiAgICBVU0FSVHgtPkNSMSB8PSBDUjFfT1ZFUjhfU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIDh4IE92ZXJzYW1wbGluZyBtb2RlIGJ5IGNsZWFyaW5nIHRoZSBPVkVSOCBiaXQgaW4gdGhlIENSMSByZWdpc3RlciAqLw0KICAgIFVTQVJUeC0+Q1IxICY9IENSMV9PVkVSOF9SZXNldDsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFVTQVJUJ3Mgb25lIGJpdCBzYW1wbGluZyBtZXRob2RlLg0KICAqIEBwYXJhbSAgVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIG9yIHRoZSBVQVJUIHBlcmlwaGVyYWwuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgVVNBUlQxLCBVU0FSVDIsIFVTQVJUMywgVUFSVDQgb3IgVUFSVDUuDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBVU0FSVCBvbmUgYml0IHNhbXBsaW5nIG1ldGhvZGUuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBVU0FSVF9PbmVCaXRNZXRob2RDbWQoVVNBUlRfVHlwZURlZiogVVNBUlR4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9BTExfUEVSSVBIKFVTQVJUeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICANCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIG9uZSBiaXQgbWV0aG9kIGJ5IHNldHRpbmcgdGhlIE9ORUJJVEUgYml0IGluIHRoZSBDUjMgcmVnaXN0ZXIgKi8NCiAgICBVU0FSVHgtPkNSMyB8PSBDUjNfT05FQklURV9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0dGhlIG9uZSBiaXQgbWV0aG9kIGJ5IGNsZWFyaW5nIHRoZSBPTkVCSVRFIGJpdCBpbiB0aGUgQ1IzIHJlZ2lzdGVyICovDQogICAgVVNBUlR4LT5DUjMgJj0gQ1IzX09ORUJJVEVfUmVzZXQ7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBVU0FSVJJzIElyREEgaW50ZXJmYWNlLg0KICAqIEBwYXJhbSAgVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIG9yIHRoZSBVQVJUIHBlcmlwaGVyYWwuIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgIFVTQVJUMSwgVVNBUlQyLCBVU0FSVDMsIFVBUlQ0IG9yIFVBUlQ1Lg0KICAqIEBwYXJhbSAgVVNBUlRfSXJEQU1vZGU6IHNwZWNpZmllcyB0aGUgSXJEQSBtb2RlLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBVU0FSVF9JckRBTW9kZV9Mb3dQb3dlcg0KICAqICAgICBAYXJnIFVTQVJUX0lyREFNb2RlX05vcm1hbA0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBVU0FSVF9JckRBQ29uZmlnKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdWludDE2X3QgVVNBUlRfSXJEQU1vZGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9BTExfUEVSSVBIKFVTQVJUeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfSVJEQV9NT0RFKFVTQVJUX0lyREFNb2RlKSk7DQogICAgDQogIFVTQVJUeC0+Q1IzICY9IENSM19JUkxQX01hc2s7DQogIFVTQVJUeC0+Q1IzIHw9IFVTQVJUX0lyREFNb2RlOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFVTQVJUknMgSXJEQSBpbnRlcmZhY2UuDQogICogQHBhcmFtICBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgb3IgdGhlIFVBUlQgcGVyaXBoZXJhbC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgVVNBUlQxLCBVU0FSVDIsIFVTQVJUMywgVUFSVDQgb3IgVUFSVDUuDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBJckRBIG1vZGUuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBVU0FSVF9JckRBQ21kKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUxMX1BFUklQSChVU0FSVHgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgICANCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIElyREEgbW9kZSBieSBzZXR0aW5nIHRoZSBJUkVOIGJpdCBpbiB0aGUgQ1IzIHJlZ2lzdGVyICovDQogICAgVVNBUlR4LT5DUjMgfD0gQ1IzX0lSRU5fU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIElyREEgbW9kZSBieSBjbGVhcmluZyB0aGUgSVJFTiBiaXQgaW4gdGhlIENSMyByZWdpc3RlciAqLw0KICAgIFVTQVJUeC0+Q1IzICY9IENSM19JUkVOX1Jlc2V0Ow0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVU0FSVCBmbGFnIGlzIHNldCBvciBub3QuDQogICogQHBhcmFtICBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgb3IgdGhlIFVBUlQgcGVyaXBoZXJhbC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgVVNBUlQxLCBVU0FSVDIsIFVTQVJUMywgVUFSVDQgb3IgVUFSVDUuDQogICogQHBhcmFtICBVU0FSVF9GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFVTQVJUX0ZMQUdfQ1RTOiAgQ1RTIENoYW5nZSBmbGFnIChub3QgYXZhaWxhYmxlIGZvciBVQVJUNCBhbmQgVUFSVDUpDQogICogICAgIEBhcmcgVVNBUlRfRkxBR19MQkQ6ICBMSU4gQnJlYWsgZGV0ZWN0aW9uIGZsYWcNCiAgKiAgICAgQGFyZyBVU0FSVF9GTEFHX1RYRTogIFRyYW5zbWl0IGRhdGEgcmVnaXN0ZXIgZW1wdHkgZmxhZw0KICAqICAgICBAYXJnIFVTQVJUX0ZMQUdfVEM6ICAgVHJhbnNtaXNzaW9uIENvbXBsZXRlIGZsYWcNCiAgKiAgICAgQGFyZyBVU0FSVF9GTEFHX1JYTkU6IFJlY2VpdmUgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgZmxhZw0KICAqICAgICBAYXJnIFVTQVJUX0ZMQUdfSURMRTogSWRsZSBMaW5lIGRldGVjdGlvbiBmbGFnDQogICogICAgIEBhcmcgVVNBUlRfRkxBR19PUkU6ICBPdmVyUnVuIEVycm9yIGZsYWcNCiAgKiAgICAgQGFyZyBVU0FSVF9GTEFHX05FOiAgIE5vaXNlIEVycm9yIGZsYWcNCiAgKiAgICAgQGFyZyBVU0FSVF9GTEFHX0ZFOiAgIEZyYW1pbmcgRXJyb3IgZmxhZw0KICAqICAgICBAYXJnIFVTQVJUX0ZMQUdfUEU6ICAgUGFyaXR5IEVycm9yIGZsYWcNCiAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgVVNBUlRfRkxBRyAoU0VUIG9yIFJFU0VUKS4NCiAgKi8NCkZsYWdTdGF0dXMgVVNBUlRfR2V0RmxhZ1N0YXR1cyhVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIHVpbnQxNl90IFVTQVJUX0ZMQUcpDQp7DQogIEZsYWdTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9BTExfUEVSSVBIKFVTQVJUeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfRkxBRyhVU0FSVF9GTEFHKSk7DQogIC8qIFRoZSBDVFMgZmxhZyBpcyBub3QgYXZhaWxhYmxlIGZvciBVQVJUNCBhbmQgVUFSVDUgKi8NCiAgaWYgKFVTQVJUX0ZMQUcgPT0gVVNBUlRfRkxBR19DVFMpDQogIHsNCiAgICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfMTIzX1BFUklQSChVU0FSVHgpKTsNCiAgfSAgDQogIA0KICBpZiAoKFVTQVJUeC0+U1IgJiBVU0FSVF9GTEFHKSAhPSAodWludDE2X3QpUkVTRVQpDQogIHsNCiAgICBiaXRzdGF0dXMgPSBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgYml0c3RhdHVzID0gUkVTRVQ7DQogIH0NCiAgcmV0dXJuIGJpdHN0YXR1czsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDbGVhcnMgdGhlIFVTQVJUeCdzIHBlbmRpbmcgZmxhZ3MuDQogICogQHBhcmFtICBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgb3IgdGhlIFVBUlQgcGVyaXBoZXJhbC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgVVNBUlQxLCBVU0FSVDIsIFVTQVJUMywgVUFSVDQgb3IgVUFSVDUuDQogICogQHBhcmFtICBVU0FSVF9GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2xlYXIuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFVTQVJUX0ZMQUdfQ1RTOiAgQ1RTIENoYW5nZSBmbGFnIChub3QgYXZhaWxhYmxlIGZvciBVQVJUNCBhbmQgVUFSVDUpLg0KICAqICAgICBAYXJnIFVTQVJUX0ZMQUdfTEJEOiAgTElOIEJyZWFrIGRldGVjdGlvbiBmbGFnLg0KICAqICAgICBAYXJnIFVTQVJUX0ZMQUdfVEM6ICAgVHJhbnNtaXNzaW9uIENvbXBsZXRlIGZsYWcuDQogICogICAgIEBhcmcgVVNBUlRfRkxBR19SWE5FOiBSZWNlaXZlIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGZsYWcuDQogICogICANCiAgKiBAbm90ZQ0KICAqICAgLSBQRSAoUGFyaXR5IGVycm9yKSwgRkUgKEZyYW1pbmcgZXJyb3IpLCBORSAoTm9pc2UgZXJyb3IpLCBPUkUgKE92ZXJSdW4gDQogICogICAgIGVycm9yKSBhbmQgSURMRSAoSWRsZSBsaW5lIGRldGVjdGVkKSBmbGFncyBhcmUgY2xlYXJlZCBieSBzb2Z0d2FyZSANCiAgKiAgICAgc2VxdWVuY2U6IGEgcmVhZCBvcGVyYXRpb24gdG8gVVNBUlRfU1IgcmVnaXN0ZXIgKFVTQVJUX0dldEZsYWdTdGF0dXMoKSkgDQogICogICAgIGZvbGxvd2VkIGJ5IGEgcmVhZCBvcGVyYXRpb24gdG8gVVNBUlRfRFIgcmVnaXN0ZXIgKFVTQVJUX1JlY2VpdmVEYXRhKCkpLg0KICAqICAgLSBSWE5FIGZsYWcgY2FuIGJlIGFsc28gY2xlYXJlZCBieSBhIHJlYWQgdG8gdGhlIFVTQVJUX0RSIHJlZ2lzdGVyIA0KICAqICAgICAoVVNBUlRfUmVjZWl2ZURhdGEoKSkuDQogICogICAtIFRDIGZsYWcgY2FuIGJlIGFsc28gY2xlYXJlZCBieSBzb2Z0d2FyZSBzZXF1ZW5jZTogYSByZWFkIG9wZXJhdGlvbiB0byANCiAgKiAgICAgVVNBUlRfU1IgcmVnaXN0ZXIgKFVTQVJUX0dldEZsYWdTdGF0dXMoKSkgZm9sbG93ZWQgYnkgYSB3cml0ZSBvcGVyYXRpb24NCiAgKiAgICAgdG8gVVNBUlRfRFIgcmVnaXN0ZXIgKFVTQVJUX1NlbmREYXRhKCkpLg0KICAqICAgLSBUWEUgZmxhZyBpcyBjbGVhcmVkIG9ubHkgYnkgYSB3cml0ZSB0byB0aGUgVVNBUlRfRFIgcmVnaXN0ZXIgDQogICogICAgIChVU0FSVF9TZW5kRGF0YSgpKS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVVNBUlRfQ2xlYXJGbGFnKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdWludDE2X3QgVVNBUlRfRkxBRykNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9DTEVBUl9GTEFHKFVTQVJUX0ZMQUcpKTsNCiAgLyogVGhlIENUUyBmbGFnIGlzIG5vdCBhdmFpbGFibGUgZm9yIFVBUlQ0IGFuZCBVQVJUNSAqLw0KICBpZiAoKFVTQVJUX0ZMQUcgJiBVU0FSVF9GTEFHX0NUUykgPT0gVVNBUlRfRkxBR19DVFMpDQogIHsNCiAgICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfMTIzX1BFUklQSChVU0FSVHgpKTsNCiAgfSANCiAgIA0KICBVU0FSVHgtPlNSID0gKHVpbnQxNl90KX5VU0FSVF9GTEFHOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgVVNBUlQgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuDQogICogQHBhcmFtICBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgb3IgdGhlIFVBUlQgcGVyaXBoZXJhbC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgVVNBUlQxLCBVU0FSVDIsIFVTQVJUMywgVUFSVDQgb3IgVUFSVDUuDQogICogQHBhcmFtICBVU0FSVF9JVDogc3BlY2lmaWVzIHRoZSBVU0FSVCBpbnRlcnJ1cHQgc291cmNlIHRvIGNoZWNrLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBVU0FSVF9JVF9DVFM6ICBDVFMgY2hhbmdlIGludGVycnVwdCAobm90IGF2YWlsYWJsZSBmb3IgVUFSVDQgYW5kIFVBUlQ1KQ0KICAqICAgICBAYXJnIFVTQVJUX0lUX0xCRDogIExJTiBCcmVhayBkZXRlY3Rpb24gaW50ZXJydXB0DQogICogICAgIEBhcmcgVVNBUlRfSVRfVFhFOiAgVGFuc21pdCBEYXRhIFJlZ2lzdGVyIGVtcHR5IGludGVycnVwdA0KICAqICAgICBAYXJnIFVTQVJUX0lUX1RDOiAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBVU0FSVF9JVF9SWE5FOiBSZWNlaXZlIERhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdA0KICAqICAgICBAYXJnIFVTQVJUX0lUX0lETEU6IElkbGUgbGluZSBkZXRlY3Rpb24gaW50ZXJydXB0DQogICogICAgIEBhcmcgVVNBUlRfSVRfT1JFOiAgT3ZlclJ1biBFcnJvciBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBVU0FSVF9JVF9ORTogICBOb2lzZSBFcnJvciBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBVU0FSVF9JVF9GRTogICBGcmFtaW5nIEVycm9yIGludGVycnVwdA0KICAqICAgICBAYXJnIFVTQVJUX0lUX1BFOiAgIFBhcml0eSBFcnJvciBpbnRlcnJ1cHQNCiAgKiBAcmV0dmFsIFRoZSBuZXcgc3RhdGUgb2YgVVNBUlRfSVQgKFNFVCBvciBSRVNFVCkuDQogICovDQpJVFN0YXR1cyBVU0FSVF9HZXRJVFN0YXR1cyhVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIHVpbnQxNl90IFVTQVJUX0lUKQ0Kew0KICB1aW50MzJfdCBiaXRwb3MgPSAweDAwLCBpdG1hc2sgPSAweDAwLCB1c2FydHJlZyA9IDB4MDA7DQogIElUU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUxMX1BFUklQSChVU0FSVHgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0dFVF9JVChVU0FSVF9JVCkpOw0KICAvKiBUaGUgQ1RTIGludGVycnVwdCBpcyBub3QgYXZhaWxhYmxlIGZvciBVQVJUNCBhbmQgVUFSVDUgKi8gDQogIGlmIChVU0FSVF9JVCA9PSBVU0FSVF9JVF9DVFMpDQogIHsNCiAgICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfMTIzX1BFUklQSChVU0FSVHgpKTsNCiAgfSAgIA0KICANCiAgLyogR2V0IHRoZSBVU0FSVCByZWdpc3RlciBpbmRleCAqLw0KICB1c2FydHJlZyA9ICgoKHVpbnQ4X3QpVVNBUlRfSVQpID4+IDB4MDUpOw0KICAvKiBHZXQgdGhlIGludGVycnVwdCBwb3NpdGlvbiAqLw0KICBpdG1hc2sgPSBVU0FSVF9JVCAmIElUX01hc2s7DQogIGl0bWFzayA9ICh1aW50MzJfdCkweDAxIDw8IGl0bWFzazsNCiAgDQogIGlmICh1c2FydHJlZyA9PSAweDAxKSAvKiBUaGUgSVQgIGlzIGluIENSMSByZWdpc3RlciAqLw0KICB7DQogICAgaXRtYXNrICY9IFVTQVJUeC0+Q1IxOw0KICB9DQogIGVsc2UgaWYgKHVzYXJ0cmVnID09IDB4MDIpIC8qIFRoZSBJVCAgaXMgaW4gQ1IyIHJlZ2lzdGVyICovDQogIHsNCiAgICBpdG1hc2sgJj0gVVNBUlR4LT5DUjI7DQogIH0NCiAgZWxzZSAvKiBUaGUgSVQgIGlzIGluIENSMyByZWdpc3RlciAqLw0KICB7DQogICAgaXRtYXNrICY9IFVTQVJUeC0+Q1IzOw0KICB9DQogIA0KICBiaXRwb3MgPSBVU0FSVF9JVCA+PiAweDA4Ow0KICBiaXRwb3MgPSAodWludDMyX3QpMHgwMSA8PCBiaXRwb3M7DQogIGJpdHBvcyAmPSBVU0FSVHgtPlNSOw0KICBpZiAoKGl0bWFzayAhPSAodWludDE2X3QpUkVTRVQpJiYoYml0cG9zICE9ICh1aW50MTZfdClSRVNFVCkpDQogIHsNCiAgICBiaXRzdGF0dXMgPSBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgYml0c3RhdHVzID0gUkVTRVQ7DQogIH0NCiAgDQogIHJldHVybiBiaXRzdGF0dXM7ICANCn0NCg0KLyoqDQogICogQGJyaWVmICBDbGVhcnMgdGhlIFVTQVJUeJJzIGludGVycnVwdCBwZW5kaW5nIGJpdHMuDQogICogQHBhcmFtICBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgb3IgdGhlIFVBUlQgcGVyaXBoZXJhbC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgVVNBUlQxLCBVU0FSVDIsIFVTQVJUMywgVUFSVDQgb3IgVUFSVDUuDQogICogQHBhcmFtICBVU0FSVF9JVDogc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgdG8gY2xlYXIuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFVTQVJUX0lUX0NUUzogIENUUyBjaGFuZ2UgaW50ZXJydXB0IChub3QgYXZhaWxhYmxlIGZvciBVQVJUNCBhbmQgVUFSVDUpDQogICogICAgIEBhcmcgVVNBUlRfSVRfTEJEOiAgTElOIEJyZWFrIGRldGVjdGlvbiBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBVU0FSVF9JVF9UQzogICBUcmFuc21pc3Npb24gY29tcGxldGUgaW50ZXJydXB0LiANCiAgKiAgICAgQGFyZyBVU0FSVF9JVF9SWE5FOiBSZWNlaXZlIERhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdC4NCiAgKiAgIA0KICAqIEBub3RlDQogICogICAtIFBFIChQYXJpdHkgZXJyb3IpLCBGRSAoRnJhbWluZyBlcnJvciksIE5FIChOb2lzZSBlcnJvciksIE9SRSAoT3ZlclJ1biANCiAgKiAgICAgZXJyb3IpIGFuZCBJRExFIChJZGxlIGxpbmUgZGV0ZWN0ZWQpIHBlbmRpbmcgYml0cyBhcmUgY2xlYXJlZCBieSANCiAgKiAgICAgc29mdHdhcmUgc2VxdWVuY2U6IGEgcmVhZCBvcGVyYXRpb24gdG8gVVNBUlRfU1IgcmVnaXN0ZXIgDQogICogICAgIChVU0FSVF9HZXRJVFN0YXR1cygpKSBmb2xsb3dlZCBieSBhIHJlYWQgb3BlcmF0aW9uIHRvIFVTQVJUX0RSIHJlZ2lzdGVyIA0KICAqICAgICAoVVNBUlRfUmVjZWl2ZURhdGEoKSkuDQogICogICAtIFJYTkUgcGVuZGluZyBiaXQgY2FuIGJlIGFsc28gY2xlYXJlZCBieSBhIHJlYWQgdG8gdGhlIFVTQVJUX0RSIHJlZ2lzdGVyIA0KICAqICAgICAoVVNBUlRfUmVjZWl2ZURhdGEoKSkuDQogICogICAtIFRDIHBlbmRpbmcgYml0IGNhbiBiZSBhbHNvIGNsZWFyZWQgYnkgc29mdHdhcmUgc2VxdWVuY2U6IGEgcmVhZCANCiAgKiAgICAgb3BlcmF0aW9uIHRvIFVTQVJUX1NSIHJlZ2lzdGVyIChVU0FSVF9HZXRJVFN0YXR1cygpKSBmb2xsb3dlZCBieSBhIHdyaXRlIA0KICAqICAgICBvcGVyYXRpb24gdG8gVVNBUlRfRFIgcmVnaXN0ZXIgKFVTQVJUX1NlbmREYXRhKCkpLg0KICAqICAgLSBUWEUgcGVuZGluZyBiaXQgaXMgY2xlYXJlZCBvbmx5IGJ5IGEgd3JpdGUgdG8gdGhlIFVTQVJUX0RSIHJlZ2lzdGVyIA0KICAqICAgICAoVVNBUlRfU2VuZERhdGEoKSkuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFVTQVJUX0NsZWFySVRQZW5kaW5nQml0KFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdWludDE2X3QgVVNBUlRfSVQpDQp7DQogIHVpbnQxNl90IGJpdHBvcyA9IDB4MDAsIGl0bWFzayA9IDB4MDA7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9BTExfUEVSSVBIKFVTQVJUeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQ0xFQVJfSVQoVVNBUlRfSVQpKTsNCiAgLyogVGhlIENUUyBpbnRlcnJ1cHQgaXMgbm90IGF2YWlsYWJsZSBmb3IgVUFSVDQgYW5kIFVBUlQ1ICovDQogIGlmIChVU0FSVF9JVCA9PSBVU0FSVF9JVF9DVFMpDQogIHsNCiAgICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfMTIzX1BFUklQSChVU0FSVHgpKTsNCiAgfSAgIA0KICANCiAgYml0cG9zID0gVVNBUlRfSVQgPj4gMHgwODsNCiAgaXRtYXNrID0gKCh1aW50MTZfdCkweDAxIDw8ICh1aW50MTZfdCliaXRwb3MpOw0KICBVU0FSVHgtPlNSID0gKHVpbnQxNl90KX5pdG1hc2s7DQp9DQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKioqKioqKioqKioqKioqKioqKiAoQykgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzICoqKioqRU5EIE9GIEZJTEUqKioqLw0K