LyoqDQogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KICAqIEBmaWxlICAgIHN0bTMybDF4eF91c2FydC5jDQogICogQGF1dGhvciAgTUNEIEFwcGxpY2F0aW9uIFRlYW0NCiAgKiBAdmVyc2lvbiBWMS4wLjBSQzENCiAgKiBAZGF0ZSAgICAwNy8wMi8yMDEwDQogICogQGJyaWVmICAgVGhpcyBmaWxlIHByb3ZpZGVzIGFsbCB0aGUgVVNBUlQgZmlybXdhcmUgZnVuY3Rpb25zLg0KICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiAgKiBAY29weQ0KICAqDQogICogVEhFIFBSRVNFTlQgRklSTVdBUkUgV0hJQ0ggSVMgRk9SIEdVSURBTkNFIE9OTFkgQUlNUyBBVCBQUk9WSURJTkcgQ1VTVE9NRVJTDQogICogV0lUSCBDT0RJTkcgSU5GT1JNQVRJT04gUkVHQVJESU5HIFRIRUlSIFBST0RVQ1RTIElOIE9SREVSIEZPUiBUSEVNIFRPIFNBVkUNCiAgKiBUSU1FLiBBUyBBIFJFU1VMVCwgU1RNSUNST0VMRUNUUk9OSUNTIFNIQUxMIE5PVCBCRSBIRUxEIExJQUJMRSBGT1IgQU5ZDQogICogRElSRUNULCBJTkRJUkVDVCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgV0lUSCBSRVNQRUNUIFRPIEFOWSBDTEFJTVMgQVJJU0lORw0KICAqIEZST00gVEhFIENPTlRFTlQgT0YgU1VDSCBGSVJNV0FSRSBBTkQvT1IgVEhFIFVTRSBNQURFIEJZIENVU1RPTUVSUyBPRiBUSEUNCiAgKiBDT0RJTkcgSU5GT1JNQVRJT04gQ09OVEFJTkVEIEhFUkVJTiBJTiBDT05ORUNUSU9OIFdJVEggVEhFSVIgUFJPRFVDVFMuDQogICoNCiAgKiA8aDI+PGNlbnRlcj4mY29weTsgQ09QWVJJR0hUIDIwMTAgU1RNaWNyb2VsZWN0cm9uaWNzPC9jZW50ZXI+PC9oMj4NCiAgKi8gDQoNCi8qIEluY2x1ZGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQojaW5jbHVkZSAic3RtMzJsMXh4X3VzYXJ0LmgiDQojaW5jbHVkZSAic3RtMzJsMXh4X3JjYy5oIg0KDQovKiogQGFkZHRvZ3JvdXAgU1RNMzJMMXh4X1N0ZFBlcmlwaF9Ecml2ZXINCiAgKiBAew0KICAqLw0KDQovKiogQGRlZmdyb3VwIFVTQVJUIA0KICAqIEBicmllZiBVU0FSVCBkcml2ZXIgbW9kdWxlcw0KICAqIEB7DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgVVNBUlRfUHJpdmF0ZV9UeXBlc0RlZmluaXRpb25zDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBVU0FSVF9Qcml2YXRlX0RlZmluZXMNCiAgKiBAew0KICAqLw0KDQovKiE8IFVTQVJUIENSMSByZWdpc3RlciBjbGVhciBNYXNrICgofih1aW50MTZfdCkweEU5RjMpKSAqLw0KI2RlZmluZSBDUjFfQ0xFQVJfTUFTSyAgICAgICAgICAgICgodWludDE2X3QpKFVTQVJUX0NSMV9NIHwgVVNBUlRfQ1IxX1BDRSB8IFwNCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0FSVF9DUjFfUFMgfCBVU0FSVF9DUjFfVEUgfCBcDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNBUlRfQ1IxX1JFKSkNCg0KLyohPCBVU0FSVCBDUjIgcmVnaXN0ZXIgY2xvY2sgYml0cyBjbGVhciBNYXNrICgofih1aW50MTZfdCkweEYwRkYpKSAqLw0KI2RlZmluZSBDUjJfQ0xPQ0tfQ0xFQVJfTUFTSyAgICAgICgodWludDE2X3QpKFVTQVJUX0NSMl9DTEtFTiB8IFVTQVJUX0NSMl9DUE9MIHwgXA0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTQVJUX0NSMl9DUEhBIHwgVVNBUlRfQ1IyX0xCQ0wpKQ0KDQovKiE8IFVTQVJUIENSMyByZWdpc3RlciBjbGVhciBNYXNrICgofih1aW50MTZfdCkweEZDRkYpKSAqLw0KI2RlZmluZSBDUjNfQ0xFQVJfTUFTSyAgICAgICAgICAgICgodWludDE2X3QpKFVTQVJUX0NSM19SVFNFIHwgVVNBUlRfQ1IzX0NUU0UpKQ0KDQovKiE8IFVTQVJUIEludGVycnVwdHMgbWFzayAqLw0KI2RlZmluZSBJVF9NQVNLICAgICAgICAgICAgICAgICAgICgodWludDE2X3QpMHgwMDFGKQ0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIFVTQVJUX1ByaXZhdGVfTWFjcm9zDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQH0NCiAgKi8NCg0KLyoqIEBkZWZncm91cCBVU0FSVF9Qcml2YXRlX1ZhcmlhYmxlcw0KICAqIEB7DQogICovDQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKiBAZGVmZ3JvdXAgVVNBUlRfUHJpdmF0ZV9GdW5jdGlvblByb3RvdHlwZXMNCiAgKiBAew0KICAqLw0KDQovKioNCiAgKiBAfQ0KICAqLw0KDQovKiogQGRlZmdyb3VwIFVTQVJUX1ByaXZhdGVfRnVuY3Rpb25zDQogICogQHsNCiAgKi8NCg0KLyoqDQogICogQGJyaWVmICBEZWluaXRpYWxpemVzIHRoZSBVU0FSVHggcGVyaXBoZXJhbCByZWdpc3RlcnMgdG8gdGhlaXIgZGVmYXVsdCByZXNldCB2YWx1ZXMuDQogICogQHBhcmFtICBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgcGVyaXBoZXJhbC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiBVU0FSVDEsIFVTQVJUMiBvciBVU0FSVDMuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFVTQVJUX0RlSW5pdChVU0FSVF9UeXBlRGVmKiBVU0FSVHgpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9BTExfUEVSSVBIKFVTQVJUeCkpOw0KDQogIGlmIChVU0FSVHggPT0gVVNBUlQxKQ0KICB7DQogICAgUkNDX0FQQjJQZXJpcGhSZXNldENtZChSQ0NfQVBCMlBlcmlwaF9VU0FSVDEsIEVOQUJMRSk7DQogICAgUkNDX0FQQjJQZXJpcGhSZXNldENtZChSQ0NfQVBCMlBlcmlwaF9VU0FSVDEsIERJU0FCTEUpOw0KICB9DQogIGVsc2UgaWYgKFVTQVJUeCA9PSBVU0FSVDIpDQogIHsNCiAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1VTQVJUMiwgRU5BQkxFKTsNCiAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX1VTQVJUMiwgRElTQUJMRSk7DQogIH0NCiAgZWxzZSANCiAgew0KICAgIGlmIChVU0FSVHggPT0gVVNBUlQzKQ0KICAgIHsNCiAgICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfVVNBUlQzLCBFTkFCTEUpOw0KICAgICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9VU0FSVDMsIERJU0FCTEUpOyAgICANCiAgICB9DQogIH0gICAgDQp9DQoNCi8qKg0KICAqIEBicmllZiAgSW5pdGlhbGl6ZXMgdGhlIFVTQVJUeCBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQogICogICBwYXJhbWV0ZXJzIGluIHRoZSBVU0FSVF9Jbml0U3RydWN0IC4NCiAgKiBAcGFyYW0gIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBwZXJpcGhlcmFsLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICBVU0FSVDEsIFVTQVJUMiBvciBVU0FSVDMuDQogICogQHBhcmFtICBVU0FSVF9Jbml0U3RydWN0OiBwb2ludGVyIHRvIGEgVVNBUlRfSW5pdFR5cGVEZWYgc3RydWN0dXJlDQogICogICB0aGF0IGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIFVTQVJUIHBlcmlwaGVyYWwuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFVTQVJUX0luaXQoVVNBUlRfVHlwZURlZiogVVNBUlR4LCBVU0FSVF9Jbml0VHlwZURlZiogVVNBUlRfSW5pdFN0cnVjdCkNCnsNCiAgdWludDMyX3QgdG1wcmVnID0gMHgwMCwgYXBiY2xvY2sgPSAweDAwOw0KICB1aW50MzJfdCBpbnRlZ2VyZGl2aWRlciA9IDB4MDA7DQogIHVpbnQzMl90IGZyYWN0aW9uYWxkaXZpZGVyID0gMHgwMDsNCiAgUkNDX0Nsb2Nrc1R5cGVEZWYgUkNDX0Nsb2Nrc1N0YXR1czsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUxMX1BFUklQSChVU0FSVHgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0JBVURSQVRFKFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX0JhdWRSYXRlKSk7ICANCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX1dPUkRfTEVOR1RIKFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX1dvcmRMZW5ndGgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX1NUT1BCSVRTKFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX1N0b3BCaXRzKSk7DQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9QQVJJVFkoVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfUGFyaXR5KSk7DQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9NT0RFKFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX01vZGUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0hBUkRXQVJFX0ZMT1dfQ09OVFJPTChVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9IYXJkd2FyZUZsb3dDb250cm9sKSk7DQogIA0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIENSMiBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgdG1wcmVnID0gVVNBUlR4LT5DUjI7DQogIC8qIENsZWFyIFNUT1BbMTM6MTJdIGJpdHMgKi8NCiAgdG1wcmVnICY9ICh1aW50MzJfdCl+KCh1aW50MzJfdClVU0FSVF9DUjJfU1RPUCk7DQoNCiAgLyogQ29uZmlndXJlIHRoZSBVU0FSVCBTdG9wIEJpdHMsIENsb2NrLCBDUE9MLCBDUEhBIGFuZCBMYXN0Qml0IC0tLS0tLS0tLS0tLSovDQogIC8qIFNldCBTVE9QWzEzOjEyXSBiaXRzIGFjY29yZGluZyB0byBVU0FSVF9TdG9wQml0cyB2YWx1ZSAqLw0KICB0bXByZWcgfD0gKHVpbnQzMl90KVVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX1N0b3BCaXRzOw0KICANCiAgLyogV3JpdGUgdG8gVVNBUlQgQ1IyICovDQogIFVTQVJUeC0+Q1IyID0gKHVpbnQxNl90KXRtcHJlZzsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIFVTQVJUIENSMSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgdG1wcmVnID0gVVNBUlR4LT5DUjE7DQogIC8qIENsZWFyIE0sIFBDRSwgUFMsIFRFIGFuZCBSRSBiaXRzICovDQogIHRtcHJlZyAmPSAodWludDMyX3QpfigodWludDMyX3QpQ1IxX0NMRUFSX01BU0spOw0KDQogIC8qIENvbmZpZ3VyZSB0aGUgVVNBUlQgV29yZCBMZW5ndGgsIFBhcml0eSBhbmQgbW9kZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLw0KICAvKiBTZXQgdGhlIE0gYml0cyBhY2NvcmRpbmcgdG8gVVNBUlRfV29yZExlbmd0aCB2YWx1ZSAqLw0KICAvKiBTZXQgUENFIGFuZCBQUyBiaXRzIGFjY29yZGluZyB0byBVU0FSVF9QYXJpdHkgdmFsdWUgKi8NCiAgLyogU2V0IFRFIGFuZCBSRSBiaXRzIGFjY29yZGluZyB0byBVU0FSVF9Nb2RlIHZhbHVlICovDQogIHRtcHJlZyB8PSAodWludDMyX3QpVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfV29yZExlbmd0aCB8IFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX1Bhcml0eSB8DQogICAgICAgICAgICBVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9Nb2RlOw0KDQogIC8qIFdyaXRlIHRvIFVTQVJUIENSMSAqLw0KICBVU0FSVHgtPkNSMSA9ICh1aW50MTZfdCl0bXByZWc7DQoNCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBDUjMgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovICANCiAgdG1wcmVnID0gVVNBUlR4LT5DUjM7DQogIC8qIENsZWFyIENUU0UgYW5kIFJUU0UgYml0cyAqLw0KICB0bXByZWcgJj0gKHVpbnQzMl90KX4oKHVpbnQzMl90KUNSM19DTEVBUl9NQVNLKTsNCg0KICAvKiBDb25maWd1cmUgdGhlIFVTQVJUIEhGQyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgLyogU2V0IENUU0UgYW5kIFJUU0UgYml0cyBhY2NvcmRpbmcgdG8gVVNBUlRfSGFyZHdhcmVGbG93Q29udHJvbCB2YWx1ZSAqLw0KICB0bXByZWcgfD0gVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfSGFyZHdhcmVGbG93Q29udHJvbDsNCg0KICAvKiBXcml0ZSB0byBVU0FSVCBDUjMgKi8NCiAgVVNBUlR4LT5DUjMgPSAodWludDE2X3QpdG1wcmVnOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gVVNBUlQgQlJSIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICAvKiBDb25maWd1cmUgdGhlIFVTQVJUIEJhdWQgUmF0ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgUkNDX0dldENsb2Nrc0ZyZXEoJlJDQ19DbG9ja3NTdGF0dXMpOw0KICBpZiAoVVNBUlR4ID09IFVTQVJUMSkgDQogIHsNCiAgICBhcGJjbG9jayA9IFJDQ19DbG9ja3NTdGF0dXMuUENMSzJfRnJlcXVlbmN5Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIGFwYmNsb2NrID0gUkNDX0Nsb2Nrc1N0YXR1cy5QQ0xLMV9GcmVxdWVuY3k7DQogIH0NCg0KICAvKiBEZXRlcm1pbmUgdGhlIGludGVnZXIgcGFydCAqLw0KICBpZiAoKFVTQVJUeC0+Q1IxICYgVVNBUlRfQ1IxX09WRVI4KSAhPSAwKQ0KICB7DQogICAgLyogSW50ZWdlciBwYXJ0IGNvbXB1dGluZyBpbiBjYXNlIE92ZXJzYW1wbGluZyBtb2RlIGlzIDggU2FtcGxlcyAqLw0KICAgIGludGVnZXJkaXZpZGVyID0gKCgyNSAqIGFwYmNsb2NrKSAvICgyICogKFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX0JhdWRSYXRlKSkpOyAgICANCiAgfQ0KICBlbHNlIC8qIGlmICgoVVNBUlR4LT5DUjEgJiBDUjFfT1ZFUjhfU2V0KSA9PSAwKSAqLw0KICB7DQogICAgLyogSW50ZWdlciBwYXJ0IGNvbXB1dGluZyBpbiBjYXNlIE92ZXJzYW1wbGluZyBtb2RlIGlzIDE2IFNhbXBsZXMgKi8NCiAgICBpbnRlZ2VyZGl2aWRlciA9ICgoMjUgKiBhcGJjbG9jaykgLyAoNCAqIChVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9CYXVkUmF0ZSkpKTsgICAgDQogIH0NCiAgdG1wcmVnID0gKGludGVnZXJkaXZpZGVyIC8gMTAwKSA8PCA0Ow0KDQogIC8qIERldGVybWluZSB0aGUgZnJhY3Rpb25hbCBwYXJ0ICovDQogIGZyYWN0aW9uYWxkaXZpZGVyID0gaW50ZWdlcmRpdmlkZXIgLSAoMTAwICogKHRtcHJlZyA+PiA0KSk7DQoNCiAgLyogSW1wbGVtZW50IHRoZSBmcmFjdGlvbmFsIHBhcnQgaW4gdGhlIHJlZ2lzdGVyICovDQogIGlmICgoVVNBUlR4LT5DUjEgJiBVU0FSVF9DUjFfT1ZFUjgpICE9IDApDQogIHsNCiAgICB0bXByZWcgfD0gKCgoKGZyYWN0aW9uYWxkaXZpZGVyICogOCkgKyA1MCkgLyAxMDApKSAmICgodWludDhfdCkweDA3KTsNCiAgfQ0KICBlbHNlIC8qIGlmICgoVVNBUlR4LT5DUjEgJiBDUjFfT1ZFUjhfU2V0KSA9PSAwKSAqLw0KICB7DQogICAgdG1wcmVnIHw9ICgoKChmcmFjdGlvbmFsZGl2aWRlciAqIDE2KSArIDUwKSAvIDEwMCkpICYgKCh1aW50OF90KTB4MEYpOw0KICB9DQogDQogIC8qIFdyaXRlIHRvIFVTQVJUIEJSUiAqLw0KICBVU0FSVHgtPkJSUiA9ICh1aW50MTZfdCl0bXByZWc7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRmlsbHMgZWFjaCBVU0FSVF9Jbml0U3RydWN0IG1lbWJlciB3aXRoIGl0cyBkZWZhdWx0IHZhbHVlLg0KICAqIEBwYXJhbSAgVVNBUlRfSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIFVTQVJUX0luaXRUeXBlRGVmIHN0cnVjdHVyZQ0KICAqICAgd2hpY2ggd2lsbCBiZSBpbml0aWFsaXplZC4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVVNBUlRfU3RydWN0SW5pdChVU0FSVF9Jbml0VHlwZURlZiogVVNBUlRfSW5pdFN0cnVjdCkNCnsNCiAgLyogVVNBUlRfSW5pdFN0cnVjdCBtZW1iZXJzIGRlZmF1bHQgdmFsdWUgKi8NCiAgVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfQmF1ZFJhdGUgPSA5NjAwOw0KICBVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9Xb3JkTGVuZ3RoID0gVVNBUlRfV29yZExlbmd0aF84YjsNCiAgVVNBUlRfSW5pdFN0cnVjdC0+VVNBUlRfU3RvcEJpdHMgPSBVU0FSVF9TdG9wQml0c18xOw0KICBVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9QYXJpdHkgPSBVU0FSVF9QYXJpdHlfTm8gOw0KICBVU0FSVF9Jbml0U3RydWN0LT5VU0FSVF9Nb2RlID0gVVNBUlRfTW9kZV9SeCB8IFVTQVJUX01vZGVfVHg7DQogIFVTQVJUX0luaXRTdHJ1Y3QtPlVTQVJUX0hhcmR3YXJlRmxvd0NvbnRyb2wgPSBVU0FSVF9IYXJkd2FyZUZsb3dDb250cm9sX05vbmU7ICANCn0NCg0KLyoqDQogICogQGJyaWVmICBJbml0aWFsaXplcyB0aGUgVVNBUlR4IHBlcmlwaGVyYWwgQ2xvY2sgYWNjb3JkaW5nIHRvIHRoZSANCiAgKiAgIHNwZWNpZmllZCBwYXJhbWV0ZXJzIGluIHRoZSBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QgLg0KICAqIEBwYXJhbSAgVVNBUlR4OiB3aGVyZSB4IGNhbiBiZSAxLCAyLCAzIHRvIHNlbGVjdCB0aGUgVVNBUlQgcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFVTQVJUX0Nsb2NrSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIFVTQVJUX0Nsb2NrSW5pdFR5cGVEZWYNCiAgKiAgIHN0cnVjdHVyZSB0aGF0IGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUgc3BlY2lmaWVkIA0KICAqICAgVVNBUlQgcGVyaXBoZXJhbC4gIA0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBVU0FSVF9DbG9ja0luaXQoVVNBUlRfVHlwZURlZiogVVNBUlR4LCBVU0FSVF9DbG9ja0luaXRUeXBlRGVmKiBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QpDQp7DQogIHVpbnQzMl90IHRtcHJlZyA9IDB4MDA7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9BTExfUEVSSVBIKFVTQVJUeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQ0xPQ0soVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5VU0FSVF9DbG9jaykpOw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQ1BPTChVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPlVTQVJUX0NQT0wpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0NQSEEoVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5VU0FSVF9DUEhBKSk7DQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9MQVNUQklUKFVTQVJUX0Nsb2NrSW5pdFN0cnVjdC0+VVNBUlRfTGFzdEJpdCkpOw0KICANCi8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBVU0FSVCBDUjIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQogIHRtcHJlZyA9IFVTQVJUeC0+Q1IyOw0KICAvKiBDbGVhciBDTEtFTiwgQ1BPTCwgQ1BIQSBhbmQgTEJDTCBiaXRzICovDQogIHRtcHJlZyAmPSAodWludDMyX3QpfigodWludDMyX3QpQ1IyX0NMT0NLX0NMRUFSX01BU0spOw0KICAvKiBDb25maWd1cmUgdGhlIFVTQVJUIENsb2NrLCBDUE9MLCBDUEhBIGFuZCBMYXN0Qml0IC0tLS0tLS0tLS0tLSovDQogIC8qIFNldCBDTEtFTiBiaXQgYWNjb3JkaW5nIHRvIFVTQVJUX0Nsb2NrIHZhbHVlICovDQogIC8qIFNldCBDUE9MIGJpdCBhY2NvcmRpbmcgdG8gVVNBUlRfQ1BPTCB2YWx1ZSAqLw0KICAvKiBTZXQgQ1BIQSBiaXQgYWNjb3JkaW5nIHRvIFVTQVJUX0NQSEEgdmFsdWUgKi8NCiAgLyogU2V0IExCQ0wgYml0IGFjY29yZGluZyB0byBVU0FSVF9MYXN0Qml0IHZhbHVlICovDQogIHRtcHJlZyB8PSAodWludDMyX3QpVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5VU0FSVF9DbG9jayB8IFVTQVJUX0Nsb2NrSW5pdFN0cnVjdC0+VVNBUlRfQ1BPTCB8IA0KICAgICAgICAgICAgICAgICBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPlVTQVJUX0NQSEEgfCBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPlVTQVJUX0xhc3RCaXQ7DQogIC8qIFdyaXRlIHRvIFVTQVJUIENSMiAqLw0KICBVU0FSVHgtPkNSMiA9ICh1aW50MTZfdCl0bXByZWc7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRmlsbHMgZWFjaCBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QgbWVtYmVyIHdpdGggaXRzIGRlZmF1bHQgdmFsdWUuDQogICogQHBhcmFtICBVU0FSVF9DbG9ja0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBVU0FSVF9DbG9ja0luaXRUeXBlRGVmDQogICogICBzdHJ1Y3R1cmUgd2hpY2ggd2lsbCBiZSBpbml0aWFsaXplZC4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVVNBUlRfQ2xvY2tTdHJ1Y3RJbml0KFVTQVJUX0Nsb2NrSW5pdFR5cGVEZWYqIFVTQVJUX0Nsb2NrSW5pdFN0cnVjdCkNCnsNCiAgLyogVVNBUlRfQ2xvY2tJbml0U3RydWN0IG1lbWJlcnMgZGVmYXVsdCB2YWx1ZSAqLw0KICBVU0FSVF9DbG9ja0luaXRTdHJ1Y3QtPlVTQVJUX0Nsb2NrID0gVVNBUlRfQ2xvY2tfRGlzYWJsZTsNCiAgVVNBUlRfQ2xvY2tJbml0U3RydWN0LT5VU0FSVF9DUE9MID0gVVNBUlRfQ1BPTF9Mb3c7DQogIFVTQVJUX0Nsb2NrSW5pdFN0cnVjdC0+VVNBUlRfQ1BIQSA9IFVTQVJUX0NQSEFfMUVkZ2U7DQogIFVTQVJUX0Nsb2NrSW5pdFN0cnVjdC0+VVNBUlRfTGFzdEJpdCA9IFVTQVJUX0xhc3RCaXRfRGlzYWJsZTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgVVNBUlQgcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBwZXJpcGhlcmFsLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICBVU0FSVDEsIFVTQVJUMiBvciBVU0FSVDMuDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBVU0FSVHggcGVyaXBoZXJhbC4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFVTQVJUX0NtZChVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIA0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgVVNBUlQgYnkgc2V0dGluZyB0aGUgVUUgYml0IGluIHRoZSBDUjEgcmVnaXN0ZXIgKi8NCiAgICBVU0FSVHgtPkNSMSB8PSBVU0FSVF9DUjFfVUU7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgVVNBUlQgYnkgY2xlYXJpbmcgdGhlIFVFIGJpdCBpbiB0aGUgQ1IxIHJlZ2lzdGVyICovDQogICAgVVNBUlR4LT5DUjEgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVVTQVJUX0NSMV9VRSk7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgVVNBUlQgaW50ZXJydXB0cy4NCiAgKiBAcGFyYW0gIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBwZXJpcGhlcmFsLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICBVU0FSVDEsIFVTQVJUMiBvciBVU0FSVDMuDQogICogQHBhcmFtICBVU0FSVF9JVDogc3BlY2lmaWVzIHRoZSBVU0FSVCBpbnRlcnJ1cHQgc291cmNlcyB0byBiZSBlbmFibGVkIG9yIGRpc2FibGVkLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBVU0FSVF9JVF9DVFM6ICBDVFMgY2hhbmdlIGludGVycnVwdCAobm90IGF2YWlsYWJsZSBmb3IgVUFSVDQgYW5kIFVBUlQ1KQ0KICAqICAgICBAYXJnIFVTQVJUX0lUX0xCRDogIExJTiBCcmVhayBkZXRlY3Rpb24gaW50ZXJydXB0DQogICogICAgIEBhcmcgVVNBUlRfSVRfVFhFOiAgVGFuc21pdCBEYXRhIFJlZ2lzdGVyIGVtcHR5IGludGVycnVwdA0KICAqICAgICBAYXJnIFVTQVJUX0lUX1RDOiAgIFRyYW5zbWlzc2lvbiBjb21wbGV0ZSBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBVU0FSVF9JVF9SWE5FOiBSZWNlaXZlIERhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGludGVycnVwdA0KICAqICAgICBAYXJnIFVTQVJUX0lUX0lETEU6IElkbGUgbGluZSBkZXRlY3Rpb24gaW50ZXJydXB0DQogICogICAgIEBhcmcgVVNBUlRfSVRfUEU6ICAgUGFyaXR5IEVycm9yIGludGVycnVwdA0KICAqICAgICBAYXJnIFVTQVJUX0lUX0VSUjogIEVycm9yIGludGVycnVwdChGcmFtZSBlcnJvciwgbm9pc2UgZXJyb3IsIG92ZXJydW4gZXJyb3IpDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBzcGVjaWZpZWQgVVNBUlR4IGludGVycnVwdHMuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBVU0FSVF9JVENvbmZpZyhVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIHVpbnQxNl90IFVTQVJUX0lULCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIHVpbnQzMl90IHVzYXJ0cmVnID0gMHgwMCwgaXRwb3MgPSAweDAwLCBpdG1hc2sgPSAweDAwOw0KICB1aW50MzJfdCB1c2FydHhiYXNlID0gMHgwMDsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9DT05GSUdfSVQoVVNBUlRfSVQpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgDQogIHVzYXJ0eGJhc2UgPSAodWludDMyX3QpVVNBUlR4Ow0KDQogIC8qIEdldCB0aGUgVVNBUlQgcmVnaXN0ZXIgaW5kZXggKi8NCiAgdXNhcnRyZWcgPSAoKCh1aW50OF90KVVTQVJUX0lUKSA+PiAweDA1KTsNCg0KICAvKiBHZXQgdGhlIGludGVycnVwdCBwb3NpdGlvbiAqLw0KICBpdHBvcyA9IFVTQVJUX0lUICYgSVRfTUFTSzsNCiAgaXRtYXNrID0gKCgodWludDMyX3QpMHgwMSkgPDwgaXRwb3MpOw0KICAgIA0KICBpZiAodXNhcnRyZWcgPT0gMHgwMSkgLyogVGhlIElUIGlzIGluIENSMSByZWdpc3RlciAqLw0KICB7DQogICAgdXNhcnR4YmFzZSArPSAweDBDOw0KICB9DQogIGVsc2UgaWYgKHVzYXJ0cmVnID09IDB4MDIpIC8qIFRoZSBJVCBpcyBpbiBDUjIgcmVnaXN0ZXIgKi8NCiAgew0KICAgIHVzYXJ0eGJhc2UgKz0gMHgxMDsNCiAgfQ0KICBlbHNlIC8qIFRoZSBJVCBpcyBpbiBDUjMgcmVnaXN0ZXIgKi8NCiAgew0KICAgIHVzYXJ0eGJhc2UgKz0gMHgxNDsgDQogIH0NCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAqKF9fSU8gdWludDMyX3QqKXVzYXJ0eGJhc2UgIHw9IGl0bWFzazsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAqKF9fSU8gdWludDMyX3QqKXVzYXJ0eGJhc2UgJj0gfml0bWFzazsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFVTQVJUknMgRE1BIGludGVyZmFjZS4NCiAgKiBAcGFyYW0gIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBwZXJpcGhlcmFsLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICBVU0FSVDEsIFVTQVJUMiBvciBVU0FSVDMuDQogICogQHBhcmFtICBVU0FSVF9ETUFSZXE6IHNwZWNpZmllcyB0aGUgRE1BIHJlcXVlc3QuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgYW55IGNvbWJpbmF0aW9uIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFVTQVJUX0RNQVJlcV9UeDogVVNBUlQgRE1BIHRyYW5zbWl0IHJlcXVlc3QNCiAgKiAgICAgQGFyZyBVU0FSVF9ETUFSZXFfUng6IFVTQVJUIERNQSByZWNlaXZlIHJlcXVlc3QNCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIERNQSBSZXF1ZXN0IHNvdXJjZXMuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEBub3RlIFRoZSBETUEgbW9kZSBpcyBub3QgYXZhaWxhYmxlIGZvciBVQVJUNS4gIA0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBVU0FSVF9ETUFDbWQoVVNBUlRfVHlwZURlZiogVVNBUlR4LCB1aW50MTZfdCBVU0FSVF9ETUFSZXEsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9ETUFSRVEoVVNBUlRfRE1BUmVxKSk7ICANCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsgDQoNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIERNQSB0cmFuc2ZlciBmb3Igc2VsZWN0ZWQgcmVxdWVzdHMgYnkgc2V0dGluZyB0aGUgRE1BVCBhbmQvb3INCiAgICAgICBETUFSIGJpdHMgaW4gdGhlIFVTQVJUIENSMyByZWdpc3RlciAqLw0KICAgIFVTQVJUeC0+Q1IzIHw9IFVTQVJUX0RNQVJlcTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBETUEgdHJhbnNmZXIgZm9yIHNlbGVjdGVkIHJlcXVlc3RzIGJ5IGNsZWFyaW5nIHRoZSBETUFUIGFuZC9vcg0KICAgICAgIERNQVIgYml0cyBpbiB0aGUgVVNBUlQgQ1IzIHJlZ2lzdGVyICovDQogICAgVVNBUlR4LT5DUjMgJj0gKHVpbnQxNl90KX5VU0FSVF9ETUFSZXE7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBTZXRzIHRoZSBhZGRyZXNzIG9mIHRoZSBVU0FSVCBub2RlLg0KICAqIEBwYXJhbSAgVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIHBlcmlwaGVyYWwuIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgIFVTQVJUMSwgVVNBUlQyIG9yIFVTQVJUMy4NCiAgKiBAcGFyYW0gIFVTQVJUX0FkZHJlc3M6IEluZGljYXRlcyB0aGUgYWRkcmVzcyBvZiB0aGUgVVNBUlQgbm9kZS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVVNBUlRfU2V0QWRkcmVzcyhVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIHVpbnQ4X3QgVVNBUlRfQWRkcmVzcykNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9BRERSRVNTKFVTQVJUX0FkZHJlc3MpKTsgDQogICAgDQogIC8qIENsZWFyIHRoZSBVU0FSVCBhZGRyZXNzICovDQogIFVTQVJUeC0+Q1IyICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClVU0FSVF9DUjJfQUREKTsNCiAgLyogU2V0IHRoZSBVU0FSVCBhZGRyZXNzIG5vZGUgKi8NCiAgVVNBUlR4LT5DUjIgfD0gVVNBUlRfQWRkcmVzczsNCn0NCg0KLyoqDQogICogQGJyaWVmICBTZWxlY3RzIHRoZSBVU0FSVCBXYWtlVXAgbWV0aG9kLg0KICAqIEBwYXJhbSAgVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIHBlcmlwaGVyYWwuIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgIFVTQVJUMSwgVVNBUlQyIG9yIFVTQVJUMy4NCiAgKiBAcGFyYW0gIFVTQVJUX1dha2VVcDogc3BlY2lmaWVzIHRoZSBVU0FSVCB3YWtldXAgbWV0aG9kLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBVU0FSVF9XYWtlVXBfSWRsZUxpbmU6IFdha2VVcCBieSBhbiBpZGxlIGxpbmUgZGV0ZWN0aW9uDQogICogICAgIEBhcmcgVVNBUlRfV2FrZVVwX0FkZHJlc3NNYXJrOiBXYWtlVXAgYnkgYW4gYWRkcmVzcyBtYXJrDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFVTQVJUX1dha2VVcENvbmZpZyhVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIHVpbnQxNl90IFVTQVJUX1dha2VVcCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9XQUtFVVAoVVNBUlRfV2FrZVVwKSk7DQogIA0KICBVU0FSVHgtPkNSMSAmPSAodWludDE2X3QpfigodWludDE2X3QpVVNBUlRfQ1IxX1dBS0UpOw0KICBVU0FSVHgtPkNSMSB8PSBVU0FSVF9XYWtlVXA7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRGV0ZXJtaW5lcyBpZiB0aGUgVVNBUlQgaXMgaW4gbXV0ZSBtb2RlIG9yIG5vdC4NCiAgKiBAcGFyYW0gIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBwZXJpcGhlcmFsLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICBVU0FSVDEsIFVTQVJUMiBvciBVU0FSVDMuDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBVU0FSVCBtdXRlIG1vZGUuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBVU0FSVF9SZWNlaXZlcldha2VVcENtZChVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7IA0KICANCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIFVTQVJUIG11dGUgbW9kZSAgYnkgc2V0dGluZyB0aGUgUldVIGJpdCBpbiB0aGUgQ1IxIHJlZ2lzdGVyICovDQogICAgVVNBUlR4LT5DUjEgfD0gVVNBUlRfQ1IxX1JXVTsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBVU0FSVCBtdXRlIG1vZGUgYnkgY2xlYXJpbmcgdGhlIFJXVSBiaXQgaW4gdGhlIENSMSByZWdpc3RlciAqLw0KICAgIFVTQVJUeC0+Q1IxICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClVU0FSVF9DUjFfUldVKTsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNldHMgdGhlIFVTQVJUIExJTiBCcmVhayBkZXRlY3Rpb24gbGVuZ3RoLg0KICAqIEBwYXJhbSAgVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIHBlcmlwaGVyYWwuIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgIFVTQVJUMSwgVVNBUlQyIG9yIFVTQVJUMy4NCiAgKiBAcGFyYW0gIFVTQVJUX0xJTkJyZWFrRGV0ZWN0TGVuZ3RoOiBzcGVjaWZpZXMgdGhlIExJTiBicmVhayBkZXRlY3Rpb24gbGVuZ3RoLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBVU0FSVF9MSU5CcmVha0RldGVjdExlbmd0aF8xMGI6IDEwLWJpdCBicmVhayBkZXRlY3Rpb24NCiAgKiAgICAgQGFyZyBVU0FSVF9MSU5CcmVha0RldGVjdExlbmd0aF8xMWI6IDExLWJpdCBicmVhayBkZXRlY3Rpb24NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVVNBUlRfTElOQnJlYWtEZXRlY3RMZW5ndGhDb25maWcoVVNBUlRfVHlwZURlZiogVVNBUlR4LCB1aW50MTZfdCBVU0FSVF9MSU5CcmVha0RldGVjdExlbmd0aCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9MSU5fQlJFQUtfREVURUNUX0xFTkdUSChVU0FSVF9MSU5CcmVha0RldGVjdExlbmd0aCkpOw0KICANCiAgVVNBUlR4LT5DUjIgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVVTQVJUX0NSMl9MQkRMKTsNCiAgVVNBUlR4LT5DUjIgfD0gVVNBUlRfTElOQnJlYWtEZXRlY3RMZW5ndGg7ICANCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBVU0FSVJJzIExJTiBtb2RlLg0KICAqIEBwYXJhbSAgVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIHBlcmlwaGVyYWwuIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgIFVTQVJUMSwgVVNBUlQyIG9yIFVTQVJUMy4NCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFVTQVJUIExJTiBtb2RlLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVVNBUlRfTElOQ21kKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUxMX1BFUklQSChVU0FSVHgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBMSU4gbW9kZSBieSBzZXR0aW5nIHRoZSBMSU5FTiBiaXQgaW4gdGhlIENSMiByZWdpc3RlciAqLw0KICAgIFVTQVJUeC0+Q1IyIHw9IFVTQVJUX0NSMl9MSU5FTjsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBMSU4gbW9kZSBieSBjbGVhcmluZyB0aGUgTElORU4gYml0IGluIHRoZSBDUjIgcmVnaXN0ZXIgKi8NCiAgICBVU0FSVHgtPkNSMiAmPSAodWludDE2X3QpfigodWludDE2X3QpVVNBUlRfQ1IyX0xJTkVOKTsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFRyYW5zbWl0cyBzaW5nbGUgZGF0YSB0aHJvdWdoIHRoZSBVU0FSVHggcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBwZXJpcGhlcmFsLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICBVU0FSVDEsIFVTQVJUMiBvciBVU0FSVDMuDQogICogQHBhcmFtICBEYXRhOiB0aGUgZGF0YSB0byB0cmFuc21pdC4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVVNBUlRfU2VuZERhdGEoVVNBUlRfVHlwZURlZiogVVNBUlR4LCB1aW50MTZfdCBEYXRhKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUxMX1BFUklQSChVU0FSVHgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0RBVEEoRGF0YSkpOyANCiAgICANCiAgLyogVHJhbnNtaXQgRGF0YSAqLw0KICBVU0FSVHgtPkRSID0gKERhdGEgJiAodWludDE2X3QpMHgwMUZGKTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBSZXR1cm5zIHRoZSBtb3N0IHJlY2VudCByZWNlaXZlZCBkYXRhIGJ5IHRoZSBVU0FSVHggcGVyaXBoZXJhbC4NCiAgKiBAcGFyYW0gIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBwZXJpcGhlcmFsLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICBVU0FSVDEsIFVTQVJUMiBvciBVU0FSVDMuDQogICogQHJldHZhbCBUaGUgcmVjZWl2ZWQgZGF0YS4NCiAgKi8NCnVpbnQxNl90IFVTQVJUX1JlY2VpdmVEYXRhKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQogIA0KICAvKiBSZWNlaXZlIERhdGEgKi8NCiAgcmV0dXJuICh1aW50MTZfdCkoVVNBUlR4LT5EUiAmICh1aW50MTZfdCkweDAxRkYpOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFRyYW5zbWl0cyBicmVhayBjaGFyYWN0ZXJzLg0KICAqIEBwYXJhbSAgVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIHBlcmlwaGVyYWwuIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgIFVTQVJUMSwgVVNBUlQyIG9yIFVTQVJUMy4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVVNBUlRfU2VuZEJyZWFrKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQogIA0KICAvKiBTZW5kIGJyZWFrIGNoYXJhY3RlcnMgKi8NCiAgVVNBUlR4LT5DUjEgfD0gVVNBUlRfQ1IxX1NCSzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBTZXRzIHRoZSBzcGVjaWZpZWQgVVNBUlQgZ3VhcmQgdGltZS4NCiAgKiBAcGFyYW0gIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBwZXJpcGhlcmFsLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICBVU0FSVDEsIFVTQVJUMiBvciBVU0FSVDMuDQogICogQHBhcmFtICBVU0FSVF9HdWFyZFRpbWU6IHNwZWNpZmllcyB0aGUgZ3VhcmQgdGltZS4NCiAgKiBAbm90ZSBUaGUgZ3VhcmQgdGltZSBiaXRzIGFyZSBub3QgYXZhaWxhYmxlIGZvciBVQVJUNCBhbmQgVUFSVDUuICAgDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFVTQVJUX1NldEd1YXJkVGltZShVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIHVpbnQ4X3QgVVNBUlRfR3VhcmRUaW1lKQ0KeyAgICANCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQogIA0KICAvKiBDbGVhciB0aGUgVVNBUlQgR3VhcmQgdGltZSAqLw0KICBVU0FSVHgtPkdUUFIgJj0gVVNBUlRfR1RQUl9QU0M7DQogIC8qIFNldCB0aGUgVVNBUlQgZ3VhcmQgdGltZSAqLw0KICBVU0FSVHgtPkdUUFIgfD0gKHVpbnQxNl90KSgodWludDE2X3QpVVNBUlRfR3VhcmRUaW1lIDw8IDB4MDgpOw0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIFNldHMgdGhlIHN5c3RlbSBjbG9jayBwcmVzY2FsZXIuDQogICogQHBhcmFtICBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgcGVyaXBoZXJhbC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgVVNBUlQxLCBVU0FSVDIgb3IgVVNBUlQzLg0KICAqIEBwYXJhbSAgVVNBUlRfUHJlc2NhbGVyOiBzcGVjaWZpZXMgdGhlIHByZXNjYWxlciBjbG9jay4gIA0KICAqIEBub3RlICAgVGhlIGZ1bmN0aW9uIGlzIHVzZWQgZm9yIElyREEgbW9kZSB3aXRoIFVBUlQ0IGFuZCBVQVJUNS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVVNBUlRfU2V0UHJlc2NhbGVyKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdWludDhfdCBVU0FSVF9QcmVzY2FsZXIpDQp7IA0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUxMX1BFUklQSChVU0FSVHgpKTsNCiAgDQogIC8qIENsZWFyIHRoZSBVU0FSVCBwcmVzY2FsZXIgKi8NCiAgVVNBUlR4LT5HVFBSICY9IFVTQVJUX0dUUFJfR1Q7DQogIC8qIFNldCB0aGUgVVNBUlQgcHJlc2NhbGVyICovDQogIFVTQVJUeC0+R1RQUiB8PSBVU0FSVF9QcmVzY2FsZXI7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVVNBUlSScyBTbWFydCBDYXJkIG1vZGUuDQogICogQHBhcmFtICBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgcGVyaXBoZXJhbC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgVVNBUlQxLCBVU0FSVDIgb3IgVVNBUlQzLg0KICAqIEBwYXJhbSAgTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgU21hcnQgQ2FyZCBtb2RlLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4gICAgIA0KICAqIEBub3RlIFRoZSBTbWFydCBDYXJkIG1vZGUgaXMgbm90IGF2YWlsYWJsZSBmb3IgVUFSVDQgYW5kIFVBUlQ1LiANCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVVNBUlRfU21hcnRDYXJkQ21kKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUxMX1BFUklQSChVU0FSVHgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIFNDIG1vZGUgYnkgc2V0dGluZyB0aGUgU0NFTiBiaXQgaW4gdGhlIENSMyByZWdpc3RlciAqLw0KICAgIFVTQVJUeC0+Q1IzIHw9IFVTQVJUX0NSM19TQ0VOOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIFNDIG1vZGUgYnkgY2xlYXJpbmcgdGhlIFNDRU4gYml0IGluIHRoZSBDUjMgcmVnaXN0ZXIgKi8NCiAgICBVU0FSVHgtPkNSMyAmPSAodWludDE2X3QpfigodWludDE2X3QpVVNBUlRfQ1IzX1NDRU4pOw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyBOQUNLIHRyYW5zbWlzc2lvbi4NCiAgKiBAcGFyYW0gIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBwZXJpcGhlcmFsLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICBVU0FSVDEsIFVTQVJUMiBvciBVU0FSVDMuDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBOQUNLIHRyYW5zbWlzc2lvbi4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuICANCiAgKiBAbm90ZSBUaGUgU21hcnQgQ2FyZCBtb2RlIGlzIG5vdCBhdmFpbGFibGUgZm9yIFVBUlQ0IGFuZCBVQVJUNS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVVNBUlRfU21hcnRDYXJkTkFDS0NtZChVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7IA0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgTkFDSyB0cmFuc21pc3Npb24gYnkgc2V0dGluZyB0aGUgTkFDSyBiaXQgaW4gdGhlIENSMyByZWdpc3RlciAqLw0KICAgIFVTQVJUeC0+Q1IzIHw9IFVTQVJUX0NSM19OQUNLOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIE5BQ0sgdHJhbnNtaXNzaW9uIGJ5IGNsZWFyaW5nIHRoZSBOQUNLIGJpdCBpbiB0aGUgQ1IzIHJlZ2lzdGVyICovDQogICAgVVNBUlR4LT5DUjMgJj0gKHVpbnQxNl90KX4oKHVpbnQxNl90KVVTQVJUX0NSM19OQUNLKTsNCiAgfQ0KfQ0KDQovKioNCiAgKiBAYnJpZWYgIEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFVTQVJUknMgSGFsZiBEdXBsZXggY29tbXVuaWNhdGlvbi4NCiAgKiBAcGFyYW0gIFVTQVJUeDogU2VsZWN0IHRoZSBVU0FSVCBwZXJpcGhlcmFsLiANCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICBVU0FSVDEsIFVTQVJUMiBvciBVU0FSVDMuDQogICogQHBhcmFtICBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBVU0FSVCBDb21tdW5pY2F0aW9uLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVVNBUlRfSGFsZkR1cGxleENtZChVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0FMTF9QRVJJUEgoVVNBUlR4KSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIA0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgSGFsZi1EdXBsZXggbW9kZSBieSBzZXR0aW5nIHRoZSBIRFNFTCBiaXQgaW4gdGhlIENSMyByZWdpc3RlciAqLw0KICAgIFVTQVJUeC0+Q1IzIHw9IFVTQVJUX0NSM19IRFNFTDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBIYWxmLUR1cGxleCBtb2RlIGJ5IGNsZWFyaW5nIHRoZSBIRFNFTCBiaXQgaW4gdGhlIENSMyByZWdpc3RlciAqLw0KICAgIFVTQVJUeC0+Q1IzICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClVU0FSVF9DUjNfSERTRUwpOw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVVNBUlQncyA4eCBvdmVyc2FtcGxpbmcgbW9kZS4NCiAgKiBAcGFyYW0gVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIG9yIHRoZSBVQVJUIHBlcmlwaGVyYWwuIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgVVNBUlQxLCBVU0FSVDIsIFVTQVJUMy4NCiAgKiBAcGFyYW0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgVVNBUlQgOHggb3ZlcnNhbXBsaW5nIG1vZGUuDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KICAqDQogICogQG5vdGUNCiAgKiAgIFRoaXMgZnVuY3Rpb24gaGFzIHRvIGJlIGNhbGxlZCBiZWZvcmUgY2FsbGluZyBVU0FSVF9Jbml0KCkNCiAgKiAgIGZ1bmN0aW9uIGluIG9yZGVyIHRvIGhhdmUgY29ycmVjdCBiYXVkcmF0ZSBEaXZpZGVyIHZhbHVlLg0KICAqIEByZXR2YWwgOiBOb25lDQogICovDQp2b2lkIFVTQVJUX092ZXJTYW1wbGluZzhDbWQoVVNBUlRfVHlwZURlZiogVVNBUlR4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9BTExfUEVSSVBIKFVTQVJUeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICANCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIDh4IE92ZXJzYW1wbGluZyBtb2RlIGJ5IHNldHRpbmcgdGhlIE9WRVI4IGJpdCBpbiB0aGUgQ1IxIHJlZ2lzdGVyICovDQogICAgVVNBUlR4LT5DUjEgfD0gVVNBUlRfQ1IxX09WRVI4Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIDh4IE92ZXJzYW1wbGluZyBtb2RlIGJ5IGNsZWFyaW5nIHRoZSBPVkVSOCBiaXQgaW4gdGhlIENSMSByZWdpc3RlciAqLw0KICAgIFVTQVJUeC0+Q1IxICY9ICh1aW50MTZfdCl+KCh1aW50MTZfdClVU0FSVF9DUjFfT1ZFUjgpOw0KICB9DQp9ICANCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBVU0FSVCdzIG9uZSBiaXQgc2FtcGxpbmcgbWV0aG9kZS4NCiAgKiBAcGFyYW0gVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIG9yIHRoZSBVQVJUIHBlcmlwaGVyYWwuIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgIFVTQVJUMSwgVVNBUlQyLCBVU0FSVDMuDQogICogQHBhcmFtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFVTQVJUIG9uZSBiaXQgc2FtcGxpbmcgbWV0aG9kZS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCA6IE5vbmUNCiAgKi8NCnZvaWQgVVNBUlRfT25lQml0TWV0aG9kQ21kKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUxMX1BFUklQSChVU0FSVHgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCiAgDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBvbmUgYml0IG1ldGhvZCBieSBzZXR0aW5nIHRoZSBPTkVCSVRFIGJpdCBpbiB0aGUgQ1IzIHJlZ2lzdGVyICovDQogICAgVVNBUlR4LT5DUjMgfD0gVVNBUlRfQ1IzX09ORUJJVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHR0aGUgb25lIGJpdCBtZXRob2QgYnkgY2xlYXJpbmcgdGhlIE9ORUJJVEUgYml0IGluIHRoZSBDUjMgcmVnaXN0ZXIgKi8NCiAgICBVU0FSVHgtPkNSMyAmPSAodWludDE2X3QpfigodWludDE2X3QpVVNBUlRfQ1IzX09ORUJJVCk7DQogIH0NCn0NCg0KLyoqDQogICogQGJyaWVmICBDb25maWd1cmVzIHRoZSBVU0FSVJJzIElyREEgaW50ZXJmYWNlLg0KICAqIEBwYXJhbSAgVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIHBlcmlwaGVyYWwuIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgIFVTQVJUMSwgVVNBUlQyIG9yIFVTQVJUMy4NCiAgKiBAcGFyYW0gIFVTQVJUX0lyREFNb2RlOiBzcGVjaWZpZXMgdGhlIElyREEgbW9kZS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVVNBUlRfSXJEQU1vZGVfTG93UG93ZXINCiAgKiAgICAgQGFyZyBVU0FSVF9JckRBTW9kZV9Ob3JtYWwNCiAgKiBAcmV0dmFsIE5vbmUNCiAgKi8NCnZvaWQgVVNBUlRfSXJEQUNvbmZpZyhVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIHVpbnQxNl90IFVTQVJUX0lyREFNb2RlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUxMX1BFUklQSChVU0FSVHgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0lSREFfTU9ERShVU0FSVF9JckRBTW9kZSkpOw0KICAgIA0KICBVU0FSVHgtPkNSMyAmPSAodWludDE2X3QpfigodWludDE2X3QpVVNBUlRfQ1IzX0lSTFApOw0KICBVU0FSVHgtPkNSMyB8PSBVU0FSVF9JckRBTW9kZTsNCn0NCg0KLyoqDQogICogQGJyaWVmICBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBVU0FSVJJzIElyREEgaW50ZXJmYWNlLg0KICAqIEBwYXJhbSAgVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIHBlcmlwaGVyYWwuIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgIFVTQVJUMSwgVVNBUlQyIG9yIFVTQVJUMy4NCiAgKiBAcGFyYW0gIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIElyREEgbW9kZS4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQogICogQHJldHZhbCBOb25lDQogICovDQp2b2lkIFVTQVJUX0lyREFDbWQoVVNBUlRfVHlwZURlZiogVVNBUlR4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9BTExfUEVSSVBIKFVTQVJUeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KICAgIA0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgSXJEQSBtb2RlIGJ5IHNldHRpbmcgdGhlIElSRU4gYml0IGluIHRoZSBDUjMgcmVnaXN0ZXIgKi8NCiAgICBVU0FSVHgtPkNSMyB8PSBVU0FSVF9DUjNfSVJFTjsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBJckRBIG1vZGUgYnkgY2xlYXJpbmcgdGhlIElSRU4gYml0IGluIHRoZSBDUjMgcmVnaXN0ZXIgKi8NCiAgICBVU0FSVHgtPkNSMyAmPSAodWludDE2X3QpfigodWludDE2X3QpVVNBUlRfQ1IzX0lSRU4pOw0KICB9DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVU0FSVCBmbGFnIGlzIHNldCBvciBub3QuDQogICogQHBhcmFtICBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgcGVyaXBoZXJhbC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgVVNBUlQxLCBVU0FSVDIgb3IgVVNBUlQzLg0KICAqIEBwYXJhbSAgVVNBUlRfRkxBRzogc3BlY2lmaWVzIHRoZSBmbGFnIHRvIGNoZWNrLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBVU0FSVF9GTEFHX0NUUzogIENUUyBDaGFuZ2UgZmxhZw0KICAqICAgICBAYXJnIFVTQVJUX0ZMQUdfTEJEOiAgTElOIEJyZWFrIGRldGVjdGlvbiBmbGFnDQogICogICAgIEBhcmcgVVNBUlRfRkxBR19UWEU6ICBUcmFuc21pdCBkYXRhIHJlZ2lzdGVyIGVtcHR5IGZsYWcNCiAgKiAgICAgQGFyZyBVU0FSVF9GTEFHX1RDOiAgIFRyYW5zbWlzc2lvbiBDb21wbGV0ZSBmbGFnDQogICogICAgIEBhcmcgVVNBUlRfRkxBR19SWE5FOiBSZWNlaXZlIGRhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IGZsYWcNCiAgKiAgICAgQGFyZyBVU0FSVF9GTEFHX0lETEU6IElkbGUgTGluZSBkZXRlY3Rpb24gZmxhZw0KICAqICAgICBAYXJnIFVTQVJUX0ZMQUdfT1JFOiAgT3ZlclJ1biBFcnJvciBmbGFnDQogICogICAgIEBhcmcgVVNBUlRfRkxBR19ORTogICBOb2lzZSBFcnJvciBmbGFnDQogICogICAgIEBhcmcgVVNBUlRfRkxBR19GRTogICBGcmFtaW5nIEVycm9yIGZsYWcNCiAgKiAgICAgQGFyZyBVU0FSVF9GTEFHX1BFOiAgIFBhcml0eSBFcnJvciBmbGFnDQogICogQHJldHZhbCBUaGUgbmV3IHN0YXRlIG9mIFVTQVJUX0ZMQUcgKFNFVCBvciBSRVNFVCkuDQogICovDQpGbGFnU3RhdHVzIFVTQVJUX0dldEZsYWdTdGF0dXMoVVNBUlRfVHlwZURlZiogVVNBUlR4LCB1aW50MTZfdCBVU0FSVF9GTEFHKQ0Kew0KICBGbGFnU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUxMX1BFUklQSChVU0FSVHgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0ZMQUcoVVNBUlRfRkxBRykpOw0KICANCiAgaWYgKChVU0FSVHgtPlNSICYgVVNBUlRfRkxBRykgIT0gKHVpbnQxNl90KVJFU0VUKQ0KICB7DQogICAgYml0c3RhdHVzID0gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KICB9DQogIHJldHVybiBiaXRzdGF0dXM7DQp9DQoNCi8qKg0KICAqIEBicmllZiAgQ2xlYXJzIHRoZSBVU0FSVHgncyBwZW5kaW5nIGZsYWdzLg0KICAqIEBwYXJhbSAgVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIHBlcmlwaGVyYWwuIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgIFVTQVJUMSwgVVNBUlQyIG9yIFVTQVJUMy4NCiAgKiBAcGFyYW0gIFVTQVJUX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4NCiAgKiAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQogICogICAgIEBhcmcgVVNBUlRfRkxBR19DVFM6ICBDVFMgQ2hhbmdlIGZsYWcuDQogICogICAgIEBhcmcgVVNBUlRfRkxBR19MQkQ6ICBMSU4gQnJlYWsgZGV0ZWN0aW9uIGZsYWcuDQogICogICAgIEBhcmcgVVNBUlRfRkxBR19UQzogICBUcmFuc21pc3Npb24gQ29tcGxldGUgZmxhZy4NCiAgKiAgICAgQGFyZyBVU0FSVF9GTEFHX1JYTkU6IFJlY2VpdmUgZGF0YSByZWdpc3RlciBub3QgZW1wdHkgZmxhZy4NCiAgKiAgIA0KICAqIEBub3RlDQogICogICAtIFBFIChQYXJpdHkgZXJyb3IpLCBGRSAoRnJhbWluZyBlcnJvciksIE5FIChOb2lzZSBlcnJvciksIE9SRSAoT3ZlclJ1biANCiAgKiAgICAgZXJyb3IpIGFuZCBJRExFIChJZGxlIGxpbmUgZGV0ZWN0ZWQpIGZsYWdzIGFyZSBjbGVhcmVkIGJ5IHNvZnR3YXJlIA0KICAqICAgICBzZXF1ZW5jZTogYSByZWFkIG9wZXJhdGlvbiB0byBVU0FSVF9TUiByZWdpc3RlciAoVVNBUlRfR2V0RmxhZ1N0YXR1cygpKSANCiAgKiAgICAgZm9sbG93ZWQgYnkgYSByZWFkIG9wZXJhdGlvbiB0byBVU0FSVF9EUiByZWdpc3RlciAoVVNBUlRfUmVjZWl2ZURhdGEoKSkuDQogICogICAtIFJYTkUgZmxhZyBjYW4gYmUgYWxzbyBjbGVhcmVkIGJ5IGEgcmVhZCB0byB0aGUgVVNBUlRfRFIgcmVnaXN0ZXIgDQogICogICAgIChVU0FSVF9SZWNlaXZlRGF0YSgpKS4NCiAgKiAgIC0gVEMgZmxhZyBjYW4gYmUgYWxzbyBjbGVhcmVkIGJ5IHNvZnR3YXJlIHNlcXVlbmNlOiBhIHJlYWQgb3BlcmF0aW9uIHRvIA0KICAqICAgICBVU0FSVF9TUiByZWdpc3RlciAoVVNBUlRfR2V0RmxhZ1N0YXR1cygpKSBmb2xsb3dlZCBieSBhIHdyaXRlIG9wZXJhdGlvbg0KICAqICAgICB0byBVU0FSVF9EUiByZWdpc3RlciAoVVNBUlRfU2VuZERhdGEoKSkuDQogICogICAtIFRYRSBmbGFnIGlzIGNsZWFyZWQgb25seSBieSBhIHdyaXRlIHRvIHRoZSBVU0FSVF9EUiByZWdpc3RlciANCiAgKiAgICAgKFVTQVJUX1NlbmREYXRhKCkpLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBVU0FSVF9DbGVhckZsYWcoVVNBUlRfVHlwZURlZiogVVNBUlR4LCB1aW50MTZfdCBVU0FSVF9GTEFHKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUxMX1BFUklQSChVU0FSVHgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0NMRUFSX0ZMQUcoVVNBUlRfRkxBRykpOw0KICAgICANCiAgVVNBUlR4LT5TUiA9ICh1aW50MTZfdCl+VVNBUlRfRkxBRzsNCn0NCg0KLyoqDQogICogQGJyaWVmICBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIFVTQVJUIGludGVycnVwdCBoYXMgb2NjdXJyZWQgb3Igbm90Lg0KICAqIEBwYXJhbSAgVVNBUlR4OiBTZWxlY3QgdGhlIFVTQVJUIHBlcmlwaGVyYWwuIA0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgIFVTQVJUMSwgVVNBUlQyIG9yIFVTQVJUMy4NCiAgKiBAcGFyYW0gIFVTQVJUX0lUOiBzcGVjaWZpZXMgdGhlIFVTQVJUIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgICBAYXJnIFVTQVJUX0lUX0NUUzogIENUUyBjaGFuZ2UgaW50ZXJydXB0DQogICogICAgIEBhcmcgVVNBUlRfSVRfTEJEOiAgTElOIEJyZWFrIGRldGVjdGlvbiBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBVU0FSVF9JVF9UWEU6ICBUYW5zbWl0IERhdGEgUmVnaXN0ZXIgZW1wdHkgaW50ZXJydXB0DQogICogICAgIEBhcmcgVVNBUlRfSVRfVEM6ICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdA0KICAqICAgICBAYXJnIFVTQVJUX0lUX1JYTkU6IFJlY2VpdmUgRGF0YSByZWdpc3RlciBub3QgZW1wdHkgaW50ZXJydXB0DQogICogICAgIEBhcmcgVVNBUlRfSVRfSURMRTogSWRsZSBsaW5lIGRldGVjdGlvbiBpbnRlcnJ1cHQNCiAgKiAgICAgQGFyZyBVU0FSVF9JVF9PUkU6ICBPdmVyUnVuIEVycm9yIGludGVycnVwdA0KICAqICAgICBAYXJnIFVTQVJUX0lUX05FOiAgIE5vaXNlIEVycm9yIGludGVycnVwdA0KICAqICAgICBAYXJnIFVTQVJUX0lUX0ZFOiAgIEZyYW1pbmcgRXJyb3IgaW50ZXJydXB0DQogICogICAgIEBhcmcgVVNBUlRfSVRfUEU6ICAgUGFyaXR5IEVycm9yIGludGVycnVwdA0KICAqIEByZXR2YWwgVGhlIG5ldyBzdGF0ZSBvZiBVU0FSVF9JVCAoU0VUIG9yIFJFU0VUKS4NCiAgKi8NCklUU3RhdHVzIFVTQVJUX0dldElUU3RhdHVzKFVTQVJUX1R5cGVEZWYqIFVTQVJUeCwgdWludDE2X3QgVVNBUlRfSVQpDQp7DQogIHVpbnQzMl90IGJpdHBvcyA9IDB4MDAsIGl0bWFzayA9IDB4MDAsIHVzYXJ0cmVnID0gMHgwMDsNCiAgSVRTdGF0dXMgYml0c3RhdHVzID0gUkVTRVQ7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19VU0FSVF9BTExfUEVSSVBIKFVTQVJUeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfR0VUX0lUKFVTQVJUX0lUKSk7IA0KICANCiAgLyogR2V0IHRoZSBVU0FSVCByZWdpc3RlciBpbmRleCAqLw0KICB1c2FydHJlZyA9ICgoKHVpbnQ4X3QpVVNBUlRfSVQpID4+IDB4MDUpOw0KICAvKiBHZXQgdGhlIGludGVycnVwdCBwb3NpdGlvbiAqLw0KICBpdG1hc2sgPSBVU0FSVF9JVCAmIElUX01BU0s7DQogIGl0bWFzayA9ICh1aW50MzJfdCkweDAxIDw8IGl0bWFzazsNCiAgDQogIGlmICh1c2FydHJlZyA9PSAweDAxKSAvKiBUaGUgSVQgIGlzIGluIENSMSByZWdpc3RlciAqLw0KICB7DQogICAgaXRtYXNrICY9IFVTQVJUeC0+Q1IxOw0KICB9DQogIGVsc2UgaWYgKHVzYXJ0cmVnID09IDB4MDIpIC8qIFRoZSBJVCAgaXMgaW4gQ1IyIHJlZ2lzdGVyICovDQogIHsNCiAgICBpdG1hc2sgJj0gVVNBUlR4LT5DUjI7DQogIH0NCiAgZWxzZSAvKiBUaGUgSVQgIGlzIGluIENSMyByZWdpc3RlciAqLw0KICB7DQogICAgaXRtYXNrICY9IFVTQVJUeC0+Q1IzOw0KICB9DQogIA0KICBiaXRwb3MgPSBVU0FSVF9JVCA+PiAweDA4Ow0KICBiaXRwb3MgPSAodWludDMyX3QpMHgwMSA8PCBiaXRwb3M7DQogIGJpdHBvcyAmPSBVU0FSVHgtPlNSOw0KICBpZiAoKGl0bWFzayAhPSAodWludDE2X3QpUkVTRVQpJiYoYml0cG9zICE9ICh1aW50MTZfdClSRVNFVCkpDQogIHsNCiAgICBiaXRzdGF0dXMgPSBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgYml0c3RhdHVzID0gUkVTRVQ7DQogIH0NCiAgDQogIHJldHVybiBiaXRzdGF0dXM7ICANCn0NCg0KLyoqDQogICogQGJyaWVmICBDbGVhcnMgdGhlIFVTQVJUeJJzIGludGVycnVwdCBwZW5kaW5nIGJpdHMuDQogICogQHBhcmFtICBVU0FSVHg6IFNlbGVjdCB0aGUgVVNBUlQgcGVyaXBoZXJhbC4gDQogICogICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KICAqICAgVVNBUlQxLCBVU0FSVDIgb3IgVVNBUlQzLg0KICAqIEBwYXJhbSAgVVNBUlRfSVQ6IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIGNsZWFyLg0KICAqICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiAgKiAgICAgQGFyZyBVU0FSVF9JVF9DVFM6ICBDVFMgY2hhbmdlIGludGVycnVwdA0KICAqICAgICBAYXJnIFVTQVJUX0lUX0xCRDogIExJTiBCcmVhayBkZXRlY3Rpb24gaW50ZXJydXB0DQogICogICAgIEBhcmcgVVNBUlRfSVRfVEM6ICAgVHJhbnNtaXNzaW9uIGNvbXBsZXRlIGludGVycnVwdC4gDQogICogICAgIEBhcmcgVVNBUlRfSVRfUlhORTogUmVjZWl2ZSBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSBpbnRlcnJ1cHQuDQogICogICANCiAgKiBAbm90ZQ0KICAqICAgLSBQRSAoUGFyaXR5IGVycm9yKSwgRkUgKEZyYW1pbmcgZXJyb3IpLCBORSAoTm9pc2UgZXJyb3IpLCBPUkUgKE92ZXJSdW4gDQogICogICAgIGVycm9yKSBhbmQgSURMRSAoSWRsZSBsaW5lIGRldGVjdGVkKSBwZW5kaW5nIGJpdHMgYXJlIGNsZWFyZWQgYnkgDQogICogICAgIHNvZnR3YXJlIHNlcXVlbmNlOiBhIHJlYWQgb3BlcmF0aW9uIHRvIFVTQVJUX1NSIHJlZ2lzdGVyIA0KICAqICAgICAoVVNBUlRfR2V0SVRTdGF0dXMoKSkgZm9sbG93ZWQgYnkgYSByZWFkIG9wZXJhdGlvbiB0byBVU0FSVF9EUiByZWdpc3RlciANCiAgKiAgICAgKFVTQVJUX1JlY2VpdmVEYXRhKCkpLg0KICAqICAgLSBSWE5FIHBlbmRpbmcgYml0IGNhbiBiZSBhbHNvIGNsZWFyZWQgYnkgYSByZWFkIHRvIHRoZSBVU0FSVF9EUiByZWdpc3RlciANCiAgKiAgICAgKFVTQVJUX1JlY2VpdmVEYXRhKCkpLg0KICAqICAgLSBUQyBwZW5kaW5nIGJpdCBjYW4gYmUgYWxzbyBjbGVhcmVkIGJ5IHNvZnR3YXJlIHNlcXVlbmNlOiBhIHJlYWQgDQogICogICAgIG9wZXJhdGlvbiB0byBVU0FSVF9TUiByZWdpc3RlciAoVVNBUlRfR2V0SVRTdGF0dXMoKSkgZm9sbG93ZWQgYnkgYSB3cml0ZSANCiAgKiAgICAgb3BlcmF0aW9uIHRvIFVTQVJUX0RSIHJlZ2lzdGVyIChVU0FSVF9TZW5kRGF0YSgpKS4NCiAgKiAgIC0gVFhFIHBlbmRpbmcgYml0IGlzIGNsZWFyZWQgb25seSBieSBhIHdyaXRlIHRvIHRoZSBVU0FSVF9EUiByZWdpc3RlciANCiAgKiAgICAgKFVTQVJUX1NlbmREYXRhKCkpLg0KICAqIEByZXR2YWwgTm9uZQ0KICAqLw0Kdm9pZCBVU0FSVF9DbGVhcklUUGVuZGluZ0JpdChVU0FSVF9UeXBlRGVmKiBVU0FSVHgsIHVpbnQxNl90IFVTQVJUX0lUKQ0Kew0KICB1aW50MTZfdCBiaXRwb3MgPSAweDAwLCBpdG1hc2sgPSAweDAwOw0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfVVNBUlRfQUxMX1BFUklQSChVU0FSVHgpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX1VTQVJUX0NMRUFSX0lUKFVTQVJUX0lUKSk7IA0KICANCiAgYml0cG9zID0gVVNBUlRfSVQgPj4gMHgwODsNCiAgaXRtYXNrID0gKCh1aW50MTZfdCkweDAxIDw8ICh1aW50MTZfdCliaXRwb3MpOw0KICBVU0FSVHgtPlNSID0gKHVpbnQxNl90KX5pdG1hc2s7DQp9DQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKg0KICAqIEB9DQogICovDQoNCi8qKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAxMCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovDQo=