LyoqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwOCBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKioqKioqKioqKioqKioqKioNCiogRmlsZSBOYW1lICAgICAgICAgIDogc3RtMzJmMTB4X2kyYy5jDQoqIEF1dGhvciAgICAgICAgICAgICA6IE1DRCBBcHBsaWNhdGlvbiBUZWFtDQoqIFZlcnNpb24gICAgICAgICAgICA6IFYyLjAuMQ0KKiBEYXRlICAgICAgICAgICAgICAgOiAwNi8xMy8yMDA4DQoqIERlc2NyaXB0aW9uICAgICAgICA6IFRoaXMgZmlsZSBwcm92aWRlcyBhbGwgdGhlIEkyQyBmaXJtd2FyZSBmdW5jdGlvbnMuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBUSEUgUFJFU0VOVCBGSVJNV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCiogV0lUSCBDT0RJTkcgSU5GT1JNQVRJT04gUkVHQVJESU5HIFRIRUlSIFBST0RVQ1RTIElOIE9SREVSIEZPUiBUSEVNIFRPIFNBVkUgVElNRS4NCiogQVMgQSBSRVNVTFQsIFNUTUlDUk9FTEVDVFJPTklDUyBTSEFMTCBOT1QgQkUgSEVMRCBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsDQoqIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HIEZST00gVEhFDQoqIENPTlRFTlQgT0YgU1VDSCBGSVJNV0FSRSBBTkQvT1IgVEhFIFVTRSBNQURFIEJZIENVU1RPTUVSUyBPRiBUSEUgQ09ESU5HDQoqIElORk9STUFUSU9OIENPTlRBSU5FRCBIRVJFSU4gSU4gQ09OTkVDVElPTiBXSVRIIFRIRUlSIFBST0RVQ1RTLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNpbmNsdWRlICJzdG0zMmYxMHhfaTJjLmgiDQojaW5jbHVkZSAic3RtMzJmMTB4X3JjYy5oIg0KCSANCi8qIFByaXZhdGUgdHlwZWRlZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIGRlZmluZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogSTJDIFNQRSBtYXNrICovDQojZGVmaW5lIENSMV9QRV9TZXQgICAgICAgICAgICAgICgodTE2KTB4MDAwMSkNCiNkZWZpbmUgQ1IxX1BFX1Jlc2V0ICAgICAgICAgICAgKCh1MTYpMHhGRkZFKQ0KDQovKiBJMkMgU1RBUlQgbWFzayAqLw0KI2RlZmluZSBDUjFfU1RBUlRfU2V0ICAgICAgICAgICAoKHUxNikweDAxMDApDQojZGVmaW5lIENSMV9TVEFSVF9SZXNldCAgICAgICAgICgodTE2KTB4RkVGRikNCg0KLyogSTJDIFNUT1AgbWFzayAqLw0KI2RlZmluZSBDUjFfU1RPUF9TZXQgICAgICAgICAgICAoKHUxNikweDAyMDApDQojZGVmaW5lIENSMV9TVE9QX1Jlc2V0ICAgICAgICAgICgodTE2KTB4RkRGRikNCg0KLyogSTJDIEFDSyBtYXNrICovDQojZGVmaW5lIENSMV9BQ0tfU2V0ICAgICAgICAgICAgICgodTE2KTB4MDQwMCkNCiNkZWZpbmUgQ1IxX0FDS19SZXNldCAgICAgICAgICAgKCh1MTYpMHhGQkZGKQ0KDQovKiBJMkMgRU5HQyBtYXNrICovDQojZGVmaW5lIENSMV9FTkdDX1NldCAgICAgICAgICAgICgodTE2KTB4MDA0MCkNCiNkZWZpbmUgQ1IxX0VOR0NfUmVzZXQgICAgICAgICAgKCh1MTYpMHhGRkJGKQ0KDQovKiBJMkMgU1dSU1QgbWFzayAqLw0KI2RlZmluZSBDUjFfU1dSU1RfU2V0ICAgICAgICAgICAoKHUxNikweDgwMDApDQojZGVmaW5lIENSMV9TV1JTVF9SZXNldCAgICAgICAgICgodTE2KTB4N0ZGRikNCg0KLyogSTJDIFBFQyBtYXNrICovDQojZGVmaW5lIENSMV9QRUNfU2V0ICAgICAgICAgICAgICgodTE2KTB4MTAwMCkNCiNkZWZpbmUgQ1IxX1BFQ19SZXNldCAgICAgICAgICAgKCh1MTYpMHhFRkZGKQ0KDQovKiBJMkMgRU5QRUMgbWFzayAqLw0KI2RlZmluZSBDUjFfRU5QRUNfU2V0ICAgICAgICAgICAoKHUxNikweDAwMjApDQojZGVmaW5lIENSMV9FTlBFQ19SZXNldCAgICAgICAgICgodTE2KTB4RkZERikNCg0KLyogSTJDIEVOQVJQIG1hc2sgKi8NCiNkZWZpbmUgQ1IxX0VOQVJQX1NldCAgICAgICAgICAgKCh1MTYpMHgwMDEwKQ0KI2RlZmluZSBDUjFfRU5BUlBfUmVzZXQgICAgICAgICAoKHUxNikweEZGRUYpDQoNCi8qIEkyQyBOT1NUUkVUQ0ggbWFzayAqLw0KI2RlZmluZSBDUjFfTk9TVFJFVENIX1NldCAgICAgICAoKHUxNikweDAwODApDQojZGVmaW5lIENSMV9OT1NUUkVUQ0hfUmVzZXQgICAgICgodTE2KTB4RkY3RikNCg0KLyogSTJDIHJlZ2lzdGVycyBNYXNrcyAqLw0KI2RlZmluZSBDUjFfQ0xFQVJfTWFzayAgICAgICAgICAoKHUxNikweEZCRjUpDQoNCi8qIEkyQyBETUFFTiBtYXNrICovDQojZGVmaW5lIENSMl9ETUFFTl9TZXQgICAgICAgICAgICgodTE2KTB4MDgwMCkNCiNkZWZpbmUgQ1IyX0RNQUVOX1Jlc2V0ICAgICAgICAgKCh1MTYpMHhGN0ZGKQ0KDQovKiBJMkMgTEFTVCBtYXNrICovDQojZGVmaW5lIENSMl9MQVNUX1NldCAgICAgICAgICAgICgodTE2KTB4MTAwMCkNCiNkZWZpbmUgQ1IyX0xBU1RfUmVzZXQgICAgICAgICAgKCh1MTYpMHhFRkZGKQ0KDQovKiBJMkMgRlJFUSBtYXNrICovDQojZGVmaW5lIENSMl9GUkVRX1Jlc2V0ICAgICAgICAgICgodTE2KTB4RkZDMCkNCg0KLyogSTJDIEFERDAgbWFzayAqLw0KI2RlZmluZSBPQVIxX0FERDBfU2V0ICAgICAgICAgICAoKHUxNikweDAwMDEpDQojZGVmaW5lIE9BUjFfQUREMF9SZXNldCAgICAgICAgICgodTE2KTB4RkZGRSkNCg0KLyogSTJDIEVORFVBTCBtYXNrICovDQojZGVmaW5lIE9BUjJfRU5EVUFMX1NldCAgICAgICAgICgodTE2KTB4MDAwMSkNCiNkZWZpbmUgT0FSMl9FTkRVQUxfUmVzZXQgICAgICAgKCh1MTYpMHhGRkZFKQ0KDQovKiBJMkMgQUREMiBtYXNrICovDQojZGVmaW5lIE9BUjJfQUREMl9SZXNldCAgICAgICAgICgodTE2KTB4RkYwMSkNCg0KLyogSTJDIEYvUyBtYXNrICovDQojZGVmaW5lIENDUl9GU19TZXQgICAgICAgICAgICAgICgodTE2KTB4ODAwMCkNCg0KLyogSTJDIENDUiBtYXNrICovDQojZGVmaW5lIENDUl9DQ1JfU2V0ICAgICAgICAgICAgICgodTE2KTB4MEZGRikNCg0KLyogSTJDIEZMQUcgbWFzayAqLw0KI2RlZmluZSBGTEFHX01hc2sgICAgICAgICAgICAgICAoKHUzMikweDAwRkZGRkZGKQ0KDQovKiBQcml2YXRlIG1hY3JvIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSB2YXJpYWJsZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZnVuY3Rpb24gcHJvdG90eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIGZ1bmN0aW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19EZUluaXQNCiogRGVzY3JpcHRpb24gICAgOiBEZWluaXRpYWxpemVzIHRoZSBJMkN4IHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQNCiogICAgICAgICAgICAgICAgICByZXNldCB2YWx1ZXMuDQoqIElucHV0ICAgICAgICAgIDogLSBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgSTJDX0RlSW5pdChJMkNfVHlwZURlZiogSTJDeCkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCg0KICBzd2l0Y2ggKCoodTMyKikmSTJDeCkNCiAgew0KICAgIGNhc2UgSTJDMV9CQVNFOg0KICAgICAgLyogRW5hYmxlIEkyQzEgcmVzZXQgc3RhdGUgKi8NCiAgICAgIFJDQ19BUEIxUGVyaXBoUmVzZXRDbWQoUkNDX0FQQjFQZXJpcGhfSTJDMSwgRU5BQkxFKTsNCiAgICAgIC8qIFJlbGVhc2UgSTJDMSBmcm9tIHJlc2V0IHN0YXRlICovDQogICAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX0kyQzEsIERJU0FCTEUpOw0KICAgICAgYnJlYWs7DQoNCiAgICBjYXNlIEkyQzJfQkFTRToNCiAgICAgIC8qIEVuYWJsZSBJMkMyIHJlc2V0IHN0YXRlICovDQogICAgICBSQ0NfQVBCMVBlcmlwaFJlc2V0Q21kKFJDQ19BUEIxUGVyaXBoX0kyQzIsIEVOQUJMRSk7DQogICAgICAvKiBSZWxlYXNlIEkyQzIgZnJvbSByZXNldCBzdGF0ZSAqLw0KICAgICAgUkNDX0FQQjFQZXJpcGhSZXNldENtZChSQ0NfQVBCMVBlcmlwaF9JMkMyLCBESVNBQkxFKTsNCiAgICAgIGJyZWFrOw0KDQogICAgZGVmYXVsdDoNCiAgICAgIGJyZWFrOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogSTJDX0luaXQNCiogRGVzY3JpcHRpb24gICAgOiBJbml0aWFsaXplcyB0aGUgSTJDeCBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIA0KKiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIEkyQ19Jbml0U3RydWN0Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBJMkNfSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIEkyQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgdGhhdA0KKiAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZSBzcGVjaWZpZWQNCiogICAgICAgICAgICAgICAgICAgIEkyQyBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEkyQ19Jbml0KEkyQ19UeXBlRGVmKiBJMkN4LCBJMkNfSW5pdFR5cGVEZWYqIEkyQ19Jbml0U3RydWN0KQ0Kew0KICB1MTYgdG1wcmVnID0gMCwgZnJlcXJhbmdlID0gMDsNCiAgdTE2IHJlc3VsdCA9IDB4MDQ7DQogIHUzMiBwY2xrMSA9IDgwMDAwMDA7DQogIFJDQ19DbG9ja3NUeXBlRGVmICByY2NfY2xvY2tzOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQogIGFzc2VydF9wYXJhbShJU19JMkNfTU9ERShJMkNfSW5pdFN0cnVjdC0+STJDX01vZGUpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0kyQ19EVVRZX0NZQ0xFKEkyQ19Jbml0U3RydWN0LT5JMkNfRHV0eUN5Y2xlKSk7DQogIGFzc2VydF9wYXJhbShJU19JMkNfT1dOX0FERFJFU1MxKEkyQ19Jbml0U3RydWN0LT5JMkNfT3duQWRkcmVzczEpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BQ0tfU1RBVEUoSTJDX0luaXRTdHJ1Y3QtPkkyQ19BY2spKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BQ0tOT1dMRURHRV9BRERSRVNTKEkyQ19Jbml0U3RydWN0LT5JMkNfQWNrbm93bGVkZ2VkQWRkcmVzcykpOw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX0NMT0NLX1NQRUVEKEkyQ19Jbml0U3RydWN0LT5JMkNfQ2xvY2tTcGVlZCkpOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTJDeCBDUjIgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICAvKiBHZXQgdGhlIEkyQ3ggQ1IyIHZhbHVlICovDQogIHRtcHJlZyA9IEkyQ3gtPkNSMjsNCiAgLyogQ2xlYXIgZnJlcXVlbmN5IEZSRVFbNTowXSBiaXRzICovDQogIHRtcHJlZyAmPSBDUjJfRlJFUV9SZXNldDsNCiAgLyogR2V0IHBjbGsxIGZyZXF1ZW5jeSB2YWx1ZSAqLw0KICBSQ0NfR2V0Q2xvY2tzRnJlcSgmcmNjX2Nsb2Nrcyk7DQogIHBjbGsxID0gcmNjX2Nsb2Nrcy5QQ0xLMV9GcmVxdWVuY3k7DQogIC8qIFNldCBmcmVxdWVuY3kgYml0cyBkZXBlbmRpbmcgb24gcGNsazEgdmFsdWUgKi8NCiAgZnJlcXJhbmdlID0gKHUxNikocGNsazEgLyAxMDAwMDAwKTsNCiAgdG1wcmVnIHw9IGZyZXFyYW5nZTsNCiAgLyogV3JpdGUgdG8gSTJDeCBDUjIgKi8NCiAgSTJDeC0+Q1IyID0gdG1wcmVnOw0KDQovKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSTJDeCBDQ1IgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBJMkMgcGVyaXBoZXJhbCB0byBjb25maWd1cmUgVFJJU0UgKi8NCiAgSTJDeC0+Q1IxICY9IENSMV9QRV9SZXNldDsNCg0KICAvKiBSZXNldCB0bXByZWcgdmFsdWUgKi8NCiAgLyogQ2xlYXIgRi9TLCBEVVRZIGFuZCBDQ1JbMTE6MF0gYml0cyAqLw0KICB0bXByZWcgPSAwOw0KDQogIC8qIENvbmZpZ3VyZSBzcGVlZCBpbiBzdGFuZGFyZCBtb2RlICovDQogIGlmIChJMkNfSW5pdFN0cnVjdC0+STJDX0Nsb2NrU3BlZWQgPD0gMTAwMDAwKQ0KICB7DQogICAgLyogU3RhbmRhcmQgbW9kZSBzcGVlZCBjYWxjdWxhdGUgKi8NCiAgICByZXN1bHQgPSAodTE2KShwY2xrMSAvIChJMkNfSW5pdFN0cnVjdC0+STJDX0Nsb2NrU3BlZWQgPDwgMSkpOw0KICAgIC8qIFRlc3QgaWYgQ0NSIHZhbHVlIGlzIHVuZGVyIDB4NCovDQogICAgaWYgKHJlc3VsdCA8IDB4MDQpDQogICAgew0KICAgICAgLyogU2V0IG1pbmltdW0gYWxsb3dlZCB2YWx1ZSAqLw0KICAgICAgcmVzdWx0ID0gMHgwNDsgIA0KICAgIH0NCiAgICAvKiBTZXQgc3BlZWQgdmFsdWUgZm9yIHN0YW5kYXJkIG1vZGUgKi8NCiAgICB0bXByZWcgfD0gcmVzdWx0OwkgIA0KICAgIC8qIFNldCBNYXhpbXVtIFJpc2UgVGltZSBmb3Igc3RhbmRhcmQgbW9kZSAqLw0KICAgIEkyQ3gtPlRSSVNFID0gZnJlcXJhbmdlICsgMTsgDQogIH0NCiAgLyogQ29uZmlndXJlIHNwZWVkIGluIGZhc3QgbW9kZSAqLw0KICBlbHNlIC8qKEkyQ19Jbml0U3RydWN0LT5JMkNfQ2xvY2tTcGVlZCA8PSA0MDAwMDApKi8NCiAgew0KICAgIGlmIChJMkNfSW5pdFN0cnVjdC0+STJDX0R1dHlDeWNsZSA9PSBJMkNfRHV0eUN5Y2xlXzIpDQogICAgew0KICAgICAgLyogRmFzdCBtb2RlIHNwZWVkIGNhbGN1bGF0ZTogVGxvdy9UaGlnaCA9IDIgKi8NCiAgICAgIHJlc3VsdCA9ICh1MTYpKHBjbGsxIC8gKEkyQ19Jbml0U3RydWN0LT5JMkNfQ2xvY2tTcGVlZCAqIDMpKTsNCiAgICB9DQogICAgZWxzZSAvKkkyQ19Jbml0U3RydWN0LT5JMkNfRHV0eUN5Y2xlID09IEkyQ19EdXR5Q3ljbGVfMTZfOSovDQogICAgew0KICAgICAgLyogRmFzdCBtb2RlIHNwZWVkIGNhbGN1bGF0ZTogVGxvdy9UaGlnaCA9IDE2LzkgKi8NCiAgICAgIHJlc3VsdCA9ICh1MTYpKHBjbGsxIC8gKEkyQ19Jbml0U3RydWN0LT5JMkNfQ2xvY2tTcGVlZCAqIDI1KSk7DQogICAgICAvKiBTZXQgRFVUWSBiaXQgKi8NCiAgICAgIHJlc3VsdCB8PSBJMkNfRHV0eUN5Y2xlXzE2Xzk7DQogICAgfQ0KICAgIC8qIFRlc3QgaWYgQ0NSIHZhbHVlIGlzIHVuZGVyIDB4MSovDQogICAgaWYgKChyZXN1bHQgJiBDQ1JfQ0NSX1NldCkgPT0gMCkNCiAgICB7DQogICAgICAvKiBTZXQgbWluaW11bSBhbGxvd2VkIHZhbHVlICovDQogICAgICByZXN1bHQgfD0gKHUxNikweDAwMDE7ICANCiAgICB9DQogICAgLyogU2V0IHNwZWVkIHZhbHVlIGFuZCBzZXQgRi9TIGJpdCBmb3IgZmFzdCBtb2RlICovDQogICAgdG1wcmVnIHw9IHJlc3VsdCB8IENDUl9GU19TZXQ7DQogICAgLyogU2V0IE1heGltdW0gUmlzZSBUaW1lIGZvciBmYXN0IG1vZGUgKi8NCiAgICBJMkN4LT5UUklTRSA9ICh1MTYpKCgoZnJlcXJhbmdlICogMzAwKSAvIDEwMDApICsgMSk7ICANCiAgfQ0KICAvKiBXcml0ZSB0byBJMkN4IENDUiAqLw0KICBJMkN4LT5DQ1IgPSB0bXByZWc7DQoNCiAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBJMkMgcGVyaXBoZXJhbCAqLw0KICBJMkN4LT5DUjEgfD0gQ1IxX1BFX1NldDsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEkyQ3ggQ1IxIENvbmZpZ3VyYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgLyogR2V0IHRoZSBJMkN4IENSMSB2YWx1ZSAqLw0KICB0bXByZWcgPSBJMkN4LT5DUjE7DQogIC8qIENsZWFyIEFDSywgU01CVFlQRSBhbmQgIFNNQlVTIGJpdHMgKi8NCiAgdG1wcmVnICY9IENSMV9DTEVBUl9NYXNrOw0KICAvKiBDb25maWd1cmUgSTJDeDogbW9kZSBhbmQgYWNrbm93bGVkZ2VtZW50ICovDQogIC8qIFNldCBTTUJUWVBFIGFuZCBTTUJVUyBiaXRzIGFjY29yZGluZyB0byBJMkNfTW9kZSB2YWx1ZSAqLw0KICAvKiBTZXQgQUNLIGJpdCBhY2NvcmRpbmcgdG8gSTJDX0FjayB2YWx1ZSAqLw0KICB0bXByZWcgfD0gKHUxNikoKHUzMilJMkNfSW5pdFN0cnVjdC0+STJDX01vZGUgfCBJMkNfSW5pdFN0cnVjdC0+STJDX0Fjayk7DQogIC8qIFdyaXRlIHRvIEkyQ3ggQ1IxICovDQogIEkyQ3gtPkNSMSA9IHRtcHJlZzsNCg0KLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEkyQ3ggT0FSMSBDb25maWd1cmF0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiAgLyogU2V0IEkyQ3ggT3duIEFkZHJlc3MxIGFuZCBhY2tub3dsZWRnZWQgYWRkcmVzcyAqLw0KICBJMkN4LT5PQVIxID0gKEkyQ19Jbml0U3RydWN0LT5JMkNfQWNrbm93bGVkZ2VkQWRkcmVzcyB8IEkyQ19Jbml0U3RydWN0LT5JMkNfT3duQWRkcmVzczEpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19TdHJ1Y3RJbml0DQoqIERlc2NyaXB0aW9uICAgIDogRmlsbHMgZWFjaCBJMkNfSW5pdFN0cnVjdCBtZW1iZXIgd2l0aCBpdHMgZGVmYXVsdCB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiAtIEkyQ19Jbml0U3RydWN0OiBwb2ludGVyIHRvIGFuIEkyQ19Jbml0VHlwZURlZiBzdHJ1Y3R1cmUNCiogICAgICAgICAgICAgICAgICAgIHdoaWNoIHdpbGwgYmUgaW5pdGlhbGl6ZWQuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEkyQ19TdHJ1Y3RJbml0KEkyQ19Jbml0VHlwZURlZiogSTJDX0luaXRTdHJ1Y3QpDQp7DQovKi0tLS0tLS0tLS0tLS0tLS0gUmVzZXQgSTJDIGluaXQgc3RydWN0dXJlIHBhcmFtZXRlcnMgdmFsdWVzIC0tLS0tLS0tLS0tLS0tLS0qLw0KICAvKiBJbml0aWFsaXplIHRoZSBJMkNfTW9kZSBtZW1iZXIgKi8NCiAgSTJDX0luaXRTdHJ1Y3QtPkkyQ19Nb2RlID0gSTJDX01vZGVfSTJDOw0KDQogIC8qIEluaXRpYWxpemUgdGhlIEkyQ19EdXR5Q3ljbGUgbWVtYmVyICovDQogIEkyQ19Jbml0U3RydWN0LT5JMkNfRHV0eUN5Y2xlID0gSTJDX0R1dHlDeWNsZV8yOw0KDQogIC8qIEluaXRpYWxpemUgdGhlIEkyQ19Pd25BZGRyZXNzMSBtZW1iZXIgKi8NCiAgSTJDX0luaXRTdHJ1Y3QtPkkyQ19Pd25BZGRyZXNzMSA9IDA7DQoNCiAgLyogSW5pdGlhbGl6ZSB0aGUgSTJDX0FjayBtZW1iZXIgKi8NCiAgSTJDX0luaXRTdHJ1Y3QtPkkyQ19BY2sgPSBJMkNfQWNrX0Rpc2FibGU7DQoNCiAgLyogSW5pdGlhbGl6ZSB0aGUgSTJDX0Fja25vd2xlZGdlZEFkZHJlc3MgbWVtYmVyICovDQogIEkyQ19Jbml0U3RydWN0LT5JMkNfQWNrbm93bGVkZ2VkQWRkcmVzcyA9IEkyQ19BY2tub3dsZWRnZWRBZGRyZXNzXzdiaXQ7DQoNCiAgLyogaW5pdGlhbGl6ZSB0aGUgSTJDX0Nsb2NrU3BlZWQgbWVtYmVyICovDQogIEkyQ19Jbml0U3RydWN0LT5JMkNfQ2xvY2tTcGVlZCA9IDUwMDA7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogSTJDX0NtZA0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBJMkMgcGVyaXBoZXJhbC4NCiogSW5wdXQgICAgICAgICAgOiAtIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgSTJDeCBwZXJpcGhlcmFsLiBUaGlzIHBhcmFtZXRlcg0KKiAgICAgICAgICAgICAgICAgICAgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgSTJDX0NtZChJMkNfVHlwZURlZiogSTJDeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9QRVJJUEgoSTJDeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBJMkMgcGVyaXBoZXJhbCAqLw0KICAgIEkyQ3gtPkNSMSB8PSBDUjFfUEVfU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIEkyQyBwZXJpcGhlcmFsICovDQogICAgSTJDeC0+Q1IxICY9IENSMV9QRV9SZXNldDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19ETUFDbWQNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgSTJDIERNQSByZXF1ZXN0cy4NCiogSW5wdXQgICAgICAgICAgOiAtIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgSTJDIERNQSB0cmFuc2Zlci4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEkyQ19ETUFDbWQoSTJDX1R5cGVEZWYqIEkyQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCg0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgSTJDIERNQSByZXF1ZXN0cyAqLw0KICAgIEkyQ3gtPkNSMiB8PSBDUjJfRE1BRU5fU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIEkyQyBETUEgcmVxdWVzdHMgKi8NCiAgICBJMkN4LT5DUjIgJj0gQ1IyX0RNQUVOX1Jlc2V0Ow0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogSTJDX0RNQUxhc3RUcmFuc2ZlckNtZA0KKiBEZXNjcmlwdGlvbiAgICA6IFNwZWNpZmllcyB0aGF0IHRoZSBuZXh0IERNQSB0cmFuc2ZlciBpcyB0aGUgbGFzdCBvbmUuDQoqIElucHV0ICAgICAgICAgIDogLSBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIEkyQyBETUEgbGFzdCB0cmFuc2Zlci4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEkyQ19ETUFMYXN0VHJhbnNmZXJDbWQoSTJDX1R5cGVEZWYqIEkyQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCg0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIE5leHQgRE1BIHRyYW5zZmVyIGlzIHRoZSBsYXN0IHRyYW5zZmVyICovDQogICAgSTJDeC0+Q1IyIHw9IENSMl9MQVNUX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBOZXh0IERNQSB0cmFuc2ZlciBpcyBub3QgdGhlIGxhc3QgdHJhbnNmZXIgKi8NCiAgICBJMkN4LT5DUjIgJj0gQ1IyX0xBU1RfUmVzZXQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfR2VuZXJhdGVTVEFSVA0KKiBEZXNjcmlwdGlvbiAgICA6IEdlbmVyYXRlcyBJMkN4IGNvbW11bmljYXRpb24gU1RBUlQgY29uZGl0aW9uLg0KKiBJbnB1dCAgICAgICAgICA6IC0gSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBJMkMgU1RBUlQgY29uZGl0aW9uIGdlbmVyYXRpb24uDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgSTJDX0dlbmVyYXRlU1RBUlQoSTJDX1R5cGVEZWYqIEkyQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCg0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEdlbmVyYXRlIGEgU1RBUlQgY29uZGl0aW9uICovDQogICAgSTJDeC0+Q1IxIHw9IENSMV9TVEFSVF9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgU1RBUlQgY29uZGl0aW9uIGdlbmVyYXRpb24gKi8NCiAgICBJMkN4LT5DUjEgJj0gQ1IxX1NUQVJUX1Jlc2V0Ow0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogSTJDX0dlbmVyYXRlU1RPUA0KKiBEZXNjcmlwdGlvbiAgICA6IEdlbmVyYXRlcyBJMkN4IGNvbW11bmljYXRpb24gU1RPUCBjb25kaXRpb24uDQoqIElucHV0ICAgICAgICAgIDogLSBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIEkyQyBTVE9QIGNvbmRpdGlvbiBnZW5lcmF0aW9uLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEkyQ19HZW5lcmF0ZVNUT1AoSTJDX1R5cGVEZWYqIEkyQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCg0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEdlbmVyYXRlIGEgU1RPUCBjb25kaXRpb24gKi8NCiAgICBJMkN4LT5DUjEgfD0gQ1IxX1NUT1BfU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIFNUT1AgY29uZGl0aW9uIGdlbmVyYXRpb24gKi8NCiAgICBJMkN4LT5DUjEgJj0gQ1IxX1NUT1BfUmVzZXQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfQWNrbm93bGVkZ2VDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgSTJDIGFja25vd2xlZGdlIGZlYXR1cmUuDQoqIElucHV0ICAgICAgICAgIDogLSBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIEkyQyBBY2tub3dsZWRnZW1lbnQuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgSTJDX0Fja25vd2xlZGdlQ29uZmlnKEkyQ19UeXBlRGVmKiBJMkN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQoNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIGFja25vd2xlZGdlbWVudCAqLw0KICAgIEkyQ3gtPkNSMSB8PSBDUjFfQUNLX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBhY2tub3dsZWRnZW1lbnQgKi8NCiAgICBJMkN4LT5DUjEgJj0gQ1IxX0FDS19SZXNldDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19Pd25BZGRyZXNzMkNvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IENvbmZpZ3VyZXMgdGhlIHNwZWNpZmllZCBJMkMgb3duIGFkZHJlc3MyLg0KKiBJbnB1dCAgICAgICAgICA6IC0gSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBBZGRyZXNzOiBzcGVjaWZpZXMgdGhlIDdiaXQgSTJDIG93biBhZGRyZXNzMi4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEkyQ19Pd25BZGRyZXNzMkNvbmZpZyhJMkNfVHlwZURlZiogSTJDeCwgdTggQWRkcmVzcykNCnsNCiAgdTE2IHRtcHJlZyA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCg0KICAvKiBHZXQgdGhlIG9sZCByZWdpc3RlciB2YWx1ZSAqLw0KICB0bXByZWcgPSBJMkN4LT5PQVIyOw0KICAvKiBSZXNldCBJMkN4IE93biBhZGRyZXNzMiBiaXQgWzc6MV0gKi8NCiAgdG1wcmVnICY9IE9BUjJfQUREMl9SZXNldDsNCiAgLyogU2V0IEkyQ3ggT3duIGFkZHJlc3MyICovDQogIHRtcHJlZyB8PSAodTE2KShBZGRyZXNzICYgKHUxNikweDAwRkUpOw0KICAvKiBTdG9yZSB0aGUgbmV3IHJlZ2lzdGVyIHZhbHVlICovDQogIEkyQ3gtPk9BUjIgPSB0bXByZWc7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogSTJDX0R1YWxBZGRyZXNzQ21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIEkyQyBkdWFsIGFkZHJlc3NpbmcgbW9kZS4NCiogSW5wdXQgICAgICAgICAgOiAtIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgSTJDIGR1YWwgYWRkcmVzc2luZyBtb2RlLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgSTJDX0R1YWxBZGRyZXNzQ21kKEkyQ19UeXBlRGVmKiBJMkN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQoNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgZHVhbCBhZGRyZXNzaW5nIG1vZGUgKi8NCiAgICBJMkN4LT5PQVIyIHw9IE9BUjJfRU5EVUFMX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIGR1YWwgYWRkcmVzc2luZyBtb2RlICovDQogICAgSTJDeC0+T0FSMiAmPSBPQVIyX0VORFVBTF9SZXNldDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19HZW5lcmFsQ2FsbENtZA0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBJMkMgZ2VuZXJhbCBjYWxsIGZlYXR1cmUuDQoqIElucHV0ICAgICAgICAgIDogLSBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIEkyQyBHZW5lcmFsIGNhbGwuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBJMkNfR2VuZXJhbENhbGxDbWQoSTJDX1R5cGVEZWYqIEkyQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCg0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSBnZW5lcmFsbCBjYWxsICovDQogICAgSTJDeC0+Q1IxIHw9IENSMV9FTkdDX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIGdlbmVyYWxsIGNhbGwgKi8NCiAgICBJMkN4LT5DUjEgJj0gQ1IxX0VOR0NfUmVzZXQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfSVRDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgSTJDIGludGVycnVwdHMuDQoqIElucHV0ICAgICAgICAgIDogLSBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIEkyQ19JVDogc3BlY2lmaWVzIHRoZSBJMkMgaW50ZXJydXB0cyBzb3VyY2VzIHRvIGJlIGVuYWJsZWQNCiogICAgICAgICAgICAgICAgICAgIG9yIGRpc2FibGVkLiANCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24gb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19JVF9CVUY6IEJ1ZmZlciBpbnRlcnJ1cHQgbWFzaw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfSVRfRVZUOiBFdmVudCBpbnRlcnJ1cHQgbWFzaw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfSVRfRVJSOiBFcnJvciBpbnRlcnJ1cHQgbWFzaw0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgc3BlY2lmaWVkIEkyQyBpbnRlcnJ1cHRzLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgSTJDX0lUQ29uZmlnKEkyQ19UeXBlRGVmKiBJMkN4LCB1MTYgSTJDX0lULCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQogIGFzc2VydF9wYXJhbShJU19JMkNfQ09ORklHX0lUKEkyQ19JVCkpOw0KICANCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIEkyQyBpbnRlcnJ1cHRzICovDQogICAgSTJDeC0+Q1IyIHw9IEkyQ19JVDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBJMkMgaW50ZXJydXB0cyAqLw0KICAgIEkyQ3gtPkNSMiAmPSAodTE2KX5JMkNfSVQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfU2VuZERhdGENCiogRGVzY3JpcHRpb24gICAgOiBTZW5kcyBhIGRhdGEgYnl0ZSB0aHJvdWdoIHRoZSBJMkN4IHBlcmlwaGVyYWwuDQoqIElucHV0ICAgICAgICAgIDogLSBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIERhdGE6IEJ5dGUgdG8gYmUgdHJhbnNtaXR0ZWQuLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBJMkNfU2VuZERhdGEoSTJDX1R5cGVEZWYqIEkyQ3gsIHU4IERhdGEpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQoNCiAgLyogV3JpdGUgaW4gdGhlIERSIHJlZ2lzdGVyIHRoZSBkYXRhIHRvIGJlIHNlbnQgKi8NCiAgSTJDeC0+RFIgPSBEYXRhOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19SZWNlaXZlRGF0YQ0KKiBEZXNjcmlwdGlvbiAgICA6IFJldHVybnMgdGhlIG1vc3QgcmVjZW50IHJlY2VpdmVkIGRhdGEgYnkgdGhlIEkyQ3ggcGVyaXBoZXJhbC4NCiogSW5wdXQgICAgICAgICAgOiAtIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBUaGUgdmFsdWUgb2YgdGhlIHJlY2VpdmVkIGRhdGEuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdTggSTJDX1JlY2VpdmVEYXRhKEkyQ19UeXBlRGVmKiBJMkN4KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9QRVJJUEgoSTJDeCkpOw0KDQogIC8qIFJldHVybiB0aGUgZGF0YSBpbiB0aGUgRFIgcmVnaXN0ZXIgKi8NCiAgcmV0dXJuICh1OClJMkN4LT5EUjsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfU2VuZDdiaXRBZGRyZXNzDQoqIERlc2NyaXB0aW9uICAgIDogVHJhbnNtaXRzIHRoZSBhZGRyZXNzIGJ5dGUgdG8gc2VsZWN0IHRoZSBzbGF2ZSBkZXZpY2UuDQoqIElucHV0ICAgICAgICAgIDogLSBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIEFkZHJlc3M6IHNwZWNpZmllcyB0aGUgc2xhdmUgYWRkcmVzcyB3aGljaCB3aWxsIGJlIHRyYW5zbWl0dGVkDQoqICAgICAgICAgICAgICAgICAgLSBJMkNfRGlyZWN0aW9uOiBzcGVjaWZpZXMgd2hldGhlciB0aGUgSTJDIGRldmljZSB3aWxsIGJlIGENCiogICAgICAgICAgICAgICAgICAgIFRyYW5zbWl0dGVyIG9yIGEgUmVjZWl2ZXIuIA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRGlyZWN0aW9uX1RyYW5zbWl0dGVyOiBUcmFuc21pdHRlciBtb2RlDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19EaXJlY3Rpb25fUmVjZWl2ZXI6IFJlY2VpdmVyIG1vZGUNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEkyQ19TZW5kN2JpdEFkZHJlc3MoSTJDX1R5cGVEZWYqIEkyQ3gsIHU4IEFkZHJlc3MsIHU4IEkyQ19EaXJlY3Rpb24pDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQogIGFzc2VydF9wYXJhbShJU19JMkNfRElSRUNUSU9OKEkyQ19EaXJlY3Rpb24pKTsNCg0KICAvKiBUZXN0IG9uIHRoZSBkaXJlY3Rpb24gdG8gc2V0L3Jlc2V0IHRoZSByZWFkL3dyaXRlIGJpdCAqLw0KICBpZiAoSTJDX0RpcmVjdGlvbiAhPSBJMkNfRGlyZWN0aW9uX1RyYW5zbWl0dGVyKQ0KICB7DQogICAgLyogU2V0IHRoZSBhZGRyZXNzIGJpdDAgZm9yIHJlYWQgKi8NCiAgICBBZGRyZXNzIHw9IE9BUjFfQUREMF9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogUmVzZXQgdGhlIGFkZHJlc3MgYml0MCBmb3Igd3JpdGUgKi8NCiAgICBBZGRyZXNzICY9IE9BUjFfQUREMF9SZXNldDsNCiAgfQ0KICAvKiBTZW5kIHRoZSBhZGRyZXNzICovDQogIEkyQ3gtPkRSID0gQWRkcmVzczsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfUmVhZFJlZ2lzdGVyDQoqIERlc2NyaXB0aW9uICAgIDogUmVhZHMgdGhlIHNwZWNpZmllZCBJMkMgcmVnaXN0ZXIgYW5kIHJldHVybnMgaXRzIHZhbHVlLg0KKiBJbnB1dDEgICAgICAgICA6IC0gSTJDX1JlZ2lzdGVyOiBzcGVjaWZpZXMgdGhlIHJlZ2lzdGVyIHRvIHJlYWQuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfUmVnaXN0ZXJfQ1IxOiAgQ1IxIHJlZ2lzdGVyLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfUmVnaXN0ZXJfQ1IyOiAgIENSMiByZWdpc3Rlci4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX1JlZ2lzdGVyX09BUjE6ICBPQVIxIHJlZ2lzdGVyLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfUmVnaXN0ZXJfT0FSMjogIE9BUjIgcmVnaXN0ZXIuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19SZWdpc3Rlcl9EUjogICAgRFIgcmVnaXN0ZXIuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19SZWdpc3Rlcl9TUjE6ICAgU1IxIHJlZ2lzdGVyLg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfUmVnaXN0ZXJfU1IyOiAgIFNSMiByZWdpc3Rlci4NCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX1JlZ2lzdGVyX0NDUjogICBDQ1IgcmVnaXN0ZXIuDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19SZWdpc3Rlcl9UUklTRTogVFJJU0UgcmVnaXN0ZXIuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSB2YWx1ZSBvZiB0aGUgcmVhZCByZWdpc3Rlci4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1MTYgSTJDX1JlYWRSZWdpc3RlcihJMkNfVHlwZURlZiogSTJDeCwgdTggSTJDX1JlZ2lzdGVyKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9QRVJJUEgoSTJDeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX1JFR0lTVEVSKEkyQ19SZWdpc3RlcikpOw0KDQogIC8qIFJldHVybiB0aGUgc2VsZWN0ZWQgcmVnaXN0ZXIgdmFsdWUgKi8NCiAgcmV0dXJuICgqKHZ1MTYgKikoKigodnUzMiAqKSZJMkN4KSArIEkyQ19SZWdpc3RlcikpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19Tb2Z0d2FyZVJlc2V0Q21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIEkyQyBzb2Z0d2FyZSByZXNldC4NCiogSW5wdXQgICAgICAgICAgOiAtIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgSTJDIHNvZnR3YXJlIHJlc2V0Lg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgSTJDX1NvZnR3YXJlUmVzZXRDbWQoSTJDX1R5cGVEZWYqIEkyQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCg0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIFBlcmlwaGVyYWwgdW5kZXIgcmVzZXQgKi8NCiAgICBJMkN4LT5DUjEgfD0gQ1IxX1NXUlNUX1NldDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBQZXJpcGhlcmFsIG5vdCB1bmRlciByZXNldCAqLw0KICAgIEkyQ3gtPkNSMSAmPSBDUjFfU1dSU1RfUmVzZXQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfU01CdXNBbGVydENvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IERyaXZlcyB0aGUgU01CdXNBbGVydCBwaW4gaGlnaCBvciBsb3cgZm9yIHRoZSBzcGVjaWZpZWQgSTJDLg0KKiBJbnB1dCAgICAgICAgICA6IC0gSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBJMkNfU01CdXNBbGVydDogc3BlY2lmaWVzIFNNQkFsZXJ0IHBpbiBsZXZlbC4gDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfU01CdXNBbGVydF9Mb3c6IFNNQkFsZXJ0IHBpbiBkcml2ZW4gbG93DQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19TTUJ1c0FsZXJ0X0hpZ2g6IFNNQkFsZXJ0IHBpbiBkcml2ZW4gaGlnaA0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBJMkNfU01CdXNBbGVydENvbmZpZyhJMkNfVHlwZURlZiogSTJDeCwgdTE2IEkyQ19TTUJ1c0FsZXJ0KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9QRVJJUEgoSTJDeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX1NNQlVTX0FMRVJUKEkyQ19TTUJ1c0FsZXJ0KSk7DQoNCiAgaWYgKEkyQ19TTUJ1c0FsZXJ0ID09IEkyQ19TTUJ1c0FsZXJ0X0xvdykNCiAgew0KICAgIC8qIERyaXZlIHRoZSBTTUJ1c0FsZXJ0IHBpbiBMb3cgKi8NCiAgICBJMkN4LT5DUjEgfD0gSTJDX1NNQnVzQWxlcnRfTG93Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERyaXZlIHRoZSBTTUJ1c0FsZXJ0IHBpbiBIaWdoICAqLw0KICAgIEkyQ3gtPkNSMSAmPSBJMkNfU01CdXNBbGVydF9IaWdoOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogSTJDX1RyYW5zbWl0UEVDDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIEkyQyBQRUMgdHJhbnNmZXIuDQoqIElucHV0ICAgICAgICAgIDogLSBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIEkyQyBQRUMgdHJhbnNtaXNzaW9uLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgSTJDX1RyYW5zbWl0UEVDKEkyQ19UeXBlRGVmKiBJMkN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQoNCiAgaWYgKE5ld1N0YXRlICE9IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIEkyQyBQRUMgdHJhbnNtaXNzaW9uICovDQogICAgSTJDeC0+Q1IxIHw9IENSMV9QRUNfU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIEkyQyBQRUMgdHJhbnNtaXNzaW9uICovDQogICAgSTJDeC0+Q1IxICY9IENSMV9QRUNfUmVzZXQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfUEVDUG9zaXRpb25Db25maWcNCiogRGVzY3JpcHRpb24gICAgOiBTZWxlY3RzIHRoZSBzcGVjaWZpZWQgSTJDIFBFQyBwb3NpdGlvbi4NCiogSW5wdXQgICAgICAgICAgOiAtIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gSTJDX1BFQ1Bvc2l0aW9uOiBzcGVjaWZpZXMgdGhlIFBFQyBwb3NpdGlvbi4gDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfUEVDUG9zaXRpb25fTmV4dDogaW5kaWNhdGVzIHRoYXQgdGhlIG5leHQNCiogICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSBpcyBQRUMNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX1BFQ1Bvc2l0aW9uX0N1cnJlbnQ6IGluZGljYXRlcyB0aGF0IGN1cnJlbnQNCiogICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZSBpcyBQRUMNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgSTJDX1BFQ1Bvc2l0aW9uQ29uZmlnKEkyQ19UeXBlRGVmKiBJMkN4LCB1MTYgSTJDX1BFQ1Bvc2l0aW9uKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9QRVJJUEgoSTJDeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX1BFQ19QT1NJVElPTihJMkNfUEVDUG9zaXRpb24pKTsNCg0KICBpZiAoSTJDX1BFQ1Bvc2l0aW9uID09IEkyQ19QRUNQb3NpdGlvbl9OZXh0KQ0KICB7DQogICAgLyogTmV4dCBieXRlIGluIHNoaWZ0IHJlZ2lzdGVyIGlzIFBFQyAqLw0KICAgIEkyQ3gtPkNSMSB8PSBJMkNfUEVDUG9zaXRpb25fTmV4dDsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBDdXJyZW50IGJ5dGUgaW4gc2hpZnQgcmVnaXN0ZXIgaXMgUEVDICovDQogICAgSTJDeC0+Q1IxICY9IEkyQ19QRUNQb3NpdGlvbl9DdXJyZW50Ow0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogSTJDX0NhbGN1bGF0ZVBFQw0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFBFQyB2YWx1ZSBjYWxjdWxhdGlvbiBvZiB0aGUNCiogICAgICAgICAgICAgICAgICB0cmFuc2ZlcmVkIGJ5dGVzLg0KKiBJbnB1dCAgICAgICAgICA6IC0gSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBJMkN4IFBFQyB2YWx1ZSBjYWxjdWxhdGlvbi4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEkyQ19DYWxjdWxhdGVQRUMoSTJDX1R5cGVEZWYqIEkyQ3gsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0ZVTkNUSU9OQUxfU1RBVEUoTmV3U3RhdGUpKTsNCg0KICBpZiAoTmV3U3RhdGUgIT0gRElTQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgSTJDIFBFQyBjYWxjdWxhdGlvbiAqLw0KICAgIEkyQ3gtPkNSMSB8PSBDUjFfRU5QRUNfU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIEkyQyBQRUMgY2FsY3VsYXRpb24gKi8NCiAgICBJMkN4LT5DUjEgJj0gQ1IxX0VOUEVDX1Jlc2V0Ow0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogSTJDX0dldFBFQw0KKiBEZXNjcmlwdGlvbiAgICA6IFJldHVybnMgdGhlIFBFQyB2YWx1ZSBmb3IgdGhlIHNwZWNpZmllZCBJMkMuDQoqIElucHV0ICAgICAgICAgIDogLSBJMkN4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBJMkMgcGVyaXBoZXJhbC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogVGhlIFBFQyB2YWx1ZS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp1OCBJMkNfR2V0UEVDKEkyQ19UeXBlRGVmKiBJMkN4KQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9QRVJJUEgoSTJDeCkpOw0KDQogIC8qIFJldHVybiB0aGUgc2VsZWN0ZWQgSTJDIFBFQyB2YWx1ZSAqLw0KICByZXR1cm4gKChJMkN4LT5TUjIpID4+IDgpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19BUlBDbWQNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgSTJDIEFSUC4NCiogSW5wdXQgICAgICAgICAgOiAtIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgSTJDeCBBUlAuIA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgSTJDX0FSUENtZChJMkNfVHlwZURlZiogSTJDeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9QRVJJUEgoSTJDeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfRlVOQ1RJT05BTF9TVEFURShOZXdTdGF0ZSkpOw0KDQogIGlmIChOZXdTdGF0ZSAhPSBESVNBQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBzZWxlY3RlZCBJMkMgQVJQICovDQogICAgSTJDeC0+Q1IxIHw9IENSMV9FTkFSUF9TZXQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgc2VsZWN0ZWQgSTJDIEFSUCAqLw0KICAgIEkyQ3gtPkNSMSAmPSBDUjFfRU5BUlBfUmVzZXQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfU3RyZXRjaENsb2NrQ21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIEkyQyBDbG9jayBzdHJldGNoaW5nLg0KKiBJbnB1dCAgICAgICAgICA6IC0gSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBJMkN4IENsb2NrIHN0cmV0Y2hpbmcuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBJMkNfU3RyZXRjaENsb2NrQ21kKEkyQ19UeXBlRGVmKiBJMkN4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQogIGFzc2VydF9wYXJhbShJU19GVU5DVElPTkFMX1NUQVRFKE5ld1N0YXRlKSk7DQoNCiAgaWYgKE5ld1N0YXRlID09IERJU0FCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIEkyQyBDbG9jayBzdHJldGNoaW5nICovDQogICAgSTJDeC0+Q1IxIHw9IENSMV9OT1NUUkVUQ0hfU2V0Ow0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIEkyQyBDbG9jayBzdHJldGNoaW5nICovDQogICAgSTJDeC0+Q1IxICY9IENSMV9OT1NUUkVUQ0hfUmVzZXQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfRmFzdE1vZGVEdXR5Q3ljbGVDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBTZWxlY3RzIHRoZSBzcGVjaWZpZWQgSTJDIGZhc3QgbW9kZSBkdXR5IGN5Y2xlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBJMkNfRHV0eUN5Y2xlOiBzcGVjaWZpZXMgdGhlIGZhc3QgbW9kZSBkdXR5IGN5Y2xlLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0R1dHlDeWNsZV8yOiBJMkMgZmFzdCBtb2RlIFRsb3cvVGhpZ2ggPSAyDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19EdXR5Q3ljbGVfMTZfOTogSTJDIGZhc3QgbW9kZSBUbG93L1RoaWdoID0gMTYvOQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBJMkNfRmFzdE1vZGVEdXR5Q3ljbGVDb25maWcoSTJDX1R5cGVEZWYqIEkyQ3gsIHUxNiBJMkNfRHV0eUN5Y2xlKQ0Kew0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9QRVJJUEgoSTJDeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX0RVVFlfQ1lDTEUoSTJDX0R1dHlDeWNsZSkpOw0KDQogIGlmIChJMkNfRHV0eUN5Y2xlICE9IEkyQ19EdXR5Q3ljbGVfMTZfOSkNCiAgew0KICAgIC8qIEkyQyBmYXN0IG1vZGUgVGxvdy9UaGlnaD0yICovDQogICAgSTJDeC0+Q0NSICY9IEkyQ19EdXR5Q3ljbGVfMjsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBJMkMgZmFzdCBtb2RlIFRsb3cvVGhpZ2g9MTYvOSAqLw0KICAgIEkyQ3gtPkNDUiB8PSBJMkNfRHV0eUN5Y2xlXzE2Xzk7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfR2V0TGFzdEV2ZW50DQoqIERlc2NyaXB0aW9uICAgIDogUmV0dXJucyB0aGUgbGFzdCBJMkN4IEV2ZW50Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBsYXN0IGV2ZW50DQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdTMyIEkyQ19HZXRMYXN0RXZlbnQoSTJDX1R5cGVEZWYqIEkyQ3gpDQp7DQogIHUzMiBsYXN0ZXZlbnQgPSAwOw0KICB1MzIgZmxhZzEgPSAwLCBmbGFnMiA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCg0KICAvKiBSZWFkIHRoZSBJMkN4IHN0YXR1cyByZWdpc3RlciAqLw0KICBmbGFnMSA9IEkyQ3gtPlNSMTsNCiAgZmxhZzIgPSBJMkN4LT5TUjI7DQogIGZsYWcyID0gZmxhZzIgPDwgMTY7DQoNCiAgLyogR2V0IHRoZSBsYXN0IGV2ZW50IHZhbHVlIGZyb20gSTJDIHN0YXR1cyByZWdpc3RlciAqLw0KICBsYXN0ZXZlbnQgPSAoZmxhZzEgfCBmbGFnMikgJiBGTEFHX01hc2s7DQoNCiAgLyogUmV0dXJuIHN0YXR1cyAqLw0KICByZXR1cm4gbGFzdGV2ZW50Ow0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IEkyQ19DaGVja0V2ZW50DQoqIERlc2NyaXB0aW9uICAgIDogQ2hlY2tzIHdoZXRoZXIgdGhlIGxhc3QgSTJDeCBFdmVudCBpcyBlcXVhbCB0byB0aGUgb25lIHBhc3NlZA0KKiAgICAgICAgICAgICAgICAgIGFzIHBhcmFtZXRlci4NCiogSW5wdXQgICAgICAgICAgOiAtIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gSTJDX0VWRU5UOiBzcGVjaWZpZXMgdGhlIGV2ZW50IHRvIGJlIGNoZWNrZWQuIA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0VWRU5UX1NMQVZFX0FERFJFU1NfTUFUQ0hFRCAgIDogRVYxDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19FVkVOVF9TTEFWRV9CWVRFX1JFQ0VJVkVEICAgICA6IEVWMg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRVZFTlRfU0xBVkVfQllURV9UUkFOU01JVFRFRCAgOiBFVjMNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0VWRU5UX1NMQVZFX0FDS19GQUlMVVJFICAgICAgIDogRVYzLTINCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0VWRU5UX01BU1RFUl9NT0RFX1NFTEVDVCAgICAgIDogRVY1DQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19FVkVOVF9NQVNURVJfTU9ERV9TRUxFQ1RFRCAgICA6IEVWNg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRVZFTlRfTUFTVEVSX0JZVEVfUkVDRUlWRUQgICAgOiBFVjcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0VWRU5UX01BU1RFUl9CWVRFX1RSQU5TTUlUVEVEIDogRVY4DQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19FVkVOVF9NQVNURVJfTU9ERV9BRERSRVNTMTAgICA6IEVWOQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRVZFTlRfU0xBVkVfU1RPUF9ERVRFQ1RFRCAgICAgOiBFVjQNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogQW4gRXJyb3JTdGF0dXMgZW51bXVyYXRpb24gdmFsdWU6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFNVQ0NFU1M6IExhc3QgZXZlbnQgaXMgZXF1YWwgdG8gdGhlIEkyQ19FVkVOVA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBFUlJPUjogTGFzdCBldmVudCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgSTJDX0VWRU5UDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KRXJyb3JTdGF0dXMgSTJDX0NoZWNrRXZlbnQoSTJDX1R5cGVEZWYqIEkyQ3gsIHUzMiBJMkNfRVZFTlQpDQp7DQogIHUzMiBsYXN0ZXZlbnQgPSAwOw0KICB1MzIgZmxhZzEgPSAwLCBmbGFnMiA9IDA7DQogIEVycm9yU3RhdHVzIHN0YXR1cyA9IEVSUk9SOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQogIGFzc2VydF9wYXJhbShJU19JMkNfRVZFTlQoSTJDX0VWRU5UKSk7DQoNCiAgLyogUmVhZCB0aGUgSTJDeCBzdGF0dXMgcmVnaXN0ZXIgKi8NCiAgZmxhZzEgPSBJMkN4LT5TUjE7DQogIGZsYWcyID0gSTJDeC0+U1IyOw0KICBmbGFnMiA9IGZsYWcyIDw8IDE2Ow0KDQogIC8qIEdldCB0aGUgbGFzdCBldmVudCB2YWx1ZSBmcm9tIEkyQyBzdGF0dXMgcmVnaXN0ZXIgKi8NCiAgbGFzdGV2ZW50ID0gKGZsYWcxIHwgZmxhZzIpICYgRkxBR19NYXNrOw0KDQogIC8qIENoZWNrIHdoZXRoZXIgdGhlIGxhc3QgZXZlbnQgaXMgZXF1YWwgdG8gSTJDX0VWRU5UICovDQogIGlmIChsYXN0ZXZlbnQgPT0gSTJDX0VWRU5UICkNCiAgew0KICAgIC8qIFNVQ0NFU1M6IGxhc3QgZXZlbnQgaXMgZXF1YWwgdG8gSTJDX0VWRU5UICovDQogICAgc3RhdHVzID0gU1VDQ0VTUzsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBFUlJPUjogbGFzdCBldmVudCBpcyBkaWZmZXJlbnQgZnJvbSBJMkNfRVZFTlQgKi8NCiAgICBzdGF0dXMgPSBFUlJPUjsNCiAgfQ0KDQogIC8qIFJldHVybiBzdGF0dXMgKi8NCiAgcmV0dXJuIHN0YXR1czsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfR2V0RmxhZ1N0YXR1cw0KKiBEZXNjcmlwdGlvbiAgICA6IENoZWNrcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgSTJDIGZsYWcgaXMgc2V0IG9yIG5vdC4NCiogSW5wdXQgICAgICAgICAgOiAtIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4gDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19EVUFMRjogRHVhbCBmbGFnIChTbGF2ZSBtb2RlKQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19TTUJIT1NUOiBTTUJ1cyBob3N0IGhlYWRlciAoU2xhdmUgbW9kZSkNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfU01CREVGQVVMVDogU01CdXMgZGVmYXVsdCBoZWFkZXIgKFNsYXZlIG1vZGUpDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19GTEFHX0dFTkNBTEw6IEdlbmVyYWwgY2FsbCBoZWFkZXIgZmxhZyAoU2xhdmUgbW9kZSkNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfVFJBOiBUcmFuc21pdHRlci9SZWNlaXZlciBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19GTEFHX0JVU1k6IEJ1cyBidXN5IGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfTVNMOiBNYXN0ZXIvU2xhdmUgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19TTUJBTEVSVDogU01CdXMgQWxlcnQgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19USU1FT1VUOiBUaW1lb3V0IG9yIFRsb3cgZXJyb3IgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19QRUNFUlI6IFBFQyBlcnJvciBpbiByZWNlcHRpb24gZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19PVlI6IE92ZXJydW4vVW5kZXJydW4gZmxhZyAoU2xhdmUgbW9kZSkNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfQUY6IEFja25vd2xlZGdlIGZhaWx1cmUgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19BUkxPOiBBcmJpdHJhdGlvbiBsb3N0IGZsYWcgKE1hc3RlciBtb2RlKQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19CRVJSOiBCdXMgZXJyb3IgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19UWEU6IERhdGEgcmVnaXN0ZXIgZW1wdHkgZmxhZyAoVHJhbnNtaXR0ZXIpDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19GTEFHX1JYTkU6IERhdGEgcmVnaXN0ZXIgbm90IGVtcHR5IChSZWNlaXZlcikgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19TVE9QRjogU3RvcCBkZXRlY3Rpb24gZmxhZyAoU2xhdmUgbW9kZSkNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfQUREMTA6IDEwLWJpdCBoZWFkZXIgc2VudCBmbGFnIChNYXN0ZXIgbW9kZSkNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfQlRGOiBCeXRlIHRyYW5zZmVyIGZpbmlzaGVkIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfQUREUjogQWRkcmVzcyBzZW50IGZsYWcgKE1hc3RlciBtb2RlKSCTQURTTJQNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBtYXRjaGVkIGZsYWcgKFNsYXZlIG1vZGUplEVOREFElA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19TQjogU3RhcnQgYml0IGZsYWcgKE1hc3RlciBtb2RlKQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBUaGUgbmV3IHN0YXRlIG9mIEkyQ19GTEFHIChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCkZsYWdTdGF0dXMgSTJDX0dldEZsYWdTdGF0dXMoSTJDX1R5cGVEZWYqIEkyQ3gsIHUzMiBJMkNfRkxBRykNCnsNCiAgRmxhZ1N0YXR1cyBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgdTMyIGkyY3N0YXR1cyA9IDA7DQogIHUzMiBmbGFnMSA9IDAsIGZsYWcyID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9QRVJJUEgoSTJDeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX0dFVF9GTEFHKEkyQ19GTEFHKSk7DQoNCiAgLyogUmVhZCB0aGUgSTJDeCBzdGF0dXMgcmVnaXN0ZXIgKi8NCiAgZmxhZzEgPSBJMkN4LT5TUjE7DQogIGZsYWcyID0gSTJDeC0+U1IyOw0KICBmbGFnMiA9IChmbGFnMiAmIEZMQUdfTWFzaykgPDwgMTY7DQoNCiAgLyogR2V0IHRoZSBJMkMgc3RhdHVzIHZhbHVlICovDQogIGkyY3N0YXR1cyA9IGZsYWcxIHwgZmxhZzI7DQoNCiAgLyogR2V0IGJpdFsyMzowXSBvZiB0aGUgZmxhZyAqLw0KICBJMkNfRkxBRyAmPSBGTEFHX01hc2s7DQoNCiAgLyogQ2hlY2sgdGhlIHN0YXR1cyBvZiB0aGUgc3BlY2lmaWVkIEkyQyBmbGFnICovDQogIGlmICgoaTJjc3RhdHVzICYgSTJDX0ZMQUcpICE9ICh1MzIpUkVTRVQpDQogIHsNCiAgICAvKiBJMkNfRkxBRyBpcyBzZXQgKi8NCiAgICBiaXRzdGF0dXMgPSBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogSTJDX0ZMQUcgaXMgcmVzZXQgKi8NCiAgICBiaXRzdGF0dXMgPSBSRVNFVDsNCiAgfQ0KICAvKiBSZXR1cm4gdGhlIEkyQ19GTEFHIHN0YXR1cyAqLw0KICByZXR1cm4gIGJpdHN0YXR1czsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfQ2xlYXJGbGFnDQoqIERlc2NyaXB0aW9uICAgIDogQ2xlYXJzIHRoZSBJMkN4J3MgcGVuZGluZyBmbGFncy4NCiogSW5wdXQgICAgICAgICAgOiAtIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjbGVhci4gDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19TTUJBTEVSVDogU01CdXMgQWxlcnQgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19USU1FT1VUOiBUaW1lb3V0IG9yIFRsb3cgZXJyb3IgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19QRUNFUlI6IFBFQyBlcnJvciBpbiByZWNlcHRpb24gZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19PVlI6IE92ZXJydW4vVW5kZXJydW4gZmxhZyAoU2xhdmUgbW9kZSkNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfQUY6IEFja25vd2xlZGdlIGZhaWx1cmUgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19BUkxPOiBBcmJpdHJhdGlvbiBsb3N0IGZsYWcgKE1hc3RlciBtb2RlKQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19CRVJSOiBCdXMgZXJyb3IgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19TVE9QRjogU3RvcCBkZXRlY3Rpb24gZmxhZyAoU2xhdmUgbW9kZSkNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfQUREMTA6IDEwLWJpdCBoZWFkZXIgc2VudCBmbGFnIChNYXN0ZXIgbW9kZSkNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfQlRGOiBCeXRlIHRyYW5zZmVyIGZpbmlzaGVkIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0ZMQUdfQUREUjogQWRkcmVzcyBzZW50IGZsYWcgKE1hc3RlciBtb2RlKSCTQURTTJQNCiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQWRkcmVzcyBtYXRjaGVkIGZsYWcgKFNsYXZlIG1vZGUplEVOREFElA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfRkxBR19TQjogU3RhcnQgYml0IGZsYWcgKE1hc3RlciBtb2RlKQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBJMkNfQ2xlYXJGbGFnKEkyQ19UeXBlRGVmKiBJMkN4LCB1MzIgSTJDX0ZMQUcpDQp7DQogIHUzMiBmbGFncG9zID0gMDsNCiAgdTMyIGZsYWdpbmRleCA9IDA7DQoNCiAgLyogQ2hlY2sgdGhlIHBhcmFtZXRlcnMgKi8NCiAgYXNzZXJ0X3BhcmFtKElTX0kyQ19BTExfUEVSSVBIKEkyQ3gpKTsNCiAgYXNzZXJ0X3BhcmFtKElTX0kyQ19DTEVBUl9GTEFHKEkyQ19GTEFHKSk7DQoNCiAgLyogR2V0IHRoZSBJMkMgZmxhZyBwb3NpdGlvbiAqLw0KICBmbGFncG9zID0gSTJDX0ZMQUcgJiBGTEFHX01hc2s7DQoNCiAgLyogR2V0IHRoZSBJMkMgZmxhZyBpbmRleCAqLw0KICBmbGFnaW5kZXggPSBJMkNfRkxBRyA+PiAyODsNCg0KICAvKiBDbGVhciB0aGUgZmxhZyBieSB3cml0aW5nIDAgKi8NCiAgaWYgKGZsYWdpbmRleCA9PSAxKQ0KICB7DQogICAgLyogQ2xlYXIgdGhlIHNlbGVjdGVkIEkyQyBmbGFnICovDQogICAgSTJDeC0+U1IxID0gKHUxNil+ZmxhZ3BvczsNCiAgfQ0KICAvKiBGbGFncyB0aGF0IG5lZWQgYSByZWFkIG9mIHRoZSBTUjEgcmVnaXN0ZXIgdG8gYmUgY2xlYXJlZCAqLw0KICBlbHNlIGlmIChmbGFnaW5kZXggPT0gMikNCiAgew0KICAgIC8qIFJlYWQgdGhlIFNSMSByZWdpc3RlciAqLw0KICAgICh2b2lkKUkyQ3gtPlNSMTsNCiAgfQ0KICAvKiBGbGFncyB0aGF0IG5lZWQgYSByZWFkIG9mIFNSMSBhbmQgYSB3cml0ZSBvbiBDUjEgcmVnaXN0ZXJzIHRvIGJlIGNsZWFyZWQgKi8NCiAgZWxzZSBpZiAoZmxhZ2luZGV4ID09IDYpDQogIHsNCiAgICAvKiBSZWFkIHRoZSBTUjEgcmVnaXN0ZXIgKi8NCiAgICAodm9pZClJMkN4LT5TUjE7DQoNCiAgICAvKiBXcml0ZSBvbiB0aGUgQ1IxIHJlZ2lzdGVyICovDQogICAgSTJDeC0+Q1IxIHw9IENSMV9QRV9TZXQ7DQogIH0NCiAgLyogRmxhZ3MgdGhhdCBuZWVkIGEgcmVhZCBvZiBTUjEgYW5kIFNSMiByZWdpc3RlcnMgdG8gYmUgY2xlYXJlZCAqLw0KICBlbHNlIC8qZmxhZ2luZGV4ID09IDB4QSovDQogIHsNCiAgICAvKiBSZWFkIHRoZSBTUjEgcmVnaXN0ZXIgKi8NCiAgICAodm9pZClJMkN4LT5TUjE7DQoNCiAgICAvKiBSZWFkIHRoZSBTUjIgcmVnaXN0ZXIgKi8NCiAgICAodm9pZClJMkN4LT5TUjI7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfR2V0SVRTdGF0dXMNCiogRGVzY3JpcHRpb24gICAgOiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIEkyQyBpbnRlcnJ1cHQgaGFzIG9jY3VycmVkIG9yIG5vdC4NCiogSW5wdXQgICAgICAgICAgOiAtIEkyQ3g6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIEkyQyBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gSTJDX0lUOiBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBzb3VyY2UgdG8gY2hlY2suIA0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIG9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlczoNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0lUX1NNQkFMRVJUOiBTTUJ1cyBBbGVydCBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19JVF9USU1FT1VUOiBUaW1lb3V0IG9yIFRsb3cgZXJyb3IgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfSVRfUEVDRVJSOiBQRUMgZXJyb3IgaW4gcmVjZXB0aW9uIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0lUX09WUjogT3ZlcnJ1bi9VbmRlcnJ1biBmbGFnIChTbGF2ZSBtb2RlKQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfSVRfQUY6IEFja25vd2xlZGdlIGZhaWx1cmUgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfSVRfQVJMTzogQXJiaXRyYXRpb24gbG9zdCBmbGFnIChNYXN0ZXIgbW9kZSkNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0lUX0JFUlI6IEJ1cyBlcnJvciBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19JVF9UWEU6IERhdGEgcmVnaXN0ZXIgZW1wdHkgZmxhZyAoVHJhbnNtaXR0ZXIpDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19JVF9SWE5FOiBEYXRhIHJlZ2lzdGVyIG5vdCBlbXB0eSAoUmVjZWl2ZXIpIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0lUX1NUT1BGOiBTdG9wIGRldGVjdGlvbiBmbGFnIChTbGF2ZSBtb2RlKQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfSVRfQUREMTA6IDEwLWJpdCBoZWFkZXIgc2VudCBmbGFnIChNYXN0ZXIgbW9kZSkNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0lUX0JURjogQnl0ZSB0cmFuc2ZlciBmaW5pc2hlZCBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19JVF9BRERSOiBBZGRyZXNzIHNlbnQgZmxhZyAoTWFzdGVyIG1vZGUpIJNBRFNMlA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRyZXNzIG1hdGNoZWQgZmxhZyAoU2xhdmUgbW9kZSmURU5EQUSUDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19JVF9TQjogU3RhcnQgYml0IGZsYWcgKE1hc3RlciBtb2RlKQ0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBUaGUgbmV3IHN0YXRlIG9mIEkyQ19JVCAoU0VUIG9yIFJFU0VUKS4NCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQpJVFN0YXR1cyBJMkNfR2V0SVRTdGF0dXMoSTJDX1R5cGVEZWYqIEkyQ3gsIHUzMiBJMkNfSVQpDQp7DQogIElUU3RhdHVzIGJpdHN0YXR1cyA9IFJFU0VUOw0KICB1MzIgaTJjc3RhdHVzID0gMDsNCiAgdTMyIGZsYWcxID0gMCwgZmxhZzIgPSAwOw0KDQogIC8qIENoZWNrIHRoZSBwYXJhbWV0ZXJzICovDQogIGFzc2VydF9wYXJhbShJU19JMkNfQUxMX1BFUklQSChJMkN4KSk7DQogIGFzc2VydF9wYXJhbShJU19JMkNfR0VUX0lUKEkyQ19JVCkpOw0KDQogIC8qIFJlYWQgdGhlIEkyQ3ggc3RhdHVzIHJlZ2lzdGVyICovDQogIGZsYWcxID0gSTJDeC0+U1IxOw0KICBmbGFnMiA9IEkyQ3gtPlNSMjsNCiAgZmxhZzIgPSAoZmxhZzIgJiBGTEFHX01hc2spIDw8IDE2Ow0KDQogIC8qIEdldCB0aGUgSTJDIHN0YXR1cyB2YWx1ZSAqLw0KICBpMmNzdGF0dXMgPSBmbGFnMSB8IGZsYWcyOw0KDQogIC8qIEdldCBiaXRbMjM6MF0gb2YgdGhlIGZsYWcgKi8NCiAgSTJDX0lUICY9IEZMQUdfTWFzazsNCg0KICAvKiBDaGVjayB0aGUgc3RhdHVzIG9mIHRoZSBzcGVjaWZpZWQgSTJDIGZsYWcgKi8NCiAgaWYgKChpMmNzdGF0dXMgJiBJMkNfSVQpICE9ICh1MzIpUkVTRVQpDQogIHsNCiAgICAvKiBJMkNfSVQgaXMgc2V0ICovDQogICAgYml0c3RhdHVzID0gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIEkyQ19JVCBpcyByZXNldCAqLw0KICAgIGJpdHN0YXR1cyA9IFJFU0VUOw0KICB9DQogIC8qIFJldHVybiB0aGUgSTJDX0lUIHN0YXR1cyAqLw0KICByZXR1cm4gIGJpdHN0YXR1czsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBJMkNfQ2xlYXJJVFBlbmRpbmdCaXQNCiogRGVzY3JpcHRpb24gICAgOiBDbGVhcnMgdGhlIEkyQ3iScyBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzLg0KKiBJbnB1dCAgICAgICAgICA6IC0gSTJDeDogd2hlcmUgeCBjYW4gYmUgMSBvciAyIHRvIHNlbGVjdCB0aGUgSTJDIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBJMkNfSVQ6IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHBlbmRpbmcgYml0IHRvIGNsZWFyLiANCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19JVF9TTUJBTEVSVDogU01CdXMgQWxlcnQgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfSVRfVElNRU9VVDogVGltZW91dCBvciBUbG93IGVycm9yIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0lUX1BFQ0VSUjogUEVDIGVycm9yIGluIHJlY2VwdGlvbiBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19JVF9PVlI6IE92ZXJydW4vVW5kZXJydW4gZmxhZyAoU2xhdmUgbW9kZSkNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0lUX0FGOiBBY2tub3dsZWRnZSBmYWlsdXJlIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0lUX0FSTE86IEFyYml0cmF0aW9uIGxvc3QgZmxhZyAoTWFzdGVyIG1vZGUpDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19JVF9CRVJSOiBCdXMgZXJyb3IgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfSVRfU1RPUEY6IFN0b3AgZGV0ZWN0aW9uIGZsYWcgKFNsYXZlIG1vZGUpDQoqICAgICAgICAgICAgICAgICAgICAgICAtIEkyQ19JVF9BREQxMDogMTAtYml0IGhlYWRlciBzZW50IGZsYWcgKE1hc3RlciBtb2RlKQ0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBJMkNfSVRfQlRGOiBCeXRlIHRyYW5zZmVyIGZpbmlzaGVkIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0lUX0FERFI6IEFkZHJlc3Mgc2VudCBmbGFnIChNYXN0ZXIgbW9kZSkgk0FEU0yUDQoqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZHJlc3MgbWF0Y2hlZCBmbGFnIChTbGF2ZSBtb2RlKZRFTkRBRJQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gSTJDX0lUX1NCOiBTdGFydCBiaXQgZmxhZyAoTWFzdGVyIG1vZGUpDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIEkyQ19DbGVhcklUUGVuZGluZ0JpdChJMkNfVHlwZURlZiogSTJDeCwgdTMyIEkyQ19JVCkNCnsNCiAgdTMyIGZsYWdwb3MgPSAwOw0KICB1MzIgZmxhZ2luZGV4ID0gMDsNCg0KICAvKiBDaGVjayB0aGUgcGFyYW1ldGVycyAqLw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX0FMTF9QRVJJUEgoSTJDeCkpOw0KICBhc3NlcnRfcGFyYW0oSVNfSTJDX0NMRUFSX0lUKEkyQ19JVCkpOw0KDQogIC8qIEdldCB0aGUgSTJDIGZsYWcgcG9zaXRpb24gKi8NCiAgZmxhZ3BvcyA9IEkyQ19JVCAmIEZMQUdfTWFzazsNCg0KICAvKiBHZXQgdGhlIEkyQyBmbGFnIGluZGV4ICovDQogIGZsYWdpbmRleCA9IEkyQ19JVCA+PiAyODsNCg0KICAvKiBDbGVhciB0aGUgZmxhZyBieSB3cml0aW5nIDAgKi8NCiAgaWYgKGZsYWdpbmRleCA9PSAxKQ0KICB7DQogICAgLyogQ2xlYXIgdGhlIHNlbGVjdGVkIEkyQyBmbGFnICovDQogICAgSTJDeC0+U1IxID0gKHUxNil+ZmxhZ3BvczsNCiAgfQ0KICAvKiBGbGFncyB0aGF0IG5lZWQgYSByZWFkIG9mIHRoZSBTUjEgcmVnaXN0ZXIgdG8gYmUgY2xlYXJlZCAqLw0KICBlbHNlIGlmIChmbGFnaW5kZXggPT0gMikNCiAgew0KICAgIC8qIFJlYWQgdGhlIFNSMSByZWdpc3RlciAqLw0KICAgICh2b2lkKUkyQ3gtPlNSMTsNCiAgfQ0KICAvKiBGbGFncyB0aGF0IG5lZWQgYSByZWFkIG9mIFNSMSBhbmQgYSB3cml0ZSBvbiBDUjEgcmVnaXN0ZXJzIHRvIGJlIGNsZWFyZWQgKi8NCiAgZWxzZSBpZiAoZmxhZ2luZGV4ID09IDYpDQogIHsNCiAgICAvKiBSZWFkIHRoZSBTUjEgcmVnaXN0ZXIgKi8NCiAgICAodm9pZClJMkN4LT5TUjE7DQoNCiAgICAvKiBXcml0ZSBvbiB0aGUgQ1IxIHJlZ2lzdGVyICovDQogICAgSTJDeC0+Q1IxIHw9IENSMV9QRV9TZXQ7DQogIH0NCiAgLyogRmxhZ3MgdGhhdCBuZWVkIGEgcmVhZCBvZiBTUjEgYW5kIFNSMiByZWdpc3RlcnMgdG8gYmUgY2xlYXJlZCAqLw0KICBlbHNlIC8qZmxhZ2luZGV4ID09IDB4QSovDQogIHsNCiAgICAvKiBSZWFkIHRoZSBTUjEgcmVnaXN0ZXIgKi8NCiAgICAodm9pZClJMkN4LT5TUjE7DQoNCiAgICAvKiBSZWFkIHRoZSBTUjIgcmVnaXN0ZXIgKi8NCiAgICAodm9pZClJMkN4LT5TUjI7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCAyMDA4IFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8NCg==