LyoqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwNiBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKioqKioqKioqKioqKioqKioNCiogRmlsZSBOYW1lICAgICAgICAgIDogNzV4X3VhcnQuYw0KKiBBdXRob3IgICAgICAgICAgICAgOiBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KKiBEYXRlIEZpcnN0IElzc3VlZCAgOiAwMy8xMC8yMDA2DQoqIERlc2NyaXB0aW9uICAgICAgICA6IFRoaXMgZmlsZSBwcm92aWRlcyBhbGwgdGhlIFVBUlQgc29mdHdhcmUgZnVuY3Rpb25zLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogSGlzdG9yeToNCiogMDcvMTcvMjAwNiA6IFYxLjANCiogMDMvMTAvMjAwNiA6IFYwLjENCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIFRIRSBQUkVTRU5UIFNPRlRXQVJFIFdISUNIIElTIEZPUiBHVUlEQU5DRSBPTkxZIEFJTVMgQVQgUFJPVklESU5HIENVU1RPTUVSUw0KKiBXSVRIIENPRElORyBJTkZPUk1BVElPTiBSRUdBUkRJTkcgVEhFSVIgUFJPRFVDVFMgSU4gT1JERVIgRk9SIFRIRU0gVE8gU0FWRSBUSU1FLg0KKiBBUyBBIFJFU1VMVCwgU1RNSUNST0VMRUNUUk9OSUNTIFNIQUxMIE5PVCBCRSBIRUxEIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwNCiogSU5ESVJFQ1QgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIFdJVEggUkVTUEVDVCBUTyBBTlkgQ0xBSU1TIEFSSVNJTkcgRlJPTSBUSEUNCiogQ09OVEVOVCBPRiBTVUNIIFNPRlRXQVJFIEFORC9PUiBUSEUgVVNFIE1BREUgQlkgQ1VTVE9NRVJTIE9GIFRIRSBDT0RJTkcNCiogSU5GT1JNQVRJT04gQ09OVEFJTkVEIEhFUkVJTiBJTiBDT05ORUNUSU9OIFdJVEggVEhFSVIgUFJPRFVDVFMuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KDQovKiBJbmNsdWRlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KI2luY2x1ZGUgIjc1eF91YXJ0LmgiDQojaW5jbHVkZSAiNzV4X21yY2MuaCINCg0KLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBVQVJUIExJTiBNYXNrICovDQojZGVmaW5lIFVBUlRfTElOX0Rpc2FibGVfTWFzayAgICAgICAgICAgMHhGRUZGIC8qIExJTiBEaXNhYmxlIE1hc2sgKi8NCiNkZWZpbmUgVUFSVF9MSU5fRW5hYmxlX01hc2sgICAgICAgICAgICAweDAxMDAgLyogTElOIEVuYWJsZSBNYXNrICovDQoNCi8qIFVBUlQgTWFzayAqLw0KI2RlZmluZSBVQVJUX0VuYWJsZV9NYXNrICAgICAgICAgICAgICAgIDB4MDAwMSAvKiBVQVJUIEVuYWJsZSBNYXNrICovDQojZGVmaW5lIFVBUlRfRGlzYWJsZV9NYXNrICAgICAgICAgICAgICAgMHhGRkZFIC8qIFVBUlQgRGlzYWJsZSBNYXNrICovDQoNCi8qIFVBUlQgTG9vcEJhY2sgKi8NCiNkZWZpbmUgVUFSVF9Mb29wQmFja19EaXNhYmxlX01hc2sgICAgICAweEZGN0YvKiBMb29wQmFjayBEaXNhYmxlIE1hc2sgKi8NCiNkZWZpbmUgVUFSVF9Mb29wQmFja19FbmFibGVfTWFzayAgICAgICAweDAwODAvKiBMb29wQmFjayBFbmFibGUgTWFzayAqLw0KDQojZGVmaW5lIFVBUlRfV29yZExlbmd0aF9NYXNrICAgICAgICAgICAgMHhGRjlGICAvKiBVQVJUIFdvcmQgTGVuZ3RoIE1hc2sgKi8NCiNkZWZpbmUgVUFSVF9QYXJpdHlfTWFzayAgICAgICAgICAgICAgICAweEZGNzkgIC8qIFVBUlQgUGFyaXR5IE1hc2sgKi8NCiNkZWZpbmUgVUFSVF9IYXJkd2FyZUZsb3dDb250cm9sX01hc2sgICAweDNGRkYgIC8qIFVBUlQgSGFyZHdhcmUgRmxvdyBDb250cm9sIE1hc2sgKi8NCiNkZWZpbmUgVUFSVF9UeFJ4RklGT0xldmVsX01hc2sgICAgICAgICAweEZGQzAgIC8qIFVBUlQgVHggUnggRklGTyBMZXZlbCBNYXNrICovDQojZGVmaW5lIFVBUlRfTElOQnJlYWtMZW5ndGhfTWFzayAgICAgICAgMHhFMUZGICAvKiBVQVJUIExJTiBCcmVhayBMZW5ndGggTWFzayAqLw0KI2RlZmluZSBVQVJUX0JyZWFrQ2hhcl9NYXNrICAgICAgICAgICAgIDB4MDAwMSAgLyogVUFSVCBCcmVhayBDaGFyYWN0ZXIgc2VuZCBNYXNrICovDQojZGVmaW5lIFVBUlRfRkxBR19NYXNrICAgICAgICAgICAgICAgICAgMHgxRiAgICAvKiBVQVJUIEZsYWcgTWFzayAqLw0KI2RlZmluZSBVQVJUX01vZGVfTWFzayAgICAgICAgICAgICAgICAgIDB4RkNGRiAgLyogVUFSVCBNb2RlIE1hc2sgKi8NCiNkZWZpbmUgVUFSVF9SVFNTRVRfTWFzayAgICAgICAgICAgICAgICAweEY3RkYgIC8qIFJUUyBzaWduYWwgaXMgaGlnaCAqLw0KI2RlZmluZSBVQVJUX1JUU1JFU0VUX01hc2sgICAgICAgICAgICAgIDB4MDgwMCAgLyogUlRTIHNpZ25hbCBpcyBsb3cgKi8NCg0KLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBVQVJUX0RlSW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IERlaW5pdGlhbGl6ZXMgdGhlIFVBUlR4IHBlcmlwaGVyYWwgcmVnaXN0ZXJzIHRvIHRoZWlyIGRlZmF1bHQNCiogICAgICAgICAgICAgICAgICByZXNldCB2YWx1ZXMuDQoqIElucHV0ICAgICAgICAgIDogVUFSVHg6IHdoZXJlIHggY2FuIGJlIDAsMSBvciAyIHRvIHNlbGVjdCB0aGUgVUFSVCBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVQVJUX0RlSW5pdChVQVJUX1R5cGVEZWYqIFVBUlR4KQ0Kew0KICAvKiBSZXNldCB0aGUgVUFSVHggcmVnaXN0ZXJzIHZhbHVlcyAqLw0KICBpZihVQVJUeCA9PSBVQVJUMCkNCiAgew0KICAgIE1SQ0NfUGVyaXBoZXJhbFNXUmVzZXRDb25maWcoTVJDQ19QZXJpcGhlcmFsX1VBUlQwLEVOQUJMRSk7DQogICAgTVJDQ19QZXJpcGhlcmFsU1dSZXNldENvbmZpZyhNUkNDX1BlcmlwaGVyYWxfVUFSVDAsRElTQUJMRSk7DQogIH0NCiAgZWxzZSBpZihVQVJUeCA9PSBVQVJUMSkNCiAgew0KICAgIE1SQ0NfUGVyaXBoZXJhbFNXUmVzZXRDb25maWcoTVJDQ19QZXJpcGhlcmFsX1VBUlQxLEVOQUJMRSk7DQogICAgTVJDQ19QZXJpcGhlcmFsU1dSZXNldENvbmZpZyhNUkNDX1BlcmlwaGVyYWxfVUFSVDEsRElTQUJMRSk7DQogIH0NCiAgZWxzZSBpZihVQVJUeCA9PSBVQVJUMikNCiAgew0KICAgIE1SQ0NfUGVyaXBoZXJhbFNXUmVzZXRDb25maWcoTVJDQ19QZXJpcGhlcmFsX1VBUlQyLEVOQUJMRSk7DQogICAgTVJDQ19QZXJpcGhlcmFsU1dSZXNldENvbmZpZyhNUkNDX1BlcmlwaGVyYWxfVUFSVDIsRElTQUJMRSk7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBVQVJUX0luaXQNCiogRGVzY3JpcHRpb24gICAgOiBJbml0aWFsaXplcyB0aGUgVUFSVHggcGVyaXBoZXJhbCBhY2NvcmRpbmcgdG8gdGhlIHNwZWNpZmllZA0KKiAgICAgICAgICAgICAgICAgIHBhcmFtZXRlcnMgaW4gdGhlIFVBUlRfSW5pdFN0cnVjdCAuDQoqIElucHV0ICAgICAgICAgIDogLSBVQVJUeDogd2hlcmUgeCBjYW4gYmUgMCwxb3IgMiB0byBzZWxlY3QgdGhlIFVBUlQgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFVBUlRfSW5pdFN0cnVjdDogcG9pbnRlciB0byBhIFVBUlRfSW5pdFR5cGVEZWYgc3RydWN0dXJlDQoqICAgICAgICAgICAgICAgICAgICB0aGF0IGNvbnRhaW5zIHRoZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uIGZvciB0aGUNCiogICAgICAgICAgICAgICAgICAgIHNwZWNpZmllZCBVQVJUIHBlcmlwaGVyYWwuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFVBUlRfSW5pdChVQVJUX1R5cGVEZWYqIFVBUlR4LCBVQVJUX0luaXRUeXBlRGVmKiBVQVJUX0luaXRTdHJ1Y3QpDQp7DQoNCiAgdTMyIEFQQkNsb2NrID0gMDsNCiAgdTMyIEludGVnZXJEaXZpZGVyID0gMDsNCiAgdTMyIEZyYWN0aW9uYWxEaXZpZGVyID0gMDsNCiAgTVJDQ19DbG9ja3NUeXBlRGVmICBNUkNDX0Nsb2Nrc1N0YXR1czsNCiAgICAgDQogIC8qIENsZWFyIHRoZSBXTEVOIGJpdHMgKi8NCiAgVUFSVHgtPkxDUiAmPSBVQVJUX1dvcmRMZW5ndGhfTWFzazsNCiAgLyogU2V0IHRoZSBXTEVOIGJpdHMgYWNjb3JkaW5nIHRvIFVBUlRfV29yZExlbmd0aCB2YWx1ZSAqLw0KICBVQVJUeC0+TENSIHw9IFVBUlRfSW5pdFN0cnVjdC0+VUFSVF9Xb3JkTGVuZ3RoOw0KDQogIC8qIENob29zZSBTdG9wIEJpdHMgKi8NCiAgaWYoVUFSVF9Jbml0U3RydWN0LT5VQVJUX1N0b3BCaXRzID09IFVBUlRfU3RvcEJpdHNfMSkNCiAgew0KICAgIC8qIE9uZSBTdG9wIEJpdCAqLw0KICAgIFVBUlR4LT5MQ1IgJj0gVUFSVF9TdG9wQml0c18xOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIFR3byBTdG9wIEJpdHMgKi8NCiAgICBVQVJUeC0+TENSIHw9IFVBUlRfU3RvcEJpdHNfMjsNCiAgfQ0KDQogIC8qIENsZWFyIFNQUywgRVBTIGFuZCBQRU4gYml0cyAqLw0KICBVQVJUeC0+TENSICY9IFVBUlRfUGFyaXR5X01hc2s7DQogIC8qIFNldCBQUywgRVBTIGFuZCBQRU4gYml0cyBhY2NvcmRpbmcgdG8gVUFSVF9QYXJpdHkgdmFsdWUgKi8NCiAgVUFSVHgtPkxDUiB8PSBVQVJUX0luaXRTdHJ1Y3QtPlVBUlRfUGFyaXR5Ow0KDQogIC8qIENvbmZpZ3VyZSB0aGUgQmF1ZFJhdGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KICAvKiBHZXQgdGhlIEFQQiBmcmVxdWVuY3kgKi8NCiAgTVJDQ19HZXRDbG9ja3NTdGF0dXMoJk1SQ0NfQ2xvY2tzU3RhdHVzKTsNCiAgQVBCQ2xvY2sgPSBNUkNDX0Nsb2Nrc1N0YXR1cy5QQ0xLX0ZyZXF1ZW5jeTsNCiAgDQogIC8qIERldGVybWluZSB0aGUgaW50ZWdlciBwYXJ0ICovDQogIEludGVnZXJEaXZpZGVyID0gKCgxMDApICogKEFQQkNsb2NrKSAvICgxNiAqIChVQVJUX0luaXRTdHJ1Y3QtPlVBUlRfQmF1ZFJhdGUpKSk7DQogIFVBUlR4LT5JQlJEID0gSW50ZWdlckRpdmlkZXIgLyAxMDA7IA0KDQogIC8qIERldGVybWluZSB0aGUgZnJhY3Rpb25hbCBwYXJ0ICovDQogIEZyYWN0aW9uYWxEaXZpZGVyID0gSW50ZWdlckRpdmlkZXIgLSAoMTAwICogKFVBUlR4LT5JQlJEKSk7DQogIFVBUlR4LT5GQlJEID0gKCgoKEZyYWN0aW9uYWxEaXZpZGVyICogNjQpICsgNTApIC8gMTAwKSk7DQogIA0KICAvKiBDaG9vc2UgdGhlIEhhcmR3YXJlIEZsb3cgQ29udHJvbCAqLw0KICAvKiBDbGVhciBSVFNFbiBhbmQgQ1RTRW4gYml0cyAqLw0KICBVQVJUeC0+Q1IgJj0gIFVBUlRfSGFyZHdhcmVGbG93Q29udHJvbF9NYXNrOw0KICAvKiBTZXQgUlRTRW4gYW5kIENUU0VuIGJpdHMgYWNjb3JkaW5nIHRvIFVBUlRfSGFyZHdhcmVGbG93Q29udHJvbCB2YWx1ZSAqLw0KICBVQVJUeC0+Q1IgfD0gVUFSVF9Jbml0U3RydWN0LT5VQVJUX0hhcmR3YXJlRmxvd0NvbnRyb2w7DQoNCiAgLyogQ29uZmlndXJlIHRoZSBVQVJUIG1vZGUgKi8NCiAgLyogQ2xlYXIgVFhFIGFuZCBSWEUgYml0cyAqLw0KICBVQVJUeC0+Q1IgJj0gVUFSVF9Nb2RlX01hc2s7DQogIC8qIFNldCBUWEUgYW5kIFJYRSBiaXRzIGFjY29yZGluZyB0byBVQVJUX01vZGUgdmFsdWUgKi8NCiAgVUFSVHgtPkNSIHw9IFVBUlRfSW5pdFN0cnVjdC0+VUFSVF9Nb2RlOw0KDQogIC8qIEVuYWJsZSBvciBkaXNhYmxlIHRoZSBGSUZPcyAqLw0KICAvKiBTZXQgdGhlIEZJRk9zIExldmVscyAqLw0KICBpZihVQVJUX0luaXRTdHJ1Y3QtPlVBUlRfRklGTyA9PSBVQVJUX0ZJRk9fRW5hYmxlKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBGSUZPcyAqLw0KICAgIFVBUlR4LT5MQ1IgfD0gVUFSVF9GSUZPX0VuYWJsZTsNCiAgICANCiAgICAvKiBDbGVhciBUWElGTFNFTCBhbmQgUlhJRkxTRUwgYml0cyAqLw0KICAgIFVBUlR4LT5JRkxTICY9ICBVQVJUX1R4UnhGSUZPTGV2ZWxfTWFzazsNCiAgICANCiAgICAvKiBTZXQgUlhJRkxTRUwgYml0cyBhY2NvcmRpbmcgdG8gVUFSVF9SeEZJRk9MZXZlbCB2YWx1ZSAqLw0KICAgIFVBUlR4LT5JRkxTIHw9IChVQVJUX0luaXRTdHJ1Y3QtPlVBUlRfUnhGSUZPTGV2ZWwgPDwgMyk7DQogICAgDQogICAgLyogU2V0IFRYSUZMU0VMIGJpdHMgYWNjb3JkaW5nIHRvIFVBUlRfVHhGSUZPTGV2ZWwgdmFsdWUgKi8NCiAgICBVQVJUeC0+SUZMUyB8PSBVQVJUX0luaXRTdHJ1Y3QtPlVBUlRfVHhGSUZPTGV2ZWw7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgRklGT3MgKi8NCiAgICBVQVJUeC0+TENSICY9IFVBUlRfRklGT19EaXNhYmxlOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVUFSVF9TdHJ1Y3RJbml0DQoqIERlc2NyaXB0aW9uICAgIDogRmlsbHMgZWFjaCBVQVJUX0luaXRTdHJ1Y3QgbWVtYmVyIHdpdGggaXRzIGRlZmF1bHQgdmFsdWUuDQoqIElucHV0ICAgICAgICAgIDogVUFSVF9Jbml0U3RydWN0OiBwb2ludGVyIHRvIGEgVUFSVF9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUgd2hpY2gNCiogICAgICAgICAgICAgICAgICB3aWxsIGJlIGluaXRpYWxpemVkLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVQVJUX1N0cnVjdEluaXQoVUFSVF9Jbml0VHlwZURlZiogVUFSVF9Jbml0U3RydWN0KQ0Kew0KICAvKiBVQVJUX0luaXRTdHJ1Y3QgbWVtYmVycyBkZWZhdWx0IHZhbHVlICovDQogIFVBUlRfSW5pdFN0cnVjdC0+VUFSVF9Xb3JkTGVuZ3RoID0gVUFSVF9Xb3JkTGVuZ3RoXzhEOw0KICBVQVJUX0luaXRTdHJ1Y3QtPlVBUlRfU3RvcEJpdHMgPSBVQVJUX1N0b3BCaXRzXzE7DQogIFVBUlRfSW5pdFN0cnVjdC0+VUFSVF9QYXJpdHkgPSBVQVJUX1Bhcml0eV9PZGQgOw0KICBVQVJUX0luaXRTdHJ1Y3QtPlVBUlRfQmF1ZFJhdGUgPSA5NjAwOw0KICBVQVJUX0luaXRTdHJ1Y3QtPlVBUlRfSGFyZHdhcmVGbG93Q29udHJvbCA9IFVBUlRfSGFyZHdhcmVGbG93Q29udHJvbF9Ob25lOw0KICBVQVJUX0luaXRTdHJ1Y3QtPlVBUlRfTW9kZSA9IFVBUlRfTW9kZV9UeF9SeDsNCiAgVUFSVF9Jbml0U3RydWN0LT5VQVJUX0ZJRk8gPSBVQVJUX0ZJRk9fRW5hYmxlOw0KICBVQVJUX0luaXRTdHJ1Y3QtPlVBUlRfVHhGSUZPTGV2ZWwgPSBVQVJUX0ZJRk9MZXZlbF8xXzI7DQogIFVBUlRfSW5pdFN0cnVjdC0+VUFSVF9SeEZJRk9MZXZlbCA9IFVBUlRfRklGT0xldmVsXzFfMjsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBVQVJUX0NtZA0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBVQVJUIHBlcmlwaGVyYWwuDQoqIElucHV0ICAgICAgICAgIDogLSBVQVJUeDogd2hlcmUgeCBjYW4gYmUgMCwxIG9yIDIgdG8gc2VsZWN0IHRoZSBVQVJUIHBlcmlwaGVyYWwNCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFVBUlR4IHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVQVJUX0NtZChVQVJUX1R5cGVEZWYqIFVBUlR4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIGlmIChOZXdTdGF0ZSA9PSBFTkFCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIHNlbGVjdGVkIFVBUlQgYnkgc2V0dGluZyB0aGUgVUFSVEVOIGJpdCBpbiB0aGUgQ1IgcmVnaXN0ZXIgKi8NCiAgICBVQVJUeC0+Q1IgfD0gVUFSVF9FbmFibGVfTWFzazsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBzZWxlY3RlZCBVQVJUIGJ5IGNsZWFyaW5nIHRoZSBVQVJURU4gYml0IGluIHRoZSBDUiByZWdpc3RlciAqLw0KICAgIFVBUlR4LT5DUiAmPSBVQVJUX0Rpc2FibGVfTWFzazsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVBUlRfSVRDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBzcGVjaWZpZWQgVUFSVCBpbnRlcnJ1cHRzLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVUFSVHg6IHdoZXJlIHggY2FuIGJlIDAsMSBvciAyIHRvIHNlbGVjdCB0aGUgVUFSVCBwZXJpcGhlcmFsDQoqICAgICAgICAgICAgICAgICAgLSBVQVJUX0lUOiBzcGVjaWZpZXMgdGhlIFVBUlQgaW50ZXJydXB0cyBzb3VyY2VzIHRvIGJlIA0KKiAgICAgICAgICAgICAgICAgICAgZW5hYmxlZCBvciBkaXNhYmxlZC4gVGhpcyBwYXJhbWV0ZXIgY2FuIGJlIGFueSBjb21iaW5hdGlvbiANCiogICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOiAgICAgICAgICAgICAgICAgICANCiogICAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9JVF9PdmVycnVuRXJyb3I6IE92ZXJydW4gRXJyb3IgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlRfSVRfQnJlYWtFcnJvcjogQnJlYWsgRXJyb3IgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlRfSVRfUGFyaXR5RXJyb3I6IFBhcml0eSBFcnJvciBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9JVF9GcmFtZUVycm9yOiBGcmFtZSBFcnJvciBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9JVF9SZWNlaXZlVGltZU91dDogUmVjZWl2ZSBUaW1lIE91dCBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9JVF9UcmFuc21pdDogVHJhbnNtaXQgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlRfSVRfUmVjZWl2ZTogUmVjZWl2ZSBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9JVF9DVFM6IENUUyBpbnRlcnJ1cHQgDQoqICAgICAgICAgICAgICAgICAgLSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBVQVJUeCBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFVBUlRfSVRDb25maWcoVUFSVF9UeXBlRGVmKiBVQVJUeCwgdTE2IFVBUlRfSVQsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgaWYoTmV3U3RhdGUgPT0gRU5BQkxFKQ0KICB7DQogICAgLyogRW5hYmxlcyB0aGUgc2VsZWN0ZWQgaW50ZXJydXB0cyAqLw0KICAgIFVBUlR4LT5JTVNDIHw9IFVBUlRfSVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZXMgdGhlIHNlbGVjdGVkIGludGVycnVwdHMgKi8NCiAgICBVQVJUeC0+SU1TQyAmPSB+VUFSVF9JVDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVBUlRfRE1BQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogQ29uZmlndXJlcyB0aGUgVUFSVDAgRE1BIGludGVyZmFjZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFVBUlQwX0RNQXRyYW5zZmVyIDogc3BlY2lmaWVzIHRoZSBjb25maWd1cmF0aW9uIG9mIERNQSByZXF1ZXN0Lg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlQwX0RNQVRyYW5zZmVyX1NpbmdsZTogU2luZ2xlIERNQSB0cmFuc2Zlcg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlQwX0RNQVRyYW5zZmVyX0J1cnN0OiBCdXJzdCBETUEgdHJhbnNmZXINCiogICAgICAgICAgICAgICAgICAtIFVBUlQwX0RNQU9uRXJyb3I6IHNwZWNpZmllcyB0aGUgRE1BIG9uIGVycm9yIHJlcXVlc3QuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6DQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVUFSVDBfRE1BT25FcnJvcl9FbmFibGU6IERNQSByZWNlaXZlIHJlcXVlc3QgZW5hYmxlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdGhlIFVBUlQgZXJyb3IgaW50ZXJydXB0IGlzIGFzc2VydGVkLg0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlQwX0RNQU9uRXJyb3JfRGlzYWJsZTogRE1BIHJlY2VpdmUgcmVxdWVzdCBkaXNhYmxlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdGhlIFVBUlQgZXJyb3IgaW50ZXJydXB0IGlzIGFzc2VydGVkLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVQVJUX0RNQUNvbmZpZyh1MTYgVUFSVDBfRE1BVHJhbnNmZXIsIHUxNiBVQVJUMF9ETUFPbkVycm9yKQ0Kew0KICBpZihVQVJUMF9ETUFUcmFuc2ZlciA9PSBVQVJUMF9ETUFUcmFuc2Zlcl9TaW5nbGUpDQogIHsNCiAgICAvKiBDb25maWd1cmUgdGhlIERNQSByZXF1ZXN0IGZyb20gdGhlIFVBUlQwIGFzIHNpbmdsZSB0cmFuc2ZlciAqLw0KICAgIFVBUlQwLT5ETUFDUiAmPSBVQVJUMF9ETUFUcmFuc2Zlcl9TaW5nbGU7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgVUFSVDAtPkRNQUNSIHw9IFVBUlQwX0RNQVRyYW5zZmVyX0J1cnN0Ow0KICB9DQogIA0KICBpZihVQVJUMF9ETUFPbkVycm9yID09IFVBUlQwX0RNQU9uRXJyb3JfRW5hYmxlKQ0KICB7DQogICAgVUFSVDAtPkRNQUNSICY9IFVBUlQwX0RNQU9uRXJyb3JfRW5hYmxlOw0KICB9DQogIGVsc2UNCiAgew0KICAgIFVBUlQwLT5ETUFDUiB8PSBVQVJUMF9ETUFPbkVycm9yX0Rpc2FibGU7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBVQVJUX0RNQUNtZA0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIFVBUlQwknMgRE1BIGludGVyZmFjZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFVBUlQwX0RNQVJlcTogc3BlY2lmaWVzIHRoZSBETUEgcmVxdWVzdC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToNCiogICAgICAgICAgICAgICAgICAgICAtIFVBUlQwX0RNQVJlcV9UeDogVHJhbnNtaXQgRE1BIHJlcXVlc3QNCiogICAgICAgICAgICAgICAgICAgICAtIFVBUlQwX0RNQVJlcV9SeDogUmVjZWl2ZSBETUEgcmVxdWVzdA0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgVUFSVDCScyBETUEgcmVxdWVzdC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFVBUlRfRE1BQ21kKHUxNiBVQVJUMF9ETUFSZXEsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgaWYoVUFSVDBfRE1BUmVxID09IFVBUlQwX0RNQVJlcV9UeCkNCiAgew0KICAgIGlmKE5ld1N0YXRlID09IEVOQUJMRSkNCiAgICB7DQogICAgICBVQVJUMC0+RE1BQ1IgfD0gIFVBUlQwX0RNQVJlcV9UeDsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIFVBUlQwLT5ETUFDUiAmPSB+VUFSVDBfRE1BUmVxX1R4Ow0KICAgIH0NCiAgfQ0KICBlbHNlDQogIHsNCiAgICBpZihOZXdTdGF0ZSA9PSBFTkFCTEUpDQogICAgew0KICAgICAgVUFSVDAtPkRNQUNSIHw9ICBVQVJUMF9ETUFSZXFfUng7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBVQVJUMC0+RE1BQ1IgJj0gflVBUlQwX0RNQVJlcV9SeDsNCiAgICB9DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBVQVJUX0xvb3BCYWNrQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyBMb29wQmFjayBtb2RlIGluIFVBUlR4Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gVUFSVHg6IHdoZXJlIHggY2FuIGJlIDAsMSBvciAyIHRvIHNlbGVjdCB0aGUgVUFSVCBwZXJpcGhlcmFsDQoqICAgICAgICAgICAgICAgICAgLSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBVQVJUeJJzIExvb3BCYWNrIG1vZGUuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVQVJUX0xvb3BCYWNrQ29uZmlnKFVBUlRfVHlwZURlZiogVUFSVHgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgaWYgKE5ld1N0YXRlID09IEVOQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgTG9vcEJhY2sgbW9kZSBvZiB0aGUgc3BlY2lmaWVkIFVBUlQgKi8NCiAgICBVQVJUeC0+Q1IgfD0gVUFSVF9Mb29wQmFja19FbmFibGVfTWFzazsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBMb29wQmFjayBtb2RlIG9mIHRoZSBzcGVjaWZpZWQgVUFSVCAqLw0KICAgIFVBUlR4LT5DUiAmPSBVQVJUX0xvb3BCYWNrX0Rpc2FibGVfTWFzazsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVBUlRfTElOQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogU2V0cyB0aGUgTElOIGJyZWFrIGxlbmd0aC4NCiogSW5wdXQgICAgICAgICAgOiAtIFVBUlR4OiB3aGVyZSB4IGNhbiBiZSAwLDEgb3IgMiB0byBzZWxlY3QgdGhlIFVBUlQgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFVBUlRfTElOQnJlYWtMZW5ndGg6IEJyZWFrIGxlbmd0aCB2YWx1ZS4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0xJTkJyZWFrTGVuZ3RoXzEwOiAxMCBsb3cgYml0cw0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlRfTElOQnJlYWtMZW5ndGhfMTE6IDExIGxvdyBiaXRzDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9MSU5CcmVha0xlbmd0aF8xMjogMTIgbG93IGJpdHMNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0xJTkJyZWFrTGVuZ3RoXzEzOiAxMyBsb3cgYml0cw0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlRfTElOQnJlYWtMZW5ndGhfMTQ6IDE0IGxvdyBiaXRzDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9MSU5CcmVha0xlbmd0aF8xNTogMTUgbG93IGJpdHMNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0xJTkJyZWFrTGVuZ3RoXzE2OiAxNiBsb3cgYml0cw0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlRfTElOQnJlYWtMZW5ndGhfMTc6IDE3IGxvdyBiaXRzDQoqICAgICAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9MSU5CcmVha0xlbmd0aF8xODogMTggbG93IGJpdHMNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0xJTkJyZWFrTGVuZ3RoXzE5OiAxOSBsb3cgYml0cw0KKiAgICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlRfTElOQnJlYWtMZW5ndGhfMjA6IDIwIGxvdyBiaXRzDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFVBUlRfTElOQ29uZmlnKFVBUlRfVHlwZURlZiogVUFSVHgsIHUxNiBVQVJUX0xJTkJyZWFrTGVuZ3RoKQ0Kew0KICAvKiBDbGVhciBMQktMRU4gYml0cyAqLw0KICBVQVJUeC0+TENSICY9IFVBUlRfTElOQnJlYWtMZW5ndGhfTWFzazsNCg0KICAvKiBTZXQgTEJLTEVOIGJpdHMgYWNjb3JkaW5nIHRvIFVBUlRfTElOQnJlYWtMZW5ndGggdmFsdWUgKi8NCiAgVUFSVHgtPkxDUiB8PSBVQVJUX0xJTkJyZWFrTGVuZ3RoOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVBUlRfTElOQ21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyBMSU4gbWFzdGVyIG1vZGUgaW4gVUFSVHguDQoqIElucHV0ICAgICAgICAgIDogLSBVQVJUeDogd2hlcmUgeCBjYW4gYmUgMCwxIG9yIDIgdG8gc2VsZWN0IHRoZSBVQVJUIHBlcmlwaGVyYWwNCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFVBUlR4knMgTElOIGludGVyZmFjZS4gDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVQVJUX0xJTkNtZChVQVJUX1R5cGVEZWYqIFVBUlR4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIGlmKE5ld1N0YXRlID09IEVOQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgTElOIG1vZGUgb2YgdGhlIHNwZWNpZmllZCBVQVJUICovDQogICAgVUFSVHgtPkxDUiB8PSBVQVJUX0xJTl9FbmFibGVfTWFzazsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBMSU4gbW9kZSBvZiB0aGUgc3BlY2lmaWVkIFVBUlQgKi8NCiAgICBVQVJUeC0+TENSICY9IFVBUlRfTElOX0Rpc2FibGVfTWFzazsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVBUlRfU2VuZERhdGENCiogRGVzY3JpcHRpb24gICAgOiBUcmFuc21pdHMgYSBzaWdubGUgQnl0ZSBvZiBkYXRhIHRocm91Z2ggdGhlIFVBUlR4IHBlcmlwaGVyYWwuDQoqIElucHV0ICAgICAgICAgIDogLSBVQVJUeDogd2hlcmUgeCBjYW4gYmUgMCwxIG9yIDIgdG8gc2VsZWN0IHRoZSBVQVJUIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBEYXRhOiB0aGUgYnl0ZSB0byB0cmFuc21pdA0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVQVJUX1NlbmREYXRhKFVBUlRfVHlwZURlZiogVUFSVHgsIHU4IERhdGEpDQp7DQogIC8qIFRyYW5zbWl0IG9uZSBieXRlICovDQogIFVBUlR4LT5EUiA9IERhdGE7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVUFSVF9SZWNlaXZlRGF0YQ0KKiBEZXNjcmlwdGlvbiAgICA6IFJldHVybnMgdGhlIG1vc3QgcmVjZW50IHJlY2VpdmVkIEJ5dGUgYnkgdGhlIFVBUlR4IHBlcmlwaGVyYWwuDQoqIElucHV0ICAgICAgICAgIDogVUFSVHg6IHdoZXJlIHggY2FuIGJlIDAsMSBvciAyIHRvIHNlbGVjdCB0aGUgVUFSVCBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBUaGUgcmVjZWl2ZWQgZGF0YQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnU4IFVBUlRfUmVjZWl2ZURhdGEoVUFSVF9UeXBlRGVmKiBVQVJUeCkNCnsNCiAgLyogUmVjZWl2ZSBvbmUgYnl0ZSAqLw0KICByZXR1cm4gKCh1OClVQVJUeC0+RFIpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVBUlRfU2VuZEJyZWFrDQoqIERlc2NyaXB0aW9uICAgIDogVHJhbnNtaXRzIGJyZWFrIGNoYXJhY3RlcnMuDQoqIElucHV0ICAgICAgICAgIDogVUFSVHg6IHdoZXJlIHggY2FuIGJlIDAsMSBvciAyIHRvIHNlbGVjdCB0aGUgVUFSVCBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVQVJUX1NlbmRCcmVhayhVQVJUX1R5cGVEZWYqIFVBUlR4KQ0Kew0KICAvKiBTZW5kIGJyZWFrIGNoYXJhY3RlcnMgKi8NCiAgVUFSVHgtPkJLUiB8PSBVQVJUX0JyZWFrQ2hhcl9NYXNrOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVBUlRfUlRTQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogU2V0cyBvciBSZXNldHMgdGhlIFJUUyBzaWduYWwNCiogSW5wdXQgICAgICAgICAgOiAtIFVBUlR4OiB3aGVyZSB4IGNhbiBiZSAwLDEgb3IgMiB0byBzZWxlY3QgdGhlIFVBUlQgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFJUU1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFJUUyBzaWduYWwuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IFJUU1NFVCBvciBSVFNSRVNFVA0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVQVJUX1JUU0NvbmZpZyhVQVJUX1R5cGVEZWYqIFVBUlR4LCBVQVJUX1JUU1R5cGVEZWYgUlRTU3RhdGUpDQp7DQogIGlmKFJUU1N0YXRlID09IFJUU1JFU0VUKQ0KICB7DQogICAgVUFSVHgtPkNSIHw9IFVBUlRfUlRTUkVTRVRfTWFzazsNCiAgfQ0KICBlbHNlIGlmKFJUU1N0YXRlID09IFJUU1NFVCkNCiAgew0KICAgIFVBUlR4LT5DUiAmPSBVQVJUX1JUU1NFVF9NYXNrOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVUFSVF9HZXRGbGFnU3RhdHVzDQoqIERlc2NyaXB0aW9uICAgIDogQ2hlY2tzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCBVQVJUIGZsYWcgaXMgc2V0IG9yIG5vdC4NCiogSW5wdXQgICAgICAgICAgOiAtIFVBUlR4OiB3aGVyZSB4IGNhbiBiZSAwLDEgb3IgMiB0byBzZWxlY3QgdGhlIFVBUlQgcGVyaXBoZXJhbA0KKiAgICAgICAgICAgICAgICAgIC0gVUFSVF9GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2hlY2suDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9GTEFHX092ZXJydW5FcnJvcjogT3ZlcnJ1biBlcnJvciBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0ZMQUdfQnJlYWs6IGJyZWFrIGVycm9yIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAtIFVBUlRfRkxBR19QYXJpdHlFcnJvcjogcGFyaXR5IGVycm9yIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAtIFVBUlRfRkxBR19GcmFtZUVycm9yOiBmcmFtZSBlcnJvciBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0ZMQUdfVHhGSUZPRW1wdHk6IFRyYW5zbWl0IEZJRk8gRW1wdHkgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9GTEFHX1J4RklGT0Z1bGw6IFJlY2VpdmUgRklGTyBGdWxsIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAtIFVBUlRfRkxBR19UeEZJRk9GdWxsOiBUcmFuc21pdCBGSUZPIEZ1bGwgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9GTEFHX1J4RklGT0VtcHR5OiBSZWNlaXZlIEZJRk8gRW1wdHkgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9GTEFHX0J1c3k6IEJ1c3kgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9GTEFHX0NUUzogQ1RTIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAtIFVBUlRfUmF3SVRfT3ZlcnJ1bkVycm9yOiBPdmVycnVuIEVycm9yIGludGVycnVwdCBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX1Jhd0lUX0JyZWFrRXJyb3I6IEJyZWFrIEVycm9yIGludGVycnVwdCBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX1Jhd0lUX1Bhcml0eUVycm9yOiBQYXJpdHkgRXJyb3IgaW50ZXJydXB0IGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAtIFVBUlRfUmF3SVRfRnJhbWVFcnJvcjogRnJhbWUgRXJyb3IgaW50ZXJydXB0IGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAtIFVBUlRfUmF3SVRfUmVjZWl2ZVRpbWVPdXQ6IFJlY2VpdmVUaW1lT3V0IGludGVycnVwdCBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX1Jhd0lUX1RyYW5zbWl0OiBUcmFuc21pdCBpbnRlcnJ1cHQgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9SYXdJVF9SZWNlaXZlOiBSZWNlaXZlIGludGVycnVwdCBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX1Jhd0lUX0NUUzogQ1RTIGludGVycnVwdCBmbGFnDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBuZXcgc3RhdGUgb2YgVUFSVF9GTEFHIChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCkZsYWdTdGF0dXMgVUFSVF9HZXRGbGFnU3RhdHVzKFVBUlRfVHlwZURlZiogVUFSVHgsIHUxNiBVQVJUX0ZMQUcpDQp7DQogIHUzMiBVQVJUUmVnID0gMCwgRmxhZ1BvcyA9IDA7DQogIHUzMiBTdGF0dXNSZWcgPSAwOw0KDQogIC8qIEdldCB0aGUgVUFSVCByZWdpc3RlciBpbmRleCAqLw0KICBVQVJUUmVnID0gVUFSVF9GTEFHID4+IDU7DQoNCiAgLyogR2V0IHRoZSBmbGFnIHBvc2l0aW9uICovDQogIEZsYWdQb3MgPSBVQVJUX0ZMQUcgJiBVQVJUX0ZMQUdfTWFzazsNCg0KICBpZihVQVJUUmVnID09IDEpIC8qIFRoZSBmbGFnIHRvIGNoZWNrIGlzIGluIFJTUiByZWdpc3RlciAqLw0KICB7DQogICAgU3RhdHVzUmVnID0gVUFSVHgtPlJTUjsNCiAgfQ0KICBlbHNlIGlmIChVQVJUUmVnID09IDIpIC8qIFRoZSBmbGFnIHRvIGNoZWNrIGlzIGluIEZSIHJlZ2lzdGVyICovDQogIHsNCiAgICBTdGF0dXNSZWcgPSBVQVJUeC0+RlI7DQogIH0NCiAgZWxzZSBpZihVQVJUUmVnID09IDMpIC8qIFRoZSBmbGFnIHRvIGNoZWNrIGlzIGluIFJJUyByZWdpc3RlciAqLw0KICB7DQogICAgU3RhdHVzUmVnID0gVUFSVHgtPlJJUzsNCiAgfQ0KDQogIGlmKChTdGF0dXNSZWcgJiAoMSA8PCBGbGFnUG9zKSkhPSBSRVNFVCkNCiAgew0KICAgIHJldHVybiBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgcmV0dXJuIFJFU0VUOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVUFSVF9DbGVhckZsYWcNCiogRGVzY3JpcHRpb24gICAgOiBDbGVhcnMgdGhlIFVBUlR4knMgcGVuZGluZyBmbGFncy4NCiogSW5wdXQgICAgICAgICAgOiAtIFVBUlR4OiB3aGVyZSB4IGNhbiBiZSAwLDFvciAyIHRvIHNlbGVjdCB0aGUgVUFSVCBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVUFSVF9GTEFHOiBzcGVjaWZpZXMgdGhlIGZsYWcgdG8gY2xlYXIuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0ZMQUdfT3ZlcnJ1bkVycm9yOiBPdmVycnVuIGVycm9yIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9GTEFHX0JyZWFrOiBicmVhayBlcnJvciBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlRfRkxBR19QYXJpdHlFcnJvcjogcGFyaXR5IGVycm9yIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9GTEFHX0ZyYW1lRXJyb3I6IGZyYW1lIGVycm9yIGZsYWcNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVUFSVF9DbGVhckZsYWcoVUFSVF9UeXBlRGVmKiBVQVJUeCwgdTE2IFVBUlRfRkxBRykNCnsNCiAgdTggRmxhZ1BvcyA9IDA7DQoNCiAgLyogR2V0IHRoZSBmbGFnIHBvc2l0aW9uICovDQogIEZsYWdQb3MgPSBVQVJUX0ZMQUcgJiBVQVJUX0ZMQUdfTWFzazsNCg0KICAvKiBDbGVhciB0aGUgc2VwZWNpZmllZCBmbGFnICovDQogIFVBUlR4LT5SU1IgJj0gfigxIDw8IEZsYWdQb3MpOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVBUlRfR2V0SVRTdGF0dXMNCiogRGVzY3JpcHRpb24gICAgOiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIFVBUlQgaW50ZXJydXB0IGhhcyBvY2N1cnJlZCBvciBub3QuDQoqIElucHV0ICAgICAgICAgIDogLSBVQVJUeDogd2hlcmUgeCBjYW4gYmUgMCwxb3IgMiB0byBzZWxlY3QgdGhlIFVBUlQgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIFVBUlRfSVQ6IHNwZWNpZmllcyB0aGUgaW50ZXJydXB0IHNvdXJjZSB0byBjaGVjay4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlRfSVRfT3ZlcnJ1bkVycm9yOiBPdmVycnVuIEVycm9yIGludGVycnVwdCANCiogICAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9JVF9CcmVha0Vycm9yOiBCcmVhayBFcnJvciBpbnRlcnJ1cHQgDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlRfSVRfUGFyaXR5RXJyb3I6IFBhcml0eSBFcnJvciBpbnRlcnJ1cHQgDQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlRfSVRfRnJhbWVFcnJvcjogRnJhbWUgRXJyb3IgaW50ZXJydXB0IA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0lUX1JlY2VpdmVUaW1lT3V0OiBSZWNlaXZlIFRpbWUgT3V0IGludGVycnVwdCANCiogICAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9JVF9UcmFuc21pdDogVHJhbnNtaXQgaW50ZXJydXB0IA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0lUX1JlY2VpdmU6IFJlY2VpdmUgaW50ZXJydXB0IA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0lUX0NUUzogQ1RTIGludGVycnVwdCANCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogVGhlIG5ldyBzdGF0ZSBvZiBVQVJUX0lUIChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCklUU3RhdHVzIFVBUlRfR2V0SVRTdGF0dXMoVUFSVF9UeXBlRGVmKiBVQVJUeCwgdTE2IFVBUlRfSVQpDQp7DQogIGlmKChVQVJUeC0+TUlTICYgVUFSVF9JVCkgIT0gUkVTRVQpDQogIHsNCiAgICByZXR1cm4gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIHJldHVybiBSRVNFVDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVBUlRfQ2xlYXJJVFBlbmRpbmdCaXQNCiogRGVzY3JpcHRpb24gICAgOiBDbGVhcnMgdGhlIFVBUlR4knMgaW50ZXJydXB0IHBlbmRpbmcgYml0cy4NCiogSW5wdXQgICAgICAgICAgOiAtIFVBUlR4OiB3aGVyZSB4IGNhbiBiZSAwLDFvciAyIHRvIHNlbGVjdCB0aGUgVUFSVCBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVUFSVF9JVDogc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgdG8gY2xlYXIuDQoqICAgICAgICAgICAgICAgICAgICBNb3JlIHRoYW4gb25lIGludGVycnVwdCBjYW4gYmUgY2xlYXJlZCB1c2luZyB0aGUgk3yUIG9wZXJhdG9yLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0lUX092ZXJydW5FcnJvcjogT3ZlcnJ1biBFcnJvciBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9JVF9CcmVha0Vycm9yOiBCcmVhayBFcnJvciBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9JVF9QYXJpdHlFcnJvcjogUGFyaXR5IEVycm9yIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0lUX0ZyYW1lRXJyb3I6IEZyYW1lIEVycm9yIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0lUX1JlY2VpdmVUaW1lT3V0OiBSZWNlaXZlIFRpbWUgT3V0IGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0lUX1RyYW5zbWl0OiBUcmFuc21pdCBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9JVF9SZWNlaXZlOiBSZWNlaXZlIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0lUX0NUUzogQ1RTIGludGVycnVwdA0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVQVJUX0NsZWFySVRQZW5kaW5nQml0KFVBUlRfVHlwZURlZiogVUFSVHgsIHUxNiBVQVJUX0lUKQ0Kew0KICAvKiBDbGVhciB0aGUgc3BlY2lmaWVkIGludGVycnVwdCAqLw0KICBVQVJUeC0+SUNSID0gVUFSVF9JVDsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKiogKEMpIENPUFlSSUdIVCAyMDA2IFNUTWljcm9lbGVjdHJvbmljcyAqKioqKkVORCBPRiBGSUxFKioqKi8NCg==