ZGlmZiAtLWdpdCBhL1N3aWZ0U2hhZGVyLnNsbiBiL1N3aWZ0U2hhZGVyLnNsbgppbmRleCA4NTczMjliLi5kMDllYjgwIDEwMDY0NAotLS0gYS9Td2lmdFNoYWRlci5zbG4KKysrIGIvU3dpZnRTaGFkZXIuc2xuCkBAIC0yNTUsNiArMjU1LDggQEAKIEVuZFByb2plY3QNCiBQcm9qZWN0KCJ7OEJDOUNFQjgtOEI0QS0xMUQwLThEMTEtMDBBMEM5MUJDOTQyfSIpID0gIk9HTEVTM1Rvb2xzIiwgInRoaXJkX3BhcnR5XFBvd2VyVlJfU0RLXFRvb2xzXE9HTEVTM1xCdWlsZFxXaW5kb3dzVkMyMDEwXE9HTEVTM1Rvb2xzLnZjeHByb2oiLCAiezkwODhGQzlFLTk4NDMtNEUwRC04NUQwLTFCNjU3QUZDNDgwQX0iDQogRW5kUHJvamVjdA0KK1Byb2plY3QoIns4QkM5Q0VCOC04QjRBLTExRDAtOEQxMS0wMEEwQzkxQkM5NDJ9IikgPSAiRDNEOCIsICJzcmNcRDNEOFxEM0Q4LnZjeHByb2oiLCAie0YxOEQ1QUJGLUNBM0EtNEI3NC1CREIyLTRBMTk1NkM4NkYxOH0iDQorRW5kUHJvamVjdA0KIEdsb2JhbA0KIAlHbG9iYWxTZWN0aW9uKFNvbHV0aW9uQ29uZmlndXJhdGlvblBsYXRmb3JtcykgPSBwcmVTb2x1dGlvbg0KIAkJRGVidWd8V2luMzIgPSBEZWJ1Z3xXaW4zMg0KQEAgLTcyMSw2ICs3MjMsMTUgQEAKIAkJezkwODhGQzlFLTk4NDMtNEUwRC04NUQwLTFCNjU3QUZDNDgwQX0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KIAkJezkwODhGQzlFLTk4NDMtNEUwRC04NUQwLTFCNjU3QUZDNDgwQX0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXx4NjQNCiAJCXs5MDg4RkM5RS05ODQzLTRFMEQtODVEMC0xQjY1N0FGQzQ4MEF9LlJlbGVhc2V8eDY0LkJ1aWxkLjAgPSBSZWxlYXNlfHg2NA0KKwkJe0YxOEQ1QUJGLUNBM0EtNEI3NC1CREIyLTRBMTk1NkM4NkYxOH0uRGVidWd8V2luMzIuQWN0aXZlQ2ZnID0gRGVidWd8V2luMzINCisJCXtGMThENUFCRi1DQTNBLTRCNzQtQkRCMi00QTE5NTZDODZGMTh9LkRlYnVnfFdpbjMyLkJ1aWxkLjAgPSBEZWJ1Z3xXaW4zMg0KKwkJe0YxOEQ1QUJGLUNBM0EtNEI3NC1CREIyLTRBMTk1NkM4NkYxOH0uRGVidWd8eDY0LkFjdGl2ZUNmZyA9IERlYnVnfFdpbjMyDQorCQl7RjE4RDVBQkYtQ0EzQS00Qjc0LUJEQjItNEExOTU2Qzg2RjE4fS5Qcm9maWxlfFdpbjMyLkFjdGl2ZUNmZyA9IFByb2ZpbGV8V2luMzINCisJCXtGMThENUFCRi1DQTNBLTRCNzQtQkRCMi00QTE5NTZDODZGMTh9LlByb2ZpbGV8V2luMzIuQnVpbGQuMCA9IFByb2ZpbGV8V2luMzINCisJCXtGMThENUFCRi1DQTNBLTRCNzQtQkRCMi00QTE5NTZDODZGMTh9LlByb2ZpbGV8eDY0LkFjdGl2ZUNmZyA9IFByb2ZpbGV8V2luMzINCisJCXtGMThENUFCRi1DQTNBLTRCNzQtQkRCMi00QTE5NTZDODZGMTh9LlJlbGVhc2V8V2luMzIuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KKwkJe0YxOEQ1QUJGLUNBM0EtNEI3NC1CREIyLTRBMTk1NkM4NkYxOH0uUmVsZWFzZXxXaW4zMi5CdWlsZC4wID0gUmVsZWFzZXxXaW4zMg0KKwkJe0YxOEQ1QUJGLUNBM0EtNEI3NC1CREIyLTRBMTk1NkM4NkYxOH0uUmVsZWFzZXx4NjQuQWN0aXZlQ2ZnID0gUmVsZWFzZXxXaW4zMg0KIAlFbmRHbG9iYWxTZWN0aW9uDQogCUdsb2JhbFNlY3Rpb24oU29sdXRpb25Qcm9wZXJ0aWVzKSA9IHByZVNvbHV0aW9uDQogCQlIaWRlU29sdXRpb25Ob2RlID0gRkFMU0UNCmRpZmYgLS1naXQgYS9pbmNsdWRlL0RpcmVjdDNEL2QzZDguaCBiL2luY2x1ZGUvRGlyZWN0M0QvZDNkOC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2MDAyODIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL0RpcmVjdDNEL2QzZDguaApAQCAtMCwwICsxLDEyNzkgQEAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT07DQorICoNCisgKiAgQ29weXJpZ2h0IChDKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKyAqDQorICogIEZpbGU6ICAgZDNkOC5oDQorICogIENvbnRlbnQ6ICAgIERpcmVjdDNEIGluY2x1ZGUgZmlsZQ0KKyAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2lmbmRlZiBfRDNEOF9IXw0KKyNkZWZpbmUgX0QzRDhfSF8NCisNCisjaWZuZGVmIERJUkVDVDNEX1ZFUlNJT04NCisjZGVmaW5lIERJUkVDVDNEX1ZFUlNJT04gICAgICAgICAweDA4MDANCisjZW5kaWYgIC8vRElSRUNUM0RfVkVSU0lPTg0KKw0KKy8vIGluY2x1ZGUgdGhpcyBmaWxlIGNvbnRlbnQgb25seSBpZiBjb21waWxpbmcgZm9yIERYOCBpbnRlcmZhY2VzDQorI2lmKERJUkVDVDNEX1ZFUlNJT04gPj0gMHgwODAwKQ0KKw0KKw0KKy8qIFRoaXMgaWRlbnRpZmllciBpcyBwYXNzZWQgdG8gRGlyZWN0M0RDcmVhdGU4IGluIG9yZGVyIHRvIGVuc3VyZSB0aGF0IGFuDQorICogYXBwbGljYXRpb24gd2FzIGJ1aWx0IGFnYWluc3QgdGhlIGNvcnJlY3QgaGVhZGVyIGZpbGVzLiBUaGlzIG51bWJlciBpcw0KKyAqIGluY3JlbWVudGVkIHdoZW5ldmVyIGEgaGVhZGVyIChvciBvdGhlcikgY2hhbmdlIHdvdWxkIHJlcXVpcmUgYXBwbGljYXRpb25zDQorICogdG8gYmUgcmVidWlsdC4gSWYgdGhlIHZlcnNpb24gZG9lc24ndCBtYXRjaCwgRGlyZWN0M0RDcmVhdGU4IHdpbGwgZmFpbC4NCisgKiAoVGhlIG51bWJlciBpdHNlbGYgaGFzIG5vIG1lYW5pbmcuKSovDQorDQorI2RlZmluZSBEM0RfU0RLX1ZFUlNJT04gMjIwDQorDQorDQorI2luY2x1ZGUgPHN0ZGxpYi5oPg0KKw0KKyNkZWZpbmUgQ09NX05PX1dJTkRPV1NfSA0KKyNpbmNsdWRlIDxvYmpiYXNlLmg+DQorDQorI2luY2x1ZGUgPHdpbmRvd3MuaD4NCisNCisjaWYgIWRlZmluZWQoSE1PTklUT1JfREVDTEFSRUQpICYmIChXSU5WRVIgPCAweDA1MDApDQorICAgICNkZWZpbmUgSE1PTklUT1JfREVDTEFSRUQNCisgICAgREVDTEFSRV9IQU5ETEUoSE1PTklUT1IpOw0KKyNlbmRpZg0KKw0KKyNkZWZpbmUgRDNEQVBJIFdJTkFQSQ0KKw0KKy8qDQorICogSW50ZXJmYWNlIElJRCdzDQorICovDQorI2lmIGRlZmluZWQoIF9XSU4zMiApICYmICFkZWZpbmVkKCBfTk9fQ09NKQ0KKw0KKy8qIElJRF9JRGlyZWN0M0Q4ICovDQorLyogezFERDlFOERBLTFDNzctNGQ0MC1CMENGLTk4RkVGREZGOTUxMn0gKi8NCitERUZJTkVfR1VJRChJSURfSURpcmVjdDNEOCwgMHgxZGQ5ZThkYSwgMHgxYzc3LCAweDRkNDAsIDB4YjAsIDB4Y2YsIDB4OTgsIDB4ZmUsIDB4ZmQsIDB4ZmYsIDB4OTUsIDB4MTIpOw0KKw0KKy8qIElJRF9JRGlyZWN0M0REZXZpY2U4ICovDQorLyogezczODVFNURGLThGRTgtNDFENS04NkI2LUQ3QjQ4NTQ3QjZDRn0gKi8NCitERUZJTkVfR1VJRChJSURfSURpcmVjdDNERGV2aWNlOCwgMHg3Mzg1ZTVkZiwgMHg4ZmU4LCAweDQxZDUsIDB4ODYsIDB4YjYsIDB4ZDcsIDB4YjQsIDB4ODUsIDB4NDcsIDB4YjYsIDB4Y2YpOw0KKw0KKy8qIElJRF9JRGlyZWN0M0RSZXNvdXJjZTggKi8NCisvKiB7MUIzNkJCN0ItMDlCNy00MTBhLUI0NDUtN0QxNDMwRDdCMzNGfSAqLw0KK0RFRklORV9HVUlEKElJRF9JRGlyZWN0M0RSZXNvdXJjZTgsIDB4MWIzNmJiN2IsIDB4OWI3LCAweDQxMGEsIDB4YjQsIDB4NDUsIDB4N2QsIDB4MTQsIDB4MzAsIDB4ZDcsIDB4YjMsIDB4M2YpOw0KKw0KKy8qIElJRF9JRGlyZWN0M0RCYXNlVGV4dHVyZTggKi8NCisvKiB7QjQyMTFDRkEtNTFCOS00YTlmLUFCNzgtREI5OUIyQkI2NzhFfSAqLw0KK0RFRklORV9HVUlEKElJRF9JRGlyZWN0M0RCYXNlVGV4dHVyZTgsIDB4YjQyMTFjZmEsIDB4NTFiOSwgMHg0YTlmLCAweGFiLCAweDc4LCAweGRiLCAweDk5LCAweGIyLCAweGJiLCAweDY3LCAweDhlKTsNCisNCisvKiBJSURfSURpcmVjdDNEVGV4dHVyZTggKi8NCisvKiB7RTRDREQ1NzUtMjg2Ni00ZjAxLUIxMkUtN0VFQ0UxRUM5MzU4fSAqLw0KK0RFRklORV9HVUlEKElJRF9JRGlyZWN0M0RUZXh0dXJlOCwgMHhlNGNkZDU3NSwgMHgyODY2LCAweDRmMDEsIDB4YjEsIDB4MmUsIDB4N2UsIDB4ZWMsIDB4ZTEsIDB4ZWMsIDB4OTMsIDB4NTgpOw0KKw0KKy8qIElJRF9JRGlyZWN0M0RDdWJlVGV4dHVyZTggKi8NCisvKiB7M0VFNUI5NjgtMkFDQS00YzM0LThCQjUtN0UwQzNEMTlCNzUwfSAqLw0KK0RFRklORV9HVUlEKElJRF9JRGlyZWN0M0RDdWJlVGV4dHVyZTgsIDB4M2VlNWI5NjgsIDB4MmFjYSwgMHg0YzM0LCAweDhiLCAweGI1LCAweDdlLCAweDBjLCAweDNkLCAweDE5LCAweGI3LCAweDUwKTsNCisNCisvKiBJSURfSURpcmVjdDNEVm9sdW1lVGV4dHVyZTggKi8NCisvKiB7NEI4QUFBRkEtMTQwRi00MmJhLTkxMzEtNTk3RUFGQUEyRUFEfSAqLw0KK0RFRklORV9HVUlEKElJRF9JRGlyZWN0M0RWb2x1bWVUZXh0dXJlOCwgMHg0YjhhYWFmYSwgMHgxNDBmLCAweDQyYmEsIDB4OTEsIDB4MzEsIDB4NTksIDB4N2UsIDB4YWYsIDB4YWEsIDB4MmUsIDB4YWQpOw0KKw0KKy8qIElJRF9JRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4ICovDQorLyogezhBRUVFQUM3LTA1RjktNDRkNC1CNTkxLTAwMEIwREYxQ0I5NX0gKi8NCitERUZJTkVfR1VJRChJSURfSURpcmVjdDNEVmVydGV4QnVmZmVyOCwgMHg4YWVlZWFjNywgMHgwNWY5LCAweDQ0ZDQsIDB4YjUsIDB4OTEsIDB4MDAsIDB4MGIsIDB4MGQsIDB4ZjEsIDB4Y2IsIDB4OTUpOw0KKw0KKy8qIElJRF9JRGlyZWN0M0RJbmRleEJ1ZmZlcjggKi8NCisvKiB7MEU2ODlDOUEtMDUzRC00NGEwLTlEOTItREIwRTNENzUwRjg2fSAqLw0KK0RFRklORV9HVUlEKElJRF9JRGlyZWN0M0RJbmRleEJ1ZmZlcjgsIDB4MGU2ODljOWEsIDB4MDUzZCwgMHg0NGEwLCAweDlkLCAweDkyLCAweGRiLCAweDBlLCAweDNkLCAweDc1LCAweDBmLCAweDg2KTsNCisNCisvKiBJSURfSURpcmVjdDNEU3VyZmFjZTggKi8NCisvKiB7Qjk2RUVCQ0EtQjMyNi00ZWE1LTg4MkYtMkZGNUJBRTAyMUREfSAqLw0KK0RFRklORV9HVUlEKElJRF9JRGlyZWN0M0RTdXJmYWNlOCwgMHhiOTZlZWJjYSwgMHhiMzI2LCAweDRlYTUsIDB4ODgsIDB4MmYsIDB4MmYsIDB4ZjUsIDB4YmEsIDB4ZTAsIDB4MjEsIDB4ZGQpOw0KKw0KKy8qIElJRF9JRGlyZWN0M0RWb2x1bWU4ICovDQorLyoge0JENzM0OUY1LTE0RjEtNDJlNC05Qzc5LTk3MjM4MERCNDBDMH0gKi8NCitERUZJTkVfR1VJRChJSURfSURpcmVjdDNEVm9sdW1lOCwgMHhiZDczNDlmNSwgMHgxNGYxLCAweDQyZTQsIDB4OWMsIDB4NzksIDB4OTcsIDB4MjMsIDB4ODAsIDB4ZGIsIDB4NDAsIDB4YzApOw0KKw0KKy8qIElJRF9JRGlyZWN0M0RTd2FwQ2hhaW44ICovDQorLyogezkyOEMwODhCLTc2QjktNEM2Qi1BNTM2LUE1OTA4NTM4NzZDRH0gKi8NCitERUZJTkVfR1VJRChJSURfSURpcmVjdDNEU3dhcENoYWluOCwgMHg5MjhjMDg4YiwgMHg3NmI5LCAweDRjNmIsIDB4YTUsIDB4MzYsIDB4YTUsIDB4OTAsIDB4ODUsIDB4MzgsIDB4NzYsIDB4Y2QpOw0KKw0KKyNlbmRpZg0KKw0KKyNpZmRlZiBfX2NwbHVzcGx1cw0KKw0KK2ludGVyZmFjZSBJRGlyZWN0M0Q4Ow0KK2ludGVyZmFjZSBJRGlyZWN0M0REZXZpY2U4Ow0KKw0KK2ludGVyZmFjZSBJRGlyZWN0M0RSZXNvdXJjZTg7DQoraW50ZXJmYWNlIElEaXJlY3QzREJhc2VUZXh0dXJlODsNCitpbnRlcmZhY2UgSURpcmVjdDNEVGV4dHVyZTg7DQoraW50ZXJmYWNlIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4Ow0KK2ludGVyZmFjZSBJRGlyZWN0M0RDdWJlVGV4dHVyZTg7DQorDQoraW50ZXJmYWNlIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjg7DQoraW50ZXJmYWNlIElEaXJlY3QzREluZGV4QnVmZmVyODsNCisNCitpbnRlcmZhY2UgSURpcmVjdDNEU3VyZmFjZTg7DQoraW50ZXJmYWNlIElEaXJlY3QzRFZvbHVtZTg7DQorDQoraW50ZXJmYWNlIElEaXJlY3QzRFN3YXBDaGFpbjg7DQorDQorI2VuZGlmDQorDQorDQordHlwZWRlZiBpbnRlcmZhY2UgSURpcmVjdDNEOCAgICAgICAgICAgICAgICBJRGlyZWN0M0Q4Ow0KK3R5cGVkZWYgaW50ZXJmYWNlIElEaXJlY3QzRERldmljZTggICAgICAgICAgSURpcmVjdDNERGV2aWNlODsNCit0eXBlZGVmIGludGVyZmFjZSBJRGlyZWN0M0RSZXNvdXJjZTggICAgICAgIElEaXJlY3QzRFJlc291cmNlODsNCit0eXBlZGVmIGludGVyZmFjZSBJRGlyZWN0M0RCYXNlVGV4dHVyZTggICAgIElEaXJlY3QzREJhc2VUZXh0dXJlODsNCit0eXBlZGVmIGludGVyZmFjZSBJRGlyZWN0M0RUZXh0dXJlOCAgICAgICAgIElEaXJlY3QzRFRleHR1cmU4Ow0KK3R5cGVkZWYgaW50ZXJmYWNlIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4ICAgSURpcmVjdDNEVm9sdW1lVGV4dHVyZTg7DQordHlwZWRlZiBpbnRlcmZhY2UgSURpcmVjdDNEQ3ViZVRleHR1cmU4ICAgICBJRGlyZWN0M0RDdWJlVGV4dHVyZTg7DQordHlwZWRlZiBpbnRlcmZhY2UgSURpcmVjdDNEVmVydGV4QnVmZmVyOCAgICBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4Ow0KK3R5cGVkZWYgaW50ZXJmYWNlIElEaXJlY3QzREluZGV4QnVmZmVyOCAgICAgSURpcmVjdDNESW5kZXhCdWZmZXI4Ow0KK3R5cGVkZWYgaW50ZXJmYWNlIElEaXJlY3QzRFN1cmZhY2U4ICAgICAgICAgSURpcmVjdDNEU3VyZmFjZTg7DQordHlwZWRlZiBpbnRlcmZhY2UgSURpcmVjdDNEVm9sdW1lOCAgICAgICAgICBJRGlyZWN0M0RWb2x1bWU4Ow0KK3R5cGVkZWYgaW50ZXJmYWNlIElEaXJlY3QzRFN3YXBDaGFpbjggICAgICAgSURpcmVjdDNEU3dhcENoYWluODsNCisNCisjaW5jbHVkZSAiZDNkOHR5cGVzLmgiDQorI2luY2x1ZGUgImQzZDhjYXBzLmgiDQorDQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorZXh0ZXJuICJDIiB7DQorI2VuZGlmDQorDQorLyoNCisgKiBETEwgRnVuY3Rpb24gZm9yIGNyZWF0aW5nIGEgRGlyZWN0M0Q4IG9iamVjdC4gVGhpcyBvYmplY3Qgc3VwcG9ydHMNCisgKiBlbnVtZXJhdGlvbiBhbmQgYWxsb3dzIHRoZSBjcmVhdGlvbiBvZiBEaXJlY3QzRERldmljZTggb2JqZWN0cy4NCisgKiBQYXNzIHRoZSB2YWx1ZSBvZiB0aGUgY29uc3RhbnQgRDNEX1NES19WRVJTSU9OIHRvIHRoaXMgZnVuY3Rpb24sIHNvDQorICogdGhhdCB0aGUgcnVuLXRpbWUgY2FuIHZhbGlkYXRlIHRoYXQgeW91ciBhcHBsaWNhdGlvbiB3YXMgY29tcGlsZWQNCisgKiBhZ2FpbnN0IHRoZSByaWdodCBoZWFkZXJzLg0KKyAqLw0KKw0KK0lEaXJlY3QzRDggKiBXSU5BUEkgRGlyZWN0M0RDcmVhdGU4KFVJTlQgU0RLVmVyc2lvbik7DQorDQorDQorLyoNCisgKiBEaXJlY3QzRCBpbnRlcmZhY2VzDQorICovDQorDQorDQorDQorDQorDQorDQorI3VuZGVmIElOVEVSRkFDRQ0KKyNkZWZpbmUgSU5URVJGQUNFIElEaXJlY3QzRDgNCisNCitERUNMQVJFX0lOVEVSRkFDRV8oSURpcmVjdDNEOCwgSVVua25vd24pDQorew0KKyAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLw0KKyAgICBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpKFRISVNfIFJFRklJRCByaWlkLCB2b2lkKiogcHB2T2JqKSBQVVJFOw0KKyAgICBTVERNRVRIT0RfKFVMT05HLEFkZFJlZikoVEhJUykgUFVSRTsNCisgICAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKShUSElTKSBQVVJFOw0KKw0KKyAgICAvKioqIElEaXJlY3QzRDggbWV0aG9kcyAqKiovDQorICAgIFNURE1FVEhPRChSZWdpc3RlclNvZnR3YXJlRGV2aWNlKShUSElTXyB2b2lkKiBwSW5pdGlhbGl6ZUZ1bmN0aW9uKSBQVVJFOw0KKyAgICBTVERNRVRIT0RfKFVJTlQsIEdldEFkYXB0ZXJDb3VudCkoVEhJUykgUFVSRTsNCisgICAgU1RETUVUSE9EKEdldEFkYXB0ZXJJZGVudGlmaWVyKShUSElTXyBVSU5UIEFkYXB0ZXIsRFdPUkQgRmxhZ3MsRDNEQURBUFRFUl9JREVOVElGSUVSOCogcElkZW50aWZpZXIpIFBVUkU7DQorICAgIFNURE1FVEhPRF8oVUlOVCwgR2V0QWRhcHRlck1vZGVDb3VudCkoVEhJU18gVUlOVCBBZGFwdGVyKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoRW51bUFkYXB0ZXJNb2RlcykoVEhJU18gVUlOVCBBZGFwdGVyLFVJTlQgTW9kZSxEM0RESVNQTEFZTU9ERSogcE1vZGUpIFBVUkU7DQorICAgIFNURE1FVEhPRChHZXRBZGFwdGVyRGlzcGxheU1vZGUpKFRISVNfIFVJTlQgQWRhcHRlcixEM0RESVNQTEFZTU9ERSogcE1vZGUpIFBVUkU7DQorICAgIFNURE1FVEhPRChDaGVja0RldmljZVR5cGUpKFRISVNfIFVJTlQgQWRhcHRlcixEM0RERVZUWVBFIENoZWNrVHlwZSxEM0RGT1JNQVQgRGlzcGxheUZvcm1hdCxEM0RGT1JNQVQgQmFja0J1ZmZlckZvcm1hdCxCT09MIFdpbmRvd2VkKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoQ2hlY2tEZXZpY2VGb3JtYXQpKFRISVNfIFVJTlQgQWRhcHRlcixEM0RERVZUWVBFIERldmljZVR5cGUsRDNERk9STUFUIEFkYXB0ZXJGb3JtYXQsRFdPUkQgVXNhZ2UsRDNEUkVTT1VSQ0VUWVBFIFJUeXBlLEQzREZPUk1BVCBDaGVja0Zvcm1hdCkgUFVSRTsNCisgICAgU1RETUVUSE9EKENoZWNrRGV2aWNlTXVsdGlTYW1wbGVUeXBlKShUSElTXyBVSU5UIEFkYXB0ZXIsRDNEREVWVFlQRSBEZXZpY2VUeXBlLEQzREZPUk1BVCBTdXJmYWNlRm9ybWF0LEJPT0wgV2luZG93ZWQsRDNETVVMVElTQU1QTEVfVFlQRSBNdWx0aVNhbXBsZVR5cGUpIFBVUkU7DQorICAgIFNURE1FVEhPRChDaGVja0RlcHRoU3RlbmNpbE1hdGNoKShUSElTXyBVSU5UIEFkYXB0ZXIsRDNEREVWVFlQRSBEZXZpY2VUeXBlLEQzREZPUk1BVCBBZGFwdGVyRm9ybWF0LEQzREZPUk1BVCBSZW5kZXJUYXJnZXRGb3JtYXQsRDNERk9STUFUIERlcHRoU3RlbmNpbEZvcm1hdCkgUFVSRTsNCisgICAgU1RETUVUSE9EKEdldERldmljZUNhcHMpKFRISVNfIFVJTlQgQWRhcHRlcixEM0RERVZUWVBFIERldmljZVR5cGUsRDNEQ0FQUzgqIHBDYXBzKSBQVVJFOw0KKyAgICBTVERNRVRIT0RfKEhNT05JVE9SLCBHZXRBZGFwdGVyTW9uaXRvcikoVEhJU18gVUlOVCBBZGFwdGVyKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoQ3JlYXRlRGV2aWNlKShUSElTXyBVSU5UIEFkYXB0ZXIsRDNEREVWVFlQRSBEZXZpY2VUeXBlLEhXTkQgaEZvY3VzV2luZG93LERXT1JEIEJlaGF2aW9yRmxhZ3MsRDNEUFJFU0VOVF9QQVJBTUVURVJTKiBwUHJlc2VudGF0aW9uUGFyYW1ldGVycyxJRGlyZWN0M0REZXZpY2U4KiogcHBSZXR1cm5lZERldmljZUludGVyZmFjZSkgUFVSRTsNCit9Ow0KKw0KK3R5cGVkZWYgc3RydWN0IElEaXJlY3QzRDggKkxQRElSRUNUM0Q4LCAqUERJUkVDVDNEODsNCisNCisjaWYgIWRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoQ0lOVEVSRkFDRSkNCisjZGVmaW5lIElEaXJlY3QzRDhfUXVlcnlJbnRlcmZhY2UocCxhLGIpIChwKS0+bHBWdGJsLT5RdWVyeUludGVyZmFjZShwLGEsYikNCisjZGVmaW5lIElEaXJlY3QzRDhfQWRkUmVmKHApIChwKS0+bHBWdGJsLT5BZGRSZWYocCkNCisjZGVmaW5lIElEaXJlY3QzRDhfUmVsZWFzZShwKSAocCktPmxwVnRibC0+UmVsZWFzZShwKQ0KKyNkZWZpbmUgSURpcmVjdDNEOF9SZWdpc3RlclNvZnR3YXJlRGV2aWNlKHAsYSkgKHApLT5scFZ0YmwtPlJlZ2lzdGVyU29mdHdhcmVEZXZpY2UocCxhKQ0KKyNkZWZpbmUgSURpcmVjdDNEOF9HZXRBZGFwdGVyQ291bnQocCkgKHApLT5scFZ0YmwtPkdldEFkYXB0ZXJDb3VudChwKQ0KKyNkZWZpbmUgSURpcmVjdDNEOF9HZXRBZGFwdGVySWRlbnRpZmllcihwLGEsYixjKSAocCktPmxwVnRibC0+R2V0QWRhcHRlcklkZW50aWZpZXIocCxhLGIsYykNCisjZGVmaW5lIElEaXJlY3QzRDhfR2V0QWRhcHRlck1vZGVDb3VudChwLGEpIChwKS0+bHBWdGJsLT5HZXRBZGFwdGVyTW9kZUNvdW50KHAsYSkNCisjZGVmaW5lIElEaXJlY3QzRDhfRW51bUFkYXB0ZXJNb2RlcyhwLGEsYixjKSAocCktPmxwVnRibC0+RW51bUFkYXB0ZXJNb2RlcyhwLGEsYixjKQ0KKyNkZWZpbmUgSURpcmVjdDNEOF9HZXRBZGFwdGVyRGlzcGxheU1vZGUocCxhLGIpIChwKS0+bHBWdGJsLT5HZXRBZGFwdGVyRGlzcGxheU1vZGUocCxhLGIpDQorI2RlZmluZSBJRGlyZWN0M0Q4X0NoZWNrRGV2aWNlVHlwZShwLGEsYixjLGQsZSkgKHApLT5scFZ0YmwtPkNoZWNrRGV2aWNlVHlwZShwLGEsYixjLGQsZSkNCisjZGVmaW5lIElEaXJlY3QzRDhfQ2hlY2tEZXZpY2VGb3JtYXQocCxhLGIsYyxkLGUsZikgKHApLT5scFZ0YmwtPkNoZWNrRGV2aWNlRm9ybWF0KHAsYSxiLGMsZCxlLGYpDQorI2RlZmluZSBJRGlyZWN0M0Q4X0NoZWNrRGV2aWNlTXVsdGlTYW1wbGVUeXBlKHAsYSxiLGMsZCxlKSAocCktPmxwVnRibC0+Q2hlY2tEZXZpY2VNdWx0aVNhbXBsZVR5cGUocCxhLGIsYyxkLGUpDQorI2RlZmluZSBJRGlyZWN0M0Q4X0NoZWNrRGVwdGhTdGVuY2lsTWF0Y2gocCxhLGIsYyxkLGUpIChwKS0+bHBWdGJsLT5DaGVja0RlcHRoU3RlbmNpbE1hdGNoKHAsYSxiLGMsZCxlKQ0KKyNkZWZpbmUgSURpcmVjdDNEOF9HZXREZXZpY2VDYXBzKHAsYSxiLGMpIChwKS0+bHBWdGJsLT5HZXREZXZpY2VDYXBzKHAsYSxiLGMpDQorI2RlZmluZSBJRGlyZWN0M0Q4X0dldEFkYXB0ZXJNb25pdG9yKHAsYSkgKHApLT5scFZ0YmwtPkdldEFkYXB0ZXJNb25pdG9yKHAsYSkNCisjZGVmaW5lIElEaXJlY3QzRDhfQ3JlYXRlRGV2aWNlKHAsYSxiLGMsZCxlLGYpIChwKS0+bHBWdGJsLT5DcmVhdGVEZXZpY2UocCxhLGIsYyxkLGUsZikNCisjZWxzZQ0KKyNkZWZpbmUgSURpcmVjdDNEOF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5RdWVyeUludGVyZmFjZShhLGIpDQorI2RlZmluZSBJRGlyZWN0M0Q4X0FkZFJlZihwKSAocCktPkFkZFJlZigpDQorI2RlZmluZSBJRGlyZWN0M0Q4X1JlbGVhc2UocCkgKHApLT5SZWxlYXNlKCkNCisjZGVmaW5lIElEaXJlY3QzRDhfUmVnaXN0ZXJTb2Z0d2FyZURldmljZShwLGEpIChwKS0+UmVnaXN0ZXJTb2Z0d2FyZURldmljZShhKQ0KKyNkZWZpbmUgSURpcmVjdDNEOF9HZXRBZGFwdGVyQ291bnQocCkgKHApLT5HZXRBZGFwdGVyQ291bnQoKQ0KKyNkZWZpbmUgSURpcmVjdDNEOF9HZXRBZGFwdGVySWRlbnRpZmllcihwLGEsYixjKSAocCktPkdldEFkYXB0ZXJJZGVudGlmaWVyKGEsYixjKQ0KKyNkZWZpbmUgSURpcmVjdDNEOF9HZXRBZGFwdGVyTW9kZUNvdW50KHAsYSkgKHApLT5HZXRBZGFwdGVyTW9kZUNvdW50KGEpDQorI2RlZmluZSBJRGlyZWN0M0Q4X0VudW1BZGFwdGVyTW9kZXMocCxhLGIsYykgKHApLT5FbnVtQWRhcHRlck1vZGVzKGEsYixjKQ0KKyNkZWZpbmUgSURpcmVjdDNEOF9HZXRBZGFwdGVyRGlzcGxheU1vZGUocCxhLGIpIChwKS0+R2V0QWRhcHRlckRpc3BsYXlNb2RlKGEsYikNCisjZGVmaW5lIElEaXJlY3QzRDhfQ2hlY2tEZXZpY2VUeXBlKHAsYSxiLGMsZCxlKSAocCktPkNoZWNrRGV2aWNlVHlwZShhLGIsYyxkLGUpDQorI2RlZmluZSBJRGlyZWN0M0Q4X0NoZWNrRGV2aWNlRm9ybWF0KHAsYSxiLGMsZCxlLGYpIChwKS0+Q2hlY2tEZXZpY2VGb3JtYXQoYSxiLGMsZCxlLGYpDQorI2RlZmluZSBJRGlyZWN0M0Q4X0NoZWNrRGV2aWNlTXVsdGlTYW1wbGVUeXBlKHAsYSxiLGMsZCxlKSAocCktPkNoZWNrRGV2aWNlTXVsdGlTYW1wbGVUeXBlKGEsYixjLGQsZSkNCisjZGVmaW5lIElEaXJlY3QzRDhfQ2hlY2tEZXB0aFN0ZW5jaWxNYXRjaChwLGEsYixjLGQsZSkgKHApLT5DaGVja0RlcHRoU3RlbmNpbE1hdGNoKGEsYixjLGQsZSkNCisjZGVmaW5lIElEaXJlY3QzRDhfR2V0RGV2aWNlQ2FwcyhwLGEsYixjKSAocCktPkdldERldmljZUNhcHMoYSxiLGMpDQorI2RlZmluZSBJRGlyZWN0M0Q4X0dldEFkYXB0ZXJNb25pdG9yKHAsYSkgKHApLT5HZXRBZGFwdGVyTW9uaXRvcihhKQ0KKyNkZWZpbmUgSURpcmVjdDNEOF9DcmVhdGVEZXZpY2UocCxhLGIsYyxkLGUsZikgKHApLT5DcmVhdGVEZXZpY2UoYSxiLGMsZCxlLGYpDQorI2VuZGlmDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorDQorI3VuZGVmIElOVEVSRkFDRQ0KKyNkZWZpbmUgSU5URVJGQUNFIElEaXJlY3QzRERldmljZTgNCisNCitERUNMQVJFX0lOVEVSRkFDRV8oSURpcmVjdDNERGV2aWNlOCwgSVVua25vd24pDQorew0KKyAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLw0KKyAgICBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpKFRISVNfIFJFRklJRCByaWlkLCB2b2lkKiogcHB2T2JqKSBQVVJFOw0KKyAgICBTVERNRVRIT0RfKFVMT05HLEFkZFJlZikoVEhJUykgUFVSRTsNCisgICAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKShUSElTKSBQVVJFOw0KKw0KKyAgICAvKioqIElEaXJlY3QzRERldmljZTggbWV0aG9kcyAqKiovDQorICAgIFNURE1FVEhPRChUZXN0Q29vcGVyYXRpdmVMZXZlbCkoVEhJUykgUFVSRTsNCisgICAgU1RETUVUSE9EXyhVSU5ULCBHZXRBdmFpbGFibGVUZXh0dXJlTWVtKShUSElTKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoUmVzb3VyY2VNYW5hZ2VyRGlzY2FyZEJ5dGVzKShUSElTXyBEV09SRCBCeXRlcykgUFVSRTsNCisgICAgU1RETUVUSE9EKEdldERpcmVjdDNEKShUSElTXyBJRGlyZWN0M0Q4KiogcHBEM0Q4KSBQVVJFOw0KKyAgICBTVERNRVRIT0QoR2V0RGV2aWNlQ2FwcykoVEhJU18gRDNEQ0FQUzgqIHBDYXBzKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoR2V0RGlzcGxheU1vZGUpKFRISVNfIEQzRERJU1BMQVlNT0RFKiBwTW9kZSkgUFVSRTsNCisgICAgU1RETUVUSE9EKEdldENyZWF0aW9uUGFyYW1ldGVycykoVEhJU18gRDNEREVWSUNFX0NSRUFUSU9OX1BBUkFNRVRFUlMgKnBQYXJhbWV0ZXJzKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoU2V0Q3Vyc29yUHJvcGVydGllcykoVEhJU18gVUlOVCBYSG90U3BvdCxVSU5UIFlIb3RTcG90LElEaXJlY3QzRFN1cmZhY2U4KiBwQ3Vyc29yQml0bWFwKSBQVVJFOw0KKyAgICBTVERNRVRIT0RfKHZvaWQsIFNldEN1cnNvclBvc2l0aW9uKShUSElTXyBpbnQgWCxpbnQgWSxEV09SRCBGbGFncykgUFVSRTsNCisgICAgU1RETUVUSE9EXyhCT09MLCBTaG93Q3Vyc29yKShUSElTXyBCT09MIGJTaG93KSBQVVJFOw0KKyAgICBTVERNRVRIT0QoQ3JlYXRlQWRkaXRpb25hbFN3YXBDaGFpbikoVEhJU18gRDNEUFJFU0VOVF9QQVJBTUVURVJTKiBwUHJlc2VudGF0aW9uUGFyYW1ldGVycyxJRGlyZWN0M0RTd2FwQ2hhaW44KiogcFN3YXBDaGFpbikgUFVSRTsNCisgICAgU1RETUVUSE9EKFJlc2V0KShUSElTXyBEM0RQUkVTRU5UX1BBUkFNRVRFUlMqIHBQcmVzZW50YXRpb25QYXJhbWV0ZXJzKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoUHJlc2VudCkoVEhJU18gQ09OU1QgUkVDVCogcFNvdXJjZVJlY3QsQ09OU1QgUkVDVCogcERlc3RSZWN0LEhXTkQgaERlc3RXaW5kb3dPdmVycmlkZSxDT05TVCBSR05EQVRBKiBwRGlydHlSZWdpb24pIFBVUkU7DQorICAgIFNURE1FVEhPRChHZXRCYWNrQnVmZmVyKShUSElTXyBVSU5UIEJhY2tCdWZmZXIsRDNEQkFDS0JVRkZFUl9UWVBFIFR5cGUsSURpcmVjdDNEU3VyZmFjZTgqKiBwcEJhY2tCdWZmZXIpIFBVUkU7DQorICAgIFNURE1FVEhPRChHZXRSYXN0ZXJTdGF0dXMpKFRISVNfIEQzRFJBU1RFUl9TVEFUVVMqIHBSYXN0ZXJTdGF0dXMpIFBVUkU7DQorICAgIFNURE1FVEhPRF8odm9pZCwgU2V0R2FtbWFSYW1wKShUSElTXyBEV09SRCBGbGFncyxDT05TVCBEM0RHQU1NQVJBTVAqIHBSYW1wKSBQVVJFOw0KKyAgICBTVERNRVRIT0RfKHZvaWQsIEdldEdhbW1hUmFtcCkoVEhJU18gRDNER0FNTUFSQU1QKiBwUmFtcCkgUFVSRTsNCisgICAgU1RETUVUSE9EKENyZWF0ZVRleHR1cmUpKFRISVNfIFVJTlQgV2lkdGgsVUlOVCBIZWlnaHQsVUlOVCBMZXZlbHMsRFdPUkQgVXNhZ2UsRDNERk9STUFUIEZvcm1hdCxEM0RQT09MIFBvb2wsSURpcmVjdDNEVGV4dHVyZTgqKiBwcFRleHR1cmUpIFBVUkU7DQorICAgIFNURE1FVEhPRChDcmVhdGVWb2x1bWVUZXh0dXJlKShUSElTXyBVSU5UIFdpZHRoLFVJTlQgSGVpZ2h0LFVJTlQgRGVwdGgsVUlOVCBMZXZlbHMsRFdPUkQgVXNhZ2UsRDNERk9STUFUIEZvcm1hdCxEM0RQT09MIFBvb2wsSURpcmVjdDNEVm9sdW1lVGV4dHVyZTgqKiBwcFZvbHVtZVRleHR1cmUpIFBVUkU7DQorICAgIFNURE1FVEhPRChDcmVhdGVDdWJlVGV4dHVyZSkoVEhJU18gVUlOVCBFZGdlTGVuZ3RoLFVJTlQgTGV2ZWxzLERXT1JEIFVzYWdlLEQzREZPUk1BVCBGb3JtYXQsRDNEUE9PTCBQb29sLElEaXJlY3QzREN1YmVUZXh0dXJlOCoqIHBwQ3ViZVRleHR1cmUpIFBVUkU7DQorICAgIFNURE1FVEhPRChDcmVhdGVWZXJ0ZXhCdWZmZXIpKFRISVNfIFVJTlQgTGVuZ3RoLERXT1JEIFVzYWdlLERXT1JEIEZWRixEM0RQT09MIFBvb2wsSURpcmVjdDNEVmVydGV4QnVmZmVyOCoqIHBwVmVydGV4QnVmZmVyKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoQ3JlYXRlSW5kZXhCdWZmZXIpKFRISVNfIFVJTlQgTGVuZ3RoLERXT1JEIFVzYWdlLEQzREZPUk1BVCBGb3JtYXQsRDNEUE9PTCBQb29sLElEaXJlY3QzREluZGV4QnVmZmVyOCoqIHBwSW5kZXhCdWZmZXIpIFBVUkU7DQorICAgIFNURE1FVEhPRChDcmVhdGVSZW5kZXJUYXJnZXQpKFRISVNfIFVJTlQgV2lkdGgsVUlOVCBIZWlnaHQsRDNERk9STUFUIEZvcm1hdCxEM0RNVUxUSVNBTVBMRV9UWVBFIE11bHRpU2FtcGxlLEJPT0wgTG9ja2FibGUsSURpcmVjdDNEU3VyZmFjZTgqKiBwcFN1cmZhY2UpIFBVUkU7DQorICAgIFNURE1FVEhPRChDcmVhdGVEZXB0aFN0ZW5jaWxTdXJmYWNlKShUSElTXyBVSU5UIFdpZHRoLFVJTlQgSGVpZ2h0LEQzREZPUk1BVCBGb3JtYXQsRDNETVVMVElTQU1QTEVfVFlQRSBNdWx0aVNhbXBsZSxJRGlyZWN0M0RTdXJmYWNlOCoqIHBwU3VyZmFjZSkgUFVSRTsNCisgICAgU1RETUVUSE9EKENyZWF0ZUltYWdlU3VyZmFjZSkoVEhJU18gVUlOVCBXaWR0aCxVSU5UIEhlaWdodCxEM0RGT1JNQVQgRm9ybWF0LElEaXJlY3QzRFN1cmZhY2U4KiogcHBTdXJmYWNlKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoQ29weVJlY3RzKShUSElTXyBJRGlyZWN0M0RTdXJmYWNlOCogcFNvdXJjZVN1cmZhY2UsQ09OU1QgUkVDVCogcFNvdXJjZVJlY3RzQXJyYXksVUlOVCBjUmVjdHMsSURpcmVjdDNEU3VyZmFjZTgqIHBEZXN0aW5hdGlvblN1cmZhY2UsQ09OU1QgUE9JTlQqIHBEZXN0UG9pbnRzQXJyYXkpIFBVUkU7DQorICAgIFNURE1FVEhPRChVcGRhdGVUZXh0dXJlKShUSElTXyBJRGlyZWN0M0RCYXNlVGV4dHVyZTgqIHBTb3VyY2VUZXh0dXJlLElEaXJlY3QzREJhc2VUZXh0dXJlOCogcERlc3RpbmF0aW9uVGV4dHVyZSkgUFVSRTsNCisgICAgU1RETUVUSE9EKEdldEZyb250QnVmZmVyKShUSElTXyBJRGlyZWN0M0RTdXJmYWNlOCogcERlc3RTdXJmYWNlKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoU2V0UmVuZGVyVGFyZ2V0KShUSElTXyBJRGlyZWN0M0RTdXJmYWNlOCogcFJlbmRlclRhcmdldCxJRGlyZWN0M0RTdXJmYWNlOCogcE5ld1pTdGVuY2lsKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoR2V0UmVuZGVyVGFyZ2V0KShUSElTXyBJRGlyZWN0M0RTdXJmYWNlOCoqIHBwUmVuZGVyVGFyZ2V0KSBQVVJFOw0KKyAgICBTVERNRVRIT0QoR2V0RGVwdGhTdGVuY2lsU3VyZmFjZSkoVEhJU18gSURpcmVjdDNEU3VyZmFjZTgqKiBwcFpTdGVuY2lsU3VyZmFjZSkgUFVSRTsNCisgICAgU1RETUVUSE9EKEJlZ2luU2NlbmUpKFRISVMpIFBVUkU7DQorICAgIFNURE1FVEhPRChFbmRTY2VuZSkoVEhJUykgUFVSRTsNCisgICAgU1RETUVUSE9EKENsZWFyKShUSElTXyBEV09SRCBDb3VudCxDT05TVCBEM0RSRUNUKiBwUmVjdHMsRFdPUkQgRmxhZ3MsRDNEQ09MT1IgQ29sb3IsZmxvYXQgWixEV09SRCBTdGVuY2lsKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoU2V0VHJhbnNmb3JtKShUSElTXyBEM0RUUkFOU0ZPUk1TVEFURVRZUEUgU3RhdGUsQ09OU1QgRDNETUFUUklYKiBwTWF0cml4KSBQVVJFOw0KKyAgICBTVERNRVRIT0QoR2V0VHJhbnNmb3JtKShUSElTXyBEM0RUUkFOU0ZPUk1TVEFURVRZUEUgU3RhdGUsRDNETUFUUklYKiBwTWF0cml4KSBQVVJFOw0KKyAgICBTVERNRVRIT0QoTXVsdGlwbHlUcmFuc2Zvcm0pKFRISVNfIEQzRFRSQU5TRk9STVNUQVRFVFlQRSxDT05TVCBEM0RNQVRSSVgqKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoU2V0Vmlld3BvcnQpKFRISVNfIENPTlNUIEQzRFZJRVdQT1JUOCogcFZpZXdwb3J0KSBQVVJFOw0KKyAgICBTVERNRVRIT0QoR2V0Vmlld3BvcnQpKFRISVNfIEQzRFZJRVdQT1JUOCogcFZpZXdwb3J0KSBQVVJFOw0KKyAgICBTVERNRVRIT0QoU2V0TWF0ZXJpYWwpKFRISVNfIENPTlNUIEQzRE1BVEVSSUFMOCogcE1hdGVyaWFsKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoR2V0TWF0ZXJpYWwpKFRISVNfIEQzRE1BVEVSSUFMOCogcE1hdGVyaWFsKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoU2V0TGlnaHQpKFRISVNfIERXT1JEIEluZGV4LENPTlNUIEQzRExJR0hUOCopIFBVUkU7DQorICAgIFNURE1FVEhPRChHZXRMaWdodCkoVEhJU18gRFdPUkQgSW5kZXgsRDNETElHSFQ4KikgUFVSRTsNCisgICAgU1RETUVUSE9EKExpZ2h0RW5hYmxlKShUSElTXyBEV09SRCBJbmRleCxCT09MIEVuYWJsZSkgUFVSRTsNCisgICAgU1RETUVUSE9EKEdldExpZ2h0RW5hYmxlKShUSElTXyBEV09SRCBJbmRleCxCT09MKiBwRW5hYmxlKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoU2V0Q2xpcFBsYW5lKShUSElTXyBEV09SRCBJbmRleCxDT05TVCBmbG9hdCogcFBsYW5lKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoR2V0Q2xpcFBsYW5lKShUSElTXyBEV09SRCBJbmRleCxmbG9hdCogcFBsYW5lKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoU2V0UmVuZGVyU3RhdGUpKFRISVNfIEQzRFJFTkRFUlNUQVRFVFlQRSBTdGF0ZSxEV09SRCBWYWx1ZSkgUFVSRTsNCisgICAgU1RETUVUSE9EKEdldFJlbmRlclN0YXRlKShUSElTXyBEM0RSRU5ERVJTVEFURVRZUEUgU3RhdGUsRFdPUkQqIHBWYWx1ZSkgUFVSRTsNCisgICAgU1RETUVUSE9EKEJlZ2luU3RhdGVCbG9jaykoVEhJUykgUFVSRTsNCisgICAgU1RETUVUSE9EKEVuZFN0YXRlQmxvY2spKFRISVNfIERXT1JEKiBwVG9rZW4pIFBVUkU7DQorICAgIFNURE1FVEhPRChBcHBseVN0YXRlQmxvY2spKFRISVNfIERXT1JEIFRva2VuKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoQ2FwdHVyZVN0YXRlQmxvY2spKFRISVNfIERXT1JEIFRva2VuKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoRGVsZXRlU3RhdGVCbG9jaykoVEhJU18gRFdPUkQgVG9rZW4pIFBVUkU7DQorICAgIFNURE1FVEhPRChDcmVhdGVTdGF0ZUJsb2NrKShUSElTXyBEM0RTVEFURUJMT0NLVFlQRSBUeXBlLERXT1JEKiBwVG9rZW4pIFBVUkU7DQorICAgIFNURE1FVEhPRChTZXRDbGlwU3RhdHVzKShUSElTXyBDT05TVCBEM0RDTElQU1RBVFVTOCogcENsaXBTdGF0dXMpIFBVUkU7DQorICAgIFNURE1FVEhPRChHZXRDbGlwU3RhdHVzKShUSElTXyBEM0RDTElQU1RBVFVTOCogcENsaXBTdGF0dXMpIFBVUkU7DQorICAgIFNURE1FVEhPRChHZXRUZXh0dXJlKShUSElTXyBEV09SRCBTdGFnZSxJRGlyZWN0M0RCYXNlVGV4dHVyZTgqKiBwcFRleHR1cmUpIFBVUkU7DQorICAgIFNURE1FVEhPRChTZXRUZXh0dXJlKShUSElTXyBEV09SRCBTdGFnZSxJRGlyZWN0M0RCYXNlVGV4dHVyZTgqIHBUZXh0dXJlKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoR2V0VGV4dHVyZVN0YWdlU3RhdGUpKFRISVNfIERXT1JEIFN0YWdlLEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSBUeXBlLERXT1JEKiBwVmFsdWUpIFBVUkU7DQorICAgIFNURE1FVEhPRChTZXRUZXh0dXJlU3RhZ2VTdGF0ZSkoVEhJU18gRFdPUkQgU3RhZ2UsRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFIFR5cGUsRFdPUkQgVmFsdWUpIFBVUkU7DQorICAgIFNURE1FVEhPRChWYWxpZGF0ZURldmljZSkoVEhJU18gRFdPUkQqIHBOdW1QYXNzZXMpIFBVUkU7DQorICAgIFNURE1FVEhPRChHZXRJbmZvKShUSElTXyBEV09SRCBEZXZJbmZvSUQsdm9pZCogcERldkluZm9TdHJ1Y3QsRFdPUkQgRGV2SW5mb1N0cnVjdFNpemUpIFBVUkU7DQorICAgIFNURE1FVEhPRChTZXRQYWxldHRlRW50cmllcykoVEhJU18gVUlOVCBQYWxldHRlTnVtYmVyLENPTlNUIFBBTEVUVEVFTlRSWSogcEVudHJpZXMpIFBVUkU7DQorICAgIFNURE1FVEhPRChHZXRQYWxldHRlRW50cmllcykoVEhJU18gVUlOVCBQYWxldHRlTnVtYmVyLFBBTEVUVEVFTlRSWSogcEVudHJpZXMpIFBVUkU7DQorICAgIFNURE1FVEhPRChTZXRDdXJyZW50VGV4dHVyZVBhbGV0dGUpKFRISVNfIFVJTlQgUGFsZXR0ZU51bWJlcikgUFVSRTsNCisgICAgU1RETUVUSE9EKEdldEN1cnJlbnRUZXh0dXJlUGFsZXR0ZSkoVEhJU18gVUlOVCAqUGFsZXR0ZU51bWJlcikgUFVSRTsNCisgICAgU1RETUVUSE9EKERyYXdQcmltaXRpdmUpKFRISVNfIEQzRFBSSU1JVElWRVRZUEUgUHJpbWl0aXZlVHlwZSxVSU5UIFN0YXJ0VmVydGV4LFVJTlQgUHJpbWl0aXZlQ291bnQpIFBVUkU7DQorICAgIFNURE1FVEhPRChEcmF3SW5kZXhlZFByaW1pdGl2ZSkoVEhJU18gRDNEUFJJTUlUSVZFVFlQRSxVSU5UIG1pbkluZGV4LFVJTlQgTnVtVmVydGljZXMsVUlOVCBzdGFydEluZGV4LFVJTlQgcHJpbUNvdW50KSBQVVJFOw0KKyAgICBTVERNRVRIT0QoRHJhd1ByaW1pdGl2ZVVQKShUSElTXyBEM0RQUklNSVRJVkVUWVBFIFByaW1pdGl2ZVR5cGUsVUlOVCBQcmltaXRpdmVDb3VudCxDT05TVCB2b2lkKiBwVmVydGV4U3RyZWFtWmVyb0RhdGEsVUlOVCBWZXJ0ZXhTdHJlYW1aZXJvU3RyaWRlKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoRHJhd0luZGV4ZWRQcmltaXRpdmVVUCkoVEhJU18gRDNEUFJJTUlUSVZFVFlQRSBQcmltaXRpdmVUeXBlLFVJTlQgTWluVmVydGV4SW5kZXgsVUlOVCBOdW1WZXJ0ZXhJbmRpY2VzLFVJTlQgUHJpbWl0aXZlQ291bnQsQ09OU1Qgdm9pZCogcEluZGV4RGF0YSxEM0RGT1JNQVQgSW5kZXhEYXRhRm9ybWF0LENPTlNUIHZvaWQqIHBWZXJ0ZXhTdHJlYW1aZXJvRGF0YSxVSU5UIFZlcnRleFN0cmVhbVplcm9TdHJpZGUpIFBVUkU7DQorICAgIFNURE1FVEhPRChQcm9jZXNzVmVydGljZXMpKFRISVNfIFVJTlQgU3JjU3RhcnRJbmRleCxVSU5UIERlc3RJbmRleCxVSU5UIFZlcnRleENvdW50LElEaXJlY3QzRFZlcnRleEJ1ZmZlcjgqIHBEZXN0QnVmZmVyLERXT1JEIEZsYWdzKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoQ3JlYXRlVmVydGV4U2hhZGVyKShUSElTXyBDT05TVCBEV09SRCogcERlY2xhcmF0aW9uLENPTlNUIERXT1JEKiBwRnVuY3Rpb24sRFdPUkQqIHBIYW5kbGUsRFdPUkQgVXNhZ2UpIFBVUkU7DQorICAgIFNURE1FVEhPRChTZXRWZXJ0ZXhTaGFkZXIpKFRISVNfIERXT1JEIEhhbmRsZSkgUFVSRTsNCisgICAgU1RETUVUSE9EKEdldFZlcnRleFNoYWRlcikoVEhJU18gRFdPUkQqIHBIYW5kbGUpIFBVUkU7DQorICAgIFNURE1FVEhPRChEZWxldGVWZXJ0ZXhTaGFkZXIpKFRISVNfIERXT1JEIEhhbmRsZSkgUFVSRTsNCisgICAgU1RETUVUSE9EKFNldFZlcnRleFNoYWRlckNvbnN0YW50KShUSElTXyBEV09SRCBSZWdpc3RlcixDT05TVCB2b2lkKiBwQ29uc3RhbnREYXRhLERXT1JEIENvbnN0YW50Q291bnQpIFBVUkU7DQorICAgIFNURE1FVEhPRChHZXRWZXJ0ZXhTaGFkZXJDb25zdGFudCkoVEhJU18gRFdPUkQgUmVnaXN0ZXIsdm9pZCogcENvbnN0YW50RGF0YSxEV09SRCBDb25zdGFudENvdW50KSBQVVJFOw0KKyAgICBTVERNRVRIT0QoR2V0VmVydGV4U2hhZGVyRGVjbGFyYXRpb24pKFRISVNfIERXT1JEIEhhbmRsZSx2b2lkKiBwRGF0YSxEV09SRCogcFNpemVPZkRhdGEpIFBVUkU7DQorICAgIFNURE1FVEhPRChHZXRWZXJ0ZXhTaGFkZXJGdW5jdGlvbikoVEhJU18gRFdPUkQgSGFuZGxlLHZvaWQqIHBEYXRhLERXT1JEKiBwU2l6ZU9mRGF0YSkgUFVSRTsNCisgICAgU1RETUVUSE9EKFNldFN0cmVhbVNvdXJjZSkoVEhJU18gVUlOVCBTdHJlYW1OdW1iZXIsSURpcmVjdDNEVmVydGV4QnVmZmVyOCogcFN0cmVhbURhdGEsVUlOVCBTdHJpZGUpIFBVUkU7DQorICAgIFNURE1FVEhPRChHZXRTdHJlYW1Tb3VyY2UpKFRISVNfIFVJTlQgU3RyZWFtTnVtYmVyLElEaXJlY3QzRFZlcnRleEJ1ZmZlcjgqKiBwcFN0cmVhbURhdGEsVUlOVCogcFN0cmlkZSkgUFVSRTsNCisgICAgU1RETUVUSE9EKFNldEluZGljZXMpKFRISVNfIElEaXJlY3QzREluZGV4QnVmZmVyOCogcEluZGV4RGF0YSxVSU5UIEJhc2VWZXJ0ZXhJbmRleCkgUFVSRTsNCisgICAgU1RETUVUSE9EKEdldEluZGljZXMpKFRISVNfIElEaXJlY3QzREluZGV4QnVmZmVyOCoqIHBwSW5kZXhEYXRhLFVJTlQqIHBCYXNlVmVydGV4SW5kZXgpIFBVUkU7DQorICAgIFNURE1FVEhPRChDcmVhdGVQaXhlbFNoYWRlcikoVEhJU18gQ09OU1QgRFdPUkQqIHBGdW5jdGlvbixEV09SRCogcEhhbmRsZSkgUFVSRTsNCisgICAgU1RETUVUSE9EKFNldFBpeGVsU2hhZGVyKShUSElTXyBEV09SRCBIYW5kbGUpIFBVUkU7DQorICAgIFNURE1FVEhPRChHZXRQaXhlbFNoYWRlcikoVEhJU18gRFdPUkQqIHBIYW5kbGUpIFBVUkU7DQorICAgIFNURE1FVEhPRChEZWxldGVQaXhlbFNoYWRlcikoVEhJU18gRFdPUkQgSGFuZGxlKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoU2V0UGl4ZWxTaGFkZXJDb25zdGFudCkoVEhJU18gRFdPUkQgUmVnaXN0ZXIsQ09OU1Qgdm9pZCogcENvbnN0YW50RGF0YSxEV09SRCBDb25zdGFudENvdW50KSBQVVJFOw0KKyAgICBTVERNRVRIT0QoR2V0UGl4ZWxTaGFkZXJDb25zdGFudCkoVEhJU18gRFdPUkQgUmVnaXN0ZXIsdm9pZCogcENvbnN0YW50RGF0YSxEV09SRCBDb25zdGFudENvdW50KSBQVVJFOw0KKyAgICBTVERNRVRIT0QoR2V0UGl4ZWxTaGFkZXJGdW5jdGlvbikoVEhJU18gRFdPUkQgSGFuZGxlLHZvaWQqIHBEYXRhLERXT1JEKiBwU2l6ZU9mRGF0YSkgUFVSRTsNCisgICAgU1RETUVUSE9EKERyYXdSZWN0UGF0Y2gpKFRISVNfIFVJTlQgSGFuZGxlLENPTlNUIGZsb2F0KiBwTnVtU2VncyxDT05TVCBEM0RSRUNUUEFUQ0hfSU5GTyogcFJlY3RQYXRjaEluZm8pIFBVUkU7DQorICAgIFNURE1FVEhPRChEcmF3VHJpUGF0Y2gpKFRISVNfIFVJTlQgSGFuZGxlLENPTlNUIGZsb2F0KiBwTnVtU2VncyxDT05TVCBEM0RUUklQQVRDSF9JTkZPKiBwVHJpUGF0Y2hJbmZvKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoRGVsZXRlUGF0Y2gpKFRISVNfIFVJTlQgSGFuZGxlKSBQVVJFOw0KK307DQorDQordHlwZWRlZiBzdHJ1Y3QgSURpcmVjdDNERGV2aWNlOCAqTFBESVJFQ1QzRERFVklDRTgsICpQRElSRUNUM0RERVZJQ0U4Ow0KKw0KKyNpZiAhZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChDSU5URVJGQUNFKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHAsYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9BZGRSZWYocCkgKHApLT5scFZ0YmwtPkFkZFJlZihwKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9SZWxlYXNlKHApIChwKS0+bHBWdGJsLT5SZWxlYXNlKHApDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1Rlc3RDb29wZXJhdGl2ZUxldmVsKHApIChwKS0+bHBWdGJsLT5UZXN0Q29vcGVyYXRpdmVMZXZlbChwKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRBdmFpbGFibGVUZXh0dXJlTWVtKHApIChwKS0+bHBWdGJsLT5HZXRBdmFpbGFibGVUZXh0dXJlTWVtKHApDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1Jlc291cmNlTWFuYWdlckRpc2NhcmRCeXRlcyhwLGEpIChwKS0+bHBWdGJsLT5SZXNvdXJjZU1hbmFnZXJEaXNjYXJkQnl0ZXMocCxhKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXREaXJlY3QzRChwLGEpIChwKS0+bHBWdGJsLT5HZXREaXJlY3QzRChwLGEpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldERldmljZUNhcHMocCxhKSAocCktPmxwVnRibC0+R2V0RGV2aWNlQ2FwcyhwLGEpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldERpc3BsYXlNb2RlKHAsYSkgKHApLT5scFZ0YmwtPkdldERpc3BsYXlNb2RlKHAsYSkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0Q3JlYXRpb25QYXJhbWV0ZXJzKHAsYSkgKHApLT5scFZ0YmwtPkdldENyZWF0aW9uUGFyYW1ldGVycyhwLGEpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1NldEN1cnNvclByb3BlcnRpZXMocCxhLGIsYykgKHApLT5scFZ0YmwtPlNldEN1cnNvclByb3BlcnRpZXMocCxhLGIsYykNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfU2V0Q3Vyc29yUG9zaXRpb24ocCxhLGIsYykgKHApLT5scFZ0YmwtPlNldEN1cnNvclBvc2l0aW9uKHAsYSxiLGMpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1Nob3dDdXJzb3IocCxhKSAocCktPmxwVnRibC0+U2hvd0N1cnNvcihwLGEpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0NyZWF0ZUFkZGl0aW9uYWxTd2FwQ2hhaW4ocCxhLGIpIChwKS0+bHBWdGJsLT5DcmVhdGVBZGRpdGlvbmFsU3dhcENoYWluKHAsYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9SZXNldChwLGEpIChwKS0+bHBWdGJsLT5SZXNldChwLGEpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1ByZXNlbnQocCxhLGIsYyxkKSAocCktPmxwVnRibC0+UHJlc2VudChwLGEsYixjLGQpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldEJhY2tCdWZmZXIocCxhLGIsYykgKHApLT5scFZ0YmwtPkdldEJhY2tCdWZmZXIocCxhLGIsYykNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0UmFzdGVyU3RhdHVzKHAsYSkgKHApLT5scFZ0YmwtPkdldFJhc3RlclN0YXR1cyhwLGEpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1NldEdhbW1hUmFtcChwLGEsYikgKHApLT5scFZ0YmwtPlNldEdhbW1hUmFtcChwLGEsYikNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0R2FtbWFSYW1wKHAsYSkgKHApLT5scFZ0YmwtPkdldEdhbW1hUmFtcChwLGEpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0NyZWF0ZVRleHR1cmUocCxhLGIsYyxkLGUsZixnKSAocCktPmxwVnRibC0+Q3JlYXRlVGV4dHVyZShwLGEsYixjLGQsZSxmLGcpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0NyZWF0ZVZvbHVtZVRleHR1cmUocCxhLGIsYyxkLGUsZixnLGgpIChwKS0+bHBWdGJsLT5DcmVhdGVWb2x1bWVUZXh0dXJlKHAsYSxiLGMsZCxlLGYsZyxoKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9DcmVhdGVDdWJlVGV4dHVyZShwLGEsYixjLGQsZSxmKSAocCktPmxwVnRibC0+Q3JlYXRlQ3ViZVRleHR1cmUocCxhLGIsYyxkLGUsZikNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfQ3JlYXRlVmVydGV4QnVmZmVyKHAsYSxiLGMsZCxlKSAocCktPmxwVnRibC0+Q3JlYXRlVmVydGV4QnVmZmVyKHAsYSxiLGMsZCxlKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9DcmVhdGVJbmRleEJ1ZmZlcihwLGEsYixjLGQsZSkgKHApLT5scFZ0YmwtPkNyZWF0ZUluZGV4QnVmZmVyKHAsYSxiLGMsZCxlKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9DcmVhdGVSZW5kZXJUYXJnZXQocCxhLGIsYyxkLGUsZikgKHApLT5scFZ0YmwtPkNyZWF0ZVJlbmRlclRhcmdldChwLGEsYixjLGQsZSxmKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9DcmVhdGVEZXB0aFN0ZW5jaWxTdXJmYWNlKHAsYSxiLGMsZCxlKSAocCktPmxwVnRibC0+Q3JlYXRlRGVwdGhTdGVuY2lsU3VyZmFjZShwLGEsYixjLGQsZSkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfQ3JlYXRlSW1hZ2VTdXJmYWNlKHAsYSxiLGMsZCkgKHApLT5scFZ0YmwtPkNyZWF0ZUltYWdlU3VyZmFjZShwLGEsYixjLGQpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0NvcHlSZWN0cyhwLGEsYixjLGQsZSkgKHApLT5scFZ0YmwtPkNvcHlSZWN0cyhwLGEsYixjLGQsZSkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfVXBkYXRlVGV4dHVyZShwLGEsYikgKHApLT5scFZ0YmwtPlVwZGF0ZVRleHR1cmUocCxhLGIpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldEZyb250QnVmZmVyKHAsYSkgKHApLT5scFZ0YmwtPkdldEZyb250QnVmZmVyKHAsYSkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfU2V0UmVuZGVyVGFyZ2V0KHAsYSxiKSAocCktPmxwVnRibC0+U2V0UmVuZGVyVGFyZ2V0KHAsYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRSZW5kZXJUYXJnZXQocCxhKSAocCktPmxwVnRibC0+R2V0UmVuZGVyVGFyZ2V0KHAsYSkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0RGVwdGhTdGVuY2lsU3VyZmFjZShwLGEpIChwKS0+bHBWdGJsLT5HZXREZXB0aFN0ZW5jaWxTdXJmYWNlKHAsYSkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfQmVnaW5TY2VuZShwKSAocCktPmxwVnRibC0+QmVnaW5TY2VuZShwKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9FbmRTY2VuZShwKSAocCktPmxwVnRibC0+RW5kU2NlbmUocCkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfQ2xlYXIocCxhLGIsYyxkLGUsZikgKHApLT5scFZ0YmwtPkNsZWFyKHAsYSxiLGMsZCxlLGYpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1NldFRyYW5zZm9ybShwLGEsYikgKHApLT5scFZ0YmwtPlNldFRyYW5zZm9ybShwLGEsYikNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0VHJhbnNmb3JtKHAsYSxiKSAocCktPmxwVnRibC0+R2V0VHJhbnNmb3JtKHAsYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9NdWx0aXBseVRyYW5zZm9ybShwLGEsYikgKHApLT5scFZ0YmwtPk11bHRpcGx5VHJhbnNmb3JtKHAsYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRWaWV3cG9ydChwLGEpIChwKS0+bHBWdGJsLT5TZXRWaWV3cG9ydChwLGEpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldFZpZXdwb3J0KHAsYSkgKHApLT5scFZ0YmwtPkdldFZpZXdwb3J0KHAsYSkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfU2V0TWF0ZXJpYWwocCxhKSAocCktPmxwVnRibC0+U2V0TWF0ZXJpYWwocCxhKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRNYXRlcmlhbChwLGEpIChwKS0+bHBWdGJsLT5HZXRNYXRlcmlhbChwLGEpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1NldExpZ2h0KHAsYSxiKSAocCktPmxwVnRibC0+U2V0TGlnaHQocCxhLGIpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldExpZ2h0KHAsYSxiKSAocCktPmxwVnRibC0+R2V0TGlnaHQocCxhLGIpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0xpZ2h0RW5hYmxlKHAsYSxiKSAocCktPmxwVnRibC0+TGlnaHRFbmFibGUocCxhLGIpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldExpZ2h0RW5hYmxlKHAsYSxiKSAocCktPmxwVnRibC0+R2V0TGlnaHRFbmFibGUocCxhLGIpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1NldENsaXBQbGFuZShwLGEsYikgKHApLT5scFZ0YmwtPlNldENsaXBQbGFuZShwLGEsYikNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0Q2xpcFBsYW5lKHAsYSxiKSAocCktPmxwVnRibC0+R2V0Q2xpcFBsYW5lKHAsYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRSZW5kZXJTdGF0ZShwLGEsYikgKHApLT5scFZ0YmwtPlNldFJlbmRlclN0YXRlKHAsYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRSZW5kZXJTdGF0ZShwLGEsYikgKHApLT5scFZ0YmwtPkdldFJlbmRlclN0YXRlKHAsYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9CZWdpblN0YXRlQmxvY2socCkgKHApLT5scFZ0YmwtPkJlZ2luU3RhdGVCbG9jayhwKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9FbmRTdGF0ZUJsb2NrKHAsYSkgKHApLT5scFZ0YmwtPkVuZFN0YXRlQmxvY2socCxhKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9BcHBseVN0YXRlQmxvY2socCxhKSAocCktPmxwVnRibC0+QXBwbHlTdGF0ZUJsb2NrKHAsYSkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfQ2FwdHVyZVN0YXRlQmxvY2socCxhKSAocCktPmxwVnRibC0+Q2FwdHVyZVN0YXRlQmxvY2socCxhKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9EZWxldGVTdGF0ZUJsb2NrKHAsYSkgKHApLT5scFZ0YmwtPkRlbGV0ZVN0YXRlQmxvY2socCxhKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9DcmVhdGVTdGF0ZUJsb2NrKHAsYSxiKSAocCktPmxwVnRibC0+Q3JlYXRlU3RhdGVCbG9jayhwLGEsYikNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfU2V0Q2xpcFN0YXR1cyhwLGEpIChwKS0+bHBWdGJsLT5TZXRDbGlwU3RhdHVzKHAsYSkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0Q2xpcFN0YXR1cyhwLGEpIChwKS0+bHBWdGJsLT5HZXRDbGlwU3RhdHVzKHAsYSkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0VGV4dHVyZShwLGEsYikgKHApLT5scFZ0YmwtPkdldFRleHR1cmUocCxhLGIpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1NldFRleHR1cmUocCxhLGIpIChwKS0+bHBWdGJsLT5TZXRUZXh0dXJlKHAsYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRUZXh0dXJlU3RhZ2VTdGF0ZShwLGEsYixjKSAocCktPmxwVnRibC0+R2V0VGV4dHVyZVN0YWdlU3RhdGUocCxhLGIsYykNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfU2V0VGV4dHVyZVN0YWdlU3RhdGUocCxhLGIsYykgKHApLT5scFZ0YmwtPlNldFRleHR1cmVTdGFnZVN0YXRlKHAsYSxiLGMpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1ZhbGlkYXRlRGV2aWNlKHAsYSkgKHApLT5scFZ0YmwtPlZhbGlkYXRlRGV2aWNlKHAsYSkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0SW5mbyhwLGEsYixjKSAocCktPmxwVnRibC0+R2V0SW5mbyhwLGEsYixjKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRQYWxldHRlRW50cmllcyhwLGEsYikgKHApLT5scFZ0YmwtPlNldFBhbGV0dGVFbnRyaWVzKHAsYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRQYWxldHRlRW50cmllcyhwLGEsYikgKHApLT5scFZ0YmwtPkdldFBhbGV0dGVFbnRyaWVzKHAsYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRDdXJyZW50VGV4dHVyZVBhbGV0dGUocCxhKSAocCktPmxwVnRibC0+U2V0Q3VycmVudFRleHR1cmVQYWxldHRlKHAsYSkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0Q3VycmVudFRleHR1cmVQYWxldHRlKHAsYSkgKHApLT5scFZ0YmwtPkdldEN1cnJlbnRUZXh0dXJlUGFsZXR0ZShwLGEpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0RyYXdQcmltaXRpdmUocCxhLGIsYykgKHApLT5scFZ0YmwtPkRyYXdQcmltaXRpdmUocCxhLGIsYykNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfRHJhd0luZGV4ZWRQcmltaXRpdmUocCxhLGIsYyxkLGUpIChwKS0+bHBWdGJsLT5EcmF3SW5kZXhlZFByaW1pdGl2ZShwLGEsYixjLGQsZSkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfRHJhd1ByaW1pdGl2ZVVQKHAsYSxiLGMsZCkgKHApLT5scFZ0YmwtPkRyYXdQcmltaXRpdmVVUChwLGEsYixjLGQpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0RyYXdJbmRleGVkUHJpbWl0aXZlVVAocCxhLGIsYyxkLGUsZixnLGgpIChwKS0+bHBWdGJsLT5EcmF3SW5kZXhlZFByaW1pdGl2ZVVQKHAsYSxiLGMsZCxlLGYsZyxoKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9Qcm9jZXNzVmVydGljZXMocCxhLGIsYyxkLGUpIChwKS0+bHBWdGJsLT5Qcm9jZXNzVmVydGljZXMocCxhLGIsYyxkLGUpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0NyZWF0ZVZlcnRleFNoYWRlcihwLGEsYixjLGQpIChwKS0+bHBWdGJsLT5DcmVhdGVWZXJ0ZXhTaGFkZXIocCxhLGIsYyxkKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRWZXJ0ZXhTaGFkZXIocCxhKSAocCktPmxwVnRibC0+U2V0VmVydGV4U2hhZGVyKHAsYSkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0VmVydGV4U2hhZGVyKHAsYSkgKHApLT5scFZ0YmwtPkdldFZlcnRleFNoYWRlcihwLGEpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0RlbGV0ZVZlcnRleFNoYWRlcihwLGEpIChwKS0+bHBWdGJsLT5EZWxldGVWZXJ0ZXhTaGFkZXIocCxhKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRWZXJ0ZXhTaGFkZXJDb25zdGFudChwLGEsYixjKSAocCktPmxwVnRibC0+U2V0VmVydGV4U2hhZGVyQ29uc3RhbnQocCxhLGIsYykNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0VmVydGV4U2hhZGVyQ29uc3RhbnQocCxhLGIsYykgKHApLT5scFZ0YmwtPkdldFZlcnRleFNoYWRlckNvbnN0YW50KHAsYSxiLGMpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldFZlcnRleFNoYWRlckRlY2xhcmF0aW9uKHAsYSxiLGMpIChwKS0+bHBWdGJsLT5HZXRWZXJ0ZXhTaGFkZXJEZWNsYXJhdGlvbihwLGEsYixjKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRWZXJ0ZXhTaGFkZXJGdW5jdGlvbihwLGEsYixjKSAocCktPmxwVnRibC0+R2V0VmVydGV4U2hhZGVyRnVuY3Rpb24ocCxhLGIsYykNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfU2V0U3RyZWFtU291cmNlKHAsYSxiLGMpIChwKS0+bHBWdGJsLT5TZXRTdHJlYW1Tb3VyY2UocCxhLGIsYykNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0U3RyZWFtU291cmNlKHAsYSxiLGMpIChwKS0+bHBWdGJsLT5HZXRTdHJlYW1Tb3VyY2UocCxhLGIsYykNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfU2V0SW5kaWNlcyhwLGEsYikgKHApLT5scFZ0YmwtPlNldEluZGljZXMocCxhLGIpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldEluZGljZXMocCxhLGIpIChwKS0+bHBWdGJsLT5HZXRJbmRpY2VzKHAsYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9DcmVhdGVQaXhlbFNoYWRlcihwLGEsYikgKHApLT5scFZ0YmwtPkNyZWF0ZVBpeGVsU2hhZGVyKHAsYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRQaXhlbFNoYWRlcihwLGEpIChwKS0+bHBWdGJsLT5TZXRQaXhlbFNoYWRlcihwLGEpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldFBpeGVsU2hhZGVyKHAsYSkgKHApLT5scFZ0YmwtPkdldFBpeGVsU2hhZGVyKHAsYSkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfRGVsZXRlUGl4ZWxTaGFkZXIocCxhKSAocCktPmxwVnRibC0+RGVsZXRlUGl4ZWxTaGFkZXIocCxhKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRQaXhlbFNoYWRlckNvbnN0YW50KHAsYSxiLGMpIChwKS0+bHBWdGJsLT5TZXRQaXhlbFNoYWRlckNvbnN0YW50KHAsYSxiLGMpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldFBpeGVsU2hhZGVyQ29uc3RhbnQocCxhLGIsYykgKHApLT5scFZ0YmwtPkdldFBpeGVsU2hhZGVyQ29uc3RhbnQocCxhLGIsYykNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0UGl4ZWxTaGFkZXJGdW5jdGlvbihwLGEsYixjKSAocCktPmxwVnRibC0+R2V0UGl4ZWxTaGFkZXJGdW5jdGlvbihwLGEsYixjKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9EcmF3UmVjdFBhdGNoKHAsYSxiLGMpIChwKS0+bHBWdGJsLT5EcmF3UmVjdFBhdGNoKHAsYSxiLGMpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0RyYXdUcmlQYXRjaChwLGEsYixjKSAocCktPmxwVnRibC0+RHJhd1RyaVBhdGNoKHAsYSxiLGMpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0RlbGV0ZVBhdGNoKHAsYSkgKHApLT5scFZ0YmwtPkRlbGV0ZVBhdGNoKHAsYSkNCisjZWxzZQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5RdWVyeUludGVyZmFjZShhLGIpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0FkZFJlZihwKSAocCktPkFkZFJlZigpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1JlbGVhc2UocCkgKHApLT5SZWxlYXNlKCkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfVGVzdENvb3BlcmF0aXZlTGV2ZWwocCkgKHApLT5UZXN0Q29vcGVyYXRpdmVMZXZlbCgpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldEF2YWlsYWJsZVRleHR1cmVNZW0ocCkgKHApLT5HZXRBdmFpbGFibGVUZXh0dXJlTWVtKCkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfUmVzb3VyY2VNYW5hZ2VyRGlzY2FyZEJ5dGVzKHAsYSkgKHApLT5SZXNvdXJjZU1hbmFnZXJEaXNjYXJkQnl0ZXMoYSkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0RGlyZWN0M0QocCxhKSAocCktPkdldERpcmVjdDNEKGEpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldERldmljZUNhcHMocCxhKSAocCktPkdldERldmljZUNhcHMoYSkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0RGlzcGxheU1vZGUocCxhKSAocCktPkdldERpc3BsYXlNb2RlKGEpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldENyZWF0aW9uUGFyYW1ldGVycyhwLGEpIChwKS0+R2V0Q3JlYXRpb25QYXJhbWV0ZXJzKGEpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1NldEN1cnNvclByb3BlcnRpZXMocCxhLGIsYykgKHApLT5TZXRDdXJzb3JQcm9wZXJ0aWVzKGEsYixjKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRDdXJzb3JQb3NpdGlvbihwLGEsYixjKSAocCktPlNldEN1cnNvclBvc2l0aW9uKGEsYixjKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TaG93Q3Vyc29yKHAsYSkgKHApLT5TaG93Q3Vyc29yKGEpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0NyZWF0ZUFkZGl0aW9uYWxTd2FwQ2hhaW4ocCxhLGIpIChwKS0+Q3JlYXRlQWRkaXRpb25hbFN3YXBDaGFpbihhLGIpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1Jlc2V0KHAsYSkgKHApLT5SZXNldChhKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9QcmVzZW50KHAsYSxiLGMsZCkgKHApLT5QcmVzZW50KGEsYixjLGQpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldEJhY2tCdWZmZXIocCxhLGIsYykgKHApLT5HZXRCYWNrQnVmZmVyKGEsYixjKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRSYXN0ZXJTdGF0dXMocCxhKSAocCktPkdldFJhc3RlclN0YXR1cyhhKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRHYW1tYVJhbXAocCxhLGIpIChwKS0+U2V0R2FtbWFSYW1wKGEsYikNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0R2FtbWFSYW1wKHAsYSkgKHApLT5HZXRHYW1tYVJhbXAoYSkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfQ3JlYXRlVGV4dHVyZShwLGEsYixjLGQsZSxmLGcpIChwKS0+Q3JlYXRlVGV4dHVyZShhLGIsYyxkLGUsZixnKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9DcmVhdGVWb2x1bWVUZXh0dXJlKHAsYSxiLGMsZCxlLGYsZyxoKSAocCktPkNyZWF0ZVZvbHVtZVRleHR1cmUoYSxiLGMsZCxlLGYsZyxoKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9DcmVhdGVDdWJlVGV4dHVyZShwLGEsYixjLGQsZSxmKSAocCktPkNyZWF0ZUN1YmVUZXh0dXJlKGEsYixjLGQsZSxmKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9DcmVhdGVWZXJ0ZXhCdWZmZXIocCxhLGIsYyxkLGUpIChwKS0+Q3JlYXRlVmVydGV4QnVmZmVyKGEsYixjLGQsZSkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfQ3JlYXRlSW5kZXhCdWZmZXIocCxhLGIsYyxkLGUpIChwKS0+Q3JlYXRlSW5kZXhCdWZmZXIoYSxiLGMsZCxlKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9DcmVhdGVSZW5kZXJUYXJnZXQocCxhLGIsYyxkLGUsZikgKHApLT5DcmVhdGVSZW5kZXJUYXJnZXQoYSxiLGMsZCxlLGYpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0NyZWF0ZURlcHRoU3RlbmNpbFN1cmZhY2UocCxhLGIsYyxkLGUpIChwKS0+Q3JlYXRlRGVwdGhTdGVuY2lsU3VyZmFjZShhLGIsYyxkLGUpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0NyZWF0ZUltYWdlU3VyZmFjZShwLGEsYixjLGQpIChwKS0+Q3JlYXRlSW1hZ2VTdXJmYWNlKGEsYixjLGQpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0NvcHlSZWN0cyhwLGEsYixjLGQsZSkgKHApLT5Db3B5UmVjdHMoYSxiLGMsZCxlKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9VcGRhdGVUZXh0dXJlKHAsYSxiKSAocCktPlVwZGF0ZVRleHR1cmUoYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRGcm9udEJ1ZmZlcihwLGEpIChwKS0+R2V0RnJvbnRCdWZmZXIoYSkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfU2V0UmVuZGVyVGFyZ2V0KHAsYSxiKSAocCktPlNldFJlbmRlclRhcmdldChhLGIpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldFJlbmRlclRhcmdldChwLGEpIChwKS0+R2V0UmVuZGVyVGFyZ2V0KGEpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldERlcHRoU3RlbmNpbFN1cmZhY2UocCxhKSAocCktPkdldERlcHRoU3RlbmNpbFN1cmZhY2UoYSkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfQmVnaW5TY2VuZShwKSAocCktPkJlZ2luU2NlbmUoKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9FbmRTY2VuZShwKSAocCktPkVuZFNjZW5lKCkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfQ2xlYXIocCxhLGIsYyxkLGUsZikgKHApLT5DbGVhcihhLGIsYyxkLGUsZikNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfU2V0VHJhbnNmb3JtKHAsYSxiKSAocCktPlNldFRyYW5zZm9ybShhLGIpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldFRyYW5zZm9ybShwLGEsYikgKHApLT5HZXRUcmFuc2Zvcm0oYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9NdWx0aXBseVRyYW5zZm9ybShwLGEsYikgKHApLT5NdWx0aXBseVRyYW5zZm9ybShhLGIpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1NldFZpZXdwb3J0KHAsYSkgKHApLT5TZXRWaWV3cG9ydChhKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRWaWV3cG9ydChwLGEpIChwKS0+R2V0Vmlld3BvcnQoYSkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfU2V0TWF0ZXJpYWwocCxhKSAocCktPlNldE1hdGVyaWFsKGEpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldE1hdGVyaWFsKHAsYSkgKHApLT5HZXRNYXRlcmlhbChhKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRMaWdodChwLGEsYikgKHApLT5TZXRMaWdodChhLGIpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldExpZ2h0KHAsYSxiKSAocCktPkdldExpZ2h0KGEsYikNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfTGlnaHRFbmFibGUocCxhLGIpIChwKS0+TGlnaHRFbmFibGUoYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRMaWdodEVuYWJsZShwLGEsYikgKHApLT5HZXRMaWdodEVuYWJsZShhLGIpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1NldENsaXBQbGFuZShwLGEsYikgKHApLT5TZXRDbGlwUGxhbmUoYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRDbGlwUGxhbmUocCxhLGIpIChwKS0+R2V0Q2xpcFBsYW5lKGEsYikNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfU2V0UmVuZGVyU3RhdGUocCxhLGIpIChwKS0+U2V0UmVuZGVyU3RhdGUoYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRSZW5kZXJTdGF0ZShwLGEsYikgKHApLT5HZXRSZW5kZXJTdGF0ZShhLGIpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0JlZ2luU3RhdGVCbG9jayhwKSAocCktPkJlZ2luU3RhdGVCbG9jaygpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0VuZFN0YXRlQmxvY2socCxhKSAocCktPkVuZFN0YXRlQmxvY2soYSkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfQXBwbHlTdGF0ZUJsb2NrKHAsYSkgKHApLT5BcHBseVN0YXRlQmxvY2soYSkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfQ2FwdHVyZVN0YXRlQmxvY2socCxhKSAocCktPkNhcHR1cmVTdGF0ZUJsb2NrKGEpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0RlbGV0ZVN0YXRlQmxvY2socCxhKSAocCktPkRlbGV0ZVN0YXRlQmxvY2soYSkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfQ3JlYXRlU3RhdGVCbG9jayhwLGEsYikgKHApLT5DcmVhdGVTdGF0ZUJsb2NrKGEsYikNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfU2V0Q2xpcFN0YXR1cyhwLGEpIChwKS0+U2V0Q2xpcFN0YXR1cyhhKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRDbGlwU3RhdHVzKHAsYSkgKHApLT5HZXRDbGlwU3RhdHVzKGEpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldFRleHR1cmUocCxhLGIpIChwKS0+R2V0VGV4dHVyZShhLGIpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1NldFRleHR1cmUocCxhLGIpIChwKS0+U2V0VGV4dHVyZShhLGIpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldFRleHR1cmVTdGFnZVN0YXRlKHAsYSxiLGMpIChwKS0+R2V0VGV4dHVyZVN0YWdlU3RhdGUoYSxiLGMpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1NldFRleHR1cmVTdGFnZVN0YXRlKHAsYSxiLGMpIChwKS0+U2V0VGV4dHVyZVN0YWdlU3RhdGUoYSxiLGMpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1ZhbGlkYXRlRGV2aWNlKHAsYSkgKHApLT5WYWxpZGF0ZURldmljZShhKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRJbmZvKHAsYSxiLGMpIChwKS0+R2V0SW5mbyhhLGIsYykNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfU2V0UGFsZXR0ZUVudHJpZXMocCxhLGIpIChwKS0+U2V0UGFsZXR0ZUVudHJpZXMoYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRQYWxldHRlRW50cmllcyhwLGEsYikgKHApLT5HZXRQYWxldHRlRW50cmllcyhhLGIpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1NldEN1cnJlbnRUZXh0dXJlUGFsZXR0ZShwLGEpIChwKS0+U2V0Q3VycmVudFRleHR1cmVQYWxldHRlKGEpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldEN1cnJlbnRUZXh0dXJlUGFsZXR0ZShwLGEpIChwKS0+R2V0Q3VycmVudFRleHR1cmVQYWxldHRlKGEpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0RyYXdQcmltaXRpdmUocCxhLGIsYykgKHApLT5EcmF3UHJpbWl0aXZlKGEsYixjKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9EcmF3SW5kZXhlZFByaW1pdGl2ZShwLGEsYixjLGQsZSkgKHApLT5EcmF3SW5kZXhlZFByaW1pdGl2ZShhLGIsYyxkLGUpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0RyYXdQcmltaXRpdmVVUChwLGEsYixjLGQpIChwKS0+RHJhd1ByaW1pdGl2ZVVQKGEsYixjLGQpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0RyYXdJbmRleGVkUHJpbWl0aXZlVVAocCxhLGIsYyxkLGUsZixnLGgpIChwKS0+RHJhd0luZGV4ZWRQcmltaXRpdmVVUChhLGIsYyxkLGUsZixnLGgpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X1Byb2Nlc3NWZXJ0aWNlcyhwLGEsYixjLGQsZSkgKHApLT5Qcm9jZXNzVmVydGljZXMoYSxiLGMsZCxlKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9DcmVhdGVWZXJ0ZXhTaGFkZXIocCxhLGIsYyxkKSAocCktPkNyZWF0ZVZlcnRleFNoYWRlcihhLGIsYyxkKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRWZXJ0ZXhTaGFkZXIocCxhKSAocCktPlNldFZlcnRleFNoYWRlcihhKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRWZXJ0ZXhTaGFkZXIocCxhKSAocCktPkdldFZlcnRleFNoYWRlcihhKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9EZWxldGVWZXJ0ZXhTaGFkZXIocCxhKSAocCktPkRlbGV0ZVZlcnRleFNoYWRlcihhKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRWZXJ0ZXhTaGFkZXJDb25zdGFudChwLGEsYixjKSAocCktPlNldFZlcnRleFNoYWRlckNvbnN0YW50KGEsYixjKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRWZXJ0ZXhTaGFkZXJDb25zdGFudChwLGEsYixjKSAocCktPkdldFZlcnRleFNoYWRlckNvbnN0YW50KGEsYixjKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRWZXJ0ZXhTaGFkZXJEZWNsYXJhdGlvbihwLGEsYixjKSAocCktPkdldFZlcnRleFNoYWRlckRlY2xhcmF0aW9uKGEsYixjKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9HZXRWZXJ0ZXhTaGFkZXJGdW5jdGlvbihwLGEsYixjKSAocCktPkdldFZlcnRleFNoYWRlckZ1bmN0aW9uKGEsYixjKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRTdHJlYW1Tb3VyY2UocCxhLGIsYykgKHApLT5TZXRTdHJlYW1Tb3VyY2UoYSxiLGMpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldFN0cmVhbVNvdXJjZShwLGEsYixjKSAocCktPkdldFN0cmVhbVNvdXJjZShhLGIsYykNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfU2V0SW5kaWNlcyhwLGEsYikgKHApLT5TZXRJbmRpY2VzKGEsYikNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0SW5kaWNlcyhwLGEsYikgKHApLT5HZXRJbmRpY2VzKGEsYikNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfQ3JlYXRlUGl4ZWxTaGFkZXIocCxhLGIpIChwKS0+Q3JlYXRlUGl4ZWxTaGFkZXIoYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRQaXhlbFNoYWRlcihwLGEpIChwKS0+U2V0UGl4ZWxTaGFkZXIoYSkNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0UGl4ZWxTaGFkZXIocCxhKSAocCktPkdldFBpeGVsU2hhZGVyKGEpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0RlbGV0ZVBpeGVsU2hhZGVyKHAsYSkgKHApLT5EZWxldGVQaXhlbFNoYWRlcihhKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9TZXRQaXhlbFNoYWRlckNvbnN0YW50KHAsYSxiLGMpIChwKS0+U2V0UGl4ZWxTaGFkZXJDb25zdGFudChhLGIsYykNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfR2V0UGl4ZWxTaGFkZXJDb25zdGFudChwLGEsYixjKSAocCktPkdldFBpeGVsU2hhZGVyQ29uc3RhbnQoYSxiLGMpDQorI2RlZmluZSBJRGlyZWN0M0REZXZpY2U4X0dldFBpeGVsU2hhZGVyRnVuY3Rpb24ocCxhLGIsYykgKHApLT5HZXRQaXhlbFNoYWRlckZ1bmN0aW9uKGEsYixjKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9EcmF3UmVjdFBhdGNoKHAsYSxiLGMpIChwKS0+RHJhd1JlY3RQYXRjaChhLGIsYykNCisjZGVmaW5lIElEaXJlY3QzRERldmljZThfRHJhd1RyaVBhdGNoKHAsYSxiLGMpIChwKS0+RHJhd1RyaVBhdGNoKGEsYixjKQ0KKyNkZWZpbmUgSURpcmVjdDNERGV2aWNlOF9EZWxldGVQYXRjaChwLGEpIChwKS0+RGVsZXRlUGF0Y2goYSkNCisjZW5kaWYNCisNCisNCisNCisjdW5kZWYgSU5URVJGQUNFDQorI2RlZmluZSBJTlRFUkZBQ0UgSURpcmVjdDNEU3dhcENoYWluOA0KKw0KK0RFQ0xBUkVfSU5URVJGQUNFXyhJRGlyZWN0M0RTd2FwQ2hhaW44LCBJVW5rbm93bikNCit7DQorICAgIC8qKiogSVVua25vd24gbWV0aG9kcyAqKiovDQorICAgIFNURE1FVEhPRChRdWVyeUludGVyZmFjZSkoVEhJU18gUkVGSUlEIHJpaWQsIHZvaWQqKiBwcHZPYmopIFBVUkU7DQorICAgIFNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKShUSElTKSBQVVJFOw0KKyAgICBTVERNRVRIT0RfKFVMT05HLFJlbGVhc2UpKFRISVMpIFBVUkU7DQorDQorICAgIC8qKiogSURpcmVjdDNEU3dhcENoYWluOCBtZXRob2RzICoqKi8NCisgICAgU1RETUVUSE9EKFByZXNlbnQpKFRISVNfIENPTlNUIFJFQ1QqIHBTb3VyY2VSZWN0LENPTlNUIFJFQ1QqIHBEZXN0UmVjdCxIV05EIGhEZXN0V2luZG93T3ZlcnJpZGUsQ09OU1QgUkdOREFUQSogcERpcnR5UmVnaW9uKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoR2V0QmFja0J1ZmZlcikoVEhJU18gVUlOVCBCYWNrQnVmZmVyLEQzREJBQ0tCVUZGRVJfVFlQRSBUeXBlLElEaXJlY3QzRFN1cmZhY2U4KiogcHBCYWNrQnVmZmVyKSBQVVJFOw0KK307DQorDQordHlwZWRlZiBzdHJ1Y3QgSURpcmVjdDNEU3dhcENoYWluOCAqTFBESVJFQ1QzRFNXQVBDSEFJTjgsICpQRElSRUNUM0RTV0FQQ0hBSU44Ow0KKw0KKyNpZiAhZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChDSU5URVJGQUNFKQ0KKyNkZWZpbmUgSURpcmVjdDNEU3dhcENoYWluOF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHAsYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNEU3dhcENoYWluOF9BZGRSZWYocCkgKHApLT5scFZ0YmwtPkFkZFJlZihwKQ0KKyNkZWZpbmUgSURpcmVjdDNEU3dhcENoYWluOF9SZWxlYXNlKHApIChwKS0+bHBWdGJsLT5SZWxlYXNlKHApDQorI2RlZmluZSBJRGlyZWN0M0RTd2FwQ2hhaW44X1ByZXNlbnQocCxhLGIsYyxkKSAocCktPmxwVnRibC0+UHJlc2VudChwLGEsYixjLGQpDQorI2RlZmluZSBJRGlyZWN0M0RTd2FwQ2hhaW44X0dldEJhY2tCdWZmZXIocCxhLGIsYykgKHApLT5scFZ0YmwtPkdldEJhY2tCdWZmZXIocCxhLGIsYykNCisjZWxzZQ0KKyNkZWZpbmUgSURpcmVjdDNEU3dhcENoYWluOF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5RdWVyeUludGVyZmFjZShhLGIpDQorI2RlZmluZSBJRGlyZWN0M0RTd2FwQ2hhaW44X0FkZFJlZihwKSAocCktPkFkZFJlZigpDQorI2RlZmluZSBJRGlyZWN0M0RTd2FwQ2hhaW44X1JlbGVhc2UocCkgKHApLT5SZWxlYXNlKCkNCisjZGVmaW5lIElEaXJlY3QzRFN3YXBDaGFpbjhfUHJlc2VudChwLGEsYixjLGQpIChwKS0+UHJlc2VudChhLGIsYyxkKQ0KKyNkZWZpbmUgSURpcmVjdDNEU3dhcENoYWluOF9HZXRCYWNrQnVmZmVyKHAsYSxiLGMpIChwKS0+R2V0QmFja0J1ZmZlcihhLGIsYykNCisjZW5kaWYNCisNCisNCisNCisjdW5kZWYgSU5URVJGQUNFDQorI2RlZmluZSBJTlRFUkZBQ0UgSURpcmVjdDNEUmVzb3VyY2U4DQorDQorREVDTEFSRV9JTlRFUkZBQ0VfKElEaXJlY3QzRFJlc291cmNlOCwgSVVua25vd24pDQorew0KKyAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLw0KKyAgICBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpKFRISVNfIFJFRklJRCByaWlkLCB2b2lkKiogcHB2T2JqKSBQVVJFOw0KKyAgICBTVERNRVRIT0RfKFVMT05HLEFkZFJlZikoVEhJUykgUFVSRTsNCisgICAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKShUSElTKSBQVVJFOw0KKw0KKyAgICAvKioqIElEaXJlY3QzRFJlc291cmNlOCBtZXRob2RzICoqKi8NCisgICAgU1RETUVUSE9EKEdldERldmljZSkoVEhJU18gSURpcmVjdDNERGV2aWNlOCoqIHBwRGV2aWNlKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoU2V0UHJpdmF0ZURhdGEpKFRISVNfIFJFRkdVSUQgcmVmZ3VpZCxDT05TVCB2b2lkKiBwRGF0YSxEV09SRCBTaXplT2ZEYXRhLERXT1JEIEZsYWdzKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoR2V0UHJpdmF0ZURhdGEpKFRISVNfIFJFRkdVSUQgcmVmZ3VpZCx2b2lkKiBwRGF0YSxEV09SRCogcFNpemVPZkRhdGEpIFBVUkU7DQorICAgIFNURE1FVEhPRChGcmVlUHJpdmF0ZURhdGEpKFRISVNfIFJFRkdVSUQgcmVmZ3VpZCkgUFVSRTsNCisgICAgU1RETUVUSE9EXyhEV09SRCwgU2V0UHJpb3JpdHkpKFRISVNfIERXT1JEIFByaW9yaXR5TmV3KSBQVVJFOw0KKyAgICBTVERNRVRIT0RfKERXT1JELCBHZXRQcmlvcml0eSkoVEhJUykgUFVSRTsNCisgICAgU1RETUVUSE9EXyh2b2lkLCBQcmVMb2FkKShUSElTKSBQVVJFOw0KKyAgICBTVERNRVRIT0RfKEQzRFJFU09VUkNFVFlQRSwgR2V0VHlwZSkoVEhJUykgUFVSRTsNCit9Ow0KKw0KK3R5cGVkZWYgc3RydWN0IElEaXJlY3QzRFJlc291cmNlOCAqTFBESVJFQ1QzRFJFU09VUkNFOCwgKlBESVJFQ1QzRFJFU09VUkNFODsNCisNCisjaWYgIWRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoQ0lOVEVSRkFDRSkNCisjZGVmaW5lIElEaXJlY3QzRFJlc291cmNlOF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHAsYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNEUmVzb3VyY2U4X0FkZFJlZihwKSAocCktPmxwVnRibC0+QWRkUmVmKHApDQorI2RlZmluZSBJRGlyZWN0M0RSZXNvdXJjZThfUmVsZWFzZShwKSAocCktPmxwVnRibC0+UmVsZWFzZShwKQ0KKyNkZWZpbmUgSURpcmVjdDNEUmVzb3VyY2U4X0dldERldmljZShwLGEpIChwKS0+bHBWdGJsLT5HZXREZXZpY2UocCxhKQ0KKyNkZWZpbmUgSURpcmVjdDNEUmVzb3VyY2U4X1NldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkgKHApLT5scFZ0YmwtPlNldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkNCisjZGVmaW5lIElEaXJlY3QzRFJlc291cmNlOF9HZXRQcml2YXRlRGF0YShwLGEsYixjKSAocCktPmxwVnRibC0+R2V0UHJpdmF0ZURhdGEocCxhLGIsYykNCisjZGVmaW5lIElEaXJlY3QzRFJlc291cmNlOF9GcmVlUHJpdmF0ZURhdGEocCxhKSAocCktPmxwVnRibC0+RnJlZVByaXZhdGVEYXRhKHAsYSkNCisjZGVmaW5lIElEaXJlY3QzRFJlc291cmNlOF9TZXRQcmlvcml0eShwLGEpIChwKS0+bHBWdGJsLT5TZXRQcmlvcml0eShwLGEpDQorI2RlZmluZSBJRGlyZWN0M0RSZXNvdXJjZThfR2V0UHJpb3JpdHkocCkgKHApLT5scFZ0YmwtPkdldFByaW9yaXR5KHApDQorI2RlZmluZSBJRGlyZWN0M0RSZXNvdXJjZThfUHJlTG9hZChwKSAocCktPmxwVnRibC0+UHJlTG9hZChwKQ0KKyNkZWZpbmUgSURpcmVjdDNEUmVzb3VyY2U4X0dldFR5cGUocCkgKHApLT5scFZ0YmwtPkdldFR5cGUocCkNCisjZWxzZQ0KKyNkZWZpbmUgSURpcmVjdDNEUmVzb3VyY2U4X1F1ZXJ5SW50ZXJmYWNlKHAsYSxiKSAocCktPlF1ZXJ5SW50ZXJmYWNlKGEsYikNCisjZGVmaW5lIElEaXJlY3QzRFJlc291cmNlOF9BZGRSZWYocCkgKHApLT5BZGRSZWYoKQ0KKyNkZWZpbmUgSURpcmVjdDNEUmVzb3VyY2U4X1JlbGVhc2UocCkgKHApLT5SZWxlYXNlKCkNCisjZGVmaW5lIElEaXJlY3QzRFJlc291cmNlOF9HZXREZXZpY2UocCxhKSAocCktPkdldERldmljZShhKQ0KKyNkZWZpbmUgSURpcmVjdDNEUmVzb3VyY2U4X1NldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkgKHApLT5TZXRQcml2YXRlRGF0YShhLGIsYyxkKQ0KKyNkZWZpbmUgSURpcmVjdDNEUmVzb3VyY2U4X0dldFByaXZhdGVEYXRhKHAsYSxiLGMpIChwKS0+R2V0UHJpdmF0ZURhdGEoYSxiLGMpDQorI2RlZmluZSBJRGlyZWN0M0RSZXNvdXJjZThfRnJlZVByaXZhdGVEYXRhKHAsYSkgKHApLT5GcmVlUHJpdmF0ZURhdGEoYSkNCisjZGVmaW5lIElEaXJlY3QzRFJlc291cmNlOF9TZXRQcmlvcml0eShwLGEpIChwKS0+U2V0UHJpb3JpdHkoYSkNCisjZGVmaW5lIElEaXJlY3QzRFJlc291cmNlOF9HZXRQcmlvcml0eShwKSAocCktPkdldFByaW9yaXR5KCkNCisjZGVmaW5lIElEaXJlY3QzRFJlc291cmNlOF9QcmVMb2FkKHApIChwKS0+UHJlTG9hZCgpDQorI2RlZmluZSBJRGlyZWN0M0RSZXNvdXJjZThfR2V0VHlwZShwKSAocCktPkdldFR5cGUoKQ0KKyNlbmRpZg0KKw0KKw0KKw0KKw0KKyN1bmRlZiBJTlRFUkZBQ0UNCisjZGVmaW5lIElOVEVSRkFDRSBJRGlyZWN0M0RCYXNlVGV4dHVyZTgNCisNCitERUNMQVJFX0lOVEVSRkFDRV8oSURpcmVjdDNEQmFzZVRleHR1cmU4LCBJRGlyZWN0M0RSZXNvdXJjZTgpDQorew0KKyAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLw0KKyAgICBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpKFRISVNfIFJFRklJRCByaWlkLCB2b2lkKiogcHB2T2JqKSBQVVJFOw0KKyAgICBTVERNRVRIT0RfKFVMT05HLEFkZFJlZikoVEhJUykgUFVSRTsNCisgICAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKShUSElTKSBQVVJFOw0KKw0KKyAgICAvKioqIElEaXJlY3QzRFJlc291cmNlOCBtZXRob2RzICoqKi8NCisgICAgU1RETUVUSE9EKEdldERldmljZSkoVEhJU18gSURpcmVjdDNERGV2aWNlOCoqIHBwRGV2aWNlKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoU2V0UHJpdmF0ZURhdGEpKFRISVNfIFJFRkdVSUQgcmVmZ3VpZCxDT05TVCB2b2lkKiBwRGF0YSxEV09SRCBTaXplT2ZEYXRhLERXT1JEIEZsYWdzKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoR2V0UHJpdmF0ZURhdGEpKFRISVNfIFJFRkdVSUQgcmVmZ3VpZCx2b2lkKiBwRGF0YSxEV09SRCogcFNpemVPZkRhdGEpIFBVUkU7DQorICAgIFNURE1FVEhPRChGcmVlUHJpdmF0ZURhdGEpKFRISVNfIFJFRkdVSUQgcmVmZ3VpZCkgUFVSRTsNCisgICAgU1RETUVUSE9EXyhEV09SRCwgU2V0UHJpb3JpdHkpKFRISVNfIERXT1JEIFByaW9yaXR5TmV3KSBQVVJFOw0KKyAgICBTVERNRVRIT0RfKERXT1JELCBHZXRQcmlvcml0eSkoVEhJUykgUFVSRTsNCisgICAgU1RETUVUSE9EXyh2b2lkLCBQcmVMb2FkKShUSElTKSBQVVJFOw0KKyAgICBTVERNRVRIT0RfKEQzRFJFU09VUkNFVFlQRSwgR2V0VHlwZSkoVEhJUykgUFVSRTsNCisgICAgU1RETUVUSE9EXyhEV09SRCwgU2V0TE9EKShUSElTXyBEV09SRCBMT0ROZXcpIFBVUkU7DQorICAgIFNURE1FVEhPRF8oRFdPUkQsIEdldExPRCkoVEhJUykgUFVSRTsNCisgICAgU1RETUVUSE9EXyhEV09SRCwgR2V0TGV2ZWxDb3VudCkoVEhJUykgUFVSRTsNCit9Ow0KKw0KK3R5cGVkZWYgc3RydWN0IElEaXJlY3QzREJhc2VUZXh0dXJlOCAqTFBESVJFQ1QzREJBU0VURVhUVVJFOCwgKlBESVJFQ1QzREJBU0VURVhUVVJFODsNCisNCisjaWYgIWRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoQ0lOVEVSRkFDRSkNCisjZGVmaW5lIElEaXJlY3QzREJhc2VUZXh0dXJlOF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHAsYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNEQmFzZVRleHR1cmU4X0FkZFJlZihwKSAocCktPmxwVnRibC0+QWRkUmVmKHApDQorI2RlZmluZSBJRGlyZWN0M0RCYXNlVGV4dHVyZThfUmVsZWFzZShwKSAocCktPmxwVnRibC0+UmVsZWFzZShwKQ0KKyNkZWZpbmUgSURpcmVjdDNEQmFzZVRleHR1cmU4X0dldERldmljZShwLGEpIChwKS0+bHBWdGJsLT5HZXREZXZpY2UocCxhKQ0KKyNkZWZpbmUgSURpcmVjdDNEQmFzZVRleHR1cmU4X1NldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkgKHApLT5scFZ0YmwtPlNldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkNCisjZGVmaW5lIElEaXJlY3QzREJhc2VUZXh0dXJlOF9HZXRQcml2YXRlRGF0YShwLGEsYixjKSAocCktPmxwVnRibC0+R2V0UHJpdmF0ZURhdGEocCxhLGIsYykNCisjZGVmaW5lIElEaXJlY3QzREJhc2VUZXh0dXJlOF9GcmVlUHJpdmF0ZURhdGEocCxhKSAocCktPmxwVnRibC0+RnJlZVByaXZhdGVEYXRhKHAsYSkNCisjZGVmaW5lIElEaXJlY3QzREJhc2VUZXh0dXJlOF9TZXRQcmlvcml0eShwLGEpIChwKS0+bHBWdGJsLT5TZXRQcmlvcml0eShwLGEpDQorI2RlZmluZSBJRGlyZWN0M0RCYXNlVGV4dHVyZThfR2V0UHJpb3JpdHkocCkgKHApLT5scFZ0YmwtPkdldFByaW9yaXR5KHApDQorI2RlZmluZSBJRGlyZWN0M0RCYXNlVGV4dHVyZThfUHJlTG9hZChwKSAocCktPmxwVnRibC0+UHJlTG9hZChwKQ0KKyNkZWZpbmUgSURpcmVjdDNEQmFzZVRleHR1cmU4X0dldFR5cGUocCkgKHApLT5scFZ0YmwtPkdldFR5cGUocCkNCisjZGVmaW5lIElEaXJlY3QzREJhc2VUZXh0dXJlOF9TZXRMT0QocCxhKSAocCktPmxwVnRibC0+U2V0TE9EKHAsYSkNCisjZGVmaW5lIElEaXJlY3QzREJhc2VUZXh0dXJlOF9HZXRMT0QocCkgKHApLT5scFZ0YmwtPkdldExPRChwKQ0KKyNkZWZpbmUgSURpcmVjdDNEQmFzZVRleHR1cmU4X0dldExldmVsQ291bnQocCkgKHApLT5scFZ0YmwtPkdldExldmVsQ291bnQocCkNCisjZWxzZQ0KKyNkZWZpbmUgSURpcmVjdDNEQmFzZVRleHR1cmU4X1F1ZXJ5SW50ZXJmYWNlKHAsYSxiKSAocCktPlF1ZXJ5SW50ZXJmYWNlKGEsYikNCisjZGVmaW5lIElEaXJlY3QzREJhc2VUZXh0dXJlOF9BZGRSZWYocCkgKHApLT5BZGRSZWYoKQ0KKyNkZWZpbmUgSURpcmVjdDNEQmFzZVRleHR1cmU4X1JlbGVhc2UocCkgKHApLT5SZWxlYXNlKCkNCisjZGVmaW5lIElEaXJlY3QzREJhc2VUZXh0dXJlOF9HZXREZXZpY2UocCxhKSAocCktPkdldERldmljZShhKQ0KKyNkZWZpbmUgSURpcmVjdDNEQmFzZVRleHR1cmU4X1NldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkgKHApLT5TZXRQcml2YXRlRGF0YShhLGIsYyxkKQ0KKyNkZWZpbmUgSURpcmVjdDNEQmFzZVRleHR1cmU4X0dldFByaXZhdGVEYXRhKHAsYSxiLGMpIChwKS0+R2V0UHJpdmF0ZURhdGEoYSxiLGMpDQorI2RlZmluZSBJRGlyZWN0M0RCYXNlVGV4dHVyZThfRnJlZVByaXZhdGVEYXRhKHAsYSkgKHApLT5GcmVlUHJpdmF0ZURhdGEoYSkNCisjZGVmaW5lIElEaXJlY3QzREJhc2VUZXh0dXJlOF9TZXRQcmlvcml0eShwLGEpIChwKS0+U2V0UHJpb3JpdHkoYSkNCisjZGVmaW5lIElEaXJlY3QzREJhc2VUZXh0dXJlOF9HZXRQcmlvcml0eShwKSAocCktPkdldFByaW9yaXR5KCkNCisjZGVmaW5lIElEaXJlY3QzREJhc2VUZXh0dXJlOF9QcmVMb2FkKHApIChwKS0+UHJlTG9hZCgpDQorI2RlZmluZSBJRGlyZWN0M0RCYXNlVGV4dHVyZThfR2V0VHlwZShwKSAocCktPkdldFR5cGUoKQ0KKyNkZWZpbmUgSURpcmVjdDNEQmFzZVRleHR1cmU4X1NldExPRChwLGEpIChwKS0+U2V0TE9EKGEpDQorI2RlZmluZSBJRGlyZWN0M0RCYXNlVGV4dHVyZThfR2V0TE9EKHApIChwKS0+R2V0TE9EKCkNCisjZGVmaW5lIElEaXJlY3QzREJhc2VUZXh0dXJlOF9HZXRMZXZlbENvdW50KHApIChwKS0+R2V0TGV2ZWxDb3VudCgpDQorI2VuZGlmDQorDQorDQorDQorDQorDQorI3VuZGVmIElOVEVSRkFDRQ0KKyNkZWZpbmUgSU5URVJGQUNFIElEaXJlY3QzRFRleHR1cmU4DQorDQorREVDTEFSRV9JTlRFUkZBQ0VfKElEaXJlY3QzRFRleHR1cmU4LCBJRGlyZWN0M0RCYXNlVGV4dHVyZTgpDQorew0KKyAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLw0KKyAgICBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpKFRISVNfIFJFRklJRCByaWlkLCB2b2lkKiogcHB2T2JqKSBQVVJFOw0KKyAgICBTVERNRVRIT0RfKFVMT05HLEFkZFJlZikoVEhJUykgUFVSRTsNCisgICAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKShUSElTKSBQVVJFOw0KKw0KKyAgICAvKioqIElEaXJlY3QzREJhc2VUZXh0dXJlOCBtZXRob2RzICoqKi8NCisgICAgU1RETUVUSE9EKEdldERldmljZSkoVEhJU18gSURpcmVjdDNERGV2aWNlOCoqIHBwRGV2aWNlKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoU2V0UHJpdmF0ZURhdGEpKFRISVNfIFJFRkdVSUQgcmVmZ3VpZCxDT05TVCB2b2lkKiBwRGF0YSxEV09SRCBTaXplT2ZEYXRhLERXT1JEIEZsYWdzKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoR2V0UHJpdmF0ZURhdGEpKFRISVNfIFJFRkdVSUQgcmVmZ3VpZCx2b2lkKiBwRGF0YSxEV09SRCogcFNpemVPZkRhdGEpIFBVUkU7DQorICAgIFNURE1FVEhPRChGcmVlUHJpdmF0ZURhdGEpKFRISVNfIFJFRkdVSUQgcmVmZ3VpZCkgUFVSRTsNCisgICAgU1RETUVUSE9EXyhEV09SRCwgU2V0UHJpb3JpdHkpKFRISVNfIERXT1JEIFByaW9yaXR5TmV3KSBQVVJFOw0KKyAgICBTVERNRVRIT0RfKERXT1JELCBHZXRQcmlvcml0eSkoVEhJUykgUFVSRTsNCisgICAgU1RETUVUSE9EXyh2b2lkLCBQcmVMb2FkKShUSElTKSBQVVJFOw0KKyAgICBTVERNRVRIT0RfKEQzRFJFU09VUkNFVFlQRSwgR2V0VHlwZSkoVEhJUykgUFVSRTsNCisgICAgU1RETUVUSE9EXyhEV09SRCwgU2V0TE9EKShUSElTXyBEV09SRCBMT0ROZXcpIFBVUkU7DQorICAgIFNURE1FVEhPRF8oRFdPUkQsIEdldExPRCkoVEhJUykgUFVSRTsNCisgICAgU1RETUVUSE9EXyhEV09SRCwgR2V0TGV2ZWxDb3VudCkoVEhJUykgUFVSRTsNCisgICAgU1RETUVUSE9EKEdldExldmVsRGVzYykoVEhJU18gVUlOVCBMZXZlbCxEM0RTVVJGQUNFX0RFU0MgKnBEZXNjKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoR2V0U3VyZmFjZUxldmVsKShUSElTXyBVSU5UIExldmVsLElEaXJlY3QzRFN1cmZhY2U4KiogcHBTdXJmYWNlTGV2ZWwpIFBVUkU7DQorICAgIFNURE1FVEhPRChMb2NrUmVjdCkoVEhJU18gVUlOVCBMZXZlbCxEM0RMT0NLRURfUkVDVCogcExvY2tlZFJlY3QsQ09OU1QgUkVDVCogcFJlY3QsRFdPUkQgRmxhZ3MpIFBVUkU7DQorICAgIFNURE1FVEhPRChVbmxvY2tSZWN0KShUSElTXyBVSU5UIExldmVsKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoQWRkRGlydHlSZWN0KShUSElTXyBDT05TVCBSRUNUKiBwRGlydHlSZWN0KSBQVVJFOw0KK307DQorDQordHlwZWRlZiBzdHJ1Y3QgSURpcmVjdDNEVGV4dHVyZTggKkxQRElSRUNUM0RURVhUVVJFOCwgKlBESVJFQ1QzRFRFWFRVUkU4Ow0KKw0KKyNpZiAhZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChDSU5URVJGQUNFKQ0KKyNkZWZpbmUgSURpcmVjdDNEVGV4dHVyZThfUXVlcnlJbnRlcmZhY2UocCxhLGIpIChwKS0+bHBWdGJsLT5RdWVyeUludGVyZmFjZShwLGEsYikNCisjZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X0FkZFJlZihwKSAocCktPmxwVnRibC0+QWRkUmVmKHApDQorI2RlZmluZSBJRGlyZWN0M0RUZXh0dXJlOF9SZWxlYXNlKHApIChwKS0+bHBWdGJsLT5SZWxlYXNlKHApDQorI2RlZmluZSBJRGlyZWN0M0RUZXh0dXJlOF9HZXREZXZpY2UocCxhKSAocCktPmxwVnRibC0+R2V0RGV2aWNlKHAsYSkNCisjZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X1NldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkgKHApLT5scFZ0YmwtPlNldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkNCisjZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X0dldFByaXZhdGVEYXRhKHAsYSxiLGMpIChwKS0+bHBWdGJsLT5HZXRQcml2YXRlRGF0YShwLGEsYixjKQ0KKyNkZWZpbmUgSURpcmVjdDNEVGV4dHVyZThfRnJlZVByaXZhdGVEYXRhKHAsYSkgKHApLT5scFZ0YmwtPkZyZWVQcml2YXRlRGF0YShwLGEpDQorI2RlZmluZSBJRGlyZWN0M0RUZXh0dXJlOF9TZXRQcmlvcml0eShwLGEpIChwKS0+bHBWdGJsLT5TZXRQcmlvcml0eShwLGEpDQorI2RlZmluZSBJRGlyZWN0M0RUZXh0dXJlOF9HZXRQcmlvcml0eShwKSAocCktPmxwVnRibC0+R2V0UHJpb3JpdHkocCkNCisjZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X1ByZUxvYWQocCkgKHApLT5scFZ0YmwtPlByZUxvYWQocCkNCisjZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X0dldFR5cGUocCkgKHApLT5scFZ0YmwtPkdldFR5cGUocCkNCisjZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X1NldExPRChwLGEpIChwKS0+bHBWdGJsLT5TZXRMT0QocCxhKQ0KKyNkZWZpbmUgSURpcmVjdDNEVGV4dHVyZThfR2V0TE9EKHApIChwKS0+bHBWdGJsLT5HZXRMT0QocCkNCisjZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X0dldExldmVsQ291bnQocCkgKHApLT5scFZ0YmwtPkdldExldmVsQ291bnQocCkNCisjZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X0dldExldmVsRGVzYyhwLGEsYikgKHApLT5scFZ0YmwtPkdldExldmVsRGVzYyhwLGEsYikNCisjZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X0dldFN1cmZhY2VMZXZlbChwLGEsYikgKHApLT5scFZ0YmwtPkdldFN1cmZhY2VMZXZlbChwLGEsYikNCisjZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X0xvY2tSZWN0KHAsYSxiLGMsZCkgKHApLT5scFZ0YmwtPkxvY2tSZWN0KHAsYSxiLGMsZCkNCisjZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X1VubG9ja1JlY3QocCxhKSAocCktPmxwVnRibC0+VW5sb2NrUmVjdChwLGEpDQorI2RlZmluZSBJRGlyZWN0M0RUZXh0dXJlOF9BZGREaXJ0eVJlY3QocCxhKSAocCktPmxwVnRibC0+QWRkRGlydHlSZWN0KHAsYSkNCisjZWxzZQ0KKyNkZWZpbmUgSURpcmVjdDNEVGV4dHVyZThfUXVlcnlJbnRlcmZhY2UocCxhLGIpIChwKS0+UXVlcnlJbnRlcmZhY2UoYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNEVGV4dHVyZThfQWRkUmVmKHApIChwKS0+QWRkUmVmKCkNCisjZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X1JlbGVhc2UocCkgKHApLT5SZWxlYXNlKCkNCisjZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X0dldERldmljZShwLGEpIChwKS0+R2V0RGV2aWNlKGEpDQorI2RlZmluZSBJRGlyZWN0M0RUZXh0dXJlOF9TZXRQcml2YXRlRGF0YShwLGEsYixjLGQpIChwKS0+U2V0UHJpdmF0ZURhdGEoYSxiLGMsZCkNCisjZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X0dldFByaXZhdGVEYXRhKHAsYSxiLGMpIChwKS0+R2V0UHJpdmF0ZURhdGEoYSxiLGMpDQorI2RlZmluZSBJRGlyZWN0M0RUZXh0dXJlOF9GcmVlUHJpdmF0ZURhdGEocCxhKSAocCktPkZyZWVQcml2YXRlRGF0YShhKQ0KKyNkZWZpbmUgSURpcmVjdDNEVGV4dHVyZThfU2V0UHJpb3JpdHkocCxhKSAocCktPlNldFByaW9yaXR5KGEpDQorI2RlZmluZSBJRGlyZWN0M0RUZXh0dXJlOF9HZXRQcmlvcml0eShwKSAocCktPkdldFByaW9yaXR5KCkNCisjZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X1ByZUxvYWQocCkgKHApLT5QcmVMb2FkKCkNCisjZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X0dldFR5cGUocCkgKHApLT5HZXRUeXBlKCkNCisjZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X1NldExPRChwLGEpIChwKS0+U2V0TE9EKGEpDQorI2RlZmluZSBJRGlyZWN0M0RUZXh0dXJlOF9HZXRMT0QocCkgKHApLT5HZXRMT0QoKQ0KKyNkZWZpbmUgSURpcmVjdDNEVGV4dHVyZThfR2V0TGV2ZWxDb3VudChwKSAocCktPkdldExldmVsQ291bnQoKQ0KKyNkZWZpbmUgSURpcmVjdDNEVGV4dHVyZThfR2V0TGV2ZWxEZXNjKHAsYSxiKSAocCktPkdldExldmVsRGVzYyhhLGIpDQorI2RlZmluZSBJRGlyZWN0M0RUZXh0dXJlOF9HZXRTdXJmYWNlTGV2ZWwocCxhLGIpIChwKS0+R2V0U3VyZmFjZUxldmVsKGEsYikNCisjZGVmaW5lIElEaXJlY3QzRFRleHR1cmU4X0xvY2tSZWN0KHAsYSxiLGMsZCkgKHApLT5Mb2NrUmVjdChhLGIsYyxkKQ0KKyNkZWZpbmUgSURpcmVjdDNEVGV4dHVyZThfVW5sb2NrUmVjdChwLGEpIChwKS0+VW5sb2NrUmVjdChhKQ0KKyNkZWZpbmUgSURpcmVjdDNEVGV4dHVyZThfQWRkRGlydHlSZWN0KHAsYSkgKHApLT5BZGREaXJ0eVJlY3QoYSkNCisjZW5kaWYNCisNCisNCisNCisNCisNCisjdW5kZWYgSU5URVJGQUNFDQorI2RlZmluZSBJTlRFUkZBQ0UgSURpcmVjdDNEVm9sdW1lVGV4dHVyZTgNCisNCitERUNMQVJFX0lOVEVSRkFDRV8oSURpcmVjdDNEVm9sdW1lVGV4dHVyZTgsIElEaXJlY3QzREJhc2VUZXh0dXJlOCkNCit7DQorICAgIC8qKiogSVVua25vd24gbWV0aG9kcyAqKiovDQorICAgIFNURE1FVEhPRChRdWVyeUludGVyZmFjZSkoVEhJU18gUkVGSUlEIHJpaWQsIHZvaWQqKiBwcHZPYmopIFBVUkU7DQorICAgIFNURE1FVEhPRF8oVUxPTkcsQWRkUmVmKShUSElTKSBQVVJFOw0KKyAgICBTVERNRVRIT0RfKFVMT05HLFJlbGVhc2UpKFRISVMpIFBVUkU7DQorDQorICAgIC8qKiogSURpcmVjdDNEQmFzZVRleHR1cmU4IG1ldGhvZHMgKioqLw0KKyAgICBTVERNRVRIT0QoR2V0RGV2aWNlKShUSElTXyBJRGlyZWN0M0REZXZpY2U4KiogcHBEZXZpY2UpIFBVUkU7DQorICAgIFNURE1FVEhPRChTZXRQcml2YXRlRGF0YSkoVEhJU18gUkVGR1VJRCByZWZndWlkLENPTlNUIHZvaWQqIHBEYXRhLERXT1JEIFNpemVPZkRhdGEsRFdPUkQgRmxhZ3MpIFBVUkU7DQorICAgIFNURE1FVEhPRChHZXRQcml2YXRlRGF0YSkoVEhJU18gUkVGR1VJRCByZWZndWlkLHZvaWQqIHBEYXRhLERXT1JEKiBwU2l6ZU9mRGF0YSkgUFVSRTsNCisgICAgU1RETUVUSE9EKEZyZWVQcml2YXRlRGF0YSkoVEhJU18gUkVGR1VJRCByZWZndWlkKSBQVVJFOw0KKyAgICBTVERNRVRIT0RfKERXT1JELCBTZXRQcmlvcml0eSkoVEhJU18gRFdPUkQgUHJpb3JpdHlOZXcpIFBVUkU7DQorICAgIFNURE1FVEhPRF8oRFdPUkQsIEdldFByaW9yaXR5KShUSElTKSBQVVJFOw0KKyAgICBTVERNRVRIT0RfKHZvaWQsIFByZUxvYWQpKFRISVMpIFBVUkU7DQorICAgIFNURE1FVEhPRF8oRDNEUkVTT1VSQ0VUWVBFLCBHZXRUeXBlKShUSElTKSBQVVJFOw0KKyAgICBTVERNRVRIT0RfKERXT1JELCBTZXRMT0QpKFRISVNfIERXT1JEIExPRE5ldykgUFVSRTsNCisgICAgU1RETUVUSE9EXyhEV09SRCwgR2V0TE9EKShUSElTKSBQVVJFOw0KKyAgICBTVERNRVRIT0RfKERXT1JELCBHZXRMZXZlbENvdW50KShUSElTKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoR2V0TGV2ZWxEZXNjKShUSElTXyBVSU5UIExldmVsLEQzRFZPTFVNRV9ERVNDICpwRGVzYykgUFVSRTsNCisgICAgU1RETUVUSE9EKEdldFZvbHVtZUxldmVsKShUSElTXyBVSU5UIExldmVsLElEaXJlY3QzRFZvbHVtZTgqKiBwcFZvbHVtZUxldmVsKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoTG9ja0JveCkoVEhJU18gVUlOVCBMZXZlbCxEM0RMT0NLRURfQk9YKiBwTG9ja2VkVm9sdW1lLENPTlNUIEQzREJPWCogcEJveCxEV09SRCBGbGFncykgUFVSRTsNCisgICAgU1RETUVUSE9EKFVubG9ja0JveCkoVEhJU18gVUlOVCBMZXZlbCkgUFVSRTsNCisgICAgU1RETUVUSE9EKEFkZERpcnR5Qm94KShUSElTXyBDT05TVCBEM0RCT1gqIHBEaXJ0eUJveCkgUFVSRTsNCit9Ow0KKw0KK3R5cGVkZWYgc3RydWN0IElEaXJlY3QzRFZvbHVtZVRleHR1cmU4ICpMUERJUkVDVDNEVk9MVU1FVEVYVFVSRTgsICpQRElSRUNUM0RWT0xVTUVURVhUVVJFODsNCisNCisjaWYgIWRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoQ0lOVEVSRkFDRSkNCisjZGVmaW5lIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4X1F1ZXJ5SW50ZXJmYWNlKHAsYSxiKSAocCktPmxwVnRibC0+UXVlcnlJbnRlcmZhY2UocCxhLGIpDQorI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9BZGRSZWYocCkgKHApLT5scFZ0YmwtPkFkZFJlZihwKQ0KKyNkZWZpbmUgSURpcmVjdDNEVm9sdW1lVGV4dHVyZThfUmVsZWFzZShwKSAocCktPmxwVnRibC0+UmVsZWFzZShwKQ0KKyNkZWZpbmUgSURpcmVjdDNEVm9sdW1lVGV4dHVyZThfR2V0RGV2aWNlKHAsYSkgKHApLT5scFZ0YmwtPkdldERldmljZShwLGEpDQorI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9TZXRQcml2YXRlRGF0YShwLGEsYixjLGQpIChwKS0+bHBWdGJsLT5TZXRQcml2YXRlRGF0YShwLGEsYixjLGQpDQorI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9HZXRQcml2YXRlRGF0YShwLGEsYixjKSAocCktPmxwVnRibC0+R2V0UHJpdmF0ZURhdGEocCxhLGIsYykNCisjZGVmaW5lIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4X0ZyZWVQcml2YXRlRGF0YShwLGEpIChwKS0+bHBWdGJsLT5GcmVlUHJpdmF0ZURhdGEocCxhKQ0KKyNkZWZpbmUgSURpcmVjdDNEVm9sdW1lVGV4dHVyZThfU2V0UHJpb3JpdHkocCxhKSAocCktPmxwVnRibC0+U2V0UHJpb3JpdHkocCxhKQ0KKyNkZWZpbmUgSURpcmVjdDNEVm9sdW1lVGV4dHVyZThfR2V0UHJpb3JpdHkocCkgKHApLT5scFZ0YmwtPkdldFByaW9yaXR5KHApDQorI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9QcmVMb2FkKHApIChwKS0+bHBWdGJsLT5QcmVMb2FkKHApDQorI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9HZXRUeXBlKHApIChwKS0+bHBWdGJsLT5HZXRUeXBlKHApDQorI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9TZXRMT0QocCxhKSAocCktPmxwVnRibC0+U2V0TE9EKHAsYSkNCisjZGVmaW5lIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4X0dldExPRChwKSAocCktPmxwVnRibC0+R2V0TE9EKHApDQorI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9HZXRMZXZlbENvdW50KHApIChwKS0+bHBWdGJsLT5HZXRMZXZlbENvdW50KHApDQorI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9HZXRMZXZlbERlc2MocCxhLGIpIChwKS0+bHBWdGJsLT5HZXRMZXZlbERlc2MocCxhLGIpDQorI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9HZXRWb2x1bWVMZXZlbChwLGEsYikgKHApLT5scFZ0YmwtPkdldFZvbHVtZUxldmVsKHAsYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNEVm9sdW1lVGV4dHVyZThfTG9ja0JveChwLGEsYixjLGQpIChwKS0+bHBWdGJsLT5Mb2NrQm94KHAsYSxiLGMsZCkNCisjZGVmaW5lIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4X1VubG9ja0JveChwLGEpIChwKS0+bHBWdGJsLT5VbmxvY2tCb3gocCxhKQ0KKyNkZWZpbmUgSURpcmVjdDNEVm9sdW1lVGV4dHVyZThfQWRkRGlydHlCb3gocCxhKSAocCktPmxwVnRibC0+QWRkRGlydHlCb3gocCxhKQ0KKyNlbHNlDQorI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5RdWVyeUludGVyZmFjZShhLGIpDQorI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9BZGRSZWYocCkgKHApLT5BZGRSZWYoKQ0KKyNkZWZpbmUgSURpcmVjdDNEVm9sdW1lVGV4dHVyZThfUmVsZWFzZShwKSAocCktPlJlbGVhc2UoKQ0KKyNkZWZpbmUgSURpcmVjdDNEVm9sdW1lVGV4dHVyZThfR2V0RGV2aWNlKHAsYSkgKHApLT5HZXREZXZpY2UoYSkNCisjZGVmaW5lIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4X1NldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkgKHApLT5TZXRQcml2YXRlRGF0YShhLGIsYyxkKQ0KKyNkZWZpbmUgSURpcmVjdDNEVm9sdW1lVGV4dHVyZThfR2V0UHJpdmF0ZURhdGEocCxhLGIsYykgKHApLT5HZXRQcml2YXRlRGF0YShhLGIsYykNCisjZGVmaW5lIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4X0ZyZWVQcml2YXRlRGF0YShwLGEpIChwKS0+RnJlZVByaXZhdGVEYXRhKGEpDQorI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9TZXRQcmlvcml0eShwLGEpIChwKS0+U2V0UHJpb3JpdHkoYSkNCisjZGVmaW5lIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4X0dldFByaW9yaXR5KHApIChwKS0+R2V0UHJpb3JpdHkoKQ0KKyNkZWZpbmUgSURpcmVjdDNEVm9sdW1lVGV4dHVyZThfUHJlTG9hZChwKSAocCktPlByZUxvYWQoKQ0KKyNkZWZpbmUgSURpcmVjdDNEVm9sdW1lVGV4dHVyZThfR2V0VHlwZShwKSAocCktPkdldFR5cGUoKQ0KKyNkZWZpbmUgSURpcmVjdDNEVm9sdW1lVGV4dHVyZThfU2V0TE9EKHAsYSkgKHApLT5TZXRMT0QoYSkNCisjZGVmaW5lIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4X0dldExPRChwKSAocCktPkdldExPRCgpDQorI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9HZXRMZXZlbENvdW50KHApIChwKS0+R2V0TGV2ZWxDb3VudCgpDQorI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9HZXRMZXZlbERlc2MocCxhLGIpIChwKS0+R2V0TGV2ZWxEZXNjKGEsYikNCisjZGVmaW5lIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4X0dldFZvbHVtZUxldmVsKHAsYSxiKSAocCktPkdldFZvbHVtZUxldmVsKGEsYikNCisjZGVmaW5lIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4X0xvY2tCb3gocCxhLGIsYyxkKSAocCktPkxvY2tCb3goYSxiLGMsZCkNCisjZGVmaW5lIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4X1VubG9ja0JveChwLGEpIChwKS0+VW5sb2NrQm94KGEpDQorI2RlZmluZSBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9BZGREaXJ0eUJveChwLGEpIChwKS0+QWRkRGlydHlCb3goYSkNCisjZW5kaWYNCisNCisNCisNCisNCisNCisjdW5kZWYgSU5URVJGQUNFDQorI2RlZmluZSBJTlRFUkZBQ0UgSURpcmVjdDNEQ3ViZVRleHR1cmU4DQorDQorREVDTEFSRV9JTlRFUkZBQ0VfKElEaXJlY3QzREN1YmVUZXh0dXJlOCwgSURpcmVjdDNEQmFzZVRleHR1cmU4KQ0KK3sNCisgICAgLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8NCisgICAgU1RETUVUSE9EKFF1ZXJ5SW50ZXJmYWNlKShUSElTXyBSRUZJSUQgcmlpZCwgdm9pZCoqIHBwdk9iaikgUFVSRTsNCisgICAgU1RETUVUSE9EXyhVTE9ORyxBZGRSZWYpKFRISVMpIFBVUkU7DQorICAgIFNURE1FVEhPRF8oVUxPTkcsUmVsZWFzZSkoVEhJUykgUFVSRTsNCisNCisgICAgLyoqKiBJRGlyZWN0M0RCYXNlVGV4dHVyZTggbWV0aG9kcyAqKiovDQorICAgIFNURE1FVEhPRChHZXREZXZpY2UpKFRISVNfIElEaXJlY3QzRERldmljZTgqKiBwcERldmljZSkgUFVSRTsNCisgICAgU1RETUVUSE9EKFNldFByaXZhdGVEYXRhKShUSElTXyBSRUZHVUlEIHJlZmd1aWQsQ09OU1Qgdm9pZCogcERhdGEsRFdPUkQgU2l6ZU9mRGF0YSxEV09SRCBGbGFncykgUFVSRTsNCisgICAgU1RETUVUSE9EKEdldFByaXZhdGVEYXRhKShUSElTXyBSRUZHVUlEIHJlZmd1aWQsdm9pZCogcERhdGEsRFdPUkQqIHBTaXplT2ZEYXRhKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoRnJlZVByaXZhdGVEYXRhKShUSElTXyBSRUZHVUlEIHJlZmd1aWQpIFBVUkU7DQorICAgIFNURE1FVEhPRF8oRFdPUkQsIFNldFByaW9yaXR5KShUSElTXyBEV09SRCBQcmlvcml0eU5ldykgUFVSRTsNCisgICAgU1RETUVUSE9EXyhEV09SRCwgR2V0UHJpb3JpdHkpKFRISVMpIFBVUkU7DQorICAgIFNURE1FVEhPRF8odm9pZCwgUHJlTG9hZCkoVEhJUykgUFVSRTsNCisgICAgU1RETUVUSE9EXyhEM0RSRVNPVVJDRVRZUEUsIEdldFR5cGUpKFRISVMpIFBVUkU7DQorICAgIFNURE1FVEhPRF8oRFdPUkQsIFNldExPRCkoVEhJU18gRFdPUkQgTE9ETmV3KSBQVVJFOw0KKyAgICBTVERNRVRIT0RfKERXT1JELCBHZXRMT0QpKFRISVMpIFBVUkU7DQorICAgIFNURE1FVEhPRF8oRFdPUkQsIEdldExldmVsQ291bnQpKFRISVMpIFBVUkU7DQorICAgIFNURE1FVEhPRChHZXRMZXZlbERlc2MpKFRISVNfIFVJTlQgTGV2ZWwsRDNEU1VSRkFDRV9ERVNDICpwRGVzYykgUFVSRTsNCisgICAgU1RETUVUSE9EKEdldEN1YmVNYXBTdXJmYWNlKShUSElTXyBEM0RDVUJFTUFQX0ZBQ0VTIEZhY2VUeXBlLFVJTlQgTGV2ZWwsSURpcmVjdDNEU3VyZmFjZTgqKiBwcEN1YmVNYXBTdXJmYWNlKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoTG9ja1JlY3QpKFRISVNfIEQzRENVQkVNQVBfRkFDRVMgRmFjZVR5cGUsVUlOVCBMZXZlbCxEM0RMT0NLRURfUkVDVCogcExvY2tlZFJlY3QsQ09OU1QgUkVDVCogcFJlY3QsRFdPUkQgRmxhZ3MpIFBVUkU7DQorICAgIFNURE1FVEhPRChVbmxvY2tSZWN0KShUSElTXyBEM0RDVUJFTUFQX0ZBQ0VTIEZhY2VUeXBlLFVJTlQgTGV2ZWwpIFBVUkU7DQorICAgIFNURE1FVEhPRChBZGREaXJ0eVJlY3QpKFRISVNfIEQzRENVQkVNQVBfRkFDRVMgRmFjZVR5cGUsQ09OU1QgUkVDVCogcERpcnR5UmVjdCkgUFVSRTsNCit9Ow0KKw0KK3R5cGVkZWYgc3RydWN0IElEaXJlY3QzREN1YmVUZXh0dXJlOCAqTFBESVJFQ1QzRENVQkVURVhUVVJFOCwgKlBESVJFQ1QzRENVQkVURVhUVVJFODsNCisNCisjaWYgIWRlZmluZWQoX19jcGx1c3BsdXMpIHx8IGRlZmluZWQoQ0lOVEVSRkFDRSkNCisjZGVmaW5lIElEaXJlY3QzREN1YmVUZXh0dXJlOF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHAsYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNEQ3ViZVRleHR1cmU4X0FkZFJlZihwKSAocCktPmxwVnRibC0+QWRkUmVmKHApDQorI2RlZmluZSBJRGlyZWN0M0RDdWJlVGV4dHVyZThfUmVsZWFzZShwKSAocCktPmxwVnRibC0+UmVsZWFzZShwKQ0KKyNkZWZpbmUgSURpcmVjdDNEQ3ViZVRleHR1cmU4X0dldERldmljZShwLGEpIChwKS0+bHBWdGJsLT5HZXREZXZpY2UocCxhKQ0KKyNkZWZpbmUgSURpcmVjdDNEQ3ViZVRleHR1cmU4X1NldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkgKHApLT5scFZ0YmwtPlNldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkNCisjZGVmaW5lIElEaXJlY3QzREN1YmVUZXh0dXJlOF9HZXRQcml2YXRlRGF0YShwLGEsYixjKSAocCktPmxwVnRibC0+R2V0UHJpdmF0ZURhdGEocCxhLGIsYykNCisjZGVmaW5lIElEaXJlY3QzREN1YmVUZXh0dXJlOF9GcmVlUHJpdmF0ZURhdGEocCxhKSAocCktPmxwVnRibC0+RnJlZVByaXZhdGVEYXRhKHAsYSkNCisjZGVmaW5lIElEaXJlY3QzREN1YmVUZXh0dXJlOF9TZXRQcmlvcml0eShwLGEpIChwKS0+bHBWdGJsLT5TZXRQcmlvcml0eShwLGEpDQorI2RlZmluZSBJRGlyZWN0M0RDdWJlVGV4dHVyZThfR2V0UHJpb3JpdHkocCkgKHApLT5scFZ0YmwtPkdldFByaW9yaXR5KHApDQorI2RlZmluZSBJRGlyZWN0M0RDdWJlVGV4dHVyZThfUHJlTG9hZChwKSAocCktPmxwVnRibC0+UHJlTG9hZChwKQ0KKyNkZWZpbmUgSURpcmVjdDNEQ3ViZVRleHR1cmU4X0dldFR5cGUocCkgKHApLT5scFZ0YmwtPkdldFR5cGUocCkNCisjZGVmaW5lIElEaXJlY3QzREN1YmVUZXh0dXJlOF9TZXRMT0QocCxhKSAocCktPmxwVnRibC0+U2V0TE9EKHAsYSkNCisjZGVmaW5lIElEaXJlY3QzREN1YmVUZXh0dXJlOF9HZXRMT0QocCkgKHApLT5scFZ0YmwtPkdldExPRChwKQ0KKyNkZWZpbmUgSURpcmVjdDNEQ3ViZVRleHR1cmU4X0dldExldmVsQ291bnQocCkgKHApLT5scFZ0YmwtPkdldExldmVsQ291bnQocCkNCisjZGVmaW5lIElEaXJlY3QzREN1YmVUZXh0dXJlOF9HZXRMZXZlbERlc2MocCxhLGIpIChwKS0+bHBWdGJsLT5HZXRMZXZlbERlc2MocCxhLGIpDQorI2RlZmluZSBJRGlyZWN0M0RDdWJlVGV4dHVyZThfR2V0Q3ViZU1hcFN1cmZhY2UocCxhLGIsYykgKHApLT5scFZ0YmwtPkdldEN1YmVNYXBTdXJmYWNlKHAsYSxiLGMpDQorI2RlZmluZSBJRGlyZWN0M0RDdWJlVGV4dHVyZThfTG9ja1JlY3QocCxhLGIsYyxkLGUpIChwKS0+bHBWdGJsLT5Mb2NrUmVjdChwLGEsYixjLGQsZSkNCisjZGVmaW5lIElEaXJlY3QzREN1YmVUZXh0dXJlOF9VbmxvY2tSZWN0KHAsYSxiKSAocCktPmxwVnRibC0+VW5sb2NrUmVjdChwLGEsYikNCisjZGVmaW5lIElEaXJlY3QzREN1YmVUZXh0dXJlOF9BZGREaXJ0eVJlY3QocCxhLGIpIChwKS0+bHBWdGJsLT5BZGREaXJ0eVJlY3QocCxhLGIpDQorI2Vsc2UNCisjZGVmaW5lIElEaXJlY3QzREN1YmVUZXh0dXJlOF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5RdWVyeUludGVyZmFjZShhLGIpDQorI2RlZmluZSBJRGlyZWN0M0RDdWJlVGV4dHVyZThfQWRkUmVmKHApIChwKS0+QWRkUmVmKCkNCisjZGVmaW5lIElEaXJlY3QzREN1YmVUZXh0dXJlOF9SZWxlYXNlKHApIChwKS0+UmVsZWFzZSgpDQorI2RlZmluZSBJRGlyZWN0M0RDdWJlVGV4dHVyZThfR2V0RGV2aWNlKHAsYSkgKHApLT5HZXREZXZpY2UoYSkNCisjZGVmaW5lIElEaXJlY3QzREN1YmVUZXh0dXJlOF9TZXRQcml2YXRlRGF0YShwLGEsYixjLGQpIChwKS0+U2V0UHJpdmF0ZURhdGEoYSxiLGMsZCkNCisjZGVmaW5lIElEaXJlY3QzREN1YmVUZXh0dXJlOF9HZXRQcml2YXRlRGF0YShwLGEsYixjKSAocCktPkdldFByaXZhdGVEYXRhKGEsYixjKQ0KKyNkZWZpbmUgSURpcmVjdDNEQ3ViZVRleHR1cmU4X0ZyZWVQcml2YXRlRGF0YShwLGEpIChwKS0+RnJlZVByaXZhdGVEYXRhKGEpDQorI2RlZmluZSBJRGlyZWN0M0RDdWJlVGV4dHVyZThfU2V0UHJpb3JpdHkocCxhKSAocCktPlNldFByaW9yaXR5KGEpDQorI2RlZmluZSBJRGlyZWN0M0RDdWJlVGV4dHVyZThfR2V0UHJpb3JpdHkocCkgKHApLT5HZXRQcmlvcml0eSgpDQorI2RlZmluZSBJRGlyZWN0M0RDdWJlVGV4dHVyZThfUHJlTG9hZChwKSAocCktPlByZUxvYWQoKQ0KKyNkZWZpbmUgSURpcmVjdDNEQ3ViZVRleHR1cmU4X0dldFR5cGUocCkgKHApLT5HZXRUeXBlKCkNCisjZGVmaW5lIElEaXJlY3QzREN1YmVUZXh0dXJlOF9TZXRMT0QocCxhKSAocCktPlNldExPRChhKQ0KKyNkZWZpbmUgSURpcmVjdDNEQ3ViZVRleHR1cmU4X0dldExPRChwKSAocCktPkdldExPRCgpDQorI2RlZmluZSBJRGlyZWN0M0RDdWJlVGV4dHVyZThfR2V0TGV2ZWxDb3VudChwKSAocCktPkdldExldmVsQ291bnQoKQ0KKyNkZWZpbmUgSURpcmVjdDNEQ3ViZVRleHR1cmU4X0dldExldmVsRGVzYyhwLGEsYikgKHApLT5HZXRMZXZlbERlc2MoYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNEQ3ViZVRleHR1cmU4X0dldEN1YmVNYXBTdXJmYWNlKHAsYSxiLGMpIChwKS0+R2V0Q3ViZU1hcFN1cmZhY2UoYSxiLGMpDQorI2RlZmluZSBJRGlyZWN0M0RDdWJlVGV4dHVyZThfTG9ja1JlY3QocCxhLGIsYyxkLGUpIChwKS0+TG9ja1JlY3QoYSxiLGMsZCxlKQ0KKyNkZWZpbmUgSURpcmVjdDNEQ3ViZVRleHR1cmU4X1VubG9ja1JlY3QocCxhLGIpIChwKS0+VW5sb2NrUmVjdChhLGIpDQorI2RlZmluZSBJRGlyZWN0M0RDdWJlVGV4dHVyZThfQWRkRGlydHlSZWN0KHAsYSxiKSAocCktPkFkZERpcnR5UmVjdChhLGIpDQorI2VuZGlmDQorDQorDQorDQorDQorI3VuZGVmIElOVEVSRkFDRQ0KKyNkZWZpbmUgSU5URVJGQUNFIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjgNCisNCitERUNMQVJFX0lOVEVSRkFDRV8oSURpcmVjdDNEVmVydGV4QnVmZmVyOCwgSURpcmVjdDNEUmVzb3VyY2U4KQ0KK3sNCisgICAgLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8NCisgICAgU1RETUVUSE9EKFF1ZXJ5SW50ZXJmYWNlKShUSElTXyBSRUZJSUQgcmlpZCwgdm9pZCoqIHBwdk9iaikgUFVSRTsNCisgICAgU1RETUVUSE9EXyhVTE9ORyxBZGRSZWYpKFRISVMpIFBVUkU7DQorICAgIFNURE1FVEhPRF8oVUxPTkcsUmVsZWFzZSkoVEhJUykgUFVSRTsNCisNCisgICAgLyoqKiBJRGlyZWN0M0RSZXNvdXJjZTggbWV0aG9kcyAqKiovDQorICAgIFNURE1FVEhPRChHZXREZXZpY2UpKFRISVNfIElEaXJlY3QzRERldmljZTgqKiBwcERldmljZSkgUFVSRTsNCisgICAgU1RETUVUSE9EKFNldFByaXZhdGVEYXRhKShUSElTXyBSRUZHVUlEIHJlZmd1aWQsQ09OU1Qgdm9pZCogcERhdGEsRFdPUkQgU2l6ZU9mRGF0YSxEV09SRCBGbGFncykgUFVSRTsNCisgICAgU1RETUVUSE9EKEdldFByaXZhdGVEYXRhKShUSElTXyBSRUZHVUlEIHJlZmd1aWQsdm9pZCogcERhdGEsRFdPUkQqIHBTaXplT2ZEYXRhKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoRnJlZVByaXZhdGVEYXRhKShUSElTXyBSRUZHVUlEIHJlZmd1aWQpIFBVUkU7DQorICAgIFNURE1FVEhPRF8oRFdPUkQsIFNldFByaW9yaXR5KShUSElTXyBEV09SRCBQcmlvcml0eU5ldykgUFVSRTsNCisgICAgU1RETUVUSE9EXyhEV09SRCwgR2V0UHJpb3JpdHkpKFRISVMpIFBVUkU7DQorICAgIFNURE1FVEhPRF8odm9pZCwgUHJlTG9hZCkoVEhJUykgUFVSRTsNCisgICAgU1RETUVUSE9EXyhEM0RSRVNPVVJDRVRZUEUsIEdldFR5cGUpKFRISVMpIFBVUkU7DQorICAgIFNURE1FVEhPRChMb2NrKShUSElTXyBVSU5UIE9mZnNldFRvTG9jayxVSU5UIFNpemVUb0xvY2ssQllURSoqIHBwYkRhdGEsRFdPUkQgRmxhZ3MpIFBVUkU7DQorICAgIFNURE1FVEhPRChVbmxvY2spKFRISVMpIFBVUkU7DQorICAgIFNURE1FVEhPRChHZXREZXNjKShUSElTXyBEM0RWRVJURVhCVUZGRVJfREVTQyAqcERlc2MpIFBVUkU7DQorfTsNCisNCit0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4ICpMUERJUkVDVDNEVkVSVEVYQlVGRkVSOCwgKlBESVJFQ1QzRFZFUlRFWEJVRkZFUjg7DQorDQorI2lmICFkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKENJTlRFUkZBQ0UpDQorI2RlZmluZSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4X1F1ZXJ5SW50ZXJmYWNlKHAsYSxiKSAocCktPmxwVnRibC0+UXVlcnlJbnRlcmZhY2UocCxhLGIpDQorI2RlZmluZSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4X0FkZFJlZihwKSAocCktPmxwVnRibC0+QWRkUmVmKHApDQorI2RlZmluZSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4X1JlbGVhc2UocCkgKHApLT5scFZ0YmwtPlJlbGVhc2UocCkNCisjZGVmaW5lIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjhfR2V0RGV2aWNlKHAsYSkgKHApLT5scFZ0YmwtPkdldERldmljZShwLGEpDQorI2RlZmluZSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4X1NldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkgKHApLT5scFZ0YmwtPlNldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkNCisjZGVmaW5lIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjhfR2V0UHJpdmF0ZURhdGEocCxhLGIsYykgKHApLT5scFZ0YmwtPkdldFByaXZhdGVEYXRhKHAsYSxiLGMpDQorI2RlZmluZSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4X0ZyZWVQcml2YXRlRGF0YShwLGEpIChwKS0+bHBWdGJsLT5GcmVlUHJpdmF0ZURhdGEocCxhKQ0KKyNkZWZpbmUgSURpcmVjdDNEVmVydGV4QnVmZmVyOF9TZXRQcmlvcml0eShwLGEpIChwKS0+bHBWdGJsLT5TZXRQcmlvcml0eShwLGEpDQorI2RlZmluZSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4X0dldFByaW9yaXR5KHApIChwKS0+bHBWdGJsLT5HZXRQcmlvcml0eShwKQ0KKyNkZWZpbmUgSURpcmVjdDNEVmVydGV4QnVmZmVyOF9QcmVMb2FkKHApIChwKS0+bHBWdGJsLT5QcmVMb2FkKHApDQorI2RlZmluZSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4X0dldFR5cGUocCkgKHApLT5scFZ0YmwtPkdldFR5cGUocCkNCisjZGVmaW5lIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjhfTG9jayhwLGEsYixjLGQpIChwKS0+bHBWdGJsLT5Mb2NrKHAsYSxiLGMsZCkNCisjZGVmaW5lIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjhfVW5sb2NrKHApIChwKS0+bHBWdGJsLT5VbmxvY2socCkNCisjZGVmaW5lIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjhfR2V0RGVzYyhwLGEpIChwKS0+bHBWdGJsLT5HZXREZXNjKHAsYSkNCisjZWxzZQ0KKyNkZWZpbmUgSURpcmVjdDNEVmVydGV4QnVmZmVyOF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5RdWVyeUludGVyZmFjZShhLGIpDQorI2RlZmluZSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4X0FkZFJlZihwKSAocCktPkFkZFJlZigpDQorI2RlZmluZSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4X1JlbGVhc2UocCkgKHApLT5SZWxlYXNlKCkNCisjZGVmaW5lIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjhfR2V0RGV2aWNlKHAsYSkgKHApLT5HZXREZXZpY2UoYSkNCisjZGVmaW5lIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjhfU2V0UHJpdmF0ZURhdGEocCxhLGIsYyxkKSAocCktPlNldFByaXZhdGVEYXRhKGEsYixjLGQpDQorI2RlZmluZSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4X0dldFByaXZhdGVEYXRhKHAsYSxiLGMpIChwKS0+R2V0UHJpdmF0ZURhdGEoYSxiLGMpDQorI2RlZmluZSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4X0ZyZWVQcml2YXRlRGF0YShwLGEpIChwKS0+RnJlZVByaXZhdGVEYXRhKGEpDQorI2RlZmluZSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4X1NldFByaW9yaXR5KHAsYSkgKHApLT5TZXRQcmlvcml0eShhKQ0KKyNkZWZpbmUgSURpcmVjdDNEVmVydGV4QnVmZmVyOF9HZXRQcmlvcml0eShwKSAocCktPkdldFByaW9yaXR5KCkNCisjZGVmaW5lIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjhfUHJlTG9hZChwKSAocCktPlByZUxvYWQoKQ0KKyNkZWZpbmUgSURpcmVjdDNEVmVydGV4QnVmZmVyOF9HZXRUeXBlKHApIChwKS0+R2V0VHlwZSgpDQorI2RlZmluZSBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4X0xvY2socCxhLGIsYyxkKSAocCktPkxvY2soYSxiLGMsZCkNCisjZGVmaW5lIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjhfVW5sb2NrKHApIChwKS0+VW5sb2NrKCkNCisjZGVmaW5lIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjhfR2V0RGVzYyhwLGEpIChwKS0+R2V0RGVzYyhhKQ0KKyNlbmRpZg0KKw0KKw0KKw0KKw0KKyN1bmRlZiBJTlRFUkZBQ0UNCisjZGVmaW5lIElOVEVSRkFDRSBJRGlyZWN0M0RJbmRleEJ1ZmZlcjgNCisNCitERUNMQVJFX0lOVEVSRkFDRV8oSURpcmVjdDNESW5kZXhCdWZmZXI4LCBJRGlyZWN0M0RSZXNvdXJjZTgpDQorew0KKyAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLw0KKyAgICBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpKFRISVNfIFJFRklJRCByaWlkLCB2b2lkKiogcHB2T2JqKSBQVVJFOw0KKyAgICBTVERNRVRIT0RfKFVMT05HLEFkZFJlZikoVEhJUykgUFVSRTsNCisgICAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKShUSElTKSBQVVJFOw0KKw0KKyAgICAvKioqIElEaXJlY3QzRFJlc291cmNlOCBtZXRob2RzICoqKi8NCisgICAgU1RETUVUSE9EKEdldERldmljZSkoVEhJU18gSURpcmVjdDNERGV2aWNlOCoqIHBwRGV2aWNlKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoU2V0UHJpdmF0ZURhdGEpKFRISVNfIFJFRkdVSUQgcmVmZ3VpZCxDT05TVCB2b2lkKiBwRGF0YSxEV09SRCBTaXplT2ZEYXRhLERXT1JEIEZsYWdzKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoR2V0UHJpdmF0ZURhdGEpKFRISVNfIFJFRkdVSUQgcmVmZ3VpZCx2b2lkKiBwRGF0YSxEV09SRCogcFNpemVPZkRhdGEpIFBVUkU7DQorICAgIFNURE1FVEhPRChGcmVlUHJpdmF0ZURhdGEpKFRISVNfIFJFRkdVSUQgcmVmZ3VpZCkgUFVSRTsNCisgICAgU1RETUVUSE9EXyhEV09SRCwgU2V0UHJpb3JpdHkpKFRISVNfIERXT1JEIFByaW9yaXR5TmV3KSBQVVJFOw0KKyAgICBTVERNRVRIT0RfKERXT1JELCBHZXRQcmlvcml0eSkoVEhJUykgUFVSRTsNCisgICAgU1RETUVUSE9EXyh2b2lkLCBQcmVMb2FkKShUSElTKSBQVVJFOw0KKyAgICBTVERNRVRIT0RfKEQzRFJFU09VUkNFVFlQRSwgR2V0VHlwZSkoVEhJUykgUFVSRTsNCisgICAgU1RETUVUSE9EKExvY2spKFRISVNfIFVJTlQgT2Zmc2V0VG9Mb2NrLFVJTlQgU2l6ZVRvTG9jayxCWVRFKiogcHBiRGF0YSxEV09SRCBGbGFncykgUFVSRTsNCisgICAgU1RETUVUSE9EKFVubG9jaykoVEhJUykgUFVSRTsNCisgICAgU1RETUVUSE9EKEdldERlc2MpKFRISVNfIEQzRElOREVYQlVGRkVSX0RFU0MgKnBEZXNjKSBQVVJFOw0KK307DQorDQordHlwZWRlZiBzdHJ1Y3QgSURpcmVjdDNESW5kZXhCdWZmZXI4ICpMUERJUkVDVDNESU5ERVhCVUZGRVI4LCAqUERJUkVDVDNESU5ERVhCVUZGRVI4Ow0KKw0KKyNpZiAhZGVmaW5lZChfX2NwbHVzcGx1cykgfHwgZGVmaW5lZChDSU5URVJGQUNFKQ0KKyNkZWZpbmUgSURpcmVjdDNESW5kZXhCdWZmZXI4X1F1ZXJ5SW50ZXJmYWNlKHAsYSxiKSAocCktPmxwVnRibC0+UXVlcnlJbnRlcmZhY2UocCxhLGIpDQorI2RlZmluZSBJRGlyZWN0M0RJbmRleEJ1ZmZlcjhfQWRkUmVmKHApIChwKS0+bHBWdGJsLT5BZGRSZWYocCkNCisjZGVmaW5lIElEaXJlY3QzREluZGV4QnVmZmVyOF9SZWxlYXNlKHApIChwKS0+bHBWdGJsLT5SZWxlYXNlKHApDQorI2RlZmluZSBJRGlyZWN0M0RJbmRleEJ1ZmZlcjhfR2V0RGV2aWNlKHAsYSkgKHApLT5scFZ0YmwtPkdldERldmljZShwLGEpDQorI2RlZmluZSBJRGlyZWN0M0RJbmRleEJ1ZmZlcjhfU2V0UHJpdmF0ZURhdGEocCxhLGIsYyxkKSAocCktPmxwVnRibC0+U2V0UHJpdmF0ZURhdGEocCxhLGIsYyxkKQ0KKyNkZWZpbmUgSURpcmVjdDNESW5kZXhCdWZmZXI4X0dldFByaXZhdGVEYXRhKHAsYSxiLGMpIChwKS0+bHBWdGJsLT5HZXRQcml2YXRlRGF0YShwLGEsYixjKQ0KKyNkZWZpbmUgSURpcmVjdDNESW5kZXhCdWZmZXI4X0ZyZWVQcml2YXRlRGF0YShwLGEpIChwKS0+bHBWdGJsLT5GcmVlUHJpdmF0ZURhdGEocCxhKQ0KKyNkZWZpbmUgSURpcmVjdDNESW5kZXhCdWZmZXI4X1NldFByaW9yaXR5KHAsYSkgKHApLT5scFZ0YmwtPlNldFByaW9yaXR5KHAsYSkNCisjZGVmaW5lIElEaXJlY3QzREluZGV4QnVmZmVyOF9HZXRQcmlvcml0eShwKSAocCktPmxwVnRibC0+R2V0UHJpb3JpdHkocCkNCisjZGVmaW5lIElEaXJlY3QzREluZGV4QnVmZmVyOF9QcmVMb2FkKHApIChwKS0+bHBWdGJsLT5QcmVMb2FkKHApDQorI2RlZmluZSBJRGlyZWN0M0RJbmRleEJ1ZmZlcjhfR2V0VHlwZShwKSAocCktPmxwVnRibC0+R2V0VHlwZShwKQ0KKyNkZWZpbmUgSURpcmVjdDNESW5kZXhCdWZmZXI4X0xvY2socCxhLGIsYyxkKSAocCktPmxwVnRibC0+TG9jayhwLGEsYixjLGQpDQorI2RlZmluZSBJRGlyZWN0M0RJbmRleEJ1ZmZlcjhfVW5sb2NrKHApIChwKS0+bHBWdGJsLT5VbmxvY2socCkNCisjZGVmaW5lIElEaXJlY3QzREluZGV4QnVmZmVyOF9HZXREZXNjKHAsYSkgKHApLT5scFZ0YmwtPkdldERlc2MocCxhKQ0KKyNlbHNlDQorI2RlZmluZSBJRGlyZWN0M0RJbmRleEJ1ZmZlcjhfUXVlcnlJbnRlcmZhY2UocCxhLGIpIChwKS0+UXVlcnlJbnRlcmZhY2UoYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNESW5kZXhCdWZmZXI4X0FkZFJlZihwKSAocCktPkFkZFJlZigpDQorI2RlZmluZSBJRGlyZWN0M0RJbmRleEJ1ZmZlcjhfUmVsZWFzZShwKSAocCktPlJlbGVhc2UoKQ0KKyNkZWZpbmUgSURpcmVjdDNESW5kZXhCdWZmZXI4X0dldERldmljZShwLGEpIChwKS0+R2V0RGV2aWNlKGEpDQorI2RlZmluZSBJRGlyZWN0M0RJbmRleEJ1ZmZlcjhfU2V0UHJpdmF0ZURhdGEocCxhLGIsYyxkKSAocCktPlNldFByaXZhdGVEYXRhKGEsYixjLGQpDQorI2RlZmluZSBJRGlyZWN0M0RJbmRleEJ1ZmZlcjhfR2V0UHJpdmF0ZURhdGEocCxhLGIsYykgKHApLT5HZXRQcml2YXRlRGF0YShhLGIsYykNCisjZGVmaW5lIElEaXJlY3QzREluZGV4QnVmZmVyOF9GcmVlUHJpdmF0ZURhdGEocCxhKSAocCktPkZyZWVQcml2YXRlRGF0YShhKQ0KKyNkZWZpbmUgSURpcmVjdDNESW5kZXhCdWZmZXI4X1NldFByaW9yaXR5KHAsYSkgKHApLT5TZXRQcmlvcml0eShhKQ0KKyNkZWZpbmUgSURpcmVjdDNESW5kZXhCdWZmZXI4X0dldFByaW9yaXR5KHApIChwKS0+R2V0UHJpb3JpdHkoKQ0KKyNkZWZpbmUgSURpcmVjdDNESW5kZXhCdWZmZXI4X1ByZUxvYWQocCkgKHApLT5QcmVMb2FkKCkNCisjZGVmaW5lIElEaXJlY3QzREluZGV4QnVmZmVyOF9HZXRUeXBlKHApIChwKS0+R2V0VHlwZSgpDQorI2RlZmluZSBJRGlyZWN0M0RJbmRleEJ1ZmZlcjhfTG9jayhwLGEsYixjLGQpIChwKS0+TG9jayhhLGIsYyxkKQ0KKyNkZWZpbmUgSURpcmVjdDNESW5kZXhCdWZmZXI4X1VubG9jayhwKSAocCktPlVubG9jaygpDQorI2RlZmluZSBJRGlyZWN0M0RJbmRleEJ1ZmZlcjhfR2V0RGVzYyhwLGEpIChwKS0+R2V0RGVzYyhhKQ0KKyNlbmRpZg0KKw0KKw0KKw0KKw0KKyN1bmRlZiBJTlRFUkZBQ0UNCisjZGVmaW5lIElOVEVSRkFDRSBJRGlyZWN0M0RTdXJmYWNlOA0KKw0KK0RFQ0xBUkVfSU5URVJGQUNFXyhJRGlyZWN0M0RTdXJmYWNlOCwgSVVua25vd24pDQorew0KKyAgICAvKioqIElVbmtub3duIG1ldGhvZHMgKioqLw0KKyAgICBTVERNRVRIT0QoUXVlcnlJbnRlcmZhY2UpKFRISVNfIFJFRklJRCByaWlkLCB2b2lkKiogcHB2T2JqKSBQVVJFOw0KKyAgICBTVERNRVRIT0RfKFVMT05HLEFkZFJlZikoVEhJUykgUFVSRTsNCisgICAgU1RETUVUSE9EXyhVTE9ORyxSZWxlYXNlKShUSElTKSBQVVJFOw0KKw0KKyAgICAvKioqIElEaXJlY3QzRFN1cmZhY2U4IG1ldGhvZHMgKioqLw0KKyAgICBTVERNRVRIT0QoR2V0RGV2aWNlKShUSElTXyBJRGlyZWN0M0REZXZpY2U4KiogcHBEZXZpY2UpIFBVUkU7DQorICAgIFNURE1FVEhPRChTZXRQcml2YXRlRGF0YSkoVEhJU18gUkVGR1VJRCByZWZndWlkLENPTlNUIHZvaWQqIHBEYXRhLERXT1JEIFNpemVPZkRhdGEsRFdPUkQgRmxhZ3MpIFBVUkU7DQorICAgIFNURE1FVEhPRChHZXRQcml2YXRlRGF0YSkoVEhJU18gUkVGR1VJRCByZWZndWlkLHZvaWQqIHBEYXRhLERXT1JEKiBwU2l6ZU9mRGF0YSkgUFVSRTsNCisgICAgU1RETUVUSE9EKEZyZWVQcml2YXRlRGF0YSkoVEhJU18gUkVGR1VJRCByZWZndWlkKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoR2V0Q29udGFpbmVyKShUSElTXyBSRUZJSUQgcmlpZCx2b2lkKiogcHBDb250YWluZXIpIFBVUkU7DQorICAgIFNURE1FVEhPRChHZXREZXNjKShUSElTXyBEM0RTVVJGQUNFX0RFU0MgKnBEZXNjKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoTG9ja1JlY3QpKFRISVNfIEQzRExPQ0tFRF9SRUNUKiBwTG9ja2VkUmVjdCxDT05TVCBSRUNUKiBwUmVjdCxEV09SRCBGbGFncykgUFVSRTsNCisgICAgU1RETUVUSE9EKFVubG9ja1JlY3QpKFRISVMpIFBVUkU7DQorfTsNCisNCit0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0RTdXJmYWNlOCAqTFBESVJFQ1QzRFNVUkZBQ0U4LCAqUERJUkVDVDNEU1VSRkFDRTg7DQorDQorI2lmICFkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKENJTlRFUkZBQ0UpDQorI2RlZmluZSBJRGlyZWN0M0RTdXJmYWNlOF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5scFZ0YmwtPlF1ZXJ5SW50ZXJmYWNlKHAsYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNEU3VyZmFjZThfQWRkUmVmKHApIChwKS0+bHBWdGJsLT5BZGRSZWYocCkNCisjZGVmaW5lIElEaXJlY3QzRFN1cmZhY2U4X1JlbGVhc2UocCkgKHApLT5scFZ0YmwtPlJlbGVhc2UocCkNCisjZGVmaW5lIElEaXJlY3QzRFN1cmZhY2U4X0dldERldmljZShwLGEpIChwKS0+bHBWdGJsLT5HZXREZXZpY2UocCxhKQ0KKyNkZWZpbmUgSURpcmVjdDNEU3VyZmFjZThfU2V0UHJpdmF0ZURhdGEocCxhLGIsYyxkKSAocCktPmxwVnRibC0+U2V0UHJpdmF0ZURhdGEocCxhLGIsYyxkKQ0KKyNkZWZpbmUgSURpcmVjdDNEU3VyZmFjZThfR2V0UHJpdmF0ZURhdGEocCxhLGIsYykgKHApLT5scFZ0YmwtPkdldFByaXZhdGVEYXRhKHAsYSxiLGMpDQorI2RlZmluZSBJRGlyZWN0M0RTdXJmYWNlOF9GcmVlUHJpdmF0ZURhdGEocCxhKSAocCktPmxwVnRibC0+RnJlZVByaXZhdGVEYXRhKHAsYSkNCisjZGVmaW5lIElEaXJlY3QzRFN1cmZhY2U4X0dldENvbnRhaW5lcihwLGEsYikgKHApLT5scFZ0YmwtPkdldENvbnRhaW5lcihwLGEsYikNCisjZGVmaW5lIElEaXJlY3QzRFN1cmZhY2U4X0dldERlc2MocCxhKSAocCktPmxwVnRibC0+R2V0RGVzYyhwLGEpDQorI2RlZmluZSBJRGlyZWN0M0RTdXJmYWNlOF9Mb2NrUmVjdChwLGEsYixjKSAocCktPmxwVnRibC0+TG9ja1JlY3QocCxhLGIsYykNCisjZGVmaW5lIElEaXJlY3QzRFN1cmZhY2U4X1VubG9ja1JlY3QocCkgKHApLT5scFZ0YmwtPlVubG9ja1JlY3QocCkNCisjZWxzZQ0KKyNkZWZpbmUgSURpcmVjdDNEU3VyZmFjZThfUXVlcnlJbnRlcmZhY2UocCxhLGIpIChwKS0+UXVlcnlJbnRlcmZhY2UoYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNEU3VyZmFjZThfQWRkUmVmKHApIChwKS0+QWRkUmVmKCkNCisjZGVmaW5lIElEaXJlY3QzRFN1cmZhY2U4X1JlbGVhc2UocCkgKHApLT5SZWxlYXNlKCkNCisjZGVmaW5lIElEaXJlY3QzRFN1cmZhY2U4X0dldERldmljZShwLGEpIChwKS0+R2V0RGV2aWNlKGEpDQorI2RlZmluZSBJRGlyZWN0M0RTdXJmYWNlOF9TZXRQcml2YXRlRGF0YShwLGEsYixjLGQpIChwKS0+U2V0UHJpdmF0ZURhdGEoYSxiLGMsZCkNCisjZGVmaW5lIElEaXJlY3QzRFN1cmZhY2U4X0dldFByaXZhdGVEYXRhKHAsYSxiLGMpIChwKS0+R2V0UHJpdmF0ZURhdGEoYSxiLGMpDQorI2RlZmluZSBJRGlyZWN0M0RTdXJmYWNlOF9GcmVlUHJpdmF0ZURhdGEocCxhKSAocCktPkZyZWVQcml2YXRlRGF0YShhKQ0KKyNkZWZpbmUgSURpcmVjdDNEU3VyZmFjZThfR2V0Q29udGFpbmVyKHAsYSxiKSAocCktPkdldENvbnRhaW5lcihhLGIpDQorI2RlZmluZSBJRGlyZWN0M0RTdXJmYWNlOF9HZXREZXNjKHAsYSkgKHApLT5HZXREZXNjKGEpDQorI2RlZmluZSBJRGlyZWN0M0RTdXJmYWNlOF9Mb2NrUmVjdChwLGEsYixjKSAocCktPkxvY2tSZWN0KGEsYixjKQ0KKyNkZWZpbmUgSURpcmVjdDNEU3VyZmFjZThfVW5sb2NrUmVjdChwKSAocCktPlVubG9ja1JlY3QoKQ0KKyNlbmRpZg0KKw0KKw0KKw0KKw0KKyN1bmRlZiBJTlRFUkZBQ0UNCisjZGVmaW5lIElOVEVSRkFDRSBJRGlyZWN0M0RWb2x1bWU4DQorDQorREVDTEFSRV9JTlRFUkZBQ0VfKElEaXJlY3QzRFZvbHVtZTgsIElVbmtub3duKQ0KK3sNCisgICAgLyoqKiBJVW5rbm93biBtZXRob2RzICoqKi8NCisgICAgU1RETUVUSE9EKFF1ZXJ5SW50ZXJmYWNlKShUSElTXyBSRUZJSUQgcmlpZCwgdm9pZCoqIHBwdk9iaikgUFVSRTsNCisgICAgU1RETUVUSE9EXyhVTE9ORyxBZGRSZWYpKFRISVMpIFBVUkU7DQorICAgIFNURE1FVEhPRF8oVUxPTkcsUmVsZWFzZSkoVEhJUykgUFVSRTsNCisNCisgICAgLyoqKiBJRGlyZWN0M0RWb2x1bWU4IG1ldGhvZHMgKioqLw0KKyAgICBTVERNRVRIT0QoR2V0RGV2aWNlKShUSElTXyBJRGlyZWN0M0REZXZpY2U4KiogcHBEZXZpY2UpIFBVUkU7DQorICAgIFNURE1FVEhPRChTZXRQcml2YXRlRGF0YSkoVEhJU18gUkVGR1VJRCByZWZndWlkLENPTlNUIHZvaWQqIHBEYXRhLERXT1JEIFNpemVPZkRhdGEsRFdPUkQgRmxhZ3MpIFBVUkU7DQorICAgIFNURE1FVEhPRChHZXRQcml2YXRlRGF0YSkoVEhJU18gUkVGR1VJRCByZWZndWlkLHZvaWQqIHBEYXRhLERXT1JEKiBwU2l6ZU9mRGF0YSkgUFVSRTsNCisgICAgU1RETUVUSE9EKEZyZWVQcml2YXRlRGF0YSkoVEhJU18gUkVGR1VJRCByZWZndWlkKSBQVVJFOw0KKyAgICBTVERNRVRIT0QoR2V0Q29udGFpbmVyKShUSElTXyBSRUZJSUQgcmlpZCx2b2lkKiogcHBDb250YWluZXIpIFBVUkU7DQorICAgIFNURE1FVEhPRChHZXREZXNjKShUSElTXyBEM0RWT0xVTUVfREVTQyAqcERlc2MpIFBVUkU7DQorICAgIFNURE1FVEhPRChMb2NrQm94KShUSElTXyBEM0RMT0NLRURfQk9YICogcExvY2tlZFZvbHVtZSxDT05TVCBEM0RCT1gqIHBCb3gsRFdPUkQgRmxhZ3MpIFBVUkU7DQorICAgIFNURE1FVEhPRChVbmxvY2tCb3gpKFRISVMpIFBVUkU7DQorfTsNCisNCit0eXBlZGVmIHN0cnVjdCBJRGlyZWN0M0RWb2x1bWU4ICpMUERJUkVDVDNEVk9MVU1FOCwgKlBESVJFQ1QzRFZPTFVNRTg7DQorDQorI2lmICFkZWZpbmVkKF9fY3BsdXNwbHVzKSB8fCBkZWZpbmVkKENJTlRFUkZBQ0UpDQorI2RlZmluZSBJRGlyZWN0M0RWb2x1bWU4X1F1ZXJ5SW50ZXJmYWNlKHAsYSxiKSAocCktPmxwVnRibC0+UXVlcnlJbnRlcmZhY2UocCxhLGIpDQorI2RlZmluZSBJRGlyZWN0M0RWb2x1bWU4X0FkZFJlZihwKSAocCktPmxwVnRibC0+QWRkUmVmKHApDQorI2RlZmluZSBJRGlyZWN0M0RWb2x1bWU4X1JlbGVhc2UocCkgKHApLT5scFZ0YmwtPlJlbGVhc2UocCkNCisjZGVmaW5lIElEaXJlY3QzRFZvbHVtZThfR2V0RGV2aWNlKHAsYSkgKHApLT5scFZ0YmwtPkdldERldmljZShwLGEpDQorI2RlZmluZSBJRGlyZWN0M0RWb2x1bWU4X1NldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkgKHApLT5scFZ0YmwtPlNldFByaXZhdGVEYXRhKHAsYSxiLGMsZCkNCisjZGVmaW5lIElEaXJlY3QzRFZvbHVtZThfR2V0UHJpdmF0ZURhdGEocCxhLGIsYykgKHApLT5scFZ0YmwtPkdldFByaXZhdGVEYXRhKHAsYSxiLGMpDQorI2RlZmluZSBJRGlyZWN0M0RWb2x1bWU4X0ZyZWVQcml2YXRlRGF0YShwLGEpIChwKS0+bHBWdGJsLT5GcmVlUHJpdmF0ZURhdGEocCxhKQ0KKyNkZWZpbmUgSURpcmVjdDNEVm9sdW1lOF9HZXRDb250YWluZXIocCxhLGIpIChwKS0+bHBWdGJsLT5HZXRDb250YWluZXIocCxhLGIpDQorI2RlZmluZSBJRGlyZWN0M0RWb2x1bWU4X0dldERlc2MocCxhKSAocCktPmxwVnRibC0+R2V0RGVzYyhwLGEpDQorI2RlZmluZSBJRGlyZWN0M0RWb2x1bWU4X0xvY2tCb3gocCxhLGIsYykgKHApLT5scFZ0YmwtPkxvY2tCb3gocCxhLGIsYykNCisjZGVmaW5lIElEaXJlY3QzRFZvbHVtZThfVW5sb2NrQm94KHApIChwKS0+bHBWdGJsLT5VbmxvY2tCb3gocCkNCisjZWxzZQ0KKyNkZWZpbmUgSURpcmVjdDNEVm9sdW1lOF9RdWVyeUludGVyZmFjZShwLGEsYikgKHApLT5RdWVyeUludGVyZmFjZShhLGIpDQorI2RlZmluZSBJRGlyZWN0M0RWb2x1bWU4X0FkZFJlZihwKSAocCktPkFkZFJlZigpDQorI2RlZmluZSBJRGlyZWN0M0RWb2x1bWU4X1JlbGVhc2UocCkgKHApLT5SZWxlYXNlKCkNCisjZGVmaW5lIElEaXJlY3QzRFZvbHVtZThfR2V0RGV2aWNlKHAsYSkgKHApLT5HZXREZXZpY2UoYSkNCisjZGVmaW5lIElEaXJlY3QzRFZvbHVtZThfU2V0UHJpdmF0ZURhdGEocCxhLGIsYyxkKSAocCktPlNldFByaXZhdGVEYXRhKGEsYixjLGQpDQorI2RlZmluZSBJRGlyZWN0M0RWb2x1bWU4X0dldFByaXZhdGVEYXRhKHAsYSxiLGMpIChwKS0+R2V0UHJpdmF0ZURhdGEoYSxiLGMpDQorI2RlZmluZSBJRGlyZWN0M0RWb2x1bWU4X0ZyZWVQcml2YXRlRGF0YShwLGEpIChwKS0+RnJlZVByaXZhdGVEYXRhKGEpDQorI2RlZmluZSBJRGlyZWN0M0RWb2x1bWU4X0dldENvbnRhaW5lcihwLGEsYikgKHApLT5HZXRDb250YWluZXIoYSxiKQ0KKyNkZWZpbmUgSURpcmVjdDNEVm9sdW1lOF9HZXREZXNjKHAsYSkgKHApLT5HZXREZXNjKGEpDQorI2RlZmluZSBJRGlyZWN0M0RWb2x1bWU4X0xvY2tCb3gocCxhLGIsYykgKHApLT5Mb2NrQm94KGEsYixjKQ0KKyNkZWZpbmUgSURpcmVjdDNEVm9sdW1lOF9VbmxvY2tCb3gocCkgKHApLT5VbmxvY2tCb3goKQ0KKyNlbmRpZg0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICogRmxhZ3MgZm9yIFNldFByaXZhdGVEYXRhIG1ldGhvZCBvbiBhbGwgRDNEOCBpbnRlcmZhY2VzDQorICoNCisgKiBUaGUgcGFzc2VkIHBvaW50ZXIgaXMgYW4gSVVua25vd24gcHRyLiBUaGUgU2l6ZU9mRGF0YSBhcmd1bWVudCB0byBTZXRQcml2YXRlRGF0YQ0KKyAqIG11c3QgYmUgc2V0IHRvIHNpemVvZihJVW5rbm93biopLiBEaXJlY3QzRCB3aWxsIGNhbGwgQWRkUmVmIHRocm91Z2ggdGhpcw0KKyAqIHBvaW50ZXIgYW5kIFJlbGVhc2Ugd2hlbiB0aGUgcHJpdmF0ZSBkYXRhIGlzIGRlc3Ryb3llZC4gVGhlIGRhdGEgd2lsbCBiZQ0KKyAqIGRlc3Ryb3llZCB3aGVuIGFub3RoZXIgU2V0UHJpdmF0ZURhdGEgd2l0aCB0aGUgc2FtZSBHVUlEIGlzIHNldCwgd2hlbg0KKyAqIEZyZWVQcml2YXRlRGF0YSBpcyBjYWxsZWQsIG9yIHdoZW4gdGhlIEQzRDggb2JqZWN0IGlzIGZyZWVkLg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKyNkZWZpbmUgRDNEU1BEX0lVTktOT1dOICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFMDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKg0KKyAqIFBhcmFtZXRlciBmb3IgSURpcmVjdDNEOCBFbnVtIGFuZCBHZXRDYXBzOCBmdW5jdGlvbnMgdG8gZ2V0IHRoZSBpbmZvIGZvcg0KKyAqIHRoZSBjdXJyZW50IG1vZGUgb25seS4NCisgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNkZWZpbmUgRDNEQ1VSUkVOVF9ESVNQTEFZX01PREUgICAgICAgICAgICAgICAgIDB4MDBFRkZGRkZMDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKg0KKyAqIEZsYWdzIGZvciBJRGlyZWN0M0Q4OjpDcmVhdGVEZXZpY2UncyBCZWhhdmlvckZsYWdzDQorICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjZGVmaW5lIEQzRENSRUFURV9GUFVfUFJFU0VSVkUgICAgICAgICAgICAgICAgICAweDAwMDAwMDAyTA0KKyNkZWZpbmUgRDNEQ1JFQVRFX01VTFRJVEhSRUFERUQgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDRMDQorDQorI2RlZmluZSBEM0RDUkVBVEVfUFVSRURFVklDRSAgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAxMEwNCisjZGVmaW5lIEQzRENSRUFURV9TT0ZUV0FSRV9WRVJURVhQUk9DRVNTSU5HICAgICAweDAwMDAwMDIwTA0KKyNkZWZpbmUgRDNEQ1JFQVRFX0hBUkRXQVJFX1ZFUlRFWFBST0NFU1NJTkcgICAgIDB4MDAwMDAwNDBMDQorI2RlZmluZSBEM0RDUkVBVEVfTUlYRURfVkVSVEVYUFJPQ0VTU0lORyAgICAgICAgMHgwMDAwMDA4MEwNCisNCisjZGVmaW5lIEQzRENSRUFURV9ESVNBQkxFX0RSSVZFUl9NQU5BR0VNRU5UICAgICAweDAwMDAwMTAwTA0KKw0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICoNCisgKiBQYXJhbWV0ZXIgZm9yIElEaXJlY3QzRDg6OkNyZWF0ZURldmljZSdzIGlBZGFwdGVyDQorICoNCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjZGVmaW5lIEQzREFEQVBURVJfREVGQVVMVCAgICAgICAgICAgICAgICAgICAgIDANCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqDQorICogRmxhZ3MgZm9yIElEaXJlY3QzRDg6OkVudW1BZGFwdGVycw0KKyAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2RlZmluZSBEM0RFTlVNX05PX1dIUUxfTEVWRUwgICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMkwNCisNCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKg0KKyAqDQorICogTWF4aW11bSBudW1iZXIgb2YgYmFjay1idWZmZXJzIHN1cHBvcnRlZCBpbiBEWDgNCisgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNkZWZpbmUgRDNEUFJFU0VOVF9CQUNLX0JVRkZFUlNfTUFYICAgICAgICAgICAgIDNMDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKg0KKyAqIEZsYWdzIGZvciBJRGlyZWN0M0REZXZpY2U4OjpTZXRHYW1tYVJhbXANCisgKg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKyNkZWZpbmUgRDNEU0dSX05PX0NBTElCUkFUSU9OICAgICAgICAgICAgICAgICAgMHgwMDAwMDAwMEwNCisjZGVmaW5lIEQzRFNHUl9DQUxJQlJBVEUgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDFMDQorDQorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioNCisgKg0KKyAqIEZsYWdzIGZvciBJRGlyZWN0M0REZXZpY2U4OjpTZXRDdXJzb3JQb3NpdGlvbg0KKyAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovDQorDQorI2RlZmluZSBEM0RDVVJTT1JfSU1NRURJQVRFX1VQREFURSAgICAgICAgICAgICAweDAwMDAwMDAxTA0KKw0KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqDQorICoNCisgKiBGbGFncyBmb3IgRHJhd1ByaW1pdGl2ZS9EcmF3SW5kZXhlZFByaW1pdGl2ZQ0KKyAqICAgQWxzbyB2YWxpZCBmb3IgQmVnaW4vQmVnaW5JbmRleGVkDQorICogICBBbHNvIHZhbGlkIGZvciBWZXJ0ZXhCdWZmZXI6OkNyZWF0ZVZlcnRleEJ1ZmZlcg0KKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLw0KKw0KKw0KKy8qDQorICogIERpcmVjdERyYXcgZXJyb3IgY29kZXMNCisgKi8NCisjZGVmaW5lIF9GQUNEM0QgIDB4ODc2DQorI2RlZmluZSBNQUtFX0QzREhSRVNVTFQoIGNvZGUgKSAgTUFLRV9IUkVTVUxUKCAxLCBfRkFDRDNELCBjb2RlICkNCisNCisvKg0KKyAqIERpcmVjdDNEIEVycm9ycw0KKyAqLw0KKyNkZWZpbmUgRDNEX09LICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU19PSw0KKw0KKyNkZWZpbmUgRDNERVJSX1dST05HVEVYVFVSRUZPUk1BVCAgICAgICAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMDcyKQ0KKyNkZWZpbmUgRDNERVJSX1VOU1VQUE9SVEVEQ09MT1JPUEVSQVRJT04gICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMDczKQ0KKyNkZWZpbmUgRDNERVJSX1VOU1VQUE9SVEVEQ09MT1JBUkcgICAgICAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMDc0KQ0KKyNkZWZpbmUgRDNERVJSX1VOU1VQUE9SVEVEQUxQSEFPUEVSQVRJT04gICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMDc1KQ0KKyNkZWZpbmUgRDNERVJSX1VOU1VQUE9SVEVEQUxQSEFBUkcgICAgICAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMDc2KQ0KKyNkZWZpbmUgRDNERVJSX1RPT01BTllPUEVSQVRJT05TICAgICAgICAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMDc3KQ0KKyNkZWZpbmUgRDNERVJSX0NPTkZMSUNUSU5HVEVYVFVSRUZJTFRFUiAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMDc4KQ0KKyNkZWZpbmUgRDNERVJSX1VOU1VQUE9SVEVERkFDVE9SVkFMVUUgICAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMDc5KQ0KKyNkZWZpbmUgRDNERVJSX0NPTkZMSUNUSU5HUkVOREVSU1RBVEUgICAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMDgxKQ0KKyNkZWZpbmUgRDNERVJSX1VOU1VQUE9SVEVEVEVYVFVSRUZJTFRFUiAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMDgyKQ0KKyNkZWZpbmUgRDNERVJSX0NPTkZMSUNUSU5HVEVYVFVSRVBBTEVUVEUgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMDg2KQ0KKyNkZWZpbmUgRDNERVJSX0RSSVZFUklOVEVSTkFMRVJST1IgICAgICAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMDg3KQ0KKw0KKyNkZWZpbmUgRDNERVJSX05PVEZPVU5EICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMTUwKQ0KKyNkZWZpbmUgRDNERVJSX01PUkVEQVRBICAgICAgICAgICAgICAgICAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMTUxKQ0KKyNkZWZpbmUgRDNERVJSX0RFVklDRUxPU1QgICAgICAgICAgICAgICAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMTUyKQ0KKyNkZWZpbmUgRDNERVJSX0RFVklDRU5PVFJFU0VUICAgICAgICAgICAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMTUzKQ0KKyNkZWZpbmUgRDNERVJSX05PVEFWQUlMQUJMRSAgICAgICAgICAgICAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgyMTU0KQ0KKyNkZWZpbmUgRDNERVJSX09VVE9GVklERU9NRU1PUlkgICAgICAgICAgICAgICAgIE1BS0VfRDNESFJFU1VMVCgzODApDQorI2RlZmluZSBEM0RFUlJfSU5WQUxJRERFVklDRSAgICAgICAgICAgICAgICAgICAgTUFLRV9EM0RIUkVTVUxUKDIxNTUpDQorI2RlZmluZSBEM0RFUlJfSU5WQUxJRENBTEwgICAgICAgICAgICAgICAgICAgICAgTUFLRV9EM0RIUkVTVUxUKDIxNTYpDQorI2RlZmluZSBEM0RFUlJfRFJJVkVSSU5WQUxJRENBTEwgICAgICAgICAgICAgICAgTUFLRV9EM0RIUkVTVUxUKDIxNTcpDQorDQorI2lmZGVmIF9fY3BsdXNwbHVzDQorfTsNCisjZW5kaWYNCisNCisjZW5kaWYgLyogKERJUkVDVDNEX1ZFUlNJT04gPj0gMHgwODAwKSAqLw0KKyNlbmRpZiAvKiBfRDNEX0hfICovDQorDQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9EaXJlY3QzRC9kM2Q4Y2Fwcy5oIGIvaW5jbHVkZS9EaXJlY3QzRC9kM2Q4Y2Fwcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhN2RjMTEKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL0RpcmVjdDNEL2QzZDhjYXBzLmgKQEAgLTAsMCArMSwzNjQgQEAKKy8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT07DQorICoNCisgKiAgQ29weXJpZ2h0IChDKSBNaWNyb3NvZnQgQ29ycG9yYXRpb24uICBBbGwgUmlnaHRzIFJlc2VydmVkLg0KKyAqDQorICogIEZpbGU6ICAgICAgIGQzZDhjYXBzLmgNCisgKiAgQ29udGVudDogICAgRGlyZWN0M0QgY2FwYWJpbGl0aWVzIGluY2x1ZGUgZmlsZQ0KKyAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaWZuZGVmIF9EM0Q4Q0FQU19IDQorI2RlZmluZSBfRDNEOENBUFNfSA0KKw0KKyNpZm5kZWYgRElSRUNUM0RfVkVSU0lPTg0KKyNkZWZpbmUgRElSRUNUM0RfVkVSU0lPTiAgICAgICAgIDB4MDgwMA0KKyNlbmRpZiAgLy9ESVJFQ1QzRF9WRVJTSU9ODQorDQorLy8gaW5jbHVkZSB0aGlzIGZpbGUgY29udGVudCBvbmx5IGlmIGNvbXBpbGluZyBmb3IgRFg4IGludGVyZmFjZXMNCisjaWYoRElSRUNUM0RfVkVSU0lPTiA+PSAweDA4MDApDQorDQorI2lmIGRlZmluZWQoX1g4Nl8pIHx8IGRlZmluZWQoX0lBNjRfKQ0KKyNwcmFnbWEgcGFjayg0KQ0KKyNlbmRpZg0KKw0KK3R5cGVkZWYgc3RydWN0IF9EM0RDQVBTOA0KK3sNCisgICAgLyogRGV2aWNlIEluZm8gKi8NCisgICAgRDNEREVWVFlQRSAgRGV2aWNlVHlwZTsNCisgICAgVUlOVCAgICBBZGFwdGVyT3JkaW5hbDsNCisNCisgICAgLyogQ2FwcyBmcm9tIERYNyBEcmF3ICovDQorICAgIERXT1JEICAgQ2FwczsNCisgICAgRFdPUkQgICBDYXBzMjsNCisgICAgRFdPUkQgICBDYXBzMzsNCisgICAgRFdPUkQgICBQcmVzZW50YXRpb25JbnRlcnZhbHM7DQorDQorICAgIC8qIEN1cnNvciBDYXBzICovDQorICAgIERXT1JEICAgQ3Vyc29yQ2FwczsNCisNCisgICAgLyogM0QgRGV2aWNlIENhcHMgKi8NCisgICAgRFdPUkQgICBEZXZDYXBzOw0KKw0KKyAgICBEV09SRCAgIFByaW1pdGl2ZU1pc2NDYXBzOw0KKyAgICBEV09SRCAgIFJhc3RlckNhcHM7DQorICAgIERXT1JEICAgWkNtcENhcHM7DQorICAgIERXT1JEICAgU3JjQmxlbmRDYXBzOw0KKyAgICBEV09SRCAgIERlc3RCbGVuZENhcHM7DQorICAgIERXT1JEICAgQWxwaGFDbXBDYXBzOw0KKyAgICBEV09SRCAgIFNoYWRlQ2FwczsNCisgICAgRFdPUkQgICBUZXh0dXJlQ2FwczsNCisgICAgRFdPUkQgICBUZXh0dXJlRmlsdGVyQ2FwczsgICAgICAgICAgLy8gRDNEUFRGSUxURVJDQVBTIGZvciBJRGlyZWN0M0RUZXh0dXJlOCdzDQorICAgIERXT1JEICAgQ3ViZVRleHR1cmVGaWx0ZXJDYXBzOyAgICAgIC8vIEQzRFBURklMVEVSQ0FQUyBmb3IgSURpcmVjdDNEQ3ViZVRleHR1cmU4J3MNCisgICAgRFdPUkQgICBWb2x1bWVUZXh0dXJlRmlsdGVyQ2FwczsgICAgLy8gRDNEUFRGSUxURVJDQVBTIGZvciBJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOCdzDQorICAgIERXT1JEICAgVGV4dHVyZUFkZHJlc3NDYXBzOyAgICAgICAgIC8vIEQzRFBUQUREUkVTU0NBUFMgZm9yIElEaXJlY3QzRFRleHR1cmU4J3MNCisgICAgRFdPUkQgICBWb2x1bWVUZXh0dXJlQWRkcmVzc0NhcHM7ICAgLy8gRDNEUFRBRERSRVNTQ0FQUyBmb3IgSURpcmVjdDNEVm9sdW1lVGV4dHVyZTgncw0KKw0KKyAgICBEV09SRCAgIExpbmVDYXBzOyAgICAgICAgICAgICAgICAgICAvLyBEM0RMSU5FQ0FQUw0KKw0KKyAgICBEV09SRCAgIE1heFRleHR1cmVXaWR0aCwgTWF4VGV4dHVyZUhlaWdodDsNCisgICAgRFdPUkQgICBNYXhWb2x1bWVFeHRlbnQ7DQorDQorICAgIERXT1JEICAgTWF4VGV4dHVyZVJlcGVhdDsNCisgICAgRFdPUkQgICBNYXhUZXh0dXJlQXNwZWN0UmF0aW87DQorICAgIERXT1JEICAgTWF4QW5pc290cm9weTsNCisgICAgZmxvYXQgICBNYXhWZXJ0ZXhXOw0KKw0KKyAgICBmbG9hdCAgIEd1YXJkQmFuZExlZnQ7DQorICAgIGZsb2F0ICAgR3VhcmRCYW5kVG9wOw0KKyAgICBmbG9hdCAgIEd1YXJkQmFuZFJpZ2h0Ow0KKyAgICBmbG9hdCAgIEd1YXJkQmFuZEJvdHRvbTsNCisNCisgICAgZmxvYXQgICBFeHRlbnRzQWRqdXN0Ow0KKyAgICBEV09SRCAgIFN0ZW5jaWxDYXBzOw0KKw0KKyAgICBEV09SRCAgIEZWRkNhcHM7DQorICAgIERXT1JEICAgVGV4dHVyZU9wQ2FwczsNCisgICAgRFdPUkQgICBNYXhUZXh0dXJlQmxlbmRTdGFnZXM7DQorICAgIERXT1JEICAgTWF4U2ltdWx0YW5lb3VzVGV4dHVyZXM7DQorDQorICAgIERXT1JEICAgVmVydGV4UHJvY2Vzc2luZ0NhcHM7DQorICAgIERXT1JEICAgTWF4QWN0aXZlTGlnaHRzOw0KKyAgICBEV09SRCAgIE1heFVzZXJDbGlwUGxhbmVzOw0KKyAgICBEV09SRCAgIE1heFZlcnRleEJsZW5kTWF0cmljZXM7DQorICAgIERXT1JEICAgTWF4VmVydGV4QmxlbmRNYXRyaXhJbmRleDsNCisNCisgICAgZmxvYXQgICBNYXhQb2ludFNpemU7DQorDQorICAgIERXT1JEICAgTWF4UHJpbWl0aXZlQ291bnQ7ICAgICAgICAgIC8vIG1heCBudW1iZXIgb2YgcHJpbWl0aXZlcyBwZXIgRHJhd1ByaW1pdGl2ZSBjYWxsDQorICAgIERXT1JEICAgTWF4VmVydGV4SW5kZXg7DQorICAgIERXT1JEICAgTWF4U3RyZWFtczsNCisgICAgRFdPUkQgICBNYXhTdHJlYW1TdHJpZGU7ICAgICAgICAgICAgLy8gbWF4IHN0cmlkZSBmb3IgU2V0U3RyZWFtU291cmNlDQorDQorICAgIERXT1JEICAgVmVydGV4U2hhZGVyVmVyc2lvbjsNCisgICAgRFdPUkQgICBNYXhWZXJ0ZXhTaGFkZXJDb25zdDsgICAgICAgLy8gbnVtYmVyIG9mIHZlcnRleCBzaGFkZXIgY29uc3RhbnQgcmVnaXN0ZXJzDQorDQorICAgIERXT1JEICAgUGl4ZWxTaGFkZXJWZXJzaW9uOw0KKyAgICBmbG9hdCAgIE1heFBpeGVsU2hhZGVyVmFsdWU7ICAgICAgICAvLyBtYXggdmFsdWUgb2YgcGl4ZWwgc2hhZGVyIGFyaXRobWV0aWMgY29tcG9uZW50DQorDQorfSBEM0RDQVBTODsNCisNCisvLw0KKy8vIEJJVCBERUZJTkVTIEZPUiBEM0RDQVBTOCBEV09SRCBNRU1CRVJTDQorLy8NCisNCisvLw0KKy8vIENhcHMNCisvLw0KKyNkZWZpbmUgRDNEQ0FQU19SRUFEX1NDQU5MSU5FICAgICAgICAgICAweDAwMDIwMDAwTA0KKw0KKy8vDQorLy8gQ2FwczINCisvLw0KKyNkZWZpbmUgRDNEQ0FQUzJfTk8yRERVUklORzNEU0NFTkUgICAgICAweDAwMDAwMDAyTA0KKyNkZWZpbmUgRDNEQ0FQUzJfRlVMTFNDUkVFTkdBTU1BICAgICAgICAweDAwMDIwMDAwTA0KKyNkZWZpbmUgRDNEQ0FQUzJfQ0FOUkVOREVSV0lORE9XRUQgICAgICAweDAwMDgwMDAwTA0KKyNkZWZpbmUgRDNEQ0FQUzJfQ0FOQ0FMSUJSQVRFR0FNTUEgICAgICAweDAwMTAwMDAwTA0KKyNkZWZpbmUgRDNEQ0FQUzJfUkVTRVJWRUQgICAgICAgICAgICAgICAweDAyMDAwMDAwTA0KKyNkZWZpbmUgRDNEQ0FQUzJfQ0FOTUFOQUdFUkVTT1VSQ0UgICAgICAweDEwMDAwMDAwTA0KKyNkZWZpbmUgRDNEQ0FQUzJfRFlOQU1JQ1RFWFRVUkVTICAgICAgICAweDIwMDAwMDAwTA0KKw0KKy8vDQorLy8gQ2FwczMNCisvLw0KKyNkZWZpbmUgRDNEQ0FQUzNfUkVTRVJWRUQgICAgICAgICAgICAgICAweDgwMDAwMDFmTA0KKw0KKy8vIEluZGljYXRlcyB0aGF0IHRoZSBkZXZpY2UgY2FuIHJlc3BlY3QgdGhlIEFMUEhBQkxFTkRFTkFCTEUgcmVuZGVyIHN0YXRlDQorLy8gd2hlbiBmdWxsc2NyZWVuIHdoaWxlIHVzaW5nIHRoZSBGTElQIG9yIERJU0NBUkQgc3dhcCBlZmZlY3QuDQorLy8gQ09QWSBhbmQgQ09QWVZTWU5DIHN3YXAgZWZmZWN0cyB3b3JrIHdoZXRoZXIgb3Igbm90IHRoaXMgZmxhZyBpcyBzZXQuDQorI2RlZmluZSBEM0RDQVBTM19BTFBIQV9GVUxMU0NSRUVOX0ZMSVBfT1JfRElTQ0FSRCAgIDB4MDAwMDAwMjBMDQorDQorLy8NCisvLyBQcmVzZW50YXRpb25JbnRlcnZhbHMNCisvLw0KKyNkZWZpbmUgRDNEUFJFU0VOVF9JTlRFUlZBTF9ERUZBVUxUICAgICAweDAwMDAwMDAwTA0KKyNkZWZpbmUgRDNEUFJFU0VOVF9JTlRFUlZBTF9PTkUgICAgICAgICAweDAwMDAwMDAxTA0KKyNkZWZpbmUgRDNEUFJFU0VOVF9JTlRFUlZBTF9UV08gICAgICAgICAweDAwMDAwMDAyTA0KKyNkZWZpbmUgRDNEUFJFU0VOVF9JTlRFUlZBTF9USFJFRSAgICAgICAweDAwMDAwMDA0TA0KKyNkZWZpbmUgRDNEUFJFU0VOVF9JTlRFUlZBTF9GT1VSICAgICAgICAweDAwMDAwMDA4TA0KKyNkZWZpbmUgRDNEUFJFU0VOVF9JTlRFUlZBTF9JTU1FRElBVEUgICAweDgwMDAwMDAwTA0KKw0KKy8vDQorLy8gQ3Vyc29yQ2Fwcw0KKy8vDQorLy8gRHJpdmVyIHN1cHBvcnRzIEhXIGNvbG9yIGN1cnNvciBpbiBhdCBsZWFzdCBoaS1yZXMgbW9kZXMoaGVpZ2h0ID49NDAwKQ0KKyNkZWZpbmUgRDNEQ1VSU09SQ0FQU19DT0xPUiAgICAgICAgICAgICAweDAwMDAwMDAxTA0KKy8vIERyaXZlciBzdXBwb3J0cyBIVyBjdXJzb3IgYWxzbyBpbiBsb3ctcmVzIG1vZGVzKGhlaWdodCA8IDQwMCkNCisjZGVmaW5lIEQzRENVUlNPUkNBUFNfTE9XUkVTICAgICAgICAgICAgMHgwMDAwMDAwMkwNCisNCisvLw0KKy8vIERldkNhcHMNCisvLw0KKyNkZWZpbmUgRDNEREVWQ0FQU19FWEVDVVRFU1lTVEVNTUVNT1JZICAweDAwMDAwMDEwTCAvKiBEZXZpY2UgY2FuIHVzZSBleGVjdXRlIGJ1ZmZlcnMgZnJvbSBzeXN0ZW0gbWVtb3J5ICovDQorI2RlZmluZSBEM0RERVZDQVBTX0VYRUNVVEVWSURFT01FTU9SWSAgIDB4MDAwMDAwMjBMIC8qIERldmljZSBjYW4gdXNlIGV4ZWN1dGUgYnVmZmVycyBmcm9tIHZpZGVvIG1lbW9yeSAqLw0KKyNkZWZpbmUgRDNEREVWQ0FQU19UTFZFUlRFWFNZU1RFTU1FTU9SWSAweDAwMDAwMDQwTCAvKiBEZXZpY2UgY2FuIHVzZSBUTCBidWZmZXJzIGZyb20gc3lzdGVtIG1lbW9yeSAqLw0KKyNkZWZpbmUgRDNEREVWQ0FQU19UTFZFUlRFWFZJREVPTUVNT1JZICAweDAwMDAwMDgwTCAvKiBEZXZpY2UgY2FuIHVzZSBUTCBidWZmZXJzIGZyb20gdmlkZW8gbWVtb3J5ICovDQorI2RlZmluZSBEM0RERVZDQVBTX1RFWFRVUkVTWVNURU1NRU1PUlkgIDB4MDAwMDAxMDBMIC8qIERldmljZSBjYW4gdGV4dHVyZSBmcm9tIHN5c3RlbSBtZW1vcnkgKi8NCisjZGVmaW5lIEQzRERFVkNBUFNfVEVYVFVSRVZJREVPTUVNT1JZICAgMHgwMDAwMDIwMEwgLyogRGV2aWNlIGNhbiB0ZXh0dXJlIGZyb20gZGV2aWNlIG1lbW9yeSAqLw0KKyNkZWZpbmUgRDNEREVWQ0FQU19EUkFXUFJJTVRMVkVSVEVYICAgICAweDAwMDAwNDAwTCAvKiBEZXZpY2UgY2FuIGRyYXcgVExWRVJURVggcHJpbWl0aXZlcyAqLw0KKyNkZWZpbmUgRDNEREVWQ0FQU19DQU5SRU5ERVJBRlRFUkZMSVAgICAweDAwMDAwODAwTCAvKiBEZXZpY2UgY2FuIHJlbmRlciB3aXRob3V0IHdhaXRpbmcgZm9yIGZsaXAgdG8gY29tcGxldGUgKi8NCisjZGVmaW5lIEQzRERFVkNBUFNfVEVYVFVSRU5PTkxPQ0FMVklETUVNIDB4MDAwMDEwMDBMIC8qIERldmljZSBjYW4gdGV4dHVyZSBmcm9tIG5vbmxvY2FsIHZpZGVvIG1lbW9yeSAqLw0KKyNkZWZpbmUgRDNEREVWQ0FQU19EUkFXUFJJTUlUSVZFUzIgICAgICAweDAwMDAyMDAwTCAvKiBEZXZpY2UgY2FuIHN1cHBvcnQgRHJhd1ByaW1pdGl2ZXMyICovDQorI2RlZmluZSBEM0RERVZDQVBTX1NFUEFSQVRFVEVYVFVSRU1FTU9SSUVTIDB4MDAwMDQwMDBMIC8qIERldmljZSBpcyB0ZXh0dXJpbmcgZnJvbSBzZXBhcmF0ZSBtZW1vcnkgcG9vbHMgKi8NCisjZGVmaW5lIEQzRERFVkNBUFNfRFJBV1BSSU1JVElWRVMyRVggICAgMHgwMDAwODAwMEwgLyogRGV2aWNlIGNhbiBzdXBwb3J0IEV4dGVuZGVkIERyYXdQcmltaXRpdmVzMiBpLmUuIERYNyBjb21wbGlhbnQgZHJpdmVyKi8NCisjZGVmaW5lIEQzRERFVkNBUFNfSFdUUkFOU0ZPUk1BTkRMSUdIVCAgMHgwMDAxMDAwMEwgLyogRGV2aWNlIGNhbiBzdXBwb3J0IHRyYW5zZm9ybWF0aW9uIGFuZCBsaWdodGluZyBpbiBoYXJkd2FyZSBhbmQgRFJBV1BSSU1JVElWRVMyRVggbXVzdCBiZSBhbHNvICovDQorI2RlZmluZSBEM0RERVZDQVBTX0NBTkJMVFNZU1RPTk9OTE9DQUwgIDB4MDAwMjAwMDBMIC8qIERldmljZSBzdXBwb3J0cyBhIFRleCBCbHQgZnJvbSBzeXN0ZW0gbWVtb3J5IHRvIG5vbi1sb2NhbCB2aWRtZW0gKi8NCisjZGVmaW5lIEQzRERFVkNBUFNfSFdSQVNURVJJWkFUSU9OICAgICAgMHgwMDA4MDAwMEwgLyogRGV2aWNlIGhhcyBIVyBhY2NlbGVyYXRpb24gZm9yIHJhc3Rlcml6YXRpb24gKi8NCisjZGVmaW5lIEQzRERFVkNBUFNfUFVSRURFVklDRSAgICAgICAgICAgMHgwMDEwMDAwMEwgLyogRGV2aWNlIHN1cHBvcnRzIEQzRENSRUFURV9QVVJFREVWSUNFICovDQorI2RlZmluZSBEM0RERVZDQVBTX1FVSU5USUNSVFBBVENIRVMgICAgIDB4MDAyMDAwMDBMIC8qIERldmljZSBzdXBwb3J0cyBxdWludGljIEJlemllcnMgYW5kIEJTcGxpbmVzICovDQorI2RlZmluZSBEM0RERVZDQVBTX1JUUEFUQ0hFUyAgICAgICAgICAgIDB4MDA0MDAwMDBMIC8qIERldmljZSBzdXBwb3J0cyBSZWN0IGFuZCBUcmkgcGF0Y2hlcyAqLw0KKyNkZWZpbmUgRDNEREVWQ0FQU19SVFBBVENISEFORExFWkVSTyAgICAweDAwODAwMDAwTCAvKiBJbmRpY2F0ZXMgdGhhdCBSVCBQYXRjaGVzIG1heSBiZSBkcmF3biBlZmZpY2llbnRseSB1c2luZyBoYW5kbGUgMCAqLw0KKyNkZWZpbmUgRDNEREVWQ0FQU19OUEFUQ0hFUyAgICAgICAgICAgICAweDAxMDAwMDAwTCAvKiBEZXZpY2Ugc3VwcG9ydHMgTi1QYXRjaGVzICovDQorDQorLy8NCisvLyBQcmltaXRpdmVNaXNjQ2Fwcw0KKy8vDQorI2RlZmluZSBEM0RQTUlTQ0NBUFNfTUFTS1ogICAgICAgICAgICAgIDB4MDAwMDAwMDJMDQorI2RlZmluZSBEM0RQTUlTQ0NBUFNfTElORVBBVFRFUk5SRVAgICAgIDB4MDAwMDAwMDRMDQorI2RlZmluZSBEM0RQTUlTQ0NBUFNfQ1VMTE5PTkUgICAgICAgICAgIDB4MDAwMDAwMTBMDQorI2RlZmluZSBEM0RQTUlTQ0NBUFNfQ1VMTENXICAgICAgICAgICAgIDB4MDAwMDAwMjBMDQorI2RlZmluZSBEM0RQTUlTQ0NBUFNfQ1VMTENDVyAgICAgICAgICAgIDB4MDAwMDAwNDBMDQorI2RlZmluZSBEM0RQTUlTQ0NBUFNfQ09MT1JXUklURUVOQUJMRSAgIDB4MDAwMDAwODBMDQorI2RlZmluZSBEM0RQTUlTQ0NBUFNfQ0xJUFBMQU5FU0NBTEVEUE9JTlRTIDB4MDAwMDAxMDBMIC8qIERldmljZSBjb3JyZWN0bHkgY2xpcHMgc2NhbGVkIHBvaW50cyB0byBjbGlwIHBsYW5lcyAqLw0KKyNkZWZpbmUgRDNEUE1JU0NDQVBTX0NMSVBUTFZFUlRTICAgICAgICAweDAwMDAwMjAwTCAvKiBkZXZpY2Ugd2lsbCBjbGlwIHBvc3QtdHJhbnNmb3JtZWQgdmVydGV4IHByaW1pdGl2ZXMgKi8NCisjZGVmaW5lIEQzRFBNSVNDQ0FQU19UU1NBUkdURU1QICAgICAgICAgMHgwMDAwMDQwMEwgLyogZGV2aWNlIHN1cHBvcnRzIEQzRFRBX1RFTVAgZm9yIHRlbXBvcmFyeSByZWdpc3RlciAqLw0KKyNkZWZpbmUgRDNEUE1JU0NDQVBTX0JMRU5ET1AgICAgICAgICAgICAweDAwMDAwODAwTCAvKiBkZXZpY2Ugc3VwcG9ydHMgRDNEUlNfQkxFTkRPUCAqLw0KKyNkZWZpbmUgRDNEUE1JU0NDQVBTX05VTExSRUZFUkVOQ0UgICAgICAweDAwMDAxMDAwTCAvKiBSZWZlcmVuY2UgRGV2aWNlIHRoYXQgZG9lc250IHJlbmRlciAqLw0KKw0KKy8vDQorLy8gTGluZUNhcHMNCisvLw0KKyNkZWZpbmUgRDNETElORUNBUFNfVEVYVFVSRSAgICAgICAgICAgICAweDAwMDAwMDAxTA0KKyNkZWZpbmUgRDNETElORUNBUFNfWlRFU1QgICAgICAgICAgICAgICAweDAwMDAwMDAyTA0KKyNkZWZpbmUgRDNETElORUNBUFNfQkxFTkQgICAgICAgICAgICAgICAweDAwMDAwMDA0TA0KKyNkZWZpbmUgRDNETElORUNBUFNfQUxQSEFDTVAgICAgICAgICAgICAweDAwMDAwMDA4TA0KKyNkZWZpbmUgRDNETElORUNBUFNfRk9HICAgICAgICAgICAgICAgICAweDAwMDAwMDEwTA0KKw0KKy8vDQorLy8gUmFzdGVyQ2Fwcw0KKy8vDQorI2RlZmluZSBEM0RQUkFTVEVSQ0FQU19ESVRIRVIgICAgICAgICAgIDB4MDAwMDAwMDFMDQorI2RlZmluZSBEM0RQUkFTVEVSQ0FQU19QQVQgICAgICAgICAgICAgIDB4MDAwMDAwMDhMDQorI2RlZmluZSBEM0RQUkFTVEVSQ0FQU19aVEVTVCAgICAgICAgICAgIDB4MDAwMDAwMTBMDQorI2RlZmluZSBEM0RQUkFTVEVSQ0FQU19GT0dWRVJURVggICAgICAgIDB4MDAwMDAwODBMDQorI2RlZmluZSBEM0RQUkFTVEVSQ0FQU19GT0dUQUJMRSAgICAgICAgIDB4MDAwMDAxMDBMDQorI2RlZmluZSBEM0RQUkFTVEVSQ0FQU19BTlRJQUxJQVNFREdFUyAgIDB4MDAwMDEwMDBMDQorI2RlZmluZSBEM0RQUkFTVEVSQ0FQU19NSVBNQVBMT0RCSUFTICAgIDB4MDAwMDIwMDBMDQorI2RlZmluZSBEM0RQUkFTVEVSQ0FQU19aQklBUyAgICAgICAgICAgIDB4MDAwMDQwMDBMDQorI2RlZmluZSBEM0RQUkFTVEVSQ0FQU19aQlVGRkVSTEVTU0hTUiAgIDB4MDAwMDgwMDBMDQorI2RlZmluZSBEM0RQUkFTVEVSQ0FQU19GT0dSQU5HRSAgICAgICAgIDB4MDAwMTAwMDBMDQorI2RlZmluZSBEM0RQUkFTVEVSQ0FQU19BTklTT1RST1BZICAgICAgIDB4MDAwMjAwMDBMDQorI2RlZmluZSBEM0RQUkFTVEVSQ0FQU19XQlVGRkVSICAgICAgICAgIDB4MDAwNDAwMDBMDQorI2RlZmluZSBEM0RQUkFTVEVSQ0FQU19XRk9HICAgICAgICAgICAgIDB4MDAxMDAwMDBMDQorI2RlZmluZSBEM0RQUkFTVEVSQ0FQU19aRk9HICAgICAgICAgICAgIDB4MDAyMDAwMDBMDQorI2RlZmluZSBEM0RQUkFTVEVSQ0FQU19DT0xPUlBFUlNQRUNUSVZFIDB4MDA0MDAwMDBMIC8qIERldmljZSBpdGVyYXRlcyBjb2xvcnMgcGVyc3BlY3RpdmUgY29ycmVjdCAqLw0KKyNkZWZpbmUgRDNEUFJBU1RFUkNBUFNfU1RSRVRDSEJMVE1VTFRJU0FNUExFICAweDAwODAwMDAwTA0KKw0KKy8vDQorLy8gWkNtcENhcHMsIEFscGhhQ21wQ2Fwcw0KKy8vDQorI2RlZmluZSBEM0RQQ01QQ0FQU19ORVZFUiAgICAgICAgICAgICAgIDB4MDAwMDAwMDFMDQorI2RlZmluZSBEM0RQQ01QQ0FQU19MRVNTICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJMDQorI2RlZmluZSBEM0RQQ01QQ0FQU19FUVVBTCAgICAgICAgICAgICAgIDB4MDAwMDAwMDRMDQorI2RlZmluZSBEM0RQQ01QQ0FQU19MRVNTRVFVQUwgICAgICAgICAgIDB4MDAwMDAwMDhMDQorI2RlZmluZSBEM0RQQ01QQ0FQU19HUkVBVEVSICAgICAgICAgICAgIDB4MDAwMDAwMTBMDQorI2RlZmluZSBEM0RQQ01QQ0FQU19OT1RFUVVBTCAgICAgICAgICAgIDB4MDAwMDAwMjBMDQorI2RlZmluZSBEM0RQQ01QQ0FQU19HUkVBVEVSRVFVQUwgICAgICAgIDB4MDAwMDAwNDBMDQorI2RlZmluZSBEM0RQQ01QQ0FQU19BTFdBWVMgICAgICAgICAgICAgIDB4MDAwMDAwODBMDQorDQorLy8NCisvLyBTb3VyY2VCbGVuZENhcHMsIERlc3RCbGVuZENhcHMNCisvLw0KKyNkZWZpbmUgRDNEUEJMRU5EQ0FQU19aRVJPICAgICAgICAgICAgICAweDAwMDAwMDAxTA0KKyNkZWZpbmUgRDNEUEJMRU5EQ0FQU19PTkUgICAgICAgICAgICAgICAweDAwMDAwMDAyTA0KKyNkZWZpbmUgRDNEUEJMRU5EQ0FQU19TUkNDT0xPUiAgICAgICAgICAweDAwMDAwMDA0TA0KKyNkZWZpbmUgRDNEUEJMRU5EQ0FQU19JTlZTUkNDT0xPUiAgICAgICAweDAwMDAwMDA4TA0KKyNkZWZpbmUgRDNEUEJMRU5EQ0FQU19TUkNBTFBIQSAgICAgICAgICAweDAwMDAwMDEwTA0KKyNkZWZpbmUgRDNEUEJMRU5EQ0FQU19JTlZTUkNBTFBIQSAgICAgICAweDAwMDAwMDIwTA0KKyNkZWZpbmUgRDNEUEJMRU5EQ0FQU19ERVNUQUxQSEEgICAgICAgICAweDAwMDAwMDQwTA0KKyNkZWZpbmUgRDNEUEJMRU5EQ0FQU19JTlZERVNUQUxQSEEgICAgICAweDAwMDAwMDgwTA0KKyNkZWZpbmUgRDNEUEJMRU5EQ0FQU19ERVNUQ09MT1IgICAgICAgICAweDAwMDAwMTAwTA0KKyNkZWZpbmUgRDNEUEJMRU5EQ0FQU19JTlZERVNUQ09MT1IgICAgICAweDAwMDAwMjAwTA0KKyNkZWZpbmUgRDNEUEJMRU5EQ0FQU19TUkNBTFBIQVNBVCAgICAgICAweDAwMDAwNDAwTA0KKyNkZWZpbmUgRDNEUEJMRU5EQ0FQU19CT1RIU1JDQUxQSEEgICAgICAweDAwMDAwODAwTA0KKyNkZWZpbmUgRDNEUEJMRU5EQ0FQU19CT1RISU5WU1JDQUxQSEEgICAweDAwMDAxMDAwTA0KKw0KKy8vDQorLy8gU2hhZGVDYXBzDQorLy8NCisjZGVmaW5lIEQzRFBTSEFERUNBUFNfQ09MT1JHT1VSQVVEUkdCICAgICAgIDB4MDAwMDAwMDhMDQorI2RlZmluZSBEM0RQU0hBREVDQVBTX1NQRUNVTEFSR09VUkFVRFJHQiAgICAweDAwMDAwMjAwTA0KKyNkZWZpbmUgRDNEUFNIQURFQ0FQU19BTFBIQUdPVVJBVURCTEVORCAgICAgMHgwMDAwNDAwMEwNCisjZGVmaW5lIEQzRFBTSEFERUNBUFNfRk9HR09VUkFVRCAgICAgICAgICAgIDB4MDAwODAwMDBMDQorDQorLy8NCisvLyBUZXh0dXJlQ2Fwcw0KKy8vDQorI2RlZmluZSBEM0RQVEVYVFVSRUNBUFNfUEVSU1BFQ1RJVkUgICAgICAgICAweDAwMDAwMDAxTCAvKiBQZXJzcGVjdGl2ZS1jb3JyZWN0IHRleHR1cmluZyBpcyBzdXBwb3J0ZWQgKi8NCisjZGVmaW5lIEQzRFBURVhUVVJFQ0FQU19QT1cyICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJMIC8qIFBvd2VyLW9mLTIgdGV4dHVyZSBkaW1lbnNpb25zIGFyZSByZXF1aXJlZCAtIGFwcGxpZXMgdG8gbm9uLUN1YmUvVm9sdW1lIHRleHR1cmVzIG9ubHkuICovDQorI2RlZmluZSBEM0RQVEVYVFVSRUNBUFNfQUxQSEEgICAgICAgICAgICAgICAweDAwMDAwMDA0TCAvKiBBbHBoYSBpbiB0ZXh0dXJlIHBpeGVscyBpcyBzdXBwb3J0ZWQgKi8NCisjZGVmaW5lIEQzRFBURVhUVVJFQ0FQU19TUVVBUkVPTkxZICAgICAgICAgIDB4MDAwMDAwMjBMIC8qIE9ubHkgc3F1YXJlIHRleHR1cmVzIGFyZSBzdXBwb3J0ZWQgKi8NCisjZGVmaW5lIEQzRFBURVhUVVJFQ0FQU19URVhSRVBFQVROT1RTQ0FMRURCWVNJWkUgMHgwMDAwMDA0MEwgLyogVGV4dHVyZSBpbmRpY2VzIGFyZSBub3Qgc2NhbGVkIGJ5IHRoZSB0ZXh0dXJlIHNpemUgcHJpb3IgdG8gaW50ZXJwb2xhdGlvbiAqLw0KKyNkZWZpbmUgRDNEUFRFWFRVUkVDQVBTX0FMUEhBUEFMRVRURSAgICAgICAgMHgwMDAwMDA4MEwgLyogRGV2aWNlIGNhbiBkcmF3IGFscGhhIGZyb20gdGV4dHVyZSBwYWxldHRlcyAqLw0KKy8vIERldmljZSBjYW4gdXNlIG5vbi1QT1cyIHRleHR1cmVzIGlmOg0KKy8vICAxKSBEM0RURVhUVVJFX0FERFJFU1MgaXMgc2V0IHRvIENMQU1QIGZvciB0aGlzIHRleHR1cmUncyBzdGFnZQ0KKy8vICAyKSBEM0RSU19XUkFQKE4pIGlzIHplcm8gZm9yIHRoaXMgdGV4dHVyZSdzIGNvb3JkaW5hdGVzDQorLy8gIDMpIG1pcCBtYXBwaW5nIGlzIG5vdCBlbmFibGVkICh1c2UgbWFnbmlmaWNhdGlvbiBmaWx0ZXIgb25seSkNCisjZGVmaW5lIEQzRFBURVhUVVJFQ0FQU19OT05QT1cyQ09ORElUSU9OQUwgIDB4MDAwMDAxMDBMDQorI2RlZmluZSBEM0RQVEVYVFVSRUNBUFNfUFJPSkVDVEVEICAgICAgICAgICAweDAwMDAwNDAwTCAvKiBEZXZpY2UgY2FuIGRvIEQzRFRURkZfUFJPSkVDVEVEICovDQorI2RlZmluZSBEM0RQVEVYVFVSRUNBUFNfQ1VCRU1BUCAgICAgICAgICAgICAweDAwMDAwODAwTCAvKiBEZXZpY2UgY2FuIGRvIGN1YmVtYXAgdGV4dHVyZXMgKi8NCisjZGVmaW5lIEQzRFBURVhUVVJFQ0FQU19WT0xVTUVNQVAgICAgICAgICAgIDB4MDAwMDIwMDBMIC8qIERldmljZSBjYW4gZG8gdm9sdW1lIHRleHR1cmVzICovDQorI2RlZmluZSBEM0RQVEVYVFVSRUNBUFNfTUlQTUFQICAgICAgICAgICAgICAweDAwMDA0MDAwTCAvKiBEZXZpY2UgY2FuIGRvIG1pcG1hcHBlZCB0ZXh0dXJlcyAqLw0KKyNkZWZpbmUgRDNEUFRFWFRVUkVDQVBTX01JUFZPTFVNRU1BUCAgICAgICAgMHgwMDAwODAwMEwgLyogRGV2aWNlIGNhbiBkbyBtaXBtYXBwZWQgdm9sdW1lIHRleHR1cmVzICovDQorI2RlZmluZSBEM0RQVEVYVFVSRUNBUFNfTUlQQ1VCRU1BUCAgICAgICAgICAweDAwMDEwMDAwTCAvKiBEZXZpY2UgY2FuIGRvIG1pcG1hcHBlZCBjdWJlIG1hcHMgKi8NCisjZGVmaW5lIEQzRFBURVhUVVJFQ0FQU19DVUJFTUFQX1BPVzIgICAgICAgIDB4MDAwMjAwMDBMIC8qIERldmljZSByZXF1aXJlcyB0aGF0IGN1YmVtYXBzIGJlIHBvd2VyLW9mLTIgZGltZW5zaW9uICovDQorI2RlZmluZSBEM0RQVEVYVFVSRUNBUFNfVk9MVU1FTUFQX1BPVzIgICAgICAweDAwMDQwMDAwTCAvKiBEZXZpY2UgcmVxdWlyZXMgdGhhdCB2b2x1bWUgbWFwcyBiZSBwb3dlci1vZi0yIGRpbWVuc2lvbiAqLw0KKw0KKy8vDQorLy8gVGV4dHVyZUZpbHRlckNhcHMNCisvLw0KKyNkZWZpbmUgRDNEUFRGSUxURVJDQVBTX01JTkZQT0lOVCAgICAgICAgICAgMHgwMDAwMDEwMEwgLyogTWluIEZpbHRlciAqLw0KKyNkZWZpbmUgRDNEUFRGSUxURVJDQVBTX01JTkZMSU5FQVIgICAgICAgICAgMHgwMDAwMDIwMEwNCisjZGVmaW5lIEQzRFBURklMVEVSQ0FQU19NSU5GQU5JU09UUk9QSUMgICAgIDB4MDAwMDA0MDBMDQorI2RlZmluZSBEM0RQVEZJTFRFUkNBUFNfTUlQRlBPSU5UICAgICAgICAgICAweDAwMDEwMDAwTCAvKiBNaXAgRmlsdGVyICovDQorI2RlZmluZSBEM0RQVEZJTFRFUkNBUFNfTUlQRkxJTkVBUiAgICAgICAgICAweDAwMDIwMDAwTA0KKyNkZWZpbmUgRDNEUFRGSUxURVJDQVBTX01BR0ZQT0lOVCAgICAgICAgICAgMHgwMTAwMDAwMEwgLyogTWFnIEZpbHRlciAqLw0KKyNkZWZpbmUgRDNEUFRGSUxURVJDQVBTX01BR0ZMSU5FQVIgICAgICAgICAgMHgwMjAwMDAwMEwNCisjZGVmaW5lIEQzRFBURklMVEVSQ0FQU19NQUdGQU5JU09UUk9QSUMgICAgIDB4MDQwMDAwMDBMDQorI2RlZmluZSBEM0RQVEZJTFRFUkNBUFNfTUFHRkFGTEFUQ1VCSUMgICAgICAweDA4MDAwMDAwTA0KKyNkZWZpbmUgRDNEUFRGSUxURVJDQVBTX01BR0ZHQVVTU0lBTkNVQklDICAgMHgxMDAwMDAwMEwNCisNCisvLw0KKy8vIFRleHR1cmVBZGRyZXNzQ2Fwcw0KKy8vDQorI2RlZmluZSBEM0RQVEFERFJFU1NDQVBTX1dSQVAgICAgICAgICAgIDB4MDAwMDAwMDFMDQorI2RlZmluZSBEM0RQVEFERFJFU1NDQVBTX01JUlJPUiAgICAgICAgIDB4MDAwMDAwMDJMDQorI2RlZmluZSBEM0RQVEFERFJFU1NDQVBTX0NMQU1QICAgICAgICAgIDB4MDAwMDAwMDRMDQorI2RlZmluZSBEM0RQVEFERFJFU1NDQVBTX0JPUkRFUiAgICAgICAgIDB4MDAwMDAwMDhMDQorI2RlZmluZSBEM0RQVEFERFJFU1NDQVBTX0lOREVQRU5ERU5UVVYgIDB4MDAwMDAwMTBMDQorI2RlZmluZSBEM0RQVEFERFJFU1NDQVBTX01JUlJPUk9OQ0UgICAgIDB4MDAwMDAwMjBMDQorDQorLy8NCisvLyBTdGVuY2lsQ2Fwcw0KKy8vDQorI2RlZmluZSBEM0RTVEVOQ0lMQ0FQU19LRUVQICAgICAgICAgICAgIDB4MDAwMDAwMDFMDQorI2RlZmluZSBEM0RTVEVOQ0lMQ0FQU19aRVJPICAgICAgICAgICAgIDB4MDAwMDAwMDJMDQorI2RlZmluZSBEM0RTVEVOQ0lMQ0FQU19SRVBMQUNFICAgICAgICAgIDB4MDAwMDAwMDRMDQorI2RlZmluZSBEM0RTVEVOQ0lMQ0FQU19JTkNSU0FUICAgICAgICAgIDB4MDAwMDAwMDhMDQorI2RlZmluZSBEM0RTVEVOQ0lMQ0FQU19ERUNSU0FUICAgICAgICAgIDB4MDAwMDAwMTBMDQorI2RlZmluZSBEM0RTVEVOQ0lMQ0FQU19JTlZFUlQgICAgICAgICAgIDB4MDAwMDAwMjBMDQorI2RlZmluZSBEM0RTVEVOQ0lMQ0FQU19JTkNSICAgICAgICAgICAgIDB4MDAwMDAwNDBMDQorI2RlZmluZSBEM0RTVEVOQ0lMQ0FQU19ERUNSICAgICAgICAgICAgIDB4MDAwMDAwODBMDQorDQorLy8NCisvLyBUZXh0dXJlT3BDYXBzDQorLy8NCisjZGVmaW5lIEQzRFRFWE9QQ0FQU19ESVNBQkxFICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDAxTA0KKyNkZWZpbmUgRDNEVEVYT1BDQVBTX1NFTEVDVEFSRzEgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDJMDQorI2RlZmluZSBEM0RURVhPUENBUFNfU0VMRUNUQVJHMiAgICAgICAgICAgICAgICAgMHgwMDAwMDAwNEwNCisjZGVmaW5lIEQzRFRFWE9QQ0FQU19NT0RVTEFURSAgICAgICAgICAgICAgICAgICAweDAwMDAwMDA4TA0KKyNkZWZpbmUgRDNEVEVYT1BDQVBTX01PRFVMQVRFMlggICAgICAgICAgICAgICAgIDB4MDAwMDAwMTBMDQorI2RlZmluZSBEM0RURVhPUENBUFNfTU9EVUxBVEU0WCAgICAgICAgICAgICAgICAgMHgwMDAwMDAyMEwNCisjZGVmaW5lIEQzRFRFWE9QQ0FQU19BREQgICAgICAgICAgICAgICAgICAgICAgICAweDAwMDAwMDQwTA0KKyNkZWZpbmUgRDNEVEVYT1BDQVBTX0FERFNJR05FRCAgICAgICAgICAgICAgICAgIDB4MDAwMDAwODBMDQorI2RlZmluZSBEM0RURVhPUENBUFNfQUREU0lHTkVEMlggICAgICAgICAgICAgICAgMHgwMDAwMDEwMEwNCisjZGVmaW5lIEQzRFRFWE9QQ0FQU19TVUJUUkFDVCAgICAgICAgICAgICAgICAgICAweDAwMDAwMjAwTA0KKyNkZWZpbmUgRDNEVEVYT1BDQVBTX0FERFNNT09USCAgICAgICAgICAgICAgICAgIDB4MDAwMDA0MDBMDQorI2RlZmluZSBEM0RURVhPUENBUFNfQkxFTkRESUZGVVNFQUxQSEEgICAgICAgICAgMHgwMDAwMDgwMEwNCisjZGVmaW5lIEQzRFRFWE9QQ0FQU19CTEVORFRFWFRVUkVBTFBIQSAgICAgICAgICAweDAwMDAxMDAwTA0KKyNkZWZpbmUgRDNEVEVYT1BDQVBTX0JMRU5ERkFDVE9SQUxQSEEgICAgICAgICAgIDB4MDAwMDIwMDBMDQorI2RlZmluZSBEM0RURVhPUENBUFNfQkxFTkRURVhUVVJFQUxQSEFQTSAgICAgICAgMHgwMDAwNDAwMEwNCisjZGVmaW5lIEQzRFRFWE9QQ0FQU19CTEVORENVUlJFTlRBTFBIQSAgICAgICAgICAweDAwMDA4MDAwTA0KKyNkZWZpbmUgRDNEVEVYT1BDQVBTX1BSRU1PRFVMQVRFICAgICAgICAgICAgICAgIDB4MDAwMTAwMDBMDQorI2RlZmluZSBEM0RURVhPUENBUFNfTU9EVUxBVEVBTFBIQV9BRERDT0xPUiAgICAgMHgwMDAyMDAwMEwNCisjZGVmaW5lIEQzRFRFWE9QQ0FQU19NT0RVTEFURUNPTE9SX0FEREFMUEhBICAgICAweDAwMDQwMDAwTA0KKyNkZWZpbmUgRDNEVEVYT1BDQVBTX01PRFVMQVRFSU5WQUxQSEFfQUREQ09MT1IgIDB4MDAwODAwMDBMDQorI2RlZmluZSBEM0RURVhPUENBUFNfTU9EVUxBVEVJTlZDT0xPUl9BRERBTFBIQSAgMHgwMDEwMDAwMEwNCisjZGVmaW5lIEQzRFRFWE9QQ0FQU19CVU1QRU5WTUFQICAgICAgICAgICAgICAgICAweDAwMjAwMDAwTA0KKyNkZWZpbmUgRDNEVEVYT1BDQVBTX0JVTVBFTlZNQVBMVU1JTkFOQ0UgICAgICAgIDB4MDA0MDAwMDBMDQorI2RlZmluZSBEM0RURVhPUENBUFNfRE9UUFJPRFVDVDMgICAgICAgICAgICAgICAgMHgwMDgwMDAwMEwNCisjZGVmaW5lIEQzRFRFWE9QQ0FQU19NVUxUSVBMWUFERCAgICAgICAgICAgICAgICAweDAxMDAwMDAwTA0KKyNkZWZpbmUgRDNEVEVYT1BDQVBTX0xFUlAgICAgICAgICAgICAgICAgICAgICAgIDB4MDIwMDAwMDBMDQorDQorLy8NCisvLyBGVkZDYXBzDQorLy8NCisjZGVmaW5lIEQzREZWRkNBUFNfVEVYQ09PUkRDT1VOVE1BU0sgICAgMHgwMDAwZmZmZkwgLyogbWFzayBmb3IgdGV4dHVyZSBjb29yZGluYXRlIGNvdW50IGZpZWxkICovDQorI2RlZmluZSBEM0RGVkZDQVBTX0RPTk9UU1RSSVBFTEVNRU5UUyAgIDB4MDAwODAwMDBMIC8qIERldmljZSBwcmVmZXJzIHRoYXQgdmVydGV4IGVsZW1lbnRzIG5vdCBiZSBzdHJpcHBlZCAqLw0KKyNkZWZpbmUgRDNERlZGQ0FQU19QU0laRSAgICAgICAgICAgICAgICAweDAwMTAwMDAwTCAvKiBEZXZpY2UgY2FuIHJlY2VpdmUgcG9pbnQgc2l6ZSAqLw0KKw0KKy8vDQorLy8gVmVydGV4UHJvY2Vzc2luZ0NhcHMNCisvLw0KKyNkZWZpbmUgRDNEVlRYUENBUFNfVEVYR0VOICAgICAgICAgICAgICAweDAwMDAwMDAxTCAvKiBkZXZpY2UgY2FuIGRvIHRleGdlbiAqLw0KKyNkZWZpbmUgRDNEVlRYUENBUFNfTUFURVJJQUxTT1VSQ0U3ICAgICAweDAwMDAwMDAyTCAvKiBkZXZpY2UgY2FuIGRvIERYNy1sZXZlbCBjb2xvcm1hdGVyaWFsc291cmNlIG9wcyAqLw0KKyNkZWZpbmUgRDNEVlRYUENBUFNfRElSRUNUSU9OQUxMSUdIVFMgICAweDAwMDAwMDA4TCAvKiBkZXZpY2UgY2FuIGRvIGRpcmVjdGlvbmFsIGxpZ2h0cyAqLw0KKyNkZWZpbmUgRDNEVlRYUENBUFNfUE9TSVRJT05BTExJR0hUUyAgICAweDAwMDAwMDEwTCAvKiBkZXZpY2UgY2FuIGRvIHBvc2l0aW9uYWwgbGlnaHRzIChpbmNsdWRlcyBwb2ludCBhbmQgc3BvdCkgKi8NCisjZGVmaW5lIEQzRFZUWFBDQVBTX0xPQ0FMVklFV0VSICAgICAgICAgMHgwMDAwMDAyMEwgLyogZGV2aWNlIGNhbiBkbyBsb2NhbCB2aWV3ZXIgKi8NCisjZGVmaW5lIEQzRFZUWFBDQVBTX1RXRUVOSU5HICAgICAgICAgICAgMHgwMDAwMDA0MEwgLyogZGV2aWNlIGNhbiBkbyB2ZXJ0ZXggdHdlZW5pbmcgKi8NCisjZGVmaW5lIEQzRFZUWFBDQVBTX05PX1ZTRFRfVUJZVEU0ICAgICAgMHgwMDAwMDA4MEwgLyogZGV2aWNlIGRvZXMgbm90IHN1cHBvcnQgRDNEVlNEVF9VQllURTQgKi8NCisNCisjcHJhZ21hIHBhY2soKQ0KKw0KKyNlbmRpZiAvKiAoRElSRUNUM0RfVkVSU0lPTiA+PSAweDA4MDApICovDQorI2VuZGlmIC8qIF9EM0Q4Q0FQU19IXyAqLw0KKw0KZGlmZiAtLWdpdCBhL2luY2x1ZGUvRGlyZWN0M0QvZDNkOHR5cGVzLmggYi9pbmNsdWRlL0RpcmVjdDNEL2QzZDh0eXBlcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMDM3NjIKLS0tIC9kZXYvbnVsbAorKysgYi9pbmNsdWRlL0RpcmVjdDNEL2QzZDh0eXBlcy5oCkBAIC0wLDAgKzEsMTY4NCBAQAorLyo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PTsNCisgKg0KKyAqICBDb3B5cmlnaHQgKEMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorICoNCisgKiAgRmlsZTogICAgICAgZDNkOHR5cGVzLmgNCisgKiAgQ29udGVudDogICAgRGlyZWN0M0QgY2FwYWJpbGl0aWVzIGluY2x1ZGUgZmlsZQ0KKyAqDQorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8NCisNCisjaWZuZGVmIF9EM0Q4VFlQRVNfSF8NCisjZGVmaW5lIF9EM0Q4VFlQRVNfSF8NCisNCisjaWZuZGVmIERJUkVDVDNEX1ZFUlNJT04NCisjZGVmaW5lIERJUkVDVDNEX1ZFUlNJT04gICAgICAgICAweDA4MDANCisjZW5kaWYgIC8vRElSRUNUM0RfVkVSU0lPTg0KKw0KKy8vIGluY2x1ZGUgdGhpcyBmaWxlIGNvbnRlbnQgb25seSBpZiBjb21waWxpbmcgZm9yIERYOCBpbnRlcmZhY2VzDQorI2lmKERJUkVDVDNEX1ZFUlNJT04gPj0gMHgwODAwKQ0KKw0KKyNpbmNsdWRlIDxmbG9hdC5oPg0KKw0KKyNpZiBfTVNDX1ZFUiA+PSAxMjAwDQorI3ByYWdtYSB3YXJuaW5nKHB1c2gpDQorI2VuZGlmDQorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6NDIwMSkgLy8gYW5vbnltb3VzIHVuaW9ucyB3YXJuaW5nDQorI2lmIGRlZmluZWQoX1g4Nl8pIHx8IGRlZmluZWQoX0lBNjRfKQ0KKyNwcmFnbWEgcGFjayg0KQ0KKyNlbmRpZg0KKw0KKy8vIEQzRENPTE9SIGlzIGVxdWl2YWxlbnQgdG8gRDNERk1UX0E4UjhHOEI4DQorI2lmbmRlZiBEM0RDT0xPUl9ERUZJTkVEDQordHlwZWRlZiBEV09SRCBEM0RDT0xPUjsNCisjZGVmaW5lIEQzRENPTE9SX0RFRklORUQNCisjZW5kaWYNCisNCisvLyBtYXBzIHVuc2lnbmVkIDggYml0cy9jaGFubmVsIHRvIEQzRENPTE9SDQorI2RlZmluZSBEM0RDT0xPUl9BUkdCKGEscixnLGIpIFwNCisgICAgKChEM0RDT0xPUikoKCgoYSkmMHhmZik8PDI0KXwoKChyKSYweGZmKTw8MTYpfCgoKGcpJjB4ZmYpPDw4KXwoKGIpJjB4ZmYpKSkNCisjZGVmaW5lIEQzRENPTE9SX1JHQkEocixnLGIsYSkgRDNEQ09MT1JfQVJHQihhLHIsZyxiKQ0KKyNkZWZpbmUgRDNEQ09MT1JfWFJHQihyLGcsYikgICBEM0RDT0xPUl9BUkdCKDB4ZmYscixnLGIpDQorDQorLy8gbWFwcyBmbG9hdGluZyBwb2ludCBjaGFubmVscyAoMC5mIHRvIDEuZiByYW5nZSkgdG8gRDNEQ09MT1INCisjZGVmaW5lIEQzRENPTE9SX0NPTE9SVkFMVUUocixnLGIsYSkgXA0KKyAgICBEM0RDT0xPUl9SR0JBKChEV09SRCkoKHIpKjI1NS5mKSwoRFdPUkQpKChnKSoyNTUuZiksKERXT1JEKSgoYikqMjU1LmYpLChEV09SRCkoKGEpKjI1NS5mKSkNCisNCisNCisjaWZuZGVmIEQzRFZFQ1RPUl9ERUZJTkVEDQordHlwZWRlZiBzdHJ1Y3QgX0QzRFZFQ1RPUiB7DQorICAgIGZsb2F0IHg7DQorICAgIGZsb2F0IHk7DQorICAgIGZsb2F0IHo7DQorfSBEM0RWRUNUT1I7DQorI2RlZmluZSBEM0RWRUNUT1JfREVGSU5FRA0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgRDNEQ09MT1JWQUxVRV9ERUZJTkVEDQordHlwZWRlZiBzdHJ1Y3QgX0QzRENPTE9SVkFMVUUgew0KKyAgICBmbG9hdCByOw0KKyAgICBmbG9hdCBnOw0KKyAgICBmbG9hdCBiOw0KKyAgICBmbG9hdCBhOw0KK30gRDNEQ09MT1JWQUxVRTsNCisjZGVmaW5lIEQzRENPTE9SVkFMVUVfREVGSU5FRA0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgRDNEUkVDVF9ERUZJTkVEDQordHlwZWRlZiBzdHJ1Y3QgX0QzRFJFQ1Qgew0KKyAgICBMT05HIHgxOw0KKyAgICBMT05HIHkxOw0KKyAgICBMT05HIHgyOw0KKyAgICBMT05HIHkyOw0KK30gRDNEUkVDVDsNCisjZGVmaW5lIEQzRFJFQ1RfREVGSU5FRA0KKyNlbmRpZg0KKw0KKyNpZm5kZWYgRDNETUFUUklYX0RFRklORUQNCit0eXBlZGVmIHN0cnVjdCBfRDNETUFUUklYIHsNCisgICAgdW5pb24gew0KKyAgICAgICAgc3RydWN0IHsNCisgICAgICAgICAgICBmbG9hdCAgICAgICAgXzExLCBfMTIsIF8xMywgXzE0Ow0KKyAgICAgICAgICAgIGZsb2F0ICAgICAgICBfMjEsIF8yMiwgXzIzLCBfMjQ7DQorICAgICAgICAgICAgZmxvYXQgICAgICAgIF8zMSwgXzMyLCBfMzMsIF8zNDsNCisgICAgICAgICAgICBmbG9hdCAgICAgICAgXzQxLCBfNDIsIF80MywgXzQ0Ow0KKw0KKyAgICAgICAgfTsNCisgICAgICAgIGZsb2F0IG1bNF1bNF07DQorICAgIH07DQorfSBEM0RNQVRSSVg7DQorI2RlZmluZSBEM0RNQVRSSVhfREVGSU5FRA0KKyNlbmRpZg0KKw0KK3R5cGVkZWYgc3RydWN0IF9EM0RWSUVXUE9SVDggew0KKyAgICBEV09SRCAgICAgICBYOw0KKyAgICBEV09SRCAgICAgICBZOyAgICAgICAgICAgIC8qIFZpZXdwb3J0IFRvcCBsZWZ0ICovDQorICAgIERXT1JEICAgICAgIFdpZHRoOw0KKyAgICBEV09SRCAgICAgICBIZWlnaHQ7ICAgICAgIC8qIFZpZXdwb3J0IERpbWVuc2lvbnMgKi8NCisgICAgZmxvYXQgICAgICAgTWluWjsgICAgICAgICAvKiBNaW4vbWF4IG9mIGNsaXAgVm9sdW1lICovDQorICAgIGZsb2F0ICAgICAgIE1heFo7DQorfSBEM0RWSUVXUE9SVDg7DQorDQorLyoNCisgKiBWYWx1ZXMgZm9yIGNsaXAgZmllbGRzLg0KKyAqLw0KKw0KKy8vIE1heCBudW1iZXIgb2YgdXNlciBjbGlwcGluZyBwbGFuZXMsIHN1cHBvcnRlZCBpbiBEM0QuDQorI2RlZmluZSBEM0RNQVhVU0VSQ0xJUFBMQU5FUyAzMg0KKw0KKy8vIFRoZXNlIGJpdHMgY291bGQgYmUgT1JlZCB0b2dldGhlciB0byB1c2Ugd2l0aCBEM0RSU19DTElQUExBTkVFTkFCTEUNCisvLw0KKyNkZWZpbmUgRDNEQ0xJUFBMQU5FMCAoMSA8PCAwKQ0KKyNkZWZpbmUgRDNEQ0xJUFBMQU5FMSAoMSA8PCAxKQ0KKyNkZWZpbmUgRDNEQ0xJUFBMQU5FMiAoMSA8PCAyKQ0KKyNkZWZpbmUgRDNEQ0xJUFBMQU5FMyAoMSA8PCAzKQ0KKyNkZWZpbmUgRDNEQ0xJUFBMQU5FNCAoMSA8PCA0KQ0KKyNkZWZpbmUgRDNEQ0xJUFBMQU5FNSAoMSA8PCA1KQ0KKw0KKy8vIFRoZSBmb2xsb3dpbmcgYml0cyBhcmUgdXNlZCBpbiB0aGUgQ2xpcFVuaW9uIGFuZCBDbGlwSW50ZXJzZWN0aW9uDQorLy8gbWVtYmVycyBvZiB0aGUgRDNEQ0xJUFNUQVRVUzgNCisvLw0KKw0KKyNkZWZpbmUgRDNEQ1NfTEVGVCAgICAgICAgMHgwMDAwMDAwMUwNCisjZGVmaW5lIEQzRENTX1JJR0hUICAgICAgIDB4MDAwMDAwMDJMDQorI2RlZmluZSBEM0RDU19UT1AgICAgICAgICAweDAwMDAwMDA0TA0KKyNkZWZpbmUgRDNEQ1NfQk9UVE9NICAgICAgMHgwMDAwMDAwOEwNCisjZGVmaW5lIEQzRENTX0ZST05UICAgICAgIDB4MDAwMDAwMTBMDQorI2RlZmluZSBEM0RDU19CQUNLICAgICAgICAweDAwMDAwMDIwTA0KKyNkZWZpbmUgRDNEQ1NfUExBTkUwICAgICAgMHgwMDAwMDA0MEwNCisjZGVmaW5lIEQzRENTX1BMQU5FMSAgICAgIDB4MDAwMDAwODBMDQorI2RlZmluZSBEM0RDU19QTEFORTIgICAgICAweDAwMDAwMTAwTA0KKyNkZWZpbmUgRDNEQ1NfUExBTkUzICAgICAgMHgwMDAwMDIwMEwNCisjZGVmaW5lIEQzRENTX1BMQU5FNCAgICAgIDB4MDAwMDA0MDBMDQorI2RlZmluZSBEM0RDU19QTEFORTUgICAgICAweDAwMDAwODAwTA0KKw0KKyNkZWZpbmUgRDNEQ1NfQUxMIChEM0RDU19MRUZUICAgfCBcDQorICAgICAgICAgICAgICAgICAgIEQzRENTX1JJR0hUICB8IFwNCisgICAgICAgICAgICAgICAgICAgRDNEQ1NfVE9QICAgIHwgXA0KKyAgICAgICAgICAgICAgICAgICBEM0RDU19CT1RUT00gfCBcDQorICAgICAgICAgICAgICAgICAgIEQzRENTX0ZST05UICB8IFwNCisgICAgICAgICAgICAgICAgICAgRDNEQ1NfQkFDSyAgIHwgXA0KKyAgICAgICAgICAgICAgICAgICBEM0RDU19QTEFORTAgfCBcDQorICAgICAgICAgICAgICAgICAgIEQzRENTX1BMQU5FMSB8IFwNCisgICAgICAgICAgICAgICAgICAgRDNEQ1NfUExBTkUyIHwgXA0KKyAgICAgICAgICAgICAgICAgICBEM0RDU19QTEFORTMgfCBcDQorICAgICAgICAgICAgICAgICAgIEQzRENTX1BMQU5FNCB8IFwNCisgICAgICAgICAgICAgICAgICAgRDNEQ1NfUExBTkU1KQ0KKw0KK3R5cGVkZWYgc3RydWN0IF9EM0RDTElQU1RBVFVTOCB7DQorICAgIERXT1JEIENsaXBVbmlvbjsNCisgICAgRFdPUkQgQ2xpcEludGVyc2VjdGlvbjsNCit9IEQzRENMSVBTVEFUVVM4Ow0KKw0KK3R5cGVkZWYgc3RydWN0IF9EM0RNQVRFUklBTDggew0KKyAgICBEM0RDT0xPUlZBTFVFICAgRGlmZnVzZTsgICAgICAgIC8qIERpZmZ1c2UgY29sb3IgUkdCQSAqLw0KKyAgICBEM0RDT0xPUlZBTFVFICAgQW1iaWVudDsgICAgICAgIC8qIEFtYmllbnQgY29sb3IgUkdCICovDQorICAgIEQzRENPTE9SVkFMVUUgICBTcGVjdWxhcjsgICAgICAgLyogU3BlY3VsYXIgJ3NoaW5pbmVzcycgKi8NCisgICAgRDNEQ09MT1JWQUxVRSAgIEVtaXNzaXZlOyAgICAgICAvKiBFbWlzc2l2ZSBjb2xvciBSR0IgKi8NCisgICAgZmxvYXQgICAgICAgICAgIFBvd2VyOyAgICAgICAgICAvKiBTaGFycG5lc3MgaWYgc3BlY3VsYXIgaGlnaGxpZ2h0ICovDQorfSBEM0RNQVRFUklBTDg7DQorDQordHlwZWRlZiBlbnVtIF9EM0RMSUdIVFRZUEUgew0KKyAgICBEM0RMSUdIVF9QT0lOVCAgICAgICAgICA9IDEsDQorICAgIEQzRExJR0hUX1NQT1QgICAgICAgICAgID0gMiwNCisgICAgRDNETElHSFRfRElSRUNUSU9OQUwgICAgPSAzLA0KKyAgICBEM0RMSUdIVF9GT1JDRV9EV09SRCAgICA9IDB4N2ZmZmZmZmYsIC8qIGZvcmNlIDMyLWJpdCBzaXplIGVudW0gKi8NCit9IEQzRExJR0hUVFlQRTsNCisNCit0eXBlZGVmIHN0cnVjdCBfRDNETElHSFQ4IHsNCisgICAgRDNETElHSFRUWVBFICAgIFR5cGU7ICAgICAgICAgICAgLyogVHlwZSBvZiBsaWdodCBzb3VyY2UgKi8NCisgICAgRDNEQ09MT1JWQUxVRSAgIERpZmZ1c2U7ICAgICAgICAgLyogRGlmZnVzZSBjb2xvciBvZiBsaWdodCAqLw0KKyAgICBEM0RDT0xPUlZBTFVFICAgU3BlY3VsYXI7ICAgICAgICAvKiBTcGVjdWxhciBjb2xvciBvZiBsaWdodCAqLw0KKyAgICBEM0RDT0xPUlZBTFVFICAgQW1iaWVudDsgICAgICAgICAvKiBBbWJpZW50IGNvbG9yIG9mIGxpZ2h0ICovDQorICAgIEQzRFZFQ1RPUiAgICAgICBQb3NpdGlvbjsgICAgICAgICAvKiBQb3NpdGlvbiBpbiB3b3JsZCBzcGFjZSAqLw0KKyAgICBEM0RWRUNUT1IgICAgICAgRGlyZWN0aW9uOyAgICAgICAgLyogRGlyZWN0aW9uIGluIHdvcmxkIHNwYWNlICovDQorICAgIGZsb2F0ICAgICAgICAgICBSYW5nZTsgICAgICAgICAgICAvKiBDdXRvZmYgcmFuZ2UgKi8NCisgICAgZmxvYXQgICAgICAgICAgIEZhbGxvZmY7ICAgICAgICAgIC8qIEZhbGxvZmYgKi8NCisgICAgZmxvYXQgICAgICAgICAgIEF0dGVudWF0aW9uMDsgICAgIC8qIENvbnN0YW50IGF0dGVudWF0aW9uICovDQorICAgIGZsb2F0ICAgICAgICAgICBBdHRlbnVhdGlvbjE7ICAgICAvKiBMaW5lYXIgYXR0ZW51YXRpb24gKi8NCisgICAgZmxvYXQgICAgICAgICAgIEF0dGVudWF0aW9uMjsgICAgIC8qIFF1YWRyYXRpYyBhdHRlbnVhdGlvbiAqLw0KKyAgICBmbG9hdCAgICAgICAgICAgVGhldGE7ICAgICAgICAgICAgLyogSW5uZXIgYW5nbGUgb2Ygc3BvdGxpZ2h0IGNvbmUgKi8NCisgICAgZmxvYXQgICAgICAgICAgIFBoaTsgICAgICAgICAgICAgIC8qIE91dGVyIGFuZ2xlIG9mIHNwb3RsaWdodCBjb25lICovDQorfSBEM0RMSUdIVDg7DQorDQorLyoNCisgKiBPcHRpb25zIGZvciBjbGVhcmluZw0KKyAqLw0KKyNkZWZpbmUgRDNEQ0xFQVJfVEFSR0VUICAgICAgICAgICAgMHgwMDAwMDAwMWwgIC8qIENsZWFyIHRhcmdldCBzdXJmYWNlICovDQorI2RlZmluZSBEM0RDTEVBUl9aQlVGRkVSICAgICAgICAgICAweDAwMDAwMDAybCAgLyogQ2xlYXIgdGFyZ2V0IHogYnVmZmVyICovDQorI2RlZmluZSBEM0RDTEVBUl9TVEVOQ0lMICAgICAgICAgICAweDAwMDAwMDA0bCAgLyogQ2xlYXIgc3RlbmNpbCBwbGFuZXMgKi8NCisNCisvKg0KKyAqIFRoZSBmb2xsb3dpbmcgZGVmaW5lcyB0aGUgcmVuZGVyaW5nIHN0YXRlcw0KKyAqLw0KKw0KK3R5cGVkZWYgZW51bSBfRDNEU0hBREVNT0RFIHsNCisgICAgRDNEU0hBREVfRkxBVCAgICAgICAgICAgICAgID0gMSwNCisgICAgRDNEU0hBREVfR09VUkFVRCAgICAgICAgICAgID0gMiwNCisgICAgRDNEU0hBREVfUEhPTkcgICAgICAgICAgICAgID0gMywNCisgICAgRDNEU0hBREVfRk9SQ0VfRFdPUkQgICAgICAgID0gMHg3ZmZmZmZmZiwgLyogZm9yY2UgMzItYml0IHNpemUgZW51bSAqLw0KK30gRDNEU0hBREVNT0RFOw0KKw0KK3R5cGVkZWYgZW51bSBfRDNERklMTE1PREUgew0KKyAgICBEM0RGSUxMX1BPSU5UICAgICAgICAgICAgICAgPSAxLA0KKyAgICBEM0RGSUxMX1dJUkVGUkFNRSAgICAgICAgICAgPSAyLA0KKyAgICBEM0RGSUxMX1NPTElEICAgICAgICAgICAgICAgPSAzLA0KKyAgICBEM0RGSUxMX0ZPUkNFX0RXT1JEICAgICAgICAgPSAweDdmZmZmZmZmLCAvKiBmb3JjZSAzMi1iaXQgc2l6ZSBlbnVtICovDQorfSBEM0RGSUxMTU9ERTsNCisNCit0eXBlZGVmIHN0cnVjdCBfRDNETElORVBBVFRFUk4gew0KKyAgICBXT1JEICAgIHdSZXBlYXRGYWN0b3I7DQorICAgIFdPUkQgICAgd0xpbmVQYXR0ZXJuOw0KK30gRDNETElORVBBVFRFUk47DQorDQordHlwZWRlZiBlbnVtIF9EM0RCTEVORCB7DQorICAgIEQzREJMRU5EX1pFUk8gICAgICAgICAgICAgICA9IDEsDQorICAgIEQzREJMRU5EX09ORSAgICAgICAgICAgICAgICA9IDIsDQorICAgIEQzREJMRU5EX1NSQ0NPTE9SICAgICAgICAgICA9IDMsDQorICAgIEQzREJMRU5EX0lOVlNSQ0NPTE9SICAgICAgICA9IDQsDQorICAgIEQzREJMRU5EX1NSQ0FMUEhBICAgICAgICAgICA9IDUsDQorICAgIEQzREJMRU5EX0lOVlNSQ0FMUEhBICAgICAgICA9IDYsDQorICAgIEQzREJMRU5EX0RFU1RBTFBIQSAgICAgICAgICA9IDcsDQorICAgIEQzREJMRU5EX0lOVkRFU1RBTFBIQSAgICAgICA9IDgsDQorICAgIEQzREJMRU5EX0RFU1RDT0xPUiAgICAgICAgICA9IDksDQorICAgIEQzREJMRU5EX0lOVkRFU1RDT0xPUiAgICAgICA9IDEwLA0KKyAgICBEM0RCTEVORF9TUkNBTFBIQVNBVCAgICAgICAgPSAxMSwNCisgICAgRDNEQkxFTkRfQk9USFNSQ0FMUEhBICAgICAgID0gMTIsDQorICAgIEQzREJMRU5EX0JPVEhJTlZTUkNBTFBIQSAgICA9IDEzLA0KKyAgICBEM0RCTEVORF9GT1JDRV9EV09SRCAgICAgICAgPSAweDdmZmZmZmZmLCAvKiBmb3JjZSAzMi1iaXQgc2l6ZSBlbnVtICovDQorfSBEM0RCTEVORDsNCisNCit0eXBlZGVmIGVudW0gX0QzREJMRU5ET1Agew0KKyAgICBEM0RCTEVORE9QX0FERCAgICAgICAgICAgICAgPSAxLA0KKyAgICBEM0RCTEVORE9QX1NVQlRSQUNUICAgICAgICAgPSAyLA0KKyAgICBEM0RCTEVORE9QX1JFVlNVQlRSQUNUICAgICAgPSAzLA0KKyAgICBEM0RCTEVORE9QX01JTiAgICAgICAgICAgICAgPSA0LA0KKyAgICBEM0RCTEVORE9QX01BWCAgICAgICAgICAgICAgPSA1LA0KKyAgICBEM0RCTEVORE9QX0ZPUkNFX0RXT1JEICAgICAgPSAweDdmZmZmZmZmLCAvKiBmb3JjZSAzMi1iaXQgc2l6ZSBlbnVtICovDQorfSBEM0RCTEVORE9QOw0KKw0KK3R5cGVkZWYgZW51bSBfRDNEVEVYVFVSRUFERFJFU1Mgew0KKyAgICBEM0RUQUREUkVTU19XUkFQICAgICAgICAgICAgPSAxLA0KKyAgICBEM0RUQUREUkVTU19NSVJST1IgICAgICAgICAgPSAyLA0KKyAgICBEM0RUQUREUkVTU19DTEFNUCAgICAgICAgICAgPSAzLA0KKyAgICBEM0RUQUREUkVTU19CT1JERVIgICAgICAgICAgPSA0LA0KKyAgICBEM0RUQUREUkVTU19NSVJST1JPTkNFICAgICAgPSA1LA0KKyAgICBEM0RUQUREUkVTU19GT1JDRV9EV09SRCAgICAgPSAweDdmZmZmZmZmLCAvKiBmb3JjZSAzMi1iaXQgc2l6ZSBlbnVtICovDQorfSBEM0RURVhUVVJFQUREUkVTUzsNCisNCit0eXBlZGVmIGVudW0gX0QzRENVTEwgew0KKyAgICBEM0RDVUxMX05PTkUgICAgICAgICAgICAgICAgPSAxLA0KKyAgICBEM0RDVUxMX0NXICAgICAgICAgICAgICAgICAgPSAyLA0KKyAgICBEM0RDVUxMX0NDVyAgICAgICAgICAgICAgICAgPSAzLA0KKyAgICBEM0RDVUxMX0ZPUkNFX0RXT1JEICAgICAgICAgPSAweDdmZmZmZmZmLCAvKiBmb3JjZSAzMi1iaXQgc2l6ZSBlbnVtICovDQorfSBEM0RDVUxMOw0KKw0KK3R5cGVkZWYgZW51bSBfRDNEQ01QRlVOQyB7DQorICAgIEQzRENNUF9ORVZFUiAgICAgICAgICAgICAgICA9IDEsDQorICAgIEQzRENNUF9MRVNTICAgICAgICAgICAgICAgICA9IDIsDQorICAgIEQzRENNUF9FUVVBTCAgICAgICAgICAgICAgICA9IDMsDQorICAgIEQzRENNUF9MRVNTRVFVQUwgICAgICAgICAgICA9IDQsDQorICAgIEQzRENNUF9HUkVBVEVSICAgICAgICAgICAgICA9IDUsDQorICAgIEQzRENNUF9OT1RFUVVBTCAgICAgICAgICAgICA9IDYsDQorICAgIEQzRENNUF9HUkVBVEVSRVFVQUwgICAgICAgICA9IDcsDQorICAgIEQzRENNUF9BTFdBWVMgICAgICAgICAgICAgICA9IDgsDQorICAgIEQzRENNUF9GT1JDRV9EV09SRCAgICAgICAgICA9IDB4N2ZmZmZmZmYsIC8qIGZvcmNlIDMyLWJpdCBzaXplIGVudW0gKi8NCit9IEQzRENNUEZVTkM7DQorDQordHlwZWRlZiBlbnVtIF9EM0RTVEVOQ0lMT1Agew0KKyAgICBEM0RTVEVOQ0lMT1BfS0VFUCAgICAgICAgICAgPSAxLA0KKyAgICBEM0RTVEVOQ0lMT1BfWkVSTyAgICAgICAgICAgPSAyLA0KKyAgICBEM0RTVEVOQ0lMT1BfUkVQTEFDRSAgICAgICAgPSAzLA0KKyAgICBEM0RTVEVOQ0lMT1BfSU5DUlNBVCAgICAgICAgPSA0LA0KKyAgICBEM0RTVEVOQ0lMT1BfREVDUlNBVCAgICAgICAgPSA1LA0KKyAgICBEM0RTVEVOQ0lMT1BfSU5WRVJUICAgICAgICAgPSA2LA0KKyAgICBEM0RTVEVOQ0lMT1BfSU5DUiAgICAgICAgICAgPSA3LA0KKyAgICBEM0RTVEVOQ0lMT1BfREVDUiAgICAgICAgICAgPSA4LA0KKyAgICBEM0RTVEVOQ0lMT1BfRk9SQ0VfRFdPUkQgICAgPSAweDdmZmZmZmZmLCAvKiBmb3JjZSAzMi1iaXQgc2l6ZSBlbnVtICovDQorfSBEM0RTVEVOQ0lMT1A7DQorDQordHlwZWRlZiBlbnVtIF9EM0RGT0dNT0RFIHsNCisgICAgRDNERk9HX05PTkUgICAgICAgICAgICAgICAgID0gMCwNCisgICAgRDNERk9HX0VYUCAgICAgICAgICAgICAgICAgID0gMSwNCisgICAgRDNERk9HX0VYUDIgICAgICAgICAgICAgICAgID0gMiwNCisgICAgRDNERk9HX0xJTkVBUiAgICAgICAgICAgICAgID0gMywNCisgICAgRDNERk9HX0ZPUkNFX0RXT1JEICAgICAgICAgID0gMHg3ZmZmZmZmZiwgLyogZm9yY2UgMzItYml0IHNpemUgZW51bSAqLw0KK30gRDNERk9HTU9ERTsNCisNCit0eXBlZGVmIGVudW0gX0QzRFpCVUZGRVJUWVBFIHsNCisgICAgRDNEWkJfRkFMU0UgICAgICAgICAgICAgICAgID0gMCwNCisgICAgRDNEWkJfVFJVRSAgICAgICAgICAgICAgICAgID0gMSwgLy8gWiBidWZmZXJpbmcNCisgICAgRDNEWkJfVVNFVyAgICAgICAgICAgICAgICAgID0gMiwgLy8gVyBidWZmZXJpbmcNCisgICAgRDNEWkJfRk9SQ0VfRFdPUkQgICAgICAgICAgID0gMHg3ZmZmZmZmZiwgLyogZm9yY2UgMzItYml0IHNpemUgZW51bSAqLw0KK30gRDNEWkJVRkZFUlRZUEU7DQorDQorLy8gUHJpbWl0aXZlcyBzdXBwb3J0ZWQgYnkgZHJhdy1wcmltaXRpdmUgQVBJDQordHlwZWRlZiBlbnVtIF9EM0RQUklNSVRJVkVUWVBFIHsNCisgICAgRDNEUFRfUE9JTlRMSVNUICAgICAgICAgICAgID0gMSwNCisgICAgRDNEUFRfTElORUxJU1QgICAgICAgICAgICAgID0gMiwNCisgICAgRDNEUFRfTElORVNUUklQICAgICAgICAgICAgID0gMywNCisgICAgRDNEUFRfVFJJQU5HTEVMSVNUICAgICAgICAgID0gNCwNCisgICAgRDNEUFRfVFJJQU5HTEVTVFJJUCAgICAgICAgID0gNSwNCisgICAgRDNEUFRfVFJJQU5HTEVGQU4gICAgICAgICAgID0gNiwNCisgICAgRDNEUFRfRk9SQ0VfRFdPUkQgICAgICAgICAgID0gMHg3ZmZmZmZmZiwgLyogZm9yY2UgMzItYml0IHNpemUgZW51bSAqLw0KK30gRDNEUFJJTUlUSVZFVFlQRTsNCisNCit0eXBlZGVmIGVudW0gX0QzRFRSQU5TRk9STVNUQVRFVFlQRSB7DQorICAgIEQzRFRTX1ZJRVcgICAgICAgICAgPSAyLA0KKyAgICBEM0RUU19QUk9KRUNUSU9OICAgID0gMywNCisgICAgRDNEVFNfVEVYVFVSRTAgICAgICA9IDE2LA0KKyAgICBEM0RUU19URVhUVVJFMSAgICAgID0gMTcsDQorICAgIEQzRFRTX1RFWFRVUkUyICAgICAgPSAxOCwNCisgICAgRDNEVFNfVEVYVFVSRTMgICAgICA9IDE5LA0KKyAgICBEM0RUU19URVhUVVJFNCAgICAgID0gMjAsDQorICAgIEQzRFRTX1RFWFRVUkU1ICAgICAgPSAyMSwNCisgICAgRDNEVFNfVEVYVFVSRTYgICAgICA9IDIyLA0KKyAgICBEM0RUU19URVhUVVJFNyAgICAgID0gMjMsDQorICAgIEQzRFRTX0ZPUkNFX0RXT1JEICAgICA9IDB4N2ZmZmZmZmYsIC8qIGZvcmNlIDMyLWJpdCBzaXplIGVudW0gKi8NCit9IEQzRFRSQU5TRk9STVNUQVRFVFlQRTsNCisNCisjZGVmaW5lIEQzRFRTX1dPUkxETUFUUklYKGluZGV4KSAoRDNEVFJBTlNGT1JNU1RBVEVUWVBFKShpbmRleCArIDI1NikNCisjZGVmaW5lIEQzRFRTX1dPUkxEICBEM0RUU19XT1JMRE1BVFJJWCgwKQ0KKyNkZWZpbmUgRDNEVFNfV09STEQxIEQzRFRTX1dPUkxETUFUUklYKDEpDQorI2RlZmluZSBEM0RUU19XT1JMRDIgRDNEVFNfV09STERNQVRSSVgoMikNCisjZGVmaW5lIEQzRFRTX1dPUkxEMyBEM0RUU19XT1JMRE1BVFJJWCgzKQ0KKw0KK3R5cGVkZWYgZW51bSBfRDNEUkVOREVSU1RBVEVUWVBFIHsNCisgICAgRDNEUlNfWkVOQUJMRSAgICAgICAgICAgICAgICAgICA9IDcsICAgIC8qIEQzRFpCVUZGRVJUWVBFIChvciBUUlVFL0ZBTFNFIGZvciBsZWdhY3kpICovDQorICAgIEQzRFJTX0ZJTExNT0RFICAgICAgICAgICAgICAgICAgPSA4LCAgICAvKiBEM0RGSUxMTU9ERSAqLw0KKyAgICBEM0RSU19TSEFERU1PREUgICAgICAgICAgICAgICAgID0gOSwgICAgLyogRDNEU0hBREVNT0RFICovDQorICAgIEQzRFJTX0xJTkVQQVRURVJOICAgICAgICAgICAgICAgPSAxMCwgICAvKiBEM0RMSU5FUEFUVEVSTiAqLw0KKyAgICBEM0RSU19aV1JJVEVFTkFCTEUgICAgICAgICAgICAgID0gMTQsICAgLyogVFJVRSB0byBlbmFibGUgeiB3cml0ZXMgKi8NCisgICAgRDNEUlNfQUxQSEFURVNURU5BQkxFICAgICAgICAgICA9IDE1LCAgIC8qIFRSVUUgdG8gZW5hYmxlIGFscGhhIHRlc3RzICovDQorICAgIEQzRFJTX0xBU1RQSVhFTCAgICAgICAgICAgICAgICAgPSAxNiwgICAvKiBUUlVFIGZvciBsYXN0LXBpeGVsIG9uIGxpbmVzICovDQorICAgIEQzRFJTX1NSQ0JMRU5EICAgICAgICAgICAgICAgICAgPSAxOSwgICAvKiBEM0RCTEVORCAqLw0KKyAgICBEM0RSU19ERVNUQkxFTkQgICAgICAgICAgICAgICAgID0gMjAsICAgLyogRDNEQkxFTkQgKi8NCisgICAgRDNEUlNfQ1VMTE1PREUgICAgICAgICAgICAgICAgICA9IDIyLCAgIC8qIEQzRENVTEwgKi8NCisgICAgRDNEUlNfWkZVTkMgICAgICAgICAgICAgICAgICAgICA9IDIzLCAgIC8qIEQzRENNUEZVTkMgKi8NCisgICAgRDNEUlNfQUxQSEFSRUYgICAgICAgICAgICAgICAgICA9IDI0LCAgIC8qIEQzREZJWEVEICovDQorICAgIEQzRFJTX0FMUEhBRlVOQyAgICAgICAgICAgICAgICAgPSAyNSwgICAvKiBEM0RDTVBGVU5DICovDQorICAgIEQzRFJTX0RJVEhFUkVOQUJMRSAgICAgICAgICAgICAgPSAyNiwgICAvKiBUUlVFIHRvIGVuYWJsZSBkaXRoZXJpbmcgKi8NCisgICAgRDNEUlNfQUxQSEFCTEVOREVOQUJMRSAgICAgICAgICA9IDI3LCAgIC8qIFRSVUUgdG8gZW5hYmxlIGFscGhhIGJsZW5kaW5nICovDQorICAgIEQzRFJTX0ZPR0VOQUJMRSAgICAgICAgICAgICAgICAgPSAyOCwgICAvKiBUUlVFIHRvIGVuYWJsZSBmb2cgYmxlbmRpbmcgKi8NCisgICAgRDNEUlNfU1BFQ1VMQVJFTkFCTEUgICAgICAgICAgICA9IDI5LCAgIC8qIFRSVUUgdG8gZW5hYmxlIHNwZWN1bGFyICovDQorICAgIEQzRFJTX1pWSVNJQkxFICAgICAgICAgICAgICAgICAgPSAzMCwgICAvKiBUUlVFIHRvIGVuYWJsZSB6IGNoZWNraW5nICovDQorICAgIEQzRFJTX0ZPR0NPTE9SICAgICAgICAgICAgICAgICAgPSAzNCwgICAvKiBEM0RDT0xPUiAqLw0KKyAgICBEM0RSU19GT0dUQUJMRU1PREUgICAgICAgICAgICAgID0gMzUsICAgLyogRDNERk9HTU9ERSAqLw0KKyAgICBEM0RSU19GT0dTVEFSVCAgICAgICAgICAgICAgICAgID0gMzYsICAgLyogRm9nIHN0YXJ0IChmb3IgYm90aCB2ZXJ0ZXggYW5kIHBpeGVsIGZvZykgKi8NCisgICAgRDNEUlNfRk9HRU5EICAgICAgICAgICAgICAgICAgICA9IDM3LCAgIC8qIEZvZyBlbmQgICAgICAqLw0KKyAgICBEM0RSU19GT0dERU5TSVRZICAgICAgICAgICAgICAgID0gMzgsICAgLyogRm9nIGRlbnNpdHkgICovDQorICAgIEQzRFJTX0VER0VBTlRJQUxJQVMgICAgICAgICAgICAgPSA0MCwgICAvKiBUUlVFIHRvIGVuYWJsZSBlZGdlIGFudGlhbGlhc2luZyAqLw0KKyAgICBEM0RSU19aQklBUyAgICAgICAgICAgICAgICAgICAgID0gNDcsICAgLyogTE9ORyBaIGJpYXMgKi8NCisgICAgRDNEUlNfUkFOR0VGT0dFTkFCTEUgICAgICAgICAgICA9IDQ4LCAgIC8qIEVuYWJsZXMgcmFuZ2UtYmFzZWQgZm9nICovDQorICAgIEQzRFJTX1NURU5DSUxFTkFCTEUgICAgICAgICAgICAgPSA1MiwgICAvKiBCT09MIGVuYWJsZS9kaXNhYmxlIHN0ZW5jaWxpbmcgKi8NCisgICAgRDNEUlNfU1RFTkNJTEZBSUwgICAgICAgICAgICAgICA9IDUzLCAgIC8qIEQzRFNURU5DSUxPUCB0byBkbyBpZiBzdGVuY2lsIHRlc3QgZmFpbHMgKi8NCisgICAgRDNEUlNfU1RFTkNJTFpGQUlMICAgICAgICAgICAgICA9IDU0LCAgIC8qIEQzRFNURU5DSUxPUCB0byBkbyBpZiBzdGVuY2lsIHRlc3QgcGFzc2VzIGFuZCBaIHRlc3QgZmFpbHMgKi8NCisgICAgRDNEUlNfU1RFTkNJTFBBU1MgICAgICAgICAgICAgICA9IDU1LCAgIC8qIEQzRFNURU5DSUxPUCB0byBkbyBpZiBib3RoIHN0ZW5jaWwgYW5kIFogdGVzdHMgcGFzcyAqLw0KKyAgICBEM0RSU19TVEVOQ0lMRlVOQyAgICAgICAgICAgICAgID0gNTYsICAgLyogRDNEQ01QRlVOQyBmbi4gIFN0ZW5jaWwgVGVzdCBwYXNzZXMgaWYgKChyZWYgJiBtYXNrKSBzdGVuY2lsZm4gKHN0ZW5jaWwgJiBtYXNrKSkgaXMgdHJ1ZSAqLw0KKyAgICBEM0RSU19TVEVOQ0lMUkVGICAgICAgICAgICAgICAgID0gNTcsICAgLyogUmVmZXJlbmNlIHZhbHVlIHVzZWQgaW4gc3RlbmNpbCB0ZXN0ICovDQorICAgIEQzRFJTX1NURU5DSUxNQVNLICAgICAgICAgICAgICAgPSA1OCwgICAvKiBNYXNrIHZhbHVlIHVzZWQgaW4gc3RlbmNpbCB0ZXN0ICovDQorICAgIEQzRFJTX1NURU5DSUxXUklURU1BU0sgICAgICAgICAgPSA1OSwgICAvKiBXcml0ZSBtYXNrIGFwcGxpZWQgdG8gdmFsdWVzIHdyaXR0ZW4gdG8gc3RlbmNpbCBidWZmZXIgKi8NCisgICAgRDNEUlNfVEVYVFVSRUZBQ1RPUiAgICAgICAgICAgICA9IDYwLCAgIC8qIEQzRENPTE9SIHVzZWQgZm9yIG11bHRpLXRleHR1cmUgYmxlbmQgKi8NCisgICAgRDNEUlNfV1JBUDAgICAgICAgICAgICAgICAgICAgICA9IDEyOCwgIC8qIHdyYXAgZm9yIDFzdCB0ZXh0dXJlIGNvb3JkLiBzZXQgKi8NCisgICAgRDNEUlNfV1JBUDEgICAgICAgICAgICAgICAgICAgICA9IDEyOSwgIC8qIHdyYXAgZm9yIDJuZCB0ZXh0dXJlIGNvb3JkLiBzZXQgKi8NCisgICAgRDNEUlNfV1JBUDIgICAgICAgICAgICAgICAgICAgICA9IDEzMCwgIC8qIHdyYXAgZm9yIDNyZCB0ZXh0dXJlIGNvb3JkLiBzZXQgKi8NCisgICAgRDNEUlNfV1JBUDMgICAgICAgICAgICAgICAgICAgICA9IDEzMSwgIC8qIHdyYXAgZm9yIDR0aCB0ZXh0dXJlIGNvb3JkLiBzZXQgKi8NCisgICAgRDNEUlNfV1JBUDQgICAgICAgICAgICAgICAgICAgICA9IDEzMiwgIC8qIHdyYXAgZm9yIDV0aCB0ZXh0dXJlIGNvb3JkLiBzZXQgKi8NCisgICAgRDNEUlNfV1JBUDUgICAgICAgICAgICAgICAgICAgICA9IDEzMywgIC8qIHdyYXAgZm9yIDZ0aCB0ZXh0dXJlIGNvb3JkLiBzZXQgKi8NCisgICAgRDNEUlNfV1JBUDYgICAgICAgICAgICAgICAgICAgICA9IDEzNCwgIC8qIHdyYXAgZm9yIDd0aCB0ZXh0dXJlIGNvb3JkLiBzZXQgKi8NCisgICAgRDNEUlNfV1JBUDcgICAgICAgICAgICAgICAgICAgICA9IDEzNSwgIC8qIHdyYXAgZm9yIDh0aCB0ZXh0dXJlIGNvb3JkLiBzZXQgKi8NCisgICAgRDNEUlNfQ0xJUFBJTkcgICAgICAgICAgICAgICAgICA9IDEzNiwNCisgICAgRDNEUlNfTElHSFRJTkcgICAgICAgICAgICAgICAgICA9IDEzNywNCisgICAgRDNEUlNfQU1CSUVOVCAgICAgICAgICAgICAgICAgICA9IDEzOSwNCisgICAgRDNEUlNfRk9HVkVSVEVYTU9ERSAgICAgICAgICAgICA9IDE0MCwNCisgICAgRDNEUlNfQ09MT1JWRVJURVggICAgICAgICAgICAgICA9IDE0MSwNCisgICAgRDNEUlNfTE9DQUxWSUVXRVIgICAgICAgICAgICAgICA9IDE0MiwNCisgICAgRDNEUlNfTk9STUFMSVpFTk9STUFMUyAgICAgICAgICA9IDE0MywNCisgICAgRDNEUlNfRElGRlVTRU1BVEVSSUFMU09VUkNFICAgICA9IDE0NSwNCisgICAgRDNEUlNfU1BFQ1VMQVJNQVRFUklBTFNPVVJDRSAgICA9IDE0NiwNCisgICAgRDNEUlNfQU1CSUVOVE1BVEVSSUFMU09VUkNFICAgICA9IDE0NywNCisgICAgRDNEUlNfRU1JU1NJVkVNQVRFUklBTFNPVVJDRSAgICA9IDE0OCwNCisgICAgRDNEUlNfVkVSVEVYQkxFTkQgICAgICAgICAgICAgICA9IDE1MSwNCisgICAgRDNEUlNfQ0xJUFBMQU5FRU5BQkxFICAgICAgICAgICA9IDE1MiwNCisgICAgRDNEUlNfU09GVFdBUkVWRVJURVhQUk9DRVNTSU5HICA9IDE1MywNCisgICAgRDNEUlNfUE9JTlRTSVpFICAgICAgICAgICAgICAgICA9IDE1NCwgICAvKiBmbG9hdCBwb2ludCBzaXplICovDQorICAgIEQzRFJTX1BPSU5UU0laRV9NSU4gICAgICAgICAgICAgPSAxNTUsICAgLyogZmxvYXQgcG9pbnQgc2l6ZSBtaW4gdGhyZXNob2xkICovDQorICAgIEQzRFJTX1BPSU5UU1BSSVRFRU5BQkxFICAgICAgICAgPSAxNTYsICAgLyogQk9PTCBwb2ludCB0ZXh0dXJlIGNvb3JkIGNvbnRyb2wgKi8NCisgICAgRDNEUlNfUE9JTlRTQ0FMRUVOQUJMRSAgICAgICAgICA9IDE1NywgICAvKiBCT09MIHBvaW50IHNpemUgc2NhbGUgZW5hYmxlICovDQorICAgIEQzRFJTX1BPSU5UU0NBTEVfQSAgICAgICAgICAgICAgPSAxNTgsICAgLyogZmxvYXQgcG9pbnQgYXR0ZW51YXRpb24gQSB2YWx1ZSAqLw0KKyAgICBEM0RSU19QT0lOVFNDQUxFX0IgICAgICAgICAgICAgID0gMTU5LCAgIC8qIGZsb2F0IHBvaW50IGF0dGVudWF0aW9uIEIgdmFsdWUgKi8NCisgICAgRDNEUlNfUE9JTlRTQ0FMRV9DICAgICAgICAgICAgICA9IDE2MCwgICAvKiBmbG9hdCBwb2ludCBhdHRlbnVhdGlvbiBDIHZhbHVlICovDQorICAgIEQzRFJTX01VTFRJU0FNUExFQU5USUFMSUFTICAgICAgPSAxNjEsICAvLyBCT09MIC0gc2V0IHRvIGRvIEZTQUEgd2l0aCBtdWx0aXNhbXBsZSBidWZmZXINCisgICAgRDNEUlNfTVVMVElTQU1QTEVNQVNLICAgICAgICAgICA9IDE2MiwgIC8vIERXT1JEIC0gcGVyLXNhbXBsZSBlbmFibGUvZGlzYWJsZQ0KKyAgICBEM0RSU19QQVRDSEVER0VTVFlMRSAgICAgICAgICAgID0gMTYzLCAgLy8gU2V0cyB3aGV0aGVyIHBhdGNoIGVkZ2VzIHdpbGwgdXNlIGZsb2F0IHN0eWxlIHRlc3NlbGxhdGlvbg0KKyAgICBEM0RSU19QQVRDSFNFR01FTlRTICAgICAgICAgICAgID0gMTY0LCAgLy8gTnVtYmVyIG9mIHNlZ21lbnRzIHBlciBlZGdlIHdoZW4gZHJhd2luZyBwYXRjaGVzDQorICAgIEQzRFJTX0RFQlVHTU9OSVRPUlRPS0VOICAgICAgICAgPSAxNjUsICAvLyBERUJVRyBPTkxZIC0gdG9rZW4gdG8gZGVidWcgbW9uaXRvcg0KKyAgICBEM0RSU19QT0lOVFNJWkVfTUFYICAgICAgICAgICAgID0gMTY2LCAgIC8qIGZsb2F0IHBvaW50IHNpemUgbWF4IHRocmVzaG9sZCAqLw0KKyAgICBEM0RSU19JTkRFWEVEVkVSVEVYQkxFTkRFTkFCTEUgID0gMTY3LA0KKyAgICBEM0RSU19DT0xPUldSSVRFRU5BQkxFICAgICAgICAgID0gMTY4LCAgLy8gcGVyLWNoYW5uZWwgd3JpdGUgZW5hYmxlDQorICAgIEQzRFJTX1RXRUVORkFDVE9SICAgICAgICAgICAgICAgPSAxNzAsICAgLy8gZmxvYXQgdHdlZW4gZmFjdG9yDQorICAgIEQzRFJTX0JMRU5ET1AgICAgICAgICAgICAgICAgICAgPSAxNzEsICAgLy8gRDNEQkxFTkRPUCBzZXR0aW5nDQorICAgIEQzRFJTX1BPU0lUSU9OT1JERVIgICAgICAgICAgICAgPSAxNzIsICAgLy8gTlBhdGNoIHBvc2l0aW9uIGludGVycG9sYXRpb24gb3JkZXIuIEQzRE9SREVSX0xJTkVBUiBvciBEM0RPUkRFUl9DVUJJQyAoZGVmYXVsdCkNCisgICAgRDNEUlNfTk9STUFMT1JERVIgICAgICAgICAgICAgICA9IDE3MywgICAvLyBOUGF0Y2ggbm9ybWFsIGludGVycG9sYXRpb24gb3JkZXIuIEQzRE9SREVSX0xJTkVBUiAoZGVmYXVsdCkgb3IgRDNET1JERVJfUVVBRFJBVElDDQorDQorICAgIEQzRFJTX0ZPUkNFX0RXT1JEICAgICAgICAgICAgICAgPSAweDdmZmZmZmZmLCAvKiBmb3JjZSAzMi1iaXQgc2l6ZSBlbnVtICovDQorfSBEM0RSRU5ERVJTVEFURVRZUEU7DQorDQorLy8gVmFsdWVzIGZvciBtYXRlcmlhbCBzb3VyY2UNCit0eXBlZGVmIGVudW0gX0QzRE1BVEVSSUFMQ09MT1JTT1VSQ0UNCit7DQorICAgIEQzRE1DU19NQVRFUklBTCAgICAgICAgID0gMCwgICAgICAgICAgICAvLyBDb2xvciBmcm9tIG1hdGVyaWFsIGlzIHVzZWQNCisgICAgRDNETUNTX0NPTE9SMSAgICAgICAgICAgPSAxLCAgICAgICAgICAgIC8vIERpZmZ1c2UgdmVydGV4IGNvbG9yIGlzIHVzZWQNCisgICAgRDNETUNTX0NPTE9SMiAgICAgICAgICAgPSAyLCAgICAgICAgICAgIC8vIFNwZWN1bGFyIHZlcnRleCBjb2xvciBpcyB1c2VkDQorICAgIEQzRE1DU19GT1JDRV9EV09SRCAgICAgID0gMHg3ZmZmZmZmZiwgICAvLyBmb3JjZSAzMi1iaXQgc2l6ZSBlbnVtDQorfSBEM0RNQVRFUklBTENPTE9SU09VUkNFOw0KKw0KKy8vIEJpYXMgdG8gYXBwbHkgdG8gdGhlIHRleHR1cmUgY29vcmRpbmF0ZSBzZXQgdG8gYXBwbHkgYSB3cmFwIHRvLg0KKyNkZWZpbmUgRDNEUkVOREVSU1RBVEVfV1JBUEJJQVMgICAgICAgICAgICAgICAgIDEyOFVMDQorDQorLyogRmxhZ3MgdG8gY29uc3RydWN0IHRoZSBXUkFQIHJlbmRlciBzdGF0ZXMgKi8NCisjZGVmaW5lIEQzRFdSQVBfVSAgIDB4MDAwMDAwMDFMDQorI2RlZmluZSBEM0RXUkFQX1YgICAweDAwMDAwMDAyTA0KKyNkZWZpbmUgRDNEV1JBUF9XICAgMHgwMDAwMDAwNEwNCisNCisvKiBGbGFncyB0byBjb25zdHJ1Y3QgdGhlIFdSQVAgcmVuZGVyIHN0YXRlcyBmb3IgMUQgdGhydSA0RCB0ZXh0dXJlIGNvb3JkaW5hdGVzICovDQorI2RlZmluZSBEM0RXUkFQQ09PUkRfMCAgIDB4MDAwMDAwMDFMICAgIC8vIHNhbWUgYXMgRDNEV1JBUF9VDQorI2RlZmluZSBEM0RXUkFQQ09PUkRfMSAgIDB4MDAwMDAwMDJMICAgIC8vIHNhbWUgYXMgRDNEV1JBUF9WDQorI2RlZmluZSBEM0RXUkFQQ09PUkRfMiAgIDB4MDAwMDAwMDRMICAgIC8vIHNhbWUgYXMgRDNEV1JBUF9XDQorI2RlZmluZSBEM0RXUkFQQ09PUkRfMyAgIDB4MDAwMDAwMDhMDQorDQorLyogRmxhZ3MgdG8gY29uc3RydWN0IEQzRFJTX0NPTE9SV1JJVEVFTkFCTEUgKi8NCisjZGVmaW5lIEQzRENPTE9SV1JJVEVFTkFCTEVfUkVEICAgICAoMUw8PDApDQorI2RlZmluZSBEM0RDT0xPUldSSVRFRU5BQkxFX0dSRUVOICAgKDFMPDwxKQ0KKyNkZWZpbmUgRDNEQ09MT1JXUklURUVOQUJMRV9CTFVFICAgICgxTDw8MikNCisjZGVmaW5lIEQzRENPTE9SV1JJVEVFTkFCTEVfQUxQSEEgICAoMUw8PDMpDQorDQorLyoNCisgKiBTdGF0ZSBlbnVtZXJhbnRzIGZvciBwZXItc3RhZ2UgdGV4dHVyZSBwcm9jZXNzaW5nLg0KKyAqLw0KK3R5cGVkZWYgZW51bSBfRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFDQorew0KKyAgICBEM0RUU1NfQ09MT1JPUCAgICAgICAgPSAgMSwgLyogRDNEVEVYVFVSRU9QIC0gcGVyLXN0YWdlIGJsZW5kaW5nIGNvbnRyb2xzIGZvciBjb2xvciBjaGFubmVscyAqLw0KKyAgICBEM0RUU1NfQ09MT1JBUkcxICAgICAgPSAgMiwgLyogRDNEVEFfKiAodGV4dHVyZSBhcmcpICovDQorICAgIEQzRFRTU19DT0xPUkFSRzIgICAgICA9ICAzLCAvKiBEM0RUQV8qICh0ZXh0dXJlIGFyZykgKi8NCisgICAgRDNEVFNTX0FMUEhBT1AgICAgICAgID0gIDQsIC8qIEQzRFRFWFRVUkVPUCAtIHBlci1zdGFnZSBibGVuZGluZyBjb250cm9scyBmb3IgYWxwaGEgY2hhbm5lbCAqLw0KKyAgICBEM0RUU1NfQUxQSEFBUkcxICAgICAgPSAgNSwgLyogRDNEVEFfKiAodGV4dHVyZSBhcmcpICovDQorICAgIEQzRFRTU19BTFBIQUFSRzIgICAgICA9ICA2LCAvKiBEM0RUQV8qICh0ZXh0dXJlIGFyZykgKi8NCisgICAgRDNEVFNTX0JVTVBFTlZNQVQwMCAgID0gIDcsIC8qIGZsb2F0IChidW1wIG1hcHBpbmcgbWF0cml4KSAqLw0KKyAgICBEM0RUU1NfQlVNUEVOVk1BVDAxICAgPSAgOCwgLyogZmxvYXQgKGJ1bXAgbWFwcGluZyBtYXRyaXgpICovDQorICAgIEQzRFRTU19CVU1QRU5WTUFUMTAgICA9ICA5LCAvKiBmbG9hdCAoYnVtcCBtYXBwaW5nIG1hdHJpeCkgKi8NCisgICAgRDNEVFNTX0JVTVBFTlZNQVQxMSAgID0gMTAsIC8qIGZsb2F0IChidW1wIG1hcHBpbmcgbWF0cml4KSAqLw0KKyAgICBEM0RUU1NfVEVYQ09PUkRJTkRFWCAgPSAxMSwgLyogaWRlbnRpZmllcyB3aGljaCBzZXQgb2YgdGV4dHVyZSBjb29yZGluYXRlcyBpbmRleCB0aGlzIHRleHR1cmUgKi8NCisgICAgRDNEVFNTX0FERFJFU1NVICAgICAgID0gMTMsIC8qIEQzRFRFWFRVUkVBRERSRVNTIGZvciBVIGNvb3JkaW5hdGUgKi8NCisgICAgRDNEVFNTX0FERFJFU1NWICAgICAgID0gMTQsIC8qIEQzRFRFWFRVUkVBRERSRVNTIGZvciBWIGNvb3JkaW5hdGUgKi8NCisgICAgRDNEVFNTX0JPUkRFUkNPTE9SICAgID0gMTUsIC8qIEQzRENPTE9SICovDQorICAgIEQzRFRTU19NQUdGSUxURVIgICAgICA9IDE2LCAvKiBEM0RURVhUVVJFRklMVEVSIGZpbHRlciB0byB1c2UgZm9yIG1hZ25pZmljYXRpb24gKi8NCisgICAgRDNEVFNTX01JTkZJTFRFUiAgICAgID0gMTcsIC8qIEQzRFRFWFRVUkVGSUxURVIgZmlsdGVyIHRvIHVzZSBmb3IgbWluaWZpY2F0aW9uICovDQorICAgIEQzRFRTU19NSVBGSUxURVIgICAgICA9IDE4LCAvKiBEM0RURVhUVVJFRklMVEVSIGZpbHRlciB0byB1c2UgYmV0d2VlbiBtaXBtYXBzIGR1cmluZyBtaW5pZmljYXRpb24gKi8NCisgICAgRDNEVFNTX01JUE1BUExPREJJQVMgID0gMTksIC8qIGZsb2F0IE1pcG1hcCBMT0QgYmlhcyAqLw0KKyAgICBEM0RUU1NfTUFYTUlQTEVWRUwgICAgPSAyMCwgLyogRFdPUkQgMC4uKG4tMSkgTE9EIGluZGV4IG9mIGxhcmdlc3QgbWFwIHRvIHVzZSAoMCA9PSBsYXJnZXN0KSAqLw0KKyAgICBEM0RUU1NfTUFYQU5JU09UUk9QWSAgPSAyMSwgLyogRFdPUkQgbWF4aW11bSBhbmlzb3Ryb3B5ICovDQorICAgIEQzRFRTU19CVU1QRU5WTFNDQUxFICA9IDIyLCAvKiBmbG9hdCBzY2FsZSBmb3IgYnVtcCBtYXAgbHVtaW5hbmNlICovDQorICAgIEQzRFRTU19CVU1QRU5WTE9GRlNFVCA9IDIzLCAvKiBmbG9hdCBvZmZzZXQgZm9yIGJ1bXAgbWFwIGx1bWluYW5jZSAqLw0KKyAgICBEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTID0gMjQsIC8qIEQzRFRFWFRVUkVUUkFOU0ZPUk1GTEFHUyBjb250cm9scyB0ZXh0dXJlIHRyYW5zZm9ybSAqLw0KKyAgICBEM0RUU1NfQUREUkVTU1cgICAgICAgPSAyNSwgLyogRDNEVEVYVFVSRUFERFJFU1MgZm9yIFcgY29vcmRpbmF0ZSAqLw0KKyAgICBEM0RUU1NfQ09MT1JBUkcwICAgICAgPSAyNiwgLyogRDNEVEFfKiB0aGlyZCBhcmcgZm9yIHRyaWFkaWMgb3BzICovDQorICAgIEQzRFRTU19BTFBIQUFSRzAgICAgICA9IDI3LCAvKiBEM0RUQV8qIHRoaXJkIGFyZyBmb3IgdHJpYWRpYyBvcHMgKi8NCisgICAgRDNEVFNTX1JFU1VMVEFSRyAgICAgID0gMjgsIC8qIEQzRFRBXyogYXJnIGZvciByZXN1bHQgKENVUlJFTlQgb3IgVEVNUCkgKi8NCisgICAgRDNEVFNTX0ZPUkNFX0RXT1JEICAgPSAweDdmZmZmZmZmLCAvKiBmb3JjZSAzMi1iaXQgc2l6ZSBlbnVtICovDQorfSBEM0RURVhUVVJFU1RBR0VTVEFURVRZUEU7DQorDQorLy8gVmFsdWVzLCB1c2VkIHdpdGggRDNEVFNTX1RFWENPT1JESU5ERVgsIHRvIHNwZWNpZnkgdGhhdCB0aGUgdmVydGV4IGRhdGEocG9zaXRpb24NCisvLyBhbmQgbm9ybWFsIGluIHRoZSBjYW1lcmEgc3BhY2UpIHNob3VsZCBiZSB0YWtlbiBhcyB0ZXh0dXJlIGNvb3JkaW5hdGVzDQorLy8gTG93IDE2IGJpdHMgYXJlIHVzZWQgdG8gc3BlY2lmeSB0ZXh0dXJlIGNvb3JkaW5hdGUgaW5kZXgsIHRvIHRha2UgdGhlIFdSQVAgbW9kZSBmcm9tDQorLy8NCisjZGVmaW5lIEQzRFRTU19UQ0lfUEFTU1RIUlUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MDAwMDAwMDANCisjZGVmaW5lIEQzRFRTU19UQ0lfQ0FNRVJBU1BBQ0VOT1JNQUwgICAgICAgICAgICAgICAgICAgIDB4MDAwMTAwMDANCisjZGVmaW5lIEQzRFRTU19UQ0lfQ0FNRVJBU1BBQ0VQT1NJVElPTiAgICAgICAgICAgICAgICAgIDB4MDAwMjAwMDANCisjZGVmaW5lIEQzRFRTU19UQ0lfQ0FNRVJBU1BBQ0VSRUZMRUNUSU9OVkVDVE9SICAgICAgICAgIDB4MDAwMzAwMDANCisNCisvKg0KKyAqIEVudW1lcmF0aW9ucyBmb3IgQ09MT1JPUCBhbmQgQUxQSEFPUCB0ZXh0dXJlIGJsZW5kaW5nIG9wZXJhdGlvbnMgc2V0IGluDQorICogdGV4dHVyZSBwcm9jZXNzaW5nIHN0YWdlIGNvbnRyb2xzIGluIEQzRFRTUy4NCisgKi8NCit0eXBlZGVmIGVudW0gX0QzRFRFWFRVUkVPUA0KK3sNCisgICAgLy8gQ29udHJvbA0KKyAgICBEM0RUT1BfRElTQUJMRSAgICAgICAgICAgICAgPSAxLCAgICAgIC8vIGRpc2FibGVzIHN0YWdlDQorICAgIEQzRFRPUF9TRUxFQ1RBUkcxICAgICAgICAgICA9IDIsICAgICAgLy8gdGhlIGRlZmF1bHQNCisgICAgRDNEVE9QX1NFTEVDVEFSRzIgICAgICAgICAgID0gMywNCisNCisgICAgLy8gTW9kdWxhdGUNCisgICAgRDNEVE9QX01PRFVMQVRFICAgICAgICAgICAgID0gNCwgICAgICAvLyBtdWx0aXBseSBhcmdzIHRvZ2V0aGVyDQorICAgIEQzRFRPUF9NT0RVTEFURTJYICAgICAgICAgICA9IDUsICAgICAgLy8gbXVsdGlwbHkgYW5kICAxIGJpdA0KKyAgICBEM0RUT1BfTU9EVUxBVEU0WCAgICAgICAgICAgPSA2LCAgICAgIC8vIG11bHRpcGx5IGFuZCAgMiBiaXRzDQorDQorICAgIC8vIEFkZA0KKyAgICBEM0RUT1BfQUREICAgICAgICAgICAgICAgICAgPSAgNywgICAvLyBhZGQgYXJndW1lbnRzIHRvZ2V0aGVyDQorICAgIEQzRFRPUF9BRERTSUdORUQgICAgICAgICAgICA9ICA4LCAgIC8vIGFkZCB3aXRoIC0wLjUgYmlhcw0KKyAgICBEM0RUT1BfQUREU0lHTkVEMlggICAgICAgICAgPSAgOSwgICAvLyBhcyBhYm92ZSBidXQgbGVmdCAgMSBiaXQNCisgICAgRDNEVE9QX1NVQlRSQUNUICAgICAgICAgICAgID0gMTAsICAgLy8gQXJnMSAtIEFyZzIsIHdpdGggbm8gc2F0dXJhdGlvbg0KKyAgICBEM0RUT1BfQUREU01PT1RIICAgICAgICAgICAgPSAxMSwgICAvLyBhZGQgMiBhcmdzLCBzdWJ0cmFjdCBwcm9kdWN0DQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFyZzEgKyBBcmcyIC0gQXJnMSpBcmcyDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vID0gQXJnMSArICgxLUFyZzEpKkFyZzINCisNCisgICAgLy8gTGluZWFyIGFscGhhIGJsZW5kOiBBcmcxKihBbHBoYSkgKyBBcmcyKigxLUFscGhhKQ0KKyAgICBEM0RUT1BfQkxFTkRESUZGVVNFQUxQSEEgICAgPSAxMiwgLy8gaXRlcmF0ZWQgYWxwaGENCisgICAgRDNEVE9QX0JMRU5EVEVYVFVSRUFMUEhBICAgID0gMTMsIC8vIHRleHR1cmUgYWxwaGENCisgICAgRDNEVE9QX0JMRU5ERkFDVE9SQUxQSEEgICAgID0gMTQsIC8vIGFscGhhIGZyb20gRDNEUlNfVEVYVFVSRUZBQ1RPUg0KKw0KKyAgICAvLyBMaW5lYXIgYWxwaGEgYmxlbmQgd2l0aCBwcmUtbXVsdGlwbGllZCBhcmcxIGlucHV0OiBBcmcxICsgQXJnMiooMS1BbHBoYSkNCisgICAgRDNEVE9QX0JMRU5EVEVYVFVSRUFMUEhBUE0gID0gMTUsIC8vIHRleHR1cmUgYWxwaGENCisgICAgRDNEVE9QX0JMRU5EQ1VSUkVOVEFMUEhBICAgID0gMTYsIC8vIGJ5IGFscGhhIG9mIGN1cnJlbnQgY29sb3INCisNCisgICAgLy8gU3BlY3VsYXIgbWFwcGluZw0KKyAgICBEM0RUT1BfUFJFTU9EVUxBVEUgICAgICAgICAgICA9IDE3LCAgICAgLy8gbW9kdWxhdGUgd2l0aCBuZXh0IHRleHR1cmUgYmVmb3JlIHVzZQ0KKyAgICBEM0RUT1BfTU9EVUxBVEVBTFBIQV9BRERDT0xPUiA9IDE4LCAgICAgLy8gQXJnMS5SR0IgKyBBcmcxLkEqQXJnMi5SR0INCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENPTE9ST1Agb25seQ0KKyAgICBEM0RUT1BfTU9EVUxBVEVDT0xPUl9BRERBTFBIQSA9IDE5LCAgICAgLy8gQXJnMS5SR0IqQXJnMi5SR0IgKyBBcmcxLkENCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENPTE9ST1Agb25seQ0KKyAgICBEM0RUT1BfTU9EVUxBVEVJTlZBTFBIQV9BRERDT0xPUiA9IDIwLCAgLy8gKDEtQXJnMS5BKSpBcmcyLlJHQiArIEFyZzEuUkdCDQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDT0xPUk9QIG9ubHkNCisgICAgRDNEVE9QX01PRFVMQVRFSU5WQ09MT1JfQUREQUxQSEEgPSAyMSwgIC8vICgxLUFyZzEuUkdCKSpBcmcyLlJHQiArIEFyZzEuQQ0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ09MT1JPUCBvbmx5DQorDQorICAgIC8vIEJ1bXAgbWFwcGluZw0KKyAgICBEM0RUT1BfQlVNUEVOVk1BUCAgICAgICAgICAgPSAyMiwgLy8gcGVyIHBpeGVsIGVudiBtYXAgcGVydHVyYmF0aW9uDQorICAgIEQzRFRPUF9CVU1QRU5WTUFQTFVNSU5BTkNFICA9IDIzLCAvLyB3aXRoIGx1bWluYW5jZSBjaGFubmVsDQorDQorICAgIC8vIFRoaXMgY2FuIGRvIGVpdGhlciBkaWZmdXNlIG9yIHNwZWN1bGFyIGJ1bXAgbWFwcGluZyB3aXRoIGNvcnJlY3QgaW5wdXQuDQorICAgIC8vIFBlcmZvcm1zIHRoZSBmdW5jdGlvbiAoQXJnMS5SKkFyZzIuUiArIEFyZzEuRypBcmcyLkcgKyBBcmcxLkIqQXJnMi5CKQ0KKyAgICAvLyB3aGVyZSBlYWNoIGNvbXBvbmVudCBoYXMgYmVlbiBzY2FsZWQgYW5kIG9mZnNldCB0byBtYWtlIGl0IHNpZ25lZC4NCisgICAgLy8gVGhlIHJlc3VsdCBpcyByZXBsaWNhdGVkIGludG8gYWxsIGZvdXIgKGluY2x1ZGluZyBhbHBoYSkgY2hhbm5lbHMuDQorICAgIC8vIFRoaXMgaXMgYSB2YWxpZCBDT0xPUk9QIG9ubHkuDQorICAgIEQzRFRPUF9ET1RQUk9EVUNUMyAgICAgICAgICA9IDI0LA0KKw0KKyAgICAvLyBUcmlhZGljIG9wcw0KKyAgICBEM0RUT1BfTVVMVElQTFlBREQgICAgICAgICAgPSAyNSwgLy8gQXJnMCArIEFyZzEqQXJnMg0KKyAgICBEM0RUT1BfTEVSUCAgICAgICAgICAgICAgICAgPSAyNiwgLy8gKEFyZzApKkFyZzEgKyAoMS1BcmcwKSpBcmcyDQorDQorICAgIEQzRFRPUF9GT1JDRV9EV09SRCA9IDB4N2ZmZmZmZmYsDQorfSBEM0RURVhUVVJFT1A7DQorDQorLyoNCisgKiBWYWx1ZXMgZm9yIENPTE9SQVJHMCwxLDIsIEFMUEhBQVJHMCwxLDIsIGFuZCBSRVNVTFRBUkcgdGV4dHVyZSBibGVuZGluZw0KKyAqIG9wZXJhdGlvbnMgc2V0IGluIHRleHR1cmUgcHJvY2Vzc2luZyBzdGFnZSBjb250cm9scyBpbiBEM0RSRU5ERVJTVEFURS4NCisgKi8NCisjZGVmaW5lIEQzRFRBX1NFTEVDVE1BU0sgICAgICAgIDB4MDAwMDAwMGYgIC8vIG1hc2sgZm9yIGFyZyBzZWxlY3Rvcg0KKyNkZWZpbmUgRDNEVEFfRElGRlVTRSAgICAgICAgICAgMHgwMDAwMDAwMCAgLy8gc2VsZWN0IGRpZmZ1c2UgY29sb3IgKHJlYWQgb25seSkNCisjZGVmaW5lIEQzRFRBX0NVUlJFTlQgICAgICAgICAgIDB4MDAwMDAwMDEgIC8vIHNlbGVjdCBzdGFnZSBkZXN0aW5hdGlvbiByZWdpc3RlciAocmVhZC93cml0ZSkNCisjZGVmaW5lIEQzRFRBX1RFWFRVUkUgICAgICAgICAgIDB4MDAwMDAwMDIgIC8vIHNlbGVjdCB0ZXh0dXJlIGNvbG9yIChyZWFkIG9ubHkpDQorI2RlZmluZSBEM0RUQV9URkFDVE9SICAgICAgICAgICAweDAwMDAwMDAzICAvLyBzZWxlY3QgRDNEUlNfVEVYVFVSRUZBQ1RPUiAocmVhZCBvbmx5KQ0KKyNkZWZpbmUgRDNEVEFfU1BFQ1VMQVIgICAgICAgICAgMHgwMDAwMDAwNCAgLy8gc2VsZWN0IHNwZWN1bGFyIGNvbG9yIChyZWFkIG9ubHkpDQorI2RlZmluZSBEM0RUQV9URU1QICAgICAgICAgICAgICAweDAwMDAwMDA1ICAvLyBzZWxlY3QgdGVtcG9yYXJ5IHJlZ2lzdGVyIGNvbG9yIChyZWFkL3dyaXRlKQ0KKyNkZWZpbmUgRDNEVEFfQ09NUExFTUVOVCAgICAgICAgMHgwMDAwMDAxMCAgLy8gdGFrZSAxLjAgLSB4IChyZWFkIG1vZGlmaWVyKQ0KKyNkZWZpbmUgRDNEVEFfQUxQSEFSRVBMSUNBVEUgICAgMHgwMDAwMDAyMCAgLy8gcmVwbGljYXRlIGFscGhhIHRvIGNvbG9yIGNvbXBvbmVudHMgKHJlYWQgbW9kaWZpZXIpDQorDQorLy8NCisvLyBWYWx1ZXMgZm9yIEQzRFRTU18qKipGSUxURVIgdGV4dHVyZSBzdGFnZSBzdGF0ZXMNCisvLw0KK3R5cGVkZWYgZW51bSBfRDNEVEVYVFVSRUZJTFRFUlRZUEUNCit7DQorICAgIEQzRFRFWEZfTk9ORSAgICAgICAgICAgID0gMCwgICAgLy8gZmlsdGVyaW5nIGRpc2FibGVkICh2YWxpZCBmb3IgbWlwIGZpbHRlciBvbmx5KQ0KKyAgICBEM0RURVhGX1BPSU5UICAgICAgICAgICA9IDEsICAgIC8vIG5lYXJlc3QNCisgICAgRDNEVEVYRl9MSU5FQVIgICAgICAgICAgPSAyLCAgICAvLyBsaW5lYXIgaW50ZXJwb2xhdGlvbg0KKyAgICBEM0RURVhGX0FOSVNPVFJPUElDICAgICA9IDMsICAgIC8vIGFuaXNvdHJvcGljDQorICAgIEQzRFRFWEZfRkxBVENVQklDICAgICAgID0gNCwgICAgLy8gY3ViaWMNCisgICAgRDNEVEVYRl9HQVVTU0lBTkNVQklDICAgPSA1LCAgICAvLyBkaWZmZXJlbnQgY3ViaWMga2VybmVsDQorICAgIEQzRFRFWEZfRk9SQ0VfRFdPUkQgICAgID0gMHg3ZmZmZmZmZiwgICAvLyBmb3JjZSAzMi1iaXQgc2l6ZSBlbnVtDQorfSBEM0RURVhUVVJFRklMVEVSVFlQRTsNCisNCisvKiBCaXRzIGZvciBGbGFncyBpbiBQcm9jZXNzVmVydGljZXMgY2FsbCAqLw0KKw0KKyNkZWZpbmUgRDNEUFZfRE9OT1RDT1BZREFUQSAgICAgKDEgPDwgMCkNCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisvLyBGbGV4aWJsZSB2ZXJ0ZXggZm9ybWF0IGJpdHMNCisvLw0KKyNkZWZpbmUgRDNERlZGX1JFU0VSVkVEMCAgICAgICAgMHgwMDENCisjZGVmaW5lIEQzREZWRl9QT1NJVElPTl9NQVNLICAgIDB4MDBFDQorI2RlZmluZSBEM0RGVkZfWFlaICAgICAgICAgICAgICAweDAwMg0KKyNkZWZpbmUgRDNERlZGX1hZWlJIVyAgICAgICAgICAgMHgwMDQNCisjZGVmaW5lIEQzREZWRl9YWVpCMSAgICAgICAgICAgIDB4MDA2DQorI2RlZmluZSBEM0RGVkZfWFlaQjIgICAgICAgICAgICAweDAwOA0KKyNkZWZpbmUgRDNERlZGX1hZWkIzICAgICAgICAgICAgMHgwMGENCisjZGVmaW5lIEQzREZWRl9YWVpCNCAgICAgICAgICAgIDB4MDBjDQorI2RlZmluZSBEM0RGVkZfWFlaQjUgICAgICAgICAgICAweDAwZQ0KKw0KKyNkZWZpbmUgRDNERlZGX05PUk1BTCAgICAgICAgICAgMHgwMTANCisjZGVmaW5lIEQzREZWRl9QU0laRSAgICAgICAgICAgIDB4MDIwDQorI2RlZmluZSBEM0RGVkZfRElGRlVTRSAgICAgICAgICAweDA0MA0KKyNkZWZpbmUgRDNERlZGX1NQRUNVTEFSICAgICAgICAgMHgwODANCisNCisjZGVmaW5lIEQzREZWRl9URVhDT1VOVF9NQVNLICAgIDB4ZjAwDQorI2RlZmluZSBEM0RGVkZfVEVYQ09VTlRfU0hJRlQgICA4DQorI2RlZmluZSBEM0RGVkZfVEVYMCAgICAgICAgICAgICAweDAwMA0KKyNkZWZpbmUgRDNERlZGX1RFWDEgICAgICAgICAgICAgMHgxMDANCisjZGVmaW5lIEQzREZWRl9URVgyICAgICAgICAgICAgIDB4MjAwDQorI2RlZmluZSBEM0RGVkZfVEVYMyAgICAgICAgICAgICAweDMwMA0KKyNkZWZpbmUgRDNERlZGX1RFWDQgICAgICAgICAgICAgMHg0MDANCisjZGVmaW5lIEQzREZWRl9URVg1ICAgICAgICAgICAgIDB4NTAwDQorI2RlZmluZSBEM0RGVkZfVEVYNiAgICAgICAgICAgICAweDYwMA0KKyNkZWZpbmUgRDNERlZGX1RFWDcgICAgICAgICAgICAgMHg3MDANCisjZGVmaW5lIEQzREZWRl9URVg4ICAgICAgICAgICAgIDB4ODAwDQorDQorI2RlZmluZSBEM0RGVkZfTEFTVEJFVEFfVUJZVEU0ICAweDEwMDANCisNCisjZGVmaW5lIEQzREZWRl9SRVNFUlZFRDIgICAgICAgIDB4RTAwMCAgLy8gNCByZXNlcnZlZCBiaXRzDQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisvLyBWZXJ0ZXggU2hhZGVycw0KKy8vDQorDQorLyoNCisNCitWZXJ0ZXggU2hhZGVyIERlY2xhcmF0aW9uDQorDQorVGhlIGRlY2xhcmF0aW9uIHBvcnRpb24gb2YgYSB2ZXJ0ZXggc2hhZGVyIGRlZmluZXMgdGhlIHN0YXRpYyBleHRlcm5hbA0KK2ludGVyZmFjZSBvZiB0aGUgc2hhZGVyLiAgVGhlIGluZm9ybWF0aW9uIGluIHRoZSBkZWNsYXJhdGlvbiBpbmNsdWRlczoNCisNCistIEFzc2lnbm1lbnRzIG9mIHZlcnRleCBzaGFkZXIgaW5wdXQgcmVnaXN0ZXJzIHRvIGRhdGEgc3RyZWFtcy4gIFRoZXNlDQorYXNzaWdubWVudHMgYmluZCBhIHNwZWNpZmljIHZlcnRleCByZWdpc3RlciB0byBhIHNpbmdsZSBjb21wb25lbnQgd2l0aGluIGENCit2ZXJ0ZXggc3RyZWFtLiAgQSB2ZXJ0ZXggc3RyZWFtIGVsZW1lbnQgaXMgaWRlbnRpZmllZCBieSBhIGJ5dGUgb2Zmc2V0DQord2l0aGluIHRoZSBzdHJlYW0gYW5kIGEgdHlwZS4gIFRoZSB0eXBlIHNwZWNpZmllcyB0aGUgYXJpdGhtZXRpYyBkYXRhIHR5cGUNCitwbHVzIHRoZSBkaW1lbnNpb25hbGl0eSAoMSwgMiwgMywgb3IgNCB2YWx1ZXMpLiAgU3RyZWFtIGRhdGEgd2hpY2ggaXMNCitsZXNzIHRoYW4gNCB2YWx1ZXMgYXJlIGFsd2F5cyBleHBhbmRlZCBvdXQgdG8gNCB2YWx1ZXMgd2l0aCB6ZXJvIG9yIG1vcmUNCiswLkYgdmFsdWVzIGFuZCBvbmUgMS5GIHZhbHVlLg0KKw0KKy0gQXNzaWdubWVudCBvZiB2ZXJ0ZXggc2hhZGVyIGlucHV0IHJlZ2lzdGVycyB0byBpbXBsaWNpdCBkYXRhIGZyb20gdGhlDQorcHJpbWl0aXZlIHRlc3NlbGxhdG9yLiAgVGhpcyBjb250cm9scyB0aGUgbG9hZGluZyBvZiB2ZXJ0ZXggZGF0YSB3aGljaCBpcw0KK25vdCBsb2FkZWQgZnJvbSBhIHN0cmVhbSwgYnV0IHJhdGhlciBpcyBnZW5lcmF0ZWQgZHVyaW5nIHByaW1pdGl2ZQ0KK3Rlc3NlbGxhdGlvbiBwcmlvciB0byB0aGUgdmVydGV4IHNoYWRlci4NCisNCistIExvYWRpbmcgZGF0YSBpbnRvIHRoZSBjb25zdGFudCBtZW1vcnkgYXQgdGhlIHRpbWUgYSBzaGFkZXIgaXMgc2V0IGFzIHRoZQ0KK2N1cnJlbnQgc2hhZGVyLiAgRWFjaCB0b2tlbiBzcGVjaWZpZXMgdmFsdWVzIGZvciBvbmUgb3IgbW9yZSBjb250aWd1b3VzIDQNCitEV09SRCBjb25zdGFudCByZWdpc3RlcnMuICBUaGlzIGFsbG93cyB0aGUgc2hhZGVyIHRvIHVwZGF0ZSBhbiBhcmJpdHJhcnkNCitzdWJzZXQgb2YgdGhlIGNvbnN0YW50IG1lbW9yeSwgb3ZlcndyaXRpbmcgdGhlIGRldmljZSBzdGF0ZSAod2hpY2gNCitjb250YWlucyB0aGUgY3VycmVudCB2YWx1ZXMgb2YgdGhlIGNvbnN0YW50IG1lbW9yeSkuICBOb3RlIHRoYXQgdGhlc2UNCit2YWx1ZXMgY2FuIGJlIHN1YnNlcXVlbnRseSBvdmVyd3JpdHRlbiAoYmV0d2VlbiBEcmF3UHJpbWl0aXZlIGNhbGxzKQ0KK2R1cmluZyB0aGUgdGltZSBhIHNoYWRlciBpcyBib3VuZCB0byBhIGRldmljZSB2aWEgdGhlDQorU2V0VmVydGV4U2hhZGVyQ29uc3RhbnQgbWV0aG9kLg0KKw0KKw0KK0RlY2xhcmF0aW9uIGFycmF5cyBhcmUgc2luZ2xlLWRpbWVuc2lvbmFsIGFycmF5cyBvZiBEV09SRHMgY29tcG9zZWQgb2YNCittdWx0aXBsZSB0b2tlbnMgZWFjaCBvZiB3aGljaCBpcyBvbmUgb3IgbW9yZSBEV09SRHMuICBUaGUgc2luZ2xlLURXT1JEDQordG9rZW4gdmFsdWUgMHhGRkZGRkZGRiBpcyBhIHNwZWNpYWwgdG9rZW4gdXNlZCB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIHRoZQ0KK2RlY2xhcmF0aW9uIGFycmF5LiAgVGhlIHNpbmdsZSBEV09SRCB0b2tlbiB2YWx1ZSAweDAwMDAwMDAwIGlzIGEgTk9QIHRva2VuDQord2l0aCBpcyBpZ25vcmVkIGR1cmluZyB0aGUgZGVjbGFyYXRpb24gcGFyc2luZy4gIE5vdGUgdGhhdCAweDAwMDAwMDAwIGlzIGENCit2YWxpZCB2YWx1ZSBmb3IgRFdPUkRzIGZvbGxvd2luZyB0aGUgZmlyc3QgRFdPUkQgZm9yIG11bHRpcGxlIHdvcmQgdG9rZW5zLg0KKw0KK1szMToyOV0gVG9rZW5UeXBlDQorICAgIDB4MCAtIE5PUCAocmVxdWlyZXMgYWxsIERXT1JEIGJpdHMgdG8gYmUgemVybykNCisgICAgMHgxIC0gc3RyZWFtIHNlbGVjdG9yDQorICAgIDB4MiAtIHN0cmVhbSBkYXRhIGRlZmluaXRpb24gKG1hcCB0byB2ZXJ0ZXggaW5wdXQgbWVtb3J5KQ0KKyAgICAweDMgLSB2ZXJ0ZXggaW5wdXQgbWVtb3J5IGZyb20gdGVzc2VsbGF0b3INCisgICAgMHg0IC0gY29uc3RhbnQgbWVtb3J5IGZyb20gc2hhZGVyDQorICAgIDB4NSAtIGV4dGVuc2lvbg0KKyAgICAweDYgLSByZXNlcnZlZA0KKyAgICAweDcgLSBlbmQtb2YtYXJyYXkgKHJlcXVpcmVzIGFsbCBEV09SRCBiaXRzIHRvIGJlIDEpDQorDQorTk9QIFRva2VuIChzaW5nbGUgRFdPUkQgdG9rZW4pDQorICAgIFszMToyOV0gMHgwDQorICAgIFsyODowMF0gMHgwDQorDQorU3RyZWFtIFNlbGVjdG9yIChzaW5nbGUgRFdPUkQgdG9rZW4pDQorICAgIFszMToyOV0gMHgxDQorICAgIFsyOF0gICAgaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhIHRlc3NlbGxhdG9yIHN0cmVhbQ0KKyAgICBbMjc6MDRdIDB4MA0KKyAgICBbMDM6MDBdIHN0cmVhbSBzZWxlY3RvciAoMC4uMTUpDQorDQorU3RyZWFtIERhdGEgRGVmaW5pdGlvbiAoc2luZ2xlIERXT1JEIHRva2VuKQ0KKyAgICBWZXJ0ZXggSW5wdXQgUmVnaXN0ZXIgTG9hZA0KKyAgICAgIFszMToyOV0gMHgyDQorICAgICAgWzI4XSAgICAweDANCisgICAgICBbMjc6MjBdIDB4MA0KKyAgICAgIFsxOToxNl0gdHlwZSAoZGltZW5zaW9uYWxpdHkgYW5kIGRhdGEgdHlwZSkNCisgICAgICBbMTU6MDRdIDB4MA0KKyAgICAgIFswMzowMF0gdmVydGV4IHJlZ2lzdGVyIGFkZHJlc3MgKDAuLjE1KQ0KKyAgICBEYXRhIFNraXAgKG5vIHJlZ2lzdGVyIGxvYWQpDQorICAgICAgWzMxOjI5XSAweDINCisgICAgICBbMjhdICAgIDB4MQ0KKyAgICAgIFsyNzoyMF0gMHgwDQorICAgICAgWzE5OjE2XSBjb3VudCBvZiBEV09SRFMgdG8gc2tpcCBvdmVyICgwLi4xNSkNCisgICAgICBbMTU6MDBdIDB4MA0KKyAgICBWZXJ0ZXggSW5wdXQgTWVtb3J5IGZyb20gVGVzc2VsbGF0b3IgRGF0YSAoc2luZ2xlIERXT1JEIHRva2VuKQ0KKyAgICAgIFszMToyOV0gMHgzDQorICAgICAgWzI4XSAgICBpbmRpY2F0ZXMgd2hldGhlciBkYXRhIGlzIG5vcm1hbHMgb3IgdS92DQorICAgICAgWzI3OjI0XSAweDANCisgICAgICBbMjM6MjBdIHZlcnRleCByZWdpc3RlciBhZGRyZXNzICgwLi4xNSkNCisgICAgICBbMTk6MTZdIHR5cGUgKGRpbWVuc2lvbmFsaXR5KQ0KKyAgICAgIFsxNTowNF0gMHgwDQorICAgICAgWzAzOjAwXSB2ZXJ0ZXggcmVnaXN0ZXIgYWRkcmVzcyAoMC4uMTUpDQorDQorQ29uc3RhbnQgTWVtb3J5IGZyb20gU2hhZGVyIChtdWx0aXBsZSBEV09SRCB0b2tlbikNCisgICAgWzMxOjI5XSAweDQNCisgICAgWzI4OjI1XSBjb3VudCBvZiA0KkRXT1JEIGNvbnN0YW50cyB0byBsb2FkICgwLi4xNSkNCisgICAgWzI0OjA3XSAweDANCisgICAgWzA2OjAwXSBjb25zdGFudCBtZW1vcnkgYWRkcmVzcyAoMC4uOTUpDQorDQorRXh0ZW5zaW9uIFRva2VuIChzaW5nbGUgb3IgbXVsdGlwbGUgRFdPUkQgdG9rZW4pDQorICAgIFszMToyOV0gMHg1DQorICAgIFsyODoyNF0gY291bnQgb2YgYWRkaXRpb25hbCBEV09SRHMgaW4gdG9rZW4gKDAuLjMxKQ0KKyAgICBbMjM6MDBdIGV4dGVuc2lvbi1zcGVjaWZpYyBpbmZvcm1hdGlvbg0KKw0KK0VuZC1vZi1hcnJheSB0b2tlbiAoc2luZ2xlIERXT1JEIHRva2VuKQ0KKyAgICBbMzE6MjldIDB4Nw0KKyAgICBbMjg6MDBdIDB4MWZmZmZmZmYNCisNCitUaGUgc3RyZWFtIHNlbGVjdG9yIHRva2VuIG11c3QgYmUgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgYSBjb250aWd1b3VzIHNldCBvZiBzdHJlYW0gZGF0YSBkZWZpbml0aW9uIHRva2Vucy4gIFRoaXMgdG9rZW4gc2VxdWVuY2UgZnVsbHkgZGVmaW5lcyB0aGF0IHN0cmVhbSwgaW5jbHVkaW5nIHRoZSBzZXQgb2YgZWxlbWVudHMgd2l0aGluIHRoZSBzdHJlYW0sIHRoZSBvcmRlciBpbiB3aGljaCB0aGUgZWxlbWVudHMgYXBwZWFyLCB0aGUgdHlwZSBvZiBlYWNoIGVsZW1lbnQsIGFuZCB0aGUgdmVydGV4IHJlZ2lzdGVyIGludG8gd2hpY2ggdG8gbG9hZCBhbiBlbGVtZW50Lg0KK1N0cmVhbXMgYXJlIGFsbG93ZWQgdG8gaW5jbHVkZSBkYXRhIHdoaWNoIGlzIG5vdCBsb2FkZWQgaW50byBhIHZlcnRleCByZWdpc3RlciwgdGh1cyBhbGxvd2luZyBkYXRhIHdoaWNoIGlzIG5vdCB1c2VkIGZvciB0aGlzIHNoYWRlciB0byBleGlzdCBpbiB0aGUgdmVydGV4IHN0cmVhbS4gIFRoaXMgc2tpcHBlZCBkYXRhIGlzIGRlZmluZWQgb25seSBieSBhIGNvdW50IG9mIERXT1JEcyB0byBza2lwIG92ZXIsIHNpbmNlIHRoZSB0eXBlIGluZm9ybWF0aW9uIGlzIGlycmVsZXZhbnQuDQorVGhlIHRva2VuIHNlcXVlbmNlOg0KK1N0cmVhbSBTZWxlY3Q6IHN0cmVhbT0wDQorU3RyZWFtIERhdGEgRGVmaW5pdGlvbiAoTG9hZCk6IHR5cGU9RkxPQVQzOyByZWdpc3Rlcj0zDQorU3RyZWFtIERhdGEgRGVmaW5pdGlvbiAoTG9hZCk6IHR5cGU9RkxPQVQzOyByZWdpc3Rlcj00DQorU3RyZWFtIERhdGEgRGVmaW5pdGlvbiAoU2tpcCk6IGNvdW50PTINCitTdHJlYW0gRGF0YSBEZWZpbml0aW9uIChMb2FkKTogdHlwZT1GTE9BVDI7IHJlZ2lzdGVyPTcNCisNCitkZWZpbmVzIHN0cmVhbSB6ZXJvIHRvIGNvbnNpc3Qgb2YgNCBlbGVtZW50cywgMyBvZiB3aGljaCBhcmUgbG9hZGVkIGludG8gcmVnaXN0ZXJzIGFuZCB0aGUgZm91cnRoIHNraXBwZWQgb3Zlci4gIFJlZ2lzdGVyIDMgaXMgbG9hZGVkIHdpdGggdGhlIGZpcnN0IHRocmVlIERXT1JEcyBpbiBlYWNoIHZlcnRleCBpbnRlcnByZXRlZCBhcyBGTE9BVCBkYXRhLiAgUmVnaXN0ZXIgNCBpcyBsb2FkZWQgd2l0aCB0aGUgNHRoLCA1dGgsIGFuZCA2dGggRFdPUkRzIGludGVycHJldGVkIGFzIEZMT0FUIGRhdGEuICBUaGUgbmV4dCB0d28gRFdPUkRzICg3dGggYW5kIDh0aCkgYXJlIHNraXBwZWQgb3ZlciBhbmQgbm90IGxvYWRlZCBpbnRvIGFueSB2ZXJ0ZXggaW5wdXQgcmVnaXN0ZXIuICAgUmVnaXN0ZXIgNyBpcyBsb2FkZWQgd2l0aCB0aGUgOXRoIGFuZCAxMHRoIERXT1JEUyBpbnRlcnByZXRlZCBhcyBGTE9BVCBkYXRhLg0KK1BsYWNpbmcgb2YgdG9rZW5zIG90aGVyIHRoYW4gTk9QcyBiZXR3ZWVuIHRoZSBTdHJlYW0gU2VsZWN0b3IgYW5kIFN0cmVhbSBEYXRhIERlZmluaXRpb24gdG9rZW5zIGlzIGRpc2FsbG93ZWQuDQorDQorKi8NCisNCit0eXBlZGVmIGVudW0gX0QzRFZTRF9UT0tFTlRZUEUNCit7DQorICAgIEQzRFZTRF9UT0tFTl9OT1AgICAgICAgID0gMCwgICAgLy8gTk9QIG9yIGV4dGVuc2lvbg0KKyAgICBEM0RWU0RfVE9LRU5fU1RSRUFNLCAgICAgICAgICAgIC8vIHN0cmVhbSBzZWxlY3Rvcg0KKyAgICBEM0RWU0RfVE9LRU5fU1RSRUFNREFUQSwgICAgICAgIC8vIHN0cmVhbSBkYXRhIGRlZmluaXRpb24gKG1hcCB0byB2ZXJ0ZXggaW5wdXQgbWVtb3J5KQ0KKyAgICBEM0RWU0RfVE9LRU5fVEVTU0VMTEFUT1IsICAgICAgIC8vIHZlcnRleCBpbnB1dCBtZW1vcnkgZnJvbSB0ZXNzZWxsYXRvcg0KKyAgICBEM0RWU0RfVE9LRU5fQ09OU1RNRU0sICAgICAgICAgIC8vIGNvbnN0YW50IG1lbW9yeSBmcm9tIHNoYWRlcg0KKyAgICBEM0RWU0RfVE9LRU5fRVhULCAgICAgICAgICAgICAgIC8vIGV4dGVuc2lvbg0KKyAgICBEM0RWU0RfVE9LRU5fRU5EID0gNywgICAgICAgICAgIC8vIGVuZC1vZi1hcnJheSAocmVxdWlyZXMgYWxsIERXT1JEIGJpdHMgdG8gYmUgMSkNCisgICAgRDNEVlNEX0ZPUkNFX0RXT1JEID0gMHg3ZmZmZmZmZiwvLyBmb3JjZSAzMi1iaXQgc2l6ZSBlbnVtDQorfSBEM0RWU0RfVE9LRU5UWVBFOw0KKw0KKyNkZWZpbmUgRDNEVlNEX1RPS0VOVFlQRVNISUZUICAgMjkNCisjZGVmaW5lIEQzRFZTRF9UT0tFTlRZUEVNQVNLICAgICg3IDw8IEQzRFZTRF9UT0tFTlRZUEVTSElGVCkNCisNCisjZGVmaW5lIEQzRFZTRF9TVFJFQU1OVU1CRVJTSElGVCAwDQorI2RlZmluZSBEM0RWU0RfU1RSRUFNTlVNQkVSTUFTSyAoMHhGIDw8IEQzRFZTRF9TVFJFQU1OVU1CRVJTSElGVCkNCisNCisjZGVmaW5lIEQzRFZTRF9EQVRBTE9BRFRZUEVTSElGVCAyOA0KKyNkZWZpbmUgRDNEVlNEX0RBVEFMT0FEVFlQRU1BU0sgKDB4MSA8PCBEM0RWU0RfREFUQUxPQURUWVBFU0hJRlQpDQorDQorI2RlZmluZSBEM0RWU0RfREFUQVRZUEVTSElGVCAxNg0KKyNkZWZpbmUgRDNEVlNEX0RBVEFUWVBFTUFTSyAoMHhGIDw8IEQzRFZTRF9EQVRBVFlQRVNISUZUKQ0KKw0KKyNkZWZpbmUgRDNEVlNEX1NLSVBDT1VOVFNISUZUIDE2DQorI2RlZmluZSBEM0RWU0RfU0tJUENPVU5UTUFTSyAoMHhGIDw8IEQzRFZTRF9TS0lQQ09VTlRTSElGVCkNCisNCisjZGVmaW5lIEQzRFZTRF9WRVJURVhSRUdTSElGVCAwDQorI2RlZmluZSBEM0RWU0RfVkVSVEVYUkVHTUFTSyAoMHgxRiA8PCBEM0RWU0RfVkVSVEVYUkVHU0hJRlQpDQorDQorI2RlZmluZSBEM0RWU0RfVkVSVEVYUkVHSU5TSElGVCAyMA0KKyNkZWZpbmUgRDNEVlNEX1ZFUlRFWFJFR0lOTUFTSyAoMHhGIDw8IEQzRFZTRF9WRVJURVhSRUdJTlNISUZUKQ0KKw0KKyNkZWZpbmUgRDNEVlNEX0NPTlNUQ09VTlRTSElGVCAyNQ0KKyNkZWZpbmUgRDNEVlNEX0NPTlNUQ09VTlRNQVNLICgweEYgPDwgRDNEVlNEX0NPTlNUQ09VTlRTSElGVCkNCisNCisjZGVmaW5lIEQzRFZTRF9DT05TVEFERFJFU1NTSElGVCAwDQorI2RlZmluZSBEM0RWU0RfQ09OU1RBRERSRVNTTUFTSyAoMHg3RiA8PCBEM0RWU0RfQ09OU1RBRERSRVNTU0hJRlQpDQorDQorI2RlZmluZSBEM0RWU0RfQ09OU1RSU1NISUZUIDE2DQorI2RlZmluZSBEM0RWU0RfQ09OU1RSU01BU0sgKDB4MUZGRiA8PCBEM0RWU0RfQ09OU1RSU1NISUZUKQ0KKw0KKyNkZWZpbmUgRDNEVlNEX0VYVENPVU5UU0hJRlQgMjQNCisjZGVmaW5lIEQzRFZTRF9FWFRDT1VOVE1BU0sgKDB4MUYgPDwgRDNEVlNEX0VYVENPVU5UU0hJRlQpDQorDQorI2RlZmluZSBEM0RWU0RfRVhUSU5GT1NISUZUIDANCisjZGVmaW5lIEQzRFZTRF9FWFRJTkZPTUFTSyAoMHhGRkZGRkYgPDwgRDNEVlNEX0VYVElORk9TSElGVCkNCisNCisjZGVmaW5lIEQzRFZTRF9NQUtFVE9LRU5UWVBFKHRva2VuVHlwZSkgKCh0b2tlblR5cGUgPDwgRDNEVlNEX1RPS0VOVFlQRVNISUZUKSAmIEQzRFZTRF9UT0tFTlRZUEVNQVNLKQ0KKw0KKy8vIG1hY3JvcyBmb3IgZ2VuZXJhdGlvbiBvZiBDcmVhdGVWZXJ0ZXhTaGFkZXIgRGVjbGFyYXRpb24gdG9rZW4gYXJyYXkNCisNCisvLyBTZXQgY3VycmVudCBzdHJlYW0NCisvLyBfU3RyZWFtTnVtYmVyIFswLi4oTWF4U3RyZWFtcy0xKV0gc3RyZWFtIHRvIGdldCBkYXRhIGZyb20NCisvLw0KKyNkZWZpbmUgRDNEVlNEX1NUUkVBTSggX1N0cmVhbU51bWJlciApIFwNCisgICAgKEQzRFZTRF9NQUtFVE9LRU5UWVBFKEQzRFZTRF9UT0tFTl9TVFJFQU0pIHwgKF9TdHJlYW1OdW1iZXIpKQ0KKw0KKy8vIFNldCB0ZXNzZWxsYXRvciBzdHJlYW0NCisvLw0KKyNkZWZpbmUgRDNEVlNEX1NUUkVBTVRFU1NTSElGVCAyOA0KKyNkZWZpbmUgRDNEVlNEX1NUUkVBTVRFU1NNQVNLICgxIDw8IEQzRFZTRF9TVFJFQU1URVNTU0hJRlQpDQorI2RlZmluZSBEM0RWU0RfU1RSRUFNX1RFU1MoICkgXA0KKyAgICAoRDNEVlNEX01BS0VUT0tFTlRZUEUoRDNEVlNEX1RPS0VOX1NUUkVBTSkgfCAoRDNEVlNEX1NUUkVBTVRFU1NNQVNLKSkNCisNCisvLyBiaW5kIHNpbmdsZSB2ZXJ0ZXggcmVnaXN0ZXIgdG8gdmVydGV4IGVsZW1lbnQgZnJvbSB2ZXJ0ZXggc3RyZWFtDQorLy8NCisvLyBfVmVydGV4UmVnaXN0ZXIgWzAuLjE1XSBhZGRyZXNzIG9mIHRoZSB2ZXJ0ZXggcmVnaXN0ZXINCisvLyBfVHlwZSBbRDNEVlNEVF8qXSBkaW1lbnNpb25hbGl0eSBhbmQgYXJpdGhtZXRpYyBkYXRhIHR5cGUNCisNCisjZGVmaW5lIEQzRFZTRF9SRUcoIF9WZXJ0ZXhSZWdpc3RlciwgX1R5cGUgKSBcDQorICAgIChEM0RWU0RfTUFLRVRPS0VOVFlQRShEM0RWU0RfVE9LRU5fU1RSRUFNREFUQSkgfCAgICAgICAgICAgIFwNCisgICAgICgoX1R5cGUpIDw8IEQzRFZTRF9EQVRBVFlQRVNISUZUKSB8IChfVmVydGV4UmVnaXN0ZXIpKQ0KKw0KKy8vIFNraXAgX0RXT1JEQ291bnQgRFdPUkRzIGluIHZlcnRleA0KKy8vDQorI2RlZmluZSBEM0RWU0RfU0tJUCggX0RXT1JEQ291bnQgKSBcDQorICAgIChEM0RWU0RfTUFLRVRPS0VOVFlQRShEM0RWU0RfVE9LRU5fU1RSRUFNREFUQSkgfCAweDEwMDAwMDAwIHwgXA0KKyAgICAgKChfRFdPUkRDb3VudCkgPDwgRDNEVlNEX1NLSVBDT1VOVFNISUZUKSkNCisNCisvLyBsb2FkIGRhdGEgaW50byB2ZXJ0ZXggc2hhZGVyIGNvbnN0YW50IG1lbW9yeQ0KKy8vDQorLy8gX0NvbnN0YW50QWRkcmVzcyBbMC4uOTVdIC0gYWRkcmVzcyBvZiBjb25zdGFudCBhcnJheSB0byBiZWdpbiBmaWxsaW5nIGRhdGENCisvLyBfQ291bnQgWzAuLjE1XSAtIG51bWJlciBvZiBjb25zdGFudCB2ZWN0b3JzIHRvIGxvYWQgKDQgRFdPUkRzIGVhY2gpDQorLy8gZm9sbG93ZWQgYnkgNCpfQ291bnQgRFdPUkRTIG9mIGRhdGENCisvLw0KKyNkZWZpbmUgRDNEVlNEX0NPTlNUKCBfQ29uc3RhbnRBZGRyZXNzLCBfQ291bnQgKSBcDQorICAgIChEM0RWU0RfTUFLRVRPS0VOVFlQRShEM0RWU0RfVE9LRU5fQ09OU1RNRU0pIHwgXA0KKyAgICAgKChfQ291bnQpIDw8IEQzRFZTRF9DT05TVENPVU5UU0hJRlQpIHwgKF9Db25zdGFudEFkZHJlc3MpKQ0KKw0KKy8vIGVuYWJsZSB0ZXNzZWxsYXRvciBnZW5lcmF0ZWQgbm9ybWFscw0KKy8vDQorLy8gX1ZlcnRleFJlZ2lzdGVySW4gIFswLi4xNV0gYWRkcmVzcyBvZiB2ZXJ0ZXggcmVnaXN0ZXIgd2hvc2UgaW5wdXQgc3RyZWFtDQorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lsbCBiZSB1c2VkIGluIG5vcm1hbCBjb21wdXRhdGlvbg0KKy8vIF9WZXJ0ZXhSZWdpc3Rlck91dCBbMC4uMTVdIGFkZHJlc3Mgb2YgdmVydGV4IHJlZ2lzdGVyIHRvIG91dHB1dCB0aGUgbm9ybWFsIHRvDQorLy8NCisjZGVmaW5lIEQzRFZTRF9URVNTTk9STUFMKCBfVmVydGV4UmVnaXN0ZXJJbiwgX1ZlcnRleFJlZ2lzdGVyT3V0ICkgXA0KKyAgICAoRDNEVlNEX01BS0VUT0tFTlRZUEUoRDNEVlNEX1RPS0VOX1RFU1NFTExBVE9SKSB8IFwNCisgICAgICgoX1ZlcnRleFJlZ2lzdGVySW4pIDw8IEQzRFZTRF9WRVJURVhSRUdJTlNISUZUKSB8IFwNCisgICAgICgoMHgwMikgPDwgRDNEVlNEX0RBVEFUWVBFU0hJRlQpIHwgKF9WZXJ0ZXhSZWdpc3Rlck91dCkpDQorDQorLy8gZW5hYmxlIHRlc3NlbGxhdG9yIGdlbmVyYXRlZCBzdXJmYWNlIHBhcmFtZXRlcnMNCisvLw0KKy8vIF9WZXJ0ZXhSZWdpc3RlciBbMC4uMTVdIGFkZHJlc3Mgb2YgdmVydGV4IHJlZ2lzdGVyIHRvIG91dHB1dCBwYXJhbWV0ZXJzDQorLy8NCisjZGVmaW5lIEQzRFZTRF9URVNTVVYoIF9WZXJ0ZXhSZWdpc3RlciApIFwNCisgICAgKEQzRFZTRF9NQUtFVE9LRU5UWVBFKEQzRFZTRF9UT0tFTl9URVNTRUxMQVRPUikgfCAweDEwMDAwMDAwIHwgXA0KKyAgICAgKCgweDAxKSA8PCBEM0RWU0RfREFUQVRZUEVTSElGVCkgfCAoX1ZlcnRleFJlZ2lzdGVyKSkNCisNCisvLyBHZW5lcmF0ZXMgRU5EIHRva2VuDQorLy8NCisjZGVmaW5lIEQzRFZTRF9FTkQoKSAweEZGRkZGRkZGDQorDQorLy8gR2VuZXJhdGVzIE5PUCB0b2tlbg0KKyNkZWZpbmUgRDNEVlNEX05PUCgpIDB4MDAwMDAwMDANCisNCisvLyBiaXQgZGVjbGFyYXRpb25zIGZvciBfVHlwZSBmaWVsZHMNCisjZGVmaW5lIEQzRFZTRFRfRkxPQVQxICAgICAgMHgwMCAgICAvLyAxRCBmbG9hdCBleHBhbmRlZCB0byAodmFsdWUsIDAuLCAwLiwgMS4pDQorI2RlZmluZSBEM0RWU0RUX0ZMT0FUMiAgICAgIDB4MDEgICAgLy8gMkQgZmxvYXQgZXhwYW5kZWQgdG8gKHZhbHVlLCB2YWx1ZSwgMC4sIDEuKQ0KKyNkZWZpbmUgRDNEVlNEVF9GTE9BVDMgICAgICAweDAyICAgIC8vIDNEIGZsb2F0IGV4cGFuZGVkIHRvICh2YWx1ZSwgdmFsdWUsIHZhbHVlLCAxLikNCisjZGVmaW5lIEQzRFZTRFRfRkxPQVQ0ICAgICAgMHgwMyAgICAvLyA0RCBmbG9hdA0KKyNkZWZpbmUgRDNEVlNEVF9EM0RDT0xPUiAgICAweDA0ICAgIC8vIDREIHBhY2tlZCB1bnNpZ25lZCBieXRlcyBtYXBwZWQgdG8gMC4gdG8gMS4gcmFuZ2UNCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbnB1dCBpcyBpbiBEM0RDT0xPUiBmb3JtYXQgKEFSR0IpIGV4cGFuZGVkIHRvIChSLCBHLCBCLCBBKQ0KKyNkZWZpbmUgRDNEVlNEVF9VQllURTQgICAgICAweDA1ICAgIC8vIDREIHVuc2lnbmVkIGJ5dGUNCisjZGVmaW5lIEQzRFZTRFRfU0hPUlQyICAgICAgMHgwNiAgICAvLyAyRCBzaWduZWQgc2hvcnQgZXhwYW5kZWQgdG8gKHZhbHVlLCB2YWx1ZSwgMC4sIDEuKQ0KKyNkZWZpbmUgRDNEVlNEVF9TSE9SVDQgICAgICAweDA3ICAgIC8vIDREIHNpZ25lZCBzaG9ydA0KKw0KKy8vIGFzc2lnbm1lbnRzIG9mIHZlcnRleCBpbnB1dCByZWdpc3RlcnMgZm9yIGZpeGVkIGZ1bmN0aW9uIHZlcnRleCBzaGFkZXINCisvLw0KKyNkZWZpbmUgRDNEVlNERV9QT1NJVElPTiAgICAgICAgMA0KKyNkZWZpbmUgRDNEVlNERV9CTEVORFdFSUdIVCAgICAgMQ0KKyNkZWZpbmUgRDNEVlNERV9CTEVORElORElDRVMgICAgMg0KKyNkZWZpbmUgRDNEVlNERV9OT1JNQUwgICAgICAgICAgMw0KKyNkZWZpbmUgRDNEVlNERV9QU0laRSAgICAgICAgICAgNA0KKyNkZWZpbmUgRDNEVlNERV9ESUZGVVNFICAgICAgICAgNQ0KKyNkZWZpbmUgRDNEVlNERV9TUEVDVUxBUiAgICAgICAgNg0KKyNkZWZpbmUgRDNEVlNERV9URVhDT09SRDAgICAgICAgNw0KKyNkZWZpbmUgRDNEVlNERV9URVhDT09SRDEgICAgICAgOA0KKyNkZWZpbmUgRDNEVlNERV9URVhDT09SRDIgICAgICAgOQ0KKyNkZWZpbmUgRDNEVlNERV9URVhDT09SRDMgICAgICAgMTANCisjZGVmaW5lIEQzRFZTREVfVEVYQ09PUkQ0ICAgICAgIDExDQorI2RlZmluZSBEM0RWU0RFX1RFWENPT1JENSAgICAgICAxMg0KKyNkZWZpbmUgRDNEVlNERV9URVhDT09SRDYgICAgICAgMTMNCisjZGVmaW5lIEQzRFZTREVfVEVYQ09PUkQ3ICAgICAgIDE0DQorI2RlZmluZSBEM0RWU0RFX1BPU0lUSU9OMiAgICAgICAxNQ0KKyNkZWZpbmUgRDNEVlNERV9OT1JNQUwyICAgICAgICAgMTYNCisNCisvLyBNYXhpbXVtIHN1cHBvcnRlZCBudW1iZXIgb2YgdGV4dHVyZSBjb29yZGluYXRlIHNldHMNCisjZGVmaW5lIEQzRERQX01BWFRFWENPT1JEICAgOA0KKw0KKw0KKy8vDQorLy8gSW5zdHJ1Y3Rpb24gVG9rZW4gQml0IERlZmluaXRpb25zDQorLy8NCisjZGVmaW5lIEQzRFNJX09QQ09ERV9NQVNLICAgICAgIDB4MDAwMEZGRkYNCisNCit0eXBlZGVmIGVudW0gX0QzRFNIQURFUl9JTlNUUlVDVElPTl9PUENPREVfVFlQRQ0KK3sNCisgICAgRDNEU0lPX05PUCAgICAgICAgICA9IDAsICAgIC8vIFBTL1ZTDQorICAgIEQzRFNJT19NT1YgICAgICAgICAgLCAgICAgICAvLyBQUy9WUw0KKyAgICBEM0RTSU9fQUREICAgICAgICAgICwgICAgICAgLy8gUFMvVlMNCisgICAgRDNEU0lPX1NVQiAgICAgICAgICAsICAgICAgIC8vIFBTDQorICAgIEQzRFNJT19NQUQgICAgICAgICAgLCAgICAgICAvLyBQUy9WUw0KKyAgICBEM0RTSU9fTVVMICAgICAgICAgICwgICAgICAgLy8gUFMvVlMNCisgICAgRDNEU0lPX1JDUCAgICAgICAgICAsICAgICAgIC8vIFZTDQorICAgIEQzRFNJT19SU1EgICAgICAgICAgLCAgICAgICAvLyBWUw0KKyAgICBEM0RTSU9fRFAzICAgICAgICAgICwgICAgICAgLy8gUFMvVlMNCisgICAgRDNEU0lPX0RQNCAgICAgICAgICAsICAgICAgIC8vIFBTL1ZTDQorICAgIEQzRFNJT19NSU4gICAgICAgICAgLCAgICAgICAvLyBWUw0KKyAgICBEM0RTSU9fTUFYICAgICAgICAgICwgICAgICAgLy8gVlMNCisgICAgRDNEU0lPX1NMVCAgICAgICAgICAsICAgICAgIC8vIFZTDQorICAgIEQzRFNJT19TR0UgICAgICAgICAgLCAgICAgICAvLyBWUw0KKyAgICBEM0RTSU9fRVhQICAgICAgICAgICwgICAgICAgLy8gVlMNCisgICAgRDNEU0lPX0xPRyAgICAgICAgICAsICAgICAgIC8vIFZTDQorICAgIEQzRFNJT19MSVQgICAgICAgICAgLCAgICAgICAvLyBWUw0KKyAgICBEM0RTSU9fRFNUICAgICAgICAgICwgICAgICAgLy8gVlMNCisgICAgRDNEU0lPX0xSUCAgICAgICAgICAsICAgICAgIC8vIFBTDQorICAgIEQzRFNJT19GUkMgICAgICAgICAgLCAgICAgICAvLyBWUw0KKyAgICBEM0RTSU9fTTR4NCAgICAgICAgICwgICAgICAgLy8gVlMNCisgICAgRDNEU0lPX000eDMgICAgICAgICAsICAgICAgIC8vIFZTDQorICAgIEQzRFNJT19NM3g0ICAgICAgICAgLCAgICAgICAvLyBWUw0KKyAgICBEM0RTSU9fTTN4MyAgICAgICAgICwgICAgICAgLy8gVlMNCisgICAgRDNEU0lPX00zeDIgICAgICAgICAsICAgICAgIC8vIFZTDQorDQorICAgIEQzRFNJT19URVhDT09SRCAgICAgPSA2NCwgICAvLyBQUw0KKyAgICBEM0RTSU9fVEVYS0lMTCAgICAgICwgICAgICAgLy8gUFMNCisgICAgRDNEU0lPX1RFWCAgICAgICAgICAsICAgICAgIC8vIFBTDQorICAgIEQzRFNJT19URVhCRU0gICAgICAgLCAgICAgICAvLyBQUw0KKyAgICBEM0RTSU9fVEVYQkVNTCAgICAgICwgICAgICAgLy8gUFMNCisgICAgRDNEU0lPX1RFWFJFRzJBUiAgICAsICAgICAgIC8vIFBTDQorICAgIEQzRFNJT19URVhSRUcyR0IgICAgLCAgICAgICAvLyBQUw0KKyAgICBEM0RTSU9fVEVYTTN4MlBBRCAgICwgICAgICAgLy8gUFMNCisgICAgRDNEU0lPX1RFWE0zeDJURVggICAsICAgICAgIC8vIFBTDQorICAgIEQzRFNJT19URVhNM3gzUEFEICAgLCAgICAgICAvLyBQUw0KKyAgICBEM0RTSU9fVEVYTTN4M1RFWCAgICwgICAgICAgLy8gUFMNCisgICAgRDNEU0lPX1RFWE0zeDNESUZGICAsICAgICAgIC8vIFBTDQorICAgIEQzRFNJT19URVhNM3gzU1BFQyAgLCAgICAgICAvLyBQUw0KKyAgICBEM0RTSU9fVEVYTTN4M1ZTUEVDICwgICAgICAgLy8gUFMNCisgICAgRDNEU0lPX0VYUFAgICAgICAgICAsICAgICAgIC8vIFZTDQorICAgIEQzRFNJT19MT0dQICAgICAgICAgLCAgICAgICAvLyBWUw0KKyAgICBEM0RTSU9fQ05EICAgICAgICAgICwgICAgICAgLy8gUFMNCisgICAgRDNEU0lPX0RFRiAgICAgICAgICAsICAgICAgIC8vIFBTDQorICAgIEQzRFNJT19URVhSRUcyUkdCICAgLCAgICAgICAvLyBQUw0KKyAgICBEM0RTSU9fVEVYRFAzVEVYICAgICwgICAgICAgLy8gUFMNCisgICAgRDNEU0lPX1RFWE0zeDJERVBUSCAsICAgICAgIC8vIFBTDQorICAgIEQzRFNJT19URVhEUDMgICAgICAgLCAgICAgICAvLyBQUw0KKyAgICBEM0RTSU9fVEVYTTN4MyAgICAgICwgICAgICAgLy8gUFMNCisgICAgRDNEU0lPX1RFWERFUFRIICAgICAsICAgICAgIC8vIFBTDQorICAgIEQzRFNJT19DTVAgICAgICAgICAgLCAgICAgICAvLyBQUw0KKyAgICBEM0RTSU9fQkVNICAgICAgICAgICwgICAgICAgLy8gUFMNCisNCisgICAgRDNEU0lPX1BIQVNFICAgICAgICA9IDB4RkZGRCwNCisgICAgRDNEU0lPX0NPTU1FTlQgICAgICA9IDB4RkZGRSwNCisgICAgRDNEU0lPX0VORCAgICAgICAgICA9IDB4RkZGRiwNCisNCisgICAgRDNEU0lPX0ZPUkNFX0RXT1JEICA9IDB4N2ZmZmZmZmYsICAgLy8gZm9yY2UgMzItYml0IHNpemUgZW51bQ0KK30gRDNEU0hBREVSX0lOU1RSVUNUSU9OX09QQ09ERV9UWVBFOw0KKw0KKy8vDQorLy8gQ28tSXNzdWUgSW5zdHJ1Y3Rpb24gTW9kaWZpZXIgLSBpZiBzZXQgdGhlbiB0aGlzIGluc3RydWN0aW9uIGlzIHRvIGJlDQorLy8gaXNzdWVkIGluIHBhcmFsbGVsIHdpdGggdGhlIHByZXZpb3VzIGluc3RydWN0aW9uKHMpIGZvciB3aGljaCB0aGlzIGJpdA0KKy8vIGlzIG5vdCBzZXQuDQorLy8NCisjZGVmaW5lIEQzRFNJX0NPSVNTVUUgICAgICAgICAgIDB4NDAwMDAwMDANCisNCisvLw0KKy8vIFBhcmFtZXRlciBUb2tlbiBCaXQgRGVmaW5pdGlvbnMNCisvLw0KKyNkZWZpbmUgRDNEU1BfUkVHTlVNX01BU0sgICAgICAgMHgwMDAwMUZGRg0KKw0KKy8vIGRlc3RpbmF0aW9uIHBhcmFtZXRlciB3cml0ZSBtYXNrDQorI2RlZmluZSBEM0RTUF9XUklURU1BU0tfMCAgICAgICAweDAwMDEwMDAwICAvLyBDb21wb25lbnQgMCAoWDtSZWQpDQorI2RlZmluZSBEM0RTUF9XUklURU1BU0tfMSAgICAgICAweDAwMDIwMDAwICAvLyBDb21wb25lbnQgMSAoWTtHcmVlbikNCisjZGVmaW5lIEQzRFNQX1dSSVRFTUFTS18yICAgICAgIDB4MDAwNDAwMDAgIC8vIENvbXBvbmVudCAyIChaO0JsdWUpDQorI2RlZmluZSBEM0RTUF9XUklURU1BU0tfMyAgICAgICAweDAwMDgwMDAwICAvLyBDb21wb25lbnQgMyAoVztBbHBoYSkNCisjZGVmaW5lIEQzRFNQX1dSSVRFTUFTS19BTEwgICAgIDB4MDAwRjAwMDAgIC8vIEFsbCBDb21wb25lbnRzDQorDQorLy8gZGVzdGluYXRpb24gcGFyYW1ldGVyIG1vZGlmaWVycw0KKyNkZWZpbmUgRDNEU1BfRFNUTU9EX1NISUZUICAgICAgMjANCisjZGVmaW5lIEQzRFNQX0RTVE1PRF9NQVNLICAgICAgIDB4MDBGMDAwMDANCisNCit0eXBlZGVmIGVudW0gX0QzRFNIQURFUl9QQVJBTV9EU1RNT0RfVFlQRQ0KK3sNCisgICAgRDNEU1BETV9OT05FICAgID0gMDw8RDNEU1BfRFNUTU9EX1NISUZULCAvLyBub3ANCisgICAgRDNEU1BETV9TQVRVUkFURT0gMTw8RDNEU1BfRFNUTU9EX1NISUZULCAvLyBjbGFtcCB0byAwLiB0byAxLiByYW5nZQ0KKyAgICBEM0RTUERNX0ZPUkNFX0RXT1JEICA9IDB4N2ZmZmZmZmYsICAgICAgLy8gZm9yY2UgMzItYml0IHNpemUgZW51bQ0KK30gRDNEU0hBREVSX1BBUkFNX0RTVE1PRF9UWVBFOw0KKw0KKy8vIGRlc3RpbmF0aW9uIHBhcmFtZXRlciANCisjZGVmaW5lIEQzRFNQX0RTVFNISUZUX1NISUZUICAgIDI0DQorI2RlZmluZSBEM0RTUF9EU1RTSElGVF9NQVNLICAgICAweDBGMDAwMDAwDQorDQorLy8gZGVzdGluYXRpb24vc291cmNlIHBhcmFtZXRlciByZWdpc3RlciB0eXBlDQorI2RlZmluZSBEM0RTUF9SRUdUWVBFX1NISUZUICAgICAyOA0KKyNkZWZpbmUgRDNEU1BfUkVHVFlQRV9NQVNLICAgICAgMHg3MDAwMDAwMA0KKw0KK3R5cGVkZWYgZW51bSBfRDNEU0hBREVSX1BBUkFNX1JFR0lTVEVSX1RZUEUNCit7DQorICAgIEQzRFNQUl9URU1QICAgICA9IDA8PEQzRFNQX1JFR1RZUEVfU0hJRlQsIC8vIFRlbXBvcmFyeSBSZWdpc3RlciBGaWxlDQorICAgIEQzRFNQUl9JTlBVVCAgICA9IDE8PEQzRFNQX1JFR1RZUEVfU0hJRlQsIC8vIElucHV0IFJlZ2lzdGVyIEZpbGUNCisgICAgRDNEU1BSX0NPTlNUICAgID0gMjw8RDNEU1BfUkVHVFlQRV9TSElGVCwgLy8gQ29uc3RhbnQgUmVnaXN0ZXIgRmlsZQ0KKyAgICBEM0RTUFJfQUREUiAgICAgPSAzPDxEM0RTUF9SRUdUWVBFX1NISUZULCAvLyBBZGRyZXNzIFJlZ2lzdGVyIChWUykNCisgICAgRDNEU1BSX1RFWFRVUkUgID0gMzw8RDNEU1BfUkVHVFlQRV9TSElGVCwgLy8gVGV4dHVyZSBSZWdpc3RlciBGaWxlIChQUykNCisgICAgRDNEU1BSX1JBU1RPVVQgID0gNDw8RDNEU1BfUkVHVFlQRV9TSElGVCwgLy8gUmFzdGVyaXplciBSZWdpc3RlciBGaWxlDQorICAgIEQzRFNQUl9BVFRST1VUICA9IDU8PEQzRFNQX1JFR1RZUEVfU0hJRlQsIC8vIEF0dHJpYnV0ZSBPdXRwdXQgUmVnaXN0ZXIgRmlsZQ0KKyAgICBEM0RTUFJfVEVYQ1JET1VUPSA2PDxEM0RTUF9SRUdUWVBFX1NISUZULCAvLyBUZXh0dXJlIENvb3JkaW5hdGUgT3V0cHV0IFJlZ2lzdGVyIEZpbGUNCisgICAgRDNEU1BSX0ZPUkNFX0RXT1JEICA9IDB4N2ZmZmZmZmYsICAgICAgICAgLy8gZm9yY2UgMzItYml0IHNpemUgZW51bQ0KK30gRDNEU0hBREVSX1BBUkFNX1JFR0lTVEVSX1RZUEU7DQorDQorLy8gUmVnaXN0ZXIgb2Zmc2V0cyBpbiB0aGUgUmFzdGVyaXplciBSZWdpc3RlciBGaWxlDQorLy8NCit0eXBlZGVmIGVudW0gX0QzRFZTX1JBU1RPVVRfT0ZGU0VUUw0KK3sNCisgICAgRDNEU1JPX1BPU0lUSU9OID0gMCwNCisgICAgRDNEU1JPX0ZPRywNCisgICAgRDNEU1JPX1BPSU5UX1NJWkUsDQorICAgIEQzRFNST19GT1JDRV9EV09SRCAgPSAweDdmZmZmZmZmLCAgICAgICAgIC8vIGZvcmNlIDMyLWJpdCBzaXplIGVudW0NCit9IEQzRFZTX1JBU1RPVVRfT0ZGU0VUUzsNCisNCisvLyBTb3VyY2Ugb3BlcmFuZCBhZGRyZXNzaW5nIG1vZGVzDQorDQorI2RlZmluZSBEM0RWU19BRERSRVNTTU9ERV9TSElGVCAxMw0KKyNkZWZpbmUgRDNEVlNfQUREUkVTU01PREVfTUFTSyAgKDEgPDwgRDNEVlNfQUREUkVTU01PREVfU0hJRlQpDQorDQordHlwZWRlZiBlbnVtIF9EM0RWU19BRERSRVNTTU9ERV9UWVBFDQorew0KKyAgICBEM0RWU19BRERSTU9ERV9BQlNPTFVURSAgPSAoMCA8PCBEM0RWU19BRERSRVNTTU9ERV9TSElGVCksDQorICAgIEQzRFZTX0FERFJNT0RFX1JFTEFUSVZFICA9ICgxIDw8IEQzRFZTX0FERFJFU1NNT0RFX1NISUZUKSwgICAvLyBSZWxhdGl2ZSB0byByZWdpc3RlciBBMA0KKyAgICBEM0RWU19BRERSTU9ERV9GT1JDRV9EV09SRCA9IDB4N2ZmZmZmZmYsIC8vIGZvcmNlIDMyLWJpdCBzaXplIGVudW0NCit9IEQzRFZTX0FERFJFU1NNT0RFX1RZUEU7DQorDQorLy8gU291cmNlIG9wZXJhbmQgc3dpenpsZSBkZWZpbml0aW9ucw0KKy8vDQorI2RlZmluZSBEM0RWU19TV0laWkxFX1NISUZUICAgICAxNg0KKyNkZWZpbmUgRDNEVlNfU1dJWlpMRV9NQVNLICAgICAgMHgwMEZGMDAwMA0KKw0KKy8vIFRoZSBmb2xsb3dpbmcgYml0cyBkZWZpbmUgd2hlcmUgdG8gdGFrZSBjb21wb25lbnQgWCBmcm9tOg0KKw0KKyNkZWZpbmUgRDNEVlNfWF9YICAgICAgICgwIDw8IEQzRFZTX1NXSVpaTEVfU0hJRlQpDQorI2RlZmluZSBEM0RWU19YX1kgICAgICAgKDEgPDwgRDNEVlNfU1dJWlpMRV9TSElGVCkNCisjZGVmaW5lIEQzRFZTX1hfWiAgICAgICAoMiA8PCBEM0RWU19TV0laWkxFX1NISUZUKQ0KKyNkZWZpbmUgRDNEVlNfWF9XICAgICAgICgzIDw8IEQzRFZTX1NXSVpaTEVfU0hJRlQpDQorDQorLy8gVGhlIGZvbGxvd2luZyBiaXRzIGRlZmluZSB3aGVyZSB0byB0YWtlIGNvbXBvbmVudCBZIGZyb206DQorDQorI2RlZmluZSBEM0RWU19ZX1ggICAgICAgKDAgPDwgKEQzRFZTX1NXSVpaTEVfU0hJRlQgKyAyKSkNCisjZGVmaW5lIEQzRFZTX1lfWSAgICAgICAoMSA8PCAoRDNEVlNfU1dJWlpMRV9TSElGVCArIDIpKQ0KKyNkZWZpbmUgRDNEVlNfWV9aICAgICAgICgyIDw8IChEM0RWU19TV0laWkxFX1NISUZUICsgMikpDQorI2RlZmluZSBEM0RWU19ZX1cgICAgICAgKDMgPDwgKEQzRFZTX1NXSVpaTEVfU0hJRlQgKyAyKSkNCisNCisvLyBUaGUgZm9sbG93aW5nIGJpdHMgZGVmaW5lIHdoZXJlIHRvIHRha2UgY29tcG9uZW50IFogZnJvbToNCisNCisjZGVmaW5lIEQzRFZTX1pfWCAgICAgICAoMCA8PCAoRDNEVlNfU1dJWlpMRV9TSElGVCArIDQpKQ0KKyNkZWZpbmUgRDNEVlNfWl9ZICAgICAgICgxIDw8IChEM0RWU19TV0laWkxFX1NISUZUICsgNCkpDQorI2RlZmluZSBEM0RWU19aX1ogICAgICAgKDIgPDwgKEQzRFZTX1NXSVpaTEVfU0hJRlQgKyA0KSkNCisjZGVmaW5lIEQzRFZTX1pfVyAgICAgICAoMyA8PCAoRDNEVlNfU1dJWlpMRV9TSElGVCArIDQpKQ0KKw0KKy8vIFRoZSBmb2xsb3dpbmcgYml0cyBkZWZpbmUgd2hlcmUgdG8gdGFrZSBjb21wb25lbnQgVyBmcm9tOg0KKw0KKyNkZWZpbmUgRDNEVlNfV19YICAgICAgICgwIDw8IChEM0RWU19TV0laWkxFX1NISUZUICsgNikpDQorI2RlZmluZSBEM0RWU19XX1kgICAgICAgKDEgPDwgKEQzRFZTX1NXSVpaTEVfU0hJRlQgKyA2KSkNCisjZGVmaW5lIEQzRFZTX1dfWiAgICAgICAoMiA8PCAoRDNEVlNfU1dJWlpMRV9TSElGVCArIDYpKQ0KKyNkZWZpbmUgRDNEVlNfV19XICAgICAgICgzIDw8IChEM0RWU19TV0laWkxFX1NISUZUICsgNikpDQorDQorLy8gVmFsdWUgd2hlbiB0aGVyZSBpcyBubyBzd2l6emxlIChYIGlzIHRha2VuIGZyb20gWCwgWSBpcyB0YWtlbiBmcm9tIFksDQorLy8gWiBpcyB0YWtlbiBmcm9tIFosIFcgaXMgdGFrZW4gZnJvbSBXDQorLy8NCisjZGVmaW5lIEQzRFZTX05PU1dJWlpMRSAoRDNEVlNfWF9YIHwgRDNEVlNfWV9ZIHwgRDNEVlNfWl9aIHwgRDNEVlNfV19XKQ0KKw0KKy8vIHNvdXJjZSBwYXJhbWV0ZXIgc3dpenpsZQ0KKyNkZWZpbmUgRDNEU1BfU1dJWlpMRV9TSElGVCAgICAgMTYNCisjZGVmaW5lIEQzRFNQX1NXSVpaTEVfTUFTSyAgICAgIDB4MDBGRjAwMDANCisNCisjZGVmaW5lIEQzRFNQX05PU1dJWlpMRSBcDQorICAgICggKDAgPDwgKEQzRFNQX1NXSVpaTEVfU0hJRlQgKyAwKSkgfCBcDQorICAgICAgKDEgPDwgKEQzRFNQX1NXSVpaTEVfU0hJRlQgKyAyKSkgfCBcDQorICAgICAgKDIgPDwgKEQzRFNQX1NXSVpaTEVfU0hJRlQgKyA0KSkgfCBcDQorICAgICAgKDMgPDwgKEQzRFNQX1NXSVpaTEVfU0hJRlQgKyA2KSkgKQ0KKw0KKy8vIHBpeGVsLXNoYWRlciBzd2l6emxlIG9wcw0KKyNkZWZpbmUgRDNEU1BfUkVQTElDQVRFUkVEIFwNCisgICAgKCAoMCA8PCAoRDNEU1BfU1dJWlpMRV9TSElGVCArIDApKSB8IFwNCisgICAgICAoMCA8PCAoRDNEU1BfU1dJWlpMRV9TSElGVCArIDIpKSB8IFwNCisgICAgICAoMCA8PCAoRDNEU1BfU1dJWlpMRV9TSElGVCArIDQpKSB8IFwNCisgICAgICAoMCA8PCAoRDNEU1BfU1dJWlpMRV9TSElGVCArIDYpKSApDQorDQorI2RlZmluZSBEM0RTUF9SRVBMSUNBVEVHUkVFTiBcDQorICAgICggKDEgPDwgKEQzRFNQX1NXSVpaTEVfU0hJRlQgKyAwKSkgfCBcDQorICAgICAgKDEgPDwgKEQzRFNQX1NXSVpaTEVfU0hJRlQgKyAyKSkgfCBcDQorICAgICAgKDEgPDwgKEQzRFNQX1NXSVpaTEVfU0hJRlQgKyA0KSkgfCBcDQorICAgICAgKDEgPDwgKEQzRFNQX1NXSVpaTEVfU0hJRlQgKyA2KSkgKQ0KKw0KKyNkZWZpbmUgRDNEU1BfUkVQTElDQVRFQkxVRSBcDQorICAgICggKDIgPDwgKEQzRFNQX1NXSVpaTEVfU0hJRlQgKyAwKSkgfCBcDQorICAgICAgKDIgPDwgKEQzRFNQX1NXSVpaTEVfU0hJRlQgKyAyKSkgfCBcDQorICAgICAgKDIgPDwgKEQzRFNQX1NXSVpaTEVfU0hJRlQgKyA0KSkgfCBcDQorICAgICAgKDIgPDwgKEQzRFNQX1NXSVpaTEVfU0hJRlQgKyA2KSkgKQ0KKw0KKyNkZWZpbmUgRDNEU1BfUkVQTElDQVRFQUxQSEEgXA0KKyAgICAoICgzIDw8IChEM0RTUF9TV0laWkxFX1NISUZUICsgMCkpIHwgXA0KKyAgICAgICgzIDw8IChEM0RTUF9TV0laWkxFX1NISUZUICsgMikpIHwgXA0KKyAgICAgICgzIDw8IChEM0RTUF9TV0laWkxFX1NISUZUICsgNCkpIHwgXA0KKyAgICAgICgzIDw8IChEM0RTUF9TV0laWkxFX1NISUZUICsgNikpICkNCisNCisvLyBzb3VyY2UgcGFyYW1ldGVyIG1vZGlmaWVycw0KKyNkZWZpbmUgRDNEU1BfU1JDTU9EX1NISUZUICAgICAgMjQNCisjZGVmaW5lIEQzRFNQX1NSQ01PRF9NQVNLICAgICAgIDB4MEYwMDAwMDANCisNCit0eXBlZGVmIGVudW0gX0QzRFNIQURFUl9QQVJBTV9TUkNNT0RfVFlQRQ0KK3sNCisgICAgRDNEU1BTTV9OT05FICAgID0gMDw8RDNEU1BfU1JDTU9EX1NISUZULCAvLyBub3ANCisgICAgRDNEU1BTTV9ORUcgICAgID0gMTw8RDNEU1BfU1JDTU9EX1NISUZULCAvLyBuZWdhdGUNCisgICAgRDNEU1BTTV9CSUFTICAgID0gMjw8RDNEU1BfU1JDTU9EX1NISUZULCAvLyBiaWFzDQorICAgIEQzRFNQU01fQklBU05FRyA9IDM8PEQzRFNQX1NSQ01PRF9TSElGVCwgLy8gYmlhcyBhbmQgbmVnYXRlDQorICAgIEQzRFNQU01fU0lHTiAgICA9IDQ8PEQzRFNQX1NSQ01PRF9TSElGVCwgLy8gc2lnbg0KKyAgICBEM0RTUFNNX1NJR05ORUcgPSA1PDxEM0RTUF9TUkNNT0RfU0hJRlQsIC8vIHNpZ24gYW5kIG5lZ2F0ZQ0KKyAgICBEM0RTUFNNX0NPTVAgICAgPSA2PDxEM0RTUF9TUkNNT0RfU0hJRlQsIC8vIGNvbXBsZW1lbnQNCisgICAgRDNEU1BTTV9YMiAgICAgID0gNzw8RDNEU1BfU1JDTU9EX1NISUZULCAvLyAqMg0KKyAgICBEM0RTUFNNX1gyTkVHICAgPSA4PDxEM0RTUF9TUkNNT0RfU0hJRlQsIC8vICoyIGFuZCBuZWdhdGUNCisgICAgRDNEU1BTTV9EWiAgICAgID0gOTw8RDNEU1BfU1JDTU9EX1NISUZULCAvLyBkaXZpZGUgdGhyb3VnaCBieSB6IGNvbXBvbmVudCANCisgICAgRDNEU1BTTV9EVyAgICAgID0gMTA8PEQzRFNQX1NSQ01PRF9TSElGVCwgLy8gZGl2aWRlIHRocm91Z2ggYnkgdyBjb21wb25lbnQNCisgICAgRDNEU1BTTV9GT1JDRV9EV09SRCA9IDB4N2ZmZmZmZmYsICAgICAgICAvLyBmb3JjZSAzMi1iaXQgc2l6ZSBlbnVtDQorfSBEM0RTSEFERVJfUEFSQU1fU1JDTU9EX1RZUEU7DQorDQorLy8gcGl4ZWwgc2hhZGVyIHZlcnNpb24gdG9rZW4NCisjZGVmaW5lIEQzRFBTX1ZFUlNJT04oX01ham9yLF9NaW5vcikgKDB4RkZGRjAwMDB8KChfTWFqb3IpPDw4KXwoX01pbm9yKSkNCisNCisvLyB2ZXJ0ZXggc2hhZGVyIHZlcnNpb24gdG9rZW4NCisjZGVmaW5lIEQzRFZTX1ZFUlNJT04oX01ham9yLF9NaW5vcikgKDB4RkZGRTAwMDB8KChfTWFqb3IpPDw4KXwoX01pbm9yKSkNCisNCisvLyBleHRyYWN0IG1ham9yL21pbm9yIGZyb20gdmVyc2lvbiBjYXANCisjZGVmaW5lIEQzRFNIQURFUl9WRVJTSU9OX01BSk9SKF9WZXJzaW9uKSAoKChfVmVyc2lvbik+PjgpJjB4RkYpDQorI2RlZmluZSBEM0RTSEFERVJfVkVSU0lPTl9NSU5PUihfVmVyc2lvbikgKCgoX1ZlcnNpb24pPj4wKSYweEZGKQ0KKw0KKy8vIGRlc3RpbmF0aW9uL3NvdXJjZSBwYXJhbWV0ZXIgcmVnaXN0ZXIgdHlwZQ0KKyNkZWZpbmUgRDNEU0lfQ09NTUVOVFNJWkVfU0hJRlQgICAgIDE2DQorI2RlZmluZSBEM0RTSV9DT01NRU5UU0laRV9NQVNLICAgICAgMHg3RkZGMDAwMA0KKyNkZWZpbmUgRDNEU0hBREVSX0NPTU1FTlQoX0RXb3JkU2l6ZSkgXA0KKyAgICAoKCgoX0RXb3JkU2l6ZSk8PEQzRFNJX0NPTU1FTlRTSVpFX1NISUZUKSZEM0RTSV9DT01NRU5UU0laRV9NQVNLKXxEM0RTSU9fQ09NTUVOVCkNCisNCisvLyBwaXhlbC92ZXJ0ZXggc2hhZGVyIGVuZCB0b2tlbg0KKyNkZWZpbmUgRDNEUFNfRU5EKCkgIDB4MDAwMEZGRkYNCisjZGVmaW5lIEQzRFZTX0VORCgpICAweDAwMDBGRkZGDQorDQorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisvLyBIaWdoIG9yZGVyIHN1cmZhY2VzDQorLy8NCit0eXBlZGVmIGVudW0gX0QzREJBU0lTVFlQRQ0KK3sNCisgICBEM0RCQVNJU19CRVpJRVIgICAgICA9IDAsDQorICAgRDNEQkFTSVNfQlNQTElORSAgICAgPSAxLA0KKyAgIEQzREJBU0lTX0lOVEVSUE9MQVRFID0gMiwNCisgICBEM0RCQVNJU19GT1JDRV9EV09SRCA9IDB4N2ZmZmZmZmYsDQorfSBEM0RCQVNJU1RZUEU7DQorDQordHlwZWRlZiBlbnVtIF9EM0RPUkRFUlRZUEUNCit7DQorICAgRDNET1JERVJfTElORUFSICAgICAgPSAxLA0KKyAgIEQzRE9SREVSX1FVQURSQVRJQyAgID0gMiwNCisgICBEM0RPUkRFUl9DVUJJQyAgICAgICA9IDMsDQorICAgRDNET1JERVJfUVVJTlRJQyAgICAgPSA1LA0KKyAgIEQzRE9SREVSX0ZPUkNFX0RXT1JEID0gMHg3ZmZmZmZmZiwNCit9IEQzRE9SREVSVFlQRTsNCisNCit0eXBlZGVmIGVudW0gX0QzRFBBVENIRURHRVNUWUxFDQorew0KKyAgIEQzRFBBVENIRURHRV9ESVNDUkVURSAgICA9IDAsDQorICAgRDNEUEFUQ0hFREdFX0NPTlRJTlVPVVMgID0gMSwNCisgICBEM0RQQVRDSEVER0VfRk9SQ0VfRFdPUkQgPSAweDdmZmZmZmZmLA0KK30gRDNEUEFUQ0hFREdFU1RZTEU7DQorDQordHlwZWRlZiBlbnVtIF9EM0RTVEFURUJMT0NLVFlQRQ0KK3sNCisgICAgRDNEU0JUX0FMTCAgICAgICAgICAgPSAxLCAvLyBjYXB0dXJlIGFsbCBzdGF0ZQ0KKyAgICBEM0RTQlRfUElYRUxTVEFURSAgICA9IDIsIC8vIGNhcHR1cmUgcGl4ZWwgc3RhdGUNCisgICAgRDNEU0JUX1ZFUlRFWFNUQVRFICAgPSAzLCAvLyBjYXB0dXJlIHZlcnRleCBzdGF0ZQ0KKyAgICBEM0RTQlRfRk9SQ0VfRFdPUkQgICA9IDB4N2ZmZmZmZmYsDQorfSBEM0RTVEFURUJMT0NLVFlQRTsNCisNCisvLyBUaGUgRDNEVkVSVEVYQkxFTkRGTEFHUyB0eXBlIGlzIHVzZWQgd2l0aCBEM0RSU19WRVJURVhCTEVORCBzdGF0ZS4NCisvLw0KK3R5cGVkZWYgZW51bSBfRDNEVkVSVEVYQkxFTkRGTEFHUw0KK3sNCisgICAgRDNEVkJGX0RJU0FCTEUgID0gMCwgICAgIC8vIERpc2FibGUgdmVydGV4IGJsZW5kaW5nDQorICAgIEQzRFZCRl8xV0VJR0hUUyA9IDEsICAgICAvLyAyIG1hdHJpeCBibGVuZGluZw0KKyAgICBEM0RWQkZfMldFSUdIVFMgPSAyLCAgICAgLy8gMyBtYXRyaXggYmxlbmRpbmcNCisgICAgRDNEVkJGXzNXRUlHSFRTID0gMywgICAgIC8vIDQgbWF0cml4IGJsZW5kaW5nDQorICAgIEQzRFZCRl9UV0VFTklORyA9IDI1NSwgICAvLyBibGVuZGluZyB1c2luZyBEM0RSU19UV0VFTkZBQ1RPUg0KKyAgICBEM0RWQkZfMFdFSUdIVFMgPSAyNTYsICAgLy8gb25lIG1hdHJpeCBpcyB1c2VkIHdpdGggd2VpZ2h0IDEuMA0KKyAgICBEM0RWQkZfRk9SQ0VfRFdPUkQgPSAweDdmZmZmZmZmLCAvLyBmb3JjZSAzMi1iaXQgc2l6ZSBlbnVtDQorfSBEM0RWRVJURVhCTEVOREZMQUdTOw0KKw0KK3R5cGVkZWYgZW51bSBfRDNEVEVYVFVSRVRSQU5TRk9STUZMQUdTIHsNCisgICAgRDNEVFRGRl9ESVNBQkxFICAgICAgICAgPSAwLCAgICAvLyB0ZXh0dXJlIGNvb3JkaW5hdGVzIGFyZSBwYXNzZWQgZGlyZWN0bHkNCisgICAgRDNEVFRGRl9DT1VOVDEgICAgICAgICAgPSAxLCAgICAvLyByYXN0ZXJpemVyIHNob3VsZCBleHBlY3QgMS1EIHRleHR1cmUgY29vcmRzDQorICAgIEQzRFRURkZfQ09VTlQyICAgICAgICAgID0gMiwgICAgLy8gcmFzdGVyaXplciBzaG91bGQgZXhwZWN0IDItRCB0ZXh0dXJlIGNvb3Jkcw0KKyAgICBEM0RUVEZGX0NPVU5UMyAgICAgICAgICA9IDMsICAgIC8vIHJhc3Rlcml6ZXIgc2hvdWxkIGV4cGVjdCAzLUQgdGV4dHVyZSBjb29yZHMNCisgICAgRDNEVFRGRl9DT1VOVDQgICAgICAgICAgPSA0LCAgICAvLyByYXN0ZXJpemVyIHNob3VsZCBleHBlY3QgNC1EIHRleHR1cmUgY29vcmRzDQorICAgIEQzRFRURkZfUFJPSkVDVEVEICAgICAgID0gMjU2LCAgLy8gdGV4Y29vcmRzIHRvIGJlIGRpdmlkZWQgYnkgQ09VTlR0aCBlbGVtZW50DQorICAgIEQzRFRURkZfRk9SQ0VfRFdPUkQgICAgID0gMHg3ZmZmZmZmZiwNCit9IEQzRFRFWFRVUkVUUkFOU0ZPUk1GTEFHUzsNCisNCisvLyBNYWNyb3MgdG8gc2V0IHRleHR1cmUgY29vcmRpbmF0ZSBmb3JtYXQgYml0cyBpbiB0aGUgRlZGIGlkDQorDQorI2RlZmluZSBEM0RGVkZfVEVYVFVSRUZPUk1BVDIgMCAgICAgICAgIC8vIFR3byBmbG9hdGluZyBwb2ludCB2YWx1ZXMNCisjZGVmaW5lIEQzREZWRl9URVhUVVJFRk9STUFUMSAzICAgICAgICAgLy8gT25lIGZsb2F0aW5nIHBvaW50IHZhbHVlDQorI2RlZmluZSBEM0RGVkZfVEVYVFVSRUZPUk1BVDMgMSAgICAgICAgIC8vIFRocmVlIGZsb2F0aW5nIHBvaW50IHZhbHVlcw0KKyNkZWZpbmUgRDNERlZGX1RFWFRVUkVGT1JNQVQ0IDIgICAgICAgICAvLyBGb3VyIGZsb2F0aW5nIHBvaW50IHZhbHVlcw0KKw0KKyNkZWZpbmUgRDNERlZGX1RFWENPT1JEU0laRTMoQ29vcmRJbmRleCkgKEQzREZWRl9URVhUVVJFRk9STUFUMyA8PCAoQ29vcmRJbmRleCoyICsgMTYpKQ0KKyNkZWZpbmUgRDNERlZGX1RFWENPT1JEU0laRTIoQ29vcmRJbmRleCkgKEQzREZWRl9URVhUVVJFRk9STUFUMikNCisjZGVmaW5lIEQzREZWRl9URVhDT09SRFNJWkU0KENvb3JkSW5kZXgpIChEM0RGVkZfVEVYVFVSRUZPUk1BVDQgPDwgKENvb3JkSW5kZXgqMiArIDE2KSkNCisjZGVmaW5lIEQzREZWRl9URVhDT09SRFNJWkUxKENvb3JkSW5kZXgpIChEM0RGVkZfVEVYVFVSRUZPUk1BVDEgPDwgKENvb3JkSW5kZXgqMiArIDE2KSkNCisNCisNCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKy8qIERpcmVjdDNEOCBEZXZpY2UgdHlwZXMgKi8NCit0eXBlZGVmIGVudW0gX0QzRERFVlRZUEUNCit7DQorICAgIEQzRERFVlRZUEVfSEFMICAgICAgICAgPSAxLA0KKyAgICBEM0RERVZUWVBFX1JFRiAgICAgICAgID0gMiwNCisgICAgRDNEREVWVFlQRV9TVyAgICAgICAgICA9IDMsDQorDQorICAgIEQzRERFVlRZUEVfRk9SQ0VfRFdPUkQgID0gMHg3ZmZmZmZmZg0KK30gRDNEREVWVFlQRTsNCisNCisvKiBNdWx0aS1TYW1wbGUgYnVmZmVyIHR5cGVzICovDQordHlwZWRlZiBlbnVtIF9EM0RNVUxUSVNBTVBMRV9UWVBFDQorew0KKyAgICBEM0RNVUxUSVNBTVBMRV9OT05FICAgICAgICAgICAgPSAgMCwNCisgICAgRDNETVVMVElTQU1QTEVfMl9TQU1QTEVTICAgICAgID0gIDIsDQorICAgIEQzRE1VTFRJU0FNUExFXzNfU0FNUExFUyAgICAgICA9ICAzLA0KKyAgICBEM0RNVUxUSVNBTVBMRV80X1NBTVBMRVMgICAgICAgPSAgNCwNCisgICAgRDNETVVMVElTQU1QTEVfNV9TQU1QTEVTICAgICAgID0gIDUsDQorICAgIEQzRE1VTFRJU0FNUExFXzZfU0FNUExFUyAgICAgICA9ICA2LA0KKyAgICBEM0RNVUxUSVNBTVBMRV83X1NBTVBMRVMgICAgICAgPSAgNywNCisgICAgRDNETVVMVElTQU1QTEVfOF9TQU1QTEVTICAgICAgID0gIDgsDQorICAgIEQzRE1VTFRJU0FNUExFXzlfU0FNUExFUyAgICAgICA9ICA5LA0KKyAgICBEM0RNVUxUSVNBTVBMRV8xMF9TQU1QTEVTICAgICAgPSAxMCwNCisgICAgRDNETVVMVElTQU1QTEVfMTFfU0FNUExFUyAgICAgID0gMTEsDQorICAgIEQzRE1VTFRJU0FNUExFXzEyX1NBTVBMRVMgICAgICA9IDEyLA0KKyAgICBEM0RNVUxUSVNBTVBMRV8xM19TQU1QTEVTICAgICAgPSAxMywNCisgICAgRDNETVVMVElTQU1QTEVfMTRfU0FNUExFUyAgICAgID0gMTQsDQorICAgIEQzRE1VTFRJU0FNUExFXzE1X1NBTVBMRVMgICAgICA9IDE1LA0KKyAgICBEM0RNVUxUSVNBTVBMRV8xNl9TQU1QTEVTICAgICAgPSAxNiwNCisNCisgICAgRDNETVVMVElTQU1QTEVfRk9SQ0VfRFdPUkQgICAgID0gMHg3ZmZmZmZmZg0KK30gRDNETVVMVElTQU1QTEVfVFlQRTsNCisNCisvKiBGb3JtYXRzDQorICogTW9zdCBvZiB0aGVzZSBuYW1lcyBoYXZlIHRoZSBmb2xsb3dpbmcgY29udmVudGlvbjoNCisgKiAgICAgIEEgPSBBbHBoYQ0KKyAqICAgICAgUiA9IFJlZA0KKyAqICAgICAgRyA9IEdyZWVuDQorICogICAgICBCID0gQmx1ZQ0KKyAqICAgICAgWCA9IFVudXNlZCBCaXRzDQorICogICAgICBQID0gUGFsZXR0ZQ0KKyAqICAgICAgTCA9IEx1bWluYW5jZQ0KKyAqICAgICAgVSA9IGRVIGNvb3JkaW5hdGUgZm9yIEJ1bXBNYXANCisgKiAgICAgIFYgPSBkViBjb29yZGluYXRlIGZvciBCdW1wTWFwDQorICogICAgICBTID0gU3RlbmNpbA0KKyAqICAgICAgRCA9IERlcHRoIChlLmcuIFogb3IgVyBidWZmZXIpDQorICoNCisgKiAgICAgIEZ1cnRoZXIsIHRoZSBvcmRlciBvZiB0aGUgcGllY2VzIGFyZSBmcm9tIE1TQiBmaXJzdDsgaGVuY2UNCisgKiAgICAgIEQzREZNVF9BOEw4IGluZGljYXRlcyB0aGF0IHRoZSBoaWdoIGJ5dGUgb2YgdGhpcyB0d28gYnl0ZQ0KKyAqICAgICAgZm9ybWF0IGlzIGFscGhhLg0KKyAqDQorICogICAgICBEMTYgaW5kaWNhdGVzOg0KKyAqICAgICAgICAgICAtIEFuIGludGVnZXIgMTYtYml0IHZhbHVlLg0KKyAqICAgICAgICAgICAtIEFuIGFwcC1sb2NrYWJsZSBzdXJmYWNlLg0KKyAqDQorICogICAgICBBbGwgRGVwdGgvU3RlbmNpbCBmb3JtYXRzIGV4Y2VwdCBEM0RGTVRfRDE2X0xPQ0tBQkxFIGluZGljYXRlOg0KKyAqICAgICAgICAgIC0gbm8gcGFydGljdWxhciBiaXQgb3JkZXJpbmcgcGVyIHBpeGVsLCBhbmQNCisgKiAgICAgICAgICAtIGFyZSBub3QgYXBwIGxvY2thYmxlLCBhbmQNCisgKiAgICAgICAgICAtIHRoZSBkcml2ZXIgaXMgYWxsb3dlZCB0byBjb25zdW1lIG1vcmUgdGhhbiB0aGUgaW5kaWNhdGVkDQorICogICAgICAgICAgICBudW1iZXIgb2YgYml0cyBwZXIgRGVwdGggY2hhbm5lbCAoYnV0IG5vdCBTdGVuY2lsIGNoYW5uZWwpLg0KKyAqLw0KKyNpZm5kZWYgTUFLRUZPVVJDQw0KKyAgICAjZGVmaW5lIE1BS0VGT1VSQ0MoY2gwLCBjaDEsIGNoMiwgY2gzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwNCisgICAgICAgICAgICAgICAgKChEV09SRCkoQllURSkoY2gwKSB8ICgoRFdPUkQpKEJZVEUpKGNoMSkgPDwgOCkgfCAgICAgICBcDQorICAgICAgICAgICAgICAgICgoRFdPUkQpKEJZVEUpKGNoMikgPDwgMTYpIHwgKChEV09SRCkoQllURSkoY2gzKSA8PCAyNCApKQ0KKyNlbmRpZiAvKiBkZWZpbmVkKE1BS0VGT1VSQ0MpICovDQorDQorDQordHlwZWRlZiBlbnVtIF9EM0RGT1JNQVQNCit7DQorICAgIEQzREZNVF9VTktOT1dOICAgICAgICAgICAgICA9ICAwLA0KKw0KKyAgICBEM0RGTVRfUjhHOEI4ICAgICAgICAgICAgICAgPSAyMCwNCisgICAgRDNERk1UX0E4UjhHOEI4ICAgICAgICAgICAgID0gMjEsDQorICAgIEQzREZNVF9YOFI4RzhCOCAgICAgICAgICAgICA9IDIyLA0KKyAgICBEM0RGTVRfUjVHNkI1ICAgICAgICAgICAgICAgPSAyMywNCisgICAgRDNERk1UX1gxUjVHNUI1ICAgICAgICAgICAgID0gMjQsDQorICAgIEQzREZNVF9BMVI1RzVCNSAgICAgICAgICAgICA9IDI1LA0KKyAgICBEM0RGTVRfQTRSNEc0QjQgICAgICAgICAgICAgPSAyNiwNCisgICAgRDNERk1UX1IzRzNCMiAgICAgICAgICAgICAgID0gMjcsDQorICAgIEQzREZNVF9BOCAgICAgICAgICAgICAgICAgICA9IDI4LA0KKyAgICBEM0RGTVRfQThSM0czQjIgICAgICAgICAgICAgPSAyOSwNCisgICAgRDNERk1UX1g0UjRHNEI0ICAgICAgICAgICAgID0gMzAsDQorICAgIEQzREZNVF9BMkIxMEcxMFIxMCAgICAgICAgICA9IDMxLA0KKyAgICBEM0RGTVRfRzE2UjE2ICAgICAgICAgICAgICAgPSAzNCwNCisNCisgICAgRDNERk1UX0E4UDggICAgICAgICAgICAgICAgID0gNDAsDQorICAgIEQzREZNVF9QOCAgICAgICAgICAgICAgICAgICA9IDQxLA0KKw0KKyAgICBEM0RGTVRfTDggICAgICAgICAgICAgICAgICAgPSA1MCwNCisgICAgRDNERk1UX0E4TDggICAgICAgICAgICAgICAgID0gNTEsDQorICAgIEQzREZNVF9BNEw0ICAgICAgICAgICAgICAgICA9IDUyLA0KKw0KKyAgICBEM0RGTVRfVjhVOCAgICAgICAgICAgICAgICAgPSA2MCwNCisgICAgRDNERk1UX0w2VjVVNSAgICAgICAgICAgICAgID0gNjEsDQorICAgIEQzREZNVF9YOEw4VjhVOCAgICAgICAgICAgICA9IDYyLA0KKyAgICBEM0RGTVRfUThXOFY4VTggICAgICAgICAgICAgPSA2MywNCisgICAgRDNERk1UX1YxNlUxNiAgICAgICAgICAgICAgID0gNjQsDQorICAgIEQzREZNVF9XMTFWMTFVMTAgICAgICAgICAgICA9IDY1LA0KKyAgICBEM0RGTVRfQTJXMTBWMTBVMTAgICAgICAgICAgPSA2NywNCisNCisgICAgRDNERk1UX1VZVlkgICAgICAgICAgICAgICAgID0gTUFLRUZPVVJDQygnVScsICdZJywgJ1YnLCAnWScpLA0KKyAgICBEM0RGTVRfWVVZMiAgICAgICAgICAgICAgICAgPSBNQUtFRk9VUkNDKCdZJywgJ1UnLCAnWScsICcyJyksDQorICAgIEQzREZNVF9EWFQxICAgICAgICAgICAgICAgICA9IE1BS0VGT1VSQ0MoJ0QnLCAnWCcsICdUJywgJzEnKSwNCisgICAgRDNERk1UX0RYVDIgICAgICAgICAgICAgICAgID0gTUFLRUZPVVJDQygnRCcsICdYJywgJ1QnLCAnMicpLA0KKyAgICBEM0RGTVRfRFhUMyAgICAgICAgICAgICAgICAgPSBNQUtFRk9VUkNDKCdEJywgJ1gnLCAnVCcsICczJyksDQorICAgIEQzREZNVF9EWFQ0ICAgICAgICAgICAgICAgICA9IE1BS0VGT1VSQ0MoJ0QnLCAnWCcsICdUJywgJzQnKSwNCisgICAgRDNERk1UX0RYVDUgICAgICAgICAgICAgICAgID0gTUFLRUZPVVJDQygnRCcsICdYJywgJ1QnLCAnNScpLA0KKw0KKyAgICBEM0RGTVRfRDE2X0xPQ0tBQkxFICAgICAgICAgPSA3MCwNCisgICAgRDNERk1UX0QzMiAgICAgICAgICAgICAgICAgID0gNzEsDQorICAgIEQzREZNVF9EMTVTMSAgICAgICAgICAgICAgICA9IDczLA0KKyAgICBEM0RGTVRfRDI0UzggICAgICAgICAgICAgICAgPSA3NSwNCisgICAgRDNERk1UX0QxNiAgICAgICAgICAgICAgICAgID0gODAsDQorICAgIEQzREZNVF9EMjRYOCAgICAgICAgICAgICAgICA9IDc3LA0KKyAgICBEM0RGTVRfRDI0WDRTNCAgICAgICAgICAgICAgPSA3OSwNCisNCisNCisgICAgRDNERk1UX1ZFUlRFWERBVEEgICAgICAgICAgID0xMDAsDQorICAgIEQzREZNVF9JTkRFWDE2ICAgICAgICAgICAgICA9MTAxLA0KKyAgICBEM0RGTVRfSU5ERVgzMiAgICAgICAgICAgICAgPTEwMiwNCisNCisgICAgRDNERk1UX0ZPUkNFX0RXT1JEICAgICAgICAgID0weDdmZmZmZmZmDQorfSBEM0RGT1JNQVQ7DQorDQorLyogRGlzcGxheSBNb2RlcyAqLw0KK3R5cGVkZWYgc3RydWN0IF9EM0RESVNQTEFZTU9ERQ0KK3sNCisgICAgVUlOVCAgICAgICAgICAgIFdpZHRoOw0KKyAgICBVSU5UICAgICAgICAgICAgSGVpZ2h0Ow0KKyAgICBVSU5UICAgICAgICAgICAgUmVmcmVzaFJhdGU7DQorICAgIEQzREZPUk1BVCAgICAgICBGb3JtYXQ7DQorfSBEM0RESVNQTEFZTU9ERTsNCisNCisvKiBDcmVhdGlvbiBQYXJhbWV0ZXJzICovDQordHlwZWRlZiBzdHJ1Y3QgX0QzRERFVklDRV9DUkVBVElPTl9QQVJBTUVURVJTDQorew0KKyAgICBVSU5UICAgICAgICAgICAgQWRhcHRlck9yZGluYWw7DQorICAgIEQzRERFVlRZUEUgICAgICBEZXZpY2VUeXBlOw0KKyAgICBIV05EICAgICAgICAgICAgaEZvY3VzV2luZG93Ow0KKyAgICBEV09SRCAgICAgICAgICAgQmVoYXZpb3JGbGFnczsNCit9IEQzRERFVklDRV9DUkVBVElPTl9QQVJBTUVURVJTOw0KKw0KKw0KKy8qIFN3YXBFZmZlY3RzICovDQordHlwZWRlZiBlbnVtIF9EM0RTV0FQRUZGRUNUDQorew0KKyAgICBEM0RTV0FQRUZGRUNUX0RJU0NBUkQgICAgICAgICAgID0gMSwNCisgICAgRDNEU1dBUEVGRkVDVF9GTElQICAgICAgICAgICAgICA9IDIsDQorICAgIEQzRFNXQVBFRkZFQ1RfQ09QWSAgICAgICAgICAgICAgPSAzLA0KKyAgICBEM0RTV0FQRUZGRUNUX0NPUFlfVlNZTkMgICAgICAgID0gNCwNCisNCisgICAgRDNEU1dBUEVGRkVDVF9GT1JDRV9EV09SRCAgICAgICA9IDB4N2ZmZmZmZmYNCit9IEQzRFNXQVBFRkZFQ1Q7DQorDQorLyogUG9vbCB0eXBlcyAqLw0KK3R5cGVkZWYgZW51bSBfRDNEUE9PTCB7DQorICAgIEQzRFBPT0xfREVGQVVMVCAgICAgICAgICAgICAgICAgPSAwLA0KKyAgICBEM0RQT09MX01BTkFHRUQgICAgICAgICAgICAgICAgID0gMSwNCisgICAgRDNEUE9PTF9TWVNURU1NRU0gICAgICAgICAgICAgICA9IDIsDQorICAgIEQzRFBPT0xfU0NSQVRDSCAgICAgICAgICAgICAgICAgPSAzLA0KKw0KKyAgICBEM0RQT09MX0ZPUkNFX0RXT1JEICAgICAgICAgICAgID0gMHg3ZmZmZmZmZg0KK30gRDNEUE9PTDsNCisNCisNCisvKiBSZWZyZXNoUmF0ZSBwcmUtZGVmaW5lcyAqLw0KKyNkZWZpbmUgRDNEUFJFU0VOVF9SQVRFX0RFRkFVTFQgICAgICAgICAweDAwMDAwMDAwDQorI2RlZmluZSBEM0RQUkVTRU5UX1JBVEVfVU5MSU1JVEVEICAgICAgIDB4N2ZmZmZmZmYNCisNCisNCisvKiBSZXNpemUgT3B0aW9uYWwgUGFyYW1ldGVycyAqLw0KK3R5cGVkZWYgc3RydWN0IF9EM0RQUkVTRU5UX1BBUkFNRVRFUlNfDQorew0KKyAgICBVSU5UICAgICAgICAgICAgICAgIEJhY2tCdWZmZXJXaWR0aDsNCisgICAgVUlOVCAgICAgICAgICAgICAgICBCYWNrQnVmZmVySGVpZ2h0Ow0KKyAgICBEM0RGT1JNQVQgICAgICAgICAgIEJhY2tCdWZmZXJGb3JtYXQ7DQorICAgIFVJTlQgICAgICAgICAgICAgICAgQmFja0J1ZmZlckNvdW50Ow0KKw0KKyAgICBEM0RNVUxUSVNBTVBMRV9UWVBFIE11bHRpU2FtcGxlVHlwZTsNCisNCisgICAgRDNEU1dBUEVGRkVDVCAgICAgICBTd2FwRWZmZWN0Ow0KKyAgICBIV05EICAgICAgICAgICAgICAgIGhEZXZpY2VXaW5kb3c7DQorICAgIEJPT0wgICAgICAgICAgICAgICAgV2luZG93ZWQ7DQorICAgIEJPT0wgICAgICAgICAgICAgICAgRW5hYmxlQXV0b0RlcHRoU3RlbmNpbDsNCisgICAgRDNERk9STUFUICAgICAgICAgICBBdXRvRGVwdGhTdGVuY2lsRm9ybWF0Ow0KKyAgICBEV09SRCAgICAgICAgICAgICAgIEZsYWdzOw0KKw0KKyAgICAvKiBGb2xsb3dpbmcgZWxlbWVudHMgbXVzdCBiZSB6ZXJvIGZvciBXaW5kb3dlZCBtb2RlICovDQorICAgIFVJTlQgICAgICAgICAgICAgICAgRnVsbFNjcmVlbl9SZWZyZXNoUmF0ZUluSHo7DQorICAgIFVJTlQgICAgICAgICAgICAgICAgRnVsbFNjcmVlbl9QcmVzZW50YXRpb25JbnRlcnZhbDsNCisNCit9IEQzRFBSRVNFTlRfUEFSQU1FVEVSUzsNCisNCisvLyBWYWx1ZXMgZm9yIEQzRFBSRVNFTlRfUEFSQU1FVEVSUy5GbGFncw0KKw0KKyNkZWZpbmUgRDNEUFJFU0VOVEZMQUdfTE9DS0FCTEVfQkFDS0JVRkZFUiAgMHgwMDAwMDAwMQ0KKw0KKw0KKy8qIEdhbW1hIFJhbXA6IFNhbWUgYXMgRFg3ICovDQorDQordHlwZWRlZiBzdHJ1Y3QgX0QzREdBTU1BUkFNUA0KK3sNCisgICAgV09SRCAgICAgICAgICAgICAgICByZWQgIFsyNTZdOw0KKyAgICBXT1JEICAgICAgICAgICAgICAgIGdyZWVuWzI1Nl07DQorICAgIFdPUkQgICAgICAgICAgICAgICAgYmx1ZSBbMjU2XTsNCit9IEQzREdBTU1BUkFNUDsNCisNCisvKiBCYWNrIGJ1ZmZlciB0eXBlcyAqLw0KK3R5cGVkZWYgZW51bSBfRDNEQkFDS0JVRkZFUl9UWVBFDQorew0KKyAgICBEM0RCQUNLQlVGRkVSX1RZUEVfTU9OTyAgICAgICAgID0gMCwNCisgICAgRDNEQkFDS0JVRkZFUl9UWVBFX0xFRlQgICAgICAgICA9IDEsDQorICAgIEQzREJBQ0tCVUZGRVJfVFlQRV9SSUdIVCAgICAgICAgPSAyLA0KKw0KKyAgICBEM0RCQUNLQlVGRkVSX1RZUEVfRk9SQ0VfRFdPUkQgID0gMHg3ZmZmZmZmZg0KK30gRDNEQkFDS0JVRkZFUl9UWVBFOw0KKw0KKw0KKy8qIFR5cGVzICovDQordHlwZWRlZiBlbnVtIF9EM0RSRVNPVVJDRVRZUEUgew0KKyAgICBEM0RSVFlQRV9TVVJGQUNFICAgICAgICAgICAgICAgID0gIDEsDQorICAgIEQzRFJUWVBFX1ZPTFVNRSAgICAgICAgICAgICAgICAgPSAgMiwNCisgICAgRDNEUlRZUEVfVEVYVFVSRSAgICAgICAgICAgICAgICA9ICAzLA0KKyAgICBEM0RSVFlQRV9WT0xVTUVURVhUVVJFICAgICAgICAgID0gIDQsDQorICAgIEQzRFJUWVBFX0NVQkVURVhUVVJFICAgICAgICAgICAgPSAgNSwNCisgICAgRDNEUlRZUEVfVkVSVEVYQlVGRkVSICAgICAgICAgICA9ICA2LA0KKyAgICBEM0RSVFlQRV9JTkRFWEJVRkZFUiAgICAgICAgICAgID0gIDcsDQorDQorDQorICAgIEQzRFJUWVBFX0ZPUkNFX0RXT1JEICAgICAgICAgICAgPSAweDdmZmZmZmZmDQorfSBEM0RSRVNPVVJDRVRZUEU7DQorDQorLyogVXNhZ2VzICovDQorI2RlZmluZSBEM0RVU0FHRV9SRU5ERVJUQVJHRVQgICAgICAgKDB4MDAwMDAwMDFMKQ0KKyNkZWZpbmUgRDNEVVNBR0VfREVQVEhTVEVOQ0lMICAgICAgICgweDAwMDAwMDAyTCkNCisNCisvKiBVc2FnZXMgZm9yIFZlcnRleC9JbmRleCBidWZmZXJzICovDQorI2RlZmluZSBEM0RVU0FHRV9XUklURU9OTFkgICAgICAgICAgKDB4MDAwMDAwMDhMKQ0KKyNkZWZpbmUgRDNEVVNBR0VfU09GVFdBUkVQUk9DRVNTSU5HICgweDAwMDAwMDEwTCkNCisjZGVmaW5lIEQzRFVTQUdFX0RPTk9UQ0xJUCAgICAgICAgICAoMHgwMDAwMDAyMEwpDQorI2RlZmluZSBEM0RVU0FHRV9QT0lOVFMgICAgICAgICAgICAgKDB4MDAwMDAwNDBMKQ0KKyNkZWZpbmUgRDNEVVNBR0VfUlRQQVRDSEVTICAgICAgICAgICgweDAwMDAwMDgwTCkNCisjZGVmaW5lIEQzRFVTQUdFX05QQVRDSEVTICAgICAgICAgICAoMHgwMDAwMDEwMEwpDQorI2RlZmluZSBEM0RVU0FHRV9EWU5BTUlDICAgICAgICAgICAgKDB4MDAwMDAyMDBMKQ0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KKw0KKy8qIEN1YmVNYXAgRmFjZSBpZGVudGlmaWVycyAqLw0KK3R5cGVkZWYgZW51bSBfRDNEQ1VCRU1BUF9GQUNFUw0KK3sNCisgICAgRDNEQ1VCRU1BUF9GQUNFX1BPU0lUSVZFX1ggICAgID0gMCwNCisgICAgRDNEQ1VCRU1BUF9GQUNFX05FR0FUSVZFX1ggICAgID0gMSwNCisgICAgRDNEQ1VCRU1BUF9GQUNFX1BPU0lUSVZFX1kgICAgID0gMiwNCisgICAgRDNEQ1VCRU1BUF9GQUNFX05FR0FUSVZFX1kgICAgID0gMywNCisgICAgRDNEQ1VCRU1BUF9GQUNFX1BPU0lUSVZFX1ogICAgID0gNCwNCisgICAgRDNEQ1VCRU1BUF9GQUNFX05FR0FUSVZFX1ogICAgID0gNSwNCisNCisgICAgRDNEQ1VCRU1BUF9GQUNFX0ZPUkNFX0RXT1JEICAgID0gMHg3ZmZmZmZmZg0KK30gRDNEQ1VCRU1BUF9GQUNFUzsNCisNCisNCisvKiBMb2NrIGZsYWdzICovDQorDQorI2RlZmluZSBEM0RMT0NLX1JFQURPTkxZICAgICAgICAgICAweDAwMDAwMDEwTA0KKyNkZWZpbmUgRDNETE9DS19ESVNDQVJEICAgICAgICAgICAgIDB4MDAwMDIwMDBMDQorI2RlZmluZSBEM0RMT0NLX05PT1ZFUldSSVRFICAgICAgICAweDAwMDAxMDAwTA0KKyNkZWZpbmUgRDNETE9DS19OT1NZU0xPQ0sgICAgICAgICAgMHgwMDAwMDgwMEwNCisNCisjZGVmaW5lIEQzRExPQ0tfTk9fRElSVFlfVVBEQVRFICAgICAweDAwMDA4MDAwTA0KKw0KKw0KKw0KKw0KKw0KKw0KKy8qIFZlcnRleCBCdWZmZXIgRGVzY3JpcHRpb24gKi8NCit0eXBlZGVmIHN0cnVjdCBfRDNEVkVSVEVYQlVGRkVSX0RFU0MNCit7DQorICAgIEQzREZPUk1BVCAgICAgICAgICAgRm9ybWF0Ow0KKyAgICBEM0RSRVNPVVJDRVRZUEUgICAgIFR5cGU7DQorICAgIERXT1JEICAgICAgICAgICAgICAgVXNhZ2U7DQorICAgIEQzRFBPT0wgICAgICAgICAgICAgUG9vbDsNCisgICAgVUlOVCAgICAgICAgICAgICAgICBTaXplOw0KKw0KKyAgICBEV09SRCAgICAgICAgICAgICAgIEZWRjsNCisNCit9IEQzRFZFUlRFWEJVRkZFUl9ERVNDOw0KKw0KKy8qIEluZGV4IEJ1ZmZlciBEZXNjcmlwdGlvbiAqLw0KK3R5cGVkZWYgc3RydWN0IF9EM0RJTkRFWEJVRkZFUl9ERVNDDQorew0KKyAgICBEM0RGT1JNQVQgICAgICAgICAgIEZvcm1hdDsNCisgICAgRDNEUkVTT1VSQ0VUWVBFICAgICBUeXBlOw0KKyAgICBEV09SRCAgICAgICAgICAgICAgIFVzYWdlOw0KKyAgICBEM0RQT09MICAgICAgICAgICAgIFBvb2w7DQorICAgIFVJTlQgICAgICAgICAgICAgICAgU2l6ZTsNCit9IEQzRElOREVYQlVGRkVSX0RFU0M7DQorDQorDQorLyogU3VyZmFjZSBEZXNjcmlwdGlvbiAqLw0KK3R5cGVkZWYgc3RydWN0IF9EM0RTVVJGQUNFX0RFU0MNCit7DQorICAgIEQzREZPUk1BVCAgICAgICAgICAgRm9ybWF0Ow0KKyAgICBEM0RSRVNPVVJDRVRZUEUgICAgIFR5cGU7DQorICAgIERXT1JEICAgICAgICAgICAgICAgVXNhZ2U7DQorICAgIEQzRFBPT0wgICAgICAgICAgICAgUG9vbDsNCisgICAgVUlOVCAgICAgICAgICAgICAgICBTaXplOw0KKw0KKyAgICBEM0RNVUxUSVNBTVBMRV9UWVBFIE11bHRpU2FtcGxlVHlwZTsNCisgICAgVUlOVCAgICAgICAgICAgICAgICBXaWR0aDsNCisgICAgVUlOVCAgICAgICAgICAgICAgICBIZWlnaHQ7DQorfSBEM0RTVVJGQUNFX0RFU0M7DQorDQordHlwZWRlZiBzdHJ1Y3QgX0QzRFZPTFVNRV9ERVNDDQorew0KKyAgICBEM0RGT1JNQVQgICAgICAgICAgIEZvcm1hdDsNCisgICAgRDNEUkVTT1VSQ0VUWVBFICAgICBUeXBlOw0KKyAgICBEV09SRCAgICAgICAgICAgICAgIFVzYWdlOw0KKyAgICBEM0RQT09MICAgICAgICAgICAgIFBvb2w7DQorICAgIFVJTlQgICAgICAgICAgICAgICAgU2l6ZTsNCisNCisgICAgVUlOVCAgICAgICAgICAgICAgICBXaWR0aDsNCisgICAgVUlOVCAgICAgICAgICAgICAgICBIZWlnaHQ7DQorICAgIFVJTlQgICAgICAgICAgICAgICAgRGVwdGg7DQorfSBEM0RWT0xVTUVfREVTQzsNCisNCisvKiBTdHJ1Y3R1cmUgZm9yIExvY2tSZWN0ICovDQordHlwZWRlZiBzdHJ1Y3QgX0QzRExPQ0tFRF9SRUNUDQorew0KKyAgICBJTlQgICAgICAgICAgICAgICAgIFBpdGNoOw0KKyAgICB2b2lkKiAgICAgICAgICAgICAgIHBCaXRzOw0KK30gRDNETE9DS0VEX1JFQ1Q7DQorDQorLyogU3RydWN0dXJlcyBmb3IgTG9ja0JveCAqLw0KK3R5cGVkZWYgc3RydWN0IF9EM0RCT1gNCit7DQorICAgIFVJTlQgICAgICAgICAgICAgICAgTGVmdDsNCisgICAgVUlOVCAgICAgICAgICAgICAgICBUb3A7DQorICAgIFVJTlQgICAgICAgICAgICAgICAgUmlnaHQ7DQorICAgIFVJTlQgICAgICAgICAgICAgICAgQm90dG9tOw0KKyAgICBVSU5UICAgICAgICAgICAgICAgIEZyb250Ow0KKyAgICBVSU5UICAgICAgICAgICAgICAgIEJhY2s7DQorfSBEM0RCT1g7DQorDQordHlwZWRlZiBzdHJ1Y3QgX0QzRExPQ0tFRF9CT1gNCit7DQorICAgIElOVCAgICAgICAgICAgICAgICAgUm93UGl0Y2g7DQorICAgIElOVCAgICAgICAgICAgICAgICAgU2xpY2VQaXRjaDsNCisgICAgdm9pZCogICAgICAgICAgICAgICBwQml0czsNCit9IEQzRExPQ0tFRF9CT1g7DQorDQorLyogU3RydWN0dXJlcyBmb3IgTG9ja1JhbmdlICovDQordHlwZWRlZiBzdHJ1Y3QgX0QzRFJBTkdFDQorew0KKyAgICBVSU5UICAgICAgICAgICAgICAgIE9mZnNldDsNCisgICAgVUlOVCAgICAgICAgICAgICAgICBTaXplOw0KK30gRDNEUkFOR0U7DQorDQorLyogU3RydWN0dXJlcyBmb3IgaGlnaCBvcmRlciBwcmltaXRpdmVzICovDQordHlwZWRlZiBzdHJ1Y3QgX0QzRFJFQ1RQQVRDSF9JTkZPDQorew0KKyAgICBVSU5UICAgICAgICAgICAgICAgIFN0YXJ0VmVydGV4T2Zmc2V0V2lkdGg7DQorICAgIFVJTlQgICAgICAgICAgICAgICAgU3RhcnRWZXJ0ZXhPZmZzZXRIZWlnaHQ7DQorICAgIFVJTlQgICAgICAgICAgICAgICAgV2lkdGg7DQorICAgIFVJTlQgICAgICAgICAgICAgICAgSGVpZ2h0Ow0KKyAgICBVSU5UICAgICAgICAgICAgICAgIFN0cmlkZTsNCisgICAgRDNEQkFTSVNUWVBFICAgICAgICBCYXNpczsNCisgICAgRDNET1JERVJUWVBFICAgICAgICBPcmRlcjsNCit9IEQzRFJFQ1RQQVRDSF9JTkZPOw0KKw0KK3R5cGVkZWYgc3RydWN0IF9EM0RUUklQQVRDSF9JTkZPDQorew0KKyAgICBVSU5UICAgICAgICAgICAgICAgIFN0YXJ0VmVydGV4T2Zmc2V0Ow0KKyAgICBVSU5UICAgICAgICAgICAgICAgIE51bVZlcnRpY2VzOw0KKyAgICBEM0RCQVNJU1RZUEUgICAgICAgIEJhc2lzOw0KKyAgICBEM0RPUkRFUlRZUEUgICAgICAgIE9yZGVyOw0KK30gRDNEVFJJUEFUQ0hfSU5GTzsNCisNCisvKiBBZGFwdGVyIElkZW50aWZpZXIgKi8NCisNCisjZGVmaW5lIE1BWF9ERVZJQ0VfSURFTlRJRklFUl9TVFJJTkcgICAgICAgIDUxMg0KK3R5cGVkZWYgc3RydWN0IF9EM0RBREFQVEVSX0lERU5USUZJRVI4DQorew0KKyAgICBjaGFyICAgICAgICAgICAgRHJpdmVyW01BWF9ERVZJQ0VfSURFTlRJRklFUl9TVFJJTkddOw0KKyAgICBjaGFyICAgICAgICAgICAgRGVzY3JpcHRpb25bTUFYX0RFVklDRV9JREVOVElGSUVSX1NUUklOR107DQorDQorI2lmZGVmIF9XSU4zMg0KKyAgICBMQVJHRV9JTlRFR0VSICAgRHJpdmVyVmVyc2lvbjsgICAgICAgICAgICAvKiBEZWZpbmVkIGZvciAzMiBiaXQgY29tcG9uZW50cyAqLw0KKyNlbHNlDQorICAgIERXT1JEICAgICAgICAgICBEcml2ZXJWZXJzaW9uTG93UGFydDsgICAgIC8qIERlZmluZWQgZm9yIDE2IGJpdCBkcml2ZXIgY29tcG9uZW50cyAqLw0KKyAgICBEV09SRCAgICAgICAgICAgRHJpdmVyVmVyc2lvbkhpZ2hQYXJ0Ow0KKyNlbmRpZg0KKw0KKyAgICBEV09SRCAgICAgICAgICAgVmVuZG9ySWQ7DQorICAgIERXT1JEICAgICAgICAgICBEZXZpY2VJZDsNCisgICAgRFdPUkQgICAgICAgICAgIFN1YlN5c0lkOw0KKyAgICBEV09SRCAgICAgICAgICAgUmV2aXNpb247DQorDQorICAgIEdVSUQgICAgICAgICAgICBEZXZpY2VJZGVudGlmaWVyOw0KKw0KKyAgICBEV09SRCAgICAgICAgICAgV0hRTExldmVsOw0KKw0KK30gRDNEQURBUFRFUl9JREVOVElGSUVSODsNCisNCisNCisvKiBSYXN0ZXIgU3RhdHVzIHN0cnVjdHVyZSByZXR1cm5lZCBieSBHZXRSYXN0ZXJTdGF0dXMgKi8NCit0eXBlZGVmIHN0cnVjdCBfRDNEUkFTVEVSX1NUQVRVUw0KK3sNCisgICAgQk9PTCAgICAgICAgICAgIEluVkJsYW5rOw0KKyAgICBVSU5UICAgICAgICAgICAgU2NhbkxpbmU7DQorfSBEM0RSQVNURVJfU1RBVFVTOw0KKw0KKw0KKw0KKy8qIERlYnVnIG1vbml0b3IgdG9rZW5zIChERUJVRyBvbmx5KQ0KKw0KKyAgIE5vdGUgdGhhdCBpZiBEM0RSU19ERUJVR01PTklUT1JUT0tFTiBpcyBzZXQsIHRoZSBjYWxsIGlzIHRyZWF0ZWQgYXMNCisgICBwYXNzaW5nIGEgdG9rZW4gdG8gdGhlIGRlYnVnIG1vbml0b3IuICBGb3IgZXhhbXBsZSwgaWYsIGFmdGVyIHBhc3NpbmcNCisgICBEM0RETVRfRU5BQkxFL0RJU0FCTEUgdG8gRDNEUlNfREVCVUdNT05JVE9SVE9LRU4gb3RoZXIgdG9rZW4gdmFsdWVzDQorICAgYXJlIHBhc3NlZCBpbiwgdGhlIGVuYWJsZWQvZGlzYWJsZWQgc3RhdGUgb2YgdGhlIGRlYnVnDQorICAgbW9uaXRvciB3aWxsIHN0aWxsIHBlcnNpc3QuDQorDQorICAgVGhlIGRlYnVnIG1vbml0b3IgZGVmYXVsdHMgdG8gZW5hYmxlZC4NCisNCisgICBDYWxsaW5nIEdldFJlbmRlclN0YXRlIG9uIEQzRFJTX0RFQlVHTU9OSVRPUlRPS0VOIGlzIG5vdCBvZiBhbnkgdXNlLg0KKyovDQordHlwZWRlZiBlbnVtIF9EM0RERUJVR01PTklUT1JUT0tFTlMgew0KKyAgICBEM0RETVRfRU5BQkxFICAgICAgICAgICAgPSAwLCAgICAvLyBlbmFibGUgZGVidWcgbW9uaXRvcg0KKyAgICBEM0RETVRfRElTQUJMRSAgICAgICAgICAgPSAxLCAgICAvLyBkaXNhYmxlIGRlYnVnIG1vbml0b3INCisgICAgRDNERE1UX0ZPUkNFX0RXT1JEICAgICA9IDB4N2ZmZmZmZmYsDQorfSBEM0RERUJVR01PTklUT1JUT0tFTlM7DQorDQorLy8gR2V0SW5mbyBJRHMNCisNCisjZGVmaW5lIEQzRERFVklORk9JRF9SRVNPVVJDRU1BTkFHRVIgICAgNSAgICAgICAgICAgLyogVXNlZCB3aXRoIEQzRERFVklORk9fUkVTT1VSQ0VNQU5BR0VSICovDQorI2RlZmluZSBEM0RERVZJTkZPSURfVkVSVEVYU1RBVFMgICAgICAgIDYgICAgICAgICAgIC8qIFVzZWQgd2l0aCBEM0RERVZJTkZPX0QzRFZFUlRFWFNUQVRTICovDQorDQordHlwZWRlZiBzdHJ1Y3QgX0QzRFJFU09VUkNFU1RBVFMNCit7DQorLy8gRGF0YSBjb2xsZWN0ZWQgc2luY2UgbGFzdCBQcmVzZW50KCkNCisgICAgQk9PTCAgICBiVGhyYXNoaW5nOyAgICAgICAgICAgICAvKiBpbmRpY2F0ZXMgaWYgdGhyYXNoaW5nICovDQorICAgIERXT1JEICAgQXBwcm94Qnl0ZXNEb3dubG9hZGVkOyAgLyogQXBwcm94aW1hdGUgbnVtYmVyIG9mIGJ5dGVzIGRvd25sb2FkZWQgYnkgcmVzb3VyY2UgbWFuYWdlciAqLw0KKyAgICBEV09SRCAgIE51bUV2aWN0czsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBvYmplY3RzIGV2aWN0ZWQgKi8NCisgICAgRFdPUkQgICBOdW1WaWRDcmVhdGVzOyAgICAgICAgICAvKiBudW1iZXIgb2Ygb2JqZWN0cyBjcmVhdGVkIGluIHZpZGVvIG1lbW9yeSAqLw0KKyAgICBEV09SRCAgIExhc3RQcmk7ICAgICAgICAgICAgICAgIC8qIHByaW9yaXR5IG9mIGxhc3Qgb2JqZWN0IGV2aWN0ZWQgKi8NCisgICAgRFdPUkQgICBOdW1Vc2VkOyAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygb2JqZWN0cyBzZXQgdG8gdGhlIGRldmljZSAqLw0KKyAgICBEV09SRCAgIE51bVVzZWRJblZpZE1lbTsgICAgICAgIC8qIG51bWJlciBvZiBvYmplY3RzIHNldCB0byB0aGUgZGV2aWNlLCB3aGljaCBhcmUgYWxyZWFkeSBpbiB2aWRlbyBtZW1vcnkgKi8NCisvLyBQZXJzaXN0ZW50IGRhdGENCisgICAgRFdPUkQgICBXb3JraW5nU2V0OyAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygb2JqZWN0cyBpbiB2aWRlbyBtZW1vcnkgKi8NCisgICAgRFdPUkQgICBXb3JraW5nU2V0Qnl0ZXM7ICAgICAgICAvKiBudW1iZXIgb2YgYnl0ZXMgaW4gdmlkZW8gbWVtb3J5ICovDQorICAgIERXT1JEICAgVG90YWxNYW5hZ2VkOyAgICAgICAgICAgLyogdG90YWwgbnVtYmVyIG9mIG1hbmFnZWQgb2JqZWN0cyAqLw0KKyAgICBEV09SRCAgIFRvdGFsQnl0ZXM7ICAgICAgICAgICAgIC8qIHRvdGFsIG51bWJlciBvZiBieXRlcyBvZiBtYW5hZ2VkIG9iamVjdHMgKi8NCit9IEQzRFJFU09VUkNFU1RBVFM7DQorDQorI2RlZmluZSBEM0RSVFlQRUNPVU5UIChEM0RSVFlQRV9JTkRFWEJVRkZFUisxKQ0KKw0KK3R5cGVkZWYgc3RydWN0IF9EM0RERVZJTkZPX1JFU09VUkNFTUFOQUdFUg0KK3sNCisgICAgRDNEUkVTT1VSQ0VTVEFUUyAgICBzdGF0c1tEM0RSVFlQRUNPVU5UXTsNCit9IEQzRERFVklORk9fUkVTT1VSQ0VNQU5BR0VSLCAqTFBEM0RERVZJTkZPX1JFU09VUkNFTUFOQUdFUjsNCisNCit0eXBlZGVmIHN0cnVjdCBfRDNEREVWSU5GT19EM0RWRVJURVhTVEFUUw0KK3sNCisgICAgRFdPUkQgICBOdW1SZW5kZXJlZFRyaWFuZ2xlczsgICAgICAgLyogdG90YWwgbnVtYmVyIG9mIHRyaWFuZ2xlcyB0aGF0IGFyZSBub3QgY2xpcHBlZCBpbiB0aGlzIGZyYW1lICovDQorICAgIERXT1JEICAgTnVtRXh0cmFDbGlwcGluZ1RyaWFuZ2xlczsgIC8qIE51bWJlciBvZiBuZXcgdHJpYW5nbGVzIGdlbmVyYXRlZCBieSBjbGlwcGluZyAqLw0KK30gRDNEREVWSU5GT19EM0RWRVJURVhTVEFUUywgKkxQRDNEREVWSU5GT19EM0RWRVJURVhTVEFUUzsNCisNCisNCisjcHJhZ21hIHBhY2soKQ0KKyNpZiBfTVNDX1ZFUiA+PSAxMjAwDQorI3ByYWdtYSB3YXJuaW5nKHBvcCkNCisjZWxzZQ0KKyNwcmFnbWEgd2FybmluZyhkZWZhdWx0OjQyMDEpDQorI2VuZGlmDQorDQorI2VuZGlmIC8qIChESVJFQ1QzRF9WRVJTSU9OID49IDB4MDgwMCkgKi8NCisjZW5kaWYgLyogX0QzRDhUWVBFUyhQKV9IXyAqLw0KKw0KZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0NhcGFiaWxpdGllcy5jcHAgYi9zcmMvRDNEOC9DYXBhYmlsaXRpZXMuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMGJhMjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOC9DYXBhYmlsaXRpZXMuY3BwCkBAIC0wLDAgKzEsMjQ2IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiQ2FwYWJpbGl0aWVzLmhwcCIKKworI2luY2x1ZGUgIk1haW4vQ29uZmlnLmhwcCIKKworbmFtZXNwYWNlIEQzRDgKK3sKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpSOEc4QjggPSBmYWxzZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpSNUc2QjUgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OlgxUjVHNUI1ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpBMVI1RzVCNSA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QTRSNEc0QjQgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OlIzRzNCMiA9IGZhbHNlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkE4UjNHM0IyID0gZmFsc2U7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6WDRSNEc0QjQgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkE4UjhHOEI4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpYOFI4RzhCOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QThCOEc4UjggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6Olg4QjhHOFI4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpHMTZSMTYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpSZW5kZXJUYXJnZXQ6OkEyQjEwRzEwUjEwID0gdHJ1ZTsKKworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEZXB0aFN0ZW5jaWw6OkQzMiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRlcHRoU3RlbmNpbDo6RDI0UzggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEZXB0aFN0ZW5jaWw6OkQyNFg4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6RGVwdGhTdGVuY2lsOjpEMTYgPSB0cnVlOworCisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6UjVHNkI1ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6WDFSNUc1QjUgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBMVI1RzVCNSA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE0UjRHNEI0ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6UjNHM0IyID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6QThSM0czQjIgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpYNFI0RzRCNCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlI4RzhCOCA9IGZhbHNlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpYOFI4RzhCOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE4UjhHOEI4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6WDhCOEc4UjggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBOEI4RzhSOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlA4ID0gZmFsc2U7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE4UDggPSBmYWxzZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6RzE2UjE2ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6QTJCMTBHMTBSMTAgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEWFQxID0gUzNUQ19TVVBQT1JUOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEWFQyID0gUzNUQ19TVVBQT1JUOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEWFQzID0gUzNUQ19TVVBQT1JUOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEWFQ0ID0gUzNUQ19TVVBQT1JUOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEWFQ1ID0gUzNUQ19TVVBQT1JUOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpWOFU4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6TDZWNVU1ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6WDhMOFY4VTggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpROFc4VjhVOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlYxNlUxNiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkEyVzEwVjEwVTEwID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6TDggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBNEw0ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6U3VyZmFjZTo6QThMOCA9IHRydWU7CisKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpBOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6UjVHNkI1ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpYMVI1RzVCNSA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTFSNUc1QjUgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkE0UjRHNEI0ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpSM0czQjIgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkE4UjNHM0IyID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpYNFI0RzRCNCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6UjhHOEI4ID0gZmFsc2U7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6WDhSOEc4QjggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkE4UjhHOEI4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpYOEI4RzhSOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QThCOEc4UjggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlA4ID0gZmFsc2U7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QThQOCA9IGZhbHNlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkcxNlIxNiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTJCMTBHMTBSMTAgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkRYVDEgPSBTM1RDX1NVUFBPUlQ7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RFhUMiA9IFMzVENfU1VQUE9SVDsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpEWFQzID0gUzNUQ19TVVBQT1JUOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkRYVDQgPSBTM1RDX1NVUFBPUlQ7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RFhUNSA9IFMzVENfU1VQUE9SVDsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpWOFU4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpMNlY1VTUgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6Olg4TDhWOFU4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpROFc4VjhVOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6VjE2VTE2ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lOjpBMlcxMFYxMFUxMCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZTo6TDggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkE0TDQgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkE4TDggPSB0cnVlOworCisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6UjhHOEI4ID0gZmFsc2U7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6UjVHNkI1ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpYMVI1RzVCNSA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6QTFSNUc1QjUgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkE0UjRHNEI0ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpSM0czQjIgPSBmYWxzZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBOFIzRzNCMiA9IGZhbHNlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6Olg0UjRHNEI0ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBOFI4RzhCOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6WDhSOEc4QjggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OkE4QjhHOFI4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpYOEI4RzhSOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlJlbmRlclRhcmdldDo6RzE2UjE2ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBMkIxMEcxMFIxMCA9IHRydWU7CisKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6RGVwdGhTdGVuY2lsOjpEMzIgPSBmYWxzZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6RGVwdGhTdGVuY2lsOjpEMjRTOCA9IGZhbHNlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEZXB0aFN0ZW5jaWw6OkQyNFg4ID0gZmFsc2U7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRlcHRoU3RlbmNpbDo6RDE2ID0gZmFsc2U7CisKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6QTggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSNUc2QjUgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpYMVI1RzVCNSA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkExUjVHNUI1ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6QTRSNEc0QjQgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSM0czQjIgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBOFIzRzNCMiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6Olg0UjRHNEI0ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UjhHOEI4ID0gZmFsc2U7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6Olg4UjhHOEI4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6QThSOEc4QjggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpYOEI4RzhSOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkE4QjhHOFI4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6UDggPSBmYWxzZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6QThQOCA9IGZhbHNlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpHMTZSMTYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBMkIxMEcxMFIxMCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRYVDEgPSBTM1RDX1NVUFBPUlQ7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRYVDIgPSBTM1RDX1NVUFBPUlQ7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRYVDMgPSBTM1RDX1NVUFBPUlQ7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRYVDQgPSBTM1RDX1NVUFBPUlQ7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRYVDUgPSBTM1RDX1NVUFBPUlQ7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlY4VTggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpMNlY1VTUgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpYOEw4VjhVOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlE4VzhWOFU4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6VjE2VTE2ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Q3ViZU1hcDo6QTJXMTBWMTBVMTAgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpMOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkE0TDQgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBOEw4ID0gdHJ1ZTsKKworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlI1RzZCNSA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlgxUjVHNUI1ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QTFSNUc1QjUgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBNFI0RzRCNCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlIzRzNCMiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkE4UjNHM0IyID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6WDRSNEc0QjQgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpSOEc4QjggPSBmYWxzZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6WDhSOEc4QjggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBOFI4RzhCOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6Olg4QjhHOFI4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QThCOEc4UjggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpQOCA9IGZhbHNlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBOFA4ID0gZmFsc2U7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkcxNlIxNiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkEyQjEwRzEwUjEwID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6RFhUMSA9IFMzVENfU1VQUE9SVDsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6RFhUMiA9IFMzVENfU1VQUE9SVDsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6RFhUMyA9IFMzVENfU1VQUE9SVDsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6RFhUNCA9IFMzVENfU1VQUE9SVDsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6RFhUNSA9IFMzVENfU1VQUE9SVDsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6VjhVOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6Okw2VjVVNSA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6Olg4TDhWOFU4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6UThXOFY4VTggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpWMTZVMTYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBMlcxMFYxMFUxMCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6Okw4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6QTRMNCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkE4TDggPSB0cnVlOworCisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6UjhHOEI4ID0gZmFsc2U7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6UjVHNkI1ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpYMVI1RzVCNSA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6QTFSNUc1QjUgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OkE0UjRHNEI0ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpSM0czQjIgPSBmYWxzZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBOFIzRzNCMiA9IGZhbHNlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6Olg0UjRHNEI0ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBOFI4RzhCOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6WDhSOEc4QjggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OkE4QjhHOFI4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpYOEI4RzhSOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlJlbmRlclRhcmdldDo6RzE2UjE2ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBMkIxMEcxMFIxMCA9IHRydWU7CisKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpEMzIgPSBmYWxzZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpEMjRTOCA9IGZhbHNlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQyNFg4ID0gZmFsc2U7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRlcHRoU3RlbmNpbDo6RDE2ID0gZmFsc2U7CisKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6QTggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSNUc2QjUgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpYMVI1RzVCNSA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkExUjVHNUI1ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6QTRSNEc0QjQgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSM0czQjIgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBOFIzRzNCMiA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6Olg0UjRHNEI0ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UjhHOEI4ID0gZmFsc2U7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6Olg4UjhHOEI4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6QThSOEc4QjggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpYOEI4RzhSOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkE4QjhHOFI4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6UDggPSBmYWxzZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6QThQOCA9IGZhbHNlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpHMTZSMTYgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBMkIxMEcxMFIxMCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRYVDEgPSBTM1RDX1NVUFBPUlQ7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRYVDIgPSBTM1RDX1NVUFBPUlQ7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRYVDMgPSBTM1RDX1NVUFBPUlQ7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRYVDQgPSBTM1RDX1NVUFBPUlQ7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRYVDUgPSBTM1RDX1NVUFBPUlQ7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlY4VTggPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpMNlY1VTUgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpYOEw4VjhVOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlE4VzhWOFU4ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6VjE2VTE2ID0gdHJ1ZTsKKwlib29sIENhcGFiaWxpdGllczo6VGV4dHVyZTo6QTJXMTBWMTBVMTAgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpMOCA9IHRydWU7CisJYm9vbCBDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkE0TDQgPSB0cnVlOworCWJvb2wgQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBOEw4ID0gdHJ1ZTsKKworCXVuc2lnbmVkIGludCBwaXhlbFNoYWRlclZlcnNpb24gPSBEM0RQU19WRVJTSU9OKDEsIDQpOworCXVuc2lnbmVkIGludCB2ZXJ0ZXhTaGFkZXJWZXJzaW9uID0gRDNEVlNfVkVSU0lPTigxLCAxKTsKKworCXVuc2lnbmVkIGludCB0ZXh0dXJlTWVtb3J5ID0gMjU2ICogMTAyNCAqIDEwMjQ7CisJdW5zaWduZWQgaW50IG1heEFuaXNvdHJvcHkgPSAxNjsKK30KZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0NhcGFiaWxpdGllcy5ocHAgYi9zcmMvRDNEOC9DYXBhYmlsaXRpZXMuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ODBlMzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOC9DYXBhYmlsaXRpZXMuaHBwCkBAIC0wLDAgKzEsMzEzIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIEQzRDhfQ2FwYWJpbGl0aWVzX2hwcAorI2RlZmluZSBEM0Q4X0NhcGFiaWxpdGllc19ocHAKKworI2luY2x1ZGUgPGQzZDguaD4KKworbmFtZXNwYWNlIEQzRDgKK3sKKwlzdHJ1Y3QgQ2FwYWJpbGl0aWVzCisJeworCQlzdHJ1Y3QgU3VyZmFjZQorCQl7CisJCQlzdHJ1Y3QgUmVuZGVyVGFyZ2V0CisJCQl7CisJCQkJc3RhdGljIGJvb2wgUjhHOEI4OworCQkJCXN0YXRpYyBib29sIFI1RzZCNTsKKwkJCQlzdGF0aWMgYm9vbCBYMVI1RzVCNTsKKwkJCQlzdGF0aWMgYm9vbCBBMVI1RzVCNTsKKwkJCQlzdGF0aWMgYm9vbCBBNFI0RzRCNDsKKwkJCQlzdGF0aWMgYm9vbCBSM0czQjI7CisJCQkJc3RhdGljIGJvb2wgQThSM0czQjI7CisJCQkJc3RhdGljIGJvb2wgWDRSNEc0QjQ7CisJCQkJc3RhdGljIGJvb2wgQThSOEc4Qjg7CisJCQkJc3RhdGljIGJvb2wgWDhSOEc4Qjg7CisJCQkJc3RhdGljIGJvb2wgQThCOEc4Ujg7CisJCQkJc3RhdGljIGJvb2wgWDhCOEc4Ujg7CisJCQkJLy8gSW50ZWdlciBIRFIgZm9ybWF0cworCQkJCXN0YXRpYyBib29sIEcxNlIxNjsKKwkJCQlzdGF0aWMgYm9vbCBBMkIxMEcxMFIxMDsKKwkJCX07CisKKwkJCXN0cnVjdCBEZXB0aFN0ZW5jaWwKKwkJCXsKKwkJCQlzdGF0aWMgYm9vbCBEMzI7CisJCQkJc3RhdGljIGJvb2wgRDI0Uzg7CisJCQkJc3RhdGljIGJvb2wgRDI0WDg7CisJCQkJc3RhdGljIGJvb2wgRDE2OworCQkJfTsKKworCQkJc3RhdGljIGJvb2wgQTg7CisJCQlzdGF0aWMgYm9vbCBSNUc2QjU7CisJCQlzdGF0aWMgYm9vbCBYMVI1RzVCNTsKKwkJCXN0YXRpYyBib29sIEExUjVHNUI1OworCQkJc3RhdGljIGJvb2wgQTRSNEc0QjQ7CisJCQlzdGF0aWMgYm9vbCBSM0czQjI7CisJCQlzdGF0aWMgYm9vbCBBOFIzRzNCMjsKKwkJCXN0YXRpYyBib29sIFg0UjRHNEI0OworCQkJc3RhdGljIGJvb2wgUjhHOEI4OworCQkJc3RhdGljIGJvb2wgWDhSOEc4Qjg7CisJCQlzdGF0aWMgYm9vbCBBOFI4RzhCODsKKwkJCXN0YXRpYyBib29sIEE4QjhHOFI4OworCQkJc3RhdGljIGJvb2wgWDhCOEc4Ujg7CisJCQkvLyBQYWxldHRlZCBmb3JtYXRzCisJCQlzdGF0aWMgYm9vbCBQODsKKwkJCXN0YXRpYyBib29sIEE4UDg7CisJCQkvLyBJbnRlZ2VyIEhEUiBmb3JtYXRzCisJCQlzdGF0aWMgYm9vbCBHMTZSMTY7CisJCQlzdGF0aWMgYm9vbCBBMkIxMEcxMFIxMDsKKwkJCS8vIENvbXByZXNzZWQgZm9ybWF0cworCQkJc3RhdGljIGJvb2wgRFhUMTsKKwkJCXN0YXRpYyBib29sIERYVDI7CisJCQlzdGF0aWMgYm9vbCBEWFQzOworCQkJc3RhdGljIGJvb2wgRFhUNDsKKwkJCXN0YXRpYyBib29sIERYVDU7CisJCQkvLyBCdW1wIG1hcCBmb3JtYXRzCisJCQlzdGF0aWMgYm9vbCBWOFU4OworCQkJc3RhdGljIGJvb2wgTDZWNVU1OworCQkJc3RhdGljIGJvb2wgWDhMOFY4VTg7CisJCQlzdGF0aWMgYm9vbCBROFc4VjhVODsKKwkJCXN0YXRpYyBib29sIFYxNlUxNjsKKwkJCXN0YXRpYyBib29sIEEyVzEwVjEwVTEwOworCQkJLy8gTHVtaW5hbmNlIGZvcm1hdHMKKwkJCXN0YXRpYyBib29sIEw4OworCQkJc3RhdGljIGJvb2wgQTRMNDsKKwkJCXN0YXRpYyBib29sIEE4TDg7CisJCX07CisKKwkJc3RydWN0IFZvbHVtZQorCQl7CisJCQlzdGF0aWMgYm9vbCBBODsKKwkJCXN0YXRpYyBib29sIFI1RzZCNTsKKwkJCXN0YXRpYyBib29sIFgxUjVHNUI1OworCQkJc3RhdGljIGJvb2wgQTFSNUc1QjU7CisJCQlzdGF0aWMgYm9vbCBBNFI0RzRCNDsKKwkJCXN0YXRpYyBib29sIFIzRzNCMjsKKwkJCXN0YXRpYyBib29sIEE4UjNHM0IyOworCQkJc3RhdGljIGJvb2wgWDRSNEc0QjQ7CisJCQlzdGF0aWMgYm9vbCBSOEc4Qjg7CisJCQlzdGF0aWMgYm9vbCBYOFI4RzhCODsKKwkJCXN0YXRpYyBib29sIEE4UjhHOEI4OworCQkJc3RhdGljIGJvb2wgQThCOEc4Ujg7CisJCQlzdGF0aWMgYm9vbCBYOEI4RzhSODsKKwkJCS8vIFBhbGV0dGVkIGZvcm1hdHMKKwkJCXN0YXRpYyBib29sIFA4OworCQkJc3RhdGljIGJvb2wgQThQODsKKwkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKKwkJCXN0YXRpYyBib29sIEcxNlIxNjsKKwkJCXN0YXRpYyBib29sIEEyQjEwRzEwUjEwOworCQkJLy8gQ29tcHJlc3NlZCBmb3JtYXRzCisJCQlzdGF0aWMgYm9vbCBEWFQxOworCQkJc3RhdGljIGJvb2wgRFhUMjsKKwkJCXN0YXRpYyBib29sIERYVDM7CisJCQlzdGF0aWMgYm9vbCBEWFQ0OworCQkJc3RhdGljIGJvb2wgRFhUNTsKKwkJCS8vIEJ1bXAgbWFwIGZvcm1hdHMKKwkJCXN0YXRpYyBib29sIFY4VTg7CisJCQlzdGF0aWMgYm9vbCBMNlY1VTU7CisJCQlzdGF0aWMgYm9vbCBYOEw4VjhVODsKKwkJCXN0YXRpYyBib29sIFE4VzhWOFU4OworCQkJc3RhdGljIGJvb2wgVjE2VTE2OworCQkJc3RhdGljIGJvb2wgQTJXMTBWMTBVMTA7CisJCQkvLyBMdW1pbmFuY2UgZm9ybWF0cworCQkJc3RhdGljIGJvb2wgTDg7CisJCQlzdGF0aWMgYm9vbCBBNEw0OworCQkJc3RhdGljIGJvb2wgQThMODsKKwkJfTsKKworCQlzdHJ1Y3QgQ3ViZU1hcAorCQl7CisJCQlzdHJ1Y3QgUmVuZGVyVGFyZ2V0CisJCQl7CisJCQkJc3RhdGljIGJvb2wgUjhHOEI4OworCQkJCXN0YXRpYyBib29sIFI1RzZCNTsKKwkJCQlzdGF0aWMgYm9vbCBYMVI1RzVCNTsKKwkJCQlzdGF0aWMgYm9vbCBBMVI1RzVCNTsKKwkJCQlzdGF0aWMgYm9vbCBBNFI0RzRCNDsKKwkJCQlzdGF0aWMgYm9vbCBSM0czQjI7CisJCQkJc3RhdGljIGJvb2wgQThSM0czQjI7CisJCQkJc3RhdGljIGJvb2wgWDRSNEc0QjQ7CisJCQkJc3RhdGljIGJvb2wgQThSOEc4Qjg7CisJCQkJc3RhdGljIGJvb2wgWDhSOEc4Qjg7CisJCQkJc3RhdGljIGJvb2wgQThCOEc4Ujg7CisJCQkJc3RhdGljIGJvb2wgWDhCOEc4Ujg7CisJCQkJLy8gSW50ZWdlciBIRFIgZm9ybWF0cworCQkJCXN0YXRpYyBib29sIEcxNlIxNjsKKwkJCQlzdGF0aWMgYm9vbCBBMkIxMEcxMFIxMDsKKwkJCX07CisKKwkJCXN0cnVjdCBEZXB0aFN0ZW5jaWwKKwkJCXsKKwkJCQlzdGF0aWMgYm9vbCBEMzI7CisJCQkJc3RhdGljIGJvb2wgRDI0Uzg7CisJCQkJc3RhdGljIGJvb2wgRDI0WDg7CisJCQkJc3RhdGljIGJvb2wgRDE2OworCQkJfTsKKworCQkJc3RhdGljIGJvb2wgQTg7CisJCQlzdGF0aWMgYm9vbCBSNUc2QjU7CisJCQlzdGF0aWMgYm9vbCBYMVI1RzVCNTsKKwkJCXN0YXRpYyBib29sIEExUjVHNUI1OworCQkJc3RhdGljIGJvb2wgQTRSNEc0QjQ7CisJCQlzdGF0aWMgYm9vbCBSM0czQjI7CisJCQlzdGF0aWMgYm9vbCBBOFIzRzNCMjsKKwkJCXN0YXRpYyBib29sIFg0UjRHNEI0OworCQkJc3RhdGljIGJvb2wgUjhHOEI4OworCQkJc3RhdGljIGJvb2wgWDhSOEc4Qjg7CisJCQlzdGF0aWMgYm9vbCBBOFI4RzhCODsKKwkJCXN0YXRpYyBib29sIEE4QjhHOFI4OworCQkJc3RhdGljIGJvb2wgWDhCOEc4Ujg7CisJCQkvLyBQYWxldHRlZCBmb3JtYXRzCisJCQlzdGF0aWMgYm9vbCBQODsKKwkJCXN0YXRpYyBib29sIEE4UDg7CisJCQkvLyBJbnRlZ2VyIEhEUiBmb3JtYXRzCisJCQlzdGF0aWMgYm9vbCBHMTZSMTY7CisJCQlzdGF0aWMgYm9vbCBBMkIxMEcxMFIxMDsKKwkJCS8vIENvbXByZXNzZWQgZm9ybWF0cworCQkJc3RhdGljIGJvb2wgRFhUMTsKKwkJCXN0YXRpYyBib29sIERYVDI7CisJCQlzdGF0aWMgYm9vbCBEWFQzOworCQkJc3RhdGljIGJvb2wgRFhUNDsKKwkJCXN0YXRpYyBib29sIERYVDU7CisJCQkvLyBCdW1wIG1hcCBmb3JtYXRzCisJCQlzdGF0aWMgYm9vbCBWOFU4OworCQkJc3RhdGljIGJvb2wgTDZWNVU1OworCQkJc3RhdGljIGJvb2wgWDhMOFY4VTg7CisJCQlzdGF0aWMgYm9vbCBROFc4VjhVODsKKwkJCXN0YXRpYyBib29sIFYxNlUxNjsKKwkJCXN0YXRpYyBib29sIEEyVzEwVjEwVTEwOworCQkJLy8gTHVtaW5hbmNlIGZvcm1hdHMKKwkJCXN0YXRpYyBib29sIEw4OworCQkJc3RhdGljIGJvb2wgQTRMNDsKKwkJCXN0YXRpYyBib29sIEE4TDg7CisJCX07CisKKwkJc3RydWN0IFZvbHVtZVRleHR1cmUKKwkJeworCQkJc3RhdGljIGJvb2wgQTg7CisJCQlzdGF0aWMgYm9vbCBSNUc2QjU7CisJCQlzdGF0aWMgYm9vbCBYMVI1RzVCNTsKKwkJCXN0YXRpYyBib29sIEExUjVHNUI1OworCQkJc3RhdGljIGJvb2wgQTRSNEc0QjQ7CisJCQlzdGF0aWMgYm9vbCBSM0czQjI7CisJCQlzdGF0aWMgYm9vbCBBOFIzRzNCMjsKKwkJCXN0YXRpYyBib29sIFg0UjRHNEI0OworCQkJc3RhdGljIGJvb2wgUjhHOEI4OworCQkJc3RhdGljIGJvb2wgWDhSOEc4Qjg7CisJCQlzdGF0aWMgYm9vbCBBOFI4RzhCODsKKwkJCXN0YXRpYyBib29sIEE4QjhHOFI4OworCQkJc3RhdGljIGJvb2wgWDhCOEc4Ujg7CisJCQkvLyBQYWxldHRlZCBmb3JtYXRzCisJCQlzdGF0aWMgYm9vbCBQODsKKwkJCXN0YXRpYyBib29sIEE4UDg7CisJCQkvLyBJbnRlZ2VyIEhEUiBmb3JtYXRzCisJCQlzdGF0aWMgYm9vbCBHMTZSMTY7CisJCQlzdGF0aWMgYm9vbCBBMkIxMEcxMFIxMDsKKwkJCS8vIENvbXByZXNzZWQgZm9ybWF0cworCQkJc3RhdGljIGJvb2wgRFhUMTsKKwkJCXN0YXRpYyBib29sIERYVDI7CisJCQlzdGF0aWMgYm9vbCBEWFQzOworCQkJc3RhdGljIGJvb2wgRFhUNDsKKwkJCXN0YXRpYyBib29sIERYVDU7CisJCQkvLyBCdW1wIG1hcCBmb3JtYXRzCisJCQlzdGF0aWMgYm9vbCBWOFU4OworCQkJc3RhdGljIGJvb2wgTDZWNVU1OworCQkJc3RhdGljIGJvb2wgWDhMOFY4VTg7CisJCQlzdGF0aWMgYm9vbCBROFc4VjhVODsKKwkJCXN0YXRpYyBib29sIFYxNlUxNjsKKwkJCXN0YXRpYyBib29sIEEyVzEwVjEwVTEwOworCQkJLy8gTHVtaW5hbmNlIGZvcm1hdHMKKwkJCXN0YXRpYyBib29sIEw4OworCQkJc3RhdGljIGJvb2wgQTRMNDsKKwkJCXN0YXRpYyBib29sIEE4TDg7CisJCX07CisKKwkJc3RydWN0IFRleHR1cmUKKwkJeworCQkJc3RydWN0IFJlbmRlclRhcmdldAorCQkJeworCQkJCXN0YXRpYyBib29sIFI4RzhCODsKKwkJCQlzdGF0aWMgYm9vbCBSNUc2QjU7CisJCQkJc3RhdGljIGJvb2wgWDFSNUc1QjU7CisJCQkJc3RhdGljIGJvb2wgQTFSNUc1QjU7CisJCQkJc3RhdGljIGJvb2wgQTRSNEc0QjQ7CisJCQkJc3RhdGljIGJvb2wgUjNHM0IyOworCQkJCXN0YXRpYyBib29sIEE4UjNHM0IyOworCQkJCXN0YXRpYyBib29sIFg0UjRHNEI0OworCQkJCXN0YXRpYyBib29sIEE4UjhHOEI4OworCQkJCXN0YXRpYyBib29sIFg4UjhHOEI4OworCQkJCXN0YXRpYyBib29sIEE4QjhHOFI4OworCQkJCXN0YXRpYyBib29sIFg4QjhHOFI4OworCQkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKKwkJCQlzdGF0aWMgYm9vbCBHMTZSMTY7CisJCQkJc3RhdGljIGJvb2wgQTJCMTBHMTBSMTA7CisJCQl9OworCisJCQlzdHJ1Y3QgRGVwdGhTdGVuY2lsCisJCQl7CisJCQkJc3RhdGljIGJvb2wgRDMyOworCQkJCXN0YXRpYyBib29sIEQyNFM4OworCQkJCXN0YXRpYyBib29sIEQyNFg4OworCQkJCXN0YXRpYyBib29sIEQxNjsKKwkJCX07CisKKwkJCXN0YXRpYyBib29sIEE4OworCQkJc3RhdGljIGJvb2wgUjVHNkI1OworCQkJc3RhdGljIGJvb2wgWDFSNUc1QjU7CisJCQlzdGF0aWMgYm9vbCBBMVI1RzVCNTsKKwkJCXN0YXRpYyBib29sIEE0UjRHNEI0OworCQkJc3RhdGljIGJvb2wgUjNHM0IyOworCQkJc3RhdGljIGJvb2wgQThSM0czQjI7CisJCQlzdGF0aWMgYm9vbCBYNFI0RzRCNDsKKwkJCXN0YXRpYyBib29sIFI4RzhCODsKKwkJCXN0YXRpYyBib29sIFg4UjhHOEI4OworCQkJc3RhdGljIGJvb2wgQThSOEc4Qjg7CisJCQlzdGF0aWMgYm9vbCBBOEI4RzhSODsKKwkJCXN0YXRpYyBib29sIFg4QjhHOFI4OworCQkJLy8gUGFsZXR0ZWQgZm9ybWF0cworCQkJc3RhdGljIGJvb2wgUDg7CisJCQlzdGF0aWMgYm9vbCBBOFA4OworCQkJLy8gSW50ZWdlciBIRFIgZm9ybWF0cworCQkJc3RhdGljIGJvb2wgRzE2UjE2OworCQkJc3RhdGljIGJvb2wgQTJCMTBHMTBSMTA7CisJCQkvLyBDb21wcmVzc2VkIGZvcm1hdHMKKwkJCXN0YXRpYyBib29sIERYVDE7CisJCQlzdGF0aWMgYm9vbCBEWFQyOworCQkJc3RhdGljIGJvb2wgRFhUMzsKKwkJCXN0YXRpYyBib29sIERYVDQ7CisJCQlzdGF0aWMgYm9vbCBEWFQ1OworCQkJLy8gQnVtcCBtYXAgZm9ybWF0cworCQkJc3RhdGljIGJvb2wgVjhVODsKKwkJCXN0YXRpYyBib29sIEw2VjVVNTsKKwkJCXN0YXRpYyBib29sIFg4TDhWOFU4OworCQkJc3RhdGljIGJvb2wgUThXOFY4VTg7CisJCQlzdGF0aWMgYm9vbCBWMTZVMTY7CisJCQlzdGF0aWMgYm9vbCBBMlcxMFYxMFUxMDsKKwkJCS8vIEx1bWluYW5jZSBmb3JtYXRzCisJCQlzdGF0aWMgYm9vbCBMODsKKwkJCXN0YXRpYyBib29sIEE0TDQ7CisJCQlzdGF0aWMgYm9vbCBBOEw4OworCQl9OworCX07CisKKwlleHRlcm4gdW5zaWduZWQgaW50IHBpeGVsU2hhZGVyVmVyc2lvbjsKKwlleHRlcm4gdW5zaWduZWQgaW50IHZlcnRleFNoYWRlclZlcnNpb247CisKKwlleHRlcm4gdW5zaWduZWQgaW50IHRleHR1cmVNZW1vcnk7CisJZXh0ZXJuIHVuc2lnbmVkIGludCBtYXhBbmlzb3Ryb3B5OworfQorCisjZW5kaWYgICAvLyBEM0Q4X0NhcGFiaWxpdGllc19ocHAKZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0QzRDguY3BwIGIvc3JjL0QzRDgvRDNEOC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA3ZTQ4YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9EM0Q4L0QzRDguY3BwCkBAIC0wLDAgKzEsMTAwIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiRGlyZWN0M0Q4LmhwcCIKKworI2luY2x1ZGUgInJlc291cmNlLmgiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGFzc2VydC5oPgorCitleHRlcm4gIkMiCit7CisJSElOU1RBTkNFIGRsbEluc3RhbmNlOworCisJaW50CV9fc3RkY2FsbCBEbGxNYWluKEhJTlNUQU5DRQlpbnN0YW5jZSwgdW5zaWduZWQgbG9uZwlyZWFzb24sCXZvaWQgKnJlc2VydmVkKQorCXsKKwkJZGxsSW5zdGFuY2UJPSBpbnN0YW5jZTsKKworCQlzd2l0Y2gocmVhc29uKQorCQl7CisJCWNhc2UgRExMX1BST0NFU1NfREVUQUNIOgorCQkJYnJlYWs7CisJCWNhc2UgRExMX1BST0NFU1NfQVRUQUNIOgorCQkJRGlzYWJsZVRocmVhZExpYnJhcnlDYWxscyhpbnN0YW5jZSk7CisJCQlicmVhazsKKwkJY2FzZSBETExfVEhSRUFEX0FUVEFDSDoKKwkJCWJyZWFrOworCQljYXNlIERMTF9USFJFQURfREVUQUNIOgorCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQlTZXRMYXN0RXJyb3IoRVJST1JfSU5WQUxJRF9QQVJBTUVURVIpOworCQkJcmV0dXJuIEZBTFNFOworCQl9CisKKwkJcmV0dXJuIFRSVUU7CisJfQorCisJSURpcmVjdDNEOCAqX19zdGRjYWxsIERpcmVjdDNEQ3JlYXRlOCh1bnNpZ25lZCBpbnQgdmVyc2lvbikKKwl7CisJCS8vIEQzRF9TREtfVkVSU0lPTiBjaGVjaworCQlpZih2ZXJzaW9uICE9IDEyMCAmJiAgIC8vIDguMAorCQkgICB2ZXJzaW9uICE9IDIyMCkgICAgIC8vIDguMQorCQl7CisJCQlyZXR1cm4gMDsKKwkJfQorCQkKKwkJI2lmbmRlZiBOREVCVUcKKwkJCUZJTEUgKmZpbGUgPSBmb3BlbigiZGVidWcudHh0IiwgInciKTsgICAvLyBDbGVhciBkZWJ1ZyBsb2cKKwkJCWZjbG9zZShmaWxlKTsKKwkJI2VuZGlmCisKKwkJSURpcmVjdDNEOCAqZGV2aWNlID0gbmV3IEQzRDg6OkRpcmVjdDNEOCh2ZXJzaW9uLCBkbGxJbnN0YW5jZSk7CisKKwkJaWYoZGV2aWNlKQorCQl7CisJCQlkZXZpY2UtPkFkZFJlZigpOworCQl9CisKKwkJcmV0dXJuIGRldmljZTsKKwl9CisKKwlpbnQgX19zdGRjYWxsIENoZWNrRnVsbHNjcmVlbigpICAgLy8gRklYTUU6IF9fY2RlY2wgb3IgX19zdGRjYWxsPworCXsKKwkJI2lmbmRlZiBOREVCVUcKKwkJLy8JQVNTRVJUKGZhbHNlKTsgICAvLyBGSVhNRQorCQkjZW5kaWYKKworCQlyZXR1cm4gRkFMU0U7CisJfQorCisgICAgdm9pZCBfX2NkZWNsIERlYnVnU2V0TXV0ZShsb25nIG11dGUpICAgLy8gRklYTUU6IFJldHVybiB0eXBlCisJeworCS8vCUFTU0VSVChmYWxzZSk7ICAgLy8gRklYTUUKKwl9CisKKyAgICBpbnQgX19zdGRjYWxsIFZhbGlkYXRlUGl4ZWxTaGFkZXIobG9uZyAqc2hhZGVyLCBpbnQgeCwgaW50IHksIGludCB6KSAgIC8vIEZJWE1FOiBfX2NkZWNsIG9yIF9fc3RkY2FsbD8gICAvLyBGSVhNRTogQXJndW1lbnQgbWVhbmluZ3MKKwl7CisJLy8JQVNTRVJUKGZhbHNlKTsgICAvLyBGSVhNRQorCisJCXJldHVybiBUUlVFOworCX0KKworICAgIGludCBfX3N0ZGNhbGwgVmFsaWRhdGVWZXJ0ZXhTaGFkZXIobG9uZyAqc2hhZGVyLCBpbnQgeCwgaW50IHksIGludCB6KSAgIC8vIEZJWE1FOiBfX2NkZWNsIG9yIF9fc3RkY2FsbD8gICAvLyBGSVhNRTogQXJndW1lbnQgbWVhbmluZ3MKKwl7CisJLy8JQVNTRVJUKGZhbHNlKTsgICAvLyBGSVhNRQorCisJCXJldHVybiBUUlVFOworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0QzRDgucmMgYi9zcmMvRDNEOC9EM0Q4LnJjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMGEzZjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOC9EM0Q4LnJjCkBAIC0wLDAgKzEsODkgQEAKKy8vIE1pY3Jvc29mdCBWaXN1YWwgQysrIGdlbmVyYXRlZCByZXNvdXJjZSBzY3JpcHQuCisvLworI2luY2x1ZGUgInJlc291cmNlMS5oIgorCisjZGVmaW5lIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLworLy8gR2VuZXJhdGVkIGZyb20gdGhlIFRFWFRJTkNMVURFIDIgcmVzb3VyY2UuCisvLworI2luY2x1ZGUgIldpbmRvd3MuaCIKKyNpbmNsdWRlICIuLi9Db21tb24vVmVyc2lvbi5oIgorLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKyN1bmRlZiBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTCisKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyBFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSByZXNvdXJjZXMKKworI2lmICFkZWZpbmVkKEFGWF9SRVNPVVJDRV9ETEwpIHx8IGRlZmluZWQoQUZYX1RBUkdfRU5VKQorTEFOR1VBR0UgTEFOR19FTkdMSVNILCBTVUJMQU5HX0VOR0xJU0hfVVMKKyNwcmFnbWEgY29kZV9wYWdlKDEyNTIpCisKKyNpZmRlZiBBUFNUVURJT19JTlZPS0VECisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vIFRFWFRJTkNMVURFCisvLworCisxIFRFWFRJTkNMVURFIAorQkVHSU4KKyAgICAicmVzb3VyY2UxLmhcMCIKK0VORAorCisyIFRFWFRJTkNMVURFIAorQkVHSU4KKyAgICAiI2luY2x1ZGUgIiJhZnhyZXMuaCIiXHJcbiIKKyAgICAiI2luY2x1ZGUgIiIuLi9Db21tb24vVmVyc2lvbi5oIiJcMCIKK0VORAorCiszIFRFWFRJTkNMVURFIAorQkVHSU4KKyAgICAiXDAiCitFTkQKKworI2VuZGlmICAgIC8vIEFQU1RVRElPX0lOVk9LRUQKKworCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworLy8KKy8vIFZlcnNpb24KKy8vCisKK1ZTX1ZFUlNJT05fSU5GTyBWRVJTSU9OSU5GTworIEZJTEVWRVJTSU9OIE1BSk9SX1ZFUlNJT04sTUlOT1JfVkVSU0lPTixCVUlMRF9WRVJTSU9OLEJVSUxEX1JFVklTSU9OCisgUFJPRFVDVFZFUlNJT04gTUFKT1JfVkVSU0lPTixNSU5PUl9WRVJTSU9OLEJVSUxEX1ZFUlNJT04sQlVJTERfUkVWSVNJT04KKyBGSUxFRkxBR1NNQVNLIDB4MWZMCisjaWZkZWYgX0RFQlVHCisgRklMRUZMQUdTIDB4OUwKKyNlbHNlCisgRklMRUZMQUdTIDB4OEwKKyNlbmRpZgorIEZJTEVPUyAweDRMCisgRklMRVRZUEUgMHgyTAorIEZJTEVTVUJUWVBFIDB4MEwKK0JFR0lOCisgICAgQkxPQ0sgIlN0cmluZ0ZpbGVJbmZvIgorICAgIEJFR0lOCisgICAgICAgIEJMT0NLICIwNDA5MDRiMCIKKyAgICAgICAgQkVHSU4KKwkJCVZBTFVFICJDb21wYW55TmFtZSIsICJHb29nbGUgSW5jLiIKKyAgICAgICAgICAgIFZBTFVFICJGaWxlRGVzY3JpcHRpb24iLCAiU3dpZnRTaGFkZXIgRGlyZWN0M0QgOCBSZW5kZXJlciIKKyAgICAgICAgICAgIFZBTFVFICJGaWxlVmVyc2lvbiIsIFZFUlNJT05fU1RSSU5HCisgICAgICAgICAgICBWQUxVRSAiSW50ZXJuYWxOYW1lIiwgIkQzRDgiCisJCQlWQUxVRSAiTGVnYWxDb3B5cmlnaHQiLCAiQ29weXJpZ2h0IChDKSAyMDE2IEdvb2dsZSBJbmMuIgorICAgICAgICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCAiZDNkOC5kbGwiCisgICAgICAgICAgICBWQUxVRSAiUHJpdmF0ZUJ1aWxkIiwgUkVWSVNJT05fU1RSSU5HCisgICAgICAgICAgICBWQUxVRSAiUHJvZHVjdE5hbWUiLCAiU3dpZnRTaGFkZXIgRGlyZWN0M0QgOCBSZW5kZXJlciIKKyAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0VmVyc2lvbiIsIFZFUlNJT05fU1RSSU5HCisgICAgICAgIEVORAorICAgIEVORAorICAgIEJMT0NLICJWYXJGaWxlSW5mbyIKKyAgICBCRUdJTgorICAgICAgICBWQUxVRSAiVHJhbnNsYXRpb24iLCAweDQwOSwgMTIwMAorICAgIEVORAorRU5ECisKKyNlbmRpZiAgICAvLyBFbmdsaXNoIChVbml0ZWQgU3RhdGVzKSByZXNvdXJjZXMKKy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisKKwpkaWZmIC0tZ2l0IGEvc3JjL0QzRDgvRDNEOC52Y3hwcm9qIGIvc3JjL0QzRDgvRDNEOC52Y3hwcm9qCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiYjdiYzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOC9EM0Q4LnZjeHByb2oKQEAgLTAsMCArMSwyODIgQEAKK++7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+DQorPFByb2plY3QgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiBUb29sc1ZlcnNpb249IjE0LjAiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPg0KKyAgPEl0ZW1Hcm91cCBMYWJlbD0iUHJvamVjdENvbmZpZ3VyYXRpb25zIj4NCisgICAgPFByb2plY3RDb25maWd1cmF0aW9uIEluY2x1ZGU9IkRlYnVnfFdpbjMyIj4NCisgICAgICA8Q29uZmlndXJhdGlvbj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUHJvZmlsZXxXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UHJvZmlsZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgICA8UHJvamVjdENvbmZpZ3VyYXRpb24gSW5jbHVkZT0iUmVsZWFzZXxXaW4zMiI+DQorICAgICAgPENvbmZpZ3VyYXRpb24+UmVsZWFzZTwvQ29uZmlndXJhdGlvbj4NCisgICAgICA8UGxhdGZvcm0+V2luMzI8L1BsYXRmb3JtPg0KKyAgICA8L1Byb2plY3RDb25maWd1cmF0aW9uPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8UHJvcGVydHlHcm91cCBMYWJlbD0iR2xvYmFscyI+DQorICAgIDxQcm9qZWN0R3VpZD57RjE4RDVBQkYtQ0EzQS00Qjc0LUJEQjItNEExOTU2Qzg2RjE4fTwvUHJvamVjdEd1aWQ+DQorICAgIDxLZXl3b3JkPldpbjMyUHJvajwvS2V5d29yZD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLkRlZmF1bHQucHJvcHMiIC8+DQorICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIiBMYWJlbD0iQ29uZmlndXJhdGlvbiI+DQorICAgIDxDb25maWd1cmF0aW9uVHlwZT5EeW5hbWljTGlicmFyeTwvQ29uZmlndXJhdGlvblR5cGU+DQorICAgIDxDaGFyYWN0ZXJTZXQ+Tm90U2V0PC9DaGFyYWN0ZXJTZXQ+DQorICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+dHJ1ZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgICA8UGxhdGZvcm1Ub29sc2V0PnYxNDA8L1BsYXRmb3JtVG9vbHNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkR5bmFtaWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Ob3RTZXQ8L0NoYXJhY3RlclNldD4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICAgIDxQbGF0Zm9ybVRvb2xzZXQ+djE0MDwvUGxhdGZvcm1Ub29sc2V0Pg0KKyAgPC9Qcm9wZXJ0eUdyb3VwPg0KKyAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciIExhYmVsPSJDb25maWd1cmF0aW9uIj4NCisgICAgPENvbmZpZ3VyYXRpb25UeXBlPkR5bmFtaWNMaWJyYXJ5PC9Db25maWd1cmF0aW9uVHlwZT4NCisgICAgPENoYXJhY3RlclNldD5Ob3RTZXQ8L0NoYXJhY3RlclNldD4NCisgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj5mYWxzZTwvV2hvbGVQcm9ncmFtT3B0aW1pemF0aW9uPg0KKyAgICA8UGxhdGZvcm1Ub29sc2V0PnYxNDA8L1BsYXRmb3JtVG9vbHNldD4NCisgIDwvUHJvcGVydHlHcm91cD4NCisgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKVxNaWNyb3NvZnQuQ3BwLnByb3BzIiAvPg0KKyAgPEltcG9ydEdyb3VwIExhYmVsPSJFeHRlbnNpb25TZXR0aW5ncyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpTWljcm9zb2Z0LkNQUC5VcGdyYWRlRnJvbVZDNzEucHJvcHMiIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciIExhYmVsPSJQcm9wZXJ0eVNoZWV0cyI+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzIiBDb25kaXRpb249ImV4aXN0cygnJChVc2VyUm9vdERpcilcTWljcm9zb2Z0LkNwcC4kKFBsYXRmb3JtKS51c2VyLnByb3BzJykiIExhYmVsPSJMb2NhbEFwcERhdGFQbGF0Zm9ybSIgLz4NCisgICAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpTWljcm9zb2Z0LkNQUC5VcGdyYWRlRnJvbVZDNzEucHJvcHMiIC8+DQorICA8L0ltcG9ydEdyb3VwPg0KKyAgPEltcG9ydEdyb3VwIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIiBMYWJlbD0iUHJvcGVydHlTaGVldHMiPg0KKyAgICA8SW1wb3J0IFByb2plY3Q9IiQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcyIgQ29uZGl0aW9uPSJleGlzdHMoJyQoVXNlclJvb3REaXIpXE1pY3Jvc29mdC5DcHAuJChQbGF0Zm9ybSkudXNlci5wcm9wcycpIiBMYWJlbD0iTG9jYWxBcHBEYXRhUGxhdGZvcm0iIC8+DQorICAgIDxJbXBvcnQgUHJvamVjdD0iJChWQ1RhcmdldHNQYXRoKU1pY3Jvc29mdC5DUFAuVXBncmFkZUZyb21WQzcxLnByb3BzIiAvPg0KKyAgPC9JbXBvcnRHcm91cD4NCisgIDxQcm9wZXJ0eUdyb3VwIExhYmVsPSJVc2VyTWFjcm9zIiAvPg0KKyAgPFByb3BlcnR5R3JvdXA+DQorICAgIDxfUHJvamVjdEZpbGVWZXJzaW9uPjEwLjAuMzAzMTkuMTwvX1Byb2plY3RGaWxlVmVyc2lvbj4NCisgICAgPE91dERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L0ludERpcj4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+dHJ1ZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8T3V0RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUmVsZWFzZXxXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9PdXREaXI+DQorICAgIDxPdXREaXIgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyI+JChQbGF0Zm9ybSlcJChDb25maWd1cmF0aW9uKVw8L091dERpcj4NCisgICAgPEludERpciBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4kKFBsYXRmb3JtKVwkKENvbmZpZ3VyYXRpb24pXDwvSW50RGlyPg0KKyAgICA8SW50RGlyIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPiQoUGxhdGZvcm0pXCQoQ29uZmlndXJhdGlvbilcPC9JbnREaXI+DQorICAgIDxMaW5rSW5jcmVtZW50YWwgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+ZmFsc2U8L0xpbmtJbmNyZW1lbnRhbD4NCisgICAgPExpbmtJbmNyZW1lbnRhbCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1Byb2ZpbGV8V2luMzInIj5mYWxzZTwvTGlua0luY3JlbWVudGFsPg0KKyAgICA8SW5jbHVkZVBhdGggQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPiQoU29sdXRpb25EaXIpXGluY2x1ZGVcRGlyZWN0M0Q7JChEWFNES19ESVIpXEluY2x1ZGU7JChJbmNsdWRlUGF0aCk8L0luY2x1ZGVQYXRoPg0KKyAgICA8SW5jbHVkZVBhdGggQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyI+JChTb2x1dGlvbkRpcilcaW5jbHVkZVxEaXJlY3QzRDskKERYU0RLX0RJUilcSW5jbHVkZTskKEluY2x1ZGVQYXRoKTwvSW5jbHVkZVBhdGg+DQorICAgIDxJbmNsdWRlUGF0aCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J1JlbGVhc2V8V2luMzInIj4kKFNvbHV0aW9uRGlyKVxpbmNsdWRlXERpcmVjdDNEOyQoRFhTREtfRElSKVxJbmNsdWRlOyQoSW5jbHVkZVBhdGgpPC9JbmNsdWRlUGF0aD4NCisgICAgPExpYnJhcnlQYXRoIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nRGVidWd8V2luMzInIj4kKERYU0RLX0RJUilMaWJceDg2OyQoTGlicmFyeVBhdGgpPC9MaWJyYXJ5UGF0aD4NCisgICAgPExpYnJhcnlQYXRoIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPiQoRFhTREtfRElSKUxpYlx4ODY7JChMaWJyYXJ5UGF0aCk8L0xpYnJhcnlQYXRoPg0KKyAgICA8TGlicmFyeVBhdGggQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+JChEWFNES19ESVIpTGliXHg4NjskKExpYnJhcnlQYXRoKTwvTGlicmFyeVBhdGg+DQorICA8L1Byb3BlcnR5R3JvdXA+DQorICA8SXRlbURlZmluaXRpb25Hcm91cCBDb25kaXRpb249IickKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJz09J0RlYnVnfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5EaXNhYmxlZDwvT3B0aW1pemF0aW9uPg0KKyAgICAgIDxJbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj5EZWZhdWx0PC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPnRydWU8L0ludHJpbnNpY0Z1bmN0aW9ucz4NCisgICAgICA8RmF2b3JTaXplT3JTcGVlZD5OZWl0aGVyPC9GYXZvclNpemVPclNwZWVkPg0KKyAgICAgIDxPbWl0RnJhbWVQb2ludGVycz5mYWxzZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cOy4uXE1haW47Li5cUmVuZGVyZXI7Li5cU2hhZGVyOy4uXENvbW1vbjsuLlxTd2lmdEFzbTsuLlxsaWJqcGVnOy4uXFN3aWZ0U2hhZGVyOy4uXEQzRDk7Li5cUmVhY3RvcjsuLlxMTFZNXGluY2x1ZGU7Li5cTExWTVx3aW4zMjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtfREVCVUc7X1dJTkRPV1M7X1VTUkRMTDtEM0Q4RExMX0VYUE9SVFM7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFOyUoUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnMpPC9QcmVwcm9jZXNzb3JEZWZpbml0aW9ucz4NCisgICAgICA8TWluaW1hbFJlYnVpbGQ+dHJ1ZTwvTWluaW1hbFJlYnVpbGQ+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPg0KKyAgICAgIDwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPEJhc2ljUnVudGltZUNoZWNrcz5EZWZhdWx0PC9CYXNpY1J1bnRpbWVDaGVja3M+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWREZWJ1ZzwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT50cnVlPC9Gb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPEJyb3dzZUluZm9ybWF0aW9uPnRydWU8L0Jyb3dzZUluZm9ybWF0aW9uPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+UHJvZ3JhbURhdGFiYXNlPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxGb3JjZWRJbmNsdWRlRmlsZXM+JShGb3JjZWRJbmNsdWRlRmlsZXMpPC9Gb3JjZWRJbmNsdWRlRmlsZXM+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz5keGd1aWQubGliO1dTMl8zMi5saWI7Y29tY3RsMzIubGliO3VzZXIzMi5saWI7Z2RpMzIubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpZDNkOC5kbGw8L091dHB1dEZpbGU+DQorICAgICAgPElnbm9yZVNwZWNpZmljRGVmYXVsdExpYnJhcmllcz5saWJjaS5saWI7JShJZ25vcmVTcGVjaWZpY0RlZmF1bHRMaWJyYXJpZXMpPC9JZ25vcmVTcGVjaWZpY0RlZmF1bHRMaWJyYXJpZXM+DQorICAgICAgPE1vZHVsZURlZmluaXRpb25GaWxlPmQzZDguZGVmPC9Nb2R1bGVEZWZpbml0aW9uRmlsZT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8QXNzZW1ibHlEZWJ1Zz50cnVlPC9Bc3NlbWJseURlYnVnPg0KKyAgICAgIDxQcm9ncmFtRGF0YWJhc2VGaWxlPg0KKyAgICAgIDwvUHJvZ3JhbURhdGFiYXNlRmlsZT4NCisgICAgICA8R2VuZXJhdGVNYXBGaWxlPnRydWU8L0dlbmVyYXRlTWFwRmlsZT4NCisgICAgICA8TWFwRXhwb3J0cz50cnVlPC9NYXBFeHBvcnRzPg0KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPg0KKyAgICAgIDxJbXBvcnRMaWJyYXJ5PiQoT3V0RGlyKUQzRDgubGliPC9JbXBvcnRMaWJyYXJ5Pg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYODY8L1RhcmdldE1hY2hpbmU+DQorICAgIDwvTGluaz4NCisgICAgPFBvc3RCdWlsZEV2ZW50Pg0KKyAgICAgIDxDb21tYW5kPm1rZGlyICIkKFNvbHV0aW9uRGlyKWxpYlwkKENvbmZpZ3VyYXRpb24pXyQoUGxhdGZvcm0pXCINCitjb3B5ICIkKE91dERpcilkM2Q4LmRsbCIgIiQoU29sdXRpb25EaXIpbGliXCQoQ29uZmlndXJhdGlvbilfJChQbGF0Zm9ybSlcIjwvQ29tbWFuZD4NCisgICAgPC9Qb3N0QnVpbGRFdmVudD4NCisgICAgPFByb2plY3RSZWZlcmVuY2U+DQorICAgICAgPExpbmtMaWJyYXJ5RGVwZW5kZW5jaWVzPmZhbHNlPC9MaW5rTGlicmFyeURlcGVuZGVuY2llcz4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5GdWxsPC9PcHRpbWl6YXRpb24+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkFueVN1aXRhYmxlPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPmZhbHNlPC9JbnRyaW5zaWNGdW5jdGlvbnM+DQorICAgICAgPEZhdm9yU2l6ZU9yU3BlZWQ+U2l6ZTwvRmF2b3JTaXplT3JTcGVlZD4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+dHJ1ZTwvT21pdEZyYW1lUG9pbnRlcnM+DQorICAgICAgPFdob2xlUHJvZ3JhbU9wdGltaXphdGlvbj50cnVlPC9XaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+DQorICAgICAgPEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+Li5cOy4uXE1haW47Li5cUmVuZGVyZXI7Li5cU2hhZGVyOy4uXENvbW1vbjsuLlxTd2lmdEFzbTsuLlxsaWJqcGVnOy4uXFN3aWZ0U2hhZGVyOy4uXEQzRDk7Li5cUmVhY3RvcjsuLlxMTFZNXGluY2x1ZGU7Li5cTExWTVx3aW4zMjslKEFkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXMpPC9BZGRpdGlvbmFsSW5jbHVkZURpcmVjdG9yaWVzPg0KKyAgICAgIDxQcmVwcm9jZXNzb3JEZWZpbml0aW9ucz5XSU4zMjtOREVCVUc7X1dJTkRPV1M7X1VTUkRMTDtEM0Q4RExMX0VYUE9SVFM7X0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFO19TRUNVUkVfU0NMPTA7X0hBU19FWENFUFRJT05TPTA7JShQcmVwcm9jZXNzb3JEZWZpbml0aW9ucyk8L1ByZXByb2Nlc3NvckRlZmluaXRpb25zPg0KKyAgICAgIDxFeGNlcHRpb25IYW5kbGluZz5mYWxzZTwvRXhjZXB0aW9uSGFuZGxpbmc+DQorICAgICAgPFJ1bnRpbWVMaWJyYXJ5Pk11bHRpVGhyZWFkZWQ8L1J1bnRpbWVMaWJyYXJ5Pg0KKyAgICAgIDxCdWZmZXJTZWN1cml0eUNoZWNrPmZhbHNlPC9CdWZmZXJTZWN1cml0eUNoZWNrPg0KKyAgICAgIDxGb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+dHJ1ZTwvRm9yY2VDb25mb3JtYW5jZUluRm9yTG9vcFNjb3BlPg0KKyAgICAgIDxQcmVjb21waWxlZEhlYWRlcj4NCisgICAgICA8L1ByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDxFeHBhbmRBdHRyaWJ1dGVkU291cmNlPmZhbHNlPC9FeHBhbmRBdHRyaWJ1dGVkU291cmNlPg0KKyAgICAgIDxXYXJuaW5nTGV2ZWw+TGV2ZWwzPC9XYXJuaW5nTGV2ZWw+DQorICAgICAgPERlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPC9EZWJ1Z0luZm9ybWF0aW9uRm9ybWF0Pg0KKyAgICAgIDxGb3JjZWRJbmNsdWRlRmlsZXM+JShGb3JjZWRJbmNsdWRlRmlsZXMpPC9Gb3JjZWRJbmNsdWRlRmlsZXM+DQorICAgICAgPEVuYWJsZUZpYmVyU2FmZU9wdGltaXphdGlvbnM+dHJ1ZTwvRW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz4NCisgICAgICA8U3RyaW5nUG9vbGluZz50cnVlPC9TdHJpbmdQb29saW5nPg0KKyAgICAgIDxGbG9hdGluZ1BvaW50RXhjZXB0aW9ucz5mYWxzZTwvRmxvYXRpbmdQb2ludEV4Y2VwdGlvbnM+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8TGluaz4NCisgICAgICA8QWRkaXRpb25hbERlcGVuZGVuY2llcz5keGd1aWQubGliO1dTMl8zMi5saWI7Y29tY3RsMzIubGliO3VzZXIzMi5saWI7Z2RpMzIubGliOyUoQWRkaXRpb25hbERlcGVuZGVuY2llcyk8L0FkZGl0aW9uYWxEZXBlbmRlbmNpZXM+DQorICAgICAgPE91dHB1dEZpbGU+JChPdXREaXIpZDNkOC5kbGw8L091dHB1dEZpbGU+DQorICAgICAgPElnbm9yZVNwZWNpZmljRGVmYXVsdExpYnJhcmllcz5saWJjaS5saWI7JShJZ25vcmVTcGVjaWZpY0RlZmF1bHRMaWJyYXJpZXMpPC9JZ25vcmVTcGVjaWZpY0RlZmF1bHRMaWJyYXJpZXM+DQorICAgICAgPE1vZHVsZURlZmluaXRpb25GaWxlPmQzZDguZGVmPC9Nb2R1bGVEZWZpbml0aW9uRmlsZT4NCisgICAgICA8R2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPnRydWU8L0dlbmVyYXRlRGVidWdJbmZvcm1hdGlvbj4NCisgICAgICA8U3ViU3lzdGVtPldpbmRvd3M8L1N1YlN5c3RlbT4NCisgICAgICA8T3B0aW1pemVSZWZlcmVuY2VzPnRydWU8L09wdGltaXplUmVmZXJlbmNlcz4NCisgICAgICA8RW5hYmxlQ09NREFURm9sZGluZz50cnVlPC9FbmFibGVDT01EQVRGb2xkaW5nPg0KKyAgICAgIDxTZXRDaGVja3N1bT50cnVlPC9TZXRDaGVja3N1bT4NCisgICAgICA8SW1wb3J0TGlicmFyeT4kKE91dERpcilEM0Q4LmxpYjwvSW1wb3J0TGlicmFyeT4NCisgICAgICA8VGFyZ2V0TWFjaGluZT5NYWNoaW5lWDg2PC9UYXJnZXRNYWNoaW5lPg0KKyAgICAgIDxMaW5rVGltZUNvZGVHZW5lcmF0aW9uPlVzZUxpbmtUaW1lQ29kZUdlbmVyYXRpb248L0xpbmtUaW1lQ29kZUdlbmVyYXRpb24+DQorICAgIDwvTGluaz4NCisgICAgPFBvc3RCdWlsZEV2ZW50Pg0KKyAgICAgIDxDb21tYW5kPm1rZGlyICIkKFNvbHV0aW9uRGlyKWxpYlwkKENvbmZpZ3VyYXRpb24pXyQoUGxhdGZvcm0pXCINCitjb3B5ICIkKE91dERpcilkM2Q4LmRsbCIgIiQoU29sdXRpb25EaXIpbGliXCQoQ29uZmlndXJhdGlvbilfJChQbGF0Zm9ybSlcIjwvQ29tbWFuZD4NCisgICAgPC9Qb3N0QnVpbGRFdmVudD4NCisgICAgPFByb2plY3RSZWZlcmVuY2U+DQorICAgICAgPExpbmtMaWJyYXJ5RGVwZW5kZW5jaWVzPmZhbHNlPC9MaW5rTGlicmFyeURlcGVuZGVuY2llcz4NCisgICAgPC9Qcm9qZWN0UmVmZXJlbmNlPg0KKyAgPC9JdGVtRGVmaW5pdGlvbkdyb3VwPg0KKyAgPEl0ZW1EZWZpbml0aW9uR3JvdXAgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyI+DQorICAgIDxDbENvbXBpbGU+DQorICAgICAgPE9wdGltaXphdGlvbj5GdWxsPC9PcHRpbWl6YXRpb24+DQorICAgICAgPElubGluZUZ1bmN0aW9uRXhwYW5zaW9uPkFueVN1aXRhYmxlPC9JbmxpbmVGdW5jdGlvbkV4cGFuc2lvbj4NCisgICAgICA8SW50cmluc2ljRnVuY3Rpb25zPmZhbHNlPC9JbnRyaW5zaWNGdW5jdGlvbnM+DQorICAgICAgPEZhdm9yU2l6ZU9yU3BlZWQ+U2l6ZTwvRmF2b3JTaXplT3JTcGVlZD4NCisgICAgICA8T21pdEZyYW1lUG9pbnRlcnM+ZmFsc2U8L09taXRGcmFtZVBvaW50ZXJzPg0KKyAgICAgIDxXaG9sZVByb2dyYW1PcHRpbWl6YXRpb24+ZmFsc2U8L1dob2xlUHJvZ3JhbU9wdGltaXphdGlvbj4NCisgICAgICA8QWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcz4uLlw7Li5cTWFpbjsuLlxSZW5kZXJlcjsuLlxTaGFkZXI7Li5cQ29tbW9uOy4uXFN3aWZ0QXNtOy4uXGxpYmpwZWc7Li5cU3dpZnRTaGFkZXI7Li5cRDNEOTsuLlxSZWFjdG9yOy4uXExMVk1caW5jbHVkZTsuLlxMTFZNXHdpbjMyOyUoQWRkaXRpb25hbEluY2x1ZGVEaXJlY3Rvcmllcyk8L0FkZGl0aW9uYWxJbmNsdWRlRGlyZWN0b3JpZXM+DQorICAgICAgPFByZXByb2Nlc3NvckRlZmluaXRpb25zPldJTjMyO05ERUJVRztfV0lORE9XUztfVVNSRExMO0QzRDhETExfRVhQT1JUUztfQ1JUX1NFQ1VSRV9OT19ERVBSRUNBVEU7X1NFQ1VSRV9TQ0w9MDtfSEFTX0VYQ0VQVElPTlM9MDslKFByZXByb2Nlc3NvckRlZmluaXRpb25zKTwvUHJlcHJvY2Vzc29yRGVmaW5pdGlvbnM+DQorICAgICAgPEV4Y2VwdGlvbkhhbmRsaW5nPmZhbHNlPC9FeGNlcHRpb25IYW5kbGluZz4NCisgICAgICA8UnVudGltZUxpYnJhcnk+TXVsdGlUaHJlYWRlZDwvUnVudGltZUxpYnJhcnk+DQorICAgICAgPEJ1ZmZlclNlY3VyaXR5Q2hlY2s+ZmFsc2U8L0J1ZmZlclNlY3VyaXR5Q2hlY2s+DQorICAgICAgPEZvcmNlQ29uZm9ybWFuY2VJbkZvckxvb3BTY29wZT50cnVlPC9Gb3JjZUNvbmZvcm1hbmNlSW5Gb3JMb29wU2NvcGU+DQorICAgICAgPFByZWNvbXBpbGVkSGVhZGVyPg0KKyAgICAgIDwvUHJlY29tcGlsZWRIZWFkZXI+DQorICAgICAgPEV4cGFuZEF0dHJpYnV0ZWRTb3VyY2U+ZmFsc2U8L0V4cGFuZEF0dHJpYnV0ZWRTb3VyY2U+DQorICAgICAgPFdhcm5pbmdMZXZlbD5MZXZlbDM8L1dhcm5pbmdMZXZlbD4NCisgICAgICA8RGVidWdJbmZvcm1hdGlvbkZvcm1hdD5Qcm9ncmFtRGF0YWJhc2U8L0RlYnVnSW5mb3JtYXRpb25Gb3JtYXQ+DQorICAgICAgPEZvcmNlZEluY2x1ZGVGaWxlcz4lKEZvcmNlZEluY2x1ZGVGaWxlcyk8L0ZvcmNlZEluY2x1ZGVGaWxlcz4NCisgICAgICA8RW5hYmxlRmliZXJTYWZlT3B0aW1pemF0aW9ucz50cnVlPC9FbmFibGVGaWJlclNhZmVPcHRpbWl6YXRpb25zPg0KKyAgICAgIDxTdHJpbmdQb29saW5nPnRydWU8L1N0cmluZ1Bvb2xpbmc+DQorICAgICAgPEZsb2F0aW5nUG9pbnRFeGNlcHRpb25zPmZhbHNlPC9GbG9hdGluZ1BvaW50RXhjZXB0aW9ucz4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxMaW5rPg0KKyAgICAgIDxBZGRpdGlvbmFsRGVwZW5kZW5jaWVzPmR4Z3VpZC5saWI7V1MyXzMyLmxpYjtjb21jdGwzMi5saWI7dXNlcjMyLmxpYjtnZGkzMi5saWI7JShBZGRpdGlvbmFsRGVwZW5kZW5jaWVzKTwvQWRkaXRpb25hbERlcGVuZGVuY2llcz4NCisgICAgICA8T3V0cHV0RmlsZT4kKE91dERpcilkM2Q4LmRsbDwvT3V0cHV0RmlsZT4NCisgICAgICA8SWdub3JlU3BlY2lmaWNEZWZhdWx0TGlicmFyaWVzPmxpYmNpLmxpYjslKElnbm9yZVNwZWNpZmljRGVmYXVsdExpYnJhcmllcyk8L0lnbm9yZVNwZWNpZmljRGVmYXVsdExpYnJhcmllcz4NCisgICAgICA8TW9kdWxlRGVmaW5pdGlvbkZpbGU+ZDNkOC5kZWY8L01vZHVsZURlZmluaXRpb25GaWxlPg0KKyAgICAgIDxHZW5lcmF0ZURlYnVnSW5mb3JtYXRpb24+dHJ1ZTwvR2VuZXJhdGVEZWJ1Z0luZm9ybWF0aW9uPg0KKyAgICAgIDxTdWJTeXN0ZW0+V2luZG93czwvU3ViU3lzdGVtPg0KKyAgICAgIDxPcHRpbWl6ZVJlZmVyZW5jZXM+dHJ1ZTwvT3B0aW1pemVSZWZlcmVuY2VzPg0KKyAgICAgIDxFbmFibGVDT01EQVRGb2xkaW5nPnRydWU8L0VuYWJsZUNPTURBVEZvbGRpbmc+DQorICAgICAgPFNldENoZWNrc3VtPnRydWU8L1NldENoZWNrc3VtPg0KKyAgICAgIDxJbXBvcnRMaWJyYXJ5PiQoT3V0RGlyKUQzRDgubGliPC9JbXBvcnRMaWJyYXJ5Pg0KKyAgICAgIDxUYXJnZXRNYWNoaW5lPk1hY2hpbmVYODY8L1RhcmdldE1hY2hpbmU+DQorICAgICAgPExpbmtUaW1lQ29kZUdlbmVyYXRpb24+RGVmYXVsdDwvTGlua1RpbWVDb2RlR2VuZXJhdGlvbj4NCisgICAgPC9MaW5rPg0KKyAgICA8UG9zdEJ1aWxkRXZlbnQ+DQorICAgICAgPENvbW1hbmQ+bWtkaXIgIiQoU29sdXRpb25EaXIpbGliXCQoQ29uZmlndXJhdGlvbilfJChQbGF0Zm9ybSlcIg0KK2NvcHkgIiQoT3V0RGlyKWQzZDguZGxsIiAiJChTb2x1dGlvbkRpcilsaWJcJChDb25maWd1cmF0aW9uKV8kKFBsYXRmb3JtKVwiPC9Db21tYW5kPg0KKyAgICA8L1Bvc3RCdWlsZEV2ZW50Pg0KKyAgICA8UHJvamVjdFJlZmVyZW5jZT4NCisgICAgICA8TGlua0xpYnJhcnlEZXBlbmRlbmNpZXM+ZmFsc2U8L0xpbmtMaWJyYXJ5RGVwZW5kZW5jaWVzPg0KKyAgICA8L1Byb2plY3RSZWZlcmVuY2U+DQorICA8L0l0ZW1EZWZpbml0aW9uR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkNhcGFiaWxpdGllcy5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iRDNEOC5jcHAiPg0KKyAgICAgIDxBc3NlbWJsZXJPdXRwdXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdEZWJ1Z3xXaW4zMiciPkFzc2VtYmx5QW5kU291cmNlQ29kZTwvQXNzZW1ibGVyT3V0cHV0Pg0KKyAgICAgIDxBc3NlbWJsZXJPdXRwdXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+QXNzZW1ibHlBbmRNYWNoaW5lQ29kZTwvQXNzZW1ibGVyT3V0cHV0Pg0KKyAgICAgIDxBc3NlbWJsZXJPdXRwdXQgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdQcm9maWxlfFdpbjMyJyI+QXNzZW1ibHlBbmRNYWNoaW5lQ29kZTwvQXNzZW1ibGVyT3V0cHV0Pg0KKyAgICAgIDxTaG93SW5jbHVkZXMgQ29uZGl0aW9uPSInJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKSc9PSdSZWxlYXNlfFdpbjMyJyI+ZmFsc2U8L1Nob3dJbmNsdWRlcz4NCisgICAgICA8U2hvd0luY2x1ZGVzIENvbmRpdGlvbj0iJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknPT0nUHJvZmlsZXxXaW4zMiciPmZhbHNlPC9TaG93SW5jbHVkZXM+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkRpcmVjdDNEOC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iRGlyZWN0M0RCYXNlVGV4dHVyZTguY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkRpcmVjdDNEQ3ViZVRleHR1cmU4LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJEaXJlY3QzRERldmljZTguY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkRpcmVjdDNESW5kZXhCdWZmZXI4LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJEaXJlY3QzRFBpeGVsU2hhZGVyOC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iRGlyZWN0M0RSZXNvdXJjZTguY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkRpcmVjdDNEU3RhdGVCbG9jazguY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkRpcmVjdDNEU3VyZmFjZTguY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkRpcmVjdDNEU3dhcENoYWluOC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iRGlyZWN0M0RUZXh0dXJlOC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOC5jcHAiIC8+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iRGlyZWN0M0RWZXJ0ZXhTaGFkZXI4LmNwcCIgLz4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJEaXJlY3QzRFZvbHVtZTguY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkRpcmVjdDNEVm9sdW1lVGV4dHVyZTguY3BwIiAvPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IlVua25vd24uY3BwIiAvPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkNhcGFiaWxpdGllcy5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iRGVidWcuaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRpcmVjdDNEOC5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iRGlyZWN0M0RCYXNlVGV4dHVyZTguaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRpcmVjdDNEQ3ViZVRleHR1cmU4LmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJEaXJlY3QzRERldmljZTguaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRpcmVjdDNESW5kZXhCdWZmZXI4LmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJEaXJlY3QzRFBpeGVsU2hhZGVyOC5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iRGlyZWN0M0RSZXNvdXJjZTguaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRpcmVjdDNEU3RhdGVCbG9jazguaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRpcmVjdDNEU3VyZmFjZTguaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRpcmVjdDNEU3dhcENoYWluOC5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iRGlyZWN0M0RUZXh0dXJlOC5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4LmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOC5ocHAiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iRGlyZWN0M0RWZXJ0ZXhTaGFkZXI4LmhwcCIgLz4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJEaXJlY3QzRFZvbHVtZTguaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRpcmVjdDNEVm9sdW1lVGV4dHVyZTguaHBwIiAvPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InJlc291cmNlLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0icmVzb3VyY2UxLmgiIC8+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iVW5rbm93bi5ocHAiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZXNvdXJjZUNvbXBpbGUgSW5jbHVkZT0iRDNEOC5yYyIgLz4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPE5vbmUgSW5jbHVkZT0iZDNkOC5kZWYiIC8+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXFN3aWZ0U2hhZGVyXFN3aWZ0U2hhZGVyLnZjeHByb2oiPg0KKyAgICAgIDxQcm9qZWN0Pns3YjAyY2IxOS00Y2RmLTRmNzktYmM5Yi03ZjNmNjE2NGEwMDN9PC9Qcm9qZWN0Pg0KKyAgICAgIDxQcml2YXRlPmZhbHNlPC9Qcml2YXRlPg0KKyAgICAgIDxSZWZlcmVuY2VPdXRwdXRBc3NlbWJseT5mYWxzZTwvUmVmZXJlbmNlT3V0cHV0QXNzZW1ibHk+DQorICAgICAgPENvcHlMb2NhbFNhdGVsbGl0ZUFzc2VtYmxpZXM+ZmFsc2U8L0NvcHlMb2NhbFNhdGVsbGl0ZUFzc2VtYmxpZXM+DQorICAgICAgPExpbmtMaWJyYXJ5RGVwZW5kZW5jaWVzPnRydWU8L0xpbmtMaWJyYXJ5RGVwZW5kZW5jaWVzPg0KKyAgICAgIDxVc2VMaWJyYXJ5RGVwZW5kZW5jeUlucHV0cz5mYWxzZTwvVXNlTGlicmFyeURlcGVuZGVuY3lJbnB1dHM+DQorICAgIDwvUHJvamVjdFJlZmVyZW5jZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEltcG9ydCBQcm9qZWN0PSIkKFZDVGFyZ2V0c1BhdGgpXE1pY3Jvc29mdC5DcHAudGFyZ2V0cyIgLz4NCisgIDxJbXBvcnRHcm91cCBMYWJlbD0iRXh0ZW5zaW9uVGFyZ2V0cyI+DQorICA8L0ltcG9ydEdyb3VwPg0KKzwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvRDNEOC9EM0Q4LnZjeHByb2ouZmlsdGVycyBiL3NyYy9EM0Q4L0QzRDgudmN4cHJvai5maWx0ZXJzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzNDhiNGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOC9EM0Q4LnZjeHByb2ouZmlsdGVycwpAQCAtMCwwICsxLDE0OSBAQAor77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCis8UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgeG1sbnM9Imh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vZGV2ZWxvcGVyL21zYnVpbGQvMjAwMyI+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IlNvdXJjZSBGaWxlcyI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezRGQzczN0YxLUM3QTUtNDM3Ni1BMDY2LTJBMzJENzUyQTJGRn08L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgICAgPEV4dGVuc2lvbnM+Y3BwO2M7Y3h4O2RlZjtvZGw7aWRsO2hwajtiYXQ7YXNtO2FzbXg8L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgICA8RmlsdGVyIEluY2x1ZGU9IkhlYWRlciBGaWxlcyI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezkzOTk1MzgwLTg5QkQtNGIwNC04OEVCLTYyNUZCRTUyRUJGQn08L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgICAgPEV4dGVuc2lvbnM+aDtocHA7aHh4O2htO2lubDtpbmM7eHNkPC9FeHRlbnNpb25zPg0KKyAgICA8L0ZpbHRlcj4NCisgICAgPEZpbHRlciBJbmNsdWRlPSJSZXNvdXJjZSBGaWxlcyI+DQorICAgICAgPFVuaXF1ZUlkZW50aWZpZXI+ezY3REE2QUI2LUY4MDAtNGMwOC04QjdBLTgzQkIxMjFBQUQwMX08L1VuaXF1ZUlkZW50aWZpZXI+DQorICAgICAgPEV4dGVuc2lvbnM+cmM7aWNvO2N1cjtibXA7ZGxnO3JjMjtyY3Q7YmluO3JncztnaWY7anBnO2pwZWc7anBlO3Jlc3g8L0V4dGVuc2lvbnM+DQorICAgIDwvRmlsdGVyPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkNhcGFiaWxpdGllcy5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkQzRDguY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJEaXJlY3QzRDguY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJEaXJlY3QzREJhc2VUZXh0dXJlOC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkRpcmVjdDNEQ3ViZVRleHR1cmU4LmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iRGlyZWN0M0REZXZpY2U4LmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iRGlyZWN0M0RJbmRleEJ1ZmZlcjguY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJEaXJlY3QzRFBpeGVsU2hhZGVyOC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkRpcmVjdDNEUmVzb3VyY2U4LmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iRGlyZWN0M0RTdGF0ZUJsb2NrOC5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgICA8Q2xDb21waWxlIEluY2x1ZGU9IkRpcmVjdDNEU3VyZmFjZTguY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJEaXJlY3QzRFN3YXBDaGFpbjguY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJEaXJlY3QzRFRleHR1cmU4LmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4LmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjguY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJEaXJlY3QzRFZlcnRleFNoYWRlcjguY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJEaXJlY3QzRFZvbHVtZTguY3BwIj4NCisgICAgICA8RmlsdGVyPlNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsQ29tcGlsZT4NCisgICAgPENsQ29tcGlsZSBJbmNsdWRlPSJEaXJlY3QzRFZvbHVtZVRleHR1cmU4LmNwcCI+DQorICAgICAgPEZpbHRlcj5Tb3VyY2UgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbENvbXBpbGU+DQorICAgIDxDbENvbXBpbGUgSW5jbHVkZT0iVW5rbm93bi5jcHAiPg0KKyAgICAgIDxGaWx0ZXI+U291cmNlIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xDb21waWxlPg0KKyAgPC9JdGVtR3JvdXA+DQorICA8SXRlbUdyb3VwPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkNhcGFiaWxpdGllcy5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRlYnVnLmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iRGlyZWN0M0Q4LmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iRGlyZWN0M0RCYXNlVGV4dHVyZTguaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJEaXJlY3QzREN1YmVUZXh0dXJlOC5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRpcmVjdDNERGV2aWNlOC5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRpcmVjdDNESW5kZXhCdWZmZXI4LmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iRGlyZWN0M0RQaXhlbFNoYWRlcjguaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJEaXJlY3QzRFJlc291cmNlOC5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRpcmVjdDNEU3RhdGVCbG9jazguaHBwIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJEaXJlY3QzRFN1cmZhY2U4LmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iRGlyZWN0M0RTd2FwQ2hhaW44LmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iRGlyZWN0M0RUZXh0dXJlOC5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRpcmVjdDNEVmVydGV4QnVmZmVyOC5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9IkRpcmVjdDNEVmVydGV4RGVjbGFyYXRpb244LmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iRGlyZWN0M0RWZXJ0ZXhTaGFkZXI4LmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iRGlyZWN0M0RWb2x1bWU4LmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICAgIDxDbEluY2x1ZGUgSW5jbHVkZT0iRGlyZWN0M0RWb2x1bWVUZXh0dXJlOC5ocHAiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InJlc291cmNlLmgiPg0KKyAgICAgIDxGaWx0ZXI+SGVhZGVyIEZpbGVzPC9GaWx0ZXI+DQorICAgIDwvQ2xJbmNsdWRlPg0KKyAgICA8Q2xJbmNsdWRlIEluY2x1ZGU9InJlc291cmNlMS5oIj4NCisgICAgICA8RmlsdGVyPkhlYWRlciBGaWxlczwvRmlsdGVyPg0KKyAgICA8L0NsSW5jbHVkZT4NCisgICAgPENsSW5jbHVkZSBJbmNsdWRlPSJVbmtub3duLmhwcCI+DQorICAgICAgPEZpbHRlcj5IZWFkZXIgRmlsZXM8L0ZpbHRlcj4NCisgICAgPC9DbEluY2x1ZGU+DQorICA8L0l0ZW1Hcm91cD4NCisgIDxJdGVtR3JvdXA+DQorICAgIDxSZXNvdXJjZUNvbXBpbGUgSW5jbHVkZT0iRDNEOC5yYyI+DQorICAgICAgPEZpbHRlcj5SZXNvdXJjZSBGaWxlczwvRmlsdGVyPg0KKyAgICA8L1Jlc291cmNlQ29tcGlsZT4NCisgIDwvSXRlbUdyb3VwPg0KKyAgPEl0ZW1Hcm91cD4NCisgICAgPE5vbmUgSW5jbHVkZT0iZDNkOC5kZWYiIC8+DQorICA8L0l0ZW1Hcm91cD4NCis8L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDgvRGVidWcuaHBwIGIvc3JjL0QzRDgvRGVidWcuaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMjE2YjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOC9EZWJ1Zy5ocHAKQEAgLTAsMCArMSwxMjYgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgRGVidWdfaHBwCisjZGVmaW5lIERlYnVnX2hwcAorCisjaWZuZGVmIFdJTjMyX0xFQU5fQU5EX01FQU4KKwkjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4KKyNlbmRpZgorI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNpbmNsdWRlIDxkM2Q4Lmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxndWlkZGVmLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK3ZvaWQgdHJhY2UoY29uc3QgY2hhciAqZm9ybWF0LCAuLi4pOworCisjaWZuZGVmIE5ERUJVRworCSNkZWZpbmUgVFJBQ0UoZm9ybWF0LCAuLi4pIHRyYWNlKCJbMHglMC44WF0lcygiZm9ybWF0IilcbiIsIHRoaXMsIF9fRlVOQ1RJT05fXywgIyNfX1ZBX0FSR1NfXykKKyNlbHNlCisJI2RlZmluZSBUUkFDRSguLi4pICgodm9pZCkwKQorI2VuZGlmCisKKyNpZm5kZWYgTkRFQlVHCisJI2RlZmluZSBBU1NFUlQoZXhwcmVzc2lvbikge2lmKCEoZXhwcmVzc2lvbikpIHRyYWNlKCJcdCEgQXNzZXJ0IGZhaWxlZCBpbiAlcyglZCk6ICIjZXhwcmVzc2lvbiJcbiIsIF9fRlVOQ1RJT05fXywgX19MSU5FX18pOyBhc3NlcnQoZXhwcmVzc2lvbik7fQorI2Vsc2UKKwkjZGVmaW5lIEFTU0VSVCBhc3NlcnQKKyNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworCSNkZWZpbmUgVU5JTVBMRU1FTlRFRCgpIHt0cmFjZSgiXHQhIFVuaW1wbGVtZW50ZWQ6ICVzKCVkKVxuIiwgX19GVU5DVElPTl9fLCBfX0xJTkVfXyk7IEFTU0VSVChmYWxzZSk7fQorI2Vsc2UKKwkjZGVmaW5lIFVOSU1QTEVNRU5URUQoKSAoKHZvaWQpMCkKKyNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworCSNkZWZpbmUgTk9JTlRFUkZBQ0UoaWlkKSBfTk9JTlRFUkZBQ0UoX19GVU5DVElPTl9fLCBpaWQpCisKKwlpbmxpbmUgbG9uZyBfTk9JTlRFUkZBQ0UoY29uc3QgY2hhciAqZnVuY3Rpb24sIGNvbnN0IElJRCAmaWlkKQorCXsKKwkJdHJhY2UoIlx0ISBObyBpbnRlcmZhY2UgezB4JTAuOFgsIDB4JTAuNFgsIDB4JTAuNFgsIDB4JTAuMlgsIDB4JTAuMlgsIDB4JTAuMlgsIDB4JTAuMlgsIDB4JTAuMlgsIDB4JTAuMlgsIDB4JTAuMlgsIDB4JTAuMlh9IGZvciAlc1xuIiwgaWlkLkRhdGExLCBpaWQuRGF0YTIsIGlpZC5EYXRhMywgaWlkLkRhdGE0WzBdLCBpaWQuRGF0YTRbMV0sIGlpZC5EYXRhNFsyXSwgaWlkLkRhdGE0WzNdLCBpaWQuRGF0YTRbNF0sIGlpZC5EYXRhNFs1XSwgaWlkLkRhdGE0WzZdLCBpaWQuRGF0YTRbN10sIGZ1bmN0aW9uKTsKKworCQlyZXR1cm4gIEVfTk9JTlRFUkZBQ0U7CisJfQorI2Vsc2UKKwkjZGVmaW5lIE5PSU5URVJGQUNFKGlpZCkgRV9OT0lOVEVSRkFDRQorI2VuZGlmCisKKyNpZm5kZWYgTkRFQlVHCisJaW5saW5lIGxvbmcgSU5WQUxJRENBTEwoKQorCXsKKwkJdHJhY2UoIlx0ISBEM0RFUlJfSU5WQUxJRENBTExcbiIpOworCisJCXJldHVybiBEM0RFUlJfSU5WQUxJRENBTEw7CisJfQorI2Vsc2UKKwkjZGVmaW5lIElOVkFMSURDQUxMKCkgRDNERVJSX0lOVkFMSURDQUxMCisjZW5kaWYKKworI2lmbmRlZiBOREVCVUcKKwlpbmxpbmUgbG9uZyBPVVRPRk1FTU9SWSgpCisJeworCQl0cmFjZSgiXHQhIEVfT1VUT0ZNRU1PUllcbiIpOworCisJCXJldHVybiBFX09VVE9GTUVNT1JZOworCX0KKyNlbHNlCisJI2RlZmluZSBPVVRPRk1FTU9SWSgpIEVfT1VUT0ZNRU1PUlkKKyNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworCWlubGluZSBsb25nIE9VVE9GVklERU9NRU1PUlkoKQorCXsKKwkJdHJhY2UoIlx0ISBEM0RFUlJfT1VUT0ZWSURFT01FTU9SWVxuIik7CisKKwkJcmV0dXJuIEQzREVSUl9PVVRPRlZJREVPTUVNT1JZOworCX0KKyNlbHNlCisJI2RlZmluZSBPVVRPRlZJREVPTUVNT1JZKCkgRDNERVJSX09VVE9GVklERU9NRU1PUlkKKyNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworCWlubGluZSBsb25nIE5PVEFWQUlMQUJMRSgpCisJeworCQl0cmFjZSgiXHQhIEQzREVSUl9OT1RBVkFJTEFCTEVcbiIpOworCisJCXJldHVybiBEM0RFUlJfTk9UQVZBSUxBQkxFOworCX0KKyNlbHNlCisJI2RlZmluZSBOT1RBVkFJTEFCTEUoKSBEM0RFUlJfTk9UQVZBSUxBQkxFCisjZW5kaWYKKworI2lmbmRlZiBOREVCVUcKKwlpbmxpbmUgbG9uZyBOT1RGT1VORCgpCisJeworCQl0cmFjZSgiXHQhIEQzREVSUl9OT1RGT1VORFxuIik7CisKKwkJcmV0dXJuIEQzREVSUl9OT1RGT1VORDsKKwl9CisjZWxzZQorCSNkZWZpbmUgTk9URk9VTkQoKSBEM0RFUlJfTk9URk9VTkQKKyNlbmRpZgorCisjaWZuZGVmIE5ERUJVRworCWlubGluZSBsb25nIE1PUkVEQVRBKCkKKwl7CisJCXRyYWNlKCJcdCEgRDNERVJSX01PUkVEQVRBXG4iKTsKKworCQlyZXR1cm4gRDNERVJSX01PUkVEQVRBOworCX0KKyNlbHNlCisJI2RlZmluZSBNT1JFREFUQSgpIEQzREVSUl9NT1JFREFUQQorI2VuZGlmCisKKyNlbmRpZiAgIC8vIERlYnVnX2hwcApkaWZmIC0tZ2l0IGEvc3JjL0QzRDgvRGlyZWN0M0Q4LmNwcCBiL3NyYy9EM0Q4L0RpcmVjdDNEOC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjRjZTAyMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9EM0Q4L0RpcmVjdDNEOC5jcHAKQEAgLTAsMCArMSwxMDc0IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiRGlyZWN0M0Q4LmhwcCIKKworI2luY2x1ZGUgIkRpcmVjdDNERGV2aWNlOC5ocHAiCisjaW5jbHVkZSAiQ2FwYWJpbGl0aWVzLmhwcCIKKyNpbmNsdWRlICJDb25maWd1cmF0b3IuaHBwIgorI2luY2x1ZGUgIkRlYnVnLmhwcCIKKyNpbmNsdWRlICJDUFVJRC5ocHAiCisjaW5jbHVkZSAiVmVyc2lvbi5oIgorI2luY2x1ZGUgIkNvbmZpZy5ocHAiCisKKyNkZWZpbmUgQ09NUElMRV9NVUxUSU1PTl9TVFVCUworI2luY2x1ZGUgPG11bHRpbW9uLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK25hbWVzcGFjZSBEM0Q4Cit7CisJRGlyZWN0M0Q4OjpEaXJlY3QzRDgoaW50IHZlcnNpb24sIGNvbnN0IEhJTlNUQU5DRSBpbnN0YW5jZSkgOiB2ZXJzaW9uKHZlcnNpb24pLCBpbnN0YW5jZShpbnN0YW5jZSkKKwl7CisJCWRpc3BsYXlNb2RlID0gMDsKKwkJbnVtRGlzcGxheU1vZGVzID0gMDsKKworCQlERVZNT0RFIGRldm1vZGU7CisJCWRldm1vZGUuZG1TaXplID0gc2l6ZW9mKERFVk1PREUpOworCisJCS8vIENvdW50IG51bWJlciBvZiBkaXNwbGF5IG1vZGVzCisJCXdoaWxlKEVudW1EaXNwbGF5U2V0dGluZ3MoMCwgbnVtRGlzcGxheU1vZGVzLCAmZGV2bW9kZSkpCisJCXsKKwkJCW51bURpc3BsYXlNb2RlcysrOworCQl9CisKKwkJZGlzcGxheU1vZGUgPSBuZXcgREVWTU9ERVtudW1EaXNwbGF5TW9kZXNdOworCisJCS8vIFN0b3JlIGRpc3BsYXkgbW9kZXMgaW5mb3JtYXRpb24KKwkJZm9yKGludCBpID0gMDsgaSA8IG51bURpc3BsYXlNb2RlczsgaSsrKQorCQl7CisJCQlkaXNwbGF5TW9kZVtpXS5kbVNpemUgPSBzaXplb2YoREVWTU9ERSk7CisJCQlFbnVtRGlzcGxheVNldHRpbmdzKDAsIGksICZkaXNwbGF5TW9kZVtpXSk7CisJCX0KKworCQlkM2Q4TGliID0gMDsKKwkJZDNkOCA9IDA7CisKKwkJc3c6OkNvbmZpZ3VyYXRvciBpbmkoIlN3aWZ0U2hhZGVyLmluaSIpOworCisJCWludCBwcyA9IGluaS5nZXRJbnRlZ2VyKCJDYXBhYmlsaXRpZXMiLCAiUGl4ZWxTaGFkZXJWZXJzaW9uIiwgMTQpOworCQlpbnQgdnMgPSBpbmkuZ2V0SW50ZWdlcigiQ2FwYWJpbGl0aWVzIiwgIlZlcnRleFNoYWRlclZlcnNpb24iLCAxMSk7CisKKwkJICAgICBpZihwcyA9PSAgMCkgcGl4ZWxTaGFkZXJWZXJzaW9uID0gRDNEUFNfVkVSU0lPTigwLCAwKTsKKwkJZWxzZSBpZihwcyA8PSAxMSkgcGl4ZWxTaGFkZXJWZXJzaW9uID0gRDNEUFNfVkVSU0lPTigxLCAxKTsKKwkJZWxzZSBpZihwcyA8PSAxMikgcGl4ZWxTaGFkZXJWZXJzaW9uID0gRDNEUFNfVkVSU0lPTigxLCAyKTsKKwkJZWxzZSBpZihwcyA8PSAxMykgcGl4ZWxTaGFkZXJWZXJzaW9uID0gRDNEUFNfVkVSU0lPTigxLCAzKTsKKwkJZWxzZSAgICAgICAgICAgICAgcGl4ZWxTaGFkZXJWZXJzaW9uID0gRDNEUFNfVkVSU0lPTigxLCA0KTsKKworCQkgICAgIGlmKHZzID09ICAwKSB2ZXJ0ZXhTaGFkZXJWZXJzaW9uID0gRDNEVlNfVkVSU0lPTigwLCAwKTsKKwkJZWxzZSAgICAgICAgICAgICAgdmVydGV4U2hhZGVyVmVyc2lvbiA9IEQzRFZTX1ZFUlNJT04oMSwgMSk7CisKKwkJdGV4dHVyZU1lbW9yeSA9IDEwMjQgKiAxMDI0ICogaW5pLmdldEludGVnZXIoIkNhcGFiaWxpdGllcyIsICJUZXh0dXJlTWVtb3J5IiwgMjU2KTsKKwl9CisKKwlEaXJlY3QzRDg6On5EaXJlY3QzRDgoKQorCXsKKwkJZGVsZXRlW10gZGlzcGxheU1vZGU7CisJCWRpc3BsYXlNb2RlID0gMDsKKworCQlpZihkM2Q4KQorCQl7CisJCQlkM2Q4LT5SZWxlYXNlKCk7CisJCQlkM2Q4ID0gMDsKKwkJfQorCisJCWlmKGQzZDhMaWIpCisJCXsKKwkJCUZyZWVMaWJyYXJ5KGQzZDhMaWIpOworCQkJZDNkOExpYiA9IDA7CisJCX0KKwl9CisKKwlsb25nIERpcmVjdDNEODo6UXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoaWlkID09IElJRF9JRGlyZWN0M0Q4IHx8CisJCSAgIGlpZCA9PSBJSURfSVVua25vd24pCisJCXsKKwkJCUFkZFJlZigpOworCQkJKm9iamVjdCA9IHRoaXM7CisKKwkJCXJldHVybiBTX09LOworCQl9CisKKwkJKm9iamVjdCA9IDA7CisKKwkJcmV0dXJuIE5PSU5URVJGQUNFKGlpZCk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRDg6OkFkZFJlZigpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIFVua25vd246OkFkZFJlZigpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0Q4OjpSZWxlYXNlKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gVW5rbm93bjo6UmVsZWFzZSgpOworCX0KKworCWxvbmcgRGlyZWN0M0Q4OjpDaGVja0RlcHRoU3RlbmNpbE1hdGNoKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEQzREZPUk1BVCBhZGFwdGVyRm9ybWF0LCBEM0RGT1JNQVQgcmVuZGVyVGFyZ2V0Rm9ybWF0LCBEM0RGT1JNQVQgZGVwdGhTdGVuY2lsRm9ybWF0KQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKGRldmljZVR5cGUgIT0gRDNEREVWVFlQRV9IQUwpCisJCXsKKwkJCWxvYWRTeXN0ZW1EM0Q4KCk7CisKKwkJCWlmKGQzZDgpCisJCQl7CisJCQkJcmV0dXJuIGQzZDgtPkNoZWNrRGVwdGhTdGVuY2lsTWF0Y2goYWRhcHRlciwgZGV2aWNlVHlwZSwgYWRhcHRlckZvcm1hdCwgcmVuZGVyVGFyZ2V0Rm9ybWF0LCBkZXB0aFN0ZW5jaWxGb3JtYXQpOworCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJldHVybiBDaGVja0RlcHRoU3RlbmNpbE1hdGNoKGFkYXB0ZXIsIEQzRERFVlRZUEVfSEFMLCBhZGFwdGVyRm9ybWF0LCByZW5kZXJUYXJnZXRGb3JtYXQsIGRlcHRoU3RlbmNpbEZvcm1hdCk7CisJCQl9CisJCX0KKworCQlyZXR1cm4gRDNEX09LOyAgIC8vIEFueSBmb3JtYXQgY29tYmluYXRpb24gaXMgb2sKKwl9CisKKwlsb25nIERpcmVjdDNEODo6Q2hlY2tEZXZpY2VGb3JtYXQodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgRDNERk9STUFUIGFkYXB0ZXJGb3JtYXQsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIEQzRFJFU09VUkNFVFlQRSByZXNvdXJjZVR5cGUsIEQzREZPUk1BVCBjaGVja0Zvcm1hdCkKKwl7CisJCVRSQUNFKCJ1bnNpZ25lZCBpbnQgYWRhcHRlciA9ICVkLCBEM0RERVZUWVBFIGRldmljZVR5cGUgPSAlZCwgRDNERk9STUFUIGFkYXB0ZXJGb3JtYXQgPSAlZCwgdW5zaWduZWQgbG9uZyB1c2FnZSA9ICVkLCBEM0RSRVNPVVJDRVRZUEUgcmVzb3VyY2VUeXBlID0gJWQsIEQzREZPUk1BVCBjaGVja0Zvcm1hdCA9ICVkIiwgYWRhcHRlciwgZGV2aWNlVHlwZSwgYWRhcHRlckZvcm1hdCwgdXNhZ2UsIHJlc291cmNlVHlwZSwgY2hlY2tGb3JtYXQpOworCisJCWlmKGRldmljZVR5cGUgIT0gRDNEREVWVFlQRV9IQUwpCisJCXsKKwkJCWxvYWRTeXN0ZW1EM0Q4KCk7CisKKwkJCWlmKGQzZDgpCisJCQl7CisJCQkJcmV0dXJuIGQzZDgtPkNoZWNrRGV2aWNlRm9ybWF0KGFkYXB0ZXIsIGRldmljZVR5cGUsIGFkYXB0ZXJGb3JtYXQsIHVzYWdlLCByZXNvdXJjZVR5cGUsIGNoZWNrRm9ybWF0KTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4gQ2hlY2tEZXZpY2VGb3JtYXQoYWRhcHRlciwgRDNEREVWVFlQRV9IQUwsIGFkYXB0ZXJGb3JtYXQsIHVzYWdlLCByZXNvdXJjZVR5cGUsIGNoZWNrRm9ybWF0KTsKKwkJCX0KKwkJfQorCisJCXN3aXRjaChyZXNvdXJjZVR5cGUpCisJCXsKKwkJY2FzZSBEM0RSVFlQRV9TVVJGQUNFOgorCQkJaWYodXNhZ2UgJiBEM0RVU0FHRV9SRU5ERVJUQVJHRVQpCisJCQl7CisJCQkJc3dpdGNoKGNoZWNrRm9ybWF0KQorCQkJCXsKKwkJCQljYXNlIEQzREZNVF9SOEc4Qjg6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpSOEc4QjgpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9SNUc2QjU6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpSNUc2QjUpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9YMVI1RzVCNToJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6WDFSNUc1QjUpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BMVI1RzVCNToJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QTFSNUc1QjUpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BNFI0RzRCNDoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QTRSNEc0QjQpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9SM0czQjI6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UmVuZGVyVGFyZ2V0OjpSM0czQjIpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BOFIzRzNCMjoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QThSM0czQjIpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9YNFI0RzRCNDoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6WDRSNEc0QjQpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QThSOEc4QjgpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9YOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6WDhSOEc4QjgpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQkvLyBJbnRlZ2VyIEhEUiBmb3JtYXRzCisJCQkJY2FzZSBEM0RGTVRfRzE2UjE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6RzE2UjE2KQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQTJCMTBHMTBSMTA6CWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlJlbmRlclRhcmdldDo6QTJCMTBHMTBSMTApCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKKwkJCQl9CisJCQl9CisJCQllbHNlIGlmKHVzYWdlICYgRDNEVVNBR0VfREVQVEhTVEVOQ0lMKQorCQkJeworCQkJCXN3aXRjaChjaGVja0Zvcm1hdCkKKwkJCQl7CisJCQkJY2FzZSBEM0RGTVRfRDMyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRlcHRoU3RlbmNpbDo6RDMyKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0QyNFM4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRlcHRoU3RlbmNpbDo6RDI0UzgpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfRDI0WDg6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RGVwdGhTdGVuY2lsOjpEMjRYOCkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9EMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RGVwdGhTdGVuY2lsOjpEMTYpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlzd2l0Y2goY2hlY2tGb3JtYXQpCisJCQkJeworCQkJCWNhc2UgRDNERk1UX0E4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfUjVHNkI1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlI1RzZCNSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9YMVI1RzVCNToJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlgxUjVHNUI1KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQTFSNUc1QjU6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBMVI1RzVCNSkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QTRSNEc0QjQpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9SM0czQjI6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UjNHM0IyKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E4UjNHM0IyOgkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QThSM0czQjIpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9YNFI0RzRCNDoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6Olg0UjRHNEI0KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfUjhHOEI4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlI4RzhCOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9YOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6Olg4UjhHOEI4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQThSOEc4Qjg6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpBOFI4RzhCOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCS8vIFBhbGV0dGVkIGZvcm1hdHMKKwkJCQljYXNlIEQzREZNVF9QODoJCQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6UDgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E4UDg6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QThQOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQkvLyBJbnRlZ2VyIEhEUiBmb3JtYXRzCisJCQkJY2FzZSBEM0RGTVRfRzE2UjE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkcxNlIxNikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BMkIxMEcxMFIxMDoJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QTJCMTBHMTBSMTApCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQkvLyBDb21wcmVzc2VkIGZvcm1hdHMKKwkJCQljYXNlIEQzREZNVF9EWFQxOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRYVDEpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfRFhUMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEWFQyKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0RYVDM6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6RFhUMykJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9EWFQ0OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkRYVDQpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfRFhUNToJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpEWFQ1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCS8vIEJ1bXAgbWFwIGZvcm1hdHMKKwkJCQljYXNlIEQzREZNVF9WOFU4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OlY4VTgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfTDZWNVU1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6Okw2VjVVNSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9YOEw4VjhVODoJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6Olg4TDhWOFU4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfUThXOFY4VTg6CQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpROFc4VjhVOCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1YxNlUxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpTdXJmYWNlOjpWMTZVMTYpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQTJXMTBWMTBVMTA6CWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkEyVzEwVjEwVTEwKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJLy8gTHVtaW5hbmNlIGZvcm1hdHMKKwkJCQljYXNlIEQzREZNVF9MODoJCQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6TDgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E0TDQ6CQkJaWYoIUNhcGFiaWxpdGllczo6U3VyZmFjZTo6QTRMNCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BOEw4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlN1cmZhY2U6OkE4TDgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOworCQkJCX0KKwkJCX0KKwkJY2FzZSBEM0RSVFlQRV9WT0xVTUU6CisJCQlzd2l0Y2goY2hlY2tGb3JtYXQpCisJCQl7CisJCQljYXNlIEQzREZNVF9BODoJCQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfUjVHNkI1OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OlI1RzZCNSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX1gxUjVHNUI1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6WDFSNUc1QjUpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9BMVI1RzVCNToJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkExUjVHNUI1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfQTRSNEc0QjQ6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBNFI0RzRCNCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX1IzRzNCMjoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpSM0czQjIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9BOFIzRzNCMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkE4UjNHM0IyKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfWDRSNEc0QjQ6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpYNFI0RzRCNCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX1I4RzhCODoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpSOEc4QjgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9YOFI4RzhCODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6Olg4UjhHOEI4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfQThSOEc4Qjg6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBOFI4RzhCOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCS8vIFBhbGV0dGVkIGZvcm1hdHMKKwkJCWNhc2UgRDNERk1UX1A4OgkJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpQOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9BOFA4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkE4UDgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJLy8gSW50ZWdlciBIRFIgZm9ybWF0cworCQkJY2FzZSBEM0RGTVRfRzE2UjE2OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkcxNlIxNikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOgkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpBMkIxMEcxMFIxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJLy8gQ29tcHJlc3NlZCBmb3JtYXRzCisJCQljYXNlIEQzREZNVF9EWFQxOgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkRYVDEpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfRFhUMjoJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpEWFQyKQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX0RYVDM6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6RFhUMykJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9EWFQ0OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkRYVDQpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfRFhUNToJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpEWFQ1KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCS8vIEJ1bXAgbWFwIGZvcm1hdHMKKwkJCWNhc2UgRDNERk1UX1Y4VTg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6VjhVOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9MNlY1VTU6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6TDZWNVU1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfWDhMOFY4VTg6CQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lOjpYOEw4VjhVOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX1E4VzhWOFU4OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6UThXOFY4VTgpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9WMTZVMTY6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6VjE2VTE2KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJY2FzZSBEM0RGTVRfQTJXMTBWMTBVMTA6CQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkEyVzEwVjEwVTEwKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkvLyBMdW1pbmFuY2UgZm9ybWF0cworCQkJY2FzZSBEM0RGTVRfTDg6CQkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6Okw4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX0E0TDQ6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZTo6QTRMNCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9BOEw4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWU6OkE4TDgpCQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJZGVmYXVsdDoKKwkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CisJCQl9CisJCWNhc2UgRDNEUlRZUEVfQ1VCRVRFWFRVUkU6CisJCQlpZih1c2FnZSAmIEQzRFVTQUdFX1JFTkRFUlRBUkdFVCkKKwkJCXsKKwkJCQlzd2l0Y2goY2hlY2tGb3JtYXQpCisJCQkJeworCQkJCWNhc2UgRDNERk1UX1I4RzhCODoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OlI4RzhCOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1I1RzZCNToJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OlI1RzZCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1gxUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpYMVI1RzVCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0ExUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBMVI1RzVCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBNFI0RzRCNCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1IzRzNCMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSZW5kZXJUYXJnZXQ6OlIzRzNCMikJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E4UjNHM0IyOgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBOFIzRzNCMikJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1g0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpYNFI0RzRCNCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E4UjhHOEI4OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBOFI4RzhCOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1g4UjhHOEI4OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpYOFI4RzhCOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKKwkJCQljYXNlIEQzREZNVF9HMTZSMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpHMTZSMTYpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BMkIxMEcxMFIxMDoJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UmVuZGVyVGFyZ2V0OjpBMkIxMEcxMFIxMCkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYodXNhZ2UgJiBEM0RVU0FHRV9ERVBUSFNURU5DSUwpCisJCQl7CisJCQkJc3dpdGNoKGNoZWNrRm9ybWF0KQorCQkJCXsKKwkJCQljYXNlIEQzREZNVF9EMzI6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RGVwdGhTdGVuY2lsOjpEMzIpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfRDI0Uzg6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RGVwdGhTdGVuY2lsOjpEMjRTOCkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9EMjRYODoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEZXB0aFN0ZW5jaWw6OkQyNFg4KQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0QxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEZXB0aFN0ZW5jaWw6OkQxNikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXN3aXRjaChjaGVja0Zvcm1hdCkKKwkJCQl7CisJCQkJY2FzZSBEM0RGTVRfQTg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkE4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9SNUc2QjU6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UjVHNkI1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1gxUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6WDFSNUc1QjUpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BMVI1RzVCNToJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkExUjVHNUI1KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQTRSNEc0QjQ6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBNFI0RzRCNCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1IzRzNCMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpSM0czQjIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQThSM0czQjI6CQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBOFIzRzNCMikJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1g0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6WDRSNEc0QjQpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9SOEc4Qjg6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6UjhHOEI4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1g4UjhHOEI4OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6WDhSOEc4QjgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkE4UjhHOEI4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJLy8gUGFsZXR0ZWQgZm9ybWF0cworCQkJCWNhc2UgRDNERk1UX1A4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpQOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQThQODoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBOFA4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKKwkJCQljYXNlIEQzREZNVF9HMTZSMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RzE2UjE2KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOglpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBMkIxMEcxMFIxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCS8vIENvbXByZXNzZWQgZm9ybWF0cworCQkJCWNhc2UgRDNERk1UX0RYVDE6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RFhUMSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9EWFQyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRYVDIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfRFhUMzoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpEWFQzKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0RYVDQ6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6RFhUNCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9EWFQ1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OkRYVDUpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJLy8gQnVtcCBtYXAgZm9ybWF0cworCQkJCWNhc2UgRDNERk1UX1Y4VTg6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6VjhVOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9MNlY1VTU6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6TDZWNVU1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1g4TDhWOFU4OgkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6WDhMOFY4VTgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9ROFc4VjhVODoJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlE4VzhWOFU4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfVjE2VTE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OkN1YmVNYXA6OlYxNlUxNikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BMlcxMFYxMFUxMDoJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6QTJXMTBWMTBVMTApCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQkvLyBMdW1pbmFuY2UgZm9ybWF0cworCQkJCWNhc2UgRDNERk1UX0w4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpMOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQTRMNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpDdWJlTWFwOjpBNEw0KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E4TDg6CQkJaWYoIUNhcGFiaWxpdGllczo6Q3ViZU1hcDo6QThMOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CisJCQkJfQorCQkJfQorCQljYXNlIEQzRFJUWVBFX1ZPTFVNRVRFWFRVUkU6CisJCQlzd2l0Y2goY2hlY2tGb3JtYXQpCisJCQl7CisJCQljYXNlIEQzREZNVF9BODoJCQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkE4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9SNUc2QjU6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlI1RzZCNSkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9YMVI1RzVCNToJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpYMVI1RzVCNSkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9BMVI1RzVCNToJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBMVI1RzVCNSkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9BNFI0RzRCNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBNFI0RzRCNCkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9SM0czQjI6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlIzRzNCMikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9BOFIzRzNCMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBOFIzRzNCMikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9YNFI0RzRCNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpYNFI0RzRCNCkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9SOEc4Qjg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlI4RzhCOCkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9YOFI4RzhCODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpYOFI4RzhCOCkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9BOFI4RzhCODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBOFI4RzhCOCkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkvLyBQYWxldHRlZCBmb3JtYXRzCisJCQljYXNlIEQzREZNVF9QODoJCQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlA4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9BOFA4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpBOFA4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkvLyBJbnRlZ2VyIEhEUiBmb3JtYXRzCisJCQljYXNlIEQzREZNVF9HMTZSMTY6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkcxNlIxNikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9BMkIxMEcxMFIxMDoJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkEyQjEwRzEwUjEwKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJLy8gQ29tcHJlc3NlZCBmb3JtYXRzCisJCQljYXNlIEQzREZNVF9EWFQxOgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpEWFQxKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9EWFQyOgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpEWFQyKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9EWFQzOgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpEWFQzKQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9EWFQ0OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpEWFQ0KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9EWFQ1OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpEWFQ1KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkvLyBCdW1wIG1hcCBmb3JtYXRzCisJCQljYXNlIEQzREZNVF9WOFU4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpWOFU4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9MNlY1VTU6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6Okw2VjVVNSkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9YOEw4VjhVODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpYOEw4VjhVOCkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9ROFc4VjhVODoJCQlpZighQ2FwYWJpbGl0aWVzOjpWb2x1bWVUZXh0dXJlOjpROFc4VjhVOCkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9WMTZVMTY6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OlYxNlUxNikJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQljYXNlIEQzREZNVF9BMlcxMFYxMFUxMDoJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkEyVzEwVjEwVTEwKQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJLy8gTHVtaW5hbmNlIGZvcm1hdHMKKwkJCWNhc2UgRDNERk1UX0w4OgkJCQkJaWYoIUNhcGFiaWxpdGllczo6Vm9sdW1lVGV4dHVyZTo6TDgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX0E0TDQ6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkE0TDQpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWNhc2UgRDNERk1UX0E4TDg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlZvbHVtZVRleHR1cmU6OkE4TDgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOworCQkJfQorCQljYXNlIEQzRFJUWVBFX1RFWFRVUkU6CisJCQlpZih1c2FnZSAmIEQzRFVTQUdFX1JFTkRFUlRBUkdFVCkKKwkJCXsKKwkJCQlzd2l0Y2goY2hlY2tGb3JtYXQpCisJCQkJeworCQkJCWNhc2UgRDNERk1UX1I4RzhCODoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OlI4RzhCOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1I1RzZCNToJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OlI1RzZCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1gxUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpYMVI1RzVCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0ExUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBMVI1RzVCNSkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBNFI0RzRCNCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1IzRzNCMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSZW5kZXJUYXJnZXQ6OlIzRzNCMikJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E4UjNHM0IyOgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBOFIzRzNCMikJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1g0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpYNFI0RzRCNCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E4UjhHOEI4OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBOFI4RzhCOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1g4UjhHOEI4OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpYOFI4RzhCOCkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKKwkJCQljYXNlIEQzREZNVF9HMTZSMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpHMTZSMTYpCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BMkIxMEcxMFIxMDoJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UmVuZGVyVGFyZ2V0OjpBMkIxMEcxMFIxMCkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJZGVmYXVsdDoKKwkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOworCQkJCX0KKwkJCX0KKwkJCWVsc2UgaWYodXNhZ2UgJiBEM0RVU0FHRV9ERVBUSFNURU5DSUwpCisJCQl7CisJCQkJc3dpdGNoKGNoZWNrRm9ybWF0KQorCQkJCXsKKwkJCQljYXNlIEQzREZNVF9EMzI6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpEMzIpCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfRDI0Uzg6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RGVwdGhTdGVuY2lsOjpEMjRTOCkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9EMjRYODoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQyNFg4KQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0QxNjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEZXB0aFN0ZW5jaWw6OkQxNikJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXN3aXRjaChjaGVja0Zvcm1hdCkKKwkJCQl7CisJCQkJY2FzZSBEM0RGTVRfQTg6CQkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkE4KQkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9SNUc2QjU6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UjVHNkI1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1gxUjVHNUI1OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6WDFSNUc1QjUpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BMVI1RzVCNToJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkExUjVHNUI1KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQTRSNEc0QjQ6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBNFI0RzRCNCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1IzRzNCMjoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpSM0czQjIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQThSM0czQjI6CQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBOFIzRzNCMikJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1g0UjRHNEI0OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6WDRSNEc0QjQpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9SOEc4Qjg6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6UjhHOEI4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1g4UjhHOEI4OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6WDhSOEc4QjgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BOFI4RzhCODoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkE4UjhHOEI4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJLy8gUGFsZXR0ZWQgZm9ybWF0cworCQkJCWNhc2UgRDNERk1UX1A4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpQOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQThQODoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBOFA4KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCS8vIEludGVnZXIgSERSIGZvcm1hdHMKKwkJCQljYXNlIEQzREZNVF9HMTZSMTY6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RzE2UjE2KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOglpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBMkIxMEcxMFIxMCkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCS8vIENvbXByZXNzZWQgZm9ybWF0cworCQkJCWNhc2UgRDNERk1UX0RYVDE6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RFhUMSkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9EWFQyOgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRYVDIpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfRFhUMzoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpEWFQzKQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0RYVDQ6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6RFhUNCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9EWFQ1OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OkRYVDUpCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJLy8gQnVtcCBtYXAgZm9ybWF0cworCQkJCWNhc2UgRDNERk1UX1Y4VTg6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6VjhVOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9MNlY1VTU6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6TDZWNVU1KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX1g4TDhWOFU4OgkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6WDhMOFY4VTgpCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9ROFc4VjhVODoJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlE4VzhWOFU4KQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfVjE2VTE2OgkJCWlmKCFDYXBhYmlsaXRpZXM6OlRleHR1cmU6OlYxNlUxNikJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQljYXNlIEQzREZNVF9BMlcxMFYxMFUxMDoJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QTJXMTBWMTBVMTApCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQkvLyBMdW1pbmFuY2UgZm9ybWF0cworCQkJCWNhc2UgRDNERk1UX0w4OgkJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpMOCkJCQkJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOwllbHNlIHJldHVybiBEM0RfT0s7CisJCQkJY2FzZSBEM0RGTVRfQTRMNDoJCQlpZighQ2FwYWJpbGl0aWVzOjpUZXh0dXJlOjpBNEw0KQkJCQkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsJZWxzZSByZXR1cm4gRDNEX09LOworCQkJCWNhc2UgRDNERk1UX0E4TDg6CQkJaWYoIUNhcGFiaWxpdGllczo6VGV4dHVyZTo6QThMOCkJCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CWVsc2UgcmV0dXJuIEQzRF9PSzsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gTk9UQVZBSUxBQkxFKCk7CisJCQkJfQorCQkJfQorCQljYXNlIEQzRFJUWVBFX1ZFUlRFWEJVRkZFUjoKKwkJCWlmKGNoZWNrRm9ybWF0ID09IEQzREZNVF9WRVJURVhEQVRBKQorCQkJeworCQkJCXJldHVybiBEM0RfT0s7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOworCQkJfQorCQljYXNlIEQzRFJUWVBFX0lOREVYQlVGRkVSOgorCQkJc3dpdGNoKGNoZWNrRm9ybWF0KQorCQkJeworCQkJY2FzZSBEM0RGTVRfSU5ERVgxNjoKKwkJCWNhc2UgRDNERk1UX0lOREVYMzI6CisJCQkJcmV0dXJuIEQzRF9PSzsKKwkJCWRlZmF1bHQ6CisJCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOworCQkJfTsKKwkJZGVmYXVsdDoKKwkJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKKwkJfQorCX0KKworCWxvbmcgRGlyZWN0M0Q4OjpDaGVja0RldmljZU11bHRpU2FtcGxlVHlwZSh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNEREVWVFlQRSBkZXZpY2VUeXBlLCBEM0RGT1JNQVQgc3VyZmFjZUZvcm1hdCwgaW50IHdpbmRvd2VkLCBEM0RNVUxUSVNBTVBMRV9UWVBFIG11bHRpU2FtcGxlVHlwZSkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZihkZXZpY2VUeXBlICE9IEQzRERFVlRZUEVfSEFMKQorCQl7CisJCQlsb2FkU3lzdGVtRDNEOCgpOworCisJCQlpZihkM2Q4KQorCQkJeworCQkJCXJldHVybiBkM2Q4LT5DaGVja0RldmljZU11bHRpU2FtcGxlVHlwZShhZGFwdGVyLCBkZXZpY2VUeXBlLCBzdXJmYWNlRm9ybWF0LCB3aW5kb3dlZCwgbXVsdGlTYW1wbGVUeXBlKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4gQ2hlY2tEZXZpY2VNdWx0aVNhbXBsZVR5cGUoYWRhcHRlciwgRDNEREVWVFlQRV9IQUwsIHN1cmZhY2VGb3JtYXQsIHdpbmRvd2VkLCBtdWx0aVNhbXBsZVR5cGUpOworCQkJfQorCQl9CisKKwkJaWYoYWRhcHRlciA+PSBHZXRBZGFwdGVyQ291bnQoKSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlpZihtdWx0aVNhbXBsZVR5cGUgPT0gRDNETVVMVElTQU1QTEVfTk9ORSB8fAorCQkgICBtdWx0aVNhbXBsZVR5cGUgPT0gRDNETVVMVElTQU1QTEVfMl9TQU1QTEVTIHx8CisJCSAgIG11bHRpU2FtcGxlVHlwZSA9PSBEM0RNVUxUSVNBTVBMRV80X1NBTVBMRVMgfHwKKwkJICAgbXVsdGlTYW1wbGVUeXBlID09IEQzRE1VTFRJU0FNUExFXzhfU0FNUExFUyB8fAorCQkgICBtdWx0aVNhbXBsZVR5cGUgPT0gRDNETVVMVElTQU1QTEVfMTZfU0FNUExFUykKKwkJeworCQkJaWYoc3VyZmFjZUZvcm1hdCAhPSBEM0RGTVRfVU5LTk9XTikKKwkJCXsKKwkJCQlyZXR1cm4gRDNEX09LOwkKKwkJCX0KKwkJfQorCisJCXJldHVybiBOT1RBVkFJTEFCTEUoKTsKKwl9CisKKwlsb25nIERpcmVjdDNEODo6Q2hlY2tEZXZpY2VUeXBlKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGNoZWNrVHlwZSwgRDNERk9STUFUIGRpc3BsYXlGb3JtYXQsIEQzREZPUk1BVCBiYWNrQnVmZmVyRm9ybWF0LCBpbnQgd2luZG93ZWQpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoY2hlY2tUeXBlICE9IEQzRERFVlRZUEVfSEFMKQorCQl7CisJCQlsb2FkU3lzdGVtRDNEOCgpOworCisJCQlpZihkM2Q4KQorCQkJeworCQkJCXJldHVybiBkM2Q4LT5DaGVja0RldmljZVR5cGUoYWRhcHRlciwgY2hlY2tUeXBlLCBkaXNwbGF5Rm9ybWF0LCBiYWNrQnVmZmVyRm9ybWF0LCB3aW5kb3dlZCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuIENoZWNrRGV2aWNlVHlwZShhZGFwdGVyLCBEM0RERVZUWVBFX0hBTCwgZGlzcGxheUZvcm1hdCwgYmFja0J1ZmZlckZvcm1hdCwgd2luZG93ZWQpOworCQkJfQorCQl9CisKKwkJcmV0dXJuIEQzRF9PSzsgICAvLyBUT0RPCisJfQorCisJbG9uZyBEaXJlY3QzRDg6OkNyZWF0ZURldmljZSh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNEREVWVFlQRSBkZXZpY2VUeXBlLCBIV05EIGZvY3VzV2luZG93LCB1bnNpZ25lZCBsb25nIGJlaGF2aW9yRmxhZ3MsIEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMsIElEaXJlY3QzRERldmljZTggKipyZXR1cm5lZERldmljZUludGVyZmFjZSkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZihkZXZpY2VUeXBlICE9IEQzRERFVlRZUEVfSEFMKQorCQl7CisJCQlsb2FkU3lzdGVtRDNEOCgpOworCisJCQlpZihkM2Q4KQorCQkJeworCQkJCXJldHVybiBkM2Q4LT5DcmVhdGVEZXZpY2UoYWRhcHRlciwgZGV2aWNlVHlwZSwgZm9jdXNXaW5kb3csIGJlaGF2aW9yRmxhZ3MsIHByZXNlbnRQYXJhbWV0ZXJzLCByZXR1cm5lZERldmljZUludGVyZmFjZSk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmV0dXJuIENyZWF0ZURldmljZShhZGFwdGVyLCBEM0RERVZUWVBFX0hBTCwgZm9jdXNXaW5kb3csIGJlaGF2aW9yRmxhZ3MsIHByZXNlbnRQYXJhbWV0ZXJzLCByZXR1cm5lZERldmljZUludGVyZmFjZSk7CisJCQl9CisJCX0KKworCQlpZighZm9jdXNXaW5kb3cgfHwgIXByZXNlbnRQYXJhbWV0ZXJzIHx8ICFyZXR1cm5lZERldmljZUludGVyZmFjZSkKKwkJeworCQkJKnJldHVybmVkRGV2aWNlSW50ZXJmYWNlID0gTlVMTDsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJaWYoIXN3OjpDUFVJRDo6c3VwcG9ydHNTU0UoKSkKKwkJeworCQkJcmV0dXJuIE5PVEFWQUlMQUJMRSgpOworCQl9CisKKwkJKnJldHVybmVkRGV2aWNlSW50ZXJmYWNlID0gbmV3IERpcmVjdDNERGV2aWNlOChpbnN0YW5jZSwgdGhpcywgYWRhcHRlciwgZGV2aWNlVHlwZSwgZm9jdXNXaW5kb3csIGJlaGF2aW9yRmxhZ3MsIHByZXNlbnRQYXJhbWV0ZXJzKTsKKworCQlpZigqcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UpCisJCXsKKwkJCSgqcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UpLT5BZGRSZWYoKTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRDg6OkVudW1BZGFwdGVyTW9kZXModW5zaWduZWQgaW50IGFkYXB0ZXIsIHVuc2lnbmVkIGludCBpbmRleCwgRDNERElTUExBWU1PREUgKm1vZGUpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoYWRhcHRlciAhPSBEM0RBREFQVEVSX0RFRkFVTFQgfHwgIW1vZGUpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJZm9yKGludCBpID0gMDsgaSA8IG51bURpc3BsYXlNb2RlczsgaSsrKQorCQl7CisJCQlpZihpbmRleC0tID09IDApCisJCQl7CisJCQkJbW9kZS0+V2lkdGggPSBkaXNwbGF5TW9kZVtpXS5kbVBlbHNXaWR0aDsKKwkJCQltb2RlLT5IZWlnaHQgPSBkaXNwbGF5TW9kZVtpXS5kbVBlbHNIZWlnaHQ7CisJCQkJbW9kZS0+UmVmcmVzaFJhdGUgPSBkaXNwbGF5TW9kZVtpXS5kbURpc3BsYXlGcmVxdWVuY3k7CisKKwkJCQlkaXNwbGF5TW9kZVtpXS5kbUJpdHNQZXJQZWwgPSAzMjsgICAvLyBGSVhNRQorCisJCQkJc3dpdGNoKGRpc3BsYXlNb2RlW2ldLmRtQml0c1BlclBlbCkKKwkJCQl7CisJCQkJY2FzZSA0OgorCQkJCQltb2RlLT5Gb3JtYXQgPSBEM0RGTVRfQTRMNDsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSA4OgorCQkJCQltb2RlLT5Gb3JtYXQgPSBEM0RGTVRfUDg7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMTY6CisJCQkJCW1vZGUtPkZvcm1hdCA9IEQzREZNVF9SNUc2QjU7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMjQ6CisJCQkJCW1vZGUtPkZvcm1hdCA9IEQzREZNVF9SOEc4Qjg7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMzI6CisJCQkJCW1vZGUtPkZvcm1hdCA9IEQzREZNVF9YOFI4RzhCODsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisKKwkJCQlyZXR1cm4gRDNEX09LOworCQkJfQorCQl9CisKKwkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJfQorCisJdW5zaWduZWQgaW50IERpcmVjdDNEODo6R2V0QWRhcHRlckNvdW50KCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gMTsgICAvLyBTd2lmdFNoYWRlciBkb2VzIG5vdCBzdXBwb3J0IG11bHRpcGxlIGRpc3BsYXkgYWRhcHRlcnMKKwl9CisKKwlsb25nIERpcmVjdDNEODo6R2V0QWRhcHRlckRpc3BsYXlNb2RlKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RESVNQTEFZTU9ERSAqbW9kZSkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZihhZGFwdGVyICE9IEQzREFEQVBURVJfREVGQVVMVCB8fCAhbW9kZSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlIREMgZGV2aWNlQ29udGV4dCA9IEdldERDKDApOworCQkJCisJCW1vZGUtPldpZHRoID0gOjpHZXREZXZpY2VDYXBzKGRldmljZUNvbnRleHQsIEhPUlpSRVMpOworCQltb2RlLT5IZWlnaHQgPSA6OkdldERldmljZUNhcHMoZGV2aWNlQ29udGV4dCwgVkVSVFJFUyk7CisJCW1vZGUtPlJlZnJlc2hSYXRlID0gOjpHZXREZXZpY2VDYXBzKGRldmljZUNvbnRleHQsIFZSRUZSRVNIKTsKKwkJdW5zaWduZWQgaW50IGJwcCA9IDo6R2V0RGV2aWNlQ2FwcyhkZXZpY2VDb250ZXh0LCBCSVRTUElYRUwpOworCisJCVJlbGVhc2VEQygwLCBkZXZpY2VDb250ZXh0KTsKKworCQlicHAgPSAzMjsgICAvLyBGSVhNRQorCisJCXN3aXRjaChicHApCisJCXsKKwkJY2FzZSAzMjogbW9kZS0+Rm9ybWF0ID0gRDNERk1UX1g4UjhHOEI4OyBicmVhazsKKwkJY2FzZSAyNDogbW9kZS0+Rm9ybWF0ID0gRDNERk1UX1I4RzhCODsgYnJlYWs7CisJCWNhc2UgMTY6IG1vZGUtPkZvcm1hdCA9IEQzREZNVF9SNUc2QjU7IGJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsgICAvLyBVbmV4cGVjdGVkIGRpc3BsYXkgbW9kZSBjb2xvciBkZXB0aAorCQl9CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNEODo6R2V0QWRhcHRlcklkZW50aWZpZXIodW5zaWduZWQgaW50IGFkYXB0ZXIsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIEQzREFEQVBURVJfSURFTlRJRklFUjggKmlkZW50aWZpZXIpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoIWlkZW50aWZpZXIpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisJCisJCXVuc2lnbmVkIHNob3J0IHByb2R1Y3QgPSAnc3cnOworCQl1bnNpZ25lZCBzaG9ydCB2ZXJzaW9uID0gMzsKKwkJdW5zaWduZWQgc2hvcnQgc3ViVmVyc2lvbiA9IDA7CisJCXVuc2lnbmVkIHNob3J0IHJldmlzaW9uID0gQlVJTERfUkVWSVNJT047CisJCUdVSUQgZ3VpZCA9IHsweDAwMDAwMDAwLCAweDAwMDAsIDB4MDAwMCwgezB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDB9fTsKKworCQlpZGVudGlmaWVyLT5Ecml2ZXJWZXJzaW9uLkhpZ2hQYXJ0ID0gcHJvZHVjdCA8PCAxNiB8IHZlcnNpb247CisJCWlkZW50aWZpZXItPkRyaXZlclZlcnNpb24uTG93UGFydCA9IHN1YlZlcnNpb24gPDwgMTYgfCByZXZpc2lvbjsKKwkJc3RyY3B5KGlkZW50aWZpZXItPkRyaXZlciwgIlN3aWZ0U2hhZGVyIik7CisJCXN0cmNweShpZGVudGlmaWVyLT5EZXNjcmlwdGlvbiwgIkdvb2dsZSBTd2lmdFNoYWRlciAzRCBSZW5kZXJlciIpOworCQlpZGVudGlmaWVyLT5WZW5kb3JJZCA9IDA7CisJCWlkZW50aWZpZXItPkRldmljZUlkID0gMDsKKwkJaWRlbnRpZmllci0+U3ViU3lzSWQgPSAwOworCQlpZGVudGlmaWVyLT5SZXZpc2lvbiA9IDA7CisJCWlkZW50aWZpZXItPkRldmljZUlkZW50aWZpZXIgPSBndWlkOworCQlpZGVudGlmaWVyLT5XSFFMTGV2ZWwgPSAwOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJdW5zaWduZWQgaW50IERpcmVjdDNEODo6R2V0QWRhcHRlck1vZGVDb3VudCh1bnNpZ25lZCBpbnQgYWRhcHRlcikKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZihhZGFwdGVyICE9IEQzREFEQVBURVJfREVGQVVMVCkKKwkJeworCQkJcmV0dXJuIDA7CisJCX0KKworCQlyZXR1cm4gbnVtRGlzcGxheU1vZGVzOworCX0KKworCUhNT05JVE9SIERpcmVjdDNEODo6R2V0QWRhcHRlck1vbml0b3IodW5zaWduZWQgaW50IGFkYXB0ZXIpCisJeworCQlUUkFDRSgiIik7CisKKwkJUE9JTlQgcG9pbnQgPSB7MCwgMH07CisKKwkJcmV0dXJuIE1vbml0b3JGcm9tUG9pbnQocG9pbnQsIE1PTklUT1JfREVGQVVMVFRPUFJJTUFSWSk7ICAgLy8gRklYTUU6IElnbm9yZXMgYWRhcHRlciBwYXJhbWV0ZXIKKwl9CisKKwlsb25nIERpcmVjdDNEODo6R2V0RGV2aWNlQ2Fwcyh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNEREVWVFlQRSBkZXZpY2VUeXBlLCBEM0RDQVBTOCAqY2FwYWJpbGl0aWVzKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKGRldmljZVR5cGUgIT0gRDNEREVWVFlQRV9IQUwpCisJCXsKKwkJCWxvYWRTeXN0ZW1EM0Q4KCk7CisKKwkJCWlmKGQzZDgpCisJCQl7CisJCQkJcmV0dXJuIGQzZDgtPkdldERldmljZUNhcHMoYWRhcHRlciwgZGV2aWNlVHlwZSwgY2FwYWJpbGl0aWVzKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZXR1cm4gR2V0RGV2aWNlQ2FwcyhhZGFwdGVyLCBEM0RERVZUWVBFX0hBTCwgY2FwYWJpbGl0aWVzKTsKKwkJCX0KKwkJfQorCisJCWlmKCFjYXBhYmlsaXRpZXMpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJRDNEQ0FQUzggY2FwczsKKwkJWmVyb01lbW9yeSgmY2Fwcywgc2l6ZW9mKEQzRENBUFM4KSk7CisKKwkJLy8gRGV2aWNlIGluZm8KKwkJY2Fwcy5EZXZpY2VUeXBlID0gRDNEREVWVFlQRV9IQUw7CisJCWNhcHMuQWRhcHRlck9yZGluYWwgPSBEM0RBREFQVEVSX0RFRkFVTFQ7CisKKwkJLy8gQ2FwcyBmcm9tIERYNworCQljYXBzLkNhcHMgPQkwOwkvLwlEM0RDQVBTX1JFQURfU0NBTkxJTkUKKworCQljYXBzLkNhcHMyID0JLy8JRDNEQ0FQUzJfQ0FOQ0FMSUJSQVRFR0FNTUEgfAkvLyBUaGUgc3lzdGVtIGhhcyBhIGNhbGlicmF0b3IgaW5zdGFsbGVkIHRoYXQgY2FuIGF1dG9tYXRpY2FsbHkgYWRqdXN0IHRoZSBnYW1tYSByYW1wIHNvIHRoYXQgdGhlIHJlc3VsdCBpcyBpZGVudGljYWwgb24gYWxsIHN5c3RlbXMgdGhhdCBoYXZlIGEgY2FsaWJyYXRvci4gVG8gaW52b2tlIHRoZSBjYWxpYnJhdG9yIHdoZW4gc2V0dGluZyBuZXcgZ2FtbWEgbGV2ZWxzLCB1c2UgdGhlIEQzRFNHUl9DQUxJQlJBVEUgZmxhZyB3aGVuIGNhbGxpbmcgSURpcmVjdDNERGV2aWNlODo6U2V0R2FtbWFSYW1wLiBDYWxpYnJhdGluZyBnYW1tYSByYW1wcyBpbmN1cnMgc29tZSBwcm9jZXNzaW5nIG92ZXJoZWFkIGFuZCBzaG91bGQgbm90IGJlIHVzZWQgZnJlcXVlbnRseS4gIAorCQkJCQkJCUQzRENBUFMyX0NBTlJFTkRFUldJTkRPV0VEIHwJLy8gVGhlIGRyaXZlciBpcyBjYXBhYmxlIG9mIHJlbmRlcmluZyBpbiB3aW5kb3dlZCBtb2RlLiAKKwkJCQkJCQlEM0RDQVBTMl9DQU5NQU5BR0VSRVNPVVJDRSB8CS8vIFRoZSBkcml2ZXIgaXMgY2FwYWJsZSBvZiBtYW5hZ2luZyByZXNvdXJjZXMuIE9uIHN1Y2ggZHJpdmVycywgRDNEUE9PTF9NQU5BR0VEIHJlc291cmNlcyB3aWxsIGJlIG1hbmFnZWQgYnkgdGhlIGRyaXZlci4gVG8gaGF2ZSBNaWNyb3NvZnSuIERpcmVjdDNEriBvdmVycmlkZSB0aGUgZHJpdmVyIHNvIHRoYXQgRGlyZWN0M0QgbWFuYWdlcyByZXNvdXJjZXMsIHVzZSB0aGUgRDNEQ1JFQVRFX0RJU0FCTEVfRFJJVkVSX01BTkFHRU1FTlQgZmxhZyB3aGVuIGNhbGxpbmcgSURpcmVjdDNEODo6Q3JlYXRlRGV2aWNlLiAKKwkJCQkJCQlEM0RDQVBTMl9EWU5BTUlDVEVYVFVSRVMgfAkJLy8gVGhlIGRyaXZlciBzdXBwb3J0cyBkeW5hbWljIHRleHR1cmVzLiAKKwkJCQkJCQlEM0RDQVBTMl9GVUxMU0NSRUVOR0FNTUE7CQkvLyBUaGUgZHJpdmVyIHN1cHBvcnRzIGR5bmFtaWMgZ2FtbWEgcmFtcCBhZGp1c3RtZW50IGluIGZ1bGwtc2NyZWVuIG1vZGUuCisJCQkJCQkvLwlEM0RDQVBTMl9OTzJERFVSSU5HM0RTQ0VORTsJCS8vIFdoZW4gdGhlIEQzRENBUFMyX05PMkREVVJJTkczRFNDRU5FIGNhcGFiaWxpdHkgaXMgc2V0IGJ5IHRoZSBkcml2ZXIsIGl0IG1lYW5zIHRoYXQgMi1EIG9wZXJhdGlvbnMgY2Fubm90IGJlIHBlcmZvcm1lZCBiZXR3ZWVuIGNhbGxzIHRvIElEaXJlY3QzRERldmljZTg6OkJlZ2luU2NlbmUgYW5kIElEaXJlY3QzRERldmljZTg6OkVuZFNjZW5lLiAKKworCQljYXBzLkNhcHMzID0gRDNEQ0FQUzNfQUxQSEFfRlVMTFNDUkVFTl9GTElQX09SX0RJU0NBUkQ7ICAgLy9UaGUgZGV2aWNlIHdpbGwgd29yayBhcyBleHBlY3RlZCB3aXRoIHRoZSBEM0RSU19BTFBIQUJMRU5ERU5BQkxFIHJlbmRlciBzdGF0ZSB3aGVuIGEgZnVsbC1zY3JlZW4gYXBwbGljYXRpb24gdXNlcyBEM0RTV0FQRUZGRUNUX0ZMSVAgb3IgRDNEUlNfU1dBUEVGRkVDVF9ESVNDQVJELiBEM0RSU19BTFBIQUJMRU5ERU5BQkxFIHdvcmtzIGFzIGV4cGVjdGVkIHdoZW4gdXNpbmcgRDNEU1dBUEVGRkVDVF9DT1BZIGFuZCBEM0RTV0FQRUZGRUNUX0NPUFlTWU5DCisKKwkJY2Fwcy5QcmVzZW50YXRpb25JbnRlcnZhbHMgPQkJRDNEUFJFU0VOVF9JTlRFUlZBTF9JTU1FRElBVEUgfAorCQkJCQkJCQkJCQlEM0RQUkVTRU5UX0lOVEVSVkFMX09ORTsKKwkJCQkJCQkJCQkvLwlEM0RQUkVTRU5UX0lOVEVSVkFMX1RXTzsKKwkJCQkJCQkJCQkvLwlEM0RQUkVTRU5UX0lOVEVSVkFMX1RIUkVFOworCQkJCQkJCQkJCS8vCUQzRFBSRVNFTlRfSU5URVJWQUxfRk9VUjsKKworCQkvLyBDdXJzb3IgY2FwcworCQljYXBzLkN1cnNvckNhcHMgPQlEM0RDVVJTT1JDQVBTX0NPTE9SCXwJLy8gQSBmdWxsLWNvbG9yIGN1cnNvciBpcyBzdXBwb3J0ZWQgaW4gaGFyZHdhcmUuIFNwZWNpZmljYWxseSwgdGhpcyBmbGFnIGluZGljYXRlcyB0aGF0IHRoZSBkcml2ZXIgc3VwcG9ydHMgYXQgbGVhc3QgYSBoYXJkd2FyZSBjb2xvciBjdXJzb3IgaW4gaGlnaC1yZXNvbHV0aW9uIG1vZGVzICh3aXRoIHNjYW4gbGluZXMgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDQwMCkuIAorCQkJCQkJCUQzRENVUlNPUkNBUFNfTE9XUkVTOwkvLyBBIGZ1bGwtY29sb3IgY3Vyc29yIGlzIHN1cHBvcnRlZCBpbiBoYXJkd2FyZS4gU3BlY2lmaWNhbGx5LCB0aGlzIGZsYWcgaW5kaWNhdGVzIHRoYXQgdGhlIGRyaXZlciBzdXBwb3J0cyBhIGhhcmR3YXJlIGNvbG9yIGN1cnNvciBpbiBib3RoIGhpZ2gtcmVzb2x1dGlvbiBhbmQgbG93LXJlc29sdXRpb24gbW9kZXMgKHdpdGggc2NhbiBsaW5lcyBsZXNzIHRoYW4gNDAwKS4gCisKKwkJLy8gM0QgRGV2aWNlIGNhcHMKKwkJY2Fwcy5EZXZDYXBzID0JCUQzRERFVkNBUFNfQ0FOQkxUU1lTVE9OT05MT0NBTCB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgYmxpdHMgZnJvbSBzeXN0ZW0tbWVtb3J5IHRleHR1cmVzIHRvIG5vbmxvY2FsIHZpZGVvLW1lbW9yeSB0ZXh0dXJlcy4gCisJCQkJCQkJRDNEREVWQ0FQU19DQU5SRU5ERVJBRlRFUkZMSVAgfAkJCS8vIERldmljZSBjYW4gcXVldWUgcmVuZGVyaW5nIGNvbW1hbmRzIGFmdGVyIGEgcGFnZSBmbGlwLiBBcHBsaWNhdGlvbnMgZG8gbm90IGNoYW5nZSB0aGVpciBiZWhhdmlvciBpZiB0aGlzIGZsYWcgaXMgc2V0OyB0aGlzIGNhcGFiaWxpdHkgbWVhbnMgdGhhdCB0aGUgZGV2aWNlIGlzIHJlbGF0aXZlbHkgZmFzdC4gCisJCQkJCQkJRDNEREVWQ0FQU19EUkFXUFJJTUlUSVZFUzIgfAkJCS8vIERldmljZSBjYW4gc3VwcG9ydCBEcmF3UHJpbWl0aXZlczIuCisJCQkJCQkJRDNEREVWQ0FQU19EUkFXUFJJTUlUSVZFUzJFWCB8CQkJLy8gRGV2aWNlIGNhbiBzdXBwb3J0IGV4dGVuZGVkIERyYXdQcmltaXRpdmVzMjsgdGhhdCBpcywgdGhpcyBpcyBhIERpcmVjdFggNy4wLWNvbXBsaWFudCBkcml2ZXIuCisJCQkJCQkJRDNEREVWQ0FQU19EUkFXUFJJTVRMVkVSVEVYIHwJCQkvLyBEZXZpY2UgZXhwb3J0cyBhbiBJRGlyZWN0M0REZXZpY2U4OjpEcmF3UHJpbWl0aXZlLWF3YXJlIGhhcmR3YXJlIGFic3RyYWN0aW9uIGxheWVyIChIQUwpLiAKKwkJCQkJCS8vCUQzRERFVkNBUFNfRVhFQ1VURVNZU1RFTU1FTU9SWSB8CQkvLyBEZXZpY2UgY2FuIHVzZSBleGVjdXRlIGJ1ZmZlcnMgZnJvbSBzeXN0ZW0gbWVtb3J5LgorCQkJCQkJLy8JRDNEREVWQ0FQU19FWEVDVVRFVklERU9NRU1PUlkgfAkJCS8vIERldmljZSBjYW4gdXNlIGV4ZWN1dGUgYnVmZmVycyBmcm9tIHZpZGVvIG1lbW9yeS4gCisJCQkJCQkJRDNEREVWQ0FQU19IV1JBU1RFUklaQVRJT04gfAkJCS8vIERldmljZSBoYXMgaGFyZHdhcmUgYWNjZWxlcmF0aW9uIGZvciBzY2VuZSByYXN0ZXJpemF0aW9uLiAKKwkJCQkJCQlEM0RERVZDQVBTX0hXVFJBTlNGT1JNQU5ETElHSFQgfAkJLy8gRGV2aWNlIGNhbiBzdXBwb3J0IHRyYW5zZm9ybWF0aW9uIGFuZCBsaWdodGluZyBpbiBoYXJkd2FyZS4gCisJCQkJCQkvLwlEM0RERVZDQVBTX05QQVRDSEVTIHwJCQkJCS8vIERldmljZSBzdXBwb3J0cyBOIHBhdGNoZXMuIAorCQkJCQkJCUQzRERFVkNBUFNfUFVSRURFVklDRSB8CQkJCQkvLyBEZXZpY2UgY2FuIHN1cHBvcnQgcmFzdGVyaXphdGlvbiwgdHJhbnNmb3JtLCBsaWdodGluZywgYW5kIHNoYWRpbmcgaW4gaGFyZHdhcmUuIAorCQkJCQkJLy8JRDNEREVWQ0FQU19RVUlOVElDUlRQQVRDSEVTIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcXVpbnRpYyBC6XppZXIgY3VydmVzIGFuZCBCLXNwbGluZXMuIAorCQkJCQkJLy8JRDNEREVWQ0FQU19SVFBBVENIRVMgfAkJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIHJlY3Rhbmd1bGFyIGFuZCB0cmlhbmd1bGFyIHBhdGNoZXMuIAorCQkJCQkJCUQzRERFVkNBUFNfUlRQQVRDSEhBTkRMRVpFUk8gfAkJCS8vIFdoZW4gdGhpcyBkZXZpY2UgY2FwYWJpbGl0eSBpcyBzZXQsIHRoZSBoYXJkd2FyZSBhcmNoaXRlY3R1cmUgZG9lcyBub3QgcmVxdWlyZSBjYWNoaW5nIG9mIGFueSBpbmZvcm1hdGlvbiBhbmQgdW5jYWNoZWQgcGF0Y2hlcyAoaGFuZGxlIHplcm8pIHdpbGwgYmUgZHJhd24gYXMgZWZmaWNpZW50bHkgYXMgY2FjaGVkIG9uZXMuIE5vdGUgdGhhdCBzZXR0aW5nIEQzRERFVkNBUFNfUlRQQVRDSEhBTkRMRVpFUk8gZG9lcyBub3QgbWVhbiB0aGF0IGEgcGF0Y2ggd2l0aCBoYW5kbGUgemVybyBjYW4gYmUgZHJhd24uIEEgaGFuZGxlLXplcm8gcGF0Y2ggY2FuIGFsd2F5cyBiZSBkcmF3biB3aGV0aGVyIHRoaXMgY2FwIGlzIHNldCBvciBub3QuIAorCQkJCQkJLy8JRDNEREVWQ0FQU19TRVBBUkFURVRFWFRVUkVNRU1PUklFUyB8CS8vIERldmljZSBpcyB0ZXh0dXJpbmcgZnJvbSBzZXBhcmF0ZSBtZW1vcnkgcG9vbHMuIAorCQkJCQkJCUQzRERFVkNBUFNfVEVYVFVSRU5PTkxPQ0FMVklETUVNIHwJCS8vIERldmljZSBjYW4gcmV0cmlldmUgdGV4dHVyZXMgZnJvbSBub24tbG9jYWwgdmlkZW8gbWVtb3J5LiAKKwkJCQkJCQlEM0RERVZDQVBTX1RFWFRVUkVTWVNURU1NRU1PUlkgfAkJLy8gRGV2aWNlIGNhbiByZXRyaWV2ZSB0ZXh0dXJlcyBmcm9tIHN5c3RlbSBtZW1vcnkuIAorCQkJCQkJCUQzRERFVkNBUFNfVEVYVFVSRVZJREVPTUVNT1JZIHwJCQkvLyBEZXZpY2UgY2FuIHJldHJpZXZlIHRleHR1cmVzIGZyb20gZGV2aWNlIG1lbW9yeS4gCisJCQkJCQkJRDNEREVWQ0FQU19UTFZFUlRFWFNZU1RFTU1FTU9SWSB8CQkvLyBEZXZpY2UgY2FuIHVzZSBidWZmZXJzIGZyb20gc3lzdGVtIG1lbW9yeSBmb3IgdHJhbnNmb3JtZWQgYW5kIGxpdCB2ZXJ0aWNlcy4gCisJCQkJCQkJRDNEREVWQ0FQU19UTFZFUlRFWFZJREVPTUVNT1JZOwkJCS8vIERldmljZSBjYW4gdXNlIGJ1ZmZlcnMgZnJvbSB2aWRlbyBtZW1vcnkgZm9yIHRyYW5zZm9ybWVkIGFuZCBsaXQgdmVydGljZXMuCisKKwkJY2Fwcy5QcmltaXRpdmVNaXNjQ2FwcyA9IAkJRDNEUE1JU0NDQVBTX0JMRU5ET1AgfCAJCQkJCS8vIERldmljZSBzdXBwb3J0cyB0aGUgYWxwaGEtYmxlbmRpbmcgb3BlcmF0aW9ucyBkZWZpbmVkIGluIHRoZSBEM0RCTEVORE9QIGVudW1lcmF0ZWQgdHlwZS4gCisJCQkJCQkJCQkJRDNEUE1JU0NDQVBTX0NMSVBQTEFORVNDQUxFRFBPSU5UUyB8CS8vIERldmljZSBjb3JyZWN0bHkgY2xpcHMgc2NhbGVkIHBvaW50cyBvZiBzaXplIGdyZWF0ZXIgdGhhbiAxLjAgdG8gdXNlci1kZWZpbmVkIGNsaXBwaW5nIHBsYW5lcy4gCisJCQkJCQkJCQkJRDNEUE1JU0NDQVBTX0NMSVBUTFZFUlRTIHwJCQkJLy8gRGV2aWNlIGNsaXBzIHBvc3QtdHJhbnNmb3JtZWQgdmVydGV4IHByaW1pdGl2ZXMuIAorCQkJCQkJCQkJCUQzRFBNSVNDQ0FQU19DT0xPUldSSVRFRU5BQkxFIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLWNoYW5uZWwgd3JpdGVzIGZvciB0aGUgcmVuZGVyIHRhcmdldCBjb2xvciBidWZmZXIgdGhyb3VnaCB0aGUgRDNEUlNfQ09MT1JXUklURUVOQUJMRSBzdGF0ZS4gCisJCQkJCQkJCQkJRDNEUE1JU0NDQVBTX0NVTExDQ1cgfAkJCQkJLy8gVGhlIGRyaXZlciBzdXBwb3J0cyBjb3VudGVyY2xvY2t3aXNlIGN1bGxpbmcgdGhyb3VnaCB0aGUgRDNEUlNfQ1VMTE1PREUgc3RhdGUuIChUaGlzIGFwcGxpZXMgb25seSB0byB0cmlhbmdsZSBwcmltaXRpdmVzLikgVGhpcyBmbGFnIGNvcnJlc3BvbmRzIHRvIHRoZSBEM0RDVUxMX0NDVyBtZW1iZXIgb2YgdGhlIEQzRENVTEwgZW51bWVyYXRlZCB0eXBlLiAKKwkJCQkJCQkJCQlEM0RQTUlTQ0NBUFNfQ1VMTENXIHwJCQkJCS8vIFRoZSBkcml2ZXIgc3VwcG9ydHMgY2xvY2t3aXNlIHRyaWFuZ2xlIGN1bGxpbmcgdGhyb3VnaCB0aGUgRDNEUlNfQ1VMTE1PREUgc3RhdGUuIChUaGlzIGFwcGxpZXMgb25seSB0byB0cmlhbmdsZSBwcmltaXRpdmVzLikgVGhpcyBmbGFnIGNvcnJlc3BvbmRzIHRvIHRoZSBEM0RDVUxMX0NXIG1lbWJlciBvZiB0aGUgRDNEQ1VMTCBlbnVtZXJhdGVkIHR5cGUuIAorCQkJCQkJCQkJCUQzRFBNSVNDQ0FQU19DVUxMTk9ORSB8CQkJCQkvLyBUaGUgZHJpdmVyIGRvZXMgbm90IHBlcmZvcm0gdHJpYW5nbGUgY3VsbGluZy4gVGhpcyBjb3JyZXNwb25kcyB0byB0aGUgRDNEQ1VMTF9OT05FIG1lbWJlciBvZiB0aGUgRDNEQ1VMTCBlbnVtZXJhdGVkIHR5cGUuIAorCQkJCQkJCQkJLy8JRDNEUE1JU0NDQVBTX0xJTkVQQVRURVJOUkVQCXwJCQkvLyBUaGUgZHJpdmVyIGNhbiBoYW5kbGUgdmFsdWVzIG90aGVyIHRoYW4gMSBpbiB0aGUgd1JlcGVhdEZhY3RvciBtZW1iZXIgb2YgdGhlIEQzRExJTkVQQVRURVJOIHN0cnVjdHVyZS4gKFRoaXMgYXBwbGllcyBvbmx5IHRvIGxpbmUtZHJhd2luZyBwcmltaXRpdmVzLikgCisJCQkJCQkJCQkJRDNEUE1JU0NDQVBTX01BU0taIHwJCQkJCS8vIERldmljZSBjYW4gZW5hYmxlIGFuZCBkaXNhYmxlIG1vZGlmaWNhdGlvbiBvZiB0aGUgZGVwdGggYnVmZmVyIG9uIHBpeGVsIG9wZXJhdGlvbnMuIAorCQkJCQkJCQkJCUQzRFBNSVNDQ0FQU19UU1NBUkdURU1QOwkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgRDNEVEFfVEVNUCBmb3IgdGVtcG9yYXJ5IHJlZ2lzdGVyLgorCisJCWNhcHMuUmFzdGVyQ2FwcyA9CQlEM0RQUkFTVEVSQ0FQU19BTklTT1RST1BZIHwJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIGFuaXNvdHJvcGljIGZpbHRlcmluZy4gCisJCQkJCQkJLy8JRDNEUFJBU1RFUkNBUFNfQU5USUFMSUFTRURHRVMgfAkJCS8vIERldmljZSBjYW4gYW50aWFsaWFzIGxpbmVzIGZvcm1pbmcgdGhlIGNvbnZleCBvdXRsaW5lIG9mIG9iamVjdHMuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgRDNEUlNfRURHRUFOVElBTElBUy4KKwkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfQ09MT1JQRVJTUEVDVElWRSB8CQkvLyBEZXZpY2UgaXRlcmF0ZXMgY29sb3JzIHBlcnNwZWN0aXZlIGNvcnJlY3RseS4gCisJCQkJCQkJLy8JRDNEUFJBU1RFUkNBUFNfRElUSEVSIHwJCQkJCS8vIERldmljZSBjYW4gZGl0aGVyIHRvIGltcHJvdmUgY29sb3IgcmVzb2x1dGlvbi4gCisJCQkJCQkJCUQzRFBSQVNURVJDQVBTX1pCSUFTIHwJCQkJCS8vIERldmljZSBzdXBwb3J0cyBsZWdhY3kgZGVwdGggYmlhcy4gRm9yIHRydWUgZGVwdGggYmlhcywgc2VlIEQzRFBSQVNURVJDQVBTX1NMT1BFU0NBTEVERVBUSEJJQVMuCisJCQkJCQkJCUQzRFBSQVNURVJDQVBTX0ZPR1JBTkdFIHwJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIHJhbmdlLWJhc2VkIGZvZy4gSW4gcmFuZ2UtYmFzZWQgZm9nLCB0aGUgZGlzdGFuY2Ugb2YgYW4gb2JqZWN0IGZyb20gdGhlIHZpZXdlciBpcyB1c2VkIHRvIGNvbXB1dGUgZm9nIGVmZmVjdHMsIG5vdCB0aGUgZGVwdGggb2YgdGhlIG9iamVjdCAodGhhdCBpcywgdGhlIHotY29vcmRpbmF0ZSkgaW4gdGhlIHNjZW5lLiAKKwkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfRk9HVEFCTEUgfAkJCQkvLyBEZXZpY2UgY2FsY3VsYXRlcyB0aGUgZm9nIHZhbHVlIGJ5IHJlZmVycmluZyB0byBhIGxvb2t1cCB0YWJsZSBjb250YWluaW5nIGZvZyB2YWx1ZXMgdGhhdCBhcmUgaW5kZXhlZCB0byB0aGUgZGVwdGggb2YgYSBnaXZlbiBwaXhlbC4gCisJCQkJCQkJCUQzRFBSQVNURVJDQVBTX0ZPR1ZFUlRFWCB8CQkJCS8vIERldmljZSBjYWxjdWxhdGVzIHRoZSBmb2cgdmFsdWUgZHVyaW5nIHRoZSBsaWdodGluZyBvcGVyYXRpb24gYW5kIGludGVycG9sYXRlcyB0aGUgZm9nIHZhbHVlIGR1cmluZyByYXN0ZXJpemF0aW9uLiAKKwkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfTUlQTUFQTE9EQklBUyB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIGxldmVsIG9mIGRldGFpbCAoTE9EKSBiaWFzIGFkanVzdG1lbnRzLiBUaGVzZSBiaWFzIGFkanVzdG1lbnRzIGVuYWJsZSBhbiBhcHBsaWNhdGlvbiB0byBtYWtlIGEgbWlwbWFwIGFwcGVhciBjcmlzcGVyIG9yIGxlc3Mgc2hhcnAgdGhhbiBpdCBub3JtYWxseSB3b3VsZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgTE9EIGJpYXMgaW4gbWlwbWFwcywgc2VlIEQzRFNBTVBfTUlQTUFQTE9EQklBUy4KKwkJCQkJCQkvLwlEM0RQUkFTVEVSQ0FQU19QQVQgfAkJCQkJLy8gVGhlIGRyaXZlciBjYW4gcGVyZm9ybSBwYXR0ZXJuZWQgZHJhd2luZyBsaW5lcyBvciBmaWxscyB3aXRoIEQzRFJTX0xJTkVQQVRURVJOIGZvciB0aGUgcHJpbWl0aXZlIGJlaW5nIHF1ZXJpZWQuIAorCQkJCQkJCS8vCUQzRFBSQVNURVJDQVBTX1NUUkVUQ0hCTFRNVUxUSVNBTVBMRSB8CS8vIERldmljZSBwcm92aWRlcyBsaW1pdGVkIG11bHRpc2FtcGxlIHN1cHBvcnQgdGhyb3VnaCBhIHN0cmV0Y2gtYmx0IGltcGxlbWVudGF0aW9uLiBXaGVuIHRoaXMgY2FwYWJpbGl0eSBpcyBzZXQsIEQzRFJTX01VTFRJU0FNUExFQU5USUFMSUFTIGNhbm5vdCBiZSB0dXJuZWQgb24gYW5kIG9mZiBpbiB0aGUgbWlkZGxlIG9mIGEgc2NlbmUuIE11bHRpc2FtcGxlIG1hc2tpbmcgY2Fubm90IGJlIHBlcmZvcm1lZCBpZiB0aGlzIGZsYWcgaXMgc2V0LiAKKwkJCQkJCQkvLwlEM0RQUkFTVEVSQ0FQU19XQlVGRkVSIHwJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIGRlcHRoIGJ1ZmZlcmluZyB1c2luZyB3LiAKKwkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfV0ZPRyB8CQkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgdy1iYXNlZCBmb2cuIFctYmFzZWQgZm9nIGlzIHVzZWQgd2hlbiBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4IGlzIHNwZWNpZmllZCwgYnV0IGFmZmluZSBwcm9qZWN0aW9ucyBzdGlsbCB1c2Ugei1iYXNlZCBmb2cuIFRoZSBzeXN0ZW0gY29uc2lkZXJzIGEgcHJvamVjdGlvbiBtYXRyaXggdGhhdCBjb250YWlucyBhIG5vbnplcm8gdmFsdWUgaW4gdGhlIFszXVs0XSBlbGVtZW50IHRvIGJlIGEgcGVyc3BlY3RpdmUgcHJvamVjdGlvbiBtYXRyaXguIAorCQkJCQkJCQlEM0RQUkFTVEVSQ0FQU19aQklBUyB8CQkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgei1iaWFzIHZhbHVlcy4gVGhlc2UgYXJlIGludGVnZXIgdmFsdWVzIGFzc2lnbmVkIHRvIHBvbHlnb25zIHRoYXQgYWxsb3cgcGh5c2ljYWxseSBjb3BsYW5hciBwb2x5Z29ucyB0byBhcHBlYXIgc2VwYXJhdGUuIEZvciBtb3JlIGluZm9ybWF0aW9uLCBzZWUgRDNEUlNfWkJJQVMuIAorCQkJCQkJCS8vCUQzRFBSQVNURVJDQVBTX1pCVUZGRVJMRVNTSFNSIHwJCQkvLyBEZXZpY2UgY2FuIHBlcmZvcm0gaGlkZGVuLXN1cmZhY2UgcmVtb3ZhbCAoSFNSKSB3aXRob3V0IHJlcXVpcmluZyB0aGUgYXBwbGljYXRpb24gdG8gc29ydCBwb2x5Z29ucyBhbmQgd2l0aG91dCByZXF1aXJpbmcgdGhlIGFsbG9jYXRpb24gb2YgYSBkZXB0aC1idWZmZXIuIFRoaXMgbGVhdmVzIG1vcmUgdmlkZW8gbWVtb3J5IGZvciB0ZXh0dXJlcy4gVGhlIG1ldGhvZCB1c2VkIHRvIHBlcmZvcm0gSFNSIGlzIGhhcmR3YXJlLWRlcGVuZGVudCBhbmQgaXMgdHJhbnNwYXJlbnQgdG8gdGhlIGFwcGxpY2F0aW9uLiBaLWJ1ZmZlcmxlc3MgSFNSIGlzIHBlcmZvcm1lZCBpZiBubyBkZXB0aC1idWZmZXIgc3VyZmFjZSBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlbmRlcmluZy10YXJnZXQgc3VyZmFjZSBhbmQgdGhlIGRlcHRoLWJ1ZmZlciBjb21wYXJpc29uIHRlc3QgaXMgZW5hYmxlZCAodGhhdCBpcywgd2hlbiB0aGUgc3RhdGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBEM0RSU19aRU5BQkxFIGVudW1lcmF0aW9uIGNvbnN0YW50IGlzIHNldCB0byBUUlVFKS4KKwkJCQkJCQkJRDNEUFJBU1RFUkNBUFNfWkZPRzsJCQkJCS8vIERldmljZSBzdXBwb3J0cyB6LWJhc2VkIGZvZy4gCisJCQkJCQkJLy8JRDNEUFJBU1RFUkNBUFNfWlRFU1Q7CQkJCQkvLyBEZXZpY2UgY2FuIHBlcmZvcm0gei10ZXN0IG9wZXJhdGlvbnMuIFRoaXMgZWZmZWN0aXZlbHkgcmVuZGVycyBhIHByaW1pdGl2ZSBhbmQgaW5kaWNhdGVzIHdoZXRoZXIgYW55IHogcGl4ZWxzIGhhdmUgYmVlbiByZW5kZXJlZC4KKworCQljYXBzLlpDbXBDYXBzID0JCUQzRFBDTVBDQVBTX0FMV0FZUyB8CQkvLyBBbHdheXMgcGFzcyB0aGUgei10ZXN0LiAKKwkJCQkJCQlEM0RQQ01QQ0FQU19FUVVBTCB8CQkJLy8gUGFzcyB0aGUgei10ZXN0IGlmIHRoZSBuZXcgeiBlcXVhbHMgdGhlIGN1cnJlbnQgei4gCisJCQkJCQkJRDNEUENNUENBUFNfR1JFQVRFUiB8CQkvLyBQYXNzIHRoZSB6LXRlc3QgaWYgdGhlIG5ldyB6IGlzIGdyZWF0ZXIgdGhhbiB0aGUgY3VycmVudCB6LiAKKwkJCQkJCQlEM0RQQ01QQ0FQU19HUkVBVEVSRVFVQUwgfAkvLyBQYXNzIHRoZSB6LXRlc3QgaWYgdGhlIG5ldyB6IGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byB0aGUgY3VycmVudCB6LiAKKwkJCQkJCQlEM0RQQ01QQ0FQU19MRVNTIHwJCQkvLyBQYXNzIHRoZSB6LXRlc3QgaWYgdGhlIG5ldyB6IGlzIGxlc3MgdGhhbiB0aGUgY3VycmVudCB6LiAKKwkJCQkJCQlEM0RQQ01QQ0FQU19MRVNTRVFVQUwgfAkJLy8gUGFzcyB0aGUgei10ZXN0IGlmIHRoZSBuZXcgeiBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGN1cnJlbnQgei4gCisJCQkJCQkJRDNEUENNUENBUFNfTkVWRVIgfAkJCS8vIEFsd2F5cyBmYWlsIHRoZSB6LXRlc3QuIAorCQkJCQkJCUQzRFBDTVBDQVBTX05PVEVRVUFMOwkJLy8gUGFzcyB0aGUgei10ZXN0IGlmIHRoZSBuZXcgeiBkb2VzIG5vdCBlcXVhbCB0aGUgY3VycmVudCB6LgorCisJCWNhcHMuU3JjQmxlbmRDYXBzID0JCUQzRFBCTEVORENBUFNfQk9USElOVlNSQ0FMUEhBIHwJLy8gU291cmNlIGJsZW5kIGZhY3RvciBpcyAoMS1BcywxLUFzLDEtQXMsMS1BcykgYW5kIGRlc3RpbmF0aW9uIGJsZW5kIGZhY3RvciBpcyAoQXMsQXMsQXMsQXMpOyB0aGUgZGVzdGluYXRpb24gYmxlbmQgc2VsZWN0aW9uIGlzIG92ZXJyaWRkZW4uIAorCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0JPVEhTUkNBTFBIQSB8CS8vIFRoZSBkcml2ZXIgc3VwcG9ydHMgdGhlIEQzREJMRU5EX0JPVEhTUkNBTFBIQSBibGVuZCBtb2RlLiAoVGhpcyBibGVuZCBtb2RlIGlzIG9ic29sZXRlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIEQzREJMRU5ELikgCisJCQkJCQkJCUQzRFBCTEVORENBUFNfREVTVEFMUEhBIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoQWQsIEFkLCBBZCwgQWQpLiAKKwkJCQkJCQkJRDNEUEJMRU5EQ0FQU19ERVNUQ09MT1IgfAkJLy8gQmxlbmQgZmFjdG9yIGlzIChSZCwgR2QsIEJkLCBBZCkuIAorCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVkRFU1RBTFBIQSB8CS8vIEJsZW5kIGZhY3RvciBpcyAoMS1BZCwgMS1BZCwgMS1BZCwgMS1BZCkuIAorCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVkRFU1RDT0xPUiB8CS8vIEJsZW5kIGZhY3RvciBpcyAoMS1SZCwgMS1HZCwgMS1CZCwgMS1BZCkuIAorCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVlNSQ0FMUEhBIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoMS1BcywgMS1BcywgMS1BcywgMS1BcykuIAorCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVlNSQ0NPTE9SIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoMS1ScywgMS1HcywgMS1CcywgMS1BcykuIAorCQkJCQkJCQlEM0RQQkxFTkRDQVBTX09ORSB8CQkJCS8vIEJsZW5kIGZhY3RvciBpcyAoMSwgMSwgMSwgMSkuIAorCQkJCQkJCQlEM0RQQkxFTkRDQVBTX1NSQ0FMUEhBIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoQXMsIEFzLCBBcywgQXMpLiAKKwkJCQkJCQkJRDNEUEJMRU5EQ0FQU19TUkNBTFBIQVNBVCB8CQkvLyBCbGVuZCBmYWN0b3IgaXMgKGYsIGYsIGYsIDEpOyBmID0gbWluKEFzLCAxLUFkKS4gCisJCQkJCQkJCUQzRFBCTEVORENBUFNfU1JDQ09MT1IgfAkJLy8gQmxlbmQgZmFjdG9yIGlzIChScywgR3MsIEJzLCBBcykuIAorCQkJCQkJCQlEM0RQQkxFTkRDQVBTX1pFUk87CQkJCS8vIEJsZW5kIGZhY3RvciBpcyAoMCwgMCwgMCwgMCkuCisKKwkJY2Fwcy5EZXN0QmxlbmRDYXBzID0gCUQzRFBCTEVORENBUFNfQk9USElOVlNSQ0FMUEhBIHwJLy8gU291cmNlIGJsZW5kIGZhY3RvciBpcyAoMS1BcywxLUFzLDEtQXMsMS1BcykgYW5kIGRlc3RpbmF0aW9uIGJsZW5kIGZhY3RvciBpcyAoQXMsQXMsQXMsQXMpOyB0aGUgZGVzdGluYXRpb24gYmxlbmQgc2VsZWN0aW9uIGlzIG92ZXJyaWRkZW4uIAorCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0JPVEhTUkNBTFBIQSB8CS8vIFRoZSBkcml2ZXIgc3VwcG9ydHMgdGhlIEQzREJMRU5EX0JPVEhTUkNBTFBIQSBibGVuZCBtb2RlLiAoVGhpcyBibGVuZCBtb2RlIGlzIG9ic29sZXRlLiBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIEQzREJMRU5ELikgCisJCQkJCQkJCUQzRFBCTEVORENBUFNfREVTVEFMUEhBIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoQWQsIEFkLCBBZCwgQWQpLiAKKwkJCQkJCQkJRDNEUEJMRU5EQ0FQU19ERVNUQ09MT1IgfAkJLy8gQmxlbmQgZmFjdG9yIGlzIChSZCwgR2QsIEJkLCBBZCkuIAorCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVkRFU1RBTFBIQSB8CS8vIEJsZW5kIGZhY3RvciBpcyAoMS1BZCwgMS1BZCwgMS1BZCwgMS1BZCkuIAorCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVkRFU1RDT0xPUiB8CS8vIEJsZW5kIGZhY3RvciBpcyAoMS1SZCwgMS1HZCwgMS1CZCwgMS1BZCkuIAorCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVlNSQ0FMUEhBIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoMS1BcywgMS1BcywgMS1BcywgMS1BcykuIAorCQkJCQkJCQlEM0RQQkxFTkRDQVBTX0lOVlNSQ0NPTE9SIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoMS1ScywgMS1HcywgMS1CcywgMS1BcykuIAorCQkJCQkJCQlEM0RQQkxFTkRDQVBTX09ORSB8CQkJCS8vIEJsZW5kIGZhY3RvciBpcyAoMSwgMSwgMSwgMSkuIAorCQkJCQkJCQlEM0RQQkxFTkRDQVBTX1NSQ0FMUEhBIHwJCS8vIEJsZW5kIGZhY3RvciBpcyAoQXMsIEFzLCBBcywgQXMpLiAKKwkJCQkJCQkJRDNEUEJMRU5EQ0FQU19TUkNBTFBIQVNBVCB8CQkvLyBCbGVuZCBmYWN0b3IgaXMgKGYsIGYsIGYsIDEpOyBmID0gbWluKEFzLCAxLUFkKS4gCisJCQkJCQkJCUQzRFBCTEVORENBUFNfU1JDQ09MT1IgfAkJLy8gQmxlbmQgZmFjdG9yIGlzIChScywgR3MsIEJzLCBBcykuIAorCQkJCQkJCQlEM0RQQkxFTkRDQVBTX1pFUk87CQkJCS8vIEJsZW5kIGZhY3RvciBpcyAoMCwgMCwgMCwgMCkuCisKKwkJY2Fwcy5BbHBoYUNtcENhcHMgPSBEM0RQQ01QQ0FQU19BTFdBWVMgfAkJLy8gQWx3YXlzIHBhc3MgdGhlIGFwaGEtdGVzdC4gCisJCQkJCQkJRDNEUENNUENBUFNfRVFVQUwgfAkJCS8vIFBhc3MgdGhlIGFwaGEtdGVzdCBpZiB0aGUgbmV3IGFwaGEgZXF1YWxzIHRoZSBjdXJyZW50IGFwaGEuIAorCQkJCQkJCUQzRFBDTVBDQVBTX0dSRUFURVIgfAkJLy8gUGFzcyB0aGUgYXBoYS10ZXN0IGlmIHRoZSBuZXcgYXBoYSBpcyBncmVhdGVyIHRoYW4gdGhlIGN1cnJlbnQgYXBoYS4gCisJCQkJCQkJRDNEUENNUENBUFNfR1JFQVRFUkVRVUFMIHwJLy8gUGFzcyB0aGUgYXBoYS10ZXN0IGlmIHRoZSBuZXcgYXBoYSBpcyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gdGhlIGN1cnJlbnQgYXBoYS4gCisJCQkJCQkJRDNEUENNUENBUFNfTEVTUyB8CQkJLy8gUGFzcyB0aGUgYXBoYS10ZXN0IGlmIHRoZSBuZXcgYXBoYSBpcyBsZXNzIHRoYW4gdGhlIGN1cnJlbnQgYXBoYS4gCisJCQkJCQkJRDNEUENNUENBUFNfTEVTU0VRVUFMIHwJCS8vIFBhc3MgdGhlIGFwaGEtdGVzdCBpZiB0aGUgbmV3IGFwaGEgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHRoZSBjdXJyZW50IGFwaGEuIAorCQkJCQkJCUQzRFBDTVBDQVBTX05FVkVSIHwJCQkvLyBBbHdheXMgZmFpbCB0aGUgYXBoYS10ZXN0LiAKKwkJCQkJCQlEM0RQQ01QQ0FQU19OT1RFUVVBTDsJCS8vIFBhc3MgdGhlIGFwaGEtdGVzdCBpZiB0aGUgbmV3IGFwaGEgZG9lcyBub3QgZXF1YWwgdGhlIGN1cnJlbnQgYXBoYS4KKworCQljYXBzLlNoYWRlQ2FwcyA9CUQzRFBTSEFERUNBUFNfQUxQSEFHT1VSQVVEQkxFTkQgfAkvLyBEZXZpY2UgY2FuIHN1cHBvcnQgYW4gYWxwaGEgY29tcG9uZW50IGZvciBHb3VyYXVkLWJsZW5kZWQgdHJhbnNwYXJlbmN5ICh0aGUgRDNEU0hBREVfR09VUkFVRCBzdGF0ZSBmb3IgdGhlIEQzRFNIQURFTU9ERSBlbnVtZXJhdGVkIHR5cGUpLiBJbiB0aGlzIG1vZGUsIHRoZSBhbHBoYSBjb2xvciBjb21wb25lbnQgb2YgYSBwcmltaXRpdmUgaXMgcHJvdmlkZWQgYXQgdmVydGljZXMgYW5kIGludGVycG9sYXRlZCBhY3Jvc3MgYSBmYWNlIGFsb25nIHdpdGggdGhlIG90aGVyIGNvbG9yIGNvbXBvbmVudHMuIAorCQkJCQkJCUQzRFBTSEFERUNBUFNfQ09MT1JHT1VSQVVEUkdCIHwJCS8vIERldmljZSBjYW4gc3VwcG9ydCBjb2xvcmVkIEdvdXJhdWQgc2hhZGluZyBpbiB0aGUgUkdCIGNvbG9yIG1vZGVsLiBJbiB0aGlzIG1vZGUsIHRoZSBjb2xvciBjb21wb25lbnQgZm9yIGEgcHJpbWl0aXZlIGlzIHByb3ZpZGVkIGF0IHZlcnRpY2VzIGFuZCBpbnRlcnBvbGF0ZWQgYWNyb3NzIGEgZmFjZSBhbG9uZyB3aXRoIHRoZSBvdGhlciBjb2xvciBjb21wb25lbnRzLiBJbiB0aGUgUkdCIGxpZ2h0aW5nIG1vZGVsLCB0aGUgcmVkLCBncmVlbiwgYW5kIGJsdWUgY29tcG9uZW50cyBhcmUgaW50ZXJwb2xhdGVkLiAKKwkJCQkJCQlEM0RQU0hBREVDQVBTX0ZPR0dPVVJBVUQgfAkJCS8vIERldmljZSBjYW4gc3VwcG9ydCBmb2cgaW4gdGhlIEdvdXJhdWQgc2hhZGluZyBtb2RlLiAKKwkJCQkJCQlEM0RQU0hBREVDQVBTX1NQRUNVTEFSR09VUkFVRFJHQjsJLy8gRGV2aWNlIHN1cHBvcnRzIEdvdXJhdWQgc2hhZGluZyBvZiBzcGVjdWxhciBoaWdobGlnaHRzLgorCisJCWNhcHMuVGV4dHVyZUNhcHMgPQkJRDNEUFRFWFRVUkVDQVBTX0FMUEhBIHwJCQkJCQkvLyBBbHBoYSBpbiB0ZXh0dXJlIHBpeGVscyBpcyBzdXBwb3J0ZWQuIAorCQkJCQkJCQlEM0RQVEVYVFVSRUNBUFNfQUxQSEFQQUxFVFRFIHwJCQkJLy8gRGV2aWNlIGNhbiBkcmF3IGFscGhhIGZyb20gdGV4dHVyZSBwYWxldHRlcy4gCisJCQkJCQkJCUQzRFBURVhUVVJFQ0FQU19DVUJFTUFQIHwJCQkJCS8vIFN1cHBvcnRzIGN1YmUgdGV4dHVyZXMuCisJCQkJCQkJLy8JRDNEUFRFWFRVUkVDQVBTX0NVQkVNQVBfUE9XMiB8CQkJCS8vIERldmljZSByZXF1aXJlcyB0aGF0IGN1YmUgdGV4dHVyZSBtYXBzIGhhdmUgZGltZW5zaW9ucyBzcGVjaWZpZWQgYXMgcG93ZXJzIG9mIHR3by4gCisJCQkJCQkJCUQzRFBURVhUVVJFQ0FQU19NSVBDVUJFTUFQIHwJCQkJLy8gRGV2aWNlIHN1cHBvcnRzIG1pcG1hcHBlZCBjdWJlIHRleHR1cmVzLiAKKwkJCQkJCQkJRDNEUFRFWFRVUkVDQVBTX01JUE1BUCB8CQkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgbWlwbWFwcGVkIHRleHR1cmVzLiAKKwkJCQkJCQkJRDNEUFRFWFRVUkVDQVBTX01JUFZPTFVNRU1BUCB8CQkJCS8vIERldmljZSBzdXBwb3J0cyBtaXBtYXBwZWQgdm9sdW1lIHRleHR1cmVzLiAKKwkJCQkJCQkvLwlEM0RQVEVYVFVSRUNBUFNfTk9OUE9XMkNPTkRJVElPTkFMIHwJCS8vIENvbmRpdGlvbmFsbHkgc3VwcG9ydHMgdGhlIHVzZSBvZiAyLUQgdGV4dHVyZXMgd2l0aCBkaW1lbnNpb25zIHRoYXQgYXJlIG5vdCBwb3dlcnMgb2YgdHdvLiBBIGRldmljZSB0aGF0IGV4cG9zZXMgdGhpcyBjYXBhYmlsaXR5IGNhbiB1c2Ugc3VjaCBhIHRleHR1cmUgaWYgYWxsIG9mIHRoZSBmb2xsb3dpbmcgcmVxdWlyZW1lbnRzIGFyZSBtZXQuLi4KKwkJCQkJCQkJRDNEUFRFWFRVUkVDQVBTX1BFUlNQRUNUSVZFIHwJCQkJLy8gUGVyc3BlY3RpdmUgY29ycmVjdGlvbiB0ZXh0dXJpbmcgaXMgc3VwcG9ydGVkLgorCQkJCQkJCS8vCUQzRFBURVhUVVJFQ0FQU19QT1cyIHwJCQkJCQkvLyBBbGwgdGV4dHVyZXMgbXVzdCBoYXZlIHdpZHRocyBhbmQgaGVpZ2h0cyBzcGVjaWZpZWQgYXMgcG93ZXJzIG9mIHR3by4gVGhpcyByZXF1aXJlbWVudCBkb2VzIG5vdCBhcHBseSB0byBlaXRoZXIgY3ViZSB0ZXh0dXJlcyBvciB2b2x1bWUgdGV4dHVyZXMuCisJCQkJCQkJCUQzRFBURVhUVVJFQ0FQU19QUk9KRUNURUQgfAkJCQkJLy8gU3VwcG9ydHMgdGhlIEQzRFRURkZfUFJPSkVDVEVEIHRleHR1cmUgdHJhbnNmb3JtYXRpb24gZmxhZy4gV2hlbiBhcHBsaWVkLCB0aGUgZGV2aWNlIGRpdmlkZXMgdHJhbnNmb3JtZWQgdGV4dHVyZSBjb29yZGluYXRlcyBieSB0aGUgbGFzdCB0ZXh0dXJlIGNvb3JkaW5hdGUuIElmIHRoaXMgY2FwYWJpbGl0eSBpcyBwcmVzZW50LCB0aGVuIHRoZSBwcm9qZWN0aXZlIGRpdmlkZSBvY2N1cnMgcGVyIHBpeGVsLiBJZiB0aGlzIGNhcGFiaWxpdHkgaXMgbm90IHByZXNlbnQsIGJ1dCB0aGUgcHJvamVjdGl2ZSBkaXZpZGUgbmVlZHMgdG8gb2NjdXIgYW55d2F5LCB0aGVuIGl0IGlzIHBlcmZvcm1lZCBvbiBhIHBlci12ZXJ0ZXggYmFzaXMgYnkgdGhlIERpcmVjdDNEIHJ1bnRpbWUuIAorCQkJCQkJCS8vCUQzRFBURVhUVVJFQ0FQU19TUVVBUkVPTkxZIHwJCQkJLy8gQWxsIHRleHR1cmVzIG11c3QgYmUgc3F1YXJlLiAKKwkJCQkJCQkJRDNEUFRFWFRVUkVDQVBTX1RFWFJFUEVBVE5PVFNDQUxFREJZU0laRSB8CS8vIFRleHR1cmUgaW5kaWNlcyBhcmUgbm90IHNjYWxlZCBieSB0aGUgdGV4dHVyZSBzaXplIHByaW9yIHRvIGludGVycG9sYXRpb24uCisJCQkJCQkJCUQzRFBURVhUVVJFQ0FQU19WT0xVTUVNQVA7CQkJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgdm9sdW1lIHRleHR1cmVzLgorCQkJCQkJCS8vCUQzRFBURVhUVVJFQ0FQU19WT0xVTUVNQVBfUE9XMjsJCQkJLy8gRGV2aWNlIHJlcXVpcmVzIHRoYXQgdm9sdW1lIHRleHR1cmUgbWFwcyBoYXZlIGRpbWVuc2lvbnMgc3BlY2lmaWVkIGFzIHBvd2VycyBvZiB0d28uIAorCisJCWNhcHMuVGV4dHVyZUZpbHRlckNhcHMgPQkvLwlEM0RQVEZJTFRFUkNBUFNfTUFHRkFGTEFUQ1VCSUMgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGZsYXQgY3ViaWMgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgZmxhdCBjdWJpYyBtYWduaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9GTEFUQ1VCSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAorCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZBTklTT1RST1BJQyB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYW5pc290cm9waWMgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgYW5pc290cm9waWMgbWFnbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfQU5JU09UUk9QSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAorCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZHQVVTU0lBTkNVQklDIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHRoZSBwZXItc3RhZ2UgR2F1c3NpYW4gY3ViaWMgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgR2F1c3NpYW4gY3ViaWMgbWFnbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfR0FVU1NJQU5DVUJJQyBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4KKwkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUFHRkxJTkVBUiB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGJpbGluZWFyIGludGVycG9sYXRpb24gZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIG1pcG1hcHMuIFRoZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIG1pcG1hcHBpbmcgZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0xJTkVBUiBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCisJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01BR0ZQT0lOVCB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgcG9pbnQtc2FtcGxlIG1hZ25pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BPSU5UIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKKwkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlORkFOSVNPVFJPUElDIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBhbmlzb3Ryb3BpYyBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gVGhlIGFuaXNvdHJvcGljIG1pbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfQU5JU09UUk9QSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAorCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NSU5GTElORUFSIHwJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgbGluZWFyIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHRleHR1cmVzLiBUaGUgbGluZWFyIG1pbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfTElORUFSIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKKwkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlORlBPSU5UIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHBvaW50LXNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gVGhlIHBvaW50LXNhbXBsZSBtaW5pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BPSU5UIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKKwkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlQRkxJTkVBUiB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGJpbGluZWFyIGludGVycG9sYXRpb24gZmlsdGVyaW5nIGZvciBtaXBtYXBzLiBUaGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBtaXBtYXBwaW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9MSU5FQVIgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAorCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NSVBGUE9JTlQ7CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtaXBtYXBzLiBUaGUgcG9pbnQtc2FtcGxlIG1pcG1hcHBpbmcgZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BPSU5UIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKKwkJCQkJCQkJCQorCQljYXBzLkN1YmVUZXh0dXJlRmlsdGVyQ2FwcyA9CS8vCUQzRFBURklMVEVSQ0FQU19NQUdGQUZMQVRDVUJJQyB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgZmxhdCBjdWJpYyBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgdGV4dHVyZXMuIFRoZSBmbGF0IGN1YmljIG1hZ25pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0ZMQVRDVUJJQyBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCisJCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01BR0ZBTklTT1RST1BJQyB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYW5pc290cm9waWMgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgYW5pc290cm9waWMgbWFnbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfQU5JU09UUk9QSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAorCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NQUdGR0FVU1NJQU5DVUJJQyB8CS8vIERldmljZSBzdXBwb3J0cyB0aGUgcGVyLXN0YWdlIEdhdXNzaWFuIGN1YmljIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gVGhlIEdhdXNzaWFuIGN1YmljIG1hZ25pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0dBVVNTSUFOQ1VCSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuCisJCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NQUdGTElORUFSIHwJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgbWlwbWFwcy4gVGhlIGJpbGluZWFyIGludGVycG9sYXRpb24gbWlwbWFwcGluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfTElORUFSIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKKwkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01BR0ZQT0lOVCB8CQkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBwb2ludC1zYW1wbGUgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgcG9pbnQtc2FtcGxlIG1hZ25pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BPSU5UIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKKwkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUlORkFOSVNPVFJPUElDIHwJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBhbmlzb3Ryb3BpYyBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gVGhlIGFuaXNvdHJvcGljIG1pbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfQU5JU09UUk9QSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAorCQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlORkxJTkVBUiB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGxpbmVhciBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gVGhlIGxpbmVhciBtaW5pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0xJTkVBUiBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCisJCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NSU5GUE9JTlQgfAkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcG9pbnQtc2FtcGxlIGZpbHRlcmluZyBmb3IgbWluaWZ5aW5nIHRleHR1cmVzLiBUaGUgcG9pbnQtc2FtcGxlIG1pbmlmaWNhdGlvbiBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfUE9JTlQgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAorCQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlQRkxJTkVBUiB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGJpbGluZWFyIGludGVycG9sYXRpb24gZmlsdGVyaW5nIGZvciBtaXBtYXBzLiBUaGUgYmlsaW5lYXIgaW50ZXJwb2xhdGlvbiBtaXBtYXBwaW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9MSU5FQVIgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAorCQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlQRlBPSU5UOwkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcG9pbnQtc2FtcGxlIGZpbHRlcmluZyBmb3IgbWlwbWFwcy4gVGhlIHBvaW50LXNhbXBsZSBtaXBtYXBwaW5nIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCisJCQkJCQkJCQkKKwkJY2Fwcy5Wb2x1bWVUZXh0dXJlRmlsdGVyQ2FwcyA9IAkvLwlEM0RQVEZJTFRFUkNBUFNfTUFHRkFGTEFUQ1VCSUMgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGZsYXQgY3ViaWMgZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIHRleHR1cmVzLiBUaGUgZmxhdCBjdWJpYyBtYWduaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9GTEFUQ1VCSUMgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAorCQkJCQkJCQkJCS8vCUQzRFBURklMVEVSQ0FQU19NQUdGQU5JU09UUk9QSUMgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGFuaXNvdHJvcGljIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gVGhlIGFuaXNvdHJvcGljIG1hZ25pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0FOSVNPVFJPUElDIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKKwkJCQkJCQkJCQkvLwlEM0RQVEZJTFRFUkNBUFNfTUFHRkdBVVNTSUFOQ1VCSUMgfAkvLyBEZXZpY2Ugc3VwcG9ydHMgdGhlIHBlci1zdGFnZSBHYXVzc2lhbiBjdWJpYyBmaWx0ZXJpbmcgZm9yIG1hZ25pZnlpbmcgdGV4dHVyZXMuIFRoZSBHYXVzc2lhbiBjdWJpYyBtYWduaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9HQVVTU0lBTkNVQklDIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLgorCQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUFHRkxJTkVBUiB8CQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIGJpbGluZWFyIGludGVycG9sYXRpb24gZmlsdGVyaW5nIGZvciBtYWduaWZ5aW5nIG1pcG1hcHMuIFRoZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIG1pcG1hcHBpbmcgZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0xJTkVBUiBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCisJCQkJCQkJCQkJCUQzRFBURklMVEVSQ0FQU19NQUdGUE9JTlQgfAkJCS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgcG9pbnQtc2FtcGxlIGZpbHRlcmluZyBmb3IgbWFnbmlmeWluZyB0ZXh0dXJlcy4gVGhlIHBvaW50LXNhbXBsZSBtYWduaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9QT0lOVCBtZW1iZXIgb2YgdGhlIEQzRFRFWFRVUkVGSUxURVJUWVBFIGVudW1lcmF0ZWQgdHlwZS4gCisJCQkJCQkJCQkJLy8JRDNEUFRGSUxURVJDQVBTX01JTkZBTklTT1RST1BJQyB8CS8vIERldmljZSBzdXBwb3J0cyBwZXItc3RhZ2UgYW5pc290cm9waWMgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBhbmlzb3Ryb3BpYyBtaW5pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX0FOSVNPVFJPUElDIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKKwkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JTkZMSU5FQVIgfAkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBsaW5lYXIgZmlsdGVyaW5nIGZvciBtaW5pZnlpbmcgdGV4dHVyZXMuIFRoZSBsaW5lYXIgbWluaWZpY2F0aW9uIGZpbHRlciBpcyByZXByZXNlbnRlZCBieSB0aGUgRDNEVEVYRl9MSU5FQVIgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAorCQkJCQkJCQkJCQlEM0RQVEZJTFRFUkNBUFNfTUlORlBPSU5UIHwJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHBvaW50LXNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1pbmlmeWluZyB0ZXh0dXJlcy4gVGhlIHBvaW50LXNhbXBsZSBtaW5pZmljYXRpb24gZmlsdGVyIGlzIHJlcHJlc2VudGVkIGJ5IHRoZSBEM0RURVhGX1BPSU5UIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKKwkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JUEZMSU5FQVIgfAkJLy8gRGV2aWNlIHN1cHBvcnRzIHBlci1zdGFnZSBiaWxpbmVhciBpbnRlcnBvbGF0aW9uIGZpbHRlcmluZyBmb3IgbWlwbWFwcy4gVGhlIGJpbGluZWFyIGludGVycG9sYXRpb24gbWlwbWFwcGluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfTElORUFSIG1lbWJlciBvZiB0aGUgRDNEVEVYVFVSRUZJTFRFUlRZUEUgZW51bWVyYXRlZCB0eXBlLiAKKwkJCQkJCQkJCQkJRDNEUFRGSUxURVJDQVBTX01JUEZQT0lOVDsJCQkvLyBEZXZpY2Ugc3VwcG9ydHMgcGVyLXN0YWdlIHBvaW50LXNhbXBsZSBmaWx0ZXJpbmcgZm9yIG1pcG1hcHMuIFRoZSBwb2ludC1zYW1wbGUgbWlwbWFwcGluZyBmaWx0ZXIgaXMgcmVwcmVzZW50ZWQgYnkgdGhlIEQzRFRFWEZfUE9JTlQgbWVtYmVyIG9mIHRoZSBEM0RURVhUVVJFRklMVEVSVFlQRSBlbnVtZXJhdGVkIHR5cGUuIAorCQkJCQkJCQkJCisJCWNhcHMuVGV4dHVyZUFkZHJlc3NDYXBzID0JRDNEUFRBRERSRVNTQ0FQU19CT1JERVIgfAkJCS8vIERldmljZSBzdXBwb3J0cyBzZXR0aW5nIGNvb3JkaW5hdGVzIG91dHNpZGUgdGhlIHJhbmdlIFswLjAsIDEuMF0gdG8gdGhlIGJvcmRlciBjb2xvciwgYXMgc3BlY2lmaWVkIGJ5IHRoZSBEM0RTQU1QX0JPUkRFUkNPTE9SIHRleHR1cmUtc3RhZ2Ugc3RhdGUuIAorCQkJCQkJCQkJRDNEUFRBRERSRVNTQ0FQU19DTEFNUCB8CQkJLy8gRGV2aWNlIGNhbiBjbGFtcCB0ZXh0dXJlcyB0byBhZGRyZXNzZXMuIAorCQkJCQkJCQkJRDNEUFRBRERSRVNTQ0FQU19JTkRFUEVOREVOVFVWIHwJLy8gRGV2aWNlIGNhbiBzZXBhcmF0ZSB0aGUgdGV4dHVyZS1hZGRyZXNzaW5nIG1vZGVzIG9mIHRoZSB1IGFuZCB2IGNvb3JkaW5hdGVzIG9mIHRoZSB0ZXh0dXJlLiBUaGlzIGFiaWxpdHkgY29ycmVzcG9uZHMgdG8gdGhlIEQzRFNBTVBfQUREUkVTU1UgYW5kIEQzRFNBTVBfQUREUkVTU1YgcmVuZGVyLXN0YXRlIHZhbHVlcy4gCisJCQkJCQkJCQlEM0RQVEFERFJFU1NDQVBTX01JUlJPUiB8CQkJLy8gRGV2aWNlIGNhbiBtaXJyb3IgdGV4dHVyZXMgdG8gYWRkcmVzc2VzLiAKKwkJCQkJCQkJCUQzRFBUQUREUkVTU0NBUFNfTUlSUk9ST05DRSB8CQkvLyBEZXZpY2UgY2FuIHRha2UgdGhlIGFic29sdXRlIHZhbHVlIG9mIHRoZSB0ZXh0dXJlIGNvb3JkaW5hdGUgKHRodXMsIG1pcnJvcmluZyBhcm91bmQgMCkgYW5kIHRoZW4gY2xhbXAgdG8gdGhlIG1heGltdW0gdmFsdWUuIAorCQkJCQkJCQkJRDNEUFRBRERSRVNTQ0FQU19XUkFQOwkJCQkvLyBEZXZpY2UgY2FuIHdyYXAgdGV4dHVyZXMgdG8gYWRkcmVzc2VzLgorCisJCWNhcHMuVm9sdW1lVGV4dHVyZUFkZHJlc3NDYXBzID0JRDNEUFRBRERSRVNTQ0FQU19CT1JERVIgfAkJCS8vIERldmljZSBzdXBwb3J0cyBzZXR0aW5nIGNvb3JkaW5hdGVzIG91dHNpZGUgdGhlIHJhbmdlIFswLjAsIDEuMF0gdG8gdGhlIGJvcmRlciBjb2xvciwgYXMgc3BlY2lmaWVkIGJ5IHRoZSBEM0RTQU1QX0JPUkRFUkNPTE9SIHRleHR1cmUtc3RhZ2Ugc3RhdGUuIAorCQkJCQkJCQkJCUQzRFBUQUREUkVTU0NBUFNfQ0xBTVAgfAkJCS8vIERldmljZSBjYW4gY2xhbXAgdGV4dHVyZXMgdG8gYWRkcmVzc2VzLiAKKwkJCQkJCQkJCQlEM0RQVEFERFJFU1NDQVBTX0lOREVQRU5ERU5UVVYgfAkvLyBEZXZpY2UgY2FuIHNlcGFyYXRlIHRoZSB0ZXh0dXJlLWFkZHJlc3NpbmcgbW9kZXMgb2YgdGhlIHUgYW5kIHYgY29vcmRpbmF0ZXMgb2YgdGhlIHRleHR1cmUuIFRoaXMgYWJpbGl0eSBjb3JyZXNwb25kcyB0byB0aGUgRDNEU0FNUF9BRERSRVNTVSBhbmQgRDNEU0FNUF9BRERSRVNTViByZW5kZXItc3RhdGUgdmFsdWVzLiAKKwkJCQkJCQkJCQlEM0RQVEFERFJFU1NDQVBTX01JUlJPUiB8CQkJLy8gRGV2aWNlIGNhbiBtaXJyb3IgdGV4dHVyZXMgdG8gYWRkcmVzc2VzLiAKKwkJCQkJCQkJCQlEM0RQVEFERFJFU1NDQVBTX01JUlJPUk9OQ0UgfAkJLy8gRGV2aWNlIGNhbiB0YWtlIHRoZSBhYnNvbHV0ZSB2YWx1ZSBvZiB0aGUgdGV4dHVyZSBjb29yZGluYXRlICh0aHVzLCBtaXJyb3JpbmcgYXJvdW5kIDApIGFuZCB0aGVuIGNsYW1wIHRvIHRoZSBtYXhpbXVtIHZhbHVlLiAKKwkJCQkJCQkJCQlEM0RQVEFERFJFU1NDQVBTX1dSQVA7CQkJCS8vIERldmljZSBjYW4gd3JhcCB0ZXh0dXJlcyB0byBhZGRyZXNzZXMuCisKKwkJY2Fwcy5MaW5lQ2FwcyA9IEQzRExJTkVDQVBTX0FMUEhBQ01QIHwJLy8gU3VwcG9ydHMgYWxwaGEtdGVzdCBjb21wYXJpc29ucy4gCisJCQkJCQlEM0RMSU5FQ0FQU19CTEVORCB8CQkvLyBTdXBwb3J0cyBzb3VyY2UtYmxlbmRpbmcuIAorCQkJCQkJRDNETElORUNBUFNfRk9HIHwJCS8vIFN1cHBvcnRzIGZvZy4gCisJCQkJCQlEM0RMSU5FQ0FQU19URVhUVVJFIHwJLy8gU3VwcG9ydHMgdGV4dHVyZS1tYXBwaW5nLiAKKwkJCQkJCUQzRExJTkVDQVBTX1pURVNUOwkJLy8gU3VwcG9ydHMgei1idWZmZXIgY29tcGFyaXNvbnMuCisJCQorCQljYXBzLk1heFRleHR1cmVXaWR0aCA9IDEgPDwgKHN3OjpNSVBNQVBfTEVWRUxTIC0gMSk7CisJCWNhcHMuTWF4VGV4dHVyZUhlaWdodCA9IDEgPDwgKHN3OjpNSVBNQVBfTEVWRUxTIC0gMSk7CisJCWNhcHMuTWF4Vm9sdW1lRXh0ZW50ID0gMSA8PCAoc3c6Ok1JUE1BUF9MRVZFTFMgLSAxKTsKKwkJY2Fwcy5NYXhUZXh0dXJlUmVwZWF0ID0gODE5MjsKKwkJY2Fwcy5NYXhUZXh0dXJlQXNwZWN0UmF0aW8gPSAxIDw8IChzdzo6TUlQTUFQX0xFVkVMUyAtIDEpOworCQljYXBzLk1heEFuaXNvdHJvcHkgPSBtYXhBbmlzb3Ryb3B5OworCQljYXBzLk1heFZlcnRleFcgPSAxZSswMTA7CisKKwkJY2Fwcy5HdWFyZEJhbmRMZWZ0ID0gLTFlKzAwODsKKwkJY2Fwcy5HdWFyZEJhbmRUb3AgPSAtMWUrMDA4OworCQljYXBzLkd1YXJkQmFuZFJpZ2h0ID0gMWUrMDA4OworCQljYXBzLkd1YXJkQmFuZEJvdHRvbSA9IDFlKzAwODsKKworCQljYXBzLkV4dGVudHNBZGp1c3QgPSAwOworCisJCWNhcHMuU3RlbmNpbENhcHMgPQkJRDNEU1RFTkNJTENBUFNfS0VFUCB8CQkvLyBEbyBub3QgdXBkYXRlIHRoZSBlbnRyeSBpbiB0aGUgc3RlbmNpbCBidWZmZXIuIFRoaXMgaXMgdGhlIGRlZmF1bHQgdmFsdWUuIAorCQkJCQkJCQlEM0RTVEVOQ0lMQ0FQU19aRVJPIHwJCS8vIFNldCB0aGUgc3RlbmNpbC1idWZmZXIgZW50cnkgdG8gMC4gCisJCQkJCQkJCUQzRFNURU5DSUxDQVBTX1JFUExBQ0UgfAkvLyBSZXBsYWNlIHRoZSBzdGVuY2lsLWJ1ZmZlciBlbnRyeSB3aXRoIHJlZmVyZW5jZSB2YWx1ZS4gCisJCQkJCQkJCUQzRFNURU5DSUxDQVBTX0lOQ1JTQVQgfAkvLyBJbmNyZW1lbnQgdGhlIHN0ZW5jaWwtYnVmZmVyIGVudHJ5LCBjbGFtcGluZyB0byB0aGUgbWF4aW11bSB2YWx1ZS4gIAorCQkJCQkJCQlEM0RTVEVOQ0lMQ0FQU19ERUNSU0FUIHwJLy8gRGVjcmVtZW50IHRoZSBzdGVuY2lsLWJ1ZmZlciBlbnRyeSwgY2xhbXBpbmcgdG8gemVyby4gCisJCQkJCQkJCUQzRFNURU5DSUxDQVBTX0lOVkVSVCB8CQkvLyBJbnZlcnQgdGhlIGJpdHMgaW4gdGhlIHN0ZW5jaWwtYnVmZmVyIGVudHJ5LiAKKwkJCQkJCQkJRDNEU1RFTkNJTENBUFNfSU5DUiB8CQkvLyBJbmNyZW1lbnQgdGhlIHN0ZW5jaWwtYnVmZmVyIGVudHJ5LCB3cmFwcGluZyB0byB6ZXJvIGlmIHRoZSBuZXcgdmFsdWUgZXhjZWVkcyB0aGUgbWF4aW11bSB2YWx1ZS4gIAorCQkJCQkJCQlEM0RTVEVOQ0lMQ0FQU19ERUNSOwkJLy8gRGVjcmVtZW50IHRoZSBzdGVuY2lsLWJ1ZmZlciBlbnRyeSwgd3JhcHBpbmcgdG8gdGhlIG1heGltdW0gdmFsdWUgaWYgdGhlIG5ldyB2YWx1ZSBpcyBsZXNzIHRoYW4gemVyby4gCisJCQorCQljYXBzLkZWRkNhcHMgPQkJRDNERlZGQ0FQU19ET05PVFNUUklQRUxFTUVOVFMgfAkJLy8gSXQgaXMgcHJlZmVyYWJsZSB0aGF0IHZlcnRleCBlbGVtZW50cyBub3QgYmUgc3RyaXBwZWQuIFRoYXQgaXMsIGlmIHRoZSB2ZXJ0ZXggZm9ybWF0IGNvbnRhaW5zIGVsZW1lbnRzIHRoYXQgYXJlIG5vdCB1c2VkIHdpdGggdGhlIGN1cnJlbnQgcmVuZGVyIHN0YXRlcywgdGhlcmUgaXMgbm8gbmVlZCB0byByZWdlbmVyYXRlIHRoZSB2ZXJ0aWNlcy4gSWYgdGhpcyBjYXBhYmlsaXR5IGZsYWcgaXMgbm90IHByZXNlbnQsIHN0cmlwcGluZyBleHRyYW5lb3VzIGVsZW1lbnRzIGZyb20gdGhlIHZlcnRleCBmb3JtYXQgcHJvdmlkZXMgYmV0dGVyIHBlcmZvcm1hbmNlLiAKKwkJCQkJCQlEM0RGVkZDQVBTX1BTSVpFIHwJCQkJCS8vIFBvaW50IHNpemUgaXMgZGV0ZXJtaW5lZCBieSBlaXRoZXIgdGhlIHJlbmRlciBzdGF0ZSBvciB0aGUgdmVydGV4IGRhdGEuCisJCQkJCQkvLwlEM0RGVkZDQVBTX1RFWENPT1JEQ09VTlRNQVNLIHwJCS8vIE1hc2tzIHRoZSBsb3cgV09SRCBvZiBGVkZDYXBzLiBUaGVzZSBiaXRzLCBjYXN0IHRvIHRoZSBXT1JEIGRhdGEgdHlwZSwgZGVzY3JpYmUgdGhlIHRvdGFsIG51bWJlciBvZiB0ZXh0dXJlIGNvb3JkaW5hdGUgc2V0cyB0aGF0IHRoZSBkZXZpY2UgY2FuIHNpbXVsdGFuZW91c2x5IHVzZSBmb3IgbXVsdGlwbGUgdGV4dHVyZSBibGVuZGluZy4gKFlvdSBjYW4gdXNlIHVwIHRvIGVpZ2h0IHRleHR1cmUgY29vcmRpbmF0ZSBzZXRzIGZvciBhbnkgdmVydGV4LCBidXQgdGhlIGRldmljZSBjYW4gYmxlbmQgdXNpbmcgb25seSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiB0ZXh0dXJlIGNvb3JkaW5hdGUgc2V0cy4pIAorCQkJCQkJCTg7CisKKwkJY2Fwcy5UZXh0dXJlT3BDYXBzID0JRDNEVEVYT1BDQVBTX0FERCB8CQkJCQkJCS8vIFRoZSBEM0RUT1BfQUREIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCisJCQkJCQkJCUQzRFRFWE9QQ0FQU19BRERTSUdORUQgfAkJCQkJLy8gVGhlIEQzRFRPUF9BRERTSUdORUQgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKKwkJCQkJCQkJRDNEVEVYT1BDQVBTX0FERFNJR05FRDJYIHwJCQkJCS8vIFRoZSBEM0RUT1BfQUREU0lHTkVEMlggdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKKwkJCQkJCQkJRDNEVEVYT1BDQVBTX0FERFNNT09USCB8CQkJCQkvLyBUaGUgRDNEVE9QX0FERFNNT09USCB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAorCQkJCQkJCQlEM0RURVhPUENBUFNfQkxFTkRDVVJSRU5UQUxQSEEgfAkJCS8vIFRoZSBEM0RUT1BfQkxFTkRDVVJSRU5UQUxQSEEgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKKwkJCQkJCQkJRDNEVEVYT1BDQVBTX0JMRU5ERElGRlVTRUFMUEhBIHwJCQkvLyBUaGUgRDNEVE9QX0JMRU5ERElGRlVTRUFMUEhBIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCisJCQkJCQkJCUQzRFRFWE9QQ0FQU19CTEVOREZBQ1RPUkFMUEhBIHwJCQkJLy8gVGhlIEQzRFRPUF9CTEVOREZBQ1RPUkFMUEhBIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCisJCQkJCQkJCUQzRFRFWE9QQ0FQU19CTEVORFRFWFRVUkVBTFBIQSB8CQkJLy8gVGhlIEQzRFRPUF9CTEVORFRFWFRVUkVBTFBIQSB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAorCQkJCQkJCQlEM0RURVhPUENBUFNfQkxFTkRURVhUVVJFQUxQSEFQTSB8CQkJLy8gVGhlIEQzRFRPUF9CTEVORFRFWFRVUkVBTFBIQVBNIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCisJCQkJCQkJCUQzRFRFWE9QQ0FQU19CVU1QRU5WTUFQIHwJCQkJCS8vIFRoZSBEM0RUT1BfQlVNUEVOVk1BUCB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAorCQkJCQkJCQlEM0RURVhPUENBUFNfQlVNUEVOVk1BUExVTUlOQU5DRSB8CQkJLy8gVGhlIEQzRFRPUF9CVU1QRU5WTUFQTFVNSU5BTkNFIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCisJCQkJCQkJCUQzRFRFWE9QQ0FQU19ESVNBQkxFIHwJCQkJCQkvLyBUaGUgRDNEVE9QX0RJU0FCTEUgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKKwkJCQkJCQkJRDNEVEVYT1BDQVBTX0RPVFBST0RVQ1QzIHwJCQkJCS8vIFRoZSBEM0RUT1BfRE9UUFJPRFVDVDMgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKKwkJCQkJCQkJRDNEVEVYT1BDQVBTX0xFUlAgfAkJCQkJCQkvLyBUaGUgRDNEVE9QX0xFUlAgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKKwkJCQkJCQkJRDNEVEVYT1BDQVBTX01PRFVMQVRFIHwJCQkJCQkvLyBUaGUgRDNEVE9QX01PRFVMQVRFIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCisJCQkJCQkJCUQzRFRFWE9QQ0FQU19NT0RVTEFURTJYIHwJCQkJCS8vIFRoZSBEM0RUT1BfTU9EVUxBVEUyWCB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAorCQkJCQkJCQlEM0RURVhPUENBUFNfTU9EVUxBVEU0WCB8CQkJCQkvLyBUaGUgRDNEVE9QX01PRFVMQVRFNFggdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKKwkJCQkJCQkJRDNEVEVYT1BDQVBTX01PRFVMQVRFQUxQSEFfQUREQ09MT1IgfAkJLy8gVGhlIEQzRFRPUF9NT0RVTEFURUFMUEhBX0FERENPTE9SIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCisJCQkJCQkJCUQzRFRFWE9QQ0FQU19NT0RVTEFURUNPTE9SX0FEREFMUEhBIHwJCS8vIFRoZSBEM0RUT1BfTU9EVUxBVEVDT0xPUl9BRERBTFBIQSB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAorCQkJCQkJCQlEM0RURVhPUENBUFNfTU9EVUxBVEVJTlZBTFBIQV9BRERDT0xPUiB8CS8vIFRoZSBEM0RUT1BfTU9EVUxBVEVJTlZBTFBIQV9BRERDT0xPUiB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAorCQkJCQkJCQlEM0RURVhPUENBUFNfTU9EVUxBVEVJTlZDT0xPUl9BRERBTFBIQSB8CS8vIFRoZSBEM0RUT1BfTU9EVUxBVEVJTlZDT0xPUl9BRERBTFBIQSB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAorCQkJCQkJCQlEM0RURVhPUENBUFNfTVVMVElQTFlBREQgfAkJCQkJLy8gVGhlIEQzRFRPUF9NVUxUSVBMWUFERCB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAorCQkJCQkJCQlEM0RURVhPUENBUFNfUFJFTU9EVUxBVEUgfAkJCQkJLy8gVGhlIEQzRFRPUF9QUkVNT0RVTEFURSB0ZXh0dXJlLWJsZW5kaW5nIG9wZXJhdGlvbiBpcyBzdXBwb3J0ZWQuIAorCQkJCQkJCQlEM0RURVhPUENBUFNfU0VMRUNUQVJHMSB8CQkJCQkvLyBUaGUgRDNEVE9QX1NFTEVDVEFSRzEgdGV4dHVyZS1ibGVuZGluZyBvcGVyYXRpb24gaXMgc3VwcG9ydGVkLiAKKwkJCQkJCQkJRDNEVEVYT1BDQVBTX1NFTEVDVEFSRzIgfAkJCQkJLy8gVGhlIEQzRFRPUF9TRUxFQ1RBUkcyIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCisJCQkJCQkJCUQzRFRFWE9QQ0FQU19TVUJUUkFDVDsJCQkJCQkvLyBUaGUgRDNEVE9QX1NVQlRSQUNUIHRleHR1cmUtYmxlbmRpbmcgb3BlcmF0aW9uIGlzIHN1cHBvcnRlZC4gCisKKwkJY2Fwcy5NYXhUZXh0dXJlQmxlbmRTdGFnZXMgPSA4OworCQljYXBzLk1heFNpbXVsdGFuZW91c1RleHR1cmVzID0gODsKKworCQljYXBzLlZlcnRleFByb2Nlc3NpbmdDYXBzID0JCUQzRFZUWFBDQVBTX0RJUkVDVElPTkFMTElHSFRTIHwJCQkvLyBEZXZpY2UgY2FuIGRvIGRpcmVjdGlvbmFsIGxpZ2h0cy4gCisJCQkJCQkJCQkJRDNEVlRYUENBUFNfTE9DQUxWSUVXRVIgfAkJCQkvLyBEZXZpY2UgY2FuIGRvIGxvY2FsIHZpZXdlci4gCisJCQkJCQkJCQkJRDNEVlRYUENBUFNfTUFURVJJQUxTT1VSQ0U3CXwJCQkvLyBEZXZpY2UgY2FuIGRvIE1pY3Jvc29mdK4gRGlyZWN0WK4gNy4wIGNvbG9ybWF0ZXJpYWxzb3VyY2Ugb3BlcmF0aW9ucy4gCisJCQkJCQkJCQkJRDNEVlRYUENBUFNfUE9TSVRJT05BTExJR0hUUyB8CQkJLy8gRGV2aWNlIGNhbiBkbyBwb3NpdGlvbmFsIGxpZ2h0cyAoaW5jbHVkZXMgcG9pbnQgYW5kIHNwb3QpLiAKKwkJCQkJCQkJCQlEM0RWVFhQQ0FQU19URVhHRU4gfAkJCQkJLy8gRGV2aWNlIGNhbiBkbyB0ZXhnZW4uIAorCQkJCQkJCQkJCUQzRFZUWFBDQVBTX1RXRUVOSU5HOwkJCQkJLy8gRGV2aWNlIGNhbiBkbyB2ZXJ0ZXggdHdlZW5pbmcuIAorCQkJCQkJCQkJLy8JRDNEVlRYUENBUFNfTk9fVlNEVF9VQllURTQ7CQkJCS8vIERldmljZSBkb2VzIG5vdCBzdXBwb3J0IHRoZSBEM0RWU0RUX1VCWVRFNCB2ZXJ0ZXggZGVjbGFyYXRpb24gdHlwZS4gIAorCisJCWNhcHMuTWF4QWN0aXZlTGlnaHRzID0gODsJCQkJCQkvLyBNYXhpbXVtIG51bWJlciBvZiBsaWdodHMgdGhhdCBjYW4gYmUgYWN0aXZlIHNpbXVsdGFuZW91c2x5LiBGb3IgYSBnaXZlbiBwaHlzaWNhbCBkZXZpY2UsIHRoaXMgY2FwYWJpbGl0eSBtaWdodCB2YXJ5IGFjcm9zcyBEaXJlY3QzRERldmljZSBvYmplY3RzIGRlcGVuZGluZyBvbiB0aGUgcGFyYW1ldGVycyBzdXBwbGllZCB0byBJRGlyZWN0M0Q4OjpDcmVhdGVEZXZpY2UuCisJCWNhcHMuTWF4VXNlckNsaXBQbGFuZXMgPSA2OwkJCQkJCS8vIE1heGltdW0gbnVtYmVyIG9mIHVzZXItZGVmaW5lZCBjbGlwcGluZyBwbGFuZXMgc3VwcG9ydGVkLiBUaGlzIG1lbWJlciBjYW4gcmFuZ2UgZnJvbSAwIHRocm91Z2ggRDNETUFYVVNFUkNMSVBQTEFORVMuIEZvciBhIGdpdmVuIHBoeXNpY2FsIGRldmljZSwgdGhpcyBjYXBhYmlsaXR5IG1heSB2YXJ5IGFjcm9zcyBEaXJlY3QzRERldmljZSBvYmplY3RzIGRlcGVuZGluZyBvbiB0aGUgcGFyYW1ldGVycyBzdXBwbGllZCB0byBJRGlyZWN0M0Q4OjpDcmVhdGVEZXZpY2UuIAorCQljYXBzLk1heFZlcnRleEJsZW5kTWF0cmljZXMgPSA0OwkJCQkvLyBNYXhpbXVtIG51bWJlciBvZiBtYXRyaWNlcyB0aGF0IHRoaXMgZGV2aWNlIGNhbiBhcHBseSB3aGVuIHBlcmZvcm1pbmcgbXVsdGltYXRyaXggdmVydGV4IGJsZW5kaW5nLiBGb3IgYSBnaXZlbiBwaHlzaWNhbCBkZXZpY2UsIHRoaXMgY2FwYWJpbGl0eSBtYXkgdmFyeSBhY3Jvc3MgRGlyZWN0M0REZXZpY2Ugb2JqZWN0cyBkZXBlbmRpbmcgb24gdGhlIHBhcmFtZXRlcnMgc3VwcGxpZWQgdG8gSURpcmVjdDNEODo6Q3JlYXRlRGV2aWNlLiAKKwkJY2Fwcy5NYXhWZXJ0ZXhCbGVuZE1hdHJpeEluZGV4ID0gMTE7CQkJLy8gRFdPUkQgdmFsdWUgdGhhdCBzcGVjaWZpZXMgdGhlIG1heGltdW0gbWF0cml4IGluZGV4IHRoYXQgY2FuIGJlIGluZGV4ZWQgaW50byB1c2luZyB0aGUgcGVyLXZlcnRleCBpbmRpY2VzLiBUaGUgbnVtYmVyIG9mIG1hdHJpY2VzIGlzIE1heFZlcnRleEJsZW5kTWF0cml4SW5kZXggKyAxLCB3aGljaCBpcyB0aGUgc2l6ZSBvZiB0aGUgbWF0cml4IHBhbGV0dGUuIElmIG5vcm1hbHMgYXJlIHByZXNlbnQgaW4gdGhlIHZlcnRleCBkYXRhIHRoYXQgbmVlZHMgdG8gYmUgYmxlbmRlZCBmb3IgbGlnaHRpbmcsIHRoZW4gdGhlIG51bWJlciBvZiBtYXRyaWNlcyBpcyBoYWxmIHRoZSBudW1iZXIgc3BlY2lmaWVkIGJ5IHRoaXMgY2FwYWJpbGl0eSBmbGFnLiBJZiBNYXhWZXJ0ZXhCbGVuZE1hdHJpeEluZGV4IGlzIHNldCB0byB6ZXJvLCB0aGUgZHJpdmVyIGRvZXMgbm90IHN1cHBvcnQgaW5kZXhlZCB2ZXJ0ZXggYmxlbmRpbmcuIElmIHRoaXMgdmFsdWUgaXMgbm90IHplcm8gdGhlbiB0aGUgdmFsaWQgcmFuZ2Ugb2YgaW5kaWNlcyBpcyB6ZXJvIHRocm91Z2ggTWF4VmVydGV4QmxlbmRNYXRyaXhJbmRleC4KKwkJY2Fwcy5NYXhQb2ludFNpemUgPSA4MTkyLjBmOwkJCQkJLy8gTWF4aW11bSBzaXplIG9mIGEgcG9pbnQgcHJpbWl0aXZlLiBJZiBzZXQgdG8gMS4wZiB0aGVuIGRldmljZSBkb2VzIG5vdCBzdXBwb3J0IHBvaW50IHNpemUgY29udHJvbC4gVGhlIHJhbmdlIGlzIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAxLjBmLgorCQljYXBzLk1heFByaW1pdGl2ZUNvdW50ID0gMSA8PCAyMTsJCQkJLy8gTWF4aW11bSBudW1iZXIgb2YgcHJpbWl0aXZlcyBmb3IgZWFjaCBJRGlyZWN0M0REZXZpY2U4OjpEcmF3UHJpbWl0aXZlIGNhbGwuIE5vdGUgdGhhdCB3aGVuIERpcmVjdDNEIGlzIHdvcmtpbmcgd2l0aCBhIERpcmVjdFggNi4wIG9yIERpcmVjdFggNy4wIGRyaXZlciwgdGhpcyBmaWVsZCBpcyBzZXQgdG8gMHhGRkZGLiBUaGlzIG1lYW5zIHRoYXQgbm90IG9ubHkgdGhlIG51bWJlciBvZiBwcmltaXRpdmVzIGJ1dCBhbHNvIHRoZSBudW1iZXIgb2YgdmVydGljZXMgaXMgbGltaXRlZCBieSB0aGlzIHZhbHVlLgorCQljYXBzLk1heFZlcnRleEluZGV4ID0gMSA8PCAyNDsJCQkJCS8vIE1heGltdW0gc2l6ZSBvZiBpbmRpY2VzIHN1cHBvcnRlZCBmb3IgaGFyZHdhcmUgdmVydGV4IHByb2Nlc3NpbmcuIEl0IGlzIHBvc3NpYmxlIHRvIGNyZWF0ZSAzMi1iaXQgaW5kZXggYnVmZmVycyBieSBzcGVjaWZ5aW5nIEQzREZNVF9JTkRFWDMyOyBob3dldmVyLCB5b3Ugd2lsbCBub3QgYmUgYWJsZSB0byByZW5kZXIgd2l0aCB0aGUgaW5kZXggYnVmZmVyIHVubGVzcyB0aGlzIHZhbHVlIGlzIGdyZWF0ZXIgdGhhbiAweDAwMDBGRkZGLgorCQljYXBzLk1heFN0cmVhbXMgPSAxNjsJCQkJCQkJLy8gTWF4aW11bSBudW1iZXIgb2YgY29uY3VycmVudCBkYXRhIHN0cmVhbXMgZm9yIElEaXJlY3QzRERldmljZTg6OlNldFN0cmVhbVNvdXJjZS4gVGhlIHZhbGlkIHJhbmdlIGlzIDEgdG8gMTYuIE5vdGUgdGhhdCBpZiB0aGlzIHZhbHVlIGlzIDAsIHRoZW4gdGhlIGRyaXZlciBpcyBub3QgYSBEaXJlY3RYIDkuMCBkcml2ZXIuCisJCWNhcHMuTWF4U3RyZWFtU3RyaWRlID0gNjU1MzY7CQkJCQkvLyBNYXhpbXVtIHN0cmlkZSBmb3IgSURpcmVjdDNERGV2aWNlODo6U2V0U3RyZWFtU291cmNlLgorCQljYXBzLlZlcnRleFNoYWRlclZlcnNpb24gPSB2ZXJ0ZXhTaGFkZXJWZXJzaW9uOwkvLyBUd28gbnVtYmVycyB0aGF0IHJlcHJlc2VudCB0aGUgdmVydGV4IHNoYWRlciBtYWluIGFuZCBzdWIgdmVyc2lvbnMuIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBpbnN0cnVjdGlvbnMgc3VwcG9ydGVkIGZvciBlYWNoIHZlcnRleCBzaGFkZXIgdmVyc2lvbiwgc2VlIFZlcnNpb24gMV94LCBWZXJzaW9uIDJfMCwgVmVyc2lvbiAyXzAgRXh0ZW5kZWQsIG9yIFZlcnNpb24gM18wLgorCQljYXBzLk1heFZlcnRleFNoYWRlckNvbnN0ID0gMjU2OwkJCQkvLyBUaGUgbnVtYmVyIG9mIHZlcnRleCBzaGFkZXIgUmVnaXN0ZXJzIHRoYXQgYXJlIHJlc2VydmVkIGZvciBjb25zdGFudHMuCisJCWNhcHMuUGl4ZWxTaGFkZXJWZXJzaW9uID0gcGl4ZWxTaGFkZXJWZXJzaW9uOwkvLyBUd28gbnVtYmVycyB0aGF0IHJlcHJlc2VudCB0aGUgcGl4ZWwgc2hhZGVyIG1haW4gYW5kIHN1YiB2ZXJzaW9ucy4gRm9yIG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIGluc3RydWN0aW9ucyBzdXBwb3J0ZWQgZm9yIGVhY2ggcGl4ZWwgc2hhZGVyIHZlcnNpb24sIHNlZSBWZXJzaW9uIDFfeCwgVmVyc2lvbiAyXzAsIFZlcnNpb24gMl8wIEV4dGVuZGVkLCBvciBWZXJzaW9uIDNfMC4KKwkJY2Fwcy5NYXhQaXhlbFNoYWRlclZhbHVlID0gOC4wOworCQkKKwkJKmNhcGFiaWxpdGllcyA9IGNhcHM7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNEODo6UmVnaXN0ZXJTb2Z0d2FyZURldmljZSh2b2lkICppbml0aWFsaXplRnVuY3Rpb24pCisJeworCQlUUkFDRSgiIik7CisKKwkJbG9hZFN5c3RlbUQzRDgoKTsKKworCQlpZihkM2Q4KQorCQl7CisJCQlyZXR1cm4gZDNkOC0+UmVnaXN0ZXJTb2Z0d2FyZURldmljZShpbml0aWFsaXplRnVuY3Rpb24pOworCQl9CisJCWVsc2UKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKwl9CisKKwl2b2lkIERpcmVjdDNEODo6bG9hZFN5c3RlbUQzRDgoKQorCXsKKwkJaWYoZDNkOCkKKwkJeworCQkJcmV0dXJuOworCQl9CisKKwkJY2hhciBkM2Q4UGF0aFtNQVhfUEFUSCArIDE2XTsKKwkJR2V0U3lzdGVtRGlyZWN0b3J5KGQzZDhQYXRoLCBNQVhfUEFUSCk7CisJCXN0cmNhdChkM2Q4UGF0aCwgIlxcZDNkOC5kbGwiKTsKKwkJZDNkOExpYiA9IExvYWRMaWJyYXJ5KGQzZDhQYXRoKTsKKworCQlpZihkM2Q4TGliKQorCQl7CisJCQl0eXBlZGVmIElEaXJlY3QzRDgqIChfX3N0ZGNhbGwgKkRJUkVDVDNEQ1JFQVRFOCkodW5zaWduZWQgaW50KTsKKwkJCURJUkVDVDNEQ1JFQVRFOCBkaXJlY3QzRENyZWF0ZTggPSAoRElSRUNUM0RDUkVBVEU4KUdldFByb2NBZGRyZXNzKGQzZDhMaWIsICJEaXJlY3QzRENyZWF0ZTgiKTsKKwkJCWQzZDggPSBkaXJlY3QzRENyZWF0ZTgoRDNEX1NES19WRVJTSU9OKTsKKwkJfQorCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0RpcmVjdDNEOC5ocHAgYi9zcmMvRDNEOC9EaXJlY3QzRDguaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwMTc4NDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOC9EaXJlY3QzRDguaHBwCkBAIC0wLDAgKzEsNzEgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgRDNEOF9EaXJlY3QzRDhfaHBwCisjZGVmaW5lIEQzRDhfRGlyZWN0M0Q4X2hwcAorCisjaW5jbHVkZSAiVW5rbm93bi5ocHAiCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPGluaXRndWlkLmg+CisjaW5jbHVkZSA8ZDNkOC5oPgorCituYW1lc3BhY2UgRDNEOAoreworCWNsYXNzIERpcmVjdDNERGV2aWNlODsKKworCWNsYXNzIERpcmVjdDNEOCA6IHB1YmxpYyBJRGlyZWN0M0Q4LCBwcm90ZWN0ZWQgVW5rbm93bgorCXsKKwlwdWJsaWM6CisJCURpcmVjdDNEOChpbnQgdmVyc2lvbiwgY29uc3QgSElOU1RBTkNFIGluc3RhbmNlKTsKKworCQl2aXJ0dWFsIH5EaXJlY3QzRDgoKTsKKworCQkvLyBJVW5rbm93biBtZXRob2RzCisJCWxvbmcgX19zdGRjYWxsIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgQWRkUmVmKCk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFJlbGVhc2UoKTsKKworCQkvLyBJRGlyZWN0M0Q4IG1ldGhvZHMKKwkJbG9uZyBfX3N0ZGNhbGwgQ2hlY2tEZXB0aFN0ZW5jaWxNYXRjaCh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNEREVWVFlQRSBkZXZpY2VUeXBlLCBEM0RGT1JNQVQgYWRhcHRlckZvcm1hdCwgRDNERk9STUFUIHJlbmRlclRhcmdldEZvcm1hdCwgRDNERk9STUFUIGRlcHRoU3RlbmNpbEZvcm1hdCk7CisJCWxvbmcgX19zdGRjYWxsIENoZWNrRGV2aWNlRm9ybWF0KHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEQzREZPUk1BVCBhZGFwYXRlckZvcm1hdCwgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNEUkVTT1VSQ0VUWVBFIHR5cGUsIEQzREZPUk1BVCBjaGVja0Zvcm1hdCk7CisJCWxvbmcgX19zdGRjYWxsIENoZWNrRGV2aWNlTXVsdGlTYW1wbGVUeXBlKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGRldmljZVR5cGUsIEQzREZPUk1BVCBzdXJmYWNlRm9ybWF0LCBpbnQgd2luZG93ZWQsIEQzRE1VTFRJU0FNUExFX1RZUEUgbXVsdGlTYW1wbGVUeXBlKTsKKwkJbG9uZyBfX3N0ZGNhbGwgQ2hlY2tEZXZpY2VUeXBlKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RERVZUWVBFIGNoZWNrVHlwZSwgRDNERk9STUFUIGRpc3BsYXlGb3JtYXQsIEQzREZPUk1BVCBiYWNrQnVmZmVyRm9ybWF0LCBpbnQgd2luZG93ZWQpOworCQlsb25nIF9fc3RkY2FsbCBDcmVhdGVEZXZpY2UodW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgSFdORCBmb2N1c1dpbmRvdywgdW5zaWduZWQgbG9uZyBiZWhhdmlvckZsYWdzLCBEM0RQUkVTRU5UX1BBUkFNRVRFUlMgKnByZXNlbnRQYXJhbWV0ZXJzLCBJRGlyZWN0M0REZXZpY2U4ICoqcmV0dXJuZWREZXZpY2VJbnRlcmZhY2UpOworCQlsb25nIF9fc3RkY2FsbCBFbnVtQWRhcHRlck1vZGVzKHVuc2lnbmVkIGludCBhZGFwdGVyLCB1bnNpZ25lZCBpbnQgaW5kZXgsIEQzRERJU1BMQVlNT0RFICptb2RlKTsKKwkJdW5zaWduZWQgaW50IF9fc3RkY2FsbCBHZXRBZGFwdGVyQ291bnQoKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0QWRhcHRlckRpc3BsYXlNb2RlKHVuc2lnbmVkIGludCBhZGFwdGVyLCBEM0RESVNQTEFZTU9ERSAqbW9kZSk7CisJCWxvbmcgX19zdGRjYWxsIEdldEFkYXB0ZXJJZGVudGlmaWVyKHVuc2lnbmVkIGludCBhZGFwdGVyLCB1bnNpZ25lZCBsb25nIGZsYWdzLCBEM0RBREFQVEVSX0lERU5USUZJRVI4ICppZGVudGlmaWVyKTsKKwkJdW5zaWduZWQgaW50IF9fc3RkY2FsbCBHZXRBZGFwdGVyTW9kZUNvdW50KHVuc2lnbmVkIGludCBhZGFwdGVyKTsKKwkJSE1PTklUT1IgX19zdGRjYWxsIEdldEFkYXB0ZXJNb25pdG9yKHVuc2lnbmVkIGludCBhZGFwdGVyKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0RGV2aWNlQ2Fwcyh1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNEREVWVFlQRSBkZXZpY2VUeXBlLCBEM0RDQVBTOCAqY2Fwcyk7CisJCWxvbmcgX19zdGRjYWxsIFJlZ2lzdGVyU29mdHdhcmVEZXZpY2Uodm9pZCAqaW5pdGlhbGl6ZUZ1bmN0aW9uKTsKKworCXByaXZhdGU6CisJCXZvaWQgbG9hZFN5c3RlbUQzRDgoKTsKKworCQkvLyBDcmVhdGlvbiBwYXJhbWV0ZXJzCisJCWNvbnN0IGludCB2ZXJzaW9uOworCQljb25zdCBISU5TVEFOQ0UgaW5zdGFuY2U7CisKKwkJREVWTU9ERSAqZGlzcGxheU1vZGU7CisJCWludCBudW1EaXNwbGF5TW9kZXM7CisKKwkJLy8gUmVhbCBEM0Q4IGxpYnJhcnkgYW5kIElEaXJlY3QzRDggb2JqZWN0CisJCUhNT0RVTEUgZDNkOExpYjsKKwkJSURpcmVjdDNEOCAqZDNkODsKKwl9OworfQorCisjZW5kaWYgICAvLyBEM0Q4X0RpcmVjdDNEOF9ocHAKZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0RpcmVjdDNEQmFzZVRleHR1cmU4LmNwcCBiL3NyYy9EM0Q4L0RpcmVjdDNEQmFzZVRleHR1cmU4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYTNmMjA4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDgvRGlyZWN0M0RCYXNlVGV4dHVyZTguY3BwCkBAIC0wLDAgKzEsMTU2IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiRGlyZWN0M0RCYXNlVGV4dHVyZTguaHBwIgorCisjaW5jbHVkZSAiUmVzb3VyY2UuaHBwIgorI2luY2x1ZGUgIkRlYnVnLmhwcCIKKworbmFtZXNwYWNlIEQzRDgKK3sKKwlEaXJlY3QzREJhc2VUZXh0dXJlODo6RGlyZWN0M0RCYXNlVGV4dHVyZTgoRGlyZWN0M0REZXZpY2U4ICpkZXZpY2UsIEQzRFJFU09VUkNFVFlQRSB0eXBlLCB1bnNpZ25lZCBsb25nIGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSkgOiBEaXJlY3QzRFJlc291cmNlOChkZXZpY2UsIHR5cGUsIDApLCBsZXZlbHMobGV2ZWxzKSwgdXNhZ2UodXNhZ2UpCisJeworCQlmaWx0ZXJUeXBlID0gRDNEVEVYRl9MSU5FQVI7CisJCUxPRCA9IDA7CisKKwkJcmVzb3VyY2UgPSBuZXcgc3c6OlJlc291cmNlKDApOworCX0KKworCURpcmVjdDNEQmFzZVRleHR1cmU4Ojp+RGlyZWN0M0RCYXNlVGV4dHVyZTgoKQorCXsKKwkJcmVzb3VyY2UtPmRlc3RydWN0KCk7CisJfQorCQorCWxvbmcgRGlyZWN0M0RCYXNlVGV4dHVyZTg6OlF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKGlpZCA9PSBJSURfSURpcmVjdDNEQmFzZVRleHR1cmU4IHx8CisJCSAgIGlpZCA9PSBJSURfSURpcmVjdDNEUmVzb3VyY2U4IHx8CisJCSAgIGlpZCA9PSBJSURfSVVua25vd24pCisJCXsKKwkJCUFkZFJlZigpOworCQkJKm9iamVjdCA9IHRoaXM7CisKKwkJCXJldHVybiBTX09LOworCQl9CisKKwkJKm9iamVjdCA9IDA7CisKKwkJcmV0dXJuIE5PSU5URVJGQUNFKGlpZCk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzREJhc2VUZXh0dXJlODo6QWRkUmVmKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTg6OkFkZFJlZigpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RCYXNlVGV4dHVyZTg6OlJlbGVhc2UoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzRFJlc291cmNlODo6UmVsZWFzZSgpOworCX0KKworCWxvbmcgRGlyZWN0M0RCYXNlVGV4dHVyZTg6OkZyZWVQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzRFJlc291cmNlODo6RnJlZVByaXZhdGVEYXRhKGd1aWQpOworCX0KKworCWxvbmcgRGlyZWN0M0RCYXNlVGV4dHVyZTg6OkdldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U4OjpHZXRQcml2YXRlRGF0YShndWlkLCBkYXRhLCBzaXplKTsKKwl9CisKKwl2b2lkIERpcmVjdDNEQmFzZVRleHR1cmU4OjpQcmVMb2FkKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlEaXJlY3QzRFJlc291cmNlODo6UHJlTG9hZCgpOworCX0KKworCWxvbmcgRGlyZWN0M0RCYXNlVGV4dHVyZTg6OlNldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTg6OlNldFByaXZhdGVEYXRhKGd1aWQsIGRhdGEsIHNpemUsIGZsYWdzKTsKKwl9CisKKwlsb25nIERpcmVjdDNEQmFzZVRleHR1cmU4OjpHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOCAqKmRldmljZSkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTg6OkdldERldmljZShkZXZpY2UpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RCYXNlVGV4dHVyZTg6OlNldFByaW9yaXR5KHVuc2lnbmVkIGxvbmcgbmV3UHJpb3JpdHkpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U4OjpTZXRQcmlvcml0eShuZXdQcmlvcml0eSk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzREJhc2VUZXh0dXJlODo6R2V0UHJpb3JpdHkoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzRFJlc291cmNlODo6R2V0UHJpb3JpdHkoKTsKKwl9CisKKwlEM0RSRVNPVVJDRVRZUEUgRGlyZWN0M0RCYXNlVGV4dHVyZTg6OkdldFR5cGUoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzRFJlc291cmNlODo6R2V0VHlwZSgpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RCYXNlVGV4dHVyZTg6OkdldExldmVsQ291bnQoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBsZXZlbHM7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzREJhc2VUZXh0dXJlODo6R2V0TE9EKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gTE9EOworCX0KKworCWxvbmcgRGlyZWN0M0RCYXNlVGV4dHVyZTg6OlNldExPRChsb25nIG5ld0xPRCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlMT0QgPSBuZXdMT0Q7CisKKwkJcmV0dXJuIDA7ICAgLy8gVE9ETworCX0KKworCXN3OjpSZXNvdXJjZSAqRGlyZWN0M0RCYXNlVGV4dHVyZTg6OmdldFJlc291cmNlKCkgY29uc3QKKwl7CisJCXJldHVybiByZXNvdXJjZTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEQmFzZVRleHR1cmU4OjpnZXRJbnRlcm5hbExldmVsQ291bnQoKQorCXsKKwkJcmV0dXJuIGxldmVsczsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvRDNEOC9EaXJlY3QzREJhc2VUZXh0dXJlOC5ocHAgYi9zcmMvRDNEOC9EaXJlY3QzREJhc2VUZXh0dXJlOC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI2OWFiYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9EM0Q4L0RpcmVjdDNEQmFzZVRleHR1cmU4LmhwcApAQCAtMCwwICsxLDczIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIEQzRDhfRGlyZWN0M0RCYXNlVGV4dHVyZThfaHBwCisjZGVmaW5lIEQzRDhfRGlyZWN0M0RCYXNlVGV4dHVyZThfaHBwCisKKyNpbmNsdWRlICJEaXJlY3QzRFJlc291cmNlOC5ocHAiCisKKyNpbmNsdWRlIDxkM2Q4Lmg+CisKK25hbWVzcGFjZSBzdworeworCWNsYXNzIFJlc291cmNlOworfQorCituYW1lc3BhY2UgRDNEOAoreworCWNsYXNzIERpcmVjdDNEQmFzZVRleHR1cmU4IDogcHVibGljIElEaXJlY3QzREJhc2VUZXh0dXJlOCwgcHVibGljIERpcmVjdDNEUmVzb3VyY2U4CisJeworCXB1YmxpYzoKKwkJRGlyZWN0M0RCYXNlVGV4dHVyZTgoRGlyZWN0M0REZXZpY2U4ICpkZXZpY2UsIEQzRFJFU09VUkNFVFlQRSB0eXBlLCB1bnNpZ25lZCBsb25nIGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSk7CisKKwkJdmlydHVhbCB+RGlyZWN0M0RCYXNlVGV4dHVyZTgoKTsKKworCQkvLyBJVW5rbm93biBtZXRob2RzCisJCWxvbmcgX19zdGRjYWxsIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgQWRkUmVmKCk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFJlbGVhc2UoKTsKKworCQkvLyBJRGlyZWN0M0RSZXNvdXJjZTggbWV0aG9kcworCQlsb25nIF9fc3RkY2FsbCBGcmVlUHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCk7CisJCWxvbmcgX19zdGRjYWxsIEdldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpOworCQl2b2lkIF9fc3RkY2FsbCBQcmVMb2FkKCk7CisJCWxvbmcgX19zdGRjYWxsIFNldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncyk7CisJCWxvbmcgX19zdGRjYWxsIEdldERldmljZShJRGlyZWN0M0REZXZpY2U4ICoqZGV2aWNlKTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgU2V0UHJpb3JpdHkodW5zaWduZWQgbG9uZyBuZXdQcmlvcml0eSk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEdldFByaW9yaXR5KCk7CisJCUQzRFJFU09VUkNFVFlQRSBfX3N0ZGNhbGwgR2V0VHlwZSgpOworCisJCS8vIElEaXJlY3QzREJhc2VUZXh0dXJlOCBtZXRob2RzCisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEdldExldmVsQ291bnQoKTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgR2V0TE9EKCk7CisJCWxvbmcgX19zdGRjYWxsIFNldExPRChsb25nIG5ld0xPRCk7CisKKwkJLy8gSW50ZW5hbCBtZXRob2RzCisJCXN3OjpSZXNvdXJjZSAqZ2V0UmVzb3VyY2UoKSBjb25zdDsKKwkJdW5zaWduZWQgbG9uZyBnZXRJbnRlcm5hbExldmVsQ291bnQoKTsKKworCXByb3RlY3RlZDoKKwkJLy8gQ3JlYXRpb24gcGFyYW10ZXJzCisJCXVuc2lnbmVkIGxvbmcgbGV2ZWxzOyAgIC8vIFJlY2FsY3VsYXRlZCB3aGVuIDAKKwkJY29uc3QgdW5zaWduZWQgbG9uZyB1c2FnZTsKKworCQlzdzo6UmVzb3VyY2UgKnJlc291cmNlOworCisJcHJpdmF0ZToKKwkJRDNEVEVYVFVSRUZJTFRFUlRZUEUgZmlsdGVyVHlwZTsKKwkJdW5zaWduZWQgbG9uZyBMT0Q7CisJfTsKK30KKworI2VuZGlmIC8vIEQzRDhfRGlyZWN0M0RCYXNlVGV4dHVyZThfaHBwCmRpZmYgLS1naXQgYS9zcmMvRDNEOC9EaXJlY3QzREN1YmVUZXh0dXJlOC5jcHAgYi9zcmMvRDNEOC9EaXJlY3QzREN1YmVUZXh0dXJlOC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDhiNGEzYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9EM0Q4L0RpcmVjdDNEQ3ViZVRleHR1cmU4LmNwcApAQCAtMCwwICsxLDI1NSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgIkRpcmVjdDNEQ3ViZVRleHR1cmU4LmhwcCIKKworI2luY2x1ZGUgIkRpcmVjdDNEU3VyZmFjZTguaHBwIgorI2luY2x1ZGUgIlJlc291cmNlLmhwcCIKKyNpbmNsdWRlICJEZWJ1Zy5ocHAiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworbmFtZXNwYWNlIEQzRDgKK3sKKwlEaXJlY3QzREN1YmVUZXh0dXJlODo6RGlyZWN0M0RDdWJlVGV4dHVyZTgoRGlyZWN0M0REZXZpY2U4ICpkZXZpY2UsIHVuc2lnbmVkIGludCBlZGdlTGVuZ3RoLCB1bnNpZ25lZCBpbnQgbGV2ZWxzLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wpIDogRGlyZWN0M0RCYXNlVGV4dHVyZTgoZGV2aWNlLCBEM0RSVFlQRV9DVUJFVEVYVFVSRSwgbGV2ZWxzLCB1c2FnZSksIGVkZ2VMZW5ndGgoZWRnZUxlbmd0aCksIGZvcm1hdChmb3JtYXQpLCBwb29sKHBvb2wpCisJeworCQlpZihsZXZlbHMgPT0gMCkKKwkJeworCQkJdGhpcy0+bGV2ZWxzID0gc3c6OmxvZzIoc3c6Om1heCgoaW50KWVkZ2VMZW5ndGgsIDEpKSArIDE7CisJCX0KKworCQlmb3IodW5zaWduZWQgaW50IGZhY2UgPSAwOyBmYWNlIDwgNjsgZmFjZSsrKQorCQl7CisJCQlpbnQgd2lkdGggPSBlZGdlTGVuZ3RoOworCQkJaW50IGhlaWdodCA9IGVkZ2VMZW5ndGg7CisKKwkJCWZvcih1bnNpZ25lZCBpbnQgbGV2ZWwgPSAwOyBsZXZlbCA8IHN3OjpNSVBNQVBfTEVWRUxTOyBsZXZlbCsrKQorCQkJeworCQkJCWlmKGxldmVsIDwgdGhpcy0+bGV2ZWxzKQorCQkJCXsJCQkJCQorCQkJCQlzdXJmYWNlTGV2ZWxbZmFjZV1bbGV2ZWxdID0gbmV3IERpcmVjdDNEU3VyZmFjZTgoZGV2aWNlLCB0aGlzLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHBvb2wsIEQzRE1VTFRJU0FNUExFX05PTkUsIHRydWUsIHVzYWdlKTsKKwkJCQkJc3VyZmFjZUxldmVsW2ZhY2VdW2xldmVsXS0+YmluZCgpOworCQkJCX0KKwkJCQllbHNlCisJCQkJeworCQkJCQlzdXJmYWNlTGV2ZWxbZmFjZV1bbGV2ZWxdID0gMDsKKwkJCQl9CisKKwkJCQl3aWR0aCA9IHN3OjptYXgoMSwgd2lkdGggLyAyKTsKKwkJCQloZWlnaHQgPSBzdzo6bWF4KDEsIGhlaWdodCAvIDIpOworCQkJfQorCQl9CisJfQorCisJRGlyZWN0M0RDdWJlVGV4dHVyZTg6On5EaXJlY3QzREN1YmVUZXh0dXJlOCgpCisJeworCQlyZXNvdXJjZS0+bG9jayhzdzo6REVTVFJVQ1QpOworCisJCWZvcih1bnNpZ25lZCBpbnQgZmFjZSA9IDA7IGZhY2UgPCA2OyBmYWNlKyspCisJCXsKKwkJCWZvcihpbnQgbGV2ZWwgPSAwOyBsZXZlbCA8IHN3OjpNSVBNQVBfTEVWRUxTOyBsZXZlbCsrKQorCQkJeworCQkJCWlmKHN1cmZhY2VMZXZlbFtmYWNlXVtsZXZlbF0pCisJCQkJeworCQkJCQlzdXJmYWNlTGV2ZWxbZmFjZV1bbGV2ZWxdLT51bmJpbmQoKTsKKwkJCQkJc3VyZmFjZUxldmVsW2ZhY2VdW2xldmVsXSA9IDA7CisJCQkJfQorCQkJfQorCQl9CisKKwkJcmVzb3VyY2UtPnVubG9jaygpOworCX0KKworCWxvbmcgRGlyZWN0M0RDdWJlVGV4dHVyZTg6OlF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKGlpZCA9PSBJSURfSURpcmVjdDNEQ3ViZVRleHR1cmU4IHx8CisJCSAgIGlpZCA9PSBJSURfSURpcmVjdDNEQmFzZVRleHR1cmU4IHx8CisJCSAgIGlpZCA9PSBJSURfSURpcmVjdDNEUmVzb3VyY2U4IHx8CisJCSAgIGlpZCA9PSBJSURfSVVua25vd24pCisJCXsKKwkJCUFkZFJlZigpOworCQkJKm9iamVjdCA9IHRoaXM7CisKKwkJCXJldHVybiBTX09LOworCQl9CisKKwkJKm9iamVjdCA9IDA7CisKKwkJcmV0dXJuIE5PSU5URVJGQUNFKGlpZCk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzREN1YmVUZXh0dXJlODo6QWRkUmVmKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTg6OkFkZFJlZigpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RDdWJlVGV4dHVyZTg6OlJlbGVhc2UoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlODo6UmVsZWFzZSgpOworCX0KKworCWxvbmcgRGlyZWN0M0RDdWJlVGV4dHVyZTg6OkZyZWVQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlODo6RnJlZVByaXZhdGVEYXRhKGd1aWQpOworCX0KKworCWxvbmcgRGlyZWN0M0RDdWJlVGV4dHVyZTg6OkdldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU4OjpHZXRQcml2YXRlRGF0YShndWlkLCBkYXRhLCBzaXplKTsKKwl9CisKKwl2b2lkIERpcmVjdDNEQ3ViZVRleHR1cmU4OjpQcmVMb2FkKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlEaXJlY3QzREJhc2VUZXh0dXJlODo6UHJlTG9hZCgpOworCX0KKworCWxvbmcgRGlyZWN0M0RDdWJlVGV4dHVyZTg6OlNldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTg6OlNldFByaXZhdGVEYXRhKGd1aWQsIGRhdGEsIHNpemUsIGZsYWdzKTsKKwl9CisKKwlsb25nIERpcmVjdDNEQ3ViZVRleHR1cmU4OjpHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOCAqKmRldmljZSkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTg6OkdldERldmljZShkZXZpY2UpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RDdWJlVGV4dHVyZTg6OlNldFByaW9yaXR5KHVuc2lnbmVkIGxvbmcgbmV3UHJpb3JpdHkpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU4OjpTZXRQcmlvcml0eShuZXdQcmlvcml0eSk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzREN1YmVUZXh0dXJlODo6R2V0UHJpb3JpdHkoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlODo6R2V0UHJpb3JpdHkoKTsKKwl9CisKKwlEM0RSRVNPVVJDRVRZUEUgRGlyZWN0M0RDdWJlVGV4dHVyZTg6OkdldFR5cGUoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlODo6R2V0VHlwZSgpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RDdWJlVGV4dHVyZTg6OkdldExldmVsQ291bnQoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlODo6R2V0TGV2ZWxDb3VudCgpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RDdWJlVGV4dHVyZTg6OkdldExPRCgpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU4OjpHZXRMT0QoKTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEQ3ViZVRleHR1cmU4OjpTZXRMT0QodW5zaWduZWQgbG9uZyBuZXdMT0QpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU4OjpTZXRMT0QobmV3TE9EKTsKKwl9CisKKwlsb25nIERpcmVjdDNEQ3ViZVRleHR1cmU4OjpBZGREaXJ0eVJlY3QoRDNEQ1VCRU1BUF9GQUNFUyBmYWNlLCBjb25zdCBSRUNUICpkaXJ0eVJlY3QpCisJeworCQlUUkFDRSgiIik7CisKKwkvLwlVTklNUExFTUVOVEVEKCk7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNEQ3ViZVRleHR1cmU4OjpHZXRDdWJlTWFwU3VyZmFjZShEM0RDVUJFTUFQX0ZBQ0VTIGZhY2UsIHVuc2lnbmVkIGludCBsZXZlbCAsIElEaXJlY3QzRFN1cmZhY2U4ICoqY3ViZU1hcFN1cmZhY2UpCisJeworCQlUUkFDRSgiIik7CisKKwkJKmN1YmVNYXBTdXJmYWNlID0gMDsgICAvLyBGSVhNRTogVmVyaWZ5CisKKwkJaWYoZmFjZSA+PSA2IHx8IGxldmVsID49IEdldExldmVsQ291bnQoKSB8fCAhc3VyZmFjZUxldmVsW2ZhY2VdW2xldmVsXSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlzdXJmYWNlTGV2ZWxbZmFjZV1bbGV2ZWxdLT5BZGRSZWYoKTsKKwkJKmN1YmVNYXBTdXJmYWNlID0gc3VyZmFjZUxldmVsW2ZhY2VdW2xldmVsXTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0RDdWJlVGV4dHVyZTg6OkdldExldmVsRGVzYyh1bnNpZ25lZCBpbnQgbGV2ZWwsIEQzRFNVUkZBQ0VfREVTQyAqZGVzY3JpcHRpb24pCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoIWRlc2NyaXB0aW9uIHx8IGxldmVsID49IEdldExldmVsQ291bnQoKSB8fCAhc3VyZmFjZUxldmVsWzBdW2xldmVsXSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlzdXJmYWNlTGV2ZWxbMF1bbGV2ZWxdLT5HZXREZXNjKGRlc2NyaXB0aW9uKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0RDdWJlVGV4dHVyZTg6OkxvY2tSZWN0KEQzRENVQkVNQVBfRkFDRVMgZmFjZSwgdW5zaWduZWQgaW50IGxldmVsLCBEM0RMT0NLRURfUkVDVCAqbG9ja2VkUmVjdCwgY29uc3QgUkVDVCAqcmVjdCwgdW5zaWduZWQgbG9uZyBmbGFncykKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZighbG9ja2VkUmVjdCB8fCBmYWNlID49IDYgfHwgbGV2ZWwgPj0gR2V0TGV2ZWxDb3VudCgpIHx8ICFzdXJmYWNlTGV2ZWxbZmFjZV1bbGV2ZWxdKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCXN1cmZhY2VMZXZlbFtmYWNlXVtsZXZlbF0tPkxvY2tSZWN0KGxvY2tlZFJlY3QsIHJlY3QsIGZsYWdzKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0RDdWJlVGV4dHVyZTg6OlVubG9ja1JlY3QoRDNEQ1VCRU1BUF9GQUNFUyBmYWNlLCB1bnNpZ25lZCBpbnQgbGV2ZWwpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoZmFjZSA+PSA2IHx8IGxldmVsID49IEdldExldmVsQ291bnQoKSB8fCAhc3VyZmFjZUxldmVsW2ZhY2VdW2xldmVsXSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlyZXR1cm4gc3VyZmFjZUxldmVsW2ZhY2VdW2xldmVsXS0+VW5sb2NrUmVjdCgpOworCX0KKworCURpcmVjdDNEU3VyZmFjZTggKkRpcmVjdDNEQ3ViZVRleHR1cmU4OjpnZXRJbnRlcm5hbEN1YmVNYXBTdXJmYWNlKEQzRENVQkVNQVBfRkFDRVMgZmFjZSwgdW5zaWduZWQgaW50IGxldmVsKQorCXsKKwkJcmV0dXJuIHN1cmZhY2VMZXZlbFtmYWNlXVtsZXZlbF07CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDgvRGlyZWN0M0RDdWJlVGV4dHVyZTguaHBwIGIvc3JjL0QzRDgvRGlyZWN0M0RDdWJlVGV4dHVyZTguaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxMDcxNTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOC9EaXJlY3QzREN1YmVUZXh0dXJlOC5ocHAKQEAgLTAsMCArMSw3NSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBEM0Q4X0RpcmVjdDNEQ3ViZVRleHR1cmU4X2hwcAorI2RlZmluZSBEM0Q4X0RpcmVjdDNEQ3ViZVRleHR1cmU4X2hwcAorCisjaW5jbHVkZSAiRGlyZWN0M0RCYXNlVGV4dHVyZTguaHBwIgorCisjaW5jbHVkZSAiQ29uZmlnLmhwcCIKKworI2luY2x1ZGUgPGQzZDguaD4KKworbmFtZXNwYWNlIEQzRDgKK3sKKwljbGFzcyBEaXJlY3QzRFN1cmZhY2U4OworCisJY2xhc3MgRGlyZWN0M0RDdWJlVGV4dHVyZTggOiBwdWJsaWMgSURpcmVjdDNEQ3ViZVRleHR1cmU4LCBwdWJsaWMgRGlyZWN0M0RCYXNlVGV4dHVyZTgKKwl7CisJcHVibGljOgorCQlEaXJlY3QzREN1YmVUZXh0dXJlOChEaXJlY3QzRERldmljZTggKmRldmljZSwgdW5zaWduZWQgaW50IGVkZ2VMZW5ndGgsIHVuc2lnbmVkIGludCBsZXZlbHMsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIEQzREZPUk1BVCBmb3JtYXQsIEQzRFBPT0wgcG9vbCk7CisKKwkJdmlydHVhbCB+RGlyZWN0M0RDdWJlVGV4dHVyZTgoKTsKKworCQkvLyBJVW5rbm93biBtZXRob2RzCisJCWxvbmcgX19zdGRjYWxsIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgQWRkUmVmKCk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFJlbGVhc2UoKTsKKworCQkvLyBJRGlyZWN0M0RSZXNvdXJjZTggbWV0aG9kcworCQlsb25nIF9fc3RkY2FsbCBGcmVlUHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCk7CisJCWxvbmcgX19zdGRjYWxsIEdldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpOworCQl2b2lkIF9fc3RkY2FsbCBQcmVMb2FkKCk7CisJCWxvbmcgX19zdGRjYWxsIFNldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncyk7CisJCWxvbmcgX19zdGRjYWxsIEdldERldmljZShJRGlyZWN0M0REZXZpY2U4ICoqZGV2aWNlKTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgU2V0UHJpb3JpdHkodW5zaWduZWQgbG9uZyBuZXdQcmlvcml0eSk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEdldFByaW9yaXR5KCk7CisJCUQzRFJFU09VUkNFVFlQRSBfX3N0ZGNhbGwgR2V0VHlwZSgpOworCisJCS8vIElEaXJlY3QzREJhc2VUZXh0dXJlIG1ldGhvZHMKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgR2V0TGV2ZWxDb3VudCgpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBHZXRMT0QoKTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgU2V0TE9EKHVuc2lnbmVkIGxvbmcgbmV3TE9EKTsKKworCQkvLyBJRGlyZWN0M0RDdWJlVGV4dHVyZTggbWV0aG9kcworCQlsb25nIF9fc3RkY2FsbCBBZGREaXJ0eVJlY3QoRDNEQ1VCRU1BUF9GQUNFUyBmYWNlLCBjb25zdCBSRUNUICpkaXJ0eVJlY3QpOworCQlsb25nIF9fc3RkY2FsbCBHZXRDdWJlTWFwU3VyZmFjZShEM0RDVUJFTUFQX0ZBQ0VTIGZhY2UsIHVuc2lnbmVkIGludCBsZXZlbCAsIElEaXJlY3QzRFN1cmZhY2U4ICoqY3ViZU1hcFN1cmZhY2UpOworCQlsb25nIF9fc3RkY2FsbCBHZXRMZXZlbERlc2ModW5zaWduZWQgaW50IGxldmVsLCBEM0RTVVJGQUNFX0RFU0MgKmRlc2NyaXB0aW9uKTsKKwkJbG9uZyBfX3N0ZGNhbGwgTG9ja1JlY3QoRDNEQ1VCRU1BUF9GQUNFUyBmYWNlLCB1bnNpZ25lZCBpbnQgbGV2ZWwsIEQzRExPQ0tFRF9SRUNUICpsb2NrZWRSZWN0LCBjb25zdCBSRUNUICpyZWN0LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKwkJbG9uZyBfX3N0ZGNhbGwgVW5sb2NrUmVjdChEM0RDVUJFTUFQX0ZBQ0VTIGZhY2UsIHVuc2lnbmVkIGludCBsZXZlbCk7CisKKwkJLy8gSW50ZXJuYWwgbWV0aG9kcworCQlEaXJlY3QzRFN1cmZhY2U4ICpnZXRJbnRlcm5hbEN1YmVNYXBTdXJmYWNlKEQzRENVQkVNQVBfRkFDRVMgZmFjZSwgdW5zaWduZWQgaW50IGxldmVsKTsKKworCXByaXZhdGU6CisJCS8vIENyZWF0aW9uIHBhcmFtZXRlcnMKKwkJY29uc3QgdW5zaWduZWQgaW50IGVkZ2VMZW5ndGg7CisJCWNvbnN0IEQzREZPUk1BVCBmb3JtYXQ7CisJCWNvbnN0IEQzRFBPT0wgcG9vbDsKKworCQlEaXJlY3QzRFN1cmZhY2U4ICpzdXJmYWNlTGV2ZWxbNl1bc3c6Ok1JUE1BUF9MRVZFTFNdOworCX07Cit9CisKKyNlbmRpZiAvLyBEM0Q4X0RpcmVjdDNEOF9ocHAKZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0RpcmVjdDNERGV2aWNlOC5jcHAgYi9zcmMvRDNEOC9EaXJlY3QzRERldmljZTguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZmODVhN2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOC9EaXJlY3QzRERldmljZTguY3BwCkBAIC0wLDAgKzEsNDkyNiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgIkRpcmVjdDNERGV2aWNlOC5ocHAiCisKKyNpbmNsdWRlICJEaXJlY3QzRDguaHBwIgorI2luY2x1ZGUgIkRpcmVjdDNEU3VyZmFjZTguaHBwIgorI2luY2x1ZGUgIkRpcmVjdDNESW5kZXhCdWZmZXI4LmhwcCIKKyNpbmNsdWRlICJEaXJlY3QzRFZlcnRleEJ1ZmZlcjguaHBwIgorI2luY2x1ZGUgIkRpcmVjdDNEVGV4dHVyZTguaHBwIgorI2luY2x1ZGUgIkRpcmVjdDNEVm9sdW1lVGV4dHVyZTguaHBwIgorI2luY2x1ZGUgIkRpcmVjdDNEQ3ViZVRleHR1cmU4LmhwcCIKKyNpbmNsdWRlICJEaXJlY3QzRFN3YXBDaGFpbjguaHBwIgorI2luY2x1ZGUgIkRpcmVjdDNEUGl4ZWxTaGFkZXI4LmhwcCIKKyNpbmNsdWRlICJEaXJlY3QzRFZlcnRleFNoYWRlcjguaHBwIgorI2luY2x1ZGUgIkRpcmVjdDNEVm9sdW1lOC5ocHAiCisKKyNpbmNsdWRlICJEZWJ1Zy5ocHAiCisjaW5jbHVkZSAiQ2FwYWJpbGl0aWVzLmhwcCIKKyNpbmNsdWRlICJSZW5kZXJlci5ocHAiCisjaW5jbHVkZSAiQ29uZmlnLmhwcCIKKyNpbmNsdWRlICJGcmFtZUJ1ZmZlci5ocHAiCisjaW5jbHVkZSAiQ2xpcHBlci5ocHAiCisjaW5jbHVkZSAiQ29uZmlndXJhdG9yLmhwcCIKKyNpbmNsdWRlICJUaW1lci5ocHAiCisjaW5jbHVkZSAiUmVzb3VyY2UuaHBwIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK2Jvb2wgbG9jYWxTaGFkZXJDb25zdGFudHMgPSBmYWxzZTsKKworbmFtZXNwYWNlIEQzRDgKK3sKKwlpbmxpbmUgdW5zaWduZWQgbG9uZyBGdG9EVyhmbG9hdCBmKSAgIC8vIEZJWE1FOiBEZXByZWNhdGUKKwl7CisJCXJldHVybiAodW5zaWduZWQgbG9uZyYpZjsKKwl9CisKKwlEaXJlY3QzRERldmljZTg6OkRpcmVjdDNERGV2aWNlOChjb25zdCBISU5TVEFOQ0UgaW5zdGFuY2UsIERpcmVjdDNEOCAqZDNkOCwgdW5zaWduZWQgaW50IGFkYXB0ZXIsIEQzRERFVlRZUEUgZGV2aWNlVHlwZSwgSFdORCBmb2N1c1dpbmRvdywgdW5zaWduZWQgbG9uZyBiZWhhdmlvdXJGbGFncywgRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycykgOiBpbnN0YW5jZShpbnN0YW5jZSksIGQzZDgoZDNkOCksIGFkYXB0ZXIoYWRhcHRlciksIGRldmljZVR5cGUoZGV2aWNlVHlwZSksIGZvY3VzV2luZG93KGZvY3VzV2luZG93KSwgYmVoYXZpb3VyRmxhZ3MoYmVoYXZpb3VyRmxhZ3MpLCBwcmVzZW50UGFyYW1ldGVycygqcHJlc2VudFBhcmFtZXRlcnMpCisJeworCQlpbml0ID0gdHJ1ZTsKKwkJcmVjb3JkU3RhdGUgPSBmYWxzZTsKKworCQlkM2Q4LT5BZGRSZWYoKTsKKworCQljb250ZXh0ID0gbmV3IHN3OjpDb250ZXh0KCk7CisJCXJlbmRlcmVyID0gbmV3IHN3OjpSZW5kZXJlcihjb250ZXh0LCBzdzo6RGlyZWN0M0QsIGZhbHNlKTsKKworCQlzd2FwQ2hhaW4ucHVzaF9iYWNrKDApOworCQlkZXB0aFN0ZW5jaWwgPSAwOworCQlyZW5kZXJUYXJnZXQgPSAwOworCisJCWZvcihpbnQgaSA9IDA7IGkgPCA4OyBpKyspCisJCXsKKwkJCXRleHR1cmVbaV0gPSAwOworCQl9CisKKwkJY3Vyc29yID0gMDsKKwkJdW5zaWduZWQgY2hhciBvbmVbMzIgKiAzMiAvIHNpemVvZih1bnNpZ25lZCBjaGFyKV07CisJCW1lbXNldChvbmUsIDB4RkZGRkZGRkYsIHNpemVvZihvbmUpKTsKKwkJdW5zaWduZWQgY2hhciB6ZXJvWzMyICogMzIgLyBzaXplb2YodW5zaWduZWQgY2hhcildID0gezB9OworCQludWxsQ3Vyc29yID0gQ3JlYXRlQ3Vyc29yKGluc3RhbmNlLCAwLCAwLCAzMiwgMzIsIG9uZSwgemVybyk7CisJCXdpbjMyQ3Vyc29yID0gR2V0Q3Vyc29yKCk7CisKKwkJUmVzZXQocHJlc2VudFBhcmFtZXRlcnMpOworCisJCXBpeGVsU2hhZGVyLnB1c2hfYmFjaygwKTsgICAvLyBwaXhlbFNoYWRlclswXSA9IDAKKwkJdmVydGV4U2hhZGVyLnB1c2hfYmFjaygwKTsgICAvLyB2ZXJ0ZXhTaGFkZXJbMF0gPSAwCisJCXZlcnRleFNoYWRlckhhbmRsZSA9IDA7CisJCXBpeGVsU2hhZGVySGFuZGxlID0gMDsKKworCQlsaWdodHNEaXJ0eSA9IHRydWU7CisJCQkJCisJCWZvcihpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKQorCQl7CisJCQlkYXRhU3RyZWFtW2ldID0gMDsKKwkJCXN0cmVhbVN0cmlkZVtpXSA9IDA7CisJCX0KKworCQlpbmRleERhdGEgPSAwOworCQliYXNlVmVydGV4SW5kZXggPSAwOworCQlkZWNsYXJhdGlvbiA9IDA7CisJCUZWRiA9IDA7CisKKwkJRDNETUFURVJJQUw4IG1hdGVyaWFsOworCisJCW1hdGVyaWFsLkRpZmZ1c2UuciA9IDEuMGY7CisJCW1hdGVyaWFsLkRpZmZ1c2UuZyA9IDEuMGY7CisJCW1hdGVyaWFsLkRpZmZ1c2UuYiA9IDEuMGY7CisJCW1hdGVyaWFsLkRpZmZ1c2UuYSA9IDAuMGY7CisJCW1hdGVyaWFsLkFtYmllbnQuciA9IDAuMGY7CisJCW1hdGVyaWFsLkFtYmllbnQuZyA9IDAuMGY7CisJCW1hdGVyaWFsLkFtYmllbnQuYiA9IDAuMGY7CisJCW1hdGVyaWFsLkFtYmllbnQuYSA9IDAuMGY7CisJCW1hdGVyaWFsLkVtaXNzaXZlLnIgPSAwLjBmOworCQltYXRlcmlhbC5FbWlzc2l2ZS5nID0gMC4wZjsKKwkJbWF0ZXJpYWwuRW1pc3NpdmUuYiA9IDAuMGY7CisJCW1hdGVyaWFsLkVtaXNzaXZlLmEgPSAwLjBmOworCQltYXRlcmlhbC5TcGVjdWxhci5yID0gMC4wZjsKKwkJbWF0ZXJpYWwuU3BlY3VsYXIuZyA9IDAuMGY7CisJCW1hdGVyaWFsLlNwZWN1bGFyLmIgPSAwLjBmOworCQltYXRlcmlhbC5TcGVjdWxhci5hID0gMC4wZjsKKwkJbWF0ZXJpYWwuUG93ZXIgPSAwLjBmOworCisJCVNldE1hdGVyaWFsKCZtYXRlcmlhbCk7CisKKwkJRDNETUFUUklYIGlkZW50aXR5ID0gezEsIDAsIDAsIDAsCisJCQkgICAgICAgICAgICAgICAgICAwLCAxLCAwLCAwLAorCQkJCQkJCSAgMCwgMCwgMSwgMCwKKwkJCQkJCQkgIDAsIDAsIDAsIDF9OworCisJCVNldFRyYW5zZm9ybShEM0RUU19WSUVXLCAmaWRlbnRpdHkpOworCQlTZXRUcmFuc2Zvcm0oRDNEVFNfUFJPSkVDVElPTiwgJmlkZW50aXR5KTsKKwkJU2V0VHJhbnNmb3JtKEQzRFRTX1RFWFRVUkUwLCAmaWRlbnRpdHkpOworCQlTZXRUcmFuc2Zvcm0oRDNEVFNfVEVYVFVSRTEsICZpZGVudGl0eSk7CisJCVNldFRyYW5zZm9ybShEM0RUU19URVhUVVJFMiwgJmlkZW50aXR5KTsKKwkJU2V0VHJhbnNmb3JtKEQzRFRTX1RFWFRVUkUzLCAmaWRlbnRpdHkpOworCQlTZXRUcmFuc2Zvcm0oRDNEVFNfVEVYVFVSRTQsICZpZGVudGl0eSk7CisJCVNldFRyYW5zZm9ybShEM0RUU19URVhUVVJFNSwgJmlkZW50aXR5KTsKKwkJU2V0VHJhbnNmb3JtKEQzRFRTX1RFWFRVUkU2LCAmaWRlbnRpdHkpOworCQlTZXRUcmFuc2Zvcm0oRDNEVFNfVEVYVFVSRTcsICZpZGVudGl0eSk7CisKKwkJZm9yKGludCBpID0gMDsgaSA8IDEyOyBpKyspCisJCXsKKwkJCVNldFRyYW5zZm9ybShEM0RUU19XT1JMRE1BVFJJWChpKSwgJmlkZW50aXR5KTsKKwkJfQorCisJCWZvcihpbnQgaSA9IDA7IGkgPCA4OyBpKyspCisJCXsKKwkJCWZsb2F0IHplcm9bNF0gPSB7MCwgMCwgMCwgMH07CisKKwkJCVNldFBpeGVsU2hhZGVyQ29uc3RhbnQoaSwgemVybywgMSk7CisJCX0KKworCQlmb3IoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCXsKKwkJCWZsb2F0IHplcm9bNF0gPSB7MCwgMCwgMCwgMH07CisKKwkJCVNldFZlcnRleFNoYWRlckNvbnN0YW50KGksIHplcm8sIDEpOworCQl9CisKKwkJaW5pdCA9IGZhbHNlOworCisJCWlmKCEoYmVoYXZpb3VyRmxhZ3MgJiBEM0RDUkVBVEVfRlBVX1BSRVNFUlZFKSkKKwkJeworCQkJY29uZmlndXJlRlBVKCk7CisJCX0KKwl9CisKKwlEaXJlY3QzRERldmljZTg6On5EaXJlY3QzRERldmljZTgoKQorCXsKKwkJZGVsZXRlIHJlbmRlcmVyOworCQlyZW5kZXJlciA9IDA7CisJCWRlbGV0ZSBjb250ZXh0OworCQljb250ZXh0ID0gMDsKKworCQlkM2Q4LT5SZWxlYXNlKCk7CisJCWQzZDggPSAwOworCisJCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBzd2FwQ2hhaW4uc2l6ZSgpOyBpKyspCisJCXsKKwkJCWlmKHN3YXBDaGFpbltpXSkKKwkJCXsKKwkJCQlzd2FwQ2hhaW5baV0tPnVuYmluZCgpOworCQkJCXN3YXBDaGFpbltpXSA9IDA7CisJCQl9CisJCX0KKwkJCisJCWlmKGRlcHRoU3RlbmNpbCkKKwkJeworCQkJZGVwdGhTdGVuY2lsLT51bmJpbmQoKTsKKwkJCWRlcHRoU3RlbmNpbCA9IDA7CisJCX0KKwkJCisJCWlmKHJlbmRlclRhcmdldCkKKwkJeworCQkJcmVuZGVyVGFyZ2V0LT51bmJpbmQoKTsKKwkJCXJlbmRlclRhcmdldCA9IDA7CisJCX0KKworCQlmb3IoaW50IGkgPSAwOyBpIDwgODsgaSsrKQorCQl7CisJCQlpZih0ZXh0dXJlW2ldKQorCQkJeworCQkJCXRleHR1cmVbaV0tPnVuYmluZCgpOworCQkJCXRleHR1cmVbaV0gPSAwOworCQkJfQorCQl9CisKKwkJZm9yKGludCBpID0gMDsgaSA8IDE2OyBpKyspCisJCXsKKwkJCWlmKGRhdGFTdHJlYW1baV0pCisJCQl7CisJCQkJZGF0YVN0cmVhbVtpXS0+dW5iaW5kKCk7CisJCQkJZGF0YVN0cmVhbVtpXSA9IDA7CisJCQl9CisJCX0KKworCQlpZihpbmRleERhdGEpCisJCXsKKwkJCWluZGV4RGF0YS0+dW5iaW5kKCk7CisJCQlpbmRleERhdGEgPSAwOworCQl9CisKKwkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHBpeGVsU2hhZGVyLnNpemUoKTsgaSsrKQorCQl7CisJCQlpZihwaXhlbFNoYWRlcltpXSkKKwkJCXsKKwkJCQlwaXhlbFNoYWRlcltpXS0+dW5iaW5kKCk7CisJCQkJcGl4ZWxTaGFkZXJbaV0gPSAwOworCQkJfQorCQl9CisKKwkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHZlcnRleFNoYWRlci5zaXplKCk7IGkrKykKKwkJeworCQkJaWYodmVydGV4U2hhZGVyW2ldKQorCQkJeworCQkJCXZlcnRleFNoYWRlcltpXS0+dW5iaW5kKCk7CisJCQkJdmVydGV4U2hhZGVyW2ldID0gMDsKKwkJCX0KKwkJfQorCisJCWZvcih1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBzdGF0ZVJlY29yZGVyLnNpemUoKTsgaSsrKQorCQl7CisJCQlpZihzdGF0ZVJlY29yZGVyW2ldKQorCQkJeworCQkJCXN0YXRlUmVjb3JkZXJbaV0tPnVuYmluZCgpOworCQkJCXN0YXRlUmVjb3JkZXJbaV0gPSAwOworCQkJfQorCQl9CisKKwkJcGFsZXR0ZS5jbGVhcigpOworCisJCWRlbGV0ZSBjdXJzb3I7CisJCURlc3Ryb3lDdXJzb3IobnVsbEN1cnNvcik7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OlF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKGlpZCA9PSBJSURfSURpcmVjdDNERGV2aWNlOCB8fAorCQkgICBpaWQgPT0gSUlEX0lVbmtub3duKQorCQl7CisJCQlBZGRSZWYoKTsKKwkJCSpvYmplY3QgPSB0aGlzOworCisJCQlyZXR1cm4gU19PSzsKKwkJfQorCisJCSpvYmplY3QgPSAwOworCisJCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0REZXZpY2U4OjpBZGRSZWYoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBVbmtub3duOjpBZGRSZWYoKTsKKwl9CisJCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRERldmljZTg6OlJlbGVhc2UoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBVbmtub3duOjpSZWxlYXNlKCk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OkFwcGx5U3RhdGVCbG9jayh1bnNpZ25lZCBsb25nIHRva2VuKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXN0YXRlUmVjb3JkZXJbdG9rZW5dLT5BcHBseSgpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OkJlZ2luU2NlbmUoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OkJlZ2luU3RhdGVCbG9jaygpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmVjb3JkU3RhdGUgPSB0cnVlOworCQlEaXJlY3QzRFN0YXRlQmxvY2s4ICpzdGF0ZUJsb2NrID0gbmV3IERpcmVjdDNEU3RhdGVCbG9jazgodGhpcywgKEQzRFNUQVRFQkxPQ0tUWVBFKTApOworCQlzdGF0ZUJsb2NrLT5iaW5kKCk7CisJCXN0YXRlUmVjb3JkZXIucHVzaF9iYWNrKHN0YXRlQmxvY2spOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OkNhcHR1cmVTdGF0ZUJsb2NrKHVuc2lnbmVkIGxvbmcgdG9rZW4pCisJeworCQlUUkFDRSgiIik7CisKKwkJc3RhdGVSZWNvcmRlclt0b2tlbl0tPkNhcHR1cmUoKTsKKwkJCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OkNsZWFyKHVuc2lnbmVkIGxvbmcgY291bnQsIGNvbnN0IEQzRFJFQ1QgKnJlY3RzLCB1bnNpZ25lZCBsb25nIGZsYWdzLCB1bnNpZ25lZCBsb25nIGNvbG9yLCBmbG9hdCB6LCB1bnNpZ25lZCBsb25nIHN0ZW5jaWwpCisJeworCQlUUkFDRSgidW5zaWduZWQgbG9uZyBjb3VudCA9ICVkLCBjb25zdCBEM0RSRUNUICpyZWN0cyA9IDB4JTAuOHAsIHVuc2lnbmVkIGxvbmcgZmxhZ3MgPSAweCUwLjhYLCB1bnNpZ25lZCBsb25nIGNvbG9yID0gMHglMC44WCwgZmxvYXQgeiA9ICVmLCB1bnNpZ25lZCBsb25nIHN0ZW5jaWwgPSAlZCIsIGNvdW50LCByZWN0cywgZmxhZ3MsIGNvbG9yLCB6LCBzdGVuY2lsKTsKKworCQlpZighcmVjdHMgJiYgY291bnQgIT0gMCkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlpZihmbGFncyAmIChEM0RDTEVBUl9aQlVGRkVSIHwgRDNEQ0xFQVJfU1RFTkNJTCkgJiYgIWRlcHRoU3RlbmNpbCkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlpZihmbGFncyAmIEQzRENMRUFSX1NURU5DSUwpICAgLy8gQ2hlY2sgZm9yIHN0ZW5jaWwgY29tcG9uZW50CisJCXsKKwkJCUQzRFNVUkZBQ0VfREVTQyBkZXNjcmlwdGlvbjsKKwkJCWRlcHRoU3RlbmNpbC0+R2V0RGVzYygmZGVzY3JpcHRpb24pOworCisJCQlzd2l0Y2goZGVzY3JpcHRpb24uRm9ybWF0KQorCQkJeworCQkJY2FzZSBEM0RGTVRfRDE1UzE6CisJCQljYXNlIEQzREZNVF9EMjRTODoKKwkJCWNhc2UgRDNERk1UX0QyNFg4OgorCQkJY2FzZSBEM0RGTVRfRDI0WDRTNDoKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNERk1UX0QxNl9MT0NLQUJMRToKKwkJCWNhc2UgRDNERk1UX0QzMjoKKwkJCWNhc2UgRDNERk1UX0QxNjoKKwkJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJCWRlZmF1bHQ6CisJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCX0KKwkJfQorCisJCWlmKCFyZWN0cykKKwkJeworCQkJY291bnQgPSAxOworCisJCQlEM0RSRUNUIHJlY3Q7CisJCQlyZWN0LngxID0gdmlld3BvcnQuWDsKKwkJCXJlY3QueDIgPSB2aWV3cG9ydC5YICsgdmlld3BvcnQuV2lkdGg7CisJCQlyZWN0LnkxID0gdmlld3BvcnQuWTsKKwkJCXJlY3QueTIgPSB2aWV3cG9ydC5ZICsgdmlld3BvcnQuSGVpZ2h0OworCisJCQlyZWN0cyA9ICZyZWN0OworCQl9CisKKwkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCXsKKwkJCXN3OjpTbGljZVJlY3QgY2xlYXJSZWN0KHJlY3RzW2ldLngxLCByZWN0c1tpXS55MSwgcmVjdHNbaV0ueDIsIHJlY3RzW2ldLnkyLCAwKTsKKworCQkJY2xlYXJSZWN0LmNsaXAodmlld3BvcnQuWCwgdmlld3BvcnQuWSwgdmlld3BvcnQuWCArIHZpZXdwb3J0LldpZHRoLCB2aWV3cG9ydC5ZICsgdmlld3BvcnQuSGVpZ2h0KTsKKworCQkJaWYoZmxhZ3MgJiBEM0RDTEVBUl9UQVJHRVQpCisJCQl7CisJCQkJaWYocmVuZGVyVGFyZ2V0KQorCQkJCXsKKwkJCQkJRDNEU1VSRkFDRV9ERVNDIGRlc2NyaXB0aW9uOworCQkJCQlyZW5kZXJUYXJnZXQtPkdldERlc2MoJmRlc2NyaXB0aW9uKTsKKworCQkJCQlmbG9hdCByZ2JhWzRdOworCQkJCQlyZ2JhWzBdID0gKGZsb2F0KShjb2xvciAmIDB4MDBGRjAwMDApIC8gMHgwMEZGMDAwMDsKKwkJCQkJcmdiYVsxXSA9IChmbG9hdCkoY29sb3IgJiAweDAwMDBGRjAwKSAvIDB4MDAwMEZGMDA7CisJCQkJCXJnYmFbMl0gPSAoZmxvYXQpKGNvbG9yICYgMHgwMDAwMDBGRikgLyAweDAwMDAwMEZGOworCQkJCQlyZ2JhWzNdID0gKGZsb2F0KShjb2xvciAmIDB4RkYwMDAwMDApIC8gMHhGRjAwMDAwMDsKKworCQkJCQlyZW5kZXJlci0+Y2xlYXIocmdiYSwgc3c6OkZPUk1BVF9BMzJCMzJHMzJSMzJGLCByZW5kZXJUYXJnZXQsIGNsZWFyUmVjdCwgMHhGKTsKKwkJCQl9CisJCQl9CisKKwkJCWlmKGZsYWdzICYgRDNEQ0xFQVJfWkJVRkZFUikKKwkJCXsKKwkJCQl6ID0gc3c6OmNsYW1wMDEoeik7CisJCQkJZGVwdGhTdGVuY2lsLT5jbGVhckRlcHRoKHosIGNsZWFyUmVjdC54MCwgY2xlYXJSZWN0LnkwLCBjbGVhclJlY3Qud2lkdGgoKSwgY2xlYXJSZWN0LmhlaWdodCgpKTsKKwkJCX0KKworCQkJaWYoZmxhZ3MgJiBEM0RDTEVBUl9TVEVOQ0lMKQorCQkJeworCQkJCWRlcHRoU3RlbmNpbC0+Y2xlYXJTdGVuY2lsKHN0ZW5jaWwsIDB4RkYsIGNsZWFyUmVjdC54MCwgY2xlYXJSZWN0LnkwLCBjbGVhclJlY3Qud2lkdGgoKSwgY2xlYXJSZWN0LmhlaWdodCgpKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OkNvcHlSZWN0cyhJRGlyZWN0M0RTdXJmYWNlOCAqc291cmNlU3VyZmFjZSwgY29uc3QgUkVDVCAqc291cmNlUmVjdHNBcnJheSwgdW5zaWduZWQgaW50IHJlY3RzLCBJRGlyZWN0M0RTdXJmYWNlOCAqZGVzdGluYXRpb25TdXJmYWNlLCBjb25zdCBQT0lOVCAqZGVzdFBvaW50c0FycmF5KQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFzb3VyY2VTdXJmYWNlIHx8ICFkZXN0aW5hdGlvblN1cmZhY2UpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJaWYoc291cmNlUmVjdHNBcnJheSAmJiByZWN0cyA9PSAwIHx8ICFzb3VyY2VSZWN0c0FycmF5ICYmIHJlY3RzID4gMCkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7ICAgLy8gRklYTUU6IFZlcmlmeSBSRUYgYmVoYXZpb3VyCisJCX0KKworCQlEM0RTVVJGQUNFX0RFU0Mgc291cmNlRGVzY3JpcHRpb247CisJCUQzRFNVUkZBQ0VfREVTQyBkZXN0RGVzY3JpcHRpb247CisKKwkJc291cmNlU3VyZmFjZS0+R2V0RGVzYygmc291cmNlRGVzY3JpcHRpb24pOworCQlkZXN0aW5hdGlvblN1cmZhY2UtPkdldERlc2MoJmRlc3REZXNjcmlwdGlvbik7CisKKwkJaWYoc291cmNlRGVzY3JpcHRpb24uRm9ybWF0ICE9IGRlc3REZXNjcmlwdGlvbi5Gb3JtYXQpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJaW50IHNXaWR0aCA9IHNvdXJjZURlc2NyaXB0aW9uLldpZHRoOworCQlpbnQgc0hlaWdodCA9IHNvdXJjZURlc2NyaXB0aW9uLkhlaWdodDsKKwkJaW50IGRXaWR0aCA9IGRlc3REZXNjcmlwdGlvbi5XaWR0aDsKKwkJaW50IGRIZWlnaHQgPSBkZXN0RGVzY3JpcHRpb24uSGVpZ2h0OworCisJCVJFQ1Qgc1JlY3QgPSB7MCwgMCwgc1dpZHRoLCBzSGVpZ2h0fTsKKwkJUE9JTlQgZFBvaW50ID0gezAsIDB9OworCisJCWlmKCFzb3VyY2VSZWN0c0FycmF5IHx8ICFkZXN0UG9pbnRzQXJyYXkpCisJCXsKKwkJCXNvdXJjZVJlY3RzQXJyYXkgPSAmc1JlY3Q7CisJCQlkZXN0UG9pbnRzQXJyYXkgPSAmZFBvaW50OworCisJCQlyZWN0cyA9IDE7CisJCX0KKworCQlpbnQgYnBwID0gOCAqIERpcmVjdDNEU3VyZmFjZTg6OmJ5dGVzKHNvdXJjZURlc2NyaXB0aW9uLkZvcm1hdCk7CisKKwkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IHJlY3RzOyBpKyspCisJCXsKKwkJCWNvbnN0IFJFQ1QgJnNSZWN0ID0gc291cmNlUmVjdHNBcnJheVtpXTsKKwkJCWNvbnN0IFBPSU5UICZkUG9pbnQgPSBkZXN0UG9pbnRzQXJyYXlbaV07CisKKwkJCWludCByV2lkdGggPSBzUmVjdC5yaWdodCAtIHNSZWN0LmxlZnQ7CisJCQlpbnQgckhlaWdodCA9IHNSZWN0LmJvdHRvbSAtIHNSZWN0LnRvcDsKKworCQkJUkVDVCBkUmVjdDsKKworCQkJZFJlY3QudG9wID0gZFBvaW50Lnk7CisJCQlkUmVjdC5sZWZ0ID0gZFBvaW50Lng7CisJCQlkUmVjdC5ib3R0b20gPSBkUG9pbnQueSArIHJIZWlnaHQ7CisJCQlkUmVjdC5yaWdodCA9IGRQb2ludC54ICsgcldpZHRoOworCisJCQlEM0RMT0NLRURfUkVDVCBzb3VyY2VMb2NrOworCQkJRDNETE9DS0VEX1JFQ1QgZGVzdExvY2s7CisKKwkJCXNvdXJjZVN1cmZhY2UtPkxvY2tSZWN0KCZzb3VyY2VMb2NrLCAmc1JlY3QsIEQzRExPQ0tfUkVBRE9OTFkpOworCQkJZGVzdGluYXRpb25TdXJmYWNlLT5Mb2NrUmVjdCgmZGVzdExvY2ssICZkUmVjdCwgRDNETE9DS19ESVNDQVJEKTsKKworCQkJZm9yKGludCB5ID0gMDsgeSA8IHJIZWlnaHQ7IHkrKykKKwkJCXsKKwkJCQlzd2l0Y2goc291cmNlRGVzY3JpcHRpb24uRm9ybWF0KQorCQkJCXsKKwkJCQljYXNlIEQzREZNVF9EWFQxOgorCQkJCWNhc2UgRDNERk1UX0RYVDI6CisJCQkJY2FzZSBEM0RGTVRfRFhUMzoKKwkJCQljYXNlIEQzREZNVF9EWFQ0OgorCQkJCWNhc2UgRDNERk1UX0RYVDU6CisJCQkJCW1lbWNweShkZXN0TG9jay5wQml0cywgc291cmNlTG9jay5wQml0cywgcldpZHRoICogYnBwIC8gOCk7CisJCQkJCXkgKz0gMzsgICAvLyBBZHZhbmNlIGZvdXIgbGluZXMgYXQgb25jZQorCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQltZW1jcHkoZGVzdExvY2sucEJpdHMsIHNvdXJjZUxvY2sucEJpdHMsIHJXaWR0aCAqIGJwcCAvIDgpOworCQkJCX0KKworCQkJCShjaGFyKiYpc291cmNlTG9jay5wQml0cyArPSBzb3VyY2VMb2NrLlBpdGNoOworCQkJCShjaGFyKiYpZGVzdExvY2sucEJpdHMgKz0gZGVzdExvY2suUGl0Y2g7CisJCQl9CisKKwkJCXNvdXJjZVN1cmZhY2UtPlVubG9ja1JlY3QoKTsKKwkJCWRlc3RpbmF0aW9uU3VyZmFjZS0+VW5sb2NrUmVjdCgpOworCQl9CisJCQorCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpDcmVhdGVBZGRpdGlvbmFsU3dhcENoYWluKEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMsIElEaXJlY3QzRFN3YXBDaGFpbjggKipzd2FwQ2hhaW4pCisJeworCQlUUkFDRSgiIik7CisKKwkJKnN3YXBDaGFpbiA9IDA7CisKKwkJaWYoIXByZXNlbnRQYXJhbWV0ZXJzIHx8ICFzd2FwQ2hhaW4pCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJaWYocHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJDb3VudCA+IDMpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOyAgIC8vIE1heGltdW0gb2YgdGhyZWUgYmFjayBidWZmZXJzCisJCX0KKworCQlpZihwcmVzZW50UGFyYW1ldGVycy0+QmFja0J1ZmZlckNvdW50ID09IDApCisJCXsKKwkJCXByZXNlbnRQYXJhbWV0ZXJzLT5CYWNrQnVmZmVyQ291bnQgPSAxOworCQl9CisKKwkJRDNEUFJFU0VOVF9QQVJBTUVURVJTIHByZXNlbnQgPSAqcHJlc2VudFBhcmFtZXRlcnM7CisKKwkJKnN3YXBDaGFpbiA9IG5ldyBEaXJlY3QzRFN3YXBDaGFpbjgodGhpcywgJnByZXNlbnQpOworCisJCWlmKCEqc3dhcENoYWluKQorCQl7CisJCQlyZXR1cm4gT1VUT0ZNRU1PUlkoKTsKKwkJfQorCisJCWlmKEdldEF2YWlsYWJsZVRleHR1cmVNZW0oKSA9PSAwKQorCQl7CisJCQlkZWxldGUgKnN3YXBDaGFpbjsKKworCQkJcmV0dXJuIE9VVE9GVklERU9NRU1PUlkoKTsKKwkJfQorCisJCXRoaXMtPnN3YXBDaGFpbi5wdXNoX2JhY2soc3RhdGljX2Nhc3Q8RGlyZWN0M0RTd2FwQ2hhaW44Kj4oKnN3YXBDaGFpbikpOworCisJCSgqc3dhcENoYWluKS0+QWRkUmVmKCk7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlODo6Q3JlYXRlQ3ViZVRleHR1cmUodW5zaWduZWQgaW50IGVkZ2VMZW5ndGgsIHVuc2lnbmVkIGludCBsZXZlbHMsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIEQzREZPUk1BVCBmb3JtYXQsIEQzRFBPT0wgcG9vbCwgSURpcmVjdDNEQ3ViZVRleHR1cmU4ICoqY3ViZVRleHR1cmUpCisJeworCQlUUkFDRSgiIik7CisKKwkJKmN1YmVUZXh0dXJlID0gMDsKKworCQlpZihlZGdlTGVuZ3RoID09IDAgfHwgZDNkOC0+Q2hlY2tEZXZpY2VGb3JtYXQoYWRhcHRlciwgZGV2aWNlVHlwZSwgRDNERk1UX1g4UjhHOEI4LCB1c2FnZSwgRDNEUlRZUEVfQ1VCRVRFWFRVUkUsIGZvcm1hdCkgIT0gRDNEX09LKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCSpjdWJlVGV4dHVyZSA9IG5ldyBEaXJlY3QzREN1YmVUZXh0dXJlOCh0aGlzLCBlZGdlTGVuZ3RoLCBsZXZlbHMsIHVzYWdlLCBmb3JtYXQsIHBvb2wpOworCisJCWlmKCEqY3ViZVRleHR1cmUpCisJCXsKKwkJCXJldHVybiBPVVRPRk1FTU9SWSgpOworCQl9CisKKwkJaWYoR2V0QXZhaWxhYmxlVGV4dHVyZU1lbSgpID09IDApCisJCXsKKwkJCWRlbGV0ZSAqY3ViZVRleHR1cmU7CisKKwkJCXJldHVybiBPVVRPRlZJREVPTUVNT1JZKCk7CisJCX0KKworCQkoKmN1YmVUZXh0dXJlKS0+QWRkUmVmKCk7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlODo6Q3JlYXRlRGVwdGhTdGVuY2lsU3VyZmFjZSh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIEQzREZPUk1BVCBmb3JtYXQsIEQzRE1VTFRJU0FNUExFX1RZUEUgbXVsdGlTYW1wbGUsIElEaXJlY3QzRFN1cmZhY2U4ICoqc3VyZmFjZSkKKwl7CisJCVRSQUNFKCIiKTsKKworCQkqc3VyZmFjZSA9IDA7CisKKwkJaWYod2lkdGggPT0gMCB8fCBoZWlnaHQgPT0gMCB8fCBkM2Q4LT5DaGVja0RldmljZUZvcm1hdChhZGFwdGVyLCBkZXZpY2VUeXBlLCBEM0RGTVRfWDhSOEc4QjgsIEQzRFVTQUdFX0RFUFRIU1RFTkNJTCwgRDNEUlRZUEVfU1VSRkFDRSwgZm9ybWF0KSAhPSBEM0RfT0sgfHwgaGVpZ2h0ID4gc3c6Ok9VVExJTkVfUkVTT0xVVElPTikKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQkqc3VyZmFjZSA9IG5ldyBEaXJlY3QzRFN1cmZhY2U4KHRoaXMsIHRoaXMsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgRDNEUE9PTF9ERUZBVUxULCBtdWx0aVNhbXBsZSwgZm9ybWF0ID09IEQzREZNVF9EMTZfTE9DS0FCTEUsIEQzRFVTQUdFX0RFUFRIU1RFTkNJTCk7CisKKwkJaWYoISpzdXJmYWNlKQorCQl7CisJCQlyZXR1cm4gT1VUT0ZNRU1PUlkoKTsKKwkJfQorCisJCWlmKEdldEF2YWlsYWJsZVRleHR1cmVNZW0oKSA9PSAwKQorCQl7CisJCQlkZWxldGUgKnN1cmZhY2U7CisKKwkJCXJldHVybiBPVVRPRlZJREVPTUVNT1JZKCk7CisJCX0KKworCQkoKnN1cmZhY2UpLT5BZGRSZWYoKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpDcmVhdGVJbWFnZVN1cmZhY2UodW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCBEM0RGT1JNQVQgZm9ybWF0LCBJRGlyZWN0M0RTdXJmYWNlOCAqKnN1cmZhY2UpCisJeworCQlUUkFDRSgiIik7CisKKwkJKnN1cmZhY2UgPSAwOworCisJCWlmKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDAgfHwgZDNkOC0+Q2hlY2tEZXZpY2VGb3JtYXQoYWRhcHRlciwgZGV2aWNlVHlwZSwgRDNERk1UX1g4UjhHOEI4LCAwLCBEM0RSVFlQRV9TVVJGQUNFLCBmb3JtYXQpICE9IEQzRF9PSykKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQkqc3VyZmFjZSA9IG5ldyBEaXJlY3QzRFN1cmZhY2U4KHRoaXMsIHRoaXMsIHdpZHRoLCBoZWlnaHQsIGZvcm1hdCwgRDNEUE9PTF9TWVNURU1NRU0sIEQzRE1VTFRJU0FNUExFX05PTkUsIHRydWUsIDApOworCisJCWlmKCEqc3VyZmFjZSkKKwkJeworCQkJcmV0dXJuIE9VVE9GTUVNT1JZKCk7CisJCX0KKworCQlpZihHZXRBdmFpbGFibGVUZXh0dXJlTWVtKCkgPT0gMCkKKwkJeworCQkJZGVsZXRlICpzdXJmYWNlOworCisJCQlyZXR1cm4gT1VUT0ZWSURFT01FTU9SWSgpOworCQl9CisKKwkJKCpzdXJmYWNlKS0+QWRkUmVmKCk7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlODo6Q3JlYXRlSW5kZXhCdWZmZXIodW5zaWduZWQgaW50IGxlbmd0aCwgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sLCBJRGlyZWN0M0RJbmRleEJ1ZmZlcjggKippbmRleEJ1ZmZlcikKKwl7CisJCVRSQUNFKCIiKTsKKworCQkqaW5kZXhCdWZmZXIgPSBuZXcgRGlyZWN0M0RJbmRleEJ1ZmZlcjgodGhpcywgbGVuZ3RoLCB1c2FnZSwgZm9ybWF0LCBwb29sKTsKKworCQlpZighKmluZGV4QnVmZmVyKQorCQl7CisJCQlyZXR1cm4gT1VUT0ZNRU1PUlkoKTsKKwkJfQorCisJCWlmKEdldEF2YWlsYWJsZVRleHR1cmVNZW0oKSA9PSAwKQorCQl7CisJCQlkZWxldGUgKmluZGV4QnVmZmVyOworCisJCQlyZXR1cm4gT1VUT0ZWSURFT01FTU9SWSgpOworCQl9CisKKwkJKCppbmRleEJ1ZmZlciktPkFkZFJlZigpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OkNyZWF0ZVBpeGVsU2hhZGVyKGNvbnN0IHVuc2lnbmVkIGxvbmcgKmZ1bmN0aW9uLCB1bnNpZ25lZCBsb25nICpoYW5kbGUpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoIWZ1bmN0aW9uIHx8ICFoYW5kbGUgfHwgZnVuY3Rpb25bMF0gPiBwaXhlbFNoYWRlclZlcnNpb24pCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJdW5zaWduZWQgaW50IGluZGV4OworCisJCWZvcihpbmRleCA9IDE7IGluZGV4IDwgcGl4ZWxTaGFkZXIuc2l6ZSgpOyBpbmRleCsrKSAgIC8vIFNraXAgTlVMTCBoYW5kbGUKKwkJeworCQkJaWYocGl4ZWxTaGFkZXJbaW5kZXhdID09IDApCisJCQl7CisJCQkJcGl4ZWxTaGFkZXJbaW5kZXhdID0gbmV3IERpcmVjdDNEUGl4ZWxTaGFkZXI4KHRoaXMsIGZ1bmN0aW9uKTsgICAvLyBGSVhNRTogQ2hlY2sgZm9yIG51bGwKKworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYoaW5kZXggPT0gcGl4ZWxTaGFkZXIuc2l6ZSgpKQorCQl7CisJCQlwaXhlbFNoYWRlci5wdXNoX2JhY2sobmV3IERpcmVjdDNEUGl4ZWxTaGFkZXI4KHRoaXMsIGZ1bmN0aW9uKSk7CisJCX0KKworCQlwaXhlbFNoYWRlcltpbmRleF0tPkFkZFJlZigpOworCisJCSpoYW5kbGUgPSBpbmRleDsKKwkJCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OkNyZWF0ZVJlbmRlclRhcmdldCh1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIEQzREZPUk1BVCBmb3JtYXQsIEQzRE1VTFRJU0FNUExFX1RZUEUgbXVsdGlTYW1wbGUsIGludCBsb2NrYWJsZSwgSURpcmVjdDNEU3VyZmFjZTggKipzdXJmYWNlKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCSpzdXJmYWNlID0gMDsKKworCQlpZih3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwIHx8IGQzZDgtPkNoZWNrRGV2aWNlRm9ybWF0KGFkYXB0ZXIsIGRldmljZVR5cGUsIEQzREZNVF9YOFI4RzhCOCwgRDNEVVNBR0VfUkVOREVSVEFSR0VULCBEM0RSVFlQRV9TVVJGQUNFLCBmb3JtYXQpICE9IEQzRF9PSyB8fCBoZWlnaHQgPiBzdzo6T1VUTElORV9SRVNPTFVUSU9OKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCSpzdXJmYWNlID0gbmV3IERpcmVjdDNEU3VyZmFjZTgodGhpcywgdGhpcywgd2lkdGgsIGhlaWdodCwgZm9ybWF0LCBEM0RQT09MX0RFRkFVTFQsIG11bHRpU2FtcGxlLCBsb2NrYWJsZSAhPSBGQUxTRSwgRDNEVVNBR0VfUkVOREVSVEFSR0VUKTsKKworCQlpZighKnN1cmZhY2UpCisJCXsKKwkJCXJldHVybiBPVVRPRk1FTU9SWSgpOworCQl9CisKKwkJaWYoR2V0QXZhaWxhYmxlVGV4dHVyZU1lbSgpID09IDApCisJCXsKKwkJCWRlbGV0ZSAqc3VyZmFjZTsKKworCQkJcmV0dXJuIE9VVE9GVklERU9NRU1PUlkoKTsKKwkJfQorCisJCSgqc3VyZmFjZSktPkFkZFJlZigpOworCQkKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlODo6Q3JlYXRlU3RhdGVCbG9jayhEM0RTVEFURUJMT0NLVFlQRSB0eXBlLCB1bnNpZ25lZCBsb25nICp0b2tlbikKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZighdG9rZW4pCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJRGlyZWN0M0RTdGF0ZUJsb2NrOCAqc3RhdGVCbG9jayA9IG5ldyBEaXJlY3QzRFN0YXRlQmxvY2s4KHRoaXMsIHR5cGUpOworCQlzdGF0ZUJsb2NrLT5iaW5kKCk7CisJCXN0YXRlUmVjb3JkZXIucHVzaF9iYWNrKHN0YXRlQmxvY2spOworCQkqdG9rZW4gPSAodW5zaWduZWQgbG9uZykoc3RhdGVSZWNvcmRlci5zaXplKCkgLSAxKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpDcmVhdGVUZXh0dXJlKHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgdW5zaWduZWQgaW50IGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sLCBJRGlyZWN0M0RUZXh0dXJlOCAqKnRleHR1cmUpCisJeworCQlUUkFDRSgiIik7CisKKwkJKnRleHR1cmUgPSAwOworCisJCWlmKHdpZHRoID09IDAgfHwgaGVpZ2h0ID09IDAgfHwgZDNkOC0+Q2hlY2tEZXZpY2VGb3JtYXQoYWRhcHRlciwgZGV2aWNlVHlwZSwgRDNERk1UX1g4UjhHOEI4LCB1c2FnZSwgRDNEUlRZUEVfVEVYVFVSRSwgZm9ybWF0KSAhPSBEM0RfT0spCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJKnRleHR1cmUgPSBuZXcgRGlyZWN0M0RUZXh0dXJlOCh0aGlzLCB3aWR0aCwgaGVpZ2h0LCBsZXZlbHMsIHVzYWdlLCBmb3JtYXQsIHBvb2wpOworCisJCWlmKCEqdGV4dHVyZSkKKwkJeworCQkJcmV0dXJuIE9VVE9GTUVNT1JZKCk7CisJCX0KKworCQlpZihHZXRBdmFpbGFibGVUZXh0dXJlTWVtKCkgPT0gMCkKKwkJeworCQkJZGVsZXRlICp0ZXh0dXJlOworCisJCQlyZXR1cm4gT1VUT0ZWSURFT01FTU9SWSgpOworCQl9CisKKwkJKCp0ZXh0dXJlKS0+QWRkUmVmKCk7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlODo6Q3JlYXRlVmVydGV4QnVmZmVyKHVuc2lnbmVkIGludCBsZW5ndGgsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIHVuc2lnbmVkIGxvbmcgRlZGLCBEM0RQT09MIHBvb2wsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjggKip2ZXJ0ZXhCdWZmZXIpCisJeworCQlUUkFDRSgiIik7CisKKwkJKnZlcnRleEJ1ZmZlciA9IG5ldyBEaXJlY3QzRFZlcnRleEJ1ZmZlcjgodGhpcywgbGVuZ3RoLCB1c2FnZSwgRlZGLCBwb29sKTsKKworCQlpZighKnZlcnRleEJ1ZmZlcikKKwkJeworCQkJcmV0dXJuIE9VVE9GTUVNT1JZKCk7CisJCX0KKworCQlpZihHZXRBdmFpbGFibGVUZXh0dXJlTWVtKCkgPT0gMCkKKwkJeworCQkJZGVsZXRlICp2ZXJ0ZXhCdWZmZXI7CisKKwkJCXJldHVybiBPVVRPRlZJREVPTUVNT1JZKCk7CisJCX0KKworCQkoKnZlcnRleEJ1ZmZlciktPkFkZFJlZigpOworCQkKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlODo6Q3JlYXRlVmVydGV4U2hhZGVyKGNvbnN0IHVuc2lnbmVkIGxvbmcgKmRlY2xhcmF0aW9uLCBjb25zdCB1bnNpZ25lZCBsb25nICpmdW5jdGlvbiwgdW5zaWduZWQgbG9uZyAqaGFuZGxlLCB1bnNpZ25lZCBsb25nIHVzYWdlKQorCXsKKwkJVFJBQ0UoImNvbnN0IHVuc2lnbmVkIGxvbmcgKmRlY2xhcmF0aW9uID0gMHglMC44cCwgY29uc3QgdW5zaWduZWQgbG9uZyAqZnVuY3Rpb24gPSAweCUwLjhwLCB1bnNpZ25lZCBsb25nICpoYW5kbGUgPSAweCUwLjhwLCB1bnNpZ25lZCBsb25nIHVzYWdlID0gJWQiLCBkZWNsYXJhdGlvbiwgZnVuY3Rpb24sIGhhbmRsZSwgdXNhZ2UpOworCisJCWlmKCFkZWNsYXJhdGlvbiB8fCAhaGFuZGxlIHx8IChmdW5jdGlvbiAmJiBmdW5jdGlvblswXSA+IHZlcnRleFNoYWRlclZlcnNpb24pKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCXVuc2lnbmVkIGludCBpbmRleDsKKworCQlmb3IoaW5kZXggPSAxOyBpbmRleCA8IHZlcnRleFNoYWRlci5zaXplKCk7IGluZGV4KyspICAgLy8gTk9URTogc2tpcCBOVUxMIGhhbmRsZQorCQl7CisJCQlpZih2ZXJ0ZXhTaGFkZXJbaW5kZXhdID09IDApCisJCQl7CisJCQkJdmVydGV4U2hhZGVyW2luZGV4XSA9IG5ldyBEaXJlY3QzRFZlcnRleFNoYWRlcjgodGhpcywgZGVjbGFyYXRpb24sIGZ1bmN0aW9uKTsgICAvLyBGSVhNRTogQ2hlY2sgZm9yIG51bGwKKworCQkJCWJyZWFrOworCQkJfQorCQl9CisKKwkJaWYoaW5kZXggPT0gdmVydGV4U2hhZGVyLnNpemUoKSkKKwkJeworCQkJdmVydGV4U2hhZGVyLnB1c2hfYmFjayhuZXcgRGlyZWN0M0RWZXJ0ZXhTaGFkZXI4KHRoaXMsIGRlY2xhcmF0aW9uLCBmdW5jdGlvbikpOworCQl9CisKKwkJdmVydGV4U2hhZGVyW2luZGV4XS0+QWRkUmVmKCk7CisKKwkJKmhhbmRsZSA9IChpbmRleCA8PCAxNikgKyAxOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OkNyZWF0ZVZvbHVtZVRleHR1cmUodW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCB1bnNpZ25lZCBpbnQgZGVwdGgsIHVuc2lnbmVkIGludCBsZXZlbHMsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIEQzREZPUk1BVCBmb3JtYXQsIEQzRFBPT0wgcG9vbCwgSURpcmVjdDNEVm9sdW1lVGV4dHVyZTggKip2b2x1bWVUZXh0dXJlKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCSp2b2x1bWVUZXh0dXJlID0gMDsKKworCQlpZih3aWR0aCA9PSAwIHx8IGhlaWdodCA9PSAwIHx8IGRlcHRoID09IDAgfHwgZDNkOC0+Q2hlY2tEZXZpY2VGb3JtYXQoYWRhcHRlciwgZGV2aWNlVHlwZSwgRDNERk1UX1g4UjhHOEI4LCB1c2FnZSwgRDNEUlRZUEVfVk9MVU1FVEVYVFVSRSwgZm9ybWF0KSAhPSBEM0RfT0spCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJKnZvbHVtZVRleHR1cmUgPSBuZXcgRGlyZWN0M0RWb2x1bWVUZXh0dXJlOCh0aGlzLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgbGV2ZWxzLCB1c2FnZSwgZm9ybWF0LCBwb29sKTsKKworCQlpZighKnZvbHVtZVRleHR1cmUpCisJCXsKKwkJCXJldHVybiBPVVRPRk1FTU9SWSgpOworCQl9CisKKwkJaWYoR2V0QXZhaWxhYmxlVGV4dHVyZU1lbSgpID09IDApCisJCXsKKwkJCWRlbGV0ZSAqdm9sdW1lVGV4dHVyZTsKKworCQkJcmV0dXJuIE9VVE9GVklERU9NRU1PUlkoKTsKKwkJfQorCisJCSgqdm9sdW1lVGV4dHVyZSktPkFkZFJlZigpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OkRlbGV0ZVBhdGNoKHVuc2lnbmVkIGludCBoYW5kbGUpCisJeworCQlUUkFDRSgiIik7CisKKwkJVU5JTVBMRU1FTlRFRCgpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OkRlbGV0ZVN0YXRlQmxvY2sodW5zaWduZWQgbG9uZyB0b2tlbikKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZih0b2tlbiA+PSBzdGF0ZVJlY29yZGVyLnNpemUoKSB8fCAhc3RhdGVSZWNvcmRlclt0b2tlbl0pCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJc3RhdGVSZWNvcmRlclt0b2tlbl0tPnVuYmluZCgpOworCQlzdGF0ZVJlY29yZGVyW3Rva2VuXSA9IDA7CisJCQorCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpEZWxldGVWZXJ0ZXhTaGFkZXIodW5zaWduZWQgbG9uZyBoYW5kbGUpCisJeworCQlUUkFDRSgiIik7CisKKwkJdW5zaWduZWQgaW50IGluZGV4ID0gaGFuZGxlID4+IDE2OworCisJCWlmKGluZGV4ID49IHZlcnRleFNoYWRlci5zaXplKCkgfHwgIXZlcnRleFNoYWRlcltpbmRleF0pCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJdmVydGV4U2hhZGVyW2luZGV4XS0+UmVsZWFzZSgpOworCQl2ZXJ0ZXhTaGFkZXJbaW5kZXhdID0gMDsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpEcmF3SW5kZXhlZFByaW1pdGl2ZShEM0RQUklNSVRJVkVUWVBFIHR5cGUsIHVuc2lnbmVkIGludCBtaW5JbmRleCwgdW5zaWduZWQgaW50IG51bVZlcnRpY2VzLCB1bnNpZ25lZCBpbnQgc3RhcnRJbmRleCwgdW5zaWduZWQgaW50IHByaW1pdGl2ZUNvdW50KQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFpbmRleERhdGEpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJaWYoIWJpbmREYXRhKGluZGV4RGF0YSwgYmFzZVZlcnRleEluZGV4KSB8fCAhcHJpbWl0aXZlQ291bnQpCisJCXsKKwkJCXJldHVybiBEM0RfT0s7CisJCX0KKworCQl1bnNpZ25lZCBpbnQgaW5kZXhPZmZzZXQgPSBzdGFydEluZGV4ICogKGluZGV4RGF0YS0+aXMzMkJpdCgpID8gNCA6IDIpOyAgIC8vIEZJWE1FOiBEb2Vzbid0IHRha2Ugc3RyZWFtIGZyZXF1ZW5jaWVzIGludG8gYWNjb3VudAorCisJCXN3OjpEcmF3VHlwZSBkcmF3VHlwZTsKKworCQlpZihpbmRleERhdGEtPmlzMzJCaXQoKSkKKwkJeworCQkJc3dpdGNoKHR5cGUpCisJCQl7CisJCQljYXNlIEQzRFBUX1BPSU5UTElTVDoJCWRyYXdUeXBlID0gc3c6OkRSQVdfSU5ERVhFRFBPSU5UTElTVDMyOwkJYnJlYWs7CisJCQljYXNlIEQzRFBUX0xJTkVMSVNUOgkJZHJhd1R5cGUgPSBzdzo6RFJBV19JTkRFWEVETElORUxJU1QzMjsJCQlicmVhazsKKwkJCWNhc2UgRDNEUFRfTElORVNUUklQOgkJZHJhd1R5cGUgPSBzdzo6RFJBV19JTkRFWEVETElORVNUUklQMzI7CQlicmVhazsKKwkJCWNhc2UgRDNEUFRfVFJJQU5HTEVMSVNUOglkcmF3VHlwZSA9IHN3OjpEUkFXX0lOREVYRURUUklBTkdMRUxJU1QzMjsJCWJyZWFrOworCQkJY2FzZSBEM0RQVF9UUklBTkdMRVNUUklQOglkcmF3VHlwZSA9IHN3OjpEUkFXX0lOREVYRURUUklBTkdMRVNUUklQMzI7CWJyZWFrOworCQkJY2FzZSBEM0RQVF9UUklBTkdMRUZBTjoJCWRyYXdUeXBlID0gc3c6OkRSQVdfSU5ERVhFRFRSSUFOR0xFRkFOMzI7CQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCXN3aXRjaCh0eXBlKQorCQkJeworCQkJY2FzZSBEM0RQVF9QT0lOVExJU1Q6CQlkcmF3VHlwZSA9IHN3OjpEUkFXX0lOREVYRURQT0lOVExJU1QxNjsJCWJyZWFrOworCQkJY2FzZSBEM0RQVF9MSU5FTElTVDoJCWRyYXdUeXBlID0gc3c6OkRSQVdfSU5ERVhFRExJTkVMSVNUMTY7CQkJYnJlYWs7CisJCQljYXNlIEQzRFBUX0xJTkVTVFJJUDoJCWRyYXdUeXBlID0gc3c6OkRSQVdfSU5ERVhFRExJTkVTVFJJUDE2OwkJYnJlYWs7CisJCQljYXNlIEQzRFBUX1RSSUFOR0xFTElTVDoJZHJhd1R5cGUgPSBzdzo6RFJBV19JTkRFWEVEVFJJQU5HTEVMSVNUMTY7CQlicmVhazsKKwkJCWNhc2UgRDNEUFRfVFJJQU5HTEVTVFJJUDoJZHJhd1R5cGUgPSBzdzo6RFJBV19JTkRFWEVEVFJJQU5HTEVTVFJJUDE2OwlicmVhazsKKwkJCWNhc2UgRDNEUFRfVFJJQU5HTEVGQU46CQlkcmF3VHlwZSA9IHN3OjpEUkFXX0lOREVYRURUUklBTkdMRUZBTjE2OwkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCUFTU0VSVChmYWxzZSk7CisJCQl9CisJCX0KKworCQliaW5kRGF0YShpbmRleERhdGEsIGJhc2VWZXJ0ZXhJbmRleCk7CisKKwkJcmVuZGVyZXItPmRyYXcoZHJhd1R5cGUsIGluZGV4T2Zmc2V0LCBwcmltaXRpdmVDb3VudCk7CisJCQorCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpEZWxldGVQaXhlbFNoYWRlcih1bnNpZ25lZCBsb25nIGhhbmRsZSkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZihoYW5kbGUgPj0gcGl4ZWxTaGFkZXIuc2l6ZSgpIHx8ICFwaXhlbFNoYWRlcltoYW5kbGVdKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCXBpeGVsU2hhZGVyW2hhbmRsZV0tPlJlbGVhc2UoKTsKKwkJcGl4ZWxTaGFkZXJbaGFuZGxlXSA9IDA7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlODo6RHJhd0luZGV4ZWRQcmltaXRpdmVVUChEM0RQUklNSVRJVkVUWVBFIHR5cGUsIHVuc2lnbmVkIGludCBtaW5JbmRleCwgdW5zaWduZWQgaW50IG51bVZlcnRpY2VzLCB1bnNpZ25lZCBpbnQgcHJpbWl0aXZlQ291bnQsIGNvbnN0IHZvaWQgKmluZGV4RGF0YSwgRDNERk9STUFUIGluZGV4RGF0YUZvcm1hdCwgY29uc3Qgdm9pZCAqdmVydGV4U3RyZWFtWmVyb0RhdGEsIHVuc2lnbmVkIGludCB2ZXJ0ZXhTdHJlYW1aZXJvU3RyaWRlKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKCF2ZXJ0ZXhTdHJlYW1aZXJvRGF0YSB8fCAhaW5kZXhEYXRhKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWludCBsZW5ndGggPSAobWluSW5kZXggKyBudW1WZXJ0aWNlcykgKiB2ZXJ0ZXhTdHJlYW1aZXJvU3RyaWRlOworCQkKKwkJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4ICp2ZXJ0ZXhCdWZmZXIgPSBuZXcgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4KHRoaXMsIGxlbmd0aCwgMCwgMCwgRDNEUE9PTF9ERUZBVUxUKTsKKworCQl1bnNpZ25lZCBjaGFyICpkYXRhOworCQl2ZXJ0ZXhCdWZmZXItPkxvY2soMCwgMCwgJmRhdGEsIDApOworCQltZW1jcHkoZGF0YSwgdmVydGV4U3RyZWFtWmVyb0RhdGEsIGxlbmd0aCk7CisJCXZlcnRleEJ1ZmZlci0+VW5sb2NrKCk7CisKKwkJU2V0U3RyZWFtU291cmNlKDAsIHZlcnRleEJ1ZmZlciwgdmVydGV4U3RyZWFtWmVyb1N0cmlkZSk7CisKKwkJc3dpdGNoKHR5cGUpCisJCXsKKwkJY2FzZSBEM0RQVF9QT0lOVExJU1Q6CQlsZW5ndGggPSBwcmltaXRpdmVDb3VudDsJCWJyZWFrOworCQljYXNlIEQzRFBUX0xJTkVMSVNUOgkJbGVuZ3RoID0gcHJpbWl0aXZlQ291bnQgKiAyOwlicmVhazsKKwkJY2FzZSBEM0RQVF9MSU5FU1RSSVA6CQlsZW5ndGggPSBwcmltaXRpdmVDb3VudCArIDE7CWJyZWFrOworCQljYXNlIEQzRFBUX1RSSUFOR0xFTElTVDoJbGVuZ3RoID0gcHJpbWl0aXZlQ291bnQgKiAzOwlicmVhazsKKwkJY2FzZSBEM0RQVF9UUklBTkdMRVNUUklQOglsZW5ndGggPSBwcmltaXRpdmVDb3VudCArIDI7CWJyZWFrOworCQljYXNlIEQzRFBUX1RSSUFOR0xFRkFOOgkJbGVuZ3RoID0gcHJpbWl0aXZlQ291bnQgKyAyOwlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKworCQlsZW5ndGggKj0gaW5kZXhEYXRhRm9ybWF0ID09IEQzREZNVF9JTkRFWDMyID8gNCA6IDI7CisKKwkJRGlyZWN0M0RJbmRleEJ1ZmZlcjggKmluZGV4QnVmZmVyID0gbmV3IERpcmVjdDNESW5kZXhCdWZmZXI4KHRoaXMsIGxlbmd0aCwgMCwgaW5kZXhEYXRhRm9ybWF0LCBEM0RQT09MX0RFRkFVTFQpOworCisJCWluZGV4QnVmZmVyLT5Mb2NrKDAsIDAsICZkYXRhLCAwKTsKKwkJbWVtY3B5KGRhdGEsIGluZGV4RGF0YSwgbGVuZ3RoKTsKKwkJaW5kZXhCdWZmZXItPlVubG9jaygpOworCisJCVNldEluZGljZXMoaW5kZXhCdWZmZXIsIDApOworCisJCWlmKCFiaW5kRGF0YShpbmRleEJ1ZmZlciwgMCkgfHwgIXByaW1pdGl2ZUNvdW50KQorCQl7CisJCQl2ZXJ0ZXhCdWZmZXItPlJlbGVhc2UoKTsKKworCQkJcmV0dXJuIEQzRF9PSzsKKwkJfQorCisJCXN3OjpEcmF3VHlwZSBkcmF3VHlwZTsKKworCQlpZihpbmRleERhdGFGb3JtYXQgPT0gRDNERk1UX0lOREVYMzIpCisJCXsKKwkJCXN3aXRjaCh0eXBlKQorCQkJeworCQkJY2FzZSBEM0RQVF9QT0lOVExJU1Q6CQlkcmF3VHlwZSA9IHN3OjpEUkFXX0lOREVYRURQT0lOVExJU1QzMjsJCWJyZWFrOworCQkJY2FzZSBEM0RQVF9MSU5FTElTVDoJCWRyYXdUeXBlID0gc3c6OkRSQVdfSU5ERVhFRExJTkVMSVNUMzI7CQkJYnJlYWs7CisJCQljYXNlIEQzRFBUX0xJTkVTVFJJUDoJCWRyYXdUeXBlID0gc3c6OkRSQVdfSU5ERVhFRExJTkVTVFJJUDMyOwkJYnJlYWs7CisJCQljYXNlIEQzRFBUX1RSSUFOR0xFTElTVDoJZHJhd1R5cGUgPSBzdzo6RFJBV19JTkRFWEVEVFJJQU5HTEVMSVNUMzI7CQlicmVhazsKKwkJCWNhc2UgRDNEUFRfVFJJQU5HTEVTVFJJUDoJZHJhd1R5cGUgPSBzdzo6RFJBV19JTkRFWEVEVFJJQU5HTEVTVFJJUDMyOwlicmVhazsKKwkJCWNhc2UgRDNEUFRfVFJJQU5HTEVGQU46CQlkcmF3VHlwZSA9IHN3OjpEUkFXX0lOREVYRURUUklBTkdMRUZBTjMyOwkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCUFTU0VSVChmYWxzZSk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlzd2l0Y2godHlwZSkKKwkJCXsKKwkJCWNhc2UgRDNEUFRfUE9JTlRMSVNUOgkJZHJhd1R5cGUgPSBzdzo6RFJBV19JTkRFWEVEUE9JTlRMSVNUMTY7CQlicmVhazsKKwkJCWNhc2UgRDNEUFRfTElORUxJU1Q6CQlkcmF3VHlwZSA9IHN3OjpEUkFXX0lOREVYRURMSU5FTElTVDE2OwkJCWJyZWFrOworCQkJY2FzZSBEM0RQVF9MSU5FU1RSSVA6CQlkcmF3VHlwZSA9IHN3OjpEUkFXX0lOREVYRURMSU5FU1RSSVAxNjsJCWJyZWFrOworCQkJY2FzZSBEM0RQVF9UUklBTkdMRUxJU1Q6CWRyYXdUeXBlID0gc3c6OkRSQVdfSU5ERVhFRFRSSUFOR0xFTElTVDE2OwkJYnJlYWs7CisJCQljYXNlIEQzRFBUX1RSSUFOR0xFU1RSSVA6CWRyYXdUeXBlID0gc3c6OkRSQVdfSU5ERVhFRFRSSUFOR0xFU1RSSVAxNjsJYnJlYWs7CisJCQljYXNlIEQzRFBUX1RSSUFOR0xFRkFOOgkJZHJhd1R5cGUgPSBzdzo6RFJBV19JTkRFWEVEVFJJQU5HTEVGQU4xNjsJCWJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlBU1NFUlQoZmFsc2UpOworCQkJfQorCQl9CisKKwkJcmVuZGVyZXItPmRyYXcoZHJhd1R5cGUsIDAsIHByaW1pdGl2ZUNvdW50KTsKKworCQlTZXRTdHJlYW1Tb3VyY2UoMCwgMCwgMCk7CisJCVNldEluZGljZXMoMCwgMCk7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlODo6RHJhd1ByaW1pdGl2ZShEM0RQUklNSVRJVkVUWVBFIHByaW1pdGl2ZVR5cGUsIHVuc2lnbmVkIGludCBzdGFydFZlcnRleCwgdW5zaWduZWQgaW50IHByaW1pdGl2ZUNvdW50KQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFiaW5kRGF0YSgwLCBzdGFydFZlcnRleCkgfHwgIXByaW1pdGl2ZUNvdW50KQorCQl7CisJCQlyZXR1cm4gRDNEX09LOworCQl9CisKKwkJc3c6OkRyYXdUeXBlIGRyYXdUeXBlOworCisJCXN3aXRjaChwcmltaXRpdmVUeXBlKQorCQl7CisJCWNhc2UgRDNEUFRfUE9JTlRMSVNUOgkJZHJhd1R5cGUgPSBzdzo6RFJBV19QT0lOVExJU1Q7CQlicmVhazsKKwkJY2FzZSBEM0RQVF9MSU5FTElTVDoJCWRyYXdUeXBlID0gc3c6OkRSQVdfTElORUxJU1Q7CQlicmVhazsKKwkJY2FzZSBEM0RQVF9MSU5FU1RSSVA6CQlkcmF3VHlwZSA9IHN3OjpEUkFXX0xJTkVTVFJJUDsJCWJyZWFrOworCQljYXNlIEQzRFBUX1RSSUFOR0xFTElTVDoJZHJhd1R5cGUgPSBzdzo6RFJBV19UUklBTkdMRUxJU1Q7CWJyZWFrOworCQljYXNlIEQzRFBUX1RSSUFOR0xFU1RSSVA6CWRyYXdUeXBlID0gc3c6OkRSQVdfVFJJQU5HTEVTVFJJUDsJYnJlYWs7CisJCWNhc2UgRDNEUFRfVFJJQU5HTEVGQU46CQlkcmF3VHlwZSA9IHN3OjpEUkFXX1RSSUFOR0xFRkFOOwlicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKworCQlyZW5kZXJlci0+ZHJhdyhkcmF3VHlwZSwgMCwgcHJpbWl0aXZlQ291bnQpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OkRyYXdQcmltaXRpdmVVUChEM0RQUklNSVRJVkVUWVBFIHByaW1pdGl2ZVR5cGUsIHVuc2lnbmVkIGludCBwcmltaXRpdmVDb3VudCwgY29uc3Qgdm9pZCAqdmVydGV4U3RyZWFtWmVyb0RhdGEsIHVuc2lnbmVkIGludCB2ZXJ0ZXhTdHJlYW1aZXJvU3RyaWRlKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKCF2ZXJ0ZXhTdHJlYW1aZXJvRGF0YSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4ICp2ZXJ0ZXhCdWZmZXIgPSAwOworCQlpbnQgbGVuZ3RoID0gMDsKKworCQlzd2l0Y2gocHJpbWl0aXZlVHlwZSkKKwkJeworCQljYXNlIEQzRFBUX1BPSU5UTElTVDoJCWxlbmd0aCA9IHByaW1pdGl2ZUNvdW50OwkJYnJlYWs7CisJCWNhc2UgRDNEUFRfTElORUxJU1Q6CQlsZW5ndGggPSBwcmltaXRpdmVDb3VudCAqIDI7CWJyZWFrOworCQljYXNlIEQzRFBUX0xJTkVTVFJJUDoJCWxlbmd0aCA9IHByaW1pdGl2ZUNvdW50ICsgMTsJYnJlYWs7CisJCWNhc2UgRDNEUFRfVFJJQU5HTEVMSVNUOglsZW5ndGggPSBwcmltaXRpdmVDb3VudCAqIDM7CWJyZWFrOworCQljYXNlIEQzRFBUX1RSSUFOR0xFU1RSSVA6CWxlbmd0aCA9IHByaW1pdGl2ZUNvdW50ICsgMjsJYnJlYWs7CisJCWNhc2UgRDNEUFRfVFJJQU5HTEVGQU46CQlsZW5ndGggPSBwcmltaXRpdmVDb3VudCArIDI7CWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCWxlbmd0aCAqPSB2ZXJ0ZXhTdHJlYW1aZXJvU3RyaWRlOworCisJCUNyZWF0ZVZlcnRleEJ1ZmZlcihsZW5ndGgsIDAsIDAsIEQzRFBPT0xfREVGQVVMVCwgJnZlcnRleEJ1ZmZlcik7CisJCQorCQl1bnNpZ25lZCBjaGFyICpkYXRhOworCQl2ZXJ0ZXhCdWZmZXItPkxvY2soMCwgMCwgJmRhdGEsIDApOworCQltZW1jcHkoZGF0YSwgdmVydGV4U3RyZWFtWmVyb0RhdGEsIGxlbmd0aCk7CisJCXZlcnRleEJ1ZmZlci0+VW5sb2NrKCk7CisKKwkJU2V0U3RyZWFtU291cmNlKDAsIHZlcnRleEJ1ZmZlciwgdmVydGV4U3RyZWFtWmVyb1N0cmlkZSk7CisKKwkJaWYoIWJpbmREYXRhKDAsIDApIHx8ICFwcmltaXRpdmVDb3VudCkKKwkJeworCQkJdmVydGV4QnVmZmVyLT5SZWxlYXNlKCk7CisKKwkJCXJldHVybiBEM0RfT0s7CisJCX0KKworCQlzdzo6RHJhd1R5cGUgZHJhd1R5cGU7CisKKwkJc3dpdGNoKHByaW1pdGl2ZVR5cGUpCisJCXsKKwkJY2FzZSBEM0RQVF9QT0lOVExJU1Q6CQlkcmF3VHlwZSA9IHN3OjpEUkFXX1BPSU5UTElTVDsJCWJyZWFrOworCQljYXNlIEQzRFBUX0xJTkVMSVNUOgkJZHJhd1R5cGUgPSBzdzo6RFJBV19MSU5FTElTVDsJCWJyZWFrOworCQljYXNlIEQzRFBUX0xJTkVTVFJJUDoJCWRyYXdUeXBlID0gc3c6OkRSQVdfTElORVNUUklQOwkJYnJlYWs7CisJCWNhc2UgRDNEUFRfVFJJQU5HTEVMSVNUOglkcmF3VHlwZSA9IHN3OjpEUkFXX1RSSUFOR0xFTElTVDsJYnJlYWs7CisJCWNhc2UgRDNEUFRfVFJJQU5HTEVTVFJJUDoJZHJhd1R5cGUgPSBzdzo6RFJBV19UUklBTkdMRVNUUklQOwlicmVhazsKKwkJY2FzZSBEM0RQVF9UUklBTkdMRUZBTjoJCWRyYXdUeXBlID0gc3c6OkRSQVdfVFJJQU5HTEVGQU47CWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCXJlbmRlcmVyLT5kcmF3KGRyYXdUeXBlLCAwLCBwcmltaXRpdmVDb3VudCk7CisKKwkJU2V0U3RyZWFtU291cmNlKDAsIDAsIDApOworCQl2ZXJ0ZXhCdWZmZXItPlJlbGVhc2UoKTsKKwkJCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OkRyYXdSZWN0UGF0Y2godW5zaWduZWQgaW50IGhhbmRsZSwgY29uc3QgZmxvYXQgKm51bVNlZ3MsIGNvbnN0IEQzRFJFQ1RQQVRDSF9JTkZPICpyZWN0UGF0Y2hJbmZvKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFudW1TZWdzIHx8ICFyZWN0UGF0Y2hJbmZvKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCVVOSU1QTEVNRU5URUQoKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpEcmF3VHJpUGF0Y2godW5zaWduZWQgaW50IGhhbmRsZSwgY29uc3QgZmxvYXQgKm51bVNlZ3MsIGNvbnN0IEQzRFRSSVBBVENIX0lORk8gKnRyaVBhdGNoSW5mbykKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZighbnVtU2VncyB8fCAhdHJpUGF0Y2hJbmZvKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCVVOSU1QTEVNRU5URUQoKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpFbmRTY2VuZSgpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlODo6RW5kU3RhdGVCbG9jayh1bnNpZ25lZCBsb25nICp0b2tlbikKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZighdG9rZW4pCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJcmVjb3JkU3RhdGUgPSBmYWxzZTsKKwkJKnRva2VuID0gKHVuc2lnbmVkIGxvbmcpKHN0YXRlUmVjb3JkZXIuc2l6ZSgpIC0gMSk7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwl1bnNpZ25lZCBpbnQgRGlyZWN0M0REZXZpY2U4OjpHZXRBdmFpbGFibGVUZXh0dXJlTWVtKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpbnQgYXZhaWxhYmxlTWVtb3J5ID0gdGV4dHVyZU1lbW9yeSAtIERpcmVjdDNEUmVzb3VyY2U4OjpnZXRNZW1vcnlVc2FnZSgpOworCQlpZihhdmFpbGFibGVNZW1vcnkgPCAwKSBhdmFpbGFibGVNZW1vcnkgPSAwOworCisJCS8vIFJvdW5kIHRvIG5lYXJlc3QgTUIKKwkJcmV0dXJuIChhdmFpbGFibGVNZW1vcnkgKyAweDgwMDAwKSAmIDB4RkZGMDAwMDA7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OkdldEJhY2tCdWZmZXIodW5zaWduZWQgaW50IGluZGV4LCBEM0RCQUNLQlVGRkVSX1RZUEUgdHlwZSwgSURpcmVjdDNEU3VyZmFjZTggKipiYWNrQnVmZmVyKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFiYWNrQnVmZmVyLyogfHwgdHlwZSAhPSBEM0RCQUNLQlVGRkVSX1RZUEVfTU9OTyovKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCXN3YXBDaGFpbltpbmRleF0tPkdldEJhY2tCdWZmZXIoaW5kZXgsIHR5cGUsIGJhY2tCdWZmZXIpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OkdldENsaXBQbGFuZSh1bnNpZ25lZCBsb25nIGluZGV4LCBmbG9hdCAqcGxhbmUpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoIXBsYW5lIHx8IGluZGV4ID49IDYpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJcGxhbmVbMF0gPSB0aGlzLT5wbGFuZVtpbmRleF1bMF07CisJCXBsYW5lWzFdID0gdGhpcy0+cGxhbmVbaW5kZXhdWzFdOworCQlwbGFuZVsyXSA9IHRoaXMtPnBsYW5lW2luZGV4XVsyXTsKKwkJcGxhbmVbM10gPSB0aGlzLT5wbGFuZVtpbmRleF1bM107CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlODo6R2V0Q2xpcFN0YXR1cyhEM0RDTElQU1RBVFVTOCAqY2xpcFN0YXR1cykKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZighY2xpcFN0YXR1cykKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQkqY2xpcFN0YXR1cyA9IHRoaXMtPmNsaXBTdGF0dXM7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlODo6R2V0Q3JlYXRpb25QYXJhbWV0ZXJzKEQzRERFVklDRV9DUkVBVElPTl9QQVJBTUVURVJTICpwYXJhbWV0ZXJzKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFwYXJhbWV0ZXJzKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCXBhcmFtZXRlcnMtPkFkYXB0ZXJPcmRpbmFsID0gYWRhcHRlcjsKKwkJcGFyYW1ldGVycy0+QmVoYXZpb3JGbGFncyA9IGJlaGF2aW91ckZsYWdzOworCQlwYXJhbWV0ZXJzLT5EZXZpY2VUeXBlID0gZGV2aWNlVHlwZTsKKwkJcGFyYW1ldGVycy0+aEZvY3VzV2luZG93ID0gZm9jdXNXaW5kb3c7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlODo6R2V0Q3VycmVudFRleHR1cmVQYWxldHRlKHVuc2lnbmVkIGludCAqcGFsZXR0ZU51bWJlcikKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZighcGFsZXR0ZU51bWJlcikKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQkqcGFsZXR0ZU51bWJlciA9IGN1cnJlbnRQYWxldHRlOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OkdldERlcHRoU3RlbmNpbFN1cmZhY2UoSURpcmVjdDNEU3VyZmFjZTggKipkZXB0aFN0ZW5jaWxTdXJmYWNlKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFkZXB0aFN0ZW5jaWxTdXJmYWNlKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCSpkZXB0aFN0ZW5jaWxTdXJmYWNlID0gZGVwdGhTdGVuY2lsOworCisJCWlmKGRlcHRoU3RlbmNpbCkKKwkJeworCQkJZGVwdGhTdGVuY2lsLT5BZGRSZWYoKTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7ICAgLy8gRklYTUU6IFJldHVybiBOT1RGT1VORCgpIHdoZW4gbm8gZGVwdGhTdGVuY2lsPworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpHZXREZXZpY2VDYXBzKEQzRENBUFM4ICpjYXBzKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBkM2Q4LT5HZXREZXZpY2VDYXBzKEQzREFEQVBURVJfREVGQVVMVCwgRDNEREVWVFlQRV9IQUwsIGNhcHMpOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpHZXREaXJlY3QzRChJRGlyZWN0M0Q4ICoqZDNkOCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZighZDNkOCkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlBU1NFUlQodGhpcy0+ZDNkOCk7CisKKwkJKmQzZDggPSB0aGlzLT5kM2Q4OworCQl0aGlzLT5kM2Q4LT5BZGRSZWYoKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpHZXREaXNwbGF5TW9kZShEM0RESVNQTEFZTU9ERSAqbW9kZSkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZighbW9kZSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlkM2Q4LT5HZXRBZGFwdGVyRGlzcGxheU1vZGUoRDNEQURBUFRFUl9ERUZBVUxULCBtb2RlKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpHZXRGcm9udEJ1ZmZlcihJRGlyZWN0M0RTdXJmYWNlOCAqZGVzdFN1cmZhY2UpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoIWRlc3RTdXJmYWNlKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCUQzRExPQ0tFRF9SRUNUIGRlc2NyaXB0aW9uOworCQlkZXN0U3VyZmFjZS0+TG9ja1JlY3QoJmRlc2NyaXB0aW9uLCAwLCAwKTsKKworCQlzd2FwQ2hhaW5bMF0tPnNjcmVlbnNob3QoZGVzY3JpcHRpb24ucEJpdHMpOworCisJCWRlc3RTdXJmYWNlLT5VbmxvY2tSZWN0KCk7CisJCQorCQlyZXR1cm4gRDNEX09LOworCX0KKworCXZvaWQgRGlyZWN0M0REZXZpY2U4OjpHZXRHYW1tYVJhbXAoRDNER0FNTUFSQU1QICpyYW1wKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFyYW1wKQorCQl7CisJCQlyZXR1cm47CisJCX0KKworCQlzd2FwQ2hhaW5bMF0tPmdldEdhbW1hUmFtcCgoc3c6OkdhbW1hUmFtcCopcmFtcCk7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OkdldEluZGljZXMoSURpcmVjdDNESW5kZXhCdWZmZXI4ICoqaW5kZXhEYXRhLCB1bnNpZ25lZCBpbnQgKmJhc2VWZXJ0ZXhJbmRleCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZighaW5kZXhEYXRhIHx8ICFiYXNlVmVydGV4SW5kZXgpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJKmluZGV4RGF0YSA9IHRoaXMtPmluZGV4RGF0YTsKKworCQlpZih0aGlzLT5pbmRleERhdGEpCisJCXsKKwkJCXRoaXMtPmluZGV4RGF0YS0+QWRkUmVmKCk7CisJCX0KKworCQkqYmFzZVZlcnRleEluZGV4ID0gdGhpcy0+YmFzZVZlcnRleEluZGV4OworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OkdldEluZm8odW5zaWduZWQgbG9uZyBkZXZJbmZvSUQsIHZvaWQgKmRldkluZm9TdHJ1Y3QsIHVuc2lnbmVkIGxvbmcgZGV2SW5mb1N0cnVjdFNpemUpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoIWRldkluZm9TdHJ1Y3QgfHwgZGV2SW5mb1N0cnVjdFNpemUgPT0gMCkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlzd2l0Y2goZGV2SW5mb0lEKQorCQl7CisJCWNhc2UgMDogcmV0dXJuIEVfRkFJTDsKKwkJY2FzZSAxOiByZXR1cm4gRV9GQUlMOworCQljYXNlIDI6IHJldHVybiBFX0ZBSUw7CisJCWNhc2UgMzogcmV0dXJuIEVfRkFJTDsKKwkJY2FzZSA0OiByZXR1cm4gU19GQUxTRTsKKwkJY2FzZSA1OiBVTklNUExFTUVOVEVEKCk7ICAgLy8gRklYTUU6IEQzRERFVklORk9JRF9SRVNPVVJDRU1BTkFHRVIKKwkJY2FzZSA2OiBVTklNUExFTUVOVEVEKCk7ICAgLy8gRklYTUU6IEQzRERFVklORk9JRF9EM0RWRVJURVhTVEFUUworCQljYXNlIDc6IHJldHVybiBFX0ZBSUw7CisJCX0KKwkJCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OkdldExpZ2h0KHVuc2lnbmVkIGxvbmcgaW5kZXgsIEQzRExJR0hUOCAqbGlnaHQpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoIWxpZ2h0KQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWlmKCF0aGlzLT5saWdodC5leGlzdHMoaW5kZXgpKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCSpsaWdodCA9IHRoaXMtPmxpZ2h0W2luZGV4XTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpHZXRMaWdodEVuYWJsZSh1bnNpZ25lZCBsb25nIGluZGV4ICwgaW50ICplbmFibGUpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoIWVuYWJsZSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlpZighbGlnaHQuZXhpc3RzKGluZGV4KSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQkqZW5hYmxlID0gbGlnaHRbaW5kZXhdLmVuYWJsZTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpHZXRNYXRlcmlhbChEM0RNQVRFUklBTDggKm1hdGVyaWFsKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFtYXRlcmlhbCkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQkqbWF0ZXJpYWwgPSB0aGlzLT5tYXRlcmlhbDsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpHZXRQYWxldHRlRW50cmllcyh1bnNpZ25lZCBpbnQgcGFsZXR0ZU51bWJlciwgUEFMRVRURUVOVFJZICplbnRyaWVzKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKHBhbGV0dGVOdW1iZXIgPiAweEZGRkYgfHwgIWVudHJpZXMpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJZm9yKGludCBpID0gMDsgaSA8IDI1NjsgaSsrKQorCQl7CisJCQllbnRyaWVzW2ldID0gcGFsZXR0ZVtwYWxldHRlTnVtYmVyXS5lbnRyeVtpXTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OkdldFBpeGVsU2hhZGVyKHVuc2lnbmVkIGxvbmcgKmhhbmRsZSkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZighaGFuZGxlKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCSpoYW5kbGUgPSBwaXhlbFNoYWRlckhhbmRsZTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpHZXRQaXhlbFNoYWRlckZ1bmN0aW9uKHVuc2lnbmVkIGxvbmcgaGFuZGxlLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nICpzaXplKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFkYXRhKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCVVOSU1QTEVNRU5URUQoKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpHZXRQaXhlbFNoYWRlckNvbnN0YW50KHVuc2lnbmVkIGxvbmcgc3RhcnRSZWdpc3Rlciwgdm9pZCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBsb25nIGNvdW50KQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFjb25zdGFudERhdGEpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCXsKKwkJCSgoZmxvYXQqKWNvbnN0YW50RGF0YSlbaSAqIDQgKyAwXSA9IHBpeGVsU2hhZGVyQ29uc3RhbnRbc3RhcnRSZWdpc3RlciArIGldWzBdOworCQkJKChmbG9hdCopY29uc3RhbnREYXRhKVtpICogNCArIDFdID0gcGl4ZWxTaGFkZXJDb25zdGFudFtzdGFydFJlZ2lzdGVyICsgaV1bMV07CisJCQkoKGZsb2F0Kiljb25zdGFudERhdGEpW2kgKiA0ICsgMl0gPSBwaXhlbFNoYWRlckNvbnN0YW50W3N0YXJ0UmVnaXN0ZXIgKyBpXVsyXTsKKwkJCSgoZmxvYXQqKWNvbnN0YW50RGF0YSlbaSAqIDQgKyAzXSA9IHBpeGVsU2hhZGVyQ29uc3RhbnRbc3RhcnRSZWdpc3RlciArIGldWzNdOworCQl9CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlODo6R2V0UmFzdGVyU3RhdHVzKEQzRFJBU1RFUl9TVEFUVVMgKnJhc3RlclN0YXR1cykKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZighcmFzdGVyU3RhdHVzKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCVVOSU1QTEVNRU5URUQoKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpHZXRSZW5kZXJTdGF0ZShEM0RSRU5ERVJTVEFURVRZUEUgc3RhdGUsIHVuc2lnbmVkIGxvbmcgKnZhbHVlKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKCF2YWx1ZSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQkqdmFsdWUgPSByZW5kZXJTdGF0ZVtzdGF0ZV07CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlODo6R2V0UmVuZGVyVGFyZ2V0KElEaXJlY3QzRFN1cmZhY2U4ICoqcmVuZGVyVGFyZ2V0KQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFyZW5kZXJUYXJnZXQpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJKnJlbmRlclRhcmdldCA9IHRoaXMtPnJlbmRlclRhcmdldDsKKwkJdGhpcy0+cmVuZGVyVGFyZ2V0LT5BZGRSZWYoKTsKKwkJCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OkdldFN0cmVhbVNvdXJjZSh1bnNpZ25lZCBpbnQgc3RyZWFtTnVtYmVyLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4ICoqc3RyZWFtRGF0YSwgdW5zaWduZWQgaW50ICpzdHJpZGUpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoc3RyZWFtTnVtYmVyID49IDE2IHx8ICFzdHJlYW1EYXRhIHx8ICFzdHJpZGUpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJKnN0cmVhbURhdGEgPSBkYXRhU3RyZWFtW3N0cmVhbU51bWJlcl07CisJCQorCQlpZihkYXRhU3RyZWFtW3N0cmVhbU51bWJlcl0pCisJCXsKKwkJCWRhdGFTdHJlYW1bc3RyZWFtTnVtYmVyXS0+QWRkUmVmKCk7CisJCX0KKworCQkqc3RyaWRlID0gMDsgICAvLyBOT1RFOiBVbmltcGxlbWVudGVkCisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlODo6R2V0VGV4dHVyZSh1bnNpZ25lZCBsb25nIHN0YWdlLCBJRGlyZWN0M0RCYXNlVGV4dHVyZTggKip0ZXh0dXJlKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKCF0ZXh0dXJlIHx8IHN0YWdlID49IDgpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJKnRleHR1cmUgPSB0aGlzLT50ZXh0dXJlW3N0YWdlXTsKKwkJCisJCWlmKHRoaXMtPnRleHR1cmVbc3RhZ2VdKQorCQl7CisJCQl0aGlzLT50ZXh0dXJlW3N0YWdlXS0+QWRkUmVmKCk7CisJCX0KKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpHZXRUZXh0dXJlU3RhZ2VTdGF0ZSh1bnNpZ25lZCBsb25nIHN0YWdlLCBEM0RURVhUVVJFU1RBR0VTVEFURVRZUEUgc3RhdGUsIHVuc2lnbmVkIGxvbmcgKnZhbHVlKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKCF2YWx1ZSAgfHwgc3RhZ2UgPCAwIHx8IHN0YWdlID49IDggfHwgc3RhdGUgPCAwIHx8IHN0YXRlID4gRDNEVFNTX1JFU1VMVEFSRykgICAvLyBGSVhNRTogU2V0ICp2YWx1ZSB0byAwPworCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCSp2YWx1ZSA9IHRleHR1cmVTdGFnZVN0YXRlW3N0YWdlXVtzdGF0ZV07CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlODo6R2V0VHJhbnNmb3JtKEQzRFRSQU5TRk9STVNUQVRFVFlQRSBzdGF0ZSwgRDNETUFUUklYICptYXRyaXgpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoIW1hdHJpeCB8fCBzdGF0ZSA8IDAgfHwgc3RhdGUgPiA1MTEpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJKm1hdHJpeCA9IHRoaXMtPm1hdHJpeFtzdGF0ZV07CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlODo6R2V0VmVydGV4U2hhZGVyKHVuc2lnbmVkIGxvbmcgKmhhbmRsZSkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZighaGFuZGxlKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCSpoYW5kbGUgPSB2ZXJ0ZXhTaGFkZXJIYW5kbGU7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlODo6R2V0VmVydGV4U2hhZGVyQ29uc3RhbnQodW5zaWduZWQgbG9uZyBzdGFydFJlZ2lzdGVyLCB2b2lkICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGxvbmcgY291bnQpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoIWNvbnN0YW50RGF0YSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJeworCQkJKChmbG9hdCopY29uc3RhbnREYXRhKVtpICogNCArIDBdID0gdmVydGV4U2hhZGVyQ29uc3RhbnRbc3RhcnRSZWdpc3RlciArIGldWzBdOworCQkJKChmbG9hdCopY29uc3RhbnREYXRhKVtpICogNCArIDFdID0gdmVydGV4U2hhZGVyQ29uc3RhbnRbc3RhcnRSZWdpc3RlciArIGldWzFdOworCQkJKChmbG9hdCopY29uc3RhbnREYXRhKVtpICogNCArIDJdID0gdmVydGV4U2hhZGVyQ29uc3RhbnRbc3RhcnRSZWdpc3RlciArIGldWzJdOworCQkJKChmbG9hdCopY29uc3RhbnREYXRhKVtpICogNCArIDNdID0gdmVydGV4U2hhZGVyQ29uc3RhbnRbc3RhcnRSZWdpc3RlciArIGldWzNdOworCQl9CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlODo6R2V0VmVydGV4U2hhZGVyRGVjbGFyYXRpb24odW5zaWduZWQgbG9uZyBoYW5kbGUsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoIWRhdGEgfHwgIXNpemUpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJVU5JTVBMRU1FTlRFRCgpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OkdldFZlcnRleFNoYWRlckZ1bmN0aW9uKHVuc2lnbmVkIGxvbmcgaGFuZGxlLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nICpzaXplKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFkYXRhIHx8ICFzaXplKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCVVOSU1QTEVNRU5URUQoKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpHZXRWaWV3cG9ydChEM0RWSUVXUE9SVDggKnZpZXdwb3J0KQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKCF2aWV3cG9ydCkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQkqdmlld3BvcnQgPSB0aGlzLT52aWV3cG9ydDsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpMaWdodEVuYWJsZSh1bnNpZ25lZCBsb25nIGluZGV4LCBpbnQgZW5hYmxlKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFyZWNvcmRTdGF0ZSkKKwkJeworCQkJaWYoIWxpZ2h0LmV4aXN0cyhpbmRleCkpICAgLy8gSW5zZXJ0IGRlZmF1bHQgbGlnaHQKKwkJCXsKKwkJCQlEM0RMSUdIVDggbGlnaHQ7CisKKwkJCQlsaWdodC5UeXBlID0gRDNETElHSFRfRElSRUNUSU9OQUw7CisJCQkJbGlnaHQuRGlmZnVzZS5yID0gMTsKKwkJCQlsaWdodC5EaWZmdXNlLmcgPSAxOworCQkJCWxpZ2h0LkRpZmZ1c2UuYiA9IDE7CisJCQkJbGlnaHQuRGlmZnVzZS5hID0gMDsKKwkJCQlsaWdodC5TcGVjdWxhci5yID0gMDsKKwkJCQlsaWdodC5TcGVjdWxhci5nID0gMDsKKwkJCQlsaWdodC5TcGVjdWxhci5iID0gMDsKKwkJCQlsaWdodC5TcGVjdWxhci5hID0gMDsKKwkJCQlsaWdodC5BbWJpZW50LnIgPSAwOworCQkJCWxpZ2h0LkFtYmllbnQuZyA9IDA7CisJCQkJbGlnaHQuQW1iaWVudC5iID0gMDsKKwkJCQlsaWdodC5BbWJpZW50LmEgPSAwOworCQkJCWxpZ2h0LlBvc2l0aW9uLnggPSAwOworCQkJCWxpZ2h0LlBvc2l0aW9uLnkgPSAwOworCQkJCWxpZ2h0LlBvc2l0aW9uLnogPSAwOworCQkJCWxpZ2h0LkRpcmVjdGlvbi54ID0gMDsKKwkJCQlsaWdodC5EaXJlY3Rpb24ueSA9IDA7CisJCQkJbGlnaHQuRGlyZWN0aW9uLnogPSAxOworCQkJCWxpZ2h0LlJhbmdlID0gMDsKKwkJCQlsaWdodC5GYWxsb2ZmID0gMDsgCisJCQkJbGlnaHQuQXR0ZW51YXRpb24wID0gMDsKKwkJCQlsaWdodC5BdHRlbnVhdGlvbjEgPSAwOworCQkJCWxpZ2h0LkF0dGVudWF0aW9uMiA9IDA7CisJCQkJbGlnaHQuVGhldGEgPSAwOworCQkJCWxpZ2h0LlBoaSA9IDA7CisKKwkJCQlTZXRMaWdodChpbmRleCwgJmxpZ2h0KTsKKwkJCX0KKworCQkJbGlnaHRbaW5kZXhdLmVuYWJsZSA9IChlbmFibGUgIT0gRkFMU0UpOworCisJCQlsaWdodHNEaXJ0eSA9IHRydWU7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdGF0ZVJlY29yZGVyLmJhY2soKS0+bGlnaHRFbmFibGUoaW5kZXgsIGVuYWJsZSk7CisJCX0KKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpNdWx0aXBseVRyYW5zZm9ybShEM0RUUkFOU0ZPUk1TVEFURVRZUEUgc3RhdGUsIGNvbnN0IEQzRE1BVFJJWCAqbWF0cml4KQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFtYXRyaXgpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJRDNETUFUUklYICpjdXJyZW50ID0gJnRoaXMtPm1hdHJpeFtzdGF0ZV07CisKKwkJc3c6Ok1hdHJpeCBDKGN1cnJlbnQtPl8xMSwgY3VycmVudC0+XzIxLCBjdXJyZW50LT5fMzEsIGN1cnJlbnQtPl80MSwKKwkJICAgICAgICAgICAgIGN1cnJlbnQtPl8xMiwgY3VycmVudC0+XzIyLCBjdXJyZW50LT5fMzIsIGN1cnJlbnQtPl80MiwKKwkJICAgICAgICAgICAgIGN1cnJlbnQtPl8xMywgY3VycmVudC0+XzIzLCBjdXJyZW50LT5fMzMsIGN1cnJlbnQtPl80MywKKwkJICAgICAgICAgICAgIGN1cnJlbnQtPl8xNCwgY3VycmVudC0+XzI0LCBjdXJyZW50LT5fMzQsIGN1cnJlbnQtPl80NCk7CisKKwkJc3c6Ok1hdHJpeCBNKG1hdHJpeC0+XzExLCBtYXRyaXgtPl8yMSwgbWF0cml4LT5fMzEsIG1hdHJpeC0+XzQxLAorCQkgICAgICAgICAgICAgbWF0cml4LT5fMTIsIG1hdHJpeC0+XzIyLCBtYXRyaXgtPl8zMiwgbWF0cml4LT5fNDIsCisJCSAgICAgICAgICAgICBtYXRyaXgtPl8xMywgbWF0cml4LT5fMjMsIG1hdHJpeC0+XzMzLCBtYXRyaXgtPl80MywKKwkJICAgICAgICAgICAgIG1hdHJpeC0+XzE0LCBtYXRyaXgtPl8yNCwgbWF0cml4LT5fMzQsIG1hdHJpeC0+XzQ0KTsKKworCQlzd2l0Y2goc3RhdGUpCisJCXsKKwkJY2FzZSBEM0RUU19XT1JMRDoKKwkJCXJlbmRlcmVyLT5zZXRNb2RlbE1hdHJpeChDICogTSk7CisJCQlicmVhazsKKwkJY2FzZSBEM0RUU19WSUVXOgorCQkJcmVuZGVyZXItPnNldFZpZXdNYXRyaXgoQyAqIE0pOworCQkJYnJlYWs7CisJCWNhc2UgRDNEVFNfUFJPSkVDVElPTjoKKwkJCXJlbmRlcmVyLT5zZXRQcm9qZWN0aW9uTWF0cml4KEMgKiBNKTsKKwkJCWJyZWFrOworCQljYXNlIEQzRFRTX1RFWFRVUkUwOgorCQkJcmVuZGVyZXItPnNldFRleHR1cmVNYXRyaXgoMCwgQyAqIE0pOworCQkJYnJlYWs7CisJCWNhc2UgRDNEVFNfVEVYVFVSRTE6CisJCQlyZW5kZXJlci0+c2V0VGV4dHVyZU1hdHJpeCgxLCBDICogTSk7CisJCQlicmVhazsKKwkJY2FzZSBEM0RUU19URVhUVVJFMjoKKwkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlTWF0cml4KDIsIEMgKiBNKTsKKwkJCWJyZWFrOworCQljYXNlIEQzRFRTX1RFWFRVUkUzOgorCQkJcmVuZGVyZXItPnNldFRleHR1cmVNYXRyaXgoMywgQyAqIE0pOworCQkJYnJlYWs7CisJCWNhc2UgRDNEVFNfVEVYVFVSRTQ6CisJCQlyZW5kZXJlci0+c2V0VGV4dHVyZU1hdHJpeCg0LCBDICogTSk7CisJCQlicmVhazsKKwkJY2FzZSBEM0RUU19URVhUVVJFNToKKwkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlTWF0cml4KDUsIEMgKiBNKTsKKwkJCWJyZWFrOworCQljYXNlIEQzRFRTX1RFWFRVUkU2OgorCQkJcmVuZGVyZXItPnNldFRleHR1cmVNYXRyaXgoNiwgQyAqIE0pOworCQkJYnJlYWs7CisJCWNhc2UgRDNEVFNfVEVYVFVSRTc6CisJCQlyZW5kZXJlci0+c2V0VGV4dHVyZU1hdHJpeCg3LCBDICogTSk7CisJCQlicmVhazsKKwkJZGVmYXVsdDoKKwkJCWlmKHN0YXRlID4gMjU2ICYmIHN0YXRlIDwgNTEyKQorCQkJeworCQkJCXJlbmRlcmVyLT5zZXRNb2RlbE1hdHJpeChDICogTSwgc3RhdGUgLSAyNTYpOworCQkJfQorCQkJZWxzZSBBU1NFUlQoZmFsc2UpOworCQl9CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlODo6UHJlc2VudChjb25zdCBSRUNUICpzb3VyY2VSZWN0LCBjb25zdCBSRUNUICpkZXN0UmVjdCwgSFdORCBkZXN0V2luZG93T3ZlcnJpZGUsIGNvbnN0IFJHTkRBVEEgKmRpcnR5UmVnaW9uKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCS8vIE5PVEU6IHNvdXJjZVJlY3QgYW5kIGRlc3RSZWN0IGNhbiBiZSBudWxsLCBkaXJ0eVJlZ2lvbiBoYXMgdG8gYmUgbnVsbAorCisJCUhXTkQgd2luZG93SGFuZGxlID0gcHJlc2VudFBhcmFtZXRlcnMuaERldmljZVdpbmRvdyA/IHByZXNlbnRQYXJhbWV0ZXJzLmhEZXZpY2VXaW5kb3cgOiBmb2N1c1dpbmRvdzsKKworCQlpZihkZXN0V2luZG93T3ZlcnJpZGUgJiYgZGVzdFdpbmRvd092ZXJyaWRlICE9IHdpbmRvd0hhbmRsZSkKKwkJeworCQkJVU5JTVBMRU1FTlRFRCgpOworCQl9CisKKwkJaWYoZGlydHlSZWdpb24pCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJc3dhcENoYWluWzBdLT5QcmVzZW50KHNvdXJjZVJlY3QsIGRlc3RSZWN0LCBkZXN0V2luZG93T3ZlcnJpZGUsIGRpcnR5UmVnaW9uKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpQcm9jZXNzVmVydGljZXModW5zaWduZWQgaW50IHNyY1N0YXJ0SW5kZXgsIHVuc2lnbmVkIGludCBkZXN0SW5kZXgsIHVuc2lnbmVkIGludCB2ZXJ0ZXhDb3VudCwgSURpcmVjdDNEVmVydGV4QnVmZmVyOCAqZGVzdEJ1ZmZlciwgdW5zaWduZWQgbG9uZyBmbGFncykKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZighZGVzdEJ1ZmZlcikKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlVTklNUExFTUVOVEVEKCk7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlODo6UmVzZXQoRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycykKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZighcHJlc2VudFBhcmFtZXRlcnMpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJaWYoc3dhcENoYWluWzBdKQorCQl7CisJCQlzd2FwQ2hhaW5bMF0tPnVuYmluZCgpOworCQkJc3dhcENoYWluWzBdID0gMDsKKwkJfQorCQkKKwkJaWYoZGVwdGhTdGVuY2lsKQorCQl7CisJCQlkZXB0aFN0ZW5jaWwtPnVuYmluZCgpOworCQkJZGVwdGhTdGVuY2lsID0gMDsKKwkJfQorCQkKKwkJaWYocmVuZGVyVGFyZ2V0KQorCQl7CisJCQlyZW5kZXJUYXJnZXQtPnVuYmluZCgpOworCQkJcmVuZGVyVGFyZ2V0ID0gMDsKKwkJfQorCisJCUQzRFBSRVNFTlRfUEFSQU1FVEVSUyBwcmVzZW50ID0gKnByZXNlbnRQYXJhbWV0ZXJzOworCisJCWlmKCFzd2FwQ2hhaW5bMF0pCisJCXsKKwkJCXN3YXBDaGFpblswXSA9IG5ldyBEaXJlY3QzRFN3YXBDaGFpbjgodGhpcywgJnByZXNlbnQpOworCQkJc3dhcENoYWluWzBdLT5iaW5kKCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzd2FwQ2hhaW5bMF0tPnJlc2V0KCZwcmVzZW50KTsKKwkJfQorCisJCUhXTkQgd2luZG93SGFuZGxlID0gcHJlc2VudFBhcmFtZXRlcnMtPmhEZXZpY2VXaW5kb3cgPyBwcmVzZW50UGFyYW1ldGVycy0+aERldmljZVdpbmRvdyA6IGZvY3VzV2luZG93OworCisJCWludCB3aWR0aCA9IDA7CisJCWludCBoZWlnaHQgPSAwOworCisJCWlmKHByZXNlbnRQYXJhbWV0ZXJzLT5XaW5kb3dlZCAmJiAocHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJIZWlnaHQgPT0gMCB8fCBwcmVzZW50UGFyYW1ldGVycy0+QmFja0J1ZmZlcldpZHRoID09IDApKQorCQl7CisJCQlSRUNUIHJlY3RhbmdsZTsKKwkJCUdldENsaWVudFJlY3Qod2luZG93SGFuZGxlLCAmcmVjdGFuZ2xlKTsKKworCQkJd2lkdGggPSByZWN0YW5nbGUucmlnaHQgLSByZWN0YW5nbGUubGVmdDsKKwkJCWhlaWdodCA9IHJlY3RhbmdsZS5ib3R0b20gLSByZWN0YW5nbGUudG9wOworCQl9CisJCWVsc2UKKwkJeworCQkJd2lkdGggPSBwcmVzZW50UGFyYW1ldGVycy0+QmFja0J1ZmZlcldpZHRoOworCQkJaGVpZ2h0ID0gcHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJIZWlnaHQ7CisJCX0KKworCQlpZihwcmVzZW50UGFyYW1ldGVycy0+RW5hYmxlQXV0b0RlcHRoU3RlbmNpbCAhPSBGQUxTRSkKKwkJeworCQkJZGVwdGhTdGVuY2lsID0gbmV3IERpcmVjdDNEU3VyZmFjZTgodGhpcywgdGhpcywgd2lkdGgsIGhlaWdodCwgcHJlc2VudFBhcmFtZXRlcnMtPkF1dG9EZXB0aFN0ZW5jaWxGb3JtYXQsIEQzRFBPT0xfREVGQVVMVCwgcHJlc2VudFBhcmFtZXRlcnMtPk11bHRpU2FtcGxlVHlwZSwgcHJlc2VudFBhcmFtZXRlcnMtPkF1dG9EZXB0aFN0ZW5jaWxGb3JtYXQgPT0gRDNERk1UX0QxNl9MT0NLQUJMRSwgRDNEVVNBR0VfREVQVEhTVEVOQ0lMKTsKKwkJCWRlcHRoU3RlbmNpbC0+YmluZCgpOworCQl9CisKKwkJSURpcmVjdDNEU3VyZmFjZTggKnJlbmRlclRhcmdldDsKKwkJc3dhcENoYWluWzBdLT5HZXRCYWNrQnVmZmVyKDAsIEQzREJBQ0tCVUZGRVJfVFlQRV9NT05PLCAmcmVuZGVyVGFyZ2V0KTsKKwkJU2V0UmVuZGVyVGFyZ2V0KHJlbmRlclRhcmdldCwgZGVwdGhTdGVuY2lsKTsKKwkJcmVuZGVyVGFyZ2V0LT5SZWxlYXNlKCk7CisKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfWkVOQUJMRSwgcHJlc2VudFBhcmFtZXRlcnMtPkVuYWJsZUF1dG9EZXB0aFN0ZW5jaWwgIT0gRkFMU0UgPyBEM0RaQl9UUlVFIDogRDNEWkJfRkFMU0UpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19GSUxMTU9ERSwgRDNERklMTF9TT0xJRCk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1NIQURFTU9ERSwgRDNEU0hBREVfR09VUkFVRCk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1pXUklURUVOQUJMRSwgVFJVRSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0FMUEhBVEVTVEVOQUJMRSwgRkFMU0UpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19MQVNUUElYRUwsIFRSVUUpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19TUkNCTEVORCwgRDNEQkxFTkRfT05FKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfREVTVEJMRU5ELCBEM0RCTEVORF9aRVJPKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfQ1VMTE1PREUsIEQzRENVTExfQ0NXKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfWkZVTkMsIEQzRENNUF9MRVNTRVFVQUwpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19BTFBIQVJFRiwgMCk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0FMUEhBRlVOQywgRDNEQ01QX0FMV0FZUyk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0RJVEhFUkVOQUJMRSwgRkFMU0UpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19BTFBIQUJMRU5ERU5BQkxFLCBGQUxTRSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0ZPR0VOQUJMRSwgRkFMU0UpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19TUEVDVUxBUkVOQUJMRSwgRkFMU0UpOworCS8vCVNldFJlbmRlclN0YXRlKEQzRFJTX1pWSVNJQkxFLCAwKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfRk9HQ09MT1IsIDApOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19GT0dUQUJMRU1PREUsIEQzREZPR19OT05FKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfRk9HU1RBUlQsIEZ0b0RXKDAuMGYpKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfRk9HRU5ELCBGdG9EVygxLjBmKSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0ZPR0RFTlNJVFksIEZ0b0RXKDEuMGYpKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfRURHRUFOVElBTElBUywgRkFMU0UpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19SQU5HRUZPR0VOQUJMRSwgRkFMU0UpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19aQklBUywgMCk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1NURU5DSUxFTkFCTEUsIEZBTFNFKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTEZBSUwsIEQzRFNURU5DSUxPUF9LRUVQKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTFpGQUlMLCBEM0RTVEVOQ0lMT1BfS0VFUCk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1NURU5DSUxQQVNTLCBEM0RTVEVOQ0lMT1BfS0VFUCk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1NURU5DSUxGVU5DLCBEM0RDTVBfQUxXQVlTKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTFJFRiwgMCk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1NURU5DSUxNQVNLLCAweEZGRkZGRkZGKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTFdSSVRFTUFTSywgMHhGRkZGRkZGRik7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1RFWFRVUkVGQUNUT1IsIDB4RkZGRkZGRkYpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19XUkFQMCwgMCk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1dSQVAxLCAwKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfV1JBUDIsIDApOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19XUkFQMywgMCk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1dSQVA0LCAwKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfV1JBUDUsIDApOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19XUkFQNiwgMCk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1dSQVA3LCAwKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfQ0xJUFBJTkcsIFRSVUUpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19MSUdIVElORywgVFJVRSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0FNQklFTlQsIDApOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19GT0dWRVJURVhNT0RFLCBEM0RGT0dfTk9ORSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0NPTE9SVkVSVEVYLCBUUlVFKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfTE9DQUxWSUVXRVIsIFRSVUUpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19OT1JNQUxJWkVOT1JNQUxTLCBGQUxTRSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0RJRkZVU0VNQVRFUklBTFNPVVJDRSwgRDNETUNTX0NPTE9SMSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1NQRUNVTEFSTUFURVJJQUxTT1VSQ0UsIEQzRE1DU19DT0xPUjIpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19BTUJJRU5UTUFURVJJQUxTT1VSQ0UsIEQzRE1DU19NQVRFUklBTCk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0VNSVNTSVZFTUFURVJJQUxTT1VSQ0UsIEQzRE1DU19NQVRFUklBTCk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1ZFUlRFWEJMRU5ELCBEM0RWQkZfRElTQUJMRSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0NMSVBQTEFORUVOQUJMRSwgMCk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1NPRlRXQVJFVkVSVEVYUFJPQ0VTU0lORywgRkFMU0UpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19QT0lOVFNJWkUsIEZ0b0RXKDEuMGYpKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfUE9JTlRTSVpFX01JTiwgRnRvRFcoMC4wZikpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19QT0lOVFNQUklURUVOQUJMRSwgRkFMU0UpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19QT0lOVFNDQUxFRU5BQkxFLCBGQUxTRSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1BPSU5UU0NBTEVfQSwgRnRvRFcoMS4wZikpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19QT0lOVFNDQUxFX0IsIEZ0b0RXKDAuMGYpKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfUE9JTlRTQ0FMRV9DLCBGdG9EVygwLjBmKSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX01VTFRJU0FNUExFQU5USUFMSUFTLCBUUlVFKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfTVVMVElTQU1QTEVNQVNLLCAweEZGRkZGRkZGKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfUEFUQ0hFREdFU1RZTEUsIEQzRFBBVENIRURHRV9ESVNDUkVURSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0RFQlVHTU9OSVRPUlRPS0VOLCBEM0RETVRfRU5BQkxFKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfUE9JTlRTSVpFX01BWCwgRnRvRFcoNjQuMGYpKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfSU5ERVhFRFZFUlRFWEJMRU5ERU5BQkxFLCBGQUxTRSk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX0NPTE9SV1JJVEVFTkFCTEUsIDB4MDAwMDAwMEYpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19UV0VFTkZBQ1RPUiwgRnRvRFcoMC4wZikpOworCQlTZXRSZW5kZXJTdGF0ZShEM0RSU19CTEVORE9QLCBEM0RCTEVORE9QX0FERCk7CisJCVNldFJlbmRlclN0YXRlKEQzRFJTX1BPU0lUSU9OT1JERVIsIEQzRE9SREVSX0NVQklDKTsKKwkJU2V0UmVuZGVyU3RhdGUoRDNEUlNfTk9STUFMT1JERVIsIEQzRE9SREVSX0xJTkVBUik7CisKKwkJZm9yKGludCBpID0gMDsgaSA8IDg7IGkrKykKKwkJeworCQkJU2V0VGV4dHVyZShpLCAwKTsKKworCQkJU2V0VGV4dHVyZVN0YWdlU3RhdGUoaSwgRDNEVFNTX0NPTE9ST1AsIGkgPT0gMCA/IEQzRFRPUF9NT0RVTEFURSA6IEQzRFRPUF9ESVNBQkxFKTsKKwkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19DT0xPUkFSRzEsIEQzRFRBX1RFWFRVUkUpOyAgIC8vIFRPRE86IEQzRFRBX0RJRkZVU0Ugd2hlbiBubyB0ZXh0dXJlIGFzc2lnbmVkCisJCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfQ09MT1JBUkcyLCBEM0RUQV9DVVJSRU5UKTsKKwkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19BTFBIQU9QLCBpID09IDAgPyBEM0RUT1BfU0VMRUNUQVJHMSA6IEQzRFRPUF9ESVNBQkxFKTsKKwkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19BTFBIQUFSRzEsIEQzRFRBX1RFWFRVUkUpOyAgIC8vIFRPRE86IEQzRFRBX0RJRkZVU0Ugd2hlbiBubyB0ZXh0dXJlIGFzc2lnbmVkCisJCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfQUxQSEFBUkcyLCBEM0RUQV9DVVJSRU5UKTsKKwkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19CVU1QRU5WTUFUMDAsIEZ0b0RXKDAuMGYpKTsKKwkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19CVU1QRU5WTUFUMDEsIEZ0b0RXKDAuMGYpKTsKKwkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19CVU1QRU5WTUFUMTAsIEZ0b0RXKDAuMGYpKTsKKwkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19CVU1QRU5WTUFUMTEsIEZ0b0RXKDAuMGYpKTsKKwkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19URVhDT09SRElOREVYLCBpKTsKKwkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19BRERSRVNTVSwgRDNEVEFERFJFU1NfV1JBUCk7CisJCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfQUREUkVTU1YsIEQzRFRBRERSRVNTX1dSQVApOworCQkJU2V0VGV4dHVyZVN0YWdlU3RhdGUoaSwgRDNEVFNTX0FERFJFU1NXLCBEM0RUQUREUkVTU19XUkFQKTsKKwkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19CT1JERVJDT0xPUiwgMHgwMDAwMDAwMCk7CisJCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfTUFHRklMVEVSLCBEM0RURVhGX1BPSU5UKTsKKwkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19NSU5GSUxURVIsIEQzRFRFWEZfUE9JTlQpOworCQkJU2V0VGV4dHVyZVN0YWdlU3RhdGUoaSwgRDNEVFNTX01JUEZJTFRFUiwgRDNEVEVYRl9OT05FKTsKKwkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19NSVBNQVBMT0RCSUFTLCAwKTsKKwkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19NQVhNSVBMRVZFTCwgMCk7CisJCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfTUFYQU5JU09UUk9QWSwgMSk7CisJCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfQlVNUEVOVkxTQ0FMRSwgRnRvRFcoMC4wZikpOworCQkJU2V0VGV4dHVyZVN0YWdlU3RhdGUoaSwgRDNEVFNTX0JVTVBFTlZMT0ZGU0VULCBGdG9EVygwLjBmKSk7CisJCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfVEVYVFVSRVRSQU5TRk9STUZMQUdTLCBEM0RUVEZGX0RJU0FCTEUpOworCQkJU2V0VGV4dHVyZVN0YWdlU3RhdGUoaSwgRDNEVFNTX0NPTE9SQVJHMCwgRDNEVEFfQ1VSUkVOVCk7CisJCQlTZXRUZXh0dXJlU3RhZ2VTdGF0ZShpLCBEM0RUU1NfQUxQSEFBUkcwLCBEM0RUQV9DVVJSRU5UKTsKKwkJCVNldFRleHR1cmVTdGFnZVN0YXRlKGksIEQzRFRTU19SRVNVTFRBUkcsIEQzRFRBX0NVUlJFTlQpOworCQl9CisKKwkJY3VycmVudFBhbGV0dGUgPSAweEZGRkY7CisKKwkJZGVsZXRlIGN1cnNvcjsKKwkJc2hvd0N1cnNvciA9IGZhbHNlOworCisJCXJldHVybiBEM0RfT0s7CQkKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlODo6UmVzb3VyY2VNYW5hZ2VyRGlzY2FyZEJ5dGVzKHVuc2lnbmVkIGxvbmcgYnl0ZXMpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlODo6U2V0Q2xpcFBsYW5lKHVuc2lnbmVkIGxvbmcgaW5kZXgsIGNvbnN0IGZsb2F0ICpwbGFuZSkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZighcGxhbmUgfHwgaW5kZXggPiA2KQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWlmKCFyZWNvcmRTdGF0ZSkKKwkJeworCQkJdGhpcy0+cGxhbmVbaW5kZXhdWzBdID0gcGxhbmVbMF07CisJCQl0aGlzLT5wbGFuZVtpbmRleF1bMV0gPSBwbGFuZVsxXTsKKwkJCXRoaXMtPnBsYW5lW2luZGV4XVsyXSA9IHBsYW5lWzJdOworCQkJdGhpcy0+cGxhbmVbaW5kZXhdWzNdID0gcGxhbmVbM107CisKKwkJCXJlbmRlcmVyLT5zZXRDbGlwUGxhbmUoaW5kZXgsIHBsYW5lKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCXN0YXRlUmVjb3JkZXIuYmFjaygpLT5zZXRDbGlwUGxhbmUoaW5kZXgsIHBsYW5lKTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OlNldENsaXBTdGF0dXMoY29uc3QgRDNEQ0xJUFNUQVRVUzggKmNsaXBTdGF0dXMpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoIWNsaXBTdGF0dXMpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJdGhpcy0+Y2xpcFN0YXR1cyA9ICpjbGlwU3RhdHVzOworCisJCVVOSU1QTEVNRU5URUQoKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpTZXRDdXJyZW50VGV4dHVyZVBhbGV0dGUodW5zaWduZWQgaW50IHBhbGV0dGVOdW1iZXIpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYocGFsZXR0ZU51bWJlciA+IDB4RkZGRiB8fCBwYWxldHRlLmZpbmQocGFsZXR0ZU51bWJlcikgPT0gcGFsZXR0ZS5lbmQoKSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlpZighcmVjb3JkU3RhdGUpCisJCXsKKwkJCWN1cnJlbnRQYWxldHRlID0gcGFsZXR0ZU51bWJlcjsKKworCQkJc3c6OlN1cmZhY2U6OnNldFRleHR1cmVQYWxldHRlKCh1bnNpZ25lZCBpbnQqKSZwYWxldHRlW2N1cnJlbnRQYWxldHRlXSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdGF0ZVJlY29yZGVyLmJhY2soKS0+c2V0Q3VycmVudFRleHR1cmVQYWxldHRlKHBhbGV0dGVOdW1iZXIpOworCQl9CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwl2b2lkIERpcmVjdDNERGV2aWNlODo6U2V0Q3Vyc29yUG9zaXRpb24oaW50IHgsIGludCB5LCB1bnNpZ25lZCBsb25nIGZsYWdzKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCVBPSU5UIHBvaW50ID0ge3gsIHl9OworCQlIV05EIHdpbmRvdyA9IGZvY3VzV2luZG93ID8gZm9jdXNXaW5kb3cgOiBwcmVzZW50UGFyYW1ldGVycy5oRGV2aWNlV2luZG93OworCQlTY3JlZW5Ub0NsaWVudCh3aW5kb3csICZwb2ludCk7CisKKwkJc3c6OkZyYW1lQnVmZmVyOjpzZXRDdXJzb3JQb3NpdGlvbihwb2ludC54LCBwb2ludC55KTsKKwl9CisKKwl2b2lkIERpcmVjdDNERGV2aWNlODo6U2V0Q3Vyc29yUG9zaXRpb24odW5zaWduZWQgaW50IHgsIHVuc2lnbmVkIGludCB5LCB1bnNpZ25lZCBsb25nIGZsYWdzKQorCXsKKwkJU2V0Q3Vyc29yUG9zaXRpb24oKGludCl4LCAoaW50KXksIGZsYWdzKTsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlODo6U2V0Q3Vyc29yUHJvcGVydGllcyh1bnNpZ25lZCBpbnQgeDAsIHVuc2lnbmVkIGludCB5MCwgSURpcmVjdDNEU3VyZmFjZTggKmN1cnNvckJpdG1hcCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZighY3Vyc29yQml0bWFwKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCUQzRFNVUkZBQ0VfREVTQyBkZXNjOworCQlEM0RMT0NLRURfUkVDVCBsb2NrOworCisJCWN1cnNvckJpdG1hcC0+R2V0RGVzYygmZGVzYyk7CisJCWN1cnNvckJpdG1hcC0+TG9ja1JlY3QoJmxvY2ssIDAsIDApOworCisJCWRlbGV0ZSBjdXJzb3I7CisJCWN1cnNvciA9IG5ldyBzdzo6U3VyZmFjZSgwLCBkZXNjLldpZHRoLCBkZXNjLkhlaWdodCwgMSwgc3c6OkZPUk1BVF9BOFI4RzhCOCwgZmFsc2UsIGZhbHNlKTsKKworCQl2b2lkICpidWZmZXIgPSBjdXJzb3ItPmxvY2tFeHRlcm5hbCgwLCAwLCAwLCBzdzo6TE9DS19ESVNDQVJELCBzdzo6UFVCTElDKTsKKwkJbWVtY3B5KGJ1ZmZlciwgbG9jay5wQml0cywgZGVzYy5XaWR0aCAqIGRlc2MuSGVpZ2h0ICogc2l6ZW9mKHVuc2lnbmVkIGludCkpOworCQljdXJzb3ItPnVubG9ja0V4dGVybmFsKCk7CisKKwkJY3Vyc29yQml0bWFwLT5VbmxvY2tSZWN0KCk7CisKKwkJc3c6OkZyYW1lQnVmZmVyOjpzZXRDdXJzb3JPcmlnaW4oeDAsIHkwKTsKKworCQliaW5kQ3Vyc29yKCk7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwl2b2lkIERpcmVjdDNERGV2aWNlODo6U2V0R2FtbWFSYW1wKHVuc2lnbmVkIGxvbmcgZmxhZ3MsIGNvbnN0IEQzREdBTU1BUkFNUCAqcmFtcCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZighcmFtcCkKKwkJeworCQkJcmV0dXJuOworCQl9CisKKwkJc3dhcENoYWluWzBdLT5zZXRHYW1tYVJhbXAoKHN3OjpHYW1tYVJhbXAqKXJhbXAsIGZsYWdzICYgRDNEU0dSX0NBTElCUkFURSk7CisJCQorCQlyZXR1cm47CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OlNldExpZ2h0KHVuc2lnbmVkIGxvbmcgaW5kZXgsIGNvbnN0IEQzRExJR0hUOCAqbGlnaHQpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoIWxpZ2h0KQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWlmKCFyZWNvcmRTdGF0ZSkKKwkJeworCQkJdGhpcy0+bGlnaHRbaW5kZXhdID0gKmxpZ2h0OworCisJCQlsaWdodHNEaXJ0eSA9IHRydWU7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdGF0ZVJlY29yZGVyLmJhY2soKS0+c2V0TGlnaHQoaW5kZXgsIGxpZ2h0KTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OlNldE1hdGVyaWFsKGNvbnN0IEQzRE1BVEVSSUFMOCAqbWF0ZXJpYWwpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoIW1hdGVyaWFsKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsgICAvLyBGSVhNRTogQ29ycmVjdCBiZWhhdmlvdXI/CisJCX0KKworCQlpZighcmVjb3JkU3RhdGUpCisJCXsKKwkJCXRoaXMtPm1hdGVyaWFsID0gKm1hdGVyaWFsOworCisJCQlyZW5kZXJlci0+c2V0TWF0ZXJpYWxBbWJpZW50KHN3OjpDb2xvcjxmbG9hdD4obWF0ZXJpYWwtPkFtYmllbnQuciwgbWF0ZXJpYWwtPkFtYmllbnQuZywgbWF0ZXJpYWwtPkFtYmllbnQuYiwgbWF0ZXJpYWwtPkFtYmllbnQuYSkpOworCQkJcmVuZGVyZXItPnNldE1hdGVyaWFsRGlmZnVzZShzdzo6Q29sb3I8ZmxvYXQ+KG1hdGVyaWFsLT5EaWZmdXNlLnIsIG1hdGVyaWFsLT5EaWZmdXNlLmcsIG1hdGVyaWFsLT5EaWZmdXNlLmIsIG1hdGVyaWFsLT5EaWZmdXNlLmEpKTsKKwkJCXJlbmRlcmVyLT5zZXRNYXRlcmlhbEVtaXNzaW9uKHN3OjpDb2xvcjxmbG9hdD4obWF0ZXJpYWwtPkVtaXNzaXZlLnIsIG1hdGVyaWFsLT5FbWlzc2l2ZS5nLCBtYXRlcmlhbC0+RW1pc3NpdmUuYiwgbWF0ZXJpYWwtPkVtaXNzaXZlLmEpKTsKKwkJCXJlbmRlcmVyLT5zZXRNYXRlcmlhbFNoaW5pbmVzcyhtYXRlcmlhbC0+UG93ZXIpOworCQkJcmVuZGVyZXItPnNldE1hdGVyaWFsU3BlY3VsYXIoc3c6OkNvbG9yPGZsb2F0PihtYXRlcmlhbC0+U3BlY3VsYXIuciwgbWF0ZXJpYWwtPlNwZWN1bGFyLmcsIG1hdGVyaWFsLT5TcGVjdWxhci5iLCBtYXRlcmlhbC0+U3BlY3VsYXIuYSkpOworCQl9CisJCWVsc2UKKwkJeworCQkJc3RhdGVSZWNvcmRlci5iYWNrKCktPnNldE1hdGVyaWFsKG1hdGVyaWFsKTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OlNldFBhbGV0dGVFbnRyaWVzKHVuc2lnbmVkIGludCBwYWxldHRlTnVtYmVyLCBjb25zdCBQQUxFVFRFRU5UUlkgKmVudHJpZXMpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYocGFsZXR0ZU51bWJlciA+IDB4RkZGRiB8fCAhZW50cmllcykKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlmb3IoaW50IGkgPSAwOyBpIDwgMjU2OyBpKyspCisJCXsKKwkJCXBhbGV0dGVbcGFsZXR0ZU51bWJlcl0uZW50cnlbaV0gPSBlbnRyaWVzW2ldOworCQl9CisKKwkJaWYocGFsZXR0ZU51bWJlciA9PSBjdXJyZW50UGFsZXR0ZSkKKwkJeworCQkJc3c6OlN1cmZhY2U6OnNldFRleHR1cmVQYWxldHRlKCh1bnNpZ25lZCBpbnQqKSZwYWxldHRlW2N1cnJlbnRQYWxldHRlXSk7CisJCX0KKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpTZXRQaXhlbFNoYWRlcih1bnNpZ25lZCBsb25nIGhhbmRsZSkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZighcmVjb3JkU3RhdGUpCisJCXsKKwkJCWlmKHBpeGVsU2hhZGVyW2hhbmRsZV0pCisJCQl7CisJCQkJcGl4ZWxTaGFkZXJbaGFuZGxlXS0+YmluZCgpOworCQkJfQorCisJCQlpZihwaXhlbFNoYWRlcltwaXhlbFNoYWRlckhhbmRsZV0pCisJCQl7CisJCQkJcGl4ZWxTaGFkZXJbcGl4ZWxTaGFkZXJIYW5kbGVdLT51bmJpbmQoKTsKKwkJCX0KKworCQkJcGl4ZWxTaGFkZXJIYW5kbGUgPSBoYW5kbGU7CisKKwkJCWlmKGhhbmRsZSAhPSAwKQorCQkJeworCQkJCXJlbmRlcmVyLT5zZXRQaXhlbFNoYWRlcihwaXhlbFNoYWRlcltoYW5kbGVdLT5nZXRQaXhlbFNoYWRlcigpKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZW5kZXJlci0+c2V0UGl4ZWxTaGFkZXIoMCk7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdGF0ZVJlY29yZGVyLmJhY2soKS0+c2V0UGl4ZWxTaGFkZXIoaGFuZGxlKTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OlNldFBpeGVsU2hhZGVyQ29uc3RhbnQodW5zaWduZWQgbG9uZyBzdGFydFJlZ2lzdGVyLCBjb25zdCB2b2lkICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGxvbmcgY291bnQpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoIXJlY29yZFN0YXRlKQorCQl7CisJCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKwkJCXsKKwkJCQlwaXhlbFNoYWRlckNvbnN0YW50W3N0YXJ0UmVnaXN0ZXIgKyBpXVswXSA9ICgoZmxvYXQqKWNvbnN0YW50RGF0YSlbaSAqIDQgKyAwXTsKKwkJCQlwaXhlbFNoYWRlckNvbnN0YW50W3N0YXJ0UmVnaXN0ZXIgKyBpXVsxXSA9ICgoZmxvYXQqKWNvbnN0YW50RGF0YSlbaSAqIDQgKyAxXTsKKwkJCQlwaXhlbFNoYWRlckNvbnN0YW50W3N0YXJ0UmVnaXN0ZXIgKyBpXVsyXSA9ICgoZmxvYXQqKWNvbnN0YW50RGF0YSlbaSAqIDQgKyAyXTsKKwkJCQlwaXhlbFNoYWRlckNvbnN0YW50W3N0YXJ0UmVnaXN0ZXIgKyBpXVszXSA9ICgoZmxvYXQqKWNvbnN0YW50RGF0YSlbaSAqIDQgKyAzXTsKKwkJCX0KKworCQkJcmVuZGVyZXItPnNldFBpeGVsU2hhZGVyQ29uc3RhbnRGKHN0YXJ0UmVnaXN0ZXIsIChjb25zdCBmbG9hdCopY29uc3RhbnREYXRhLCBjb3VudCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdGF0ZVJlY29yZGVyLmJhY2soKS0+c2V0UGl4ZWxTaGFkZXJDb25zdGFudChzdGFydFJlZ2lzdGVyLCBjb25zdGFudERhdGEsIGNvdW50KTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OlNldFJlbmRlclN0YXRlKEQzRFJFTkRFUlNUQVRFVFlQRSBzdGF0ZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKKwl7CisJCVRSQUNFKCJEM0RSRU5ERVJTVEFURVRZUEUgc3RhdGUgPSAlZCwgdW5zaWduZWQgbG9uZyB2YWx1ZSA9ICVkIiwgc3RhdGUsIHZhbHVlKTsKKworCQlpZihzdGF0ZSA8IEQzRFJTX1pFTkFCTEUgfHwgc3RhdGUgPiBEM0RSU19OT1JNQUxPUkRFUikKKwkJeworCQkJcmV0dXJuIEQzRF9PSzsgICAvLyBGSVhNRTogV2FybmluZworCQl9CisKKwkJaWYoIXJlY29yZFN0YXRlKQorCQl7CisJCQlpZighaW5pdCAmJiByZW5kZXJTdGF0ZVtzdGF0ZV0gPT0gdmFsdWUpCisJCQl7CisJCQkJcmV0dXJuIEQzRF9PSzsKKwkJCX0KKworCQkJcmVuZGVyU3RhdGVbc3RhdGVdID0gdmFsdWU7CisKKwkJCXN3aXRjaChzdGF0ZSkKKwkJCXsJCQorCQkJY2FzZSBEM0RSU19aRU5BQkxFOgorCQkJCXN3aXRjaCh2YWx1ZSkKKwkJCQl7CisJCQkJY2FzZSBEM0RaQl9UUlVFOgorCQkJCWNhc2UgRDNEWkJfVVNFVzoKKwkJCQkJcmVuZGVyZXItPnNldERlcHRoQnVmZmVyRW5hYmxlKHRydWUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFpCX0ZBTFNFOgorCQkJCQlyZW5kZXJlci0+c2V0RGVwdGhCdWZmZXJFbmFibGUoZmFsc2UpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfRklMTE1PREU6CisJCQkJc3dpdGNoKHZhbHVlKQorCQkJCXsKKwkJCQljYXNlIEQzREZJTExfUE9JTlQ6CisJCQkJCXJlbmRlcmVyLT5zZXRGaWxsTW9kZShzdzo6RklMTF9WRVJURVgpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREZJTExfV0lSRUZSQU1FOgorCQkJCQlyZW5kZXJlci0+c2V0RmlsbE1vZGUoc3c6OkZJTExfV0lSRUZSQU1FKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RGSUxMX1NPTElEOgorCQkJCQlyZW5kZXJlci0+c2V0RmlsbE1vZGUoc3c6OkZJTExfU09MSUQpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfU0hBREVNT0RFOgorCQkJCXN3aXRjaCh2YWx1ZSkKKwkJCQl7CisJCQkJY2FzZSBEM0RTSEFERV9GTEFUOgorCQkJCQlyZW5kZXJlci0+c2V0U2hhZGluZ01vZGUoc3c6OlNIQURJTkdfRkxBVCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEU0hBREVfR09VUkFVRDoKKwkJCQkJcmVuZGVyZXItPnNldFNoYWRpbmdNb2RlKHN3OjpTSEFESU5HX0dPVVJBVUQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFNIQURFX1BIT05HOgorCQkJCQkvLyBGSVhNRTogVW5pbXBsZW1lbnRlZCAoc2hvdWxkIHNldCBnb3VyYXVkKT8KKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX0xJTkVQQVRURVJOOgorCQkJCWlmKCFpbml0KSBVTklNUExFTUVOVEVEKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1pXUklURUVOQUJMRToKKwkJCQlyZW5kZXJlci0+c2V0RGVwdGhXcml0ZUVuYWJsZSh2YWx1ZSAhPSBGQUxTRSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX0FMUEhBVEVTVEVOQUJMRToKKwkJCQlyZW5kZXJlci0+c2V0QWxwaGFUZXN0RW5hYmxlKHZhbHVlICE9IEZBTFNFKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfTEFTVFBJWEVMOgorCQkJCWlmKCFpbml0KSBVTklNUExFTUVOVEVEKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1NSQ0JMRU5EOgorCQkJCXN3aXRjaCh2YWx1ZSkKKwkJCQl7CisJCQkJY2FzZSBEM0RCTEVORF9aRVJPOgorCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3Ioc3c6OkJMRU5EX1pFUk8pOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5EX09ORToKKwkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yKHN3OjpCTEVORF9PTkUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5EX1NSQ0NPTE9SOgorCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3Ioc3c6OkJMRU5EX1NPVVJDRSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRfSU5WU1JDQ09MT1I6CisJCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3Rvcihzdzo6QkxFTkRfSU5WU09VUkNFKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RCTEVORF9TUkNBTFBIQToKKwkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yKHN3OjpCTEVORF9TT1VSQ0VBTFBIQSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRfSU5WU1JDQUxQSEE6CisJCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3Rvcihzdzo6QkxFTkRfSU5WU09VUkNFQUxQSEEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5EX0RFU1RBTFBIQToKKwkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yKHN3OjpCTEVORF9ERVNUQUxQSEEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5EX0lOVkRFU1RBTFBIQToKKwkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yKHN3OjpCTEVORF9JTlZERVNUQUxQSEEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5EX0RFU1RDT0xPUjoKKwkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yKHN3OjpCTEVORF9ERVNUKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RCTEVORF9JTlZERVNUQ09MT1I6CisJCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3Rvcihzdzo6QkxFTkRfSU5WREVTVCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRfU1JDQUxQSEFTQVQ6CisJCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3Rvcihzdzo6QkxFTkRfU1JDQUxQSEFTQVQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5EX0JPVEhTUkNBTFBIQToKKwkJCQkJcmVuZGVyZXItPnNldFNvdXJjZUJsZW5kRmFjdG9yKHN3OjpCTEVORF9TT1VSQ0VBTFBIQSk7CisJCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3Ioc3c6OkJMRU5EX0lOVlNPVVJDRUFMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RCTEVORF9CT1RISU5WU1JDQUxQSEE6CisJCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3Rvcihzdzo6QkxFTkRfSU5WU09VUkNFQUxQSEEpOworCQkJCQlyZW5kZXJlci0+c2V0RGVzdEJsZW5kRmFjdG9yKHN3OjpCTEVORF9TT1VSQ0VBTFBIQSk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19ERVNUQkxFTkQ6CisJCQkJc3dpdGNoKHZhbHVlKQorCQkJCXsKKwkJCQljYXNlIEQzREJMRU5EX1pFUk86CisJCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3Ioc3c6OkJMRU5EX1pFUk8pOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5EX09ORToKKwkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3Rvcihzdzo6QkxFTkRfT05FKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RCTEVORF9TUkNDT0xPUjoKKwkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3Rvcihzdzo6QkxFTkRfU09VUkNFKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RCTEVORF9JTlZTUkNDT0xPUjoKKwkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3Rvcihzdzo6QkxFTkRfSU5WU09VUkNFKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RCTEVORF9TUkNBTFBIQToKKwkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3Rvcihzdzo6QkxFTkRfU09VUkNFQUxQSEEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5EX0lOVlNSQ0FMUEhBOgorCQkJCQlyZW5kZXJlci0+c2V0RGVzdEJsZW5kRmFjdG9yKHN3OjpCTEVORF9JTlZTT1VSQ0VBTFBIQSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRfREVTVEFMUEhBOgorCQkJCQlyZW5kZXJlci0+c2V0RGVzdEJsZW5kRmFjdG9yKHN3OjpCTEVORF9ERVNUQUxQSEEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5EX0lOVkRFU1RBTFBIQToKKwkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3Rvcihzdzo6QkxFTkRfSU5WREVTVEFMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RCTEVORF9ERVNUQ09MT1I6CisJCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3Ioc3c6OkJMRU5EX0RFU1QpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5EX0lOVkRFU1RDT0xPUjoKKwkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3Rvcihzdzo6QkxFTkRfSU5WREVTVCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRfU1JDQUxQSEFTQVQ6CisJCQkJCXJlbmRlcmVyLT5zZXREZXN0QmxlbmRGYWN0b3Ioc3c6OkJMRU5EX1NSQ0FMUEhBU0FUKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RCTEVORF9CT1RIU1JDQUxQSEE6CisJCQkJCXJlbmRlcmVyLT5zZXRTb3VyY2VCbGVuZEZhY3Rvcihzdzo6QkxFTkRfU09VUkNFQUxQSEEpOworCQkJCQlyZW5kZXJlci0+c2V0RGVzdEJsZW5kRmFjdG9yKHN3OjpCTEVORF9JTlZTT1VSQ0VBTFBIQSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQkxFTkRfQk9USElOVlNSQ0FMUEhBOgorCQkJCQlyZW5kZXJlci0+c2V0U291cmNlQmxlbmRGYWN0b3Ioc3c6OkJMRU5EX0lOVlNPVVJDRUFMUEhBKTsKKwkJCQkJcmVuZGVyZXItPnNldERlc3RCbGVuZEZhY3Rvcihzdzo6QkxFTkRfU09VUkNFQUxQSEEpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfQ1VMTE1PREU6CQorCQkJCXN3aXRjaCh2YWx1ZSkKKwkJCQl7CisJCQkJY2FzZSBEM0RDVUxMX05PTkU6CisJCQkJCXJlbmRlcmVyLT5zZXRDdWxsTW9kZShzdzo6Q1VMTF9OT05FKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RDVUxMX0NDVzoKKwkJCQkJcmVuZGVyZXItPnNldEN1bGxNb2RlKHN3OjpDVUxMX0NPVU5URVJDTE9DS1dJU0UpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRENVTExfQ1c6CisJCQkJCXJlbmRlcmVyLT5zZXRDdWxsTW9kZShzdzo6Q1VMTF9DTE9DS1dJU0UpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfWkZVTkM6CisJCQkJc3dpdGNoKHZhbHVlKQorCQkJCXsKKwkJCQljYXNlIEQzRENNUF9ORVZFUjoKKwkJCQkJcmVuZGVyZXItPnNldERlcHRoQ29tcGFyZShzdzo6REVQVEhfTkVWRVIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRENNUF9MRVNTOgorCQkJCQlyZW5kZXJlci0+c2V0RGVwdGhDb21wYXJlKHN3OjpERVBUSF9MRVNTKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RDTVBfRVFVQUw6CisJCQkJCXJlbmRlcmVyLT5zZXREZXB0aENvbXBhcmUoc3c6OkRFUFRIX0VRVUFMKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RDTVBfTEVTU0VRVUFMOgorCQkJCQlyZW5kZXJlci0+c2V0RGVwdGhDb21wYXJlKHN3OjpERVBUSF9MRVNTRVFVQUwpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRENNUF9HUkVBVEVSOgorCQkJCQlyZW5kZXJlci0+c2V0RGVwdGhDb21wYXJlKHN3OjpERVBUSF9HUkVBVEVSKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RDTVBfTk9URVFVQUw6CisJCQkJCXJlbmRlcmVyLT5zZXREZXB0aENvbXBhcmUoc3c6OkRFUFRIX05PVEVRVUFMKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RDTVBfR1JFQVRFUkVRVUFMOgorCQkJCQlyZW5kZXJlci0+c2V0RGVwdGhDb21wYXJlKHN3OjpERVBUSF9HUkVBVEVSRVFVQUwpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRENNUF9BTFdBWVM6CisJCQkJCXJlbmRlcmVyLT5zZXREZXB0aENvbXBhcmUoc3c6OkRFUFRIX0FMV0FZUyk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19BTFBIQVJFRjoKKwkJCQlyZW5kZXJlci0+c2V0QWxwaGFSZWZlcmVuY2UodmFsdWUgJiAweDAwMDAwMEZGKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfQUxQSEFGVU5DOgorCQkJCXN3aXRjaCh2YWx1ZSkKKwkJCQl7CisJCQkJY2FzZSBEM0RDTVBfTkVWRVI6CisJCQkJCXJlbmRlcmVyLT5zZXRBbHBoYUNvbXBhcmUoc3c6OkFMUEhBX05FVkVSKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RDTVBfTEVTUzoKKwkJCQkJcmVuZGVyZXItPnNldEFscGhhQ29tcGFyZShzdzo6QUxQSEFfTEVTUyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQ01QX0VRVUFMOgorCQkJCQlyZW5kZXJlci0+c2V0QWxwaGFDb21wYXJlKHN3OjpBTFBIQV9FUVVBTCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQ01QX0xFU1NFUVVBTDoKKwkJCQkJcmVuZGVyZXItPnNldEFscGhhQ29tcGFyZShzdzo6QUxQSEFfTEVTU0VRVUFMKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RDTVBfR1JFQVRFUjoKKwkJCQkJcmVuZGVyZXItPnNldEFscGhhQ29tcGFyZShzdzo6QUxQSEFfR1JFQVRFUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQ01QX05PVEVRVUFMOgorCQkJCQlyZW5kZXJlci0+c2V0QWxwaGFDb21wYXJlKHN3OjpBTFBIQV9OT1RFUVVBTCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQ01QX0dSRUFURVJFUVVBTDoKKwkJCQkJcmVuZGVyZXItPnNldEFscGhhQ29tcGFyZShzdzo6QUxQSEFfR1JFQVRFUkVRVUFMKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RDTVBfQUxXQVlTOgorCQkJCQlyZW5kZXJlci0+c2V0QWxwaGFDb21wYXJlKHN3OjpBTFBIQV9BTFdBWVMpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfRElUSEVSRU5BQkxFOgorCQkJLy8JaWYoIWluaXQgJiYgdmFsdWUgPT0gMSkgVU5JTVBMRU1FTlRFRCgpOyAgIC8vIEZJWE1FOiBVbmltcGxlbWVudGVkCisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX0FMUEhBQkxFTkRFTkFCTEU6CisJCQkJcmVuZGVyZXItPnNldEFscGhhQmxlbmRFbmFibGUodmFsdWUgIT0gRkFMU0UpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19GT0dFTkFCTEU6CisJCQkJcmVuZGVyZXItPnNldEZvZ0VuYWJsZSh2YWx1ZSAhPSBGQUxTRSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1pWSVNJQkxFOgorCQkJCWJyZWFrOyAgIC8vIE5vdCBzdXBwb3J0ZWQKKwkJCWNhc2UgRDNEUlNfRk9HQ09MT1I6CisJCQkJcmVuZGVyZXItPnNldEZvZ0NvbG9yKHZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfRk9HVEFCTEVNT0RFOgorCQkJCXN3aXRjaCh2YWx1ZSkKKwkJCQl7CisJCQkJY2FzZSBEM0RGT0dfTk9ORToKKwkJCQkJcmVuZGVyZXItPnNldFBpeGVsRm9nTW9kZShzdzo6Rk9HX05PTkUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREZPR19MSU5FQVI6CisJCQkJCXJlbmRlcmVyLT5zZXRQaXhlbEZvZ01vZGUoc3c6OkZPR19MSU5FQVIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREZPR19FWFA6CisJCQkJCXJlbmRlcmVyLT5zZXRQaXhlbEZvZ01vZGUoc3c6OkZPR19FWFApOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREZPR19FWFAyOgorCQkJCQlyZW5kZXJlci0+c2V0UGl4ZWxGb2dNb2RlKHN3OjpGT0dfRVhQMik7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19GT0dTVEFSVDoKKwkJCQlyZW5kZXJlci0+c2V0Rm9nU3RhcnQoKGZsb2F0Jil2YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX0ZPR0VORDoKKwkJCQlyZW5kZXJlci0+c2V0Rm9nRW5kKChmbG9hdCYpdmFsdWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19GT0dERU5TSVRZOgorCQkJCXJlbmRlcmVyLT5zZXRGb2dEZW5zaXR5KChmbG9hdCYpdmFsdWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19FREdFQU5USUFMSUFTOgorCQkJCWlmKCFpbml0KSBpZih2YWx1ZSAhPSBGQUxTRSkgVU5JTVBMRU1FTlRFRCgpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19aQklBUzoKKwkJCQlyZW5kZXJlci0+c2V0RGVwdGhCaWFzKC0yLjBlLTZmICogdmFsdWUpOworCQkJCXJlbmRlcmVyLT5zZXRTbG9wZURlcHRoQmlhcygwLjBmKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfUkFOR0VGT0dFTkFCTEU6CisJCQkJcmVuZGVyZXItPnNldFJhbmdlRm9nRW5hYmxlKHZhbHVlICE9IEZBTFNFKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfU1BFQ1VMQVJFTkFCTEU6CisJCQkJcmVuZGVyZXItPnNldFNwZWN1bGFyRW5hYmxlKHZhbHVlICE9IEZBTFNFKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfU1RFTkNJTEVOQUJMRToKKwkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbEVuYWJsZSh2YWx1ZSAhPSBGQUxTRSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1NURU5DSUxGQUlMOgorCQkJCXN3aXRjaCh2YWx1ZSkKKwkJCQl7CisJCQkJY2FzZSBEM0RTVEVOQ0lMT1BfS0VFUDoKKwkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxGYWlsT3BlcmF0aW9uKHN3OjpPUEVSQVRJT05fS0VFUCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEU1RFTkNJTE9QX1pFUk86CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsRmFpbE9wZXJhdGlvbihzdzo6T1BFUkFUSU9OX1pFUk8pOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFNURU5DSUxPUF9SRVBMQUNFOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbEZhaWxPcGVyYXRpb24oc3c6Ok9QRVJBVElPTl9SRVBMQUNFKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RTVEVOQ0lMT1BfSU5DUlNBVDoKKwkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxGYWlsT3BlcmF0aW9uKHN3OjpPUEVSQVRJT05fSU5DUlNBVCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0RFQ1JTQVQ6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsRmFpbE9wZXJhdGlvbihzdzo6T1BFUkFUSU9OX0RFQ1JTQVQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFNURU5DSUxPUF9JTlZFUlQ6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsRmFpbE9wZXJhdGlvbihzdzo6T1BFUkFUSU9OX0lOVkVSVCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0lOQ1I6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsRmFpbE9wZXJhdGlvbihzdzo6T1BFUkFUSU9OX0lOQ1IpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFNURU5DSUxPUF9ERUNSOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbEZhaWxPcGVyYXRpb24oc3c6Ok9QRVJBVElPTl9ERUNSKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1NURU5DSUxaRkFJTDoKKwkJCQlzd2l0Y2godmFsdWUpCisJCQkJeworCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0tFRVA6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsWkZhaWxPcGVyYXRpb24oc3c6Ok9QRVJBVElPTl9LRUVQKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RTVEVOQ0lMT1BfWkVSTzoKKwkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxaRmFpbE9wZXJhdGlvbihzdzo6T1BFUkFUSU9OX1pFUk8pOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFNURU5DSUxPUF9SRVBMQUNFOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFpGYWlsT3BlcmF0aW9uKHN3OjpPUEVSQVRJT05fUkVQTEFDRSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0lOQ1JTQVQ6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsWkZhaWxPcGVyYXRpb24oc3c6Ok9QRVJBVElPTl9JTkNSU0FUKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RTVEVOQ0lMT1BfREVDUlNBVDoKKwkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxaRmFpbE9wZXJhdGlvbihzdzo6T1BFUkFUSU9OX0RFQ1JTQVQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFNURU5DSUxPUF9JTlZFUlQ6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsWkZhaWxPcGVyYXRpb24oc3c6Ok9QRVJBVElPTl9JTlZFUlQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFNURU5DSUxPUF9JTkNSOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFpGYWlsT3BlcmF0aW9uKHN3OjpPUEVSQVRJT05fSU5DUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0RFQ1I6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsWkZhaWxPcGVyYXRpb24oc3c6Ok9QRVJBVElPTl9ERUNSKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1NURU5DSUxQQVNTOgorCQkJCXN3aXRjaCh2YWx1ZSkKKwkJCQl7CisJCQkJY2FzZSBEM0RTVEVOQ0lMT1BfS0VFUDoKKwkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxQYXNzT3BlcmF0aW9uKHN3OjpPUEVSQVRJT05fS0VFUCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEU1RFTkNJTE9QX1pFUk86CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsUGFzc09wZXJhdGlvbihzdzo6T1BFUkFUSU9OX1pFUk8pOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFNURU5DSUxPUF9SRVBMQUNFOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFBhc3NPcGVyYXRpb24oc3c6Ok9QRVJBVElPTl9SRVBMQUNFKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RTVEVOQ0lMT1BfSU5DUlNBVDoKKwkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxQYXNzT3BlcmF0aW9uKHN3OjpPUEVSQVRJT05fSU5DUlNBVCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0RFQ1JTQVQ6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsUGFzc09wZXJhdGlvbihzdzo6T1BFUkFUSU9OX0RFQ1JTQVQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFNURU5DSUxPUF9JTlZFUlQ6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsUGFzc09wZXJhdGlvbihzdzo6T1BFUkFUSU9OX0lOVkVSVCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEU1RFTkNJTE9QX0lOQ1I6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsUGFzc09wZXJhdGlvbihzdzo6T1BFUkFUSU9OX0lOQ1IpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFNURU5DSUxPUF9ERUNSOgorCQkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFBhc3NPcGVyYXRpb24oc3c6Ok9QRVJBVElPTl9ERUNSKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1NURU5DSUxGVU5DOgorCQkJCXN3aXRjaCh2YWx1ZSkKKwkJCQl7CisJCQkJY2FzZSBEM0RDTVBfTkVWRVI6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsQ29tcGFyZShzdzo6U1RFTkNJTF9ORVZFUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQ01QX0xFU1M6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsQ29tcGFyZShzdzo6U1RFTkNJTF9MRVNTKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RDTVBfRVFVQUw6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsQ29tcGFyZShzdzo6U1RFTkNJTF9FUVVBTCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQ01QX0xFU1NFUVVBTDoKKwkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxDb21wYXJlKHN3OjpTVEVOQ0lMX0xFU1NFUVVBTCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQ01QX0dSRUFURVI6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsQ29tcGFyZShzdzo6U1RFTkNJTF9HUkVBVEVSKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RDTVBfTk9URVFVQUw6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsQ29tcGFyZShzdzo6U1RFTkNJTF9OT1RFUVVBTCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQ01QX0dSRUFURVJFUVVBTDoKKwkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxDb21wYXJlKHN3OjpTVEVOQ0lMX0dSRUFURVJFUVVBTCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEQ01QX0FMV0FZUzoKKwkJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxDb21wYXJlKHN3OjpTVEVOQ0lMX0FMV0FZUyk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19TVEVOQ0lMUkVGOgorCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsUmVmZXJlbmNlKHZhbHVlKTsKKwkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFJlZmVyZW5jZUNDVyh2YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1NURU5DSUxNQVNLOgorCQkJCXJlbmRlcmVyLT5zZXRTdGVuY2lsTWFzayh2YWx1ZSk7CisJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxNYXNrQ0NXKHZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfU1RFTkNJTFdSSVRFTUFTSzoKKwkJCQlyZW5kZXJlci0+c2V0U3RlbmNpbFdyaXRlTWFzayh2YWx1ZSk7CisJCQkJcmVuZGVyZXItPnNldFN0ZW5jaWxXcml0ZU1hc2tDQ1codmFsdWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19URVhUVVJFRkFDVE9SOgorCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlRmFjdG9yKHZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfV1JBUDA6CisJCQkJcmVuZGVyZXItPnNldFRleHR1cmVXcmFwKDAsIHZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfV1JBUDE6CisJCQkJcmVuZGVyZXItPnNldFRleHR1cmVXcmFwKDEsIHZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfV1JBUDI6CisJCQkJcmVuZGVyZXItPnNldFRleHR1cmVXcmFwKDIsIHZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfV1JBUDM6CisJCQkJcmVuZGVyZXItPnNldFRleHR1cmVXcmFwKDMsIHZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfV1JBUDQ6CisJCQkJcmVuZGVyZXItPnNldFRleHR1cmVXcmFwKDQsIHZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfV1JBUDU6CisJCQkJcmVuZGVyZXItPnNldFRleHR1cmVXcmFwKDUsIHZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfV1JBUDY6CisJCQkJcmVuZGVyZXItPnNldFRleHR1cmVXcmFwKDYsIHZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfV1JBUDc6CisJCQkJcmVuZGVyZXItPnNldFRleHR1cmVXcmFwKDcsIHZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfQ0xJUFBJTkc6CisJCQkJLy8gSWdub3JlZCwgY2xpcHBpbmcgaXMgYWx3YXlzIHBlcmZvcm1lZAorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19MSUdIVElORzoKKwkJCQlyZW5kZXJlci0+c2V0TGlnaHRpbmdFbmFibGUodmFsdWUgIT0gRkFMU0UpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19BTUJJRU5UOgorCQkJCXJlbmRlcmVyLT5zZXRHbG9iYWxBbWJpZW50KHZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfRk9HVkVSVEVYTU9ERToKKwkJCQlzd2l0Y2godmFsdWUpCisJCQkJeworCQkJCWNhc2UgRDNERk9HX05PTkU6CisJCQkJCXJlbmRlcmVyLT5zZXRWZXJ0ZXhGb2dNb2RlKHN3OjpGT0dfTk9ORSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNERk9HX0xJTkVBUjoKKwkJCQkJcmVuZGVyZXItPnNldFZlcnRleEZvZ01vZGUoc3c6OkZPR19MSU5FQVIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREZPR19FWFA6CisJCQkJCXJlbmRlcmVyLT5zZXRWZXJ0ZXhGb2dNb2RlKHN3OjpGT0dfRVhQKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RGT0dfRVhQMjoKKwkJCQkJcmVuZGVyZXItPnNldFZlcnRleEZvZ01vZGUoc3c6OkZPR19FWFAyKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX0NPTE9SVkVSVEVYOgorCQkJCXJlbmRlcmVyLT5zZXRDb2xvclZlcnRleEVuYWJsZSh2YWx1ZSAhPSBGQUxTRSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX0xPQ0FMVklFV0VSOgorCQkJCXJlbmRlcmVyLT5zZXRMb2NhbFZpZXdlcih2YWx1ZSAhPSBGQUxTRSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX05PUk1BTElaRU5PUk1BTFM6CisJCQkJcmVuZGVyZXItPnNldE5vcm1hbGl6ZU5vcm1hbHModmFsdWUgIT0gRkFMU0UpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19ESUZGVVNFTUFURVJJQUxTT1VSQ0U6CisJCQkJc3dpdGNoKHZhbHVlKQorCQkJCXsKKwkJCQljYXNlIEQzRE1DU19NQVRFUklBTDoKKwkJCQkJcmVuZGVyZXItPnNldERpZmZ1c2VNYXRlcmlhbFNvdXJjZShzdzo6TUFURVJJQUxfTUFURVJJQUwpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRE1DU19DT0xPUjE6CisJCQkJCXJlbmRlcmVyLT5zZXREaWZmdXNlTWF0ZXJpYWxTb3VyY2Uoc3c6Ok1BVEVSSUFMX0NPTE9SMSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNETUNTX0NPTE9SMjoKKwkJCQkJcmVuZGVyZXItPnNldERpZmZ1c2VNYXRlcmlhbFNvdXJjZShzdzo6TUFURVJJQUxfQ09MT1IyKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1NQRUNVTEFSTUFURVJJQUxTT1VSQ0U6CisJCQkJc3dpdGNoKHZhbHVlKQorCQkJCXsKKwkJCQljYXNlIEQzRE1DU19NQVRFUklBTDoKKwkJCQkJcmVuZGVyZXItPnNldFNwZWN1bGFyTWF0ZXJpYWxTb3VyY2Uoc3c6Ok1BVEVSSUFMX01BVEVSSUFMKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RNQ1NfQ09MT1IxOgorCQkJCQlyZW5kZXJlci0+c2V0U3BlY3VsYXJNYXRlcmlhbFNvdXJjZShzdzo6TUFURVJJQUxfQ09MT1IxKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RNQ1NfQ09MT1IyOgorCQkJCQlyZW5kZXJlci0+c2V0U3BlY3VsYXJNYXRlcmlhbFNvdXJjZShzdzo6TUFURVJJQUxfQ09MT1IyKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX0FNQklFTlRNQVRFUklBTFNPVVJDRToKKwkJCQlzd2l0Y2godmFsdWUpCisJCQkJeworCQkJCWNhc2UgRDNETUNTX01BVEVSSUFMOgorCQkJCQlyZW5kZXJlci0+c2V0QW1iaWVudE1hdGVyaWFsU291cmNlKHN3OjpNQVRFUklBTF9NQVRFUklBTCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNETUNTX0NPTE9SMToKKwkJCQkJcmVuZGVyZXItPnNldEFtYmllbnRNYXRlcmlhbFNvdXJjZShzdzo6TUFURVJJQUxfQ09MT1IxKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RNQ1NfQ09MT1IyOgorCQkJCQlyZW5kZXJlci0+c2V0QW1iaWVudE1hdGVyaWFsU291cmNlKHN3OjpNQVRFUklBTF9DT0xPUjIpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfRU1JU1NJVkVNQVRFUklBTFNPVVJDRToKKwkJCQlzd2l0Y2godmFsdWUpCisJCQkJeworCQkJCWNhc2UgRDNETUNTX01BVEVSSUFMOgorCQkJCQlyZW5kZXJlci0+c2V0RW1pc3NpdmVNYXRlcmlhbFNvdXJjZShzdzo6TUFURVJJQUxfTUFURVJJQUwpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRE1DU19DT0xPUjE6CisJCQkJCXJlbmRlcmVyLT5zZXRFbWlzc2l2ZU1hdGVyaWFsU291cmNlKHN3OjpNQVRFUklBTF9DT0xPUjEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRE1DU19DT0xPUjI6CisJCQkJCXJlbmRlcmVyLT5zZXRFbWlzc2l2ZU1hdGVyaWFsU291cmNlKHN3OjpNQVRFUklBTF9DT0xPUjIpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfVkVSVEVYQkxFTkQ6CisJCQkJc3dpdGNoKHZhbHVlKQorCQkJCXsKKwkJCQljYXNlIEQzRFZCRl9ESVNBQkxFOgorCQkJCQlyZW5kZXJlci0+c2V0VmVydGV4QmxlbmRNYXRyaXhDb3VudCgwKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RWQkZfMVdFSUdIVFM6CisJCQkJCXJlbmRlcmVyLT5zZXRWZXJ0ZXhCbGVuZE1hdHJpeENvdW50KDIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFZCRl8yV0VJR0hUUzoKKwkJCQkJcmVuZGVyZXItPnNldFZlcnRleEJsZW5kTWF0cml4Q291bnQoMyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVkJGXzNXRUlHSFRTOgorCQkJCQlyZW5kZXJlci0+c2V0VmVydGV4QmxlbmRNYXRyaXhDb3VudCg0KTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RWQkZfVFdFRU5JTkc6CisJCQkJCVVOSU1QTEVNRU5URUQoKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RWQkZfMFdFSUdIVFM6CisJCQkJCXJlbmRlcmVyLT5zZXRWZXJ0ZXhCbGVuZE1hdHJpeENvdW50KDEpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfQ0xJUFBMQU5FRU5BQkxFOgorCQkJCXJlbmRlcmVyLT5zZXRDbGlwRmxhZ3ModmFsdWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19TT0ZUV0FSRVZFUlRFWFBST0NFU1NJTkc6CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1BPSU5UU0laRToKKwkJCQlyZW5kZXJlci0+c2V0UG9pbnRTaXplKChmbG9hdCYpdmFsdWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19QT0lOVFNJWkVfTUlOOgorCQkJCXJlbmRlcmVyLT5zZXRQb2ludFNpemVNaW4oKGZsb2F0Jil2YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1BPSU5UU1BSSVRFRU5BQkxFOgorCQkJCXJlbmRlcmVyLT5zZXRQb2ludFNwcml0ZUVuYWJsZSh2YWx1ZSAhPSBGQUxTRSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1BPSU5UU0NBTEVFTkFCTEU6CisJCQkJcmVuZGVyZXItPnNldFBvaW50U2NhbGVFbmFibGUodmFsdWUgIT0gRkFMU0UpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19QT0lOVFNDQUxFX0E6CisJCQkJcmVuZGVyZXItPnNldFBvaW50U2NhbGVBKChmbG9hdCYpdmFsdWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19QT0lOVFNDQUxFX0I6CisJCQkJcmVuZGVyZXItPnNldFBvaW50U2NhbGVCKChmbG9hdCYpdmFsdWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19QT0lOVFNDQUxFX0M6CisJCQkJcmVuZGVyZXItPnNldFBvaW50U2NhbGVDKChmbG9hdCYpdmFsdWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19NVUxUSVNBTVBMRUFOVElBTElBUzoKKwkJCS8vCWlmKCFpbml0KSBVTklNUExFTUVOVEVEKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX01VTFRJU0FNUExFTUFTSzoKKwkJCQlTZXRSZW5kZXJUYXJnZXQocmVuZGVyVGFyZ2V0LCBkZXB0aFN0ZW5jaWwpOyAgIC8vIFNldHMgdGhlIG11bHRpLXNhbXBsZSBtYXNrLCBpZiBtYXNrYWJsZQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19QQVRDSEVER0VTVFlMRToKKwkJCS8vCWlmKCFpbml0KSBVTklNUExFTUVOVEVEKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX1BBVENIU0VHTUVOVFM6CisJCQkvLwlVTklNUExFTUVOVEVEKCk7ICAgLy8gRklYTUUKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfREVCVUdNT05JVE9SVE9LRU46CisJCQkJaWYoIWluaXQpIFVOSU1QTEVNRU5URUQoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfUE9JTlRTSVpFX01BWDoKKwkJCQlyZW5kZXJlci0+c2V0UG9pbnRTaXplTWF4KChmbG9hdCYpdmFsdWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19JTkRFWEVEVkVSVEVYQkxFTkRFTkFCTEU6CisJCQkJcmVuZGVyZXItPnNldEluZGV4ZWRWZXJ0ZXhCbGVuZEVuYWJsZSh2YWx1ZSAhPSBGQUxTRSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX0NPTE9SV1JJVEVFTkFCTEU6CisJCQkJcmVuZGVyZXItPnNldENvbG9yV3JpdGVNYXNrKDAsIHZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfVFdFRU5GQUNUT1I6CisJCQkJaWYoIWluaXQpIFVOSU1QTEVNRU5URUQoKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEUlNfQkxFTkRPUDoKKwkJCQlzd2l0Y2godmFsdWUpCisJCQkJeworCQkJCWNhc2UgRDNEQkxFTkRPUF9BREQ6CisJCQkJCXJlbmRlcmVyLT5zZXRCbGVuZE9wZXJhdGlvbihzdzo6QkxFTkRPUF9BREQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5ET1BfU1VCVFJBQ1Q6CisJCQkJCXJlbmRlcmVyLT5zZXRCbGVuZE9wZXJhdGlvbihzdzo6QkxFTkRPUF9TVUIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5ET1BfUkVWU1VCVFJBQ1Q6CisJCQkJCXJlbmRlcmVyLT5zZXRCbGVuZE9wZXJhdGlvbihzdzo6QkxFTkRPUF9JTlZTVUIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzREJMRU5ET1BfTUlOOgorCQkJCQlyZW5kZXJlci0+c2V0QmxlbmRPcGVyYXRpb24oc3c6OkJMRU5ET1BfTUlOKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RCTEVORE9QX01BWDoKKwkJCQkJcmVuZGVyZXItPnNldEJsZW5kT3BlcmF0aW9uKHN3OjpCTEVORE9QX01BWCk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RSU19QT1NJVElPTk9SREVSOgorCQkJCWlmKCFpbml0KSBVTklNUExFTUVOVEVEKCk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFJTX05PUk1BTE9SREVSOgorCQkJCWlmKCFpbml0KSBVTklNUExFTUVOVEVEKCk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCUFTU0VSVChmYWxzZSk7CisJCQl9CisJCX0KKwkJZWxzZSAgIC8vIHN0YXRlUmVjb3JkZXIKKwkJeworCQkJc3RhdGVSZWNvcmRlci5iYWNrKCktPnNldFJlbmRlclN0YXRlKHN0YXRlLCB2YWx1ZSk7CisJCX0KKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpTZXRSZW5kZXJUYXJnZXQoSURpcmVjdDNEU3VyZmFjZTggKm5ld1JlbmRlclRhcmdldCwgSURpcmVjdDNEU3VyZmFjZTggKm5ld0RlcHRoU3RlbmNpbCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlEaXJlY3QzRFN1cmZhY2U4ICpyZW5kZXJUYXJnZXQgPSBzdGF0aWNfY2FzdDxEaXJlY3QzRFN1cmZhY2U4Kj4obmV3UmVuZGVyVGFyZ2V0KTsKKworCQlpZihyZW5kZXJUYXJnZXQpICAgLy8gRklYTUU6IENoZWNrIGZvciBEM0RVU0FHRV9SRU5ERVJUQVJHRVQKKwkJeworCQkJcmVuZGVyVGFyZ2V0LT5iaW5kKCk7CisJCX0KKworCQlpZih0aGlzLT5yZW5kZXJUYXJnZXQpCisJCXsKKwkJCXRoaXMtPnJlbmRlclRhcmdldC0+dW5iaW5kKCk7CisJCX0KKworCQl0aGlzLT5yZW5kZXJUYXJnZXQgPSByZW5kZXJUYXJnZXQ7CisKKwkJRGlyZWN0M0RTdXJmYWNlOCAqZGVwdGhTdGVuY2lsID0gc3RhdGljX2Nhc3Q8RGlyZWN0M0RTdXJmYWNlOCo+KG5ld0RlcHRoU3RlbmNpbCk7CisKKwkJaWYoZGVwdGhTdGVuY2lsKSAgIC8vIEZJWE1FOiBDaGVjayBmb3IgRDNEVVNBR0VfREVQVEhTVEVOQ0lMIGFuZCBEM0RQT09MX0RFRkFVTFQKKwkJeworCQkJZGVwdGhTdGVuY2lsLT5iaW5kKCk7CisJCX0KKworCQlpZih0aGlzLT5kZXB0aFN0ZW5jaWwpCisJCXsKKwkJCXRoaXMtPmRlcHRoU3RlbmNpbC0+dW5iaW5kKCk7CisJCX0KKworCQl0aGlzLT5kZXB0aFN0ZW5jaWwgPSBkZXB0aFN0ZW5jaWw7CisKKwkJLy8gUmVzZXQgdmlld3BvcnQgdG8gc2l6ZSBvZiBjdXJyZW50IHJlbmRlciB0YXJnZXQKKwkJRDNEU1VSRkFDRV9ERVNDIHJlbmRlclRhcmdldERlc2M7CisJCXJlbmRlclRhcmdldC0+R2V0RGVzYygmcmVuZGVyVGFyZ2V0RGVzYyk7CisKKwkJRDNEVklFV1BPUlQ4IHZpZXdwb3J0OworCQl2aWV3cG9ydC5YID0gMDsKKwkJdmlld3BvcnQuWSA9IDA7CisJCXZpZXdwb3J0LldpZHRoID0gcmVuZGVyVGFyZ2V0RGVzYy5XaWR0aDsKKwkJdmlld3BvcnQuSGVpZ2h0ID0gcmVuZGVyVGFyZ2V0RGVzYy5IZWlnaHQ7CisJCXZpZXdwb3J0Lk1pblogPSAwOworCQl2aWV3cG9ydC5NYXhaID0gMTsKKworCQlTZXRWaWV3cG9ydCgmdmlld3BvcnQpOworCisJCS8vIFNldCB0aGUgbXVsdGktc2FtcGxlIG1hc2ssIGlmIG1hc2thYmxlCisJCWlmKHJlbmRlclRhcmdldERlc2MuTXVsdGlTYW1wbGVUeXBlICE9IEQzRE1VTFRJU0FNUExFX05PTkUpCisJCXsKKwkJCXJlbmRlcmVyLT5zZXRNdWx0aVNhbXBsZU1hc2socmVuZGVyU3RhdGVbRDNEUlNfTVVMVElTQU1QTEVNQVNLXSk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlyZW5kZXJlci0+c2V0TXVsdGlTYW1wbGVNYXNrKDB4RkZGRkZGRkYpOworCQl9CisKKwkJcmVuZGVyZXItPnNldFJlbmRlclRhcmdldCgwLCByZW5kZXJUYXJnZXQpOworCQlyZW5kZXJlci0+c2V0RGVwdGhCdWZmZXIoZGVwdGhTdGVuY2lsKTsKKwkJcmVuZGVyZXItPnNldFN0ZW5jaWxCdWZmZXIoZGVwdGhTdGVuY2lsKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpTZXRTdHJlYW1Tb3VyY2UodW5zaWduZWQgaW50IHN0cmVhbSwgSURpcmVjdDNEVmVydGV4QnVmZmVyOCAqaVZlcnRleEJ1ZmZlciwgdW5zaWduZWQgaW50IHN0cmlkZSkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlEaXJlY3QzRFZlcnRleEJ1ZmZlcjggKnZlcnRleEJ1ZmZlciA9IHN0YXRpY19jYXN0PERpcmVjdDNEVmVydGV4QnVmZmVyOCo+KGlWZXJ0ZXhCdWZmZXIpOworCisJCWlmKCFyZWNvcmRTdGF0ZSkKKwkJeworCQkJaWYodmVydGV4QnVmZmVyKQorCQkJeworCQkJCXZlcnRleEJ1ZmZlci0+YmluZCgpOworCQkJfQorCisJCQlpZihkYXRhU3RyZWFtW3N0cmVhbV0pCisJCQl7CisJCQkJZGF0YVN0cmVhbVtzdHJlYW1dLT51bmJpbmQoKTsKKwkJCQlzdHJlYW1TdHJpZGVbc3RyZWFtXSA9IDA7CisJCQl9CisKKwkJCWRhdGFTdHJlYW1bc3RyZWFtXSA9IHZlcnRleEJ1ZmZlcjsKKwkJCXN0cmVhbVN0cmlkZVtzdHJlYW1dID0gc3RyaWRlOworCQl9CisJCWVsc2UKKwkJeworCQkJc3RhdGVSZWNvcmRlci5iYWNrKCktPnNldFN0cmVhbVNvdXJjZShzdHJlYW0sIHZlcnRleEJ1ZmZlciwgc3RyaWRlKTsKKwkJfQorCQorCQlyZXR1cm4gRDNEX09LOworCX0KKwkKKwlsb25nIERpcmVjdDNERGV2aWNlODo6U2V0VGV4dHVyZSh1bnNpZ25lZCBsb25nIHN0YWdlLCBJRGlyZWN0M0RCYXNlVGV4dHVyZTggKmlCYXNlVGV4dHVyZSkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZihzdGFnZSA+PSA4KQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCURpcmVjdDNEQmFzZVRleHR1cmU4ICpiYXNlVGV4dHVyZSA9IGR5bmFtaWNfY2FzdDxEaXJlY3QzREJhc2VUZXh0dXJlOCo+KGlCYXNlVGV4dHVyZSk7CisKKwkJaWYoIXJlY29yZFN0YXRlKQorCQl7CisJCQlpZih0ZXh0dXJlW3N0YWdlXSA9PSBiYXNlVGV4dHVyZSkKKwkJCXsKKwkJCQlyZXR1cm4gRDNEX09LOworCQkJfQorCisJCQlpZihiYXNlVGV4dHVyZSkKKwkJCXsKKwkJCQliYXNlVGV4dHVyZS0+YmluZCgpOworCQkJfQorCisJCQlpZih0ZXh0dXJlW3N0YWdlXSkKKwkJCXsKKwkJCQl0ZXh0dXJlW3N0YWdlXS0+dW5iaW5kKCk7CisJCQl9CisKKwkJCXRleHR1cmVbc3RhZ2VdID0gYmFzZVRleHR1cmU7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdGF0ZVJlY29yZGVyLmJhY2soKS0+c2V0VGV4dHVyZShzdGFnZSwgYmFzZVRleHR1cmUpOworCQl9CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlODo6U2V0VGV4dHVyZVN0YWdlU3RhdGUodW5zaWduZWQgbG9uZyBzdGFnZSwgRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFIHR5cGUsIHVuc2lnbmVkIGxvbmcgdmFsdWUpCisJeworCQlUUkFDRSgidW5zaWduZWQgbG9uZyBzdGFnZSA9ICVkLCBEM0RURVhUVVJFU1RBR0VTVEFURVRZUEUgdHlwZSA9ICVkLCB1bnNpZ25lZCBsb25nIHZhbHVlID0gJWQiLCBzdGFnZSwgdHlwZSwgdmFsdWUpOworCisJCWlmKHN0YWdlID49IDggfHwgdHlwZSA8IDAgfHwgdHlwZSA+IEQzRFRTU19SRVNVTFRBUkcpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJaWYoIXJlY29yZFN0YXRlKQorCQl7CisJCQlpZighaW5pdCAmJiB0ZXh0dXJlU3RhZ2VTdGF0ZVtzdGFnZV1bdHlwZV0gPT0gdmFsdWUpCisJCQl7CisJCQkJcmV0dXJuIEQzRF9PSzsKKwkJCX0KKworCQkJdGV4dHVyZVN0YWdlU3RhdGVbc3RhZ2VdW3R5cGVdID0gdmFsdWU7CisKKwkJCXN3aXRjaCh0eXBlKQorCQkJeworCQkJY2FzZSBEM0RUU1NfQ09MT1JPUDoKKwkJCQlzd2l0Y2godmFsdWUpCisJCQkJeworCQkJCWNhc2UgRDNEVE9QX0RJU0FCTEU6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfRElTQUJMRSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX1NFTEVDVEFSRzE6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfU0VMRUNUQVJHMSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX1NFTEVDVEFSRzI6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfU0VMRUNUQVJHMik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb24oc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX01PRFVMQVRFKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfTU9EVUxBVEUyWDoKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURTJYKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfTU9EVUxBVEU0WDoKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURTRYKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfQUREOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb24oc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0FERCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX0FERFNJR05FRDoKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9BRERTSUdORUQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRPUF9BRERTSUdORUQyWDoKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9BRERTSUdORUQyWCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX1NVQlRSQUNUOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb24oc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX1NVQlRSQUNUKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfQUREU01PT1RIOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb24oc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0FERFNNT09USCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX0JMRU5ERElGRlVTRUFMUEhBOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb24oc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0JMRU5ERElGRlVTRUFMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfQkxFTkRURVhUVVJFQUxQSEE6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfQkxFTkRURVhUVVJFQUxQSEEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRPUF9CTEVOREZBQ1RPUkFMUEhBOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb24oc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0JMRU5ERkFDVE9SQUxQSEEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRPUF9CTEVORFRFWFRVUkVBTFBIQVBNOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb24oc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0JMRU5EVEVYVFVSRUFMUEhBUE0pOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRPUF9CTEVORENVUlJFTlRBTFBIQToKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9CTEVORENVUlJFTlRBTFBIQSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX1BSRU1PRFVMQVRFOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb24oc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX1BSRU1PRFVMQVRFKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfTU9EVUxBVEVBTFBIQV9BRERDT0xPUjoKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURUFMUEhBX0FERENPTE9SKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfTU9EVUxBVEVDT0xPUl9BRERBTFBIQToKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURUNPTE9SX0FEREFMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfTU9EVUxBVEVJTlZBTFBIQV9BRERDT0xPUjoKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURUlOVkFMUEhBX0FERENPTE9SKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfTU9EVUxBVEVJTlZDT0xPUl9BRERBTFBIQToKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURUlOVkNPTE9SX0FEREFMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfQlVNUEVOVk1BUDoKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9CVU1QRU5WTUFQKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfQlVNUEVOVk1BUExVTUlOQU5DRToKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9CVU1QRU5WTUFQTFVNSU5BTkNFKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfRE9UUFJPRFVDVDM6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfRE9UMyk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX01VTFRJUExZQUREOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb24oc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX01VTFRJUExZQUREKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfTEVSUDoKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9MRVJQKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFRTU19DT0xPUkFSRzE6CisJCQkJc3dpdGNoKHZhbHVlICYgRDNEVEFfU0VMRUNUTUFTSykKKwkJCQl7CisJCQkJY2FzZSBEM0RUQV9ESUZGVVNFOgorCQkJCQlyZW5kZXJlci0+c2V0Rmlyc3RBcmd1bWVudChzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX0RJRkZVU0UpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX0NVUlJFTlQ6CisJCQkJCXJlbmRlcmVyLT5zZXRGaXJzdEFyZ3VtZW50KHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfQ1VSUkVOVCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfVEVYVFVSRToKKwkJCQkJcmVuZGVyZXItPnNldEZpcnN0QXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URVhUVVJFKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9URkFDVE9SOgorCQkJCQlyZW5kZXJlci0+c2V0Rmlyc3RBcmd1bWVudChzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1RGQUNUT1IpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX1NQRUNVTEFSOgorCQkJCQlyZW5kZXJlci0+c2V0Rmlyc3RBcmd1bWVudChzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1NQRUNVTEFSKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9URU1QOgorCQkJCQlyZW5kZXJlci0+c2V0Rmlyc3RBcmd1bWVudChzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1RFTVApOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCX0KKworCQkJCXN3aXRjaCh2YWx1ZSAmIH5EM0RUQV9TRUxFQ1RNQVNLKQorCQkJCXsKKwkJCQljYXNlIDA6CisJCQkJCXJlbmRlcmVyLT5zZXRGaXJzdE1vZGlmaWVyKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9DT0xPUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfQ09NUExFTUVOVDoKKwkJCQkJcmVuZGVyZXItPnNldEZpcnN0TW9kaWZpZXIoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0lOVkNPTE9SKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9BTFBIQVJFUExJQ0FURToKKwkJCQkJcmVuZGVyZXItPnNldEZpcnN0TW9kaWZpZXIoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0FMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9DT01QTEVNRU5UIHwgRDNEVEFfQUxQSEFSRVBMSUNBVEU6CisJCQkJCXJlbmRlcmVyLT5zZXRGaXJzdE1vZGlmaWVyKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9JTlZBTFBIQSk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RUU1NfQ09MT1JBUkcyOgorCQkJCXN3aXRjaCh2YWx1ZSAmIEQzRFRBX1NFTEVDVE1BU0spCisJCQkJeworCQkJCWNhc2UgRDNEVEFfRElGRlVTRToKKwkJCQkJcmVuZGVyZXItPnNldFNlY29uZEFyZ3VtZW50KHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfRElGRlVTRSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfQ1VSUkVOVDoKKwkJCQkJcmVuZGVyZXItPnNldFNlY29uZEFyZ3VtZW50KHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfQ1VSUkVOVCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfVEVYVFVSRToKKwkJCQkJcmVuZGVyZXItPnNldFNlY29uZEFyZ3VtZW50KHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfVEVYVFVSRSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfVEZBQ1RPUjoKKwkJCQkJcmVuZGVyZXItPnNldFNlY29uZEFyZ3VtZW50KHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfVEZBQ1RPUik7CQkJCQkJCisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfU1BFQ1VMQVI6CisJCQkJCXJlbmRlcmVyLT5zZXRTZWNvbmRBcmd1bWVudChzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1NQRUNVTEFSKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9URU1QOgorCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kQXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URU1QKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisKKwkJCQlzd2l0Y2godmFsdWUgJiB+RDNEVEFfU0VMRUNUTUFTSykKKwkJCQl7CisJCQkJY2FzZSAwOgorCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kTW9kaWZpZXIoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0NPTE9SKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9DT01QTEVNRU5UOgorCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kTW9kaWZpZXIoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0lOVkNPTE9SKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9BTFBIQVJFUExJQ0FURToKKwkJCQkJcmVuZGVyZXItPnNldFNlY29uZE1vZGlmaWVyKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9BTFBIQSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfQ09NUExFTUVOVCB8IEQzRFRBX0FMUEhBUkVQTElDQVRFOgorCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kTW9kaWZpZXIoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0lOVkFMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFRTU19BTFBIQU9QOgorCQkJCXN3aXRjaCh2YWx1ZSkKKwkJCQl7CisJCQkJY2FzZSBEM0RUT1BfRElTQUJMRToKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0RJU0FCTEUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRPUF9TRUxFQ1RBUkcxOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfU0VMRUNUQVJHMSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX1NFTEVDVEFSRzI6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9TRUxFQ1RBUkcyKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfTU9EVUxBVEU6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFMlg6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURTJYKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfTU9EVUxBVEU0WDoKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX01PRFVMQVRFNFgpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRPUF9BREQ6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9BREQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRPUF9BRERTSUdORUQ6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9BRERTSUdORUQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRPUF9BRERTSUdORUQyWDoKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0FERFNJR05FRDJYKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfU1VCVFJBQ1Q6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9TVUJUUkFDVCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX0FERFNNT09USDoKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0FERFNNT09USCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX0JMRU5ERElGRlVTRUFMUEhBOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfQkxFTkRESUZGVVNFQUxQSEEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRPUF9CTEVORFRFWFRVUkVBTFBIQToKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0JMRU5EVEVYVFVSRUFMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfQkxFTkRGQUNUT1JBTFBIQToKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX0JMRU5ERkFDVE9SQUxQSEEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRPUF9CTEVORFRFWFRVUkVBTFBIQVBNOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfQkxFTkRURVhUVVJFQUxQSEFQTSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX0JMRU5EQ1VSUkVOVEFMUEhBOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfQkxFTkRDVVJSRU5UQUxQSEEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRPUF9QUkVNT0RVTEFURToKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX1BSRU1PRFVMQVRFKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfTU9EVUxBVEVBTFBIQV9BRERDT0xPUjoKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX01PRFVMQVRFQUxQSEFfQUREQ09MT1IpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRPUF9NT0RVTEFURUNPTE9SX0FEREFMUEhBOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfTU9EVUxBVEVDT0xPUl9BRERBTFBIQSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX01PRFVMQVRFSU5WQUxQSEFfQUREQ09MT1I6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9NT0RVTEFURUlOVkFMUEhBX0FERENPTE9SKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfTU9EVUxBVEVJTlZDT0xPUl9BRERBTFBIQToKKwkJCQkJcmVuZGVyZXItPnNldFN0YWdlT3BlcmF0aW9uQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNUQUdFX01PRFVMQVRFSU5WQ09MT1JfQUREQUxQSEEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRPUF9CVU1QRU5WTUFQOgorCQkJCQlyZW5kZXJlci0+c2V0U3RhZ2VPcGVyYXRpb25BbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U1RBR0VfQlVNUEVOVk1BUCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX0JVTVBFTlZNQVBMVU1JTkFOQ0U6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9CVU1QRU5WTUFQTFVNSU5BTkNFKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfRE9UUFJPRFVDVDM6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9ET1QzKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUT1BfTVVMVElQTFlBREQ6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9NVUxUSVBMWUFERCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVE9QX0xFUlA6CisJCQkJCXJlbmRlcmVyLT5zZXRTdGFnZU9wZXJhdGlvbkFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTVEFHRV9MRVJQKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFRTU19BTFBIQUFSRzE6CisJCQkJc3dpdGNoKHZhbHVlICYgRDNEVEFfU0VMRUNUTUFTSykKKwkJCQl7CisJCQkJY2FzZSBEM0RUQV9ESUZGVVNFOgorCQkJCQlyZW5kZXJlci0+c2V0Rmlyc3RBcmd1bWVudEFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfRElGRlVTRSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfQ1VSUkVOVDoKKwkJCQkJcmVuZGVyZXItPnNldEZpcnN0QXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX0NVUlJFTlQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX1RFWFRVUkU6CisJCQkJCXJlbmRlcmVyLT5zZXRGaXJzdEFyZ3VtZW50QWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URVhUVVJFKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9URkFDVE9SOgorCQkJCQlyZW5kZXJlci0+c2V0Rmlyc3RBcmd1bWVudEFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfVEZBQ1RPUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfU1BFQ1VMQVI6CisJCQkJCXJlbmRlcmVyLT5zZXRGaXJzdEFyZ3VtZW50QWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9TUEVDVUxBUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfVEVNUDoKKwkJCQkJcmVuZGVyZXItPnNldEZpcnN0QXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1RFTVApOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCX0KKworCQkJCXN3aXRjaCh2YWx1ZSAmIH5EM0RUQV9TRUxFQ1RNQVNLKQorCQkJCXsKKwkJCQljYXNlIDA6CisJCQkJCXJlbmRlcmVyLT5zZXRGaXJzdE1vZGlmaWVyQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0NPTE9SKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9DT01QTEVNRU5UOgorCQkJCQlyZW5kZXJlci0+c2V0Rmlyc3RNb2RpZmllckFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9JTlZDT0xPUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfQUxQSEFSRVBMSUNBVEU6CisJCQkJCXJlbmRlcmVyLT5zZXRGaXJzdE1vZGlmaWVyQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0FMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9DT01QTEVNRU5UIHwgRDNEVEFfQUxQSEFSRVBMSUNBVEU6CisJCQkJCXJlbmRlcmVyLT5zZXRTZWNvbmRNb2RpZmllcihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6TU9ESUZJRVJfSU5WQUxQSEEpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEVFNTX0FMUEhBQVJHMjoKKwkJCQlzd2l0Y2godmFsdWUgJiBEM0RUQV9TRUxFQ1RNQVNLKQorCQkJCXsKKwkJCQljYXNlIEQzRFRBX0RJRkZVU0U6CisJCQkJCXJlbmRlcmVyLT5zZXRTZWNvbmRBcmd1bWVudEFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfRElGRlVTRSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfQ1VSUkVOVDoKKwkJCQkJcmVuZGVyZXItPnNldFNlY29uZEFyZ3VtZW50QWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9DVVJSRU5UKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9URVhUVVJFOgorCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kQXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1RFWFRVUkUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX1RGQUNUT1I6CisJCQkJCXJlbmRlcmVyLT5zZXRTZWNvbmRBcmd1bWVudEFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfVEZBQ1RPUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfU1BFQ1VMQVI6CisJCQkJCXJlbmRlcmVyLT5zZXRTZWNvbmRBcmd1bWVudEFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfU1BFQ1VMQVIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX1RFTVA6CisJCQkJCXJlbmRlcmVyLT5zZXRTZWNvbmRBcmd1bWVudEFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfVEVNUCk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCisJCQkJc3dpdGNoKHZhbHVlICYgfkQzRFRBX1NFTEVDVE1BU0spCisJCQkJeworCQkJCWNhc2UgMDoKKwkJCQkJcmVuZGVyZXItPnNldFNlY29uZE1vZGlmaWVyQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0NPTE9SKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9DT01QTEVNRU5UOgorCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kTW9kaWZpZXJBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6TU9ESUZJRVJfSU5WQ09MT1IpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX0FMUEhBUkVQTElDQVRFOgorCQkJCQlyZW5kZXJlci0+c2V0U2Vjb25kTW9kaWZpZXJBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6TU9ESUZJRVJfQUxQSEEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX0NPTVBMRU1FTlQgfCBEM0RUQV9BTFBIQVJFUExJQ0FURToKKwkJCQkJcmVuZGVyZXItPnNldFNlY29uZE1vZGlmaWVyQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0lOVkFMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFRTU19CVU1QRU5WTUFUMDA6CisJCQkJcmVuZGVyZXItPnNldEJ1bXBtYXBNYXRyaXgoc3RhZ2UsIDAsIChmbG9hdCYpdmFsdWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RUU1NfQlVNUEVOVk1BVDAxOgorCQkJCXJlbmRlcmVyLT5zZXRCdW1wbWFwTWF0cml4KHN0YWdlLCAxLCAoZmxvYXQmKXZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEVFNTX0JVTVBFTlZNQVQxMDoKKwkJCQlyZW5kZXJlci0+c2V0QnVtcG1hcE1hdHJpeChzdGFnZSwgMiwgKGZsb2F0Jil2YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFRTU19CVU1QRU5WTUFUMTE6CisJCQkJcmVuZGVyZXItPnNldEJ1bXBtYXBNYXRyaXgoc3RhZ2UsIDMsIChmbG9hdCYpdmFsdWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RUU1NfVEVYQ09PUkRJTkRFWDoKKwkJCQlyZW5kZXJlci0+c2V0VGV4Q29vcmRJbmRleChzdGFnZSwgdmFsdWUgJiAweEZGRkYpOworCisJCQkJc3dpdGNoKHZhbHVlICYgMHhGRkZGMDAwMCkKKwkJCQl7CisJCQkJY2FzZSBEM0RUU1NfVENJX1BBU1NUSFJVOgorCQkJCQlyZW5kZXJlci0+c2V0VGV4R2VuKHN0YWdlLCBzdzo6VEVYR0VOX1BBU1NUSFJVKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUU1NfVENJX0NBTUVSQVNQQUNFTk9STUFMOgorCQkJCQlyZW5kZXJlci0+c2V0VGV4Q29vcmRJbmRleChzdGFnZSwgc3RhZ2UpOworCQkJCQlyZW5kZXJlci0+c2V0VGV4R2VuKHN0YWdlLCBzdzo6VEVYR0VOX05PUk1BTCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVFNTX1RDSV9DQU1FUkFTUEFDRVBPU0lUSU9OOgorCQkJCQlyZW5kZXJlci0+c2V0VGV4Q29vcmRJbmRleChzdGFnZSwgc3RhZ2UpOworCQkJCQlyZW5kZXJlci0+c2V0VGV4R2VuKHN0YWdlLCBzdzo6VEVYR0VOX1BPU0lUSU9OKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUU1NfVENJX0NBTUVSQVNQQUNFUkVGTEVDVElPTlZFQ1RPUjoKKwkJCQkJcmVuZGVyZXItPnNldFRleENvb3JkSW5kZXgoc3RhZ2UsIHN0YWdlKTsKKwkJCQkJcmVuZGVyZXItPnNldFRleEdlbihzdGFnZSwgc3c6OlRFWEdFTl9SRUZMRUNUSU9OKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFRTU19BRERSRVNTVToKKwkJCQlzd2l0Y2godmFsdWUpCisJCQkJeworCQkJCWNhc2UgRDNEVEFERFJFU1NfV1JBUDoKKwkJCQkJcmVuZGVyZXItPnNldEFkZHJlc3NpbmdNb2RlVShzdzo6U0FNUExFUl9QSVhFTCwgc3RhZ2UsIHN3OjpBRERSRVNTSU5HX1dSQVApOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBRERSRVNTX01JUlJPUjoKKwkJCQkJcmVuZGVyZXItPnNldEFkZHJlc3NpbmdNb2RlVShzdzo6U0FNUExFUl9QSVhFTCwgc3RhZ2UsIHN3OjpBRERSRVNTSU5HX01JUlJPUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFERFJFU1NfQ0xBTVA6CisJCQkJCXJlbmRlcmVyLT5zZXRBZGRyZXNzaW5nTW9kZVUoc3c6OlNBTVBMRVJfUElYRUwsIHN0YWdlLCBzdzo6QUREUkVTU0lOR19DTEFNUCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFERFJFU1NfQk9SREVSOgorCQkJCQlyZW5kZXJlci0+c2V0QWRkcmVzc2luZ01vZGVVKHN3OjpTQU1QTEVSX1BJWEVMLCBzdGFnZSwgc3c6OkFERFJFU1NJTkdfQk9SREVSKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQUREUkVTU19NSVJST1JPTkNFOgorCQkJCQlyZW5kZXJlci0+c2V0QWRkcmVzc2luZ01vZGVVKHN3OjpTQU1QTEVSX1BJWEVMLCBzdGFnZSwgc3c6OkFERFJFU1NJTkdfTUlSUk9ST05DRSk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RUU1NfQUREUkVTU1Y6CisJCQkJc3dpdGNoKHZhbHVlKQorCQkJCXsKKwkJCQljYXNlIEQzRFRBRERSRVNTX1dSQVA6CisJCQkJCXJlbmRlcmVyLT5zZXRBZGRyZXNzaW5nTW9kZVYoc3c6OlNBTVBMRVJfUElYRUwsIHN0YWdlLCBzdzo6QUREUkVTU0lOR19XUkFQKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQUREUkVTU19NSVJST1I6CisJCQkJCXJlbmRlcmVyLT5zZXRBZGRyZXNzaW5nTW9kZVYoc3c6OlNBTVBMRVJfUElYRUwsIHN0YWdlLCBzdzo6QUREUkVTU0lOR19NSVJST1IpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBRERSRVNTX0NMQU1QOgorCQkJCQlyZW5kZXJlci0+c2V0QWRkcmVzc2luZ01vZGVWKHN3OjpTQU1QTEVSX1BJWEVMLCBzdGFnZSwgc3c6OkFERFJFU1NJTkdfQ0xBTVApOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBRERSRVNTX0JPUkRFUjoKKwkJCQkJcmVuZGVyZXItPnNldEFkZHJlc3NpbmdNb2RlVihzdzo6U0FNUExFUl9QSVhFTCwgc3RhZ2UsIHN3OjpBRERSRVNTSU5HX0JPUkRFUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFERFJFU1NfTUlSUk9ST05DRToKKwkJCQkJcmVuZGVyZXItPnNldEFkZHJlc3NpbmdNb2RlVihzdzo6U0FNUExFUl9QSVhFTCwgc3RhZ2UsIHN3OjpBRERSRVNTSU5HX01JUlJPUk9OQ0UpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEVFNTX0JPUkRFUkNPTE9SOgorCQkJCXJlbmRlcmVyLT5zZXRCb3JkZXJDb2xvcihzdzo6U0FNUExFUl9QSVhFTCwgc3RhZ2UsIHZhbHVlKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEVFNTX01BR0ZJTFRFUjoKKwkJCQkvLyBOT1RFOiBTd2lmdFNoYWRlciBkb2VzIG5vdCBkaWZmZXJlbnRpYXRlIGJldHdlZW4gbWluaWZpY2F0aW9uIGFuZCBtYWduaWZpY2F0aW9uIGZpbHRlcgorCQkJCXN3aXRjaCh2YWx1ZSkKKwkJCQl7CisJCQkJY2FzZSBEM0RURVhGX05PTkU6CisJCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlRmlsdGVyKHN3OjpTQU1QTEVSX1BJWEVMLCBzdGFnZSwgc3c6OkZJTFRFUl9QT0lOVCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEVYRl9QT0lOVDoKKwkJCQkJcmVuZGVyZXItPnNldFRleHR1cmVGaWx0ZXIoc3c6OlNBTVBMRVJfUElYRUwsIHN0YWdlLCBzdzo6RklMVEVSX1BPSU5UKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RURVhGX0xJTkVBUjoKKwkJCQkJcmVuZGVyZXItPnNldFRleHR1cmVGaWx0ZXIoc3c6OlNBTVBMRVJfUElYRUwsIHN0YWdlLCBzdzo6RklMVEVSX0xJTkVBUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEVYRl9BTklTT1RST1BJQzoKKwkJCQkJcmVuZGVyZXItPnNldFRleHR1cmVGaWx0ZXIoc3c6OlNBTVBMRVJfUElYRUwsIHN0YWdlLCBzdzo6RklMVEVSX0FOSVNPVFJPUElDKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RURVhGX0ZMQVRDVUJJQzoKKwkJCQkJcmVuZGVyZXItPnNldFRleHR1cmVGaWx0ZXIoc3c6OlNBTVBMRVJfUElYRUwsIHN0YWdlLCBzdzo6RklMVEVSX0xJTkVBUik7ICAgLy8gTk9URTogVW5pbXBsZW1lbnRlZCwgZmFpbCBzaWxlbnRseQorCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRFWEZfR0FVU1NJQU5DVUJJQzoKKwkJCQkJcmVuZGVyZXItPnNldFRleHR1cmVGaWx0ZXIoc3c6OlNBTVBMRVJfUElYRUwsIHN0YWdlLCBzdzo6RklMVEVSX0xJTkVBUik7ICAgLy8gTk9URTogVW5pbXBsZW1lbnRlZCwgZmFpbCBzaWxlbnRseQorCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJCQl9OworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RUU1NfTUlORklMVEVSOgorCQkJCS8vIE5PVEU6IFN3aWZ0U2hhZGVyIGRvZXMgbm90IGRpZmZlcmVudGlhdGUgYmV0d2VlbiBtaW5pZmljYXRpb24gYW5kIG1hZ25pZmljYXRpb24gZmlsdGVyCisJCQkJc3dpdGNoKHZhbHVlKQorCQkJCXsKKwkJCQljYXNlIEQzRFRFWEZfTk9ORToKKwkJCQkJcmVuZGVyZXItPnNldFRleHR1cmVGaWx0ZXIoc3c6OlNBTVBMRVJfUElYRUwsIHN0YWdlLCBzdzo6RklMVEVSX1BPSU5UKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RURVhGX1BPSU5UOgorCQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZUZpbHRlcihzdzo6U0FNUExFUl9QSVhFTCwgc3RhZ2UsIHN3OjpGSUxURVJfUE9JTlQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRFWEZfTElORUFSOgorCQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZUZpbHRlcihzdzo6U0FNUExFUl9QSVhFTCwgc3RhZ2UsIHN3OjpGSUxURVJfTElORUFSKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RURVhGX0FOSVNPVFJPUElDOgorCQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZUZpbHRlcihzdzo6U0FNUExFUl9QSVhFTCwgc3RhZ2UsIHN3OjpGSUxURVJfQU5JU09UUk9QSUMpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRFWEZfRkxBVENVQklDOgorCQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZUZpbHRlcihzdzo6U0FNUExFUl9QSVhFTCwgc3RhZ2UsIHN3OjpGSUxURVJfTElORUFSKTsgICAvLyBOT1RFOiBVbmltcGxlbWVudGVkLCBmYWlsIHNpbGVudGx5CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEVYRl9HQVVTU0lBTkNVQklDOgorCQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZUZpbHRlcihzdzo6U0FNUExFUl9QSVhFTCwgc3RhZ2UsIHN3OjpGSUxURVJfTElORUFSKTsgICAvLyBOT1RFOiBVbmltcGxlbWVudGVkLCBmYWlsIHNpbGVudGx5CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQkJCX07CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFRTU19NSVBGSUxURVI6CisJCQkJc3dpdGNoKHZhbHVlKQorCQkJCXsKKwkJCQljYXNlIEQzRFRFWEZfTk9ORToKKwkJCQkJcmVuZGVyZXItPnNldE1pcG1hcEZpbHRlcihzdzo6U0FNUExFUl9QSVhFTCwgc3RhZ2UsIHN3OjpNSVBNQVBfTk9ORSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEVYRl9QT0lOVDoKKwkJCQkJcmVuZGVyZXItPnNldE1pcG1hcEZpbHRlcihzdzo6U0FNUExFUl9QSVhFTCwgc3RhZ2UsIHN3OjpNSVBNQVBfUE9JTlQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRFWEZfTElORUFSOgorCQkJCQlyZW5kZXJlci0+c2V0TWlwbWFwRmlsdGVyKHN3OjpTQU1QTEVSX1BJWEVMLCBzdGFnZSwgc3c6Ok1JUE1BUF9MSU5FQVIpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRFWEZfQU5JU09UUk9QSUM6CisJCQkJCXJlbmRlcmVyLT5zZXRNaXBtYXBGaWx0ZXIoc3c6OlNBTVBMRVJfUElYRUwsIHN0YWdlLCBzdzo6TUlQTUFQX0xJTkVBUik7ICAgLy8gTk9URTogVW5pbXBsZW1lbnRlZCwgZmFpbCBzaWxlbnRseQorCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRFWEZfRkxBVENVQklDOgorCQkJCQlyZW5kZXJlci0+c2V0TWlwbWFwRmlsdGVyKHN3OjpTQU1QTEVSX1BJWEVMLCBzdGFnZSwgc3c6Ok1JUE1BUF9MSU5FQVIpOyAgIC8vIE5PVEU6IFVuaW1wbGVtZW50ZWQsIGZhaWwgc2lsZW50bHkKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RURVhGX0dBVVNTSUFOQ1VCSUM6CisJCQkJCXJlbmRlcmVyLT5zZXRNaXBtYXBGaWx0ZXIoc3c6OlNBTVBMRVJfUElYRUwsIHN0YWdlLCBzdzo6TUlQTUFQX0xJTkVBUik7ICAgLy8gTk9URTogVW5pbXBsZW1lbnRlZCwgZmFpbCBzaWxlbnRseQorCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJCQl9OworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RUU1NfTUlQTUFQTE9EQklBUzoKKwkJCQl7CisJCQkJCWZsb2F0IExPRCA9IChmbG9hdCYpdmFsdWUgLSBzdzo6bG9nMigoZmxvYXQpY29udGV4dC0+cmVuZGVyVGFyZ2V0WzBdLT5nZXRTdXBlclNhbXBsZUNvdW50KCkpOyAgIC8vIEZJWE1FOiBVcGRhdGUgd2hlbiByZW5kZXIgdGFyZ2V0IGNoYW5nZXMKKwkJCQkJcmVuZGVyZXItPnNldE1pcG1hcExPRChzdzo6U0FNUExFUl9QSVhFTCwgc3RhZ2UsIExPRCk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RUU1NfTUFYTUlQTEVWRUw6CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFRTU19NQVhBTklTT1RST1BZOgorCQkJCXJlbmRlcmVyLT5zZXRNYXhBbmlzb3Ryb3B5KHN3OjpTQU1QTEVSX1BJWEVMLCBzdGFnZSwgc3c6OmNsYW1wKCh1bnNpZ25lZCBpbnQpdmFsdWUsICh1bnNpZ25lZCBpbnQpMSwgbWF4QW5pc290cm9weSkpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RUU1NfQlVNUEVOVkxTQ0FMRToKKwkJCQlyZW5kZXJlci0+c2V0THVtaW5hbmNlU2NhbGUoc3RhZ2UsIChmbG9hdCYpdmFsdWUpOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RUU1NfQlVNUEVOVkxPRkZTRVQ6CisJCQkJcmVuZGVyZXItPnNldEx1bWluYW5jZU9mZnNldChzdGFnZSwgKGZsb2F0Jil2YWx1ZSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFRTU19URVhUVVJFVFJBTlNGT1JNRkxBR1M6CisJCQkJc3dpdGNoKHZhbHVlICYgfkQzRFRURkZfUFJPSkVDVEVEKQorCQkJCXsKKwkJCQljYXNlIEQzRFRURkZfRElTQUJMRToKKwkJCQkJcmVuZGVyZXItPnNldFRleHR1cmVUcmFuc2Zvcm0oc3RhZ2UsIDAsICh2YWx1ZSAmICBEM0RUVEZGX1BST0pFQ1RFRCkgPT0gRDNEVFRGRl9QUk9KRUNURUQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRURkZfQ09VTlQxOgorCQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZVRyYW5zZm9ybShzdGFnZSwgMSwgKHZhbHVlICYgIEQzRFRURkZfUFJPSkVDVEVEKSA9PSBEM0RUVEZGX1BST0pFQ1RFRCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVFRGRl9DT1VOVDI6CisJCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlVHJhbnNmb3JtKHN0YWdlLCAyLCAodmFsdWUgJiAgRDNEVFRGRl9QUk9KRUNURUQpID09IEQzRFRURkZfUFJPSkVDVEVEKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUVEZGX0NPVU5UMzoKKwkJCQkJcmVuZGVyZXItPnNldFRleHR1cmVUcmFuc2Zvcm0oc3RhZ2UsIDMsICh2YWx1ZSAmICBEM0RUVEZGX1BST0pFQ1RFRCkgPT0gRDNEVFRGRl9QUk9KRUNURUQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRURkZfQ09VTlQ0OgorCQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZVRyYW5zZm9ybShzdGFnZSwgNCwgKHZhbHVlICYgIEQzRFRURkZfUFJPSkVDVEVEKSA9PSBEM0RUVEZGX1BST0pFQ1RFRCk7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCQkJCWJyZWFrOworCQkJY2FzZSBEM0RUU1NfQUREUkVTU1c6CisJCQkJc3dpdGNoKHZhbHVlKQorCQkJCXsKKwkJCQljYXNlIEQzRFRBRERSRVNTX1dSQVA6CisJCQkJCXJlbmRlcmVyLT5zZXRBZGRyZXNzaW5nTW9kZVcoc3c6OlNBTVBMRVJfUElYRUwsIHN0YWdlLCBzdzo6QUREUkVTU0lOR19XUkFQKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQUREUkVTU19NSVJST1I6CisJCQkJCXJlbmRlcmVyLT5zZXRBZGRyZXNzaW5nTW9kZVcoc3c6OlNBTVBMRVJfUElYRUwsIHN0YWdlLCBzdzo6QUREUkVTU0lOR19NSVJST1IpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBRERSRVNTX0NMQU1QOgorCQkJCQlyZW5kZXJlci0+c2V0QWRkcmVzc2luZ01vZGVXKHN3OjpTQU1QTEVSX1BJWEVMLCBzdGFnZSwgc3c6OkFERFJFU1NJTkdfQ0xBTVApOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBRERSRVNTX0JPUkRFUjoKKwkJCQkJcmVuZGVyZXItPnNldEFkZHJlc3NpbmdNb2RlVyhzdzo6U0FNUExFUl9QSVhFTCwgc3RhZ2UsIHN3OjpBRERSRVNTSU5HX0JPUkRFUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFERFJFU1NfTUlSUk9ST05DRToKKwkJCQkJcmVuZGVyZXItPnNldEFkZHJlc3NpbmdNb2RlVyhzdzo6U0FNUExFUl9QSVhFTCwgc3RhZ2UsIHN3OjpBRERSRVNTSU5HX01JUlJPUk9OQ0UpOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEVFNTX0NPTE9SQVJHMDoKKwkJCQlzd2l0Y2godmFsdWUgJiBEM0RUQV9TRUxFQ1RNQVNLKQorCQkJCXsKKwkJCQljYXNlIEQzRFRBX0NVUlJFTlQ6CisJCQkJCXJlbmRlcmVyLT5zZXRUaGlyZEFyZ3VtZW50KHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfQ1VSUkVOVCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfRElGRlVTRToKKwkJCQkJcmVuZGVyZXItPnNldFRoaXJkQXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9ESUZGVVNFKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9TUEVDVUxBUjoKKwkJCQkJcmVuZGVyZXItPnNldFRoaXJkQXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9TUEVDVUxBUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfVEVNUDoKKwkJCQkJcmVuZGVyZXItPnNldFRoaXJkQXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URU1QKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9URVhUVVJFOgorCQkJCQlyZW5kZXJlci0+c2V0VGhpcmRBcmd1bWVudChzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1RFWFRVUkUpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX1RGQUNUT1I6CisJCQkJCXJlbmRlcmVyLT5zZXRUaGlyZEFyZ3VtZW50KHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfVEZBQ1RPUik7CisJCQkJCWJyZWFrOworCQkJCWRlZmF1bHQ6CisJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJfQorCisJCQkJc3dpdGNoKHZhbHVlICYgfkQzRFRBX1NFTEVDVE1BU0spCisJCQkJeworCQkJCWNhc2UgMDoKKwkJCQkJcmVuZGVyZXItPnNldFRoaXJkTW9kaWZpZXIoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0NPTE9SKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9DT01QTEVNRU5UOgorCQkJCQlyZW5kZXJlci0+c2V0VGhpcmRNb2RpZmllcihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6TU9ESUZJRVJfSU5WQ09MT1IpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX0FMUEhBUkVQTElDQVRFOgorCQkJCQlyZW5kZXJlci0+c2V0VGhpcmRNb2RpZmllcihzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6TU9ESUZJRVJfQUxQSEEpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX0NPTVBMRU1FTlQgfCBEM0RUQV9BTFBIQVJFUExJQ0FURToKKwkJCQkJcmVuZGVyZXItPnNldFRoaXJkTW9kaWZpZXIoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0lOVkFMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFRTU19BTFBIQUFSRzA6CisJCQkJc3dpdGNoKHZhbHVlICYgRDNEVEFfU0VMRUNUTUFTSykKKwkJCQl7CisJCQkJY2FzZSBEM0RUQV9ESUZGVVNFOgorCQkJCQlyZW5kZXJlci0+c2V0VGhpcmRBcmd1bWVudEFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfRElGRlVTRSk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfQ1VSUkVOVDoKKwkJCQkJcmVuZGVyZXItPnNldFRoaXJkQXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX0NVUlJFTlQpOworCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFRBX1RFWFRVUkU6CisJCQkJCXJlbmRlcmVyLT5zZXRUaGlyZEFyZ3VtZW50QWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9URVhUVVJFKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9URkFDVE9SOgorCQkJCQlyZW5kZXJlci0+c2V0VGhpcmRBcmd1bWVudEFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpTT1VSQ0VfVEZBQ1RPUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfU1BFQ1VMQVI6CisJCQkJCXJlbmRlcmVyLT5zZXRUaGlyZEFyZ3VtZW50QWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OlNPVVJDRV9TUEVDVUxBUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfVEVNUDoKKwkJCQkJcmVuZGVyZXItPnNldFRoaXJkQXJndW1lbnRBbHBoYShzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6U09VUkNFX1RFTVApOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCX0KKworCQkJCXN3aXRjaCh2YWx1ZSAmIH5EM0RUQV9TRUxFQ1RNQVNLKQorCQkJCXsKKwkJCQljYXNlIDA6CisJCQkJCXJlbmRlcmVyLT5zZXRUaGlyZE1vZGlmaWVyQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0NPTE9SKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9DT01QTEVNRU5UOgorCQkJCQlyZW5kZXJlci0+c2V0VGhpcmRNb2RpZmllckFscGhhKHN0YWdlLCBzdzo6VGV4dHVyZVN0YWdlOjpNT0RJRklFUl9JTlZDT0xPUik7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfQUxQSEFSRVBMSUNBVEU6CisJCQkJCXJlbmRlcmVyLT5zZXRUaGlyZE1vZGlmaWVyQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0FMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RUQV9DT01QTEVNRU5UIHwgRDNEVEFfQUxQSEFSRVBMSUNBVEU6CisJCQkJCXJlbmRlcmVyLT5zZXRUaGlyZE1vZGlmaWVyQWxwaGEoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6Ok1PRElGSUVSX0lOVkFMUEhBKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFRTU19SRVNVTFRBUkc6CisJCQkJc3dpdGNoKHZhbHVlICYgRDNEVEFfU0VMRUNUTUFTSykKKwkJCQl7CisJCQkJY2FzZSBEM0RUQV9DVVJSRU5UOgorCQkJCQlyZW5kZXJlci0+c2V0RGVzdGluYXRpb25Bcmd1bWVudChzdGFnZSwgc3c6OlRleHR1cmVTdGFnZTo6REVTVElOQVRJT05fQ1VSUkVOVCk7CisJCQkJCWJyZWFrOworCQkJCWNhc2UgRDNEVEFfVEVNUDoKKwkJCQkJcmVuZGVyZXItPnNldERlc3RpbmF0aW9uQXJndW1lbnQoc3RhZ2UsIHN3OjpUZXh0dXJlU3RhZ2U6OkRFU1RJTkFUSU9OX1RFTVApOworCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCX0KKwkJCQlicmVhazsKKwkJCWRlZmF1bHQ6CisJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCX0KKwkJfQorCQllbHNlICAgLy8gc3RhdGVSZWNvcmRlcgorCQl7CisJCQlzdGF0ZVJlY29yZGVyLmJhY2soKS0+c2V0VGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIHR5cGUsIHZhbHVlKTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OlNldFRyYW5zZm9ybShEM0RUUkFOU0ZPUk1TVEFURVRZUEUgc3RhdGUsIGNvbnN0IEQzRE1BVFJJWCAqbWF0cml4KQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFtYXRyaXggfHwgc3RhdGUgPCAwIHx8IHN0YXRlID4gNTExKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWlmKCFyZWNvcmRTdGF0ZSkKKwkJeworCQkJdGhpcy0+bWF0cml4W3N0YXRlXSA9ICptYXRyaXg7CisKKwkJCXN3OjpNYXRyaXggTShtYXRyaXgtPl8xMSwgbWF0cml4LT5fMjEsIG1hdHJpeC0+XzMxLCBtYXRyaXgtPl80MSwKKwkJCSAgICAgICAgICAgICBtYXRyaXgtPl8xMiwgbWF0cml4LT5fMjIsIG1hdHJpeC0+XzMyLCBtYXRyaXgtPl80MiwKKwkJCSAgICAgICAgICAgICBtYXRyaXgtPl8xMywgbWF0cml4LT5fMjMsIG1hdHJpeC0+XzMzLCBtYXRyaXgtPl80MywKKwkJCSAgICAgICAgICAgICBtYXRyaXgtPl8xNCwgbWF0cml4LT5fMjQsIG1hdHJpeC0+XzM0LCBtYXRyaXgtPl80NCk7CisKKwkJCXN3aXRjaChzdGF0ZSkKKwkJCXsKKwkJCWNhc2UgRDNEVFNfV09STEQ6CisJCQkJcmVuZGVyZXItPnNldE1vZGVsTWF0cml4KE0pOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RUU19WSUVXOgorCQkJCXJlbmRlcmVyLT5zZXRWaWV3TWF0cml4KE0pOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RUU19QUk9KRUNUSU9OOgorCQkJCXJlbmRlcmVyLT5zZXRQcm9qZWN0aW9uTWF0cml4KE0pOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RUU19URVhUVVJFMDoKKwkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZU1hdHJpeCgwLCBNKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEVFNfVEVYVFVSRTE6CisJCQkJcmVuZGVyZXItPnNldFRleHR1cmVNYXRyaXgoMSwgTSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFRTX1RFWFRVUkUyOgorCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlTWF0cml4KDIsIE0pOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RUU19URVhUVVJFMzoKKwkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZU1hdHJpeCgzLCBNKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEVFNfVEVYVFVSRTQ6CisJCQkJcmVuZGVyZXItPnNldFRleHR1cmVNYXRyaXgoNCwgTSk7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzRFRTX1RFWFRVUkU1OgorCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlTWF0cml4KDUsIE0pOworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RUU19URVhUVVJFNjoKKwkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZU1hdHJpeCg2LCBNKTsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNEVFNfVEVYVFVSRTc6CisJCQkJcmVuZGVyZXItPnNldFRleHR1cmVNYXRyaXgoNywgTSk7CisJCQkJYnJlYWs7CisJCQlkZWZhdWx0OgorCQkJCWlmKHN0YXRlID4gMjU2ICYmIHN0YXRlIDwgNTEyKQorCQkJCXsKKwkJCQkJcmVuZGVyZXItPnNldE1vZGVsTWF0cml4KE0sIHN0YXRlIC0gMjU2KTsKKwkJCQl9CisJCQkJZWxzZSBBU1NFUlQoZmFsc2UpOworCQkJfQorCQl9CisJCWVsc2UgICAvLyBzdGF0ZVJlY29yZGVyCisJCXsKKwkJCXN0YXRlUmVjb3JkZXIuYmFjaygpLT5zZXRUcmFuc2Zvcm0oc3RhdGUsIG1hdHJpeCk7CisJCX0KKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpTZXRWZXJ0ZXhTaGFkZXIodW5zaWduZWQgbG9uZyBoYW5kbGUpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoIXJlY29yZFN0YXRlKQorCQl7CisJCQlpZihoYW5kbGUgJiAweDAwMDAwMDAxKQorCQkJeworCQkJCXVuc2lnbmVkIGludCBpbmRleCA9IGhhbmRsZSA+PiAxNjsKKworCQkJCWlmKHZlcnRleFNoYWRlcltpbmRleF0pCisJCQkJeworCQkJCQl2ZXJ0ZXhTaGFkZXJbaW5kZXhdLT5iaW5kKCk7CisJCQkJfQorCisJCQkJaWYodmVydGV4U2hhZGVyW3ZlcnRleFNoYWRlckhhbmRsZSA+PiAxNl0pCisJCQkJeworCQkJCQl2ZXJ0ZXhTaGFkZXJbdmVydGV4U2hhZGVySGFuZGxlID4+IDE2XS0+dW5iaW5kKCk7CisJCQkJfQorCisJCQkJdmVydGV4U2hhZGVySGFuZGxlID0gaGFuZGxlOworCisJCQkJRGlyZWN0M0RWZXJ0ZXhTaGFkZXI4ICpzaGFkZXIgPSB2ZXJ0ZXhTaGFkZXJbaW5kZXhdOworCQkJCXJlbmRlcmVyLT5zZXRWZXJ0ZXhTaGFkZXIoc2hhZGVyLT5nZXRWZXJ0ZXhTaGFkZXIoKSk7CisJCQkJZGVjbGFyYXRpb24gPSBzaGFkZXItPmdldERlY2xhcmF0aW9uKCk7CisJCQkJCisJCQkJRlZGID0gMDsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQlyZW5kZXJlci0+c2V0VmVydGV4U2hhZGVyKDApOworCQkJCWRlY2xhcmF0aW9uID0gMDsKKwkJCQkKKwkJCQlGVkYgPSBoYW5kbGU7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdGF0ZVJlY29yZGVyLmJhY2soKS0+c2V0VmVydGV4U2hhZGVyKGhhbmRsZSk7CisJCX0KKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpTZXRWZXJ0ZXhTaGFkZXJDb25zdGFudCh1bnNpZ25lZCBsb25nIHN0YXJ0UmVnaXN0ZXIsIGNvbnN0IHZvaWQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgbG9uZyBjb3VudCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZighY29uc3RhbnREYXRhKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWlmKCFyZWNvcmRTdGF0ZSkKKwkJeworCQkJZm9yKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCisJCQl7CisJCQkJdmVydGV4U2hhZGVyQ29uc3RhbnRbc3RhcnRSZWdpc3RlciArIGldWzBdID0gKChmbG9hdCopY29uc3RhbnREYXRhKVtpICogNCArIDBdOworCQkJCXZlcnRleFNoYWRlckNvbnN0YW50W3N0YXJ0UmVnaXN0ZXIgKyBpXVsxXSA9ICgoZmxvYXQqKWNvbnN0YW50RGF0YSlbaSAqIDQgKyAxXTsKKwkJCQl2ZXJ0ZXhTaGFkZXJDb25zdGFudFtzdGFydFJlZ2lzdGVyICsgaV1bMl0gPSAoKGZsb2F0Kiljb25zdGFudERhdGEpW2kgKiA0ICsgMl07CisJCQkJdmVydGV4U2hhZGVyQ29uc3RhbnRbc3RhcnRSZWdpc3RlciArIGldWzNdID0gKChmbG9hdCopY29uc3RhbnREYXRhKVtpICogNCArIDNdOworCQkJfQorCisJCQlyZW5kZXJlci0+c2V0VmVydGV4U2hhZGVyQ29uc3RhbnRGKHN0YXJ0UmVnaXN0ZXIsIChjb25zdCBmbG9hdCopY29uc3RhbnREYXRhLCBjb3VudCk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdGF0ZVJlY29yZGVyLmJhY2soKS0+c2V0VmVydGV4U2hhZGVyQ29uc3RhbnQoc3RhcnRSZWdpc3RlciwgY29uc3RhbnREYXRhLCBjb3VudCk7CisJCX0KKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpTZXRWaWV3cG9ydChjb25zdCBEM0RWSUVXUE9SVDggKnZpZXdwb3J0KQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKCF2aWV3cG9ydCkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlpZighcmVjb3JkU3RhdGUpCisJCXsKKwkJCXRoaXMtPnZpZXdwb3J0ID0gKnZpZXdwb3J0OworCQl9CisJCWVsc2UKKwkJeworCQkJc3RhdGVSZWNvcmRlci5iYWNrKCktPnNldFZpZXdwb3J0KHZpZXdwb3J0KTsKKwkJfQorCQkKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlpbnQgRGlyZWN0M0REZXZpY2U4OjpTaG93Q3Vyc29yKGludCBzaG93KQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWludCBvbGRWYWx1ZSA9IHNob3dDdXJzb3IgPyBUUlVFIDogRkFMU0U7CisKKwkJc2hvd0N1cnNvciA9IHNob3cgIT0gRkFMU0UgJiYgY3Vyc29yOworCisJCWJpbmRDdXJzb3IoKTsKKworCQlyZXR1cm4gb2xkVmFsdWU7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OlRlc3RDb29wZXJhdGl2ZUxldmVsKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpVcGRhdGVUZXh0dXJlKElEaXJlY3QzREJhc2VUZXh0dXJlOCAqc291cmNlVGV4dHVyZSwgSURpcmVjdDNEQmFzZVRleHR1cmU4ICpkZXN0aW5hdGlvblRleHR1cmUpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoIXNvdXJjZVRleHR1cmUgfHwgIWRlc3RpbmF0aW9uVGV4dHVyZSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlEM0RSRVNPVVJDRVRZUEUgdHlwZSA9IHNvdXJjZVRleHR1cmUtPkdldFR5cGUoKTsKKworCQlpZih0eXBlICE9IGRlc3RpbmF0aW9uVGV4dHVyZS0+R2V0VHlwZSgpKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCXN3aXRjaCh0eXBlKQorCQl7CisJCWNhc2UgRDNEUlRZUEVfVEVYVFVSRToKKwkJCXsKKwkJCQlJRGlyZWN0M0RUZXh0dXJlOCAqc291cmNlOworCQkJCUlEaXJlY3QzRFRleHR1cmU4ICpkZXN0OworCisJCQkJc291cmNlVGV4dHVyZS0+UXVlcnlJbnRlcmZhY2UoSUlEX0lEaXJlY3QzRFRleHR1cmU4LCAodm9pZCoqKSZzb3VyY2UpOworCQkJCWRlc3RpbmF0aW9uVGV4dHVyZS0+UXVlcnlJbnRlcmZhY2UoSUlEX0lEaXJlY3QzRFRleHR1cmU4LCAodm9pZCoqKSZkZXN0KTsKKworCQkJCUFTU0VSVChzb3VyY2UgJiYgZGVzdCk7CisKKwkJCQlmb3IodW5zaWduZWQgaW50IGxldmVsID0gMDsgbGV2ZWwgPCBzb3VyY2UtPkdldExldmVsQ291bnQoKSAmJiBsZXZlbCA8IGRlc3QtPkdldExldmVsQ291bnQoKTsgbGV2ZWwrKykKKwkJCQl7CisJCQkJCUlEaXJlY3QzRFN1cmZhY2U4ICpzb3VyY2VTdXJmYWNlOworCQkJCQlJRGlyZWN0M0RTdXJmYWNlOCAqZGVzdGluYXRpb25TdXJmYWNlOworCisJCQkJCXNvdXJjZS0+R2V0U3VyZmFjZUxldmVsKGxldmVsLCAmc291cmNlU3VyZmFjZSk7CisJCQkJCWRlc3QtPkdldFN1cmZhY2VMZXZlbChsZXZlbCwgJmRlc3RpbmF0aW9uU3VyZmFjZSk7CisKKwkJCQkJdXBkYXRlU3VyZmFjZShzb3VyY2VTdXJmYWNlLCAwLCBkZXN0aW5hdGlvblN1cmZhY2UsIDApOworCisJCQkJCXNvdXJjZVN1cmZhY2UtPlJlbGVhc2UoKTsKKwkJCQkJZGVzdGluYXRpb25TdXJmYWNlLT5SZWxlYXNlKCk7CisJCQkJfQorCisJCQkJc291cmNlLT5SZWxlYXNlKCk7CisJCQkJZGVzdC0+UmVsZWFzZSgpOworCQkJfQorCQkJYnJlYWs7CisJCWNhc2UgRDNEUlRZUEVfVk9MVU1FVEVYVFVSRToKKwkJCXsKKwkJCQlJRGlyZWN0M0RWb2x1bWVUZXh0dXJlOCAqc291cmNlOworCQkJCUlEaXJlY3QzRFZvbHVtZVRleHR1cmU4ICpkZXN0OworCisJCQkJc291cmNlVGV4dHVyZS0+UXVlcnlJbnRlcmZhY2UoSUlEX0lEaXJlY3QzRFZvbHVtZVRleHR1cmU4LCAodm9pZCoqKSZzb3VyY2UpOworCQkJCWRlc3RpbmF0aW9uVGV4dHVyZS0+UXVlcnlJbnRlcmZhY2UoSUlEX0lEaXJlY3QzRFZvbHVtZVRleHR1cmU4LCAodm9pZCoqKSZkZXN0KTsKKworCQkJCUFTU0VSVChzb3VyY2UgJiYgZGVzdCk7CisKKwkJCQlmb3IodW5zaWduZWQgaW50IGxldmVsID0gMDsgbGV2ZWwgPCBzb3VyY2UtPkdldExldmVsQ291bnQoKSAmJiBsZXZlbCA8IGRlc3QtPkdldExldmVsQ291bnQoKTsgbGV2ZWwrKykgICAvLyBGSVhNRTogRmFpbCB3aGVuIHNvdXJjZSB0ZXh0dXJlIGhhcyBmZXdlciBsZXZlbHMgdGhhbiB0aGUgZGVzdGluYXRpb24KKwkJCQl7CisJCQkJCUlEaXJlY3QzRFZvbHVtZTggKnNvdXJjZVZvbHVtZTsKKwkJCQkJSURpcmVjdDNEVm9sdW1lOCAqZGVzdGluYXRpb25Wb2x1bWU7CisKKwkJCQkJc291cmNlLT5HZXRWb2x1bWVMZXZlbChsZXZlbCwgJnNvdXJjZVZvbHVtZSk7CisJCQkJCWRlc3QtPkdldFZvbHVtZUxldmVsKGxldmVsLCAmZGVzdGluYXRpb25Wb2x1bWUpOworCisJCQkJCXVwZGF0ZVZvbHVtZShzb3VyY2VWb2x1bWUsIGRlc3RpbmF0aW9uVm9sdW1lKTsKKworCQkJCQlzb3VyY2VWb2x1bWUtPlJlbGVhc2UoKTsKKwkJCQkJZGVzdGluYXRpb25Wb2x1bWUtPlJlbGVhc2UoKTsKKwkJCQl9CisKKwkJCQlzb3VyY2UtPlJlbGVhc2UoKTsKKwkJCQlkZXN0LT5SZWxlYXNlKCk7CisJCQl9CisJCQlicmVhazsKKwkJY2FzZSBEM0RSVFlQRV9DVUJFVEVYVFVSRToKKwkJCXsKKwkJCQlJRGlyZWN0M0RDdWJlVGV4dHVyZTggKnNvdXJjZTsKKwkJCQlJRGlyZWN0M0RDdWJlVGV4dHVyZTggKmRlc3Q7CisKKwkJCQlzb3VyY2VUZXh0dXJlLT5RdWVyeUludGVyZmFjZShJSURfSURpcmVjdDNEQ3ViZVRleHR1cmU4LCAodm9pZCoqKSZzb3VyY2UpOworCQkJCWRlc3RpbmF0aW9uVGV4dHVyZS0+UXVlcnlJbnRlcmZhY2UoSUlEX0lEaXJlY3QzREN1YmVUZXh0dXJlOCwgKHZvaWQqKikmZGVzdCk7CisKKwkJCQlBU1NFUlQoc291cmNlICYmIGRlc3QpOworCisJCQkJZm9yKGludCBmYWNlID0gMDsgZmFjZSA8IDY7IGZhY2UrKykKKwkJCQl7CisJCQkJCWZvcih1bnNpZ25lZCBpbnQgbGV2ZWwgPSAwOyBsZXZlbCA8IHNvdXJjZS0+R2V0TGV2ZWxDb3VudCgpICYmIGxldmVsIDwgZGVzdC0+R2V0TGV2ZWxDb3VudCgpOyBsZXZlbCsrKQorCQkJCQl7CisJCQkJCQlJRGlyZWN0M0RTdXJmYWNlOCAqc291cmNlU3VyZmFjZTsKKwkJCQkJCUlEaXJlY3QzRFN1cmZhY2U4ICpkZXN0aW5hdGlvblN1cmZhY2U7CisKKwkJCQkJCXNvdXJjZS0+R2V0Q3ViZU1hcFN1cmZhY2UoKEQzRENVQkVNQVBfRkFDRVMpZmFjZSwgbGV2ZWwsICZzb3VyY2VTdXJmYWNlKTsKKwkJCQkJCWRlc3QtPkdldEN1YmVNYXBTdXJmYWNlKChEM0RDVUJFTUFQX0ZBQ0VTKWZhY2UsIGxldmVsLCAmZGVzdGluYXRpb25TdXJmYWNlKTsKKworCQkJCQkJdXBkYXRlU3VyZmFjZShzb3VyY2VTdXJmYWNlLCAwLCBkZXN0aW5hdGlvblN1cmZhY2UsIDApOworCisJCQkJCQlzb3VyY2VTdXJmYWNlLT5SZWxlYXNlKCk7CisJCQkJCQlkZXN0aW5hdGlvblN1cmZhY2UtPlJlbGVhc2UoKTsKKwkJCQkJfQorCQkJCX0KKworCQkJCXNvdXJjZS0+UmVsZWFzZSgpOworCQkJCWRlc3QtPlJlbGVhc2UoKTsKKwkJCX0KKwkJCWJyZWFrOworCQlkZWZhdWx0OgorCQkJQVNTRVJUKGZhbHNlKTsKKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OlZhbGlkYXRlRGV2aWNlKHVuc2lnbmVkIGxvbmcgKm51bVBhc3NlcykKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZighbnVtUGFzc2VzKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCSpudW1QYXNzZXMgPSAxOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRERldmljZTg6OnVwZGF0ZVN1cmZhY2UoSURpcmVjdDNEU3VyZmFjZTggKnNvdXJjZVN1cmZhY2UsIGNvbnN0IFJFQ1QgKnNvdXJjZVJlY3QsIElEaXJlY3QzRFN1cmZhY2U4ICpkZXN0aW5hdGlvblN1cmZhY2UsIGNvbnN0IFBPSU5UICpkZXN0UG9pbnQpCisJeworCQlUUkFDRSgiSURpcmVjdDNEU3VyZmFjZTggKnNvdXJjZVN1cmZhY2UgPSAweCUwLjhwLCBjb25zdCBSRUNUICpzb3VyY2VSZWN0ID0gMHglMC44cCwgSURpcmVjdDNEU3VyZmFjZTggKmRlc3RpbmF0aW9uU3VyZmFjZSA9IDB4JTAuOHAsIGNvbnN0IFBPSU5UICpkZXN0UG9pbnQgPSAweCUwLjhwIiwgc291cmNlU3VyZmFjZSwgc291cmNlUmVjdCwgZGVzdGluYXRpb25TdXJmYWNlLCBkZXN0UG9pbnQpOworCisJCWlmKCFzb3VyY2VTdXJmYWNlIHx8ICFkZXN0aW5hdGlvblN1cmZhY2UpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJRDNEU1VSRkFDRV9ERVNDIHNvdXJjZURlc2NyaXB0aW9uOworCQlEM0RTVVJGQUNFX0RFU0MgZGVzdGluYXRpb25EZXNjcmlwdGlvbjsKKworCQlzb3VyY2VTdXJmYWNlLT5HZXREZXNjKCZzb3VyY2VEZXNjcmlwdGlvbik7CisJCWRlc3RpbmF0aW9uU3VyZmFjZS0+R2V0RGVzYygmZGVzdGluYXRpb25EZXNjcmlwdGlvbik7CisKKwkJUkVDVCBzUmVjdDsKKwkJUkVDVCBkUmVjdDsKKwkJCisJCWlmKHNvdXJjZVJlY3QgJiYgZGVzdFBvaW50KQorCQl7CisJCQlzUmVjdC5sZWZ0ID0gc291cmNlUmVjdC0+bGVmdDsKKwkJCXNSZWN0LnRvcCA9IHNvdXJjZVJlY3QtPnRvcDsKKwkJCXNSZWN0LnJpZ2h0ID0gc291cmNlUmVjdC0+cmlnaHQ7CisJCQlzUmVjdC5ib3R0b20gPSBzb3VyY2VSZWN0LT5ib3R0b207CisKKwkJCWRSZWN0LmxlZnQgPSBkZXN0UG9pbnQtPng7CisJCQlkUmVjdC50b3AgPSBkZXN0UG9pbnQtPnk7CisJCQlkUmVjdC5yaWdodCA9IGRlc3RQb2ludC0+eCArIHNvdXJjZVJlY3QtPnJpZ2h0IC0gc291cmNlUmVjdC0+bGVmdDsKKwkJCWRSZWN0LmJvdHRvbSA9IGRlc3RQb2ludC0+eSArIHNvdXJjZVJlY3QtPmJvdHRvbSAtIHNvdXJjZVJlY3QtPnRvcDsKKwkJfQorCQllbHNlCisJCXsKKwkJCXNSZWN0LmxlZnQgPSAwOworCQkJc1JlY3QudG9wID0gMDsKKwkJCXNSZWN0LnJpZ2h0ID0gc291cmNlRGVzY3JpcHRpb24uV2lkdGg7CisJCQlzUmVjdC5ib3R0b20gPSBzb3VyY2VEZXNjcmlwdGlvbi5IZWlnaHQ7CisKKwkJCWRSZWN0LmxlZnQgPSAwOworCQkJZFJlY3QudG9wID0gMDsKKwkJCWRSZWN0LnJpZ2h0ID0gZGVzdGluYXRpb25EZXNjcmlwdGlvbi5XaWR0aDsKKwkJCWRSZWN0LmJvdHRvbSA9IGRlc3RpbmF0aW9uRGVzY3JpcHRpb24uSGVpZ2h0OworCQl9CisKKwkJaW50IHNXaWR0aCA9IHNSZWN0LnJpZ2h0IC0gc1JlY3QubGVmdDsKKwkJaW50IHNIZWlnaHQgPSBzUmVjdC5ib3R0b20gLSBzUmVjdC50b3A7CisKKwkJaW50IGRXaWR0aCA9IGRSZWN0LnJpZ2h0IC0gZFJlY3QubGVmdDsKKwkJaW50IGRIZWlnaHQgPSBkUmVjdC5ib3R0b20gLSBkUmVjdC50b3A7CisKKwkJaWYoc291cmNlRGVzY3JpcHRpb24uTXVsdGlTYW1wbGVUeXBlICAgICAgIT0gRDNETVVMVElTQU1QTEVfTk9ORSB8fAorCQkgICBkZXN0aW5hdGlvbkRlc2NyaXB0aW9uLk11bHRpU2FtcGxlVHlwZSAhPSBEM0RNVUxUSVNBTVBMRV9OT05FIHx8CisJCS8vIHNvdXJjZURlc2NyaXB0aW9uLlBvb2wgICAgICAhPSBEM0RQT09MX1NZU1RFTU1FTSB8fCAgIC8vIEZJWE1FOiBDaGVjayBiYWNrIGJ1ZmZlciBhbmQgZGVwdGggYnVmZmVyIG1lbW9yeSBwb29sIGZsYWdzCisJCS8vIGRlc3RpbmF0aW9uRGVzY3JpcHRpb24uUG9vbCAhPSBEM0RQT09MX0RFRkFVTFQgfHwKKwkJICAgc291cmNlRGVzY3JpcHRpb24uRm9ybWF0ICE9IGRlc3RpbmF0aW9uRGVzY3JpcHRpb24uRm9ybWF0IHx8CisJCSAgIHNXaWR0aCAgIT0gZFdpZHRoIHx8CisJCSAgIHNIZWlnaHQgIT0gZEhlaWdodCkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlEM0RMT0NLRURfUkVDVCBzb3VyY2VMb2NrOworCQlEM0RMT0NLRURfUkVDVCBkZXN0aW5hdGlvbkxvY2s7CisKKwkJc291cmNlU3VyZmFjZS0+TG9ja1JlY3QoJnNvdXJjZUxvY2ssICZzUmVjdCwgRDNETE9DS19SRUFET05MWSk7CisJCWRlc3RpbmF0aW9uU3VyZmFjZS0+TG9ja1JlY3QoJmRlc3RpbmF0aW9uTG9jaywgJmRSZWN0LCAwKTsKKworCQl1bnNpZ25lZCBpbnQgd2lkdGg7CisJCXVuc2lnbmVkIGludCBoZWlnaHQ7CisJCXVuc2lnbmVkIGludCBieXRlczsKKworCQlzd2l0Y2goc291cmNlRGVzY3JpcHRpb24uRm9ybWF0KQorCQl7CisJCWNhc2UgRDNERk1UX0RYVDE6CisJCQl3aWR0aCA9IChkV2lkdGggKyAzKSAvIDQ7CisJCQloZWlnaHQgPSAoZEhlaWdodCArIDMpIC8gNDsKKwkJCWJ5dGVzID0gd2lkdGggKiA4OyAgIC8vIDY0IGJpdCBwZXIgNHg0IGJsb2NrCisJCQlicmVhazsKKwkJY2FzZSBEM0RGTVRfRFhUMjoKKwkJY2FzZSBEM0RGTVRfRFhUMzoKKwkJY2FzZSBEM0RGTVRfRFhUNDoKKwkJY2FzZSBEM0RGTVRfRFhUNToKKwkJCXdpZHRoID0gKGRXaWR0aCArIDMpIC8gNDsKKwkJCWhlaWdodCA9IChkSGVpZ2h0ICsgMykgLyA0OworCQkJYnl0ZXMgPSB3aWR0aCAqIDE2OyAgIC8vIDEyOCBiaXQgcGVyIDR4NCBibG9jaworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJCQl3aWR0aCA9IGRXaWR0aDsKKwkJCWhlaWdodCA9IGRIZWlnaHQ7CisJCQlieXRlcyA9IHdpZHRoICogRGlyZWN0M0RTdXJmYWNlODo6Ynl0ZXMoc291cmNlRGVzY3JpcHRpb24uRm9ybWF0KTsKKwkJfQorCisJCWZvcih1bnNpZ25lZCBpbnQgeSA9IDA7IHkgPCBoZWlnaHQ7IHkrKykKKwkJeworCQkJbWVtY3B5KGRlc3RpbmF0aW9uTG9jay5wQml0cywgc291cmNlTG9jay5wQml0cywgYnl0ZXMpOworCQkJCisJCQkoYnl0ZSomKXNvdXJjZUxvY2sucEJpdHMgKz0gc291cmNlTG9jay5QaXRjaDsKKwkJCShieXRlKiYpZGVzdGluYXRpb25Mb2NrLnBCaXRzICs9IGRlc3RpbmF0aW9uTG9jay5QaXRjaDsKKwkJfQorCisJCXNvdXJjZVN1cmZhY2UtPlVubG9ja1JlY3QoKTsKKwkJZGVzdGluYXRpb25TdXJmYWNlLT5VbmxvY2tSZWN0KCk7CisJCQorCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0REZXZpY2U4OjpTZXRJbmRpY2VzKElEaXJlY3QzREluZGV4QnVmZmVyOCAqaUluZGV4QnVmZmVyLCB1bnNpZ25lZCBpbnQgYmFzZVZlcnRleEluZGV4KQorCXsKKwkJVFJBQ0UoIiIpOworCisJCURpcmVjdDNESW5kZXhCdWZmZXI4ICppbmRleEJ1ZmZlciA9IHN0YXRpY19jYXN0PERpcmVjdDNESW5kZXhCdWZmZXI4Kj4oaUluZGV4QnVmZmVyKTsKKworCQlpZighcmVjb3JkU3RhdGUpCisJCXsKKwkJCWlmKGluZGV4QnVmZmVyKQorCQkJeworCQkJCWluZGV4QnVmZmVyLT5iaW5kKCk7CisJCQl9CisKKwkJCWlmKHRoaXMtPmluZGV4RGF0YSkKKwkJCXsKKwkJCQl0aGlzLT5pbmRleERhdGEtPnVuYmluZCgpOworCQkJfQorCisJCQl0aGlzLT5pbmRleERhdGEgPSBpbmRleEJ1ZmZlcjsKKwkJCXRoaXMtPmJhc2VWZXJ0ZXhJbmRleCA9IGJhc2VWZXJ0ZXhJbmRleDsKKwkJfQorCQllbHNlCisJCXsKKwkJCXN0YXRlUmVjb3JkZXIuYmFjaygpLT5zZXRJbmRpY2VzKGluZGV4QnVmZmVyLCBiYXNlVmVydGV4SW5kZXgpOworCQl9CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlpbnQgRGlyZWN0M0REZXZpY2U4OjpGVkZTdHJpZGUodW5zaWduZWQgbG9uZyBGVkYpCisJeworCQlpbnQgc3RyaWRlID0gMDsKKworCQlzd2l0Y2goRlZGICYgRDNERlZGX1BPU0lUSU9OX01BU0spCisJCXsKKwkJY2FzZSBEM0RGVkZfWFlaOglzdHJpZGUgKz0gMTI7CWJyZWFrOworCQljYXNlIEQzREZWRl9YWVpSSFc6CXN0cmlkZSArPSAxNjsJYnJlYWs7CisJCWNhc2UgRDNERlZGX1hZWkIxOglzdHJpZGUgKz0gMTY7CWJyZWFrOworCQljYXNlIEQzREZWRl9YWVpCMjoJc3RyaWRlICs9IDIwOwlicmVhazsKKwkJY2FzZSBEM0RGVkZfWFlaQjM6CXN0cmlkZSArPSAyNDsJYnJlYWs7CisJCWNhc2UgRDNERlZGX1hZWkI0OglzdHJpZGUgKz0gMjg7CWJyZWFrOworCQljYXNlIEQzREZWRl9YWVpCNToJc3RyaWRlICs9IDMyOwlicmVhazsKKwkJfQorCisJCWlmKEZWRiAmIEQzREZWRl9OT1JNQUwpCQlzdHJpZGUgKz0gMTI7CisJCWlmKEZWRiAmIEQzREZWRl9QU0laRSkJCXN0cmlkZSArPSA0OworCQlpZihGVkYgJiBEM0RGVkZfRElGRlVTRSkJc3RyaWRlICs9IDQ7CisJCWlmKEZWRiAmIEQzREZWRl9TUEVDVUxBUikJc3RyaWRlICs9IDQ7CisJCQorCQlzd2l0Y2goKEZWRiAmIEQzREZWRl9URVhDT1VOVF9NQVNLKSA+PiBEM0RGVkZfVEVYQ09VTlRfU0hJRlQpCisJCXsKKwkJY2FzZSA4OiBzdHJpZGUgKz0gNCArIDQgKiAoKDEgKyAoRlZGID4+IDMwKSkgJSA0KTsKKwkJY2FzZSA3OiBzdHJpZGUgKz0gNCArIDQgKiAoKDEgKyAoRlZGID4+IDI4KSkgJSA0KTsKKwkJY2FzZSA2OiBzdHJpZGUgKz0gNCArIDQgKiAoKDEgKyAoRlZGID4+IDI2KSkgJSA0KTsKKwkJY2FzZSA1OiBzdHJpZGUgKz0gNCArIDQgKiAoKDEgKyAoRlZGID4+IDI0KSkgJSA0KTsKKwkJY2FzZSA0OiBzdHJpZGUgKz0gNCArIDQgKiAoKDEgKyAoRlZGID4+IDIyKSkgJSA0KTsKKwkJY2FzZSAzOiBzdHJpZGUgKz0gNCArIDQgKiAoKDEgKyAoRlZGID4+IDIwKSkgJSA0KTsKKwkJY2FzZSAyOiBzdHJpZGUgKz0gNCArIDQgKiAoKDEgKyAoRlZGID4+IDE4KSkgJSA0KTsKKwkJY2FzZSAxOiBzdHJpZGUgKz0gNCArIDQgKiAoKDEgKyAoRlZGID4+IDE2KSkgJSA0KTsKKwkJY2FzZSAwOiBicmVhazsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKworCQlyZXR1cm4gc3RyaWRlOworCX0KKworCWludCBEaXJlY3QzRERldmljZTg6OnR5cGVTdHJpZGUodW5zaWduZWQgY2hhciB0eXBlKQorCXsKKwkJc3RhdGljIGNvbnN0IGludCBMVVRbXSA9CisJCXsKKwkJCTQsCS8vIEQzRERFQ0xUWVBFX0ZMT0FUMSAgICA9ICAwLCAgLy8gMUQgZmxvYXQgZXhwYW5kZWQgdG8gKHZhbHVlLCAwLiwgMC4sIDEuKQorCQkJOCwJLy8gRDNEREVDTFRZUEVfRkxPQVQyICAgID0gIDEsICAvLyAyRCBmbG9hdCBleHBhbmRlZCB0byAodmFsdWUsIHZhbHVlLCAwLiwgMS4pCisJCQkxMiwJLy8gRDNEREVDTFRZUEVfRkxPQVQzICAgID0gIDIsICAvLyAzRCBmbG9hdCBleHBhbmRlZCB0byAodmFsdWUsIHZhbHVlLCB2YWx1ZSwgMS4pCisJCQkxNiwJLy8gRDNEREVDTFRZUEVfRkxPQVQ0ICAgID0gIDMsICAvLyA0RCBmbG9hdAorCQkJNCwJLy8gRDNEREVDTFRZUEVfRDNEQ09MT1IgID0gIDQsICAvLyA0RCBwYWNrZWQgdW5zaWduZWQgYnl0ZXMgbWFwcGVkIHRvIDAuIHRvIDEuIHJhbmdlLiBJbnB1dCBpcyBpbiBEM0RDT0xPUiBmb3JtYXQgKEFSR0IpIGV4cGFuZGVkIHRvIChSLCBHLCBCLCBBKQorCQkJNCwJLy8gRDNEREVDTFRZUEVfVUJZVEU0ICAgID0gIDUsICAvLyA0RCB1bnNpZ25lZCBieXRlCisJCQk0LAkvLyBEM0RERUNMVFlQRV9TSE9SVDIgICAgPSAgNiwgIC8vIDJEIHNpZ25lZCBzaG9ydCBleHBhbmRlZCB0byAodmFsdWUsIHZhbHVlLCAwLiwgMS4pCisJCQk4IAkvLyBEM0RERUNMVFlQRV9TSE9SVDQgICAgPSAgNywgIC8vIDREIHNpZ25lZCBzaG9ydAorCQl9OworCisJCWlmKHR5cGUgPD0gNykKKwkJeworCQkJcmV0dXJuIExVVFt0eXBlXTsKKwkJfQorCQllbHNlIEFTU0VSVChmYWxzZSk7CisKKwkJcmV0dXJuIDA7CisJfQorCisJYm9vbCBEaXJlY3QzRERldmljZTg6OmJpbmREYXRhKERpcmVjdDNESW5kZXhCdWZmZXI4ICppbmRleEJ1ZmZlciwgaW50IGJhc2UpCisJeworCQlpZighYmluZFZpZXdwb3J0KCkpCisJCXsKKwkJCXJldHVybiBmYWxzZTsgICAvLyBaZXJvLWFyZWEgdGFyZ2V0IHJlZ2lvbgorCQl9CisKKwkJYmluZFRleHR1cmVzKCk7CisJCWJpbmRTdHJlYW1zKGJhc2UpOworCQliaW5kSW5kZXhCdWZmZXIoaW5kZXhCdWZmZXIpOworCQliaW5kTGlnaHRzKCk7CisKKwkJcmV0dXJuIHRydWU7CisJfQorCisJdm9pZCBEaXJlY3QzRERldmljZTg6OmJpbmRTdHJlYW1zKGludCBiYXNlKQorCXsKKwkJcmVuZGVyZXItPnJlc2V0SW5wdXRTdHJlYW1zKChGVkYgJiBEM0RGVkZfUE9TSVRJT05fTUFTSykgPT0gRDNERlZGX1hZWlJIVyk7CisKKwkJaW50IHN0cmlkZTsKKworCQlpZighZGVjbGFyYXRpb24pICAgLy8gRml4ZWQtZnVuY3Rpb24gdmVydGV4IHBpcGVsaW5lCisJCXsKKwkJCWNvbnN0IHZvaWQgKmJ1ZmZlciA9IDA7CisKKwkJCUFTU0VSVChkYXRhU3RyZWFtWzBdKTsKKworCQkJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4ICpzdHJlYW0gPSBkYXRhU3RyZWFtWzBdOworCQkJc3c6OlJlc291cmNlICpyZXNvdXJjZSA9IHN0cmVhbS0+Z2V0UmVzb3VyY2UoKTsKKwkJCWJ1ZmZlciA9IChjaGFyKilyZXNvdXJjZS0+ZGF0YSgpOworCQkJc3RyaWRlID0gRlZGU3RyaWRlKEZWRik7CisKKwkJCUFTU0VSVChzdHJpZGUgPT0gc3RyZWFtU3RyaWRlWzBdKTsgICAvLyBGSVhNRQorCQkJQVNTRVJUKGJ1ZmZlciAmJiBzdHJpZGUpOworCisJCQkoY2hhciomKWJ1ZmZlciArPSBzdHJpZGUgKiBiYXNlOworCisJCQlzdzo6U3RyZWFtIGF0dHJpYnV0ZShyZXNvdXJjZSwgYnVmZmVyLCBzdHJpZGUpOworCisJCQlzd2l0Y2goRlZGICYgRDNERlZGX1BPU0lUSU9OX01BU0spCisJCQl7CisJCQljYXNlIEQzREZWRl9YWVo6CisJCQkJcmVuZGVyZXItPnNldElucHV0U3RyZWFtKHN3OjpQb3NpdGlvbiwgYXR0cmlidXRlLmRlZmluZShidWZmZXIsIHN3OjpTVFJFQU1UWVBFX0ZMT0FULCAzKSk7CisJCQkJKGNoYXIqJilidWZmZXIgKz0gMTI7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzREZWRl9YWVpSSFc6CisJCQkJcmVuZGVyZXItPnNldElucHV0U3RyZWFtKHN3OjpQb3NpdGlvblQsIGF0dHJpYnV0ZS5kZWZpbmUoYnVmZmVyLCBzdzo6U1RSRUFNVFlQRV9GTE9BVCwgNCkpOworCQkJCShjaGFyKiYpYnVmZmVyICs9IDE2OworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RGVkZfWFlaQjE6CisJCQkJcmVuZGVyZXItPnNldElucHV0U3RyZWFtKHN3OjpQb3NpdGlvbiwgYXR0cmlidXRlLmRlZmluZShidWZmZXIsIHN3OjpTVFJFQU1UWVBFX0ZMT0FULCAzKSk7CisJCQkJKGNoYXIqJilidWZmZXIgKz0gMTI7CisKKwkJCQlyZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OkJsZW5kV2VpZ2h0LCBhdHRyaWJ1dGUuZGVmaW5lKGJ1ZmZlciwgc3c6OlNUUkVBTVRZUEVfRkxPQVQsIDEpKTsgICAvLyBGSVhNRTogU3RyZWFtIHR5cGUgZGVwZW5kcyBvbiBpbmRleGVkIGJsZW5kaW5nIGFjdGl2ZT8KKwkJCQkoY2hhciomKWJ1ZmZlciArPSA0OworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RGVkZfWFlaQjI6CisJCQkJcmVuZGVyZXItPnNldElucHV0U3RyZWFtKHN3OjpQb3NpdGlvbiwgYXR0cmlidXRlLmRlZmluZShidWZmZXIsIHN3OjpTVFJFQU1UWVBFX0ZMT0FULCAzKSk7CisJCQkJKGNoYXIqJilidWZmZXIgKz0gMTI7CisKKwkJCQlyZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OkJsZW5kV2VpZ2h0LCBhdHRyaWJ1dGUuZGVmaW5lKGJ1ZmZlciwgc3c6OlNUUkVBTVRZUEVfRkxPQVQsIDEpKTsgICAvLyBGSVhNRTogU3RyZWFtIHR5cGUgZGVwZW5kcyBvbiBpbmRleGVkIGJsZW5kaW5nIGFjdGl2ZT8KKwkJCQkoY2hhciomKWJ1ZmZlciArPSA4OworCQkJCWJyZWFrOworCQkJY2FzZSBEM0RGVkZfWFlaQjM6CisJCQkJcmVuZGVyZXItPnNldElucHV0U3RyZWFtKHN3OjpQb3NpdGlvbiwgYXR0cmlidXRlLmRlZmluZShidWZmZXIsIHN3OjpTVFJFQU1UWVBFX0ZMT0FULCAzKSk7CisJCQkJKGNoYXIqJilidWZmZXIgKz0gMTI7CisKKwkJCQlyZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OkJsZW5kV2VpZ2h0LCBhdHRyaWJ1dGUuZGVmaW5lKGJ1ZmZlciwgc3c6OlNUUkVBTVRZUEVfRkxPQVQsIDIpKTsgICAvLyBGSVhNRTogU3RyZWFtIHR5cGUgZGVwZW5kcyBvbiBpbmRleGVkIGJsZW5kaW5nIGFjdGl2ZT8KKwkJCQkoY2hhciomKWJ1ZmZlciArPSAxMjsKKwkJCQlicmVhazsKKwkJCWNhc2UgRDNERlZGX1hZWkI0OgorCQkJCXJlbmRlcmVyLT5zZXRJbnB1dFN0cmVhbShzdzo6UG9zaXRpb24sIGF0dHJpYnV0ZS5kZWZpbmUoYnVmZmVyLCBzdzo6U1RSRUFNVFlQRV9GTE9BVCwgMykpOworCQkJCShjaGFyKiYpYnVmZmVyICs9IDEyOworCisJCQkJcmVuZGVyZXItPnNldElucHV0U3RyZWFtKHN3OjpCbGVuZFdlaWdodCwgYXR0cmlidXRlLmRlZmluZShidWZmZXIsIHN3OjpTVFJFQU1UWVBFX0ZMT0FULCAzKSk7ICAgLy8gRklYTUU6IFN0cmVhbSB0eXBlIGRlcGVuZHMgb24gaW5kZXhlZCBibGVuZGluZyBhY3RpdmU/CisJCQkJKGNoYXIqJilidWZmZXIgKz0gMTY7CisJCQkJYnJlYWs7CisJCQljYXNlIEQzREZWRl9YWVpCNToKKwkJCQlyZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OlBvc2l0aW9uLCBhdHRyaWJ1dGUuZGVmaW5lKGJ1ZmZlciwgc3c6OlNUUkVBTVRZUEVfRkxPQVQsIDMpKTsKKwkJCQkoY2hhciomKWJ1ZmZlciArPSAxMjsKKworCQkJCXJlbmRlcmVyLT5zZXRJbnB1dFN0cmVhbShzdzo6QmxlbmRXZWlnaHQsIGF0dHJpYnV0ZS5kZWZpbmUoYnVmZmVyLCBzdzo6U1RSRUFNVFlQRV9GTE9BVCwgNCkpOyAgIC8vIEZJWE1FOiBTdHJlYW0gdHlwZSBkZXBlbmRzIG9uIGluZGV4ZWQgYmxlbmRpbmcgYWN0aXZlPworCQkJCShjaGFyKiYpYnVmZmVyICs9IDIwOworCQkJCWJyZWFrOworCQkJfQorCisJCQlpZihGVkYgJiBEM0RGVkZfTEFTVEJFVEFfVUJZVEU0KQorCQkJeworCQkJCXJlbmRlcmVyLT5zZXRJbnB1dFN0cmVhbShzdzo6QmxlbmRJbmRpY2VzLCBhdHRyaWJ1dGUuZGVmaW5lKChjaGFyKiYpYnVmZmVyIC0gNCwgc3c6OlNUUkVBTVRZUEVfSU5ESUNFUywgMSkpOworCQkJfQorCQkJCisJCQlpZihGVkYgJiBEM0RGVkZfTk9STUFMKQorCQkJeworCQkJCXJlbmRlcmVyLT5zZXRJbnB1dFN0cmVhbShzdzo6Tm9ybWFsLCBhdHRyaWJ1dGUuZGVmaW5lKGJ1ZmZlciwgc3c6OlNUUkVBTVRZUEVfRkxPQVQsIDMpKTsKKwkJCQkoY2hhciomKWJ1ZmZlciArPSAxMjsKKwkJCX0KKwkJCQorCQkJaWYoRlZGICYgRDNERlZGX1BTSVpFKQorCQkJeworCQkJCXJlbmRlcmVyLT5zZXRJbnB1dFN0cmVhbShzdzo6UG9pbnRTaXplLCBhdHRyaWJ1dGUuZGVmaW5lKGJ1ZmZlciwgc3c6OlNUUkVBTVRZUEVfRkxPQVQsIDEpKTsKKwkJCQkoY2hhciomKWJ1ZmZlciArPSA0OworCQkJfQorCQkJCisJCQlpZihGVkYgJiBEM0RGVkZfRElGRlVTRSkKKwkJCXsKKwkJCQlyZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OkNvbG9yMCwgYXR0cmlidXRlLmRlZmluZShidWZmZXIsIHN3OjpTVFJFQU1UWVBFX0NPTE9SLCA0KSk7CisJCQkJKGNoYXIqJilidWZmZXIgKz0gNDsKKwkJCX0KKwkJCQorCQkJaWYoRlZGICYgRDNERlZGX1NQRUNVTEFSKQorCQkJeworCQkJCXJlbmRlcmVyLT5zZXRJbnB1dFN0cmVhbShzdzo6Q29sb3IxLCBhdHRyaWJ1dGUuZGVmaW5lKGJ1ZmZlciwgc3c6OlNUUkVBTVRZUEVfQ09MT1IsIDQpKTsKKwkJCQkoY2hhciomKWJ1ZmZlciArPSA0OworCQkJfQorCisJCQlmb3IodW5zaWduZWQgaW50IGkgPSAwOyBpIDwgODsgaSsrKQorCQkJeworCQkJCWlmKChGVkYgJiBEM0RGVkZfVEVYQ09VTlRfTUFTSykgPj4gRDNERlZGX1RFWENPVU5UX1NISUZUID49IGkgKyAxKQorCQkJCXsKKwkJCQkJcmVuZGVyZXItPnNldElucHV0U3RyZWFtKHN3OjpUZXhDb29yZDAgKyBpLCBhdHRyaWJ1dGUuZGVmaW5lKGJ1ZmZlciwgc3c6OlNUUkVBTVRZUEVfRkxPQVQsIDEgKyAoMSArIChGVkYgPj4gKDE2ICsgaSAqIDIpKSkgJSA0KSk7CisJCQkJCShjaGFyKiYpYnVmZmVyICs9IDQgKyA0ICogKCgxICsgKEZWRiA+PiAoMTYgKyBpICogMikpKSAlIDQpOworCQkJCX0KKwkJCX0KKwkJfQorCQllbHNlCisJCXsKKwkJCWNvbnN0IHVuc2lnbmVkIGxvbmcgKmVsZW1lbnQgPSBkZWNsYXJhdGlvbjsKKwkJCWludCBzdHJlYW0gPSAwOworCQkJc3c6OlJlc291cmNlICpyZXNvdXJjZTsKKwkJCWNvbnN0IHZvaWQgKmJ1ZmZlciA9IDA7CisKKwkJCXdoaWxlKCplbGVtZW50ICE9IDB4RkZGRkZGRkYpCisJCQl7CisJCQkJc3dpdGNoKCgqZWxlbWVudCAmIDB4RTAwMDAwMDApID4+IDI5KQorCQkJCXsKKwkJCQljYXNlIDA6ICAgLy8gTk9QCisJCQkJCWlmKCplbGVtZW50ICE9IDB4MDAwMDAwMDApCisJCQkJCXsKKwkJCQkJCUFTU0VSVChmYWxzZSk7CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSAxOiAgIC8vIFN0cmVhbSBzZWxlY3RvcgorCQkJCQlzdHJlYW0gPSAqZWxlbWVudCAmIDB4MDAwMDAwMEY7CisJCQkJCXsKKwkJCQkJCUFTU0VSVChkYXRhU3RyZWFtW3N0cmVhbV0pOyAgIC8vIEV4cGVjdGVkIGEgc3RyZWFtCisKKwkJCQkJCURpcmVjdDNEVmVydGV4QnVmZmVyOCAqc3RyZWFtQnVmZmVyID0gKERpcmVjdDNEVmVydGV4QnVmZmVyOCopZGF0YVN0cmVhbVtzdHJlYW1dOworCQkJCQkJcmVzb3VyY2UgPSBzdHJlYW1CdWZmZXItPmdldFJlc291cmNlKCk7CisJCQkJCQlidWZmZXIgPSAoY2hhciopcmVzb3VyY2UtPmRhdGEoKTsKKworCQkJCQkJY29uc3QgdW5zaWduZWQgbG9uZyAqc3RyZWFtRWxlbWVudCA9IGVsZW1lbnQgKyAxOworCQkJCQkJc3RyaWRlID0gMDsKKworCQkJCQkJd2hpbGUoKCpzdHJlYW1FbGVtZW50ICYgMHhFMDAwMDAwMCkgPj4gMjkgPT0gMikgICAvLyBEYXRhIGRlZmluaXRpb24KKwkJCQkJCXsKKwkJCQkJCQlpZigqc3RyZWFtRWxlbWVudCAmIDB4MTAwMDAwMDApICAgLy8gRGF0YSBza2lwCisJCQkJCQkJeworCQkJCQkJCQlpbnQgc2tpcCA9ICgqc3RyZWFtRWxlbWVudCAmIDB4MDAwRjAwMDApID4+IDE2OworCisJCQkJCQkJCXN0cmlkZSArPSA0ICogc2tpcDsKKwkJCQkJCQl9CisJCQkJCQkJZWxzZQorCQkJCQkJCXsKKwkJCQkJCQkJc3RyaWRlICs9IHR5cGVTdHJpZGUoKHVuc2lnbmVkIGNoYXIpKCgqc3RyZWFtRWxlbWVudCAmIDB4MDAwRjAwMDApID4+IDE2KSk7CisJCQkJCQkJfQorCisJCQkJCQkJc3RyZWFtRWxlbWVudCsrOworCQkJCQkJfQorCisJCQkJCS8vCUFTU0VSVChzdHJpZGUgPT0gc3RyZWFtU3RyaWRlW3N0cmVhbV0pOyAgIC8vIEZJWE1FOiBQcm9iYWJseSBqdXN0IGlnbm9yZQorCisJCQkJCQkoY2hhciomKWJ1ZmZlciArPSBzdHJpZGUgKiBiYXNlOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMjogICAvLyBEYXRhIGRlZmluaXRpb24KKwkJCQkJaWYoKmVsZW1lbnQgJiAweDEwMDAwMDAwKSAgIC8vIERhdGEgc2tpcAorCQkJCQl7CisJCQkJCQlpbnQgc2tpcCA9ICgqZWxlbWVudCAmIDB4MDAwRjAwMDApID4+IDE2OworCisJCQkJCQkoY2hhciomKWJ1ZmZlciArPSA0ICogc2tpcDsKKwkJCQkJfQorCQkJCQllbHNlCisJCQkJCXsKKwkJCQkJCWludCB0eXBlID0gKCplbGVtZW50ICYgMHgwMDBGMDAwMCkgPj4gMTY7CisJCQkJCQlpbnQgaW5kZXggPSAoKmVsZW1lbnQgJiAweDAwMDAwMDBGKSA+PiAwOworCisJCQkJCQlzdzo6U3RyZWFtIGF0dHJpYnV0ZShyZXNvdXJjZSwgYnVmZmVyLCBzdHJpZGUpOworCisJCQkJCQlzd2l0Y2godHlwZSkKKwkJCQkJCXsKKwkJCQkJCWNhc2UgRDNEVlNEVF9GTE9BVDE6ICAgYXR0cmlidXRlLmRlZmluZShzdzo6U1RSRUFNVFlQRV9GTE9BVCwgMSk7IGJyZWFrOworCQkJCQkJY2FzZSBEM0RWU0RUX0ZMT0FUMjogICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX0ZMT0FULCAyKTsgYnJlYWs7CisJCQkJCQljYXNlIEQzRFZTRFRfRkxPQVQzOiAgIGF0dHJpYnV0ZS5kZWZpbmUoc3c6OlNUUkVBTVRZUEVfRkxPQVQsIDMpOyBicmVhazsKKwkJCQkJCWNhc2UgRDNEVlNEVF9GTE9BVDQ6ICAgYXR0cmlidXRlLmRlZmluZShzdzo6U1RSRUFNVFlQRV9GTE9BVCwgNCk7IGJyZWFrOworCQkJCQkJY2FzZSBEM0RWU0RUX0QzRENPTE9SOiBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX0NPTE9SLCA0KTsgYnJlYWs7CisJCQkJCQljYXNlIEQzRFZTRFRfVUJZVEU0OiAgIGF0dHJpYnV0ZS5kZWZpbmUoc3c6OlNUUkVBTVRZUEVfQllURSwgNCk7ICBicmVhazsKKwkJCQkJCWNhc2UgRDNEVlNEVF9TSE9SVDI6ICAgYXR0cmlidXRlLmRlZmluZShzdzo6U1RSRUFNVFlQRV9TSE9SVCwgMik7IGJyZWFrOworCQkJCQkJY2FzZSBEM0RWU0RUX1NIT1JUNDogICBhdHRyaWJ1dGUuZGVmaW5lKHN3OjpTVFJFQU1UWVBFX1NIT1JULCA0KTsgYnJlYWs7CisJCQkJCQlkZWZhdWx0OiAgICAgICAgICAgICAgIGF0dHJpYnV0ZS5kZWZpbmUoc3c6OlNUUkVBTVRZUEVfRkxPQVQsIDApOyBBU1NFUlQoZmFsc2UpOworCQkJCQkJfQorCisJCQkJCQlzd2l0Y2goaW5kZXgpCisJCQkJCQl7CisJCQkJCQljYXNlIEQzRFZTREVfUE9TSVRJT046ICAgICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OlBvc2l0aW9uLCBhdHRyaWJ1dGUpOyAgICAgYnJlYWs7CisJCQkJCQljYXNlIEQzRFZTREVfQkxFTkRXRUlHSFQ6ICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OkJsZW5kV2VpZ2h0LCBhdHRyaWJ1dGUpOyAgYnJlYWs7CisJCQkJCQljYXNlIEQzRFZTREVfQkxFTkRJTkRJQ0VTOiByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OkJsZW5kSW5kaWNlcywgYXR0cmlidXRlKTsgYnJlYWs7CisJCQkJCQljYXNlIEQzRFZTREVfTk9STUFMOiAgICAgICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6Ok5vcm1hbCwgYXR0cmlidXRlKTsgICAgICAgYnJlYWs7CisJCQkJCQljYXNlIEQzRFZTREVfUFNJWkU6ICAgICAgICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OlBvaW50U2l6ZSwgYXR0cmlidXRlKTsgICAgYnJlYWs7CisJCQkJCQljYXNlIEQzRFZTREVfRElGRlVTRTogICAgICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OkNvbG9yMCwgYXR0cmlidXRlKTsgICAgICAgYnJlYWs7CisJCQkJCQljYXNlIEQzRFZTREVfU1BFQ1VMQVI6ICAgICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OkNvbG9yMSwgYXR0cmlidXRlKTsgICAgICAgYnJlYWs7CisJCQkJCQljYXNlIEQzRFZTREVfVEVYQ09PUkQwOiAgICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OlRleENvb3JkMCwgYXR0cmlidXRlKTsgICAgYnJlYWs7CisJCQkJCQljYXNlIEQzRFZTREVfVEVYQ09PUkQxOiAgICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OlRleENvb3JkMSwgYXR0cmlidXRlKTsgICAgYnJlYWs7CisJCQkJCQljYXNlIEQzRFZTREVfVEVYQ09PUkQyOiAgICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OlRleENvb3JkMiwgYXR0cmlidXRlKTsgICAgYnJlYWs7CisJCQkJCQljYXNlIEQzRFZTREVfVEVYQ09PUkQzOiAgICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OlRleENvb3JkMywgYXR0cmlidXRlKTsgICAgYnJlYWs7CisJCQkJCQljYXNlIEQzRFZTREVfVEVYQ09PUkQ0OiAgICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OlRleENvb3JkNCwgYXR0cmlidXRlKTsgICAgYnJlYWs7CisJCQkJCQljYXNlIEQzRFZTREVfVEVYQ09PUkQ1OiAgICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OlRleENvb3JkNSwgYXR0cmlidXRlKTsgICAgYnJlYWs7CisJCQkJCQljYXNlIEQzRFZTREVfVEVYQ09PUkQ2OiAgICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OlRleENvb3JkNiwgYXR0cmlidXRlKTsgICAgYnJlYWs7CisJCQkJCQljYXNlIEQzRFZTREVfVEVYQ09PUkQ3OiAgICByZW5kZXJlci0+c2V0SW5wdXRTdHJlYW0oc3c6OlRleENvb3JkNywgYXR0cmlidXRlKTsgICAgYnJlYWs7CisJCQkJCS8vCWNhc2UgRDNEVlNERV9QT1NJVElPTjI6ICAgIHJlbmRlcmVyLT5zZXRJbnB1dFN0cmVhbShzdzo6UG9zaXRpb24xLCBhdHRyaWJ1dGUpOyAgICBicmVhazsKKwkJCQkJLy8JY2FzZSBEM0RWU0RFX05PUk1BTDI6ICAgICAgcmVuZGVyZXItPnNldElucHV0U3RyZWFtKHN3OjpOb3JtYWwxLCBhdHRyaWJ1dGUpOyAgICAgIGJyZWFrOworCQkJCQkJZGVmYXVsdDoKKwkJCQkJCQlBU1NFUlQoZmFsc2UpOworCQkJCQkJfQorCisJCQkJCQkoY2hhciomKWJ1ZmZlciArPSB0eXBlU3RyaWRlKHR5cGUpOworCQkJCQl9CisJCQkJCWJyZWFrOworCQkJCWNhc2UgMzogICAvLyBUZXNzZWxhdG9yIGRhdGEKKwkJCQkJVU5JTVBMRU1FTlRFRCgpOworCQkJCQlicmVhazsKKwkJCQljYXNlIDQ6ICAgLy8gQ29uc3RhbnQgZGF0YQorCQkJCQl7CisJCQkJCQlpbnQgY291bnQgPSAoKmVsZW1lbnQgJiAweDFFMDAwMDAwKSA+PiAyNTsKKwkJCQkJCWludCBpbmRleCA9ICgqZWxlbWVudCAmIDB4MDAwMDAwN0YpID4+IDA7CisKKwkJCQkJCVNldFZlcnRleFNoYWRlckNvbnN0YW50KGluZGV4LCBlbGVtZW50ICsgMSwgY291bnQpOworCisJCQkJCQllbGVtZW50ICs9IDQgKiBjb3VudDsKKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIDU6ICAgLy8gRXh0ZW5zaW9uCisJCQkJCVVOSU1QTEVNRU5URUQoKTsKKwkJCQkJYnJlYWs7CisJCQkJZGVmYXVsdDoKKwkJCQkJQVNTRVJUKGZhbHNlKTsKKwkJCQl9CisKKwkJCQllbGVtZW50Kys7CisJCQl9CisJCX0KKwl9CisKKwl2b2lkIERpcmVjdDNERGV2aWNlODo6YmluZEluZGV4QnVmZmVyKERpcmVjdDNESW5kZXhCdWZmZXI4ICppbmRleEJ1ZmZlcikKKwl7CisJCXN3OjpSZXNvdXJjZSAqcmVzb3VyY2UgPSAwOworCisJCWlmKGluZGV4QnVmZmVyKQorCQl7CisJCQlyZXNvdXJjZSA9IGluZGV4QnVmZmVyLT5nZXRSZXNvdXJjZSgpOworCQl9CisKKwkJcmVuZGVyZXItPnNldEluZGV4QnVmZmVyKHJlc291cmNlKTsKKwl9CisKKwl2b2lkIERpcmVjdDNERGV2aWNlODo6YmluZExpZ2h0cygpCisJeworCQlpZighbGlnaHRzRGlydHkpIHJldHVybjsKKworCQlMaWdodHM6Oml0ZXJhdG9yIGkgPSBsaWdodC5iZWdpbigpOworCQlpbnQgYWN0aXZlID0gMDsKKworCQkvLyBTZXQgYW5kIGVuYWJsZSByZW5kZXJlciBsaWdodHMKKwkJd2hpbGUoYWN0aXZlIDwgOCkKKwkJeworCQkJd2hpbGUoaSAhPSBsaWdodC5lbmQoKSAmJiAhaS0+c2Vjb25kLmVuYWJsZSkKKwkJCXsKKwkJCQlpKys7CisJCQl9CisKKwkJCWlmKGkgPT0gbGlnaHQuZW5kKCkpCisJCQl7CisJCQkJYnJlYWs7CisJCQl9CisKKwkJCWNvbnN0IExpZ2h0ICZsID0gaS0+c2Vjb25kOworCisJCQlzdzo6UG9pbnQgcG9zaXRpb24obC5Qb3NpdGlvbi54LCBsLlBvc2l0aW9uLnksIGwuUG9zaXRpb24ueik7CisJCQlzdzo6Q29sb3I8ZmxvYXQ+IGRpZmZ1c2UobC5EaWZmdXNlLnIsIGwuRGlmZnVzZS5nLCBsLkRpZmZ1c2UuYiwgbC5EaWZmdXNlLmEpOworCQkJc3c6OkNvbG9yPGZsb2F0PiBzcGVjdWxhcihsLlNwZWN1bGFyLnIsIGwuU3BlY3VsYXIuZywgbC5TcGVjdWxhci5iLCBsLlNwZWN1bGFyLmEpOworCQkJc3c6OkNvbG9yPGZsb2F0PiBhbWJpZW50KGwuQW1iaWVudC5yLCBsLkFtYmllbnQuZywgbC5BbWJpZW50LmIsIGwuQW1iaWVudC5hKTsKKwkJCXN3OjpWZWN0b3IgZGlyZWN0aW9uKGwuRGlyZWN0aW9uLngsIGwuRGlyZWN0aW9uLnksIGwuRGlyZWN0aW9uLnopOworCisJCQlyZW5kZXJlci0+c2V0TGlnaHREaWZmdXNlKGFjdGl2ZSwgZGlmZnVzZSk7CisJCQlyZW5kZXJlci0+c2V0TGlnaHRTcGVjdWxhcihhY3RpdmUsIHNwZWN1bGFyKTsKKwkJCXJlbmRlcmVyLT5zZXRMaWdodEFtYmllbnQoYWN0aXZlLCBhbWJpZW50KTsKKwkJCQorCQkJaWYobC5UeXBlID09IEQzRExJR0hUX0RJUkVDVElPTkFMKQorCQkJeworCQkJLy8JZ290byBuZXh0OyAgIC8vIEZJWE1FCisKKwkJCQkvLyBGSVhNRTogVW5zdXBwb3J0ZWQsIG1ha2UgaXQgYSBwb3NpdGlvbmFsIGxpZ2h0IGZhciBhd2F5IHdpdGhvdXQgZmFsbG9mZgorCQkJCXJlbmRlcmVyLT5zZXRMaWdodFBvc2l0aW9uKGFjdGl2ZSwgLTEwMDAgKiBkaXJlY3Rpb24pOworCQkJCXJlbmRlcmVyLT5zZXRMaWdodFJhbmdlKGFjdGl2ZSwgbC5SYW5nZSk7CisJCQkJcmVuZGVyZXItPnNldExpZ2h0QXR0ZW51YXRpb24oYWN0aXZlLCAxLCAwLCAwKTsKKwkJCX0KKwkJCWVsc2UgaWYobC5UeXBlID09IEQzRExJR0hUX1NQT1QpCisJCQl7CisJCQkvLwlnb3RvIG5leHQ7ICAgLy8gRklYTUUKKworCQkJCS8vIEZJWE1FOiBVbnN1cHBvcnRlZCwgbWFrZSBpdCBhIHBvc2l0aW9uYWwgbGlnaHQKKwkJCQlyZW5kZXJlci0+c2V0TGlnaHRQb3NpdGlvbihhY3RpdmUsIHBvc2l0aW9uKTsKKwkJCQlyZW5kZXJlci0+c2V0TGlnaHRSYW5nZShhY3RpdmUsIGwuUmFuZ2UpOworCQkJCXJlbmRlcmVyLT5zZXRMaWdodEF0dGVudWF0aW9uKGFjdGl2ZSwgbC5BdHRlbnVhdGlvbjAsIGwuQXR0ZW51YXRpb24xLCBsLkF0dGVudWF0aW9uMik7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJcmVuZGVyZXItPnNldExpZ2h0UG9zaXRpb24oYWN0aXZlLCBwb3NpdGlvbik7CisJCQkJcmVuZGVyZXItPnNldExpZ2h0UmFuZ2UoYWN0aXZlLCBsLlJhbmdlKTsKKwkJCQlyZW5kZXJlci0+c2V0TGlnaHRBdHRlbnVhdGlvbihhY3RpdmUsIGwuQXR0ZW51YXRpb24wLCBsLkF0dGVudWF0aW9uMSwgbC5BdHRlbnVhdGlvbjIpOworCQkJfQorCisJCQlyZW5kZXJlci0+c2V0TGlnaHRFbmFibGUoYWN0aXZlLCB0cnVlKTsKKworCQkJYWN0aXZlKys7CisKKwkvLwluZXh0OiAgIC8vIEZJWE1FCisJCQlpKys7CisJCX0KKworCQkvLyBSZW1haW5pbmcgbGlnaHRzIGFyZSBkaXNhYmxlZAorCQl3aGlsZShhY3RpdmUgPCA4KQorCQl7CisJCQlyZW5kZXJlci0+c2V0TGlnaHRFbmFibGUoYWN0aXZlLCBmYWxzZSk7CisKKwkJCWFjdGl2ZSsrOworCQl9CisKKwkJbGlnaHRzRGlydHk9IGZhbHNlOworCX0KKworCWJvb2wgRGlyZWN0M0REZXZpY2U4OjpiaW5kVmlld3BvcnQoKQorCXsKKwkJaWYodmlld3BvcnQuV2lkdGggPT0gMCB8fCB2aWV3cG9ydC5IZWlnaHQgPT0gMCkKKwkJeworCQkJcmV0dXJuIGZhbHNlOworCQl9CisKKwkJc3c6OlZpZXdwb3J0IHZpZXc7CisJCXZpZXcueDAgPSAoZmxvYXQpdmlld3BvcnQuWDsKKwkJdmlldy55MCA9IChmbG9hdCl2aWV3cG9ydC5ZICsgdmlld3BvcnQuSGVpZ2h0OworCQl2aWV3LndpZHRoID0gKGZsb2F0KXZpZXdwb3J0LldpZHRoOworCQl2aWV3LmhlaWdodCA9IC0oZmxvYXQpdmlld3BvcnQuSGVpZ2h0OworCQl2aWV3Lm1pblogPSB2aWV3cG9ydC5NaW5aOworCQl2aWV3Lm1heFogPSB2aWV3cG9ydC5NYXhaOworCisJCXJlbmRlcmVyLT5zZXRWaWV3cG9ydCh2aWV3KTsKKworCQlzdzo6UmVjdCBzY2lzc29yOworCQlzY2lzc29yLngwID0gdmlld3BvcnQuWDsKKwkJc2Npc3Nvci54MSA9IHZpZXdwb3J0LlggKyB2aWV3cG9ydC5XaWR0aDsKKwkJc2Npc3Nvci55MCA9IHZpZXdwb3J0Llk7CisJCXNjaXNzb3IueTEgPSB2aWV3cG9ydC5ZICsgdmlld3BvcnQuSGVpZ2h0OworCisJCXJlbmRlcmVyLT5zZXRTY2lzc29yKHNjaXNzb3IpOworCisJCXJldHVybiB0cnVlOworCX0KKworCXZvaWQgRGlyZWN0M0REZXZpY2U4OjpiaW5kVGV4dHVyZXMoKQorCXsKKwkJZm9yKGludCBzdGFnZSA9IDA7IHN0YWdlIDwgODsgc3RhZ2UrKykKKwkJeworCQkJRGlyZWN0M0RCYXNlVGV4dHVyZTggKmJhc2VUZXh0dXJlID0gdGV4dHVyZVtzdGFnZV07CisJCQlzdzo6UmVzb3VyY2UgKnJlc291cmNlID0gMDsKKworCQkJYm9vbCB0ZXh0dXJlVXNlZCA9IGZhbHNlOworCisJCQlpZihwaXhlbFNoYWRlcltwaXhlbFNoYWRlckhhbmRsZV0pCisJCQl7CisJCQkJdGV4dHVyZVVzZWQgPSBwaXhlbFNoYWRlcltwaXhlbFNoYWRlckhhbmRsZV0tPmdldFBpeGVsU2hhZGVyKCktPnVzZXNTYW1wbGVyKHN0YWdlKTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQl0ZXh0dXJlVXNlZCA9IHRydWU7ICAgLy8gRklYTUU6IENoZWNrIGZpeGVkLWZ1bmN0aW9uIHVzZT8KKwkJCX0KKworCQkJaWYoYmFzZVRleHR1cmUgJiYgdGV4dHVyZVVzZWQpCisJCQl7CisJCQkJcmVzb3VyY2UgPSBiYXNlVGV4dHVyZS0+Z2V0UmVzb3VyY2UoKTsKKwkJCX0KKworCQkJcmVuZGVyZXItPnNldFRleHR1cmVSZXNvdXJjZShzdGFnZSwgcmVzb3VyY2UpOworCisJCQlpZihiYXNlVGV4dHVyZSAmJiB0ZXh0dXJlVXNlZCkKKwkJCXsKKwkJCQlpbnQgbGV2ZWxDb3VudCA9IGJhc2VUZXh0dXJlLT5nZXRJbnRlcm5hbExldmVsQ291bnQoKTsKKwkJCQkKKwkJCQlpbnQgdGV4dHVyZUxPRCA9IGJhc2VUZXh0dXJlLT5HZXRMT0QoKTsKKwkJCQlpbnQgc3RhZ2VMT0QgPSB0ZXh0dXJlU3RhZ2VTdGF0ZVtzdGFnZV1bRDNEVFNTX01BWE1JUExFVkVMXTsKKwkJCQlpbnQgTE9EID0gdGV4dHVyZUxPRCA+IHN0YWdlTE9EID8gdGV4dHVyZUxPRCA6IHN0YWdlTE9EOworCisJCQkJaWYodGV4dHVyZVN0YWdlU3RhdGVbc3RhZ2VdW0QzRFRTU19NSVBGSUxURVJdID09IEQzRFRFWEZfTk9ORSkKKwkJCQl7CisJCQkJCUxPRCA9IDA7CisJCQkJfQorCisJCQkJc3dpdGNoKGJhc2VUZXh0dXJlLT5HZXRUeXBlKCkpCisJCQkJeworCQkJCWNhc2UgRDNEUlRZUEVfVEVYVFVSRToKKwkJCQkJeworCQkJCQkJRGlyZWN0M0RUZXh0dXJlOCAqdGV4dHVyZSA9IGR5bmFtaWNfY2FzdDxEaXJlY3QzRFRleHR1cmU4Kj4oYmFzZVRleHR1cmUpOworCQkJCQkJRGlyZWN0M0RTdXJmYWNlOCAqc3VyZmFjZTsKKworCQkJCQkJZm9yKGludCBtaXBtYXBMZXZlbCA9IDA7IG1pcG1hcExldmVsIDwgc3c6Ok1JUE1BUF9MRVZFTFM7IG1pcG1hcExldmVsKyspCisJCQkJCQl7CisJCQkJCQkJaW50IHN1cmZhY2VMZXZlbCA9IG1pcG1hcExldmVsOworCisJCQkJCQkJaWYoc3VyZmFjZUxldmVsIDwgTE9EKQorCQkJCQkJCXsKKwkJCQkJCQkJc3VyZmFjZUxldmVsID0gTE9EOworCQkJCQkJCX0KKworCQkJCQkJCWlmKHN1cmZhY2VMZXZlbCA8IDApCisJCQkJCQkJeworCQkJCQkJCQlzdXJmYWNlTGV2ZWwgPSAwOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIGlmKHN1cmZhY2VMZXZlbCA+PSBsZXZlbENvdW50KQorCQkJCQkJCXsKKwkJCQkJCQkJc3VyZmFjZUxldmVsID0gbGV2ZWxDb3VudCAtIDE7CisJCQkJCQkJfQorCisJCQkJCQkJc3VyZmFjZSA9IHRleHR1cmUtPmdldEludGVybmFsU3VyZmFjZUxldmVsKHN1cmZhY2VMZXZlbCk7CisJCQkJCQkJcmVuZGVyZXItPnNldFRleHR1cmVMZXZlbChzdGFnZSwgMCwgbWlwbWFwTGV2ZWwsIHN1cmZhY2UsIHN3OjpURVhUVVJFXzJEKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQljYXNlIEQzRFJUWVBFX0NVQkVURVhUVVJFOgorCQkJCQlmb3IoaW50IGZhY2UgPSAwOyBmYWNlIDwgNjsgZmFjZSsrKQorCQkJCQl7CisJCQkJCQlEaXJlY3QzREN1YmVUZXh0dXJlOCAqY3ViZVRleHR1cmUgPSBkeW5hbWljX2Nhc3Q8RGlyZWN0M0RDdWJlVGV4dHVyZTgqPihiYXNlVGV4dHVyZSk7CisJCQkJCQlEaXJlY3QzRFN1cmZhY2U4ICpzdXJmYWNlOworCisJCQkJCQlmb3IoaW50IG1pcG1hcExldmVsID0gMDsgbWlwbWFwTGV2ZWwgPCBzdzo6TUlQTUFQX0xFVkVMUzsgbWlwbWFwTGV2ZWwrKykKKwkJCQkJCXsKKwkJCQkJCQlpbnQgc3VyZmFjZUxldmVsID0gbWlwbWFwTGV2ZWw7CisKKwkJCQkJCQlpZihzdXJmYWNlTGV2ZWwgPCBMT0QpCisJCQkJCQkJeworCQkJCQkJCQlzdXJmYWNlTGV2ZWwgPSBMT0Q7CisJCQkJCQkJfQorCisJCQkJCQkJaWYoc3VyZmFjZUxldmVsIDwgMCkKKwkJCQkJCQl7CisJCQkJCQkJCXN1cmZhY2VMZXZlbCA9IDA7CisJCQkJCQkJfQorCQkJCQkJCWVsc2UgaWYoc3VyZmFjZUxldmVsID49IGxldmVsQ291bnQpCisJCQkJCQkJeworCQkJCQkJCQlzdXJmYWNlTGV2ZWwgPSBsZXZlbENvdW50IC0gMTsKKwkJCQkJCQl9CisKKwkJCQkJCQlzdXJmYWNlID0gY3ViZVRleHR1cmUtPmdldEludGVybmFsQ3ViZU1hcFN1cmZhY2UoKEQzRENVQkVNQVBfRkFDRVMpZmFjZSwgc3VyZmFjZUxldmVsKTsKKwkJCQkJCQlyZW5kZXJlci0+c2V0VGV4dHVyZUxldmVsKHN0YWdlLCBmYWNlLCBtaXBtYXBMZXZlbCwgc3VyZmFjZSwgc3c6OlRFWFRVUkVfQ1VCRSk7CisJCQkJCQl9CisJCQkJCX0KKwkJCQkJYnJlYWs7CisJCQkJY2FzZSBEM0RSVFlQRV9WT0xVTUVURVhUVVJFOgorCQkJCQl7CisJCQkJCQlEaXJlY3QzRFZvbHVtZVRleHR1cmU4ICp2b2x1bWVUZXh0dXJlID0gZHluYW1pY19jYXN0PERpcmVjdDNEVm9sdW1lVGV4dHVyZTgqPihiYXNlVGV4dHVyZSk7CisJCQkJCQlEaXJlY3QzRFZvbHVtZTggKnZvbHVtZTsKKworCQkJCQkJZm9yKGludCBtaXBtYXBMZXZlbCA9IDA7IG1pcG1hcExldmVsIDwgc3c6Ok1JUE1BUF9MRVZFTFM7IG1pcG1hcExldmVsKyspCisJCQkJCQl7CisJCQkJCQkJaW50IHN1cmZhY2VMZXZlbCA9IG1pcG1hcExldmVsOworCisJCQkJCQkJaWYoc3VyZmFjZUxldmVsIDwgTE9EKQorCQkJCQkJCXsKKwkJCQkJCQkJc3VyZmFjZUxldmVsID0gTE9EOworCQkJCQkJCX0KKworCQkJCQkJCWlmKHN1cmZhY2VMZXZlbCA8IDApCisJCQkJCQkJeworCQkJCQkJCQlzdXJmYWNlTGV2ZWwgPSAwOworCQkJCQkJCX0KKwkJCQkJCQllbHNlIGlmKHN1cmZhY2VMZXZlbCA+PSBsZXZlbENvdW50KQorCQkJCQkJCXsKKwkJCQkJCQkJc3VyZmFjZUxldmVsID0gbGV2ZWxDb3VudCAtIDE7CisJCQkJCQkJfQorCisJCQkJCQkJdm9sdW1lID0gdm9sdW1lVGV4dHVyZS0+Z2V0SW50ZXJuYWxWb2x1bWVMZXZlbChzdXJmYWNlTGV2ZWwpOworCQkJCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlTGV2ZWwoc3RhZ2UsIDAsIG1pcG1hcExldmVsLCB2b2x1bWUsIHN3OjpURVhUVVJFXzNEKTsKKwkJCQkJCX0KKwkJCQkJfQorCQkJCQlicmVhazsKKwkJCQlkZWZhdWx0OgorCQkJCQlVTklNUExFTUVOVEVEKCk7CisJCQkJfQorCQkJfQorCQkJZWxzZQorCQkJeworCQkJCXJlbmRlcmVyLT5zZXRUZXh0dXJlTGV2ZWwoc3RhZ2UsIDAsIDAsIDAsIHN3OjpURVhUVVJFX05VTEwpOworCQkJfQorCQl9CisJfQorCisJdm9pZCBEaXJlY3QzRERldmljZTg6OmJpbmRDdXJzb3IoKQorCXsKKwkJaWYoc2hvd0N1cnNvcikKKwkJeworCQkJc3c6OkZyYW1lQnVmZmVyOjpzZXRDdXJzb3JJbWFnZShjdXJzb3IpOworCisJCQlIQ1VSU09SIG9sZEN1cnNvciA9IFNldEN1cnNvcihudWxsQ3Vyc29yKTsKKwkJCQorCQkJaWYob2xkQ3Vyc29yICE9IG51bGxDdXJzb3IpCisJCQl7CisJCQkJd2luMzJDdXJzb3IgPSBvbGRDdXJzb3I7CisJCQl9CisJCX0KKwkJZWxzZQorCQl7CisJCQlzdzo6RnJhbWVCdWZmZXI6OnNldEN1cnNvckltYWdlKDApOworCisJCQlpZihHZXRDdXJzb3IoKSA9PSBudWxsQ3Vyc29yKQorCQkJeworCQkJCVNldEN1cnNvcih3aW4zMkN1cnNvcik7CisJCQl9CisJCX0KKwl9CisKKwlsb25nIERpcmVjdDNERGV2aWNlODo6dXBkYXRlVm9sdW1lKElEaXJlY3QzRFZvbHVtZTggKnNvdXJjZVZvbHVtZSwgSURpcmVjdDNEVm9sdW1lOCAqZGVzdGluYXRpb25Wb2x1bWUpCisJeworCQlUUkFDRSgiSURpcmVjdDNEVm9sdW1lOCAqc291cmNlVm9sdW1lID0gMHglMC44cCwgSURpcmVjdDNEVm9sdW1lOCAqZGVzdGluYXRpb25Wb2x1bWUgPSAweCUwLjhwIiwgc291cmNlVm9sdW1lLCBkZXN0aW5hdGlvblZvbHVtZSk7CisKKwkJaWYoIXNvdXJjZVZvbHVtZSB8fCAhZGVzdGluYXRpb25Wb2x1bWUpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJRDNEVk9MVU1FX0RFU0Mgc291cmNlRGVzY3JpcHRpb247CisJCUQzRFZPTFVNRV9ERVNDIGRlc3RpbmF0aW9uRGVzY3JpcHRpb247CisKKwkJc291cmNlVm9sdW1lLT5HZXREZXNjKCZzb3VyY2VEZXNjcmlwdGlvbik7CisJCWRlc3RpbmF0aW9uVm9sdW1lLT5HZXREZXNjKCZkZXN0aW5hdGlvbkRlc2NyaXB0aW9uKTsKKworCQlpZihzb3VyY2VEZXNjcmlwdGlvbi5Qb29sICAgICAgIT0gRDNEUE9PTF9TWVNURU1NRU0gfHwKKwkJICAgZGVzdGluYXRpb25EZXNjcmlwdGlvbi5Qb29sICE9IEQzRFBPT0xfREVGQVVMVCB8fAorCQkgICBzb3VyY2VEZXNjcmlwdGlvbi5Gb3JtYXQgIT0gZGVzdGluYXRpb25EZXNjcmlwdGlvbi5Gb3JtYXQgfHwKKwkJICAgc291cmNlRGVzY3JpcHRpb24uV2lkdGggICE9IGRlc3RpbmF0aW9uRGVzY3JpcHRpb24uV2lkdGggfHwKKwkJICAgc291cmNlRGVzY3JpcHRpb24uSGVpZ2h0ICE9IGRlc3RpbmF0aW9uRGVzY3JpcHRpb24uSGVpZ2h0KQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCUQzRExPQ0tFRF9CT1ggc291cmNlTG9jazsKKwkJRDNETE9DS0VEX0JPWCBkZXN0aW5hdGlvbkxvY2s7CisKKwkJc291cmNlVm9sdW1lLT5Mb2NrQm94KCZzb3VyY2VMb2NrLCAwLCAwKTsKKwkJZGVzdGluYXRpb25Wb2x1bWUtPkxvY2tCb3goJmRlc3RpbmF0aW9uTG9jaywgMCwgMCk7CisKKwkJaWYoc291cmNlTG9jay5Sb3dQaXRjaCAhPSBkZXN0aW5hdGlvbkxvY2suUm93UGl0Y2ggfHwKKwkJICAgc291cmNlTG9jay5TbGljZVBpdGNoICE9IGRlc3RpbmF0aW9uTG9jay5TbGljZVBpdGNoKQorCQl7CisJCQlVTklNUExFTUVOVEVEKCk7CisJCX0KKworCQltZW1jcHkoZGVzdGluYXRpb25Mb2NrLnBCaXRzLCBzb3VyY2VMb2NrLnBCaXRzLCBzb3VyY2VMb2NrLlNsaWNlUGl0Y2ggKiBzb3VyY2VEZXNjcmlwdGlvbi5EZXB0aCk7CisKKwkJc291cmNlVm9sdW1lLT5VbmxvY2tCb3goKTsKKwkJZGVzdGluYXRpb25Wb2x1bWUtPlVubG9ja0JveCgpOworCQkKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwl2b2lkIERpcmVjdDNERGV2aWNlODo6Y29uZmlndXJlRlBVKCkKKwl7CisJCXVuc2lnbmVkIHNob3J0IGN3OworCisJCV9fYXNtCisJCXsKKwkJCWZzdGN3IGN3CisJCQlhbmQgY3csIDB4RkNGQyAgIC8vIFNpbmdsZS1wcmVjaXNpb24KKwkJCW9yIGN3LCAweDAwM0YgICAgLy8gTWFzayBhbGwgZXhjZXB0aW9ucworCQkJYW5kIGN3LCAweEYzRkYgICAvLyBSb3VuZCB0byBuZWFyZXN0CisJCQlmbGRjdyBjdworCQl9CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDgvRGlyZWN0M0REZXZpY2U4LmhwcCBiL3NyYy9EM0Q4L0RpcmVjdDNERGV2aWNlOC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjAzODQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9EM0Q4L0RpcmVjdDNERGV2aWNlOC5ocHAKQEAgLTAsMCArMSwyNzIgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgRDNEOF9EaXJlY3QzRERldmljZThfaHBwCisjZGVmaW5lIEQzRDhfRGlyZWN0M0REZXZpY2U4X2hwcAorCisjaW5jbHVkZSAiVW5rbm93bi5ocHAiCisKKyNpbmNsdWRlICJEaXJlY3QzRDguaHBwIgorI2luY2x1ZGUgIkRpcmVjdDNEU3RhdGVCbG9jazguaHBwIgorI2luY2x1ZGUgIkRpcmVjdDNEVmVydGV4RGVjbGFyYXRpb244LmhwcCIKKyNpbmNsdWRlICJEaXJlY3QzRFN3YXBDaGFpbjguaHBwIgorCisjaW5jbHVkZSAiU3RyZWFtLmhwcCIKKworI2luY2x1ZGUgPGQzZDguaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxtYXA+CisKK25hbWVzcGFjZSBzdworeworCWNsYXNzIFJlbmRlcmVyOworCWNsYXNzIENvbnRleHQ7Cit9CisKK25hbWVzcGFjZSBEM0Q4Cit7CisJY2xhc3MgRGlyZWN0M0RQaXhlbFNoYWRlcjg7CisJY2xhc3MgRGlyZWN0M0RWZXJ0ZXhTaGFkZXI4OworCWNsYXNzIERpcmVjdDNEU3VyZmFjZTg7CisJY2xhc3MgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4OworCWNsYXNzIERpcmVjdDNESW5kZXhCdWZmZXI4OworCisJY2xhc3MgRGlyZWN0M0REZXZpY2U4IDogcHVibGljIElEaXJlY3QzRERldmljZTgsIHByb3RlY3RlZCBVbmtub3duCisJeworCXB1YmxpYzoKKwkJRGlyZWN0M0REZXZpY2U4KGNvbnN0IEhJTlNUQU5DRSBpbnN0YW5jZSwgRGlyZWN0M0Q4ICpkM2Q4LCB1bnNpZ25lZCBpbnQgYWRhcHRlciwgRDNEREVWVFlQRSBkZXZpY2VUeXBlLCBIV05EIGZvY3VzV2luZG93LCB1bnNpZ25lZCBsb25nIGJlaGF2aW91ckZsYWdzLCBEM0RQUkVTRU5UX1BBUkFNRVRFUlMgKnByZXNlbnRQYXJhbWV0ZXJzKTsKKworCQl2aXJ0dWFsIH5EaXJlY3QzRERldmljZTgoKTsKKworCQkvLyBJVW5rbm93biBtZXRob2RzCisJCWxvbmcgX19zdGRjYWxsIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgQWRkUmVmKCk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFJlbGVhc2UoKTsKKworCQkvLyBJRGlyZWN0M0REZXZpY2U4IG1ldGhvZHMKKwkJbG9uZyBfX3N0ZGNhbGwgQXBwbHlTdGF0ZUJsb2NrKHVuc2lnbmVkIGxvbmcgdG9rZW4pOworCQlsb25nIF9fc3RkY2FsbCBCZWdpblNjZW5lKCk7CisJCWxvbmcgX19zdGRjYWxsIEJlZ2luU3RhdGVCbG9jaygpOworCQlsb25nIF9fc3RkY2FsbCBDYXB0dXJlU3RhdGVCbG9jayh1bnNpZ25lZCBsb25nIHRva2VuKTsKKwkJbG9uZyBfX3N0ZGNhbGwgQ2xlYXIodW5zaWduZWQgbG9uZyBjb3VudCwgY29uc3QgRDNEUkVDVCAqcmVjdHMsIHVuc2lnbmVkIGxvbmcgZmxhZ3MsIHVuc2lnbmVkIGxvbmcgY29sb3IsIGZsb2F0IHosIHVuc2lnbmVkIGxvbmcgc3RlbmNpbCk7CisJCWxvbmcgX19zdGRjYWxsIENvcHlSZWN0cyhJRGlyZWN0M0RTdXJmYWNlOCAqc291cmNlU3VyZmFjZSwgY29uc3QgUkVDVCAqc291cmNlUmVjdHNBcnJheSwgdW5zaWduZWQgaW50IHJlY3RzLCBJRGlyZWN0M0RTdXJmYWNlOCAqZGVzdGluYXRpb25TdXJmYWNlLCBjb25zdCBQT0lOVCAqZGVzdFBvaW50c0FycmF5KTsKKwkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlQWRkaXRpb25hbFN3YXBDaGFpbihEM0RQUkVTRU5UX1BBUkFNRVRFUlMgKnByZXNlbnRQYXJhbWV0ZXJzLCBJRGlyZWN0M0RTd2FwQ2hhaW44ICoqc3dhcENoYWluKTsKKwkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlQ3ViZVRleHR1cmUodW5zaWduZWQgaW50IGVkZ2VMZW5ndGgsIHVuc2lnbmVkIGludCBsZXZlbHMsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIEQzREZPUk1BVCBmb3JtYXQsIEQzRFBPT0wgcG9vbCwgSURpcmVjdDNEQ3ViZVRleHR1cmU4ICoqY3ViZVRleHR1cmUpOworCQlsb25nIF9fc3RkY2FsbCBDcmVhdGVEZXB0aFN0ZW5jaWxTdXJmYWNlKHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgRDNERk9STUFUIGZvcm1hdCwgRDNETVVMVElTQU1QTEVfVFlQRSBtdWx0aVNhbXBsZSwgSURpcmVjdDNEU3VyZmFjZTggKipzdXJmYWNlKTsKKwkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlSW1hZ2VTdXJmYWNlKHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgRDNERk9STUFUIGZvcm1hdCwgSURpcmVjdDNEU3VyZmFjZTggKipzdXJmYWNlKTsKKwkJbG9uZyBfX3N0ZGNhbGwgQ3JlYXRlSW5kZXhCdWZmZXIodW5zaWduZWQgaW50IGxlbmd0aCwgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sLCBJRGlyZWN0M0RJbmRleEJ1ZmZlcjggKippbmRleEJ1ZmZlcik7CisJCWxvbmcgX19zdGRjYWxsIENyZWF0ZVBpeGVsU2hhZGVyKGNvbnN0IHVuc2lnbmVkIGxvbmcgKmZ1bmN0aW9uLCB1bnNpZ25lZCBsb25nICpoYW5kbGUpOworCQlsb25nIF9fc3RkY2FsbCBDcmVhdGVSZW5kZXJUYXJnZXQodW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RNVUxUSVNBTVBMRV9UWVBFIG11bHRpU2FtcGxlLCBpbnQgbG9ja2FibGUsIElEaXJlY3QzRFN1cmZhY2U4ICoqc3VyZmFjZSk7CisJCWxvbmcgX19zdGRjYWxsIENyZWF0ZVN0YXRlQmxvY2soRDNEU1RBVEVCTE9DS1RZUEUgdHlwZSwgdW5zaWduZWQgbG9uZyAqdG9rZW4pOworCQlsb25nIF9fc3RkY2FsbCBDcmVhdGVUZXh0dXJlKHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgdW5zaWduZWQgaW50IGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sLCBJRGlyZWN0M0RUZXh0dXJlOCAqKnRleHR1cmUpOworCQlsb25nIF9fc3RkY2FsbCBDcmVhdGVWZXJ0ZXhCdWZmZXIodW5zaWduZWQgaW50IGxlbmd0aCwgdW5zaWduZWQgbG9uZyB1c2FnZSwgdW5zaWduZWQgbG9uZyBGVkYsIEQzRFBPT0wsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjggKip2ZXJ0ZXhCdWZmZXIpOworCQlsb25nIF9fc3RkY2FsbCBDcmVhdGVWZXJ0ZXhTaGFkZXIoY29uc3QgdW5zaWduZWQgbG9uZyAqZGVjbGFyYXRpb24sIGNvbnN0IHVuc2lnbmVkIGxvbmcgKmZ1bmN0aW9uLCB1bnNpZ25lZCBsb25nICpoYW5kbGUsIHVuc2lnbmVkIGxvbmcgdXNhZ2UpOworCQlsb25nIF9fc3RkY2FsbCBDcmVhdGVWb2x1bWVUZXh0dXJlKHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgdW5zaWduZWQgaW50IGRlcHRoLCB1bnNpZ25lZCBpbnQgbGV2ZWxzLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wsIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4ICoqdm9sdW1lVGV4dHVyZSk7CisJCWxvbmcgX19zdGRjYWxsIERlbGV0ZVBhdGNoKHVuc2lnbmVkIGludCBoYW5kbGUpOworCQlsb25nIF9fc3RkY2FsbCBEZWxldGVQaXhlbFNoYWRlcih1bnNpZ25lZCBsb25nIGhhbmRsZSk7CisJCWxvbmcgX19zdGRjYWxsIERlbGV0ZVN0YXRlQmxvY2sodW5zaWduZWQgbG9uZyB0b2tlbik7CisJCWxvbmcgX19zdGRjYWxsIERlbGV0ZVZlcnRleFNoYWRlcih1bnNpZ25lZCBsb25nIGhhbmRsZSk7CisJCWxvbmcgX19zdGRjYWxsIERyYXdJbmRleGVkUHJpbWl0aXZlKEQzRFBSSU1JVElWRVRZUEUgdHlwZSwgdW5zaWduZWQgaW50IG1pbkluZGV4LCB1bnNpZ25lZCBpbnQgbnVtVmVydGljZXMsIHVuc2lnbmVkIGludCBzdGFydEluZGV4LCB1bnNpZ25lZCBpbnQgcHJpbWl0aXZlQ291bnQpOworCQlsb25nIF9fc3RkY2FsbCBEcmF3SW5kZXhlZFByaW1pdGl2ZVVQKEQzRFBSSU1JVElWRVRZUEUgdHlwZSwgdW5zaWduZWQgaW50IG1pblZlcnRleEluZGV4LCB1bnNpZ25lZCBpbnQgbnVtVmVydGV4SW5kaWNlcywgdW5zaWduZWQgaW50IFByaW1pdGl2ZUNvdW50LCBjb25zdCB2b2lkICppbmRleERhdGEsIEQzREZPUk1BVCBpbmRleERhdGFGb3JtYXQsIGNvbnN0IHZvaWQgKnZlcnRleFN0cmVhbVplcm9EYXRhLCB1bnNpZ25lZCBpbnQgVmVydGV4U3RyZWFtWmVyb1N0cmlkZSk7CisJCWxvbmcgX19zdGRjYWxsIERyYXdQcmltaXRpdmUoRDNEUFJJTUlUSVZFVFlQRSBwcmltaXRpdmVUeXBlLCB1bnNpZ25lZCBpbnQgc3RhcnRWZXJ0ZXgsIHVuc2lnbmVkIGludCBwcmltaXZlQ291bnQpOworCQlsb25nIF9fc3RkY2FsbCBEcmF3UHJpbWl0aXZlVVAoRDNEUFJJTUlUSVZFVFlQRSBwcmltaXRpdmVUeXBlLCB1bnNpZ25lZCBpbnQgcHJpbWl0aXZlQ291bnQsIGNvbnN0IHZvaWQgKnZlcnRleFN0cmVhbVplcm9EYXRhLCB1bnNpZ25lZCBpbnQgdmVydGV4U3RyZWFtWmVyb1N0cmlkZSk7CisJCWxvbmcgX19zdGRjYWxsIERyYXdSZWN0UGF0Y2godW5zaWduZWQgaW50IGhhbmRsZSwgY29uc3QgZmxvYXQgKm51bVNlZ3MsIGNvbnN0IEQzRFJFQ1RQQVRDSF9JTkZPICpyZWN0UGF0Y2hJbmZvKTsKKwkJbG9uZyBfX3N0ZGNhbGwgRHJhd1RyaVBhdGNoKHVuc2lnbmVkIGludCBoYW5kbGUsIGNvbnN0IGZsb2F0ICpudW1TZWdzLCBjb25zdCBEM0RUUklQQVRDSF9JTkZPICp0cmlQYXRjaEluZm8pOworCQlsb25nIF9fc3RkY2FsbCBFbmRTY2VuZSgpOworCQlsb25nIF9fc3RkY2FsbCBFbmRTdGF0ZUJsb2NrKHVuc2lnbmVkIGxvbmcgKnRva2VuKTsKKwkJdW5zaWduZWQgaW50IF9fc3RkY2FsbCBHZXRBdmFpbGFibGVUZXh0dXJlTWVtKCk7CisJCWxvbmcgX19zdGRjYWxsIEdldEJhY2tCdWZmZXIodW5zaWduZWQgaW50IGluZGV4LCBEM0RCQUNLQlVGRkVSX1RZUEUgdHlwZSwgSURpcmVjdDNEU3VyZmFjZTggKipiYWNrQnVmZmVyKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0Q2xpcFBsYW5lKHVuc2lnbmVkIGxvbmcgaW5kZXgsIGZsb2F0ICpwbGFuZSk7CisJCWxvbmcgX19zdGRjYWxsIEdldENsaXBTdGF0dXMoRDNEQ0xJUFNUQVRVUzggKmNsaXBTdGF0dXMpOworCQlsb25nIF9fc3RkY2FsbCBHZXRDcmVhdGlvblBhcmFtZXRlcnMoRDNEREVWSUNFX0NSRUFUSU9OX1BBUkFNRVRFUlMgKnBhcmFtZXRlcnMpOworCQlsb25nIF9fc3RkY2FsbCBHZXRDdXJyZW50VGV4dHVyZVBhbGV0dGUodW5zaWduZWQgaW50ICpwYWxldHRlTnVtYmVyKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0RGVwdGhTdGVuY2lsU3VyZmFjZShJRGlyZWN0M0RTdXJmYWNlOCAqKmRlcHRoU3RlbmNpbFN1cmZhY2UpOworCQlsb25nIF9fc3RkY2FsbCBHZXREZXZpY2VDYXBzKEQzRENBUFM4ICpjYXBzKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0RGlyZWN0M0QoSURpcmVjdDNEOCAqKkQzRCk7CisJCWxvbmcgX19zdGRjYWxsIEdldERpc3BsYXlNb2RlKEQzRERJU1BMQVlNT0RFICptb2RlKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0RnJvbnRCdWZmZXIoSURpcmVjdDNEU3VyZmFjZTggKmRlc3RTdXJmYWNlKTsKKwkJdm9pZCBfX3N0ZGNhbGwgR2V0R2FtbWFSYW1wKEQzREdBTU1BUkFNUCAqcmFtcCk7CisJCWxvbmcgX19zdGRjYWxsIEdldEluZGljZXMoSURpcmVjdDNESW5kZXhCdWZmZXI4ICoqaW5kZXhEYXRhLCB1bnNpZ25lZCBpbnQgKmJhc2VWZXJ0ZXhJbmRleCk7CisJCWxvbmcgX19zdGRjYWxsIEdldEluZm8odW5zaWduZWQgbG9uZyBkZXZJbmZvSUQsIHZvaWQgKmRldkluZm9TdHJ1Y3QsIHVuc2lnbmVkIGxvbmcgZGV2SW5mb1N0cnVjdFNpemUpOworCQlsb25nIF9fc3RkY2FsbCBHZXRMaWdodCh1bnNpZ25lZCBsb25nIGluZGV4LCBEM0RMSUdIVDggKnApOworCQlsb25nIF9fc3RkY2FsbCBHZXRMaWdodEVuYWJsZSh1bnNpZ25lZCBsb25nIGluZGV4ICwgaW50ICplbmFibGUpOworCQlsb25nIF9fc3RkY2FsbCBHZXRNYXRlcmlhbChEM0RNQVRFUklBTDggKm1hdGVyaWFsKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0UGFsZXR0ZUVudHJpZXModW5zaWduZWQgaW50IHBhbGV0dGVOdW1iZXIsIFBBTEVUVEVFTlRSWSAqZW50cmllcyk7CisJCWxvbmcgX19zdGRjYWxsIEdldFBpeGVsU2hhZGVyKHVuc2lnbmVkIGxvbmcgKmhhbmRsZSk7CisJCWxvbmcgX19zdGRjYWxsIEdldFBpeGVsU2hhZGVyRnVuY3Rpb24odW5zaWduZWQgbG9uZyBoYW5kbGUsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemVPZkRhdGEpOworCQlsb25nIF9fc3RkY2FsbCBHZXRQaXhlbFNoYWRlckNvbnN0YW50KHVuc2lnbmVkIGxvbmcgc3RhcnRSZWdpc3Rlciwgdm9pZCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBsb25nIGNvbnN0YW50Q291bnQpOworCQlsb25nIF9fc3RkY2FsbCBHZXRSYXN0ZXJTdGF0dXMoRDNEUkFTVEVSX1NUQVRVUyAqcmFzdGVyU3RhdHVzKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0UmVuZGVyU3RhdGUoRDNEUkVOREVSU1RBVEVUWVBFIFN0YXRlLCB1bnNpZ25lZCBsb25nICp2YWx1ZSk7CisJCWxvbmcgX19zdGRjYWxsIEdldFJlbmRlclRhcmdldChJRGlyZWN0M0RTdXJmYWNlOCAqKnJlbmRlclRhcmdldCk7CisJCWxvbmcgX19zdGRjYWxsIEdldFN0cmVhbVNvdXJjZSh1bnNpZ25lZCBpbnQgc3RyZWFtTnVtYmVyLCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4ICoqc3RyZWFtRGF0YSwgdW5zaWduZWQgaW50ICpzdHJpZGUpOworCQlsb25nIF9fc3RkY2FsbCBHZXRUZXh0dXJlKHVuc2lnbmVkIGxvbmcgc3RhZ2UsIElEaXJlY3QzREJhc2VUZXh0dXJlOCAqKnRleHR1cmUpOworCQlsb25nIF9fc3RkY2FsbCBHZXRUZXh0dXJlU3RhZ2VTdGF0ZSh1bnNpZ25lZCBsb25nIHN0YWdlLCBEM0RURVhUVVJFU1RBR0VTVEFURVRZUEUgdHlwZSwgdW5zaWduZWQgbG9uZyAqdmFsdWUpOworCQlsb25nIF9fc3RkY2FsbCBHZXRUcmFuc2Zvcm0oRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHN0YXRlLCBEM0RNQVRSSVggKm1hdHJpeCk7CisJCWxvbmcgX19zdGRjYWxsIEdldFZlcnRleFNoYWRlcih1bnNpZ25lZCBsb25nICpoYW5kbGUpOworCQlsb25nIF9fc3RkY2FsbCBHZXRWZXJ0ZXhTaGFkZXJDb25zdGFudCh1bnNpZ25lZCBsb25nIHN0YXJ0UmVnaXN0ZXIsIHZvaWQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgbG9uZyBjb25zdGFudENvdW50KTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0VmVydGV4U2hhZGVyRGVjbGFyYXRpb24odW5zaWduZWQgbG9uZyBoYW5kbGUsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpOworCQlsb25nIF9fc3RkY2FsbCBHZXRWZXJ0ZXhTaGFkZXJGdW5jdGlvbih1bnNpZ25lZCBsb25nIGhhbmRsZSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSk7CisJCWxvbmcgX19zdGRjYWxsIEdldFZpZXdwb3J0KEQzRFZJRVdQT1JUOCAqdmlld3BvcnQpOworCQlsb25nIF9fc3RkY2FsbCBMaWdodEVuYWJsZSh1bnNpZ25lZCBsb25nIGluZGV4LCBpbnQgZW5hYmxlKTsKKwkJbG9uZyBfX3N0ZGNhbGwgTXVsdGlwbHlUcmFuc2Zvcm0oRDNEVFJBTlNGT1JNU1RBVEVUWVBFIHN0YXRlLCBjb25zdCBEM0RNQVRSSVggKm1hdHJpeCk7CisJCWxvbmcgX19zdGRjYWxsIFByZXNlbnQoY29uc3QgUkVDVCAqc291cmNlUmVjdCwgY29uc3QgUkVDVCAqZGVzdFJlY3QsIEhXTkQgZGVzdFdpbmRvd092ZXJyaWRlLCBjb25zdCBSR05EQVRBICpkaXJ0eVJlZ2lvbik7CisJCWxvbmcgX19zdGRjYWxsIFByb2Nlc3NWZXJ0aWNlcyh1bnNpZ25lZCBpbnQgc3JjU3RhcnRJbmRleCwgdW5zaWduZWQgaW50IGRlc3RJbmRleCwgdW5zaWduZWQgaW50IHZlcnRleENvdW50LCBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4ICpkZXN0QnVmZmVyLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKwkJbG9uZyBfX3N0ZGNhbGwgUmVzZXQoRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycyk7CisJCWxvbmcgX19zdGRjYWxsIFJlc291cmNlTWFuYWdlckRpc2NhcmRCeXRlcyh1bnNpZ25lZCBsb25nIGJ5dGVzKTsKKwkJbG9uZyBfX3N0ZGNhbGwgU2V0Q2xpcFBsYW5lKHVuc2lnbmVkIGxvbmcgaW5kZXgsIGNvbnN0IGZsb2F0ICpwbGFuZSk7CisJCWxvbmcgX19zdGRjYWxsIFNldENsaXBTdGF0dXMoY29uc3QgRDNEQ0xJUFNUQVRVUzggKmNsaXBTdGF0dXMpOworCQlsb25nIF9fc3RkY2FsbCBTZXRDdXJyZW50VGV4dHVyZVBhbGV0dGUodW5zaWduZWQgaW50IHBhbGV0dGVOdW1iZXIpOworCQl2b2lkIF9fc3RkY2FsbCBTZXRDdXJzb3JQb3NpdGlvbihpbnQgeCwgaW50IHksIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCQl2b2lkIF9fc3RkY2FsbCBTZXRDdXJzb3JQb3NpdGlvbih1bnNpZ25lZCBpbnQgeCwgdW5zaWduZWQgaW50IHksIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCQlsb25nIF9fc3RkY2FsbCBTZXRDdXJzb3JQcm9wZXJ0aWVzKHVuc2lnbmVkIGludCB4LCB1bnNpZ25lZCBpbnQgeSwgSURpcmVjdDNEU3VyZmFjZTggKmN1cnNvckJpdG1hcCk7CisJCXZvaWQgX19zdGRjYWxsIFNldEdhbW1hUmFtcCh1bnNpZ25lZCBsb25nIGZsYWdzLCBjb25zdCBEM0RHQU1NQVJBTVAgKnJhbXApOworCQlsb25nIF9fc3RkY2FsbCBTZXRJbmRpY2VzKElEaXJlY3QzREluZGV4QnVmZmVyOCAqaW5kZXhEYXRhLCB1bnNpZ25lZCBpbnQgYmFzZVZlcnRleEluZGV4KTsKKwkJbG9uZyBfX3N0ZGNhbGwgU2V0TGlnaHQodW5zaWduZWQgbG9uZyBpbmRleCwgY29uc3QgRDNETElHSFQ4ICpsaWdodCk7CisJCWxvbmcgX19zdGRjYWxsIFNldE1hdGVyaWFsKGNvbnN0IEQzRE1BVEVSSUFMOCAqbWF0ZXJpYWwpOworCQlsb25nIF9fc3RkY2FsbCBTZXRQYWxldHRlRW50cmllcyh1bnNpZ25lZCBpbnQgcGFsZXR0ZU51bWJlciwgY29uc3QgUEFMRVRURUVOVFJZICplbnRyaWVzKTsKKwkJbG9uZyBfX3N0ZGNhbGwgU2V0UGl4ZWxTaGFkZXIodW5zaWduZWQgbG9uZyBzaGFkZXIpOworCQlsb25nIF9fc3RkY2FsbCBTZXRQaXhlbFNoYWRlckNvbnN0YW50KHVuc2lnbmVkIGxvbmcgc3RhcnRSZWdpc3RlciwgY29uc3Qgdm9pZCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBsb25nIGNvbnN0YW50Q291bnQpOworCQlsb25nIF9fc3RkY2FsbCBTZXRSZW5kZXJTdGF0ZShEM0RSRU5ERVJTVEFURVRZUEUgc3RhdGUsIHVuc2lnbmVkIGxvbmcgdmFsdWUpOworCQlsb25nIF9fc3RkY2FsbCBTZXRSZW5kZXJUYXJnZXQoSURpcmVjdDNEU3VyZmFjZTggKnJlbmRlclRhcmdldCwgSURpcmVjdDNEU3VyZmFjZTggKm5ld1pTdGVuY2lsKTsKKwkJbG9uZyBfX3N0ZGNhbGwgU2V0U3RyZWFtU291cmNlKHVuc2lnbmVkIGludCBzdHJlYW1OdW1iZXIsIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjggKnN0cmVhbURhdGEsIHVuc2lnbmVkIGludCBzdHJpZGUpOworCQlsb25nIF9fc3RkY2FsbCBTZXRUZXh0dXJlKHVuc2lnbmVkIGxvbmcgc3RhZ2UsIElEaXJlY3QzREJhc2VUZXh0dXJlOCAqdGV4dHVyZSk7CisJCWxvbmcgX19zdGRjYWxsIFNldFRleHR1cmVTdGFnZVN0YXRlKHVuc2lnbmVkIGxvbmcgc3RhZ2UsIEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSB0eXBlLCB1bnNpZ25lZCBsb25nIHZhbHVlKTsKKwkJbG9uZyBfX3N0ZGNhbGwgU2V0VHJhbnNmb3JtKEQzRFRSQU5TRk9STVNUQVRFVFlQRSBzdGF0ZSwgY29uc3QgRDNETUFUUklYICptYXRyaXgpOworCQlsb25nIF9fc3RkY2FsbCBTZXRWZXJ0ZXhTaGFkZXIodW5zaWduZWQgbG9uZyBoYW5kbGUpOworCQlsb25nIF9fc3RkY2FsbCBTZXRWZXJ0ZXhTaGFkZXJDb25zdGFudCh1bnNpZ25lZCBsb25nIHN0YXJ0UmVnaXN0ZXIsIGNvbnN0IHZvaWQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgbG9uZyBjb25zdGFudENvdW50KTsKKwkJbG9uZyBfX3N0ZGNhbGwgU2V0Vmlld3BvcnQoY29uc3QgRDNEVklFV1BPUlQ4ICp2aWV3cG9ydCk7CisJCWludCBfX3N0ZGNhbGwgU2hvd0N1cnNvcihpbnQgc2hvdyk7CisJCWxvbmcgX19zdGRjYWxsIFRlc3RDb29wZXJhdGl2ZUxldmVsKCk7CisJCWxvbmcgX19zdGRjYWxsIFVwZGF0ZVRleHR1cmUoSURpcmVjdDNEQmFzZVRleHR1cmU4ICpzb3VyY2VUZXh0dXJlLCBJRGlyZWN0M0RCYXNlVGV4dHVyZTggKmRlc3RpbmF0aW9uVGV4dHVyZSk7CisJCWxvbmcgX19zdGRjYWxsIFZhbGlkYXRlRGV2aWNlKHVuc2lnbmVkIGxvbmcgKm51bVBhc3Nlcyk7CisKKwkJLy8gSW50ZXJuYWwgbWV0aG9kcworCQlsb25nIF9fc3RkY2FsbCB1cGRhdGVTdXJmYWNlKElEaXJlY3QzRFN1cmZhY2U4ICpzb3VyY2VTdXJmYWNlLCBjb25zdCBSRUNUICpzb3VyY2VSZWN0LCBJRGlyZWN0M0RTdXJmYWNlOCAqZGVzdGluYXRpb25TdXJmYWNlLCBjb25zdCBQT0lOVCAqZGVzdFBvaW50KTsKKworCXByaXZhdGU6CisJCXN0YXRpYyBpbnQgRlZGU3RyaWRlKHVuc2lnbmVkIGxvbmcgRlZGKTsKKwkJc3RhdGljIGludCB0eXBlU3RyaWRlKHVuc2lnbmVkIGNoYXIgc3RyZWFtVHlwZSk7CisJCXN0YXRpYyBzdzo6U3RyZWFtVHlwZSBzdHJlYW1UeXBlKGludCB0eXBlKTsKKwkJYm9vbCBiaW5kRGF0YShEaXJlY3QzREluZGV4QnVmZmVyOCAqaW5kZXhCdWZmZXIsIGludCBiYXNlKTsKKwkJdm9pZCBiaW5kU3RyZWFtcyhpbnQgYmFzZSk7CisJCXZvaWQgYmluZEluZGV4QnVmZmVyKERpcmVjdDNESW5kZXhCdWZmZXI4ICppbmRleEJ1ZmZlcik7CisJCXZvaWQgYmluZExpZ2h0cygpOworCQlib29sIGJpbmRWaWV3cG9ydCgpOworCQl2b2lkIGJpbmRUZXh0dXJlcygpOworCQl2b2lkIGJpbmRDdXJzb3IoKTsKKworCQlsb25nIHVwZGF0ZVZvbHVtZShJRGlyZWN0M0RWb2x1bWU4ICpzb3VyY2VWb2x1bWUsIElEaXJlY3QzRFZvbHVtZTggKmRlc3RpbmF0aW9uVm9sdW1lKTsKKwkJdm9pZCBjb25maWd1cmVGUFUoKTsKKworCQkvLyBDcmVhdGlvbiBwYXJhbWV0ZXJzCisJCWNvbnN0IEhJTlNUQU5DRSBpbnN0YW5jZTsKKwkJRGlyZWN0M0Q4ICpkM2Q4OworCQljb25zdCB1bnNpZ25lZCBpbnQgYWRhcHRlcjsKKwkJY29uc3QgRDNEREVWVFlQRSBkZXZpY2VUeXBlOworCQljb25zdCBIV05EIGZvY3VzV2luZG93OworCQljb25zdCB1bnNpZ25lZCBsb25nIGJlaGF2aW91ckZsYWdzOworCQljb25zdCBEM0RQUkVTRU5UX1BBUkFNRVRFUlMgcHJlc2VudFBhcmFtZXRlcnM7CisJCQorCQlIV05EIHdpbmRvd0hhbmRsZTsKKworCQlEM0RWSUVXUE9SVDggdmlld3BvcnQ7CisJCUQzRE1BVFJJWCBtYXRyaXhbNTEyXTsKKwkJRGlyZWN0M0RCYXNlVGV4dHVyZTggKnRleHR1cmVbOF07CisJCUQzRE1BVEVSSUFMOCBtYXRlcmlhbDsKKwkJZmxvYXQgcGxhbmVbNl1bNF07CisJCUQzRENMSVBTVEFUVVM4IGNsaXBTdGF0dXM7CisKKwkJc3RydWN0IExpZ2h0IDogRDNETElHSFQ4CisJCXsKKwkJCUxpZ2h0ICZvcGVyYXRvcj0oY29uc3QgRDNETElHSFQ4ICZsaWdodCkKKwkJCXsKKwkJCQlUeXBlID0gbGlnaHQuVHlwZTsKKwkJCQlEaWZmdXNlID0gbGlnaHQuRGlmZnVzZTsKKwkJCQlTcGVjdWxhciA9IGxpZ2h0LlNwZWN1bGFyOworCQkJCUFtYmllbnQgPSBsaWdodC5BbWJpZW50OworCQkJCVBvc2l0aW9uID0gbGlnaHQuUG9zaXRpb247CisJCQkJRGlyZWN0aW9uID0gbGlnaHQuRGlyZWN0aW9uOworCQkJCVJhbmdlID0gbGlnaHQuUmFuZ2U7CisJCQkJRmFsbG9mZiA9IGxpZ2h0LkZhbGxvZmY7CisJCQkJQXR0ZW51YXRpb24wID0gbGlnaHQuQXR0ZW51YXRpb24wOworCQkJCUF0dGVudWF0aW9uMSA9IGxpZ2h0LkF0dGVudWF0aW9uMTsKKwkJCQlBdHRlbnVhdGlvbjIgPSBsaWdodC5BdHRlbnVhdGlvbjI7CisJCQkJVGhldGEgPSBsaWdodC5UaGV0YTsKKwkJCQlQaGkgPSBsaWdodC5QaGk7CisKKwkJCQlyZXR1cm4gKnRoaXM7CisJCQl9CisKKwkJCWJvb2wgZW5hYmxlOworCQl9OworCisJCXN0cnVjdCBMaWdodHMgOiBzdGQ6Om1hcDxpbnQsIExpZ2h0PgorCQl7CisJCQlib29sIGV4aXN0cyhpbnQgaW5kZXgpCisJCQl7CisJCQkJcmV0dXJuIGZpbmQoaW5kZXgpICE9IGVuZCgpOworCQkJfQorCQl9OworCisJCUxpZ2h0cyBsaWdodDsKKwkJYm9vbCBsaWdodHNEaXJ0eTsKKworCQlEaXJlY3QzRFZlcnRleEJ1ZmZlcjggKmRhdGFTdHJlYW1bMTZdOworCQlpbnQgc3RyZWFtU3RyaWRlWzE2XTsKKwkJRGlyZWN0M0RJbmRleEJ1ZmZlcjggKmluZGV4RGF0YTsKKwkJdW5zaWduZWQgaW50IGJhc2VWZXJ0ZXhJbmRleDsKKworCQl1bnNpZ25lZCBsb25nIEZWRjsKKworCQlzdGQ6OnZlY3RvcjxEaXJlY3QzRFN3YXBDaGFpbjgqPiBzd2FwQ2hhaW47CisKKwkJRGlyZWN0M0RTdXJmYWNlOCAqcmVuZGVyVGFyZ2V0OworCQlEaXJlY3QzRFN1cmZhY2U4ICpkZXB0aFN0ZW5jaWw7CisKKwkJYm9vbCByZWNvcmRTdGF0ZTsKKwkJc3RkOjp2ZWN0b3I8RGlyZWN0M0RTdGF0ZUJsb2NrOCo+IHN0YXRlUmVjb3JkZXI7CisKKwkJdW5zaWduZWQgbG9uZyByZW5kZXJTdGF0ZVtEM0RSU19OT1JNQUxPUkRFUiArIDFdOworCQl1bnNpZ25lZCBsb25nIHRleHR1cmVTdGFnZVN0YXRlWzhdW0QzRFRTU19SRVNVTFRBUkcgKyAxXTsKKwkJYm9vbCBpbml0OyAgIC8vIFRPRE86IERlcHJlY2F0ZSB3aGVuIGFsbCBzdGF0ZSBjaGFuZ2VzIGltcGxlbWVudGVkCisKKwkJc3RkOjp2ZWN0b3I8RGlyZWN0M0RQaXhlbFNoYWRlcjgqPiBwaXhlbFNoYWRlcjsKKwkJc3RkOjp2ZWN0b3I8RGlyZWN0M0RWZXJ0ZXhTaGFkZXI4Kj4gdmVydGV4U2hhZGVyOworCQl1bnNpZ25lZCBsb25nIHBpeGVsU2hhZGVySGFuZGxlOworCQl1bnNpZ25lZCBsb25nIHZlcnRleFNoYWRlckhhbmRsZTsKKwkJY29uc3QgdW5zaWduZWQgbG9uZyAqZGVjbGFyYXRpb247CisKKwkJZmxvYXQgcGl4ZWxTaGFkZXJDb25zdGFudFs4XVs0XTsKKwkJZmxvYXQgdmVydGV4U2hhZGVyQ29uc3RhbnRbMjU2XVs0XTsKKworCQlzdHJ1Y3QgUGFsZXR0ZQorCQl7CisJCQlQQUxFVFRFRU5UUlkgZW50cnlbMjU2XTsKKwkJfTsKKworCQl1bnNpZ25lZCBpbnQgY3VycmVudFBhbGV0dGU7CisJCXN0ZDo6bWFwPGludCwgUGFsZXR0ZT4gcGFsZXR0ZTsKKworCQlzdzo6Q29udGV4dCAqY29udGV4dDsKKwkJc3c6OlJlbmRlcmVyICpyZW5kZXJlcjsKKworCQlzdzo6U3VyZmFjZSAqY3Vyc29yOworCQlib29sIHNob3dDdXJzb3I7CisJCUhDVVJTT1IgbnVsbEN1cnNvcjsKKwkJSENVUlNPUiB3aW4zMkN1cnNvcjsKKwl9OworfQorCisjZW5kaWYgICAvLyBEM0Q4X0RpcmVjdDNERGV2aWNlOF9ocHAKZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0RpcmVjdDNESW5kZXhCdWZmZXI4LmNwcCBiL3NyYy9EM0Q4L0RpcmVjdDNESW5kZXhCdWZmZXI4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMGU1NGQyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDgvRGlyZWN0M0RJbmRleEJ1ZmZlcjguY3BwCkBAIC0wLDAgKzEsMTkxIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiRGlyZWN0M0RJbmRleEJ1ZmZlcjguaHBwIgorCisjaW5jbHVkZSAiRGlyZWN0M0REZXZpY2U4LmhwcCIKKyNpbmNsdWRlICJSZXNvdXJjZS5ocHAiCisjaW5jbHVkZSAiRGVidWcuaHBwIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK25hbWVzcGFjZSBEM0Q4Cit7CisJRGlyZWN0M0RJbmRleEJ1ZmZlcjg6OkRpcmVjdDNESW5kZXhCdWZmZXI4KERpcmVjdDNERGV2aWNlOCAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgbGVuZ3RoLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wpIDogRGlyZWN0M0RSZXNvdXJjZTgoZGV2aWNlLCBEM0RSVFlQRV9JTkRFWEJVRkZFUiwgbGVuZ3RoKSwgbGVuZ3RoKGxlbmd0aCksIHVzYWdlKHVzYWdlKSwgZm9ybWF0KGZvcm1hdCksIHBvb2wocG9vbCkKKwl7CisJCWluZGV4QnVmZmVyID0gbmV3IHN3OjpSZXNvdXJjZShsZW5ndGggKyAxNik7CisJfQorCisJRGlyZWN0M0RJbmRleEJ1ZmZlcjg6On5EaXJlY3QzREluZGV4QnVmZmVyOCgpCisJeworCQlpbmRleEJ1ZmZlci0+ZGVzdHJ1Y3QoKTsKKwl9CisKKwlsb25nIERpcmVjdDNESW5kZXhCdWZmZXI4OjpRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZihpaWQgPT0gSUlEX0lEaXJlY3QzREluZGV4QnVmZmVyOCB8fAorCQkgICBpaWQgPT0gSUlEX0lEaXJlY3QzRFJlc291cmNlOCB8fAorCQkgICBpaWQgPT0gSUlEX0lVbmtub3duKQorCQl7CisJCQlBZGRSZWYoKTsKKwkJCSpvYmplY3QgPSB0aGlzOworCisJCQlyZXR1cm4gU19PSzsKKwkJfQorCisJCSpvYmplY3QgPSAwOworCisJCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RJbmRleEJ1ZmZlcjg6OkFkZFJlZigpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U4OjpBZGRSZWYoKTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNESW5kZXhCdWZmZXI4OjpSZWxlYXNlKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTg6OlJlbGVhc2UoKTsKKwl9CisKKwlsb25nIERpcmVjdDNESW5kZXhCdWZmZXI4OjpGcmVlUHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTg6OkZyZWVQcml2YXRlRGF0YShndWlkKTsKKwl9CisKKwlsb25nIERpcmVjdDNESW5kZXhCdWZmZXI4OjpHZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nICpzaXplKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzRFJlc291cmNlODo6R2V0UHJpdmF0ZURhdGEoZ3VpZCwgZGF0YSwgc2l6ZSk7CisJfQorCisJdm9pZCBEaXJlY3QzREluZGV4QnVmZmVyODo6UHJlTG9hZCgpCisJeworCQlUUkFDRSgiIik7CisKKwkJRGlyZWN0M0RSZXNvdXJjZTg6OlByZUxvYWQoKTsKKwl9CisKKwlsb25nIERpcmVjdDNESW5kZXhCdWZmZXI4OjpTZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U4OjpTZXRQcml2YXRlRGF0YShndWlkLCBkYXRhLCBzaXplLCBmbGFncyk7CisJfQorCisJbG9uZyBEaXJlY3QzREluZGV4QnVmZmVyODo6R2V0RGV2aWNlKElEaXJlY3QzRERldmljZTggKipkZXZpY2UpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U4OjpHZXREZXZpY2UoZGV2aWNlKTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNESW5kZXhCdWZmZXI4OjpTZXRQcmlvcml0eSh1bnNpZ25lZCBsb25nIG5ld1ByaW9yaXR5KQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzRFJlc291cmNlODo6U2V0UHJpb3JpdHkobmV3UHJpb3JpdHkpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RJbmRleEJ1ZmZlcjg6OkdldFByaW9yaXR5KCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTg6OkdldFByaW9yaXR5KCk7CisJfQorCisJRDNEUkVTT1VSQ0VUWVBFIERpcmVjdDNESW5kZXhCdWZmZXI4OjpHZXRUeXBlKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTg6OkdldFR5cGUoKTsKKwl9CisKKwlsb25nIERpcmVjdDNESW5kZXhCdWZmZXI4OjpHZXREZXNjKEQzRElOREVYQlVGRkVSX0RFU0MgKmRlc2NyaXB0aW9uKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFkZXNjcmlwdGlvbikKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlkZXNjcmlwdGlvbi0+Rm9ybWF0ID0gZm9ybWF0OworCQlkZXNjcmlwdGlvbi0+UG9vbCA9IHBvb2w7CisJCWRlc2NyaXB0aW9uLT5TaXplID0gbGVuZ3RoOworCQlkZXNjcmlwdGlvbi0+VHlwZSA9IEdldFR5cGUoKTsKKwkJZGVzY3JpcHRpb24tPlVzYWdlID0gdXNhZ2U7CisKKwkJcmV0dXJuIDA7CisJfQorCisJbG9uZyBEaXJlY3QzREluZGV4QnVmZmVyODo6TG9jayh1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgY2hhciAqKmRhdGEsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYob2Zmc2V0ID09IDAgJiYgc2l6ZSA9PSAwKSAgIC8vIExvY2sgd2hvbGUgYnVmZmVyCisJCXsKKwkJCXNpemUgPSBsZW5ndGg7CisJCX0KKworCQlpZighZGF0YSB8fCBvZmZzZXQgKyBzaXplID4gbGVuZ3RoKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWxvY2tPZmZzZXQgPSBvZmZzZXQ7CisJCWxvY2tTaXplID0gc2l6ZTsKKworCQkqZGF0YSA9ICh1bnNpZ25lZCBjaGFyKilpbmRleEJ1ZmZlci0+bG9jayhzdzo6UFVCTElDKSArIG9mZnNldDsKKwkJaW5kZXhCdWZmZXItPnVubG9jaygpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzREluZGV4QnVmZmVyODo6VW5sb2NrKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCXN3OjpSZXNvdXJjZSAqRGlyZWN0M0RJbmRleEJ1ZmZlcjg6OmdldFJlc291cmNlKCkgY29uc3QKKwl7CQorCQlyZXR1cm4gaW5kZXhCdWZmZXI7CisJfQorCisJYm9vbCBEaXJlY3QzREluZGV4QnVmZmVyODo6aXMzMkJpdCgpIGNvbnN0CisJeworCQlzd2l0Y2goZm9ybWF0KQorCQl7CisJCWNhc2UgRDNERk1UX0lOREVYMTY6CisJCQlyZXR1cm4gZmFsc2U7CisJCWNhc2UgRDNERk1UX0lOREVYMzI6CisJCQlyZXR1cm4gdHJ1ZTsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKworCQlyZXR1cm4gZmFsc2U7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0RpcmVjdDNESW5kZXhCdWZmZXI4LmhwcCBiL3NyYy9EM0Q4L0RpcmVjdDNESW5kZXhCdWZmZXI4LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjI0MWFiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDgvRGlyZWN0M0RJbmRleEJ1ZmZlcjguaHBwCkBAIC0wLDAgKzEsNzYgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgRDNEOF9EaXJlY3QzREluZGV4QnVmZmVyOF9ocHAKKyNkZWZpbmUgRDNEOF9EaXJlY3QzREluZGV4QnVmZmVyOF9ocHAKKworI2luY2x1ZGUgIkRpcmVjdDNEUmVzb3VyY2U4LmhwcCIKKworI2luY2x1ZGUgPGQzZDguaD4KKworbmFtZXNwYWNlIHN3Cit7CisJY2xhc3MgUmVzb3VyY2U7Cit9CisKK25hbWVzcGFjZSBEM0Q4Cit7CisJY2xhc3MgRGlyZWN0M0RJbmRleEJ1ZmZlcjggOiBwdWJsaWMgSURpcmVjdDNESW5kZXhCdWZmZXI4LCBwdWJsaWMgRGlyZWN0M0RSZXNvdXJjZTgKKwl7CisJcHVibGljOgorCQlEaXJlY3QzREluZGV4QnVmZmVyOChEaXJlY3QzRERldmljZTggKmRldmljZSwgdW5zaWduZWQgaW50IGxlbmd0aCwgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sKTsKKworCQl2aXJ0dWFsIH5EaXJlY3QzREluZGV4QnVmZmVyOCgpOworCisJCS8vIElVbmtub3duIG1ldGhvZHMKKwkJbG9uZyBfX3N0ZGNhbGwgUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBBZGRSZWYoKTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZSgpOworCisJCS8vIElEaXJlY3QzRFJlc291cmNlOCBtZXRob2RzCisJCWxvbmcgX19zdGRjYWxsIEZyZWVQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSk7CisJCXZvaWQgX19zdGRjYWxsIFByZUxvYWQoKTsKKwkJbG9uZyBfX3N0ZGNhbGwgU2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0RGV2aWNlKElEaXJlY3QzRERldmljZTggKipkZXZpY2UpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBTZXRQcmlvcml0eSh1bnNpZ25lZCBsb25nIG5ld1ByaW9yaXR5KTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgR2V0UHJpb3JpdHkoKTsKKwkJRDNEUkVTT1VSQ0VUWVBFIF9fc3RkY2FsbCBHZXRUeXBlKCk7CisKKwkJLy8gSURpcmVjdDNESW5kZXhCdWZmZXI4IG1ldGhvZHMKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0RGVzYyhEM0RJTkRFWEJVRkZFUl9ERVNDICpkZXNjcmlwdGlvbik7CisJCWxvbmcgX19zdGRjYWxsIExvY2sodW5zaWduZWQgaW50IG9mZnNldCwgdW5zaWduZWQgaW50IHNpemUsIHVuc2lnbmVkIGNoYXIgKipkYXRhLCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKwkJbG9uZyBfX3N0ZGNhbGwgVW5sb2NrKCk7CisJCQorCQkvLyBJbnRlcm5hbCBtZXRob2RzCisJCXN3OjpSZXNvdXJjZSAqZ2V0UmVzb3VyY2UoKSBjb25zdDsKKwkJYm9vbCBpczMyQml0KCkgY29uc3Q7CisKKwlwcml2YXRlOgorCQkvLyBDcmVhdGlvbiBwYXJhbWV0ZXJzCisJCWNvbnN0IHVuc2lnbmVkIGludCBsZW5ndGg7CisJCWNvbnN0IGxvbmcgdXNhZ2U7CisJCWNvbnN0IEQzREZPUk1BVCBmb3JtYXQ7CisJCWNvbnN0IEQzRFBPT0wgcG9vbDsKKworCQlib29sIGxvY2tlZDsKKwkJdW5zaWduZWQgaW50IGxvY2tPZmZzZXQ7CisJCXVuc2lnbmVkIGludCBsb2NrU2l6ZTsKKwkJdW5zaWduZWQgY2hhciAqbG9ja0RhdGE7CisKKwkJc3c6OlJlc291cmNlICppbmRleEJ1ZmZlcjsKKwl9OworfQorCisjZW5kaWYgLy8gRDNEOF9EaXJlY3QzREluZGV4QnVmZmVyOF9ocHAKZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0RpcmVjdDNEUGl4ZWxTaGFkZXI4LmNwcCBiL3NyYy9EM0Q4L0RpcmVjdDNEUGl4ZWxTaGFkZXI4LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzU3ZmJjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDgvRGlyZWN0M0RQaXhlbFNoYWRlcjguY3BwCkBAIC0wLDAgKzEsODMgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJEaXJlY3QzRFBpeGVsU2hhZGVyOC5ocHAiCisKKyNpbmNsdWRlICJEZWJ1Zy5ocHAiCisKK25hbWVzcGFjZSBEM0Q4Cit7CisJRGlyZWN0M0RQaXhlbFNoYWRlcjg6OkRpcmVjdDNEUGl4ZWxTaGFkZXI4KERpcmVjdDNERGV2aWNlOCAqZGV2aWNlLCBjb25zdCB1bnNpZ25lZCBsb25nICpzaGFkZXJUb2tlbikgOiBkZXZpY2UoZGV2aWNlKSwgcGl4ZWxTaGFkZXIoc2hhZGVyVG9rZW4pCisJeworCQljb25zdCB1bnNpZ25lZCBsb25nICp0b2tlbiA9IHNoYWRlclRva2VuOworCisJCXNpemUgPSAwOworCisJCXdoaWxlKHNoYWRlclRva2VuW3NpemVdICE9IDB4MDAwMEZGRkYpCisJCXsKKwkJCXNpemUrKzsKKwkJfQorCisJCXNpemUrKzsKKworCQl0aGlzLT5zaGFkZXJUb2tlbiA9IG5ldyB1bnNpZ25lZCBsb25nW3NpemVdOworCQltZW1jcHkodGhpcy0+c2hhZGVyVG9rZW4sIHNoYWRlclRva2VuLCBzaXplICogc2l6ZW9mKHVuc2lnbmVkIGxvbmcpKTsKKwl9CisKKwlEaXJlY3QzRFBpeGVsU2hhZGVyODo6fkRpcmVjdDNEUGl4ZWxTaGFkZXI4KCkKKwl7CisJCWRlbGV0ZVtdIHNoYWRlclRva2VuOworCQlzaGFkZXJUb2tlbiA9IDA7CisJfQorCisJbG9uZyBEaXJlY3QzRFBpeGVsU2hhZGVyODo6UXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpCisJeworCQlUUkFDRSgiIik7CisKKwkJQVNTRVJUKGZhbHNlKTsgICAvLyBJbnRlcm5hbCBvYmplY3QKKworCQlyZXR1cm4gTk9JTlRFUkZBQ0UoaWlkKTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEUGl4ZWxTaGFkZXI4OjpBZGRSZWYoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBVbmtub3duOjpBZGRSZWYoKTsKKwl9CisJCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRFBpeGVsU2hhZGVyODo6UmVsZWFzZSgpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIFVua25vd246OlJlbGVhc2UoKTsKKwl9CisKKwl2b2lkIERpcmVjdDNEUGl4ZWxTaGFkZXI4OjpHZXRGdW5jdGlvbih2b2lkICpkYXRhLCB1bnNpZ25lZCBpbnQgKnNpemUpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoZGF0YSkKKwkJeworCQkJbWVtY3B5KGRhdGEsIHNoYWRlclRva2VuLCB0aGlzLT5zaXplICogNCk7CisJCX0KKworCQkqc2l6ZSA9IHRoaXMtPnNpemUgKiA0OworCX0KKworCWNvbnN0IHN3OjpQaXhlbFNoYWRlciAqRGlyZWN0M0RQaXhlbFNoYWRlcjg6OmdldFBpeGVsU2hhZGVyKCkgY29uc3QKKwl7CisJCXJldHVybiAmcGl4ZWxTaGFkZXI7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0RpcmVjdDNEUGl4ZWxTaGFkZXI4LmhwcCBiL3NyYy9EM0Q4L0RpcmVjdDNEUGl4ZWxTaGFkZXI4LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWY2YTI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDgvRGlyZWN0M0RQaXhlbFNoYWRlcjguaHBwCkBAIC0wLDAgKzEsNTQgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgRDNEOF9EaXJlY3QzRFBpeGVsU2hhZGVyOF9ocHAKKyNkZWZpbmUgRDNEOF9EaXJlY3QzRFBpeGVsU2hhZGVyOF9ocHAKKworI2luY2x1ZGUgIlBpeGVsU2hhZGVyLmhwcCIKKworI2luY2x1ZGUgIlVua25vd24uaHBwIgorCituYW1lc3BhY2UgRDNEOAoreworCWNsYXNzIERpcmVjdDNERGV2aWNlODsKKworCWNsYXNzIERpcmVjdDNEUGl4ZWxTaGFkZXI4IDogcHVibGljIFVua25vd24KKwl7CisJcHVibGljOgorCQlEaXJlY3QzRFBpeGVsU2hhZGVyOChEaXJlY3QzRERldmljZTggKmRldmljZSwgY29uc3QgdW5zaWduZWQgbG9uZyAqc2hhZGVyVG9rZW4pOworCisJCXZpcnR1YWwgfkRpcmVjdDNEUGl4ZWxTaGFkZXI4KCk7CisKKwkJLy8gSVVua25vd24gbWV0aG9kcworCQlsb25nIF9fc3RkY2FsbCBRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEFkZFJlZigpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBSZWxlYXNlKCk7CisKKwkJLy8gSURpcmVjdDNEUGl4ZWxTaGFkZXI4IG1ldGhvZHMKKwkJdm9pZCBfX3N0ZGNhbGwgR2V0RnVuY3Rpb24odm9pZCAqZGF0YSwgdW5zaWduZWQgaW50ICpzaXplKTsKKworCQkvLyBJbnRlcm5hbCBtZXRob2RzCisJCWNvbnN0IHN3OjpQaXhlbFNoYWRlciAqZ2V0UGl4ZWxTaGFkZXIoKSBjb25zdDsKKworCXByaXZhdGU6CisJCS8vIENyZWF0aW9uIHBhcmFtZXRlcnMKKwkJRGlyZWN0M0REZXZpY2U4ICpjb25zdCBkZXZpY2U7CisJCXVuc2lnbmVkIGxvbmcgKnNoYWRlclRva2VuOworCQl1bnNpZ25lZCBpbnQgc2l6ZTsKKworCQlzdzo6UGl4ZWxTaGFkZXIgcGl4ZWxTaGFkZXI7CisJfTsKK30KKworI2VuZGlmICAgLy8gRDNEOF9EaXJlY3QzRFBpeGVsU2hhZGVyOF9ocHAKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvRDNEOC9EaXJlY3QzRFJlc291cmNlOC5jcHAgYi9zcmMvRDNEOC9EaXJlY3QzRFJlc291cmNlOC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzY3NGQ4MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9EM0Q4L0RpcmVjdDNEUmVzb3VyY2U4LmNwcApAQCAtMCwwICsxLDIxNSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgIkRpcmVjdDNEUmVzb3VyY2U4LmhwcCIKKworI2luY2x1ZGUgIkRpcmVjdDNERGV2aWNlOC5ocHAiCisjaW5jbHVkZSAiRGVidWcuaHBwIgorCituYW1lc3BhY2UgRDNEOAoreworCXVuc2lnbmVkIGludCBEaXJlY3QzRFJlc291cmNlODo6bWVtb3J5VXNhZ2UgPSAwOworCisJRGlyZWN0M0RSZXNvdXJjZTg6OlByaXZhdGVEYXRhOjpQcml2YXRlRGF0YSgpCisJeworCQlkYXRhID0gMDsKKwl9CisKKwlEaXJlY3QzRFJlc291cmNlODo6UHJpdmF0ZURhdGE6OlByaXZhdGVEYXRhKGNvbnN0IHZvaWQgKmRhdGEsIGludCBzaXplLCBib29sIG1hbmFnZWQpCisJeworCQl0aGlzLT5zaXplID0gc2l6ZTsKKwkJdGhpcy0+bWFuYWdlZCA9IG1hbmFnZWQ7CisKKwkJdGhpcy0+ZGF0YSA9ICh2b2lkKiluZXcgdW5zaWduZWQgY2hhcltzaXplXTsKKwkJbWVtY3B5KHRoaXMtPmRhdGEsIGRhdGEsIHNpemUpOworCisJCWlmKG1hbmFnZWQpCisJCXsKKwkJCSgoSVVua25vd24qKWRhdGEpLT5BZGRSZWYoKTsKKwkJfQorCX0KKworCURpcmVjdDNEUmVzb3VyY2U4OjpQcml2YXRlRGF0YSAmRGlyZWN0M0RSZXNvdXJjZTg6OlByaXZhdGVEYXRhOjpvcGVyYXRvcj0oY29uc3QgUHJpdmF0ZURhdGEgJnByaXZhdGVEYXRhKQorCXsKKwkJc2l6ZSA9IHByaXZhdGVEYXRhLnNpemU7CisJCW1hbmFnZWQgPSBwcml2YXRlRGF0YS5tYW5hZ2VkOworCisJCWlmKGRhdGEpCisJCXsKKwkJCWlmKG1hbmFnZWQpCisJCQl7CisJCQkJKChJVW5rbm93biopZGF0YSktPlJlbGVhc2UoKTsKKwkJCX0KKworCQkJZGVsZXRlW10gZGF0YTsKKwkJfQorCisJCWRhdGEgPSAodm9pZCopbmV3IHVuc2lnbmVkIGNoYXJbc2l6ZV07CisJCW1lbWNweShkYXRhLCBwcml2YXRlRGF0YS5kYXRhLCBzaXplKTsKKworCQlyZXR1cm4gKnRoaXM7CisJfQorCisJRGlyZWN0M0RSZXNvdXJjZTg6OlByaXZhdGVEYXRhOjp+UHJpdmF0ZURhdGEoKQorCXsKKwkJaWYoZGF0YSAmJiBtYW5hZ2VkKQorCQl7CisJCQkoKElVbmtub3duKilkYXRhKS0+UmVsZWFzZSgpOworCQl9CisKKwkJZGVsZXRlW10gZGF0YTsKKwkJZGF0YSA9IDA7CisJfQorCisJRGlyZWN0M0RSZXNvdXJjZTg6OkRpcmVjdDNEUmVzb3VyY2U4KERpcmVjdDNERGV2aWNlOCAqZGV2aWNlLCBEM0RSRVNPVVJDRVRZUEUgdHlwZSwgdW5zaWduZWQgaW50IHNpemUpIDogZGV2aWNlKGRldmljZSksIHR5cGUodHlwZSksIHNpemUoc2l6ZSkKKwl7CisJCXByaW9yaXR5ID0gMDsKKworCQltZW1vcnlVc2FnZSArPSBzaXplOworCX0KKworCURpcmVjdDNEUmVzb3VyY2U4Ojp+RGlyZWN0M0RSZXNvdXJjZTgoKQorCXsKKwkJbWVtb3J5VXNhZ2UgLT0gc2l6ZTsKKwl9CisKKwlsb25nIERpcmVjdDNEUmVzb3VyY2U4OjpRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZihpaWQgPT0gSUlEX0lEaXJlY3QzRFJlc291cmNlOCB8fAorCQkgICBpaWQgPT0gSUlEX0lVbmtub3duKQorCQl7CisJCQlBZGRSZWYoKTsKKwkJCSpvYmplY3QgPSB0aGlzOworCisJCQlyZXR1cm4gU19PSzsKKwkJfQorCisJCSpvYmplY3QgPSAwOworCisJCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RSZXNvdXJjZTg6OkFkZFJlZigpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIFVua25vd246OkFkZFJlZigpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RSZXNvdXJjZTg6OlJlbGVhc2UoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBVbmtub3duOjpSZWxlYXNlKCk7CisJfQorCisJbG9uZyBEaXJlY3QzRFJlc291cmNlODo6R2V0RGV2aWNlKElEaXJlY3QzRERldmljZTggKipkZXZpY2UpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoIWRldmljZSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQl0aGlzLT5kZXZpY2UtPkFkZFJlZigpOworCQkqZGV2aWNlID0gdGhpcy0+ZGV2aWNlOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRFJlc291cmNlODo6U2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXByaXZhdGVEYXRhW2d1aWRdID0gUHJpdmF0ZURhdGEoZGF0YSwgc2l6ZSwgZmxhZ3MgPT0gRDNEU1BEX0lVTktOT1dOKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0RSZXNvdXJjZTg6OkdldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpCisJeworCQlUUkFDRSgiIik7CisKKwkJSXRlcmF0b3IgcmVzdWx0ID0gcHJpdmF0ZURhdGEuZmluZChndWlkKTsKKworCQlpZihyZXN1bHQgPT0gcHJpdmF0ZURhdGEuZW5kKCkpCisJCXsKKwkJCXJldHVybiBOT1RGT1VORCgpOworCQl9CisKKwkJaWYocmVzdWx0LT5zZWNvbmQuc2l6ZSA+ICpzaXplKQorCQl7CisJCQlyZXR1cm4gTU9SRURBVEEoKTsKKwkJfQorCisJCW1lbWNweShkYXRhLCByZXN1bHQtPnNlY29uZC5kYXRhLCByZXN1bHQtPnNlY29uZC5zaXplKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0RSZXNvdXJjZTg6OkZyZWVQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCUl0ZXJhdG9yIHJlc3VsdCA9IHByaXZhdGVEYXRhLmZpbmQoZ3VpZCk7CisKKwkJaWYocmVzdWx0ID09IHByaXZhdGVEYXRhLmVuZCgpKQorCQl7CisJCQlyZXR1cm4gRDNERVJSX05PVEZPVU5EOworCQl9CisJCQorCQlwcml2YXRlRGF0YS5lcmFzZShndWlkKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RSZXNvdXJjZTg6OlNldFByaW9yaXR5KHVuc2lnbmVkIGxvbmcgbmV3UHJpb3JpdHkpCisJeworCQlUUkFDRSgiIik7CisKKwkJdW5zaWduZWQgbG9uZyBvbGRQcmlvcml0eSA9IHByaW9yaXR5OworCQlwcmlvcml0eSA9IG5ld1ByaW9yaXR5OworCisJCXJldHVybiBvbGRQcmlvcml0eTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEUmVzb3VyY2U4OjpHZXRQcmlvcml0eSgpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIHByaW9yaXR5OworCX0KKworCXZvaWQgRGlyZWN0M0RSZXNvdXJjZTg6OlByZUxvYWQoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybjsgICAvLyBGSVhNRTogQW55dGhpbmcgdG8gZG8/CisJfQorCisJRDNEUkVTT1VSQ0VUWVBFIERpcmVjdDNEUmVzb3VyY2U4OjpHZXRUeXBlKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gdHlwZTsKKwl9CisKKwl1bnNpZ25lZCBpbnQgRGlyZWN0M0RSZXNvdXJjZTg6OmdldE1lbW9yeVVzYWdlKCkKKwl7CisJCXJldHVybiBtZW1vcnlVc2FnZTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDgvRGlyZWN0M0RSZXNvdXJjZTguaHBwIGIvc3JjL0QzRDgvRGlyZWN0M0RSZXNvdXJjZTguaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4MDI5NmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOC9EaXJlY3QzRFJlc291cmNlOC5ocHAKQEAgLTAsMCArMSw5MiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBEM0Q4X0RpcmVjdDNEUmVzb3VyY2U4X2hwcAorI2RlZmluZSBEM0Q4X0RpcmVjdDNEUmVzb3VyY2U4X2hwcAorCisjaW5jbHVkZSAiVW5rbm93bi5ocHAiCisKKyNpbmNsdWRlIDxkM2Q4Lmg+CisKKyNpbmNsdWRlIDxtYXA+CisKK25hbWVzcGFjZSBEM0Q4Cit7CisJY2xhc3MgRGlyZWN0M0REZXZpY2U4OworCisJY2xhc3MgRGlyZWN0M0RSZXNvdXJjZTggOiBwdWJsaWMgSURpcmVjdDNEUmVzb3VyY2U4LCBwdWJsaWMgVW5rbm93bgorCXsKKwlwdWJsaWM6CisJCURpcmVjdDNEUmVzb3VyY2U4KERpcmVjdDNERGV2aWNlOCAqZGV2aWNlLCBEM0RSRVNPVVJDRVRZUEUgdHlwZSwgdW5zaWduZWQgaW50IHNpemUpOworCisJCXZpcnR1YWwgfkRpcmVjdDNEUmVzb3VyY2U4KCk7CisKKwkJLy8gSVVua25vd24gbWV0aG9kcworCQlsb25nIF9fc3RkY2FsbCBRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEFkZFJlZigpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBSZWxlYXNlKCk7CisKKwkJLy8gSURpcmVjdDNEUmVzb3VyY2U4IG1ldGhvZHMKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0RGV2aWNlKElEaXJlY3QzRERldmljZTggKipkZXZpY2UpOworCQlsb25nIF9fc3RkY2FsbCBTZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCQlsb25nIF9fc3RkY2FsbCBHZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nICpzaXplKTsKKwkJbG9uZyBfX3N0ZGNhbGwgRnJlZVByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBTZXRQcmlvcml0eSh1bnNpZ25lZCBsb25nIG5ld1ByaW9yaXR5KTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgR2V0UHJpb3JpdHkoKTsKKwkJdm9pZCBfX3N0ZGNhbGwgUHJlTG9hZCgpOworCQlEM0RSRVNPVVJDRVRZUEUgX19zdGRjYWxsIEdldFR5cGUoKTsKKworCQkvLyBJbnRlcm5hbCBtZXRob2RzCisJCXN0YXRpYyB1bnNpZ25lZCBpbnQgZ2V0TWVtb3J5VXNhZ2UoKTsKKworCXByb3RlY3RlZDoKKwkJLy8gQ3JlYXRpb24gcGFyYW1ldGVycworCQlEaXJlY3QzRERldmljZTggKmNvbnN0IGRldmljZTsKKwkJY29uc3QgRDNEUkVTT1VSQ0VUWVBFIHR5cGU7CisJCWNvbnN0IHVuc2lnbmVkIGludCBzaXplOworCisJcHJpdmF0ZToKKwkJdW5zaWduZWQgbG9uZyBwcmlvcml0eTsKKworCQlzdHJ1Y3QgUHJpdmF0ZURhdGEKKwkJeworCQkJUHJpdmF0ZURhdGEoKTsKKwkJCVByaXZhdGVEYXRhKGNvbnN0IHZvaWQgKmRhdGEsIGludCBzaXplLCBib29sIG1hbmFnZWQpOworCisJCQl+UHJpdmF0ZURhdGEoKTsKKworCQkJUHJpdmF0ZURhdGEgJm9wZXJhdG9yPShjb25zdCBQcml2YXRlRGF0YSAmcHJpdmF0ZURhdGEpOworCisJCQl2b2lkICpkYXRhOworCQkJdW5zaWduZWQgbG9uZyBzaXplOworCQkJYm9vbCBtYW5hZ2VkOyAgIC8vIElVbmtub3duIGludGVyZmFjZQorCQl9OworCisJCXN0cnVjdCBDb21wYXJlR1VJRAorCQl7CisJCQlib29sIG9wZXJhdG9yKCkoY29uc3QgR1VJRCYgbGVmdCwgY29uc3QgR1VJRCYgcmlnaHQpIGNvbnN0CisJCQl7CisJCQkJcmV0dXJuIG1lbWNtcCgmbGVmdCwgJnJpZ2h0LCBzaXplb2YoR1VJRCkpIDwgMDsKKwkJCX0KKwkJfTsKKworCQl0eXBlZGVmIHN0ZDo6bWFwPEdVSUQsIFByaXZhdGVEYXRhLCBDb21wYXJlR1VJRD4gUHJpdmF0ZURhdGFNYXA7CisJCXR5cGVkZWYgUHJpdmF0ZURhdGFNYXA6Oml0ZXJhdG9yIEl0ZXJhdG9yOworCQlQcml2YXRlRGF0YU1hcCBwcml2YXRlRGF0YTsKKworCQlzdGF0aWMgdW5zaWduZWQgaW50IG1lbW9yeVVzYWdlOworCX07Cit9CisKKyNlbmRpZiAgIC8vIEQzRDhfRGlyZWN0M0RSZXNvdXJjZThfaHBwCmRpZmYgLS1naXQgYS9zcmMvRDNEOC9EaXJlY3QzRFN0YXRlQmxvY2s4LmNwcCBiL3NyYy9EM0Q4L0RpcmVjdDNEU3RhdGVCbG9jazguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMmM5MzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOC9EaXJlY3QzRFN0YXRlQmxvY2s4LmNwcApAQCAtMCwwICsxLDc0MyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgIkRpcmVjdDNEU3RhdGVCbG9jazguaHBwIgorCisjaW5jbHVkZSAiRGlyZWN0M0REZXZpY2U4LmhwcCIKKyNpbmNsdWRlICJEaXJlY3QzREJhc2VUZXh0dXJlOC5ocHAiCisjaW5jbHVkZSAiRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4LmhwcCIKKyNpbmNsdWRlICJEaXJlY3QzREluZGV4QnVmZmVyOC5ocHAiCisjaW5jbHVkZSAiRGVidWcuaHBwIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK25hbWVzcGFjZSBEM0Q4Cit7CisJRGlyZWN0M0RTdGF0ZUJsb2NrODo6RGlyZWN0M0RTdGF0ZUJsb2NrOChEaXJlY3QzRERldmljZTggKmRldmljZSwgRDNEU1RBVEVCTE9DS1RZUEUgdHlwZSkgOiBkZXZpY2UoZGV2aWNlKSwgdHlwZSh0eXBlKQorCXsKKwkJdmVydGV4U2hhZGVySGFuZGxlID0gMDsKKwkJcGl4ZWxTaGFkZXJIYW5kbGUgPSAwOworCQlpbmRleEJ1ZmZlciA9IDA7CisKKwkJZm9yKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCAxNjsgc3RyZWFtKyspCisJCXsKKwkJCXN0cmVhbVNvdXJjZVtzdHJlYW1dLnZlcnRleEJ1ZmZlciA9IDA7CisJCX0KKworCQlmb3IoaW50IHN0YWdlID0gMDsgc3RhZ2UgPCA4OyBzdGFnZSsrKQorCQl7CisJCQl0ZXh0dXJlW3N0YWdlXSA9IDA7CisJCX0KKworCQljbGVhcigpOworCisJCWlmKHR5cGUgPT0gRDNEU0JUX1BJWEVMU1RBVEUgfHwgdHlwZSA9PSBEM0RTQlRfQUxMKQorCQl7CisJCQljYXB0dXJlUGl4ZWxSZW5kZXJTdGF0ZXMoKTsKKwkJCWNhcHR1cmVQaXhlbFRleHR1cmVTdGF0ZXMoKTsKKwkJCWNhcHR1cmVQaXhlbFNoYWRlclN0YXRlcygpOworCQl9CisJCQorCQlpZih0eXBlID09IEQzRFNCVF9WRVJURVhTVEFURSB8fCB0eXBlID09IEQzRFNCVF9BTEwpCisJCXsKKwkJCWNhcHR1cmVWZXJ0ZXhSZW5kZXJTdGF0ZXMoKTsKKwkJCWNhcHR1cmVWZXJ0ZXhUZXh0dXJlU3RhdGVzKCk7CisJCQljYXB0dXJlTGlnaHRTdGF0ZXMoKTsKKwkJCWNhcHR1cmVWZXJ0ZXhTaGFkZXJTdGF0ZXMoKTsKKwkJfQorCisJCWlmKHR5cGUgPT0gRDNEU0JUX0FMTCkgICAvLyBDYXB0dXJlIHJlbWFpbmluZyBzdGF0ZXMKKwkJeworCQkJY2FwdHVyZVRleHR1cmVzKCk7CisJCQljYXB0dXJlVmVydGV4VGV4dHVyZXMoKTsKKwkJCWNhcHR1cmVEaXNwbGFjZW1lbnRUZXh0dXJlcygpOworCQkJY2FwdHVyZVRleHR1cmVQYWxldHRlKCk7CisJCQljYXB0dXJlVmVydGV4U3RyZWFtcygpOworCQkJY2FwdHVyZUluZGV4QnVmZmVyKCk7CisJCQljYXB0dXJlVmlld3BvcnQoKTsKKwkJCWNhcHR1cmVUcmFuc2Zvcm1zKCk7CisJCQljYXB0dXJlVGV4dHVyZVRyYW5zZm9ybXMoKTsKKwkJCWNhcHR1cmVDbGlwcGluZ1BsYW5lcygpOworCQkJY2FwdHVyZU1hdGVyaWFsKCk7CisJCX0KKwl9CisKKwlEaXJlY3QzRFN0YXRlQmxvY2s4Ojp+RGlyZWN0M0RTdGF0ZUJsb2NrOCgpCisJeworCQljbGVhcigpOworCX0KKworCWxvbmcgRGlyZWN0M0RTdGF0ZUJsb2NrODo6UXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpCisJeworCQlUUkFDRSgiIik7CisKKwkJQVNTRVJUKGZhbHNlKTsgICAvLyBJbnRlcm5hbCBvYmplY3QKKworCQlyZXR1cm4gTk9JTlRFUkZBQ0UoaWlkKTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEU3RhdGVCbG9jazg6OkFkZFJlZigpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIFVua25vd246OkFkZFJlZigpOworCX0KKwkKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEU3RhdGVCbG9jazg6OlJlbGVhc2UoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBVbmtub3duOjpSZWxlYXNlKCk7CisJfQorCisJbG9uZyBEaXJlY3QzRFN0YXRlQmxvY2s4OjpBcHBseSgpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYodmVydGV4U2hhZGVyQ2FwdHVyZWQpCisJCXsKKwkJCWRldmljZS0+U2V0VmVydGV4U2hhZGVyKHZlcnRleFNoYWRlckhhbmRsZSk7CisJCX0KKworCQlpZihwaXhlbFNoYWRlckNhcHR1cmVkKQorCQl7CisJCQlkZXZpY2UtPlNldFBpeGVsU2hhZGVyKHBpeGVsU2hhZGVySGFuZGxlKTsKKwkJfQorCisJCWlmKGluZGV4QnVmZmVyQ2FwdHVyZWQpCisJCXsKKwkJCWRldmljZS0+U2V0SW5kaWNlcyhpbmRleEJ1ZmZlciwgYmFzZVZlcnRleEluZGV4KTsKKwkJfQorCisJCWZvcihpbnQgc3RhdGUgPSAwOyBzdGF0ZSA8IEQzRFJTX05PUk1BTE9SREVSICsgMTsgc3RhdGUrKykKKwkJeworCQkJaWYocmVuZGVyU3RhdGVDYXB0dXJlZFtzdGF0ZV0pCisJCQl7CisJCQkJZGV2aWNlLT5TZXRSZW5kZXJTdGF0ZSgoRDNEUkVOREVSU1RBVEVUWVBFKXN0YXRlLCByZW5kZXJTdGF0ZVtzdGF0ZV0pOworCQkJfQorCQl9CisKKwkJZm9yKGludCBzdGFnZSA9IDA7IHN0YWdlIDwgODsgc3RhZ2UrKykKKwkJeworCQkJZm9yKGludCBzdGF0ZSA9IDA7IHN0YXRlIDwgRDNEVFNTX1JFU1VMVEFSRyArIDE7IHN0YXRlKyspCisJCQl7CisJCQkJaWYodGV4dHVyZVN0YWdlU3RhdGVDYXB0dXJlZFtzdGFnZV1bc3RhdGVdKQorCQkJCXsKKwkJCQkJZGV2aWNlLT5TZXRUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgKEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSlzdGF0ZSwgdGV4dHVyZVN0YWdlU3RhdGVbc3RhZ2VdW3N0YXRlXSk7CisJCQkJfQorCQkJfQorCQl9CisKKwkJZm9yKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCAxNjsgc3RyZWFtKyspCisJCXsKKwkJCWlmKHN0cmVhbVNvdXJjZUNhcHR1cmVkW3N0cmVhbV0pCisJCQl7CisJCQkJZGV2aWNlLT5TZXRTdHJlYW1Tb3VyY2Uoc3RyZWFtLCBzdHJlYW1Tb3VyY2Vbc3RyZWFtXS52ZXJ0ZXhCdWZmZXIsIHN0cmVhbVNvdXJjZVtzdHJlYW1dLnN0cmlkZSk7CisJCQl9CisJCX0KKworCQlmb3IoaW50IHN0YWdlID0gMDsgc3RhZ2UgPCA4OyBzdGFnZSsrKQorCQl7CisJCQlpZih0ZXh0dXJlQ2FwdHVyZWRbc3RhZ2VdKQorCQkJeworCQkJCWRldmljZS0+U2V0VGV4dHVyZShzdGFnZSwgdGV4dHVyZVtzdGFnZV0pOworCQkJfQorCQl9CisKKwkJZm9yKGludCBzdGF0ZSA9IDA7IHN0YXRlIDwgNTEyOyBzdGF0ZSsrKQorCQl7CisJCQlpZih0cmFuc2Zvcm1DYXB0dXJlZFtzdGF0ZV0pCisJCQl7CisJCQkJZGV2aWNlLT5TZXRUcmFuc2Zvcm0oKEQzRFRSQU5TRk9STVNUQVRFVFlQRSlzdGF0ZSwgJnRyYW5zZm9ybVtzdGF0ZV0pOworCQkJfQorCQl9CisKKwkJaWYodmlld3BvcnRDYXB0dXJlZCkKKwkJeworCQkJZGV2aWNlLT5TZXRWaWV3cG9ydCgmdmlld3BvcnQpOworCQl9CisKKwkJZm9yKGludCBpbmRleCA9IDA7IGluZGV4IDwgNjsgaW5kZXgrKykKKwkJeworCQkJaWYoY2xpcFBsYW5lQ2FwdHVyZWRbaW5kZXhdKQorCQkJeworCQkJCWRldmljZS0+U2V0Q2xpcFBsYW5lKGluZGV4LCBjbGlwUGxhbmVbaW5kZXhdKTsKKwkJCX0KKwkJfQorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRFN0YXRlQmxvY2s4OjpDYXB0dXJlKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZih2ZXJ0ZXhTaGFkZXJDYXB0dXJlZCkKKwkJewkJCisJCQlkZXZpY2UtPkdldFZlcnRleFNoYWRlcigmdmVydGV4U2hhZGVySGFuZGxlKTsKKwkJfQorCisJCWlmKHBpeGVsU2hhZGVyQ2FwdHVyZWQpCisJCXsJCQorCQkJZGV2aWNlLT5HZXRQaXhlbFNoYWRlcigmcGl4ZWxTaGFkZXJIYW5kbGUpOworCQl9CisKKwkJaWYoaW5kZXhCdWZmZXJDYXB0dXJlZCkKKwkJeworCQkJaWYoaW5kZXhCdWZmZXIpCisJCQl7CisJCQkJaW5kZXhCdWZmZXItPlJlbGVhc2UoKTsKKwkJCX0KKworCQkJZGV2aWNlLT5HZXRJbmRpY2VzKHJlaW50ZXJwcmV0X2Nhc3Q8SURpcmVjdDNESW5kZXhCdWZmZXI4Kio+KCZpbmRleEJ1ZmZlciksICZiYXNlVmVydGV4SW5kZXgpOworCQl9CisKKwkJZm9yKGludCBzdGF0ZSA9IDA7IHN0YXRlIDwgRDNEUlNfTk9STUFMT1JERVIgKyAxOyBzdGF0ZSsrKQorCQl7CisJCQlpZihyZW5kZXJTdGF0ZUNhcHR1cmVkW3N0YXRlXSkKKwkJCXsKKwkJCQlkZXZpY2UtPkdldFJlbmRlclN0YXRlKChEM0RSRU5ERVJTVEFURVRZUEUpc3RhdGUsICZyZW5kZXJTdGF0ZVtzdGF0ZV0pOworCQkJfQorCQl9CisKKwkJZm9yKGludCBzdGFnZSA9IDA7IHN0YWdlIDwgODsgc3RhZ2UrKykKKwkJeworCQkJZm9yKGludCBzdGF0ZSA9IDA7IHN0YXRlIDwgRDNEVFNTX1JFU1VMVEFSRyArIDE7IHN0YXRlKyspCisJCQl7CisJCQkJaWYodGV4dHVyZVN0YWdlU3RhdGVDYXB0dXJlZFtzdGFnZV1bc3RhdGVdKQorCQkJCXsKKwkJCQkJZGV2aWNlLT5HZXRUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgKEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSlzdGF0ZSwgJnRleHR1cmVTdGFnZVN0YXRlW3N0YWdlXVtzdGF0ZV0pOworCQkJCX0KKwkJCX0KKwkJfQorCisJCWZvcihpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgMTY7IHN0cmVhbSsrKQorCQl7CisJCQlpZihzdHJlYW1Tb3VyY2VDYXB0dXJlZFtzdHJlYW1dKQorCQkJeworCQkJCWlmKHN0cmVhbVNvdXJjZVtzdHJlYW1dLnZlcnRleEJ1ZmZlcikKKwkJCQl7CisJCQkJCXN0cmVhbVNvdXJjZVtzdHJlYW1dLnZlcnRleEJ1ZmZlci0+UmVsZWFzZSgpOworCQkJCX0KKworCQkJCWRldmljZS0+R2V0U3RyZWFtU291cmNlKHN0cmVhbSwgcmVpbnRlcnByZXRfY2FzdDxJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4Kio+KCZzdHJlYW1Tb3VyY2Vbc3RyZWFtXS52ZXJ0ZXhCdWZmZXIpLCAmc3RyZWFtU291cmNlW3N0cmVhbV0uc3RyaWRlKTsKKwkJCX0KKwkJfQorCisJCWZvcihpbnQgc3RhZ2UgPSAwOyBzdGFnZSA8IDg7IHN0YWdlKyspCisJCXsKKwkJCWlmKHRleHR1cmVDYXB0dXJlZFtzdGFnZV0pCisJCQl7CisJCQkJaWYodGV4dHVyZVtzdGFnZV0pCisJCQkJeworCQkJCQl0ZXh0dXJlW3N0YWdlXS0+UmVsZWFzZSgpOworCQkJCX0KKworCQkJCWRldmljZS0+R2V0VGV4dHVyZShzdGFnZSwgcmVpbnRlcnByZXRfY2FzdDxJRGlyZWN0M0RCYXNlVGV4dHVyZTgqKj4oJnRleHR1cmVbc3RhZ2VdKSk7CisJCQl9CisJCX0KKworCQlmb3IoaW50IHN0YXRlID0gMDsgc3RhdGUgPCA1MTI7IHN0YXRlKyspCisJCXsKKwkJCWlmKHRyYW5zZm9ybUNhcHR1cmVkW3N0YXRlXSkKKwkJCXsKKwkJCQlkZXZpY2UtPkdldFRyYW5zZm9ybSgoRDNEVFJBTlNGT1JNU1RBVEVUWVBFKXN0YXRlLCAmdHJhbnNmb3JtW3N0YXRlXSk7CisJCQl9CisJCX0KKworCQlpZih2aWV3cG9ydENhcHR1cmVkKQorCQl7CisJCQlkZXZpY2UtPkdldFZpZXdwb3J0KCZ2aWV3cG9ydCk7CisJCX0KKworCQlmb3IoaW50IGluZGV4ID0gMDsgaW5kZXggPCA2OyBpbmRleCsrKQorCQl7CisJCQlpZihjbGlwUGxhbmVDYXB0dXJlZFtpbmRleF0pCisJCQl7CisJCQkJZGV2aWNlLT5HZXRDbGlwUGxhbmUoaW5kZXgsIGNsaXBQbGFuZVtpbmRleF0pOworCQkJfQorCQl9CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNEU3RhdGVCbG9jazg6OkdldERldmljZShJRGlyZWN0M0REZXZpY2U4ICoqZGV2aWNlKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFkZXZpY2UpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJdGhpcy0+ZGV2aWNlLT5BZGRSZWYoKTsKKwkJKmRldmljZSA9IHRoaXMtPmRldmljZTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrODo6bGlnaHRFbmFibGUodW5zaWduZWQgbG9uZyBpbmRleCwgaW50IGVuYWJsZSkKKwl7CisJCVVOSU1QTEVNRU5URUQoKTsKKwl9CisKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazg6OnNldENsaXBQbGFuZSh1bnNpZ25lZCBsb25nIGluZGV4LCBjb25zdCBmbG9hdCAqcGxhbmUpCisJeworCQljbGlwUGxhbmVDYXB0dXJlZFtpbmRleF0gPSB0cnVlOworCQljbGlwUGxhbmVbaW5kZXhdWzBdID0gcGxhbmVbMF07CisJCWNsaXBQbGFuZVtpbmRleF1bMV0gPSBwbGFuZVsxXTsKKwkJY2xpcFBsYW5lW2luZGV4XVsyXSA9IHBsYW5lWzJdOworCQljbGlwUGxhbmVbaW5kZXhdWzNdID0gcGxhbmVbM107CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpzZXRDdXJyZW50VGV4dHVyZVBhbGV0dGUodW5zaWduZWQgaW50IHBhbGV0dGVOdW1iZXIpCisJeworCQlVTklNUExFTUVOVEVEKCk7CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpzZXRGVkYodW5zaWduZWQgbG9uZyBGVkYpCisJeworCQlVTklNUExFTUVOVEVEKCk7CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpzZXRJbmRpY2VzKERpcmVjdDNESW5kZXhCdWZmZXI4ICppbmRleERhdGEsIHVuc2lnbmVkIGludCBiYXNlVmVydGV4SW5kZXgpCisJeworCQlpZihpbmRleERhdGEpIGluZGV4RGF0YS0+QWRkUmVmKCk7CisKKwkJaW5kZXhCdWZmZXJDYXB0dXJlZCA9IHRydWU7CisJCWluZGV4QnVmZmVyID0gaW5kZXhEYXRhOworCQl0aGlzLT5iYXNlVmVydGV4SW5kZXggPSBiYXNlVmVydGV4SW5kZXg7CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpzZXRMaWdodCh1bnNpZ25lZCBsb25nIGluZGV4LCBjb25zdCBEM0RMSUdIVDggKmxpZ2h0KQorCXsKKwkJVU5JTVBMRU1FTlRFRCgpOworCX0KKworCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrODo6c2V0TWF0ZXJpYWwoY29uc3QgRDNETUFURVJJQUw4ICptYXRlcmlhbCkKKwl7CisJCVVOSU1QTEVNRU5URUQoKTsKKwl9CisKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazg6OnNldFBpeGVsU2hhZGVyKHVuc2lnbmVkIGxvbmcgc2hhZGVySGFuZGxlKQkJCisJeworCQlwaXhlbFNoYWRlckNhcHR1cmVkID0gdHJ1ZTsKKwkJcGl4ZWxTaGFkZXJIYW5kbGUgPSBzaGFkZXJIYW5kbGU7CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpzZXRQaXhlbFNoYWRlckNvbnN0YW50KHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBjb25zdCB2b2lkICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCkKKwl7CisJCVVOSU1QTEVNRU5URUQoKTsKKwl9CisKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazg6OnNldFJlbmRlclN0YXRlKEQzRFJFTkRFUlNUQVRFVFlQRSBzdGF0ZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSkKKwl7CisJCXJlbmRlclN0YXRlQ2FwdHVyZWRbc3RhdGVdID0gdHJ1ZTsKKwkJcmVuZGVyU3RhdGVbc3RhdGVdID0gdmFsdWU7CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpzZXRTY2lzc29yUmVjdChjb25zdCBSRUNUICpyZWN0KQorCXsKKwkJVU5JTVBMRU1FTlRFRCgpOworCX0KKworCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrODo6c2V0U3RyZWFtU291cmNlKHVuc2lnbmVkIGludCBzdHJlYW0sIERpcmVjdDNEVmVydGV4QnVmZmVyOCAqZGF0YSwgdW5zaWduZWQgaW50IHN0cmlkZSkKKwl7CisJCWlmKGRhdGEpIGRhdGEtPkFkZFJlZigpOworCisJCXN0cmVhbVNvdXJjZUNhcHR1cmVkW3N0cmVhbV0gPSB0cnVlOworCQlzdHJlYW1Tb3VyY2Vbc3RyZWFtXS52ZXJ0ZXhCdWZmZXIgPSBkYXRhOworCQlzdHJlYW1Tb3VyY2Vbc3RyZWFtXS5zdHJpZGUgPSBzdHJpZGU7CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpzZXRUZXh0dXJlKHVuc2lnbmVkIGxvbmcgc3RhZ2UsIERpcmVjdDNEQmFzZVRleHR1cmU4ICp0ZXh0dXJlKQorCXsKKwkJaWYodGV4dHVyZSkgdGV4dHVyZS0+QWRkUmVmKCk7CisKKwkJdGV4dHVyZUNhcHR1cmVkW3N0YWdlXSA9IHRydWU7CisJCXRoaXMtPnRleHR1cmVbc3RhZ2VdID0gdGV4dHVyZTsKKwl9CisKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazg6OnNldFRleHR1cmVTdGFnZVN0YXRlKHVuc2lnbmVkIGxvbmcgc3RhZ2UsIEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSB0eXBlLCB1bnNpZ25lZCBsb25nIHZhbHVlKQorCXsKKwkJdGV4dHVyZVN0YWdlU3RhdGVDYXB0dXJlZFtzdGFnZV1bdHlwZV0gPSB0cnVlOworCQl0ZXh0dXJlU3RhZ2VTdGF0ZVtzdGFnZV1bdHlwZV0gPSB2YWx1ZTsKKwl9CisKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazg6OnNldFRyYW5zZm9ybShEM0RUUkFOU0ZPUk1TVEFURVRZUEUgc3RhdGUsIGNvbnN0IEQzRE1BVFJJWCAqbWF0cml4KQorCXsKKwkJdHJhbnNmb3JtQ2FwdHVyZWRbc3RhdGVdID0gdHJ1ZTsKKwkJdHJhbnNmb3JtW3N0YXRlXSA9ICptYXRyaXg7CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpzZXRWaWV3cG9ydChjb25zdCBEM0RWSUVXUE9SVDggKnZpZXdwb3J0KQorCXsKKwkJdmlld3BvcnRDYXB0dXJlZCA9IHRydWU7CisJCXRoaXMtPnZpZXdwb3J0ID0gKnZpZXdwb3J0OworCX0KKworCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrODo6c2V0VmVydGV4U2hhZGVyKHVuc2lnbmVkIGxvbmcgc2hhZGVySGFuZGxlKQorCXsKKwkJdmVydGV4U2hhZGVyQ2FwdHVyZWQgPSB0cnVlOworCQl2ZXJ0ZXhTaGFkZXJIYW5kbGUgPSBzaGFkZXJIYW5kbGU7CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpzZXRWZXJ0ZXhTaGFkZXJDb25zdGFudCh1bnNpZ25lZCBpbnQgc3RhcnRSZWdpc3RlciwgY29uc3Qgdm9pZCAqY29uc3RhbnREYXRhLCB1bnNpZ25lZCBpbnQgY291bnQpCisJeworCQlVTklNUExFTUVOVEVEKCk7CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpjbGVhcigpCisJeworCQkvLyBFcmFzZSBjYXB0dXJlIGZsYWdzCisJCXZlcnRleFNoYWRlckNhcHR1cmVkID0gZmFsc2U7CisJCXBpeGVsU2hhZGVyQ2FwdHVyZWQgPSBmYWxzZTsKKwkJaW5kZXhCdWZmZXJDYXB0dXJlZCA9IGZhbHNlOworCisJCWZvcihpbnQgc3RhdGUgPSAwOyBzdGF0ZSA8IEQzRFJTX05PUk1BTE9SREVSICsgMTsgc3RhdGUrKykKKwkJeworCQkJcmVuZGVyU3RhdGVDYXB0dXJlZFtzdGF0ZV0gPSBmYWxzZTsKKwkJfQorCisJCWZvcihpbnQgc3RhZ2UgPSAwOyBzdGFnZSA8IDg7IHN0YWdlKyspCisJCXsKKwkJCWZvcihpbnQgc3RhdGUgPSAwOyBzdGF0ZSA8IEQzRFRTU19SRVNVTFRBUkcgKyAxOyBzdGF0ZSsrKQorCQkJeworCQkJCXRleHR1cmVTdGFnZVN0YXRlQ2FwdHVyZWRbc3RhZ2VdW3N0YXRlXSA9IGZhbHNlOworCQkJfQorCQl9CisKKwkJZm9yKGludCBzdHJlYW0gPSAwOyBzdHJlYW0gPCAxNjsgc3RyZWFtKyspCisJCXsKKwkJCXN0cmVhbVNvdXJjZUNhcHR1cmVkW3N0cmVhbV0gPSBmYWxzZTsKKwkJfQorCisJCWZvcihpbnQgc3RhZ2UgPSAwOyBzdGFnZSA8IDg7IHN0YWdlKyspCisJCXsKKwkJCXRleHR1cmVDYXB0dXJlZFtzdGFnZV0gPSBmYWxzZTsKKwkJfQorCisJCWZvcihpbnQgc3RhdGUgPSAwOyBzdGF0ZSA8IDUxMjsgc3RhdGUrKykKKwkJeworCQkJdHJhbnNmb3JtQ2FwdHVyZWRbc3RhdGVdID0gZmFsc2U7CisJCX0KKworCQl2aWV3cG9ydENhcHR1cmVkID0gZmFsc2U7CisKKwkJZm9yKGludCBpbmRleCA9IDA7IGluZGV4IDwgNjsgaW5kZXgrKykKKwkJeworCQkJY2xpcFBsYW5lQ2FwdHVyZWRbaW5kZXhdID0gZmFsc2U7CisJCX0KKworCQkvLyBSZWxlYXNlIHJlc291cmNlcworCQl2ZXJ0ZXhTaGFkZXJIYW5kbGUgPSAwOworCQlwaXhlbFNoYWRlckhhbmRsZSA9IDA7CisKKwkJaWYoaW5kZXhCdWZmZXIpCisJCXsKKwkJCWluZGV4QnVmZmVyLT5SZWxlYXNlKCk7CisJCQlpbmRleEJ1ZmZlciA9IDA7CisJCX0KKworCQlmb3IoaW50IHN0cmVhbSA9IDA7IHN0cmVhbSA8IDE2OyBzdHJlYW0rKykKKwkJeworCQkJaWYoc3RyZWFtU291cmNlW3N0cmVhbV0udmVydGV4QnVmZmVyKQorCQkJeworCQkJCXN0cmVhbVNvdXJjZVtzdHJlYW1dLnZlcnRleEJ1ZmZlci0+UmVsZWFzZSgpOworCQkJCXN0cmVhbVNvdXJjZVtzdHJlYW1dLnZlcnRleEJ1ZmZlciA9IDA7CisJCQl9CisJCX0KKworCQlmb3IoaW50IHN0YWdlID0gMDsgc3RhZ2UgPCA4OyBzdGFnZSsrKQorCQl7CisJCQlpZih0ZXh0dXJlW3N0YWdlXSkKKwkJCXsKKwkJCQl0ZXh0dXJlW3N0YWdlXS0+UmVsZWFzZSgpOworCQkJCXRleHR1cmVbc3RhZ2VdID0gMDsKKwkJCX0KKwkJfQorCX0KKworCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrODo6Y2FwdHVyZVJlbmRlclN0YXRlKEQzRFJFTkRFUlNUQVRFVFlQRSBzdGF0ZSkKKwl7CisJCWRldmljZS0+R2V0UmVuZGVyU3RhdGUoc3RhdGUsICZyZW5kZXJTdGF0ZVtzdGF0ZV0pOworCQlyZW5kZXJTdGF0ZUNhcHR1cmVkW3N0YXRlXSA9IHRydWU7CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpjYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUodW5zaWduZWQgbG9uZyBzdGFnZSwgRDNEVEVYVFVSRVNUQUdFU1RBVEVUWVBFIHR5cGUpCisJeworCQlkZXZpY2UtPkdldFRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCB0eXBlLCAmdGV4dHVyZVN0YWdlU3RhdGVbc3RhZ2VdW3R5cGVdKTsKKwkJdGV4dHVyZVN0YWdlU3RhdGVDYXB0dXJlZFtzdGFnZV1bdHlwZV0gPSB0cnVlOworCX0KKworCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrODo6Y2FwdHVyZVRyYW5zZm9ybShEM0RUUkFOU0ZPUk1TVEFURVRZUEUgc3RhdGUpCisJeworCQlkZXZpY2UtPkdldFRyYW5zZm9ybShzdGF0ZSwgJnRyYW5zZm9ybVtzdGF0ZV0pOworCQl0cmFuc2Zvcm1DYXB0dXJlZFtzdGF0ZV0gPSB0cnVlOworCX0KKworCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrODo6Y2FwdHVyZVBpeGVsUmVuZGVyU3RhdGVzKCkKKwl7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19aRU5BQkxFKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0ZJTExNT0RFKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1NIQURFTU9ERSk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19aV1JJVEVFTkFCTEUpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfQUxQSEFURVNURU5BQkxFKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0xBU1RQSVhFTCk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19TUkNCTEVORCk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19ERVNUQkxFTkQpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfWkZVTkMpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfQUxQSEFSRUYpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfQUxQSEFGVU5DKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0RJVEhFUkVOQUJMRSk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19GT0dTVEFSVCk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19GT0dFTkQpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfRk9HREVOU0lUWSk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19BTFBIQUJMRU5ERU5BQkxFKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1pCSUFTKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1NURU5DSUxFTkFCTEUpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTEZBSUwpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTFpGQUlMKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1NURU5DSUxQQVNTKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1NURU5DSUxGVU5DKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1NURU5DSUxSRUYpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTE1BU0spOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfU1RFTkNJTFdSSVRFTUFTSyk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19URVhUVVJFRkFDVE9SKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1dSQVAwKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1dSQVAxKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1dSQVAyKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1dSQVAzKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1dSQVA0KTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1dSQVA1KTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1dSQVA2KTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1dSQVA3KTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0NPTE9SV1JJVEVFTkFCTEUpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfQkxFTkRPUCk7CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpjYXB0dXJlUGl4ZWxUZXh0dXJlU3RhdGVzKCkKKwl7CisJCWZvcihpbnQgc3RhZ2UgPSAwOyBzdGFnZSA8IDg7IHN0YWdlKyspCisJCXsKKwkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX0NPTE9ST1ApOworCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfQ09MT1JBUkcxKTsKKwkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX0NPTE9SQVJHMik7CisJCQljYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIEQzRFRTU19BTFBIQU9QKTsKKwkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX0FMUEhBQVJHMSk7CisJCQljYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIEQzRFRTU19BTFBIQUFSRzIpOworCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfQlVNUEVOVk1BVDAwKTsKKwkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX0JVTVBFTlZNQVQwMSk7CisJCQljYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIEQzRFRTU19CVU1QRU5WTUFUMTApOworCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfQlVNUEVOVk1BVDExKTsKKwkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX1RFWENPT1JESU5ERVgpOworCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfQlVNUEVOVkxTQ0FMRSk7CisJCQljYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIEQzRFRTU19CVU1QRU5WTE9GRlNFVCk7CisJCQljYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIEQzRFRTU19URVhUVVJFVFJBTlNGT1JNRkxBR1MpOworCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfQ09MT1JBUkcwKTsKKwkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX0FMUEhBQVJHMCk7CisJCQljYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIEQzRFRTU19SRVNVTFRBUkcpOworCQkKKwkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX0FERFJFU1NVKTsKKwkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX0FERFJFU1NWKTsKKwkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX0FERFJFU1NXKTsgCisJCQljYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIEQzRFRTU19CT1JERVJDT0xPUik7CisJCQljYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIEQzRFRTU19NQUdGSUxURVIpOworCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfTUlORklMVEVSKTsKKwkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX01JUEZJTFRFUik7CisJCQljYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIEQzRFRTU19NSVBNQVBMT0RCSUFTKTsKKwkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX01BWE1JUExFVkVMKTsKKwkJCWNhcHR1cmVUZXh0dXJlU3RhZ2VTdGF0ZShzdGFnZSwgRDNEVFNTX01BWEFOSVNPVFJPUFkpOworCQl9CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpjYXB0dXJlUGl4ZWxTaGFkZXJTdGF0ZXMoKQorCXsKKwkJcGl4ZWxTaGFkZXJDYXB0dXJlZCA9IHRydWU7CisJCWRldmljZS0+R2V0UGl4ZWxTaGFkZXIoJnBpeGVsU2hhZGVySGFuZGxlKTsKKworCQlkZXZpY2UtPkdldFBpeGVsU2hhZGVyQ29uc3RhbnQoMCwgcGl4ZWxTaGFkZXJDb25zdGFudCwgOCk7CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpjYXB0dXJlVmVydGV4UmVuZGVyU3RhdGVzKCkKKwl7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19DVUxMTU9ERSk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19GT0dFTkFCTEUpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfRk9HQ09MT1IpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfRk9HVEFCTEVNT0RFKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0ZPR1NUQVJUKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0ZPR0VORCk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19GT0dERU5TSVRZKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1JBTkdFRk9HRU5BQkxFKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0FNQklFTlQpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfQ09MT1JWRVJURVgpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfRk9HVkVSVEVYTU9ERSk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19DTElQUElORyk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19MSUdIVElORyk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19MT0NBTFZJRVdFUik7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19FTUlTU0lWRU1BVEVSSUFMU09VUkNFKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX0FNQklFTlRNQVRFUklBTFNPVVJDRSk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19ESUZGVVNFTUFURVJJQUxTT1VSQ0UpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfU1BFQ1VMQVJNQVRFUklBTFNPVVJDRSk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19WRVJURVhCTEVORCk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19DTElQUExBTkVFTkFCTEUpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfUE9JTlRTSVpFKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1BPSU5UU0laRV9NSU4pOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfUE9JTlRTUFJJVEVFTkFCTEUpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfUE9JTlRTQ0FMRUVOQUJMRSk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19QT0lOVFNDQUxFX0EpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfUE9JTlRTQ0FMRV9CKTsKKwkJY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJTX1BPSU5UU0NBTEVfQyk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19NVUxUSVNBTVBMRUFOVElBTElBUyk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19NVUxUSVNBTVBMRU1BU0spOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfUEFUQ0hFREdFU1RZTEUpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfUE9JTlRTSVpFX01BWCk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19JTkRFWEVEVkVSVEVYQkxFTkRFTkFCTEUpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfVFdFRU5GQUNUT1IpOworCQljYXB0dXJlUmVuZGVyU3RhdGUoRDNEUlNfTk9STUFMSVpFTk9STUFMUyk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19TUEVDVUxBUkVOQUJMRSk7CisJCWNhcHR1cmVSZW5kZXJTdGF0ZShEM0RSU19TSEFERU1PREUpOworCX0KKworCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrODo6Y2FwdHVyZVZlcnRleFRleHR1cmVTdGF0ZXMoKQorCXsKKwkJZm9yKGludCBzdGFnZSA9IDA7IHN0YWdlIDwgODsgc3RhZ2UrKykKKwkJeworCQkJY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHN0YWdlLCBEM0RUU1NfVEVYQ09PUkRJTkRFWCk7CisJCQljYXB0dXJlVGV4dHVyZVN0YWdlU3RhdGUoc3RhZ2UsIEQzRFRTU19URVhUVVJFVFJBTlNGT1JNRkxBR1MpOworCQl9CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpjYXB0dXJlTGlnaHRTdGF0ZXMoKQorCXsKKwkJZm9yKGludCBpbmRleCA9IDA7IGluZGV4IDwgODsgaW5kZXgrKykgICAvLyBGSVhNRTogU3VwcG9ydCB1bmxpbWl0ZWQgaW5kZXgKKwkJeworCQkJZGV2aWNlLT5HZXRMaWdodChpbmRleCwgJmxpZ2h0W2luZGV4XSk7CisJCQlsaWdodENhcHR1cmVkW2luZGV4XSA9IHRydWU7CisJCX0KKworCQlmb3IoaW50IGluZGV4ID0gMDsgaW5kZXggPCA4OyBpbmRleCsrKSAgIC8vIEZJWE1FOiBTdXBwb3J0IHVubGltaXRlZCBpbmRleAorCQl7CisJCQlsaWdodEVuYWJsZVN0YXRlW2luZGV4XSA9IGZhbHNlOworCQkJZGV2aWNlLT5HZXRMaWdodEVuYWJsZShpbmRleCwgJmxpZ2h0RW5hYmxlU3RhdGVbaW5kZXhdKTsKKwkJCWxpZ2h0RW5hYmxlQ2FwdHVyZWRbaW5kZXhdID0gdHJ1ZTsKKwkJfQorCX0KKworCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrODo6Y2FwdHVyZVZlcnRleFNoYWRlclN0YXRlcygpCisJeworCQl2ZXJ0ZXhTaGFkZXJDYXB0dXJlZCA9IHRydWU7CisJCWRldmljZS0+R2V0VmVydGV4U2hhZGVyKCZ2ZXJ0ZXhTaGFkZXJIYW5kbGUpOworCisJCWRldmljZS0+R2V0VmVydGV4U2hhZGVyQ29uc3RhbnQoMCwgdmVydGV4U2hhZGVyQ29uc3RhbnRbMF0sIDI1Nik7CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpjYXB0dXJlVGV4dHVyZXMoKQorCXsKKwkJZm9yKGludCBzYW1wbGVyID0gMDsgc2FtcGxlciA8IDg7IHNhbXBsZXIrKykKKwkJeworCQkJdGV4dHVyZUNhcHR1cmVkW3NhbXBsZXJdID0gdHJ1ZTsKKwkJCWRldmljZS0+R2V0VGV4dHVyZShzYW1wbGVyLCByZWludGVycHJldF9jYXN0PElEaXJlY3QzREJhc2VUZXh0dXJlOCoqPigmdGV4dHVyZVtzYW1wbGVyXSkpOworCisJCQlpZih0ZXh0dXJlW3NhbXBsZXJdKQorCQkJeworCQkJCXRleHR1cmVbc2FtcGxlcl0tPmJpbmQoKTsKKwkJCQl0ZXh0dXJlW3NhbXBsZXJdLT5SZWxlYXNlKCk7CisJCQl9CisJCX0KKwl9CisKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazg6OmNhcHR1cmVWZXJ0ZXhUZXh0dXJlcygpCisJeworCQkvLyBGSVhNRQorCX0KKworCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrODo6Y2FwdHVyZURpc3BsYWNlbWVudFRleHR1cmVzKCkKKwl7CisJCS8vIEZJWE1FCQorCX0KKworCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrODo6Y2FwdHVyZVRleHR1cmVQYWxldHRlKCkKKwl7CisJCXBhbGV0dGVOdW1iZXJDYXB0dXJlZCA9IHRydWU7CisJCWRldmljZS0+R2V0Q3VycmVudFRleHR1cmVQYWxldHRlKCZwYWxldHRlTnVtYmVyKTsKKwl9CisKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazg6OmNhcHR1cmVWZXJ0ZXhTdHJlYW1zKCkKKwl7CisJCWZvcihpbnQgc3RyZWFtID0gMDsgc3RyZWFtIDwgMTY7IHN0cmVhbSsrKQorCQl7CisJCQlzdHJlYW1Tb3VyY2VDYXB0dXJlZFtzdHJlYW1dID0gdHJ1ZTsKKwkJCWRldmljZS0+R2V0U3RyZWFtU291cmNlKHN0cmVhbSwgcmVpbnRlcnByZXRfY2FzdDxJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4Kio+KCZzdHJlYW1Tb3VyY2Vbc3RyZWFtXS52ZXJ0ZXhCdWZmZXIpLCAgJnN0cmVhbVNvdXJjZVtzdHJlYW1dLnN0cmlkZSk7CisJCQkKKwkJCWlmKHN0cmVhbVNvdXJjZVtzdHJlYW1dLnZlcnRleEJ1ZmZlcikKKwkJCXsKKwkJCQlzdHJlYW1Tb3VyY2Vbc3RyZWFtXS52ZXJ0ZXhCdWZmZXItPmJpbmQoKTsKKwkJCQlzdHJlYW1Tb3VyY2Vbc3RyZWFtXS52ZXJ0ZXhCdWZmZXItPlJlbGVhc2UoKTsKKwkJCX0KKwkJfQorCX0KKworCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrODo6Y2FwdHVyZUluZGV4QnVmZmVyKCkKKwl7CisJCWluZGV4QnVmZmVyQ2FwdHVyZWQgPSB0cnVlOworCQlkZXZpY2UtPkdldEluZGljZXMocmVpbnRlcnByZXRfY2FzdDxJRGlyZWN0M0RJbmRleEJ1ZmZlcjgqKj4oJmluZGV4QnVmZmVyKSwgJmJhc2VWZXJ0ZXhJbmRleCk7CisKKwkJaWYoaW5kZXhCdWZmZXIpCisJCXsKKwkJCWluZGV4QnVmZmVyLT5iaW5kKCk7CisJCQlpbmRleEJ1ZmZlci0+UmVsZWFzZSgpOworCQl9CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpjYXB0dXJlVmlld3BvcnQoKQorCXsKKwkJZGV2aWNlLT5HZXRWaWV3cG9ydCgmdmlld3BvcnQpOworCQl2aWV3cG9ydENhcHR1cmVkID0gdHJ1ZTsKKwl9CisKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazg6OmNhcHR1cmVUcmFuc2Zvcm1zKCkKKwl7CisJCWNhcHR1cmVUcmFuc2Zvcm0oRDNEVFNfVklFVyk7CisJCWNhcHR1cmVUcmFuc2Zvcm0oRDNEVFNfUFJPSkVDVElPTik7CisJCWNhcHR1cmVUcmFuc2Zvcm0oRDNEVFNfV09STEQpOworCX0KKworCXZvaWQgRGlyZWN0M0RTdGF0ZUJsb2NrODo6Y2FwdHVyZVRleHR1cmVUcmFuc2Zvcm1zKCkKKwl7CisJCWNhcHR1cmVUcmFuc2Zvcm0oRDNEVFNfVEVYVFVSRTApOworCQljYXB0dXJlVHJhbnNmb3JtKEQzRFRTX1RFWFRVUkUxKTsKKwkJY2FwdHVyZVRyYW5zZm9ybShEM0RUU19URVhUVVJFMik7CisJCWNhcHR1cmVUcmFuc2Zvcm0oRDNEVFNfVEVYVFVSRTMpOworCQljYXB0dXJlVHJhbnNmb3JtKEQzRFRTX1RFWFRVUkU0KTsKKwkJY2FwdHVyZVRyYW5zZm9ybShEM0RUU19URVhUVVJFNSk7CisJCWNhcHR1cmVUcmFuc2Zvcm0oRDNEVFNfVEVYVFVSRTYpOworCQljYXB0dXJlVHJhbnNmb3JtKEQzRFRTX1RFWFRVUkU3KTsKKwl9CisKKwl2b2lkIERpcmVjdDNEU3RhdGVCbG9jazg6OmNhcHR1cmVDbGlwcGluZ1BsYW5lcygpCisJeworCQlmb3IoaW50IGluZGV4ID0gMDsgaW5kZXggPCA2OyBpbmRleCsrKQorCQl7CisJCQlkZXZpY2UtPkdldENsaXBQbGFuZShpbmRleCwgKGZsb2F0KikmY2xpcFBsYW5lW2luZGV4XSk7CisJCQljbGlwUGxhbmVDYXB0dXJlZFtpbmRleF0gPSB0cnVlOworCQl9CisJfQorCisJdm9pZCBEaXJlY3QzRFN0YXRlQmxvY2s4OjpjYXB0dXJlTWF0ZXJpYWwoKQorCXsKKwkJZGV2aWNlLT5HZXRNYXRlcmlhbCgmbWF0ZXJpYWwpOworCQltYXRlcmlhbENhcHR1cmVkID0gdHJ1ZTsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDgvRGlyZWN0M0RTdGF0ZUJsb2NrOC5ocHAgYi9zcmMvRDNEOC9EaXJlY3QzRFN0YXRlQmxvY2s4LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NDRkZTJlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDgvRGlyZWN0M0RTdGF0ZUJsb2NrOC5ocHAKQEAgLTAsMCArMSwxNjEgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgRDNEOF9EaXJlY3QzRFN0YXRlQmxvY2s4X2hwcAorI2RlZmluZSBEM0Q4X0RpcmVjdDNEU3RhdGVCbG9jazhfaHBwCisKKyNpbmNsdWRlICJVbmtub3duLmhwcCIKKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGQzZDguaD4KKworbmFtZXNwYWNlIEQzRDgKK3sKKwljbGFzcyBEaXJlY3QzRERldmljZTg7CisJY2xhc3MgRGlyZWN0M0RCYXNlVGV4dHVyZTg7CisJY2xhc3MgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4OworCWNsYXNzIERpcmVjdDNESW5kZXhCdWZmZXI4OworCisJY2xhc3MgRGlyZWN0M0RTdGF0ZUJsb2NrOCA6IHB1YmxpYyBVbmtub3duCisJeworCXB1YmxpYzoKKwkJRGlyZWN0M0RTdGF0ZUJsb2NrOChEaXJlY3QzRERldmljZTggKmRldmljZSwgRDNEU1RBVEVCTE9DS1RZUEUgdHlwZSk7CisKKwkJdmlydHVhbCB+RGlyZWN0M0RTdGF0ZUJsb2NrOCgpOworCisJCS8vIElVbmtub3duIG1ldGhvZHMKKwkJbG9uZyBfX3N0ZGNhbGwgUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBBZGRSZWYoKTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZSgpOworCisJCS8vIElEaXJlY3QzRFN0YXRlQmxvY2s4IG1ldGhvZHMKKwkJbG9uZyBfX3N0ZGNhbGwgQXBwbHkoKTsKKwkJbG9uZyBfX3N0ZGNhbGwgQ2FwdHVyZSgpOworCQlsb25nIF9fc3RkY2FsbCBHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOCAqKmRldmljZSk7CisKKwkJLy8gSW50ZXJuYWwgbWV0aG9kcworCQl2b2lkIGxpZ2h0RW5hYmxlKHVuc2lnbmVkIGxvbmcgaW5kZXgsIGludCBlbmFibGUpOworCQl2b2lkIHNldENsaXBQbGFuZSh1bnNpZ25lZCBsb25nIGluZGV4LCBjb25zdCBmbG9hdCAqcGxhbmUpOworCQl2b2lkIHNldEN1cnJlbnRUZXh0dXJlUGFsZXR0ZSh1bnNpZ25lZCBpbnQgcGFsZXR0ZU51bWJlcik7CisJCXZvaWQgc2V0RlZGKHVuc2lnbmVkIGxvbmcgRlZGKTsKKwkJdm9pZCBzZXRJbmRpY2VzKERpcmVjdDNESW5kZXhCdWZmZXI4ICppbmRleERhdGEsIHVuc2lnbmVkIGludCBiYXNlVmVydGV4SW5kZXgpOworCQl2b2lkIHNldExpZ2h0KHVuc2lnbmVkIGxvbmcgaW5kZXgsIGNvbnN0IEQzRExJR0hUOCAqbGlnaHQpOworCQl2b2lkIHNldE1hdGVyaWFsKGNvbnN0IEQzRE1BVEVSSUFMOCAqbWF0ZXJpYWwpOworCQl2b2lkIHNldFBpeGVsU2hhZGVyKHVuc2lnbmVkIGxvbmcgc2hhZGVySGFuZGxlKTsKKwkJdm9pZCBzZXRQaXhlbFNoYWRlckNvbnN0YW50KHVuc2lnbmVkIGludCBzdGFydFJlZ2lzdGVyLCBjb25zdCB2b2lkICpjb25zdGFudERhdGEsIHVuc2lnbmVkIGludCBjb3VudCk7CisJCXZvaWQgc2V0UmVuZGVyU3RhdGUoRDNEUkVOREVSU1RBVEVUWVBFIHN0YXRlLCB1bnNpZ25lZCBsb25nIHZhbHVlKTsKKwkJdm9pZCBzZXRTY2lzc29yUmVjdChjb25zdCBSRUNUICpyZWN0KTsKKwkJdm9pZCBzZXRTdHJlYW1Tb3VyY2UodW5zaWduZWQgaW50IHN0cmVhbSwgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4ICpkYXRhLCB1bnNpZ25lZCBpbnQgc3RyaWRlKTsKKwkJdm9pZCBzZXRUZXh0dXJlKHVuc2lnbmVkIGxvbmcgc3RhZ2UsIERpcmVjdDNEQmFzZVRleHR1cmU4ICp0ZXh0dXJlKTsKKwkJdm9pZCBzZXRUZXh0dXJlU3RhZ2VTdGF0ZSh1bnNpZ25lZCBsb25nIHN0YWdlLCBEM0RURVhUVVJFU1RBR0VTVEFURVRZUEUgdHlwZSwgdW5zaWduZWQgbG9uZyB2YWx1ZSk7CisJCXZvaWQgc2V0VHJhbnNmb3JtKEQzRFRSQU5TRk9STVNUQVRFVFlQRSBzdGF0ZSwgY29uc3QgRDNETUFUUklYICptYXRyaXgpOworCQl2b2lkIHNldFZpZXdwb3J0KGNvbnN0IEQzRFZJRVdQT1JUOCAqdmlld3BvcnQpOworCQl2b2lkIHNldFZlcnRleFNoYWRlcih1bnNpZ25lZCBsb25nIHNoYWRlckhhbmRsZSk7CisJCXZvaWQgc2V0VmVydGV4U2hhZGVyQ29uc3RhbnQodW5zaWduZWQgaW50IHN0YXJ0UmVnaXN0ZXIsIGNvbnN0IHZvaWQgKmNvbnN0YW50RGF0YSwgdW5zaWduZWQgaW50IGNvdW50KTsKKworCXByaXZhdGU6CisJCS8vIEluZGl2aWR1YWwgc3RhdGVzCisJCXZvaWQgY2FwdHVyZVJlbmRlclN0YXRlKEQzRFJFTkRFUlNUQVRFVFlQRSBzdGF0ZSk7CisJCXZvaWQgY2FwdHVyZVRleHR1cmVTdGFnZVN0YXRlKHVuc2lnbmVkIGxvbmcgc3RhZ2UsIEQzRFRFWFRVUkVTVEFHRVNUQVRFVFlQRSB0eXBlKTsKKwkJdm9pZCBjYXB0dXJlVHJhbnNmb3JtKEQzRFRSQU5TRk9STVNUQVRFVFlQRSBzdGF0ZSk7CisKKwkJLy8gUGl4ZWwgc3RhdGVzCisJCXZvaWQgY2FwdHVyZVBpeGVsUmVuZGVyU3RhdGVzKCk7CisJCXZvaWQgY2FwdHVyZVBpeGVsVGV4dHVyZVN0YXRlcygpOworCQl2b2lkIGNhcHR1cmVQaXhlbFNoYWRlclN0YXRlcygpOworCQorCQkvLyBWZXJ0ZXggc3RhdGVzCisJCXZvaWQgY2FwdHVyZVZlcnRleFJlbmRlclN0YXRlcygpOworCQl2b2lkIGNhcHR1cmVWZXJ0ZXhUZXh0dXJlU3RhdGVzKCk7CisJCXZvaWQgY2FwdHVyZUxpZ2h0U3RhdGVzKCk7CisJCXZvaWQgY2FwdHVyZVZlcnRleFNoYWRlclN0YXRlcygpOworCQorCQkvLyBBbGwgKHJlbWFpbmluZykgc3RhdGVzCisJCXZvaWQgY2FwdHVyZVRleHR1cmVzKCk7CisJCXZvaWQgY2FwdHVyZVZlcnRleFRleHR1cmVzKCk7CisJCXZvaWQgY2FwdHVyZURpc3BsYWNlbWVudFRleHR1cmVzKCk7CisJCXZvaWQgY2FwdHVyZVRleHR1cmVQYWxldHRlKCk7CisJCXZvaWQgY2FwdHVyZVZlcnRleFN0cmVhbXMoKTsKKwkJdm9pZCBjYXB0dXJlSW5kZXhCdWZmZXIoKTsKKwkJdm9pZCBjYXB0dXJlVmlld3BvcnQoKTsKKwkJdm9pZCBjYXB0dXJlVHJhbnNmb3JtcygpOworCQl2b2lkIGNhcHR1cmVUZXh0dXJlVHJhbnNmb3JtcygpOworCQl2b2lkIGNhcHR1cmVDbGlwcGluZ1BsYW5lcygpOworCQl2b2lkIGNhcHR1cmVNYXRlcmlhbCgpOworCisJCS8vIENyZWF0aW9uIHBhcmFtZXRlcnMKKwkJRGlyZWN0M0REZXZpY2U4ICpjb25zdCBkZXZpY2U7CisJCWNvbnN0IEQzRFNUQVRFQkxPQ0tUWVBFIHR5cGU7CisKKwkJLy8gU3RhdGUgZGF0YQorCQlib29sIHZlcnRleFNoYWRlckNhcHR1cmVkOworCQl1bnNpZ25lZCBsb25nIHZlcnRleFNoYWRlckhhbmRsZTsKKworCQlib29sIHBpeGVsU2hhZGVyQ2FwdHVyZWQ7CisJCXVuc2lnbmVkIGxvbmcgcGl4ZWxTaGFkZXJIYW5kbGU7CisKKwkJYm9vbCBpbmRleEJ1ZmZlckNhcHR1cmVkOworCQlEaXJlY3QzREluZGV4QnVmZmVyOCAqaW5kZXhCdWZmZXI7CisJCXVuc2lnbmVkIGludCBiYXNlVmVydGV4SW5kZXg7CisKKwkJYm9vbCByZW5kZXJTdGF0ZUNhcHR1cmVkW0QzRFJTX05PUk1BTE9SREVSICsgMV07CisJCXVuc2lnbmVkIGxvbmcgcmVuZGVyU3RhdGVbRDNEUlNfTk9STUFMT1JERVIgKyAxXTsKKworCQlib29sIHRleHR1cmVTdGFnZVN0YXRlQ2FwdHVyZWRbOF1bRDNEVFNTX1JFU1VMVEFSRyArIDFdOworCQl1bnNpZ25lZCBsb25nIHRleHR1cmVTdGFnZVN0YXRlWzhdW0QzRFRTU19SRVNVTFRBUkcgKyAxXTsKKworCQlib29sIHN0cmVhbVNvdXJjZUNhcHR1cmVkWzE2XTsKKwkJc3RydWN0IFN0cmVhbVNvdXJjZQorCQl7CisJCQlEaXJlY3QzRFZlcnRleEJ1ZmZlcjggKnZlcnRleEJ1ZmZlcjsKKwkJCXVuc2lnbmVkIGludCBzdHJpZGU7CisJCX07CisJCVN0cmVhbVNvdXJjZSBzdHJlYW1Tb3VyY2VbMTZdOworCisJCWJvb2wgdGV4dHVyZUNhcHR1cmVkWzhdOworCQlEaXJlY3QzREJhc2VUZXh0dXJlOCAqdGV4dHVyZVs4XTsKKworCQlib29sIHRyYW5zZm9ybUNhcHR1cmVkWzUxMl07CisJCUQzRE1BVFJJWCB0cmFuc2Zvcm1bNTEyXTsKKworCQlib29sIHZpZXdwb3J0Q2FwdHVyZWQ7CisJCUQzRFZJRVdQT1JUOCB2aWV3cG9ydDsKKworCQlib29sIGNsaXBQbGFuZUNhcHR1cmVkWzZdOworCQlmbG9hdCBjbGlwUGxhbmVbNl1bNF07CisKKwkJYm9vbCBtYXRlcmlhbENhcHR1cmVkOworCQlEM0RNQVRFUklBTDggbWF0ZXJpYWw7CisKKwkJYm9vbCBsaWdodENhcHR1cmVkWzhdOyAgIC8vIEZJWE1FOiBVbmxpbWl0ZWQgaW5kZXgKKwkJRDNETElHSFQ4IGxpZ2h0WzhdOworCisJCWJvb2wgbGlnaHRFbmFibGVDYXB0dXJlZFs4XTsgICAvLyBGSVhNRTogVW5saW1pdGVkIGluZGV4CisJCWludCBsaWdodEVuYWJsZVN0YXRlWzhdOworCisJCWZsb2F0IHBpeGVsU2hhZGVyQ29uc3RhbnRbOF1bNF07CisJCWZsb2F0IHZlcnRleFNoYWRlckNvbnN0YW50WzI1Nl1bNF07CisKKwkJYm9vbCBzY2lzc29yUmVjdENhcHR1cmVkOworCQlSRUNUIHNjaXNzb3JSZWN0OworCisJCWJvb2wgcGFsZXR0ZU51bWJlckNhcHR1cmVkOworCQl1bnNpZ25lZCBpbnQgcGFsZXR0ZU51bWJlcjsKKworCQl2b2lkIGNsZWFyKCk7CisJfTsKK30KKworI2VuZGlmICAgLy8gRDNEOF9EaXJlY3QzRFN0YXRlQmxvY2s4X2hwcApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0RpcmVjdDNEU3VyZmFjZTguY3BwIGIvc3JjL0QzRDgvRGlyZWN0M0RTdXJmYWNlOC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmE0ZGVhNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9EM0Q4L0RpcmVjdDNEU3VyZmFjZTguY3BwCkBAIC0wLDAgKzEsMjgwIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiRGlyZWN0M0RTdXJmYWNlOC5ocHAiCisKKyNpbmNsdWRlICJEaXJlY3QzREJhc2VUZXh0dXJlOC5ocHAiCisjaW5jbHVkZSAiRGVidWcuaHBwIgorCisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK2V4dGVybiBib29sIHF1YWRMYXlvdXRFbmFibGVkOworCituYW1lc3BhY2UgRDNEOAoreworCXN0YXRpYyBzdzo6UmVzb3VyY2UgKmdldFBhcmVudFJlc291cmNlKFVua25vd24gKmNvbnRhaW5lcikKKwl7CisJCURpcmVjdDNEQmFzZVRleHR1cmU4ICpiYXNlVGV4dHVyZSA9IGR5bmFtaWNfY2FzdDxEaXJlY3QzREJhc2VUZXh0dXJlOCo+KGNvbnRhaW5lcik7CisKKwkJaWYoYmFzZVRleHR1cmUpCisJCXsKKwkJCXJldHVybiBiYXNlVGV4dHVyZS0+Z2V0UmVzb3VyY2UoKTsKKwkJfQorCisJCXJldHVybiAwOworCX0KKworCWludCBzYW1wbGVDb3VudChEM0RNVUxUSVNBTVBMRV9UWVBFIG11bHRpU2FtcGxlKQorCXsKKwkJaWYobXVsdGlTYW1wbGUgPT0gRDNETVVMVElTQU1QTEVfMl9TQU1QTEVTKQorCQl7CisJCQlyZXR1cm4gMjsKKwkJfQorCQllbHNlIGlmKG11bHRpU2FtcGxlID09IEQzRE1VTFRJU0FNUExFXzRfU0FNUExFUykKKwkJeworCQkJcmV0dXJuIDQ7CisJCX0KKwkJZWxzZSBpZihtdWx0aVNhbXBsZSA9PSBEM0RNVUxUSVNBTVBMRV84X1NBTVBMRVMpCisJCXsKKwkJCXJldHVybiA4OworCQl9CisJCWVsc2UgaWYobXVsdGlTYW1wbGUgPT0gRDNETVVMVElTQU1QTEVfMTZfU0FNUExFUykKKwkJeworCQkJcmV0dXJuIDE2OworCQl9CisKKwkJcmV0dXJuIDE7CisJfQorCisJRGlyZWN0M0RTdXJmYWNlODo6RGlyZWN0M0RTdXJmYWNlOChEaXJlY3QzRERldmljZTggKmRldmljZSwgVW5rbm93biAqY29udGFpbmVyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEQzREZPUk1BVCBmb3JtYXQsIEQzRFBPT0wgcG9vbCwgRDNETVVMVElTQU1QTEVfVFlQRSBtdWx0aVNhbXBsZSwgYm9vbCBsb2NrYWJsZSwgdW5zaWduZWQgbG9uZyB1c2FnZSkgOiBTdXJmYWNlKGdldFBhcmVudFJlc291cmNlKGNvbnRhaW5lciksIHdpZHRoLCBoZWlnaHQsIHNhbXBsZUNvdW50KG11bHRpU2FtcGxlKSwgdHJhbnNsYXRlRm9ybWF0KGZvcm1hdCksIGxvY2thYmxlLCAodXNhZ2UgJiBEM0RVU0FHRV9SRU5ERVJUQVJHRVQpID09IEQzRFVTQUdFX1JFTkRFUlRBUkdFVCB8fCAodXNhZ2UgJiBEM0RVU0FHRV9ERVBUSFNURU5DSUwpID09IEQzRFVTQUdFX0RFUFRIU1RFTkNJTCksIGRldmljZShkZXZpY2UpLCBjb250YWluZXIoY29udGFpbmVyKSwgd2lkdGgod2lkdGgpLCBoZWlnaHQoaGVpZ2h0KSwgZm9ybWF0KGZvcm1hdCksIHBvb2wocG9vbCksIG11bHRpU2FtcGxlKG11bHRpU2FtcGxlKSwgbG9ja2FibGUobG9ja2FibGUpLCB1c2FnZSh1c2FnZSkKKwl7CisJCXBhcmVudFRleHR1cmUgPSBkeW5hbWljX2Nhc3Q8RGlyZWN0M0RCYXNlVGV4dHVyZTgqPihjb250YWluZXIpOworCisJCXJlc291cmNlID0gbmV3IERpcmVjdDNEUmVzb3VyY2U4KGRldmljZSwgRDNEUlRZUEVfU1VSRkFDRSwgbWVtb3J5VXNhZ2Uod2lkdGgsIGhlaWdodCwgZm9ybWF0KSk7CisJfQorCisJRGlyZWN0M0RTdXJmYWNlODo6fkRpcmVjdDNEU3VyZmFjZTgoKQorCXsKKwkJcmVzb3VyY2UtPlJlbGVhc2UoKTsKKwl9CisKKwlsb25nIERpcmVjdDNEU3VyZmFjZTg6OlF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKGlpZCA9PSBJSURfSURpcmVjdDNEU3VyZmFjZTggfHwKKwkJICAgaWlkID09IElJRF9JVW5rbm93bikKKwkJeworCQkJQWRkUmVmKCk7CisJCQkqb2JqZWN0ID0gdGhpczsKKworCQkJcmV0dXJuIFNfT0s7CisJCX0KKworCQkqb2JqZWN0ID0gMDsKKworCQlyZXR1cm4gTk9JTlRFUkZBQ0UoaWlkKTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEU3VyZmFjZTg6OkFkZFJlZigpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYocGFyZW50VGV4dHVyZSkKKwkJeworCQkJcmV0dXJuIHBhcmVudFRleHR1cmUtPkFkZFJlZigpOworCQl9CisKKwkJcmV0dXJuIFVua25vd246OkFkZFJlZigpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RTdXJmYWNlODo6UmVsZWFzZSgpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYocGFyZW50VGV4dHVyZSkKKwkJeworCQkJcmV0dXJuIHBhcmVudFRleHR1cmUtPlJlbGVhc2UoKTsKKwkJfQorCisJCXJldHVybiBVbmtub3duOjpSZWxlYXNlKCk7CisJfQorCisJbG9uZyBEaXJlY3QzRFN1cmZhY2U4OjpGcmVlUHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gcmVzb3VyY2UtPkZyZWVQcml2YXRlRGF0YShndWlkKTsKKwl9CisKKwlsb25nIERpcmVjdDNEU3VyZmFjZTg6OkdldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIHJlc291cmNlLT5HZXRQcml2YXRlRGF0YShndWlkLCBkYXRhLCBzaXplKTsKKwl9CisKKwlsb25nIERpcmVjdDNEU3VyZmFjZTg6OlNldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gcmVzb3VyY2UtPlNldFByaXZhdGVEYXRhKGd1aWQsIGRhdGEsIHNpemUsIGZsYWdzKTsKKwl9CisKKwlsb25nIERpcmVjdDNEU3VyZmFjZTg6OkdldERldmljZShJRGlyZWN0M0REZXZpY2U4ICoqZGV2aWNlKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiByZXNvdXJjZS0+R2V0RGV2aWNlKGRldmljZSk7CisJfQorCisJbG9uZyBEaXJlY3QzRFN1cmZhY2U4OjpMb2NrUmVjdChEM0RMT0NLRURfUkVDVCAqbG9ja2VkUmVjdCwgY29uc3QgUkVDVCAqcmVjdCwgdW5zaWduZWQgbG9uZyBmbGFncykKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZighbG9ja2VkUmVjdCkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlsb2NrZWRSZWN0LT5QaXRjaCA9IGdldEV4dGVybmFsUGl0Y2hCKCk7CisKKwkJc3c6OkxvY2sgbG9jayA9IHN3OjpMT0NLX1JFQURXUklURTsKKworCQlpZihmbGFncyAmIEQzRExPQ0tfRElTQ0FSRCkKKwkJeworCQkJbG9jayA9IHN3OjpMT0NLX0RJU0NBUkQ7CisJCX0KKworCQlpZihmbGFncyAmIEQzRExPQ0tfUkVBRE9OTFkpCisJCXsKKwkJCWxvY2sgPSBzdzo6TE9DS19SRUFET05MWTsKKwkJfQorCisJCWlmKHJlY3QpCisJCXsKKwkJCWxvY2tlZFJlY3QtPnBCaXRzID0gbG9ja0V4dGVybmFsKHJlY3QtPmxlZnQsIHJlY3QtPnRvcCwgMCwgbG9jaywgc3c6OlBVQkxJQyk7CisJCX0KKwkJZWxzZQorCQl7CisJCQlsb2NrZWRSZWN0LT5wQml0cyA9IGxvY2tFeHRlcm5hbCgwLCAwLCAwLCBsb2NrLCBzdzo6UFVCTElDKTsKKwkJfQorCisJCXVubG9ja0V4dGVybmFsKCk7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNEU3VyZmFjZTg6OlVubG9ja1JlY3QoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRFN1cmZhY2U4OjpHZXRDb250YWluZXIoY29uc3QgSUlEICZpaWQsIHZvaWQgKipjb250YWluZXIpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoIWNvbnRhaW5lcikKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlsb25nIHJlc3VsdCA9IHRoaXMtPmNvbnRhaW5lci0+UXVlcnlJbnRlcmZhY2UoaWlkLCBjb250YWluZXIpOworCisJCWlmKHJlc3VsdCA9PSBTX09LKQorCQl7CisJCQlyZXR1cm4gRDNEX09LOworCQl9CisKKwkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJfQorCisJbG9uZyBEaXJlY3QzRFN1cmZhY2U4OjpHZXREZXNjKEQzRFNVUkZBQ0VfREVTQyAqZGVzYykKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZighZGVzYykKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlkZXNjLT5Gb3JtYXQgPSBmb3JtYXQ7CisJCWRlc2MtPlBvb2wgPSBwb29sOworCQlkZXNjLT5UeXBlID0gRDNEUlRZUEVfU1VSRkFDRTsKKwkJZGVzYy0+SGVpZ2h0ID0gaGVpZ2h0OworCQlkZXNjLT5XaWR0aCA9IHdpZHRoOworCQlkZXNjLT5TaXplID0gc2l6ZShnZXRXaWR0aCgpLCBnZXRIZWlnaHQoKSwgZ2V0RGVwdGgoKSwgZ2V0RXh0ZXJuYWxGb3JtYXQoKSk7CisJCWRlc2MtPk11bHRpU2FtcGxlVHlwZSA9IG11bHRpU2FtcGxlOworCQlkZXNjLT5Vc2FnZSA9IHVzYWdlOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJc3c6OkZvcm1hdCBEaXJlY3QzRFN1cmZhY2U4Ojp0cmFuc2xhdGVGb3JtYXQoRDNERk9STUFUIGZvcm1hdCkKKwl7CisJCXN3aXRjaChmb3JtYXQpCisJCXsKKwkJY2FzZSBEM0RGTVRfRFhUMToJCQlyZXR1cm4gc3c6OkZPUk1BVF9EWFQxOworCQljYXNlIEQzREZNVF9EWFQyOgkJCXJldHVybiBzdzo6Rk9STUFUX0RYVDM7CisJCWNhc2UgRDNERk1UX0RYVDM6CQkJcmV0dXJuIHN3OjpGT1JNQVRfRFhUMzsKKwkJY2FzZSBEM0RGTVRfRFhUNDoJCQlyZXR1cm4gc3c6OkZPUk1BVF9EWFQ1OworCQljYXNlIEQzREZNVF9EWFQ1OgkJCXJldHVybiBzdzo6Rk9STUFUX0RYVDU7CisJCWNhc2UgRDNERk1UX1IzRzNCMjoJCQlyZXR1cm4gc3c6OkZPUk1BVF9SM0czQjI7CisJCWNhc2UgRDNERk1UX0E4UjNHM0IyOgkJcmV0dXJuIHN3OjpGT1JNQVRfQThSM0czQjI7CisJCWNhc2UgRDNERk1UX1g0UjRHNEI0OgkJcmV0dXJuIHN3OjpGT1JNQVRfWDRSNEc0QjQ7CisJCWNhc2UgRDNERk1UX0E0UjRHNEI0OgkJcmV0dXJuIHN3OjpGT1JNQVRfQTRSNEc0QjQ7CisJCWNhc2UgRDNERk1UX0E4UjhHOEI4OgkJcmV0dXJuIHN3OjpGT1JNQVRfQThSOEc4Qjg7CisJCWNhc2UgRDNERk1UX0cxNlIxNjoJCQlyZXR1cm4gc3c6OkZPUk1BVF9HMTZSMTY7CisJCWNhc2UgRDNERk1UX0EyQjEwRzEwUjEwOglyZXR1cm4gc3c6OkZPUk1BVF9BMkIxMEcxMFIxMDsKKwkJY2FzZSBEM0RGTVRfUDg6CQkJCXJldHVybiBzdzo6Rk9STUFUX1A4OworCQljYXNlIEQzREZNVF9BOFA4OgkJCXJldHVybiBzdzo6Rk9STUFUX0E4UDg7CisJCWNhc2UgRDNERk1UX0E4OgkJCQlyZXR1cm4gc3c6OkZPUk1BVF9BODsKKwkJY2FzZSBEM0RGTVRfUjVHNkI1OgkJCXJldHVybiBzdzo6Rk9STUFUX1I1RzZCNTsKKwkJY2FzZSBEM0RGTVRfWDFSNUc1QjU6CQlyZXR1cm4gc3c6OkZPUk1BVF9YMVI1RzVCNTsKKwkJY2FzZSBEM0RGTVRfQTFSNUc1QjU6CQlyZXR1cm4gc3c6OkZPUk1BVF9BMVI1RzVCNTsKKwkJY2FzZSBEM0RGTVRfUjhHOEI4OgkJCXJldHVybiBzdzo6Rk9STUFUX1I4RzhCODsKKwkJY2FzZSBEM0RGTVRfWDhSOEc4Qjg6CQlyZXR1cm4gc3c6OkZPUk1BVF9YOFI4RzhCODsKKwkJY2FzZSBEM0RGTVRfVjhVODoJCQlyZXR1cm4gc3c6OkZPUk1BVF9WOFU4OworCQljYXNlIEQzREZNVF9MNlY1VTU6CQkJcmV0dXJuIHN3OjpGT1JNQVRfTDZWNVU1OworCQljYXNlIEQzREZNVF9ROFc4VjhVODoJCXJldHVybiBzdzo6Rk9STUFUX1E4VzhWOFU4OworCQljYXNlIEQzREZNVF9YOEw4VjhVODoJCXJldHVybiBzdzo6Rk9STUFUX1g4TDhWOFU4OworCQljYXNlIEQzREZNVF9BMlcxMFYxMFUxMDoJcmV0dXJuIHN3OjpGT1JNQVRfQTJXMTBWMTBVMTA7CisJCWNhc2UgRDNERk1UX1YxNlUxNjoJCQlyZXR1cm4gc3c6OkZPUk1BVF9WMTZVMTY7CisJCWNhc2UgRDNERk1UX0w4OgkJCQlyZXR1cm4gc3c6OkZPUk1BVF9MODsKKwkJY2FzZSBEM0RGTVRfQTRMNDoJCQlyZXR1cm4gc3c6OkZPUk1BVF9BNEw0OworCQljYXNlIEQzREZNVF9BOEw4OgkJCXJldHVybiBzdzo6Rk9STUFUX0E4TDg7CisJCWNhc2UgRDNERk1UX0QxNjoJCQlyZXR1cm4gc3c6OkZPUk1BVF9EMTY7CisJCWNhc2UgRDNERk1UX0QzMjoJCQlyZXR1cm4gc3c6OkZPUk1BVF9EMzI7CisJCWNhc2UgRDNERk1UX0QyNFg4OgkJCXJldHVybiBzdzo6Rk9STUFUX0QyNFg4OworCQljYXNlIEQzREZNVF9EMjRTODoJCQlyZXR1cm4gc3c6OkZPUk1BVF9EMjRTODsKKwkJZGVmYXVsdDoKKwkJCUFTU0VSVChmYWxzZSk7CisJCX0KKworCQlyZXR1cm4gc3c6OkZPUk1BVF9OVUxMOworCX0KKworCWludCBEaXJlY3QzRFN1cmZhY2U4OjpieXRlcyhEM0RGT1JNQVQgZm9ybWF0KQorCXsKKwkJcmV0dXJuIFN1cmZhY2U6OmJ5dGVzKHRyYW5zbGF0ZUZvcm1hdChmb3JtYXQpKTsKKwl9CisKKwl1bnNpZ25lZCBpbnQgRGlyZWN0M0RTdXJmYWNlODo6bWVtb3J5VXNhZ2UoaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBEM0RGT1JNQVQgZm9ybWF0KQorCXsKKwkJcmV0dXJuIFN1cmZhY2U6OnNpemUod2lkdGgsIGhlaWdodCwgMSwgdHJhbnNsYXRlRm9ybWF0KGZvcm1hdCkpOworCX0KK30KZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0RpcmVjdDNEU3VyZmFjZTguaHBwIGIvc3JjL0QzRDgvRGlyZWN0M0RTdXJmYWNlOC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjc5NjQ4MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9EM0Q4L0RpcmVjdDNEU3VyZmFjZTguaHBwCkBAIC0wLDAgKzEsNzQgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgRDNEOF9EaXJlY3QzRFN1cmZhY2U4X2hwcAorI2RlZmluZSBEM0Q4X0RpcmVjdDNEU3VyZmFjZThfaHBwCisKKyNpbmNsdWRlICJVbmtub3duLmhwcCIKKyNpbmNsdWRlICJTdXJmYWNlLmhwcCIKKworI2luY2x1ZGUgPGQzZDguaD4KKworbmFtZXNwYWNlIEQzRDgKK3sKKwljbGFzcyBEaXJlY3QzRERldmljZTg7CisJY2xhc3MgRGlyZWN0M0RSZXNvdXJjZTg7CisJY2xhc3MgRGlyZWN0M0RCYXNlVGV4dHVyZTg7CisKKwljbGFzcyBEaXJlY3QzRFN1cmZhY2U4IDogcHVibGljIElEaXJlY3QzRFN1cmZhY2U4LCBwdWJsaWMgVW5rbm93biwgcHVibGljIHN3OjpTdXJmYWNlCisJeworCXB1YmxpYzoKKwkJRGlyZWN0M0RTdXJmYWNlOChEaXJlY3QzRERldmljZTggKmRldmljZSwgVW5rbm93biAqY29udGFpbmVyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIEQzREZPUk1BVCBmb3JtYXQsIEQzRFBPT0wgcG9vbCwgRDNETVVMVElTQU1QTEVfVFlQRSBtdWx0aVNhbXBsZSwgYm9vbCBsb2NrYWJsZSwgdW5zaWduZWQgbG9uZyB1c2FnZSk7CisKKwkJdmlydHVhbCB+RGlyZWN0M0RTdXJmYWNlOCgpOworCisJCS8vIElVbmtub3duIG1ldGhvZHMKKwkJbG9uZyBfX3N0ZGNhbGwgUXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBBZGRSZWYoKTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgUmVsZWFzZSgpOwkJCisKKwkJLy8gSURpcmVjdDNEU3VyZmFjZTggbWV0aG9kcworCQlsb25nIF9fc3RkY2FsbCBHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOCAqKmRldmljZSk7CisJCWxvbmcgX19zdGRjYWxsIFNldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncyk7CisJCWxvbmcgX19zdGRjYWxsIEdldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpOworCQlsb25nIF9fc3RkY2FsbCBGcmVlUHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCk7CisJCWxvbmcgX19zdGRjYWxsIEdldENvbnRhaW5lcihjb25zdCBJSUQgJmlpZCwgdm9pZCAqKmNvbnRhaW5lcik7CisJCWxvbmcgX19zdGRjYWxsIEdldERlc2MoRDNEU1VSRkFDRV9ERVNDICpkZXNjKTsKKwkJbG9uZyBfX3N0ZGNhbGwgTG9ja1JlY3QoRDNETE9DS0VEX1JFQ1QgKmxvY2tlZFJlY3QsIGNvbnN0IFJFQ1QgKnJlY3QsIHVuc2lnbmVkIGxvbmcgRmxhZ3MpOworCQlsb25nIF9fc3RkY2FsbCBVbmxvY2tSZWN0KCk7CisKKwkJLy8gSW50ZXJuYWwgbWV0aG9kcworCQlzdGF0aWMgc3c6OkZvcm1hdCB0cmFuc2xhdGVGb3JtYXQoRDNERk9STUFUIGZvcm1hdCk7CisJCXN0YXRpYyBpbnQgYnl0ZXMoRDNERk9STUFUIGZvcm1hdCk7CisKKwlwcml2YXRlOgorCQlzdGF0aWMgdW5zaWduZWQgaW50IG1lbW9yeVVzYWdlKGludCB3aWR0aCwgaW50IGhlaWdodCwgRDNERk9STUFUIGZvcm1hdCk7ICAgLy8gRklYTUU6IFN1cmZhY2U6OnNpemUKKworCQkvLyBDcmVhdGlvbiBwYXJhbWV0ZXJzCisJCURpcmVjdDNERGV2aWNlOCAqY29uc3QgZGV2aWNlOworCQlVbmtub3duICpjb25zdCBjb250YWluZXI7CisJCWNvbnN0IGludCB3aWR0aDsKKwkJY29uc3QgaW50IGhlaWdodDsKKwkJY29uc3QgRDNERk9STUFUIGZvcm1hdDsKKwkJY29uc3QgRDNETVVMVElTQU1QTEVfVFlQRSBtdWx0aVNhbXBsZTsKKwkJY29uc3QgRDNEUE9PTCBwb29sOworCQljb25zdCBib29sIGxvY2thYmxlOworCQljb25zdCB1bnNpZ25lZCBsb25nIHVzYWdlOworCisJCURpcmVjdDNEQmFzZVRleHR1cmU4ICpwYXJlbnRUZXh0dXJlOworCQlEaXJlY3QzRFJlc291cmNlOCAqcmVzb3VyY2U7CisJfTsKK30KKworI2VuZGlmIC8vIEQzRDhfRGlyZWN0M0RTdXJmYWNlOF9ocHAKZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0RpcmVjdDNEU3dhcENoYWluOC5jcHAgYi9zcmMvRDNEOC9EaXJlY3QzRFN3YXBDaGFpbjguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OWJmMTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOC9EaXJlY3QzRFN3YXBDaGFpbjguY3BwCkBAIC0wLDAgKzEsMjMwIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiRGlyZWN0M0RTd2FwQ2hhaW44LmhwcCIKKworI2luY2x1ZGUgIkRpcmVjdDNERGV2aWNlOC5ocHAiCisjaW5jbHVkZSAiQ29uZmlnLmhwcCIKKyNpbmNsdWRlICJDb25maWd1cmF0b3IuaHBwIgorI2luY2x1ZGUgIkRlYnVnLmhwcCIKKworI2luY2x1ZGUgIkZyYW1lQnVmZmVyREQuaHBwIgorI2luY2x1ZGUgIkZyYW1lQnVmZmVyR0RJLmhwcCIKKworbmFtZXNwYWNlIEQzRDgKK3sKKwlEaXJlY3QzRFN3YXBDaGFpbjg6OkRpcmVjdDNEU3dhcENoYWluOChEaXJlY3QzRERldmljZTggKmRldmljZSwgRDNEUFJFU0VOVF9QQVJBTUVURVJTICpwcmVzZW50UGFyYW1ldGVycykgOiBkZXZpY2UoZGV2aWNlKSwgcHJlc2VudFBhcmFtZXRlcnMoKnByZXNlbnRQYXJhbWV0ZXJzKQorCXsKKwkJZnJhbWVCdWZmZXIgPSAwOworCisJCWZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspCisJCXsKKwkJCWJhY2tCdWZmZXJbaV0gPSAwOworCQl9CisKKwkJcmVzZXQocHJlc2VudFBhcmFtZXRlcnMpOworCX0KKworCURpcmVjdDNEU3dhcENoYWluODo6fkRpcmVjdDNEU3dhcENoYWluOCgpCisJeworCQlyZWxlYXNlKCk7CisJfQorCisJbG9uZyBEaXJlY3QzRFN3YXBDaGFpbjg6OlF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKGlpZCA9PSBJSURfSURpcmVjdDNEU3dhcENoYWluOCB8fAorCQkgICBpaWQgPT0gSUlEX0lVbmtub3duKQorCQl7CisJCQlBZGRSZWYoKTsKKwkJCSpvYmplY3QgPSB0aGlzOworCisJCQlyZXR1cm4gU19PSzsKKwkJfQorCisJCSpvYmplY3QgPSAwOworCisJCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RTd2FwQ2hhaW44OjpBZGRSZWYoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBVbmtub3duOjpBZGRSZWYoKTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEU3dhcENoYWluODo6UmVsZWFzZSgpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIFVua25vd246OlJlbGVhc2UoKTsKKwl9CisKKwlsb25nIERpcmVjdDNEU3dhcENoYWluODo6UHJlc2VudChjb25zdCBSRUNUICpzb3VyY2VSZWN0LCBjb25zdCBSRUNUICpkZXN0UmVjdCwgSFdORCBkZXN0V2luZG93T3ZlcnJpZGUsIGNvbnN0IFJHTkRBVEEgKmRpcnR5UmVnaW9uKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCSNpZiBQRVJGX1BST0ZJTEUKKwkJCXByb2ZpbGVyLm5leHRGcmFtZSgpOworCQkjZW5kaWYKKworCQl2b2lkICpzb3VyY2UgPSBiYWNrQnVmZmVyWzBdLT5sb2NrSW50ZXJuYWwoMCwgMCwgMCwgc3c6OkxPQ0tfUkVBRE9OTFksIHN3OjpQVUJMSUMpOyAgIC8vIEZJWE1FOiBFeHRlcm5hbAorCQlzdzo6Rm9ybWF0IGZvcm1hdCA9IGJhY2tCdWZmZXJbMF0tPmdldEludGVybmFsRm9ybWF0KCk7CisJCWludCBzdHJpZGUgPSBiYWNrQnVmZmVyWzBdLT5nZXRJbnRlcm5hbFBpdGNoQigpOworCisJCWlmKCFzb3VyY2VSZWN0ICYmICFkZXN0UmVjdCkgICAvLyBGSVhNRTogTW9yZSBjYXNlcz8KKwkJeworCQkJZnJhbWVCdWZmZXItPmZsaXAoZGVzdFdpbmRvd092ZXJyaWRlLCBzb3VyY2UsIGZvcm1hdCwgc3RyaWRlKTsKKwkJfQorCQllbHNlICAgLy8gVE9ETzogQ2hlY2sgZm9yIFNXQVBFRkZFQ1RfQ09QWQorCQl7CisJCQlzdzo6UmVjdCBzUmVjdCgwLCAwLCAwLCAwKTsKKwkJCXN3OjpSZWN0IGRSZWN0KDAsIDAsIDAsIDApOworCisJCQlpZihzb3VyY2VSZWN0KQorCQkJeworCQkJCXNSZWN0LngwID0gc291cmNlUmVjdC0+bGVmdDsKKwkJCQlzUmVjdC55MCA9IHNvdXJjZVJlY3QtPnRvcDsKKwkJCQlzUmVjdC54MSA9IHNvdXJjZVJlY3QtPnJpZ2h0OworCQkJCXNSZWN0LnkxID0gc291cmNlUmVjdC0+Ym90dG9tOworCQkJfQorCisJCQlpZihkZXN0UmVjdCkKKwkJCXsKKwkJCQlkUmVjdC54MCA9IGRlc3RSZWN0LT5sZWZ0OworCQkJCWRSZWN0LnkwID0gZGVzdFJlY3QtPnRvcDsKKwkJCQlkUmVjdC54MSA9IGRlc3RSZWN0LT5yaWdodDsKKwkJCQlkUmVjdC55MSA9IGRlc3RSZWN0LT5ib3R0b207CisJCQl9CisKKwkJCWZyYW1lQnVmZmVyLT5ibGl0KGRlc3RXaW5kb3dPdmVycmlkZSwgc291cmNlLCBzb3VyY2VSZWN0ID8gJnNSZWN0IDogbnVsbHB0ciwgZGVzdFJlY3QgPyAmZFJlY3QgOiBudWxscHRyLCBmb3JtYXQsIHN0cmlkZSk7CisJCX0KKworCQliYWNrQnVmZmVyWzBdLT51bmxvY2tJbnRlcm5hbCgpOyAgIC8vIEZJWE1FOiBFeHRlcm5hbAorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRFN3YXBDaGFpbjg6OkdldEJhY2tCdWZmZXIodW5zaWduZWQgaW50IGluZGV4LCBEM0RCQUNLQlVGRkVSX1RZUEUgdHlwZSwgSURpcmVjdDNEU3VyZmFjZTggKipiYWNrQnVmZmVyKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFiYWNrQnVmZmVyLyogfHwgdHlwZSAhPSBEM0RCQUNLQlVGRkVSX1RZUEVfTU9OTyovKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWlmKGluZGV4ID49IDMgfHwgdGhpcy0+YmFja0J1ZmZlcltpbmRleF0gPT0gMCkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQl0aGlzLT5iYWNrQnVmZmVyW2luZGV4XS0+QWRkUmVmKCk7CisJCSpiYWNrQnVmZmVyID0gdGhpcy0+YmFja0J1ZmZlcltpbmRleF07IAorCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJdm9pZCBEaXJlY3QzRFN3YXBDaGFpbjg6OnJlc2V0KEQzRFBSRVNFTlRfUEFSQU1FVEVSUyAqcHJlc2VudFBhcmFtZXRlcnMpCisJeworCQlyZWxlYXNlKCk7CisKKwkJdGhpcy0+cHJlc2VudFBhcmFtZXRlcnMgPSAqcHJlc2VudFBhcmFtZXRlcnM7CisKKwkJQVNTRVJUKHByZXNlbnRQYXJhbWV0ZXJzLT5CYWNrQnVmZmVyQ291bnQgPD0gMyk7ICAgLy8gTWF4aW11bSBvZiB0aHJlZSBiYWNrIGJ1ZmZlcnMKKworCQlpZihwcmVzZW50UGFyYW1ldGVycy0+QmFja0J1ZmZlckNvdW50ID09IDApCisJCXsKKwkJCXByZXNlbnRQYXJhbWV0ZXJzLT5CYWNrQnVmZmVyQ291bnQgPSAxOworCQl9CisKKwkJRDNEREVWSUNFX0NSRUFUSU9OX1BBUkFNRVRFUlMgY3JlYXRpb25QYXJhbWV0ZXJzOworCQlkZXZpY2UtPkdldENyZWF0aW9uUGFyYW1ldGVycygmY3JlYXRpb25QYXJhbWV0ZXJzKTsKKworCQlIV05EIHdpbmRvd0hhbmRsZSA9IHByZXNlbnRQYXJhbWV0ZXJzLT5oRGV2aWNlV2luZG93ID8gcHJlc2VudFBhcmFtZXRlcnMtPmhEZXZpY2VXaW5kb3cgOiBjcmVhdGlvblBhcmFtZXRlcnMuaEZvY3VzV2luZG93OworCQkJCisJCWludCB3aWR0aCA9IDA7CisJCWludCBoZWlnaHQgPSAwOworCisJCWlmKHByZXNlbnRQYXJhbWV0ZXJzLT5XaW5kb3dlZCAmJiAocHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJIZWlnaHQgPT0gMCB8fCBwcmVzZW50UGFyYW1ldGVycy0+QmFja0J1ZmZlcldpZHRoID09IDApKQorCQl7CisJCQlSRUNUIHJlY3RhbmdsZTsKKwkJCUdldENsaWVudFJlY3Qod2luZG93SGFuZGxlLCAmcmVjdGFuZ2xlKTsKKworCQkJd2lkdGggPSByZWN0YW5nbGUucmlnaHQgLSByZWN0YW5nbGUubGVmdDsKKwkJCWhlaWdodCA9IHJlY3RhbmdsZS5ib3R0b20gLSByZWN0YW5nbGUudG9wOworCQl9CisJCWVsc2UKKwkJeworCQkJd2lkdGggPSBwcmVzZW50UGFyYW1ldGVycy0+QmFja0J1ZmZlcldpZHRoOworCQkJaGVpZ2h0ID0gcHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJIZWlnaHQ7CisJCX0KKworCQlmcmFtZUJ1ZmZlciA9IGNyZWF0ZUZyYW1lQnVmZmVyV2luKHdpbmRvd0hhbmRsZSwgcHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJXaWR0aCwgcHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJIZWlnaHQsIHByZXNlbnRQYXJhbWV0ZXJzLT5XaW5kb3dlZCA9PSBGQUxTRSwgdHJ1ZSk7CisKKwkJbG9ja2FibGUgPSBwcmVzZW50UGFyYW1ldGVycy0+RmxhZ3MgJiBEM0RQUkVTRU5URkxBR19MT0NLQUJMRV9CQUNLQlVGRkVSOworCisJCWJhY2tCdWZmZXJbMF0gPSAwOworCQliYWNrQnVmZmVyWzFdID0gMDsKKwkJYmFja0J1ZmZlclsyXSA9IDA7CisKKwkJZm9yKGludCBpID0gMDsgaSA8IChpbnQpcHJlc2VudFBhcmFtZXRlcnMtPkJhY2tCdWZmZXJDb3VudDsgaSsrKQorCQl7CisJCQliYWNrQnVmZmVyW2ldID0gbmV3IERpcmVjdDNEU3VyZmFjZTgoZGV2aWNlLCB0aGlzLCB3aWR0aCwgaGVpZ2h0LCBwcmVzZW50UGFyYW1ldGVycy0+QmFja0J1ZmZlckZvcm1hdCwgRDNEUE9PTF9ERUZBVUxULCBwcmVzZW50UGFyYW1ldGVycy0+TXVsdGlTYW1wbGVUeXBlLCBsb2NrYWJsZSwgRDNEVVNBR0VfUkVOREVSVEFSR0VUKTsKKwkJCWJhY2tCdWZmZXJbaV0tPmJpbmQoKTsKKwkJfQorCX0KKworCXZvaWQgRGlyZWN0M0RTd2FwQ2hhaW44OjpyZWxlYXNlKCkKKwl7CisJCWRlbGV0ZSBmcmFtZUJ1ZmZlcjsKKwkJZnJhbWVCdWZmZXIgPSAwOworCisJCWZvcihpbnQgaSA9IDA7IGkgPCAzOyBpKyspCisJCXsKKwkJCWlmKGJhY2tCdWZmZXJbaV0pCisJCQl7CisJCQkJYmFja0J1ZmZlcltpXS0+dW5iaW5kKCk7CisJCQkJYmFja0J1ZmZlcltpXSA9IDA7CisJCQl9CisJCX0KKwl9CisKKwl2b2lkIERpcmVjdDNEU3dhcENoYWluODo6c2NyZWVuc2hvdCh2b2lkICpkZXN0QnVmZmVyKQorCXsKKwkJZnJhbWVCdWZmZXItPnNjcmVlbnNob3QoZGVzdEJ1ZmZlcik7CisJfQorCisJdm9pZCBEaXJlY3QzRFN3YXBDaGFpbjg6OnNldEdhbW1hUmFtcChzdzo6R2FtbWFSYW1wICpnYW1tYVJhbXAsIGJvb2wgY2FsaWJyYXRlKQorCXsKKwkJZnJhbWVCdWZmZXItPnNldEdhbW1hUmFtcChnYW1tYVJhbXAsIGNhbGlicmF0ZSk7CisJfQorCisJdm9pZCBEaXJlY3QzRFN3YXBDaGFpbjg6OmdldEdhbW1hUmFtcChzdzo6R2FtbWFSYW1wICpnYW1tYVJhbXApCisJeworCQlmcmFtZUJ1ZmZlci0+Z2V0R2FtbWFSYW1wKGdhbW1hUmFtcCk7CisJfQorCisJdm9pZCAqRGlyZWN0M0RTd2FwQ2hhaW44Ojpsb2NrQmFja0J1ZmZlcihpbnQgaW5kZXgpCisJeworCQlyZXR1cm4gYmFja0J1ZmZlcltpbmRleF0tPmxvY2tJbnRlcm5hbCgwLCAwLCAwLCBzdzo6TE9DS19SRUFEV1JJVEUsIHN3OjpQVUJMSUMpOyAgIC8vIEZJWE1FOiBFeHRlcm5hbAorCX0KKwkKKwl2b2lkIERpcmVjdDNEU3dhcENoYWluODo6dW5sb2NrQmFja0J1ZmZlcihpbnQgaW5kZXgpCisJeworCQliYWNrQnVmZmVyW2luZGV4XS0+dW5sb2NrSW50ZXJuYWwoKTsgICAvLyBGSVhNRTogRXh0ZXJuYWwKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvRDNEOC9EaXJlY3QzRFN3YXBDaGFpbjguaHBwIGIvc3JjL0QzRDgvRGlyZWN0M0RTd2FwQ2hhaW44LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTBjMTk0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDgvRGlyZWN0M0RTd2FwQ2hhaW44LmhwcApAQCAtMCwwICsxLDcwIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIEQzRDhfRGlyZWN0M0RTd2FwQ2hhaW44X2hwcAorI2RlZmluZSBEM0Q4X0RpcmVjdDNEU3dhcENoYWluOF9ocHAKKworI2luY2x1ZGUgIlVua25vd24uaHBwIgorCisjaW5jbHVkZSAiRGlyZWN0M0RTdXJmYWNlOC5ocHAiCisKKyNpbmNsdWRlICJGcmFtZUJ1ZmZlcldpbi5ocHAiCisKKyNpbmNsdWRlIDxkM2Q4Lmg+CisKK25hbWVzcGFjZSBEM0Q4Cit7CisJY2xhc3MgRGlyZWN0M0RTd2FwQ2hhaW44IDogcHVibGljIElEaXJlY3QzRFN3YXBDaGFpbjgsIHB1YmxpYyBVbmtub3duCisJeworCXB1YmxpYzoKKwkJRGlyZWN0M0RTd2FwQ2hhaW44KERpcmVjdDNERGV2aWNlOCAqZGV2aWNlLCBEM0RQUkVTRU5UX1BBUkFNRVRFUlMgKnByZXNlbnRQYXJhbWV0ZXJzKTsKKworCQl2aXJ0dWFsIH5EaXJlY3QzRFN3YXBDaGFpbjgoKTsKKworCQkvLyBJVW5rbm93biBtZXRob2RzCisJCWxvbmcgX19zdGRjYWxsIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgQWRkUmVmKCk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFJlbGVhc2UoKTsKKworCQkvLyBJRGlyZWN0M0RTd2FwQ2hhaW44IG1ldGhvZHMKKwkgICAgbG9uZyBfX3N0ZGNhbGwgUHJlc2VudChjb25zdCBSRUNUICpzb3VyY2VSZWN0LCBjb25zdCBSRUNUICpkZXN0UmVjdCwgSFdORCBkZXN0V2luZG93T3ZlcnJpZGUsIGNvbnN0IFJHTkRBVEEgKmRpcnR5UmVnaW9uKTsKKwkgICAgbG9uZyBfX3N0ZGNhbGwgR2V0QmFja0J1ZmZlcih1bnNpZ25lZCBpbnQgaW5kZXgsIEQzREJBQ0tCVUZGRVJfVFlQRSB0eXBlLCBJRGlyZWN0M0RTdXJmYWNlOCAqKmJhY2tCdWZmZXIpOworCisJCS8vIEludGVybmFsIG1ldGhvZHMKKwkJdm9pZCByZXNldChEM0RQUkVTRU5UX1BBUkFNRVRFUlMgKnByZXNlbnRQYXJhbWV0ZXJzKTsKKwkJCisJCXZvaWQgc2NyZWVuc2hvdCh2b2lkICpkZXN0QnVmZmVyKTsKKwkJdm9pZCBzZXRHYW1tYVJhbXAoc3c6OkdhbW1hUmFtcCAqZ2FtbWFSYW1wLCBib29sIGNhbGlicmF0ZSk7CisJCXZvaWQgZ2V0R2FtbWFSYW1wKHN3OjpHYW1tYVJhbXAgKmdhbW1hUmFtcCk7CisKKwkJdm9pZCAqbG9ja0JhY2tCdWZmZXIoaW50IGluZGV4KTsKKwkJdm9pZCB1bmxvY2tCYWNrQnVmZmVyKGludCBpbmRleCk7CisKKwlwcml2YXRlOgorCQl2b2lkIHJlbGVhc2UoKTsKKworCQkvLyBDcmVhdGlvbiBwYXJhbWV0ZXJzCisJCURpcmVjdDNERGV2aWNlOCAqY29uc3QgZGV2aWNlOworCQlEM0RQUkVTRU5UX1BBUkFNRVRFUlMgcHJlc2VudFBhcmFtZXRlcnM7CisKKwkJYm9vbCBsb2NrYWJsZTsKKworCQlzdzo6RnJhbWVCdWZmZXJXaW4gKmZyYW1lQnVmZmVyOworCisJcHVibGljOiAgIC8vIEZJWE1FCisJCURpcmVjdDNEU3VyZmFjZTggKmJhY2tCdWZmZXJbM107ICAgLy8gTk9URTogVXAgdG8gdGhyZWUKKwl9OworfQorCisjZW5kaWYgLy8gRDNEOF9EaXJlY3QzRFN3YXBDaGFpbjhfaHBwCmRpZmYgLS1naXQgYS9zcmMvRDNEOC9EaXJlY3QzRFRleHR1cmU4LmNwcCBiL3NyYy9EM0Q4L0RpcmVjdDNEVGV4dHVyZTguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3ZDgzNDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOC9EaXJlY3QzRFRleHR1cmU4LmNwcApAQCAtMCwwICsxLDI0MiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgIkRpcmVjdDNEVGV4dHVyZTguaHBwIgorCisjaW5jbHVkZSAiRGlyZWN0M0RTdXJmYWNlOC5ocHAiCisjaW5jbHVkZSAiUmVzb3VyY2UuaHBwIgorI2luY2x1ZGUgIkRlYnVnLmhwcCIKKworI2luY2x1ZGUgPGFzc2VydC5oPgorCituYW1lc3BhY2UgRDNEOAoreworCURpcmVjdDNEVGV4dHVyZTg6OkRpcmVjdDNEVGV4dHVyZTgoRGlyZWN0M0REZXZpY2U4ICpkZXZpY2UsIHVuc2lnbmVkIGludCB3aWR0aCwgdW5zaWduZWQgaW50IGhlaWdodCwgdW5zaWduZWQgaW50IGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sKSA6IERpcmVjdDNEQmFzZVRleHR1cmU4KGRldmljZSwgRDNEUlRZUEVfVEVYVFVSRSwgbGV2ZWxzLCB1c2FnZSksIHdpZHRoKHdpZHRoKSwgaGVpZ2h0KGhlaWdodCksIGZvcm1hdChmb3JtYXQpLCBwb29sKHBvb2wpCisJeworCQlpZihsZXZlbHMgPT0gMCkKKwkJeworCQkJdGhpcy0+bGV2ZWxzID0gc3c6OmxvZzIoc3c6Om1heCgoaW50KXdpZHRoLCAoaW50KWhlaWdodCwgMSkpICsgMTsKKwkJfQorCisJCWZvcih1bnNpZ25lZCBpbnQgbGV2ZWwgPSAwOyBsZXZlbCA8IHN3OjpNSVBNQVBfTEVWRUxTOyBsZXZlbCsrKQorCQl7CisJCQlpZihsZXZlbCA8IHRoaXMtPmxldmVscykKKwkJCXsKKwkJCQlzdXJmYWNlTGV2ZWxbbGV2ZWxdID0gbmV3IERpcmVjdDNEU3VyZmFjZTgoZGV2aWNlLCB0aGlzLCB3aWR0aCwgaGVpZ2h0LCBmb3JtYXQsIHBvb2wsIEQzRE1VTFRJU0FNUExFX05PTkUsIHRydWUsIHVzYWdlKTsKKwkJCQlzdXJmYWNlTGV2ZWxbbGV2ZWxdLT5iaW5kKCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJc3VyZmFjZUxldmVsW2xldmVsXSA9IDA7CisJCQl9CisKKwkJCXdpZHRoID0gc3c6Om1heCgxLCAoaW50KXdpZHRoIC8gMik7CisJCQloZWlnaHQgPSBzdzo6bWF4KDEsIChpbnQpaGVpZ2h0IC8gMik7CisJCX0KKwl9CisKKwlEaXJlY3QzRFRleHR1cmU4Ojp+RGlyZWN0M0RUZXh0dXJlOCgpCisJeworCQlyZXNvdXJjZS0+bG9jayhzdzo6REVTVFJVQ1QpOworCisJCWZvcihpbnQgbGV2ZWwgPSAwOyBsZXZlbCA8IHN3OjpNSVBNQVBfTEVWRUxTOyBsZXZlbCsrKQorCQl7CisJCQlpZihzdXJmYWNlTGV2ZWxbbGV2ZWxdKQorCQkJeworCQkJCXN1cmZhY2VMZXZlbFtsZXZlbF0tPnVuYmluZCgpOworCQkJCXN1cmZhY2VMZXZlbFtsZXZlbF0gPSAwOworCQkJfQorCQl9CisKKwkJcmVzb3VyY2UtPnVubG9jaygpOworCX0KKworCWxvbmcgRGlyZWN0M0RUZXh0dXJlODo6UXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoaWlkID09IElJRF9JRGlyZWN0M0RUZXh0dXJlOCB8fAorCQkgICBpaWQgPT0gSUlEX0lEaXJlY3QzREJhc2VUZXh0dXJlOCB8fAorCQkgICBpaWQgPT0gSUlEX0lEaXJlY3QzRFJlc291cmNlOCB8fAorCQkgICBpaWQgPT0gSUlEX0lVbmtub3duKQorCQl7CisJCQlBZGRSZWYoKTsKKwkJCSpvYmplY3QgPSB0aGlzOworCisJCQlyZXR1cm4gU19PSzsKKwkJfQorCisJCSpvYmplY3QgPSAwOworCisJCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RUZXh0dXJlODo6QWRkUmVmKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTg6OkFkZFJlZigpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RUZXh0dXJlODo6UmVsZWFzZSgpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU4OjpSZWxlYXNlKCk7CisJfQorCisJbG9uZyBEaXJlY3QzRFRleHR1cmU4OjpGcmVlUHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTg6OkZyZWVQcml2YXRlRGF0YShndWlkKTsKKwl9CisKKwlsb25nIERpcmVjdDNEVGV4dHVyZTg6OkdldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU4OjpHZXRQcml2YXRlRGF0YShndWlkLCBkYXRhLCBzaXplKTsKKwl9CisKKwl2b2lkIERpcmVjdDNEVGV4dHVyZTg6OlByZUxvYWQoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCURpcmVjdDNEQmFzZVRleHR1cmU4OjpQcmVMb2FkKCk7CisJfQorCisJbG9uZyBEaXJlY3QzRFRleHR1cmU4OjpTZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU4OjpTZXRQcml2YXRlRGF0YShndWlkLCBkYXRhLCBzaXplLCBmbGFncyk7CisJfQorCisJbG9uZyBEaXJlY3QzRFRleHR1cmU4OjpHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOCAqKmRldmljZSkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTg6OkdldERldmljZShkZXZpY2UpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RUZXh0dXJlODo6U2V0UHJpb3JpdHkodW5zaWduZWQgbG9uZyBuZXdQcmlvcml0eSkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTg6OlNldFByaW9yaXR5KG5ld1ByaW9yaXR5KTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEVGV4dHVyZTg6OkdldFByaW9yaXR5KCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTg6OkdldFByaW9yaXR5KCk7CisJfQorCisJRDNEUkVTT1VSQ0VUWVBFIERpcmVjdDNEVGV4dHVyZTg6OkdldFR5cGUoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlODo6R2V0VHlwZSgpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RUZXh0dXJlODo6R2V0TGV2ZWxDb3VudCgpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU4OjpHZXRMZXZlbENvdW50KCk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRFRleHR1cmU4OjpHZXRMT0QoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlODo6R2V0TE9EKCk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRFRleHR1cmU4OjpTZXRMT0QodW5zaWduZWQgbG9uZyBuZXdMT0QpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU4OjpTZXRMT0QobmV3TE9EKTsKKwl9CisKKwlsb25nIERpcmVjdDNEVGV4dHVyZTg6OkdldExldmVsRGVzYyh1bnNpZ25lZCBpbnQgbGV2ZWwsIEQzRFNVUkZBQ0VfREVTQyAqZGVzY3JpcHRpb24pCisJewkKKwkJVFJBQ0UoIiIpOworCisJCWlmKGxldmVsID49IEdldExldmVsQ291bnQoKSB8fCAhc3VyZmFjZUxldmVsW2xldmVsXSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlyZXR1cm4gc3VyZmFjZUxldmVsW2xldmVsXS0+R2V0RGVzYyhkZXNjcmlwdGlvbik7CisJfQorCisJbG9uZyBEaXJlY3QzRFRleHR1cmU4OjpMb2NrUmVjdCh1bnNpZ25lZCBpbnQgbGV2ZWwsIEQzRExPQ0tFRF9SRUNUICpsb2NrZWRSZWN0LCBjb25zdCBSRUNUICpyZWN0LCB1bnNpZ25lZCBsb25nIGZsYWdzKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKCFsb2NrZWRSZWN0IHx8IGxldmVsID49IEdldExldmVsQ291bnQoKSB8fCAhc3VyZmFjZUxldmVsW2xldmVsXSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlyZXR1cm4gc3VyZmFjZUxldmVsW2xldmVsXS0+TG9ja1JlY3QobG9ja2VkUmVjdCwgcmVjdCwgZmxhZ3MpOworCX0KKworCWxvbmcgRGlyZWN0M0RUZXh0dXJlODo6R2V0U3VyZmFjZUxldmVsKHVuc2lnbmVkIGludCBsZXZlbCwgSURpcmVjdDNEU3VyZmFjZTggKipzdXJmYWNlKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCSpzdXJmYWNlID0gMDsgICAvLyBGSVhNRTogVmVyaWZ5CisKKwkJaWYobGV2ZWwgPj0gR2V0TGV2ZWxDb3VudCgpIHx8ICFzdXJmYWNlTGV2ZWxbbGV2ZWxdKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCXN1cmZhY2VMZXZlbFtsZXZlbF0tPkFkZFJlZigpOworCQkqc3VyZmFjZSA9IHN1cmZhY2VMZXZlbFtsZXZlbF07CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CQkKKworCWxvbmcgRGlyZWN0M0RUZXh0dXJlODo6VW5sb2NrUmVjdCh1bnNpZ25lZCBpbnQgbGV2ZWwpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYobGV2ZWwgPj0gR2V0TGV2ZWxDb3VudCgpIHx8ICFzdXJmYWNlTGV2ZWxbbGV2ZWxdKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCXJldHVybiBzdXJmYWNlTGV2ZWxbbGV2ZWxdLT5VbmxvY2tSZWN0KCk7CisJfQorCisJbG9uZyBEaXJlY3QzRFRleHR1cmU4OjpBZGREaXJ0eVJlY3QoY29uc3QgUkVDVCAqZGlydHlSZWN0KQorCXsKKwkJVFJBQ0UoIiIpOworCisJLy8JVU5JTVBMRU1FTlRFRCgpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJRGlyZWN0M0RTdXJmYWNlOCAqRGlyZWN0M0RUZXh0dXJlODo6Z2V0SW50ZXJuYWxTdXJmYWNlTGV2ZWwodW5zaWduZWQgaW50IGxldmVsKQorCXsKKwkJcmV0dXJuIHN1cmZhY2VMZXZlbFtsZXZlbF07CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDgvRGlyZWN0M0RUZXh0dXJlOC5ocHAgYi9zcmMvRDNEOC9EaXJlY3QzRFRleHR1cmU4LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDMxYTI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDgvRGlyZWN0M0RUZXh0dXJlOC5ocHAKQEAgLTAsMCArMSw3NiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBEM0Q4X0RpcmVjdDNEVGV4dHVyZThfaHBwCisjZGVmaW5lIEQzRDhfRGlyZWN0M0RUZXh0dXJlOF9ocHAKKworI2luY2x1ZGUgIkRpcmVjdDNEQmFzZVRleHR1cmU4LmhwcCIKKworI2luY2x1ZGUgIkRpcmVjdDNEU3VyZmFjZTguaHBwIgorCisjaW5jbHVkZSAiQ29uZmlnLmhwcCIKKworI2luY2x1ZGUgPGQzZDguaD4KKworbmFtZXNwYWNlIEQzRDgKK3sKKwljbGFzcyBEaXJlY3QzRFRleHR1cmU4IDogcHVibGljIElEaXJlY3QzRFRleHR1cmU4LCBwdWJsaWMgRGlyZWN0M0RCYXNlVGV4dHVyZTgKKwl7CisJcHVibGljOgkKKwkJRGlyZWN0M0RUZXh0dXJlOChEaXJlY3QzRERldmljZTggKmRldmljZSwgdW5zaWduZWQgaW50IHdpZHRoLCB1bnNpZ25lZCBpbnQgaGVpZ2h0LCB1bnNpZ25lZCBpbnQgbGV2ZWxzLCB1bnNpZ25lZCBsb25nIHVzYWdlLCBEM0RGT1JNQVQgZm9ybWF0LCBEM0RQT09MIHBvb2wpOworCisJCXZpcnR1YWwgfkRpcmVjdDNEVGV4dHVyZTgoKTsKKworCQkvLyBJVW5rbm93biBtZXRob2RzCisJCWxvbmcgX19zdGRjYWxsIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgQWRkUmVmKCk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFJlbGVhc2UoKTsKKworCQkvLyBJRGlyZWN0M0RSZXNvdXJjZTggbWV0aG9kcworCQlsb25nIF9fc3RkY2FsbCBGcmVlUHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCk7CisJCWxvbmcgX19zdGRjYWxsIEdldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpOworCQl2b2lkIF9fc3RkY2FsbCBQcmVMb2FkKCk7CisJCWxvbmcgX19zdGRjYWxsIFNldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncyk7CisJCWxvbmcgX19zdGRjYWxsIEdldERldmljZShJRGlyZWN0M0REZXZpY2U4ICoqZGV2aWNlKTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgU2V0UHJpb3JpdHkodW5zaWduZWQgbG9uZyBuZXdQcmlvcml0eSk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEdldFByaW9yaXR5KCk7CisJCUQzRFJFU09VUkNFVFlQRSBfX3N0ZGNhbGwgR2V0VHlwZSgpOworCisJCS8vIElEaXJlY3QzREJhc2VUZXh0dXJlIG1ldGhvZHMKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgR2V0TGV2ZWxDb3VudCgpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBHZXRMT0QoKTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgU2V0TE9EKHVuc2lnbmVkIGxvbmcgbmV3TE9EKTsKKworCQkvLyBJRGlyZWN0M0RUZXh0dXJlOCBtZXRob2RzCisJCWxvbmcgX19zdGRjYWxsIEdldExldmVsRGVzYyh1bnNpZ25lZCBpbnQgbGV2ZWwsIEQzRFNVUkZBQ0VfREVTQyAqZGVzY3JpcHRpb24pOworCQlsb25nIF9fc3RkY2FsbCBMb2NrUmVjdCh1bnNpZ25lZCBpbnQgbGV2ZWwsIEQzRExPQ0tFRF9SRUNUICpsb2NrZWRSZWN0LCBjb25zdCBSRUNUICpyZWN0LCB1bnNpZ25lZCBsb25nIGZsYWdzKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0U3VyZmFjZUxldmVsKHVuc2lnbmVkIGludCBsZXZlbCwgSURpcmVjdDNEU3VyZmFjZTggKipzdXJmYWNlKTsKKwkJbG9uZyBfX3N0ZGNhbGwgVW5sb2NrUmVjdCh1bnNpZ25lZCBpbnQgbGV2ZWwpOworCQlsb25nIF9fc3RkY2FsbCBBZGREaXJ0eVJlY3QoY29uc3QgUkVDVCAqZGlydHlSZWN0KTsJCQorCisJCS8vIEludGVybmFsIG1ldGhvZHMKKwkJRGlyZWN0M0RTdXJmYWNlOCAqZ2V0SW50ZXJuYWxTdXJmYWNlTGV2ZWwodW5zaWduZWQgaW50IGxldmVsKTsKKworCXByaXZhdGU6CisJCS8vIENyZWF0aW9uIHBhcmFtZXRlcnMKKwkJY29uc3QgdW5zaWduZWQgaW50IHdpZHRoOworCQljb25zdCB1bnNpZ25lZCBpbnQgaGVpZ2h0OworCQljb25zdCBEM0RGT1JNQVQgZm9ybWF0OworCQljb25zdCBEM0RQT09MIHBvb2w7CisKKwkJRGlyZWN0M0RTdXJmYWNlOCAqc3VyZmFjZUxldmVsW3N3OjpNSVBNQVBfTEVWRUxTXTsKKwl9OworfQorCisjZW5kaWYgLy8gRDNEOF9EaXJlY3QzRFRleHR1cmU4X2hwcApkaWZmIC0tZ2l0IGEvc3JjL0QzRDgvRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4LmNwcCBiL3NyYy9EM0Q4L0RpcmVjdDNEVmVydGV4QnVmZmVyOC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmI3NDhkMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9EM0Q4L0RpcmVjdDNEVmVydGV4QnVmZmVyOC5jcHAKQEAgLTAsMCArMSwyMjEgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJEaXJlY3QzRFZlcnRleEJ1ZmZlcjguaHBwIgorCisjaW5jbHVkZSAiRGlyZWN0M0REZXZpY2U4LmhwcCIKKyNpbmNsdWRlICJSZXNvdXJjZS5ocHAiCisjaW5jbHVkZSAiRGVidWcuaHBwIgorCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKK25hbWVzcGFjZSBEM0Q4Cit7CisJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4OjpEaXJlY3QzRFZlcnRleEJ1ZmZlcjgoRGlyZWN0M0REZXZpY2U4ICpkZXZpY2UsIHVuc2lnbmVkIGludCBsZW5ndGgsIHVuc2lnbmVkIGxvbmcgdXNhZ2UsIGxvbmcgRlZGLCBEM0RQT09MIHBvb2wpIDogRGlyZWN0M0RSZXNvdXJjZTgoZGV2aWNlLCBEM0RSVFlQRV9WRVJURVhCVUZGRVIsIGxlbmd0aCksIGxlbmd0aChsZW5ndGgpLCB1c2FnZSh1c2FnZSksIEZWRihGVkYpLCBwb29sKHBvb2wpCisJeworCQlpZihGVkYpCisJCXsKKwkJCXVuc2lnbmVkIGludCBzdHJpZGUgPSAwOworCisJCQlzd2l0Y2goRlZGICYgRDNERlZGX1BPU0lUSU9OX01BU0spCisJCQl7CisJCQljYXNlIEQzREZWRl9YWVo6CXN0cmlkZSArPSAxMjsJYnJlYWs7CisJCQljYXNlIEQzREZWRl9YWVpSSFc6CXN0cmlkZSArPSAxNjsJYnJlYWs7CisJCQljYXNlIEQzREZWRl9YWVpCMToJc3RyaWRlICs9IDE2OwlicmVhazsKKwkJCWNhc2UgRDNERlZGX1hZWkIyOglzdHJpZGUgKz0gMjA7CWJyZWFrOworCQkJY2FzZSBEM0RGVkZfWFlaQjM6CXN0cmlkZSArPSAyNDsJYnJlYWs7CisJCQljYXNlIEQzREZWRl9YWVpCNDoJc3RyaWRlICs9IDI4OwlicmVhazsKKwkJCWNhc2UgRDNERlZGX1hZWkI1OglzdHJpZGUgKz0gMzI7CWJyZWFrOworCQkJfQorCisJCQlpZihGVkYgJiBEM0RGVkZfTk9STUFMKSAgIHN0cmlkZSArPSAxMjsKKwkJCWlmKEZWRiAmIEQzREZWRl9QU0laRSkgICAgc3RyaWRlICs9IDQ7CisJCQlpZihGVkYgJiBEM0RGVkZfRElGRlVTRSkgIHN0cmlkZSArPSA0OworCQkJaWYoRlZGICYgRDNERlZGX1NQRUNVTEFSKSBzdHJpZGUgKz0gNDsKKworCQkJc3dpdGNoKChGVkYgJiBEM0RGVkZfVEVYQ09VTlRfTUFTSykgPj4gRDNERlZGX1RFWENPVU5UX1NISUZUKQorCQkJeworCQkJY2FzZSA4OiBzdHJpZGUgKz0gNCArIDQgKiAoKDEgKyAoRlZGID4+IDMwKSkgJSA0KTsKKwkJCWNhc2UgNzogc3RyaWRlICs9IDQgKyA0ICogKCgxICsgKEZWRiA+PiAyOCkpICUgNCk7CisJCQljYXNlIDY6IHN0cmlkZSArPSA0ICsgNCAqICgoMSArIChGVkYgPj4gMjYpKSAlIDQpOworCQkJY2FzZSA1OiBzdHJpZGUgKz0gNCArIDQgKiAoKDEgKyAoRlZGID4+IDI0KSkgJSA0KTsKKwkJCWNhc2UgNDogc3RyaWRlICs9IDQgKyA0ICogKCgxICsgKEZWRiA+PiAyMikpICUgNCk7CisJCQljYXNlIDM6IHN0cmlkZSArPSA0ICsgNCAqICgoMSArIChGVkYgPj4gMjApKSAlIDQpOworCQkJY2FzZSAyOiBzdHJpZGUgKz0gNCArIDQgKiAoKDEgKyAoRlZGID4+IDE4KSkgJSA0KTsKKwkJCWNhc2UgMTogc3RyaWRlICs9IDQgKyA0ICogKCgxICsgKEZWRiA+PiAxNikpICUgNCk7CisJCQljYXNlIDA6IGJyZWFrOworCQkJZGVmYXVsdDoKKwkJCQlBU1NFUlQoZmFsc2UpOworCQkJfQorCisJCQlBU1NFUlQobGVuZ3RoID49IHN0cmlkZSk7ICAgICAgIC8vIEZJWE1FCisJCQlBU1NFUlQobGVuZ3RoICUgc3RyaWRlID09IDApOyAgIC8vIEQzRCB2ZXJ0ZXggc2l6ZSBjYWxjdWxhdGVkIGluY29ycmVjdGx5ICAgLy8gRklYTUUKKwkJfQorCisJCXZlcnRleEJ1ZmZlciA9IG5ldyBzdzo6UmVzb3VyY2UobGVuZ3RoICsgMTkyICsgMTAyNCk7ICAgLy8gTk9URTogQXBwbGljYXRpb25zIGNhbiAnb3ZlcnNob290JyB3aGlsZSB3cml0aW5nIHZlcnRpY2VzCisJfQorCisJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4Ojp+RGlyZWN0M0RWZXJ0ZXhCdWZmZXI4KCkKKwl7CisJCXZlcnRleEJ1ZmZlci0+ZGVzdHJ1Y3QoKTsKKwl9CisKKwlsb25nIERpcmVjdDNEVmVydGV4QnVmZmVyODo6UXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoaWlkID09IElJRF9JRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4IHx8CisJCSAgIGlpZCA9PSBJSURfSURpcmVjdDNEUmVzb3VyY2U4IHx8CisJCSAgIGlpZCA9PSBJSURfSVVua25vd24pCisJCXsKKwkJCUFkZFJlZigpOworCQkJKm9iamVjdCA9IHRoaXM7CisKKwkJCXJldHVybiBTX09LOworCQl9CisKKwkJKm9iamVjdCA9IDA7CisKKwkJcmV0dXJuIE5PSU5URVJGQUNFKGlpZCk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRFZlcnRleEJ1ZmZlcjg6OkFkZFJlZigpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U4OjpBZGRSZWYoKTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEVmVydGV4QnVmZmVyODo6UmVsZWFzZSgpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U4OjpSZWxlYXNlKCk7CisJfQorCisJbG9uZyBEaXJlY3QzRFZlcnRleEJ1ZmZlcjg6OkZyZWVQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzRFJlc291cmNlODo6RnJlZVByaXZhdGVEYXRhKGd1aWQpOworCX0KKworCWxvbmcgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4OjpHZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nICpzaXplKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzRFJlc291cmNlODo6R2V0UHJpdmF0ZURhdGEoZ3VpZCwgZGF0YSwgc2l6ZSk7CisJfQorCisJdm9pZCBEaXJlY3QzRFZlcnRleEJ1ZmZlcjg6OlByZUxvYWQoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCURpcmVjdDNEUmVzb3VyY2U4OjpQcmVMb2FkKCk7CisJfQorCisJbG9uZyBEaXJlY3QzRFZlcnRleEJ1ZmZlcjg6OlNldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIGNvbnN0IHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgc2l6ZSwgdW5zaWduZWQgbG9uZyBmbGFncykKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTg6OlNldFByaXZhdGVEYXRhKGd1aWQsIGRhdGEsIHNpemUsIGZsYWdzKTsKKwl9CisKKwlsb25nIERpcmVjdDNEVmVydGV4QnVmZmVyODo6R2V0RGV2aWNlKElEaXJlY3QzRERldmljZTggKipkZXZpY2UpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEUmVzb3VyY2U4OjpHZXREZXZpY2UoZGV2aWNlKTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEVmVydGV4QnVmZmVyODo6U2V0UHJpb3JpdHkodW5zaWduZWQgbG9uZyBuZXdQcmlvcml0eSkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTg6OlNldFByaW9yaXR5KG5ld1ByaW9yaXR5KTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEVmVydGV4QnVmZmVyODo6R2V0UHJpb3JpdHkoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzRFJlc291cmNlODo6R2V0UHJpb3JpdHkoKTsKKwl9CisKKwlEM0RSRVNPVVJDRVRZUEUgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4OjpHZXRUeXBlKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RSZXNvdXJjZTg6OkdldFR5cGUoKTsKKwl9CisKKwlsb25nIERpcmVjdDNEVmVydGV4QnVmZmVyODo6TG9jayh1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgY2hhciAqKmRhdGEsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYob2Zmc2V0ID09IDAgJiYgc2l6ZSA9PSAwKSAgIC8vIExvY2sgd2hvbGUgYnVmZmVyCisJCXsKKwkJCXNpemUgPSBsZW5ndGg7CisJCX0KKworCQlpZighZGF0YSB8fCBvZmZzZXQgKyBzaXplID4gbGVuZ3RoKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWxvY2tPZmZzZXQgPSBvZmZzZXQ7CisJCWxvY2tTaXplID0gc2l6ZTsKKworCQkqZGF0YSA9ICh1bnNpZ25lZCBjaGFyKil2ZXJ0ZXhCdWZmZXItPmxvY2soc3c6OlBVQkxJQykgKyBvZmZzZXQ7CisJCXZlcnRleEJ1ZmZlci0+dW5sb2NrKCk7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNEVmVydGV4QnVmZmVyODo6VW5sb2NrKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4OjpHZXREZXNjKEQzRFZFUlRFWEJVRkZFUl9ERVNDICpkZXNjcmlwdGlvbikKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZighZGVzY3JpcHRpb24pCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJZGVzY3JpcHRpb24tPkZWRiA9IEZWRjsKKwkJZGVzY3JpcHRpb24tPkZvcm1hdCA9IEQzREZNVF9WRVJURVhEQVRBOworCQlkZXNjcmlwdGlvbi0+UG9vbCA9IHBvb2w7CisJCWRlc2NyaXB0aW9uLT5TaXplID0gbGVuZ3RoOworCQlkZXNjcmlwdGlvbi0+VHlwZSA9IEQzRFJUWVBFX1ZFUlRFWEJVRkZFUjsKKwkJZGVzY3JpcHRpb24tPlVzYWdlID0gdXNhZ2U7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlpbnQgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4OjpnZXRMZW5ndGgoKSBjb25zdAorCXsKKwkJcmV0dXJuIGxlbmd0aDsKKwl9CisKKwlzdzo6UmVzb3VyY2UgKkRpcmVjdDNEVmVydGV4QnVmZmVyODo6Z2V0UmVzb3VyY2UoKSBjb25zdAorCXsKKwkJcmV0dXJuIHZlcnRleEJ1ZmZlcjsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvRDNEOC9EaXJlY3QzRFZlcnRleEJ1ZmZlcjguaHBwIGIvc3JjL0QzRDgvRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4LmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzVkMDEyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDgvRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4LmhwcApAQCAtMCwwICsxLDc1IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIEQzRDhfRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4X2hwcAorI2RlZmluZSBEM0Q4X0RpcmVjdDNEVmVydGV4QnVmZmVyOF9ocHAKKworI2luY2x1ZGUgIkRpcmVjdDNEUmVzb3VyY2U4LmhwcCIKKworI2luY2x1ZGUgPGQzZDguaD4KKworbmFtZXNwYWNlIHN3Cit7CisJY2xhc3MgUmVzb3VyY2U7Cit9CisKK25hbWVzcGFjZSBEM0Q4Cit7CisJY2xhc3MgRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4IDogcHVibGljIElEaXJlY3QzRFZlcnRleEJ1ZmZlcjgsIHB1YmxpYyBEaXJlY3QzRFJlc291cmNlOAorCXsKKwlwdWJsaWM6CisJCURpcmVjdDNEVmVydGV4QnVmZmVyOChEaXJlY3QzRERldmljZTggKmRldmljZSwgdW5zaWduZWQgaW50IGxlbmd0aCwgdW5zaWduZWQgbG9uZyB1c2FnZSwgbG9uZyBGVkYsIEQzRFBPT0wgcG9vbCk7CisKKwkJdmlydHVhbCB+RGlyZWN0M0RWZXJ0ZXhCdWZmZXI4KCk7CisKKwkJLy8gSVVua25vd24gbWV0aG9kcworCQlsb25nIF9fc3RkY2FsbCBRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEFkZFJlZigpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBSZWxlYXNlKCk7CisKKwkJLy8gSURpcmVjdDNEUmVzb3VyY2U4IG1ldGhvZHMKKwkJbG9uZyBfX3N0ZGNhbGwgRnJlZVByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQpOworCQlsb25nIF9fc3RkY2FsbCBHZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nICpzaXplKTsKKwkJdm9pZCBfX3N0ZGNhbGwgUHJlTG9hZCgpOworCQlsb25nIF9fc3RkY2FsbCBTZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCQlsb25nIF9fc3RkY2FsbCBHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOCAqKmRldmljZSk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFNldFByaW9yaXR5KHVuc2lnbmVkIGxvbmcgbmV3UHJpb3JpdHkpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBHZXRQcmlvcml0eSgpOworCQlEM0RSRVNPVVJDRVRZUEUgX19zdGRjYWxsIEdldFR5cGUoKTsKKworCQkvLyBJRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4IG1ldGhvZHMKKwkJbG9uZyBfX3N0ZGNhbGwgTG9jayh1bnNpZ25lZCBpbnQgb2Zmc2V0LCB1bnNpZ25lZCBpbnQgc2l6ZSwgdW5zaWduZWQgY2hhciAqKmRhdGEsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCQlsb25nIF9fc3RkY2FsbCBVbmxvY2soKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0RGVzYyhEM0RWRVJURVhCVUZGRVJfREVTQyAqZGVzY3JpcHRpb24pOworCisJCS8vIEludGVybmFsIG1ldGhvZHMKKwkJaW50IGdldExlbmd0aCgpIGNvbnN0OworCQlzdzo6UmVzb3VyY2UgKmdldFJlc291cmNlKCkgY29uc3Q7CisKKwlwcml2YXRlOgorCQkvLyBDcmVhdGlvbiBwYXJhbWV0ZXJzCisJCWNvbnN0IHVuc2lnbmVkIGludCBsZW5ndGg7CisJCWNvbnN0IGxvbmcgdXNhZ2U7CisJCWNvbnN0IGxvbmcgRlZGOworCQljb25zdCBEM0RQT09MIHBvb2w7CisKKwkJdW5zaWduZWQgaW50IGxvY2tPZmZzZXQ7CisJCXVuc2lnbmVkIGludCBsb2NrU2l6ZTsKKwkJdW5zaWduZWQgY2hhciAqbG9ja0RhdGE7CisKKwkJc3c6OlJlc291cmNlICp2ZXJ0ZXhCdWZmZXI7CisJfTsKK30KKworI2VuZGlmIC8vIEQzRDhfRGlyZWN0M0RWZXJ0ZXhCdWZmZXI4X2hwcApkaWZmIC0tZ2l0IGEvc3JjL0QzRDgvRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjguY3BwIGIvc3JjL0QzRDgvRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0N2FmNDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOC9EaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOC5jcHAKQEAgLTAsMCArMSw3MSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgIkRpcmVjdDNEVmVydGV4RGVjbGFyYXRpb244LmhwcCIKKworI2luY2x1ZGUgIkRlYnVnLmhwcCIKKworI2luY2x1ZGUgPGQzZDh0eXBlcy5oPgorCituYW1lc3BhY2UgRDNEOAoreworCURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb244OjpEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOChEaXJlY3QzRERldmljZTggKmRldmljZSwgY29uc3QgdW5zaWduZWQgbG9uZyAqdmVydGV4RWxlbWVudCkgOiBkZXZpY2UoZGV2aWNlKQorCXsKKwkJaW50IHNpemUgPSBzaXplb2YodW5zaWduZWQgbG9uZyk7CisJCWNvbnN0IHVuc2lnbmVkIGxvbmcgKmVsZW1lbnQgPSB2ZXJ0ZXhFbGVtZW50OworCisJCXdoaWxlKCplbGVtZW50ICE9IDB4RkZGRkZGRkYpCisJCXsKKwkJCXNpemUgKz0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcpOworCQkJZWxlbWVudCsrOworCQl9CisKKwkJZGVjbGFyYXRpb24gPSBuZXcgdW5zaWduZWQgbG9uZ1tzaXplICAvIHNpemVvZih1bnNpZ25lZCBsb25nKV07CisJCW1lbWNweShkZWNsYXJhdGlvbiwgdmVydGV4RWxlbWVudCwgc2l6ZSk7CisJfQorCisJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjg6On5EaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOCgpCisJeworCQlkZWxldGVbXSBkZWNsYXJhdGlvbjsKKwkJZGVjbGFyYXRpb24gPSAwOworCX0KKworCWxvbmcgRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjg6OlF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KQorCXsKKwkJVFJBQ0UoIiIpOworCisJCUFTU0VSVChmYWxzZSk7ICAgLy8gSW50ZXJuYWwgb2JqZWN0CisKKwkJcmV0dXJuIE5PSU5URVJGQUNFKGlpZCk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uODo6QWRkUmVmKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gVW5rbm93bjo6QWRkUmVmKCk7CisJfQorCQorCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjg6OlJlbGVhc2UoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBVbmtub3duOjpSZWxlYXNlKCk7CisJfQorCisJY29uc3QgdW5zaWduZWQgbG9uZyAqRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjg6OmdldERlY2xhcmF0aW9uKCkgY29uc3QKKwl7CisJCXJldHVybiBkZWNsYXJhdGlvbjsKKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDgvRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjguaHBwIGIvc3JjL0QzRDgvRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjguaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNWI2NjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOC9EaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOC5ocHAKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBEM0Q4X0RpcmVjdDNEVmVydGV4RGVjbGFyYXRpb244X2hwcAorI2RlZmluZSBEM0Q4X0RpcmVjdDNEVmVydGV4RGVjbGFyYXRpb244X2hwcAorCisjaW5jbHVkZSAiVW5rbm93bi5ocHAiCisKKyNpbmNsdWRlIDxkM2Q4Lmg+CisKK25hbWVzcGFjZSBEM0Q4Cit7CisJY2xhc3MgRGlyZWN0M0REZXZpY2U4OworCisJY2xhc3MgRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjggOiBwcm90ZWN0ZWQgVW5rbm93bgorCXsKKwlwdWJsaWM6CisJCURpcmVjdDNEVmVydGV4RGVjbGFyYXRpb244KERpcmVjdDNERGV2aWNlOCAqZGV2aWNlLCBjb25zdCB1bnNpZ25lZCBsb25nICp2ZXJ0ZXhFbGVtZW50cyk7CisKKwkJdmlydHVhbCB+RGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjgoKTsKKworCQkvLyBJVW5rbm93biBtZXRob2RzCisJCWxvbmcgX19zdGRjYWxsIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgQWRkUmVmKCk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFJlbGVhc2UoKTsKKworCQkvLyBJbnRlcm5hbCBtZXRob2RzCisJCWNvbnN0IHVuc2lnbmVkIGxvbmcgKmdldERlY2xhcmF0aW9uKCkgY29uc3Q7CisKKwlwcml2YXRlOgorCQkvLyBDcmVhdGlvbiBwYXJhbWV0ZXJzCisJCURpcmVjdDNERGV2aWNlOCAqY29uc3QgZGV2aWNlOworCQl1bnNpZ25lZCBsb25nICpkZWNsYXJhdGlvbjsKKwl9OworfQorCisjZW5kaWYgICAvLyBEM0Q4X0RpcmVjdDNEVmVydGV4RGVjbGFyYXRpb244X2hwcApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0RpcmVjdDNEVmVydGV4U2hhZGVyOC5jcHAgYi9zcmMvRDNEOC9EaXJlY3QzRFZlcnRleFNoYWRlcjguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2OTY1MDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOC9EaXJlY3QzRFZlcnRleFNoYWRlcjguY3BwCkBAIC0wLDAgKzEsOTIgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJEaXJlY3QzRFZlcnRleFNoYWRlcjguaHBwIgorCisjaW5jbHVkZSAiRGVidWcuaHBwIgorCituYW1lc3BhY2UgRDNEOAoreworCURpcmVjdDNEVmVydGV4U2hhZGVyODo6RGlyZWN0M0RWZXJ0ZXhTaGFkZXI4KERpcmVjdDNERGV2aWNlOCAqZGV2aWNlLCBjb25zdCB1bnNpZ25lZCBsb25nICpkZWNsYXJhdGlvbiwgY29uc3QgdW5zaWduZWQgbG9uZyAqc2hhZGVyVG9rZW4pIDogZGV2aWNlKGRldmljZSkKKwl7CisJCWlmKHNoYWRlclRva2VuKQorCQl7CisJCQl2ZXJ0ZXhTaGFkZXIgPSBuZXcgc3c6OlZlcnRleFNoYWRlcihzaGFkZXJUb2tlbik7CisKKwkJCWNvbnN0IHVuc2lnbmVkIGxvbmcgKnRva2VuID0gc2hhZGVyVG9rZW47CisJCQlzaXplID0gMDsKKworCQkJd2hpbGUoc2hhZGVyVG9rZW5bc2l6ZV0gIT0gMHgwMDAwRkZGRikKKwkJCXsKKwkJCQlzaXplKys7CisJCQl9CisKKwkJCXNpemUrKzsKKworCQkJdGhpcy0+c2hhZGVyVG9rZW4gPSBuZXcgdW5zaWduZWQgbG9uZ1tzaXplXTsKKwkJCW1lbWNweSh0aGlzLT5zaGFkZXJUb2tlbiwgc2hhZGVyVG9rZW4sIHNpemUgKiBzaXplb2YodW5zaWduZWQgbG9uZykpOworCQl9CisJCWVsc2UKKwkJeworCQkJdmVydGV4U2hhZGVyID0gMDsKKwkJCXRoaXMtPnNoYWRlclRva2VuID0gMDsKKwkJfQorCisJCXRoaXMtPmRlY2xhcmF0aW9uID0gbmV3IERpcmVjdDNEVmVydGV4RGVjbGFyYXRpb244KGRldmljZSwgZGVjbGFyYXRpb24pOworCX0KKworCURpcmVjdDNEVmVydGV4U2hhZGVyODo6fkRpcmVjdDNEVmVydGV4U2hhZGVyOCgpCisJeworCQlkZWxldGUgdmVydGV4U2hhZGVyOworCQl2ZXJ0ZXhTaGFkZXIgPSAwOworCisJCWRlbGV0ZVtdIHNoYWRlclRva2VuOworCQlzaGFkZXJUb2tlbiA9IDA7CisKKwkJZGVjbGFyYXRpb24tPlJlbGVhc2UoKTsKKwl9CisKKwlsb25nIERpcmVjdDNEVmVydGV4U2hhZGVyODo6UXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpCisJeworCQlUUkFDRSgiIik7CisKKwkJQVNTRVJUKGZhbHNlKTsgICAvLyBJbnRlcm5hbCBvYmplY3QKKworCQlyZXR1cm4gTk9JTlRFUkZBQ0UoaWlkKTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEVmVydGV4U2hhZGVyODo6QWRkUmVmKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gVW5rbm93bjo6QWRkUmVmKCk7CisJfQorCQorCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RWZXJ0ZXhTaGFkZXI4OjpSZWxlYXNlKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gVW5rbm93bjo6UmVsZWFzZSgpOworCX0KKworCWNvbnN0IHN3OjpWZXJ0ZXhTaGFkZXIgKkRpcmVjdDNEVmVydGV4U2hhZGVyODo6Z2V0VmVydGV4U2hhZGVyKCkgY29uc3QKKwl7CisJCXJldHVybiB2ZXJ0ZXhTaGFkZXI7CisJfQorCisJY29uc3QgdW5zaWduZWQgbG9uZyAqRGlyZWN0M0RWZXJ0ZXhTaGFkZXI4OjpnZXREZWNsYXJhdGlvbigpCisJeworCQlyZXR1cm4gZGVjbGFyYXRpb24tPmdldERlY2xhcmF0aW9uKCk7CisJfQorfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0RpcmVjdDNEVmVydGV4U2hhZGVyOC5ocHAgYi9zcmMvRDNEOC9EaXJlY3QzRFZlcnRleFNoYWRlcjguaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA0NmY3YjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOC9EaXJlY3QzRFZlcnRleFNoYWRlcjguaHBwCkBAIC0wLDAgKzEsNTQgQEAKKy8vIENvcHlyaWdodCAyMDE2IFRoZSBTd2lmdFNoYWRlciBBdXRob3JzLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgRDNEOF9EaXJlY3QzRFZlcnRleFNoYWRlcjhfaHBwCisjZGVmaW5lIEQzRDhfRGlyZWN0M0RWZXJ0ZXhTaGFkZXI4X2hwcAorCisjaW5jbHVkZSAiVmVydGV4U2hhZGVyLmhwcCIKKyNpbmNsdWRlICJEaXJlY3QzRFZlcnRleERlY2xhcmF0aW9uOC5ocHAiCisKKyNpbmNsdWRlICJVbmtub3duLmhwcCIKKworbmFtZXNwYWNlIEQzRDgKK3sKKwljbGFzcyBEaXJlY3QzRERldmljZTg7CisKKwljbGFzcyBEaXJlY3QzRFZlcnRleFNoYWRlcjggOiBwdWJsaWMgVW5rbm93bgorCXsKKwlwdWJsaWM6CisJCURpcmVjdDNEVmVydGV4U2hhZGVyOChEaXJlY3QzRERldmljZTggKmRldmljZSwgY29uc3QgdW5zaWduZWQgbG9uZyAqZGVjbGFyYXRpb24sIGNvbnN0IHVuc2lnbmVkIGxvbmcgKnNoYWRlclRva2VuKTsKKworCQl2aXJ0dWFsIH5EaXJlY3QzRFZlcnRleFNoYWRlcjgoKTsKKworCQkvLyBJVW5rbm93biBtZXRob2RzCisJCWxvbmcgX19zdGRjYWxsIFF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgQWRkUmVmKCk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFJlbGVhc2UoKTsKKworCQkvLyBJbnRlcm5hbCBtZXRob2RzCisJCWNvbnN0IHN3OjpWZXJ0ZXhTaGFkZXIgKmdldFZlcnRleFNoYWRlcigpIGNvbnN0OworCQljb25zdCB1bnNpZ25lZCBsb25nICpnZXREZWNsYXJhdGlvbigpOworCisJcHJpdmF0ZToKKwkJLy8gQ3JlYXRpb24gcGFyYW1ldGVycworCQlEaXJlY3QzRERldmljZTggKmNvbnN0IGRldmljZTsKKwkJRGlyZWN0M0RWZXJ0ZXhEZWNsYXJhdGlvbjggKmRlY2xhcmF0aW9uOworCQl1bnNpZ25lZCBsb25nICpzaGFkZXJUb2tlbjsKKwkJdW5zaWduZWQgaW50IHNpemU7CisKKwkJc3c6OlZlcnRleFNoYWRlciAqdmVydGV4U2hhZGVyOworCX07Cit9CisKKyNlbmRpZiAgIC8vIEQzRDhfRGlyZWN0M0RWZXJ0ZXhTaGFkZXI4X2hwcApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0RpcmVjdDNEVm9sdW1lOC5jcHAgYi9zcmMvRDNEOC9EaXJlY3QzRFZvbHVtZTguY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYTc4YWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOC9EaXJlY3QzRFZvbHVtZTguY3BwCkBAIC0wLDAgKzEsMTg5IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiRGlyZWN0M0RWb2x1bWU4LmhwcCIKKworI2luY2x1ZGUgIkRpcmVjdDNEUmVzb3VyY2U4LmhwcCIKKyNpbmNsdWRlICJEaXJlY3QzRFZvbHVtZVRleHR1cmU4LmhwcCIKKyNpbmNsdWRlICJEaXJlY3QzRFN1cmZhY2U4LmhwcCIKKyNpbmNsdWRlICJEZWJ1Zy5ocHAiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworbmFtZXNwYWNlIEQzRDgKK3sKKwlEaXJlY3QzRFZvbHVtZTg6OkRpcmVjdDNEVm9sdW1lOChEaXJlY3QzRERldmljZTggKmRldmljZSwgRGlyZWN0M0RWb2x1bWVUZXh0dXJlOCAqY29udGFpbmVyLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sLCBib29sIGxvY2thYmxlLCB1bnNpZ25lZCBsb25nIHVzYWdlKSA6IFN1cmZhY2UoY29udGFpbmVyLT5nZXRSZXNvdXJjZSgpLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgdHJhbnNsYXRlRm9ybWF0KGZvcm1hdCksIGxvY2thYmxlLCBmYWxzZSksIGNvbnRhaW5lcihjb250YWluZXIpLCB3aWR0aCh3aWR0aCksIGhlaWdodChoZWlnaHQpLCBkZXB0aChkZXB0aCksIGZvcm1hdChmb3JtYXQpLCBwb29sKHBvb2wpLCBsb2NrYWJsZShsb2NrYWJsZSksIHVzYWdlKHVzYWdlKQorCXsKKwkJcmVzb3VyY2UgPSBuZXcgRGlyZWN0M0RSZXNvdXJjZTgoZGV2aWNlLCBEM0RSVFlQRV9WT0xVTUUsIG1lbW9yeVVzYWdlKHdpZHRoLCBoZWlnaHQsIGRlcHRoLCBmb3JtYXQpKTsKKwl9CisKKwlEaXJlY3QzRFZvbHVtZTg6On5EaXJlY3QzRFZvbHVtZTgoKQorCXsKKwkJcmVzb3VyY2UtPlJlbGVhc2UoKTsKKwl9CisKKwlsb25nIF9fc3RkY2FsbCBEaXJlY3QzRFZvbHVtZTg6OlF1ZXJ5SW50ZXJmYWNlKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqb2JqZWN0KQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKGlpZCA9PSBJSURfSURpcmVjdDNEVm9sdW1lOCB8fAorCQkgICBpaWQgPT0gSUlEX0lVbmtub3duKQorCQl7CisJCQlBZGRSZWYoKTsKKwkJCSpvYmplY3QgPSB0aGlzOworCisJCQlyZXR1cm4gU19PSzsKKwkJfQorCisJCSpvYmplY3QgPSAwOworCisJCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOworCX0KKworCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIERpcmVjdDNEVm9sdW1lODo6QWRkUmVmKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gY29udGFpbmVyLT5BZGRSZWYoKTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBEaXJlY3QzRFZvbHVtZTg6OlJlbGVhc2UoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBjb250YWluZXItPlJlbGVhc2UoKTsKKwl9CisKKwlsb25nIERpcmVjdDNEVm9sdW1lODo6RnJlZVByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIHJlc291cmNlLT5GcmVlUHJpdmF0ZURhdGEoZ3VpZCk7CisJfQorCisJbG9uZyBEaXJlY3QzRFZvbHVtZTg6OkdldENvbnRhaW5lcihjb25zdCBJSUQgJmlpZCwgdm9pZCAqKmNvbnRhaW5lcikKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZighY29udGFpbmVyKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWxvbmcgcmVzdWx0ID0gdGhpcy0+Y29udGFpbmVyLT5RdWVyeUludGVyZmFjZShpaWQsIGNvbnRhaW5lcik7CisKKwkJaWYocmVzdWx0ID09IFNfT0spCisJCXsKKwkJCXJldHVybiBEM0RfT0s7CisJCX0KKworCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwl9CisKKwlsb25nIERpcmVjdDNEVm9sdW1lODo6R2V0RGVzYyhEM0RWT0xVTUVfREVTQyAqZGVzY3JpcHRpb24pCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoIWRlc2NyaXB0aW9uKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCWRlc2NyaXB0aW9uLT5Gb3JtYXQgPSBmb3JtYXQ7CisJCWRlc2NyaXB0aW9uLT5UeXBlID0gRDNEUlRZUEVfVk9MVU1FOworCQlkZXNjcmlwdGlvbi0+VXNhZ2UgPSB1c2FnZTsKKwkJZGVzY3JpcHRpb24tPlBvb2wgPSBwb29sOworCQlkZXNjcmlwdGlvbi0+V2lkdGggPSB3aWR0aDsKKwkJZGVzY3JpcHRpb24tPkhlaWdodCA9IGhlaWdodDsKKwkJZGVzY3JpcHRpb24tPkRlcHRoID0gZGVwdGg7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNEVm9sdW1lODo6R2V0RGV2aWNlKElEaXJlY3QzRERldmljZTggKipkZXZpY2UpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIHJlc291cmNlLT5HZXREZXZpY2UoZGV2aWNlKTsKKwl9CisKKwlsb25nIERpcmVjdDNEVm9sdW1lODo6R2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyAqc2l6ZSkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gcmVzb3VyY2UtPkdldFByaXZhdGVEYXRhKGd1aWQsIGRhdGEsIHNpemUpOworCX0KKworCWxvbmcgRGlyZWN0M0RWb2x1bWU4OjpMb2NrQm94KEQzRExPQ0tFRF9CT1ggKmxvY2tlZFZvbHVtZSwgY29uc3QgRDNEQk9YICpib3gsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoIWxvY2tlZFZvbHVtZSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlsb2NrZWRWb2x1bWUtPlJvd1BpdGNoID0gcGl0Y2hCKGdldFdpZHRoKCksIGdldEV4dGVybmFsRm9ybWF0KCksIGZhbHNlKTsKKwkJbG9ja2VkVm9sdW1lLT5TbGljZVBpdGNoID0gc2xpY2VCKGdldFdpZHRoKCksIGdldEhlaWdodCgpLCBnZXRFeHRlcm5hbEZvcm1hdCgpLCBmYWxzZSk7CisKKwkJc3c6OkxvY2sgbG9jayA9IHN3OjpMT0NLX1JFQURXUklURTsKKworCQlpZihmbGFncyAmIEQzRExPQ0tfRElTQ0FSRCkKKwkJeworCQkJbG9jayA9IHN3OjpMT0NLX0RJU0NBUkQ7CisJCX0KKworCQlpZihmbGFncyAmIEQzRExPQ0tfUkVBRE9OTFkpCisJCXsKKwkJCWxvY2sgPSBzdzo6TE9DS19SRUFET05MWTsKKwkJfQorCisJCWlmKGJveCkKKwkJeworCQkJbG9ja2VkVm9sdW1lLT5wQml0cyA9IGxvY2tFeHRlcm5hbChib3gtPkxlZnQsIGJveC0+VG9wLCBib3gtPkZyb250LCBsb2NrLCBzdzo6UFVCTElDKTsKKwkJfQorCQllbHNlCisJCXsKKwkJCWxvY2tlZFZvbHVtZS0+cEJpdHMgPSBsb2NrRXh0ZXJuYWwoMCwgMCwgMCwgbG9jaywgc3c6OlBVQkxJQyk7CisJCX0KKworCQl1bmxvY2tFeHRlcm5hbCgpOworCQkKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlsb25nIERpcmVjdDNEVm9sdW1lODo6U2V0UHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCwgY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25lZCBsb25nIGZsYWdzKQorCXsKKwkJVFJBQ0UoIiIpOworCQkKKwkJcmV0dXJuIFNldFByaXZhdGVEYXRhKGd1aWQsIGRhdGEsIHNpemUsIGZsYWdzKTsKKwl9CisKKwlsb25nIERpcmVjdDNEVm9sdW1lODo6VW5sb2NrQm94KCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCXN3OjpGb3JtYXQgRGlyZWN0M0RWb2x1bWU4Ojp0cmFuc2xhdGVGb3JtYXQoRDNERk9STUFUIGZvcm1hdCkKKwl7CisJCXJldHVybiBEaXJlY3QzRFN1cmZhY2U4Ojp0cmFuc2xhdGVGb3JtYXQoZm9ybWF0KTsKKwl9CisKKwl1bnNpZ25lZCBpbnQgRGlyZWN0M0RWb2x1bWU4OjptZW1vcnlVc2FnZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgRDNERk9STUFUIGZvcm1hdCkKKwl7CisJCXJldHVybiBTdXJmYWNlOjpzaXplKHdpZHRoLCBoZWlnaHQsIGRlcHRoLCB0cmFuc2xhdGVGb3JtYXQoZm9ybWF0KSk7CisJfQorfQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDgvRGlyZWN0M0RWb2x1bWU4LmhwcCBiL3NyYy9EM0Q4L0RpcmVjdDNEVm9sdW1lOC5ocHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI4NWZjNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9EM0Q4L0RpcmVjdDNEVm9sdW1lOC5ocHAKQEAgLTAsMCArMSw3MCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBEM0Q4X0RpcmVjdDNEVm9sdW1lOF9ocHAKKyNkZWZpbmUgRDNEOF9EaXJlY3QzRFZvbHVtZThfaHBwCisKKyNpbmNsdWRlICJVbmtub3duLmhwcCIKKworI2luY2x1ZGUgIlN1cmZhY2UuaHBwIgorCisjaW5jbHVkZSA8ZDNkOC5oPgorCituYW1lc3BhY2UgRDNEOAoreworCWNsYXNzIERpcmVjdDNERGV2aWNlODsKKwljbGFzcyBEaXJlY3QzRFJlc291cmNlODsKKwljbGFzcyBEaXJlY3QzRFZvbHVtZVRleHR1cmU4OworCisJY2xhc3MgRGlyZWN0M0RWb2x1bWU4IDogcHVibGljIElEaXJlY3QzRFZvbHVtZTgsIHB1YmxpYyBVbmtub3duLCBwdWJsaWMgc3c6OlN1cmZhY2UKKwl7CisJcHVibGljOgorCQlEaXJlY3QzRFZvbHVtZTgoRGlyZWN0M0REZXZpY2U4ICpkZXZpY2UsIERpcmVjdDNEVm9sdW1lVGV4dHVyZTggKmNvbnRhaW5lciwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgZGVwdGgsIEQzREZPUk1BVCBmb3JtYXQsIEQzRFBPT0wgcG9vbCwgYm9vbCBsb2Nha2JsZSwgdW5zaWduZWQgbG9uZyB1c2FnZSk7CisKKwkJdmlydHVhbCB+RGlyZWN0M0RWb2x1bWU4KCk7CisKKwkJLy8gSVVua25vd24gbWV0aG9kcworCQlsb25nIF9fc3RkY2FsbCBRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEFkZFJlZigpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBSZWxlYXNlKCk7CisKKwkJLy8gSURpcmVjdDNEVm9sdW1lOCBtZXRob2RzCisJCWxvbmcgX19zdGRjYWxsIEZyZWVQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0Q29udGFpbmVyKGNvbnN0IElJRCAmaWlkLCB2b2lkICoqY29udGFpbmVyKTsKKwkJbG9uZyBfX3N0ZGNhbGwgR2V0RGVzYyhEM0RWT0xVTUVfREVTQyAqZGVzY3JpcHRpb24pOworCQlsb25nIF9fc3RkY2FsbCBHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOCAqKmRldmljZSk7CisJCWxvbmcgX19zdGRjYWxsIEdldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpOworCQlsb25nIF9fc3RkY2FsbCBMb2NrQm94KEQzRExPQ0tFRF9CT1ggKmxvY2tlZFZvbHVtZSwgY29uc3QgRDNEQk9YICpib3gsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCQlsb25nIF9fc3RkY2FsbCBTZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCQlsb25nIF9fc3RkY2FsbCBVbmxvY2tCb3goKTsKKworCXByaXZhdGU6CisJCXN0YXRpYyBzdzo6Rm9ybWF0IHRyYW5zbGF0ZUZvcm1hdChEM0RGT1JNQVQgZm9ybWF0KTsKKwkJc3RhdGljIHVuc2lnbmVkIGludCBtZW1vcnlVc2FnZShpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCBkZXB0aCwgRDNERk9STUFUIGZvcm1hdCk7CisKKwkJLy8gQ3JlYXRpb24gcGFyYW1ldGVycworCQlEaXJlY3QzRFZvbHVtZVRleHR1cmU4ICpjb25zdCBjb250YWluZXI7CisJCWNvbnN0IGludCB3aWR0aDsKKwkJY29uc3QgaW50IGhlaWdodDsKKwkJY29uc3QgaW50IGRlcHRoOworCQljb25zdCBEM0RGT1JNQVQgZm9ybWF0OworCQljb25zdCBEM0RQT09MIHBvb2w7CisJCWNvbnN0IGJvb2wgbG9ja2FibGU7CisJCWNvbnN0IHVuc2lnbmVkIGxvbmcgdXNhZ2U7CisKKwkJRGlyZWN0M0RSZXNvdXJjZTggKnJlc291cmNlOworCX07Cit9CisKKyNlbmRpZiAvLyBEM0Q4X0RpcmVjdDNEVm9sdW1lOF9ocHAKZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L0RpcmVjdDNEVm9sdW1lVGV4dHVyZTguY3BwIGIvc3JjL0QzRDgvRGlyZWN0M0RWb2x1bWVUZXh0dXJlOC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBjZWNkZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9EM0Q4L0RpcmVjdDNEVm9sdW1lVGV4dHVyZTguY3BwCkBAIC0wLDAgKzEsMjUwIEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiRGlyZWN0M0RWb2x1bWVUZXh0dXJlOC5ocHAiCisKKyNpbmNsdWRlICJEaXJlY3QzRFZvbHVtZTguaHBwIgorI2luY2x1ZGUgIlJlc291cmNlLmhwcCIKKyNpbmNsdWRlICJEZWJ1Zy5ocHAiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworbmFtZXNwYWNlIEQzRDgKK3sKKwlEaXJlY3QzRFZvbHVtZVRleHR1cmU4OjpEaXJlY3QzRFZvbHVtZVRleHR1cmU4KERpcmVjdDNERGV2aWNlOCAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIHVuc2lnbmVkIGludCBkZXB0aCwgdW5zaWduZWQgaW50IGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sKSA6IERpcmVjdDNEQmFzZVRleHR1cmU4KGRldmljZSwgRDNEUlRZUEVfVk9MVU1FVEVYVFVSRSwgbGV2ZWxzLCB1c2FnZSksIHdpZHRoKHdpZHRoKSwgaGVpZ2h0KGhlaWdodCksIGRlcHRoKGRlcHRoKSwgZm9ybWF0KGZvcm1hdCksIHBvb2wocG9vbCkKKwl7CisJCWlmKGxldmVscyA9PSAwKQorCQl7CisJCQl0aGlzLT5sZXZlbHMgPSBzdzo6bG9nMihzdzo6bWF4KChpbnQpd2lkdGgsIChpbnQpaGVpZ2h0LCAoaW50KWRlcHRoLCAxKSkgKyAxOworCQl9CisKKwkJZm9yKHVuc2lnbmVkIGludCBsZXZlbCA9IDA7IGxldmVsIDwgc3c6Ok1JUE1BUF9MRVZFTFM7IGxldmVsKyspCisJCXsKKwkJCWlmKGxldmVsIDwgdGhpcy0+bGV2ZWxzKQorCQkJeworCQkJCXZvbHVtZUxldmVsW2xldmVsXSA9IG5ldyBEaXJlY3QzRFZvbHVtZTgoZGV2aWNlLCB0aGlzLCB3aWR0aCwgaGVpZ2h0LCBkZXB0aCwgZm9ybWF0LCBwb29sLCB0cnVlLCB1c2FnZSk7CisJCQkJdm9sdW1lTGV2ZWxbbGV2ZWxdLT5iaW5kKCk7CisJCQl9CisJCQllbHNlCisJCQl7CisJCQkJdm9sdW1lTGV2ZWxbbGV2ZWxdID0gMDsKKwkJCX0KKworCQkJd2lkdGggPSBzdzo6bWF4KDEsIChpbnQpd2lkdGggLyAyKTsKKwkJCWhlaWdodCA9IHN3OjptYXgoMSwgKGludCloZWlnaHQgLyAyKTsKKwkJCWRlcHRoID0gc3c6Om1heCgxLCAoaW50KWRlcHRoIC8gMik7CisJCX0KKwl9CisKKwlEaXJlY3QzRFZvbHVtZVRleHR1cmU4Ojp+RGlyZWN0M0RWb2x1bWVUZXh0dXJlOCgpCisJeworCQlyZXNvdXJjZS0+bG9jayhzdzo6REVTVFJVQ1QpOworCisJCWZvcihpbnQgbGV2ZWwgPSAwOyBsZXZlbCA8IHN3OjpNSVBNQVBfTEVWRUxTOyBsZXZlbCsrKQorCQl7CisJCQlpZih2b2x1bWVMZXZlbFtsZXZlbF0pCisJCQl7CisJCQkJdm9sdW1lTGV2ZWxbbGV2ZWxdLT51bmJpbmQoKTsKKwkJCQl2b2x1bWVMZXZlbFtsZXZlbF0gPSAwOworCQkJfQorCQl9CisKKwkJcmVzb3VyY2UtPnVubG9jaygpOworCX0KKworCWxvbmcgRGlyZWN0M0RWb2x1bWVUZXh0dXJlODo6UXVlcnlJbnRlcmZhY2UoY29uc3QgSUlEICZpaWQsIHZvaWQgKipvYmplY3QpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoaWlkID09IElJRF9JRGlyZWN0M0RWb2x1bWVUZXh0dXJlOCB8fAorCQkgICBpaWQgPT0gSUlEX0lEaXJlY3QzREJhc2VUZXh0dXJlOCB8fAorCQkgICBpaWQgPT0gSUlEX0lEaXJlY3QzRFJlc291cmNlOCB8fAorCQkgICBpaWQgPT0gSUlEX0lVbmtub3duKQorCQl7CisJCQlBZGRSZWYoKTsKKwkJCSpvYmplY3QgPSB0aGlzOworCisJCQlyZXR1cm4gU19PSzsKKwkJfQorCisJCSpvYmplY3QgPSAwOworCisJCXJldHVybiBOT0lOVEVSRkFDRShpaWQpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RWb2x1bWVUZXh0dXJlODo6QWRkUmVmKCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTg6OkFkZFJlZigpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RWb2x1bWVUZXh0dXJlODo6UmVsZWFzZSgpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU4OjpSZWxlYXNlKCk7CisJfQorCisJbG9uZyBEaXJlY3QzRFZvbHVtZVRleHR1cmU4OjpGcmVlUHJpdmF0ZURhdGEoY29uc3QgR1VJRCAmZ3VpZCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTg6OkZyZWVQcml2YXRlRGF0YShndWlkKTsKKwl9CisKKwlsb25nIERpcmVjdDNEVm9sdW1lVGV4dHVyZTg6OkdldFByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQsIHZvaWQgKmRhdGEsIHVuc2lnbmVkIGxvbmcgKnNpemUpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU4OjpHZXRQcml2YXRlRGF0YShndWlkLCBkYXRhLCBzaXplKTsKKwl9CisKKwl2b2lkIERpcmVjdDNEVm9sdW1lVGV4dHVyZTg6OlByZUxvYWQoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCURpcmVjdDNEQmFzZVRleHR1cmU4OjpQcmVMb2FkKCk7CisJfQorCisJbG9uZyBEaXJlY3QzRFZvbHVtZVRleHR1cmU4OjpTZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU4OjpTZXRQcml2YXRlRGF0YShndWlkLCBkYXRhLCBzaXplLCBmbGFncyk7CisJfQorCisJbG9uZyBEaXJlY3QzRFZvbHVtZVRleHR1cmU4OjpHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOCAqKmRldmljZSkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTg6OkdldERldmljZShkZXZpY2UpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RWb2x1bWVUZXh0dXJlODo6U2V0UHJpb3JpdHkodW5zaWduZWQgbG9uZyBuZXdQcmlvcml0eSkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTg6OlNldFByaW9yaXR5KG5ld1ByaW9yaXR5KTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIERpcmVjdDNEVm9sdW1lVGV4dHVyZTg6OkdldFByaW9yaXR5KCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlyZXR1cm4gRGlyZWN0M0RCYXNlVGV4dHVyZTg6OkdldFByaW9yaXR5KCk7CisJfQorCisJRDNEUkVTT1VSQ0VUWVBFIERpcmVjdDNEVm9sdW1lVGV4dHVyZTg6OkdldFR5cGUoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlODo6R2V0VHlwZSgpOworCX0KKworCXVuc2lnbmVkIGxvbmcgRGlyZWN0M0RWb2x1bWVUZXh0dXJlODo6R2V0TGV2ZWxDb3VudCgpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU4OjpHZXRMZXZlbENvdW50KCk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRFZvbHVtZVRleHR1cmU4OjpHZXRMT0QoKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCXJldHVybiBEaXJlY3QzREJhc2VUZXh0dXJlODo6R2V0TE9EKCk7CisJfQorCisJdW5zaWduZWQgbG9uZyBEaXJlY3QzRFZvbHVtZVRleHR1cmU4OjpTZXRMT0QodW5zaWduZWQgbG9uZyBuZXdMT0QpCisJeworCQlUUkFDRSgiIik7CisKKwkJcmV0dXJuIERpcmVjdDNEQmFzZVRleHR1cmU4OjpTZXRMT0QobmV3TE9EKTsKKwl9CisKKwlsb25nIERpcmVjdDNEVm9sdW1lVGV4dHVyZTg6OkdldFZvbHVtZUxldmVsKHVuc2lnbmVkIGludCBsZXZlbCwgSURpcmVjdDNEVm9sdW1lOCAqKnZvbHVtZSkKKwl7CisJCVRSQUNFKCIiKTsKKworCQkqdm9sdW1lID0gMDsgICAvLyBGSVhNRTogVmVyaWZ5CisKKwkJaWYobGV2ZWwgPj0gR2V0TGV2ZWxDb3VudCgpIHx8ICF2b2x1bWVMZXZlbFtsZXZlbF0pCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJdm9sdW1lTGV2ZWxbbGV2ZWxdLT5BZGRSZWYoKTsKKwkJKnZvbHVtZSA9IHZvbHVtZUxldmVsW2xldmVsXTsKKworCQlyZXR1cm4gRDNEX09LOworCX0KKworCWxvbmcgRGlyZWN0M0RWb2x1bWVUZXh0dXJlODo6TG9ja0JveCh1bnNpZ25lZCBpbnQgbGV2ZWwsIEQzRExPQ0tFRF9CT1ggKmxvY2tlZFZvbHVtZSwgY29uc3QgRDNEQk9YICpib3gsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoIWxvY2tlZFZvbHVtZSB8fCBsZXZlbCA+PSBHZXRMZXZlbENvdW50KCkgfHwgIXZvbHVtZUxldmVsW2xldmVsXSkKKwkJeworCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CisJCX0KKworCQlyZXR1cm4gdm9sdW1lTGV2ZWxbbGV2ZWxdLT5Mb2NrQm94KGxvY2tlZFZvbHVtZSwgYm94LCBmbGFncyk7CisJfQorCisJbG9uZyBEaXJlY3QzRFZvbHVtZVRleHR1cmU4OjpVbmxvY2tCb3godW5zaWduZWQgaW50IGxldmVsKQorCXsKKwkJVFJBQ0UoIiIpOworCisJCWlmKGxldmVsID49IEdldExldmVsQ291bnQoKSB8fCAhdm9sdW1lTGV2ZWxbbGV2ZWxdKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCXJldHVybiB2b2x1bWVMZXZlbFtsZXZlbF0tPlVubG9ja0JveCgpOworCX0KKworCWxvbmcgRGlyZWN0M0RWb2x1bWVUZXh0dXJlODo6QWRkRGlydHlCb3goY29uc3QgRDNEQk9YICpkaXJ0eUJveCkKKwl7CisJCVRSQUNFKCIiKTsKKworCQlpZighZGlydHlCb3gpCisJCXsKKwkJCXJldHVybiBJTlZBTElEQ0FMTCgpOworCQl9CisKKwkJVU5JTVBMRU1FTlRFRCgpOworCisJCXJldHVybiBEM0RfT0s7CisJfQorCisJbG9uZyBEaXJlY3QzRFZvbHVtZVRleHR1cmU4OjpHZXRMZXZlbERlc2ModW5zaWduZWQgaW50IGxldmVsLCBEM0RWT0xVTUVfREVTQyAqZGVzY3JpcHRpb24pCisJeworCQlUUkFDRSgiIik7CisKKwkJaWYoIWRlc2NyaXB0aW9uIHx8IGxldmVsID49IEdldExldmVsQ291bnQoKSB8fCAhdm9sdW1lTGV2ZWxbbGV2ZWxdKQorCQl7CisJCQlyZXR1cm4gSU5WQUxJRENBTEwoKTsKKwkJfQorCisJCXZvbHVtZUxldmVsW2xldmVsXS0+R2V0RGVzYyhkZXNjcmlwdGlvbik7CisKKwkJcmV0dXJuIEQzRF9PSzsKKwl9CisKKwlEaXJlY3QzRFZvbHVtZTggKkRpcmVjdDNEVm9sdW1lVGV4dHVyZTg6OmdldEludGVybmFsVm9sdW1lTGV2ZWwodW5zaWduZWQgaW50IGxldmVsKQorCXsKKwkJcmV0dXJuIHZvbHVtZUxldmVsW2xldmVsXTsKKwl9Cit9CmRpZmYgLS1naXQgYS9zcmMvRDNEOC9EaXJlY3QzRFZvbHVtZVRleHR1cmU4LmhwcCBiL3NyYy9EM0Q4L0RpcmVjdDNEVm9sdW1lVGV4dHVyZTguaHBwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiMGZiZDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOC9EaXJlY3QzRFZvbHVtZVRleHR1cmU4LmhwcApAQCAtMCwwICsxLDc3IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIEQzRDhfRGlyZWN0M0RWb2x1bWVUZXh0dXJlOF9ocHAKKyNkZWZpbmUgRDNEOF9EaXJlY3QzRFZvbHVtZVRleHR1cmU4X2hwcAorCisjaW5jbHVkZSAiRGlyZWN0M0RCYXNlVGV4dHVyZTguaHBwIgorCisjaW5jbHVkZSAiQ29uZmlnLmhwcCIKKworI2luY2x1ZGUgPGQzZDguaD4KKworbmFtZXNwYWNlIEQzRDgKK3sKKwljbGFzcyBEaXJlY3QzRFZvbHVtZTg7CisKKwljbGFzcyBEaXJlY3QzRFZvbHVtZVRleHR1cmU4IDogcHVibGljIElEaXJlY3QzRFZvbHVtZVRleHR1cmU4LCBwdWJsaWMgRGlyZWN0M0RCYXNlVGV4dHVyZTgKKwl7CisJcHVibGljOgorCQlEaXJlY3QzRFZvbHVtZVRleHR1cmU4KERpcmVjdDNERGV2aWNlOCAqZGV2aWNlLCB1bnNpZ25lZCBpbnQgd2lkdGgsIHVuc2lnbmVkIGludCBoZWlnaHQsIHVuc2lnbmVkIGludCBkZXB0aCwgdW5zaWduZWQgaW50IGxldmVscywgdW5zaWduZWQgbG9uZyB1c2FnZSwgRDNERk9STUFUIGZvcm1hdCwgRDNEUE9PTCBwb29sKTsKKworCQl2aXJ0dWFsIH5EaXJlY3QzRFZvbHVtZVRleHR1cmU4KCk7CisKKwkJLy8gSVVua25vd24gbWV0aG9kcworCQlsb25nIF9fc3RkY2FsbCBRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEFkZFJlZigpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBSZWxlYXNlKCk7CisKKwkJLy8gSURpcmVjdDNEUmVzb3VyY2U4IG1ldGhvZHMKKwkJbG9uZyBfX3N0ZGNhbGwgRnJlZVByaXZhdGVEYXRhKGNvbnN0IEdVSUQgJmd1aWQpOworCQlsb25nIF9fc3RkY2FsbCBHZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nICpzaXplKTsKKwkJdm9pZCBfX3N0ZGNhbGwgUHJlTG9hZCgpOworCQlsb25nIF9fc3RkY2FsbCBTZXRQcml2YXRlRGF0YShjb25zdCBHVUlEICZndWlkLCBjb25zdCB2b2lkICpkYXRhLCB1bnNpZ25lZCBsb25nIHNpemUsIHVuc2lnbmVkIGxvbmcgZmxhZ3MpOworCQlsb25nIF9fc3RkY2FsbCBHZXREZXZpY2UoSURpcmVjdDNERGV2aWNlOCAqKmRldmljZSk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFNldFByaW9yaXR5KHVuc2lnbmVkIGxvbmcgbmV3UHJpb3JpdHkpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBHZXRQcmlvcml0eSgpOworCQlEM0RSRVNPVVJDRVRZUEUgX19zdGRjYWxsIEdldFR5cGUoKTsKKworCQkvLyBJRGlyZWN0M0RCYXNlVGV4dHVyZSBtZXRob2RzCisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEdldExldmVsQ291bnQoKTsKKwkJdW5zaWduZWQgbG9uZyBfX3N0ZGNhbGwgR2V0TE9EKCk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIFNldExPRCh1bnNpZ25lZCBsb25nIG5ld0xPRCk7CisKKwkJLy8gSURpcmVjdDNEVm9sdW1lVGV4dHVyZTggbWV0aG9kcworCQlsb25nIF9fc3RkY2FsbCBHZXRMZXZlbERlc2ModW5zaWduZWQgaW50IGxldmVsLCBEM0RWT0xVTUVfREVTQyAqZGVzY3JpcHRpb24pOworCQlsb25nIF9fc3RkY2FsbCBHZXRWb2x1bWVMZXZlbCh1bnNpZ25lZCBpbnQgbGV2ZWwsIElEaXJlY3QzRFZvbHVtZTggKip2b2x1bWUpOworCQlsb25nIF9fc3RkY2FsbCBMb2NrQm94KHVuc2lnbmVkIGludCBsZXZlbCwgRDNETE9DS0VEX0JPWCAqbG9ja2VkVm9sdW1lLCBjb25zdCBEM0RCT1ggKmJveCwgdW5zaWduZWQgbG9uZyBmbGFncyk7CisJCWxvbmcgX19zdGRjYWxsIFVubG9ja0JveCh1bnNpZ25lZCBpbnQgbGV2ZWwpOworCQlsb25nIF9fc3RkY2FsbCBBZGREaXJ0eUJveChjb25zdCBEM0RCT1ggKmRpcnR5Qm94KTsKKworCQkvLyBJbnRlcm5hbCBtZXRob2RzCisJCURpcmVjdDNEVm9sdW1lOCAqZ2V0SW50ZXJuYWxWb2x1bWVMZXZlbCh1bnNpZ25lZCBpbnQgbGV2ZWwpOworCisJcHJpdmF0ZToKKwkJLy8gQ3JlYXRpb24gcGFyYW1ldGVycworCQljb25zdCB1bnNpZ25lZCBpbnQgd2lkdGg7CisJCWNvbnN0IHVuc2lnbmVkIGludCBoZWlnaHQ7CisJCWNvbnN0IHVuc2lnbmVkIGludCBkZXB0aDsKKwkJY29uc3QgRDNERk9STUFUIGZvcm1hdDsKKwkJY29uc3QgRDNEUE9PTCBwb29sOworCisJCURpcmVjdDNEVm9sdW1lOCAqdm9sdW1lTGV2ZWxbc3c6Ok1JUE1BUF9MRVZFTFNdOworCX07Cit9CisKKyNlbmRpZiAvLyBEM0Q4X0RpcmVjdDNEVm9sdW1lVGV4dHVyZThfaHBwCmRpZmYgLS1naXQgYS9zcmMvRDNEOC9Vbmtub3duLmNwcCBiL3NyYy9EM0Q4L1Vua25vd24uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA5Y2UwM2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOC9Vbmtub3duLmNwcApAQCAtMCwwICsxLDg4IEBACisvLyBDb3B5cmlnaHQgMjAxNiBUaGUgU3dpZnRTaGFkZXIgQXV0aG9ycy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiVW5rbm93bi5ocHAiCisKKyNpbmNsdWRlICJEZWJ1Zy5ocHAiCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKworbmFtZXNwYWNlIEQzRDgKK3sKKwlVbmtub3duOjpVbmtub3duKCkKKwl7CisJCXJlZmVyZW5jZUNvdW50ID0gMDsKKwkJYmluZENvdW50ID0gMDsKKwl9CisKKwlVbmtub3duOjp+VW5rbm93bigpCisJeworCQlBU1NFUlQocmVmZXJlbmNlQ291bnQgPT0gMCk7CisJCUFTU0VSVChiaW5kQ291bnQgPT0gMCk7CisJfQorCisJbG9uZyBVbmtub3duOjpRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCkKKwl7CisJCWlmKGlpZCA9PSBJSURfSVVua25vd24pCisJCXsKKwkJCUFkZFJlZigpOworCQkJKm9iamVjdCA9IHRoaXM7CisKKwkJCXJldHVybiBTX09LOworCQl9CisJCQorCQkqb2JqZWN0ID0gMDsKKworCQlyZXR1cm4gTk9JTlRFUkZBQ0UoaWlkKTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIFVua25vd246OkFkZFJlZigpCisJeworCQlyZXR1cm4gSW50ZXJsb2NrZWRJbmNyZW1lbnQoJnJlZmVyZW5jZUNvdW50KTsKKwl9CisKKwl1bnNpZ25lZCBsb25nIFVua25vd246OlJlbGVhc2UoKQorCXsKKwkJaW50IGN1cnJlbnQgPSByZWZlcmVuY2VDb3VudDsKKwkJCisJCWlmKHJlZmVyZW5jZUNvdW50ID4gMCkKKwkJeworCQkJY3VycmVudCA9IEludGVybG9ja2VkRGVjcmVtZW50KCZyZWZlcmVuY2VDb3VudCk7CisJCX0KKworCQlpZihyZWZlcmVuY2VDb3VudCA9PSAwICYmIGJpbmRDb3VudCA9PSAwKQorCQl7CisJCQlkZWxldGUgdGhpczsKKwkJfQorCisJCXJldHVybiBjdXJyZW50OworCX0KKworCXZvaWQgVW5rbm93bjo6YmluZCgpCisJeworCQlJbnRlcmxvY2tlZEluY3JlbWVudCgmYmluZENvdW50KTsKKwl9CisKKwl2b2lkIFVua25vd246OnVuYmluZCgpCisJeworCQlBU1NFUlQoYmluZENvdW50ID4gMCk7CisKKwkJSW50ZXJsb2NrZWREZWNyZW1lbnQoJmJpbmRDb3VudCk7CisKKwkJaWYocmVmZXJlbmNlQ291bnQgPT0gMCAmJiBiaW5kQ291bnQgPT0gMCkKKwkJeworCQkJZGVsZXRlIHRoaXM7CisJCX0KKwl9Cit9ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL0QzRDgvVW5rbm93bi5ocHAgYi9zcmMvRDNEOC9Vbmtub3duLmhwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NzhhMDM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL0QzRDgvVW5rbm93bi5ocHAKQEAgLTAsMCArMSw0NCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgVGhlIFN3aWZ0U2hhZGVyIEF1dGhvcnMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBEM0Q4X1Vua25vd25faHBwCisjZGVmaW5lIEQzRDhfVW5rbm93bl9ocHAKKworI2luY2x1ZGUgPHVua253bi5oPgorCituYW1lc3BhY2UgRDNEOAoreworCWNsYXNzIFVua25vd24gOiBJVW5rbm93bgorCXsKKwlwdWJsaWM6CisJCVVua25vd24oKTsKKworCQl2aXJ0dWFsIH5Vbmtub3duKCk7CisKKwkJLy8gSVVua25vd24gbWV0aG9kcworCQlsb25nIF9fc3RkY2FsbCBRdWVyeUludGVyZmFjZShjb25zdCBJSUQgJmlpZCwgdm9pZCAqKm9iamVjdCk7CisJCXVuc2lnbmVkIGxvbmcgX19zdGRjYWxsIEFkZFJlZigpOworCQl1bnNpZ25lZCBsb25nIF9fc3RkY2FsbCBSZWxlYXNlKCk7CisKKwkJLy8gSW50ZXJuYWwgbWV0aG9kcworCQl2aXJ0dWFsIHZvaWQgYmluZCgpOworCQl2aXJ0dWFsIHZvaWQgdW5iaW5kKCk7CisKKwlwcml2YXRlOgorCQl2b2xhdGlsZSBsb25nIHJlZmVyZW5jZUNvdW50OworCQl2b2xhdGlsZSBsb25nIGJpbmRDb3VudDsKKwl9OworfQorCisjZW5kaWYgICAvLyBEM0Q4X1Vua25vd25faHBwCmRpZmYgLS1naXQgYS9zcmMvRDNEOC9kM2Q4LmRlZiBiL3NyYy9EM0Q4L2QzZDguZGVmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1ODZhNzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOC9kM2Q4LmRlZgpAQCAtMCwwICsxLDcgQEAKK0xJQlJBUlkgRDNEOAorRVhQT1JUUworCUNoZWNrRnVsbHNjcmVlbgkJCUAxCisgICAgRGVidWdTZXRNdXRlCQkJQDQKKyAgICBEaXJlY3QzRENyZWF0ZTgJCQlANQorICAgIFZhbGlkYXRlUGl4ZWxTaGFkZXIJCUAyCisgICAgVmFsaWRhdGVWZXJ0ZXhTaGFkZXIJQDMKZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L3Jlc291cmNlLmggYi9zcmMvRDNEOC9yZXNvdXJjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI3YTlmNmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvRDNEOC9yZXNvdXJjZS5oCkBAIC0wLDAgKzEsMjggQEAKKy8ve3tOT19ERVBFTkRFTkNJRVN9fQorLy8gTWljcm9zb2Z0IFZpc3VhbCBDKysgZ2VuZXJhdGVkIGluY2x1ZGUgZmlsZS4KKy8vIFVzZWQgYnkgRDNEOC1kbGwucmMKKy8vCisjZGVmaW5lIElERF9ESUFMT0cxICAgICAgICAgICAgICAgICAgICAgMTA0CisjZGVmaW5lIElERF9ESUFMT0cyICAgICAgICAgICAgICAgICAgICAgMTA1CisjZGVmaW5lIElEQ19DSEVDSzEgICAgICAgICAgICAgICAgICAgICAgMTAwMQorI2RlZmluZSBJRENfU0xJREVSMSAgICAgICAgICAgICAgICAgICAgIDEwMDIKKyNkZWZpbmUgSURDX0NIRUNLMiAgICAgICAgICAgICAgICAgICAgICAxMDAzCisjZGVmaW5lIElEQ19QUk9HUkVTUzIgICAgICAgICAgICAgICAgICAgMTAwNgorI2RlZmluZSBJRENfUFJPR1JFU1MzICAgICAgICAgICAgICAgICAgIDEwMDcKKyNkZWZpbmUgSURDX1BST0dSRVNTNCAgICAgICAgICAgICAgICAgICAxMDA4CisjZGVmaW5lIElEQ19QUk9HUkVTUzUgICAgICAgICAgICAgICAgICAgMTAwOQorI2RlZmluZSBJRENfREFURVRJTUVQSUNLRVIxICAgICAgICAgICAgIDEwMTEKKyNkZWZpbmUgSURDX0NIRUNLMyAgICAgICAgICAgICAgICAgICAgICAxMDEyCisjZGVmaW5lIElEQ19FRElUMSAgICAgICAgICAgICAgICAgICAgICAgMTAxMworI2RlZmluZSBJRENfRURJVDIgICAgICAgICAgICAgICAgICAgICAgIDEwMTQKKworLy8gTmV4dCBkZWZhdWx0IHZhbHVlcyBmb3IgbmV3IG9iamVjdHMKKy8vIAorI2lmZGVmIEFQU1RVRElPX0lOVk9LRUQKKyNpZm5kZWYgQVBTVFVESU9fUkVBRE9OTFlfU1lNQk9MUworI2RlZmluZSBfQVBTX05FWFRfUkVTT1VSQ0VfVkFMVUUgICAgICAgIDEwNgorI2RlZmluZSBfQVBTX05FWFRfQ09NTUFORF9WQUxVRSAgICAgICAgIDQwMDAxCisjZGVmaW5lIF9BUFNfTkVYVF9DT05UUk9MX1ZBTFVFICAgICAgICAgMTAxNQorI2RlZmluZSBfQVBTX05FWFRfU1lNRURfVkFMVUUgICAgICAgICAgIDEwMQorI2VuZGlmCisjZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy9EM0Q4L3Jlc291cmNlMS5oIGIvc3JjL0QzRDgvcmVzb3VyY2UxLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWNmMzU4NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9EM0Q4L3Jlc291cmNlMS5oCkBAIC0wLDAgKzEsMTQgQEAKKy8ve3tOT19ERVBFTkRFTkNJRVN9fQorLy8gTWljcm9zb2Z0IFZpc3VhbCBDKysgZ2VuZXJhdGVkIGluY2x1ZGUgZmlsZS4KKy8vIFVzZWQgYnkgRDNEOC5yYworCisvLyBOZXh0IGRlZmF1bHQgdmFsdWVzIGZvciBuZXcgb2JqZWN0cworLy8gCisjaWZkZWYgQVBTVFVESU9fSU5WT0tFRAorI2lmbmRlZiBBUFNUVURJT19SRUFET05MWV9TWU1CT0xTCisjZGVmaW5lIF9BUFNfTkVYVF9SRVNPVVJDRV9WQUxVRSAgICAgICAgMTAxCisjZGVmaW5lIF9BUFNfTkVYVF9DT01NQU5EX1ZBTFVFICAgICAgICAgNDAwMDEKKyNkZWZpbmUgX0FQU19ORVhUX0NPTlRST0xfVkFMVUUgICAgICAgICAxMDAxCisjZGVmaW5lIF9BUFNfTkVYVF9TWU1FRF9WQUxVRSAgICAgICAgICAgMTAxCisjZW5kaWYKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvc3JjL0QzRDkvRDNEOS5yYyBiL3NyYy9EM0Q5L0QzRDkucmMKaW5kZXggOTI0NWQwYy4uZDBlYTBkMCAxMDA2NDQKLS0tIGEvc3JjL0QzRDkvRDNEOS5yYworKysgYi9zcmMvRDNEOS9EM0Q5LnJjCkBAIC03LDcgKzcsNyBAQAogLy8KIC8vIEdlbmVyYXRlZCBmcm9tIHRoZSBURVhUSU5DTFVERSAyIHJlc291cmNlLgogLy8KLSNpbmNsdWRlICJ3aW5kb3dzLmgiCisjaW5jbHVkZSAiV2luZG93cy5oIgogI2luY2x1ZGUgIi4uL0NvbW1vbi9WZXJzaW9uLmgiCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogI3VuZGVmIEFQU1RVRElPX1JFQURPTkxZX1NZTUJPTFMKZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RpcmVjdDNERGV2aWNlOS5jcHAgYi9zcmMvRDNEOS9EaXJlY3QzRERldmljZTkuY3BwCmluZGV4IGRkYzY2MDYuLjUxNWFiNGIgMTAwNjQ0Ci0tLSBhL3NyYy9EM0Q5L0RpcmVjdDNERGV2aWNlOS5jcHAKKysrIGIvc3JjL0QzRDkvRGlyZWN0M0REZXZpY2U5LmNwcApAQCAtMzQzLDcgKzM0Myw3IEBACiAKIAkJVFJBQ0UoInVuc2lnbmVkIGxvbmcgY291bnQgPSAlZCwgY29uc3QgRDNEUkVDVCAqcmVjdHMgPSAweCUwLjhwLCB1bnNpZ25lZCBsb25nIGZsYWdzID0gMHglMC44WCwgdW5zaWduZWQgbG9uZyBjb2xvciA9IDB4JTAuOFgsIGZsb2F0IHogPSAlZiwgdW5zaWduZWQgbG9uZyBzdGVuY2lsID0gJWQiLCBjb3VudCwgcmVjdHMsIGZsYWdzLCBjb2xvciwgeiwgc3RlbmNpbCk7CiAKLQkJaWYocmVjdHMgPT0gMCAmJiBjb3VudCAhPSAwKQorCQlpZighcmVjdHMgJiYgY291bnQgIT0gMCkKIAkJewogCQkJcmV0dXJuIElOVkFMSURDQUxMKCk7CiAJCX0KZGlmZiAtLWdpdCBhL3NyYy9EM0Q5L0RpcmVjdDNEU3dhcENoYWluOS5jcHAgYi9zcmMvRDNEOS9EaXJlY3QzRFN3YXBDaGFpbjkuY3BwCmluZGV4IGIzZDE1ODYuLjRiNTEwYWEgMTAwNjQ0Ci0tLSBhL3NyYy9EM0Q5L0RpcmVjdDNEU3dhcENoYWluOS5jcHAKKysrIGIvc3JjL0QzRDkvRGlyZWN0M0RTd2FwQ2hhaW45LmNwcApAQCAtMTg0LDcgKzE4NCw3IEBACiAJCQkJZFJlY3QueTEgPSBkZXN0UmVjdC0+Ym90dG9tOwogCQkJfQogCi0JCQlmcmFtZUJ1ZmZlci0+YmxpdCh3aW5kb3csIHNvdXJjZSwgc291cmNlUmVjdCA/ICZzUmVjdCA6IDAsIGRlc3RSZWN0ID8gJmRSZWN0IDogMCwgZm9ybWF0LCBzdHJpZGUpOworCQkJZnJhbWVCdWZmZXItPmJsaXQod2luZG93LCBzb3VyY2UsIHNvdXJjZVJlY3QgPyAmc1JlY3QgOiBudWxscHRyLCBkZXN0UmVjdCA/ICZkUmVjdCA6IG51bGxwdHIsIGZvcm1hdCwgc3RyaWRlKTsKIAkJfQogCiAJCWJhY2tCdWZmZXJbMF0tPnVubG9ja0ludGVybmFsKCk7ICAgLy8gRklYTUU6IEV4dGVybmFsCg==