LyoqKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwNiBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKioqKioqKioqKioqKioqKioNCiogRmlsZSBOYW1lICAgICAgICAgIDogOTF4X3VhcnQuYw0KKiBBdXRob3IgICAgICAgICAgICAgOiBNQ0QgQXBwbGljYXRpb24gVGVhbQ0KKiBEYXRlIEZpcnN0IElzc3VlZCAgOiAwNS8xOC8yMDA2IDogVmVyc2lvbiAxLjANCiogRGVzY3JpcHRpb24gICAgICAgIDogVGhpcyBmaWxlIHByb3ZpZGVzIGFsbCB0aGUgVUFSVCBzb2Z0d2FyZSBmdW5jdGlvbnMuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBIaXN0b3J5Og0KKiAwNS8yNC8yMDA2IDogVmVyc2lvbiAxLjENCiogMDUvMTgvMjAwNiA6IFZlcnNpb24gMS4wDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBUSEUgUFJFU0VOVCBTT0ZUV0FSRSBXSElDSCBJUyBGT1IgR1VJREFOQ0UgT05MWSBBSU1TIEFUIFBST1ZJRElORyBDVVNUT01FUlMNCiogV0lUSCBDT0RJTkcgSU5GT1JNQVRJT04gUkVHQVJESU5HIFRIRUlSIFBST0RVQ1RTIElOIE9SREVSIEZPUiBUSEVNIFRPIFNBVkUgVElNRS4NCiogQVMgQSBSRVNVTFQsIFNUTUlDUk9FTEVDVFJPTklDUyBTSEFMTCBOT1QgQkUgSEVMRCBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsDQoqIElORElSRUNUIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyBXSVRIIFJFU1BFQ1QgVE8gQU5ZIENMQUlNUyBBUklTSU5HIEZST00gVEhFDQoqIENPTlRFTlQgT0YgU1VDSCBTT0ZUV0FSRSBBTkQvT1IgVEhFIFVTRSBNQURFIEJZIENVU1RPTUVSUyBPRiBUSEUgQ09ESU5HDQoqIElORk9STUFUSU9OIENPTlRBSU5FRCBIRVJFSU4gSU4gQ09OTkVDVElPTiBXSVRIIFRIRUlSIFBST0RVQ1RTLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCg0KLyogSW5jbHVkZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCiNpbmNsdWRlICI5MXhfdWFydC5oIg0KI2luY2x1ZGUgIjkxeF9zY3UuaCINCg0KLyogUHJpdmF0ZSB0eXBlZGVmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgZGVmaW5lIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBVQVJUIElyREEgTWFzayAqLw0KI2RlZmluZSBVQVJUX0lyREFfRGlzYWJsZV9NYXNrCSAgICAgICAgMHhGRkZECS8qIElyREEgRGlzYWJsZSBNYXNrICovDQojZGVmaW5lIFVBUlRfSXJEQV9FbmFibGVfTWFzayAgICAgICAgICAgMHgwMDAyCS8qIElyREEgRW5hYmxlIE1hc2sgKi8NCiNkZWZpbmUgSXJEQV9Mb3dQb3dlcl9FbmFibGVfTWFzayAgICAgICAweDAwMDQgLypJckRBIGxvd2VyIHBvd2VyIG1vZGUgZW5hYmxlKi8NCiNkZWZpbmUgSXJEQV9Mb3dQb3dlcl9EaXNhYmxlX01hc2sgICAgICAweEZGRkIgLypJckRBIGxvd2VyIHBvd2VyIG1vZGUgZW5hYmxlKi8NCg0KLyogVUFSVCBNYXNrICovDQojZGVmaW5lIFVBUlRfRW5hYmxlX01hc2sJICAgICAgICAweDAwMDEJLyogVUFSVCBFbmFibGUgTWFzayAqLw0KI2RlZmluZSBVQVJUX0Rpc2FibGVfTWFzawkgICAgICAgIDB4RkZGRQkvKiBVQVJUIERpc2FibGUgTWFzayAqLw0KDQovKiBVQVJUIExvb3BCYWNrICovDQojZGVmaW5lIFVBUlRfTG9vcEJhY2tfRGlzYWJsZV9NYXNrICAgICAgMHhGRjdGCS8qIExvb3BCYWNrIERpc2FibGUgTWFzayAqLw0KI2RlZmluZSBVQVJUX0xvb3BCYWNrX0VuYWJsZV9NYXNrICAgICAgIDB4MDA4MAkvKiBMb29wQmFjayBFbmFibGUgTWFzayAqLw0KDQojZGVmaW5lIFVBUlRfV29yZExlbmd0aF9NYXNrICAgICAgICAgICAgMHhGRjlGICAvKiBVQVJUIFdvcmQgTGVuZ3RoIE1hc2sgKi8NCiNkZWZpbmUgVUFSVF9QYXJpdHlfTWFzayAgICAgICAgICAgICAgICAweEZGNzkgIC8qIFVBUlQgUGFyaXR5IE1hc2sgKi8NCiNkZWZpbmUgVUFSVF9IYXJkd2FyZUZsb3dDb250cm9sX01hc2sgICAweDNGRkYgIC8qIFVBUlQgSGFyZHdhcmUgRmxvdyBDb250cm9sIE1hc2sgKi8NCiNkZWZpbmUgVUFSVF9UeFJ4RklGT0xldmVsX01hc2sgICAgICAgICAweEZGQzAgIC8qIFVBUlQgVHggUnggRklGTyBMZXZlbCBNYXNrICovDQojZGVmaW5lIFVBUlRfQnJlYWtDaGFyX01hc2sgICAgICAgICAgICAgMHgwMDAxICAvKiBVQVJUIEJyZWFrIENoYXJhY3RlciBzZW5kIE1hc2sqLw0KI2RlZmluZSBVQVJUX0ZMQUdfTWFzayAgICAgICAgICAgICAgICAgIDB4MUYgICAgLyogVUFSVCBGbGFnIE1hc2sgKi8NCiNkZWZpbmUgVUFSVF9Nb2RlX01hc2sgICAgICAgICAgICAgICAgICAweEZDRkYgIC8qIFVBUlQgTW9kZSBNYXNrICovDQojZGVmaW5lIFVBUlRfUlRTX0xvd0xldmVsX01hc2sgICAgICAgICAgMHgwODAwICAvKiBSVFMgc2lnbmFsIGlzIGxvdyAqLw0KI2RlZmluZSBVQVJUX1JUU19IaWdoTGV2ZWxfTWFzayAgICAgICAgIDB4RjdGRiAgLyogUlRTIHNpZ25hbCBpcyBIaWdoICovDQojZGVmaW5lIFVBUlRfRFRSX0xvd0xldmVsX01hc2sgICAgICAgICAgMHgwNDAwICAvKiBEVFIgc2lnbmFsIGlzIGxvdyAqLw0KI2RlZmluZSBVQVJUX0RUUl9IaWdoTGV2ZWxfTWFzayAgICAgICAgIDB4RkJGRiAgLyogRFRSIHNpZ25hbCBpcyBIaWdoICovDQojZGVmaW5lIFVBUlRfQ2xlYXJGbGFnX01hc2sgICAgICAgICAgICAgMHhBQSAgICAvKiBDbGVhciBGbGFnIE1hc2sgKi8NCg0KLyogUHJpdmF0ZSBtYWNybyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCi8qIFByaXZhdGUgdmFyaWFibGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovDQovKiBQcml2YXRlIGZ1bmN0aW9uIHByb3RvdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLw0KLyogUHJpdmF0ZSBmdW5jdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8NCg0KICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVBUlRfRGVJbml0DQoqIERlc2NyaXB0aW9uICAgIDogRGVpbml0aWFsaXplcyB0aGUgVUFSVHggcGVyaXBoZXJhbCByZWdpc3RlcnMNCiogICAgICAgICAgICAgICAgICB0byB0aGVpciBkZWZhdWx0IHJlc2V0IHZhbHVlcy4NCiogSW5wdXQgICAgICAgICAgOiBVQVJUeDogd2hlcmUgeCBjYW4gYmUgMCwxIG9yIDIgdG8gc2VsZWN0IHRoZSBVQVJUIHBlcmlwaGVyYWwuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFVBUlRfRGVJbml0KFVBUlRfVHlwZURlZiogVUFSVHgpDQp7DQogIC8qIFJlc2V0IHRoZSBVQVJUeCByZWdpc3RlcnMgdmFsdWVzICovDQogIGlmKFVBUlR4ID09IFVBUlQwKQ0KICB7DQogICAgU0NVX0FQQlBlcmlwaFJlc2V0KF9fVUFSVDAsRU5BQkxFKTsNCiAgICBTQ1VfQVBCUGVyaXBoUmVzZXQoX19VQVJUMCxESVNBQkxFKTsNCiAgfQ0KICBlbHNlIGlmKFVBUlR4ID09IFVBUlQxKQ0KICB7DQogICAgU0NVX0FQQlBlcmlwaFJlc2V0KF9fVUFSVDEsRU5BQkxFKTsNCiAgICBTQ1VfQVBCUGVyaXBoUmVzZXQoX19VQVJUMSxESVNBQkxFKTsNCiAgfQ0KICBlbHNlIGlmKFVBUlR4ID09IFVBUlQyKQ0KICB7DQogICAgU0NVX0FQQlBlcmlwaFJlc2V0KF9fVUFSVDIsRU5BQkxFKTsNCiAgICBTQ1VfQVBCUGVyaXBoUmVzZXQoX19VQVJUMixESVNBQkxFKTsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVBUlRfSW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IEluaXRpYWxpemVzIHRoZSBVQVJUeCBwZXJpcGhlcmFsIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkDQoqICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycyBpbiB0aGUgVUFSVF9Jbml0U3RydWN0IC4NCiogSW5wdXQgICAgICAgICAgOiAtIFVBUlR4OiB3aGVyZSB4IGNhbiBiZSAwLDFvciAyIHRvIHNlbGVjdCB0aGUgVUFSVCBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVUFSVF9Jbml0U3RydWN0OiBwb2ludGVyIHRvIGEgVUFSVF9Jbml0VHlwZURlZiBzdHJ1Y3R1cmUNCiogICAgICAgICAgICAgICAgICAgIHRoYXQgY29udGFpbnMgdGhlIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gZm9yIHRoZQ0KKiAgICAgICAgICAgICAgICAgICAgc3BlY2lmaWVkIFVBUlQgcGVyaXBoZXJhbC4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVUFSVF9Jbml0KFVBUlRfVHlwZURlZiogVUFSVHgsIFVBUlRfSW5pdFR5cGVEZWYqIFVBUlRfSW5pdFN0cnVjdCkNCnsNCg0KICB1NjQgVUFSVF9NYWluQ2xvY2sgPSAwOw0KICB1MzIgSW50ZWdlckRpdmlkZXIgPSAwOw0KICB1MzIgRnJhY3Rpb25hbERpdmlkZXIgPSAwOw0KDQogIC8qIENsZWFyIHRoZSBMQ1JbNjo1XSBiaXRzICovDQogIFVBUlR4LT5MQ1IgJj0gVUFSVF9Xb3JkTGVuZ3RoX01hc2s7DQogIC8qIFNldCB0aGUgTENSWzY6NV0gYml0cyBhY2NvcmRpbmcgdG8gVUFSVF9Xb3JkTGVuZ3RoIHZhbHVlICovDQogIFVBUlR4LT5MQ1IgfD0gVUFSVF9Jbml0U3RydWN0LT5VQVJUX1dvcmRMZW5ndGg7DQoNCiAgLyogQ2hvb3NlIFN0b3AgQml0cyAqLw0KICBpZihVQVJUX0luaXRTdHJ1Y3QtPlVBUlRfU3RvcEJpdHMgPT0gVUFSVF9TdG9wQml0c18yKQ0KICB7DQogICAgLyogMiBTdG9wIEJpdCAqLw0KICAgIFVBUlR4LT5MQ1IgfD0gVUFSVF9TdG9wQml0c18yOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIE9uZSBTdG9wIEJpdHMgKi8NCiAgICBVQVJUeC0+TENSICY9IFVBUlRfU3RvcEJpdHNfMTsNCiAgfQ0KDQogIC8qIENvbmZpZ3VyZSB0aGUgUGFyaXR5ICovDQogIC8qIENsZWFyIHRoZSBMQ1JbN11hbmQgTENSWzI6MV0gYml0cyAqLw0KICBVQVJUeC0+TENSICY9IFVBUlRfUGFyaXR5X01hc2s7DQogIC8qIFNldCB0aGUgTENSWzddYW5kIExDUlsyOjFdIGJpdHMgYWNjb3JkaW5nIHRvIFVBUlRfUGFyaXR5IHZhbHVlICovDQogIFVBUlR4LT5MQ1IgfD0gVUFSVF9Jbml0U3RydWN0LT5VQVJUX1Bhcml0eTsNCg0KICAvKiBDb25maWd1cmUgdGhlIEJhdWRSYXRlICovDQogIFVBUlRfTWFpbkNsb2NrID0gKFNDVV9HZXRNQ0xLRnJlcVZhbHVlKCkpKjEwMDA7DQogIGlmKChTQ1UtPkNMS0NOVFIgJiAweDIwMCkgIT0gMHgyMDApDQogIHsNCiAgICBVQVJUX01haW5DbG9jayA9IFVBUlRfTWFpbkNsb2NrLzI7DQogIH0NCiAgLyogRGV0ZXJtaW5lIHRoZSBpbnRlZ2VyIHBhcnQgKi8NCiAgSW50ZWdlckRpdmlkZXIgPSAoKDEwMCkgKiAoVUFSVF9NYWluQ2xvY2spIC8gKDE2ICogKFVBUlRfSW5pdFN0cnVjdC0+VUFSVF9CYXVkUmF0ZSkpKTsNCiAgVUFSVHgtPklCUkQgPSBJbnRlZ2VyRGl2aWRlciAvIDEwMDsNCg0KICAvKiBEZXRlcm1pbmUgdGhlIGZyYWN0aW9uYWwgcGFydCAqLw0KICBGcmFjdGlvbmFsRGl2aWRlciA9IEludGVnZXJEaXZpZGVyIC0gKDEwMCAqIChVQVJUeC0+SUJSRCkpOw0KICBVQVJUeC0+RkJSRCA9ICgoKChGcmFjdGlvbmFsRGl2aWRlciAqIDY0KSArIDUwKSAvIDEwMCkpOw0KDQogIC8qIENob29zZSB0aGUgSGFyZHdhcmUgRmxvdyBDb250cm9sICovDQogIC8qIENsZWFyIHRoZSBDUlsxNToxNF0gYml0cyAqLw0KICBVQVJUeC0+Q1IgJj0gIFVBUlRfSGFyZHdhcmVGbG93Q29udHJvbF9NYXNrOw0KICAvKiBTZXQgdGhlIENSWzE1OjE0XSBiaXRzIGFjY29yZGluZyB0byBVQVJUX0hhcmR3YXJlRmxvd0NvbnRyb2wgdmFsdWUgKi8NCiAgVUFSVHgtPkNSIHw9IFVBUlRfSW5pdFN0cnVjdC0+VUFSVF9IYXJkd2FyZUZsb3dDb250cm9sOw0KDQogIC8qIENvbmZpZ3VyZSB0aGUgVUFSVCBtb2RlICovDQogIC8qIENsZWFyIHRoZSBDUls5OjhdIGJpdHMgKi8NCiAgVUFSVHgtPkNSICY9IFVBUlRfTW9kZV9NYXNrOw0KICAvKiBTZXQgdGhlIENSWzk6OF0gYml0cyBhY2NvcmRpbmcgdG8gVUFSVF9Nb2RlIHZhbHVlICovDQogIFVBUlR4LT5DUiB8PSBVQVJUX0luaXRTdHJ1Y3QtPlVBUlRfTW9kZTsNCg0KICAvKiBFbmFibGUgb3IgZGlzYWJsZSB0aGUgRklGT3MgKi8NCiAgLyogU2V0IHRoZSBGSUZPcyBMZXZlbHMgKi8NCiAgaWYoVUFSVF9Jbml0U3RydWN0LT5VQVJUX0ZJRk8gPT0gVUFSVF9GSUZPX0VuYWJsZSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgRklGT3MgKi8NCiAgICBVQVJUeC0+TENSIHw9IFVBUlRfRklGT19FbmFibGU7DQoNCiAgICAvKiBDbGVhciBUWElGTFNFTCBhbmQgUlhJRkxTRUwgYml0cyAqLw0KICAgIFVBUlR4LT5JRkxTICY9ICBVQVJUX1R4UnhGSUZPTGV2ZWxfTWFzazsNCg0KICAgIC8qIFNldCBSWElGTFNFTCBiaXRzIGFjY29yZGluZyB0byBVQVJUX1J4RklGT0xldmVsIHZhbHVlICovDQogICAgVUFSVHgtPklGTFMgfD0gKFVBUlRfSW5pdFN0cnVjdC0+VUFSVF9SeEZJRk9MZXZlbCA8PCAzKTsNCg0KICAgIC8qIFNldCBUWElGTFNFTCBiaXRzIGFjY29yZGluZyB0byBVQVJUX1R4RklGT0xldmVsIHZhbHVlICovDQogICAgVUFSVHgtPklGTFMgfD0gVUFSVF9Jbml0U3RydWN0LT5VQVJUX1R4RklGT0xldmVsOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIEZJRk9zICovDQogICAgVUFSVHgtPkxDUiAmPSBVQVJUX0ZJRk9fRGlzYWJsZTsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVBUlRfU3RydWN0SW5pdA0KKiBEZXNjcmlwdGlvbiAgICA6IEZpbGxzIGVhY2ggVUFSVF9Jbml0U3RydWN0IG1lbWJlciB3aXRoIGl0cyByZXNldCB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiBVQVJUX0luaXRTdHJ1Y3Q6IHBvaW50ZXIgdG8gYSBVQVJUX0luaXRUeXBlRGVmIHN0cnVjdHVyZSB3aGljaA0KKiAgICAgICAgICAgICAgICAgIHdpbGwgYmUgaW5pdGlhbGl6ZWQuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFVBUlRfU3RydWN0SW5pdChVQVJUX0luaXRUeXBlRGVmKiBVQVJUX0luaXRTdHJ1Y3QpDQp7DQogIC8qIFJlc2V0IHRoZSAgVUFSVF9Jbml0U3RydWN0IG1lbWJlcnMgKi8NCiAgVUFSVF9Jbml0U3RydWN0LT5VQVJUX1dvcmRMZW5ndGggPSBVQVJUX1dvcmRMZW5ndGhfOEQ7DQogIFVBUlRfSW5pdFN0cnVjdC0+VUFSVF9TdG9wQml0cyA9IFVBUlRfU3RvcEJpdHNfMTsNCiAgVUFSVF9Jbml0U3RydWN0LT5VQVJUX1Bhcml0eSA9IFVBUlRfUGFyaXR5X09kZCA7DQogIFVBUlRfSW5pdFN0cnVjdC0+VUFSVF9CYXVkUmF0ZSA9IDk2MDA7DQogIFVBUlRfSW5pdFN0cnVjdC0+VUFSVF9IYXJkd2FyZUZsb3dDb250cm9sID0gVUFSVF9IYXJkd2FyZUZsb3dDb250cm9sX05vbmU7DQogIFVBUlRfSW5pdFN0cnVjdC0+VUFSVF9Nb2RlID0gVUFSVF9Nb2RlX1R4X1J4Ow0KICBVQVJUX0luaXRTdHJ1Y3QtPlVBUlRfRklGTyA9IFVBUlRfRklGT19FbmFibGU7DQogIFVBUlRfSW5pdFN0cnVjdC0+VUFSVF9UeEZJRk9MZXZlbCA9IFVBUlRfRklGT0xldmVsXzFfMjsNCiAgVUFSVF9Jbml0U3RydWN0LT5VQVJUX1J4RklGT0xldmVsID0gVUFSVF9GSUZPTGV2ZWxfMV8yOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVBUlRfQ21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgc3BlY2lmaWVkIFVBUlQgcGVyaXBoZXJhbC4NCiogSW5wdXQgICAgICAgICAgOiAtIFVBUlR4OiB3aGVyZSB4IGNhbiBiZSAwLDEgb3IgMiB0byBzZWxlY3QgdGhlIFVBUlQgcGVyaXBoZXJhbA0KKiAgICAgICAgICAgICAgICAgIC0gTmV3U3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgVUFSVHggcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogRU5BQkxFIG9yIERJU0FCTEUuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFVBUlRfQ21kKFVBUlRfVHlwZURlZiogVUFSVHgsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgaWYgKE5ld1N0YXRlID09IEVOQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZSB0aGUgc2VsZWN0ZWQgVUFSVCBieSBzZXR0aW5nIHRoZSBVQVJURU4gYml0IGluIHRoZSBDUiByZWdpc3RlciAqLw0KICAgIFVBUlR4LT5DUiB8PSBVQVJUX0VuYWJsZV9NYXNrOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGUgdGhlIHNlbGVjdGVkIFVBUlQgYnkgY2xlYXJpbmcgdGhlIFVBUlRFTiBiaXQgaW4gdGhlIENSIHJlZ2lzdGVyICovDQogICAgVUFSVHgtPkNSICY9IFVBUlRfRGlzYWJsZV9NYXNrOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVUFSVF9JVENvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IEVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHNwZWNpZmllZCBVQVJUIGludGVycnVwdHMuDQoqIElucHV0ICAgICAgICAgIDogLSBVQVJUeDogd2hlcmUgeCBjYW4gYmUgMCwxIG9yIDIgdG8gc2VsZWN0IHRoZSBVQVJUIHBlcmlwaGVyYWwNCiogICAgICAgICAgICAgICAgICAtIFVBUlRfSVQ6IHNwZWNpZmllcyB0aGUgVUFSVCBpbnRlcnJ1cHRzIHNvdXJjZXMgdG8gYmUNCiogICAgICAgICAgICAgICAgICAgIGVuYWJsZWQgb3IgZGlzYWJsZWQuIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBhbnkgY29tYmluYXRpb24NCiogICAgICAgICAgICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgdmFsdWVzOg0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0lUX092ZXJydW5FcnJvcjogT3ZlcnJ1biBFcnJvciBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9JVF9CcmVha0Vycm9yOiBCcmVhayBFcnJvciBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9JVF9QYXJpdHlFcnJvcjogUGFyaXR5IEVycm9yIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0lUX0ZyYW1lRXJyb3I6IEZyYW1lIEVycm9yIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0lUX1JlY2VpdmVUaW1lT3V0OiBSZWNlaXZlIFRpbWUgT3V0IGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0lUX1RyYW5zbWl0OiBUcmFuc21pdCBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9JVF9SZWNlaXZlOiBSZWNlaXZlIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0lUX0RTUjogRFNSIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0lUX0RDRDogRENEIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0lUX0NUUzogQ1RTIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0lUX1JJOiBSSSBpbnRlcnJ1cHQNCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFVBUlR4IHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVUFSVF9JVENvbmZpZyhVQVJUX1R5cGVEZWYqIFVBUlR4LCB1MTYgVUFSVF9JVCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KIGlmKE5ld1N0YXRlID09IEVOQUJMRSkNCiAgew0KICAgIC8qIEVuYWJsZXMgdGhlIHNlbGVjdGVkIGludGVycnVwdHMgKi8NCiAgICBVQVJUeC0+SU1TQyB8PSBVQVJUX0lUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIC8qIERpc2FibGVzIHRoZSBzZWxlY3RlZCBpbnRlcnJ1cHRzICovDQogICAgVUFSVHgtPklNU0MgJj0gflVBUlRfSVQ7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBVQVJUX0RNQUNvbmZpZw0KKiBEZXNjcmlwdGlvbiAgICA6IENvbmZpZ3VyZXMgdGhlIFVBUlR4knMgRE1BIGludGVyZmFjZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFVBUlR4OiB3aGVyZSB4IGNhbiBiZSAxIG9yIDIgdG8gc2VsZWN0IHRoZSBVQVJUIHBlcmlwaGVyYWwNCiogICAgICAgICAgICAgICAgICAtIFVBUlRfRE1BT25FcnJvcjogc3BlY2lmaWVzIHRoZSBETUEgb24gZXJyb3IgcmVxdWVzdC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToNCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0RNQU9uRXJyb3JfRW5hYmxlOiBETUEgcmVjZWl2ZSByZXF1ZXN0IGVuYWJsZWQNCiogICAgICAgICAgICAgICAgICAgICAgICAgICB3aGVuIHRoZSBVQVJUIGVycm9yIGludGVycnVwdCBpcyBhc3NlcnRlZC4NCiogICAgICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0RNQU9uRXJyb3JfRGlzYWJsZTogRE1BIHJlY2VpdmUgcmVxdWVzdCBkaXNhYmxlZA0KKiAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gdGhlIFVBUlQgZXJyb3IgaW50ZXJydXB0IGlzIGFzc2VydGVkLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVQVJUX0RNQUNvbmZpZyhVQVJUX1R5cGVEZWYqIFVBUlR4LCB1MTYgVUFSVF9ETUFPbkVycm9yKQ0Kew0KICBpZihVQVJUX0RNQU9uRXJyb3IgPT0gVUFSVF9ETUFPbkVycm9yX0VuYWJsZSkNCiAgew0KICAgIFVBUlR4LT5ETUFDUiAmPSBVQVJUX0RNQU9uRXJyb3JfRW5hYmxlOw0KICB9DQogIGVsc2UNCiAgew0KICAgIFVBUlR4LT5ETUFDUiB8PSBVQVJUX0RNQU9uRXJyb3JfRGlzYWJsZTsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVBUlRfRE1BQ21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVUFSVHiScyBETUEgaW50ZXJmYWNlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVUFSVHg6IHdoZXJlIHggY2FuIGJlIDEgb3IgMiB0byBzZWxlY3QgdGhlIFVBUlQgcGVyaXBoZXJhbA0KKiAgICAgICAgICAgICAgICAgIC0gVUFSVF9ETUFSZXE6IGVuYWJsZXMgb3IgZGlzYWJsZXMgdGhlIHJlcXVlc3Qgb2YgRE1BIGZyb20gVUFSVC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZToNCiogICAgICAgICAgICAgICAgICAgICAtIFVBUlRfRE1BUmVxX1R4OiBUcmFuc21pdCBETUEgRW5hYmxlDQoqICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0RNQVJlcV9SeDogUmVjZWl2ZSBETUEgRW5hYmxlDQoqICAgICAgICAgICAgICAgICAgLSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBVQVJUeCBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVUFSVF9ETUFDbWQoVUFSVF9UeXBlRGVmKiBVQVJUeCwgdTggVUFSVF9ETUFSZXEsIEZ1bmN0aW9uYWxTdGF0ZSBOZXdTdGF0ZSkNCnsNCiAgaWYoVUFSVF9ETUFSZXEgPT0gVUFSVF9ETUFSZXFfVHgpDQogIHsNCiAgICBpZihOZXdTdGF0ZSA9PSBFTkFCTEUpDQogICAgew0KICAgICAgVUFSVHgtPkRNQUNSIHw9ICBVQVJUX0RNQVJlcV9UeDsNCiAgICB9DQogICAgZWxzZQ0KICAgIHsNCiAgICAgIFVBUlR4LT5ETUFDUiAmPSB+VUFSVF9ETUFSZXFfVHg7DQogICAgfQ0KICB9DQoNCiAgIGlmKFVBUlRfRE1BUmVxID09IFVBUlRfRE1BUmVxX1J4KQ0KICB7DQogICAgaWYoTmV3U3RhdGUgPT0gRU5BQkxFKQ0KICAgIHsNCiAgICAgIFVBUlR4LT5ETUFDUiB8PSAgVUFSVF9ETUFSZXFfUng7DQogICAgfQ0KICAgIGVsc2UNCiAgICB7DQogICAgICBVQVJUeC0+RE1BQ1IgJj0gflVBUlRfRE1BUmVxX1J4Ow0KICAgIH0NCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVBUlRfTG9vcEJhY2tDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBFbmFibGVzIG9yIGRpc2FibGVzIHRoZSBMb29wQmFjayBtb2RlLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVUFSVHg6IHdoZXJlIHggY2FuIGJlIDAsMSBvciAyIHRvIHNlbGVjdCB0aGUgVUFSVCBwZXJpcGhlcmFsDQoqICAgICAgICAgICAgICAgICAgLSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBVQVJUeCBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVUFSVF9Mb29wQmFja0NvbmZpZyhVQVJUX1R5cGVEZWYqIFVBUlR4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIGlmIChOZXdTdGF0ZSA9PSBFTkFCTEUpDQogIHsNCiAgICAvKiBFbmFibGUgdGhlIExvb3BCYWNrIG1vZGUgb2YgdGhlIHNwZWNpZmllZCBVQVJUICovDQogICAgVUFSVHgtPkNSIHw9IFVBUlRfTG9vcEJhY2tfRW5hYmxlX01hc2s7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgLyogRGlzYWJsZSB0aGUgTG9vcEJhY2sgbW9kZSBvZiB0aGUgc3BlY2lmaWVkIFVBUlQgKi8NCiAgICBVQVJUeC0+Q1IgJj0gVUFSVF9Mb29wQmFja19EaXNhYmxlX01hc2s7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBVQVJUX0dldEZsYWdTdGF0dXMNCiogRGVzY3JpcHRpb24gICAgOiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIFVBUlQgZmxhZyBpcyBzZXQgb3Igbm90Lg0KKiBJbnB1dCAgICAgICAgICA6IC0gVUFSVHg6IHdoZXJlIHggY2FuIGJlIDAsMSBvciAyIHRvIHNlbGVjdCB0aGUgVUFSVCBwZXJpcGhlcmFsDQoqICAgICAgICAgICAgICAgICAgLSBVQVJUX0ZMQUc6IHNwZWNpZmllcyB0aGUgZmxhZyB0byBjaGVjay4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0ZMQUdfT3ZlcnJ1bkVycm9yOiBPdmVycnVuIGVycm9yIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAtIFVBUlRfRkxBR19CcmVhazogYnJlYWsgZXJyb3IgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9GTEFHX1Bhcml0eUVycm9yOiBwYXJpdHkgZXJyb3IgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9GTEFHX0ZyYW1lRXJyb3I6IGZyYW1lIGVycm9yIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAtIFVBUlRfRkxBR19SSTogUkkgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9GTEFHX1R4RklGT0VtcHR5OiBUcmFuc21pdCBGSUZPIEVtcHR5IGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAtIFVBUlRfRkxBR19SeEZJRk9GdWxsOiBSZWNlaXZlIEZJRk8gRnVsbCBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0ZMQUdfVHhGSUZPRnVsbDogVHJhbnNtaXQgRklGTyBGdWxsIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAtIFVBUlRfRkxBR19SeEZJRk9FbXB0eTogUmVjZWl2ZSBGSUZPIEVtcHR5IGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAtIFVBUlRfRkxBR19CdXN5OiBVQVJUIEJ1c3kgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9GTEFHX0NUUzogQ1RTIGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAtIFVBUlRfRkxBR19EQ0Q6IERDRCBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0ZMQUdfRFNSOiBEU1IgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9SYXdJVF9PdmVycnVuRXJyb3I6IE92ZXJydW4gRXJyb3IgaW50ZXJydXB0IGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAtIFVBUlRfUmF3SVRfQnJlYWtFcnJvcjogQnJlYWsgRXJyb3IgaW50ZXJydXB0IGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAtIFVBUlRfUmF3SVRfUGFyaXR5RXJyb3I6IFBhcml0eSBFcnJvciBpbnRlcnJ1cHQgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9SYXdJVF9GcmFtZUVycm9yOiBGcmFtZSBFcnJvciBpbnRlcnJ1cHQgZmxhZw0KKiAgICAgICAgICAgICAgICAgICAgIC0gVUFSVF9SYXdJVF9SZWNlaXZlVGltZU91dDogUmVjZWl2ZVRpbWVPdXQgaW50ZXJydXB0IGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAtIFVBUlRfUmF3SVRfVHJhbnNtaXQ6IFRyYW5zbWl0IGludGVycnVwdCBmbGFnDQoqICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX1Jhd0lUX1JlY2VpdmU6IFJlY2VpdmUgaW50ZXJydXB0IGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAtIFVBUlRfUmF3SVRfRFNSOiBEU1IgaW50ZXJydXB0IGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAtIFVBUlRfUmF3SVRfRENEOiBEQ0QgaW50ZXJydXB0IGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAtIFVBUlRfUmF3SVRfQ1RTOiBDVFMgaW50ZXJydXB0IGZsYWcNCiogICAgICAgICAgICAgICAgICAgICAtIFVBUlRfUmF3SVRfUkk6IFJJIGludGVycnVwdCBmbGFnDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSBuZXcgc3RhdGUgb2YgVUFSVF9GTEFHIChTRVQgb3IgUkVTRVQpLg0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCkZsYWdTdGF0dXMgVUFSVF9HZXRGbGFnU3RhdHVzKFVBUlRfVHlwZURlZiogVUFSVHgsIHUxNiBVQVJUX0ZMQUcpDQp7DQoNCiAgdTMyIFVBUlRSZWcgPSAwLCBGbGFnUG9zID0gMDsNCiAgdTMyIFN0YXR1c1JlZyA9IDA7DQoNCiAgLyogR2V0IHRoZSBVQVJUIHJlZ2lzdGVyIGluZGV4ICovDQogIFVBUlRSZWcgPSBVQVJUX0ZMQUcgPj4gNTsNCg0KICAvKiBHZXQgdGhlIGZsYWcgcG9zaXRpb24gKi8NCiAgRmxhZ1BvcyA9IFVBUlRfRkxBRyAmIFVBUlRfRkxBR19NYXNrOw0KDQogIGlmKFVBUlRSZWcgPT0gMSkgLyogVGhlIGZsYWcgdG8gY2hlY2sgaXMgaW4gUlNSIHJlZ2lzdGVyICovDQogIHsNCiAgICBTdGF0dXNSZWcgPSBVQVJUeC0+UlNFQ1I7DQogIH0NCiAgZWxzZSBpZiAoVUFSVFJlZyA9PSAyKSAvKiBUaGUgZmxhZyB0byBjaGVjayBpcyBpbiBGUiByZWdpc3RlciAqLw0KICB7DQogICAgU3RhdHVzUmVnID0gVUFSVHgtPkZSOw0KICB9DQogIGVsc2UgaWYoVUFSVFJlZyA9PSAzKSAvKiBUaGUgZmxhZyB0byBjaGVjayBpcyBpbiBSSVMgcmVnaXN0ZXIgKi8NCiAgew0KICAgIFN0YXR1c1JlZyA9IFVBUlR4LT5SSVM7DQogIH0NCg0KICBpZigoU3RhdHVzUmVnICYgKDEgPDwgRmxhZ1BvcykpIT0gUkVTRVQpDQogIHsNCiAgICByZXR1cm4gU0VUOw0KICB9DQogIGVsc2UNCiAgew0KICAgIHJldHVybiBSRVNFVDsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVBUlRfQ2xlYXJGbGFnDQoqIERlc2NyaXB0aW9uICAgIDogQ2xlYXJzIHRoZSBVQVJUeJJzIGZsYWdzKEZyYW1lLCBQYXJpdHksIEJyZWFrLCBPdmVycnVuIGVycm9yKS4NCiogSW5wdXQgICAgICAgICAgOiAtIFVBUlR4OiB3aGVyZSB4IGNhbiBiZSAwLDFvciAyIHRvIHNlbGVjdCB0aGUgVUFSVCBwZXJpcGhlcmFsLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVQVJUX0NsZWFyRmxhZyhVQVJUX1R5cGVEZWYqIFVBUlR4KQ0Kew0KICAvKiBDbGVhciB0aGUgZmxhZyAqLw0KICBVQVJUeC0+UlNFQ1IgPSBVQVJUX0NsZWFyRmxhZ19NYXNrOw0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVBUlRfR2V0SVRTdGF0dXMNCiogRGVzY3JpcHRpb24gICAgOiBDaGVja3Mgd2hldGhlciB0aGUgc3BlY2lmaWVkIFVBUlQgaW50ZXJydXB0IGhhcyBvY2N1cmVkIG9yIG5vdC4NCiogSW5wdXQgICAgICAgICAgOiAtIFVBUlR4OiB3aGVyZSB4IGNhbiBiZSAwLDFvciAyIHRvIHNlbGVjdCB0aGUgVUFSVCBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gVUFSVF9JVDogc3BlY2lmaWVzIHRoZSBpbnRlcnJ1cHQgcGVuZGluZyBiaXQgdG8gYmUgY2hlY2tlZC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZyB2YWx1ZXM6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlRfSVRfT3ZlcnJ1bkVycm9yOiBPdmVycnVuIEVycm9yIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0lUX0JyZWFrRXJyb3I6IEJyZWFrIEVycm9yIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0lUX1Bhcml0eUVycm9yOiBQYXJpdHkgRXJyb3IgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlRfSVRfRnJhbWVFcnJvcjogRnJhbWUgRXJyb3IgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlRfSVRfUmVjZWl2ZVRpbWVPdXQ6IFJlY2VpdmUgVGltZSBPdXQgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlRfSVRfVHJhbnNtaXQ6IFRyYW5zbWl0IGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0lUX1JlY2VpdmU6IFJlY2VpdmUgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlRfSVRfRFNSOiBEU1IgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlRfSVRfRENEOiBEQ0QgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlRfSVRfQ1RTOiBDVFMgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlRfSVRfUkk6IFJJIGludGVycnVwdA0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBUaGUgbmV3IHN0YXRlIG9mIFVBUlRfSVQgKFNFVCBvciBSRVNFVCkuDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KSVRTdGF0dXMgVUFSVF9HZXRJVFN0YXR1cyhVQVJUX1R5cGVEZWYqIFVBUlR4LCB1MTYgVUFSVF9JVCkNCnsNCiAgaWYoKFVBUlR4LT5NSVMgJiBVQVJUX0lUKSAhPSBSRVNFVCkNCiAgew0KICAgIHJldHVybiBTRVQ7DQogIH0NCiAgZWxzZQ0KICB7DQogICAgcmV0dXJuIFJFU0VUOw0KICB9DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVUFSVF9DbGVhcklUUGVuZGluZ0JpdA0KKiBEZXNjcmlwdGlvbiAgICA6IENsZWFycyB0aGUgVUFSVHiScyBpbnRlcnJ1cHQgcGVuZGluZyBiaXRzLg0KKiBJbnB1dCAgICAgICAgICA6IC0gVUFSVHg6IHdoZXJlIHggY2FuIGJlIDAsMW9yIDIgdG8gc2VsZWN0IHRoZSBVQVJUIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgLSBVQVJUX0lUOiBzcGVjaWZpZXMgdGhlIGludGVycnVwdCBwZW5kaW5nIGJpdCB0byBjbGVhci4NCiogICAgICAgICAgICAgICAgICAgIE1vcmUgdGhhbiBvbmUgaW50ZXJydXB0IGNhbiBiZSBjbGVhcmVkIHVzaW5nIHRoZSCTfJQgb3BlcmF0b3IuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlRfSVRfT3ZlcnJ1bkVycm9yOiBPdmVycnVuIEVycm9yIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0lUX0JyZWFrRXJyb3I6IEJyZWFrIEVycm9yIGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0lUX1Bhcml0eUVycm9yOiBQYXJpdHkgRXJyb3IgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlRfSVRfRnJhbWVFcnJvcjogRnJhbWUgRXJyb3IgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlRfSVRfUmVjZWl2ZVRpbWVPdXQ6IFJlY2VpdmUgVGltZSBPdXQgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlRfSVRfVHJhbnNtaXQ6IFRyYW5zbWl0IGludGVycnVwdA0KKiAgICAgICAgICAgICAgICAgICAgICAgLSBVQVJUX0lUX1JlY2VpdmU6IFJlY2VpdmUgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlRfSVRfRFNSOiBEU1IgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlRfSVRfRENEOiBEQ0QgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlRfSVRfQ1RTOiBDVFMgaW50ZXJydXB0DQoqICAgICAgICAgICAgICAgICAgICAgICAtIFVBUlRfSVRfUkk6IFJJIGludGVycnVwdA0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVQVJUX0NsZWFySVRQZW5kaW5nQml0KFVBUlRfVHlwZURlZiogVUFSVHgsIHUxNiBVQVJUX0lUKQ0Kew0KICAvKiBDbGVhciB0aGUgc3BlY2lmaWVkIGludGVycnVwdCAqLw0KICBVQVJUeC0+SUNSICY9IFVBUlRfSVQ7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVUFSVF9JckRBTG93UG93ZXJDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBTZXRzIHRoZSBJckRBIGxvdyBwb3dlciBtb2RlDQoqIElucHV0ICAgICAgICAgIDogLSBJckRBeDogd2hlcmUgeCBjYW4gYmUgMCwxIG9yIDIgdG8gc2VsZWN0IHRoZSBVQVJUL0lyREEgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIE5ld1N0YXRlOiBuZXcgc3RhdGUgb2YgdGhlIFVBUlRJckRBIHBlcmlwaGVyYWwuDQoqICAgICAgICAgICAgICAgICAgICBUaGlzIHBhcmFtZXRlciBjYW4gYmU6IEVOQUJMRSBvciBESVNBQkxFLg0KKiBPdXRwdXQgICAgICAgICA6IE5vbmUNCiogUmV0dXJuICAgICAgICAgOiBOb25lDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0Kdm9pZCBVQVJUX0lyREFMb3dQb3dlckNvbmZpZyh1OCBJckRBeCwgRnVuY3Rpb25hbFN0YXRlIE5ld1N0YXRlKQ0Kew0KICBVQVJUX1R5cGVEZWYqIFVBUlR4Ow0KDQogIHN3aXRjaChJckRBeCkNCiAgew0KICAgIGNhc2UgSXJEQTA6IFVBUlR4ID0gVUFSVDA7DQogICAgYnJlYWs7DQogICAgY2FzZSBJckRBMTogVUFSVHggPSBVQVJUMTsNCiAgICBicmVhazsNCiAgICBjYXNlIElyREEyOiBVQVJUeCA9IFVBUlQyOw0KICAgIGJyZWFrOw0KICB9DQoNCiAgaWYgKE5ld1N0YXRlID09IEVOQUJMRSkNCiAgew0KICAgIFVBUlR4LT5DUiB8PSBJckRBX0xvd1Bvd2VyX0VuYWJsZV9NYXNrOw0KICB9DQogIGVsc2UNCiAgew0KICAgIFVBUlR4LT5DUiAmPSBJckRBX0xvd1Bvd2VyX0Rpc2FibGVfTWFzazsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVBUlRfSXJEQVNldENvdW50ZXINCiogRGVzY3JpcHRpb24gICAgOiBTZXRzIHRoZSBJckRBIGNvdW50ZXIgZGl2aXNvciB2YWx1ZS4NCiogSW5wdXQgICAgICAgICAgOiAtIFVBUlR4OiB3aGVyZSB4IGNhbiBiZSAwLDEgb3IgMiB0byBzZWxlY3QgdGhlIFVBUlQvSXJEQSBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgIC0gSXJEQV9Db3VudGVyOiBJckRBIGNvdW50ZXIgZGl2aXNvciBuZXcgdmFsdWUgbiBsb3cgcG93ZXIgbW9kZShIeikuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFVBUlRfSXJEQVNldENvdW50ZXIodTggSXJEQXgsIHUzMiBJckRBX0NvdW50ZXIpDQp7DQogIFVBUlRfVHlwZURlZiogVUFSVHg7DQogIHUzMiBBUEJDbG9jazsNCiAgc3dpdGNoKElyREF4KQ0KICB7DQogICAgY2FzZSBJckRBMDogVUFSVHggPSBVQVJUMDsNCiAgICBicmVhazsNCiAgICBjYXNlIElyREExOiBVQVJUeCA9IFVBUlQxOw0KICAgIGJyZWFrOw0KICAgIGNhc2UgSXJEQTI6IFVBUlR4ID0gVUFSVDI7DQogICAgYnJlYWs7DQogIH0NCiAgIC8qIEdldCB0aGUgQVBCIGZyZXF1ZW5jeSAqLw0KICBBUEJDbG9jayA9IChTQ1VfR2V0UENMS0ZyZXFWYWx1ZSgpKSoxMDAwOw0KICAvKiBEZXRlcm1pbmUgdGhlIENvdW50ZXIgRGl2aXNvciBwYXJ0ICovDQogIFVBUlR4LT5JTFBSID0gKCgoQVBCQ2xvY2sqMTApIC8gKCBJckRBX0NvdW50ZXIpKSArIDUgKS8xMDsNCiB9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVUFSVF9JckRBQ21kDQoqIERlc2NyaXB0aW9uICAgIDogRW5hYmxlcyBvciBkaXNhYmxlcyB0aGUgVUFSVHiScyBJckRBIGludGVyZmFjZS4NCiogSW5wdXQgICAgICAgICAgOiAtIElyREF4OiB3aGVyZSB4IGNhbiBiZSAwLDEgb3IgMiB0byBzZWxlY3QgdGhlIFVBUlQvSXJEQSBwZXJpcGhlcmFsDQoqICAgICAgICAgICAgICAgICAgLSBOZXdTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBVQVJUeCBwZXJpcGhlcmFsLg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBFTkFCTEUgb3IgRElTQUJMRS4NCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVUFSVF9JckRBQ21kKHU4IElyREF4LCBGdW5jdGlvbmFsU3RhdGUgTmV3U3RhdGUpDQp7DQogIFVBUlRfVHlwZURlZiogVUFSVHg7DQoNCiAgc3dpdGNoKElyREF4KQ0KICB7DQogICAgY2FzZSBJckRBMDogVUFSVHggPSBVQVJUMDsNCiAgICBicmVhazsNCiAgICBjYXNlIElyREExOiBVQVJUeCA9IFVBUlQxOw0KICAgIGJyZWFrOw0KICAgIGNhc2UgSXJEQTI6IFVBUlR4ID0gVUFSVDI7DQogICAgYnJlYWs7DQogIH0NCiAgaWYoTmV3U3RhdGUgPT0gRU5BQkxFKQ0KICB7DQogICAgLyogRW5hYmxlIHRoZSBJckRBIG1vZGUgb2YgdGhlIHNwZWNpZmllZCBVQVJUICovDQogICAgVUFSVHgtPkNSIHw9IFVBUlRfSXJEQV9FbmFibGVfTWFzazsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICAvKiBEaXNhYmxlIHRoZSBJckRBIG1vZGUgb2YgdGhlIHNwZWNpZmllZCBVQVJUICovDQogICAgVUFSVHgtPkNSICY9IFVBUlRfSXJEQV9EaXNhYmxlX01hc2s7DQogIH0NCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBVQVJUX1NlbmREYXRhDQoqIERlc2NyaXB0aW9uICAgIDogVHJhbnNtaXRzIHNpZ25sZSBCeXRlIG9mIGRhdGEgdGhyb3VnaCB0aGUgVUFSVHggcGVyaXBoZXJhbC4NCiogSW5wdXQgICAgICAgICAgOiAtIFVBUlR4OiB3aGVyZSB4IGNhbiBiZSAwLDEgb3IgMiB0byBzZWxlY3QgdGhlIFVBUlQgcGVyaXBoZXJhbC4NCiogICAgICAgICAgICAgICAgICAtIERhdGE6IHRoZSBieXRlIHRvIHRyYW5zbWl0DQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFVBUlRfU2VuZERhdGEoVUFSVF9UeXBlRGVmKiBVQVJUeCwgdTggRGF0YSkNCnsNCiAgLyogVHJhbnNtaXQgb25lIGJ5dGUgKi8NCiAgVUFSVHgtPkRSID0gRGF0YTsNCn0NCg0KLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCiogRnVuY3Rpb24gTmFtZSAgOiBVQVJUX1JlY2VpdmVEYXRhDQoqIERlc2NyaXB0aW9uICAgIDogUmV0dXJucyB0aGUgbW9zdCByZWNlbnQgcmVjZWl2ZWQgQnl0ZSBieSB0aGUgVUFSVHggcGVyaXBoZXJhbC4NCiogSW5wdXQgICAgICAgICAgOiBVQVJUeDogd2hlcmUgeCBjYW4gYmUgMCwxIG9yIDIgdG8gc2VsZWN0IHRoZSBVQVJUIHBlcmlwaGVyYWwuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IFRoZSByZWNlaXZlZCBkYXRhDQoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KdTggVUFSVF9SZWNlaXZlRGF0YShVQVJUX1R5cGVEZWYqIFVBUlR4KQ0Kew0KICAvKiBSZWNlaXZlIG9uZSBieXRlICovDQogIHJldHVybiAoKHU4KVVBUlR4LT5EUik7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVUFSVF9TZW5kQnJlYWsNCiogRGVzY3JpcHRpb24gICAgOiBUcmFuc21pdHMgYnJlYWsgY2hhcmFjdGVycy4NCiogSW5wdXQgICAgICAgICAgOiBVQVJUeDogd2hlcmUgeCBjYW4gYmUgMCwxIG9yIDIgdG8gc2VsZWN0IHRoZSBVQVJUIHBlcmlwaGVyYWwuDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFVBUlRfU2VuZEJyZWFrKFVBUlRfVHlwZURlZiogVUFSVHgpDQp7DQogIC8qIFNlbmQgYnJlYWsgY2hhcmFjdGVycyAqLw0KICBVQVJUeC0+TENSIHw9IFVBUlRfQnJlYWtDaGFyX01hc2s7DQp9DQoNCi8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQoqIEZ1bmN0aW9uIE5hbWUgIDogVUFSVF9SVFNDb25maWcNCiogRGVzY3JpcHRpb24gICAgOiBTZXRzIG9yIFJlc2V0cyB0aGUgUlRTIHNpZ25hbA0KKiBJbnB1dCAgICAgICAgICA6IC0gTGV2ZWxTdGF0ZTogbmV3IHN0YXRlIG9mIHRoZSBSVFMgc2lnbmFsIGZvciBVQVJUMCBvbmx5Lg0KKiAgICAgICAgICAgICAgICAgICAgVGhpcyBwYXJhbWV0ZXIgY2FuIGJlOiBMb3dMZXZlbCBvciBIaWdoTGV2ZWwNCiogT3V0cHV0ICAgICAgICAgOiBOb25lDQoqIFJldHVybiAgICAgICAgIDogTm9uZQ0KKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCnZvaWQgVUFSVF9SVFNDb25maWcoVUFSVF9MZXZlbFR5cGVEZWYgTGV2ZWxTdGF0ZSkNCnsNCiAgaWYoTGV2ZWxTdGF0ZSA9PSBMb3dMZXZlbCkNCiAgew0KICAgIFVBUlQwLT5DUiB8PSBVQVJUX1JUU19Mb3dMZXZlbF9NYXNrOw0KICB9DQogIGVsc2UNCiAgew0KICAgIFVBUlQwLT5DUiAmPSBVQVJUX1JUU19IaWdoTGV2ZWxfTWFzazsNCiAgfQ0KfQ0KDQovKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKiBGdW5jdGlvbiBOYW1lICA6IFVBUlRfRFRSQ29uZmlnDQoqIERlc2NyaXB0aW9uICAgIDogU2V0cyBvciBSZXNldHMgdGhlIERUUiBzaWduYWwgZm9yIFVBUlQwIG9ubHkNCiogSW5wdXQgICAgICAgICAgOiAtIExldmVsU3RhdGU6IG5ldyBzdGF0ZSBvZiB0aGUgRFRSIHNpZ25hbC4NCiogICAgICAgICAgICAgICAgICAgIFRoaXMgcGFyYW1ldGVyIGNhbiBiZTogTG93TGV2ZWwgb3IgSGlnaExldmVsDQoqIE91dHB1dCAgICAgICAgIDogTm9uZQ0KKiBSZXR1cm4gICAgICAgICA6IE5vbmUNCioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQp2b2lkIFVBUlRfRFRSQ29uZmlnKFVBUlRfTGV2ZWxUeXBlRGVmIExldmVsU3RhdGUpDQp7DQogIGlmKExldmVsU3RhdGUgPT0gTG93TGV2ZWwpDQogIHsNCiAgICBVQVJUMC0+Q1IgfD0gVUFSVF9EVFJfTG93TGV2ZWxfTWFzazsNCiAgfQ0KICBlbHNlDQogIHsNCiAgICBVQVJUMC0+Q1IgJj0gVUFSVF9EVFJfSGlnaExldmVsX01hc2s7DQogIH0NCn0NCi8qKioqKioqKioqKioqKioqKioqIChDKSBDT1BZUklHSFQgMjAwNiBTVE1pY3JvZWxlY3Ryb25pY3MgKioqKipFTkQgT0YgRklMRSoqKiovDQo=